1 /*
2 * #%L
3 * SerialClientImpl.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.client;
21
22 import java.io.Closeable;
23
24 import com.allanbank.mongodb.Durability;
25 import com.allanbank.mongodb.MongoClientConfiguration;
26 import com.allanbank.mongodb.MongoCursorControl;
27 import com.allanbank.mongodb.MongoDbException;
28 import com.allanbank.mongodb.MongoIterator;
29 import com.allanbank.mongodb.ReadPreference;
30 import com.allanbank.mongodb.StreamCallback;
31 import com.allanbank.mongodb.bson.Document;
32 import com.allanbank.mongodb.bson.DocumentAssignable;
33 import com.allanbank.mongodb.client.connection.Connection;
34
35 /**
36 * A specialization of the {@link ClientImpl} to always try to use the same
37 * connection.
38 *
39 * @api.no This class is <b>NOT</b> part of the drivers API. This class may be
40 * mutated in incompatible ways between any two releases of the driver.
41 * @copyright 2012-2013, Allanbank Consulting, Inc., All Rights Reserved
42 */
43 public class SerialClientImpl extends AbstractClient {
44
45 /** If true then assertions have been enabled for the class. */
46 protected static final boolean ASSERTIONS_ENABLED;
47 static {
48 ASSERTIONS_ENABLED = SerialClientImpl.class.desiredAssertionStatus();
49 }
50
51 /** The current active Connection to the MongoDB Servers. */
52 private Connection myConnection;
53
54 /** The delegate client for accessing connections. */
55 private final ClientImpl myDelegate;
56
57 /**
58 * Create a new SerialClientImpl.
59 *
60 * @param client
61 * The delegate client for accessing connections.
62 */
63 public SerialClientImpl(final ClientImpl client) {
64 myDelegate = client;
65 }
66
67 /**
68 * {@inheritDoc}
69 * <p>
70 * Overridden to close all of the open connections.
71 * </p>
72 *
73 * @see Closeable#close()
74 */
75 @Override
76 public void close() {
77 super.close();
78
79 // Don't close the delegate.
80 myConnection = null;
81 }
82
83 /**
84 * {@inheritDoc}
85 * <p>
86 * Overridden to return the cluster stats from the delegate client.
87 * </p>
88 */
89 @Override
90 public ClusterStats getClusterStats() {
91 return myDelegate.getClusterStats();
92 }
93
94 /**
95 * {@inheritDoc}
96 * <p>
97 * Overridden to return the {@link ClusterType} of delegate
98 * {@link ClientImpl}.
99 * </p>
100 */
101 @Override
102 public ClusterType getClusterType() {
103 return myDelegate.getClusterType();
104 }
105
106 /**
107 * {@inheritDoc}
108 * <p>
109 * Overridden to return the configuration used when the client was
110 * constructed.
111 * </p>
112 */
113 @Override
114 public MongoClientConfiguration getConfig() {
115 return myDelegate.getConfig();
116 }
117
118 /**
119 * {@inheritDoc}
120 * <p>
121 * Overridden to return the configurations default durability.
122 * </p>
123 *
124 * @see Client#getDefaultDurability()
125 */
126 @Override
127 public Durability getDefaultDurability() {
128 return myDelegate.getDefaultDurability();
129 }
130
131 /**
132 * {@inheritDoc}
133 * <p>
134 * Overridden to return the configurations default read preference.
135 * </p>
136 *
137 * @see Client#getDefaultReadPreference()
138 */
139 @Override
140 public ReadPreference getDefaultReadPreference() {
141 return myDelegate.getDefaultReadPreference();
142 }
143
144 /**
145 * {@inheritDoc}
146 * <p>
147 * Overridden to forward to the delegate client.
148 * </p>
149 *
150 * @see Client#restart(DocumentAssignable)
151 */
152 @Override
153 public MongoIterator<Document> restart(
154 final DocumentAssignable cursorDocument)
155 throws IllegalArgumentException {
156 return myDelegate.restart(cursorDocument);
157 }
158
159 /**
160 * {@inheritDoc}
161 * <p>
162 * Overridden to forward to the delegate client.
163 * </p>
164 *
165 * @see Client#restart(StreamCallback, DocumentAssignable)
166 */
167 @Override
168 public MongoCursorControl restart(final StreamCallback<Document> results,
169 final DocumentAssignable cursorDocument)
170 throws IllegalArgumentException {
171 return myDelegate.restart(results, cursorDocument);
172 }
173
174 /**
175 * Tries to reuse the last connection used. If the connection it closed or
176 * does not exist then the request is delegated to the {@link ClientImpl}
177 * and the result cached for future requests.
178 *
179 * @return The found connection.
180 * @throws MongoDbException
181 * On a failure to talk to the MongoDB servers.
182 */
183 @Override
184 protected Connection findConnection(final Message message1,
185 final Message message2) throws MongoDbException {
186 if ((myConnection == null) || !myConnection.isAvailable()) {
187 myConnection = myDelegate.findConnection(message1, message2);
188 }
189
190 return myConnection;
191 }
192 }