/* * Copyright (C) 2006-2016 DLR, Germany * * All rights reserved * * http://www.rcenvironment.de/ */ package de.rcenvironment.core.communication.nodeproperties.internal; import de.rcenvironment.core.communication.api.NodeIdentifierService; import de.rcenvironment.core.communication.common.IdentifierException; import de.rcenvironment.core.communication.common.InstanceNodeSessionId; import de.rcenvironment.core.communication.nodeproperties.NodeProperty; import de.rcenvironment.core.utils.common.StringUtils; /** * Represents a single key-value metadata entry of a specific node, with an added timestamp. * * @author Robert Mischke */ public class NodePropertyImpl implements NodeProperty { private final CompositeNodePropertyKey key; private final long sequenceNo; private final String value; private final InstanceNodeSessionId instanceSessionId; // parsed at creation for centralization public NodePropertyImpl(String compactForm, NodeIdentifierService nodeIdentifierService) throws IdentifierException { String[] parts = StringUtils.splitAndUnescape(compactForm); if (parts.length != 4) { throw new IllegalArgumentException("Wrong number of segments: " + compactForm); } this.key = new CompositeNodePropertyKey(parts[0], parts[1]); this.sequenceNo = Long.parseLong(parts[2]); this.value = parts[3]; this.instanceSessionId = nodeIdentifierService.parseInstanceNodeSessionIdString(key.getInstanceNodeSessionIdString()); } public NodePropertyImpl(InstanceNodeSessionId instanceSessionId, String dataKey, long sequenceNo, String value) { this.key = new CompositeNodePropertyKey(instanceSessionId.getInstanceNodeSessionIdString(), dataKey); this.sequenceNo = sequenceNo; this.value = value; this.instanceSessionId = instanceSessionId; } public CompositeNodePropertyKey getCompositeKey() { return key; } @Override public InstanceNodeSessionId getInstanceNodeSessionId() { return instanceSessionId; } @Override public String getInstanceNodeSessionIdString() { return key.getInstanceNodeSessionIdString(); } @Override public String getKey() { return key.getDataKey(); } @Override public long getSequenceNo() { return sequenceNo; } @Override public String getValue() { return value; } /** * @return the compact form of this entry that can be parsed by the single-arg constructor */ public String toCompactForm() { return StringUtils.escapeAndConcat(key.getInstanceNodeSessionIdString(), key.getDataKey(), Long.toString(sequenceNo), value); } /** * IMPORTANT: Two {@link NodePropertyImpl} instances are considered "equal" if their composite key is the same, ie they define the same * property of the same node. This is intended to support common set operations, but has the side effect that "equals" cannot be used to * check for equal sequence numbers and/or values. * * @param obj the other object to compare to * @return true if equal (see description) */ @Override public boolean equals(Object obj) { if (!(obj instanceof NodePropertyImpl)) { return false; } NodePropertyImpl other = (NodePropertyImpl) obj; return key.equals(other.getCompositeKey()); } @Override public int hashCode() { return key.hashCode(); } @Override public String toString() { // TODO provisional; improve as necessary return toCompactForm(); } }