001 // License: GPL. For details, see LICENSE file. 002 package org.openstreetmap.josm.data.osm; 003 004 import java.util.HashMap; 005 import java.util.HashSet; 006 import java.util.Iterator; 007 import java.util.Map; 008 import java.util.Set; 009 import java.util.Map.Entry; 010 011 import org.openstreetmap.josm.data.osm.history.HistoryOsmPrimitive; 012 import org.openstreetmap.josm.tools.CheckParameterUtil; 013 014 /** 015 * A ChangesetDataSet holds the content of a changeset. 016 */ 017 public class ChangesetDataSet { 018 019 public static enum ChangesetModificationType { 020 CREATED, 021 UPDATED, 022 DELETED 023 } 024 025 public static interface ChangesetDataSetEntry { 026 public ChangesetModificationType getModificationType(); 027 public HistoryOsmPrimitive getPrimitive(); 028 } 029 030 final private Map<PrimitiveId, HistoryOsmPrimitive> primitives = new HashMap<PrimitiveId, HistoryOsmPrimitive>(); 031 final private Map<PrimitiveId, ChangesetModificationType> modificationTypes = new HashMap<PrimitiveId, ChangesetModificationType>(); 032 033 /** 034 * Remembers a history primitive with the given modification type 035 * 036 * @param primitive the primitive. Must not be null. 037 * @param cmt the modification type. Must not be null. 038 * @throws IllegalArgumentException thrown if primitive is null 039 * @throws IllegalArgumentException thrown if cmt is null 040 */ 041 public void put(HistoryOsmPrimitive primitive, ChangesetModificationType cmt) throws IllegalArgumentException{ 042 CheckParameterUtil.ensureParameterNotNull(primitive,"primitive"); 043 CheckParameterUtil.ensureParameterNotNull(cmt,"cmt"); 044 primitives.put(primitive.getPrimitiveId(), primitive); 045 modificationTypes.put(primitive.getPrimitiveId(), cmt); 046 } 047 048 /** 049 * Replies true if the changeset content contains the object with primitive <code>id</code>. 050 * @param id the id. 051 * @return true if the changeset content contains the object with primitive <code>id</code> 052 */ 053 public boolean contains(PrimitiveId id) { 054 if (id == null) return false; 055 return primitives.containsKey(id); 056 } 057 058 /** 059 * Replies the modification type for the object with id <code>id</code>. Replies null, if id is null or 060 * if the object with id <code>id</code> isn't in the changeset content. 061 * 062 * @param id the id 063 * @return the modification type 064 */ 065 public ChangesetModificationType getModificationType(PrimitiveId id) { 066 if (!contains(id)) return null; 067 return modificationTypes.get(id); 068 } 069 070 /** 071 * Replies true if the primitive with id <code>id</code> was created in this 072 * changeset. Replies false, if id is null. 073 * 074 * @param id the id 075 * @return true if the primitive with id <code>id</code> was created in this 076 * changeset. 077 */ 078 public boolean isCreated(PrimitiveId id) { 079 if (!contains(id)) return false; 080 return ChangesetModificationType.CREATED.equals(getModificationType(id)); 081 } 082 083 /** 084 * Replies true if the primitive with id <code>id</code> was updated in this 085 * changeset. Replies false, if id is null. 086 * 087 * @param id the id 088 * @return true if the primitive with id <code>id</code> was updated in this 089 * changeset. 090 */ 091 public boolean isUpdated(PrimitiveId id) { 092 if (!contains(id)) return false; 093 return ChangesetModificationType.UPDATED.equals(getModificationType(id)); 094 } 095 096 /** 097 * Replies true if the primitive with id <code>id</code> was deleted in this 098 * changeset. Replies false, if id is null. 099 * 100 * @param id the id 101 * @return true if the primitive with id <code>id</code> was deleted in this 102 * changeset. 103 */ 104 public boolean isDeleted(PrimitiveId id) { 105 if (!contains(id)) return false; 106 return ChangesetModificationType.DELETED.equals(getModificationType(id)); 107 } 108 109 /** 110 * Replies the set of primitives with a specific modification type 111 * 112 * @param cmt the modification type. Must not be null. 113 * @return the set of primitives 114 * @throws IllegalArgumentException thrown if cmt is null 115 */ 116 public Set<HistoryOsmPrimitive> getPrimitivesByModificationType(ChangesetModificationType cmt) throws IllegalArgumentException { 117 CheckParameterUtil.ensureParameterNotNull(cmt,"cmt"); 118 HashSet<HistoryOsmPrimitive> ret = new HashSet<HistoryOsmPrimitive>(); 119 for (Entry<PrimitiveId, ChangesetModificationType> entry: modificationTypes.entrySet()) { 120 if (entry.getValue().equals(cmt)) { 121 ret.add(primitives.get(entry.getKey())); 122 } 123 } 124 return ret; 125 } 126 127 /** 128 * Replies the number of objects in the dataset 129 * 130 * @return the number of objects in the dataset 131 */ 132 public int size() { 133 return primitives.size(); 134 } 135 136 /** 137 * Replies the {@link HistoryOsmPrimitive} with id <code>id</code> from this 138 * dataset. null, if there is no such primitive in the data set. 139 * 140 * @param id the id 141 * @return the {@link HistoryOsmPrimitive} with id <code>id</code> from this 142 * dataset 143 */ 144 public HistoryOsmPrimitive getPrimitive(PrimitiveId id) { 145 if (id == null) return null; 146 return primitives.get(id); 147 } 148 149 public Iterator<ChangesetDataSetEntry> iterator() { 150 return new DefaultIterator(); 151 } 152 153 private static class DefaultChangesetDataSetEntry implements ChangesetDataSetEntry { 154 private ChangesetModificationType modificationType; 155 private HistoryOsmPrimitive primitive; 156 157 public DefaultChangesetDataSetEntry(ChangesetModificationType modificationType, HistoryOsmPrimitive primitive) { 158 this.modificationType = modificationType; 159 this.primitive = primitive; 160 } 161 162 public ChangesetModificationType getModificationType() { 163 return modificationType; 164 } 165 166 public HistoryOsmPrimitive getPrimitive() { 167 return primitive; 168 } 169 } 170 171 private class DefaultIterator implements Iterator<ChangesetDataSetEntry> { 172 private Iterator<Entry<PrimitiveId, ChangesetModificationType>> typeIterator; 173 174 public DefaultIterator() { 175 typeIterator = modificationTypes.entrySet().iterator(); 176 } 177 178 public boolean hasNext() { 179 return typeIterator.hasNext(); 180 } 181 182 public ChangesetDataSetEntry next() { 183 Entry<PrimitiveId, ChangesetModificationType> next = typeIterator.next(); 184 ChangesetModificationType type = next.getValue(); 185 HistoryOsmPrimitive primitive = primitives.get(next.getKey()); 186 return new DefaultChangesetDataSetEntry(type, primitive); 187 } 188 189 public void remove() { 190 throw new UnsupportedOperationException(); 191 } 192 } 193 }