Make JSON codecs immutable

The contract for JSON codecs requires that they have no
local context.  Make them all immutable, and test that they
stay immutable.

Change-Id: Ia3930b844ede231940da05699f5f08605f946e0c
diff --git a/web/api/src/main/java/org/onosproject/codec/impl/AnnotationsCodec.java b/web/api/src/main/java/org/onosproject/codec/impl/AnnotationsCodec.java
index 73590e7..5516f23 100644
--- a/web/api/src/main/java/org/onosproject/codec/impl/AnnotationsCodec.java
+++ b/web/api/src/main/java/org/onosproject/codec/impl/AnnotationsCodec.java
@@ -23,7 +23,7 @@
 /**
  * Annotations JSON codec.
  */
-public class AnnotationsCodec extends JsonCodec<Annotations> {
+public final class AnnotationsCodec extends JsonCodec<Annotations> {
 
     @Override
     public ObjectNode encode(Annotations annotations, CodecContext context) {
diff --git a/web/api/src/main/java/org/onosproject/codec/impl/ApplicationCodec.java b/web/api/src/main/java/org/onosproject/codec/impl/ApplicationCodec.java
index 4cf0b7c..7a148de 100644
--- a/web/api/src/main/java/org/onosproject/codec/impl/ApplicationCodec.java
+++ b/web/api/src/main/java/org/onosproject/codec/impl/ApplicationCodec.java
@@ -26,7 +26,7 @@
 /**
  * Application JSON codec.
  */
-public class ApplicationCodec extends JsonCodec<Application> {
+public final class ApplicationCodec extends JsonCodec<Application> {
 
     @Override
     public ObjectNode encode(Application app, CodecContext context) {
diff --git a/web/api/src/main/java/org/onosproject/codec/impl/ConnectPointCodec.java b/web/api/src/main/java/org/onosproject/codec/impl/ConnectPointCodec.java
index 74349db..7d12308 100644
--- a/web/api/src/main/java/org/onosproject/codec/impl/ConnectPointCodec.java
+++ b/web/api/src/main/java/org/onosproject/codec/impl/ConnectPointCodec.java
@@ -27,7 +27,7 @@
 /**
  * Connection point JSON codec.
  */
-public class ConnectPointCodec extends JsonCodec<ConnectPoint> {
+public final class ConnectPointCodec extends JsonCodec<ConnectPoint> {
 
     @Override
     public ObjectNode encode(ConnectPoint point, CodecContext context) {
diff --git a/web/api/src/main/java/org/onosproject/codec/impl/ConnectivityIntentCodec.java b/web/api/src/main/java/org/onosproject/codec/impl/ConnectivityIntentCodec.java
index 0591562..ac7ae53 100644
--- a/web/api/src/main/java/org/onosproject/codec/impl/ConnectivityIntentCodec.java
+++ b/web/api/src/main/java/org/onosproject/codec/impl/ConnectivityIntentCodec.java
@@ -31,7 +31,7 @@
 /**
  * Connectivity intent codec.
  */
-public class ConnectivityIntentCodec extends JsonCodec<ConnectivityIntent> {
+public final class ConnectivityIntentCodec extends JsonCodec<ConnectivityIntent> {
 
     @Override
     public ObjectNode encode(ConnectivityIntent intent, CodecContext context) {
diff --git a/web/api/src/main/java/org/onosproject/codec/impl/ConstraintCodec.java b/web/api/src/main/java/org/onosproject/codec/impl/ConstraintCodec.java
index 4d60ea9..dd9563c 100644
--- a/web/api/src/main/java/org/onosproject/codec/impl/ConstraintCodec.java
+++ b/web/api/src/main/java/org/onosproject/codec/impl/ConstraintCodec.java
@@ -36,7 +36,7 @@
 /**
  * Constraint JSON codec.
  */
-public class ConstraintCodec extends JsonCodec<Constraint> {
+public final class ConstraintCodec extends JsonCodec<Constraint> {
 
     /**
      * Encodes a latency constraint.
diff --git a/web/api/src/main/java/org/onosproject/codec/impl/CriterionCodec.java b/web/api/src/main/java/org/onosproject/codec/impl/CriterionCodec.java
index 0905432..9d714b0 100644
--- a/web/api/src/main/java/org/onosproject/codec/impl/CriterionCodec.java
+++ b/web/api/src/main/java/org/onosproject/codec/impl/CriterionCodec.java
@@ -29,7 +29,7 @@
 /**
  * Criterion codec.
  */
-public class CriterionCodec extends JsonCodec<Criterion> {
+public final class CriterionCodec extends JsonCodec<Criterion> {
 
     protected static final Logger log = LoggerFactory.getLogger(CriterionCodec.class);
 
diff --git a/web/api/src/main/java/org/onosproject/codec/impl/DeviceCodec.java b/web/api/src/main/java/org/onosproject/codec/impl/DeviceCodec.java
index d790960..fcb720c 100644
--- a/web/api/src/main/java/org/onosproject/codec/impl/DeviceCodec.java
+++ b/web/api/src/main/java/org/onosproject/codec/impl/DeviceCodec.java
@@ -25,7 +25,7 @@
 /**
  * Device JSON codec.
  */
-public class DeviceCodec extends AnnotatedCodec<Device> {
+public final class DeviceCodec extends AnnotatedCodec<Device> {
 
     @Override
     public ObjectNode encode(Device device, CodecContext context) {
diff --git a/web/api/src/main/java/org/onosproject/codec/impl/EthernetCodec.java b/web/api/src/main/java/org/onosproject/codec/impl/EthernetCodec.java
index c426a46..f56bca4 100644
--- a/web/api/src/main/java/org/onosproject/codec/impl/EthernetCodec.java
+++ b/web/api/src/main/java/org/onosproject/codec/impl/EthernetCodec.java
@@ -28,7 +28,7 @@
 /**
  * Ethernet codec.
  */
-public class EthernetCodec extends JsonCodec<Ethernet> {
+public final class EthernetCodec extends JsonCodec<Ethernet> {
 
     protected static final Logger log = LoggerFactory.getLogger(CriterionCodec.class);
 
diff --git a/web/api/src/main/java/org/onosproject/codec/impl/FlowEntryCodec.java b/web/api/src/main/java/org/onosproject/codec/impl/FlowEntryCodec.java
index 46d6180..11189f0 100644
--- a/web/api/src/main/java/org/onosproject/codec/impl/FlowEntryCodec.java
+++ b/web/api/src/main/java/org/onosproject/codec/impl/FlowEntryCodec.java
@@ -28,7 +28,7 @@
 /**
  * Flow entry JSON codec.
  */
-public class FlowEntryCodec extends JsonCodec<FlowEntry> {
+public final class FlowEntryCodec extends JsonCodec<FlowEntry> {
 
     @Override
     public ObjectNode encode(FlowEntry flowEntry, CodecContext context) {
diff --git a/web/api/src/main/java/org/onosproject/codec/impl/HostCodec.java b/web/api/src/main/java/org/onosproject/codec/impl/HostCodec.java
index 843e030..ead7171 100644
--- a/web/api/src/main/java/org/onosproject/codec/impl/HostCodec.java
+++ b/web/api/src/main/java/org/onosproject/codec/impl/HostCodec.java
@@ -29,7 +29,7 @@
 /**
  * Host JSON codec.
  */
-public class HostCodec extends AnnotatedCodec<Host> {
+public final class HostCodec extends AnnotatedCodec<Host> {
 
     @Override
     public ObjectNode encode(Host host, CodecContext context) {
diff --git a/web/api/src/main/java/org/onosproject/codec/impl/HostLocationCodec.java b/web/api/src/main/java/org/onosproject/codec/impl/HostLocationCodec.java
index 133a18b..3210408 100644
--- a/web/api/src/main/java/org/onosproject/codec/impl/HostLocationCodec.java
+++ b/web/api/src/main/java/org/onosproject/codec/impl/HostLocationCodec.java
@@ -26,7 +26,7 @@
 /**
  * Host JSON codec.
  */
-public class HostLocationCodec extends JsonCodec<HostLocation> {
+public final class HostLocationCodec extends JsonCodec<HostLocation> {
 
     @Override
     public ObjectNode encode(HostLocation hostLocation, CodecContext context) {
diff --git a/web/api/src/main/java/org/onosproject/codec/impl/HostToHostIntentCodec.java b/web/api/src/main/java/org/onosproject/codec/impl/HostToHostIntentCodec.java
index f69d10f..59ceb2b 100644
--- a/web/api/src/main/java/org/onosproject/codec/impl/HostToHostIntentCodec.java
+++ b/web/api/src/main/java/org/onosproject/codec/impl/HostToHostIntentCodec.java
@@ -27,7 +27,7 @@
 /**
  * Host to host intent codec.
  */
-public class HostToHostIntentCodec extends JsonCodec<HostToHostIntent> {
+public final class HostToHostIntentCodec extends JsonCodec<HostToHostIntent> {
 
     @Override
     public ObjectNode encode(HostToHostIntent intent, CodecContext context) {
diff --git a/web/api/src/main/java/org/onosproject/codec/impl/InstructionCodec.java b/web/api/src/main/java/org/onosproject/codec/impl/InstructionCodec.java
index 29d1ad7..57f95bd 100644
--- a/web/api/src/main/java/org/onosproject/codec/impl/InstructionCodec.java
+++ b/web/api/src/main/java/org/onosproject/codec/impl/InstructionCodec.java
@@ -33,7 +33,7 @@
 /**
  * Instruction codec.
  */
-public class InstructionCodec extends JsonCodec<Instruction> {
+public final class InstructionCodec extends JsonCodec<Instruction> {
 
     protected static final Logger log = LoggerFactory.getLogger(InstructionCodec.class);
 
diff --git a/web/api/src/main/java/org/onosproject/codec/impl/IntentCodec.java b/web/api/src/main/java/org/onosproject/codec/impl/IntentCodec.java
index a03acfc..68a4eb1 100644
--- a/web/api/src/main/java/org/onosproject/codec/impl/IntentCodec.java
+++ b/web/api/src/main/java/org/onosproject/codec/impl/IntentCodec.java
@@ -28,7 +28,7 @@
 /**
  * Intent JSON codec.
  */
-public class IntentCodec extends JsonCodec<Intent> {
+public final class IntentCodec extends JsonCodec<Intent> {
 
     @Override
     public ObjectNode encode(Intent intent, CodecContext context) {
diff --git a/web/api/src/main/java/org/onosproject/codec/impl/LinkCodec.java b/web/api/src/main/java/org/onosproject/codec/impl/LinkCodec.java
index 55a50d3..84018b8 100644
--- a/web/api/src/main/java/org/onosproject/codec/impl/LinkCodec.java
+++ b/web/api/src/main/java/org/onosproject/codec/impl/LinkCodec.java
@@ -27,7 +27,7 @@
 /**
  * Link JSON codec.
  */
-public class LinkCodec extends AnnotatedCodec<Link> {
+public final class LinkCodec extends AnnotatedCodec<Link> {
 
     @Override
     public ObjectNode encode(Link link, CodecContext context) {
diff --git a/web/api/src/main/java/org/onosproject/codec/impl/PathCodec.java b/web/api/src/main/java/org/onosproject/codec/impl/PathCodec.java
index 40530e4..58b4852 100644
--- a/web/api/src/main/java/org/onosproject/codec/impl/PathCodec.java
+++ b/web/api/src/main/java/org/onosproject/codec/impl/PathCodec.java
@@ -28,7 +28,7 @@
 /**
  * Path JSON codec.
  */
-public class PathCodec extends AnnotatedCodec<Path> {
+public final class PathCodec extends AnnotatedCodec<Path> {
     @Override
     public ObjectNode encode(Path path, CodecContext context) {
         checkNotNull(path, "Path cannot be null");
diff --git a/web/api/src/main/java/org/onosproject/codec/impl/PointToPointIntentCodec.java b/web/api/src/main/java/org/onosproject/codec/impl/PointToPointIntentCodec.java
index a009de5..45f2f3d 100644
--- a/web/api/src/main/java/org/onosproject/codec/impl/PointToPointIntentCodec.java
+++ b/web/api/src/main/java/org/onosproject/codec/impl/PointToPointIntentCodec.java
@@ -28,7 +28,7 @@
 /**
  * Point to point intent codec.
  */
-public class PointToPointIntentCodec extends JsonCodec<PointToPointIntent> {
+public final class PointToPointIntentCodec extends JsonCodec<PointToPointIntent> {
 
     @Override
     public ObjectNode encode(PointToPointIntent intent, CodecContext context) {
diff --git a/web/api/src/main/java/org/onosproject/codec/impl/PortCodec.java b/web/api/src/main/java/org/onosproject/codec/impl/PortCodec.java
index f517cd6..fb15a45 100644
--- a/web/api/src/main/java/org/onosproject/codec/impl/PortCodec.java
+++ b/web/api/src/main/java/org/onosproject/codec/impl/PortCodec.java
@@ -25,7 +25,7 @@
 /**
  * Device port JSON codec.
  */
-public class PortCodec extends AnnotatedCodec<Port> {
+public final class PortCodec extends AnnotatedCodec<Port> {
 
     @Override
     public ObjectNode encode(Port port, CodecContext context) {
diff --git a/web/api/src/main/java/org/onosproject/codec/impl/TopologyClusterCodec.java b/web/api/src/main/java/org/onosproject/codec/impl/TopologyClusterCodec.java
index 4ab5dcd..dc4c79a 100644
--- a/web/api/src/main/java/org/onosproject/codec/impl/TopologyClusterCodec.java
+++ b/web/api/src/main/java/org/onosproject/codec/impl/TopologyClusterCodec.java
@@ -26,7 +26,7 @@
 /**
  * Topology cluster JSON codec.
  */
-public class TopologyClusterCodec extends JsonCodec<TopologyCluster> {
+public final class TopologyClusterCodec extends JsonCodec<TopologyCluster> {
 
     @Override
     public ObjectNode encode(TopologyCluster cluster, CodecContext context) {
diff --git a/web/api/src/main/java/org/onosproject/codec/impl/TopologyCodec.java b/web/api/src/main/java/org/onosproject/codec/impl/TopologyCodec.java
index 9ea6b0c..f6529eb 100644
--- a/web/api/src/main/java/org/onosproject/codec/impl/TopologyCodec.java
+++ b/web/api/src/main/java/org/onosproject/codec/impl/TopologyCodec.java
@@ -26,7 +26,7 @@
 /**
  * Topology JSON codec.
  */
-public class TopologyCodec extends JsonCodec<Topology> {
+public final class TopologyCodec extends JsonCodec<Topology> {
 
     @Override
     public ObjectNode encode(Topology topology, CodecContext context) {
diff --git a/web/api/src/main/java/org/onosproject/codec/impl/TrafficSelectorCodec.java b/web/api/src/main/java/org/onosproject/codec/impl/TrafficSelectorCodec.java
index 2b757ca..2228547 100644
--- a/web/api/src/main/java/org/onosproject/codec/impl/TrafficSelectorCodec.java
+++ b/web/api/src/main/java/org/onosproject/codec/impl/TrafficSelectorCodec.java
@@ -28,7 +28,7 @@
 /**
  * Traffic selector codec.
  */
-public class TrafficSelectorCodec extends JsonCodec<TrafficSelector> {
+public final class TrafficSelectorCodec extends JsonCodec<TrafficSelector> {
     @Override
     public ObjectNode encode(TrafficSelector selector, CodecContext context) {
         checkNotNull(selector, "Traffic selector cannot be null");
diff --git a/web/api/src/main/java/org/onosproject/codec/impl/TrafficTreatmentCodec.java b/web/api/src/main/java/org/onosproject/codec/impl/TrafficTreatmentCodec.java
index ba804d1..786c461 100644
--- a/web/api/src/main/java/org/onosproject/codec/impl/TrafficTreatmentCodec.java
+++ b/web/api/src/main/java/org/onosproject/codec/impl/TrafficTreatmentCodec.java
@@ -28,7 +28,7 @@
 /**
  * Traffic treatment codec.
  */
-public class TrafficTreatmentCodec extends JsonCodec<TrafficTreatment> {
+public final class TrafficTreatmentCodec extends JsonCodec<TrafficTreatment> {
     @Override
     public ObjectNode encode(TrafficTreatment treatment, CodecContext context) {
         checkNotNull(treatment, "Traffic treatment cannot be null");
diff --git a/web/api/src/test/java/org/onosproject/codec/impl/ImmutableCodecsTest.java b/web/api/src/test/java/org/onosproject/codec/impl/ImmutableCodecsTest.java
new file mode 100644
index 0000000..f0fb070
--- /dev/null
+++ b/web/api/src/test/java/org/onosproject/codec/impl/ImmutableCodecsTest.java
@@ -0,0 +1,58 @@
+/*
+ * Copyright 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.codec.impl;
+
+import org.junit.Test;
+import static org.onlab.junit.ImmutableClassChecker.assertThatClassIsImmutable;
+import static org.onlab.junit.ImmutableClassChecker.assertThatClassIsImmutableBaseClass;
+
+/**
+ * Tests to assure that the codec classes follow the contract of having
+ * no local context.
+ */
+public class ImmutableCodecsTest {
+
+    /**
+     * Checks that the codec classes adhere to the contract that there cannot
+     * be any local context in a codec.
+     */
+    @Test
+    public void checkImmutability() {
+        assertThatClassIsImmutableBaseClass(AnnotatedCodec.class);
+        assertThatClassIsImmutable(AnnotationsCodec.class);
+        assertThatClassIsImmutable(ApplicationCodec.class);
+        assertThatClassIsImmutable(ConnectivityIntentCodec.class);
+        assertThatClassIsImmutable(ConnectPointCodec.class);
+        assertThatClassIsImmutable(ConstraintCodec.class);
+        assertThatClassIsImmutable(CriterionCodec.class);
+        assertThatClassIsImmutable(DeviceCodec.class);
+        assertThatClassIsImmutable(EthernetCodec.class);
+        assertThatClassIsImmutable(FlowEntryCodec.class);
+        assertThatClassIsImmutable(HostCodec.class);
+        assertThatClassIsImmutable(HostLocationCodec.class);
+        assertThatClassIsImmutable(HostToHostIntentCodec.class);
+        assertThatClassIsImmutable(InstructionCodec.class);
+        assertThatClassIsImmutable(IntentCodec.class);
+        assertThatClassIsImmutable(LinkCodec.class);
+        assertThatClassIsImmutable(PathCodec.class);
+        assertThatClassIsImmutable(PointToPointIntentCodec.class);
+        assertThatClassIsImmutable(PortCodec.class);
+        assertThatClassIsImmutable(TopologyClusterCodec.class);
+        assertThatClassIsImmutable(TopologyCodec.class);
+        assertThatClassIsImmutable(TrafficSelectorCodec.class);
+        assertThatClassIsImmutable(TrafficTreatmentCodec.class);
+    }
+}