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    */
DefaultActivationGroup(ActivationGroupID id, MarshalledObject data)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    */
activeObject(ActivationID id, Remote obj)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    */
newInstance(ActivationID id, ActivationDesc desc)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 }
160