package net.java.cargotracker.domain.model.location; import java.io.Serializable; import javax.persistence.Embedded; import javax.persistence.Entity; import javax.persistence.GeneratedValue; import javax.persistence.Id; import javax.persistence.NamedQueries; import javax.persistence.NamedQuery; import javax.validation.constraints.NotNull; import org.apache.commons.lang3.Validate; /** * A location in our model is stops on a journey, such as cargo origin or * destination, or carrier movement end points. * * It is uniquely identified by a UN location code. */ @Entity @NamedQueries({ @NamedQuery(name = "Location.findAll", query = "Select l from Location l"), @NamedQuery(name = "Location.findByUnLocode", query = "Select l from Location l where l.unLocode = :unLocode")}) public class Location implements Serializable { private static final long serialVersionUID = 1L; @Id @GeneratedValue private Long id; @Embedded private UnLocode unLocode; @NotNull private String name; // Special Location object that marks an unknown location. public static final Location UNKNOWN = new Location(new UnLocode("XXXXX"), "Unknown location"); public Location() { // Nothing to do. } /** * @param unLocode UN Locode * @param name Location name * @throws IllegalArgumentException if the UN Locode or name is null */ public Location(UnLocode unLocode, String name) { Validate.notNull(unLocode); Validate.notNull(name); this.unLocode = unLocode; this.name = name; } /** * @return UN Locode for this location. */ public UnLocode getUnLocode() { return unLocode; } /** * @return Actual name of this location, e.g. "Stockholm". */ public String getName() { return name; } /** * @param object to compare * @return Since this is an entiy this will be true iff UN locodes are * equal. */ @Override public boolean equals(Object object) { if (object == null) { return false; } if (this == object) { return true; } if (!(object instanceof Location)) { return false; } Location other = (Location) object; return sameIdentityAs(other); } public boolean sameIdentityAs(Location other) { return this.unLocode.sameValueAs(other.unLocode); } /** * @return Hash code of UN locode. */ @Override public int hashCode() { return unLocode.hashCode(); } @Override public String toString() { return name + " [" + unLocode + "]"; } }