/* * Copyright 2017-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.drivers.lisp.extensions; import com.google.common.collect.Maps; import org.onosproject.mapping.addresses.ExtensionMappingAddress; import org.onosproject.mapping.addresses.ExtensionMappingAddressType; import org.onosproject.mapping.addresses.MappingAddress; import org.onosproject.net.flow.AbstractExtension; import java.util.Map; import java.util.Objects; import static com.google.common.base.MoreObjects.toStringHelper; import static org.onosproject.mapping.addresses.ExtensionMappingAddressType .ExtensionMappingAddressTypes.GEO_COORDINATE_ADDRESS; /** * Implementation of LISP Geo Coordinate (GC) address. * If an ETR desires to send a Map-Reply describing the Geo Coordinates for each * locator in its locator-set, it can use the Geo Coordinate Type to convey * physical location information. */ public class LispGcAddress extends AbstractExtension implements ExtensionMappingAddress { private static final String NORTH = "north"; private static final String LATITUDE_DEGREE = "latitudeDegree"; private static final String LATITUDE_MINUTE = "latitudeMinute"; private static final String LATITUDE_SECOND = "latitudeSecond"; private static final String EAST = "east"; private static final String LONGITUDE_DEGREE = "longitudeDegree"; private static final String LONGITUDE_MINUTE = "longitudeMinute"; private static final String LONGITUDE_SECOND = "longitudeSecond"; private static final String ALTITUDE = "altitude"; private static final String ADDRESS = "address"; private boolean north; private short latitudeDegree; private byte latitudeMinute; private byte latitudeSecond; private boolean east; private short longitudeDegree; private byte longitudeMinute; private byte longitudeSecond; private int altitude; private MappingAddress address; /** * Default constructor. */ public LispGcAddress() { } /** * Creates an instance with initialized parameters. * * @param north north flag * @param latitudeDegree latitude degree * @param latitudeMinute latitude minute * @param latitudeSecond latitude second * @param east east flag * @param longitudeDegree longitude degree * @param longitudeMinute longitude minute * @param longitudeSecond longitude second * @param altitude altitude * @param address mapping address */ private LispGcAddress(boolean north, short latitudeDegree, byte latitudeMinute, byte latitudeSecond, boolean east, short longitudeDegree, byte longitudeMinute, byte longitudeSecond, int altitude, MappingAddress address) { this.north = north; this.latitudeDegree = latitudeDegree; this.latitudeMinute = latitudeMinute; this.latitudeSecond = latitudeSecond; this.east = east; this.longitudeDegree = longitudeDegree; this.longitudeMinute = longitudeMinute; this.longitudeSecond = longitudeSecond; this.altitude = altitude; this.address = address; } /** * Obtains north flag value. * * @return north flag value */ public boolean isNorth() { return north; } /** * Obtains latitude degree. * * @return latitude degree */ public short getLatitudeDegree() { return latitudeDegree; } /** * Obtains latitude minute. * * @return latitude minute */ public byte getLatitudeMinute() { return latitudeMinute; } /** * Obtains latitude second. * * @return latitude second */ public byte getLatitudeSecond() { return latitudeSecond; } /** * Obtains east flag value. * * @return east flag vlaue */ public boolean isEast() { return east; } /** * Obtains longitude degree. * * @return longitude degree */ public short getLongitudeDegree() { return longitudeDegree; } /** * Obtains longitude minute. * * @return longitude minute */ public byte getLongitudeMinute() { return longitudeMinute; } /** * Obtains longitude second. * * @return longitude second */ public byte getLongitudeSecond() { return longitudeSecond; } /** * Obtains altitude. * * @return altitude */ public int getAltitude() { return altitude; } /** * Obtains mapping address. * * @return mapping address */ public MappingAddress getAddress() { return address; } @Override public ExtensionMappingAddressType type() { return GEO_COORDINATE_ADDRESS.type(); } @Override public byte[] serialize() { Map<String, Object> parameterMap = Maps.newHashMap(); parameterMap.put(NORTH, north); parameterMap.put(LATITUDE_DEGREE, latitudeDegree); parameterMap.put(LATITUDE_MINUTE, latitudeMinute); parameterMap.put(LATITUDE_SECOND, latitudeSecond); parameterMap.put(EAST, east); parameterMap.put(LONGITUDE_DEGREE, longitudeDegree); parameterMap.put(LONGITUDE_MINUTE, longitudeMinute); parameterMap.put(LONGITUDE_SECOND, longitudeSecond); parameterMap.put(ALTITUDE, altitude); parameterMap.put(ADDRESS, address); return APP_KRYO.serialize(parameterMap); } @Override public void deserialize(byte[] data) { Map<String, Object> parameterMap = APP_KRYO.deserialize(data); this.north = (boolean) parameterMap.get(NORTH); this.latitudeDegree = (short) parameterMap.get(LATITUDE_DEGREE); this.latitudeMinute = (byte) parameterMap.get(LATITUDE_MINUTE); this.latitudeSecond = (byte) parameterMap.get(LATITUDE_SECOND); this.east = (boolean) parameterMap.get(EAST); this.longitudeDegree = (short) parameterMap.get(LONGITUDE_DEGREE); this.longitudeMinute = (byte) parameterMap.get(LONGITUDE_MINUTE); this.longitudeSecond = (byte) parameterMap.get(LONGITUDE_SECOND); this.altitude = (int) parameterMap.get(ALTITUDE); this.address = (MappingAddress) parameterMap.get(ADDRESS); } @Override public int hashCode() { return Objects.hash(north, latitudeDegree, latitudeMinute, latitudeSecond, east, longitudeDegree, longitudeMinute, longitudeSecond, altitude, address); } @Override public boolean equals(Object obj) { if (this == obj) { return true; } if (obj instanceof LispGcAddress) { final LispGcAddress other = (LispGcAddress) obj; return Objects.equals(this.north, other.north) && Objects.equals(this.latitudeDegree, other.latitudeDegree) && Objects.equals(this.latitudeMinute, other.latitudeMinute) && Objects.equals(this.latitudeSecond, other.latitudeSecond) && Objects.equals(this.east, other.east) && Objects.equals(this.longitudeDegree, other.longitudeDegree) && Objects.equals(this.longitudeMinute, other.longitudeMinute) && Objects.equals(this.longitudeSecond, other.longitudeSecond) && Objects.equals(this.altitude, other.altitude) && Objects.equals(this.address, other.address); } return false; } @Override public String toString() { return toStringHelper(type().toString()) .add("north", north) .add("latitude degree", latitudeDegree) .add("latitude minute", latitudeMinute) .add("latitude second", latitudeSecond) .add("east", east) .add("longitude degree", longitudeDegree) .add("longitude minute", longitudeMinute) .add("longitude second", longitudeSecond) .add("altitude", altitude) .add("address", address) .toString(); } /** * A builder for building LispGcAddress. */ public static final class Builder { private boolean north; private short latitudeDegree; private byte latitudeMinute; private byte latitudeSecond; private boolean east; private short longitudeDegree; private byte longitudeMinute; private byte longitudeSecond; private int altitude; private MappingAddress address; /** * Sets north flag value. * * @param north north flag value * @return Builder object */ public Builder withIsNorth(boolean north) { this.north = north; return this; } /** * Sets latitude degree. * * @param latitudeDegree latitude degree * @return Builder object */ public Builder withLatitudeDegree(short latitudeDegree) { this.latitudeDegree = latitudeDegree; return this; } /** * Sets latitude minute. * * @param latitudeMinute latitude minute * @return Builder object */ public Builder withLatitudeMinute(byte latitudeMinute) { this.latitudeMinute = latitudeMinute; return this; } /** * Sets latitude second. * * @param latitudeSecond latitude second * @return Builder object */ public Builder withLatitudeSecond(byte latitudeSecond) { this.latitudeSecond = latitudeSecond; return this; } /** * Sets east flag value. * * @param east east flag * @return Builder object */ public Builder withIsEast(boolean east) { this.east = east; return this; } /** * Sets longitude degree. * * @param longitudeDegree longitude degree * @return Builder object */ public Builder withLongitudeDegree(short longitudeDegree) { this.longitudeDegree = longitudeDegree; return this; } /** * Sets longitude minute. * * @param longitudeMinute longitude minute * @return Builder object */ public Builder withLongitudeMinute(byte longitudeMinute) { this.longitudeMinute = longitudeMinute; return this; } /** * Sets longitude second. * * @param longitudeSecond longitude second * @return Builder object */ public Builder withLongitudeSecond(byte longitudeSecond) { this.longitudeSecond = longitudeSecond; return this; } /** * Sets altitude. * * @param altitude altitude * @return Builder object */ public Builder withAltitude(int altitude) { this.altitude = altitude; return this; } /** * Sets mapping address. * * @param address mapping addres * @return Builder object */ public Builder withAddress(MappingAddress address) { this.address = address; return this; } /** * Builds LispGcAddress instance. * * @return LispGcAddress instance */ public LispGcAddress build() { return new LispGcAddress(north, latitudeDegree, latitudeMinute, latitudeSecond, east, longitudeDegree, longitudeMinute, longitudeSecond, altitude, address); } } }