package net.java.cargotracker.domain.model.cargo; import java.io.Serializable; import javax.persistence.Column; import javax.persistence.Embeddable; import javax.persistence.EnumType; import javax.persistence.Enumerated; import javax.persistence.JoinColumn; import javax.persistence.ManyToOne; import net.java.cargotracker.domain.model.handling.HandlingEvent; import net.java.cargotracker.domain.model.location.Location; import net.java.cargotracker.domain.model.voyage.Voyage; import org.apache.commons.lang3.Validate; import org.apache.commons.lang3.builder.EqualsBuilder; import org.apache.commons.lang3.builder.HashCodeBuilder; /** * A handling activity represents how and where a cargo can be handled, and can * be used to express predictions about what is expected to happen to a cargo in * the future. * */ @Embeddable public class HandlingActivity implements Serializable { private static final long serialVersionUID = 1L; @Enumerated(EnumType.STRING) @Column(name = "next_expected_handling_event_type") private HandlingEvent.Type type; @ManyToOne @JoinColumn(name = "next_expected_location_id") private Location location; @ManyToOne @JoinColumn(name = "next_expected_voyage_id") private Voyage voyage; public HandlingActivity() { } public HandlingActivity(HandlingEvent.Type type, Location location) { Validate.notNull(type, "Handling event type is required"); Validate.notNull(location, "Location is required"); this.type = type; this.location = location; } public HandlingActivity(HandlingEvent.Type type, Location location, Voyage voyage) { Validate.notNull(type, "Handling event type is required"); Validate.notNull(location, "Location is required"); Validate.notNull(voyage, "Voyage is required"); this.type = type; this.location = location; this.voyage = voyage; } public HandlingEvent.Type getType() { return type; } public Location getLocation() { return location; } public Voyage getVoyage() { return voyage; } private boolean sameValueAs(HandlingActivity other) { return other != null && new EqualsBuilder().append(this.type, other.type) .append(this.location, other.location) .append(this.voyage, other.voyage).isEquals(); } @Override public int hashCode() { return new HashCodeBuilder().append(this.type).append(this.location) .append(this.voyage).toHashCode(); } @Override public boolean equals(Object obj) { if (obj == this) { return true; } if (obj == null) { return false; } if (obj.getClass() != this.getClass()) { return false; } HandlingActivity other = (HandlingActivity) obj; return sameValueAs(other); } public boolean isEmpty() { if (type != null) { return false; } if (location != null) { return false; } return voyage == null; } }