/*
 * Copyright (c) 1998, 2020 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 v. 2.0 which is available at
 * http://www.eclipse.org/legal/epl-2.0,
 * or the Eclipse Distribution License v. 1.0 which is available at
 * http://www.eclipse.org/org/documents/edl-v10.php.
 *
 * SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
 */

// 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() {
    }

}
