/*
 * Copyright 2016 Open Networking Laboratory
 *
 * Licensed 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.onosproject.net.key;

import java.util.Objects;

import static com.google.common.base.Preconditions.checkNotNull;

/**
 * Device key Id definition.
 */
public final class DeviceKeyId {
    private final String identifier;

    /**
     * Constructor for serialization.
     */
    private DeviceKeyId() {
        this.identifier = null;
    }

    /**
     * Constructs the ID corresponding to a given string value.
     *
     * @param value the underlying value of this ID
     */
    private DeviceKeyId(String value) {
        this.identifier = checkNotNull(value, "Device Key Id cannot be null.");
    }

    /**
     * Static  method to construct a device key identifier.
     *
     * @param id for the device key identifier
     * @return device key identifier
     */
    public static final DeviceKeyId deviceKeyId(String id) {
        return new DeviceKeyId(id);
    }

    /**
     * Returns the identifier of the device key identifier.
     *
     * @return identifier
     */
    public String id() {
        return identifier;
    }

    /**
     * Returns the hashcode of the identifier.
     *
     * @return hashcode
     */
    @Override
    public int hashCode() {
        return identifier.hashCode();
    }

    /**
     * Compares two device key identifiers for equality.
     *
     * @param obj to compare against
     * @return true if the objects are equal, false otherwise.
     */
    @Override
    public boolean equals(Object obj) {
        if (this == obj) {
            return true;
        }
        if (obj instanceof DeviceKeyId) {
            final DeviceKeyId that = (DeviceKeyId) obj;
            return this.getClass() == that.getClass() &&
                    Objects.equals(this.identifier, that.identifier);
        }
        return false;
    }

    /**
     * Returns a string representation of a DeviceKeyId.
     *
     * @return string
     */
    public String toString() {
        return identifier;
    }
}
