Source for gnu.java.rmi.activation.DefaultActivationGroup

   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: }