Hook up the Intent and Flow REST APIs to the modules/services.

This involved some slight changes to the way the intent service is registered
with the Floodlight module framework. Also FlowManagerModule is now registered
in the services file.

Change-Id: I6a97599e625c385a07996e03236fe94af4705650
diff --git a/src/main/java/net/floodlightcontroller/restserver/CustomSerializerHelper.java b/src/main/java/net/floodlightcontroller/restserver/CustomSerializerHelper.java
index 9810563..8f99be0 100644
--- a/src/main/java/net/floodlightcontroller/restserver/CustomSerializerHelper.java
+++ b/src/main/java/net/floodlightcontroller/restserver/CustomSerializerHelper.java
@@ -24,7 +24,6 @@
  * used on the class in different contexts.
  */
 public class CustomSerializerHelper {
-    private final ObjectMapper mapper;
     private final SimpleModule customSerializerModule;
     private CustomSerializerFactory sf;
 
@@ -32,9 +31,7 @@
      * Constructor.
      */
     public CustomSerializerHelper() {
-        mapper = new ObjectMapper();
         customSerializerModule = new SimpleModule("custom-serializers", new Version(1, 0, 0, null));
-        mapper.registerModule(customSerializerModule);
         sf =  new CustomSerializerFactory();
     }
 
@@ -58,9 +55,12 @@
      * @return a representation with the custom serializers applied
      */
     public Representation applySerializers(JacksonRepresentation<?> jacksonRepresentation) {
+        ObjectMapper mapper = jacksonRepresentation.getObjectMapper();
+
         mapper.registerModule(customSerializerModule);
-        jacksonRepresentation.setObjectMapper(mapper);
         mapper.setSerializerFactory(sf);
+        jacksonRepresentation.setObjectMapper(mapper);
+
         return jacksonRepresentation;
     }
 }
diff --git a/src/main/java/net/onrc/onos/core/flowmanager/FlowManagerModule.java b/src/main/java/net/onrc/onos/core/flowmanager/FlowManagerModule.java
index 83092eb..b1bb067 100644
--- a/src/main/java/net/onrc/onos/core/flowmanager/FlowManagerModule.java
+++ b/src/main/java/net/onrc/onos/core/flowmanager/FlowManagerModule.java
@@ -11,6 +11,7 @@
 import net.floodlightcontroller.core.module.FloodlightModuleException;
 import net.floodlightcontroller.core.module.IFloodlightModule;
 import net.floodlightcontroller.core.module.IFloodlightService;
+import net.floodlightcontroller.restserver.IRestApiService;
 import net.onrc.onos.api.flowmanager.ConflictDetectionPolicy;
 import net.onrc.onos.api.flowmanager.Flow;
 import net.onrc.onos.api.flowmanager.FlowBatchHandle;
@@ -20,6 +21,7 @@
 import net.onrc.onos.api.flowmanager.FlowManagerFloodlightService;
 import net.onrc.onos.api.flowmanager.FlowManagerListener;
 import net.onrc.onos.core.datagrid.ISharedCollectionsService;
+import net.onrc.onos.core.flowmanager.web.FlowManagerWebRoutable;
 import net.onrc.onos.core.matchaction.MatchActionFloodlightService;
 import net.onrc.onos.core.matchaction.MatchActionService;
 import net.onrc.onos.core.registry.IControllerRegistryService;
@@ -43,6 +45,7 @@
     private FlowBatchMap flowBatchMap;
     private FlowEventDispatcher flowEventDispatcher;
     private FlowBatchOperationExecutor flowBatchOperationExecutor;
+    private IRestApiService restApi;
 
     @Override
     public Collection<Class<? extends IFloodlightService>> getModuleServices() {
@@ -65,7 +68,8 @@
         return Arrays.asList(
                 MatchActionFloodlightService.class,
                 ISharedCollectionsService.class,
-                IControllerRegistryService.class);
+                IControllerRegistryService.class,
+                IRestApiService.class);
     }
 
     @Override
