Hi Audrius,

On Mon, 2006-03-13 at 17:32 +0100, Audrius Meskauskas wrote:
> 2006-03-13  Audrius Meskauskas  <[EMAIL PROTECTED]>
> 
>     * java/rmi/activation/ActivationGroupDesc.java: Implemented.
>     * java/rmi/activation/ActivationDesc.java.java,
>     * java/rmi/activation/ActivationGroup.java,
>     * java/rmi/activation/ActivationID.java,
>     * java/rmi/activation/ActivationMonitor.java,
>     * java/rmi/activation/ActivationSystem.java,
>     * java/rmi/activation/package.html: Documenting.

You forgot to attach the actual patch.
I have attached it to this message.

Thanks for working on this package and writing all that documentation!

Cheers,

Mark
Index: java/rmi/activation/ActivationDesc.java
===================================================================
RCS file: /cvsroot/classpath/classpath/java/rmi/activation/ActivationDesc.java,v
retrieving revision 1.6
retrieving revision 1.7
diff -u -r1.6 -r1.7
--- java/rmi/activation/ActivationDesc.java	10 Mar 2006 19:51:27 -0000	1.6
+++ java/rmi/activation/ActivationDesc.java	13 Mar 2006 16:33:14 -0000	1.7
@@ -1,4 +1,4 @@
-/* ActivationDecc.java --
+/* ActivationDesc.java -- record with info to activate an object
    Copyright (c) 1996, 1997, 1998, 1999 Free Software Foundation, Inc.
    
 This file is part of GNU Classpath.
Index: java/rmi/activation/ActivationGroup.java
===================================================================
RCS file: /cvsroot/classpath/classpath/java/rmi/activation/ActivationGroup.java,v
retrieving revision 1.7
retrieving revision 1.8
diff -u -r1.7 -r1.8
--- java/rmi/activation/ActivationGroup.java	12 Mar 2006 16:34:26 -0000	1.7
+++ java/rmi/activation/ActivationGroup.java	13 Mar 2006 16:33:14 -0000	1.8
@@ -1,5 +1,5 @@
-/* ActivationGroup.java --
-   Copyright (c) 1996, 1997, 1998, 1999 Free Software Foundation, Inc.
+/* ActivationGroup.java -- the RMI activation group.
+   Copyright (c) 1996, 1997, 1998, 1999, 2006 Free Software Foundation, Inc.
 
 This file is part of GNU Classpath.
 
Index: java/rmi/activation/ActivationGroupDesc.java
===================================================================
RCS file: /cvsroot/classpath/classpath/java/rmi/activation/ActivationGroupDesc.java,v
retrieving revision 1.8
retrieving revision 1.9
diff -u -r1.8 -r1.9
--- java/rmi/activation/ActivationGroupDesc.java	12 Mar 2006 16:34:26 -0000	1.8
+++ java/rmi/activation/ActivationGroupDesc.java	13 Mar 2006 16:33:14 -0000	1.9
@@ -41,7 +41,12 @@
 
 import java.io.Serializable;
 import java.rmi.MarshalledObject;
+import java.util.Arrays;
+import java.util.Enumeration;
+import java.util.Iterator;
 import java.util.Properties;
+import java.util.TreeSet;
+import java.util.zip.Adler32;
 
 /**
  * Contains information, necessary to create of recreate the activation objects.
@@ -57,15 +62,19 @@
  * expectes the group class to have the two parameter constructor, the first
  * parameter being the [EMAIL PROTECTED] ActivationGroupID} and the second the
  * [EMAIL PROTECTED] MarshalledObject}.
+ * 
+ * @author Audrius Meskauskas ([EMAIL PROTECTED]) (from stub)
  */
 public final class ActivationGroupDesc
     implements Serializable
 {
   /**
-   * Use the SVUID for interoperability.
+   * Contains the startup options for the [EMAIL PROTECTED] ActivationGroup}
+   * implementations. Allows to override system properties and specify other
+   * options for the implementation groups.
+   * 
+   * @author Audrius Meskauskas ([EMAIL PROTECTED]) (from stub)
    */
-  static final long serialVersionUID = - 4936225423168276595L;
-
   public static class CommandEnvironment
       implements Serializable
   {
@@ -74,108 +83,346 @@
      * Use the SVUID for interoperability.
      */
     static final long serialVersionUID = 6165754737887770191L;
+    
+    /**
+     * The zero size string array used as argv value when null is passed.
+     */
+    private static final String[] NO_ARGS = new String[0];
 
-    private String cmdpath;
-
-    private String[] argv;
-
+    /**
+     * The path to the java executable (or null for using default jre).
+     */
+    final String command;
+    
+    /**
+     * The extra parameters (may be empty array but never null).
+     */
+    final String[] options;
+    
+    /**
+     * Create the new command environment.
+     * 
+     * @param commandPatch the full path (and name) to the java executable of
+     *          null for using the default executable.
+     * @param args extra options that will be used when creating the activation
+     *          group. Null has the same effect as the empty list.
+     */
     public CommandEnvironment(String commandPatch, String[] args)
     {
-      cmdpath = commandPatch;
-      argv = args;
+      command = commandPatch;
+      if (args != null)
+        options = args;
+      else
+        options = NO_ARGS;
     }
-
+    
+    /**
+     * Get the path to the java executable.
+     * 
+     * @return the path to the java executable or null for using the default
+     * jre.
+     */
     public String getCommandPath()
     {
-      return cmdpath;
+      return command;
     }
-
+     
+    /**
+     * Get the additional command options.
+     * 
+     * @return the command options array, may be empty string
+     */
     public String[] getCommandOptions()
     {
-      return argv;
+      return options;
     }
-
+    
+    /**
+     * Compare for content equality.
+     */
     public boolean equals(Object obj)
     {
-      if (! (obj instanceof CommandEnvironment))
-        {
-          return (false);
-        }
-      CommandEnvironment that = (CommandEnvironment) obj;
-
-      if (! this.cmdpath.equals(that.cmdpath))
+      if (obj instanceof CommandEnvironment)
         {
-          return (false);
-        }
+          CommandEnvironment that = (CommandEnvironment) obj;
 
-      int len = this.argv.length;
-      if (len != that.argv.length)
-        {
-          return (false);
-        }
-      for (int i = 0; i < len; i++)
-        {
-          if (! this.argv[i].equals(that.argv[i]))
+          if (command == null || that.command == null)
             {
-              return (false);
+              // Use direct comparison if null is involved.
+              if (command != that.command)
+                return false;
             }
+          else
+            {
+              // Use .equals if null is not involved.
+              if (! this.command.equals(that.command))
+                return false;
+            }
+
+          return Arrays.equals(options, that.options);
         }
-      return (true);
+      else
+        return false;
     }
 
+    /**
+     * Get the hash code.
+     */
     public int hashCode()
     {
-      return cmdpath.hashCode(); // Not a very good hash code.
-    }
+      int h = command == null ? 0 : command.hashCode();
+      for (int i = 0; i < options.length; i++)
+        h ^= options[i].hashCode();
 
+      return h;
+    }
   }
