Ignore:
Timestamp:
2009-11-08T13:38:44+01:00 (16 years ago)
Author:
jttt
Message:

Added support for referrers

File:
1 edited

Legend:

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

    r2381 r2407  
    44import java.util.Collection;
    55import java.util.HashSet;
    6 import java.util.HashMap;
    7 import java.util.Map;
    86
    97import org.openstreetmap.josm.data.osm.DataSet;
     
    119import org.openstreetmap.josm.data.osm.OsmPrimitive;
    1210import org.openstreetmap.josm.data.osm.Relation;
    13 import org.openstreetmap.josm.data.osm.RelationMember;
    1411import org.openstreetmap.josm.data.osm.Way;
    1512
     
    2320public class CollectBackReferencesVisitor extends AbstractVisitor {
    2421
    25     private final DataSet ds;
    2622    private final boolean indirectRefs;
    2723
    2824    private Collection<OsmPrimitive> data = new HashSet<OsmPrimitive>();
    29     private Map<OsmPrimitive, Collection<OsmPrimitive>> lookupTable = new HashMap<OsmPrimitive, Collection<OsmPrimitive>>();
    3025
    3126
    3227    /**
    33      * Construct a back reference counter.
    34      * has time complexity O(n) - so it is appropriate not to call it in cycle
    35      * @param ds The dataset to operate on.
     28     * @param ds This parameter is ignored
    3629     */
    3730    public CollectBackReferencesVisitor(DataSet ds) {
    38        this(ds, true);
     31        this(true);
    3932    }
    4033
    4134    /**
    42      * Construct a back reference counter.
    43      * has time complexity O(n) - so it is appropriate not to call it in cycle
    44      * @param ds The dataset to operate on.
     35     * @param ds This parameter is ignored
    4536     * @param indirectRefs Make also indirect references?
    4637     */
    4738    public CollectBackReferencesVisitor(DataSet ds, boolean indirectRefs) {
    48        this.ds = ds;
    49        this.indirectRefs = indirectRefs;
    50        if(ds != null)
    51           makeLookupTable();
     39        this.indirectRefs = indirectRefs;
    5240    }
    53    
    54     private void makeLookupTable() {
    55         for (Way w : ds.getWays()) {
    56             for (Node n : w.getNodes()) {
    57                 if (!lookupTable.containsKey(n)) lookupTable.put(n, new HashSet<OsmPrimitive>());
    58                 lookupTable.get(n).add(w);
    59             }
    60         }
    61         for (Relation r : ds.getRelations()) {
    62             for (RelationMember m : r.getMembers()) {
    63                 OsmPrimitive o = m.getMember();
    64                 if (!lookupTable.containsKey(o)) lookupTable.put(o, new HashSet<OsmPrimitive>());
    65                 lookupTable.get(o).add(r);
    66             }
    67         }
     41
     42    public CollectBackReferencesVisitor(boolean indirectRefs) {
     43        this.indirectRefs = indirectRefs;
    6844    }
     45
    6946
    7047    /**
     
    7249     */
    7350    public Collection<OsmPrimitive> getData(){
    74        return data;
     51        return data;
    7552    }
    7653
    7754    /**
    78      * Initialize data before associated visit calls 
     55     * Initialize data before associated visit calls
    7956     */
    8057    public void initialize(){
    81        data = new HashSet<OsmPrimitive>();
     58        data = new HashSet<OsmPrimitive>();
    8259    }
    8360
    8461    public void visit(OsmPrimitive o) {
    85        if(lookupTable.containsKey(o)){
    86           Collection<OsmPrimitive> c = lookupTable.get(o);
    87           Collection<OsmPrimitive> oldData = new HashSet<OsmPrimitive>(data);
    88           data.addAll(c);
    89           if(indirectRefs)
    90              for(OsmPrimitive oo : c)
    91                 if(!oldData.contains(oo))
    92                    visit(oo);
    93        }
     62        Collection<OsmPrimitive> c = o.getReferrers();
     63        Collection<OsmPrimitive> oldData = new HashSet<OsmPrimitive>(data);
     64        data.addAll(c);
     65        if(indirectRefs) {
     66            for(OsmPrimitive oo : c)
     67                if(!oldData.contains(oo)) {
     68                    visit(oo);
     69                }
     70        }
     71
    9472    }
    95    
     73
    9674    public void visit(Node n) {
    97        visit((OsmPrimitive)n);
     75        visit((OsmPrimitive)n);
    9876    }
    9977
    10078    public void visit(Way w) {
    101        visit((OsmPrimitive)w);
     79        visit((OsmPrimitive)w);
    10280    }
    10381
    10482    public void visit(Relation r) {
    105        visit((OsmPrimitive)r);
     83        visit((OsmPrimitive)r);
    10684    }
    10785}
Note: See TracChangeset for help on using the changeset viewer.