@@ -73,6 +77,7 @@
         matchActionService = context.getServiceImpl(MatchActionFloodlightService.class);
         registryService = context.getServiceImpl(IControllerRegistryService.class);
         sharedCollectionService = context.getServiceImpl(ISharedCollectionsService.class);
+        restApi = context.getServiceImpl(IRestApiService.class);
     }
 
     @Override
@@ -91,6 +96,8 @@
         flowBatchOperationExecutor =
                 new FlowBatchOperationExecutor(matchActionService, flowMap, flowBatchMap);
         flowBatchOperationExecutor.start();
+
+        restApi.addRestletRoutable(new FlowManagerWebRoutable());
     }
 
     /**
diff --git a/src/main/java/net/onrc/onos/core/flowmanager/web/FlowManagerWebRoutable.java b/src/main/java/net/onrc/onos/core/flowmanager/web/FlowManagerWebRoutable.java
index e41b023..781b851 100644
--- a/src/main/java/net/onrc/onos/core/flowmanager/web/FlowManagerWebRoutable.java
+++ b/src/main/java/net/onrc/onos/core/flowmanager/web/FlowManagerWebRoutable.java
@@ -13,7 +13,7 @@
 
     @Override
     public Restlet getRestlet(Context context) {
-        Router router = new Router();
+        Router router = new Router(context);
         router.attach("", FlowResource.class);
         return router;
     }
diff --git a/src/main/java/net/onrc/onos/core/flowmanager/web/FlowResource.java b/src/main/java/net/onrc/onos/core/flowmanager/web/FlowResource.java
index 4079687..b1381e0 100644
--- a/src/main/java/net/onrc/onos/core/flowmanager/web/FlowResource.java
+++ b/src/main/java/net/onrc/onos/core/flowmanager/web/FlowResource.java
@@ -6,7 +6,7 @@
 import net.floodlightcontroller.restserver.CustomSerializerHelper;
 import net.onrc.onos.api.flowmanager.Flow;
 import net.onrc.onos.api.flowmanager.FlowId;
-import net.onrc.onos.api.flowmanager.FlowManagerService;
+import net.onrc.onos.api.flowmanager.FlowManagerFloodlightService;
 
 import org.codehaus.jackson.JsonGenerationException;
 import org.codehaus.jackson.JsonGenerator;
@@ -22,7 +22,7 @@
  */
 public class FlowResource extends ServerResource {
 
-    private final CustomSerializerHelper flowSerializers;
+    private CustomSerializerHelper flowSerializers;
 
     /**
      * Constructs a FlowResource.
@@ -49,13 +49,14 @@
      */
     @Get("json")
     public Representation retrieve() {
-        FlowManagerService flowService =
-                (FlowManagerService) getContext().getAttributes()
-                    .get(FlowManagerService.class.getCanonicalName());
+        FlowManagerFloodlightService flowService =
+                (FlowManagerFloodlightService) getContext().getAttributes()
+                    .get(FlowManagerFloodlightService.class.getCanonicalName());
 
         Collection<Flow> flows = flowService.getFlows();
 
         return flowSerializers.applySerializers(
                 (JacksonRepresentation<?>) toRepresentation(flows, null));
     }
+
 }
diff --git a/src/main/java/net/onrc/onos/core/newintent/IntentFloodlightModule.java b/src/main/java/net/onrc/onos/core/newintent/IntentFloodlightModule.java
index cf0e5e5..3ac9882 100644
--- a/src/main/java/net/onrc/onos/core/newintent/IntentFloodlightModule.java
+++ b/src/main/java/net/onrc/onos/core/newintent/IntentFloodlightModule.java
@@ -1,9 +1,17 @@
 package net.onrc.onos.core.newintent;
 
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collection;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.Set;
+
 import net.floodlightcontroller.core.module.FloodlightModuleContext;
 import net.floodlightcontroller.core.module.FloodlightModuleException;
 import net.floodlightcontroller.core.module.IFloodlightModule;
 import net.floodlightcontroller.core.module.IFloodlightService;
