package eu.hgross.blaubot.admin; import java.nio.ByteBuffer; import java.util.Arrays; import java.util.List; import eu.hgross.blaubot.core.BlaubotConstants; import eu.hgross.blaubot.core.BlaubotDevice; import eu.hgross.blaubot.core.State; import eu.hgross.blaubot.core.acceptor.ConnectionMetaDataDTO; import eu.hgross.blaubot.core.statemachine.events.AbstractBlaubotDeviceDiscoveryEvent; import eu.hgross.blaubot.messaging.BlaubotMessage; /** * Admin message used to dispatch a beacon event over * * @author Henning Gross {@literal (mail.to@henning-gross.de)} * */ public class DiscoveredDeviceAdminMessage extends AbstractAdminMessage { private class MessageDTO { String uniqueDeviceId; State state; List<ConnectionMetaDataDTO> connectionMetaDataList; @Override public boolean equals(Object o) { if (this == o) return true; if (o == null || getClass() != o.getClass()) return false; MessageDTO that = (MessageDTO) o; if (state != that.state) return false; if (uniqueDeviceId != null ? !uniqueDeviceId.equals(that.uniqueDeviceId) : that.uniqueDeviceId != null) return false; return true; } @Override public int hashCode() { int result = uniqueDeviceId != null ? uniqueDeviceId.hashCode() : 0; result = 31 * result + (state != null ? state.hashCode() : 0); return result; } } private MessageDTO data; /** * Creates a message to dispatch a DeviceDiscoveryEvent to another device. * @param uniqueDeviceId the uniqueDeviceId of the device that was discovered * @param state the state of the discovered device * @param connectionMetaDataList the connection meta data of the just discovered device */ public DiscoveredDeviceAdminMessage(String uniqueDeviceId, State state, List<ConnectionMetaDataDTO> connectionMetaDataList) { super(CLASSIFIER_DISCOVERED_DEVICE); this.data = new MessageDTO(); this.data.uniqueDeviceId = uniqueDeviceId; this.data.connectionMetaDataList = connectionMetaDataList; this.data.state = state; } /** * Creates a message to dispatch a DeviceDiscoveryEvent to another device. * @param deviceDiscoveryEvent a device discovery event to be dispatched */ public DiscoveredDeviceAdminMessage(AbstractBlaubotDeviceDiscoveryEvent deviceDiscoveryEvent) { this(deviceDiscoveryEvent.getRemoteDevice().getUniqueDeviceID(), deviceDiscoveryEvent.getRemoteDeviceState(), deviceDiscoveryEvent.getConnectionMetaData()); } public DiscoveredDeviceAdminMessage(BlaubotMessage rawMessage) { super(rawMessage); } @Override protected byte[] payloadToBytes() { String json = gson.toJson(this.data); return json.getBytes(BlaubotConstants.STRING_CHARSET); } /** * Creates a new discovery event based on this message * @return the discovery event */ public AbstractBlaubotDeviceDiscoveryEvent createDiscoveryEvent() { return data.state.createDiscoveryEventForDevice(new BlaubotDevice(data.uniqueDeviceId), data.connectionMetaDataList); } @Override protected void setUpFromBytes(ByteBuffer messagePayloadAsBytes) { byte[] stringBytes = Arrays.copyOfRange(messagePayloadAsBytes.array(), messagePayloadAsBytes.position(), messagePayloadAsBytes.capacity()); String json = new String(stringBytes, BlaubotConstants.STRING_CHARSET); MessageDTO dto = gson.fromJson(json, MessageDTO.class); this.data = dto; } /** * @return the new prince device's uniqueId string */ public String getUniqueDeviceId() { return data.uniqueDeviceId; } @Override public String toString() { return "DiscoveredDeviceAdminMessage [uniqueDeviceId=" + data.uniqueDeviceId + ", connectionMetaDataList=" + data.connectionMetaDataList + ", state=" + data.state + "]"; } @Override public boolean equals(Object o) { if (this == o) return true; if (o == null || getClass() != o.getClass()) return false; if (!super.equals(o)) return false; DiscoveredDeviceAdminMessage that = (DiscoveredDeviceAdminMessage) o; if (data != null ? !data.equals(that.data) : that.data != null) return false; return true; } @Override public int hashCode() { int result = super.hashCode(); result = 31 * result + (data != null ? data.hashCode() : 0); return result; } }