xsi:noNamespaceSchemaLocation="http://enunciate.codehaus.org/schemas/enunciate-1.26.xsd">
<services>
- <rest defaultRestSubcontext="/one/nb/v2/flow"/>
+ <rest defaultRestSubcontext="/controller/nb/v2/flow"/>
</services>
<modules>
</Import-Package>
<Export-Package>
</Export-Package>
- <Web-ContextPath>/one/nb/v2/flow</Web-ContextPath>
+ <Web-ContextPath>/controller/nb/v2/flow</Web-ContextPath>
</instructions>
</configuration>
</plugin>
xsi:noNamespaceSchemaLocation="http://enunciate.codehaus.org/schemas/enunciate-1.26.xsd">
<services>
- <rest defaultRestSubcontext="/one/nb/v2/host"/>
+ <rest defaultRestSubcontext="/controller/nb/v2/host"/>
</services>
<modules>
org.slf4j,
!org.codehaus.enunciate.jaxrs
</Import-Package>
- <Web-ContextPath>/one/nb/v2/host</Web-ContextPath>
+ <Web-ContextPath>/controller/nb/v2/host</Web-ContextPath>
</instructions>
</configuration>
</plugin>
xsi:noNamespaceSchemaLocation="http://enunciate.codehaus.org/schemas/enunciate-1.26.xsd">
<services>
- <rest defaultRestSubcontext="/one/nb/v2/staticroute"/>
+ <rest defaultRestSubcontext="/controller/nb/v2/staticroute"/>
</services>
<modules>
</Import-Package>
<Export-Package>
</Export-Package>
- <Web-ContextPath>/one/nb/v2/staticroute</Web-ContextPath>
+ <Web-ContextPath>/controller/nb/v2/staticroute</Web-ContextPath>
</instructions>
</configuration>
</plugin>
xsi:noNamespaceSchemaLocation="http://enunciate.codehaus.org/schemas/enunciate-1.26.xsd">
<services>
- <rest defaultRestSubcontext="/one/nb/v2/statistics"/>
+ <rest defaultRestSubcontext="/controller/nb/v2/statistics"/>
</services>
<modules>
</Import-Package>
<Export-Package>
</Export-Package>
- <Web-ContextPath>/one/nb/v2/statistics</Web-ContextPath>
+ <Web-ContextPath>/controller/nb/v2/statistics</Web-ContextPath>
</instructions>
</configuration>
</plugin>
xsi:noNamespaceSchemaLocation="http://enunciate.codehaus.org/schemas/enunciate-1.26.xsd">
<services>
- <rest defaultRestSubcontext="/one/nb/v2/subnet"/>
+ <rest defaultRestSubcontext="/controller/nb/v2/subnet"/>
</services>
<modules>
</Import-Package>
<Export-Package>
</Export-Package>
- <Web-ContextPath>/one/nb/v2/subnet</Web-ContextPath>
+ <Web-ContextPath>/controller/nb/v2/subnet</Web-ContextPath>
</instructions>
</configuration>
</plugin>
xsi:noNamespaceSchemaLocation="http://enunciate.codehaus.org/schemas/enunciate-1.26.xsd">
<services>
- <rest defaultRestSubcontext="/one/nb/v2/switch"/>
+ <rest defaultRestSubcontext="/controller/nb/v2/switch"/>
</services>
<modules>
org.slf4j,
!org.codehaus.enunciate.jaxrs
</Import-Package>
- <Web-ContextPath>/one/nb/v2/switch</Web-ContextPath>
+ <Web-ContextPath>/controller/nb/v2/switch</Web-ContextPath>
</instructions>
</configuration>
</plugin>
xsi:noNamespaceSchemaLocation="http://enunciate.codehaus.org/schemas/enunciate-1.26.xsd">
<services>
- <rest defaultRestSubcontext="/one/nb/v2/topology"/>
+ <rest defaultRestSubcontext="/controller/nb/v2/topology"/>
</services>
<modules>
org.springframework.security.web.authentication.www,
!org.codehaus.enunciate.jaxrs
</Import-Package>
- <Web-ContextPath>/one/nb/v2/topology</Web-ContextPath>
+ <Web-ContextPath>/controller/nb/v2/topology</Web-ContextPath>
</instructions>
</configuration>
</plugin>
// replication is done in the SAL implementation toward
// the different APPS
this.pluginOutDataPacketServices.put(containerName, s);
- logger.debug("New outService for container:" + containerName);
+ logger.debug("New outService for container: {}", containerName);
}
}
}
if (this.pluginOutDataPacketServices != null) {
this.pluginOutDataPacketServices.remove(containerName);
- logger.debug("Removed outService for container:" + containerName);
+ logger.debug("Removed outService for container: {}", containerName);
}
}
if (sw == null || msg == null
|| this.pluginOutDataPacketServices == null) {
// Something fishy, we cannot do anything
+ logger.debug("sw: {} and/or msg: {} and/or pluginOutDataPacketServices: {} is null!",
+ new Object[]{sw, msg, this.pluginOutDataPacketServices});
return;
}
if (msg instanceof OFPacketIn) {
.get(GlobalConstants.DEFAULT.toString());
if (defaultOutService != null) {
defaultOutService.receiveDataPacket(dataPacket);
- logger.trace("Dispatched to apps a frame of size: "
- + ofPacket.getPacketData().length
- + " on container: "
- + GlobalConstants.DEFAULT.toString());
+ logger.trace("Dispatched to apps a frame of size: {} on container: {}",
+ ofPacket.getPacketData().length, GlobalConstants.DEFAULT.toString());
}
// Now check the mapping between nodeConnector and
// Container and later on optinally filter based on
if (s != null) {
// TODO add filtering on a per-flowSpec base
s.receiveDataPacket(dataPacket);
- logger.trace("Dispatched to apps a frame of size: "
- + ofPacket.getPacketData().length
- + " on container: " + container);
+ logger.trace("Dispatched to apps a frame of size: {} on container: {}",
+ ofPacket.getPacketData().length, GlobalConstants.DEFAULT.toString());
}
}
public void transmitDataPacket(RawPacket outPkt) {
// Sanity check area
if (outPkt == null) {
+ logger.debug("outPkt is null!");
return;
}
NodeConnector outPort = outPkt.getOutgoingNodeConnector();
if (outPort == null) {
+ logger.debug("outPort is null! outPkt: {}", outPkt);
return;
}
if (!outPort.getType().equals(
NodeConnector.NodeConnectorIDType.OPENFLOW)) {
// The output Port is not of type OpenFlow
+ logger.debug("outPort is not OF Type! outPort: {}", outPort);
return;
}
if (sw == null) {
// If we cannot get the controller descriptor we cannot even
// send out the frame
+ logger.debug("swID: {} - sw is null!", swID);
return;
}
po.setPacketData(data);
sw.asyncSend(po);
- logger.trace("Transmitted a frame of size:" + data.length);
+ logger.trace("Transmitted a frame of size: {}", data.length);
}
public void addNode(Node node, Set<Property> props) {
- if (node == null)
+ if (node == null) {
+ logger.debug("node is null!");
return;
+ }
long sid = (Long) node.getID();
ISwitch sw = controller.getSwitches().get(sid);
- if (sw != null) {
- this.swID2ISwitch.put(sw.getId(), sw);
+ if (sw == null) {
+ logger.debug("sid: {} - sw is null!", sid);
+ return;
}
+ this.swID2ISwitch.put(sw.getId(), sw);
}
public void removeNode(Node node) {
- if (node == null)
+ if (node == null) {
+ logger.debug("node is null!");
return;
+ }
long sid = (Long) node.getID();
ISwitch sw = controller.getSwitches().get(sid);
- if (sw != null) {
- this.swID2ISwitch.remove(sw.getId());
+ if (sw == null) {
+ logger.debug("sid: {} - sw is null!", sid);
+ return;
}
+ this.swID2ISwitch.remove(sw.getId());
}
@Override
if (fSpecs == null) {
fSpecs = new CopyOnWriteArrayList<ContainerFlow>();
}
- boolean updateMap = false;
switch (t) {
case ADDED:
if (!fSpecs.contains(previousFlow)) {
case CHANGED:
break;
}
- if (updateMap) {
- if (fSpecs.isEmpty()) {
- this.container2FlowSpecs.remove(containerName);
- } else {
- this.container2FlowSpecs.put(containerName, fSpecs);
- }
- }
}
@Override
this.routingAware = new HashSet<IListenRoutingUpdates>();
}
if (this.routingAware != null) {
- log.debug("Adding routingAware listener: " + i);
+ log.debug("Adding routingAware listener: {}", i);
this.routingAware.add(i);
}
}
: avlDstThruPut;
if (avlThruPut <= 0) {
- log
- .trace(
- "Edge {}: Available Throughput {} is Zero/Negative",
- e, avlThruPut);
+ log.debug("Edge {}: Available Throughput {} <= 0!",
+ e, avlThruPut);
return (double) -1;
}
return (double) (Bandwidth.BW1Pbps / avlThruPut);
@Override
public synchronized Path getMaxThroughputRoute(Node src, Node dst) {
if (mtp == null) {
- log
- .error("Max Throughput Path Calculation has not been Initialized!");
+ log.error("Max Throughput Path Calculation Uninitialized!");
return null;
}
try {
path = mtp.getMaxThroughputPath(src, dst);
} catch (IllegalArgumentException ie) {
- log.debug("A vertex is yet not known between " + src.toString()
- + " " + dst.toString());
+ log.debug("A vertex is yet not known between {} {}", src.toString(),
+ dst.toString());
return null;
}
Path res;
try {
res = new Path(path);
} catch (ConstructionException e) {
- log.debug("A vertex is yet not known between " + src.toString()
- + " " + dst.toString());
+ log.debug("A vertex is yet not known between {} {}", src.toString(),
+ dst.toString());
return null;
}
return res;
try {
path = spt.getPath(src, dst);
} catch (IllegalArgumentException ie) {
- log.debug("A vertex is yet not known between " + src.toString()
- + " " + dst.toString());
+ log.debug("A vertex is yet not known between {} {}", src.toString(),
+ dst.toString());
return null;
}
Path res;
try {
res = new Path(path);
} catch (ConstructionException e) {
- log.debug("A vertex is yet not known between " + src.toString()
- + " " + dst.toString());
+ log.debug("A vertex is yet not known between {} {}", src.toString(),
+ dst.toString());
return null;
}
return res;
if (topo.containsVertex(src.getNode())
&& topo.inDegree(src.getNode()) == 0
&& topo.outDegree(src.getNode()) == 0) {
- log.debug("Removing vertex " + src);
+ log.debug("Removing vertex {}", src);
topo.removeVertex(src.getNode());
}
if (topo.containsVertex(dst.getNode())
&& topo.inDegree(dst.getNode()) == 0
&& topo.outDegree(dst.getNode()) == 0) {
- log.debug("Removing vertex " + dst);
+ log.debug("Removing vertex {}", dst);
topo.removeVertex(dst.getNode());
}
}
clearMaxThroughput();
}
} else {
- log.error("Cannot find topology for BW " + bw
- + " this is unexpected!");
+ log.error("Cannot find topology for BW {} this is unexpected!", bw);
}
return edgePresentInGraph;
}
if (props != null)
props.remove(bw);
- log.debug("edgeUpdate: " + e.toString() + " bw: " + bw.getValue());
+ log.debug("edgeUpdate: {} bw: {}", e.toString(), bw.getValue());
Short baseBW = Short.valueOf((short) 0);
boolean add = (type == UpdateType.ADDED) ? true : false;
public void containerCreate(String containerName) {
try {
Object[] imps = getImplementations();
- logger.trace("Creating instance " + containerName);
+ logger.trace("Creating instance {}", containerName);
if (imps != null) {
for (int i = 0; i < imps.length; i++) {
ImmutablePair<String, Object> key = new ImmutablePair<String, Object>(
// Set the implementation so the component can manage
// its lifecycle
if (c.getService() == null) {
- logger
- .trace("Setting implementation to:"
- + imps[i]);
+ logger.trace("Setting implementation to: {}",
+ imps[i]);
c.setImplementation(imps[i]);
}
public void containerDestroy(String containerName) {
try {
Object[] imps = getImplementations();
- logger.trace("Destroying instance " + containerName);
+ logger.trace("Destroying instance {}", containerName);
if (imps != null) {
for (int i = 0; i < imps.length; i++) {
ImmutablePair<String, Object> key = new ImmutablePair<String, Object>(
// Set the implementation so the component
// can manage its lifesycle
if (c.getService() == null) {
- logger.trace("Setting implementation to:"
- + imps[i]);
+ logger.trace("Setting implementation to: {}",
+ imps[i]);
c.setImplementation(imps[i]);
}
try {
Component c = this.dbInstances.get(key);
if (c != null) {
- logger.trace("Remove component on container:"
- + key.getLeft() + " Object:" + key.getRight());
+ logger.trace("Remove component on container: {} Object: {}",
+ key.getLeft(), key.getRight());
this.dm.remove(c);
}
} catch (Exception nex) {
try {
Component c = this.dbGlobalInstances.get(key);
if (c != null) {
- logger.trace("Remove component for Object:" + key);
+ logger.trace("Remove component for Object: {}" , key);
this.dm.remove(c);
}
} catch (Exception nex) {
*
*/
public enum GlobalConstants {
- DEFAULT("default"), CONTAINERMANAGER("containermanager"), CONTAINERNAME(
- "name"), STATICVLAN("staticvlan"), CLUSTERINGSERVICES("clusteringservices"), ONECONTROLLER(
- "onecontroller"), STARTUPHOME("configuration/startup/");
+ DEFAULT("default"),
+ CONTAINERMANAGER("containermanager"),
+ CONTAINERNAME("name"),
+ STATICVLAN("staticvlan"),
+ CLUSTERINGSERVICES("clusteringservices"),
+ STARTUPHOME("configuration/startup/");
private GlobalConstants(String name) {
this.name = name;
logger.trace("Received setPluginInDataService request");
for (Object e : props.entrySet()) {
Map.Entry entry = (Map.Entry) e;
- logger.trace("Prop key:(" + entry.getKey() + ") value:("
- + entry.getValue() + ")");
+ logger.trace("Prop key:({}) value:({})",entry.getKey(), entry.getValue());
}
Object value = props.get("protocolPluginType");
+ "protocolPluginType provided");
} else {
this.pluginInDataService.put(type, s);
- logger.debug("Stored the PluginInDataService for type:" + type);
+ logger.debug("Stored the PluginInDataService for type: {}", type);
}
}
logger.trace("Received unsetPluginInDataService request");
for (Object e : props.entrySet()) {
Map.Entry entry = (Map.Entry) e;
- logger.trace("Prop key:(" + entry.getKey() + ") value:("
- + entry.getValue() + ")");
+ logger.trace("Prop key:({}) value:({})",entry.getKey(), entry.getValue());
}
Object value = props.get("protocoloPluginType");
+ "protocolPluginType provided");
} else if (this.pluginInDataService.get(type).equals(s)) {
this.pluginInDataService.remove(type);
- logger.debug("Removed the PluginInDataService for type:" + type);
+ logger.debug("Removed the PluginInDataService for type: {}", type);
}
}
logger.trace("Received setListenDataPacket request");
for (Object e : props.entrySet()) {
Map.Entry entry = (Map.Entry) e;
- logger.trace("Prop key:(" + entry.getKey() + ") value:("
- + entry.getValue() + ")");
+ logger.trace("Prop key:({}) value:({})",entry.getKey(), entry.getValue());
}
String listenerName = null;
if (this.indexDataPacket.contains(l)) {
logger.error("trying to add an existing element");
} else {
- logger.debug("adding listener: " + listenerName);
+ logger.debug("adding listener: {}", listenerName);
CopyOnWriteArrayList<DataPacketListener> serialListeners = new CopyOnWriteArrayList<DataPacketListener>();
serialListeners.add(l);
this.listenDataPacket.add(serialListeners);
if (this.indexDataPacket.contains(l)) {
logger.error("trying to add an existing element");
} else {
- logger.debug("adding listener: " + listenerName);
+ logger.debug("adding listener: {}", listenerName);
// Lets find the set with the dependency in it, if we
// find it lets just add our dependency at the end of
// the list.
logger.trace("Received UNsetListenDataPacket request");
for (Object e : props.entrySet()) {
Map.Entry entry = (Map.Entry) e;
- logger.trace("Prop key:(" + entry.getKey() + ") value:("
- + entry.getValue() + ")");
+ logger.trace("Prop key:({}) value:({})",entry.getKey(), entry.getValue());
}
String listenerName = null;
if (!this.indexDataPacket.contains(l)) {
logger.error("trying to remove a non-existing element");
} else {
- logger.debug("removing listener: " + listenerName);
+ logger.debug("removing listener: {}", listenerName);
for (List<DataPacketListener> serialListeners : this.listenDataPacket) {
int i = 0;
boolean done = false;
String type = null;
for (Object e : props.entrySet()) {
Map.Entry entry = (Map.Entry) e;
- logger.trace("Prop key:(" + entry.getKey() + ") value:("
- + entry.getValue() + ")");
+ logger.trace("Prop key:({}) value:({})",entry.getKey(),
+ entry.getValue());
}
Object value = props.get("protocolPluginType");
+ "protocolPluginType provided");
} else {
this.pluginFlowProgrammer.put(type, s);
- logger.debug("Stored the pluginFlowProgrammer for type:" + type);
+ logger.debug("Stored the pluginFlowProgrammer for type: {}",type);
}
}
logger.debug("Received unsetpluginFlowProgrammer request");
for (Object e : props.entrySet()) {
Map.Entry entry = (Map.Entry) e;
- logger.trace("Prop key:(" + entry.getKey() + ") value:("
- + entry.getValue() + ")");
+ logger.trace("Prop key:({}) value:({})",entry.getKey(),
+ entry.getValue());
}
Object value = props.get("protocoloPluginType");
+ "protocolPluginType provided");
} else if (this.pluginFlowProgrammer.get(type).equals(s)) {
this.pluginFlowProgrammer.remove(type);
- logger.debug("Removed the pluginFlowProgrammer for type:" + type);
+ logger.debug("Removed the pluginFlowProgrammer for type: {}", type);
}
}
String type = null;
for (Object e : props.entrySet()) {
Map.Entry entry = (Map.Entry) e;
- logger.trace("Prop key:(" + entry.getKey() + ") value:("
- + entry.getValue() + ")");
+ logger.trace("Prop key:({}) value:({})", entry.getKey(),
+ entry.getValue());
}
Object value = props.get("protocolPluginType");
+ "protocolPluginType provided");
} else {
this.pluginReader.put(type, s);
- logger.debug("Stored the pluginReader for type:" + type);
+ logger.debug("Stored the pluginReader for type: {}", type);
}
}
logger.debug("Received unsetpluginReader request");
for (Object e : props.entrySet()) {
Map.Entry entry = (Map.Entry) e;
- logger.trace("Prop key:(" + entry.getKey() + ") value:("
- + entry.getValue() + ")");
+ logger.trace("Prop key:({}) value:({})", entry.getKey(),
+ entry.getValue());
}
Object value = props.get("protocoloPluginType");
+ "protocolPluginType provided");
} else if (this.pluginReader.get(type).equals(s)) {
this.pluginReader.remove(type);
- logger.debug("Removed the pluginReader for type:" + type);
+ logger.debug("Removed the pluginReader for type: {}", type);
}
}
.readFlow(node, flow, true);
}
}
- logger.warn("Plugin unuvailable");
+ logger.warn("Plugin unavailable");
return null;
}
.readFlow(node, flow, false);
}
}
- logger.warn("Plugin unuvailable");
+ logger.warn("Plugin unavailable");
return null;
}
.readAllFlow(node, true);
}
}
- logger.warn("Plugin unuvailable");
+ logger.warn("Plugin unavailable");
return null;
}
.readAllFlow(node, false);
}
}
- logger.warn("Plugin unuvailable");
+ logger.warn("Plugin unavailable");
return null;
}
.readDescription(node, true);
}
}
- logger.warn("Plugin unuvailable");
+ logger.warn("Plugin unavailable");
return null;
}
.readDescription(node, false);
}
}
- logger.warn("Plugin unuvailable");
+ logger.warn("Plugin unavailable");
return null;
}
.readNodeConnector(connector, true);
}
}
- logger.warn("Plugin unuvailable");
+ logger.warn("Plugin unavailable");
return null;
}
.readNodeConnector(connector, false);
}
}
- logger.warn("Plugin unuvailable");
+ logger.warn("Plugin unavailable");
return null;
}
.readAllNodeConnector(node, true);
}
}
- logger.warn("Plugin unuvailable");
+ logger.warn("Plugin unavailable");
return null;
}
.readAllNodeConnector(node, false);
}
}
- logger.warn("Plugin unuvailable");
+ logger.warn("Plugin unavailable");
return null;
}
.getTransmitRate(connector);
}
}
- logger.warn("Plugin unuvailable");
+ logger.warn("Plugin unavailable");
return 0;
}
<module>sal-core-demo</module>\r
</modules>\r
\r
- <dependencies>\r
+ <dependencyManagement>\r
+ <dependencies>\r
+ <dependency>\r
+ <groupId>com.google.guava</groupId>\r
+ <artifactId>guava</artifactId>\r
+ <version>14.0.1</version>\r
+ <type>jar</type>\r
+ </dependency>\r
+ <dependency>\r
+ <groupId>org.slf4j</groupId>\r
+ <artifactId>slf4j-api</artifactId>\r
+ <version>1.7.2</version>\r
+ </dependency>\r
+ </dependencies>\r
+ </dependencyManagement>\r
\r
+ <dependencies>\r
<dependency>\r
<groupId>junit</groupId>\r
<artifactId>junit</artifactId>\r
<optional>true</optional>\r
</dependency>\r
<dependency>\r
- <groupId>org.slf4j</groupId>\r
- <artifactId>slf4j-api</artifactId>\r
- <version>1.7.2</version>\r
- </dependency>\r
- <dependency>\r
- <groupId>org.slf4j</groupId>\r
- <artifactId>slf4j-simple</artifactId>\r
- <version>1.7.2</version>\r
+ <groupId>org.mockito</groupId>\r
+ <artifactId>mockito-all</artifactId>\r
+ <version>1.9.5</version>\r
+ <scope>test</scope>\r
</dependency>\r
</dependencies>\r
<build>\r
-<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">\r
- <modelVersion>4.0.0</modelVersion>\r
- <parent>\r
- <groupId>org.opendaylight.controller</groupId>\r
- <artifactId>sal</artifactId>\r
- <version>1.0-SNAPSHOT</version>\r
- </parent>\r
- <artifactId>sal-binding-broker-impl</artifactId>\r
- \r
- \r
- \r
- <dependencies>\r
- <dependency>\r
- <groupId>org.opendaylight.controller</groupId>\r
- <artifactId>sal-binding-api</artifactId>\r
- <version>1.0-SNAPSHOT</version>\r
- </dependency>\r
- <dependency>\r
- <groupId>org.opendaylight.controller</groupId>\r
- <artifactId>sal-binding-spi</artifactId>\r
- <version>1.0-SNAPSHOT</version>\r
- </dependency>\r
- <dependency>\r
- <groupId>org.opendaylight.controller</groupId>\r
- <artifactId>sal-core-api</artifactId>\r
- <version>1.0-SNAPSHOT</version>\r
- </dependency>\r
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"\r
+ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">\r
+ <modelVersion>4.0.0</modelVersion>\r
+ <parent>\r
+ <groupId>org.opendaylight.controller</groupId>\r
+ <artifactId>sal</artifactId>\r
+ <version>1.0-SNAPSHOT</version>\r
+ </parent>\r
+ <artifactId>sal-binding-broker-impl</artifactId>\r
\r
- <dependency>\r
- <groupId>org.slf4j</groupId>\r
- <artifactId>slf4j-api</artifactId>\r
- <version>1.6.4</version>\r
- </dependency>\r
- </dependencies>\r
+\r
+\r
+ <dependencies>\r
+ <dependency>\r
+ <groupId>org.opendaylight.controller</groupId>\r
+ <artifactId>sal-binding-api</artifactId>\r
+ <version>1.0-SNAPSHOT</version>\r
+ </dependency>\r
+ <dependency>\r
+ <groupId>org.opendaylight.controller</groupId>\r
+ <artifactId>sal-binding-spi</artifactId>\r
+ <version>1.0-SNAPSHOT</version>\r
+ </dependency>\r
+ <dependency>\r
+ <groupId>org.opendaylight.controller</groupId>\r
+ <artifactId>sal-core-api</artifactId>\r
+ <version>1.0-SNAPSHOT</version>\r
+ </dependency>\r
+\r
+ <dependency>\r
+ <groupId>org.slf4j</groupId>\r
+ <artifactId>slf4j-api</artifactId>\r
+ </dependency>\r
+\r
+ <dependency>\r
+ <groupId>com.google.guava</groupId>\r
+ <artifactId>guava</artifactId>\r
+ <type>jar</type>\r
+ </dependency>\r
+ </dependencies>\r
</project>
\ No newline at end of file
+++ /dev/null
-/*
- * Copyright (c) 2013 Cisco Systems, Inc. and others. All rights reserved.
- *
- * This program and the accompanying materials are made available under the
- * terms of the Eclipse Public License v1.0 which accompanies this distribution,
- * and is available at http://www.eclipse.org/legal/epl-v10.html
- */
-package org.opendaylight.controller.sal.binding.impl;
-
-import java.util.ArrayList;
-import java.util.List;
-import java.util.Map;
-
-public class BrokerUtils {
- private BrokerUtils() {
-
- }
-
-
- public static <K,V> void addToMap(Map<Class<? extends K>, List<V>> map, Class<? extends K> key, V value) {
- List<V> list = map.get(key);
- if (list == null) {
- list = new ArrayList<V>();
- map.put(key, list);
- }
- list.add(value);
- }
-
- public static <K,V> void removeFromMap(Map<Class<? extends K>, List<V>> map, Class<? extends K> key,
- V value) {
- List<V> list = map.get(key);
- if (list == null) {
- return;
- }
- list.remove(value);
- if (list.isEmpty()) {
- map.remove(key);
- }
- }
-}
-/*
- * Copyright (c) 2013 Cisco Systems, Inc. and others. All rights reserved.
- *
- * This program and the accompanying materials are made available under the
- * terms of the Eclipse Public License v1.0 which accompanies this distribution,
- * and is available at http://www.eclipse.org/legal/epl-v10.html
- */
-package org.opendaylight.controller.sal.binding.impl;
-
-import java.util.Collections;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
-
-import org.opendaylight.controller.sal.binding.api.BindingAwareBroker;
-import org.opendaylight.controller.sal.binding.api.BindingAwareService;
-import org.opendaylight.controller.sal.binding.api.NotificationProviderService;
-import org.opendaylight.controller.sal.binding.api.NotificationService;
-import org.opendaylight.controller.sal.binding.api.BindingAwareBroker.ConsumerSession;
-import org.opendaylight.controller.sal.binding.spi.SALBindingModule;
-import org.opendaylight.controller.sal.binding.spi.Mapper;
-import org.opendaylight.controller.sal.binding.spi.MappingProvider;
-import org.opendaylight.controller.sal.binding.spi.MappingProvider.MappingExtensionFactory;
-
-import org.opendaylight.controller.sal.core.api.Broker.ProviderSession;
-import org.opendaylight.controller.yang.binding.DataObject;
-import org.opendaylight.controller.yang.binding.Notification;
-import org.opendaylight.controller.yang.binding.NotificationListener;
-import org.opendaylight.controller.yang.common.QName;
-import org.opendaylight.controller.yang.data.api.CompositeNode;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-public class NotificationModule implements SALBindingModule {
-
- private ProviderSession biSession;
- private org.opendaylight.controller.sal.core.api.notify.NotificationProviderService biNotifyService;
- private BindingAwareBroker broker;
- private MappingProvider mappingProvider;
-
- private Map<Class<? extends Notification>, List<NotificationListener>> listeners = new HashMap<Class<? extends Notification>, List<NotificationListener>>();
- private Set<QName> biNotifications = new HashSet<QName>();
- private static final Logger log = LoggerFactory
- .getLogger(NotificationModule.class);
- private final BindingIndependentListener biListener = new BindingIndependentListener();
-
- @Override
- public Set<Class<? extends BindingAwareService>> getProvidedServices() {
-
- Set<Class<? extends BindingAwareService>> ret = new HashSet<Class<? extends BindingAwareService>>();
- ret.add(NotificationService.class);
- ret.add(NotificationProviderService.class);
- return ret;
- }
-
- @Override
- public <T extends BindingAwareService> T getServiceForSession(
- Class<T> service, ConsumerSession session) {
- if (service == null)
- throw new IllegalArgumentException("Service should not be null");
- if (session == null)
- throw new IllegalArgumentException("Session should not be null");
-
- if (NotificationProviderSession.class.equals(service)) {
- if (session instanceof org.opendaylight.controller.sal.binding.api.BindingAwareBroker.ProviderSession) {
- @SuppressWarnings("unchecked")
- T ret = (T) new NotificationProviderSession(session);
- return ret;
- } else {
- throw new IllegalArgumentException(
- "NotificationProviderService is available only to ProviderSession");
- }
- }
-
- if (NotificationService.class.equals(service)) {
- @SuppressWarnings("unchecked")
- T ret = (T) new NotificationSession(session);
- return ret;
- }
- return null;
- }
-
- @Override
- public Set<Class<? extends org.opendaylight.controller.sal.binding.api.BindingAwareProvider.ProviderFunctionality>> getSupportedProviderFunctionality() {
- return Collections.emptySet();
- }
-
- @Override
- public void setBroker(BindingAwareBroker broker) {
- this.broker = broker;
- }
-
- @Override
- public void setMappingProvider(MappingProvider provider) {
- this.mappingProvider = provider;
- }
-
- @Override
- public void onBISessionAvailable(ProviderSession session) {
- biSession = session;
- if (biSession != null) {
- biNotifyService = session
- .getService(org.opendaylight.controller.sal.core.api.notify.NotificationProviderService.class);
- }
- }
-
- private void notify(Notification notification) {
- notifyBindingIndependent(notification);
- notifyBindingAware(notification);
- }
-
- private void notifyBindingAware(Notification notification) {
- Class<? extends Notification> type = notification.getClass();
- List<NotificationListener> toNotify = listeners.get(type);
-
- // Invocation of notification on registered listeners
- if (toNotify != null) {
-
- // We get factory for Notification Invoker
- MappingExtensionFactory<NotificationInvoker> invokerFactory = mappingProvider
- .getExtensionFactory(NotificationInvoker.class);
-
- // We get generated invoker for NoficiationListener interface
- // associated to Notification Type
- NotificationInvoker invoker = invokerFactory.forClass(type);
- for (NotificationListener listener : toNotify) {
- try {
- // Invoker invokes the right method on subtype of
- // NotificationListener
- // associated to the type of notification
- invoker.notify(notification, listener);
- } catch (Exception e) {
-
- }
- }
- }
- }
-
- private void notifyBindingIndependent(Notification notification) {
- Class<? extends Notification> type = notification.getClass();
-
- if (biSession == null) {
- return;
- }
- if (biSession.isClosed()) {
- return;
- }
- if (biNotifyService == null) {
- return;
- }
-
- // FIXME: Somehow we need to resolve this for class hierarchy.
- // probably use type.getInterfaces()
- Mapper<? extends Notification> mapper = mappingProvider.getMapper(type);
- CompositeNode domNotification = mapper.domFromObject(notification);
-
- biNotifyService.sendNotification(domNotification);
- }
-
- private void addBAListener(Class<? extends Notification> notificationType,
- NotificationListener listener) {
-
- BrokerUtils.addToMap(listeners, notificationType, listener);
- Mapper<? extends Notification> mapper = mappingProvider
- .getMapper(notificationType);
- QName biType = mapper.getQName();
- if (false == biNotifications.contains(biType)) {
- // The listener is not registered for binding independent
- // notification
- biNotifications.add(biType);
-
- if (biNotifyService != null) {
- biNotifyService.addNotificationListener(biType, biListener);
- }
- }
-
- }
-
- private void removeBAListener(
- Class<? extends Notification> notificationType,
- NotificationListener listener) {
- BrokerUtils.removeFromMap(listeners, notificationType, listener);
- }
-
- private class NotificationSession implements NotificationService {
- private final ConsumerSession session;
-
- public NotificationSession(ConsumerSession session) {
- this.session = session;
- }
-
- private Map<Class<? extends Notification>, List<NotificationListener>> sessionListeners = new HashMap<Class<? extends Notification>, List<NotificationListener>>();
-
- @Override
- public void addNotificationListener(
- Class<? extends Notification> notificationType,
- NotificationListener listener) {
-
- NotificationModule.this.addBAListener(notificationType, listener);
- BrokerUtils.addToMap(sessionListeners, notificationType, listener);
-
- }
-
- @Override
- public void removeNotificationListener(
- Class<? extends Notification> notificationType,
- NotificationListener listener) {
- BrokerUtils.removeFromMap(sessionListeners, notificationType,
- listener);
- NotificationModule.this
- .removeBAListener(notificationType, listener);
- }
-
- }
-
- private class NotificationProviderSession extends NotificationSession
- implements NotificationProviderService {
-
- public NotificationProviderSession(ConsumerSession session) {
- super(session);
- }
-
- @Override
- public void notify(Notification notification) {
- NotificationModule.this.notify(notification);
- }
-
- }
-
- private class BindingIndependentListener
- implements
- org.opendaylight.controller.sal.core.api.notify.NotificationListener {
-
- @Override
- public Set<QName> getSupportedNotifications() {
- return biNotifications;
- }
-
- @Override
- public void onNotification(CompositeNode notification) {
- NotificationModule.this
- .onBindingIndependentNotification(notification);
- }
-
- }
-
- private void onBindingIndependentNotification(CompositeNode biNotification) {
- QName biType = biNotification.getNodeType();
-
- Mapper<DataObject> mapper = mappingProvider.getMapper(biType);
- if (mapper == null) {
- log.info("Received notification does not have a binding defined.");
- return;
- }
- Class<DataObject> type = mapper.getDataObjectClass();
-
- // We check if the received QName / type is really Notification
- if (Notification.class.isAssignableFrom(type)) {
- Notification notification = (Notification) mapper
- .objectFromDom(biNotification);
- notifyBindingAware(notification);
- } else {
- // The generated type for this QName does not inherits from
- // notification something went wrong - generated APIs and/or
- // provider sending notification
- // which was incorectly described in the YANG schema.
- log.error("Received notification " + biType
- + " is not binded as notification");
- }
-
- }
-}
+/*\r
+ * Copyright (c) 2013 Cisco Systems, Inc. and others. All rights reserved.\r
+ *\r
+ * This program and the accompanying materials are made available under the\r
+ * terms of the Eclipse Public License v1.0 which accompanies this distribution,\r
+ * and is available at http://www.eclipse.org/legal/epl-v10.html\r
+ */\r
+package org.opendaylight.controller.sal.binding.impl;\r
+\r
+import java.util.Collection;\r
+import java.util.Collections;\r
+import java.util.HashSet;\r
+import java.util.Set;\r
+\r
+import org.opendaylight.controller.sal.binding.api.BindingAwareBroker;\r
+import org.opendaylight.controller.sal.binding.api.BindingAwareService;\r
+import org.opendaylight.controller.sal.binding.api.NotificationProviderService;\r
+import org.opendaylight.controller.sal.binding.api.NotificationService;\r
+import org.opendaylight.controller.sal.binding.api.BindingAwareBroker.ConsumerSession;\r
+import org.opendaylight.controller.sal.binding.spi.SALBindingModule;\r
+import org.opendaylight.controller.sal.binding.spi.Mapper;\r
+import org.opendaylight.controller.sal.binding.spi.MappingProvider;\r
+import org.opendaylight.controller.sal.binding.spi.MappingProvider.MappingExtensionFactory;\r
+\r
+import org.opendaylight.controller.sal.core.api.Broker.ProviderSession;\r
+import org.opendaylight.controller.yang.binding.DataObject;\r
+import org.opendaylight.controller.yang.binding.Notification;\r
+import org.opendaylight.controller.yang.binding.NotificationListener;\r
+import org.opendaylight.controller.yang.common.QName;\r
+import org.opendaylight.controller.yang.data.api.CompositeNode;\r
+import org.slf4j.Logger;\r
+import org.slf4j.LoggerFactory;\r
+\r
+import com.google.common.collect.HashMultimap;\r
+import com.google.common.collect.Multimap;\r
+\r
+public class NotificationModule implements SALBindingModule {\r
+\r
+ private ProviderSession biSession;\r
+ private org.opendaylight.controller.sal.core.api.notify.NotificationProviderService biNotifyService;\r
+ private MappingProvider mappingProvider;\r
+\r
+ private Multimap<Class<? extends Notification>, NotificationListener> listeners = HashMultimap\r
+ .create();\r
+ private Set<QName> biNotifications = new HashSet<QName>();\r
+ private static final Logger log = LoggerFactory\r
+ .getLogger(NotificationModule.class);\r
+ private final BindingIndependentListener biListener = new BindingIndependentListener();\r
+ private BindingAwareBroker broker;\r
+\r
+ @Override\r
+ public Set<Class<? extends BindingAwareService>> getProvidedServices() {\r
+\r
+ Set<Class<? extends BindingAwareService>> ret = new HashSet<Class<? extends BindingAwareService>>();\r
+ ret.add(NotificationService.class);\r
+ ret.add(NotificationProviderService.class);\r
+ return ret;\r
+ }\r
+\r
+ @Override\r
+ public <T extends BindingAwareService> T getServiceForSession(\r
+ Class<T> service, ConsumerSession session) {\r
+ if (service == null)\r
+ throw new IllegalArgumentException("Service should not be null");\r
+ if (session == null)\r
+ throw new IllegalArgumentException("Session should not be null");\r
+\r
+ if (NotificationProviderSession.class.equals(service)) {\r
+ if (session instanceof org.opendaylight.controller.sal.binding.api.BindingAwareBroker.ProviderSession) {\r
+ @SuppressWarnings("unchecked")\r
+ T ret = (T) new NotificationProviderSession(session);\r
+ return ret;\r
+ } else {\r
+ throw new IllegalArgumentException(\r
+ "NotificationProviderService is available only to ProviderSession");\r
+ }\r
+ }\r
+\r
+ if (NotificationService.class.equals(service)) {\r
+ @SuppressWarnings("unchecked")\r
+ T ret = (T) new NotificationSession(session);\r
+ return ret;\r
+ }\r
+ return null;\r
+ }\r
+\r
+ @Override\r
+ public Set<Class<? extends org.opendaylight.controller.sal.binding.api.BindingAwareProvider.ProviderFunctionality>> getSupportedProviderFunctionality() {\r
+ return Collections.emptySet();\r
+ }\r
+\r
+ @Override\r
+ public void setBroker(BindingAwareBroker broker) {\r
+ this.broker = broker;\r
+ }\r
+\r
+ @Override\r
+ public void setMappingProvider(MappingProvider provider) {\r
+ this.mappingProvider = provider;\r
+ }\r
+\r
+ @Override\r
+ public void onBISessionAvailable(ProviderSession session) {\r
+ biSession = session;\r
+ if (biSession != null) {\r
+ biNotifyService = session\r
+ .getService(org.opendaylight.controller.sal.core.api.notify.NotificationProviderService.class);\r
+ }\r
+ }\r
+\r
+ private void notify(Notification notification) {\r
+ notifyBindingIndependent(notification);\r
+ notifyBindingAware(notification);\r
+ }\r
+\r
+ private void notifyBindingAware(Notification notification) {\r
+ Class<? extends Notification> type = notification.getClass();\r
+ Collection<NotificationListener> toNotify = listeners.get(type);\r
+\r
+ // Invocation of notification on registered listeners\r
+ if (toNotify != null) {\r
+\r
+ // We get factory for Notification Invoker\r
+ MappingExtensionFactory<NotificationInvoker> invokerFactory = mappingProvider\r
+ .getExtensionFactory(NotificationInvoker.class);\r
+\r
+ // We get generated invoker for NoficiationListener interface\r
+ // associated to Notification Type\r
+ NotificationInvoker invoker = invokerFactory.forClass(type);\r
+ for (NotificationListener listener : toNotify) {\r
+ try {\r
+ // Invoker invokes the right method on subtype of\r
+ // NotificationListener\r
+ // associated to the type of notification\r
+ invoker.notify(notification, listener);\r
+ } catch (Exception e) {\r
+\r
+ }\r
+ }\r
+ }\r
+ }\r
+\r
+ private void notifyBindingIndependent(Notification notification) {\r
+ Class<? extends Notification> type = notification.getClass();\r
+\r
+ if (biSession == null) {\r
+ return;\r
+ }\r
+ if (biSession.isClosed()) {\r
+ return;\r
+ }\r
+ if (biNotifyService == null) {\r
+ return;\r
+ }\r
+\r
+ // FIXME: Somehow we need to resolve this for class hierarchy.\r
+ // probably use type.getInterfaces()\r
+ Mapper<? extends Notification> mapper = mappingProvider\r
+ .mapperForClass(type);\r
+ CompositeNode domNotification = mapper.domFromObject(notification);\r
+\r
+ biNotifyService.sendNotification(domNotification);\r
+ }\r
+\r
+ private void addBAListener(Class<? extends Notification> notificationType,\r
+ NotificationListener listener) {\r
+\r
+ listeners.put(notificationType, listener);\r
+ Mapper<? extends Notification> mapper = mappingProvider\r
+ .mapperForClass(notificationType);\r
+ QName biType = mapper.getQName();\r
+ if (false == biNotifications.contains(biType)) {\r
+ // The listener is not registered for binding independent\r
+ // notification\r
+ biNotifications.add(biType);\r
+\r
+ if (biNotifyService != null) {\r
+ biNotifyService.addNotificationListener(biType, biListener);\r
+ }\r
+ }\r
+\r
+ }\r
+\r
+ private void removeBAListener(\r
+ Class<? extends Notification> notificationType,\r
+ NotificationListener listener) {\r
+ listeners.remove(notificationType, listener);\r
+ }\r
+\r
+ private class NotificationSession implements NotificationService {\r
+ private final ConsumerSession session;\r
+ private Multimap<Class<? extends Notification>, NotificationListener> sessionListeners = HashMultimap\r
+ .create();\r
+\r
+ public NotificationSession(ConsumerSession session) {\r
+ this.session = session;\r
+ }\r
+\r
+ @Override\r
+ public void addNotificationListener(\r
+ Class<? extends Notification> notificationType,\r
+ NotificationListener listener) {\r
+\r
+ NotificationModule.this.addBAListener(notificationType, listener);\r
+ sessionListeners.put(notificationType, listener);\r
+\r
+ }\r
+\r
+ @Override\r
+ public void removeNotificationListener(\r
+ Class<? extends Notification> notificationType,\r
+ NotificationListener listener) {\r
+ sessionListeners.remove(notificationType, listener);\r
+ NotificationModule.this\r
+ .removeBAListener(notificationType, listener);\r
+ }\r
+\r
+ }\r
+\r
+ private class NotificationProviderSession extends NotificationSession\r
+ implements NotificationProviderService {\r
+\r
+ public NotificationProviderSession(ConsumerSession session) {\r
+ super(session);\r
+ }\r
+\r
+ @Override\r
+ public void notify(Notification notification) {\r
+ NotificationModule.this.notify(notification);\r
+ }\r
+\r
+ }\r
+\r
+ private class BindingIndependentListener\r
+ implements\r
+ org.opendaylight.controller.sal.core.api.notify.NotificationListener {\r
+\r
+ @Override\r
+ public Set<QName> getSupportedNotifications() {\r
+ return biNotifications;\r
+ }\r
+\r
+ @Override\r
+ public void onNotification(CompositeNode notification) {\r
+ NotificationModule.this\r
+ .onBindingIndependentNotification(notification);\r
+ }\r
+\r
+ }\r
+\r
+ private void onBindingIndependentNotification(CompositeNode biNotification) {\r
+ QName biType = biNotification.getNodeType();\r
+\r
+ Mapper<DataObject> mapper = mappingProvider.mapperForQName(biType);\r
+ if (mapper == null) {\r
+ log.info("Received notification does not have a binding defined.");\r
+ return;\r
+ }\r
+ Class<DataObject> type = mapper.getDataObjectClass();\r
+\r
+ // We check if the received QName / type is really Notification\r
+ if (Notification.class.isAssignableFrom(type)) {\r
+ Notification notification = (Notification) mapper\r
+ .objectFromDom(biNotification);\r
+ notifyBindingAware(notification);\r
+ } else {\r
+ // The generated type for this QName does not inherits from\r
+ // notification something went wrong - generated APIs and/or\r
+ // provider sending notification\r
+ // which was incorectly described in the YANG schema.\r
+ log.error("Received notification " + biType\r
+ + " is not binded as notification");\r
+ }\r
+\r
+ }\r
+}\r
<dependency>\r
<groupId>org.slf4j</groupId>\r
<artifactId>slf4j-api</artifactId>\r
- <version>1.6.4</version>\r
+ </dependency>\r
+ <dependency>\r
+ <groupId>com.google.guava</groupId>\r
+ <artifactId>guava</artifactId>\r
+ <type>jar</type>\r
</dependency>\r
</dependencies>
</project>
\ No newline at end of file
import java.util.HashSet;\r
import java.util.Map;\r
import java.util.Set;\r
-import java.util.concurrent.ExecutorService;\r
import java.util.concurrent.Future;\r
\r
import org.opendaylight.controller.sal.core.api.Broker;\r
+++ /dev/null
-/*\r
- * Copyright (c) 2013 Cisco Systems, Inc. and others. All rights reserved.\r
- *\r
- * This program and the accompanying materials are made available under the\r
- * terms of the Eclipse Public License v1.0 which accompanies this distribution,\r
- * and is available at http://www.eclipse.org/legal/epl-v10.html\r
- */\r
-package org.opendaylight.controller.sal.core.impl;\r
-\r
-import java.util.ArrayList;\r
-import java.util.List;\r
-import java.util.Map;\r
-\r
-import org.opendaylight.controller.yang.common.QName;\r
-\r
-\r
-public class Utils {\r
-\r
- public static <T> void addToMap(Map<QName, List<T>> map, QName key, T value) {\r
- List<T> list = map.get(key);\r
- if (list == null) {\r
- list = new ArrayList<T>();\r
- map.put(key, list);\r
- }\r
- list.add(value);\r
- }\r
-\r
- public static <T> void removeFromMap(Map<QName, List<T>> map, QName key,\r
- T value) {\r
- List<T> list = map.get(key);\r
- if (list == null) {\r
- return;\r
- }\r
- list.remove(value);\r
- if (list.isEmpty()) {\r
- map.remove(key);\r
- }\r
- }\r
-}\r
-
*/\r
package org.opendaylight.controller.sal.core.impl.notify;\r
\r
+import java.util.Collection;\r
import java.util.Collections;\r
-import java.util.HashMap;\r
import java.util.HashSet;\r
-import java.util.List;\r
import java.util.Map;\r
import java.util.Map.Entry;\r
import java.util.Set;\r
import org.opendaylight.controller.sal.core.api.notify.NotificationProviderService;\r
import org.opendaylight.controller.sal.core.api.notify.NotificationService;\r
import org.opendaylight.controller.sal.core.impl.BrokerServiceImpl;\r
-import org.opendaylight.controller.sal.core.impl.Utils;\r
import org.opendaylight.controller.sal.core.spi.BrokerModule;\r
import org.opendaylight.controller.yang.common.QName;\r
import org.opendaylight.controller.yang.data.api.CompositeNode;\r
import org.slf4j.Logger;\r
import org.slf4j.LoggerFactory;\r
\r
-\r
+import com.google.common.collect.HashMultimap;\r
+import com.google.common.collect.ImmutableSet;\r
+import com.google.common.collect.Multimap;\r
\r
public class NotificationModule implements BrokerModule {\r
private static Logger log = LoggerFactory\r
.getLogger(NotificationModule.class);\r
\r
- private Map<QName, List<NotificationListener>> listeners = new HashMap<QName, List<NotificationListener>>();\r
+ private Multimap<QName, NotificationListener> listeners = HashMultimap\r
+ .create();\r
+\r
+ private static final Set<Class<? extends BrokerService>> providedServices = ImmutableSet\r
+ .of((Class<? extends BrokerService>) NotificationService.class,\r
+ NotificationProviderService.class);\r
\r
@Override\r
public Set<Class<? extends BrokerService>> getProvidedServices() {\r
- // FIXME Refactor\r
- Set<Class<? extends BrokerService>> ret = new HashSet<Class<? extends BrokerService>>();\r
- ret.add(NotificationService.class);\r
- ret.add(NotificationProviderService.class);\r
- return ret;\r
+ return providedServices;\r
}\r
\r
@Override\r
\r
private void sendNotification(CompositeNode notification) {\r
QName type = notification.getNodeType();\r
- List<NotificationListener> toNotify = listeners.get(type);\r
+ Collection<NotificationListener> toNotify = listeners.get(type);\r
log.info("Publishing notification " + type);\r
\r
if (toNotify == null) {\r
private class NotificationConsumerSessionImpl extends BrokerServiceImpl\r
implements NotificationService {\r
\r
- Map<QName, List<NotificationListener>> consumerListeners = new HashMap<QName, List<NotificationListener>>();\r
+ private Multimap<QName, NotificationListener> consumerListeners = HashMultimap\r
+ .create();\r
private boolean closed = false;\r
\r
@Override\r
throw new IllegalArgumentException("Listener must not be null.");\r
}\r
\r
- Utils.addToMap(consumerListeners, notification, listener);\r
- Utils.addToMap(listeners, notification, listener);\r
+ consumerListeners.put(notification, listener);\r
+ listeners.put(notification, listener);\r
log.info("Registered listener for notification: " + notification);\r
}\r
\r
if (listener == null) {\r
throw new IllegalArgumentException("Listener must not be null.");\r
}\r
- Utils.removeFromMap(consumerListeners, notification, listener);\r
- Utils.removeFromMap(listeners, notification, listener);\r
+ consumerListeners.remove(notification, listener);\r
+ listeners.remove(notification, listener);\r
}\r
\r
@Override\r
public void closeSession() {\r
closed = true;\r
- Set<Entry<QName, List<NotificationListener>>> toRemove = consumerListeners\r
- .entrySet();\r
- for (Entry<QName, List<NotificationListener>> entry : toRemove) {\r
- listeners.get(entry.getKey()).removeAll(entry.getValue());\r
+ Map<QName, Collection<NotificationListener>> toRemove = consumerListeners\r
+ .asMap();\r
+ for (Entry<QName, Collection<NotificationListener>> entry : toRemove\r
+ .entrySet()) {\r
+ listeners.remove(entry.getKey(), entry.getValue());\r
}\r
}\r
\r
return Collections.emptySet();\r
}\r
}\r
-
org.springframework.security.web.authentication.logout,
org.springframework.dao
</Import-Package>
- <Web-ContextPath>/one/devices</Web-ContextPath>
+ <Web-ContextPath>/controller/web/devices</Web-ContextPath>
</instructions>
</configuration>
</plugin>
<http pattern="/js/**" security="none" />
<http pattern="/images/**" security="none" />
<http pattern="/favicon.ico" security="none" />
- <http pattern="/one/css/**" security="none" />
- <http pattern="/one/js/**" security="none" />
- <http pattern="/one/images/**" security="none" />
+ <http pattern="/controller/web/css/**" security="none" />
+ <http pattern="/controller/web/js/**" security="none" />
+ <http pattern="/controller/web/images/**" security="none" />
<http auto-config="false" authentication-manager-ref="authenticationManager"
/**Devices Modules */
one.f.switchmanager = {
- rootUrl: "one/devices",
+ rootUrl: "controller/web/devices",
createTable: function(columnNames, body) {
var tableAttributes = ["table-striped", "table-bordered", "table-condensed"];
var $table = one.lib.dashlet.table.table(tableAttributes);
org.springframework.security.web.authentication.logout,
org.springframework.dao\r
</Import-Package>
- <Web-ContextPath>/one/flows</Web-ContextPath>
+ <Web-ContextPath>/controller/web/flows</Web-ContextPath>
</instructions>
</configuration>
</plugin>
<http pattern="/js/**" security="none" />
<http pattern="/images/**" security="none" />
<http pattern="/favicon.ico" security="none" />
- <http pattern="/one/css/**" security="none" />
- <http pattern="/one/js/**" security="none" />
- <http pattern="/one/images/**" security="none" />
+ <http pattern="/controller/web/css/**" security="none" />
+ <http pattern="/controller/web/js/**" security="none" />
+ <http pattern="/controller/web/images/**" security="none" />
<http auto-config="false" authentication-manager-ref="authenticationManager"
};
one.f.address = {
- root : "/one/flows",
+ root : "/controller/web/flows",
flows : {
main : "/main",
flows : "/node-flows",
<http pattern="/js/**" security="none" />
<http pattern="/images/**" security="none" />
<http pattern="/favicon.ico" security="none" />
- <http pattern="/one/css/**" security="none" />
- <http pattern="/one/js/**" security="none" />
- <http pattern="/one/images/**" security="none" />
+ <http pattern="/controller/web/css/**" security="none" />
+ <http pattern="/controller/web/js/**" security="none" />
+ <http pattern="/controller/web/images/**" security="none" />
<http auto-config="false" authentication-manager-ref="authenticationManager"
var data = {};
data['x'] = ps.x;
data['y'] = ps.y;
- $.post('/one/topology/node/' + did, data);
+ $.post('/controller/web/topology/node/' + did, data);
},
onClick: function(node, eventInfo, e) {
return false;
one.topology.update = function() {
$('#topology').empty();
- $.getJSON(one.global.remoteAddress+"one/topology/visual.json", function(data) {
+ $.getJSON(one.global.remoteAddress+"controller/web/topology/visual.json", function(data) {
one.topology.init(data);
});
}
/** INIT */
-$.getJSON(one.global.remoteAddress+"one/topology/visual.json", function(data) {
+$.getJSON(one.global.remoteAddress+"controller/web/topology/visual.json", function(data) {
one.topology.init(data);
});
\ No newline at end of file
one.main.constants = {
address : {
menu : "/web.json",
- prefix : "/one",
+ prefix : "/controller/web",
save : "/save"
}
}
org.springframework.security.web.authentication.logout,
org.springframework.dao
</Import-Package>
- <Web-ContextPath>/one/topology</Web-ContextPath>
+ <Web-ContextPath>/controller/web/topology</Web-ContextPath>
</instructions>
</configuration>
</plugin>
<http pattern="/js/**" security="none" />
<http pattern="/images/**" security="none" />
<http pattern="/favicon.ico" security="none" />
- <http pattern="/one/css/**" security="none" />
- <http pattern="/one/js/**" security="none" />
- <http pattern="/one/images/**" security="none" />
+ <http pattern="/controller/web/css/**" security="none" />
+ <http pattern="/controller/web/js/**" security="none" />
+ <http pattern="/controller/web/images/**" security="none" />
<http auto-config="false" authentication-manager-ref="authenticationManager"
org.springframework.security.web.authentication.logout,
org.springframework.dao
</Import-Package>
- <Web-ContextPath>/one/troubleshoot</Web-ContextPath>
+ <Web-ContextPath>/controller/web/troubleshoot</Web-ContextPath>
</instructions>
</configuration>
</plugin>
<http pattern="/js/**" security="none" />
<http pattern="/images/**" security="none" />
<http pattern="/favicon.ico" security="none" />
- <http pattern="/one/css/**" security="none" />
- <http pattern="/one/js/**" security="none" />
- <http pattern="/one/images/**" security="none" />
+ <http pattern="/controller/web/css/**" security="none" />
+ <http pattern="/controller/web/js/**" security="none" />
+ <http pattern="/controller/web/images/**" security="none" />
<http auto-config="false" authentication-manager-ref="authenticationManager"
/**Troubleshoot modules*/
one.f.troubleshooting = {
- rootUrl: "/one/troubleshoot",
+ rootUrl: "/controller/web/troubleshoot",
rightBottomDashlet: {
get: function() {
var $rightBottomDashlet = $("#right-bottom").find(".dashlet");