Classes in this File | Line Coverage | Branch Coverage | Complexity | ||||
ArrayBuilder |
|
| 1.0;1 |
1 | /* | |
2 | * #%L | |
3 | * ArrayBuilder.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 | package com.allanbank.mongodb.bson.builder; | |
21 | ||
22 | import java.util.Date; | |
23 | import java.util.UUID; | |
24 | import java.util.regex.Pattern; | |
25 | ||
26 | import com.allanbank.mongodb.bson.DocumentAssignable; | |
27 | import com.allanbank.mongodb.bson.Element; | |
28 | import com.allanbank.mongodb.bson.ElementAssignable; | |
29 | import com.allanbank.mongodb.bson.element.DocumentElement; | |
30 | import com.allanbank.mongodb.bson.element.NullElement; | |
31 | import com.allanbank.mongodb.bson.element.ObjectId; | |
32 | ||
33 | /** | |
34 | * Interface for a builder used to construct a BSON array. | |
35 | * | |
36 | * @api.yes This interface is part of the driver's API. Public and protected | |
37 | * members will be deprecated for at least 1 non-bugfix release | |
38 | * (version numbers are <major>.<minor>.<bugfix>) | |
39 | * before being removed or modified. | |
40 | * @copyright 2011-2013, Allanbank Consulting, Inc., All Rights Reserved | |
41 | */ | |
42 | public interface ArrayBuilder extends Builder { | |
43 | ||
44 | /** | |
45 | * Adds a boolean element. | |
46 | * <p> | |
47 | * This is a equivalent to {@link #addBoolean(boolean)} but less verbose. | |
48 | * </p> | |
49 | * | |
50 | * @param value | |
51 | * The boolean value. | |
52 | * @return This {@link ArrayBuilder} for method chaining. | |
53 | */ | |
54 | public ArrayBuilder add(boolean value); | |
55 | ||
56 | /** | |
57 | * Adds a binary element. | |
58 | * <p> | |
59 | * This is a equivalent to {@link #addBinary(byte, byte[])} but less | |
60 | * verbose. | |
61 | * </p> | |
62 | * | |
63 | * @param subType | |
64 | * The sub-type for the binary data. | |
65 | * @param data | |
66 | * The binary value. | |
67 | * @return This {@link ArrayBuilder} for method chaining. | |
68 | * @throws IllegalArgumentException | |
69 | * If {@code data} is <code>null</code>. | |
70 | */ | |
71 | public ArrayBuilder add(byte subType, byte[] data) | |
72 | throws IllegalArgumentException; | |
73 | ||
74 | /** | |
75 | * Adds a binary element using sub-type zero (the default). | |
76 | * <p> | |
77 | * This is a equivalent to {@link #addBinary(byte[])} but will insert a | |
78 | * {@link NullElement} if the {@code data} is <code>null</code> instead of | |
79 | * throwing an {@link IllegalArgumentException}. | |
80 | * </p> | |
81 | * | |
82 | * @param data | |
83 | * The binary value. | |
84 | * @return This {@link ArrayBuilder} for method chaining. | |
85 | */ | |
86 | public ArrayBuilder add(byte[] data); | |
87 | ||
88 | /** | |
89 | * Adds a timestamp element. The timestamp is the number of milliseconds | |
90 | * since the Unix epoch. | |
91 | * <p> | |
92 | * This is a equivalent to {@link #addTimestamp(long) | |
93 | * addTimeStamp(timestamp.getTime())} but will insert a {@link NullElement} | |
94 | * if the {@code timestamp} is <code>null</code> instead of throwing an | |
95 | * {@link IllegalArgumentException}. | |
96 | * </p> | |
97 | * | |
98 | * @param timestamp | |
99 | * The number of milliseconds since the Unix epoch. | |
100 | * @return This {@link ArrayBuilder} for method chaining. | |
101 | */ | |
102 | public ArrayBuilder add(Date timestamp); | |
103 | ||
104 | /** | |
105 | * Adds a pre-constructed document to the array. | |
106 | * <p> | |
107 | * This is a equivalent to {@link #addDocument(DocumentAssignable)} but will | |
108 | * insert a {@link NullElement} if the {@code document} is <code>null</code> | |
109 | * instead of throwing an {@link IllegalArgumentException}. | |
110 | * </p> | |
111 | * | |
112 | * @param document | |
113 | * The document to add to the array. | |
114 | * @return This {@link ArrayBuilder} for method chaining. | |
115 | */ | |
116 | public ArrayBuilder add(DocumentAssignable document); | |
117 | ||
118 | /** | |
119 | * Adds a pre-constructed {@link DocumentElement} to the array. | |
120 | * <p> | |
121 | * This is a equivalent to {@link #addDocument(DocumentAssignable)} but will | |
122 | * insert a {@link NullElement} if the {@code document} is <code>null</code> | |
123 | * instead of throwing an {@link IllegalArgumentException}. | |
124 | * </p> | |
125 | * <p> | |
126 | * Added to resolve ambiguity between the {@link DocumentElement} being both | |
127 | * a {@link DocumentAssignable} and an {@link ElementAssignable}. | |
128 | * </p> | |
129 | * | |
130 | * @param document | |
131 | * The document to add to the array. | |
132 | * @return This {@link ArrayBuilder} for method chaining. | |
133 | */ | |
134 | public ArrayBuilder add(DocumentElement document); | |
135 | ||
136 | /** | |
137 | * Adds a double element. | |
138 | * <p> | |
139 | * This is a equivalent to {@link #addDouble(double)} but less verbose. | |
140 | * </p> | |
141 | * | |
142 | * @param value | |
143 | * The double value. | |
144 | * @return This {@link ArrayBuilder} for method chaining. | |
145 | */ | |
146 | public ArrayBuilder add(double value); | |
147 | ||
148 | /** | |
149 | * Adds a pre-built element to the document. | |
150 | * | |
151 | * @param element | |
152 | * The element to add. | |
153 | * @return This {@link ArrayBuilder} for method chaining. | |
154 | * @throws IllegalArgumentException | |
155 | * If {@code element} is <code>null</code>. | |
156 | */ | |
157 | public ArrayBuilder add(ElementAssignable element) | |
158 | throws IllegalArgumentException; | |
159 | ||
160 | /** | |
161 | * Adds a integer (32-bit signed) element. | |
162 | * <p> | |
163 | * This is a equivalent to {@link #addInteger(int)} but less verbose. | |
164 | * </p> | |
165 | * | |
166 | * @param value | |
167 | * The integer value. | |
168 | * @return This {@link ArrayBuilder} for method chaining. | |
169 | */ | |
170 | public ArrayBuilder add(int value); | |
171 | ||
172 | /** | |
173 | * Adds a long (64-bit signed) element. | |
174 | * <p> | |
175 | * This is a equivalent to {@link #addLong(long)} but less verbose. | |
176 | * </p> | |
177 | * | |
178 | * @param value | |
179 | * The long value. | |
180 | * @return This {@link ArrayBuilder} for method chaining. | |
181 | */ | |
182 | public ArrayBuilder add(long value); | |
183 | ||
184 | /** | |
185 | * Adds the value to the array after trying to coerce the value into the | |
186 | * best possible element type. If the coercion fails then an | |
187 | * {@link IllegalArgumentException} is thrown. | |
188 | * <p> | |
189 | * This method does type inspection which can be slow. It is generally much | |
190 | * faster to use the type specific methods of this interface. | |
191 | * </p> | |
192 | * | |
193 | * @param value | |
194 | * The Object value to coerce into an element. | |
195 | * @return This {@link ArrayBuilder} for method chaining. | |
196 | * @throws IllegalArgumentException | |
197 | * If the {@code value} cannot be coerced into an element type. | |
198 | */ | |
199 | public ArrayBuilder add(Object value) throws IllegalArgumentException; | |
200 | ||
201 | /** | |
202 | * Adds an ObjectId element. | |
203 | * <p> | |
204 | * This is a equivalent to {@link #addObjectId(ObjectId)} but will insert a | |
205 | * {@link NullElement} if the {@code id} is <code>null</code> instead of | |
206 | * throwing an {@link IllegalArgumentException}. | |
207 | * </p> | |
208 | * | |
209 | * @param id | |
210 | * The ObjectId to add. | |
211 | * @return This {@link ArrayBuilder} for method chaining. | |
212 | */ | |
213 | public ArrayBuilder add(ObjectId id); | |
214 | ||
215 | /** | |
216 | * Adds an ObjectId element. | |
217 | * <p> | |
218 | * This is a equivalent to {@link #addRegularExpression(Pattern)} but will | |
219 | * insert a {@link NullElement} if the {@code pattern} is <code>null</code> | |
220 | * instead of throwing an {@link IllegalArgumentException}. | |
221 | * </p> | |
222 | * | |
223 | * @param pattern | |
224 | * The pattern for the regular expression. | |
225 | * @return This {@link ArrayBuilder} for method chaining. | |
226 | */ | |
227 | public ArrayBuilder add(Pattern pattern); | |
228 | ||
229 | /** | |
230 | * Adds a string element. | |
231 | * <p> | |
232 | * This is a equivalent to {@link #addString(String)} but will insert a | |
233 | * {@link NullElement} if the {@code value} is <code>null</code> instead of | |
234 | * throwing an {@link IllegalArgumentException}. | |
235 | * </p> | |
236 | * | |
237 | * @param value | |
238 | * The string value. | |
239 | * @return This {@link ArrayBuilder} for method chaining. | |
240 | */ | |
241 | public ArrayBuilder add(String value); | |
242 | ||
243 | /** | |
244 | * Adds a deprecated DBPointer element. | |
245 | * <p> | |
246 | * This is a equivalent to {@link #addDBPointer(String, String, ObjectId)} | |
247 | * but less verbose. | |
248 | * </p> | |
249 | * | |
250 | * @param databaseName | |
251 | * The name of the database containing the document. | |
252 | * @param collectionName | |
253 | * The name of the collection containing the document. | |
254 | * @param id | |
255 | * The id for the document. | |
256 | * @return This {@link ArrayBuilder} for method chaining. | |
257 | * @throws IllegalArgumentException | |
258 | * If {@code databaseName}, {@code collectionName}, or | |
259 | * {@code id} is <code>null</code>. | |
260 | * | |
261 | * @deprecated See BSON specification. | |
262 | */ | |
263 | @Deprecated | |
264 | public ArrayBuilder add(String databaseName, String collectionName, | |
265 | ObjectId id) throws IllegalArgumentException; | |
266 | ||
267 | /** | |
268 | * Adds a (sub-type 4) {@link UUID} binary element. | |
269 | * <p> | |
270 | * This is a equivalent to {@link #addUuid(UUID)} but will insert a | |
271 | * {@link NullElement} if the {@code uuid} is <code>null</code> instead of | |
272 | * throwing an {@link IllegalArgumentException}. | |
273 | * </p> | |
274 | * | |
275 | * @param uuid | |
276 | * The {@link UUID} to add. | |
277 | * @return This {@link ArrayBuilder} for method chaining. | |
278 | */ | |
279 | public ArrayBuilder add(UUID uuid); | |
280 | ||
281 | /** | |
282 | * Adds a binary element. | |
283 | * | |
284 | * @param subType | |
285 | * The sub-type for the binary data. | |
286 | * @param data | |
287 | * The binary value. | |
288 | * @return This {@link ArrayBuilder} for method chaining. | |
289 | * @throws IllegalArgumentException | |
290 | * If {@code data} is <code>null</code>. | |
291 | */ | |
292 | public ArrayBuilder addBinary(byte subType, byte[] data) | |
293 | throws IllegalArgumentException; | |
294 | ||
295 | /** | |
296 | * Adds a binary element using sub-type zero (the default). | |
297 | * <p> | |
298 | * This method throws an {@link IllegalArgumentException} if the | |
299 | * {@code data} is <code>null</code>. If you would prefer a | |
300 | * {@link NullElement} be inserted in the document use the | |
301 | * {@link #add(byte[])} method instead. | |
302 | * </p> | |
303 | * | |
304 | * @param data | |
305 | * The binary value. | |
306 | * @return This {@link ArrayBuilder} for method chaining. | |
307 | * @throws IllegalArgumentException | |
308 | * If {@code data} is <code>null</code>. | |
309 | */ | |
310 | public ArrayBuilder addBinary(byte[] data) throws IllegalArgumentException; | |
311 | ||
312 | /** | |
313 | * Adds a boolean element. | |
314 | * | |
315 | * @param value | |
316 | * The boolean value. | |
317 | * @return This {@link ArrayBuilder} for method chaining. | |
318 | */ | |
319 | public ArrayBuilder addBoolean(boolean value); | |
320 | ||
321 | /** | |
322 | * Adds a deprecated DBPointer element. | |
323 | * | |
324 | * @param databaseName | |
325 | * The name of the database containing the document. | |
326 | * @param collectionName | |
327 | * The name of the collection containing the document. | |
328 | * @param id | |
329 | * The id for the document. | |
330 | * @return This {@link ArrayBuilder} for method chaining. | |
331 | * @throws IllegalArgumentException | |
332 | * If {@code databaseName}, {@code collectionName}, or | |
333 | * {@code id} is <code>null</code>. | |
334 | * | |
335 | * @deprecated See BSON specification. | |
336 | */ | |
337 | @Deprecated | |
338 | public ArrayBuilder addDBPointer(String databaseName, | |
339 | String collectionName, ObjectId id) throws IllegalArgumentException; | |
340 | ||
341 | /** | |
342 | * Adds a pre-constructed document to the array. | |
343 | * <p> | |
344 | * This method throws an {@link IllegalArgumentException} if the | |
345 | * {@code document} is <code>null</code>. If you would prefer a | |
346 | * {@link NullElement} be inserted in the document use the | |
347 | * {@link #add(DocumentAssignable)} method instead. | |
348 | * </p> | |
349 | * | |
350 | * @param document | |
351 | * The document to add to the array. | |
352 | * @return This {@link ArrayBuilder} for method chaining. | |
353 | * @throws IllegalArgumentException | |
354 | * If {@code document} is <code>null</code>. | |
355 | */ | |
356 | public ArrayBuilder addDocument(DocumentAssignable document) | |
357 | throws IllegalArgumentException; | |
358 | ||
359 | /** | |
360 | * Adds a double element. | |
361 | * | |
362 | * @param value | |
363 | * The double value. | |
364 | * @return This {@link ArrayBuilder} for method chaining. | |
365 | */ | |
366 | public ArrayBuilder addDouble(double value); | |
367 | ||
368 | /** | |
369 | * Adds a integer (32-bit signed) element. | |
370 | * | |
371 | * @param value | |
372 | * The integer value. | |
373 | * @return This {@link ArrayBuilder} for method chaining. | |
374 | */ | |
375 | public ArrayBuilder addInteger(int value); | |
376 | ||
377 | /** | |
378 | * Adds a JavaScript element. | |
379 | * | |
380 | * @param code | |
381 | * The java script code. | |
382 | * @return This {@link ArrayBuilder} for method chaining. | |
383 | * @throws IllegalArgumentException | |
384 | * If {@code code} is <code>null</code>. | |
385 | */ | |
386 | public ArrayBuilder addJavaScript(String code) | |
387 | throws IllegalArgumentException; | |
388 | ||
389 | /** | |
390 | * Adds a JavaScript with Scope element. | |
391 | * | |
392 | * @param code | |
393 | * The java script code. | |
394 | * @param scope | |
395 | * The scope for the JacaScript code. | |
396 | * @return This {@link ArrayBuilder} for method chaining. | |
397 | * @throws IllegalArgumentException | |
398 | * If {@code code} or {@code scope} is <code>null</code>. | |
399 | */ | |
400 | public ArrayBuilder addJavaScript(String code, DocumentAssignable scope) | |
401 | throws IllegalArgumentException; | |
402 | ||
403 | /** | |
404 | * Adds a legacy (sub-type 3) {@link UUID} binary element. | |
405 | * <p> | |
406 | * This method throws an {@link IllegalArgumentException} if the | |
407 | * {@code uuid} is <code>null</code>. | |
408 | * </p> | |
409 | * | |
410 | * @param uuid | |
411 | * The {@link UUID} to add. | |
412 | * @return This {@link ArrayBuilder} for method chaining. | |
413 | * @throws IllegalArgumentException | |
414 | * If the {@code uuid} is <code>null</code>. | |
415 | */ | |
416 | public ArrayBuilder addLegacyUuid(UUID uuid) | |
417 | throws IllegalArgumentException; | |
418 | ||
419 | /** | |
420 | * Adds a long (64-bit signed) element. | |
421 | * | |
422 | * @param value | |
423 | * The long value. | |
424 | * @return This {@link ArrayBuilder} for method chaining. | |
425 | */ | |
426 | public ArrayBuilder addLong(long value); | |
427 | ||
428 | /** | |
429 | * Adds a minimum key value element. Used as an absolute upper bounds. | |
430 | * | |
431 | * @return This {@link ArrayBuilder} for method chaining. | |
432 | */ | |
433 | public ArrayBuilder addMaxKey(); | |
434 | ||
435 | /** | |
436 | * Adds a minimum key value element. Used as an absolute lower bounds. | |
437 | * | |
438 | * @return This {@link ArrayBuilder} for method chaining. | |
439 | */ | |
440 | public ArrayBuilder addMinKey(); | |
441 | ||
442 | /** | |
443 | * Adds a MongoDB Timestamp element. | |
444 | * | |
445 | * @param value | |
446 | * The mongoDB timstamp value. | |
447 | * @return This {@link ArrayBuilder} for method chaining. | |
448 | */ | |
449 | public ArrayBuilder addMongoTimestamp(long value); | |
450 | ||
451 | /** | |
452 | * Adds a <code>null</code> valued element. | |
453 | * | |
454 | * @return This {@link ArrayBuilder} for method chaining. | |
455 | */ | |
456 | public ArrayBuilder addNull(); | |
457 | ||
458 | /** | |
459 | * Adds an ObjectId element. | |
460 | * <p> | |
461 | * This method throws an {@link IllegalArgumentException} if the {@code id} | |
462 | * is <code>null</code>. If you would prefer a {@link NullElement} be | |
463 | * inserted in the document use the {@link #add(ObjectId)} method instead. | |
464 | * </p> | |
465 | * | |
466 | * @param id | |
467 | * The ObjectId to add. | |
468 | * @return This {@link ArrayBuilder} for method chaining. | |
469 | * @throws IllegalArgumentException | |
470 | * If {@code id} is <code>null</code>. | |
471 | */ | |
472 | public ArrayBuilder addObjectId(ObjectId id) | |
473 | throws IllegalArgumentException; | |
474 | ||
475 | /** | |
476 | * Adds a regular expression element. | |
477 | * <p> | |
478 | * This method throws an {@link IllegalArgumentException} if the | |
479 | * {@code pattern} is <code>null</code>. If you would prefer a | |
480 | * {@link NullElement} be inserted in the document use the | |
481 | * {@link #add(Pattern)} method instead. | |
482 | * </p> | |
483 | * | |
484 | * @param pattern | |
485 | * The pattern for the regular expression. | |
486 | * @return This {@link ArrayBuilder} for method chaining. | |
487 | * @throws IllegalArgumentException | |
488 | * If {@code pattern} is <code>null</code>. | |
489 | */ | |
490 | public ArrayBuilder addRegularExpression(Pattern pattern) | |
491 | throws IllegalArgumentException; | |
492 | ||
493 | /** | |
494 | * Adds a regular expression element. | |
495 | * | |
496 | * @param pattern | |
497 | * The pattern for the regular expression. | |
498 | * @param options | |
499 | * The regular expression options. See the BSON specification for | |
500 | * details. These may be <code>null</code>. | |
501 | * @return This {@link ArrayBuilder} for method chaining. | |
502 | * @throws IllegalArgumentException | |
503 | * If {@code pattern} is <code>null</code>. The options may be | |
504 | * <code>null</code>. | |
505 | */ | |
506 | public ArrayBuilder addRegularExpression(String pattern, String options) | |
507 | throws IllegalArgumentException; | |
508 | ||
509 | /** | |
510 | * Adds a string element. | |
511 | * <p> | |
512 | * This method throws an {@link IllegalArgumentException} if the | |
513 | * {@code value} is <code>null</code>. If you would prefer a | |
514 | * {@link NullElement} be inserted in the document use the | |
515 | * {@link #add(String)} method instead. | |
516 | * </p> | |
517 | * | |
518 | * @param value | |
519 | * The string value. | |
520 | * @return This {@link ArrayBuilder} for method chaining. | |
521 | * @throws IllegalArgumentException | |
522 | * If {@code value} is <code>null</code>. | |
523 | */ | |
524 | public ArrayBuilder addString(String value) throws IllegalArgumentException; | |
525 | ||
526 | /** | |
527 | * Adds a symbol element. | |
528 | * | |
529 | * @param symbol | |
530 | * The symbol value. | |
531 | * @return This {@link ArrayBuilder} for method chaining. | |
532 | * @throws IllegalArgumentException | |
533 | * If {@code symbol} is <code>null</code>. | |
534 | */ | |
535 | public ArrayBuilder addSymbol(String symbol) | |
536 | throws IllegalArgumentException; | |
537 | ||
538 | /** | |
539 | * Adds a timestamp element. The timestamp is the number of milliseconds | |
540 | * since the Unix epoch. | |
541 | * | |
542 | * @param timestamp | |
543 | * The number of milliseconds since the Unix epoch. | |
544 | * @return This {@link ArrayBuilder} for method chaining. | |
545 | */ | |
546 | public ArrayBuilder addTimestamp(long timestamp); | |
547 | ||
548 | /** | |
549 | * Adds a (sub-type 4) {@link UUID} binary element. | |
550 | * <p> | |
551 | * This method throws an {@link IllegalArgumentException} if the | |
552 | * {@code uuid} is <code>null</code>. If you would prefer a | |
553 | * {@link NullElement} be inserted in the array use the {@link #add(UUID)} | |
554 | * method instead. | |
555 | * </p> | |
556 | * | |
557 | * @param uuid | |
558 | * The {@link UUID} to add. | |
559 | * @return This {@link ArrayBuilder} for method chaining. | |
560 | * @throws IllegalArgumentException | |
561 | * If the {@code uuid} is <code>null</code>. | |
562 | */ | |
563 | public ArrayBuilder addUuid(UUID uuid) throws IllegalArgumentException; | |
564 | ||
565 | /** | |
566 | * Returns the array of {@link Element}s being constructed. | |
567 | * | |
568 | * @return The constructed array of {@link Element}. | |
569 | */ | |
570 | public Element[] build(); | |
571 | ||
572 | /** | |
573 | * Pushes a context for constructing a sub-document. | |
574 | * | |
575 | * @return This {@link ArrayBuilder} for method chaining. | |
576 | */ | |
577 | public DocumentBuilder push(); | |
578 | ||
579 | /** | |
580 | * Pushes a context for constructing a sub-array. | |
581 | * | |
582 | * @return This {@link ArrayBuilder} for method chaining. | |
583 | */ | |
584 | public ArrayBuilder pushArray(); | |
585 | ||
586 | /** | |
587 | * {@inheritDoc} | |
588 | * <p> | |
589 | * Overridden to return an {@link ArrayBuilder} instance. | |
590 | * </p> | |
591 | */ | |
592 | @Override | |
593 | public ArrayBuilder reset(); | |
594 | } |