Ignore:
Timestamp:
2009-11-07T14:41:34+01:00 (14 years ago)
Author:
jttt
Message:

Added map of primitives to dataset to make search by id faster
check if primitive already exist in addPrimitive and removePrimitive
use PrimitiveId instead of id + primitive type

File:
1 edited

Legend:

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

    r2396 r2399  
    11// License: GPL. Copyright 2007 by Immanuel Scholz and others
    22package org.openstreetmap.josm.data.osm;
     3
     4import static org.openstreetmap.josm.tools.I18n.tr;
    35
    46import java.awt.geom.Area;
     
    1416import java.util.LinkedList;
    1517import java.util.List;
     18import java.util.Map;
    1619import java.util.Set;
    1720
     
    3033public class DataSet implements Cloneable {
    3134
     35    private static class IdHash implements Hash<PrimitiveId,OsmPrimitive> {
     36
     37        public int getHashCode(PrimitiveId k) {
     38            return (int)k.getUniqueId() ^ k.getType().hashCode();
     39        }
     40
     41        public boolean equals(PrimitiveId key, OsmPrimitive value) {
     42            if (key == null || value == null) return false;
     43            return key.getUniqueId() == value.getUniqueId() && key.getType() == value.getType();
     44        }
     45    }
     46
    3247    /**
    3348     * A list of listeners to selection changed events. The list is static, as listeners register
     
    4863        }
    4964    }
     65
     66    private Storage<OsmPrimitive> allPrimitives = new Storage<OsmPrimitive>(new IdHash());
     67    private Map<PrimitiveId, OsmPrimitive> primitivesMap = allPrimitives.foreignKey(new IdHash());
    5068
    5169    /**
     
    179197     */
    180198    public void addPrimitive(OsmPrimitive primitive) {
     199        if (getPrimitiveById(primitive) != null)
     200            throw new DataIntegrityProblemException(
     201                    tr("Unable to add primitive {0} to the dataset because it's already included", primitive.toString()));
     202
    181203        if (primitive instanceof Node) {
    182204            nodes.add((Node) primitive);
     
    186208            relations.add((Relation) primitive);
    187209        }
     210        allPrimitives.add(primitive);
    188211    }
    189212
    190213    public OsmPrimitive addPrimitive(PrimitiveData data) {
     214        OsmPrimitive result;
    191215        if (data instanceof NodeData) {
    192             Node node = new Node((NodeData)data, this);
    193             nodes.add(node);
    194             return node;
     216            result = new Node((NodeData)data, this);
    195217        } else if (data instanceof WayData) {
    196             Way way = new Way((WayData)data, this);
    197             ways.add(way);
    198             return way;
     218            result = new Way((WayData)data, this);
    199219        } else if (data instanceof RelationData) {
    200             Relation relation = new Relation((RelationData)data, this);
    201             relations.add(relation);
    202             return relation;
     220            result = new Relation((RelationData)data, this);
    203221        } else
    204222            throw new AssertionError();
     223        addPrimitive(result);
     224        return result;
    205225    }
    206226
     
    214234     * @param primitive the primitive. Ignored if null.
    215235     */
    216     public void removePrimitive(OsmPrimitive primitive) {
    217         if (primitive == null)
     236    public void removePrimitive(PrimitiveId primitiveId) {
     237        OsmPrimitive primitive = getPrimitiveById(primitiveId);
     238        if (primitive == null) {
     239            System.out.println("Warning: somebody is trying to remove nonexisting primitive from the Dataset. Action will be ignored. You can report this problem on http://josm.openstreetmap.de");
     240            new Exception().printStackTrace();
    218241            return;
     242        }
    219243        if (primitive instanceof Node) {
    220244            nodes.remove(primitive);
     
    225249        }
    226250        selectedPrimitives.remove(primitive);
    227     }
    228 
    229     public void removePrimitive(long id, OsmPrimitiveType type) {
    230         removePrimitive(getPrimitiveById(id, type));
     251        allPrimitives.remove(primitive);
    231252    }
    232253
     
    542563     */
    543564    public OsmPrimitive getPrimitiveById(long id, OsmPrimitiveType type) {
    544         return getPrimitiveById(id, type, false);
    545     }
    546 
    547     public OsmPrimitive getPrimitiveById(long id, OsmPrimitiveType type, boolean createNew) {
    548         Collection<? extends OsmPrimitive> primitives = null;
    549         switch(type) {
    550         case NODE: primitives = nodes; break;
    551         case WAY: primitives = ways; break;
    552         case RELATION: primitives = relations; break;
    553         }
    554         for (OsmPrimitive primitive : primitives) {
    555             if (primitive.getUniqueId() == id) return primitive;
    556         }
    557 
    558         if (createNew) {
    559             OsmPrimitive result = null;
    560             switch (type) {
    561             case NODE: result = new Node(id, true); break;
    562             case WAY: result = new Way(id, true); break;
    563             case RELATION: result = new Relation(id, true); break;
     565        return getPrimitiveById(new SimplePrimitiveId(id, type), false);
     566    }
     567
     568    public OsmPrimitive getPrimitiveById(PrimitiveId primitiveId) {
     569        return getPrimitiveById(primitiveId, false);
     570    }
     571
     572    public OsmPrimitive getPrimitiveById(PrimitiveId primitiveId, boolean createNew) {
     573        OsmPrimitive result = primitivesMap.get(primitiveId);
     574
     575        if (result == null && createNew) {
     576            switch (primitiveId.getType()) {
     577            case NODE: result = new Node(primitiveId.getUniqueId(), true); break;
     578            case WAY: result = new Way(primitiveId.getUniqueId(), true); break;
     579            case RELATION: result = new Relation(primitiveId.getUniqueId(), true); break;
    564580            }
    565581            addPrimitive(result);
    566             return result;
    567         } else
    568             return null;
     582        }
     583
     584        return result;
    569585    }
    570586
Note: See TracChangeset for help on using the changeset viewer.