/** * Copyright (C) 2010-2017 Structr GmbH * * This file is part of Structr <http://structr.org>. * * Structr is free software: you can redistribute it and/or modify * it under the terms of the GNU Affero General Public License as * published by the Free Software Foundation, either version 3 of the * License, or (at your option) any later version. * * Structr is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Affero General Public License for more details. * * You should have received a copy of the GNU Affero General Public License * along with Structr. If not, see <http://www.gnu.org/licenses/>. */ package org.structr.cloud.message; import java.io.DataInputStream; import java.io.DataOutputStream; import java.io.IOException; import org.structr.cloud.CloudConnection; import org.structr.common.error.FrameworkException; import org.structr.core.entity.AbstractRelationship; import org.structr.core.graph.RelationshipInterface; import org.structr.core.graph.SyncCommand; /** * Serializable data container for a relationship to be transported over network. * * To be initialized with {@link AbstractRelationship} in constructor. * * */ public class RelationshipDataContainer extends DataContainer implements Comparable<RelationshipDataContainer> { protected String sourceStartNodeId; protected String sourceEndNodeId; protected String relationshipId; protected String relType; public RelationshipDataContainer() {} public RelationshipDataContainer(final RelationshipInterface relationship, final int sequenceNumber) throws FrameworkException { this(relationship, sequenceNumber, relationship.getRelationship().getPropertyKeys()); } public RelationshipDataContainer(final RelationshipInterface relationship, final int sequenceNumber, final Iterable<String> propertyKeys) throws FrameworkException { super(sequenceNumber); relType = relationship.getClass().getSimpleName(); sourceStartNodeId = relationship.getSourceNode().getUuid(); sourceEndNodeId = relationship.getTargetNode().getUuid(); relationshipId = relationship.getUuid(); collectProperties(relationship.getRelationship(), propertyKeys); } /** * Return name * * @return type class */ public String getType() { return relType; } /** * Return id of start node in source instance * * @return start node id */ public String getSourceStartNodeId() { return sourceStartNodeId; } /** * Return id of end node in source instance * * @return end node id */ public String getSourceEndNodeId() { return sourceEndNodeId; } /** * Return id of relationship entity * * @return relationship id */ public String getRelationshipId() { return relationshipId; } @Override public int compareTo(RelationshipDataContainer t) { throw new UnsupportedOperationException("Not supported yet."); } @Override public boolean equals(final Object t) { RelationshipDataContainer other = (RelationshipDataContainer)t; return other.hashCode() == this.hashCode(); // return (this.getName().equals(other.getName()) && this.getSourceStartNodeId().equals(other.getSourceStartNodeId()) && this.getSourceEndNodeId().equals(other.getSourceEndNodeId())); } @Override public int hashCode() { int hashCode = 123; if (getType() != null) { hashCode += this.getType().hashCode() ^ 11; } if (getSourceStartNodeId() != null) { hashCode += this.getSourceStartNodeId().hashCode() ^ 12; } if (getSourceEndNodeId() != null) { hashCode += this.getSourceEndNodeId().hashCode() ^ 13; } return hashCode; } @Override public void onRequest(CloudConnection serverConnection) throws IOException, FrameworkException { serverConnection.storeRelationship(this); sendKeepalive(serverConnection); } @Override public void onResponse(CloudConnection clientConnection) throws IOException, FrameworkException { } @Override public void afterSend(CloudConnection connection) { } @Override protected void deserializeFrom(DataInputStream inputStream) throws IOException { this.sourceStartNodeId = (String)SyncCommand.deserialize(inputStream); this.sourceEndNodeId = (String)SyncCommand.deserialize(inputStream); this.relationshipId = (String)SyncCommand.deserialize(inputStream); this.relType = (String)SyncCommand.deserialize(inputStream); super.deserializeFrom(inputStream); } @Override protected void serializeTo(DataOutputStream outputStream) throws IOException { SyncCommand.serialize(outputStream, sourceStartNodeId); SyncCommand.serialize(outputStream, sourceEndNodeId); SyncCommand.serialize(outputStream, relationshipId); SyncCommand.serialize(outputStream, relType); super.serializeTo(outputStream); } }