Ticket #12680: patch-osm-primitive-predicates.patch

File patch-osm-primitive-predicates.patch, 12.5 KB (added by michael2402, 10 years ago)
  • src/org/openstreetmap/josm/data/osm/DataSet.java

    diff --git a/src/org/openstreetmap/josm/data/osm/DataSet.java b/src/org/openstreetmap/josm/data/osm/DataSet.java
    index c046d2b..901e7c2 100644
    a b import org.openstreetmap.josm.gui.progress.ProgressMonitor;  
    4747import org.openstreetmap.josm.gui.tagging.ac.AutoCompletionManager;
    4848import org.openstreetmap.josm.tools.FilteredCollection;
    4949import org.openstreetmap.josm.tools.Predicate;
     50import org.openstreetmap.josm.tools.Predicates;
    5051import org.openstreetmap.josm.tools.SubclassFilteredCollection;
    5152import org.openstreetmap.josm.tools.Utils;
    5253
    public final class DataSet implements Data, Cloneable, ProjectionChangeListener  
    263264     */
    264265    private final QuadBuckets<Node> nodes = new QuadBuckets<>();
    265266
    266     private <T extends OsmPrimitive> Collection<T> getPrimitives(Predicate<OsmPrimitive> predicate) {
     267    private <T extends OsmPrimitive> Collection<T> getPrimitives(Predicate<? super OsmPrimitive> predicate) {
    267268        return new SubclassFilteredCollection<>(allPrimitives, predicate);
    268269    }
    269270
    public final class DataSet implements Data, Cloneable, ProjectionChangeListener  
    401402     * @return A collection containing all primitives of the dataset. Data is not ordered
    402403     */
    403404    public Collection<OsmPrimitive> allPrimitives() {
    404         return getPrimitives(OsmPrimitive.allPredicate);
     405        return getPrimitives(Predicates.alwaysTrue());
    405406    }
    406407
    407408    /**
  • src/org/openstreetmap/josm/data/osm/OsmPrimitive.java

    diff --git a/src/org/openstreetmap/josm/data/osm/OsmPrimitive.java b/src/org/openstreetmap/josm/data/osm/OsmPrimitive.java
    index e21aeeb..dcc5e6b 100644
    a b import org.openstreetmap.josm.data.osm.visitor.Visitor;  
    2727import org.openstreetmap.josm.gui.mappaint.StyleCache;
    2828import org.openstreetmap.josm.tools.CheckParameterUtil;
    2929import org.openstreetmap.josm.tools.Predicate;
     30import org.openstreetmap.josm.tools.Predicates;
    3031import org.openstreetmap.josm.tools.Utils;
    3132import org.openstreetmap.josm.tools.template_engine.TemplateEngineDataProvider;
    3233
    public abstract class OsmPrimitive extends AbstractPrimitive implements Comparab  
    170171    }
    171172
    172173    /**
    173      * Some predicates, that describe conditions on primitives.
     174     * A predicate that filters primitives that are usable.
     175     * @see OsmPrimitive#isUsable()
    174176     */
    175177    public static final Predicate<OsmPrimitive> isUsablePredicate = new Predicate<OsmPrimitive>() {
    176178        @Override
    public abstract class OsmPrimitive extends AbstractPrimitive implements Comparab  
    179181        }
    180182    };
    181183
     184    /**
     185     * A predicate filtering primitives that are selectable.
     186     */
    182187    public static final Predicate<OsmPrimitive> isSelectablePredicate = new Predicate<OsmPrimitive>() {
    183188        @Override
    184189        public boolean evaluate(OsmPrimitive primitive) {
    public abstract class OsmPrimitive extends AbstractPrimitive implements Comparab  
    186191        }
    187192    };
    188193
     194    /**
     195     * A predicate filtering primitives that are not deleted.
     196     */
    189197    public static final Predicate<OsmPrimitive> nonDeletedPredicate = new Predicate<OsmPrimitive>() {
    190198        @Override public boolean evaluate(OsmPrimitive primitive) {
    191199            return !primitive.isDeleted();
    192200        }
    193201    };
    194202
     203    /**
     204     * A predicate filtering primitives that are not deleted and not incomplete.
     205     */
    195206    public static final Predicate<OsmPrimitive> nonDeletedCompletePredicate = new Predicate<OsmPrimitive>() {
    196207        @Override public boolean evaluate(OsmPrimitive primitive) {
    197208            return !primitive.isDeleted() && !primitive.isIncomplete();
    198209        }
    199210    };
    200211
     212    /**
     213     * A predicate filtering primitives that are not deleted and not incomplete and that are not a relation.
     214     */
    201215    public static final Predicate<OsmPrimitive> nonDeletedPhysicalPredicate = new Predicate<OsmPrimitive>() {
    202216        @Override public boolean evaluate(OsmPrimitive primitive) {
    203217            return !primitive.isDeleted() && !primitive.isIncomplete() && !(primitive instanceof Relation);
    204218        }
    205219    };
    206220
     221    /**
     222     * A predicate filtering primitives that are modified
     223     */
    207224    public static final Predicate<OsmPrimitive> modifiedPredicate = new Predicate<OsmPrimitive>() {
    208225        @Override public boolean evaluate(OsmPrimitive primitive) {
    209226            return primitive.isModified();
    210227        }
    211228    };
    212229
    213     public static final Predicate<OsmPrimitive> nodePredicate = new Predicate<OsmPrimitive>() {
    214         @Override public boolean evaluate(OsmPrimitive primitive) {
    215             return primitive.getClass() == Node.class;
    216         }
    217     };
     230    /**
     231     * A predicate filtering nodes.
     232     */
     233    public static final Predicate<OsmPrimitive> nodePredicate = Predicates.<OsmPrimitive>isOfClass(Node.class);
    218234
    219     public static final Predicate<OsmPrimitive> wayPredicate = new Predicate<OsmPrimitive>() {
    220         @Override public boolean evaluate(OsmPrimitive primitive) {
    221             return primitive.getClass() == Way.class;
    222         }
    223     };
     235    /**
     236     * A predicate filtering ways.
     237     */
     238    public static final Predicate<OsmPrimitive> wayPredicate = Predicates.<OsmPrimitive>isOfClass(Way.class);
    224239
    225     public static final Predicate<OsmPrimitive> relationPredicate = new Predicate<OsmPrimitive>() {
    226         @Override public boolean evaluate(OsmPrimitive primitive) {
    227             return primitive.getClass() == Relation.class;
    228         }
    229     };
     240    /**
     241     * A predicate filtering relations.
     242     */
     243    public static final Predicate<OsmPrimitive> relationPredicate = Predicates.<OsmPrimitive>isOfClass(Relation.class);
    230244
     245    /**
     246     * A predicate filtering multipolygon relations.
     247     */
    231248    public static final Predicate<OsmPrimitive> multipolygonPredicate = new Predicate<OsmPrimitive>() {
    232249        @Override public boolean evaluate(OsmPrimitive primitive) {
    233250            return primitive.getClass() == Relation.class && ((Relation) primitive).isMultipolygon();
    234251        }
    235252    };
    236253
    237     public static final Predicate<OsmPrimitive> allPredicate = new Predicate<OsmPrimitive>() {
    238         @Override public boolean evaluate(OsmPrimitive primitive) {
    239             return true;
    240         }
    241     };
     254    /**
     255     * A predicate that always returns true.
     256     * @deprecated Replaced by {@link Predicates#alwaysTrue()}
     257     */
     258    @Deprecated
     259    public static final Predicate<OsmPrimitive> allPredicate = Predicates.alwaysTrue();
    242260
     261    /**
     262     * This matches all ways that have a direction
     263     *
     264     * @see #FLAG_HAS_DIRECTIONS
     265     */
    243266    public static final Predicate<Tag> directionalKeyPredicate = new Predicate<Tag>() {
    244267        @Override
    245268        public boolean evaluate(Tag tag) {
    public abstract class OsmPrimitive extends AbstractPrimitive implements Comparab  
    676699        return false;
    677700    }
    678701
     702    /**
     703     * Updates the highlight flag for this primitive.
     704     * @param highlighted The new highlight flag.
     705     */
    679706    public void setHighlighted(boolean highlighted) {
    680707        if (isHighlighted() != highlighted) {
    681708            updateFlags(FLAG_HIGHLIGHTED, highlighted);
    public abstract class OsmPrimitive extends AbstractPrimitive implements Comparab  
    685712        }
    686713    }
    687714
     715    /**
     716     * Checks if the highlight flag for this primitive was set
     717     * @return The highlight flag.
     718     */
    688719    public boolean isHighlighted() {
    689720        return (flags & FLAG_HIGHLIGHTED) != 0;
    690721    }
    public abstract class OsmPrimitive extends AbstractPrimitive implements Comparab  
    819850        return result;
    820851    }
    821852
     853    /**
     854     * A tagged way that matches this pattern has a direction.
     855     * @see #FLAG_HAS_DIRECTIONS
     856     */
    822857    private static volatile Match directionKeys;
    823     private static volatile Match reversedDirectionKeys;
    824858
    825859    /**
    826      * Contains a list of direction-dependent keys that make an object
    827      * direction dependent.
    828      * Initialized by checkDirectionTagged()
     860     * A tagged way that matches this pattern has a direction that is reversed.
     861     * <p>
     862     * This pattern should be a subset of {@link #directionKeys}
     863     * @see #FLAG_DIRECTION_REVERSED
    829864     */
     865    private static volatile Match reversedDirectionKeys;
     866
    830867    static {
    831868        String reversedDirectionDefault = "oneway=\"-1\"";
    832869
    public abstract class OsmPrimitive extends AbstractPrimitive implements Comparab  
    836873                "junction=roundabout | (highway=motorway & -oneway=no & -oneway=reversible) | "+
    837874                "(highway=motorway_link & -oneway=no & -oneway=reversible)";
    838875
    839         try {
    840             reversedDirectionKeys = SearchCompiler.compile(Main.pref.get("tags.reversed_direction", reversedDirectionDefault));
    841         } catch (ParseError e) {
    842             Main.error("Unable to compile pattern for tags.reversed_direction, trying default pattern: " + e.getMessage());
     876        reversedDirectionKeys = compileDirectionKeys("tags.reversed_direction", reversedDirectionDefault);
     877        directionKeys = compileDirectionKeys("tags.direction", directionDefault);
     878    }
    843879
    844             try {
    845                 reversedDirectionKeys = SearchCompiler.compile(reversedDirectionDefault);
    846             } catch (ParseError e2) {
    847                 throw new AssertionError("Unable to compile default pattern for direction keys: " + e2.getMessage(), e2);
    848             }
    849         }
     880    private static Match compileDirectionKeys(String prefName, String defaultValue) throws AssertionError {
    850881        try {
    851             directionKeys = SearchCompiler.compile(Main.pref.get("tags.direction", directionDefault));
     882            return SearchCompiler.compile(Main.pref.get(prefName, defaultValue));
    852883        } catch (ParseError e) {
    853             Main.error("Unable to compile pattern for tags.direction, trying default pattern: " + e.getMessage());
     884            Main.error("Unable to compile pattern for " + prefName + ", trying default pattern: " + e.getMessage());
     885        }
    854886
    855             try {
    856                 directionKeys = SearchCompiler.compile(directionDefault);
    857             } catch (ParseError e2) {
    858                 throw new AssertionError("Unable to compile default pattern for direction keys: " + e2.getMessage(), e2);
    859             }
     887        try {
     888            return SearchCompiler.compile(defaultValue);
     889        } catch (ParseError e2) {
     890            throw new AssertionError("Unable to compile default pattern for direction keys: " + e2.getMessage(), e2);
    860891        }
    861892    }
    862893
  • src/org/openstreetmap/josm/tools/Predicates.java

    diff --git a/src/org/openstreetmap/josm/tools/Predicates.java b/src/org/openstreetmap/josm/tools/Predicates.java
    index 3dc899b..a70b4f3 100644
    a b public final class Predicates {  
    1616    }
    1717
    1818    /**
     19     * Creates a predicate that returns true every time.
     20     * @param <T> The type of the predicate.
     21     * @return A predicate returning <code>true</code>
     22     */
     23    public static <T> Predicate<T> alwaysTrue() {
     24        return new Predicate<T>() {
     25            @Override
     26            public boolean evaluate(T object) {
     27                return true;
     28            }
     29        };
     30    }
     31
     32    /**
     33     * Creates a predicate that returns false every time.
     34     * @param <T> The type of the predicate.
     35     * @return A predicate returning <code>false</code>
     36     */
     37    public static <T> Predicate<T> alwaysFalse() {
     38        return new Predicate<T>() {
     39            @Override
     40            public boolean evaluate(T object) {
     41                return false;
     42            }
     43        };
     44    }
     45
     46    /**
    1947     * Returns the negation of {@code predicate}.
    2048     * @param <T> type of items
    2149     * @param predicate the predicate to negate
    public final class Predicates {  
    4674    }
    4775
    4876    /**
     77     * Creates a new predicate that checks if elements are exactly of that class.
     78     * @param <T> The predicate type.
     79     * @param clazz The class the elements must have.
     80     * @return A predicate.
     81     */
     82    public static <T> Predicate<T> isOfClass(final Class<? extends T> clazz) {
     83        return new Predicate<T>() {
     84            @Override
     85            public boolean evaluate(T obj) {
     86                return obj != null && obj.getClass() == clazz;
     87            }
     88        };
     89    }
     90
     91    /**
    4992     * Returns a {@link Predicate} executing {@link Pattern#matcher(CharSequence)} and {@link java.util.regex.Matcher#matches}.
    5093     * @param pattern the pattern
    5194     * @return a {@link Predicate} executing {@link Pattern#matcher(CharSequence)} and {@link java.util.regex.Matcher#matches}