/*
 * 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.ospf.protocol.lsa.subtypes;

import com.google.common.base.MoreObjects;

/**
 * Representation of an OSPF LSA link.
 */
public class OspfLsaLink {

    public String linkId;
    public String linkData;
    public int linkType;
    public int metric;
    public int tos;

    /**
     * Gets link id.
     *
     * @return link id
     */
    public String linkId() {
        return linkId;
    }

    /**
     * Sets link id.
     *
     * @param linkId link id
     */
    public void setLinkId(String linkId) {
        this.linkId = linkId;
    }

    /**
     * Gets link data.
     *
     * @return link data
     */
    public String linkData() {
        return linkData;
    }

    /**
     * Sets link data.
     *
     * @param linkData link data
     */
    public void setLinkData(String linkData) {
        this.linkData = linkData;
    }

    /**
     * Gets link type.
     *
     * @return link type
     */
    public int linkType() {
        return linkType;
    }

    /**
     * Sets link type.
     *
     * @param linkType link type
     */
    public void setLinkType(int linkType) {
        this.linkType = linkType;
    }

    /**
     * Gets metric value.
     *
     * @return metric.
     */
    public int metric() {
        return metric;
    }

    /**
     * Sets metric value.
     *
     * @param metric metric
     */
    public void setMetric(int metric) {
        this.metric = metric;
    }

    /**
     * Gets tos.
     *
     * @return tos
     */
    public int tos() {
        return tos;
    }

    /**
     * Sets tos.
     *
     * @param tos tos
     */
    public void setTos(int tos) {
        this.tos = tos;
    }

    @Override
    public String toString() {
        return MoreObjects.toStringHelper(getClass())
                .omitNullValues()
                .add("linkID", linkId)
                .add("linkData", linkData)
                .add("linkType", linkType)
                .add("metric", metric)
                .add("tos", tos)
                .toString();
    }
}