001/*
002 * The contents of this file are subject to the terms of the Common Development and
003 * Distribution License (the License). You may not use this file except in compliance with the
004 * License.
005 *
006 * You can obtain a copy of the License at legal/CDDLv1.0.txt. See the License for the
007 * specific language governing permission and limitations under the License.
008 *
009 * When distributing Covered Software, include this CDDL Header Notice in each file and include
010 * the License file at legal/CDDLv1.0.txt. If applicable, add the following below the CDDL
011 * Header, with the fields enclosed by brackets [] replaced by your own identifying
012 * information: "Portions Copyright [year] [name of copyright owner]".
013 *
014 * Copyright 2009 Sun Microsystems, Inc.
015 * Portions Copyright 2016 ForgeRock AS.
016 */
017package org.forgerock.opendj.ldap;
018
019import java.util.List;
020
021/**
022 * An abstract filter visitor whose default implementation for all
023 * {@code Visitor} methods is to invoke {@link #visitDefaultFilter(Object)}.
024 * <p>
025 * Implementations can override the methods on a case by case behavior.
026 *
027 * @param <R>
028 *            The return type of this visitor's methods. Use
029 *            {@link java.lang.Void} for visitors that do not need to return
030 *            results.
031 * @param <P>
032 *            The type of the additional parameter to this visitor's methods.
033 *            Use {@link java.lang.Void} for visitors that do not need an
034 *            additional parameter.
035 */
036public abstract class AbstractFilterVisitor<R, P> implements FilterVisitor<R, P> {
037    /** Default constructor. */
038    protected AbstractFilterVisitor() {
039        // Nothing to do.
040    }
041
042    /**
043     * {@inheritDoc}
044     * <p>
045     * The default implementation is to call {@link #visitDefaultFilter(Object)}.
046     */
047    @Override
048    public R visitAndFilter(final P p, final List<Filter> subFilters) {
049        return visitDefaultFilter(p);
050    }
051
052    /**
053     * {@inheritDoc}
054     * <p>
055     * The default implementation is to call {@link #visitDefaultFilter(Object)}.
056     */
057    @Override
058    public R visitApproxMatchFilter(final P p, final String attributeDescription,
059            final ByteString assertionValue) {
060        return visitDefaultFilter(p);
061    }
062
063    /**
064     * Visits any filters which are not explicitly handled by other visitor
065     * methods.
066     * <p>
067     * The default implementation of this method is to return {@code null}.
068     *
069     * @param p
070     *            A visitor specified parameter.
071     * @return A visitor specified result.
072     */
073    public R visitDefaultFilter(final P p) {
074        return null;
075    }
076
077    /**
078     * {@inheritDoc}
079     * <p>
080     * The default implementation is to call {@link #visitDefaultFilter(Object)}.
081     */
082    @Override
083    public R visitEqualityMatchFilter(final P p, final String attributeDescription,
084            final ByteString assertionValue) {
085        return visitDefaultFilter(p);
086    }
087
088    /**
089     * {@inheritDoc}
090     * <p>
091     * The default implementation is to call {@link #visitDefaultFilter(Object)}.
092     */
093    @Override
094    public R visitExtensibleMatchFilter(final P p, final String matchingRule,
095            final String attributeDescription, final ByteString assertionValue,
096            final boolean dnAttributes) {
097        return visitDefaultFilter(p);
098    }
099
100    /**
101     * {@inheritDoc}
102     * <p>
103     * The default implementation is to call {@link #visitDefaultFilter(Object)}.
104     */
105    @Override
106    public R visitGreaterOrEqualFilter(final P p, final String attributeDescription,
107            final ByteString assertionValue) {
108        return visitDefaultFilter(p);
109    }
110
111    /**
112     * {@inheritDoc}
113     * <p>
114     * The default implementation is to call {@link #visitDefaultFilter(Object)}.
115     */
116    @Override
117    public R visitLessOrEqualFilter(final P p, final String attributeDescription,
118            final ByteString assertionValue) {
119        return visitDefaultFilter(p);
120    }
121
122    /**
123     * {@inheritDoc}
124     * <p>
125     * The default implementation is to call {@link #visitDefaultFilter(Object)}.
126     */
127    @Override
128    public R visitNotFilter(final P p, final Filter subFilter) {
129        return visitDefaultFilter(p);
130    }
131
132    /**
133     * {@inheritDoc}
134     * <p>
135     * The default implementation is to call {@link #visitDefaultFilter(Object)}.
136     */
137    @Override
138    public R visitOrFilter(final P p, final List<Filter> subFilters) {
139        return visitDefaultFilter(p);
140    }
141
142    /**
143     * {@inheritDoc}
144     * <p>
145     * The default implementation is to call {@link #visitDefaultFilter(Object)}.
146     */
147    @Override
148    public R visitPresentFilter(final P p, final String attributeDescription) {
149        return visitDefaultFilter(p);
150    }
151
152    /**
153     * {@inheritDoc}
154     * <p>
155     * The default implementation is to call {@link #visitDefaultFilter(Object)}.
156     */
157    @Override
158    public R visitSubstringsFilter(final P p, final String attributeDescription,
159            final ByteString initialSubstring, final List<ByteString> anySubstrings,
160            final ByteString finalSubstring) {
161        return visitDefaultFilter(p);
162    }
163
164    /**
165     * {@inheritDoc}
166     * <p>
167     * The default implementation is to call {@link #visitDefaultFilter(Object)}.
168     */
169    @Override
170    public R visitUnrecognizedFilter(final P p, final byte filterTag, final ByteString filterBytes) {
171        return visitDefaultFilter(p);
172    }
173}