Changeset 2979 in josm


Ignore:
Timestamp:
Feb 14, 2010 1:07:03 PM (3 years ago)
Author:
Gubaer
Message:

fixed #4386: "There are unsolved conflicts in layer X" holds up any uploading from the layer

Location:
trunk/src/org/openstreetmap/josm
Files:
4 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/org/openstreetmap/josm/actions/UploadAction.java

    r2598 r2979  
    1818import org.openstreetmap.josm.data.APIDataSet; 
    1919import org.openstreetmap.josm.data.conflict.ConflictCollection; 
     20import org.openstreetmap.josm.gui.HelpAwareOptionPane; 
     21import org.openstreetmap.josm.gui.help.HelpUtil; 
    2022import org.openstreetmap.josm.gui.io.UploadDialog; 
    2123import org.openstreetmap.josm.gui.io.UploadPrimitivesTask; 
     
    101103    } 
    102104 
     105    protected void alertUnresolvedConflicts(OsmDataLayer layer) { 
     106        HelpAwareOptionPane.showOptionDialog( 
     107                Main.parent, 
     108                tr("<html>The data to be uploaded participates in unresolved conflicts of layer ''{0}''.<br>" 
     109                        + "You have to resolve them first.</html>", layer.getName() 
     110                ), 
     111                tr("Warning"), 
     112                JOptionPane.WARNING_MESSAGE, 
     113                HelpUtil.ht("/Action/Upload#PrimitivesParticipateInConflicts") 
     114        ); 
     115    } 
     116 
     117    /** 
     118     * Check whether the preconditions are met to upload data in <code>apiData</code>. 
     119     * Makes sure primitives in <code>apiData</code> don't participate in conflicts and 
     120     * runs the installed {@see UploadHook}s. 
     121     *  
     122     * @param layer the source layer of the data to be uploaded 
     123     * @param apiData the data to be uploaded 
     124     * @return true, if the preconditions are met; false, otherwise 
     125     */ 
    103126    public boolean checkPreUploadConditions(OsmDataLayer layer, APIDataSet apiData) { 
    104127        ConflictCollection conflicts = layer.getConflicts(); 
    105         if (conflicts !=null && !conflicts.isEmpty()) { 
    106             JOptionPane.showMessageDialog( 
    107                     Main.parent, 
    108                     tr("<html>There are unresolved conflicts in layer ''{0}''.<br>" 
    109                             + "You have to resolve them first.</html>", layer.getName()), 
    110                             tr("Warning"), 
    111                             JOptionPane.WARNING_MESSAGE 
    112             ); 
     128        if (apiData.participatesInConflict(conflicts)) { 
     129            alertUnresolvedConflicts(layer); 
    113130            return false; 
    114131        } 
    115         // Call all upload hooks in sequence. The upload confirmation dialog 
    116         // is one of these. 
     132        // Call all upload hooks in sequence. 
     133        // FIXME: this should become an asynchronous task 
     134        // 
    117135        for(UploadHook hook : uploadHooks) 
    118136            if(!hook.checkUpload(apiData)) 
     
    122140    } 
    123141 
     142    /** 
     143     * Uploads data to the OSM API. 
     144     *  
     145     * @param layer the source layer for the data to upload 
     146     * @param apiData the primitives to be added, updated, or deleted 
     147     */ 
    124148    public void uploadData(OsmDataLayer layer, APIDataSet apiData) { 
    125149        if (apiData.isEmpty()) { 
  • trunk/src/org/openstreetmap/josm/actions/UploadSelectionAction.java

    r2842 r2979  
    133133    } 
    134134 
     135    /** 
     136     * Replies true if there is at least one non-new, deleted primitive in 
     137     * <code>primitives</code> 
     138     *  
     139     * @param primitives the primitives to scan 
     140     * @return true if there is at least one non-new, deleted primitive in 
     141     * <code>primitives</code> 
     142     */ 
    135143    protected boolean hasPrimitivesToDelete(Collection<OsmPrimitive> primitives) { 
    136144        for (OsmPrimitive p: primitives) 
     
    139147        return false; 
    140148    } 
     149 
    141150    /** 
    142151     * Uploads the primitives in <code>toUpload</code> to the server. Only 
  • trunk/src/org/openstreetmap/josm/data/APIDataSet.java

    r2915 r2979  
    1515 
    1616import org.openstreetmap.josm.actions.upload.CyclicUploadDependencyException; 
     17import org.openstreetmap.josm.data.conflict.Conflict; 
     18import org.openstreetmap.josm.data.conflict.ConflictCollection; 
    1719import org.openstreetmap.josm.data.osm.DataSet; 
    1820import org.openstreetmap.josm.data.osm.Node; 
    1921import org.openstreetmap.josm.data.osm.OsmPrimitive; 
     22import org.openstreetmap.josm.data.osm.PrimitiveId; 
    2023import org.openstreetmap.josm.data.osm.Relation; 
    2124import org.openstreetmap.josm.data.osm.RelationMember; 
     
    137140        this(); 
    138141        init(ds); 
     142    } 
     143 
     144    /** 
     145     * Replies true if one of the primitives to be updated or to be deleted 
     146     * participates in the conflict <code>conflict</code> 
     147     *  
     148     * @param conflict the conflict 
     149     * @return true if one of the primitives to be updated or to be deleted 
     150     * participates in the conflict <code>conflict</code> 
     151     */ 
     152    public boolean participatesInConflict(Conflict<?> conflict) { 
     153        if (conflict == null) return false; 
     154        for (OsmPrimitive p: toUpdate) { 
     155            if (conflict.isParticipating(p)) return true; 
     156        } 
     157        for (OsmPrimitive p: toDelete) { 
     158            if (conflict.isParticipating(p)) return true; 
     159        } 
     160        return false; 
     161    } 
     162 
     163    /** 
     164     * Replies true if one of the primitives to be updated or to be deleted 
     165     * participates in at least one conflict in <code>conflicts</code> 
     166     *  
     167     * @param conflicts the collection of conflicts 
     168     * @return true if one of the primitives to be updated or to be deleted 
     169     * participates in at least one conflict in <code>conflicts</code> 
     170     */ 
     171    public boolean participatesInConflict(ConflictCollection conflicts) { 
     172        if (conflicts == null || conflicts.isEmpty()) return false; 
     173        Set<PrimitiveId> idsParticipatingInConflicts = new HashSet<PrimitiveId>(); 
     174        for (OsmPrimitive p: conflicts.getMyConflictParties()) { 
     175            idsParticipatingInConflicts.add(p.getPrimitiveId()); 
     176        } 
     177        for (OsmPrimitive p: conflicts.getTheirConflictParties()) { 
     178            idsParticipatingInConflicts.add(p.getPrimitiveId()); 
     179        } 
     180        for (OsmPrimitive p: toUpdate) { 
     181            if (idsParticipatingInConflicts.contains(p.getPrimitiveId())) return true; 
     182        } 
     183        for (OsmPrimitive p: toDelete) { 
     184            if (idsParticipatingInConflicts.contains(p.getPrimitiveId())) return true; 
     185        } 
     186        return false; 
    139187    } 
    140188 
  • trunk/src/org/openstreetmap/josm/data/conflict/Conflict.java

    r2881 r2979  
    33 
    44import org.openstreetmap.josm.data.osm.OsmPrimitive; 
     5import org.openstreetmap.josm.data.osm.PrimitiveId; 
    56 
    67/** 
     
    4243    } 
    4344 
     45    /** 
     46     * Replies true if the primitive <code>primitive</code> is participating 
     47     * in this conflict 
     48     *  
     49     * @param primitive the primitive 
     50     * @return true if the primitive <code>primitive</code> is participating 
     51     * in this conflict 
     52     */ 
     53    public boolean isParticipating(OsmPrimitive primitive) { 
     54        if (primitive == null) return false; 
     55        return primitive.getPrimitiveId().equals(my.getPrimitiveId()) 
     56        || primitive.getPrimitiveId().equals(their.getPrimitiveId()); 
     57    } 
     58 
     59    /** 
     60     * Replies true if the primitive with id <code>id</code> is participating 
     61     * in this conflict 
     62     *  
     63     * @param id the primitive id 
     64     * @return true if the primitive <code>primitive</code> is participating 
     65     * in this conflict 
     66     */ 
     67    public boolean isParticipating(PrimitiveId id) { 
     68        if (id == null) return false; 
     69        return id.equals(my.getPrimitiveId()) 
     70        || id.equals(their.getPrimitiveId()); 
     71    } 
     72 
    4473    @Override 
    4574    public int hashCode() { 
Note: See TracChangeset for help on using the changeset viewer.