package com.bluecove.emu.gui.model; import static com.bluecove.emu.gui.model.DatumNotification.Type.ADDED; import static com.bluecove.emu.gui.model.DatumNotification.Type.REMOVED; import java.util.ArrayList; import java.util.HashMap; import java.util.Iterator; import java.util.List; import java.util.Map; import java.util.Observable; import java.util.Map.Entry; import com.intel.bluetooth.emu.MonitorDevice; import com.intel.bluetooth.emu.MonitoringService; import com.intel.bluetooth.rmi.Client; public class Model extends Observable implements Runnable { private static Model instance; private boolean stop = false; private MonitoringService service; protected List<Device> devices = new ArrayList<Device>(); static { instance = new Model(); new Thread(instance).start(); } private Model() { } public static Model instance() { return instance; } public void stop() { this.stop = true; } public void run() { String host = null; String port = null; try { service = (MonitoringService) Client.getService(MonitoringService.class, false, host, port); } catch (Exception e) { e.printStackTrace(); } while (!stop) { try { List<MonitorDevice> devices = service.getDevices(); updateDeviceList(devices); Thread.sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } } } synchronized void updateDeviceList(List<MonitorDevice> newDevices) { Map<Long, MonitorDevice> newDevicesMap = new HashMap<Long, MonitorDevice>(); for (Iterator<MonitorDevice> iterator = newDevices.iterator(); iterator.hasNext();) { MonitorDevice monitorDevice = iterator.next(); newDevicesMap.put(monitorDevice.getDeviceDescriptor().getAddress(), monitorDevice); } for (Iterator<Device> iterator = devices.iterator(); iterator.hasNext();) { Device device = iterator.next(); if (newDevicesMap.containsKey(device.getId())) { device.setMonitorDevice(newDevicesMap.get(device.getId())); newDevicesMap.remove(device.getId()); } else { iterator.remove(); setChanged(); notifyObservers(new DatumNotification(REMOVED, device)); } } for (Iterator<Entry<Long, MonitorDevice>> iterator = newDevicesMap.entrySet().iterator(); iterator.hasNext();) { Entry<Long, MonitorDevice> newEntry = iterator.next(); Device device = new Device(newEntry.getKey(), newEntry.getValue()); devices.add(device); setChanged(); notifyObservers(new DatumNotification(ADDED, device)); } } }