-
-  public ActivationGroupDesc(Properties overrides,
-                             ActivationGroupDesc.CommandEnvironment cmd)
+  
+  /**
+   * Use the SVUID for interoperability.
+   */
+  static final long serialVersionUID = - 4936225423168276595L;
+  
+  /**
+   * The group class name or null for the default group class implementation.
+   */
+  final String className;
+  
+  /**
+   * The group class download location URL (codebase), ignored by the
+   * default implementation. 
+   */
+  final String location;
+  
+  /**
+   * The group initialization data.
+   */
+  final MarshalledObject data;
+  
+  /**
+   * The path to the group jre and the parameters of this jre, may be
+   * null for the default jre.
+   */
+  final ActivationGroupDesc.CommandEnvironment env;
+  
+  /**
+   * The properties that override the system properties.
+   */
+  final Properties props;
+  
+  /**
+   * The cached hash code.
+   */
+  transient long hash;
+  
+  /**
+   * Create the new activation group descriptor.
+   * 
+   * @param aProperties the properties that override the system properties
+   * @param environment the command line (and parameters), indicating, where to
+   *          find the jre executable and with that parameters to call it. May
+   *          be null if the default executable should be used. In this case,
+   *          the activation group with the null name (the system default group)
+   *          will be created.
+   */
+  public ActivationGroupDesc(Properties aProperties,
+                             ActivationGroupDesc.CommandEnvironment environment)
   {
-    throw new Error("Not implemented");
+    this(null, null, null, aProperties, environment);
   }
