Thomas Vachuska
Committed by Gerrit Code Review

Implementing the UiLayoutManager.

Change-Id: I0a3424f7e3b13a3c18e668a5eed5151755bce4f9
......@@ -16,8 +16,9 @@
package org.onosproject.ui;
import org.onosproject.ui.model.topo.UiTopoLayout;
import org.onosproject.ui.model.topo.UiTopoLayoutId;
import java.util.List;
import java.util.Set;
/**
* Service for managing {@link UiTopoLayout} instances.
......@@ -25,20 +26,28 @@ import java.util.List;
public interface UiTopoLayoutService {
/**
* Returns the list of available layouts.
* Returns the set of available layouts.
*
* @return available layouts
* @return set of available layouts
*/
List<UiTopoLayout> getLayouts();
Set<UiTopoLayout> getLayouts();
/**
* Adds a layout to the system.
* Adds a layout to the system or updates an existing one.
*
* @param layout the layout to add
* @param layout the layout to add or update
* @return an indication of success
*/
boolean addLayout(UiTopoLayout layout);
/**
* Returns the layout with the specified identifier.
* @param layoutId layout identifier
* @return layout or null if no such layout is found
*/
UiTopoLayout getLayout(UiTopoLayoutId layoutId);
/**
* Removes a layout from the system.
*
......
......@@ -24,6 +24,37 @@ import org.onosproject.net.region.Region;
*/
public class UiTopoLayout {
private Region backingRegion;
private final UiTopoLayoutId id;
private final Region region;
/**
* Created a new UI topology layout.
*
* @param id layout identifier
* @param region backing region
*/
public UiTopoLayout(UiTopoLayoutId id, Region region) {
this.id = id;
this.region = region;
}
/**
* Returns the UI layout identifier.
*
* @return identifier of the layout
*/
public UiTopoLayoutId id() {
return id;
}
/**
* Returns the backing region with which this layout is associated.
*
* @return backing region
*/
public Region region() {
return region;
}
// TODO: additional properties pertinent to the layout
}
......
/*
* 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.model.topo;
import org.onlab.util.Identifier;
/**
* Identifier of a topology layout.
*/
public final class UiTopoLayoutId extends Identifier<String> {
// For serialization
private UiTopoLayoutId() {
}
private UiTopoLayoutId(String value) {
super(value);
}
/**
* Returns the layout identifier created from the specified value.
*
* @param value string value
* @return layout identifier
*/
public static UiTopoLayoutId layoutId(String value) {
return new UiTopoLayoutId(value);
}
}
......@@ -189,7 +189,6 @@ public class UiExtensionManager
@Deactivate
public void deactivate() {
prefs.removeListener(prefsListener);
prefs.destroy();
UiWebSocketServlet.closeAll();
unregister(core);
log.info("Stopped");
......
......@@ -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 @@ import java.util.List;
@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;
}
}
......
/*
* 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