Skip to content
Snippets Groups Projects
Commit a4e05952 authored by Kanzhe Jiang's avatar Kanzhe Jiang
Browse files

order the ofmessage listeners in mockFloodlightProvider

parent 9865f682
No related branches found
No related tags found
No related merge requests found
...@@ -19,11 +19,14 @@ package net.floodlightcontroller.core.test; ...@@ -19,11 +19,14 @@ package net.floodlightcontroller.core.test;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Collection; import java.util.Collection;
import java.util.Collections;
import java.util.HashMap; import java.util.HashMap;
import java.util.Iterator; import java.util.Iterator;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
import java.util.Map.Entry;
import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.ConcurrentMap;
import java.util.concurrent.CopyOnWriteArrayList; import java.util.concurrent.CopyOnWriteArrayList;
import net.floodlightcontroller.core.FloodlightContext; import net.floodlightcontroller.core.FloodlightContext;
...@@ -39,19 +42,23 @@ import net.floodlightcontroller.core.module.FloodlightModuleContext; ...@@ -39,19 +42,23 @@ import net.floodlightcontroller.core.module.FloodlightModuleContext;
import net.floodlightcontroller.core.module.FloodlightModuleException; import net.floodlightcontroller.core.module.FloodlightModuleException;
import net.floodlightcontroller.core.module.IFloodlightModule; import net.floodlightcontroller.core.module.IFloodlightModule;
import net.floodlightcontroller.core.module.IFloodlightService; import net.floodlightcontroller.core.module.IFloodlightService;
import net.floodlightcontroller.core.util.ListenerDispatcher;
import net.floodlightcontroller.packet.Ethernet; import net.floodlightcontroller.packet.Ethernet;
import org.openflow.protocol.OFMessage; import org.openflow.protocol.OFMessage;
import org.openflow.protocol.OFPacketIn; import org.openflow.protocol.OFPacketIn;
import org.openflow.protocol.OFType; import org.openflow.protocol.OFType;
import org.openflow.protocol.factory.BasicFactory; import org.openflow.protocol.factory.BasicFactory;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
/** /**
* *
* @author David Erickson (daviderickson@cs.stanford.edu) * @author David Erickson (daviderickson@cs.stanford.edu)
*/ */
public class MockFloodlightProvider implements IFloodlightModule, IFloodlightProviderService { public class MockFloodlightProvider implements IFloodlightModule, IFloodlightProviderService {
protected Map<OFType, List<IOFMessageListener>> listeners; protected static Logger log = LoggerFactory.getLogger(MockFloodlightProvider.class);
protected ConcurrentMap<OFType, ListenerDispatcher<OFType,IOFMessageListener>> listeners;
protected List<IOFSwitchListener> switchListeners; protected List<IOFSwitchListener> switchListeners;
protected List<IHAListener> haListeners; protected List<IHAListener> haListeners;
protected Map<Long, IOFSwitch> switches; protected Map<Long, IOFSwitch> switches;
...@@ -61,36 +68,47 @@ public class MockFloodlightProvider implements IFloodlightModule, IFloodlightPro ...@@ -61,36 +68,47 @@ public class MockFloodlightProvider implements IFloodlightModule, IFloodlightPro
* *
*/ */
public MockFloodlightProvider() { public MockFloodlightProvider() {
listeners = new ConcurrentHashMap<OFType, List<IOFMessageListener>>(); listeners = new ConcurrentHashMap<OFType, ListenerDispatcher<OFType,
IOFMessageListener>>();
switches = new ConcurrentHashMap<Long, IOFSwitch>(); switches = new ConcurrentHashMap<Long, IOFSwitch>();
switchListeners = new CopyOnWriteArrayList<IOFSwitchListener>(); switchListeners = new CopyOnWriteArrayList<IOFSwitchListener>();
haListeners = new CopyOnWriteArrayList<IHAListener>(); haListeners = new CopyOnWriteArrayList<IHAListener>();
factory = new BasicFactory(); factory = new BasicFactory();
} }
public void addOFMessageListener(OFType type, IOFMessageListener listener) { @Override
if (!listeners.containsKey(type)) { public synchronized void addOFMessageListener(OFType type,
listeners.put(type, new ArrayList<IOFMessageListener>()); IOFMessageListener listener) {
ListenerDispatcher<OFType, IOFMessageListener> ldd =
listeners.get(type);
if (ldd == null) {
ldd = new ListenerDispatcher<OFType, IOFMessageListener>();
listeners.put(type, ldd);
} }
listeners.get(type).add(listener); ldd.addListener(type, listener);
} }
public void removeOFMessageListener(OFType type, IOFMessageListener listener) { @Override
listeners.get(type).remove(listener); public synchronized void removeOFMessageListener(OFType type,
IOFMessageListener listener) {
ListenerDispatcher<OFType, IOFMessageListener> ldd =
listeners.get(type);
if (ldd != null) {
ldd.removeListener(listener);
}
} }
/** /**
* @return the listeners * @return the listeners
*/ */
public Map<OFType, List<IOFMessageListener>> getListeners() { public Map<OFType, List<IOFMessageListener>> getListeners() {
return listeners; Map<OFType, List<IOFMessageListener>> lers =
} new HashMap<OFType, List<IOFMessageListener>>();
for(Entry<OFType, ListenerDispatcher<OFType, IOFMessageListener>> e :
/** listeners.entrySet()) {
* @param listeners the listeners to set lers.put(e.getKey(), e.getValue().getOrderedListeners());
*/ }
public void setListeners(Map<OFType, List<IOFMessageListener>> listeners) { return Collections.unmodifiableMap(lers);
this.listeners = listeners;
} }
public void clearListeners() { public void clearListeners() {
...@@ -121,10 +139,10 @@ public class MockFloodlightProvider implements IFloodlightModule, IFloodlightPro ...@@ -121,10 +139,10 @@ public class MockFloodlightProvider implements IFloodlightModule, IFloodlightPro
} }
public void dispatchMessage(IOFSwitch sw, OFMessage msg, FloodlightContext bc) { public void dispatchMessage(IOFSwitch sw, OFMessage msg, FloodlightContext bc) {
List<IOFMessageListener> listeners = this.listeners.get(msg.getType()); List<IOFMessageListener> theListeners = listeners.get(msg.getType()).getOrderedListeners();
if (listeners != null) { if (theListeners != null) {
Command result = Command.CONTINUE; Command result = Command.CONTINUE;
Iterator<IOFMessageListener> it = listeners.iterator(); Iterator<IOFMessageListener> it = theListeners.iterator();
if (OFType.PACKET_IN.equals(msg.getType())) { if (OFType.PACKET_IN.equals(msg.getType())) {
OFPacketIn pi = (OFPacketIn)msg; OFPacketIn pi = (OFPacketIn)msg;
Ethernet eth = new Ethernet(); Ethernet eth = new Ethernet();
...@@ -142,7 +160,7 @@ public class MockFloodlightProvider implements IFloodlightModule, IFloodlightPro ...@@ -142,7 +160,7 @@ public class MockFloodlightProvider implements IFloodlightModule, IFloodlightPro
public void handleOutgoingMessage(IOFSwitch sw, OFMessage m, FloodlightContext bc) { public void handleOutgoingMessage(IOFSwitch sw, OFMessage m, FloodlightContext bc) {
List<IOFMessageListener> msgListeners = null; List<IOFMessageListener> msgListeners = null;
if (listeners.containsKey(m.getType())) { if (listeners.containsKey(m.getType())) {
msgListeners = listeners.get(m.getType()); msgListeners = listeners.get(m.getType()).getOrderedListeners();
} }
if (msgListeners != null) { if (msgListeners != null) {
...@@ -195,7 +213,7 @@ public class MockFloodlightProvider implements IFloodlightModule, IFloodlightPro ...@@ -195,7 +213,7 @@ public class MockFloodlightProvider implements IFloodlightModule, IFloodlightPro
@Override @Override
public void run() { public void run() {
// no-op logListeners();
} }
@Override @Override
...@@ -302,4 +320,25 @@ public class MockFloodlightProvider implements IFloodlightModule, IFloodlightPro ...@@ -302,4 +320,25 @@ public class MockFloodlightProvider implements IFloodlightModule, IFloodlightPro
return 0; return 0;
} }
private void logListeners() {
for (Map.Entry<OFType,
ListenerDispatcher<OFType,
IOFMessageListener>> entry
: listeners.entrySet()) {
OFType type = entry.getKey();
ListenerDispatcher<OFType, IOFMessageListener> ldd =
entry.getValue();
StringBuffer sb = new StringBuffer();
sb.append("OFListeners for ");
sb.append(type);
sb.append(": ");
for (IOFMessageListener l : ldd.getOrderedListeners()) {
sb.append(l.getName());
sb.append(",");
}
log.debug(sb.toString());
}
}
} }
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment