package eu.hgross.blaubot.core.acceptor.discovery; import java.util.ArrayList; import java.util.List; import java.util.concurrent.ConcurrentHashMap; import eu.hgross.blaubot.core.IBlaubotDevice; import eu.hgross.blaubot.core.State; import eu.hgross.blaubot.core.acceptor.ConnectionMetaDataDTO; import eu.hgross.blaubot.core.statemachine.events.AbstractBlaubotDeviceDiscoveryEvent; /** * Default IBlaubotBeaconStore implementation. */ public class BlaubotBeaconStore implements IBlaubotBeaconStore, IBlaubotDiscoveryEventListener { private static final String LOG_TAG = "BlaubotBeaconStore"; /** * If the ConnectionManager is attached to the BeaconService, it receives the DiscoveryEvents from the beacons * and always holds the last received discovery event for an unique device id. * These events hold the needed data to connect to the acceptors of these devices. */ private final ConcurrentHashMap<String, AbstractBlaubotDeviceDiscoveryEvent> lastBeaconEvents; private final ConcurrentHashMap<String, List<ConnectionMetaDataDTO>> lastConnectiontMetaData; public BlaubotBeaconStore() { this.lastBeaconEvents = new ConcurrentHashMap<>(); this.lastConnectiontMetaData = new ConcurrentHashMap<>(); } @Override public List<ConnectionMetaDataDTO> getLastKnownConnectionMetaData(String uniqueDeviceId) { return lastConnectiontMetaData.get(uniqueDeviceId); } @Override public State getLastKnownState(String uniqueDeviceId) { final AbstractBlaubotDeviceDiscoveryEvent lastDiscoveryEvent = getLastDiscoveryEvent(uniqueDeviceId); if (lastDiscoveryEvent == null) { return null; } return lastDiscoveryEvent.getRemoteDeviceState(); } @Override public AbstractBlaubotDeviceDiscoveryEvent getLastDiscoveryEvent(String uniqueDeviceID) { return this.lastBeaconEvents.get(uniqueDeviceID); } @Override public void putDiscoveryEvent(BeaconMessage theirBeaconMessage, IBlaubotDevice remoteDevice) { // create event and put it to the store (no populating!) final eu.hgross.blaubot.core.State theirState = theirBeaconMessage.getCurrentState(); AbstractBlaubotDeviceDiscoveryEvent discoveryEvent = theirState.createDiscoveryEventForDevice(remoteDevice, theirBeaconMessage.getOwnConnectionMetaDataList()); onDeviceDiscoveryEvent(discoveryEvent); } @Override public void putConnectionMetaData(String uniqueDeviceId, List<ConnectionMetaDataDTO> connectionMetaDataList) { this.lastConnectiontMetaData.put(uniqueDeviceId, connectionMetaDataList); } public void putConnectionMetaData(String uniqueDeviceId, ConnectionMetaDataDTO connectionMetaData) { final ArrayList<ConnectionMetaDataDTO> dtos = new ArrayList<>(); dtos.add(connectionMetaData); this.lastConnectiontMetaData.put(uniqueDeviceId, dtos); } @Override public void onDeviceDiscoveryEvent(AbstractBlaubotDeviceDiscoveryEvent discoveryEvent) { final String uniqueDeviceID = discoveryEvent.getRemoteDevice().getUniqueDeviceID(); this.lastBeaconEvents.put(uniqueDeviceID, discoveryEvent); putConnectionMetaData(uniqueDeviceID, discoveryEvent.getConnectionMetaData()); } @Override public String toString() { final StringBuffer sb = new StringBuffer("BlaubotBeaconStore{"); sb.append("lastConnectiontMetaData=").append(lastConnectiontMetaData); sb.append(", lastBeaconEvents=").append(lastBeaconEvents); sb.append('}'); return sb.toString(); } }