1 package com.bluecove.emu.gui.model;
2
3 import static com.bluecove.emu.gui.model.DatumNotification.Type.ADDED;
4 import static com.bluecove.emu.gui.model.DatumNotification.Type.REMOVED;
5
6 import java.util.ArrayList;
7 import java.util.HashMap;
8 import java.util.Iterator;
9 import java.util.List;
10 import java.util.Map;
11 import java.util.Observable;
12 import java.util.Map.Entry;
13
14 import com.intel.bluetooth.emu.MonitorDevice;
15 import com.intel.bluetooth.emu.MonitoringService;
16 import com.intel.bluetooth.rmi.Client;
17
18 public class Model extends Observable implements Runnable {
19
20 private static Model instance;
21
22 private boolean stop = false;
23
24 private MonitoringService service;
25
26 protected List<Device> devices = new ArrayList<Device>();
27
28 static {
29 instance = new Model();
30 new Thread(instance).start();
31 }
32
33 private Model() {
34 }
35
36 public static Model instance() {
37 return instance;
38 }
39
40 public void stop() {
41 this.stop = true;
42 }
43
44 public void run() {
45 String host = null;
46 String port = null;
47 try {
48 service = (MonitoringService) Client.getService(MonitoringService.class, false, host, port);
49 } catch (Exception e) {
50 e.printStackTrace();
51 }
52 while (!stop) {
53 try {
54 List<MonitorDevice> devices = service.getDevices();
55 updateDeviceList(devices);
56 Thread.sleep(1000);
57 } catch (InterruptedException e) {
58 e.printStackTrace();
59 }
60 }
61 }
62
63 synchronized void updateDeviceList(List<MonitorDevice> newDevices) {
64 Map<Long, MonitorDevice> newDevicesMap = new HashMap<Long, MonitorDevice>();
65 for (Iterator<MonitorDevice> iterator = newDevices.iterator(); iterator.hasNext();) {
66 MonitorDevice monitorDevice = iterator.next();
67 newDevicesMap.put(monitorDevice.getDeviceDescriptor().getAddress(), monitorDevice);
68 }
69 for (Iterator<Device> iterator = devices.iterator(); iterator.hasNext();) {
70 Device device = iterator.next();
71 if (newDevicesMap.containsKey(device.getId())) {
72 device.setMonitorDevice(newDevicesMap.get(device.getId()));
73 newDevicesMap.remove(device.getId());
74 } else {
75 iterator.remove();
76 setChanged();
77 notifyObservers(new DatumNotification(REMOVED, device));
78 }
79 }
80 for (Iterator<Entry<Long, MonitorDevice>> iterator = newDevicesMap.entrySet().iterator(); iterator.hasNext();) {
81 Entry<Long, MonitorDevice> newEntry = iterator.next();
82 Device device = new Device(newEntry.getKey(), newEntry.getValue());
83 devices.add(device);
84 setChanged();
85 notifyObservers(new DatumNotification(ADDED, device));
86 }
87
88 }
89 }