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 package org.apache.geronimo.connector.outbound; 018 019 import java.io.Externalizable; 020 import java.io.IOException; 021 import java.io.InvalidObjectException; 022 import java.io.ObjectInput; 023 import java.io.ObjectOutput; 024 import java.io.ObjectStreamException; 025 import java.io.Serializable; 026 027 import javax.resource.spi.ConnectionManager; 028 import javax.security.auth.Subject; 029 030 import org.apache.geronimo.connector.outbound.connectionmanagerconfig.PoolingSupport; 031 import org.apache.geronimo.connector.outbound.connectionmanagerconfig.TransactionSupport; 032 import org.apache.geronimo.connector.outbound.connectiontracking.ConnectionTracker; 033 import org.apache.geronimo.gbean.AbstractName; 034 import org.apache.geronimo.gbean.GBeanInfo; 035 import org.apache.geronimo.gbean.GBeanInfoBuilder; 036 import org.apache.geronimo.gbean.GBeanLifecycle; 037 import org.apache.geronimo.j2ee.j2eeobjectnames.NameFactory; 038 import org.apache.geronimo.kernel.GBeanNotFoundException; 039 import org.apache.geronimo.kernel.Kernel; 040 import org.apache.geronimo.kernel.KernelRegistry; 041 import org.apache.geronimo.kernel.proxy.ProxyManager; 042 import org.apache.geronimo.security.ContextManager; 043 import org.apache.geronimo.transaction.manager.RecoverableTransactionManager; 044 045 /** 046 * @version $Revision: 560411 $ 047 */ 048 public class GenericConnectionManagerGBean extends GenericConnectionManager implements GBeanLifecycle, Serializable, Externalizable { 049 private Kernel kernel; 050 private AbstractName abstractName; 051 //externalizable format version 052 private static final int VERSION = 1; 053 054 public GenericConnectionManagerGBean() { 055 super(); 056 kernel = null; 057 abstractName = null; 058 } 059 060 public GenericConnectionManagerGBean(TransactionSupport transactionSupport, 061 PoolingSupport pooling, 062 boolean containerManagedSecurity, 063 ConnectionTracker connectionTracker, 064 RecoverableTransactionManager transactionManager, 065 String objectName, 066 AbstractName abstractName, 067 ClassLoader classLoader, 068 Kernel kernel) { 069 super(transactionSupport, pooling, getSubjectSource(containerManagedSecurity), connectionTracker, transactionManager, objectName, classLoader); 070 this.kernel = kernel; 071 this.abstractName = abstractName; 072 } 073 074 public ConnectionManager getConnectionManager() { 075 ConnectionManager unproxied = super.getConnectionManager(); 076 ProxyManager pm = kernel.getProxyManager(); 077 if (pm.isProxy(unproxied)) { 078 return unproxied; 079 } else { 080 return (ConnectionManager) pm.createProxy(kernel.getAbstractNameFor(unproxied), unproxied.getClass().getClassLoader()); 081 } 082 } 083 084 private static SubjectSource getSubjectSource(boolean containerManagedSecurity) { 085 if (containerManagedSecurity) { 086 return new SubjectSource() { 087 public Subject getSubject() { 088 return ContextManager.getNextCaller(); 089 } 090 }; 091 } else { 092 return null; 093 } 094 } 095 096 private Object readResolve() throws ObjectStreamException { 097 try { 098 return kernel.getGBean(abstractName); 099 } catch (GBeanNotFoundException e) { 100 throw (ObjectStreamException) new InvalidObjectException("Could not locate connection manager gbean").initCause(e); 101 } 102 } 103 104 public void writeExternal(ObjectOutput out) throws IOException { 105 out.writeInt(VERSION); 106 out.writeObject(kernel.getKernelName()); 107 out.writeObject(abstractName); 108 } 109 110 public void readExternal(ObjectInput in) throws IOException, ClassNotFoundException { 111 int version = in.readInt(); 112 if (version != VERSION) { 113 throw new IOException("Wrong version, expected " + VERSION + ", got: " + version); 114 } 115 String kernelName = (String) in.readObject(); 116 kernel = KernelRegistry.getKernel(kernelName); 117 if (kernel == null) { 118 kernel = KernelRegistry.getSingleKernel(); 119 } 120 if (kernel == null) { 121 throw new IOException("No kernel named: '" + kernelName + "' found"); 122 } 123 abstractName = (AbstractName) in.readObject(); 124 } 125 126 public static final GBeanInfo GBEAN_INFO; 127 128 static { 129 GBeanInfoBuilder infoBuilder = GBeanInfoBuilder.createStatic(GenericConnectionManagerGBean.class, AbstractConnectionManagerGBean.GBEAN_INFO); 130 131 infoBuilder.addAttribute("transactionSupport", TransactionSupport.class, true); 132 infoBuilder.addAttribute("pooling", PoolingSupport.class, true); 133 infoBuilder.addAttribute("containerManagedSecurity", Boolean.TYPE, true); 134 135 infoBuilder.addAttribute("objectName", String.class, false); 136 infoBuilder.addAttribute("abstractName", AbstractName.class, false); 137 infoBuilder.addAttribute("classLoader", ClassLoader.class, false); 138 infoBuilder.addAttribute("kernel", Kernel.class, false); 139 140 infoBuilder.addReference("ConnectionTracker", ConnectionTracker.class, NameFactory.JCA_CONNECTION_TRACKER); 141 infoBuilder.addReference("TransactionManager", RecoverableTransactionManager.class, NameFactory.TRANSACTION_MANAGER); 142 143 144 infoBuilder.setConstructor(new String[]{ 145 "transactionSupport", 146 "pooling", 147 "containerManagedSecurity", 148 "ConnectionTracker", 149 "TransactionManager", 150 "objectName", 151 "abstractName", 152 "classLoader", 153 "kernel" 154 }); 155 156 GBEAN_INFO = infoBuilder.getBeanInfo(); 157 } 158 159 public static GBeanInfo getGBeanInfo() { 160 return GBEAN_INFO; 161 } 162 163 }