// This software is released into the Public Domain. See copying.txt for details. package org.openstreetmap.osmosis.core.domain.v0_6; import org.openstreetmap.osmosis.core.store.StoreClassRegister; import org.openstreetmap.osmosis.core.store.StoreReader; import org.openstreetmap.osmosis.core.store.StoreWriter; import org.openstreetmap.osmosis.core.store.Storeable; /** * A data class representing a single member within a relation entity. * * @author Brett Henderson */ public class RelationMember implements Comparable<RelationMember>, Storeable { private long memberId; private EntityType memberType; private String memberRole; /** * Creates a new instance. * * @param memberId * The id of the entity that this member consists of. * @param memberType * The type of the entity that this member consists of. * @param memberRole * The role that this member forms within the relation. */ public RelationMember(long memberId, EntityType memberType, String memberRole) { this.memberId = memberId; this.memberType = memberType; this.memberRole = memberRole; if (memberType == null) { throw new IllegalArgumentException("null type given for relation-member"); } if (memberRole == null) { throw new IllegalArgumentException("null role given for relation-member"); } } /** * Creates a new instance. * * @param sr * The store to read state from. * @param scr * Maintains the mapping between classes and their identifiers * within the store. */ public RelationMember(StoreReader sr, StoreClassRegister scr) { this( sr.readLong(), EntityType.valueOf(sr.readString()), sr.readString() ); } /** * {@inheritDoc} */ public void store(StoreWriter sw, StoreClassRegister scr) { sw.writeLong(memberId); sw.writeString(memberType.toString()); sw.writeString(memberRole); } /** * Compares this relation member to the specified relation member. The * relation member comparison is based on a comparison of member type, then * member id, then role. * * @param relationMember * The relation member to compare to. * @return 0 if equal, < 0 if considered "smaller", and > 0 if * considered "bigger". */ public int compareTo(RelationMember relationMember) { long result; // Compare the member type. result = this.memberType.compareTo(relationMember.memberType); if (result > 0) { return 1; } else if (result < 0) { return -1; } // Compare the member id. result = this.memberId - relationMember.memberId; if (result > 0) { return 1; } else if (result < 0) { return -1; } // Compare the member role. result = this.memberRole.compareTo(relationMember.memberRole); if (result > 0) { return 1; } else if (result < 0) { return -1; } // No differences detected. return 0; } /** * Returns the id of the member entity. * * @return The member id. */ public long getMemberId() { return memberId; } /** * Returns the type of the member entity. * * @return The member type. */ public EntityType getMemberType() { return memberType; } /** * Returns the role that this member forms within the relation. * * @return The role. */ public String getMemberRole() { return memberRole; } /** * ${@inheritDoc}. */ @Override public String toString() { return "RelationMember(" + getMemberType() + " with id " + getMemberId() + " in the role '" + getMemberRole() + "')"; } }