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 <major>.<minor>.<bugfix>) 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 }