View Javadoc
1   /*
2    * #%L
3    * MongoCursorControl.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;
21  
22  import java.io.Closeable;
23  
24  import com.allanbank.mongodb.bson.Document;
25  import com.allanbank.mongodb.builder.Find;
26  
27  /**
28   * MongoCursorControl provides the controls for a MongoDB cursor interaction.
29   * Normally this interface is used via a {@link MongoIterator} but in the case
30   * of streaming only the controls are returned.
31   * 
32   * @api.yes This interface is part of the driver's API. Public and protected
33   *          members will be deprecated for at least 1 non-bugfix release
34   *          (version numbers are <major>.<minor>.<bugfix>)
35   *          before being removed or modified.
36   * @copyright 2013, Allanbank Consulting, Inc., All Rights Reserved
37   */
38  public interface MongoCursorControl extends Closeable {
39      /** The batch size field in the cursor document. */
40      public static final String BATCH_SIZE_FIELD = "batch_size";
41  
42      /** The cursor id field in the cursor document. */
43      public static final String CURSOR_ID_FIELD = "cursor_id";
44  
45      /** The remaining limit field in the cursor document. */
46      public static final String LIMIT_FIELD = "limit";
47  
48      /** The name space field in the cursor document. */
49      public static final String NAME_SPACE_FIELD = "ns";
50  
51      /** The server name field in the cursor document. */
52      public static final String SERVER_FIELD = "server";
53  
54      /**
55       * Returns a {@link Document} that can be used to restart the
56       * cursor/iterator.
57       * <p>
58       * If this iterator is exhausted or closed then the cursor is also closed on
59       * the server and this method will return null.
60       * </p>
61       * <p>
62       * If the cursor/{@link Find} was not created with out a timeout then
63       * eventually the server will automatically remove the cursor and the
64       * restart will fail.
65       * </p>
66       * <p>
67       * Returns the active cursor in the form:<blockquote>
68       * 
69       * <pre>
70       * <code>
71       * {
72       *     {@value #NAME_SPACE_FIELD} : '&lt;database_name&gt;.$lt;collection_name&gt;',
73       *     {@value #CURSOR_ID_FIELD} : &lt;cursor_id&gt;,
74       *     {@value #SERVER_FIELD} : '&lt;server&gt;',
75       *     {@value #LIMIT_FIELD} : &lt;remaining_limit&gt;
76       *     {@value #BATCH_SIZE_FIELD} : &lt;batch_size&gt;
77       * }</code>
78       * </pre>
79       * 
80       * </blockquote>
81       * 
82       * @return A document that can be used to restart the cursor.
83       *         <code>null</code> if the server's cursor has been exhausted or
84       *         closed.
85       */
86      public Document asDocument();
87  
88      /**
89       * Close the iterator and release any resources it is holding.
90       */
91      @Override
92      public void close();
93  
94      /**
95       * Returns the size for batches of documents that are requested.
96       * 
97       * @return The size of the batches of documents that are requested.
98       */
99      public int getBatchSize();
100 
101     /**
102      * Sets the size for future batch sizes.
103      * 
104      * @param batchSize
105      *            The size to request for future batch sizes.
106      */
107     public void setBatchSize(int batchSize);
108 
109     /**
110      * Stops the iterator after consuming any received and/or requested batches.
111      * <p>
112      * <b>WARNING</b>: This will leave the cursor open on the server. Even a
113      * {@link #close()} on this object will not close the cursor on the server.
114      * Users should persist the state of the cursor as returned from
115      * {@link #asDocument()} and restart the cursor using one of the
116      * {@link MongoClient#restart(com.allanbank.mongodb.bson.DocumentAssignable)}
117      * or
118      * {@link MongoClient#restart(StreamCallback, com.allanbank.mongodb.bson.DocumentAssignable)}
119      * methods. Use {@link #stop()} with extreme caution.
120      * </p>
121      * <p>
122      * The iterator or stream will naturally stop (
123      * {@link MongoIterator#hasNext()} will return false or the stream's call
124      * back {@link StreamCallback#done()} method will be called) when the
125      * current batch and any batches already requested are exhausted.
126      * </p>
127      */
128     public void stop();
129 
130 }