001 /**
002 *
003 * Copyright 2004-2005 The Apache Software Foundation
004 *
005 * Licensed under the Apache License, Version 2.0 (the "License");
006 * you may not use this file except in compliance with the License.
007 * You may obtain a copy of the License at
008 *
009 * http://www.apache.org/licenses/LICENSE-2.0
010 *
011 * Unless required by applicable law or agreed to in writing, software
012 * distributed under the License is distributed on an "AS IS" BASIS,
013 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
014 * See the License for the specific language governing permissions and
015 * limitations under the License.
016 */
017
018 package org.apache.geronimo.connector;
019
020 import javax.resource.ResourceException;
021 import javax.resource.spi.ActivationSpec;
022 import javax.resource.spi.ResourceAdapter;
023 import javax.resource.spi.endpoint.MessageEndpointFactory;
024 import javax.transaction.SystemException;
025 import javax.transaction.xa.XAResource;
026
027 import org.apache.geronimo.transaction.manager.NamedXAResource;
028 import org.apache.geronimo.transaction.manager.ResourceManager;
029 import org.apache.geronimo.transaction.manager.WrapperNamedXAResource;
030
031 /**
032 * Wrapper for ActivationSpec instances.
033 * The framework assumes all RequiredConfigProperties are of type String, although it
034 * is unclear if this is required by the spec.
035 *
036 * @version $Rev: 356022 $ $Date: 2005-12-11 12:58:34 -0800 (Sun, 11 Dec 2005) $
037 */
038 public class ActivationSpecWrapper implements ResourceManager {
039
040 protected final ActivationSpec activationSpec;
041
042 private final ResourceAdapterWrapper resourceAdapterWrapper;
043 private final String containerId;
044
045 /**
046 * Default constructor required when a class is used as a GBean Endpoint.
047 */
048 public ActivationSpecWrapper() {
049 activationSpec = null;
050 containerId = null;
051 resourceAdapterWrapper = null;
052 }
053
054 /**
055 * Normal managed constructor.
056 *
057 * @param activationSpecClass Class of admin object to be wrapped.
058 * @throws IllegalAccessException
059 * @throws InstantiationException
060 */
061 public ActivationSpecWrapper(final String activationSpecClass,
062 final String containerId,
063 final ResourceAdapterWrapper resourceAdapterWrapper,
064 final ClassLoader cl) throws IllegalAccessException, InstantiationException, ClassNotFoundException {
065 Class clazz = cl.loadClass(activationSpecClass);
066 this.activationSpec = (ActivationSpec) clazz.newInstance();
067 this.containerId = containerId;
068 this.resourceAdapterWrapper = resourceAdapterWrapper;
069 }
070
071 /**
072 */
073 public ActivationSpecWrapper(ActivationSpec activationSpec, ResourceAdapterWrapper resourceAdapterWrapper) {
074 this.activationSpec = activationSpec;
075 this.resourceAdapterWrapper = resourceAdapterWrapper;
076 this.containerId = null;
077 }
078
079 /**
080 * Returns class of wrapped ActivationSpec.
081 *
082 * @return class of wrapped ActivationSpec
083 */
084 // public String getActivationSpecClass() {
085 // return activationSpecClass;
086 // }
087
088 public String getContainerId() {
089 return containerId;
090 }
091
092 public ResourceAdapterWrapper getResourceAdapterWrapper() {
093 return resourceAdapterWrapper;
094 }
095
096
097 //GBeanLifecycle implementation
098 public void activate(final MessageEndpointFactory messageEndpointFactory) throws ResourceException {
099 ResourceAdapter resourceAdapter = activationSpec.getResourceAdapter();
100 if (resourceAdapter == null) {
101 resourceAdapterWrapper.registerResourceAdapterAssociation(activationSpec);
102 }
103 resourceAdapterWrapper.endpointActivation(messageEndpointFactory, activationSpec);
104 }
105
106 public void deactivate(final MessageEndpointFactory messageEndpointFactory) {
107 ResourceAdapter resourceAdapter = activationSpec.getResourceAdapter();
108 if (resourceAdapter != null) {
109 resourceAdapterWrapper.endpointDeactivation(messageEndpointFactory, activationSpec);
110 } else {
111 //this should never happen, activation spec should have been registered with r.a.
112 throw new IllegalStateException("ActivationSpec was never registered with ResourceAdapter");
113 }
114 }
115
116 //Operations.
117 public NamedXAResource getRecoveryXAResources() throws SystemException {
118 if (resourceAdapterWrapper == null) {
119 throw new IllegalStateException("Attempting to use activation spec when it is not activated");
120 }
121 try {
122 XAResource[] xaResources = resourceAdapterWrapper.getXAResources(new ActivationSpec[]{activationSpec});
123 if (xaResources == null || xaResources.length == 0) {
124 return null;
125 }
126 return new WrapperNamedXAResource(xaResources[0], containerId);
127 } catch (ResourceException e) {
128 throw (SystemException) new SystemException("Could not get XAResource for recovery for mdb: " + containerId).initCause(e);
129 }
130 }
131
132 public void returnResource(NamedXAResource xaResource) {
133 //do nothing, no way to return anything.
134 }
135
136 }