All Downloads are FREE. Search and download functionalities are using the official Maven repository.

core.common.src.main.java.org.onosproject.codec.impl.PortCodec Maven / Gradle / Ivy

The newest version!
/*
 * Copyright 2015-present 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.codec.impl;

import com.fasterxml.jackson.databind.node.ObjectNode;

import org.onlab.packet.ChassisId;
import org.onosproject.codec.CodecContext;
import org.onosproject.net.Annotations;
import org.onosproject.net.DefaultAnnotations;
import org.onosproject.net.DefaultDevice;
import org.onosproject.net.DefaultPort;
import org.onosproject.net.Device;
import org.onosproject.net.DeviceId;
import org.onosproject.net.Port;
import org.onosproject.net.Port.Type;
import org.onosproject.net.PortNumber;
import org.onosproject.net.provider.ProviderId;

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

/**
 * Device port JSON codec.
 */
public final class PortCodec extends AnnotatedCodec {

    // JSON field names
    private static final String ELEMENT = "element"; // DeviceId
    private static final String PORT_NAME = "port";
    private static final String IS_ENABLED = "isEnabled";
    private static final String TYPE = "type";
    private static final String PORT_SPEED = "portSpeed";

    // Special port name alias
    private static final String PORT_NAME_LOCAL = "local";

    @Override
    public ObjectNode encode(Port port, CodecContext context) {
        checkNotNull(port, "Port cannot be null");
        ObjectNode result = context.mapper().createObjectNode()
                .put(ELEMENT, port.element().id().toString())
                .put(PORT_NAME, portName(port.number()))
                .put(IS_ENABLED, port.isEnabled())
                .put(TYPE, port.type().toString().toLowerCase())
                .put(PORT_SPEED, port.portSpeed());
        return annotate(result, port, context);
    }

    private String portName(PortNumber port) {
        return port.equals(PortNumber.LOCAL) ? PORT_NAME_LOCAL : port.toString();
    }

    private static PortNumber portNumber(String portName) {
        if (portName.equalsIgnoreCase(PORT_NAME_LOCAL)) {
            return PortNumber.LOCAL;
        }

        return PortNumber.portNumber(portName);
    }


    /**
     * {@inheritDoc}
     *
     * Note: Result of {@link Port#element()} returned Port object,
     *       is not a full Device object.
     *       Only it's DeviceId can be used.
     */
    @Override
    public Port decode(ObjectNode json, CodecContext context) {
        if (json == null || !json.isObject()) {
            return null;
        }

        DeviceId did = DeviceId.deviceId(json.get(ELEMENT).asText());
        Device device = new DummyDevice(did);
        PortNumber number = portNumber(json.get(PORT_NAME).asText());
        boolean isEnabled = json.get(IS_ENABLED).asBoolean();
        Type type = Type.valueOf(json.get(TYPE).asText().toUpperCase());
        long portSpeed = json.get(PORT_SPEED).asLong();
        Annotations annotations = extractAnnotations(json, context);

        return new DefaultPort(device, number, isEnabled, type, portSpeed, annotations);
    }


    /**
     * Dummy Device which only holds DeviceId.
     */
    private static final class DummyDevice extends DefaultDevice {
        /**
         * Constructs Dummy Device which only holds DeviceId.
         *
         * @param did device Id
         */
        public DummyDevice(DeviceId did) {
            super(new ProviderId(did.uri().getScheme(), "PortCodec"), did,
                  Type.SWITCH, "dummy", "0", "0", "0", new ChassisId(),
                  DefaultAnnotations.EMPTY);
        }
    }
}




© 2015 - 2024 Weber Informatics LLC | Privacy Policy