History

My first initial commit with all of mine experimental changes.

Dmitry Kabak (userdima committed 13 years ago

Commit d37b88d1 parent 3f5b46618352 files · +2598093 −-8690Browse files

Showing the changes to java/pkg/java/rmi/activation (31 of 18352 files). Show all

Unified · Split

31 files
  1. java/pkg/java/rmi/activation/Activatable.class +0 −0
  2. java/pkg/java/rmi/activation/Activatable.java +555 −0
  3. java/pkg/java/rmi/activation/ActivateFailedException.class +0 −0
  4. java/pkg/java/rmi/activation/ActivateFailedException.java +62 −0
  5. java/pkg/java/rmi/activation/ActivationDesc.class +0 −0
  6. java/pkg/java/rmi/activation/ActivationDesc.java +339 −0
  7. java/pkg/java/rmi/activation/ActivationException.class +0 −0
  8. java/pkg/java/rmi/activation/ActivationException.java +118 −0
  9. java/pkg/java/rmi/activation/ActivationGroup.class +0 −0
  10. java/pkg/java/rmi/activation/ActivationGroup.java +528 −0
  11. java/pkg/java/rmi/activation/ActivationGroupDesc$CommandEnvironment.class +0 −0
  12. java/pkg/java/rmi/activation/ActivationGroupDesc.class +0 −0
  13. java/pkg/java/rmi/activation/ActivationGroupDesc.java +370 −0
  14. java/pkg/java/rmi/activation/ActivationGroupID.class +0 −0
  15. java/pkg/java/rmi/activation/ActivationGroupID.java +115 −0
  16. java/pkg/java/rmi/activation/ActivationID.class +0 −0
  17. java/pkg/java/rmi/activation/ActivationID.java +290 −0
  18. java/pkg/java/rmi/activation/ActivationInstantiator.class +0 −0
  19. java/pkg/java/rmi/activation/ActivationInstantiator.java +76 −0
  20. java/pkg/java/rmi/activation/ActivationMonitor.class +0 −0
  21. java/pkg/java/rmi/activation/ActivationMonitor.java +108 −0
  22. java/pkg/java/rmi/activation/ActivationSystem.class +0 −0
  23. java/pkg/java/rmi/activation/ActivationSystem.java +229 −0
  24. java/pkg/java/rmi/activation/Activator.class +0 −0
  25. java/pkg/java/rmi/activation/Activator.java +114 −0
  26. java/pkg/java/rmi/activation/UnknownGroupException.class +0 −0
  27. java/pkg/java/rmi/activation/UnknownGroupException.java +60 −0
  28. java/pkg/java/rmi/activation/UnknownObjectException.class +0 −0
  29. java/pkg/java/rmi/activation/UnknownObjectException.java +62 −0
  30. java/pkg/java/rmi/activation/mkfile +21 −0
  31. java/pkg/java/rmi/activation/package.html +52 −0
java/pkg/java/rmi/activation/Activatable.class+0−0

Binary file not shown.

java/pkg/java/rmi/activation/Activatable.java+555−0
@@ -0,0 +1,555 @@
1/*
2 * Copyright (c) 1997, 2005, Oracle and/or its affiliates. All rights reserved.
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4 *
5 * This code is free software; you can redistribute it and/or modify it
6 * under the terms of the GNU General Public License version 2 only, as
7 * published by the Free Software Foundation. Oracle designates this
8 * particular file as subject to the "Classpath" exception as provided
9 * by Oracle in the LICENSE file that accompanied this code.
10 *
11 * This code is distributed in the hope that it will be useful, but WITHOUT
12 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
13 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
14 * version 2 for more details (a copy is included in the LICENSE file that
15 * accompanied this code).
16 *
17 * You should have received a copy of the GNU General Public License version
18 * 2 along with this work; if not, write to the Free Software Foundation,
19 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
20 *
21 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
22 * or visit www.oracle.com if you need additional information or have any
23 * questions.
24 */
25
26package java.rmi.activation;
27
28import java.rmi.MarshalledObject;
29import java.rmi.NoSuchObjectException;
30import java.rmi.Remote;
31import java.rmi.RemoteException;
32import java.rmi.activation.UnknownGroupException;
33import java.rmi.activation.UnknownObjectException;
34import java.rmi.server.RMIClientSocketFactory;
35import java.rmi.server.RMIServerSocketFactory;
36import java.rmi.server.RemoteServer;
37import sun.rmi.server.ActivatableServerRef;
38
39/**
40 * The <code>Activatable</code> class provides support for remote
41 * objects that require persistent access over time and that
42 * can be activated by the system.
43 *
44 * <p>For the constructors and static <code>exportObject</code> methods,
45 * the stub for a remote object being exported is obtained as described in
46 * {@link java.rmi.server.UnicastRemoteObject}.
47 *
48 * <p>An attempt to serialize explicitly an instance of this class will
49 * fail.
50 *
51 * @author Ann Wollrath
52 * @since 1.2
53 * @serial exclude
54 */
55public abstract class Activatable extends RemoteServer {
56
57 private ActivationID id;
58 /** indicate compatibility with the Java 2 SDK v1.2 version of class */
59 private static final long serialVersionUID = -3120617863591563455L;
60
61 /**
62 * Constructs an activatable remote object by registering
63 * an activation descriptor (with the specified location, data, and
64 * restart mode) for this object, and exporting the object with the
65 * specified port.
66 *
67 * <p><strong>Note:</strong> Using the <code>Activatable</code>
68 * constructors that both register and export an activatable remote
69 * object is strongly discouraged because the actions of registering
70 * and exporting the remote object are <i>not</i> guaranteed to be
71 * atomic. Instead, an application should register an activation
72 * descriptor and export a remote object separately, so that exceptions
73 * can be handled properly.
74 *
75 * <p>This method invokes the {@link
76 * #exportObject(Remote,String,MarshalledObject,boolean,int)
77 * exportObject} method with this object, and the specified location,
78 * data, restart mode, and port. Subsequent calls to {@link #getID}
79 * will return the activation identifier returned from the call to
80 * <code>exportObject</code>.
81 *
82 * @param location the location for classes for this object
83 * @param data the object's initialization data
84 * @param port the port on which the object is exported (an anonymous
85 * port is used if port=0)
86 * @param restart if true, the object is restarted (reactivated) when
87 * either the activator is restarted or the object's activation group
88 * is restarted after an unexpected crash; if false, the object is only
89 * activated on demand. Specifying <code>restart</code> to be
90 * <code>true</code> does not force an initial immediate activation of
91 * a newly registered object; initial activation is lazy.
92 * @exception ActivationException if object registration fails.
93 * @exception RemoteException if either of the following fails:
94 * a) registering the object with the activation system or b) exporting
95 * the object to the RMI runtime.
96 * @since 1.2
97 **/
98 protected Activatable(String location,
99 MarshalledObject<?> data,
100 boolean restart,
101 int port)
102 throws ActivationException, RemoteException
103 {
104 super();
105 id = exportObject(this, location, data, restart, port);
106 }
107
108 /**
109 * Constructs an activatable remote object by registering
110 * an activation descriptor (with the specified location, data, and
111 * restart mode) for this object, and exporting the object with the
112 * specified port, and specified client and server socket factories.
113 *
114 * <p><strong>Note:</strong> Using the <code>Activatable</code>
115 * constructors that both register and export an activatable remote
116 * object is strongly discouraged because the actions of registering
117 * and exporting the remote object are <i>not</i> guaranteed to be
118 * atomic. Instead, an application should register an activation
119 * descriptor and export a remote object separately, so that exceptions
120 * can be handled properly.
121 *
122 * <p>This method invokes the {@link
123 * #exportObject(Remote,String,MarshalledObject,boolean,int,RMIClientSocketFactory,RMIServerSocketFactory)
124 * exportObject} method with this object, and the specified location,
125 * data, restart mode, port, and client and server socket factories.
126 * Subsequent calls to {@link #getID} will return the activation
127 * identifier returned from the call to <code>exportObject</code>.
128 *
129 * @param location the location for classes for this object
130 * @param data the object's initialization data
131 * @param restart if true, the object is restarted (reactivated) when
132 * either the activator is restarted or the object's activation group
133 * is restarted after an unexpected crash; if false, the object is only
134 * activated on demand. Specifying <code>restart</code> to be
135 * <code>true</code> does not force an initial immediate activation of
136 * a newly registered object; initial activation is lazy.
137 * @param port the port on which the object is exported (an anonymous
138 * port is used if port=0)
139 * @param csf the client-side socket factory for making calls to the
140 * remote object
141 * @param ssf the server-side socket factory for receiving remote calls
142 * @exception ActivationException if object registration fails.
143 * @exception RemoteException if either of the following fails:
144 * a) registering the object with the activation system or b) exporting
145 * the object to the RMI runtime.
146 * @since 1.2
147 **/
148 protected Activatable(String location,
149 MarshalledObject<?> data,
150 boolean restart,
151 int port,
152 RMIClientSocketFactory csf,
153 RMIServerSocketFactory ssf)
154 throws ActivationException, RemoteException
155 {
156 super();
157 id = exportObject(this, location, data, restart, port, csf, ssf);
158 }
159
160 /**
161 * Constructor used to activate/export the object on a specified
162 * port. An "activatable" remote object must have a constructor that
163 * takes two arguments: <ul>
164 * <li>the object's activation identifier (<code>ActivationID</code>), and
165 * <li>the object's initialization data (a <code>MarshalledObject</code>).
166 * </ul><p>
167 *
168 * A concrete subclass of this class must call this constructor when it is
169 * <i>activated</i> via the two parameter constructor described above. As
170 * a side-effect of construction, the remote object is "exported"
171 * to the RMI runtime (on the specified <code>port</code>) and is
172 * available to accept incoming calls from clients.
173 *
174 * @param id activation identifier for the object
175 * @param port the port number on which the object is exported
176 * @exception RemoteException if exporting the object to the RMI
177 * runtime fails
178 * @since 1.2
179 */
180 protected Activatable(ActivationID id, int port)
181 throws RemoteException
182 {
183 super();
184 this.id = id;
185 exportObject(this, id, port);
186 }
187
188 /**
189 * Constructor used to activate/export the object on a specified
190 * port. An "activatable" remote object must have a constructor that
191 * takes two arguments: <ul>
192 * <li>the object's activation identifier (<code>ActivationID</code>), and
193 * <li>the object's initialization data (a <code>MarshalledObject</code>).
194 * </ul><p>
195 *
196 * A concrete subclass of this class must call this constructor when it is
197 * <i>activated</i> via the two parameter constructor described above. As
198 * a side-effect of construction, the remote object is "exported"
199 * to the RMI runtime (on the specified <code>port</code>) and is
200 * available to accept incoming calls from clients.
201 *
202 * @param id activation identifier for the object
203 * @param port the port number on which the object is exported
204 * @param csf the client-side socket factory for making calls to the
205 * remote object
206 * @param ssf the server-side socket factory for receiving remote calls
207 * @exception RemoteException if exporting the object to the RMI
208 * runtime fails
209 * @since 1.2
210 */
211 protected Activatable(ActivationID id, int port,
212 RMIClientSocketFactory csf,
213 RMIServerSocketFactory ssf)
214 throws RemoteException
215 {
216 super();
217 this.id = id;
218 exportObject(this, id, port, csf, ssf);
219 }
220
221 /**
222 * Returns the object's activation identifier. The method is
223 * protected so that only subclasses can obtain an object's
224 * identifier.
225 * @return the object's activation identifier
226 * @since 1.2
227 */
228 protected ActivationID getID() {
229 return id;
230 }
231
232 /**
233 * Register an object descriptor for an activatable remote
234 * object so that is can be activated on demand.
235 *
236 * @param desc the object's descriptor
237 * @return the stub for the activatable remote object
238 * @exception UnknownGroupException if group id in <code>desc</code>
239 * is not registered with the activation system
240 * @exception ActivationException if activation system is not running
241 * @exception RemoteException if remote call fails
242 * @since 1.2
243 */
244 public static Remote register(ActivationDesc desc)
245 throws UnknownGroupException, ActivationException, RemoteException
246 {
247 // register object with activator.
248 ActivationID id =
249 ActivationGroup.getSystem().registerObject(desc);
250 return sun.rmi.server.ActivatableRef.getStub(desc, id);
251 }
252
253 /**
254 * Informs the system that the object with the corresponding activation
255 * <code>id</code> is currently inactive. If the object is currently
256 * active, the object is "unexported" from the RMI runtime (only if
257 * there are no pending or in-progress calls)
258 * so the that it can no longer receive incoming calls. This call
259 * informs this VM's ActivationGroup that the object is inactive,
260 * that, in turn, informs its ActivationMonitor. If this call
261 * completes successfully, a subsequent activate request to the activator
262 * will cause the object to reactivate. The operation may still
263 * succeed if the object is considered active but has already
264 * unexported itself.
265 *
266 * @param id the object's activation identifier
267 * @return true if the operation succeeds (the operation will
268 * succeed if the object in currently known to be active and is
269 * either already unexported or is currently exported and has no
270 * pending/executing calls); false is returned if the object has
271 * pending/executing calls in which case it cannot be deactivated
272 * @exception UnknownObjectException if object is not known (it may
273 * already be inactive)
274 * @exception ActivationException if group is not active
275 * @exception RemoteException if call informing monitor fails
276 * @since 1.2
277 */
278 public static boolean inactive(ActivationID id)
279 throws UnknownObjectException, ActivationException, RemoteException
280 {
281 return ActivationGroup.currentGroup().inactiveObject(id);
282 }
283
284 /**
285 * Revokes previous registration for the activation descriptor
286 * associated with <code>id</code>. An object can no longer be
287 * activated via that <code>id</code>.
288 *
289 * @param id the object's activation identifier
290 * @exception UnknownObjectException if object (<code>id</code>) is unknown
291 * @exception ActivationException if activation system is not running
292 * @exception RemoteException if remote call to activation system fails
293 * @since 1.2
294 */
295 public static void unregister(ActivationID id)
296 throws UnknownObjectException, ActivationException, RemoteException
297 {
298 ActivationGroup.getSystem().unregisterObject(id);
299 }
300
301 /**
302 * Registers an activation descriptor (with the specified location,
303 * data, and restart mode) for the specified object, and exports that
304 * object with the specified port.
305 *
306 * <p><strong>Note:</strong> Using this method (as well as the
307 * <code>Activatable</code> constructors that both register and export
308 * an activatable remote object) is strongly discouraged because the
309 * actions of registering and exporting the remote object are
310 * <i>not</i> guaranteed to be atomic. Instead, an application should
311 * register an activation descriptor and export a remote object
312 * separately, so that exceptions can be handled properly.
313 *
314 * <p>This method invokes the {@link
315 * #exportObject(Remote,String,MarshalledObject,boolean,int,RMIClientSocketFactory,RMIServerSocketFactory)
316 * exportObject} method with the specified object, location, data,
317 * restart mode, and port, and <code>null</code> for both client and
318 * server socket factories, and then returns the resulting activation
319 * identifier.
320 *
321 * @param obj the object being exported
322 * @param location the object's code location
323 * @param data the object's bootstrapping data
324 * @param restart if true, the object is restarted (reactivated) when
325 * either the activator is restarted or the object's activation group
326 * is restarted after an unexpected crash; if false, the object is only
327 * activated on demand. Specifying <code>restart</code> to be
328 * <code>true</code> does not force an initial immediate activation of
329 * a newly registered object; initial activation is lazy.
330 * @param port the port on which the object is exported (an anonymous
331 * port is used if port=0)
332 * @return the activation identifier obtained from registering the
333 * descriptor, <code>desc</code>, with the activation system
334 * the wrong group
335 * @exception ActivationException if activation group is not active
336 * @exception RemoteException if object registration or export fails
337 * @since 1.2
338 **/
339 public static ActivationID exportObject(Remote obj,
340 String location,
341 MarshalledObject<?> data,
342 boolean restart,
343 int port)
344 throws ActivationException, RemoteException
345 {
346 return exportObject(obj, location, data, restart, port, null, null);
347 }
348
349 /**
350 * Registers an activation descriptor (with the specified location,
351 * data, and restart mode) for the specified object, and exports that
352 * object with the specified port, and the specified client and server
353 * socket factories.
354 *
355 * <p><strong>Note:</strong> Using this method (as well as the
356 * <code>Activatable</code> constructors that both register and export
357 * an activatable remote object) is strongly discouraged because the
358 * actions of registering and exporting the remote object are
359 * <i>not</i> guaranteed to be atomic. Instead, an application should
360 * register an activation descriptor and export a remote object
361 * separately, so that exceptions can be handled properly.
362 *
363 * <p>This method first registers an activation descriptor for the
364 * specified object as follows. It obtains the activation system by
365 * invoking the method {@link ActivationGroup#getSystem
366 * ActivationGroup.getSystem}. This method then obtains an {@link
367 * ActivationID} for the object by invoking the activation system's
368 * {@link ActivationSystem#registerObject registerObject} method with
369 * an {@link ActivationDesc} constructed with the specified object's
370 * class name, and the specified location, data, and restart mode. If
371 * an exception occurs obtaining the activation system or registering
372 * the activation descriptor, that exception is thrown to the caller.
373 *
374 * <p>Next, this method exports the object by invoking the {@link
375 * #exportObject(Remote,ActivationID,int,RMIClientSocketFactory,RMIServerSocketFactory)
376 * exportObject} method with the specified remote object, the
377 * activation identifier obtained from registration, the specified
378 * port, and the specified client and server socket factories. If an
379 * exception occurs exporting the object, this method attempts to
380 * unregister the activation identifier (obtained from registration) by
381 * invoking the activation system's {@link
382 * ActivationSystem#unregisterObject unregisterObject} method with the
383 * activation identifier. If an exception occurs unregistering the
384 * identifier, that exception is ignored, and the original exception
385 * that occurred exporting the object is thrown to the caller.
386 *
387 * <p>Finally, this method invokes the {@link
388 * ActivationGroup#activeObject activeObject} method on the activation
389 * group in this VM with the activation identifier and the specified
390 * remote object, and returns the activation identifier to the caller.
391 *
392 * @param obj the object being exported
393 * @param location the object's code location
394 * @param data the object's bootstrapping data
395 * @param restart if true, the object is restarted (reactivated) when
396 * either the activator is restarted or the object's activation group
397 * is restarted after an unexpected crash; if false, the object is only
398 * activated on demand. Specifying <code>restart</code> to be
399 * <code>true</code> does not force an initial immediate activation of
400 * a newly registered object; initial activation is lazy.
401 * @param port the port on which the object is exported (an anonymous
402 * port is used if port=0)
403 * @param csf the client-side socket factory for making calls to the
404 * remote object
405 * @param ssf the server-side socket factory for receiving remote calls
406 * @return the activation identifier obtained from registering the
407 * descriptor with the activation system
408 * @exception ActivationException if activation group is not active
409 * @exception RemoteException if object registration or export fails
410 * @since 1.2
411 **/
412 public static ActivationID exportObject(Remote obj,
413 String location,
414 MarshalledObject<?> data,
415 boolean restart,
416 int port,
417 RMIClientSocketFactory csf,
418 RMIServerSocketFactory ssf)
419 throws ActivationException, RemoteException
420 {
421 ActivationDesc desc = new ActivationDesc(obj.getClass().getName(),
422 location, data, restart);
423 /*
424 * Register descriptor.
425 */
426 ActivationSystem system = ActivationGroup.getSystem();
427 ActivationID id = system.registerObject(desc);
428
429 /*
430 * Export object.
431 */
432 try {
433 exportObject(obj, id, port, csf, ssf);
434 } catch (RemoteException e) {
435 /*
436 * Attempt to unregister activation descriptor because export
437 * failed and register/export should be atomic (see 4323621).
438 */
439 try {
440 system.unregisterObject(id);
441 } catch (Exception ex) {
442 }
443 /*
444 * Report original exception.
445 */
446 throw e;
447 }
448
449 /*
450 * This call can't fail (it is a local call, and the only possible
451 * exception, thrown if the group is inactive, will not be thrown
452 * because the group is not inactive).
453 */
454 ActivationGroup.currentGroup().activeObject(id, obj);
455
456 return id;
457 }
458
459 /**
460 * Export the activatable remote object to the RMI runtime to make
461 * the object available to receive incoming calls. The object is
462 * exported on an anonymous port, if <code>port</code> is zero. <p>
463 *
464 * During activation, this <code>exportObject</code> method should
465 * be invoked explicitly by an "activatable" object, that does not
466 * extend the <code>Activatable</code> class. There is no need for objects
467 * that do extend the <code>Activatable</code> class to invoke this
468 * method directly because the object is exported during construction.
469 *
470 * @return the stub for the activatable remote object
471 * @param obj the remote object implementation
472 * @param id the object's activation identifier
473 * @param port the port on which the object is exported (an anonymous
474 * port is used if port=0)
475 * @exception RemoteException if object export fails
476 * @since 1.2
477 */
478 public static Remote exportObject(Remote obj,
479 ActivationID id,
480 int port)
481 throws RemoteException
482 {
483 return exportObject(obj, new ActivatableServerRef(id, port));
484 }
485
486 /**
487 * Export the activatable remote object to the RMI runtime to make
488 * the object available to receive incoming calls. The object is
489 * exported on an anonymous port, if <code>port</code> is zero. <p>
490 *
491 * During activation, this <code>exportObject</code> method should
492 * be invoked explicitly by an "activatable" object, that does not
493 * extend the <code>Activatable</code> class. There is no need for objects
494 * that do extend the <code>Activatable</code> class to invoke this
495 * method directly because the object is exported during construction.
496 *
497 * @return the stub for the activatable remote object
498 * @param obj the remote object implementation
499 * @param id the object's activation identifier
500 * @param port the port on which the object is exported (an anonymous
501 * port is used if port=0)
502 * @param csf the client-side socket factory for making calls to the
503 * remote object
504 * @param ssf the server-side socket factory for receiving remote calls
505 * @exception RemoteException if object export fails
506 * @since 1.2
507 */
508 public static Remote exportObject(Remote obj,
509 ActivationID id,
510 int port,
511 RMIClientSocketFactory csf,
512 RMIServerSocketFactory ssf)
513 throws RemoteException
514 {
515 return exportObject(obj, new ActivatableServerRef(id, port, csf, ssf));
516 }
517
518 /**
519 * Remove the remote object, obj, from the RMI runtime. If
520 * successful, the object can no longer accept incoming RMI calls.
521 * If the force parameter is true, the object is forcibly unexported
522 * even if there are pending calls to the remote object or the
523 * remote object still has calls in progress. If the force
524 * parameter is false, the object is only unexported if there are
525 * no pending or in progress calls to the object.
526 *
527 * @param obj the remote object to be unexported
528 * @param force if true, unexports the object even if there are
529 * pending or in-progress calls; if false, only unexports the object
530 * if there are no pending or in-progress calls
531 * @return true if operation is successful, false otherwise
532 * @exception NoSuchObjectException if the remote object is not
533 * currently exported
534 * @since 1.2
535 */
536 public static boolean unexportObject(Remote obj, boolean force)
537 throws NoSuchObjectException
538 {
539 return sun.rmi.transport.ObjectTable.unexportObject(obj, force);
540 }
541
542 /**
543 * Exports the specified object using the specified server ref.
544 */
545 private static Remote exportObject(Remote obj, ActivatableServerRef sref)
546 throws RemoteException
547 {
548 // if obj extends Activatable, set its ref.
549 if (obj instanceof Activatable) {
550 ((Activatable) obj).ref = sref;
551
552 }
553 return sref.exportObject(obj, null, false);
554 }
555}
java/pkg/java/rmi/activation/ActivateFailedException.class+0−0

Binary file not shown.

java/pkg/java/rmi/activation/ActivateFailedException.java+62−0
@@ -0,0 +1,62 @@
1/*
2 * Copyright (c) 1998, 1999, Oracle and/or its affiliates. All rights reserved.
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4 *
5 * This code is free software; you can redistribute it and/or modify it
6 * under the terms of the GNU General Public License version 2 only, as
7 * published by the Free Software Foundation. Oracle designates this
8 * particular file as subject to the "Classpath" exception as provided
9 * by Oracle in the LICENSE file that accompanied this code.
10 *
11 * This code is distributed in the hope that it will be useful, but WITHOUT
12 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
13 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
14 * version 2 for more details (a copy is included in the LICENSE file that
15 * accompanied this code).
16 *
17 * You should have received a copy of the GNU General Public License version
18 * 2 along with this work; if not, write to the Free Software Foundation,
19 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
20 *
21 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
22 * or visit www.oracle.com if you need additional information or have any
23 * questions.
24 */
25
26package java.rmi.activation;
27
28/**
29 * This exception is thrown by the RMI runtime when activation
30 * fails during a remote call to an activatable object.
31 *
32 * @author Ann Wollrath
33 * @since 1.2
34 */
35public class ActivateFailedException extends java.rmi.RemoteException {
36
37 /** indicate compatibility with the Java 2 SDK v1.2 version of class */
38 private static final long serialVersionUID = 4863550261346652506L;
39
40 /**
41 * Constructs an <code>ActivateFailedException</code> with the specified
42 * detail message.
43 *
44 * @param s the detail message
45 * @since 1.2
46 */
47 public ActivateFailedException(String s) {
48 super(s);
49 }
50
51 /**
52 * Constructs an <code>ActivateFailedException</code> with the specified
53 * detail message and nested exception.
54 *
55 * @param s the detail message
56 * @param ex the nested exception
57 * @since 1.2
58 */
59 public ActivateFailedException(String s, Exception ex) {
60 super(s, ex);
61 }
62}
java/pkg/java/rmi/activation/ActivationDesc.class+0−0

Binary file not shown.

java/pkg/java/rmi/activation/ActivationDesc.java+339−0
@@ -0,0 +1,339 @@
1/*
2 * Copyright (c) 1997, 2005, Oracle and/or its affiliates. All rights reserved.
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4 *
5 * This code is free software; you can redistribute it and/or modify it
6 * under the terms of the GNU General Public License version 2 only, as
7 * published by the Free Software Foundation. Oracle designates this
8 * particular file as subject to the "Classpath" exception as provided
9 * by Oracle in the LICENSE file that accompanied this code.
10 *
11 * This code is distributed in the hope that it will be useful, but WITHOUT
12 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
13 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
14 * version 2 for more details (a copy is included in the LICENSE file that
15 * accompanied this code).
16 *
17 * You should have received a copy of the GNU General Public License version
18 * 2 along with this work; if not, write to the Free Software Foundation,
19 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
20 *
21 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
22 * or visit www.oracle.com if you need additional information or have any
23 * questions.
24 */
25
26package java.rmi.activation;
27
28import java.io.Serializable;
29import java.rmi.MarshalledObject;
30
31/**
32 * An activation descriptor contains the information necessary to
33 * activate an object: <ul>
34 * <li> the object's group identifier,
35 * <li> the object's fully-qualified class name,
36 * <li> the object's code location (the location of the class), a codebase URL
37 * path,
38 * <li> the object's restart "mode", and,
39 * <li> a "marshalled" object that can contain object specific
40 * initialization data. </ul>
41 *
42 * <p>A descriptor registered with the activation system can be used to
43 * recreate/activate the object specified by the descriptor. The
44 * <code>MarshalledObject</code> in the object's descriptor is passed
45 * as the second argument to the remote object's constructor for
46 * object to use during reinitialization/activation.
47 *
48 * @author Ann Wollrath
49 * @since 1.2
50 * @see java.rmi.activation.Activatable
51 */
52public final class ActivationDesc implements Serializable {
53
54 /**
55 * @serial the group's identifier
56 */
57 private ActivationGroupID groupID;
58
59 /**
60 * @serial the object's class name
61 */
62 private String className;
63
64 /**
65 * @serial the object's code location
66 */
67 private String location;
68
69 /**
70 * @serial the object's initialization data
71 */
72 private MarshalledObject<?> data;
73
74 /**
75 * @serial indicates whether the object should be restarted
76 */
77 private boolean restart;
78
79 /** indicate compatibility with the Java 2 SDK v1.2 version of class */
80 private static final long serialVersionUID = 7455834104417690957L;
81
82 /**
83 * Constructs an object descriptor for an object whose class name
84 * is <code>className</code>, that can be loaded from the
85 * code <code>location</code> and whose initialization
86 * information is <code>data</code>. If this form of the constructor
87 * is used, the <code>groupID</code> defaults to the current id for
88 * <code>ActivationGroup</code> for this VM. All objects with the
89 * same <code>ActivationGroupID</code> are activated in the same VM.
90 *
91 * <p>Note that objects specified by a descriptor created with this
92 * constructor will only be activated on demand (by default, the restart
93 * mode is <code>false</code>). If an activatable object requires restart
94 * services, use one of the <code>ActivationDesc</code> constructors that
95 * takes a boolean parameter, <code>restart</code>.
96 *
97 * <p> This constructor will throw <code>ActivationException</code> if
98 * there is no current activation group for this VM. To create an
99 * <code>ActivationGroup</code> use the
100 * <code>ActivationGroup.createGroup</code> method.
101 *
102 * @param className the object's fully package qualified class name
103 * @param location the object's code location (from where the class is
104 * loaded)
105 * @param data the object's initialization (activation) data contained
106 * in marshalled form.
107 * @exception ActivationException if the current group is nonexistent
108 * @since 1.2
109 */
110 public ActivationDesc(String className,
111 String location,
112 MarshalledObject<?> data)
113 throws ActivationException
114 {
115 this(ActivationGroup.internalCurrentGroupID(),
116 className, location, data, false);
117 }
118
119 /**
120 * Constructs an object descriptor for an object whose class name
121 * is <code>className</code>, that can be loaded from the
122 * code <code>location</code> and whose initialization
123 * information is <code>data</code>. If this form of the constructor
124 * is used, the <code>groupID</code> defaults to the current id for
125 * <code>ActivationGroup</code> for this VM. All objects with the
126 * same <code>ActivationGroupID</code> are activated in the same VM.
127 *
128 * <p>This constructor will throw <code>ActivationException</code> if
129 * there is no current activation group for this VM. To create an
130 * <code>ActivationGroup</code> use the
131 * <code>ActivationGroup.createGroup</code> method.
132 *
133 * @param className the object's fully package qualified class name
134 * @param location the object's code location (from where the class is
135 * loaded)
136 * @param data the object's initialization (activation) data contained
137 * in marshalled form.
138 * @param restart if true, the object is restarted (reactivated) when
139 * either the activator is restarted or the object's activation group
140 * is restarted after an unexpected crash; if false, the object is only
141 * activated on demand. Specifying <code>restart</code> to be
142 * <code>true</code> does not force an initial immediate activation of
143 * a newly registered object; initial activation is lazy.
144 * @exception ActivationException if the current group is nonexistent
145 * @since 1.2
146 */
147 public ActivationDesc(String className,
148 String location,
149 MarshalledObject<?> data,
150 boolean restart)
151 throws ActivationException
152 {
153 this(ActivationGroup.internalCurrentGroupID(),
154 className, location, data, restart);
155 }
156
157 /**
158 * Constructs an object descriptor for an object whose class name
159 * is <code>className</code> that can be loaded from the
160 * code <code>location</code> and whose initialization
161 * information is <code>data</code>. All objects with the same
162 * <code>groupID</code> are activated in the same Java VM.
163 *
164 * <p>Note that objects specified by a descriptor created with this
165 * constructor will only be activated on demand (by default, the restart
166 * mode is <code>false</code>). If an activatable object requires restart
167 * services, use one of the <code>ActivationDesc</code> constructors that
168 * takes a boolean parameter, <code>restart</code>.
169 *
170 * @param groupID the group's identifier (obtained from registering
171 * <code>ActivationSystem.registerGroup</code> method). The group
172 * indicates the VM in which the object should be activated.
173 * @param className the object's fully package-qualified class name
174 * @param location the object's code location (from where the class is
175 * loaded)
176 * @param data the object's initialization (activation) data contained
177 * in marshalled form.
178 * @exception IllegalArgumentException if <code>groupID</code> is null
179 * @since 1.2
180 */
181 public ActivationDesc(ActivationGroupID groupID,
182 String className,
183 String location,
184 MarshalledObject<?> data)
185 {
186 this(groupID, className, location, data, false);
187 }
188
189 /**
190 * Constructs an object descriptor for an object whose class name
191 * is <code>className</code> that can be loaded from the
192 * code <code>location</code> and whose initialization
193 * information is <code>data</code>. All objects with the same
194 * <code>groupID</code> are activated in the same Java VM.
195 *
196 * @param groupID the group's identifier (obtained from registering
197 * <code>ActivationSystem.registerGroup</code> method). The group
198 * indicates the VM in which the object should be activated.
199 * @param className the object's fully package-qualified class name
200 * @param location the object's code location (from where the class is
201 * loaded)
202 * @param data the object's initialization (activation) data contained
203 * in marshalled form.
204 * @param restart if true, the object is restarted (reactivated) when
205 * either the activator is restarted or the object's activation group
206 * is restarted after an unexpected crash; if false, the object is only
207 * activated on demand. Specifying <code>restart</code> to be
208 * <code>true</code> does not force an initial immediate activation of
209 * a newly registered object; initial activation is lazy.
210 * @exception IllegalArgumentException if <code>groupID</code> is null
211 * @since 1.2
212 */
213 public ActivationDesc(ActivationGroupID groupID,
214 String className,
215 String location,
216 MarshalledObject<?> data,
217 boolean restart)
218 {
219 if (groupID == null)
220 throw new IllegalArgumentException("groupID can't be null");
221 this.groupID = groupID;
222 this.className = className;
223 this.location = location;
224 this.data = data;
225 this.restart = restart;
226 }
227
228 /**
229 * Returns the group identifier for the object specified by this
230 * descriptor. A group provides a way to aggregate objects into a
231 * single Java virtual machine. RMI creates/activates objects with
232 * the same <code>groupID</code> in the same virtual machine.
233 *
234 * @return the group identifier
235 * @since 1.2
236 */
237 public ActivationGroupID getGroupID() {
238 return groupID;
239 }
240
241 /**
242 * Returns the class name for the object specified by this
243 * descriptor.
244 * @return the class name
245 * @since 1.2
246 */
247 public String getClassName() {
248 return className;
249 }
250
251 /**
252 * Returns the code location for the object specified by
253 * this descriptor.
254 * @return the code location
255 * @since 1.2
256 */
257 public String getLocation() {
258 return location;
259 }
260
261 /**
262 * Returns a "marshalled object" containing intialization/activation
263 * data for the object specified by this descriptor.
264 * @return the object specific "initialization" data
265 * @since 1.2
266 */
267 public MarshalledObject<?> getData() {
268 return data;
269 }
270
271 /**
272 * Returns the "restart" mode of the object associated with
273 * this activation descriptor.
274 *
275 * @return true if the activatable object associated with this
276 * activation descriptor is restarted via the activation
277 * daemon when either the daemon comes up or the object's group
278 * is restarted after an unexpected crash; otherwise it returns false,
279 * meaning that the object is only activated on demand via a
280 * method call. Note that if the restart mode is <code>true</code>, the
281 * activator does not force an initial immediate activation of
282 * a newly registered object; initial activation is lazy.
283 * @since 1.2
284 */
285 public boolean getRestartMode() {
286 return restart;
287 }
288
289 /**
290 * Compares two activation descriptors for content equality.
291 *
292 * @param obj the Object to compare with
293 * @return true if these Objects are equal; false otherwise.
294 * @see java.util.Hashtable
295 * @since 1.2
296 */
297 public boolean equals(Object obj) {
298
299 if (obj instanceof ActivationDesc) {
300 ActivationDesc desc = (ActivationDesc) obj;
301 return
302 ((groupID == null ? desc.groupID == null :
303 groupID.equals(desc.groupID)) &&
304 (className == null ? desc.className == null :
305 className.equals(desc.className)) &&
306 (location == null ? desc.location == null:
307 location.equals(desc.location)) &&
308 (data == null ? desc.data == null :
309 data.equals(desc.data)) &&
310 (restart == desc.restart));
311
312 } else {
313 return false;
314 }
315 }
316
317 /**
318 * Return the same hashCode for similar <code>ActivationDesc</code>s.
319 * @return an integer
320 * @see java.util.Hashtable
321 */
322 public int hashCode() {
323 return ((location == null
324 ? 0
325 : location.hashCode() << 24) ^
326 (groupID == null
327 ? 0
328 : groupID.hashCode() << 16) ^
329 (className == null
330 ? 0
331 : className.hashCode() << 9) ^
332 (data == null
333 ? 0
334 : data.hashCode() << 1) ^
335 (restart
336 ? 1
337 : 0));
338 }
339}
java/pkg/java/rmi/activation/ActivationException.class+0−0

Binary file not shown.

java/pkg/java/rmi/activation/ActivationException.java+118−0
@@ -0,0 +1,118 @@
1/*
2 * Copyright (c) 1997, 2003, Oracle and/or its affiliates. All rights reserved.
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4 *
5 * This code is free software; you can redistribute it and/or modify it
6 * under the terms of the GNU General Public License version 2 only, as
7 * published by the Free Software Foundation. Oracle designates this
8 * particular file as subject to the "Classpath" exception as provided
9 * by Oracle in the LICENSE file that accompanied this code.
10 *
11 * This code is distributed in the hope that it will be useful, but WITHOUT
12 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
13 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
14 * version 2 for more details (a copy is included in the LICENSE file that
15 * accompanied this code).
16 *
17 * You should have received a copy of the GNU General Public License version
18 * 2 along with this work; if not, write to the Free Software Foundation,
19 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
20 *
21 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
22 * or visit www.oracle.com if you need additional information or have any
23 * questions.
24 */
25
26package java.rmi.activation;
27
28/**
29 * General exception used by the activation interfaces.
30 *
31 * <p>As of release 1.4, this exception has been retrofitted to conform to
32 * the general purpose exception-chaining mechanism. The "detail exception"
33 * that may be provided at construction time and accessed via the public
34 * {@link #detail} field is now known as the <i>cause</i>, and may be
35 * accessed via the {@link Throwable#getCause()} method, as well as
36 * the aforementioned "legacy field."
37 *
38 * <p>Invoking the method {@link Throwable#initCause(Throwable)} on an
39 * instance of <code>ActivationException</code> always throws {@link
40 * IllegalStateException}.
41 *
42 * @author Ann Wollrath
43 * @since 1.2
44 */
45public class ActivationException extends Exception {
46
47 /**
48 * The cause of the activation exception.
49 *
50 * <p>This field predates the general-purpose exception chaining facility.
51 * The {@link Throwable#getCause()} method is now the preferred means of
52 * obtaining this information.
53 *
54 * @serial
55 */
56 public Throwable detail;
57
58 /** indicate compatibility with the Java 2 SDK v1.2 version of class */
59 private static final long serialVersionUID = -4320118837291406071L;
60
61 /**
62 * Constructs an <code>ActivationException</code>.
63 */
64 public ActivationException() {
65 initCause(null); // Disallow subsequent initCause
66 }
67
68 /**
69 * Constructs an <code>ActivationException</code> with the specified
70 * detail message.
71 *
72 * @param s the detail message
73 */
74 public ActivationException(String s) {
75 super(s);
76 initCause(null); // Disallow subsequent initCause
77 }
78
79 /**
80 * Constructs an <code>ActivationException</code> with the specified
81 * detail message and cause. This constructor sets the {@link #detail}
82 * field to the specified <code>Throwable</code>.
83 *
84 * @param s the detail message
85 * @param cause the cause
86 */
87 public ActivationException(String s, Throwable cause) {
88 super(s);
89 initCause(null); // Disallow subsequent initCause
90 detail = cause;
91 }
92
93 /**
94 * Returns the detail message, including the message from the cause, if
95 * any, of this exception.
96 *
97 * @return the detail message
98 */
99 public String getMessage() {
100 if (detail == null)
101 return super.getMessage();
102 else
103 return super.getMessage() +
104 "; nested exception is: \n\t" +
105 detail.toString();
106 }
107
108 /**
109 * Returns the cause of this exception. This method returns the value
110 * of the {@link #detail} field.
111 *
112 * @return the cause, which may be <tt>null</tt>.
113 * @since 1.4
114 */
115 public Throwable getCause() {
116 return detail;
117 }
118}
java/pkg/java/rmi/activation/ActivationGroup.class+0−0

Binary file not shown.

java/pkg/java/rmi/activation/ActivationGroup.java+528−0
@@ -0,0 +1,528 @@
1/*
2 * Copyright (c) 1997, 2005, Oracle and/or its affiliates. All rights reserved.
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4 *
5 * This code is free software; you can redistribute it and/or modify it
6 * under the terms of the GNU General Public License version 2 only, as
7 * published by the Free Software Foundation. Oracle designates this
8 * particular file as subject to the "Classpath" exception as provided
9 * by Oracle in the LICENSE file that accompanied this code.
10 *
11 * This code is distributed in the hope that it will be useful, but WITHOUT
12 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
13 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
14 * version 2 for more details (a copy is included in the LICENSE file that
15 * accompanied this code).
16 *
17 * You should have received a copy of the GNU General Public License version
18 * 2 along with this work; if not, write to the Free Software Foundation,
19 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
20 *
21 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
22 * or visit www.oracle.com if you need additional information or have any
23 * questions.
24 */
25
26package java.rmi.activation;
27
28import java.lang.reflect.Constructor;
29import java.lang.reflect.InvocationTargetException;
30import java.rmi.MarshalledObject;
31import java.rmi.Naming;
32import java.rmi.Remote;
33import java.rmi.RemoteException;
34import java.rmi.activation.UnknownGroupException;
35import java.rmi.activation.UnknownObjectException;
36import java.rmi.server.RMIClassLoader;
37import java.rmi.server.UnicastRemoteObject;
38import java.security.AccessController;
39import sun.security.action.GetIntegerAction;
40
41/**
42 * An <code>ActivationGroup</code> is responsible for creating new
43 * instances of "activatable" objects in its group, informing its
44 * <code>ActivationMonitor</code> when either: its object's become
45 * active or inactive, or the group as a whole becomes inactive. <p>
46 *
47 * An <code>ActivationGroup</code> is <i>initially</i> created in one
48 * of several ways: <ul>
49 * <li>as a side-effect of creating an <code>ActivationDesc</code>
50 * without an explicit <code>ActivationGroupID</code> for the
51 * first activatable object in the group, or
52 * <li>via the <code>ActivationGroup.createGroup</code> method
53 * <li>as a side-effect of activating the first object in a group
54 * whose <code>ActivationGroupDesc</code> was only registered.</ul><p>
55 *
56 * Only the activator can <i>recreate</i> an
57 * <code>ActivationGroup</code>. The activator spawns, as needed, a
58 * separate VM (as a child process, for example) for each registered
59 * activation group and directs activation requests to the appropriate
60 * group. It is implementation specific how VMs are spawned. An
61 * activation group is created via the
62 * <code>ActivationGroup.createGroup</code> static method. The
63 * <code>createGroup</code> method has two requirements on the group
64 * to be created: 1) the group must be a concrete subclass of
65 * <code>ActivationGroup</code>, and 2) the group must have a
66 * constructor that takes two arguments:
67 *
68 * <ul>
69 * <li> the group's <code>ActivationGroupID</code>, and
70 * <li> the group's initialization data (in a
71 * <code>java.rmi.MarshalledObject</code>)</ul><p>
72 *
73 * When created, the default implementation of
74 * <code>ActivationGroup</code> will override the system properties
75 * with the properties requested when its
76 * <code>ActivationGroupDesc</code> was created, and will set a
77 * <code>java.rmi.RMISecurityManager</code> as the default system
78 * security manager. If your application requires specific properties
79 * to be set when objects are activated in the group, the application
80 * should create a special <code>Properties</code> object containing
81 * these properties, then create an <code>ActivationGroupDesc</code>
82 * with the <code>Properties</code> object, and use
83 * <code>ActivationGroup.createGroup</code> before creating any
84 * <code>ActivationDesc</code>s (before the default
85 * <code>ActivationGroupDesc</code> is created). If your application
86 * requires the use of a security manager other than
87 * <code>java.rmi.RMISecurityManager</code>, in the
88 * ActivativationGroupDescriptor properties list you can set
89 * <code>java.security.manager</code> property to the name of the security
90 * manager you would like to install.
91 *
92 * @author Ann Wollrath
93 * @see ActivationInstantiator
94 * @see ActivationGroupDesc
95 * @see ActivationGroupID
96 * @since 1.2
97 */
98public abstract class ActivationGroup
99 extends UnicastRemoteObject
100 implements ActivationInstantiator
101{
102 /**
103 * @serial the group's identifier
104 */
105 private ActivationGroupID groupID;
106
107 /**
108 * @serial the group's monitor
109 */
110 private ActivationMonitor monitor;
111
112 /**
113 * @serial the group's incarnation number
114 */
115 private long incarnation;
116
117 /** the current activation group for this VM */
118 private static ActivationGroup currGroup;
119 /** the current group's identifier */
120 private static ActivationGroupID currGroupID;
121 /** the current group's activation system */
122 private static ActivationSystem currSystem;
123 /** used to control a group being created only once */
124 private static boolean canCreate = true;
125
126 /** indicate compatibility with the Java 2 SDK v1.2 version of class */
127 private static final long serialVersionUID = -7696947875314805420L;
128
129 /**
130 * Constructs an activation group with the given activation group
131 * identifier. The group is exported as a
132 * <code>java.rmi.server.UnicastRemoteObject</code>.
133 *
134 * @param groupID the group's identifier
135 * @throws RemoteException if this group could not be exported
136 * @since 1.2
137 */
138 protected ActivationGroup(ActivationGroupID groupID)
139 throws RemoteException
140 {
141 // call super constructor to export the object
142 super();
143 this.groupID = groupID;
144 }
145
146 /**
147 * The group's <code>inactiveObject</code> method is called
148 * indirectly via a call to the <code>Activatable.inactive</code>
149 * method. A remote object implementation must call
150 * <code>Activatable</code>'s <code>inactive</code> method when
151 * that object deactivates (the object deems that it is no longer
152 * active). If the object does not call
153 * <code>Activatable.inactive</code> when it deactivates, the
154 * object will never be garbage collected since the group keeps
155 * strong references to the objects it creates. <p>
156 *
157 * <p>The group's <code>inactiveObject</code> method unexports the
158 * remote object from the RMI runtime so that the object can no
159 * longer receive incoming RMI calls. An object will only be unexported
160 * if the object has no pending or executing calls.
161 * The subclass of <code>ActivationGroup</code> must override this
162 * method and unexport the object. <p>
163 *
164 * <p>After removing the object from the RMI runtime, the group
165 * must inform its <code>ActivationMonitor</code> (via the monitor's
166 * <code>inactiveObject</code> method) that the remote object is
167 * not currently active so that the remote object will be
168 * re-activated by the activator upon a subsequent activation
169 * request.<p>
170 *
171 * <p>This method simply informs the group's monitor that the object
172 * is inactive. It is up to the concrete subclass of ActivationGroup
173 * to fulfill the additional requirement of unexporting the object. <p>
174 *
175 * @param id the object's activation identifier
176 * @return true if the object was successfully deactivated; otherwise
177 * returns false.
178 * @exception UnknownObjectException if object is unknown (may already
179 * be inactive)
180 * @exception RemoteException if call informing monitor fails
181 * @exception ActivationException if group is inactive
182 * @since 1.2
183 */
184 public boolean inactiveObject(ActivationID id)
185 throws ActivationException, UnknownObjectException, RemoteException
186 {
187 getMonitor().inactiveObject(id);
188 return true;
189 }
190
191 /**
192 * The group's <code>activeObject</code> method is called when an
193 * object is exported (either by <code>Activatable</code> object
194 * construction or an explicit call to
195 * <code>Activatable.exportObject</code>. The group must inform its
196 * <code>ActivationMonitor</code> that the object is active (via
197 * the monitor's <code>activeObject</code> method) if the group
198 * hasn't already done so.
199 *
200 * @param id the object's identifier
201 * @param obj the remote object implementation
202 * @exception UnknownObjectException if object is not registered
203 * @exception RemoteException if call informing monitor fails
204 * @exception ActivationException if group is inactive
205 * @since 1.2
206 */
207 public abstract void activeObject(ActivationID id, Remote obj)
208 throws ActivationException, UnknownObjectException, RemoteException;
209
210 /**
211 * Create and set the activation group for the current VM. The
212 * activation group can only be set if it is not currently set.
213 * An activation group is set using the <code>createGroup</code>
214 * method when the <code>Activator</code> initiates the
215 * re-creation of an activation group in order to carry out
216 * incoming <code>activate</code> requests. A group must first be
217 * registered with the <code>ActivationSystem</code> before it can
218 * be created via this method.
219 *
220 * <p>The group class specified by the
221 * <code>ActivationGroupDesc</code> must be a concrete subclass of
222 * <code>ActivationGroup</code> and have a public constructor that
223 * takes two arguments: the <code>ActivationGroupID</code> for the
224 * group and the <code>MarshalledObject</code> containing the
225 * group's initialization data (obtained from the
226 * <code>ActivationGroupDesc</code>.
227 *
228 * <p>If the group class name specified in the
229 * <code>ActivationGroupDesc</code> is <code>null</code>, then
230 * this method will behave as if the group descriptor contained
231 * the name of the default activation group implementation class.
232 *
233 * <p>Note that if your application creates its own custom
234 * activation group, a security manager must be set for that
235 * group. Otherwise objects cannot be activated in the group.
236 * <code>java.rmi.RMISecurityManager</code> is set by default.
237 *
238 * <p>If a security manager is already set in the group VM, this
239 * method first calls the security manager's
240 * <code>checkSetFactory</code> method. This could result in a
241 * <code>SecurityException</code>. If your application needs to
242 * set a different security manager, you must ensure that the
243 * policy file specified by the group's
244 * <code>ActivationGroupDesc</code> grants the group the necessary
245 * permissions to set a new security manager. (Note: This will be
246 * necessary if your group downloads and sets a security manager).
247 *
248 * <p>After the group is created, the
249 * <code>ActivationSystem</code> is informed that the group is
250 * active by calling the <code>activeGroup</code> method which
251 * returns the <code>ActivationMonitor</code> for the group. The
252 * application need not call <code>activeGroup</code>
253 * independently since it is taken care of by this method.
254 *
255 * <p>Once a group is created, subsequent calls to the
256 * <code>currentGroupID</code> method will return the identifier
257 * for this group until the group becomes inactive.
258 *
259 * @param id the activation group's identifier
260 * @param desc the activation group's descriptor
261 * @param incarnation the group's incarnation number (zero on group's
262 * initial creation)
263 * @return the activation group for the VM
264 * @exception ActivationException if group already exists or if error
265 * occurs during group creation
266 * @exception SecurityException if permission to create group is denied.
267 * (Note: The default implementation of the security manager
268 * <code>checkSetFactory</code>
269 * method requires the RuntimePermission "setFactory")
270 * @see SecurityManager#checkSetFactory
271 * @since 1.2
272 */
273 public static synchronized
274 ActivationGroup createGroup(ActivationGroupID id,
275 final ActivationGroupDesc desc,
276 long incarnation)
277 throws ActivationException
278 {
279 SecurityManager security = System.getSecurityManager();
280 if (security != null)
281 security.checkSetFactory();
282
283 if (currGroup != null)
284 throw new ActivationException("group already exists");
285
286 if (canCreate == false)
287 throw new ActivationException("group deactivated and " +
288 "cannot be recreated");
289
290 try {
291 // load group's class
292 String groupClassName = desc.getClassName();
293 Class<? extends ActivationGroup> cl;
294 Class<? extends ActivationGroup> defaultGroupClass =
295 sun.rmi.server.ActivationGroupImpl.class;
296 if (groupClassName == null || // see 4252236
297 groupClassName.equals(defaultGroupClass.getName()))
298 {
299 cl = defaultGroupClass;
300 } else {
301 Class<?> cl0;
302 try {
303 cl0 = RMIClassLoader.loadClass(desc.getLocation(),
304 groupClassName);
305 } catch (Exception ex) {
306 throw new ActivationException(
307 "Could not load group implementation class", ex);
308 }
309 if (ActivationGroup.class.isAssignableFrom(cl0)) {
310 cl = cl0.asSubclass(ActivationGroup.class);
311 } else {
312 throw new ActivationException("group not correct class: " +
313 cl0.getName());
314 }
315 }
316
317 // create group
318 Constructor<? extends ActivationGroup> constructor =
319 cl.getConstructor(ActivationGroupID.class,
320 MarshalledObject.class);
321 ActivationGroup newGroup =
322 constructor.newInstance(id, desc.getData());
323 currSystem = id.getSystem();
324 newGroup.incarnation = incarnation;
325 newGroup.monitor =
326 currSystem.activeGroup(id, newGroup, incarnation);
327 currGroup = newGroup;
328 currGroupID = id;
329 canCreate = false;
330 } catch (InvocationTargetException e) {
331 e.getTargetException().printStackTrace();
332 throw new ActivationException("exception in group constructor",
333 e.getTargetException());
334
335 } catch (ActivationException e) {
336 throw e;
337
338 } catch (Exception e) {
339 throw new ActivationException("exception creating group", e);
340 }
341
342 return currGroup;
343 }
344
345 /**
346 * Returns the current activation group's identifier. Returns null
347 * if no group is currently active for this VM.
348 * @return the activation group's identifier
349 * @since 1.2
350 */
351 public static synchronized ActivationGroupID currentGroupID() {
352 return currGroupID;
353 }
354
355 /**
356 * Returns the activation group identifier for the VM. If an
357 * activation group does not exist for this VM, a default
358 * activation group is created. A group can be created only once,
359 * so if a group has already become active and deactivated.
360 *
361 * @return the activation group identifier
362 * @exception ActivationException if error occurs during group
363 * creation, if security manager is not set, or if the group
364 * has already been created and deactivated.
365 */
366 static synchronized ActivationGroupID internalCurrentGroupID()
367 throws ActivationException
368 {
369 if (currGroupID == null)
370 throw new ActivationException("nonexistent group");
371
372 return currGroupID;
373 }
374
375 /**
376 * Set the activation system for the VM. The activation system can
377 * only be set it if no group is currently active. If the activation
378 * system is not set via this call, then the <code>getSystem</code>
379 * method attempts to obtain a reference to the
380 * <code>ActivationSystem</code> by looking up the name
381 * "java.rmi.activation.ActivationSystem" in the Activator's
382 * registry. By default, the port number used to look up the
383 * activation system is defined by
384 * <code>ActivationSystem.SYSTEM_PORT</code>. This port can be overridden
385 * by setting the property <code>java.rmi.activation.port</code>.
386 *
387 * <p>If there is a security manager, this method first
388 * calls the security manager's <code>checkSetFactory</code> method.
389 * This could result in a SecurityException.
390 *
391 * @param system remote reference to the <code>ActivationSystem</code>
392 * @exception ActivationException if activation system is already set
393 * @exception SecurityException if permission to set the activation system is denied.
394 * (Note: The default implementation of the security manager
395 * <code>checkSetFactory</code>
396 * method requires the RuntimePermission "setFactory")
397 * @see #getSystem
398 * @see SecurityManager#checkSetFactory
399 * @since 1.2
400 */
401 public static synchronized void setSystem(ActivationSystem system)
402 throws ActivationException
403 {
404 SecurityManager security = System.getSecurityManager();
405 if (security != null)
406 security.checkSetFactory();
407
408 if (currSystem != null)
409 throw new ActivationException("activation system already set");
410
411 currSystem = system;
412 }
413
414 /**
415 * Returns the activation system for the VM. The activation system
416 * may be set by the <code>setSystem</code> method. If the
417 * activation system is not set via the <code>setSystem</code>
418 * method, then the <code>getSystem</code> method attempts to
419 * obtain a reference to the <code>ActivationSystem</code> by
420 * looking up the name "java.rmi.activation.ActivationSystem" in
421 * the Activator's registry. By default, the port number used to
422 * look up the activation system is defined by
423 * <code>ActivationSystem.SYSTEM_PORT</code>. This port can be
424 * overridden by setting the property
425 * <code>java.rmi.activation.port</code>.
426 *
427 * @return the activation system for the VM/group
428 * @exception ActivationException if activation system cannot be
429 * obtained or is not bound
430 * (means that it is not running)
431 * @see #setSystem
432 * @since 1.2
433 */
434 public static synchronized ActivationSystem getSystem()
435 throws ActivationException
436 {
437 if (currSystem == null) {
438 try {
439 int port = AccessController.doPrivileged(
440 new GetIntegerAction("java.rmi.activation.port",
441 ActivationSystem.SYSTEM_PORT));
442 currSystem = (ActivationSystem)
443 Naming.lookup("//:" + port +
444 "/java.rmi.activation.ActivationSystem");
445 } catch (Exception e) {
446 throw new ActivationException(
447 "unable to obtain ActivationSystem", e);
448 }
449 }
450 return currSystem;
451 }
452
453 /**
454 * This protected method is necessary for subclasses to
455 * make the <code>activeObject</code> callback to the group's
456 * monitor. The call is simply forwarded to the group's
457 * <code>ActivationMonitor</code>.
458 *
459 * @param id the object's identifier
460 * @param mobj a marshalled object containing the remote object's stub
461 * @exception UnknownObjectException if object is not registered
462 * @exception RemoteException if call informing monitor fails
463 * @exception ActivationException if an activation error occurs
464 * @since 1.2
465 */
466 protected void activeObject(ActivationID id,
467 MarshalledObject<? extends Remote> mobj)
468 throws ActivationException, UnknownObjectException, RemoteException
469 {
470 getMonitor().activeObject(id, mobj);
471 }
472
473 /**
474 * This protected method is necessary for subclasses to
475 * make the <code>inactiveGroup</code> callback to the group's
476 * monitor. The call is simply forwarded to the group's
477 * <code>ActivationMonitor</code>. Also, the current group
478 * for the VM is set to null.
479 *
480 * @exception UnknownGroupException if group is not registered
481 * @exception RemoteException if call informing monitor fails
482 * @since 1.2
483 */
484 protected void inactiveGroup()
485 throws UnknownGroupException, RemoteException
486 {
487 try {
488 getMonitor().inactiveGroup(groupID, incarnation);
489 } finally {
490 destroyGroup();
491 }
492 }
493
494 /**
495 * Returns the monitor for the activation group.
496 */
497 private ActivationMonitor getMonitor() throws RemoteException {
498 synchronized (ActivationGroup.class) {
499 if (monitor != null) {
500 return monitor;
501 }
502 }
503 throw new RemoteException("monitor not received");
504 }
505
506 /**
507 * Destroys the current group.
508 */
509 private static synchronized void destroyGroup() {
510 currGroup = null;
511 currGroupID = null;
512 // NOTE: don't set currSystem to null since it may be needed
513 }
514
515 /**
516 * Returns the current group for the VM.
517 * @exception ActivationException if current group is null (not active)
518 */
519 static synchronized ActivationGroup currentGroup()
520 throws ActivationException
521 {
522 if (currGroup == null) {
523 throw new ActivationException("group is not active");
524 }
525 return currGroup;
526 }
527
528}
java/pkg/java/rmi/activation/ActivationGroupDesc$CommandEnvironment.class+0−0

Binary file not shown.

java/pkg/java/rmi/activation/ActivationGroupDesc.class+0−0

Binary file not shown.

java/pkg/java/rmi/activation/ActivationGroupDesc.java+370−0
@@ -0,0 +1,370 @@
1/*
2 * Copyright (c) 1997, 2008, Oracle and/or its affiliates. All rights reserved.
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4 *
5 * This code is free software; you can redistribute it and/or modify it
6 * under the terms of the GNU General Public License version 2 only, as
7 * published by the Free Software Foundation. Oracle designates this
8 * particular file as subject to the "Classpath" exception as provided
9 * by Oracle in the LICENSE file that accompanied this code.
10 *
11 * This code is distributed in the hope that it will be useful, but WITHOUT
12 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
13 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
14 * version 2 for more details (a copy is included in the LICENSE file that
15 * accompanied this code).
16 *
17 * You should have received a copy of the GNU General Public License version
18 * 2 along with this work; if not, write to the Free Software Foundation,
19 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
20 *
21 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
22 * or visit www.oracle.com if you need additional information or have any
23 * questions.
24 */
25
26package java.rmi.activation;
27
28import java.io.IOException;
29import java.io.ObjectInputStream;
30import java.io.Serializable;
31import java.rmi.MarshalledObject;
32import java.util.Arrays;
33import java.util.Properties;
34
35/**
36 * An activation group descriptor contains the information necessary to
37 * create/recreate an activation group in which to activate objects.
38 * Such a descriptor contains: <ul>
39 * <li> the group's class name,
40 * <li> the group's code location (the location of the group's class), and
41 * <li> a "marshalled" object that can contain group specific
42 * initialization data. </ul> <p>
43 *
44 * The group's class must be a concrete subclass of
45 * <code>ActivationGroup</code>. A subclass of
46 * <code>ActivationGroup</code> is created/recreated via the
47 * <code>ActivationGroup.createGroup</code> static method that invokes
48 * a special constructor that takes two arguments: <ul>
49 *
50 * <li> the group's <code>ActivationGroupID</code>, and
51 * <li> the group's initialization data (in a
52 * <code>java.rmi.MarshalledObject</code>)</ul><p>
53 *
54 * @author Ann Wollrath
55 * @since 1.2
56 * @see ActivationGroup
57 * @see ActivationGroupID
58 */
59public final class ActivationGroupDesc implements Serializable {
60
61 /**
62 * @serial The group's fully package qualified class name.
63 */
64 private String className;
65
66 /**
67 * @serial The location from where to load the group's class.
68 */
69 private String location;
70
71 /**
72 * @serial The group's initialization data.
73 */
74 private MarshalledObject<?> data;
75
76 /**
77 * @serial The controlling options for executing the VM in
78 * another process.
79 */
80 private CommandEnvironment env;
81
82 /**
83 * @serial A properties map which will override those set
84 * by default in the subprocess environment.
85 */
86 private Properties props;
87
88 /** indicate compatibility with the Java 2 SDK v1.2 version of class */
89 private static final long serialVersionUID = -4936225423168276595L;
90
91 /**
92 * Constructs a group descriptor that uses the system defaults for group
93 * implementation and code location. Properties specify Java
94 * environment overrides (which will override system properties in
95 * the group implementation's VM). The command
96 * environment can control the exact command/options used in
97 * starting the child VM, or can be <code>null</code> to accept
98 * rmid's default.
99 *
100 * <p>This constructor will create an <code>ActivationGroupDesc</code>
101 * with a <code>null</code> group class name, which indicates the system's
102 * default <code>ActivationGroup</code> implementation.
103 *
104 * @param overrides the set of properties to set when the group is
105 * recreated.
106 * @param cmd the controlling options for executing the VM in
107 * another process (or <code>null</code>).
108 * @since 1.2
109 */
110 public ActivationGroupDesc(Properties overrides,
111 CommandEnvironment cmd)
112 {
113 this(null, null, null, overrides, cmd);
114 }
115
116 /**
117 * Specifies an alternate group implementation and execution
118 * environment to be used for the group.
119 *
120 * @param className the group's package qualified class name or
121 * <code>null</code>. A <code>null</code> group class name indicates
122 * the system's default <code>ActivationGroup</code> implementation.
123 * @param location the location from where to load the group's
124 * class
125 * @param data the group's initialization data contained in
126 * marshalled form (could contain properties, for example)
127 * @param overrides a properties map which will override those set
128 * by default in the subprocess environment (will be translated
129 * into <code>-D</code> options), or <code>null</code>.
130 * @param cmd the controlling options for executing the VM in
131 * another process (or <code>null</code>).
132 * @since 1.2
133 */
134 public ActivationGroupDesc(String className,
135 String location,
136 MarshalledObject<?> data,
137 Properties overrides,
138 CommandEnvironment cmd)
139 {
140 this.props = overrides;
141 this.env = cmd;
142 this.data = data;
143 this.location = location;
144 this.className = className;
145 }
146
147 /**
148 * Returns the group's class name (possibly <code>null</code>). A
149 * <code>null</code> group class name indicates the system's default
150 * <code>ActivationGroup</code> implementation.
151 * @return the group's class name
152 * @since 1.2
153 */
154 public String getClassName() {
155 return className;
156 }
157
158 /**
159 * Returns the group's code location.
160 * @return the group's code location
161 * @since 1.2
162 */
163 public String getLocation() {
164 return location;
165 }
166
167 /**
168 * Returns the group's initialization data.
169 * @return the group's initialization data
170 * @since 1.2
171 */
172 public MarshalledObject<?> getData() {
173 return data;
174 }
175
176 /**
177 * Returns the group's property-override list.
178 * @return the property-override list, or <code>null</code>
179 * @since 1.2
180 */
181 public Properties getPropertyOverrides() {
182 return (props != null) ? (Properties) props.clone() : null;
183 }
184
185 /**
186 * Returns the group's command-environment control object.
187 * @return the command-environment object, or <code>null</code>
188 * @since 1.2
189 */
190 public CommandEnvironment getCommandEnvironment() {
191 return this.env;
192 }
193
194
195 /**
196 * Startup options for ActivationGroup implementations.
197 *
198 * This class allows overriding default system properties and
199 * specifying implementation-defined options for ActivationGroups.
200 * @since 1.2
201 */
202 public static class CommandEnvironment implements Serializable {
203 private static final long serialVersionUID = 6165754737887770191L;
204
205 /**
206 * @serial
207 */
208 private String command;
209
210 /**
211 * @serial
212 */
213 private String[] options;
214
215 /**
216 * Create a CommandEnvironment with all the necessary
217 * information.
218 *
219 * @param cmdpath the name of the java executable, including
220 * the full path, or <code>null</code>, meaning "use rmid's default".
221 * The named program <em>must</em> be able to accept multiple
222 * <code>-Dpropname=value</code> options (as documented for the
223 * "java" tool)
224 *
225 * @param argv extra options which will be used in creating the
226 * ActivationGroup. Null has the same effect as an empty
227 * list.
228 * @since 1.2
229 */
230 public CommandEnvironment(String cmdpath,
231 String[] argv)
232 {
233 this.command = cmdpath; // might be null
234
235 // Hold a safe copy of argv in this.options
236 if (argv == null) {
237 this.options = new String[0];
238 } else {
239 this.options = new String[argv.length];
240 System.arraycopy(argv, 0, this.options, 0, argv.length);
241 }
242 }
243
244 /**
245 * Fetch the configured path-qualified java command name.
246 *
247 * @return the configured name, or <code>null</code> if configured to
248 * accept the default
249 * @since 1.2
250 */
251 public String getCommandPath() {
252 return (this.command);
253 }
254
255 /**
256 * Fetch the configured java command options.
257 *
258 * @return An array of the command options which will be passed
259 * to the new child command by rmid.
260 * Note that rmid may add other options before or after these
261 * options, or both.
262 * Never returns <code>null</code>.
263 * @since 1.2
264 */
265 public String[] getCommandOptions() {
266 return options.clone();
267 }
268
269 /**
270 * Compares two command environments for content equality.
271 *
272 * @param obj the Object to compare with
273 * @return true if these Objects are equal; false otherwise.
274 * @see java.util.Hashtable
275 * @since 1.2
276 */
277 public boolean equals(Object obj) {
278
279 if (obj instanceof CommandEnvironment) {
280 CommandEnvironment env = (CommandEnvironment) obj;
281 return
282 ((command == null ? env.command == null :
283 command.equals(env.command)) &&
284 Arrays.equals(options, env.options));
285 } else {
286 return false;
287 }
288 }
289
290 /**
291 * Return identical values for similar
292 * <code>CommandEnvironment</code>s.
293 * @return an integer
294 * @see java.util.Hashtable
295 */
296 public int hashCode()
297 {
298 // hash command and ignore possibly expensive options
299 return (command == null ? 0 : command.hashCode());
300 }
301
302 /**
303 * <code>readObject</code> for custom serialization.
304 *
305 * <p>This method reads this object's serialized form for this
306 * class as follows:
307 *
308 * <p>This method first invokes <code>defaultReadObject</code> on
309 * the specified object input stream, and if <code>options</code>
310 * is <code>null</code>, then <code>options</code> is set to a
311 * zero-length array of <code>String</code>.
312 */
313 private void readObject(ObjectInputStream in)
314 throws IOException, ClassNotFoundException
315 {
316 in.defaultReadObject();
317 if (options == null) {
318 options = new String[0];
319 }
320 }
321 }
322
323 /**
324 * Compares two activation group descriptors for content equality.
325 *
326 * @param obj the Object to compare with
327 * @return true if these Objects are equal; false otherwise.
328 * @see java.util.Hashtable
329 * @since 1.2
330 */
331 public boolean equals(Object obj) {
332
333 if (obj instanceof ActivationGroupDesc) {
334 ActivationGroupDesc desc = (ActivationGroupDesc) obj;
335 return
336 ((className == null ? desc.className == null :
337 className.equals(desc.className)) &&
338 (location == null ? desc.location == null :
339 location.equals(desc.location)) &&
340 (data == null ? desc.data == null : data.equals(desc.data)) &&
341 (env == null ? desc.env == null : env.equals(desc.env)) &&
342 (props == null ? desc.props == null :
343 props.equals(desc.props)));
344 } else {
345 return false;
346 }
347 }
348
349 /**
350 * Produce identical numbers for similar <code>ActivationGroupDesc</code>s.
351 * @return an integer
352 * @see java.util.Hashtable
353 */
354 public int hashCode() {
355 // hash location, className, data, and env
356 // but omit props (may be expensive)
357 return ((location == null
358 ? 0
359 : location.hashCode() << 24) ^
360 (env == null
361 ? 0
362 : env.hashCode() << 16) ^
363 (className == null
364 ? 0
365 : className.hashCode() << 8) ^
366 (data == null
367 ? 0
368 : data.hashCode()));
369 }
370}
java/pkg/java/rmi/activation/ActivationGroupID.class+0−0

Binary file not shown.

java/pkg/java/rmi/activation/ActivationGroupID.java+115−0
@@ -0,0 +1,115 @@
1/*
2 * Copyright (c) 1997, 1999, Oracle and/or its affiliates. All rights reserved.
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4 *
5 * This code is free software; you can redistribute it and/or modify it
6 * under the terms of the GNU General Public License version 2 only, as
7 * published by the Free Software Foundation. Oracle designates this
8 * particular file as subject to the "Classpath" exception as provided
9 * by Oracle in the LICENSE file that accompanied this code.
10 *
11 * This code is distributed in the hope that it will be useful, but WITHOUT
12 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
13 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
14 * version 2 for more details (a copy is included in the LICENSE file that
15 * accompanied this code).
16 *
17 * You should have received a copy of the GNU General Public License version
18 * 2 along with this work; if not, write to the Free Software Foundation,
19 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
20 *
21 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
22 * or visit www.oracle.com if you need additional information or have any
23 * questions.
24 */
25
26package java.rmi.activation;
27
28import java.rmi.server.UID;
29
30/**
31 * The identifier for a registered activation group serves several
32 * purposes: <ul>
33 * <li>identifies the group uniquely within the activation system, and
34 * <li>contains a reference to the group's activation system so that the
35 * group can contact its activation system when necessary.</ul><p>
36 *
37 * The <code>ActivationGroupID</code> is returned from the call to
38 * <code>ActivationSystem.registerGroup</code> and is used to identify
39 * the group within the activation system. This group id is passed
40 * as one of the arguments to the activation group's special constructor
41 * when an activation group is created/recreated.
42 *
43 * @author Ann Wollrath
44 * @see ActivationGroup
45 * @see ActivationGroupDesc
46 * @since 1.2
47 */
48public class ActivationGroupID implements java.io.Serializable {
49 /**
50 * @serial The group's activation system.
51 */
52 private ActivationSystem system;
53
54 /**
55 * @serial The group's unique id.
56 */
57 private UID uid = new UID();
58
59 /** indicate compatibility with the Java 2 SDK v1.2 version of class */
60 private static final long serialVersionUID = -1648432278909740833L;
61
62 /**
63 * Constructs a unique group id.
64 *
65 * @param system the group's activation system
66 * @since 1.2
67 */
68 public ActivationGroupID(ActivationSystem system) {
69 this.system = system;
70 }
71
72 /**
73 * Returns the group's activation system.
74 * @return the group's activation system
75 * @since 1.2
76 */
77 public ActivationSystem getSystem() {
78 return system;
79 }
80
81 /**
82 * Returns a hashcode for the group's identifier. Two group
83 * identifiers that refer to the same remote group will have the
84 * same hash code.
85 *
86 * @see java.util.Hashtable
87 * @since 1.2
88 */
89 public int hashCode() {
90 return uid.hashCode();
91 }
92
93 /**
94 * Compares two group identifiers for content equality.
95 * Returns true if both of the following conditions are true:
96 * 1) the unique identifiers are equivalent (by content), and
97 * 2) the activation system specified in each
98 * refers to the same remote object.
99 *
100 * @param obj the Object to compare with
101 * @return true if these Objects are equal; false otherwise.
102 * @see java.util.Hashtable
103 * @since 1.2
104 */
105 public boolean equals(Object obj) {
106 if (this == obj) {
107 return true;
108 } else if (obj instanceof ActivationGroupID) {
109 ActivationGroupID id = (ActivationGroupID)obj;
110 return (uid.equals(id.uid) && system.equals(id.system));
111 } else {
112 return false;
113 }
114 }
115}
java/pkg/java/rmi/activation/ActivationID.class+0−0

Binary file not shown.

java/pkg/java/rmi/activation/ActivationID.java+290−0
@@ -0,0 +1,290 @@
1/*
2 * Copyright (c) 1997, 2005, Oracle and/or its affiliates. All rights reserved.
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4 *
5 * This code is free software; you can redistribute it and/or modify it
6 * under the terms of the GNU General Public License version 2 only, as
7 * published by the Free Software Foundation. Oracle designates this
8 * particular file as subject to the "Classpath" exception as provided
9 * by Oracle in the LICENSE file that accompanied this code.
10 *
11 * This code is distributed in the hope that it will be useful, but WITHOUT
12 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
13 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
14 * version 2 for more details (a copy is included in the LICENSE file that
15 * accompanied this code).
16 *
17 * You should have received a copy of the GNU General Public License version
18 * 2 along with this work; if not, write to the Free Software Foundation,
19 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
20 *
21 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
22 * or visit www.oracle.com if you need additional information or have any
23 * questions.
24 */
25
26package java.rmi.activation;
27
28import java.io.IOException;
29import java.io.InvalidObjectException;
30import java.io.ObjectInputStream;
31import java.io.ObjectOutputStream;
32import java.io.Serializable;
33import java.lang.reflect.InvocationHandler;
34import java.lang.reflect.Proxy;
35import java.rmi.MarshalledObject;
36import java.rmi.Remote;
37import java.rmi.RemoteException;
38import java.rmi.UnmarshalException;
39import java.rmi.server.RemoteObject;
40import java.rmi.server.RemoteObjectInvocationHandler;
41import java.rmi.server.RemoteRef;
42import java.rmi.server.UID;
43
44/**
45 * Activation makes use of special identifiers to denote remote
46 * objects that can be activated over time. An activation identifier
47 * (an instance of the class <code>ActivationID</code>) contains several
48 * pieces of information needed for activating an object:
49 * <ul>
50 * <li> a remote reference to the object's activator (a {@link
51 * java.rmi.server.RemoteRef RemoteRef}
52 * instance), and
53 * <li> a unique identifier (a {@link java.rmi.server.UID UID}
54 * instance) for the object. </ul> <p>
55 *
56 * An activation identifier for an object can be obtained by registering
57 * an object with the activation system. Registration is accomplished
58 * in a few ways: <ul>
59 * <li>via the <code>Activatable.register</code> method
60 * <li>via the first <code>Activatable</code> constructor (that takes
61 * three arguments and both registers and exports the object, and
62 * <li>via the first <code>Activatable.exportObject</code> method
63 * that takes the activation descriptor, object and port as arguments;
64 * this method both registers and exports the object. </ul>
65 *
66 * @author Ann Wollrath
67 * @see Activatable
68 * @since 1.2
69 */
70public class ActivationID implements Serializable {
71 /**
72 * the object's activator
73 */
74 private transient Activator activator;
75
76 /**
77 * the object's unique id
78 */
79 private transient UID uid = new UID();
80
81 /** indicate compatibility with the Java 2 SDK v1.2 version of class */
82 private static final long serialVersionUID = -4608673054848209235L;
83
84 /**
85 * The constructor for <code>ActivationID</code> takes a single
86 * argument, activator, that specifies a remote reference to the
87 * activator responsible for activating the object associated with
88 * this identifier. An instance of <code>ActivationID</code> is globally
89 * unique.
90 *
91 * @param activator reference to the activator responsible for
92 * activating the object
93 * @since 1.2
94 */
95 public ActivationID(Activator activator) {
96 this.activator = activator;
97 }
98
99 /**
100 * Activate the object for this id.
101 *
102 * @param force if true, forces the activator to contact the group
103 * when activating the object (instead of returning a cached reference);
104 * if false, returning a cached value is acceptable.
105 * @return the reference to the active remote object
106 * @exception ActivationException if activation fails
107 * @exception UnknownObjectException if the object is unknown
108 * @exception RemoteException if remote call fails
109 * @since 1.2
110 */
111 public Remote activate(boolean force)
112 throws ActivationException, UnknownObjectException, RemoteException
113 {
114 try {
115 MarshalledObject<? extends Remote> mobj =
116 activator.activate(this, force);
117 return mobj.get();
118 } catch (RemoteException e) {
119 throw e;
120 } catch (IOException e) {
121 throw new UnmarshalException("activation failed", e);
122 } catch (ClassNotFoundException e) {
123 throw new UnmarshalException("activation failed", e);
124 }
125
126 }
127
128 /**
129 * Returns a hashcode for the activation id. Two identifiers that
130 * refer to the same remote object will have the same hash code.
131 *
132 * @see java.util.Hashtable
133 * @since 1.2
134 */
135 public int hashCode() {
136 return uid.hashCode();
137 }
138
139 /**
140 * Compares two activation ids for content equality.
141 * Returns true if both of the following conditions are true:
142 * 1) the unique identifiers equivalent (by content), and
143 * 2) the activator specified in each identifier
144 * refers to the same remote object.
145 *
146 * @param obj the Object to compare with
147 * @return true if these Objects are equal; false otherwise.
148 * @see java.util.Hashtable
149 * @since 1.2
150 */
151 public boolean equals(Object obj) {
152 if (obj instanceof ActivationID) {
153 ActivationID id = (ActivationID) obj;
154 return (uid.equals(id.uid) && activator.equals(id.activator));
155 } else {
156 return false;
157 }
158 }
159
160 /**
161 * <code>writeObject</code> for custom serialization.
162 *
163 * <p>This method writes this object's serialized form for
164 * this class as follows:
165 *
166 * <p>The <code>writeObject</code> method is invoked on
167 * <code>out</code> passing this object's unique identifier
168 * (a {@link java.rmi.server.UID UID} instance) as the argument.
169 *
170 * <p>Next, the {@link
171 * java.rmi.server.RemoteRef#getRefClass(java.io.ObjectOutput)
172 * getRefClass} method is invoked on the activator's
173 * <code>RemoteRef</code> instance to obtain its external ref
174 * type name. Next, the <code>writeUTF</code> method is
175 * invoked on <code>out</code> with the value returned by
176 * <code>getRefClass</code>, and then the
177 * <code>writeExternal</code> method is invoked on the
178 * <code>RemoteRef</code> instance passing <code>out</code>
179 * as the argument.
180 *
181 * @serialData The serialized data for this class comprises a
182 * <code>java.rmi.server.UID</code> (written with
183 * <code>ObjectOutput.writeObject</code>) followed by the
184 * external ref type name of the activator's
185 * <code>RemoteRef</code> instance (a string written with
186 * <code>ObjectOutput.writeUTF</code>), followed by the
187 * external form of the <code>RemoteRef</code> instance as
188 * written by its <code>writeExternal</code> method.
189 *
190 * <p>The external ref type name of the
191 * <code>RemoteRef</Code> instance is
192 * determined using the definitions of external ref type
193 * names specified in the {@link java.rmi.server.RemoteObject
194 * RemoteObject} <code>writeObject</code> method
195 * <b>serialData</b> specification. Similarly, the data
196 * written by the <code>writeExternal</code> method and read
197 * by the <code>readExternal</code> method of
198 * <code>RemoteRef</code> implementation classes
199 * corresponding to each of the defined external ref type
200 * names is specified in the {@link
201 * java.rmi.server.RemoteObject RemoteObject}
202 * <code>writeObject</code> method <b>serialData</b>
203 * specification.
204 **/
205 private void writeObject(ObjectOutputStream out)
206 throws IOException, ClassNotFoundException
207 {
208 out.writeObject(uid);
209
210 RemoteRef ref;
211 if (activator instanceof RemoteObject) {
212 ref = ((RemoteObject) activator).getRef();
213 } else if (Proxy.isProxyClass(activator.getClass())) {
214 InvocationHandler handler = Proxy.getInvocationHandler(activator);
215 if (!(handler instanceof RemoteObjectInvocationHandler)) {
216 throw new InvalidObjectException(
217 "unexpected invocation handler");
218 }
219 ref = ((RemoteObjectInvocationHandler) handler).getRef();
220
221 } else {
222 throw new InvalidObjectException("unexpected activator type");
223 }
224 out.writeUTF(ref.getRefClass(out));
225 ref.writeExternal(out);
226 }
227
228 /**
229 * <code>readObject</code> for custom serialization.
230 *
231 * <p>This method reads this object's serialized form for this
232 * class as follows:
233 *
234 * <p>The <code>readObject</code> method is invoked on
235 * <code>in</code> to read this object's unique identifier
236 * (a {@link java.rmi.server.UID UID} instance).
237 *
238 * <p>Next, the <code>readUTF</code> method is invoked on
239 * <code>in</code> to read the external ref type name of the
240 * <code>RemoteRef</code> instance for this object's
241 * activator. Next, the <code>RemoteRef</code>
242 * instance is created of an implementation-specific class
243 * corresponding to the external ref type name (returned by
244 * <code>readUTF</code>), and the <code>readExternal</code>
245 * method is invoked on that <code>RemoteRef</code> instance
246 * to read the external form corresponding to the external
247 * ref type name.
248 *
249 * <p>Note: If the external ref type name is
250 * <code>"UnicastRef"</code>, <code>"UnicastServerRef"</code>,
251 * <code>"UnicastRef2"</code>, <code>"UnicastServerRef2"</code>,
252 * or <code>"ActivatableRef"</code>, a corresponding
253 * implementation-specific class must be found, and its
254 * <code>readExternal</code> method must read the serial data
255 * for that external ref type name as specified to be written
256 * in the <b>serialData</b> documentation for this class.
257 * If the external ref type name is any other string (of non-zero
258 * length), a <code>ClassNotFoundException</code> will be thrown,
259 * unless the implementation provides an implementation-specific
260 * class corresponding to that external ref type name, in which
261 * case the <code>RemoteRef</code> will be an instance of
262 * that implementation-specific class.
263 */
264 private void readObject(ObjectInputStream in)
265 throws IOException, ClassNotFoundException
266 {
267 uid = (UID)in.readObject();
268
269 try {
270 Class<? extends RemoteRef> refClass =
271 Class.forName(RemoteRef.packagePrefix + "." + in.readUTF())
272 .asSubclass(RemoteRef.class);
273 RemoteRef ref = refClass.newInstance();
274 ref.readExternal(in);
275 activator = (Activator)
276 Proxy.newProxyInstance(null,
277 new Class<?>[] { Activator.class },
278 new RemoteObjectInvocationHandler(ref));
279
280 } catch (InstantiationException e) {
281 throw (IOException)
282 new InvalidObjectException(
283 "Unable to create remote reference").initCause(e);
284 } catch (IllegalAccessException e) {
285 throw (IOException)
286 new InvalidObjectException(
287 "Unable to create remote reference").initCause(e);
288 }
289 }
290}
java/pkg/java/rmi/activation/ActivationInstantiator.class+0−0

Binary file not shown.

java/pkg/java/rmi/activation/ActivationInstantiator.java+76−0
@@ -0,0 +1,76 @@
1/*
2 * Copyright (c) 1997, 2005, Oracle and/or its affiliates. All rights reserved.
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4 *
5 * This code is free software; you can redistribute it and/or modify it
6 * under the terms of the GNU General Public License version 2 only, as
7 * published by the Free Software Foundation. Oracle designates this
8 * particular file as subject to the "Classpath" exception as provided
9 * by Oracle in the LICENSE file that accompanied this code.
10 *
11 * This code is distributed in the hope that it will be useful, but WITHOUT
12 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
13 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
14 * version 2 for more details (a copy is included in the LICENSE file that
15 * accompanied this code).
16 *
17 * You should have received a copy of the GNU General Public License version
18 * 2 along with this work; if not, write to the Free Software Foundation,
19 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
20 *
21 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
22 * or visit www.oracle.com if you need additional information or have any
23 * questions.
24 */
25
26package java.rmi.activation;
27
28import java.rmi.MarshalledObject;
29import java.rmi.Remote;
30import java.rmi.RemoteException;
31
32/**
33 * An <code>ActivationInstantiator</code> is responsible for creating
34 * instances of "activatable" objects. A concrete subclass of
35 * <code>ActivationGroup</code> implements the <code>newInstance</code>
36 * method to handle creating objects within the group.
37 *
38 * @author Ann Wollrath
39 * @see ActivationGroup
40 * @since 1.2
41 */
42public interface ActivationInstantiator extends Remote {
43
44 /**
45 * The activator calls an instantiator's <code>newInstance</code>
46 * method in order to recreate in that group an object with the
47 * activation identifier, <code>id</code>, and descriptor,
48 * <code>desc</code>. The instantiator is responsible for: <ul>
49 *
50 * <li> determining the class for the object using the descriptor's
51 * <code>getClassName</code> method,
52 *
53 * <li> loading the class from the code location obtained from the
54 * descriptor (using the <code>getLocation</code> method),
55 *
56 * <li> creating an instance of the class by invoking the special
57 * "activation" constructor of the object's class that takes two
58 * arguments: the object's <code>ActivationID</code>, and the
59 * <code>MarshalledObject</code> containing object specific
60 * initialization data, and
61 *
62 * <li> returning a MarshalledObject containing the stub for the
63 * remote object it created </ul>
64 *
65 * @param id the object's activation identifier
66 * @param desc the object's descriptor
67 * @return a marshalled object containing the serialized
68 * representation of remote object's stub
69 * @exception ActivationException if object activation fails
70 * @exception RemoteException if remote call fails
71 * @since 1.2
72 */
73 public MarshalledObject<? extends Remote> newInstance(ActivationID id,
74 ActivationDesc desc)
75 throws ActivationException, RemoteException;
76}
java/pkg/java/rmi/activation/ActivationMonitor.class+0−0

Binary file not shown.

java/pkg/java/rmi/activation/ActivationMonitor.java+108−0
@@ -0,0 +1,108 @@
1/*
2 * Copyright (c) 1997, 2005, Oracle and/or its affiliates. All rights reserved.
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4 *
5 * This code is free software; you can redistribute it and/or modify it
6 * under the terms of the GNU General Public License version 2 only, as
7 * published by the Free Software Foundation. Oracle designates this
8 * particular file as subject to the "Classpath" exception as provided
9 * by Oracle in the LICENSE file that accompanied this code.
10 *
11 * This code is distributed in the hope that it will be useful, but WITHOUT
12 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
13 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
14 * version 2 for more details (a copy is included in the LICENSE file that
15 * accompanied this code).
16 *
17 * You should have received a copy of the GNU General Public License version
18 * 2 along with this work; if not, write to the Free Software Foundation,
19 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
20 *
21 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
22 * or visit www.oracle.com if you need additional information or have any
23 * questions.
24 */
25
26package java.rmi.activation;
27
28import java.rmi.MarshalledObject;
29import java.rmi.Remote;
30import java.rmi.RemoteException;
31import java.rmi.activation.UnknownGroupException;
32import java.rmi.activation.UnknownObjectException;
33
34/**
35 * An <code>ActivationMonitor</code> is specific to an
36 * <code>ActivationGroup</code> and is obtained when a group is
37 * reported active via a call to
38 * <code>ActivationSystem.activeGroup</code> (this is done
39 * internally). An activation group is responsible for informing its
40 * <code>ActivationMonitor</code> when either: its objects become active or
41 * inactive, or the group as a whole becomes inactive.
42 *
43 * @author Ann Wollrath
44 * @see Activator
45 * @see ActivationSystem
46 * @see ActivationGroup
47 * @since 1.2
48 */
49public interface ActivationMonitor extends Remote {
50
51 /**
52 * An activation group calls its monitor's
53 * <code>inactiveObject</code> method when an object in its group
54 * becomes inactive (deactivates). An activation group discovers
55 * that an object (that it participated in activating) in its VM
56 * is no longer active, via calls to the activation group's
57 * <code>inactiveObject</code> method. <p>
58 *
59 * The <code>inactiveObject</code> call informs the
60 * <code>ActivationMonitor</code> that the remote object reference
61 * it holds for the object with the activation identifier,
62 * <code>id</code>, is no longer valid. The monitor considers the
63 * reference associated with <code>id</code> as a stale reference.
64 * Since the reference is considered stale, a subsequent
65 * <code>activate</code> call for the same activation identifier
66 * results in re-activating the remote object.<p>
67 *
68 * @param id the object's activation identifier
69 * @exception UnknownObjectException if object is unknown
70 * @exception RemoteException if remote call fails
71 * @since 1.2
72 */
73 public void inactiveObject(ActivationID id)
74 throws UnknownObjectException, RemoteException;
75
76 /**
77 * Informs that an object is now active. An <code>ActivationGroup</code>
78 * informs its monitor if an object in its group becomes active by
79 * other means than being activated directly (i.e., the object
80 * is registered and "activated" itself).
81 *
82 * @param id the active object's id
83 * @param obj the marshalled form of the object's stub
84 * @exception UnknownObjectException if object is unknown
85 * @exception RemoteException if remote call fails
86 * @since 1.2
87 */
88 public void activeObject(ActivationID id,
89 MarshalledObject<? extends Remote> obj)
90 throws UnknownObjectException, RemoteException;
91
92 /**
93 * Informs that the group is now inactive. The group will be
94 * recreated upon a subsequent request to activate an object
95 * within the group. A group becomes inactive when all objects
96 * in the group report that they are inactive.
97 *
98 * @param id the group's id
99 * @param incarnation the group's incarnation number
100 * @exception UnknownGroupException if group is unknown
101 * @exception RemoteException if remote call fails
102 * @since 1.2
103 */
104 public void inactiveGroup(ActivationGroupID id,
105 long incarnation)
106 throws UnknownGroupException, RemoteException;
107
108}
java/pkg/java/rmi/activation/ActivationSystem.class+0−0

Binary file not shown.

java/pkg/java/rmi/activation/ActivationSystem.java+229−0
@@ -0,0 +1,229 @@
1/*
2 * Copyright (c) 1997, 2003, Oracle and/or its affiliates. All rights reserved.
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4 *
5 * This code is free software; you can redistribute it and/or modify it
6 * under the terms of the GNU General Public License version 2 only, as
7 * published by the Free Software Foundation. Oracle designates this
8 * particular file as subject to the "Classpath" exception as provided
9 * by Oracle in the LICENSE file that accompanied this code.
10 *
11 * This code is distributed in the hope that it will be useful, but WITHOUT
12 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
13 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
14 * version 2 for more details (a copy is included in the LICENSE file that
15 * accompanied this code).
16 *
17 * You should have received a copy of the GNU General Public License version
18 * 2 along with this work; if not, write to the Free Software Foundation,
19 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
20 *
21 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
22 * or visit www.oracle.com if you need additional information or have any
23 * questions.
24 */
25
26package java.rmi.activation;
27
28import java.rmi.Remote;
29import java.rmi.RemoteException;
30import java.rmi.activation.UnknownGroupException;
31import java.rmi.activation.UnknownObjectException;
32
33/**
34 * The <code>ActivationSystem</code> provides a means for registering
35 * groups and "activatable" objects to be activated within those groups.
36 * The <code>ActivationSystem</code> works closely with the
37 * <code>Activator</code>, which activates objects registered via the
38 * <code>ActivationSystem</code>, and the <code>ActivationMonitor</code>,
39 * which obtains information about active and inactive objects,
40 * and inactive groups.
41 *
42 * @author Ann Wollrath
43 * @see Activator
44 * @see ActivationMonitor
45 * @since 1.2
46 */
47public interface ActivationSystem extends Remote {
48
49 /** The port to lookup the activation system. */
50 public static final int SYSTEM_PORT = 1098;
51
52 /**
53 * The <code>registerObject</code> method is used to register an
54 * activation descriptor, <code>desc</code>, and obtain an
55 * activation identifier for a activatable remote object. The
56 * <code>ActivationSystem</code> creates an
57 * <code>ActivationID</code> (a activation identifier) for the
58 * object specified by the descriptor, <code>desc</code>, and
59 * records, in stable storage, the activation descriptor and its
60 * associated identifier for later use. When the <code>Activator</code>
61 * receives an <code>activate</code> request for a specific identifier, it
62 * looks up the activation descriptor (registered previously) for
63 * the specified identifier and uses that information to activate
64 * the object. <p>
65 *
66 * @param desc the object's activation descriptor
67 * @return the activation id that can be used to activate the object
68 * @exception ActivationException if registration fails (e.g., database
69 * update failure, etc).
70 * @exception UnknownGroupException if group referred to in
71 * <code>desc</code> is not registered with this system
72 * @exception RemoteException if remote call fails
73 * @since 1.2
74 */
75 public ActivationID registerObject(ActivationDesc desc)
76 throws ActivationException, UnknownGroupException, RemoteException;
77
78 /**
79 * Remove the activation id and associated descriptor previously
80 * registered with the <code>ActivationSystem</code>; the object
81 * can no longer be activated via the object's activation id.
82 *
83 * @param id the object's activation id (from previous registration)
84 * @exception ActivationException if unregister fails (e.g., database
85 * update failure, etc).
86 * @exception UnknownObjectException if object is unknown (not registered)
87 * @exception RemoteException if remote call fails
88 * @since 1.2
89 */
90 public void unregisterObject(ActivationID id)
91 throws ActivationException, UnknownObjectException, RemoteException;
92
93 /**
94 * Register the activation group. An activation group must be
95 * registered with the <code>ActivationSystem</code> before objects
96 * can be registered within that group.
97 *
98 * @param desc the group's descriptor
99 * @return an identifier for the group
100 * @exception ActivationException if group registration fails
101 * @exception RemoteException if remote call fails
102 * @since 1.2
103 */
104 public ActivationGroupID registerGroup(ActivationGroupDesc desc)
105 throws ActivationException, RemoteException;
106
107 /**
108 * Callback to inform activation system that group is now
109 * active. This call is made internally by the
110 * <code>ActivationGroup.createGroup</code> method to inform
111 * the <code>ActivationSystem</code> that the group is now
112 * active.
113 *
114 * @param id the activation group's identifier
115 * @param group the group's instantiator
116 * @param incarnation the group's incarnation number
117 * @return monitor for activation group
118 * @exception UnknownGroupException if group is not registered
119 * @exception ActivationException if a group for the specified
120 * <code>id</code> is already active and that group is not equal
121 * to the specified <code>group</code> or that group has a different
122 * <code>incarnation</code> than the specified <code>group</code>
123 * @exception RemoteException if remote call fails
124 * @since 1.2
125 */
126 public ActivationMonitor activeGroup(ActivationGroupID id,
127 ActivationInstantiator group,
128 long incarnation)
129 throws UnknownGroupException, ActivationException, RemoteException;
130
131 /**
132 * Remove the activation group. An activation group makes this call back
133 * to inform the activator that the group should be removed (destroyed).
134 * If this call completes successfully, objects can no longer be
135 * registered or activated within the group. All information of the
136 * group and its associated objects is removed from the system.
137 *
138 * @param id the activation group's identifier
139 * @exception ActivationException if unregister fails (e.g., database
140 * update failure, etc).
141 * @exception UnknownGroupException if group is not registered
142 * @exception RemoteException if remote call fails
143 * @since 1.2
144 */
145 public void unregisterGroup(ActivationGroupID id)
146 throws ActivationException, UnknownGroupException, RemoteException;
147
148 /**
149 * Shutdown the activation system. Destroys all groups spawned by
150 * the activation daemon and exits the activation daemon.
151 * @exception RemoteException if failed to contact/shutdown the activation
152 * daemon
153 * @since 1.2
154 */
155 public void shutdown() throws RemoteException;
156
157 /**
158 * Set the activation descriptor, <code>desc</code> for the object with
159 * the activation identifier, <code>id</code>. The change will take
160 * effect upon subsequent activation of the object.
161 *
162 * @param id the activation identifier for the activatable object
163 * @param desc the activation descriptor for the activatable object
164 * @exception UnknownGroupException the group associated with
165 * <code>desc</code> is not a registered group
166 * @exception UnknownObjectException the activation <code>id</code>
167 * is not registered
168 * @exception ActivationException for general failure (e.g., unable
169 * to update log)
170 * @exception RemoteException if remote call fails
171 * @return the previous value of the activation descriptor
172 * @see #getActivationDesc
173 * @since 1.2
174 */
175 public ActivationDesc setActivationDesc(ActivationID id,
176 ActivationDesc desc)
177 throws ActivationException, UnknownObjectException,
178 UnknownGroupException, RemoteException;
179
180 /**
181 * Set the activation group descriptor, <code>desc</code> for the object
182 * with the activation group identifier, <code>id</code>. The change will
183 * take effect upon subsequent activation of the group.
184 *
185 * @param id the activation group identifier for the activation group
186 * @param desc the activation group descriptor for the activation group
187 * @exception UnknownGroupException the group associated with
188 * <code>id</code> is not a registered group
189 * @exception ActivationException for general failure (e.g., unable
190 * to update log)
191 * @exception RemoteException if remote call fails
192 * @return the previous value of the activation group descriptor
193 * @see #getActivationGroupDesc
194 * @since 1.2
195 */
196 public ActivationGroupDesc setActivationGroupDesc(ActivationGroupID id,
197 ActivationGroupDesc desc)
198 throws ActivationException, UnknownGroupException, RemoteException;
199
200 /**
201 * Returns the activation descriptor, for the object with the activation
202 * identifier, <code>id</code>.
203 *
204 * @param id the activation identifier for the activatable object
205 * @exception UnknownObjectException if <code>id</code> is not registered
206 * @exception ActivationException for general failure
207 * @exception RemoteException if remote call fails
208 * @return the activation descriptor
209 * @see #setActivationDesc
210 * @since 1.2
211 */
212 public ActivationDesc getActivationDesc(ActivationID id)
213 throws ActivationException, UnknownObjectException, RemoteException;
214
215 /**
216 * Returns the activation group descriptor, for the group
217 * with the activation group identifier, <code>id</code>.
218 *
219 * @param id the activation group identifier for the group
220 * @exception UnknownGroupException if <code>id</code> is not registered
221 * @exception ActivationException for general failure
222 * @exception RemoteException if remote call fails
223 * @return the activation group descriptor
224 * @see #setActivationGroupDesc
225 * @since 1.2
226 */
227 public ActivationGroupDesc getActivationGroupDesc(ActivationGroupID id)
228 throws ActivationException, UnknownGroupException, RemoteException;
229}
java/pkg/java/rmi/activation/Activator.class+0−0

Binary file not shown.

java/pkg/java/rmi/activation/Activator.java+114−0
@@ -0,0 +1,114 @@
1/*
2 * Copyright (c) 1997, 2005, Oracle and/or its affiliates. All rights reserved.
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4 *
5 * This code is free software; you can redistribute it and/or modify it
6 * under the terms of the GNU General Public License version 2 only, as
7 * published by the Free Software Foundation. Oracle designates this
8 * particular file as subject to the "Classpath" exception as provided
9 * by Oracle in the LICENSE file that accompanied this code.
10 *
11 * This code is distributed in the hope that it will be useful, but WITHOUT
12 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
13 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
14 * version 2 for more details (a copy is included in the LICENSE file that
15 * accompanied this code).
16 *
17 * You should have received a copy of the GNU General Public License version
18 * 2 along with this work; if not, write to the Free Software Foundation,
19 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
20 *
21 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
22 * or visit www.oracle.com if you need additional information or have any
23 * questions.
24 */
25
26package java.rmi.activation;
27
28import java.rmi.MarshalledObject;
29import java.rmi.Remote;
30import java.rmi.RemoteException;
31import java.rmi.activation.UnknownObjectException;
32
33/**
34 * The <code>Activator</code> facilitates remote object activation. A
35 * "faulting" remote reference calls the activator's
36 * <code>activate</code> method to obtain a "live" reference to a
37 * "activatable" remote object. Upon receiving a request for activation,
38 * the activator looks up the activation descriptor for the activation
39 * identifier, <code>id</code>, determines the group in which the
40 * object should be activated initiates object re-creation via the
41 * group's <code>ActivationInstantiator</code> (via a call to the
42 * <code>newInstance</code> method). The activator initiates the
43 * execution of activation groups as necessary. For example, if an
44 * activation group for a specific group identifier is not already
45 * executing, the activator initiates the execution of a VM for the
46 * group. <p>
47 *
48 * The <code>Activator</code> works closely with
49 * <code>ActivationSystem</code>, which provides a means for registering
50 * groups and objects within those groups, and <code>ActivationMonitor</code>,
51 * which recives information about active and inactive objects and inactive
52 * groups. <p>
53 *
54 * The activator is responsible for monitoring and detecting when
55 * activation groups fail so that it can remove stale remote references
56 * to groups and active object's within those groups.<p>
57 *
58 * @author Ann Wollrath
59 * @see ActivationInstantiator
60 * @see ActivationGroupDesc
61 * @see ActivationGroupID
62 * @since 1.2
63 */
64public interface Activator extends Remote {
65 /**
66 * Activate the object associated with the activation identifier,
67 * <code>id</code>. If the activator knows the object to be active
68 * already, and <code>force</code> is false , the stub with a
69 * "live" reference is returned immediately to the caller;
70 * otherwise, if the activator does not know that corresponding
71 * the remote object is active, the activator uses the activation
72 * descriptor information (previously registered) to determine the
73 * group (VM) in which the object should be activated. If an
74 * <code>ActivationInstantiator</code> corresponding to the
75 * object's group descriptor already exists, the activator invokes
76 * the activation group's <code>newInstance</code> method passing
77 * it the object's id and descriptor. <p>
78 *
79 * If the activation group for the object's group descriptor does
80 * not yet exist, the activator starts an
81 * <code>ActivationInstantiator</code> executing (by spawning a
82 * child process, for example). When the activator receives the
83 * activation group's call back (via the
84 * <code>ActivationSystem</code>'s <code>activeGroup</code>
85 * method) specifying the activation group's reference, the
86 * activator can then invoke that activation instantiator's
87 * <code>newInstance</code> method to forward each pending
88 * activation request to the activation group and return the
89 * result (a marshalled remote object reference, a stub) to the
90 * caller.<p>
91 *
92 * Note that the activator receives a "marshalled" object instead of a
93 * Remote object so that the activator does not need to load the
94 * code for that object, or participate in distributed garbage
95 * collection for that object. If the activator kept a strong
96 * reference to the remote object, the activator would then
97 * prevent the object from being garbage collected under the
98 * normal distributed garbage collection mechanism. <p>
99 *
100 * @param id the activation identifier for the object being activated
101 * @param force if true, the activator contacts the group to obtain
102 * the remote object's reference; if false, returning the cached value
103 * is allowed.
104 * @return the remote object (a stub) in a marshalled form
105 * @exception ActivationException if object activation fails
106 * @exception UnknownObjectException if object is unknown (not registered)
107 * @exception RemoteException if remote call fails
108 * @since 1.2
109 */
110 public MarshalledObject<? extends Remote> activate(ActivationID id,
111 boolean force)
112 throws ActivationException, UnknownObjectException, RemoteException;
113
114}
java/pkg/java/rmi/activation/UnknownGroupException.class+0−0

Binary file not shown.

java/pkg/java/rmi/activation/UnknownGroupException.java+60−0
@@ -0,0 +1,60 @@
1/*
2 * Copyright (c) 1997, 1999, Oracle and/or its affiliates. All rights reserved.
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4 *
5 * This code is free software; you can redistribute it and/or modify it
6 * under the terms of the GNU General Public License version 2 only, as
7 * published by the Free Software Foundation. Oracle designates this
8 * particular file as subject to the "Classpath" exception as provided
9 * by Oracle in the LICENSE file that accompanied this code.
10 *
11 * This code is distributed in the hope that it will be useful, but WITHOUT
12 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
13 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
14 * version 2 for more details (a copy is included in the LICENSE file that
15 * accompanied this code).
16 *
17 * You should have received a copy of the GNU General Public License version
18 * 2 along with this work; if not, write to the Free Software Foundation,
19 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
20 *
21 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
22 * or visit www.oracle.com if you need additional information or have any
23 * questions.
24 */
25
26package java.rmi.activation;
27
28/**
29 * An <code>UnknownGroupException</code> is thrown by methods of classes and
30 * interfaces in the <code>java.rmi.activation</code> package when the
31 * <code>ActivationGroupID</code> parameter to the method is determined to be
32 * invalid, i.e., not known by the <code>ActivationSystem</code>. An
33 * <code>UnknownGroupException</code> is also thrown if the
34 * <code>ActivationGroupID</code> in an <code>ActivationDesc</code> refers to
35 * a group that is not registered with the <code>ActivationSystem</code>
36 *
37 * @author Ann Wollrath
38 * @since 1.2
39 * @see java.rmi.activation.Activatable
40 * @see java.rmi.activation.ActivationGroup
41 * @see java.rmi.activation.ActivationGroupID
42 * @see java.rmi.activation.ActivationMonitor
43 * @see java.rmi.activation.ActivationSystem
44 */
45public class UnknownGroupException extends ActivationException {
46
47 /** indicate compatibility with the Java 2 SDK v1.2 version of class */
48 private static final long serialVersionUID = 7056094974750002460L;
49
50 /**
51 * Constructs an <code>UnknownGroupException</code> with the specified
52 * detail message.
53 *
54 * @param s the detail message
55 * @since 1.2
56 */
57 public UnknownGroupException(String s) {
58 super(s);
59 }
60}
java/pkg/java/rmi/activation/UnknownObjectException.class+0−0

Binary file not shown.

java/pkg/java/rmi/activation/UnknownObjectException.java+62−0
@@ -0,0 +1,62 @@
1/*
2 * Copyright (c) 1997, 1999, Oracle and/or its affiliates. All rights reserved.
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4 *
5 * This code is free software; you can redistribute it and/or modify it
6 * under the terms of the GNU General Public License version 2 only, as
7 * published by the Free Software Foundation. Oracle designates this
8 * particular file as subject to the "Classpath" exception as provided
9 * by Oracle in the LICENSE file that accompanied this code.
10 *
11 * This code is distributed in the hope that it will be useful, but WITHOUT
12 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
13 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
14 * version 2 for more details (a copy is included in the LICENSE file that
15 * accompanied this code).
16 *
17 * You should have received a copy of the GNU General Public License version
18 * 2 along with this work; if not, write to the Free Software Foundation,
19 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
20 *
21 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
22 * or visit www.oracle.com if you need additional information or have any
23 * questions.
24 */
25
26package java.rmi.activation;
27
28/**
29 * An <code>UnknownObjectException</code> is thrown by methods of classes and
30 * interfaces in the <code>java.rmi.activation</code> package when the
31 * <code>ActivationID</code> parameter to the method is determined to be
32 * invalid. An <code>ActivationID</code> is invalid if it is not currently
33 * known by the <code>ActivationSystem</code>. An <code>ActivationID</code>
34 * is obtained by the <code>ActivationSystem.registerObject</code> method.
35 * An <code>ActivationID</code> is also obtained during the
36 * <code>Activatable.register</code> call.
37 *
38 * @author Ann Wollrath
39 * @since 1.2
40 * @see java.rmi.activation.Activatable
41 * @see java.rmi.activation.ActivationGroup
42 * @see java.rmi.activation.ActivationID
43 * @see java.rmi.activation.ActivationMonitor
44 * @see java.rmi.activation.ActivationSystem
45 * @see java.rmi.activation.Activator
46 */
47public class UnknownObjectException extends ActivationException {
48
49 /** indicate compatibility with the Java 2 SDK v1.2 version of class */
50 private static final long serialVersionUID = 3425547551622251430L;
51
52 /**
53 * Constructs an <code>UnknownObjectException</code> with the specified
54 * detail message.
55 *
56 * @param s the detail message
57 * @since 1.2
58 */
59 public UnknownObjectException(String s) {
60 super(s);
61 }
62}
java/pkg/java/rmi/activation/mkfile+21−0
@@ -0,0 +1,21 @@
1<../../../../../mkconfig
2
3TARG=\
4 Activatable.dis\
5 ActivateFailedException.dis\
6 ActivationDesc.dis\
7 ActivationException.dis\
8 ActivationGroup.dis\
9 ActivationGroupDesc.dis\
10 ActivationGroupID.dis\
11 ActivationID.dis\
12 ActivationInstantiator.dis\
13 ActivationMonitor.dis\
14 ActivationSystem.dis\
15 Activator.dis\
16 UnknownGroupException.dis\
17 UnknownObjectException.dis\
18
19DISBIN=$ROOT/java/dis/java/java/java/rmi/activation
20
21<$ROOT/mkfiles/mkjava
java/pkg/java/rmi/activation/package.html+52−0
@@ -0,0 +1,52 @@
1<!--
2 Copyright (c) 1998, 1999, Oracle and/or its affiliates. All rights reserved.
3 DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4
5 This code is free software; you can redistribute it and/or modify it
6 under the terms of the GNU General Public License version 2 only, as
7 published by the Free Software Foundation. Oracle designates this
8 particular file as subject to the "Classpath" exception as provided
9 by Oracle in the LICENSE file that accompanied this code.
10
11 This code is distributed in the hope that it will be useful, but WITHOUT
12 ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
13 FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
14 version 2 for more details (a copy is included in the LICENSE file that
15 accompanied this code).
16
17 You should have received a copy of the GNU General Public License version
18 2 along with this work; if not, write to the Free Software Foundation,
19 Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
20
21 Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
22 or visit www.oracle.com if you need additional information or have any
23 questions.
24-->
25
26<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN">
27<html>
28<body bgcolor="white">
29
30Provides support for RMI Object Activation. A remote
31object's reference can be made ``persistent'' and later activated into a
32``live'' object using the RMI activation mechanism.
33
34<!--
35<h2>Package Specification</h2>
36
37##### FILL IN ANY SPECS NEEDED BY JAVA COMPATIBILITY KIT #####
38<ul>
39 <li><a href="">##### REFER TO ANY FRAMEMAKER SPECIFICATION HERE #####</a>
40</ul>
41
42<h2>Related Documentation</h2>
43
44For overviews, tutorials, examples, guides, and tool documentation, please see:
45<ul>
46 <li><a href="">##### REFER TO NON-SPEC DOCUMENTATION HERE #####</a>
47</ul>
48-->
49
50@since 1.2
51</body>
52</html>