/* | 
|
 * Copyright (c) 1997, 2008, 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.IOException;  | 
|
import java.io.ObjectInputStream;  | 
|
import java.io.Serializable;  | 
|
import java.rmi.MarshalledObject;  | 
|
import java.util.Arrays;  | 
|
import java.util.Properties;  | 
|
/** | 
|
 * An activation group descriptor contains the information necessary to | 
|
 * create/recreate an activation group in which to activate objects. | 
|
 * Such a descriptor contains: <ul> | 
|
 * <li> the group's class name, | 
|
 * <li> the group's code location (the location of the group's class), and | 
|
 * <li> a "marshalled" object that can contain group specific | 
|
 * initialization data. </ul> <p> | 
|
 * | 
|
 * The group's class must be a concrete subclass of | 
|
 * <code>ActivationGroup</code>. A subclass of | 
|
 * <code>ActivationGroup</code> is created/recreated via the | 
|
 * <code>ActivationGroup.createGroup</code> static method that invokes | 
|
 * a special constructor that takes two arguments: <ul> | 
|
 * | 
|
 * <li> the group's <code>ActivationGroupID</code>, and | 
|
 * <li> the group's initialization data (in a | 
|
 * <code>java.rmi.MarshalledObject</code>)</ul><p> | 
|
 * | 
|
 * @author      Ann Wollrath | 
|
 * @since       1.2 | 
|
 * @see         ActivationGroup | 
|
 * @see         ActivationGroupID | 
|
*/  | 
|
public final class ActivationGroupDesc implements Serializable {  | 
|
    /** | 
|
     * @serial The group's fully package qualified class name. | 
|
*/  | 
|
private String className;  | 
|
    /** | 
|
     * @serial The location from where to load the group's class. | 
|
*/  | 
|
private String location;  | 
|
    /** | 
|
     * @serial The group's initialization data. | 
|
*/  | 
|
private MarshalledObject<?> data;  | 
|
    /** | 
|
     * @serial The controlling options for executing the VM in | 
|
     * another process. | 
|
*/  | 
|
private CommandEnvironment env;  | 
|
    /** | 
|
     * @serial A properties map which will override those set | 
|
     * by default in the subprocess environment. | 
|
*/  | 
|
private Properties props;  | 
|
    /** indicate compatibility with the Java 2 SDK v1.2 version of class */ | 
|
private static final long serialVersionUID = -4936225423168276595L;  | 
|
    /** | 
|
     * Constructs a group descriptor that uses the system defaults for group | 
|
     * implementation and code location.  Properties specify Java | 
|
     * environment overrides (which will override system properties in | 
|
     * the group implementation's VM).  The command | 
|
     * environment can control the exact command/options used in | 
|
     * starting the child VM, or can be <code>null</code> to accept | 
|
     * rmid's default. | 
|
     * | 
|
     * <p>This constructor will create an <code>ActivationGroupDesc</code> | 
|
     * with a <code>null</code> group class name, which indicates the system's | 
|
     * default <code>ActivationGroup</code> implementation. | 
|
     * | 
|
     * @param overrides the set of properties to set when the group is | 
|
     * recreated. | 
|
     * @param cmd the controlling options for executing the VM in | 
|
     * another process (or <code>null</code>). | 
|
     * @since 1.2 | 
|
*/  | 
|
public ActivationGroupDesc(Properties overrides,  | 
|
CommandEnvironment cmd)  | 
|
    { | 
|
this(null, null, null, overrides, cmd);  | 
|
}  | 
|
    /** | 
|
     * Specifies an alternate group implementation and execution | 
|
     * environment to be used for the group. | 
|
     * | 
|
     * @param className the group's package qualified class name or | 
|
     * <code>null</code>. A <code>null</code> group class name indicates | 
|
     * the system's default <code>ActivationGroup</code> implementation. | 
|
     * @param location the location from where to load the group's | 
|
     * class | 
|
     * @param data the group's initialization data contained in | 
|
     * marshalled form (could contain properties, for example) | 
|
     * @param overrides a properties map which will override those set | 
|
     * by default in the subprocess environment (will be translated | 
|
     * into <code>-D</code> options), or <code>null</code>. | 
|
     * @param cmd the controlling options for executing the VM in | 
|
     * another process (or <code>null</code>). | 
|
     * @since 1.2 | 
|
*/  | 
|
public ActivationGroupDesc(String className,  | 
|
String location,  | 
|
MarshalledObject<?> data,  | 
|
Properties overrides,  | 
|
CommandEnvironment cmd)  | 
|
    { | 
|
this.props = overrides;  | 
|
this.env = cmd;  | 
|
this.data = data;  | 
|
this.location = location;  | 
|
this.className = className;  | 
|
}  | 
|
    /** | 
|
     * Returns the group's class name (possibly <code>null</code>).  A | 
|
     * <code>null</code> group class name indicates the system's default | 
|
     * <code>ActivationGroup</code> implementation. | 
|
     * @return the group's class name | 
|
     * @since 1.2 | 
|
*/  | 
|
public String getClassName() {  | 
|
return className;  | 
|
}  | 
|
    /** | 
|
     * Returns the group's code location. | 
|
     * @return the group's code location | 
|
     * @since 1.2 | 
|
*/  | 
|
public String getLocation() {  | 
|
return location;  | 
|
}  | 
|
    /** | 
|
     * Returns the group's initialization data. | 
|
     * @return the group's initialization data | 
|
     * @since 1.2 | 
|
*/  | 
|
public MarshalledObject<?> getData() {  | 
|
return data;  | 
|
}  | 
|
    /** | 
|
     * Returns the group's property-override list. | 
|
     * @return the property-override list, or <code>null</code> | 
|
     * @since 1.2 | 
|
*/  | 
|
public Properties getPropertyOverrides() {  | 
|
return (props != null) ? (Properties) props.clone() : null;  | 
|
}  | 
|
    /** | 
|
     * Returns the group's command-environment control object. | 
|
     * @return the command-environment object, or <code>null</code> | 
|
     * @since 1.2 | 
|
*/  | 
|
    public CommandEnvironment getCommandEnvironment() { | 
|
return this.env;  | 
|
}  | 
|
    /** | 
|
     * Startup options for ActivationGroup implementations. | 
|
     * | 
|
     * This class allows overriding default system properties and | 
|
     * specifying implementation-defined options for ActivationGroups. | 
|
     * @since 1.2 | 
|
*/  | 
|
public static class CommandEnvironment implements Serializable {  | 
|
private static final long serialVersionUID = 6165754737887770191L;  | 
|
        /** | 
|
         * @serial | 
|
*/  | 
|
private String command;  | 
|
        /** | 
|
         * @serial | 
|
*/  | 
|
private String[] options;  | 
|
        /** | 
|
         * Create a CommandEnvironment with all the necessary | 
|
         * information. | 
|
         * | 
|
         * @param cmdpath the name of the java executable, including | 
|
         * the full path, or <code>null</code>, meaning "use rmid's default". | 
|
         * The named program <em>must</em> be able to accept multiple | 
|
         * <code>-Dpropname=value</code> options (as documented for the | 
|
         * "java" tool) | 
|
         * | 
|
         * @param argv extra options which will be used in creating the | 
|
         * ActivationGroup.  Null has the same effect as an empty | 
|
         * list. | 
|
         * @since 1.2 | 
|
*/  | 
|
public CommandEnvironment(String cmdpath,  | 
|
String[] argv)  | 
|
        { | 
|
            this.command = cmdpath;     // might be null | 
|
            // Hold a safe copy of argv in this.options | 
|
            if (argv == null) { | 
|
this.options = new String[0];  | 
|
            } else { | 
|
this.options = new String[argv.length];  | 
|
System.arraycopy(argv, 0, this.options, 0, argv.length);  | 
|
}  | 
|
}  | 
|
        /** | 
|
         * Fetch the configured path-qualified java command name. | 
|
         * | 
|
         * @return the configured name, or <code>null</code> if configured to | 
|
         * accept the default | 
|
         * @since 1.2 | 
|
*/  | 
|
public String getCommandPath() {  | 
|
return (this.command);  | 
|
}  | 
|
        /** | 
|
         * Fetch the configured java command options. | 
|
         * | 
|
         * @return An array of the command options which will be passed | 
|
         * to the new child command by rmid. | 
|
         * Note that rmid may add other options before or after these | 
|
         * options, or both. | 
|
         * Never returns <code>null</code>. | 
|
         * @since 1.2 | 
|
*/  | 
|
public String[] getCommandOptions() {  | 
|
return options.clone();  | 
|
}  | 
|
        /** | 
|
         * Compares two command environments 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 CommandEnvironment) {  | 
|
CommandEnvironment env = (CommandEnvironment) obj;  | 
|
return  | 
|
((command == null ? env.command == null :  | 
|
command.equals(env.command)) &&  | 
|
Arrays.equals(options, env.options));  | 
|
            } else { | 
|
return false;  | 
|
}  | 
|
}  | 
|
        /** | 
|
         * Return identical values for similar | 
|
         * <code>CommandEnvironment</code>s. | 
|
         * @return an integer | 
|
         * @see java.util.Hashtable | 
|
*/  | 
|
public int hashCode()  | 
|
        { | 
|
            // hash command and ignore possibly expensive options | 
|
return (command == null ? 0 : command.hashCode());  | 
|
}  | 
|
        /** | 
|
         * <code>readObject</code> for custom serialization. | 
|
         * | 
|
         * <p>This method reads this object's serialized form for this | 
|
         * class as follows: | 
|
         * | 
|
         * <p>This method first invokes <code>defaultReadObject</code> on | 
|
         * the specified object input stream, and if <code>options</code> | 
|
         * is <code>null</code>, then <code>options</code> is set to a | 
|
         * zero-length array of <code>String</code>. | 
|
*/  | 
|
private void readObject(ObjectInputStream in)  | 
|
throws IOException, ClassNotFoundException  | 
|
        { | 
|
in.defaultReadObject();  | 
|
if (options == null) {  | 
|
options = new String[0];  | 
|
}  | 
|
}  | 
|
}  | 
|
    /** | 
|
     * Compares two activation group 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 ActivationGroupDesc) {  | 
|
ActivationGroupDesc desc = (ActivationGroupDesc) obj;  | 
|
return  | 
|
((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)) &&  | 
|
(env == null ? desc.env == null : env.equals(desc.env)) &&  | 
|
(props == null ? desc.props == null :  | 
|
props.equals(desc.props)));  | 
|
        } else { | 
|
return false;  | 
|
}  | 
|
}  | 
|
    /** | 
|
     * Produce identical numbers for similar <code>ActivationGroupDesc</code>s. | 
|
     * @return an integer | 
|
     * @see java.util.Hashtable | 
|
*/  | 
|
    public int hashCode() { | 
|
// hash location, className, data, and env  | 
|
        // but omit props (may be expensive) | 
|
return ((location == null  | 
|
? 0  | 
|
: location.hashCode() << 24) ^  | 
|
(env == null  | 
|
? 0  | 
|
: env.hashCode() << 16) ^  | 
|
(className == null  | 
|
? 0  | 
|
: className.hashCode() << 8) ^  | 
|
(data == null  | 
|
? 0  | 
|
: data.hashCode()));  | 
|
}  | 
|
}  |