-
-  public ActivationGroupDesc(String className, String location,
-                             MarshalledObject data, Properties overrides,
-                             ActivationGroupDesc.CommandEnvironment cmd)
+  
+  /**
+   * Create the new activation group descriptor.
+   * 
+   * @param aClassName the name of the group implementation class. The null
+   *          value indicates the default implementation.
+   * @param aLocation the location, from where the group implementation class
+   *          should be loaded (ignored for the system default implementation).
+   * @param aData the group intialization data
+   * @param aProperties the properties that will override the system properties
+   *          of the new group. These properties will be translated into -D
+   *          options.
+   * @param environment the record, containing path to the jre executable and
+   *          start options for the jre or null for using the default jre and
+   *          options.
+   */
+  public ActivationGroupDesc(String aClassName, String aLocation,
+                             MarshalledObject aData, Properties aProperties,
+                             ActivationGroupDesc.CommandEnvironment environment)
   {
-    throw new Error("Not implemented");
+    className = aClassName;
+    location = aLocation;
+    data = aData;
+    props = aProperties;
+    env = environment;
   }
-
+  
+  /**
+   * Get the activation group class name.
+   * 
+   * @return the activation group class name (null for default implementation)
+   */
   public String getClassName()
   {
-    throw new Error("Not implemented");
+    return className;
   }
-
+  
+  /**
+   * Get the location, from where the group class will be loaded
+   * 
+   * @return the location, from where the implementation should be loaded (null
+   *         for the default implementation)
+   */
   public String getLocation()
   {
-    throw new Error("Not implemented");
+    return location;
   }
-
+  
+  /**
+   * Get the group intialization data.
+   * 
+   * @return the group intialization data in the marshalled form.
+   */
   public MarshalledObject getData()
   {
-    throw new Error("Not implemented");
+    return data;
   }
 
+  /**
+   * Get the overridded system properties.
+   * 
+   * @return the overridden group system properties.
+   */
   public Properties getPropertyOverrides()
   {
-    throw new Error("Not implemented");
+    return props;
   }
-
+  
+  /**
+   * Get the group command environment, containing path to the jre executable
+   * and startup options.
+   * 
+   * @return the command environment or null if the default environment should
+   *         be used.
+   */
   public ActivationGroupDesc.CommandEnvironment getCommandEnvironment()
   {
-    throw new Error("Not implemented");
+    return env;
   }
