1 /* 2 * #%L 3 * DocumentBuilder.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.Document; 27 import com.allanbank.mongodb.bson.DocumentAssignable; 28 import com.allanbank.mongodb.bson.Element; 29 import com.allanbank.mongodb.bson.ElementAssignable; 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 document. 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 DocumentBuilder extends Builder, DocumentAssignable { 43 /** 44 * Adds a pre-built element to the document. 45 * 46 * @param element 47 * The element to add. 48 * @return This {@link DocumentBuilder} for method chaining. 49 * @throws IllegalArgumentException 50 * If the {@code element} is <code>null</code>. 51 */ 52 public DocumentBuilder add(ElementAssignable element) 53 throws IllegalArgumentException; 54 55 /** 56 * Adds a boolean element. 57 * <p> 58 * This is a equivalent to {@link #addBoolean(String,boolean)} but less 59 * verbose. 60 * </p> 61 * 62 * @param name 63 * The name of the element. 64 * @param value 65 * The boolean value. 66 * @return This {@link DocumentBuilder} for method chaining. 67 * @throws IllegalArgumentException 68 * If the {@code name} is <code>null</code>. 69 */ 70 public DocumentBuilder add(String name, boolean value) 71 throws IllegalArgumentException; 72 73 /** 74 * Adds a binary element. 75 * <p> 76 * This is a equivalent to {@link #addBinary(String,byte, byte[])} but less 77 * verbose. 78 * </p> 79 * 80 * @param name 81 * The name of the element. 82 * @param subType 83 * The sub-type for the binary data. 84 * @param data 85 * The binary value. 86 * @return This {@link DocumentBuilder} for method chaining. 87 * @throws IllegalArgumentException 88 * If the {@code name} or {@code data} is <code>null</code>. 89 */ 90 public DocumentBuilder add(String name, byte subType, byte[] data) 91 throws IllegalArgumentException; 92 93 /** 94 * Adds a binary element using sub-type zero (the default). 95 * <p> 96 * This is a equivalent to {@link #addBinary(String,byte[])} but will insert 97 * a {@link NullElement} if the {@code data} is <code>null</code> instead of 98 * throwing an {@link IllegalArgumentException}. 99 * </p> 100 * 101 * @param name 102 * The name of the element. 103 * @param data 104 * The binary value. 105 * @return This {@link DocumentBuilder} for method chaining. 106 * @throws IllegalArgumentException 107 * If the {@code name} is <code>null</code>. 108 */ 109 public DocumentBuilder add(String name, byte[] data) 110 throws IllegalArgumentException; 111 112 /** 113 * Adds a timestamp element. The timestamp is the number of milliseconds 114 * since the Unix epoch. 115 * <p> 116 * This is a equivalent to {@link #addTimestamp(String,long) 117 * addTimeStamp(timestamp.getTime())} but will insert a {@link NullElement} 118 * if the {@code timestamp} is <code>null</code> instead of throwing an 119 * {@link IllegalArgumentException}. 120 * </p> 121 * 122 * @param name 123 * The name of the element. 124 * @param timestamp 125 * The number of milliseconds since the Unix epoch. 126 * @return This {@link DocumentBuilder} for method chaining. 127 * @throws IllegalArgumentException 128 * If the {@code name} is <code>null</code>. 129 */ 130 public DocumentBuilder add(String name, Date timestamp) 131 throws IllegalArgumentException; 132 133 /** 134 * Adds a pre-constructed document to the array. 135 * <p> 136 * This is a equivalent to {@link #addDocument(String,DocumentAssignable)} 137 * but will insert a {@link NullElement} if the {@code document} is 138 * <code>null</code> instead of throwing an {@link IllegalArgumentException} 139 * . 140 * </p> 141 * 142 * @param name 143 * The name of the element. 144 * @param document 145 * The document to add to the array. 146 * @return This {@link DocumentBuilder} for method chaining. 147 * @throws IllegalArgumentException 148 * If the {@code name} is <code>null</code>. 149 */ 150 public DocumentBuilder add(String name, DocumentAssignable document) 151 throws IllegalArgumentException; 152 153 /** 154 * Adds a double element. 155 * <p> 156 * This is a equivalent to {@link #addDouble(String,double)} but less 157 * verbose. 158 * </p> 159 * 160 * @param name 161 * The name of the element. 162 * @param value 163 * The double value. 164 * @return This {@link DocumentBuilder} for method chaining. 165 * @throws IllegalArgumentException 166 * If the {@code name} is <code>null</code>. 167 */ 168 public DocumentBuilder add(String name, double value) 169 throws IllegalArgumentException; 170 171 /** 172 * Adds a integer (32-bit signed) element. 173 * <p> 174 * This is a equivalent to {@link #addInteger(String,int)} but less verbose. 175 * </p> 176 * 177 * @param name 178 * The name of the element. 179 * @param value 180 * The integer value. 181 * @return This {@link DocumentBuilder} for method chaining. 182 * @throws IllegalArgumentException 183 * If the {@code name} is <code>null</code>. 184 */ 185 public DocumentBuilder add(String name, int value) 186 throws IllegalArgumentException; 187 188 /** 189 * Adds a long (64-bit signed) element. 190 * <p> 191 * This is a equivalent to {@link #addLong(String,long)} but less verbose. 192 * </p> 193 * 194 * @param name 195 * The name of the element. 196 * @param value 197 * The long value. 198 * @return This {@link DocumentBuilder} for method chaining. 199 * @throws IllegalArgumentException 200 * If the {@code name} is <code>null</code>. 201 */ 202 public DocumentBuilder add(String name, long value) 203 throws IllegalArgumentException; 204 205 /** 206 * Adds the value to the document after trying to coerce the value into the 207 * best possible element type. If the coercion fails then an 208 * {@link IllegalArgumentException} is thrown. 209 * <p> 210 * This method does type inspection which can be slow. It is generally much 211 * faster to use the type specific methods of this interface. 212 * </p> 213 * 214 * @param name 215 * The name of the element. 216 * @param value 217 * The Object value to coerce into an element. 218 * @return This {@link DocumentBuilder} for method chaining. 219 * @throws IllegalArgumentException 220 * If the {@code name} is <code>null</code> or the {@code value} 221 * cannot be coerced into an element type. 222 */ 223 public DocumentBuilder add(String name, Object value) 224 throws IllegalArgumentException; 225 226 /** 227 * Adds an ObjectId element. 228 * <p> 229 * This is a equivalent to {@link #addObjectId(String,ObjectId)} but will 230 * insert a {@link NullElement} if the {@code id} is <code>null</code> 231 * instead of throwing an {@link IllegalArgumentException}. 232 * </p> 233 * 234 * @param name 235 * The name of the element. 236 * @param id 237 * The ObjectId to add. 238 * @return This {@link DocumentBuilder} for method chaining. 239 * @throws IllegalArgumentException 240 * If the {@code name} or {@code id} is <code>null</code>. 241 */ 242 public DocumentBuilder add(String name, ObjectId id) 243 throws IllegalArgumentException; 244 245 /** 246 * Adds an ObjectId element. 247 * <p> 248 * This is a equivalent to {@link #addRegularExpression(String,Pattern)} but 249 * will insert a {@link NullElement} if the {@code pattern} is 250 * <code>null</code> instead of throwing an {@link IllegalArgumentException} 251 * . 252 * </p> 253 * 254 * @param name 255 * The name of the element. 256 * @param pattern 257 * The pattern for the regular expression. 258 * @return This {@link DocumentBuilder} for method chaining. 259 * @throws IllegalArgumentException 260 * If the {@code name} is <code>null</code>. 261 */ 262 public DocumentBuilder add(String name, Pattern pattern) 263 throws IllegalArgumentException; 264 265 /** 266 * Adds a string element. 267 * <p> 268 * This is a equivalent to {@link #addString(String,String)} but will insert 269 * a {@link NullElement} if the {@code value} is <code>null</code> instead 270 * of throwing an {@link IllegalArgumentException}. 271 * </p> 272 * 273 * @param name 274 * The name of the element. 275 * @param value 276 * The string value. 277 * @return This {@link DocumentBuilder} for method chaining. 278 * @throws IllegalArgumentException 279 * If the {@code name} is <code>null</code>. 280 */ 281 public DocumentBuilder add(String name, String value) 282 throws IllegalArgumentException; 283 284 /** 285 * Adds a deprecated DBPointer element. 286 * <p> 287 * This is a equivalent to 288 * {@link #addDBPointer(String,String, String, ObjectId)} but less verbose. 289 * </p> 290 * 291 * @param name 292 * The name of the element. 293 * @param databaseName 294 * The name of the database containing the document. 295 * @param collectionName 296 * The name of the collection containing the document. 297 * @param id 298 * The id for the document. 299 * @return This {@link DocumentBuilder} for method chaining. 300 * @throws IllegalArgumentException 301 * If the {@code name}, {@code databaseName}, 302 * {@code collectionName}, or {@code id} is <code>null</code>. 303 * 304 * @deprecated See BSON specification. 305 */ 306 @Deprecated 307 public DocumentBuilder add(String name, String databaseName, 308 String collectionName, ObjectId id) throws IllegalArgumentException; 309 310 /** 311 * Adds a (sub-type 4) {@link UUID} binary element. 312 * <p> 313 * This is a equivalent to {@link #addUuid(String,UUID)} but will insert a 314 * {@link NullElement} if the {@code uuid} is <code>null</code> instead of 315 * throwing an {@link IllegalArgumentException}. 316 * </p> 317 * 318 * @param name 319 * The name of the element. 320 * @param uuid 321 * The {@link UUID} to add. 322 * @return This {@link DocumentBuilder} for method chaining. 323 * @throws IllegalArgumentException 324 * If the {@code name} is <code>null</code>. 325 */ 326 public DocumentBuilder add(String name, UUID uuid) 327 throws IllegalArgumentException; 328 329 /** 330 * Adds a binary element using sub-type zero (the default). 331 * 332 * @param name 333 * The name of the element. 334 * @param subType 335 * The sub-type for the binary data. 336 * @param data 337 * The binary value. 338 * @return This {@link DocumentBuilder} for method chaining. 339 * @throws IllegalArgumentException 340 * If the {@code name} or {@code data} is <code>null</code>. 341 */ 342 public DocumentBuilder addBinary(String name, byte subType, byte[] data) 343 throws IllegalArgumentException; 344 345 /** 346 * Adds a binary element using sub-type zero (the default). 347 * <p> 348 * This method throws an {@link IllegalArgumentException} if the 349 * {@code data} is <code>null</code>. If you would prefer a 350 * {@link NullElement} be inserted in the document use the 351 * {@link #add(String, byte[])} method instead. 352 * </p> 353 * 354 * @param name 355 * The name of the element. 356 * @param data 357 * The binary value. 358 * @return This {@link DocumentBuilder} for method chaining. 359 * @throws IllegalArgumentException 360 * If the {@code name} or {@code value} is <code>null</code>. 361 */ 362 public DocumentBuilder addBinary(String name, byte[] data) 363 throws IllegalArgumentException; 364 365 /** 366 * Adds a boolean element. 367 * 368 * @param name 369 * The name of the element. 370 * @param value 371 * The boolean value. 372 * @return This {@link DocumentBuilder} for method chaining. 373 * @throws IllegalArgumentException 374 * If the {@code name} is <code>null</code>. 375 */ 376 public DocumentBuilder addBoolean(String name, boolean value) 377 throws IllegalArgumentException; 378 379 /** 380 * Adds a deprecated DBPointer element. 381 * 382 * @param name 383 * The name of the element. 384 * @param databaseName 385 * The name of the database containing the document. 386 * @param collectionName 387 * The name of the collection containing the document. 388 * @param id 389 * The id for the document. 390 * @return This {@link DocumentBuilder} for method chaining. 391 * @throws IllegalArgumentException 392 * If the {@code name}, {@code databaseName}, 393 * {@code collectionName}, or {@code id} is <code>null</code>. 394 * 395 * @deprecated See BSON specification. 396 */ 397 @Deprecated 398 public DocumentBuilder addDBPointer(String name, String databaseName, 399 String collectionName, ObjectId id) throws IllegalArgumentException; 400 401 /** 402 * Adds a pre-built document element. Can also {@link #push(String)} a sub 403 * document. 404 * <p> 405 * This method throws an {@link IllegalArgumentException} if the 406 * {@code value} is <code>null</code>. If you would prefer a 407 * {@link NullElement} be inserted in the document use the 408 * {@link #add(String, DocumentAssignable)} method instead. 409 * </p> 410 * 411 * @param name 412 * The name of the element. 413 * @param value 414 * The document value. 415 * @return This {@link DocumentBuilder} for method chaining. 416 * @throws IllegalArgumentException 417 * If the {@code name} or {@code value} is <code>null</code>. 418 */ 419 public DocumentBuilder addDocument(String name, DocumentAssignable value) 420 throws IllegalArgumentException; 421 422 /** 423 * Adds a double element. 424 * 425 * @param name 426 * The name of the element. 427 * @param value 428 * The double value. 429 * @return This {@link DocumentBuilder} for method chaining. 430 * @throws IllegalArgumentException 431 * If the {@code name} is <code>null</code>. 432 */ 433 public DocumentBuilder addDouble(String name, double value) 434 throws IllegalArgumentException; 435 436 /** 437 * Adds a integer (32-bit signed) element. 438 * 439 * @param name 440 * The name of the element. 441 * @param value 442 * The integer value. 443 * @return This {@link DocumentBuilder} for method chaining. 444 * @throws IllegalArgumentException 445 * If the {@code name} is <code>null</code>. 446 */ 447 public DocumentBuilder addInteger(String name, int value) 448 throws IllegalArgumentException; 449 450 /** 451 * Adds a JavaScript element. 452 * 453 * @param name 454 * The name of the element. 455 * @param code 456 * The java script code. 457 * @return This {@link DocumentBuilder} for method chaining. 458 * @throws IllegalArgumentException 459 * If the {@code name} or {@code code} is <code>null</code>. 460 */ 461 public DocumentBuilder addJavaScript(String name, String code) 462 throws IllegalArgumentException; 463 464 /** 465 * Adds a JavaScript with Scope element. 466 * 467 * @param name 468 * The name of the element. 469 * @param code 470 * The java script code. 471 * @param scope 472 * The scope for the JacaScript code. 473 * @return This {@link DocumentBuilder} for method chaining. 474 * @throws IllegalArgumentException 475 * If the {@code name}, {@code value}, or {@code scope} is 476 * <code>null</code>. 477 */ 478 public DocumentBuilder addJavaScript(String name, String code, 479 DocumentAssignable scope) throws IllegalArgumentException; 480 481 /** 482 * Adds a legacy (sub-type 3) {@link UUID} binary element. 483 * <p> 484 * This method throws an {@link IllegalArgumentException} if the 485 * {@code uuid} is <code>null</code>. 486 * </p> 487 * 488 * @param name 489 * The name of the element. 490 * @param uuid 491 * The {@link UUID} to add. 492 * @return This {@link DocumentBuilder} for method chaining. 493 * @throws IllegalArgumentException 494 * If the {@code name} or {@code uuid} is <code>null</code>. 495 */ 496 public DocumentBuilder addLegacyUuid(String name, UUID uuid) 497 throws IllegalArgumentException; 498 499 /** 500 * Adds a long (64-bit signed) element. 501 * 502 * @param name 503 * The name of the element. 504 * @param value 505 * The long value. 506 * @return This {@link DocumentBuilder} for method chaining. 507 * @throws IllegalArgumentException 508 * If the {@code name} is <code>null</code>. 509 */ 510 public DocumentBuilder addLong(String name, long value) 511 throws IllegalArgumentException; 512 513 /** 514 * Adds a minimum key value element. Used as an absolute upper bounds. 515 * 516 * @param name 517 * The name of the element. 518 * @return This {@link DocumentBuilder} for method chaining. 519 * @throws IllegalArgumentException 520 * If the {@code name} is <code>null</code>. 521 */ 522 public DocumentBuilder addMaxKey(String name) 523 throws IllegalArgumentException; 524 525 /** 526 * Adds a minimum key value element. Used as an absolute lower bounds. 527 * 528 * @param name 529 * The name of the element. 530 * @return This {@link DocumentBuilder} for method chaining. 531 * @throws IllegalArgumentException 532 * If the {@code name} is <code>null</code>. 533 */ 534 public DocumentBuilder addMinKey(String name) 535 throws IllegalArgumentException; 536 537 /** 538 * Adds a MongoDB Timestamp element. 539 * 540 * @param name 541 * The name of the element. 542 * @param value 543 * The mongoDB timstamp value. 544 * @return This {@link DocumentBuilder} for method chaining. 545 * @throws IllegalArgumentException 546 * If the {@code name} is <code>null</code>. 547 */ 548 public DocumentBuilder addMongoTimestamp(String name, long value) 549 throws IllegalArgumentException; 550 551 /** 552 * Adds a <code>null</code> valued element. 553 * 554 * @param name 555 * The name of the element. 556 * @return This {@link DocumentBuilder} for method chaining. 557 * @throws IllegalArgumentException 558 * If the {@code name} is <code>null</code>. 559 */ 560 public DocumentBuilder addNull(String name) throws IllegalArgumentException; 561 562 /** 563 * Adds an ObjectId element. 564 * <p> 565 * This method throws an {@link IllegalArgumentException} if the {@code id} 566 * is <code>null</code>. If you would prefer a {@link NullElement} be 567 * inserted in the document use the {@link #add(String, ObjectId)} method 568 * instead. 569 * </p> 570 * 571 * @param name 572 * The name of the element. 573 * @param id 574 * The ObjectId to add. 575 * @return This {@link DocumentBuilder} for method chaining. 576 * @throws IllegalArgumentException 577 * If the {@code name} or {@code id} is <code>null</code>. 578 */ 579 public DocumentBuilder addObjectId(String name, ObjectId id) 580 throws IllegalArgumentException; 581 582 /** 583 * Adds a regular expression element. 584 * <p> 585 * This method throws an {@link IllegalArgumentException} if the 586 * {@code pattern} is <code>null</code>. If you would prefer a 587 * {@link NullElement} be inserted in the document use the 588 * {@link #add(String, Pattern)} method instead. 589 * </p> 590 * 591 * @param name 592 * The name of the element. 593 * @param pattern 594 * The pattern for the regular expression. 595 * @return This {@link DocumentBuilder} for method chaining. 596 * @throws IllegalArgumentException 597 * If the {@code name} or {@code pattern} is <code>null</code>. 598 */ 599 public DocumentBuilder addRegularExpression(String name, Pattern pattern) 600 throws IllegalArgumentException; 601 602 /** 603 * Adds a regular expression element. 604 * 605 * @param name 606 * The name of the element. 607 * @param pattern 608 * The pattern for the regular expression. 609 * @param options 610 * The regular expression options. See the BSON specification for 611 * details. The options may be <code>null</code>. 612 * @return This {@link DocumentBuilder} for method chaining. 613 * @throws IllegalArgumentException 614 * If the {@code name} or {@code pattern} is <code>null</code>. 615 * Note the {@code options} may be <code>null</code>. 616 */ 617 public DocumentBuilder addRegularExpression(String name, String pattern, 618 String options) throws IllegalArgumentException; 619 620 /** 621 * Adds a string element. 622 * <p> 623 * This method throws an {@link IllegalArgumentException} if the 624 * {@code value} is <code>null</code>. If you would prefer a 625 * {@link NullElement} be inserted in the document use the 626 * {@link #add(String, String)} method instead. 627 * </p> 628 * 629 * @param name 630 * The name of the element. 631 * @param value 632 * The string value. 633 * @return This {@link DocumentBuilder} for method chaining. 634 * @throws IllegalArgumentException 635 * If the {@code name} or {@code value} is <code>null</code>. 636 */ 637 public DocumentBuilder addString(String name, String value) 638 throws IllegalArgumentException; 639 640 /** 641 * Adds a symbol element. 642 * 643 * @param name 644 * The name of the element. 645 * @param symbol 646 * The symbol value. 647 * @return This {@link DocumentBuilder} for method chaining. 648 * @throws IllegalArgumentException 649 * If the {@code name} or {@code symbol} is <code>null</code>. 650 */ 651 public DocumentBuilder addSymbol(String name, String symbol) 652 throws IllegalArgumentException; 653 654 /** 655 * Adds a timestamp element. The timestamp is the number of milliseconds 656 * since the Unix epoch. 657 * 658 * @param name 659 * The name of the element. 660 * @param timestamp 661 * The number of milliseconds since the Unix epoch. 662 * @return This {@link DocumentBuilder} for method chaining. 663 * @throws IllegalArgumentException 664 * If the {@code name} is <code>null</code>. 665 */ 666 public DocumentBuilder addTimestamp(String name, long timestamp) 667 throws IllegalArgumentException; 668 669 /** 670 * Adds a (sub-type 4) {@link UUID} binary element. 671 * <p> 672 * This method throws an {@link IllegalArgumentException} if the 673 * {@code uuid} is <code>null</code>. If you would prefer a 674 * {@link NullElement} be inserted in the document use the 675 * {@link #add(String, UUID)} method instead. 676 * </p> 677 * 678 * @param name 679 * The name of the element. 680 * @param uuid 681 * The {@link UUID} to add. 682 * @return This {@link DocumentBuilder} for method chaining. 683 * @throws IllegalArgumentException 684 * If the {@code name} or {@code uuid} is <code>null</code>. 685 */ 686 public DocumentBuilder addUuid(String name, UUID uuid) 687 throws IllegalArgumentException; 688 689 /** 690 * Returns the {@link Document} being constructed. 691 * 692 * @return The constructed {@link Document}. 693 */ 694 public Document build(); 695 696 /** 697 * Pushes a context for constructing a sub-document. 698 * 699 * @param name 700 * The name of the sub-document. 701 * @return A {@link DocumentBuilder} for constructing the sub-document. 702 * @throws IllegalArgumentException 703 * If the {@code name} is <code>null</code>. 704 */ 705 public DocumentBuilder push(String name) throws IllegalArgumentException; 706 707 /** 708 * Pushes a context for constructing a sub-array. 709 * 710 * @param name 711 * The name of the sub-array. 712 * @return A {@link ArrayBuilder} for constructing the sub-array. 713 * @throws IllegalArgumentException 714 * If the {@code name} is <code>null</code>. 715 */ 716 public ArrayBuilder pushArray(String name) throws IllegalArgumentException; 717 718 /** 719 * Removes all {@link Element}s that have the provided name from the 720 * document being built. 721 * <p> 722 * Note that adding a new element with the same name adds that element to 723 * the end of document's element list. 724 * </p> 725 * 726 * @param name 727 * The name of the element to remove. 728 * @return This {@link DocumentBuilder} for method chaining. 729 */ 730 public DocumentBuilder remove(String name); 731 732 /** 733 * {@inheritDoc} 734 * <p> 735 * Overridden to return an {@link DocumentBuilder} instance. 736 * </p> 737 */ 738 @Override 739 public DocumentBuilder reset(); 740 }