/*
 * Copyright 2014 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.resource;

import java.util.Objects;

/**
 * Representation of MPLS label resource.
 */
public final class MplsLabel extends LinkResource {

    private final org.onlab.packet.MplsLabel mplsLabel;


    /**
     * Creates a new instance with given MPLS label.
     *
     * @param mplsLabel MPLS Label value to be assigned
     */
    public MplsLabel(int mplsLabel) {
        this.mplsLabel =  org.onlab.packet.MplsLabel.mplsLabel(mplsLabel);
    }

    /**
     * Creates a new instance with given MPLS label.
     *
     * @param mplsLabel mplsLabel value to be assigned
     * @return {@link MplsLabel} instance with given bandwidth
     */
    public static MplsLabel valueOf(int mplsLabel) {
        return new MplsLabel(mplsLabel);
    }

    /**
     * Returns MPLS Label as an MPLS Label Object.
     *
     * @return MPLS label as an MPLS Label Object.
     */
    public org.onlab.packet.MplsLabel label() {
        return mplsLabel;
    }

    @Override
    public boolean equals(Object obj) {
        if (obj instanceof MplsLabel) {
            MplsLabel that = (MplsLabel) obj;
            return Objects.equals(this.mplsLabel, that.mplsLabel);
        }
        return false;
    }

    @Override
    public int hashCode() {
        return Objects.hashCode(this.mplsLabel);
    }

    @Override
    public String toString() {
        return String.valueOf(this.mplsLabel);
    }
}
