adding FlowSynchronizer module
diff --git a/src/main/java/net/onrc/onos/ofcontroller/flowmanager/FlowSynchronizer.java b/src/main/java/net/onrc/onos/ofcontroller/flowmanager/FlowSynchronizer.java
new file mode 100644
index 0000000..8f9a08e
--- /dev/null
+++ b/src/main/java/net/onrc/onos/ofcontroller/flowmanager/FlowSynchronizer.java
@@ -0,0 +1,219 @@
+package net.onrc.onos.ofcontroller.flowmanager;
+
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.Collection;
+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 java.util.concurrent.ExecutionException;
+import java.util.concurrent.Executors;
+import java.util.concurrent.Future;
+
+import org.openflow.protocol.OFFeaturesReply;
+import org.openflow.protocol.OFMatch;
+import org.openflow.protocol.OFStatisticsRequest;
+import org.openflow.protocol.statistics.OFFlowStatisticsReply;
+import org.openflow.protocol.statistics.OFFlowStatisticsRequest;
+import org.openflow.protocol.statistics.OFStatistics;
+import org.openflow.protocol.statistics.OFStatisticsType;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import net.floodlightcontroller.core.IFloodlightProviderService;
+import net.floodlightcontroller.core.IOFSwitch;
+import net.floodlightcontroller.core.IOFSwitchListener;
+import net.floodlightcontroller.core.module.FloodlightModuleContext;
+import net.floodlightcontroller.core.module.FloodlightModuleException;
+import net.floodlightcontroller.core.module.IFloodlightModule;
+import net.floodlightcontroller.core.module.IFloodlightService;
+import net.onrc.onos.graph.GraphDBOperation;
+import net.onrc.onos.ofcontroller.core.INetMapTopologyObjects.IFlowEntry;
+import net.onrc.onos.ofcontroller.core.INetMapTopologyObjects.ISwitchObject;
+import net.onrc.onos.ofcontroller.floodlightlistener.NetworkGraphPublisher;
+import net.onrc.onos.ofcontroller.util.Dpid;
+import net.onrc.onos.ofcontroller.util.FlowEntry;
+import net.onrc.onos.ofcontroller.util.FlowEntryId;
+
+public class FlowSynchronizer implements IOFSwitchListener,
+					 IFloodlightModule {
+
+    protected GraphDBOperation dbHandler = new GraphDBOperation(""); //TODO: conf
+    private static Logger log = LoggerFactory.getLogger(FlowSynchronizer.class);
+    protected IFloodlightProviderService floodlightProvider;
+    protected Map<IOFSwitch, Thread> switchThread = new HashMap<IOFSwitch, Thread>();
+    
+    protected class Synchroizer implements Runnable {
+	IOFSwitch sw;
+	ISwitchObject swObj;
+	
+	public Synchroizer(IOFSwitch sw) {
+	    this.sw = sw;
+	    Dpid dpid = new Dpid(sw.getId());
+	    this.swObj = dbHandler.searchSwitch(dpid.toString());
+	}
+	
+	@Override
+	public void run() {
+	    //TODO: use a FlowEntryId, FlowEntry HashMap
+	    Set<FlowEntryId> graphEntries = getFlowEntriesFromGraph();
+	    Set<FlowEntryId> switchEntries = getFlowEntriesFromSwitch();
+	    compare(graphEntries, switchEntries);
+	}
+	
+	private void compare(Set<FlowEntryId> graphEntries, Set<FlowEntryId> switchEntries) {
+	    System.out.println("graph entries: " + graphEntries);
+            System.out.println("switch entries: " + switchEntries);
+	    Set<FlowEntryId> entriesToAdd = new HashSet<FlowEntryId>(graphEntries);
+	    entriesToAdd.removeAll(switchEntries);
+	    Set<FlowEntryId> entriesToRemove = switchEntries;
+	    entriesToRemove.removeAll(graphEntries);
+	    System.out.println("add: " + entriesToAdd);
+	    System.out.println("remove: " + entriesToRemove);
+	    //FlowDatabaseOperation for converting flowentries
+	    
+	    /* TODO: new implementation with graph
+	    for(FlowEntryId fid : switchEntries,keys()) {
+	    	if(graphEntries.contains(fid)) {
+	    	    graphEntries.remove(fid);
+	    	}
+	    	else {
+	    	    // remove fid from the switch
+	    	}
+	    }
+	    for(FlowEntry fe : graphEntries.values()) {
+	    	// add fid to switch
+	    }
+	     */
+	    
+	}
+	
+	private Set<FlowEntryId> getFlowEntriesFromGraph() {
+	    Set<FlowEntryId> entryIds = new HashSet<FlowEntryId>();
+	    for(IFlowEntry entry : swObj.getFlowEntries()) {
+		FlowEntryId flowEntryId = new FlowEntryId(entry.getFlowEntryId());
+		entryIds.add(flowEntryId);
+	    }
+	    return entryIds;	    
+	}
+	
+	private Set<FlowEntryId> getFlowEntriesFromSwitch() {
+
+	    int lengthU = 0;
+	    OFMatch match = new OFMatch();
+	    match.setWildcards(OFMatch.OFPFW_ALL);
+
+	    OFFlowStatisticsRequest stat = new OFFlowStatisticsRequest();
+	    stat.setOutPort((short) 0xffff); //TODO: OFPort.OFPP_NONE
+	    stat.setTableId((byte) 0xff); // TODO: fix this with enum (ALL TABLES)
+	    stat.setMatch(match);
+	    List<OFStatistics> stats = new ArrayList<OFStatistics>();
+	    stats.add(stat);
+	    lengthU += stat.getLength();
+
+	    OFStatisticsRequest req = new OFStatisticsRequest();
+	    req.setStatisticType(OFStatisticsType.FLOW);
+	    req.setStatistics(stats);
+	    lengthU += req.getLengthU();
+	    req.setLengthU(lengthU);
+
+	    List<OFStatistics> entries = null;
+	    try {
+		Future<List<OFStatistics>> dfuture = sw.getStatistics(req);
+		entries = dfuture.get();
+	    } catch (IOException e) {
+		// TODO Auto-generated catch block
+		e.printStackTrace();
+	    } catch (InterruptedException e) {
+		// TODO Auto-generated catch block
+		e.printStackTrace();
+	    } catch (ExecutionException e) {
+		// TODO Auto-generated catch block
+		e.printStackTrace();
+	    }
+	    
+	    Set<FlowEntryId> entryIds = new HashSet<FlowEntryId>();
+	    for(OFStatistics result : entries){
+		//System.out.println(result.getClass());
+		OFFlowStatisticsReply entry = (OFFlowStatisticsReply) result;
+		FlowEntryId flowEntryId = new FlowEntryId(entry.getCookie());
+		entryIds.add(flowEntryId);
+	    }
+	    return entryIds;
+	}
+	
+    }
+    
+    @Override
+    public void addedSwitch(IOFSwitch sw) {
+	// TODO Auto-generated method stub
+	System.out.println("added switch in flow sync: " + sw);
+	
+	// TODO: look at how this is spawned
+	Synchroizer sync = new Synchroizer(sw);
+	Thread t = new Thread(sync);
+	t.start();
+	switchThread.put(sw, t);
+    }
+
+    @Override
+    public void removedSwitch(IOFSwitch sw) {
+	// TODO Auto-generated method stub
+	System.out.println("removed switch in flow sync: " + sw);
+	Thread t = switchThread.remove(sw);
+	if(t != null) {
+	    t.interrupt();
+	}
+
+    }
+
+    @Override
+    public void switchPortChanged(Long switchId) {
+	// TODO Auto-generated method stub
+
+    }
+
+    @Override
+    public String getName() {
+	// TODO Auto-generated method stub
+	return "FlowSynchronizer";
+    }
+
+    @Override
+    public Collection<Class<? extends IFloodlightService>> getModuleServices() {
+	// TODO Auto-generated method stub
+	return null;
+    }
+
+    @Override
+    public Map<Class<? extends IFloodlightService>, IFloodlightService> getServiceImpls() {
+	// TODO Auto-generated method stub
+	return null;
+    }
+
+    @Override
+    public Collection<Class<? extends IFloodlightService>> getModuleDependencies() {
+	// TODO Auto-generated method stub
+	return null;
+    }
+
+    @Override
+    public void init(FloodlightModuleContext context)
+	    throws FloodlightModuleException {
+	// TODO Auto-generated method stub
+	System.out.println("********* Starting flow sync....");
+	floodlightProvider = context.getServiceImpl(IFloodlightProviderService.class);
+	System.out.println(context.getAllServices());	
+    }
+
+    @Override
+    public void startUp(FloodlightModuleContext context) {
+	// TODO Auto-generated method stub
+	floodlightProvider.addOFSwitchListener(this);
+	
+    }
+
+}