+import net.floodlightcontroller.restserver.IRestApiService;
 import net.onrc.onos.api.flowmanager.FlowId;
 import net.onrc.onos.api.flowmanager.FlowManagerFloodlightService;
 import net.onrc.onos.api.flowmanager.FlowManagerService;
@@ -21,18 +29,12 @@
 import net.onrc.onos.api.newintent.PathIntent;
 import net.onrc.onos.api.newintent.PointToPointIntent;
 import net.onrc.onos.core.datagrid.ISharedCollectionsService;
+import net.onrc.onos.core.newintent.web.IntentWebRoutable;
 import net.onrc.onos.core.registry.IControllerRegistryService;
 import net.onrc.onos.core.topology.ITopologyService;
 import net.onrc.onos.core.util.IdBlockAllocator;
 import net.onrc.onos.core.util.IdGenerator;
 
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.Collection;
-import java.util.HashMap;
-import java.util.Map;
-import java.util.Set;
-
 /**
  * A Floodlight module for Intent Service.
  */
@@ -49,7 +51,7 @@
     @Override
     public Map<Class<? extends IFloodlightService>, IFloodlightService> getServiceImpls() {
         Map<Class<? extends IFloodlightService>, IFloodlightService> impls = new HashMap<>();
-        impls.put(IFloodlightService.class, this);
+        impls.put(IntentFloodlightService.class, this);
         return impls;
     }
 
@@ -88,6 +90,9 @@
 
         registerDefaultCompilers(intentIdGenerator, flowIdGenerator, topologyService);
         registerDefaultInstallers(flowManagerService);
