001 // License: GPL. For details, see LICENSE file. 002 package org.openstreetmap.josm.command; 003 004 import static org.openstreetmap.josm.tools.I18n.marktr; 005 import static org.openstreetmap.josm.tools.I18n.tr; 006 007 import java.util.Collection; 008 import javax.swing.Icon; 009 010 import org.openstreetmap.josm.data.conflict.Conflict; 011 import org.openstreetmap.josm.data.osm.OsmPrimitive; 012 import org.openstreetmap.josm.data.osm.OsmPrimitiveType; 013 import org.openstreetmap.josm.tools.ImageProvider; 014 015 /** 016 * Represents a command for resolving a version conflict between two {@link OsmPrimitive} 017 * 018 * 019 */ 020 public class VersionConflictResolveCommand extends ConflictResolveCommand { 021 022 /** the conflict to resolve */ 023 private Conflict<? extends OsmPrimitive> conflict; 024 025 /** 026 * constructor 027 * @param my my primitive (i.e. the primitive from the local dataset) 028 * @param their their primitive (i.e. the primitive from the server) 029 */ 030 public VersionConflictResolveCommand(Conflict<? extends OsmPrimitive> conflict) { 031 this.conflict = conflict; 032 } 033 034 @Override 035 public String getDescriptionText() { 036 String msg = ""; 037 switch(OsmPrimitiveType.from(conflict.getMy())) { 038 case NODE: msg = marktr("Resolve version conflict for node {0}"); break; 039 case WAY: msg = marktr("Resolve version conflict for way {0}"); break; 040 case RELATION: msg = marktr("Resolve version conflict for relation {0}"); break; 041 } 042 return tr(msg, conflict.getMy().getId()); 043 } 044 045 @Override 046 public Icon getDescriptionIcon() { 047 return ImageProvider.get("data", "object"); 048 } 049 050 @Override 051 public boolean executeCommand() { 052 super.executeCommand(); 053 if (!conflict.getMy().isNew()) { 054 long myVersion = conflict.getMy().getVersion(); 055 long theirVersion = conflict.getTheir().getVersion(); 056 conflict.getMy().setOsmId( 057 conflict.getMy().getId(), 058 (int)Math.max(myVersion, theirVersion) 059 ); 060 // update visiblity state 061 if (theirVersion >= myVersion) { 062 conflict.getMy().setVisible(conflict.getTheir().isVisible()); 063 } 064 } 065 getLayer().getConflicts().remove(conflict); 066 rememberConflict(conflict); 067 return true; 068 } 069 070 @Override 071 public void fillModifiedData(Collection<OsmPrimitive> modified, Collection<OsmPrimitive> deleted, 072 Collection<OsmPrimitive> added) { 073 modified.add(conflict.getMy()); 074 } 075 }