001: /*
002: * GeoTools - OpenSource mapping toolkit
003: * http://geotools.org
004: * (C) 2003-2006, GeoTools Project Managment Committee (PMC)
005: * (C) 2001, Institut de Recherche pour le Développement
006: *
007: * This library is free software; you can redistribute it and/or
008: * modify it under the terms of the GNU Lesser General Public
009: * License as published by the Free Software Foundation;
010: * version 2.1 of the License.
011: *
012: * This library is distributed in the hope that it will be useful,
013: * but WITHOUT ANY WARRANTY; without even the implied warranty of
014: * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
015: * Lesser General Public License for more details.
016: *
017: * This package contains documentation from OpenGIS specifications.
018: * OpenGIS consortium's work is fully acknowledged here.
019: */
020: package org.geotools.referencing.datum;
021:
022: // J2SE direct dependencies
023: import java.util.Collections;
024: import java.util.Date;
025: import java.util.Map;
026:
027: // OpenGIS dependencies
028: import org.opengis.util.InternationalString;
029: import org.opengis.referencing.datum.TemporalDatum;
030:
031: // Geotools dependencies
032: import org.geotools.referencing.AbstractIdentifiedObject;
033:
034: /**
035: * A temporal datum defines the origin of a temporal coordinate reference system.
036: *
037: * @source $URL: http://svn.geotools.org/geotools/tags/2.4.1/modules/library/referencing/src/main/java/org/geotools/referencing/datum/DefaultTemporalDatum.java $
038: * @version $Id: DefaultTemporalDatum.java 20874 2006-08-07 10:00:01Z jgarnett $
039: * @author Martin Desruisseaux
040: *
041: * @since 2.1
042: */
043: public class DefaultTemporalDatum extends AbstractDatum implements
044: TemporalDatum {
045: /**
046: * Serial number for interoperability with different versions.
047: */
048: private static final long serialVersionUID = 3357241732140076884L;
049:
050: /**
051: * Default datum for time measured since January 1st, 1970 at 00:00 UTC.
052: */
053: public static final DefaultTemporalDatum UNIX = new DefaultTemporalDatum(
054: "UNIX", new Date(0));
055:
056: /**
057: * The date and time origin of this temporal datum.
058: */
059: private final long origin;
060:
061: /**
062: * Constructs a new datum with the same values than the specified one.
063: * This copy constructor provides a way to wrap an arbitrary implementation into a
064: * Geotools one or a user-defined one (as a subclass), usually in order to leverage
065: * some implementation-specific API. This constructor performs a shallow copy,
066: * i.e. the properties are not cloned.
067: *
068: * @since 2.2
069: */
070: public DefaultTemporalDatum(final TemporalDatum datum) {
071: super (datum);
072: origin = datum.getOrigin().getTime();
073: }
074:
075: /**
076: * Constructs a temporal datum from a name.
077: *
078: * @param name The datum name.
079: * @param origin The date and time origin of this temporal datum.
080: */
081: public DefaultTemporalDatum(final String name, final Date origin) {
082: this (Collections.singletonMap(NAME_KEY, name), origin);
083: }
084:
085: /**
086: * Constructs a temporal datum from a set of properties. The properties map is given
087: * unchanged to the {@linkplain AbstractDatum#AbstractDatum(Map) super-class constructor}.
088: *
089: * @param properties Set of properties. Should contains at least <code>"name"</code>.
090: * @param origin The date and time origin of this temporal datum.
091: */
092: public DefaultTemporalDatum(final Map properties, final Date origin) {
093: super (properties);
094: ensureNonNull("origin", origin);
095: this .origin = origin.getTime();
096: }
097:
098: /**
099: * The date and time origin of this temporal datum.
100: *
101: * @return The date and time origin of this temporal datum.
102: */
103: public Date getOrigin() {
104: return new Date(origin);
105: }
106:
107: /**
108: * Description of the point or points used to anchor the datum to the Earth.
109: */
110: public InternationalString getAnchorPoint() {
111: return super .getAnchorPoint();
112: }
113:
114: /**
115: * The time after which this datum definition is valid.
116: */
117: public Date getRealizationEpoch() {
118: return super .getRealizationEpoch();
119: }
120:
121: /**
122: * Compare this temporal datum with the specified object for equality.
123: *
124: * @param object The object to compare to {@code this}.
125: * @param compareMetadata {@code true} for performing a strict comparaison, or
126: * {@code false} for comparing only properties relevant to transformations.
127: * @return {@code true} if both objects are equal.
128: */
129: public boolean equals(final AbstractIdentifiedObject object,
130: final boolean compareMetadata) {
131: if (object == this ) {
132: return true; // Slight optimization.
133: }
134: if (super .equals(object, compareMetadata)) {
135: final DefaultTemporalDatum that = (DefaultTemporalDatum) object;
136: return this .origin == that.origin;
137: }
138: return false;
139: }
140:
141: /**
142: * Returns a hash value for this temporal datum. {@linkplain #getName Name},
143: * {@linkplain #getRemarks remarks} and the like are not taken in account. In
144: * other words, two temporal datums will return the same hash value if they
145: * are equal in the sense of
146: * <code>{@link #equals equals}(AbstractIdentifiedObject, <strong>false</strong>)</code>.
147: *
148: * @return The hash code value. This value doesn't need to be the same
149: * in past or future versions of this class.
150: */
151: public int hashCode() {
152: return super .hashCode() ^ (int) origin ^ (int) (origin >>> 32);
153: }
154: }
|