/*
 * Copyright 2015 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.iptopology.api;

import static com.google.common.base.MoreObjects.toStringHelper;

import java.util.Objects;

/**
 * Domain Identifier(32 Bit).
 */
public class DomainId {
    private final int domainIdentifier;

    /**
     * Constructor to initialize domain identifier.
     *
     * @param domainIdentifier domain identifier
     */
    public DomainId(int domainIdentifier) {
        this.domainIdentifier = domainIdentifier;
    }

    /**
     * Obtain domain identifier.
     *
     * @return domain identifier
     */
    public int domainIdentifier() {
        return domainIdentifier;
    }

    @Override
    public int hashCode() {
        return Objects.hash(domainIdentifier);
    }

    @Override
    public boolean equals(Object obj) {
        if (this == obj) {
            return true;
        }

        if (obj instanceof DomainId) {
            DomainId other = (DomainId) obj;
            return Objects.equals(domainIdentifier, other.domainIdentifier);
        }
        return false;
    }

    @Override
    public String toString() {
        return toStringHelper(this)
                .add("domainIdentifier", domainIdentifier)
                .toString();
    }
}