| | 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); |