Application manages the IP layer topology information - Interfaces

Change-Id: Ie1dea035674ee98583e98a82cca7e33ab0858b92
diff --git a/apps/iptopology-api/src/main/java/org/onosproject/iptopology/api/device/DefaultIpDeviceDescription.java b/apps/iptopology-api/src/main/java/org/onosproject/iptopology/api/device/DefaultIpDeviceDescription.java
new file mode 100644
index 0000000..889e48a
--- /dev/null
+++ b/apps/iptopology-api/src/main/java/org/onosproject/iptopology/api/device/DefaultIpDeviceDescription.java
@@ -0,0 +1,117 @@
+/*
+ * Copyright 2014-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.device;
+
+import org.onosproject.iptopology.api.DeviceTed;
+import org.onosproject.iptopology.api.IpDeviceIdentifier;
+import org.onosproject.net.AbstractDescription;
+import org.onosproject.net.SparseAnnotations;
+
+import java.net.URI;
+
+import static com.google.common.base.MoreObjects.toStringHelper;
+import static com.google.common.base.Preconditions.checkNotNull;
+import static org.onosproject.iptopology.api.IpDevice.Type;
+
+/**
+ * Default implementation of immutable device description entity.
+ */
+public class DefaultIpDeviceDescription extends AbstractDescription
+        implements IpDeviceDescription {
+    private final URI uri;
+    private final Type type;
+    private final IpDeviceIdentifier deviceIdentifier;
+    private final DeviceTed deviceTed;
+
+    /**
+     * Creates an ip device description using the supplied information.
+     *
+     * @param uri               device URI
+     * @param type              device type
+     * @param deviceIdentifier  device manufacturer
+     * @param deviceTed         device Traffic Engineering parameters
+     * @param annotations  optional key/value annotations map
+     */
+    public DefaultIpDeviceDescription(URI uri, Type type, IpDeviceIdentifier deviceIdentifier,
+                                    DeviceTed deviceTed, SparseAnnotations... annotations) {
+        super(annotations);
+        this.uri = checkNotNull(uri, "Device URI cannot be null");
+        this.type = checkNotNull(type, "Device type cannot be null");
+        this.deviceIdentifier = deviceIdentifier;
+        this.deviceTed = deviceTed;
+    }
+
+    /**
+     * Creates an ip device description using the supplied information.
+     * @param base IpDeviceDescription to basic information
+     * @param annotations Annotations to use.
+     */
+    public DefaultIpDeviceDescription(IpDeviceDescription base, SparseAnnotations... annotations) {
+        this(base.deviceURI(), base.type(), base.deviceIdentifier(),
+             base.deviceTed(), annotations);
+    }
+
+    /**
+     * Creates an ip device description using the supplied information.
+     * @param base IpDeviceDescription to basic information (except for type)
+     * @param type device type
+     * @param annotations Annotations to use.
+     */
+    public DefaultIpDeviceDescription(IpDeviceDescription base, Type type, SparseAnnotations... annotations) {
+        this(base.deviceURI(), type, base.deviceIdentifier(),
+                base.deviceTed(), annotations);
+    }
+
+    @Override
+    public URI deviceURI() {
+        return uri;
+    }
+
+    @Override
+    public Type type() {
+        return type;
+    }
+
+    @Override
+    public IpDeviceIdentifier deviceIdentifier() {
+        return deviceIdentifier;
+    }
+
+    @Override
+    public DeviceTed deviceTed() {
+        return deviceTed;
+    }
+
+    @Override
+    public String toString() {
+        return toStringHelper(this)
+                .add("uri", uri)
+                .add("type", type)
+                .add("devid", deviceIdentifier)
+                .add("devTed", deviceTed)
+                .toString();
+    }
+
+    /**
+     * Default constructor for serialization.
+     */
+    private DefaultIpDeviceDescription() {
+        this.uri = null;
+        this.type = null;
+        this.deviceIdentifier = null;
+        this.deviceTed = null;
+    }
+}