FileDocCategorySizeDatePackage
CodeSigner.javaAPI DocJava SE 5 API3893Fri Aug 26 14:57:14 BST 2005java.security

CodeSigner.java

/*
 * @(#)CodeSigner.java	1.4 04/04/26
 *
 * Copyright 2004 Sun Microsystems, Inc. All rights reserved.
 * SUN PROPRIETARY/CONFIDENTIAL. Use is subject to license terms.
 */
 
package java.security;

import java.io.Serializable;
import java.security.cert.CertPath;

/**
 * This class encapsulates information about a code signer.
 * It is immutable.
 *
 * @since 1.5
 * @version 1.4, 04/26/04
 * @author Vincent Ryan
 */

public final class CodeSigner implements Serializable {

    private static final long serialVersionUID = 6819288105193937581L;

    /**
     * The signer's certificate path.
     *
     * @serial
     */
    private CertPath signerCertPath;

    /*
     * The signature timestamp.
     *
     * @serial
     */
    private Timestamp timestamp;

    /*
     * Hash code for this code signer.
     */
    private transient int myhash = -1;

    /**
     * Constructs a CodeSigner object.
     *
     * @param signerCertPath The signer's certificate path. 
     *                       It must not be <code>null</code>.
     * @param timestamp A signature timestamp. 
     *                  If <code>null</code> then no timestamp was generated
     *                  for the signature.
     * @throws NullPointerException if <code>signerCertPath</code> is 
     *                              <code>null</code>.
     */
    public CodeSigner(CertPath signerCertPath, Timestamp timestamp) {
	if (signerCertPath == null) {
	    throw new NullPointerException();
	}
	this.signerCertPath = signerCertPath;
	this.timestamp = timestamp;
    }

    /**
     * Returns the signer's certificate path.
     *
     * @return A certificate path.
     */
    public CertPath getSignerCertPath() {
	return signerCertPath;
    }

    /**
     * Returns the signature timestamp.
     *
     * @return The timestamp or <code>null</code> if none is present.
     */
    public Timestamp getTimestamp() {
	return timestamp;
    }

    /**
     * Returns the hash code value for this code signer.
     * The hash code is generated using the signer's certificate path and the
     * timestamp, if present.
     *
     * @return a hash code value for this code signer.
     */
    public int hashCode() {
        if (myhash == -1) {
	    if (timestamp == null) {
		myhash = signerCertPath.hashCode();
	    } else {
		myhash = signerCertPath.hashCode() + timestamp.hashCode();
	    }
        }
        return myhash;
    }

    /**
     * Tests for equality between the specified object and this
     * code signer. Two code signers are considered equal if their 
     * signer certificate paths are equal and if their timestamps are equal,
     * if present in both.
     * 
     * @param obj the object to test for equality with this object.
     * 
     * @return true if the objects are considered equal, false otherwise.
     */
    public boolean equals(Object obj) {
        if (obj == null || (!(obj instanceof CodeSigner))) {
            return false;
        }
        CodeSigner that = (CodeSigner)obj;

        if (this == that) {
            return true;
        }
	Timestamp thatTimestamp = that.getTimestamp();
	if (timestamp == null) {
	    if (thatTimestamp != null) {
		return false;
	    }
	} else {
	    if (thatTimestamp == null ||
	        (! timestamp.equals(thatTimestamp))) {
		return false;
	    }
	}
        return signerCertPath.equals(that.getSignerCertPath());
    }

    /**
     * Returns a string describing this code signer.
     * 
     * @return A string comprising the signer's certificate and a timestamp,
     *         if present.
     */
    public String toString() {
        StringBuffer sb = new StringBuffer();
        sb.append("(");
        sb.append("Signer: " + signerCertPath.getCertificates().get(0));
	if (timestamp != null) {
            sb.append("timestamp: " + timestamp);
	}
        sb.append(")");
        return sb.toString();
    }
}