001    /*
002     *    GeoAPI - Java interfaces for OGC/ISO standards
003     *    http://www.geoapi.org
004     *
005     *    Copyright (C) 2006-2013 Open Geospatial Consortium, Inc.
006     *    All Rights Reserved. http://www.opengeospatial.org/ogc/legal
007     *
008     *    Permission to use, copy, and modify this software and its documentation, with
009     *    or without modification, for any purpose and without fee or royalty is hereby
010     *    granted, provided that you include the following on ALL copies of the software
011     *    and documentation or portions thereof, including modifications, that you make:
012     *
013     *    1. The full text of this NOTICE in a location viewable to users of the
014     *       redistributed or derivative work.
015     *    2. Notice of any changes or modifications to the OGC files, including the
016     *       date changes were made.
017     *
018     *    THIS SOFTWARE AND DOCUMENTATION IS PROVIDED "AS IS," AND COPYRIGHT HOLDERS MAKE
019     *    NO REPRESENTATIONS OR WARRANTIES, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED
020     *    TO, WARRANTIES OF MERCHANTABILITY OR FITNESS FOR ANY PARTICULAR PURPOSE OR THAT
021     *    THE USE OF THE SOFTWARE OR DOCUMENTATION WILL NOT INFRINGE ANY THIRD PARTY
022     *    PATENTS, COPYRIGHTS, TRADEMARKS OR OTHER RIGHTS.
023     *
024     *    COPYRIGHT HOLDERS WILL NOT BE LIABLE FOR ANY DIRECT, INDIRECT, SPECIAL OR
025     *    CONSEQUENTIAL DAMAGES ARISING OUT OF ANY USE OF THE SOFTWARE OR DOCUMENTATION.
026     *
027     *    The name and trademarks of copyright holders may NOT be used in advertising or
028     *    publicity pertaining to the software without specific, written prior permission.
029     *    Title to copyright in this software and any associated documentation will at all
030     *    times remain with copyright holders.
031     */
032    package org.opengis.filter;
033    
034    import org.opengis.filter.spatial.BBOX;
035    import org.opengis.filter.spatial.Beyond;
036    import org.opengis.filter.spatial.Contains;
037    import org.opengis.filter.spatial.Crosses;
038    import org.opengis.filter.spatial.DWithin;
039    import org.opengis.filter.spatial.Disjoint;
040    import org.opengis.filter.spatial.Equals;
041    import org.opengis.filter.spatial.Intersects;
042    import org.opengis.filter.spatial.Overlaps;
043    import org.opengis.filter.spatial.Touches;
044    import org.opengis.filter.spatial.Within;
045    import org.opengis.filter.temporal.After;
046    import org.opengis.filter.temporal.AnyInteracts;
047    import org.opengis.filter.temporal.Before;
048    import org.opengis.filter.temporal.Begins;
049    import org.opengis.filter.temporal.BegunBy;
050    import org.opengis.filter.temporal.During;
051    import org.opengis.filter.temporal.EndedBy;
052    import org.opengis.filter.temporal.Ends;
053    import org.opengis.filter.temporal.Meets;
054    import org.opengis.filter.temporal.MetBy;
055    import org.opengis.filter.temporal.OverlappedBy;
056    import org.opengis.filter.temporal.TContains;
057    import org.opengis.filter.temporal.TEquals;
058    import org.opengis.filter.temporal.TOverlaps;
059    
060    
061    /**
062     * Visitor with {@code visit} methods to be called by {@link Filter#accept Filter.accept(...)}.
063     * <p>
064     * Consider: It is unclear if this visitor should be applied directly to Filter, or should be walked accross
065     * the data structure by hand.  The standard complient structure is well defined, and this should negate
066     * the need for a formal visitor (we don't have internal structure we are hiding).
067     * </p>
068     * <p>
069     * There is still a very valid use for FilterVisitor, a instance may implement both FilterVisitor and ExpressionVisitor
070     * and ExpressionVisitory in one direction, and a FilterVisitor and a StyleVisitor in the other. The ability
071     * to directly focus on transforming data within a larger structure is something a normal data walk
072     * can not accomplish in a scalable manner.
073     * </p>
074     * @version <A HREF="http://www.opengis.org/docs/02-059.pdf">Implementation specification 1.0</A>
075     * @author Chris Dillard (SYS Technologies)
076     * @since GeoAPI 2.0
077     */
078    public interface FilterVisitor {
079        /**
080         * Used to account for a <code>null</code> filter value.
081         * <p>
082         * This is particularly used during data structure transofrmations, however
083         * the use of <code>null</code> is not recommended. Please make use of Filter.NONE
084         * and Filter.ALL as placeholder objects that communicate intent.
085         * </p>
086         * @param extraData Value object provided to visitor
087         * @return subclass defined
088         */
089        Object visitNullFilter(Object extraData);
090    
091        /**
092         * Visit {@link Filter#EXCLUDE} (often used during data structure transformations).
093         *
094         * @param filter {@link Filter#EXCLUDE}.
095         * @param extraData Value object provided to visitor
096         * @return subclass supplied
097         */
098        Object visit(ExcludeFilter filter, Object extraData);
099    
100        /**
101         * Visit {@link Filter#INCLUDE} (often used during data structure transformations).
102         *
103         * @param filter {@link Filter#INCLUDE}.
104         * @param extraData Value object provided to visitor
105         * @return subclass supplied
106         */
107        Object visit(IncludeFilter filter, Object extraData);
108    
109        Object visit(And filter,                            Object extraData);
110        Object visit(Id filter,                             Object extraData);
111        Object visit(Not filter,                            Object extraData);
112        Object visit(Or filter,                             Object extraData);
113        Object visit(PropertyIsBetween filter,              Object extraData);
114        Object visit(PropertyIsEqualTo filter,              Object extraData);
115        Object visit(PropertyIsNotEqualTo filter,           Object extraData);
116        Object visit(PropertyIsGreaterThan filter,          Object extraData);
117        Object visit(PropertyIsGreaterThanOrEqualTo filter, Object extraData);
118        Object visit(PropertyIsLessThan filter,             Object extraData);
119        Object visit(PropertyIsLessThanOrEqualTo filter,    Object extraData);
120        Object visit(PropertyIsLike filter,                 Object extraData);
121        Object visit(PropertyIsNull filter,                 Object extraData);
122        Object visit(PropertyIsNil filter,                  Object extraData);
123    
124        Object visit(BBOX filter,       Object extraData);
125        Object visit(Beyond filter,     Object extraData);
126        Object visit(Contains filter,   Object extraData);
127        Object visit(Crosses filter,    Object extraData);
128        Object visit(Disjoint filter,   Object extraData);
129        Object visit(DWithin filter,    Object extraData);
130        Object visit(Equals filter,     Object extraData);
131        Object visit(Intersects filter, Object extraData);
132        Object visit(Overlaps filter,   Object extraData);
133        Object visit(Touches filter,    Object extraData);
134        Object visit(Within filter,     Object extraData);
135    
136        Object visit(After filter,     Object extraData);
137        Object visit(AnyInteracts filter,     Object extraData);
138        Object visit(Before filter,     Object extraData);
139        Object visit(Begins filter,     Object extraData);
140        Object visit(BegunBy filter,     Object extraData);
141        Object visit(During filter,     Object extraData);
142        Object visit(EndedBy filter,     Object extraData);
143        Object visit(Ends filter,     Object extraData);
144        Object visit(Meets filter,     Object extraData);
145        Object visit(MetBy filter,     Object extraData);
146        Object visit(OverlappedBy filter,     Object extraData);
147        Object visit(TContains filter,     Object extraData);
148        Object visit(TEquals filter,     Object extraData);
149        Object visit(TOverlaps filter,     Object extraData);
150    
151    }