Changes to Device and Switch storage to improve accuracy of device data. For now we will clear the devices when we add or remove ports.
diff --git a/src/main/java/net/onrc/onos/ofcontroller/core/internal/DeviceStorageImpl.java b/src/main/java/net/onrc/onos/ofcontroller/core/internal/DeviceStorageImpl.java
index cfc411c..e9e2bd1 100644
--- a/src/main/java/net/onrc/onos/ofcontroller/core/internal/DeviceStorageImpl.java
+++ b/src/main/java/net/onrc/onos/ofcontroller/core/internal/DeviceStorageImpl.java
@@ -1,5 +1,6 @@
 package net.onrc.onos.ofcontroller.core.internal;
 
+import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.List;
 
@@ -16,6 +17,7 @@
 import org.slf4j.LoggerFactory;
 
 import com.google.common.collect.Lists;
+import com.google.common.net.InetAddresses;
 import com.thinkaurelius.titan.core.TitanException;
 
 /**
@@ -23,7 +25,7 @@
  * @author Pankaj
  */
 public class DeviceStorageImpl implements IDeviceStorage {
-	protected final static Logger log = LoggerFactory.getLogger(SwitchStorageImpl.class);
+	protected final static Logger log = LoggerFactory.getLogger(DeviceStorageImpl.class);
 	
 	private GraphDBOperation ope;
 
@@ -110,19 +112,26 @@
 	@Override
 	public void removeDevice(IDevice device) {
 		IDeviceObject dev;
+		
+		if ((dev = ope.searchDevice(device.getMACAddressString())) != null) {
+			removeDevice(dev);
+		}
+	}
+	
+	public void removeDevice(IDeviceObject deviceObject) {
+		String deviceMac = deviceObject.getMACAddress();
+
+		for (IIpv4Address ipv4AddressVertex : deviceObject.getIpv4Addresses()) {
+			ope.removeIpv4Address(ipv4AddressVertex);
+		}
+
 		try {
-			if ((dev = ope.searchDevice(device.getMACAddressString())) != null) {
-				for (IIpv4Address ipv4AddressVertex : dev.getIpv4Addresses()) {
-					ope.removeIpv4Address(ipv4AddressVertex);
-				}
-				
-             	ope.removeDevice(dev);
-             	ope.commit();
-            	log.error("DeviceStorage:removeDevice mac:{} done", device.getMACAddressString());
-            }
+			ope.removeDevice(deviceObject);
+			ope.commit();
+			log.error("DeviceStorage:removeDevice mac:{} done", deviceMac);
 		} catch (TitanException e) {
 			ope.rollback();
-			log.error("DeviceStorage:removeDevice mac:{} failed", device.getMACAddressString());
+			log.error("DeviceStorage:removeDevice mac:{} failed", deviceMac);
 		}
 	}
 
@@ -212,6 +221,14 @@
 		for (IPortObject port: attachedPorts) {
 			log.debug("Detaching the device {}: detaching from port", device.getMACAddressString());
 			port.removeDevice(obj);
+			
+			if (!obj.getAttachedPorts().iterator().hasNext()) {
+				// XXX If there are no more ports attached to the device,
+				// delete it. Otherwise we have a situation where the
+				// device remains forever with an IP address attached.
+				// When we implement device probing we should get rid of this.
+				removeDevice(obj);
+			}
 		}
 	}
 
@@ -239,9 +256,30 @@
 	}
 	
 	private void changeDeviceIpv4Addresses(IDevice device, IDeviceObject deviceObject) {
+		List<String> dbIpv4Addresses = new ArrayList<String>();
+		for (IIpv4Address ipv4Vertex : deviceObject.getIpv4Addresses()) {
+			dbIpv4Addresses.add(InetAddresses.fromInteger(ipv4Vertex.getIpv4Address()).getHostAddress());
+		}
+		
+		List<String> memIpv4Addresses = new ArrayList<String>();
+		for (int addr : device.getIPv4Addresses()) {
+			memIpv4Addresses.add(InetAddresses.fromInteger(addr).getHostAddress());
+		}
+		
+		log.debug("Device IP addresses {}, database IP addresses {}",
+				memIpv4Addresses, dbIpv4Addresses);
+		
 		for (int ipv4Address : device.getIPv4Addresses()) {
 			if (deviceObject.getIpv4Address(ipv4Address) == null) {
 				IIpv4Address dbIpv4Address = ope.ensureIpv4Address(ipv4Address);
+				
+				IDeviceObject oldDevice = dbIpv4Address.getDevice();
+				if (oldDevice != null) {
+					oldDevice.removeIpv4Address(dbIpv4Address);
+				}
+				
+				log.debug("Adding IP address {}", 
+						InetAddresses.fromInteger(ipv4Address).getHostAddress());
 				deviceObject.addIpv4Address(dbIpv4Address);
 			}
 		}
@@ -249,6 +287,9 @@
 		List<Integer> deviceIpv4Addresses = Arrays.asList(device.getIPv4Addresses());
 		for (IIpv4Address dbIpv4Address : deviceObject.getIpv4Addresses()) {
 			if (!deviceIpv4Addresses.contains(dbIpv4Address.getIpv4Address())) {
+				log.debug("Removing IP address {}",
+						InetAddresses.fromInteger(dbIpv4Address.getIpv4Address())
+						.getHostAddress());
 				deviceObject.removeIpv4Address(dbIpv4Address);
 			}
 		}