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

Merge pull request #287 from kjiang/master

Order the OFMessageListener in mockFloodlightProvider
parents 01883ee3 a4e05952
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