/*
 * Licensed to the Apache Software Foundation (ASF) under one or more
 * contributor license agreements.  See the NOTICE file distributed with
 * this work for additional information regarding copyright ownership.
 * The ASF licenses this file to You under the Apache License, Version 2.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://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
package org.apache.sis.util.iso;

import java.util.Objects;
import javax.xml.bind.annotation.XmlType;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlRootElement;
import org.opengis.util.MemberName;
import org.opengis.util.NameSpace;
import org.opengis.util.TypeName;

import static org.apache.sis.util.ArgumentChecks.ensureNonNull;


/**
 * The name to identify a member of a {@linkplain org.opengis.util.Record record}.
 * {@code DefaultMemberName} can be instantiated by any of the following methods:
 *
 * <ul>
 *   <li>{@link DefaultNameFactory#createMemberName(NameSpace, CharSequence, TypeName)}</li>
 *   <li>Similar static convenience method in {@link Names}.</li>
 * </ul>
 *
 * <h2>Immutability and thread safety</h2>
 * This class is immutable and thus inherently thread-safe if the {@link NameSpace}, {@link CharSequence} and
 * {@link TypeName} arguments given to the constructor are also immutable. Subclasses shall make sure that any
 * overridden methods remain safe to call from multiple threads and do not change any public {@code MemberName}
 * state.
 *
 * @author  Guilhem Legal (Geomatys)
 * @version 0.5
 *
 * @see DefaultTypeName
 * @see DefaultNameFactory
 * @see DefaultRecordType
 *
 * @since 0.3
 * @module
 */
@XmlType(name = "MemberName_Type")
@XmlRootElement(name = "MemberName")
public class DefaultMemberName extends DefaultLocalName implements MemberName {
    /**
     * Serial number for inter-operability with different versions.
     */
    private static final long serialVersionUID = 7307683415489715298L;

    /**
     * The type of the data associated with the record member.
     */
    @XmlElement(required = true)
    private final TypeName attributeType;

    /**
     * Constructs a member name from the given character sequence and attribute type.
     *
     * @param scope          the scope of this name, or {@code null} for a global scope.
     * @param name           the local name (never {@code null}).
     * @param attributeType  the type of the data associated with the record member (can not be {@code null}).
     */
    protected DefaultMemberName(final NameSpace scope, final CharSequence name, final TypeName attributeType) {
        super(scope, name);
        ensureNonNull("attributeType", attributeType);
        this.attributeType = attributeType;
    }

    /**
     * Returns a SIS member name implementation with the values of the given arbitrary implementation.
     * This method performs the first applicable action in the following choices:
     *
     * <ul>
     *   <li>If the given object is {@code null}, then this method returns {@code null}.</li>
     *   <li>Otherwise if the given object is already an instance of {@code DefaultMemberName},
     *       then it is returned unchanged.</li>
     *   <li>Otherwise a new {@code DefaultMemberName} instance is created
     *       with the same values than the given name.</li>
     * </ul>
     *
     * @param  object  the object to get as a SIS implementation, or {@code null} if none.
     * @return a SIS implementation containing the values of the given object (may be the
     *         given object itself), or {@code null} if the argument was null.
     *
     * @since 0.5
     */
    public static DefaultMemberName castOrCopy(final MemberName object) {
        if (object == null || object instanceof DefaultMemberName) {
            return (DefaultMemberName) object;
        }
        return new DefaultMemberName(object.scope(), object.toInternationalString(), object.getAttributeType());
    }

    /**
     * Returns the type of the data associated with the record member.
     *
     * @return the type of the data associated with the record member.
     */
    @Override
    public TypeName getAttributeType() {
        return attributeType;
    }

    /**
     * Compares this member name with the specified object for equality.
     *
     * @param  object  the object to compare with this name for equality.
     * @return {@code true} if the given object is equal to this name.
     */
    @Override
    public boolean equals(final Object object) {
        return super.equals(object) && Objects.equals(attributeType, ((DefaultMemberName) object).attributeType);
    }

    /**
     * Invoked by {@link #hashCode()} for computing the hash code value when first needed.
     */
    @Override
    final int computeHashCode() {
        return super.computeHashCode() + Objects.hashCode(attributeType);
    }




    //////////////////////////////////////////////////////////////////////////////////////////////////
    ////////                                                                                  ////////
    ////////                               XML support with JAXB                              ////////
    ////////                                                                                  ////////
    ////////        The following methods are invoked by JAXB using reflection (even if       ////////
    ////////        they are private) or are helpers for other methods invoked by JAXB.       ////////
    ////////        Those methods can be safely removed if Geographic Markup Language         ////////
    ////////        (GML) support is not needed.                                              ////////
    ////////                                                                                  ////////
    //////////////////////////////////////////////////////////////////////////////////////////////////

    /**
     * Empty constructor to be used by JAXB only. Despite its "final" declaration,
     * the {@link #attributeType} field will be set by JAXB during unmarshalling.
     */
    private DefaultMemberName() {
        attributeType = null;
    }
}
