/*******************************************************************************
 * Copyright (c) 1998, 2013 Oracle and/or its affiliates. All rights reserved.
 * This program and the accompanying materials are made available under the
 * terms of the Eclipse Public License v1.0 and Eclipse Distribution License v. 1.0
 * which accompanies this distribution.
 * The Eclipse Public License is available at http://www.eclipse.org/legal/epl-v10.html
 * and the Eclipse Distribution License is available at
 * http://www.eclipse.org/org/documents/edl-v10.php.
 *
 * Contributors:
 *     Mike Norman - from Proof-of-concept, become production code
 ******************************************************************************/
package dbws.testing.shadowddlgeneration.oldjpub;

/**
 * A Name encapsulates the name of an entity. A Name identifies the context (e.g., schema or Java
 * package) in which the entity is declared, and the simple name of the entity within the context.
 * This class implements 'equals' and 'hash', so that Names may be stored in Hashtables.
 */
public abstract class Name {

    public static final String NO_CONTEXT = "";

    protected String m_context;
    protected String m_name;
    protected Object m_annotation;

    /**
     * Initializes a Name with the context and simple name of a declared entity. The context and
     * name arguments may not be null.
     *
     * * @param context the context in which the entity is declared
     *
     * @param name
     *            the declared name of the entity in the context
     */
    public Name(String context, String name) {
        m_context = context;
        m_name = name;
    }

    /**
     * Returns the context name of the declared entity.
     */
    public String getContextName() {
        return m_context;
    }

    /**
     * Returns the name of the declared entity within the context.
     */
    public String getSimpleName() {
        return m_name;
    }

    /**
     * Returns the annotation associated with the Name. The annotation was set by the client of the
     * Name using setAnnotation().
     */
    public Object getAnnotation() {
        return m_annotation;
    }

    /**
     * Sets the annotation associated with the Name. The annotation is an arbitary object chosed by
     * the client of the Name.
     */
    public void setAnnotation(Object o) {
        m_annotation = o;
    }

    public String getDeclClass() {
        return null;
    }

    public boolean hasDeclItf() {
        return false;
    }

    public String getDeclItf() {
        return null;
    }

    public String getDeclPackage() {
        return null;
    }

    public String getDeclItfPackage() {
        return null;
    }

    public String getUseClass(String currPackage) {
        return null;
    }

    public String getUseClass(boolean full) {
        return null;
    }

    public String getUseClass() {
        return null;
    }

    public String getUsePackage() {
        return null;
    }

    public String getUseItfPackage() {
        return null;
    }

    public boolean hasUseItf() {
        return false;
    }

    public String getUseItf() {
        return null;
    }

    public abstract boolean hasUseClass();

    // Used for renaming generated Java methods
    // to be distinguished with user subclass methods.
    // Vary the method names for the declared Java class,
    // to allow the method in the user subclass return different types
    // as the corresponding method in the declared class.
    public String renameJavaMethodPrefix() {
        return "_";

    }

    /**
     * Returns the complete name of the declared entity. The returned name includes the context name
     * and the name of the entity within the context.
     */
    public abstract String toString();

    /**
     * Returns a hash code for the Name. Implemented so that Names may be put in Hashtables.
     */
    public int hashCode() {
        // System.out.println("[Name] hashCode: " + this + "," + this.getClass() +"," + m_context +
        // "," + m_name.hashCode()); //D+
        return (m_context == null) ? m_name.hashCode() : m_context.hashCode() ^ m_name.hashCode();
    }

    /**
     * Returns true if and only if two Names are equal.
     */
    public boolean equals(Object obj) {
        if (obj == null) {
            return false;
        }
        if (obj.getClass() != getClass()) {
            return false;
        }

        Name n = (Name)obj;
        return (m_context == null) ? (n.m_context == null && m_name.equals(n.m_name)) : (m_context
            .equals(n.m_context) && m_name.equals(n.m_name));
    }

    protected Name() {
    }

}
