jdk/src/share/classes/java/rmi/activation/ActivationGroupDesc.java
changeset 2 90ce3da70b43
child 51 6fe31bc95bbc
equal deleted inserted replaced
0:fd16c54261b3 2:90ce3da70b43
       
     1 /*
       
     2  * Copyright 1997-2005 Sun Microsystems, Inc.  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.  Sun designates this
       
     8  * particular file as subject to the "Classpath" exception as provided
       
     9  * by Sun 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 Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
       
    22  * CA 95054 USA or visit www.sun.com if you need additional information or
       
    23  * have any questions.
       
    24  */
       
    25 
       
    26 package java.rmi.activation;
       
    27 
       
    28 import java.io.IOException;
       
    29 import java.io.ObjectInputStream;
       
    30 import java.io.Serializable;
       
    31 import java.rmi.MarshalledObject;
       
    32 import java.util.Arrays;
       
    33 import 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  */
       
    59 public 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 (String[]) 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 }