+
+        IRestApiService restApi = context.getServiceImpl(IRestApiService.class);
+        restApi.addRestletRoutable(new IntentWebRoutable());
     }
 
     private void registerDefaultCompilers(IdGenerator<IntentId> intentIdGenerator,
diff --git a/src/main/java/net/onrc/onos/core/newintent/web/IntentResource.java b/src/main/java/net/onrc/onos/core/newintent/web/IntentResource.java
index 4230298..b4cd133 100644
--- a/src/main/java/net/onrc/onos/core/newintent/web/IntentResource.java
+++ b/src/main/java/net/onrc/onos/core/newintent/web/IntentResource.java
@@ -5,8 +5,8 @@
 
 import net.floodlightcontroller.restserver.CustomSerializerHelper;
 import net.onrc.onos.api.newintent.Intent;
+import net.onrc.onos.api.newintent.IntentFloodlightService;
 import net.onrc.onos.api.newintent.IntentId;
-import net.onrc.onos.api.newintent.IntentService;
 
 import org.codehaus.jackson.JsonGenerator;
 import org.codehaus.jackson.JsonProcessingException;
@@ -50,9 +50,9 @@
      */
     @Get("json")
     public Representation retrieve() {
-        IntentService intentService =
-                (IntentService) getContext().getAttributes()
-                    .get(IntentService.class.getCanonicalName());
+        IntentFloodlightService intentService =
+                (IntentFloodlightService) getContext().getAttributes()
+                    .get(IntentFloodlightService.class.getCanonicalName());
 
         Set<Intent> intents = intentService.getIntents();
 
diff --git a/src/main/resources/META-INF/services/net.floodlightcontroller.core.module.IFloodlightModule b/src/main/resources/META-INF/services/net.floodlightcontroller.core.module.IFloodlightModule
index d4743ca..ac2f6a7 100644
--- a/src/main/resources/META-INF/services/net.floodlightcontroller.core.module.IFloodlightModule
+++ b/src/main/resources/META-INF/services/net.floodlightcontroller.core.module.IFloodlightModule
@@ -24,3 +24,4 @@
 net.onrc.onos.core.metrics.OnosMetricsModule
 net.onrc.onos.core.newintent.IntentFloodlightModule
 net.onrc.onos.core.matchaction.MatchActionModule
+net.onrc.onos.core.flowmanager.FlowManagerModule
diff --git a/src/test/java/net/onrc/onos/core/flowmanager/web/FlowResourceTest.java b/src/test/java/net/onrc/onos/core/flowmanager/web/FlowResourceTest.java
index 37f6f5a..b112aa6 100644
--- a/src/test/java/net/onrc/onos/core/flowmanager/web/FlowResourceTest.java
+++ b/src/test/java/net/onrc/onos/core/flowmanager/web/FlowResourceTest.java
@@ -20,7 +20,7 @@
 import net.onrc.onos.api.flowmanager.Flow;
 import net.onrc.onos.api.flowmanager.FlowId;
 import net.onrc.onos.api.flowmanager.FlowLink;
-import net.onrc.onos.api.flowmanager.FlowManagerService;
+import net.onrc.onos.api.flowmanager.FlowManagerFloodlightService;
 import net.onrc.onos.api.flowmanager.OpticalPathFlow;
 import net.onrc.onos.api.flowmanager.PacketPathFlow;
 import net.onrc.onos.api.flowmanager.Path;
@@ -53,13 +53,15 @@
         Set<Flow> flowSet = createFlows();
 
         // Create a mock flow manager service that will return the flows
-        FlowManagerService flowManager = createMock(FlowManagerService.class);
+        FlowManagerFloodlightService flowManager =
+                createMock(FlowManagerFloodlightService.class);
         expect(flowManager.getFlows()).andReturn(flowSet);
         replay(flowManager);
 
         // Inject the flow manager service into a Restlet context
         Map<String, Object> attributes = new HashMap<>();
-        attributes.put(FlowManagerService.class.getCanonicalName(), flowManager);
+        attributes.put(FlowManagerFloodlightService.class.getCanonicalName(),
+                flowManager);
         Context context = new Context();
         context.setAttributes(attributes);
 
@@ -87,8 +89,8 @@
 
         PacketPathFlow packetFlow = new PacketPathFlow(new FlowId(1L),
                 match, PortNumber.uint32(1), path,
-                Collections.<Action>singletonList(new ModifyDstMacAction(MACAddress.valueOf(4L))),
-                0, 0);
+                Collections.<Action>singletonList(
+                        new ModifyDstMacAction(MACAddress.valueOf(4L))), 0, 0);
 
         OpticalPathFlow opticalFlow = new OpticalPathFlow(new FlowId(2L),
                 PortNumber.uint32(3), path,
diff --git a/src/test/java/net/onrc/onos/core/newintent/web/IntentResourceTest.java b/src/test/java/net/onrc/onos/core/newintent/web/IntentResourceTest.java
index 74ba5c1..860b0e1 100644
--- a/src/test/java/net/onrc/onos/core/newintent/web/IntentResourceTest.java
+++ b/src/test/java/net/onrc/onos/core/newintent/web/IntentResourceTest.java
@@ -15,8 +15,8 @@
 
 import net.floodlightcontroller.util.MACAddress;
 import net.onrc.onos.api.newintent.Intent;
+import net.onrc.onos.api.newintent.IntentFloodlightService;
 import net.onrc.onos.api.newintent.IntentId;
-import net.onrc.onos.api.newintent.IntentService;
 import net.onrc.onos.api.newintent.MultiPointToSinglePointIntent;
 import net.onrc.onos.api.newintent.PointToPointIntent;
 import net.onrc.onos.core.matchaction.action.ModifyDstMacAction;
@@ -45,13 +45,14 @@
         Set<Intent> intentSet = createIntents();
 
         // Create a mock intent service that will return the intents
-        IntentService intentService = createMock(IntentService.class);
+        IntentFloodlightService intentService =
+                createMock(IntentFloodlightService.class);
         expect(intentService.getIntents()).andReturn(intentSet).anyTimes();
         replay(intentService);
 
         // Inject the intent service into a Restlet context
         Map<String, Object> attributes = new HashMap<>();
-        attributes.put(IntentService.class.getCanonicalName(), intentService);
+        attributes.put(IntentFloodlightService.class.getCanonicalName(), intentService);
         Context context = new Context();
         context.setAttributes(attributes);