View Javadoc
1   /*
2    * #%L
3    * AbstractClient.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  import java.util.concurrent.atomic.AtomicBoolean;
24  
25  import com.allanbank.mongodb.MongoDbException;
26  import com.allanbank.mongodb.ReadPreference;
27  import com.allanbank.mongodb.client.callback.ReplyCallback;
28  import com.allanbank.mongodb.client.connection.Connection;
29  import com.allanbank.mongodb.error.MongoClientClosedException;
30  
31  /**
32   * AbstractClient provides a base class for {@link Client} implementations.
33   * 
34   * @api.no This class is <b>NOT</b> part of the drivers API. This class may be
35   *         mutated in incompatible ways between any two releases of the driver.
36   * @copyright 2012-2014, Allanbank Consulting, Inc., All Rights Reserved
37   */
38  public abstract class AbstractClient implements Client {
39  
40      /** Tracks if the client is closed. */
41      private final AtomicBoolean myClosed = new AtomicBoolean(false);
42  
43      /**
44       * Creates a new AbstractClient.
45       */
46      public AbstractClient() {
47          super();
48      }
49  
50      /**
51       * {@inheritDoc}
52       * <p>
53       * Overridden to close all of the open connections.
54       * </p>
55       * 
56       * @see Closeable#close()
57       */
58      @Override
59      public void close() {
60          myClosed.set(true);
61      }
62  
63      /**
64       * {@inheritDoc}
65       * <p>
66       * Overridden to locate the a connection to send the messages and then
67       * forward the messages to that connection.
68       * </p>
69       */
70      @Override
71      public void send(final Message message1, final Message message2,
72              final ReplyCallback replyCallback) throws MongoDbException {
73  
74          assertOpen(message1);
75  
76          findConnection(message1, message2).send(message1, message2,
77                  replyCallback);
78      }
79  
80      /**
81       * {@inheritDoc}
82       * <p>
83       * Overridden to locate the a connection to send the message and then
84       * forward the message to that connection.
85       * </p>
86       */
87      @Override
88      public void send(final Message message, final ReplyCallback replyCallback)
89              throws MongoDbException {
90  
91          assertOpen(message);
92  
93          findConnection(message, null).send(message, replyCallback);
94      }
95  
96      /**
97       * Locates a {@link Connection} to send a message on.
98       * 
99       * @param message1
100      *            The first message that will be sent. The connection return
101      *            should be compatible with all of the messages
102      *            {@link ReadPreference}.
103      * @param message2
104      *            The second message that will be sent. The connection return
105      *            should be compatible with all of the messages
106      *            {@link ReadPreference}. May be <code>null</code>.
107      * 
108      * @return The {@link Connection} to send a message on.
109      * @throws MongoDbException
110      *             In the case of an error finding a {@link Connection}.
111      */
112     protected abstract Connection findConnection(Message message1,
113             Message message2) throws MongoDbException;
114 
115     /**
116      * Asserts that the command is open.
117      * 
118      * @param message
119      *            The message being sent.
120      * @throws MongoClientClosedException
121      *             If the client has been closed.
122      */
123     private void assertOpen(final Message message)
124             throws MongoClientClosedException {
125         if (myClosed.get()) {
126             throw new MongoClientClosedException(message);
127         }
128     }
129 
130 }