Changeset 10346 in josm for trunk/src/org/openstreetmap


Ignore:
Timestamp:
2016-06-08T23:31:30+02:00 (8 years ago)
Author:
Don-vip
Message:

fix #12936 - Do not use clone() on Dataset (patch by michael2402) - gsoc-core

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

Legend:

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

    r9371 r10346  
    3737        this.bounds = bounds;
    3838        this.origin = origin;
     39    }
     40
     41    /**
     42     * Cosntructs a new {@link DataSource}
     43     * @param source The source to copy the data from.
     44     * @since 10346
     45     */
     46    public DataSource(DataSource source) {
     47        this(source.bounds, source.origin);
    3948    }
    4049
  • trunk/src/org/openstreetmap/josm/data/osm/DataSet.java

    r10309 r10346  
    138138
    139139    /**
     140     * Creates a new {@link DataSet}.
     141     * @param copyFrom An other {@link DataSet} to copy the contents of this dataset from.
     142     * @since 10346
     143     */
     144    public DataSet(DataSet copyFrom) {
     145        this();
     146        copyFrom.getReadLock().lock();
     147        try {
     148            Map<OsmPrimitive, OsmPrimitive> primMap = new HashMap<>();
     149            for (Node n : copyFrom.nodes) {
     150                Node newNode = new Node(n);
     151                primMap.put(n, newNode);
     152                addPrimitive(newNode);
     153            }
     154            for (Way w : copyFrom.ways) {
     155                Way newWay = new Way(w);
     156                primMap.put(w, newWay);
     157                List<Node> newNodes = new ArrayList<>();
     158                for (Node n: w.getNodes()) {
     159                    newNodes.add((Node) primMap.get(n));
     160                }
     161                newWay.setNodes(newNodes);
     162                addPrimitive(newWay);
     163            }
     164            // Because relations can have other relations as members we first clone all relations
     165            // and then get the cloned members
     166            for (Relation r : copyFrom.relations) {
     167                Relation newRelation = new Relation(r, r.isNew());
     168                newRelation.setMembers(null);
     169                primMap.put(r, newRelation);
     170                addPrimitive(newRelation);
     171            }
     172            for (Relation r : copyFrom.relations) {
     173                Relation newRelation = (Relation) primMap.get(r);
     174                List<RelationMember> newMembers = new ArrayList<>();
     175                for (RelationMember rm: r.getMembers()) {
     176                    newMembers.add(new RelationMember(rm.getRole(), primMap.get(rm.getMember())));
     177                }
     178                newRelation.setMembers(newMembers);
     179            }
     180            for (DataSource source : copyFrom.dataSources) {
     181                dataSources.add(new DataSource(source));
     182            }
     183            version = copyFrom.version;
     184        } finally {
     185            copyFrom.getReadLock().unlock();
     186        }
     187    }
     188
     189    /**
    140190     * Returns the lock used for reading.
    141191     * @return the lock used for reading
     
    873923    }
    874924
     925    /**
     926     * Return a copy of this dataset
     927     * @deprecated Use the copy constructor instead. Remove in July 2016
     928     */
     929    @Deprecated
    875930    @Override
    876931    public DataSet clone() {
    877         getReadLock().lock();
    878         try {
    879             DataSet ds = (DataSet) super.clone();
    880             Main.addProjectionChangeListener(ds);
    881             Map<OsmPrimitive, OsmPrimitive> primMap = new HashMap<>();
    882             for (Node n : nodes) {
    883                 Node newNode = new Node(n);
    884                 primMap.put(n, newNode);
    885                 ds.addPrimitive(newNode);
    886             }
    887             for (Way w : ways) {
    888                 Way newWay = new Way(w);
    889                 primMap.put(w, newWay);
    890                 List<Node> newNodes = new ArrayList<>();
    891                 for (Node n: w.getNodes()) {
    892                     newNodes.add((Node) primMap.get(n));
    893                 }
    894                 newWay.setNodes(newNodes);
    895                 ds.addPrimitive(newWay);
    896             }
    897             // Because relations can have other relations as members we first clone all relations
    898             // and then get the cloned members
    899             for (Relation r : relations) {
    900                 Relation newRelation = new Relation(r, r.isNew());
    901                 newRelation.setMembers(null);
    902                 primMap.put(r, newRelation);
    903                 ds.addPrimitive(newRelation);
    904             }
    905             for (Relation r : relations) {
    906                 Relation newRelation = (Relation) primMap.get(r);
    907                 List<RelationMember> newMembers = new ArrayList<>();
    908                 for (RelationMember rm: r.getMembers()) {
    909                     newMembers.add(new RelationMember(rm.getRole(), primMap.get(rm.getMember())));
    910                 }
    911                 newRelation.setMembers(newMembers);
    912             }
    913             for (DataSource source : dataSources) {
    914                 ds.dataSources.add(new DataSource(source.bounds, source.origin));
    915             }
    916             ds.version = version;
    917             return ds;
    918         } catch (CloneNotSupportedException e) {
    919             throw new IllegalStateException(e);
    920         } finally {
    921             getReadLock().unlock();
    922         }
     932        return new DataSet(this);
    923933    }
    924934
  • trunk/src/org/openstreetmap/josm/gui/dialogs/layer/DuplicateAction.java

    r10144 r10346  
    1111
    1212import org.openstreetmap.josm.Main;
     13import org.openstreetmap.josm.data.osm.DataSet;
    1314import org.openstreetmap.josm.gui.dialogs.LayerListDialog.LayerListModel;
    1415import org.openstreetmap.josm.gui.help.HelpUtil;
     
    6970                i++;
    7071            }
    71             Main.main.addLayer(new OsmDataLayer(oldLayer.data.clone(), newName, null));
     72            Main.main.addLayer(new OsmDataLayer(new DataSet(oldLayer.data), newName, null));
    7273        }
    7374    }
Note: See TracChangeset for help on using the changeset viewer.