001    // License: GPL. For details, see LICENSE file.
002    package org.openstreetmap.josm.data.osm.history;
003    
004    import java.util.Date;
005    
006    import org.openstreetmap.josm.data.coor.LatLon;
007    import org.openstreetmap.josm.data.osm.Node;
008    import org.openstreetmap.josm.data.osm.OsmPrimitiveType;
009    import org.openstreetmap.josm.data.osm.User;
010    
011    /**
012     * Represents an immutable OSM node in the context of a historical view on
013     * OSM data.
014     *
015     */
016    public class HistoryNode extends HistoryOsmPrimitive {
017        
018        /** the coordinates. May be null for deleted nodes */
019        private LatLon coords;
020    
021        /**
022         * Constructs a new {@code HistoryNode}.
023         * 
024         * @param id the id (> 0 required)
025         * @param version the version (> 0 required)
026         * @param visible whether the node is still visible
027         * @param user the user (! null required)
028         * @param changesetId the changeset id (> 0 required)
029         * @param timestamp the timestamp (! null required)
030         * @param coords the coordinates
031         * @throws IllegalArgumentException if preconditions are violated
032         */
033        public HistoryNode(long id, long version, boolean visible, User user, long changesetId, Date timestamp, LatLon coords) throws IllegalArgumentException {
034            this(id, version, visible, user, changesetId, timestamp, coords, true);
035        }
036    
037        /**
038         * Constructs a new {@code HistoryNode} with a configurable checking of historic parameters.
039         * This is needed to build virtual HistoryNodes for modified nodes, which do not have a timestamp and a changeset id.
040         * 
041         * @param id the id (> 0 required)
042         * @param version the version (> 0 required)
043         * @param visible whether the node is still visible
044         * @param user the user (! null required)
045         * @param changesetId the changeset id (> 0 required if {@code checkHistoricParams} is true)
046         * @param timestamp the timestamp (! null required if {@code checkHistoricParams} is true)
047         * @param coords the coordinates
048         * @param checkHistoricParams if true, checks values of {@code changesetId} and {@code timestamp}
049         * @throws IllegalArgumentException if preconditions are violated
050         * @since 5440
051         */
052        public HistoryNode(long id, long version, boolean visible, User user, long changesetId, Date timestamp, LatLon coords, boolean checkHistoricParams) throws IllegalArgumentException {
053            super(id, version, visible, user, changesetId, timestamp, checkHistoricParams);
054            setCoords(coords);
055        }
056    
057        /**
058         * Constructs a new {@code HistoryNode} from an existing {@link Node}.
059         * @param n the node
060         */
061        public HistoryNode(Node n) {
062            super(n);
063            setCoords(n.getCoor());
064        }
065    
066        @Override
067        public OsmPrimitiveType getType() {
068            return OsmPrimitiveType.NODE;
069        }
070    
071        /**
072         * Replies the coordinates. May be null.
073         * @return the coordinates. May be null.
074         */
075        public LatLon getCoords() {
076            return coords;
077        }
078    
079        /**
080         * Sets the coordinates. Can be null.
081         * @param coords the coordinates. Can be null.
082         */
083        public void setCoords(LatLon coords) {
084            this.coords = coords;
085        }
086    
087        @Override
088        public String getDisplayName(HistoryNameFormatter formatter) {
089            return formatter.format(this);
090        }
091    }