001 /** 002 * Licensed to the Apache Software Foundation (ASF) under one or more 003 * contributor license agreements. See the NOTICE file distributed with 004 * this work for additional information regarding copyright ownership. 005 * The ASF licenses this file to You under the Apache License, Version 2.0 006 * (the "License"); you may not use this file except in compliance with 007 * the License. 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 java.util.Map; 021 022 import javax.resource.ResourceException; 023 import javax.resource.spi.ActivationSpec; 024 import javax.resource.spi.BootstrapContext; 025 import javax.resource.spi.ResourceAdapter; 026 import javax.resource.spi.ResourceAdapterAssociation; 027 import javax.resource.spi.ResourceAdapterInternalException; 028 import javax.resource.spi.endpoint.MessageEndpointFactory; 029 import javax.transaction.SystemException; 030 import javax.transaction.xa.XAResource; 031 032 import org.apache.geronimo.transaction.manager.NamedXAResource; 033 import org.apache.geronimo.transaction.manager.RecoverableTransactionManager; 034 import org.apache.geronimo.transaction.manager.WrapperNamedXAResource; 035 036 /** 037 * Dynamic GBean wrapper around a ResourceAdapter object, exposing the config-properties as 038 * GBean attributes. 039 * 040 * @version $Rev: 550546 $ $Date: 2007-06-25 12:52:11 -0400 (Mon, 25 Jun 2007) $ 041 */ 042 public class ResourceAdapterWrapper implements ResourceAdapter { 043 044 private final String name; 045 046 private final String resourceAdapterClass; 047 048 private final BootstrapContext bootstrapContext; 049 050 protected final ResourceAdapter resourceAdapter; 051 052 private final Map<String,String> messageListenerToActivationSpecMap; 053 054 private final RecoverableTransactionManager transactionManager; 055 056 057 /** 058 * default constructor for enhancement proxy endpoint 059 */ 060 public ResourceAdapterWrapper() { 061 this.name = null; 062 this.resourceAdapterClass = null; 063 this.bootstrapContext = null; 064 this.resourceAdapter = null; 065 this.messageListenerToActivationSpecMap = null; 066 this.transactionManager = null; 067 } 068 069 public ResourceAdapterWrapper(String name, 070 String resourceAdapterClass, 071 Map<String, String> messageListenerToActivationSpecMap, 072 BootstrapContext bootstrapContext, 073 RecoverableTransactionManager transactionManager, 074 ClassLoader cl) throws InstantiationException, IllegalAccessException, ClassNotFoundException { 075 this.name = name; 076 this.resourceAdapterClass = resourceAdapterClass; 077 this.bootstrapContext = bootstrapContext; 078 Class clazz = cl.loadClass(resourceAdapterClass); 079 resourceAdapter = (ResourceAdapter) clazz.newInstance(); 080 this.messageListenerToActivationSpecMap = messageListenerToActivationSpecMap; 081 this.transactionManager = transactionManager; 082 } 083 084 public ResourceAdapterWrapper(String name, ResourceAdapter resourceAdapter, Map<String, String> messageListenerToActivationSpecMap, BootstrapContext bootstrapContext, RecoverableTransactionManager transactionManager) { 085 this.name = name; 086 this.resourceAdapterClass = resourceAdapter.getClass().getName(); 087 this.bootstrapContext = bootstrapContext; 088 this.resourceAdapter = resourceAdapter; 089 this.messageListenerToActivationSpecMap = messageListenerToActivationSpecMap; 090 this.transactionManager = transactionManager; 091 } 092 093 public String getName() { 094 return name; 095 } 096 097 public String getResourceAdapterClass() { 098 return resourceAdapterClass; 099 } 100 101 public Map<String,String> getMessageListenerToActivationSpecMap() { 102 return messageListenerToActivationSpecMap; 103 } 104 105 public ResourceAdapter getResourceAdapter() { 106 return resourceAdapter; 107 } 108 109 public void registerResourceAdapterAssociation(final ResourceAdapterAssociation resourceAdapterAssociation) throws ResourceException { 110 resourceAdapterAssociation.setResourceAdapter(resourceAdapter); 111 } 112 113 public void start(BootstrapContext ctx) throws ResourceAdapterInternalException { 114 throw new IllegalStateException("Don't call this"); 115 } 116 117 public void stop() { 118 throw new IllegalStateException("Don't call this"); 119 } 120 121 //endpoint handling 122 public void endpointActivation(final MessageEndpointFactory messageEndpointFactory, final ActivationSpec activationSpec) throws ResourceException { 123 resourceAdapter.endpointActivation(messageEndpointFactory, activationSpec); 124 } 125 126 public void doRecovery(ActivationSpec activationSpec, String containerId) { 127 try { 128 XAResource[] xaResources = getXAResources(new ActivationSpec[]{activationSpec}); 129 if (xaResources == null || xaResources.length == 0) { 130 return; 131 } 132 NamedXAResource xaResource = new WrapperNamedXAResource(xaResources[0], containerId); 133 transactionManager.recoverResourceManager(xaResource); 134 } catch (ResourceException e) { 135 transactionManager.recoveryError((SystemException) new SystemException("Could not get XAResource for recovery for mdb: " + containerId).initCause(e)); 136 } 137 138 } 139 140 public void endpointDeactivation(final MessageEndpointFactory messageEndpointFactory, final ActivationSpec activationSpec) { 141 resourceAdapter.endpointDeactivation(messageEndpointFactory, activationSpec); 142 } 143 144 public XAResource[] getXAResources(ActivationSpec[] specs) throws ResourceException { 145 return resourceAdapter.getXAResources(specs); 146 } 147 148 public void doStart() throws Exception { 149 resourceAdapter.start(bootstrapContext); 150 } 151 152 public void doStop() { 153 resourceAdapter.stop(); 154 } 155 156 public void doFail() { 157 resourceAdapter.stop(); 158 } 159 160 }