-
+  
+  /**
+   * Compare for the content equality.
+   */
   public boolean equals(Object obj)
   {
-    throw new Error("Not implemented");
+    if (obj instanceof ActivationGroupDesc)
+      {
+        ActivationGroupDesc that = (ActivationGroupDesc) obj;
+
+        // Ensure the hashcodes are computed.
+        if (hash == 0)
+          hashCode();
+        if (that.hash == 0)
+          that.hashCode();
+
+        // We compare the hash fields as they are type long rather than int.
+        if (hash != that.hash)
+          return false;
+
+        if (! eq(className, that.className))
+          return false;
+        if (! eq(data, that.data))
+          return false;
+        if (! eq(env, that.env))
+          return false;
+        if (! eq(location, that.location))
+          return false;
+
+        // Compare the properties.
+        if (eq(props, that.props))
+          return true;
+
+        if (props.size() != that.props.size())
+          return false;
+
+        Enumeration en = props.propertyNames();
+        Object key, value;
+
+        while (en.hasMoreElements())
+          {
+            key = en.nextElement();
+            if (! that.props.containsKey(key))
+              return false;
+            if (! eq(props.get(key), that.props.get(key)))
+              return false;
+          }
+        return true;
+      }
+    else
+      return false;
   }
-
+  
+  /**
+   * Compare for direct equality if one or both parameters are null, otherwise
+   * call .equals.
+   */
+  static boolean eq(Object a, Object b)
+  {
+    if (a == null || b == null)
+      return a == b;
+    else
+      return a.equals(b);
+  }
+  
+  /**
+   * Return the hashcode.
+   */
   public int hashCode()
   {
-    throw new Error("Not implemented");
+    if (hash==0)
+      {
+        // Using Adler32 - the hashcode is cached, will be computed only
+        // once and due need to scan properties is the expensive operation
+        // anyway. Reliability is more important.
+        Adler32 adler = new Adler32();
+        if (className!=null)
+          adler.update(className.getBytes());
+        if (data!=null)
+          adler.update(data.hashCode());
+        if (env!=null)
+          adler.update(env.hashCode());
+        if (location!=null)
+          adler.update(location.getBytes());
+        if (props!=null)
+          {
+            Enumeration en = props.propertyNames();
+            
+            // Using the intermediate sorted set to ensure that the
+            // properties are sorted.
+            TreeSet pr = new TreeSet();
+            
+            Object key;
+            Object value;
+            while (en.hasMoreElements())
+              {
+                key = en.nextElement();
+                if (key!=null)
+                  pr.add(key);
+              }
+            
+            Iterator it = pr.iterator();
+            while (it.hasNext())
+              {
+                key = it.next();
+                value = props.get(key);
+                adler.update(key.hashCode());
+                if (value!=null)
+                  adler.update(value.hashCode());
+              }
+          }
+          hash = adler.getValue();
+        }
+    return (int) hash;
   }
 
 }
Index: java/rmi/activation/ActivationID.java
===================================================================
RCS file: /cvsroot/classpath/classpath/java/rmi/activation/ActivationID.java,v
retrieving revision 1.6
retrieving revision 1.7
diff -u -r1.6 -r1.7
--- java/rmi/activation/ActivationID.java	12 Mar 2006 16:34:26 -0000	1.6
+++ java/rmi/activation/ActivationID.java	13 Mar 2006 16:33:14 -0000	1.7
@@ -1,4 +1,4 @@
-/* ActivationID.java --
+/* ActivationID.java -- the object activation identifier
    Copyright (c) 1996, 1997, 1998, 1999, 2006 Free Software Foundation, Inc.
 
 This file is part of GNU Classpath.
@@ -57,6 +57,8 @@
  * </ul>
  * An instance of the ActivationID has the [EMAIL PROTECTED] UID} as its component and
  * hence is globally unique.
+ * 
+ * @author Audrius Meskauskas ([EMAIL PROTECTED]) (from stub)
  */
 public class ActivationID
     implements Serializable
