/* |
|
* Copyright (c) 1997, 2013, Oracle and/or its affiliates. All rights reserved. |
|
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. |
|
* |
|
* This code is free software; you can redistribute it and/or modify it |
|
* under the terms of the GNU General Public License version 2 only, as |
|
* published by the Free Software Foundation. Oracle designates this |
|
* particular file as subject to the "Classpath" exception as provided |
|
* by Oracle in the LICENSE file that accompanied this code. |
|
* |
|
* This code is distributed in the hope that it will be useful, but WITHOUT |
|
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or |
|
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License |
|
* version 2 for more details (a copy is included in the LICENSE file that |
|
* accompanied this code). |
|
* |
|
* You should have received a copy of the GNU General Public License version |
|
* 2 along with this work; if not, write to the Free Software Foundation, |
|
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. |
|
* |
|
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA |
|
* or visit www.oracle.com if you need additional information or have any |
|
* questions. |
|
*/ |
|
package java.rmi.activation; |
|
import java.io.Serializable; |
|
import java.rmi.MarshalledObject; |
|
/** |
|
* An activation descriptor contains the information necessary to |
|
* activate an object: <ul> |
|
* <li> the object's group identifier, |
|
* <li> the object's fully-qualified class name, |
|
* <li> the object's code location (the location of the class), a codebase URL |
|
* path, |
|
* <li> the object's restart "mode", and, |
|
* <li> a "marshalled" object that can contain object specific |
|
* initialization data. </ul> |
|
* |
|
* <p>A descriptor registered with the activation system can be used to |
|
* recreate/activate the object specified by the descriptor. The |
|
* <code>MarshalledObject</code> in the object's descriptor is passed |
|
* as the second argument to the remote object's constructor for |
|
* object to use during reinitialization/activation. |
|
* |
|
* @author Ann Wollrath |
|
* @since 1.2 |
|
* @see java.rmi.activation.Activatable |
|
*/ |
|
public final class ActivationDesc implements Serializable { |
|
/** |
|
* @serial the group's identifier |
|
*/ |
|
private ActivationGroupID groupID; |
|
/** |
|
* @serial the object's class name |
|
*/ |
|
private String className; |
|
/** |
|
* @serial the object's code location |
|
*/ |
|
private String location; |
|
/** |
|
* @serial the object's initialization data |
|
*/ |
|
private MarshalledObject<?> data; |
|
/** |
|
* @serial indicates whether the object should be restarted |
|
*/ |
|
private boolean restart; |
|
/** indicate compatibility with the Java 2 SDK v1.2 version of class */ |
|
private static final long serialVersionUID = 7455834104417690957L; |
|
/** |
|
* Constructs an object descriptor for an object whose class name |
|
* is <code>className</code>, that can be loaded from the |
|
* code <code>location</code> and whose initialization |
|
* information is <code>data</code>. If this form of the constructor |
|
* is used, the <code>groupID</code> defaults to the current id for |
|
* <code>ActivationGroup</code> for this VM. All objects with the |
|
* same <code>ActivationGroupID</code> are activated in the same VM. |
|
* |
|
* <p>Note that objects specified by a descriptor created with this |
|
* constructor will only be activated on demand (by default, the restart |
|
* mode is <code>false</code>). If an activatable object requires restart |
|
* services, use one of the <code>ActivationDesc</code> constructors that |
|
* takes a boolean parameter, <code>restart</code>. |
|
* |
|
* <p> This constructor will throw <code>ActivationException</code> if |
|
* there is no current activation group for this VM. To create an |
|
* <code>ActivationGroup</code> use the |
|
* <code>ActivationGroup.createGroup</code> method. |
|
* |
|
* @param className the object's fully package qualified class name |
|
* @param location the object's code location (from where the class is |
|
* loaded) |
|
* @param data the object's initialization (activation) data contained |
|
* in marshalled form. |
|
* @exception ActivationException if the current group is nonexistent |
|
* @exception UnsupportedOperationException if and only if activation is |
|
* not supported by this implementation |
|
* @since 1.2 |
|
*/ |
|
public ActivationDesc(String className, |
|
String location, |
|
MarshalledObject<?> data) |
|
throws ActivationException |
|
{ |
|
this(ActivationGroup.internalCurrentGroupID(), |
|
className, location, data, false); |
|
} |
|
/** |
|
* Constructs an object descriptor for an object whose class name |
|
* is <code>className</code>, that can be loaded from the |
|
* code <code>location</code> and whose initialization |
|
* information is <code>data</code>. If this form of the constructor |
|
* is used, the <code>groupID</code> defaults to the current id for |
|
* <code>ActivationGroup</code> for this VM. All objects with the |
|
* same <code>ActivationGroupID</code> are activated in the same VM. |
|
* |
|
* <p>This constructor will throw <code>ActivationException</code> if |
|
* there is no current activation group for this VM. To create an |
|
* <code>ActivationGroup</code> use the |
|
* <code>ActivationGroup.createGroup</code> method. |
|
* |
|
* @param className the object's fully package qualified class name |
|
* @param location the object's code location (from where the class is |
|
* loaded) |
|
* @param data the object's initialization (activation) data contained |
|
* in marshalled form. |
|
* @param restart if true, the object is restarted (reactivated) when |
|
* either the activator is restarted or the object's activation group |
|
* is restarted after an unexpected crash; if false, the object is only |
|
* activated on demand. Specifying <code>restart</code> to be |
|
* <code>true</code> does not force an initial immediate activation of |
|
* a newly registered object; initial activation is lazy. |
|
* @exception ActivationException if the current group is nonexistent |
|
* @exception UnsupportedOperationException if and only if activation is |
|
* not supported by this implementation |
|
* @since 1.2 |
|
*/ |
|
public ActivationDesc(String className, |
|
String location, |
|
MarshalledObject<?> data, |
|
boolean restart) |
|
throws ActivationException |
|
{ |
|
this(ActivationGroup.internalCurrentGroupID(), |
|
className, location, data, restart); |
|
} |
|
/** |
|
* Constructs an object descriptor for an object whose class name |
|
* is <code>className</code> that can be loaded from the |
|
* code <code>location</code> and whose initialization |
|
* information is <code>data</code>. All objects with the same |
|
* <code>groupID</code> are activated in the same Java VM. |
|
* |
|
* <p>Note that objects specified by a descriptor created with this |
|
* constructor will only be activated on demand (by default, the restart |
|
* mode is <code>false</code>). If an activatable object requires restart |
|
* services, use one of the <code>ActivationDesc</code> constructors that |
|
* takes a boolean parameter, <code>restart</code>. |
|
* |
|
* @param groupID the group's identifier (obtained from registering |
|
* <code>ActivationSystem.registerGroup</code> method). The group |
|
* indicates the VM in which the object should be activated. |
|
* @param className the object's fully package-qualified class name |
|
* @param location the object's code location (from where the class is |
|
* loaded) |
|
* @param data the object's initialization (activation) data contained |
|
* in marshalled form. |
|
* @exception IllegalArgumentException if <code>groupID</code> is null |
|
* @exception UnsupportedOperationException if and only if activation is |
|
* not supported by this implementation |
|
* @since 1.2 |
|
*/ |
|
public ActivationDesc(ActivationGroupID groupID, |
|
String className, |
|
String location, |
|
MarshalledObject<?> data) |
|
{ |
|
this(groupID, className, location, data, false); |
|
} |
|
/** |
|
* Constructs an object descriptor for an object whose class name |
|
* is <code>className</code> that can be loaded from the |
|
* code <code>location</code> and whose initialization |
|
* information is <code>data</code>. All objects with the same |
|
* <code>groupID</code> are activated in the same Java VM. |
|
* |
|
* @param groupID the group's identifier (obtained from registering |
|
* <code>ActivationSystem.registerGroup</code> method). The group |
|
* indicates the VM in which the object should be activated. |
|
* @param className the object's fully package-qualified class name |
|
* @param location the object's code location (from where the class is |
|
* loaded) |
|
* @param data the object's initialization (activation) data contained |
|
* in marshalled form. |
|
* @param restart if true, the object is restarted (reactivated) when |
|
* either the activator is restarted or the object's activation group |
|
* is restarted after an unexpected crash; if false, the object is only |
|
* activated on demand. Specifying <code>restart</code> to be |
|
* <code>true</code> does not force an initial immediate activation of |
|
* a newly registered object; initial activation is lazy. |
|
* @exception IllegalArgumentException if <code>groupID</code> is null |
|
* @exception UnsupportedOperationException if and only if activation is |
|
* not supported by this implementation |
|
* @since 1.2 |
|
*/ |
|
public ActivationDesc(ActivationGroupID groupID, |
|
String className, |
|
String location, |
|
MarshalledObject<?> data, |
|
boolean restart) |
|
{ |
|
if (groupID == null) |
|
throw new IllegalArgumentException("groupID can't be null"); |
|
this.groupID = groupID; |
|
this.className = className; |
|
this.location = location; |
|
this.data = data; |
|
this.restart = restart; |
|
} |
|
/** |
|
* Returns the group identifier for the object specified by this |
|
* descriptor. A group provides a way to aggregate objects into a |
|
* single Java virtual machine. RMI creates/activates objects with |
|
* the same <code>groupID</code> in the same virtual machine. |
|
* |
|
* @return the group identifier |
|
* @since 1.2 |
|
*/ |
|
public ActivationGroupID getGroupID() { |
|
return groupID; |
|
} |
|
/** |
|
* Returns the class name for the object specified by this |
|
* descriptor. |
|
* @return the class name |
|
* @since 1.2 |
|
*/ |
|
public String getClassName() { |
|
return className; |
|
} |
|
/** |
|
* Returns the code location for the object specified by |
|
* this descriptor. |
|
* @return the code location |
|
* @since 1.2 |
|
*/ |
|
public String getLocation() { |
|
return location; |
|
} |
|
/** |
|
* Returns a "marshalled object" containing intialization/activation |
|
* data for the object specified by this descriptor. |
|
* @return the object specific "initialization" data |
|
* @since 1.2 |
|
*/ |
|
public MarshalledObject<?> getData() { |
|
return data; |
|
} |
|
/** |
|
* Returns the "restart" mode of the object associated with |
|
* this activation descriptor. |
|
* |
|
* @return true if the activatable object associated with this |
|
* activation descriptor is restarted via the activation |
|
* daemon when either the daemon comes up or the object's group |
|
* is restarted after an unexpected crash; otherwise it returns false, |
|
* meaning that the object is only activated on demand via a |
|
* method call. Note that if the restart mode is <code>true</code>, the |
|
* activator does not force an initial immediate activation of |
|
* a newly registered object; initial activation is lazy. |
|
* @since 1.2 |
|
*/ |
|
public boolean getRestartMode() { |
|
return restart; |
|
} |
|
/** |
|
* Compares two activation descriptors for content equality. |
|
* |
|
* @param obj the Object to compare with |
|
* @return true if these Objects are equal; false otherwise. |
|
* @see java.util.Hashtable |
|
* @since 1.2 |
|
*/ |
|
public boolean equals(Object obj) { |
|
if (obj instanceof ActivationDesc) { |
|
ActivationDesc desc = (ActivationDesc) obj; |
|
return |
|
((groupID == null ? desc.groupID == null : |
|
groupID.equals(desc.groupID)) && |
|
(className == null ? desc.className == null : |
|
className.equals(desc.className)) && |
|
(location == null ? desc.location == null: |
|
location.equals(desc.location)) && |
|
(data == null ? desc.data == null : |
|
data.equals(desc.data)) && |
|
(restart == desc.restart)); |
|
} else { |
|
return false; |
|
} |
|
} |
|
/** |
|
* Return the same hashCode for similar <code>ActivationDesc</code>s. |
|
* @return an integer |
|
* @see java.util.Hashtable |
|
*/ |
|
public int hashCode() { |
|
return ((location == null |
|
? 0 |
|
: location.hashCode() << 24) ^ |
|
(groupID == null |
|
? 0 |
|
: groupID.hashCode() << 16) ^ |
|
(className == null |
|
? 0 |
|
: className.hashCode() << 9) ^ |
|
(data == null |
|
? 0 |
|
: data.hashCode() << 1) ^ |
|
(restart |
|
? 1 |
|
: 0)); |
|
} |
|
} |