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);
+ }
+}