Index: java/rmi/activation/ActivationMonitor.java
===================================================================
RCS file: /cvsroot/classpath/classpath/java/rmi/activation/ActivationMonitor.java,v
retrieving revision 1.6
retrieving revision 1.7
diff -u -r1.6 -r1.7
--- java/rmi/activation/ActivationMonitor.java	2 Jul 2005 20:32:40 -0000	1.6
+++ java/rmi/activation/ActivationMonitor.java	13 Mar 2006 16:33:14 -0000	1.7
@@ -1,5 +1,6 @@
-/* ActivationMonitor.java --
-   Copyright (c) 1996, 1997, 1998, 1999, 2004  Free Software Foundation, Inc.
+/* ActivationMonitor.java -- the RMI activation/inactivation event listener
+   Copyright (c) 1996, 1997, 1998, 1999, 2004, 2006
+   Free Software Foundation, Inc.
 
 This file is part of GNU Classpath.
 
@@ -42,14 +43,45 @@
 import java.rmi.Remote;
 import java.rmi.RemoteException;
 
+/**
+ * The activation and inactivation event listener. The group obtains this 
+ * listener via [EMAIL PROTECTED] ActivationSystem#activeGroup} and must notify it
+ * when the group objects are activated or inactivated and also when the 
+ * whole group becomes inactive.
+ * @author root.
+ */
 public interface ActivationMonitor extends Remote
 {
-  void inactiveObject (ActivationID id)
+  /**
+   * Informs that the object is now active.
+   * 
+   * @param id the activation id of the object that is now active
+   * @throws UnknownObjectException is such object is not known in this group
+   * @throws RemoteException if remote call fails
+   */
+  void activeObject (ActivationID id, MarshalledObject obj)
     throws UnknownObjectException, RemoteException;
 
-  void activeObject (ActivationID id, MarshalledObject obj)
+  /**
+   * Informs that the object is not inactive.
+   * 
+   * @param id the activation id of the object that is now inactive
+   * @throws UnknownObjectException is such object is not known in this group
+   * @throws RemoteException if remote call fails
+   */
+  void inactiveObject (ActivationID id)
     throws UnknownObjectException, RemoteException;
 
-  void inactiveGroup (ActivationGroupID id, long incarnation)
+  /**
+   * Informs that the whole group is now inactive because all group objects are
+   * inactive. The group will be recreated upon the later request to activate
+   * any object, belonging to the group.
+   * 
+   * @param groupId the group id
+   * @param incarnation the group incarnation number
+   * @throws UnknownGroupException if the group id is not known
+   * @throws RemoteException if the remote call fails
+   */
+  void inactiveGroup (ActivationGroupID groupId, long incarnation)
   throws UnknownGroupException, RemoteException;
 }
Index: java/rmi/activation/ActivationSystem.java
===================================================================
RCS file: /cvsroot/classpath/classpath/java/rmi/activation/ActivationSystem.java,v
retrieving revision 1.8
retrieving revision 1.9
diff -u -r1.8 -r1.9
--- java/rmi/activation/ActivationSystem.java	12 Mar 2006 16:34:26 -0000	1.8
+++ java/rmi/activation/ActivationSystem.java	13 Mar 2006 16:33:14 -0000	1.9
@@ -1,4 +1,4 @@
-/* ActivationSystem.java -- Registers groups and objects to be activated.
+/* ActivationSystem.java -- registers groups and objects to be activated.
    Copyright (c) 1996, 1997, 1998, 1999, 2004, 2006
    Free Software Foundation, Inc.
 
Index: java/rmi/activation/package.html
===================================================================
RCS file: /cvsroot/classpath/classpath/java/rmi/activation/package.html,v
retrieving revision 1.3
retrieving revision 1.4
diff -u -r1.3 -r1.4
--- java/rmi/activation/package.html	12 Mar 2006 16:34:26 -0000	1.3
+++ java/rmi/activation/package.html	13 Mar 2006 16:33:14 -0000	1.4
@@ -62,5 +62,7 @@
 activation data to initialize itself in a needed manner. The remote object may
 also retain its activation identifier, so that it can inform the activation 
 group when it becomes inactive (via a call to the Activatable.inactive method).
+
[EMAIL PROTECTED] Audrius Meskauskas ([EMAIL PROTECTED]) (from empty)
 </body>
 </html>

Attachment: signature.asc
Description: This is a digitally signed message part

Reply via email to