mirror of git://gcc.gnu.org/git/gcc.git
				
				
				
			
		
			
				
	
	
		
			434 lines
		
	
	
		
			12 KiB
		
	
	
	
		
			Java
		
	
	
	
			
		
		
	
	
			434 lines
		
	
	
		
			12 KiB
		
	
	
	
		
			Java
		
	
	
	
/* ActivationGroupDesc.java -- the RMI activation group descriptor
 | 
						|
   Copyright (c) 1996, 1997, 1998, 1999, 2004, 2006
 | 
						|
   Free Software Foundation, Inc.
 | 
						|
 | 
						|
This file is part of GNU Classpath.
 | 
						|
 | 
						|
GNU Classpath is free software; you can redistribute it and/or modify
 | 
						|
it under the terms of the GNU General Public License as published by
 | 
						|
the Free Software Foundation; either version 2, or (at your option)
 | 
						|
any later version.
 | 
						|
 | 
						|
GNU Classpath 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 for more details.
 | 
						|
 | 
						|
You should have received a copy of the GNU General Public License
 | 
						|
along with GNU Classpath; see the file COPYING.  If not, write to the
 | 
						|
Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
 | 
						|
02110-1301 USA.
 | 
						|
 | 
						|
Linking this library statically or dynamically with other modules is
 | 
						|
making a combined work based on this library.  Thus, the terms and
 | 
						|
conditions of the GNU General Public License cover the whole
 | 
						|
combination.
 | 
						|
 | 
						|
As a special exception, the copyright holders of this library give you
 | 
						|
permission to link this library with independent modules to produce an
 | 
						|
executable, regardless of the license terms of these independent
 | 
						|
modules, and to copy and distribute the resulting executable under
 | 
						|
terms of your choice, provided that you also meet, for each linked
 | 
						|
independent module, the terms and conditions of the license of that
 | 
						|
module.  An independent module is a module which is not derived from
 | 
						|
or based on this library.  If you modify this library, you may extend
 | 
						|
this exception to your version of the library, but you are not
 | 
						|
obligated to do so.  If you do not wish to do so, delete this
 | 
						|
exception statement from your version. */
 | 
						|
 | 
						|
 | 
						|
package java.rmi.activation;
 | 
						|
 | 
						|
import gnu.java.rmi.activation.DefaultActivationGroup;
 | 
						|
 | 
						|
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.
 | 
						|
 * The group descriptor contains:
 | 
						|
 * <ul>
 | 
						|
 * <li>The name of the group's class. This class is derived from the
 | 
						|
 * {@link ActivationGroup}.</li>
 | 
						|
 * <li>The group class code location.</li>
 | 
						|
 * <li>The marshalled object that contains the group specific initialization
 | 
						|
 * information</li>
 | 
						|
 * </ul>
 | 
						|
 * The groups are created by the {@link ActivationGroup#createGroup} method that
 | 
						|
 * expectes the group class to have the two parameter constructor, the first
 | 
						|
 * parameter being the {@link ActivationGroupID} and the second the
 | 
						|
 * {@link MarshalledObject}.
 | 
						|
 *
 | 
						|
 * @author Audrius Meskauskas (audriusa@bioinformatics.org) (from stub)
 | 
						|
 */
 | 
						|
public final class ActivationGroupDesc
 | 
						|
    implements Serializable
 | 
						|
{
 | 
						|
  /**
 | 
						|
   * Contains the startup options for the {@link ActivationGroup}
 | 
						|
   * implementations. Allows to override system properties and specify other
 | 
						|
   * options for the implementation groups.
 | 
						|
   *
 | 
						|
   * @author Audrius Meskauskas (audriusa@bioinformatics.org) (from stub)
 | 
						|
   */
 | 
						|
  public static class CommandEnvironment
 | 
						|
      implements Serializable
 | 
						|
  {
 | 
						|
 | 
						|
    /**
 | 
						|
     * 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];
 | 
						|
 | 
						|
    /**
 | 
						|
     * 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)
 | 
						|
    {
 | 
						|
      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 command;
 | 
						|
    }
 | 
						|
 | 
						|
    /**
 | 
						|
     * Get the additional command options.
 | 
						|
     *
 | 
						|
     * @return the command options array, may be empty string
 | 
						|
     */
 | 
						|
    public String[] getCommandOptions()
 | 
						|
    {
 | 
						|
      return options;
 | 
						|
    }
 | 
						|
 | 
						|
    /**
 | 
						|
     * Compare for content equality.
 | 
						|
     */
 | 
						|
    public boolean equals(Object obj)
 | 
						|
    {
 | 
						|
      if (obj instanceof CommandEnvironment)
 | 
						|
        {
 | 
						|
          CommandEnvironment that = (CommandEnvironment) obj;
 | 
						|
 | 
						|
          if (command == null || that.command == null)
 | 
						|
            {
 | 
						|
              // 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);
 | 
						|
        }
 | 
						|
      else
 | 
						|
        return false;
 | 
						|
    }
 | 
						|
 | 
						|
    /**
 | 
						|
     * Get the hash code.
 | 
						|
     */
 | 
						|
    public int hashCode()
 | 
						|
    {
 | 
						|
      int h = command == null ? 0 : command.hashCode();
 | 
						|
      for (int i = 0; i < options.length; i++)
 | 
						|
        h ^= options[i].hashCode();
 | 
						|
 | 
						|
      return h;
 | 
						|
    }
 | 
						|
  }
 | 
						|
 | 
						|
  /**
 | 
						|
   * 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 that will use the default
 | 
						|
   * activation group implementation with the given properties and
 | 
						|
   * environment.
 | 
						|
   *
 | 
						|
   * @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)
 | 
						|
  {
 | 
						|
    this(DefaultActivationGroup.class.getName(), null, null, aProperties,
 | 
						|
         environment);
 | 
						|
  }
 | 
						|
 | 
						|
  /**
 | 
						|
   * 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)
 | 
						|
  {
 | 
						|
    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()
 | 
						|
  {
 | 
						|
    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()
 | 
						|
  {
 | 
						|
    return location;
 | 
						|
  }
 | 
						|
 | 
						|
  /**
 | 
						|
   * Get the group intialization data.
 | 
						|
   *
 | 
						|
   * @return the group intialization data in the marshalled form.
 | 
						|
   */
 | 
						|
  public MarshalledObject<?> getData()
 | 
						|
  {
 | 
						|
    return data;
 | 
						|
  }
 | 
						|
 | 
						|
  /**
 | 
						|
   * Get the overridded system properties.
 | 
						|
   *
 | 
						|
   * @return the overridden group system properties.
 | 
						|
   */
 | 
						|
  public Properties getPropertyOverrides()
 | 
						|
  {
 | 
						|
    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()
 | 
						|
  {
 | 
						|
    return env;
 | 
						|
  }
 | 
						|
 | 
						|
  /**
 | 
						|
   * Compare for the content equality.
 | 
						|
   */
 | 
						|
  public boolean equals(Object obj)
 | 
						|
  {
 | 
						|
    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()
 | 
						|
  {
 | 
						|
    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;
 | 
						|
  }
 | 
						|
 | 
						|
}
 |