Implementing the UiLayoutManager.

Change-Id: I0a3424f7e3b13a3c18e668a5eed5151755bce4f9
diff --git a/web/gui/src/main/java/org/onosproject/ui/impl/UiExtensionManager.java b/web/gui/src/main/java/org/onosproject/ui/impl/UiExtensionManager.java
index ed9eead..3488707 100644
--- a/web/gui/src/main/java/org/onosproject/ui/impl/UiExtensionManager.java
+++ b/web/gui/src/main/java/org/onosproject/ui/impl/UiExtensionManager.java
@@ -189,7 +189,6 @@
     @Deactivate
     public void deactivate() {
         prefs.removeListener(prefsListener);
-        prefs.destroy();
         UiWebSocketServlet.closeAll();
         unregister(core);
         log.info("Stopped");
diff --git a/web/gui/src/main/java/org/onosproject/ui/impl/topo/UiTopoLayoutManager.java b/web/gui/src/main/java/org/onosproject/ui/impl/topo/UiTopoLayoutManager.java
index a8959df..bc58121 100644
--- a/web/gui/src/main/java/org/onosproject/ui/impl/topo/UiTopoLayoutManager.java
+++ b/web/gui/src/main/java/org/onosproject/ui/impl/topo/UiTopoLayoutManager.java
@@ -16,16 +16,26 @@
 
 package org.onosproject.ui.impl.topo;
 
+import com.google.common.collect.ImmutableSet;
 import org.apache.felix.scr.annotations.Activate;
 import org.apache.felix.scr.annotations.Component;
 import org.apache.felix.scr.annotations.Deactivate;
+import org.apache.felix.scr.annotations.Reference;
+import org.apache.felix.scr.annotations.ReferenceCardinality;
 import org.apache.felix.scr.annotations.Service;
+import org.onlab.util.KryoNamespace;
+import org.onosproject.store.serializers.KryoNamespaces;
+import org.onosproject.store.service.ConsistentMap;
+import org.onosproject.store.service.Serializer;
+import org.onosproject.store.service.StorageService;
 import org.onosproject.ui.UiTopoLayoutService;
 import org.onosproject.ui.model.topo.UiTopoLayout;
+import org.onosproject.ui.model.topo.UiTopoLayoutId;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-import java.util.List;
+import java.util.Map;
+import java.util.Set;
 
 /**
  * Manages the user interface topology layouts.
@@ -35,39 +45,54 @@
 @Service
 public class UiTopoLayoutManager implements UiTopoLayoutService {
 
-//    private static final ClassLoader CL =
-//            UiTopoLayoutManager.class.getClassLoader();
-
     private final Logger log = LoggerFactory.getLogger(getClass());
 
+    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    protected StorageService storageService;
+
+    private ConsistentMap<UiTopoLayoutId, UiTopoLayout> layouts;
+    private Map<UiTopoLayoutId, UiTopoLayout> layoutMap;
+
     @Activate
     public void activate() {
-        // TODO: implement starting stuff
+        KryoNamespace.Builder kryoBuilder = new KryoNamespace.Builder()
+                .register(KryoNamespaces.API)
+                .register(UiTopoLayout.class);
+
+        layouts = storageService.<UiTopoLayoutId, UiTopoLayout>consistentMapBuilder()
+                .withSerializer(Serializer.using(kryoBuilder.build()))
+                .withName("onos-topo-layouts")
+                .withRelaxedReadConsistency()
+                .build();
+        layoutMap = layouts.asJavaMap();
+
         log.info("Started");
     }
 
     @Deactivate
     public void deactivate() {
-        // TODO: implement stopping stuff
         log.info("Stopped");
     }
 
 
     @Override
-    public List<UiTopoLayout> getLayouts() {
-        // TODO: implement
-        return null;
+    public Set<UiTopoLayout> getLayouts() {
+        return ImmutableSet.copyOf(layoutMap.values());
     }
 
     @Override
     public boolean addLayout(UiTopoLayout layout) {
-        // TODO: implement
-        return false;
+        return layouts.put(layout.id(), layout) == null;
+    }
+
+    @Override
+    public UiTopoLayout getLayout(UiTopoLayoutId layoutId) {
+        return layoutMap.get(layoutId);
     }
 
     @Override
     public boolean removeLayout(UiTopoLayout layout) {
-        // TODO: implement
-        return false;
+        return layouts.remove(layout.id()) != null;
     }
+
 }
diff --git a/web/gui/src/test/java/org/onosproject/ui/impl/topo/UiTopoLayoutManagerTest.java b/web/gui/src/test/java/org/onosproject/ui/impl/topo/UiTopoLayoutManagerTest.java
new file mode 100644
index 0000000..c58e1a2
--- /dev/null
+++ b/web/gui/src/test/java/org/onosproject/ui/impl/topo/UiTopoLayoutManagerTest.java
@@ -0,0 +1,78 @@
+/*
+ * Copyright 2016 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.ui.impl.topo;
+
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+import org.onosproject.net.region.DefaultRegion;
+import org.onosproject.net.region.Region;
+import org.onosproject.net.region.RegionId;
+import org.onosproject.store.service.TestStorageService;
+import org.onosproject.ui.UiTopoLayoutService;
+import org.onosproject.ui.model.topo.UiTopoLayout;
+import org.onosproject.ui.model.topo.UiTopoLayoutId;
+
+import static org.junit.Assert.*;
+
+/**
+ * Suite of unit tests for the UI topology layout manager.
+ */
+public class UiTopoLayoutManagerTest {
+
+    private UiTopoLayoutService svc;
+    private UiTopoLayoutManager mgr;
+
+    private static final UiTopoLayout L1 =
+            new UiTopoLayout(UiTopoLayoutId.layoutId("l1"),
+                             new DefaultRegion(RegionId.regionId("r1"), "R1",
+                                               Region.Type.CAMPUS, null));
+    private static final UiTopoLayout L2 =
+            new UiTopoLayout(UiTopoLayoutId.layoutId("l2"),
+                             new DefaultRegion(RegionId.regionId("r2"), "R2",
+                                               Region.Type.CAMPUS, null));
+
+    @Before
+    public void setUp() {
+        mgr = new UiTopoLayoutManager();
+        svc = mgr;
+        mgr.storageService = new TestStorageService();
+        mgr.activate();
+    }
+
+    @After
+    public void tearDown() {
+        mgr.deactivate();
+        mgr.storageService = null;
+    }
+
+    @Test
+    public void basics() {
+        assertTrue("should be no layout", svc.getLayouts().isEmpty());
+        svc.addLayout(L1);
+        svc.addLayout(L2);
+        assertEquals("incorrect number of layouts", 2, svc.getLayouts().size());
+        assertEquals("incorrect layout", L1.id(), svc.getLayout(L1.id()).id());
+        assertEquals("incorrect layout", L2.id(), svc.getLayout(L2.id()).id());
+        svc.removeLayout(L1);
+        assertEquals("incorrect number of layouts", 1, svc.getLayouts().size());
+        assertNull("layout should be gone", svc.getLayout(L1.id()));
+        assertEquals("incorrect layout", L2.id(), svc.getLayout(L2.id()).id());
+    }
+
+
+}
\ No newline at end of file