Trigger conversion to JSON earlier.
- Lazy evaluation of JSON Representation was
causing topology object outside readLock section,
triggering ConcurrentModificationException during CHO tests.
This patch forces evaluation while holding readLock.
Change-Id: I2d3cfde947c92246836a522ded77c11afec2df3a
diff --git a/src/main/java/net/onrc/onos/core/intent/runtime/web/ShortestPathResource.java b/src/main/java/net/onrc/onos/core/intent/runtime/web/ShortestPathResource.java
index 69e55d0..1abd61d 100644
--- a/src/main/java/net/onrc/onos/core/intent/runtime/web/ShortestPathResource.java
+++ b/src/main/java/net/onrc/onos/core/intent/runtime/web/ShortestPathResource.java
@@ -1,5 +1,6 @@
package net.onrc.onos.core.intent.runtime.web;
+import static net.onrc.onos.core.topology.web.TopologyResource.eval;
import java.util.LinkedList;
import java.util.List;
@@ -11,6 +12,7 @@
import net.onrc.onos.core.topology.Switch;
import net.onrc.onos.core.topology.Topology;
import net.onrc.onos.core.util.Dpid;
+
import org.restlet.representation.Representation;
import org.restlet.resource.Get;
import org.restlet.resource.ServerResource;
@@ -74,7 +76,7 @@
}
links.add(link);
}
- return toRepresentation(links, null);
+ return eval(toRepresentation(links, null));
} finally {
topology.releaseReadLock();
}
diff --git a/src/main/java/net/onrc/onos/core/topology/web/DevicesResource.java b/src/main/java/net/onrc/onos/core/topology/web/DevicesResource.java
index ccad694..ef5f4a3 100644
--- a/src/main/java/net/onrc/onos/core/topology/web/DevicesResource.java
+++ b/src/main/java/net/onrc/onos/core/topology/web/DevicesResource.java
@@ -1,5 +1,6 @@
package net.onrc.onos.core.topology.web;
+import static net.onrc.onos.core.topology.web.TopologyResource.eval;
import net.onrc.onos.core.topology.ITopologyService;
import net.onrc.onos.core.topology.Topology;
@@ -26,7 +27,7 @@
Topology topology = topologyService.getTopology();
topology.acquireReadLock();
try {
- return toRepresentation(topology.getDevices(), null);
+ return eval(toRepresentation(topology.getDevices(), null));
} finally {
topology.releaseReadLock();
}
diff --git a/src/main/java/net/onrc/onos/core/topology/web/LinksResource.java b/src/main/java/net/onrc/onos/core/topology/web/LinksResource.java
index 2cbf036..6d910a8 100644
--- a/src/main/java/net/onrc/onos/core/topology/web/LinksResource.java
+++ b/src/main/java/net/onrc/onos/core/topology/web/LinksResource.java
@@ -1,5 +1,6 @@
package net.onrc.onos.core.topology.web;
+import static net.onrc.onos.core.topology.web.TopologyResource.eval;
import net.onrc.onos.core.topology.ITopologyService;
import net.onrc.onos.core.topology.Topology;
@@ -26,7 +27,7 @@
Topology topology = topologyService.getTopology();
topology.acquireReadLock();
try {
- return toRepresentation(topology.getLinks(), null);
+ return eval(toRepresentation(topology.getLinks(), null));
} finally {
topology.releaseReadLock();
}
diff --git a/src/main/java/net/onrc/onos/core/topology/web/SwitchesResource.java b/src/main/java/net/onrc/onos/core/topology/web/SwitchesResource.java
index 1d4c9d6..dfb381e 100644
--- a/src/main/java/net/onrc/onos/core/topology/web/SwitchesResource.java
+++ b/src/main/java/net/onrc/onos/core/topology/web/SwitchesResource.java
@@ -1,5 +1,6 @@
package net.onrc.onos.core.topology.web;
+import static net.onrc.onos.core.topology.web.TopologyResource.eval;
import net.onrc.onos.core.topology.ITopologyService;
import net.onrc.onos.core.topology.Topology;
@@ -26,7 +27,7 @@
Topology topology = topologyService.getTopology();
topology.acquireReadLock();
try {
- return toRepresentation(topology.getSwitches(), null);
+ return eval(toRepresentation(topology.getSwitches(), null));
} finally {
topology.releaseReadLock();
}
diff --git a/src/main/java/net/onrc/onos/core/topology/web/TopologyResource.java b/src/main/java/net/onrc/onos/core/topology/web/TopologyResource.java
index c9476d0..8068552 100644
--- a/src/main/java/net/onrc/onos/core/topology/web/TopologyResource.java
+++ b/src/main/java/net/onrc/onos/core/topology/web/TopologyResource.java
@@ -3,6 +3,7 @@
import net.onrc.onos.core.topology.ITopologyService;
import net.onrc.onos.core.topology.Topology;
+import org.restlet.engine.io.BufferingRepresentation;
import org.restlet.representation.Representation;
import org.restlet.resource.Get;
import org.restlet.resource.ServerResource;
@@ -25,9 +26,23 @@
Topology topology = topologyService.getTopology();
topology.acquireReadLock();
try {
- return toRepresentation(topology, null);
+ return eval(toRepresentation(topology, null));
} finally {
topology.releaseReadLock();
}
}
+
+ /**
+ * Workaround code to trigger evaluation of Representation immediately.
+ *
+ * @param repr Representation to evaluate immediately
+ * @return Evaluated Representation
+ */
+ public static Representation eval(final Representation repr) {
+
+ BufferingRepresentation eval = new BufferingRepresentation(repr);
+ // trigger evaluation
+ eval.getSize();
+ return eval;
+ }
}