Ignore:
Timestamp:
2020-03-21T21:27:36+01:00 (4 years ago)
Author:
Don-vip
Message:

fix #18962 - introduce DataSet.update to avoid repetitive begin/endUpdate statements

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/org/openstreetmap/josm/data/osm/DataSet.java

    r16119 r16187  
    2424import java.util.function.Function;
    2525import java.util.function.Predicate;
     26import java.util.function.Supplier;
    2627import java.util.stream.Collectors;
    2728import java.util.stream.Stream;
     
    256257    public DataSet(OsmPrimitive... osmPrimitives) {
    257258        this();
    258         beginUpdate();
    259         try {
     259        update(() -> {
    260260            for (OsmPrimitive o : osmPrimitives) {
    261261                addPrimitive(o);
    262262            }
    263         } finally {
    264             endUpdate();
    265         }
     263        });
    266264    }
    267265
     
    499497        Objects.requireNonNull(primitive, "primitive");
    500498        checkModifiable();
    501         beginUpdate();
    502         try {
     499        update(() -> {
    503500            if (getPrimitiveById(primitive) != null)
    504501                throw new DataIntegrityProblemException(
     
    511508            store.addPrimitive(primitive);
    512509            firePrimitivesAdded(Collections.singletonList(primitive), false);
    513         } finally {
    514             endUpdate();
    515         }
     510        });
    516511    }
    517512
     
    528523    public void removePrimitive(PrimitiveId primitiveId) {
    529524        checkModifiable();
    530         beginUpdate();
    531         try {
     525        update(() -> {
    532526            OsmPrimitive primitive = getPrimitiveByIdChecked(primitiveId);
    533527            if (primitive == null)
     
    535529            removePrimitiveImpl(primitive);
    536530            firePrimitivesRemoved(Collections.singletonList(primitive), false);
    537         } finally {
    538             endUpdate();
    539         }
     531        });
    540532    }
    541533
     
    552544    void removePrimitive(OsmPrimitive primitive) {
    553545        checkModifiable();
    554         beginUpdate();
    555         try {
     546        update(() -> {
    556547            removePrimitiveImpl(primitive);
    557548            firePrimitivesRemoved(Collections.singletonList(primitive), false);
    558         } finally {
    559             endUpdate();
    560         }
     549        });
    561550    }
    562551
     
    804793    public Set<Way> unlinkNodeFromWays(Node node) {
    805794        checkModifiable();
    806         Set<Way> result = new HashSet<>();
    807         beginUpdate();
    808         try {
     795        return update(() -> {
     796            Set<Way> result = new HashSet<>();
    809797            for (Way way : node.getParentWays()) {
    810798                List<Node> wayNodes = way.getNodes();
     
    818806                }
    819807            }
    820         } finally {
    821             endUpdate();
    822         }
    823         return result;
     808            return result;
     809        });
    824810    }
    825811
     
    833819    public Set<Relation> unlinkPrimitiveFromRelations(OsmPrimitive primitive) {
    834820        checkModifiable();
    835         Set<Relation> result = new HashSet<>();
    836         beginUpdate();
    837         try {
     821        return update(() -> {
     822            Set<Relation> result = new HashSet<>();
    838823            for (Relation relation : getRelations()) {
    839824                List<RelationMember> members = relation.getMembers();
     
    854839                }
    855840            }
    856         } finally {
    857             endUpdate();
    858         }
    859         return result;
     841            return result;
     842        });
    860843    }
    861844
     
    869852    public Set<OsmPrimitive> unlinkReferencesToPrimitive(OsmPrimitive referencedPrimitive) {
    870853        checkModifiable();
    871         Set<OsmPrimitive> result = new HashSet<>();
    872         beginUpdate();
    873         try {
     854        return update(() -> {
     855            Set<OsmPrimitive> result = new HashSet<>();
    874856            if (referencedPrimitive instanceof Node) {
    875857                result.addAll(unlinkNodeFromWays((Node) referencedPrimitive));
    876858            }
    877859            result.addAll(unlinkPrimitiveFromRelations(referencedPrimitive));
    878         } finally {
    879             endUpdate();
    880         }
    881         return result;
     860            return result;
     861        });
    882862    }
    883863
     
    979959    }
    980960
     961    /**
     962     * Performs the update runnable between {@link #beginUpdate()} / {@link #endUpdate()} calls.
     963     * @param runnable update action
     964     * @since 16187
     965     */
     966    public void update(Runnable runnable) {
     967        beginUpdate();
     968        try {
     969            runnable.run();
     970        } finally {
     971            endUpdate();
     972        }
     973    }
     974
     975    /**
     976     * Performs the update function between {@link #beginUpdate()} / {@link #endUpdate()} calls.
     977     * @param function update function
     978     * @param t function argument
     979     * @param <T> argument type
     980     * @param <R> result type
     981     * @return function result
     982     * @since 16187
     983     */
     984    public <T, R> R update(Function<T, R> function, T t) {
     985        beginUpdate();
     986        try {
     987            return function.apply(t);
     988        } finally {
     989            endUpdate();
     990        }
     991    }
     992
     993    /**
     994     * Performs the update supplier between {@link #beginUpdate()} / {@link #endUpdate()} calls.
     995     * @param supplier update supplier
     996     * @param <R> result type
     997     * @return supplier result
     998     * @since 16187
     999     */
     1000    public <R> R update(Supplier<R> supplier) {
     1001        beginUpdate();
     1002        try {
     1003            return supplier.get();
     1004        } finally {
     1005            endUpdate();
     1006        }
     1007    }
     1008
    9811009    private void fireEventToListeners(AbstractDatasetChangedEvent event) {
    9821010        for (DataSetListener listener : listeners) {
     
    10441072     * Invalidates the internal cache of projected east/north coordinates.
    10451073     *
    1046      * This method can be invoked after the globally configured projection method
    1047      * changed.
     1074     * This method can be invoked after the globally configured projection method changed.
    10481075     */
    10491076    public void invalidateEastNorthCache() {
    10501077        if (ProjectionRegistry.getProjection() == null)
    10511078            return; // sanity check
    1052         beginUpdate();
    1053         try {
    1054             for (Node n : getNodes()) {
    1055                 n.invalidateEastNorthCache();
    1056             }
    1057         } finally {
    1058             endUpdate();
    1059         }
     1079        update(() -> getNodes().forEach(Node::invalidateEastNorthCache));
    10601080    }
    10611081
     
    10641084     */
    10651085    public void cleanupDeletedPrimitives() {
    1066         beginUpdate();
    1067         try {
     1086        update(() -> {
    10681087            Collection<OsmPrimitive> toCleanUp = getPrimitives(
    10691088                    primitive -> primitive.isDeleted() && (!primitive.isVisible() || primitive.isNew()));
     
    10761095                firePrimitivesRemoved(toCleanUp, false);
    10771096            }
    1078         } finally {
    1079             endUpdate();
    1080         }
     1097        });
    10811098    }
    10821099
     
    10911108        //TODO: Report listeners that are still active (should be none)
    10921109        checkModifiable();
    1093         beginUpdate();
    1094         try {
     1110        update(() -> {
    10951111            clearSelection();
    10961112            for (OsmPrimitive primitive : allPrimitives) {
     
    10991115            store.clear();
    11001116            allPrimitives.clear();
    1101         } finally {
    1102             endUpdate();
    1103         }
     1117        });
    11041118    }
    11051119
Note: See TracChangeset for help on using the changeset viewer.