Frames | No Frames |
1: /* DefaultActivationGroup.java -- Default activation group. 2: Copyright (C) 2006 Free Software Foundation, Inc. 3: 4: This file is part of GNU Classpath. 5: 6: GNU Classpath is free software; you can redistribute it and/or modify 7: it under the terms of the GNU General Public License as published by 8: the Free Software Foundation; either version 2, or (at your option) 9: any later version. 10: 11: GNU Classpath is distributed in the hope that it will be useful, but 12: WITHOUT ANY WARRANTY; without even the implied warranty of 13: MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 14: General Public License for more details. 15: 16: You should have received a copy of the GNU General Public License 17: along with GNU Classpath; see the file COPYING. If not, write to the 18: Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 19: 02110-1301 USA. 20: 21: Linking this library statically or dynamically with other modules is 22: making a combined work based on this library. Thus, the terms and 23: conditions of the GNU General Public License cover the whole 24: combination. 25: 26: As a special exception, the copyright holders of this library give you 27: permission to link this library with independent modules to produce an 28: executable, regardless of the license terms of these independent 29: modules, and to copy and distribute the resulting executable under 30: terms of your choice, provided that you also meet, for each linked 31: independent module, the terms and conditions of the license of that 32: module. An independent module is a module which is not derived from 33: or based on this library. If you modify this library, you may extend 34: this exception to your version of the library, but you are not 35: obligated to do so. If you do not wish to do so, delete this 36: exception statement from your version. */ 37: 38: 39: package gnu.java.rmi.activation; 40: 41: import gnu.java.rmi.server.ActivatableServerRef; 42: import gnu.java.rmi.server.UnicastServer; 43: 44: import java.lang.reflect.Constructor; 45: import java.rmi.MarshalledObject; 46: import java.rmi.Remote; 47: import java.rmi.RemoteException; 48: import java.rmi.activation.ActivationDesc; 49: import java.rmi.activation.ActivationException; 50: import java.rmi.activation.ActivationGroup; 51: import java.rmi.activation.ActivationGroupID; 52: import java.rmi.activation.ActivationID; 53: import java.rmi.activation.UnknownObjectException; 54: 55: /** 56: * The default activation group class. This activation group assumes that 57: * all classes are accessible via current thread context class loader. 58: * The remote class loading is not supported for security reasons. The 59: * activation always occurs in the current jre. 60: * 61: * @author Audrius Meskauskas (audriusa@Bioinformatics.org) 62: */ 63: public class DefaultActivationGroup 64: extends ActivationGroup 65: { 66: /** 67: * Use the serialVersionUID for interoperability. 68: */ 69: private static final long serialVersionUID = 1; 70: 71: /** 72: * Used during the group creation (required constructor). 73: */ 74: static final Class[] cConstructorTypes = new Class[] 75: { 76: ActivationID.class, 77: MarshalledObject.class 78: }; 79: 80: 81: /** 82: * Create the new default activation group. 83: * 84: * @param id the group activation id. 85: * @param data may contain the group initialization data (unused and can be 86: * null) 87: * @throws RemoteException if the super constructor does 88: */ 89: public DefaultActivationGroup(ActivationGroupID id, MarshalledObject data) 90: throws RemoteException 91: { 92: super(id); 93: } 94: 95: 96: /** 97: * May be overridden and used as a hook. This method is called each time 98: * the new object is instantiated. 99: */ 100: public void activeObject(ActivationID id, Remote obj) 101: throws ActivationException, UnknownObjectException, RemoteException 102: { 103: // Nothing to do (the monitor is already notified in newInstance) 104: } 105: 106: /** 107: * Create the new instance of the object, using the class name and location 108: * information, stored in the passed descriptor. The method expects the object 109: * class to have the two parameter constructor, the first parameter being the 110: * {@link ActivationID} and the second the {@link MarshalledObject}. 111: * 112: * @param id the object activation id 113: * @param desc the activation descriptor, providing the information, necessary 114: * to create and activate the object 115: * @return the marshalled object, containing the exported stub of the created 116: * object 117: * @throws ActivationException if the activation fails due any reason 118: */ 119: public MarshalledObject newInstance(ActivationID id, ActivationDesc desc) 120: throws ActivationException, RemoteException 121: { 122: try 123: { 124: if (ActivationSystemTransient.debug) 125: System.out.println("Instantiating "+desc.getClassName()); 126: 127: Remote object; 128: Class objectClass; 129: 130: ClassLoader loader = Thread.currentThread().getContextClassLoader(); 131: objectClass = loader.loadClass(desc.getClassName()); 132: Constructor constructor = objectClass.getConstructor(cConstructorTypes); 133: object = (Remote) constructor.newInstance( 134: new Object[] { id, desc.getData() }); 135: 136: // Make the object accessible and create the stub. 137: ActivatableServerRef ref = UnicastServer.getActivatableRef(id); 138: Remote stub = ref.exportObject(object); 139: 140: MarshalledObject marsh = new MarshalledObject(stub); 141: 142: // Notify the activation monitor. 143: activeObject(id, marsh); 144: 145: // Make call to the hook that may be overridden. 146: activeObject(id, stub); 147: 148: return marsh; 149: } 150: catch (Exception e) 151: { 152: ActivationException acex = new ActivationException( 153: "Unable to activate "+ desc.getClassName() 154: + " from "+ desc.getLocation(), e); 155: throw acex; 156: } 157: } 158: 159: }