/*
 * 
 * Copyright 2004 Sun Microsystems, Inc. All Rights Reserved.
 * 
 * The contents of this file are subject to the Sun Community Source
 * License v3.0/Jini Technology Specific Attachment v 1.0 (the
 * "License"). You may not use this file except in compliance with the
 * License. You may obtain a copy of the License at
 * http://wwws.sun.com/software/jini/licensing/SCSL3_JiniTSA1.html.
 * Software distributed under the License is distributed on an "AS IS"
 * basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See
 * the License for the specific language governing rights and limitations
 * under the License.
 * 
 * The Reference Code is Jini Technology Core Platform code, v2.0. The
 * Developer of the Reference Code is Sun Microsystems, Inc.
 * 
 * Contributor(s): Sun Microsystems, Inc.
 * 
 * The contents of this file comply with the Jini Technology Core
 * Platform Compatibility Kit, v2.0A.
 * 
 * Tester(s): Sun Microsystems, Inc.
 * 
 * Test Platform(s):
 * Java 2 SDK, Standard Edition, Version 1.4.2_03 for Solaris(TM)SPARC/x86
 * Java 2 SDK, Standard Edition, Version 1.4.2_03 for Linux (Intel x86)
 * Java 2 SDK, Standard Edition, Version 1.4.2_03 for Windows (Intel Platform)
 * 
 */
package com.sun.jini.mercury;

import java.io.File;

/**
 * Class used as the key value for an associated <tt>LogStream</tt> object in 
 * a collection of type <tt>java.util.Map</tt>.
 *
 * @author Sun Microsystems, Inc.
 *
 * @since 1.1
 */
class StreamKey {

    /** Holds the <tt>File</tt> attribute for the associated stream. */
    private /*final*/ File file;

    /** Holds the "enumeration" type for the associated stream. */
    private /*final*/ StreamType type;

    /** Holds the cached value of the <tt>file</tt> field's hashCode. */
    private /*final*/ int hash;

    /** 
     * Simple constructor that accepts <tt>File</tt> and <tt>StreamType</tt>
     * arguments and then assigns them to the appropriate internal fields.
     * Neither argument can be <code>null</code>. The <tt>File</tt> 
     * argument must represent an absolute pathname.
     *
     * @exception IllegalArgumentException thrown if either of the arguments are
     *                                     null or if the <tt>file</tt> 
     *                                     argument does not represent an
     *                                     absolute pathname.
     */

    StreamKey(File file, StreamType type) {
        if (file == null || type == null)
            throw new IllegalArgumentException("Cannot use <null> for " + 
                "path or type arguments.");

        // Note: relative and absolute paths to the same file
        // are not considered equal. Therefore, we ensure that all 
        // file arguments are absolute so that <tt>equals</tt> behaves
        // as expected.
        if (!file.isAbsolute())
            throw new IllegalArgumentException("Cannot use a relative path " + 
                                               "for the <file> argument");
        this.file = file;
        this.type = type;
        this.hash = file.hashCode(); //cache it since it won't change
    }

    /* Inherit javadoc from supertype */
    public int hashCode() {
	return hash;
    }

    /* Inherit javadoc from supertype */
    public boolean equals(Object o) {
        if (this == o)
            return true;

        if (o == null)
            return false;

        if (o.getClass() != getClass())
            return false;

	StreamKey sk = (StreamKey)o;
	return ((type == sk.type) && (file.equals(sk.file)));
    }
}
