001    // License: GPL. For details, see LICENSE file.
002    package org.openstreetmap.josm.gui.conflict.pair.tags;
003    
004    import static org.openstreetmap.josm.tools.I18n.tr;
005    
006    import org.openstreetmap.josm.data.osm.OsmPrimitive;
007    import org.openstreetmap.josm.gui.conflict.pair.MergeDecisionType;
008    import org.openstreetmap.josm.tools.CheckParameterUtil;
009    
010    /**
011     * TagMergeItem represents an individual merge action for a specific pair of key/value.
012     *
013     * A TagMergeItem manages the values of the two key/value-pairs and keeps track of the applied
014     * merge decision.
015     *
016     */
017    public class TagMergeItem {
018    
019        private String key = null;
020        private String myTagValue = null;
021        private String theirTagValue = null;
022        private MergeDecisionType mergeDecision = MergeDecisionType.UNDECIDED;
023    
024        /**
025         * constructor
026         *
027         * @param key  the common tag key. Must not be null.
028         * @param myTagValue  the value for this key known in the local dataset
029         * @param theirTagValue  the value for this key known in the dataset on the server
030         * @throws IllegalArgumentException if key is null
031         */
032        public TagMergeItem(String key, String myTagValue, String theirTagValue) {
033            CheckParameterUtil.ensureParameterNotNull(key, "key");
034            this.key  = key;
035            this.myTagValue = myTagValue;
036            this.theirTagValue = theirTagValue;
037            this.mergeDecision = MergeDecisionType.UNDECIDED;
038        }
039    
040        /**
041         * constructor
042         *
043         * @param key  the tag key common to the merged OSM primitives. Must not be null.
044         * @param my  my version of the OSM primitive (i.e. the version known in the local dataset). Must not be null.
045         * @param their their version of the OSM primitive (i.e. the version known on the server). Must not be null.
046         * @throws IllegalArgumentException thrown if key is null
047         * @throws IllegalArgumentException thrown if my is null
048         * @throws IllegalArgumentException thrown if their is null
049         */
050        public TagMergeItem(String key, OsmPrimitive my, OsmPrimitive their) {
051            CheckParameterUtil.ensureParameterNotNull(key, "key");
052            CheckParameterUtil.ensureParameterNotNull(my, "my");
053            CheckParameterUtil.ensureParameterNotNull(their, "their");
054            this.key = key;
055            myTagValue = my.get(key);
056            theirTagValue = their.get(key);
057        }
058    
059        /**
060         * applies a merge decision to this merge item
061         *
062         * @param decision the merge decision. Must not be null.
063         * @exception IllegalArgumentException thrown if decision is null
064         *
065         */
066        public void decide(MergeDecisionType decision) throws IllegalArgumentException {
067            CheckParameterUtil.ensureParameterNotNull(decision, "decision");
068            this.mergeDecision = decision;
069        }
070    
071        public String getKey() {
072            return key;
073        }
074    
075        public String getMyTagValue() {
076            return myTagValue;
077        }
078    
079        public String getTheirTagValue() {
080            return theirTagValue;
081        }
082    
083        public MergeDecisionType getMergeDecision() {
084            return mergeDecision;
085        }
086    
087        /**
088         * applies the current merge decisions to the tag set of an OSM primitive. The
089         * OSM primitive has the role of primitive in the local dataset ('my' primitive,
090         * not 'their' primitive)
091         *
092         * @param primitive the OSM primitive. Must not be null.
093         * @exception IllegalArgumentException thrown, if primitive is null
094         * @exception IllegalStateException  thrown, if this merge item is undecided
095         */
096        public void applyToMyPrimitive(OsmPrimitive primitive) throws IllegalArgumentException, IllegalStateException {
097            CheckParameterUtil.ensureParameterNotNull(primitive, "primitive");
098            if (mergeDecision == MergeDecisionType.UNDECIDED) {
099                throw new IllegalStateException(tr("Cannot apply undecided tag merge item."));
100            } else if (mergeDecision == MergeDecisionType.KEEP_THEIR) {
101                if (theirTagValue == null) {
102                    primitive.remove(key);
103                } else if (theirTagValue != null) {
104                    primitive.put(key, theirTagValue);
105                }
106            } else if (mergeDecision == MergeDecisionType.KEEP_MINE) {
107                if (myTagValue == null) {
108                    primitive.remove(key);
109                } else if (myTagValue != null) {
110                    primitive.put(key, myTagValue);
111                }
112            } else {
113               // should not happen
114            }
115        }
116    }