View Javadoc
1   /*
2    * #%L
3    * VisitorAdapter.java - mongodb-async-driver - Allanbank Consulting, Inc.
4    * %%
5    * Copyright (C) 2011 - 2014 Allanbank Consulting, Inc.
6    * %%
7    * Licensed under the Apache License, Version 2.0 (the "License");
8    * you may not use this file except in compliance with the License.
9    * You may obtain a copy of the License at
10   * 
11   *      http://www.apache.org/licenses/LICENSE-2.0
12   * 
13   * Unless required by applicable law or agreed to in writing, software
14   * distributed under the License is distributed on an "AS IS" BASIS,
15   * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16   * See the License for the specific language governing permissions and
17   * limitations under the License.
18   * #L%
19   */
20  
21  package com.allanbank.mongodb.bson;
22  
23  import java.util.List;
24  
25  import com.allanbank.mongodb.bson.element.ObjectId;
26  
27  /**
28   * VisitorAdapter provides a helper for {@link Visitor} implementations that are
29   * only interested in a subset of the elements within a document.
30   * <p>
31   * This implementation will walk the entire tree of elements. Derived classes
32   * need only override the methods of interest. Derived classes should be careful
33   * to always call the {@code super} implementation of the following methods to
34   * ensure they do not break the document walking. Calling {@code super} for all
35   * methods is encouraged.
36   * <ul>
37   * <li> {@link #visit(List)}</li>
38   * <li> {@link #visitArray(String, List)}</li>
39   * <li> {@link #visitDocument(String, List)}</li>
40   * <li> {@link #visitJavaScript(String, String, Document)}</li>
41   * </ul>
42   * </p>
43   * <p>
44   * As a further aid to {@link Visitor} implementations only interested in the
45   * names of elements, this class will call the {@link #visitName(String)} method
46   * for each element visited.
47   * </p>
48   * 
49   * @api.yes This class is part of the driver's API. Public and protected members
50   *          will be deprecated for at least 1 non-bugfix release (version
51   *          numbers are &lt;major&gt;.&lt;minor&gt;.&lt;bugfix&gt;) before being
52   *          removed or modified.
53   * @copyright 2013, Allanbank Consulting, Inc., All Rights Reserved
54   */
55  public class VisitorAdapter implements Visitor {
56  
57      /**
58       * Creates a new VisitorAdapter.
59       */
60      public VisitorAdapter() {
61          super();
62      }
63  
64      /**
65       * {@inheritDoc}
66       * <p>
67       * Overridden to iterate over the elements of the document.
68       * </p>
69       */
70      @Override
71      public void visit(final List<Element> elements) {
72          for (final Element element : elements) {
73              element.accept(this);
74          }
75      }
76  
77      /**
78       * {@inheritDoc}
79       * <p>
80       * Overridden to visit the name of the element and then iterate over the
81       * elements of the array.
82       * </p>
83       */
84      @Override
85      public void visitArray(final String name, final List<Element> elements) {
86          visitName(name);
87          for (final Element element : elements) {
88              element.accept(this);
89          }
90      }
91  
92      /**
93       * {@inheritDoc}
94       * <p>
95       * Overridden to visit the name of the element.
96       * </p>
97       */
98      @Override
99      public void visitBinary(final String name, final byte subType,
100             final byte[] data) {
101         visitName(name);
102     }
103 
104     /**
105      * {@inheritDoc}
106      * <p>
107      * Overridden to visit the name of the element.
108      * </p>
109      */
110     @Override
111     public void visitBoolean(final String name, final boolean value) {
112         visitName(name);
113     }
114 
115     /**
116      * {@inheritDoc}
117      * <p>
118      * Overridden to visit the name of the element.
119      * </p>
120      */
121     @Override
122     public void visitDBPointer(final String name, final String databaseName,
123             final String collectionName, final ObjectId id) {
124         visitName(name);
125     }
126 
127     /**
128      * {@inheritDoc}
129      * <p>
130      * Overridden to visit the name of the element and then iterate over the
131      * elements of the document element.
132      * </p>
133      */
134     @Override
135     public void visitDocument(final String name, final List<Element> elements) {
136         visitName(name);
137         for (final Element element : elements) {
138             element.accept(this);
139         }
140     }
141 
142     /**
143      * {@inheritDoc}
144      * <p>
145      * Overridden to visit the name of the element.
146      * </p>
147      */
148     @Override
149     public void visitDouble(final String name, final double value) {
150         visitName(name);
151     }
152 
153     /**
154      * {@inheritDoc}
155      * <p>
156      * Overridden to visit the name of the element.
157      * </p>
158      */
159     @Override
160     public void visitInteger(final String name, final int value) {
161         visitName(name);
162     }
163 
164     /**
165      * {@inheritDoc}
166      * <p>
167      * Overridden to visit the name of the element.
168      * </p>
169      */
170     @Override
171     public void visitJavaScript(final String name, final String code) {
172         visitName(name);
173     }
174 
175     /**
176      * {@inheritDoc}
177      * <p>
178      * Overridden to visit the name of the element.
179      * </p>
180      */
181     @Override
182     public void visitJavaScript(final String name, final String code,
183             final Document scope) {
184         visitName(name);
185         scope.accept(this);
186     }
187 
188     /**
189      * {@inheritDoc}
190      * <p>
191      * Overridden to visit the name of the element.
192      * </p>
193      */
194     @Override
195     public void visitLong(final String name, final long value) {
196         visitName(name);
197     }
198 
199     /**
200      * {@inheritDoc}
201      * <p>
202      * Overridden to visit the name of the element.
203      * </p>
204      */
205     @Override
206     public void visitMaxKey(final String name) {
207         visitName(name);
208     }
209 
210     /**
211      * {@inheritDoc}
212      * <p>
213      * Overridden to visit the name of the element.
214      * </p>
215      */
216     @Override
217     public void visitMinKey(final String name) {
218         visitName(name);
219     }
220 
221     /**
222      * {@inheritDoc}
223      * <p>
224      * Overridden to visit the name of the element.
225      * </p>
226      */
227     @Override
228     public void visitMongoTimestamp(final String name, final long value) {
229         visitName(name);
230     }
231 
232     /**
233      * {@inheritDoc}
234      * <p>
235      * Overridden to visit the name of the element.
236      * </p>
237      */
238     @Override
239     public void visitNull(final String name) {
240         visitName(name);
241     }
242 
243     /**
244      * {@inheritDoc}
245      * <p>
246      * Overridden to visit the name of the element.
247      * </p>
248      */
249     @Override
250     public void visitObjectId(final String name, final ObjectId id) {
251         visitName(name);
252     }
253 
254     /**
255      * {@inheritDoc}
256      * <p>
257      * Overridden to visit the name of the element.
258      * </p>
259      */
260     @Override
261     public void visitRegularExpression(final String name, final String pattern,
262             final String options) {
263         visitName(name);
264     }
265 
266     /**
267      * {@inheritDoc}
268      * <p>
269      * Overridden to visit the name of the element.
270      * </p>
271      */
272     @Override
273     public void visitString(final String name, final String value) {
274         visitName(name);
275     }
276 
277     /**
278      * {@inheritDoc}
279      * <p>
280      * Overridden to visit the name of the element.
281      * </p>
282      */
283     @Override
284     public void visitSymbol(final String name, final String symbol) {
285         visitName(name);
286     }
287 
288     /**
289      * {@inheritDoc}
290      * <p>
291      * Overridden to visit the name of the element.
292      * </p>
293      */
294     @Override
295     public void visitTimestamp(final String name, final long timestamp) {
296         visitName(name);
297     }
298 
299     /**
300      * Extension point for {@link Visitor} implementation only interested in the
301      * name of the elements.
302      * 
303      * @param name
304      *            The name of the element.
305      */
306     protected void visitName(final String name) {
307         // Nothing. Extension point.
308     }
309 }