| 140 | * Creates a new {@link DataSet}. |
| 141 | * @param copyFrom An other {@link DataSet} to copy the contents of this dataset from. |
| 142 | * @since xxx |
| 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 | /** |
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); |