/* IdentityScope.java --- IdentityScope Class
   Copyright (C) 1999, 2003, 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.security;

import java.util.Enumeration;

/**
 * <code>IdentityScope</code> represents a scope of an identity.
 * <code>IdentityScope</code> is also an {@link Identity} and can have a name
 * and scope along with the other qualitites identities possess.
 * 
 * <p>An <code>IdentityScope</code> contains other {@link Identity} objects.
 * All {@link Identity} objects are manipulated in the scope the same way. The
 * scope is supposed to apply different scope to different type of
 * Identities.</p>
 * 
 * <p>No identity within the same scope can have the same public key.</p>
 * 
 * @author Mark Benvenuto
 * @see Identity
 * @see Signer
 * @see Principal
 * @see Key
 * @deprecated Use java.security.KeyStore, the java.security.cert package, and
 *             java.security.Principal.
 */
public abstract class IdentityScope extends Identity
{
  private static final long serialVersionUID = -2337346281189773310L;
  private static IdentityScope systemScope;

  /** Constructor for serialization purposes. */
  protected IdentityScope()
  {
    super();
  }

  /**
   * Constructs a new instance of <code>IdentityScope</code> with the
   * specified name and no scope.
   * 
   * @param name
   *          the name to use.
   */
  public IdentityScope(String name)
  {
    super(name);
  }

  /**
   * Constructs a new instance of <code>IdentityScope</code> with the
   * specified name and {@link IdentityScope}.
   * 
   * @param name
   *          the name to use.
   * @param scope
   *          the scope to use.
   * @throws KeyManagementException
   *           if the identity scope is already present.
   */
  public IdentityScope(String name, IdentityScope scope)
    throws KeyManagementException
  {
    super(name, scope);
  }

  /**
   * Returns the system's Scope.
   * 
   * @return the system's Scope.
   */
  public static IdentityScope getSystemScope()
  {
    if (systemScope == null)
      {
	//Load it
	//systemScope;
      }
    return systemScope;
  }

  /**
   * Sets the scope of the system.
   * 
   * @param scope
   *          the new system scope.
   * @throws SecurityException
   *           if a {@link SecurityManager} is installed which disallows this
   *           operation.
   */
  protected static void setSystemScope(IdentityScope scope)
  {
    SecurityManager sm = System.getSecurityManager();
    if (sm != null)
      sm.checkSecurityAccess("setSystemScope");

    systemScope = scope;
  }

  /**
   * Returns the number of entries within this <code>IdentityScope</code>.
   * 
   * @return the number of entries within this <code>IdentityScope</code>.
   */
  public abstract int size();

  /**
   * Returns the specified {@link Identity}, by name, within this scope.
   * 
   * @param name
   *          name of {@link Identity} to get.
   * @return an {@link Identity} representing the name or <code>null</code> if
   *         it cannot be found.
   */
  public abstract Identity getIdentity(String name);

  /**
   * Returns the specified {@link Identity}, by {@link Principal}, within this
   * scope.
   * 
   * @param principal
   *          the {@link Principal} to use.
   * @return an identity representing the {@link Principal} or <code>null</code>
   *         if it cannot be found.
   */
  public Identity getIdentity(Principal principal)
  {
    return getIdentity(principal.getName());
  }

  /**
   * Returns the specified {@link Identity}, by public key, within this scope.
   * 
   * @param key
   *          the {@link PublicKey} to use.
   * @return an identity representing the public key or <code>null</code> if
   *         it cannot be found.
   */
  public abstract Identity getIdentity(PublicKey key);

  /**
   * Adds an identity to his scope.
   * 
   * @param identity
   *          the {@link Identity} to add.
   * @throws KeyManagementException
   *           if it is an invalid identity, an identity with the same key
   *           exists, or if another error occurs.
   */
  public abstract void addIdentity(Identity identity)
    throws KeyManagementException;

  /**
   * Removes an identity in this scope.
   * 
   * @param identity
   *          the {@link Identity} to remove.
   * @throws KeyManagementException
   *           if it is a missing identity, or if another error occurs.
   */
  public abstract void removeIdentity(Identity identity)
    throws KeyManagementException;

  /**
   * Returns an {@link Enumeration} of identities in this scope.
   * 
   * @return an {@link Enumeration} of the identities in this scope.
   */
  public abstract Enumeration identities();

  /**
   * Returns a string representing this instance. It includes the name, the
   * scope name, and number of identities.
   * 
   * @return a string representation of this instance.
   */
  public String toString()
  {
    return (super.getName() + " " + super.getScope().getName() + " " + size());
  }
}
