View Javadoc

1   /***
2    * Redistribution and use of this software and associated documentation
3    * ("Software"), with or without modification, are permitted provided
4    * that the following conditions are met:
5    *
6    * 1. Redistributions of source code must retain copyright
7    *    statements and notices.  Redistributions must also contain a
8    *    copy of this document.
9    *
10   * 2. Redistributions in binary form must reproduce the
11   *    above copyright notice, this list of conditions and the
12   *    following disclaimer in the documentation and/or other
13   *    materials provided with the distribution.
14   *
15   * 3. The name "Exolab" must not be used to endorse or promote
16   *    products derived from this Software without prior written
17   *    permission of Exoffice Technologies.  For written permission,
18   *    please contact info@exolab.org.
19   *
20   * 4. Products derived from this Software may not be called "Exolab"
21   *    nor may "Exolab" appear in their names without prior written
22   *    permission of Exoffice Technologies. Exolab is a registered
23   *    trademark of Exoffice Technologies.
24   *
25   * 5. Due credit should be given to the Exolab Project
26   *    (http://www.exolab.org/).
27   *
28   * THIS SOFTWARE IS PROVIDED BY EXOFFICE TECHNOLOGIES AND CONTRIBUTORS
29   * ``AS IS'' AND ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT
30   * NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
31   * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL
32   * EXOFFICE TECHNOLOGIES OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
33   * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
34   * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
35   * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
36   * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
37   * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
38   * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
39   * OF THE POSSIBILITY OF SUCH DAMAGE.
40   *
41   * Copyright 2003-2004 (C) Exoffice Technologies Inc. All Rights Reserved.
42   *
43   * $Id: AbstractConnectionFactory.java,v 1.5 2005/05/03 13:45:58 tanderson Exp $
44   */
45  package org.exolab.jms.net.connector;
46  
47  import java.util.Map;
48  
49  import java.security.Principal;
50  
51  import org.exolab.jms.net.uri.URI;
52  import org.exolab.jms.net.uri.URIHelper;
53  import org.exolab.jms.net.util.Properties;
54  
55  
56  /***
57   * Abstract implementation of the {@link ConnectionFactory} interface.
58   *
59   * @author <a href="mailto:tma@netspace.net.au">Tim Anderson</a>
60   * @version $Revision: 1.5 $ $Date: 2005/05/03 13:45:58 $
61   */
62  public abstract class AbstractConnectionFactory implements ConnectionFactory {
63  
64      /***
65       * Connection property prefix. Connection properties are prefixed with this,
66       * followed by the connection scheme.
67       */
68      public static final String PROPERTY_PREFIX = "org.exolab.jms.net.";
69  
70      /***
71       * The connect scheme that this factory supports.
72       */
73      private final String _connectScheme;
74  
75      /***
76       * The accept scheme that this factory supports.
77       */
78      private final String _acceptScheme;
79  
80      /***
81       * The managed connection factory.
82       */
83      private final ManagedConnectionFactory _factory;
84  
85      /***
86       * The connection manager.
87       */
88      private final ConnectionManager _manager;
89  
90  
91      /***
92       * Construct a new <code>AbstractConnectionFactory</code>.
93       *
94       * @param scheme  the scheme that this factory supports, for both connect
95       *                and accept
96       * @param factory the managed connection factory
97       * @param manager the connection manager
98       */
99      public AbstractConnectionFactory(String scheme,
100                                      ManagedConnectionFactory factory,
101                                      ConnectionManager manager) {
102         this(scheme, scheme, factory, manager);
103     }
104 
105     /***
106      * Construct a new <code>AbstractConnectionFactory</code>.
107      *
108      * @param connectScheme the connect scheme that this factory supports
109      * @param acceptScheme  the accept scheme that this factory supports
110      * @param factory       the managed connection factory
111      * @param manager       the connection manager
112      */
113     public AbstractConnectionFactory(String connectScheme,
114                                      String acceptScheme,
115                                      ManagedConnectionFactory factory,
116                                      ConnectionManager manager) {
117         _connectScheme = connectScheme;
118         _acceptScheme = acceptScheme;
119         _factory = factory;
120         _manager = manager;
121     }
122 
123     /***
124      * Determines if this factory supports connections to the specified URI.
125      *
126      * @param uri the connection address
127      * @return <code>true</code> if this factory supports the URI;
128      *         <code>false</code> otherwise
129      */
130     public boolean canConnect(URI uri) {
131         return _connectScheme.equals(uri.getScheme());
132     }
133 
134     /***
135      * Returns a connection to the specified URI, using the default connection
136      * properties.
137      *
138      * @param principal the security principal. May be <code>null</code>
139      * @param uri       the connection address
140      * @return a connection to <code>uri</code>
141      * @throws ResourceException if a connection cannot be established
142      */
143     public Connection getConnection(Principal principal, URI uri)
144             throws ResourceException {
145         return getConnection(principal, uri, null);
146     }
147 
148     /***
149      * Returns a connection to the specified URI, using the specified connection
150      * properties.
151      *
152      * @param principal  the security principal. May be <code>null</code>
153      * @param uri        the connection address
154      * @param properties connection properties. If <code>null</code>, use the
155      *                   default connection properties
156      * @return a connection to <code>uri</code>
157      * @throws ResourceException if a connection cannot be established
158      */
159     public Connection getConnection(Principal principal, URI uri,
160                                     Map properties)
161             throws ResourceException {
162         ConnectionRequestInfo info =
163                 getConnectionRequestInfo(uri, properties);
164         if (principal == null) {
165             principal = URIHelper.getPrincipal(uri);
166         }
167         return _manager.allocateConnection(_factory, principal, info);
168     }
169 
170     /***
171      * Determines if this factory supports listening for new connections on the
172      * specified URI.
173      *
174      * @param uri the connection address
175      * @return <code>true</code> if this factory supports the URI;
176      *         <code>false</code> otherwise
177      */
178     public boolean canAccept(URI uri) {
179         return _acceptScheme.equals(uri.getScheme());
180     }
181 
182     /***
183      * Listen for new connections on the specified URI, using the default
184      * connection acceptor properties.
185      *
186      * @param uri the connection address
187      * @throws ResourceException if connections can't be accepted on the
188      *                           specified URI
189      */
190     public void accept(URI uri) throws ResourceException {
191         accept(uri, null);
192     }
193 
194     /***
195      * Listen for new connections on the specified URI, using the specified
196      * acceptor properties.
197      *
198      * @param uri        the connection address
199      * @param properties acceptor properties. May be <code>null</code>
200      * @throws ResourceException if connections can't be accepted on the
201      *                           specified URI
202      */
203     public void accept(URI uri, Map properties) throws ResourceException {
204         ConnectionRequestInfo info = getAcceptorRequestInfo(uri, properties);
205         _manager.accept(_factory, info);
206     }
207 
208     /***
209      * Returns connection request info for the specified URI and connection
210      * properties.
211      *
212      * @param uri        the connection address
213      * @param properties connection properties. If <code>null</code>, use the
214      *                   default connection properties
215      * @return connection request info corresponding to <code>uri</code> and
216      *         <code>properties</code>
217      * @throws ResourceException for any error
218      */
219     protected abstract ConnectionRequestInfo getConnectionRequestInfo(
220             URI uri, Map properties)
221             throws ResourceException;
222 
223     /***
224      * Returns connection request info for the specified URI and connection
225      * acceptor properties.
226      * <p/>
227      * This implementation returns {@link #getConnectionRequestInfo(URI, Map)}.
228      *
229      * @param uri        the connection address
230      * @param properties acceptor properties. May be <code>null</code>
231      * @return connection request info corresponding to <code>uri</code> and
232      *         <code>properties</code>
233      * @throws ResourceException for any error
234      */
235     protected ConnectionRequestInfo getAcceptorRequestInfo(
236             URI uri, Map properties)
237             throws ResourceException {
238         return getConnectionRequestInfo(uri, properties);
239     }
240 
241     /***
242      * Returns the managed connection factory.
243      *
244      * @return the managed connection factory
245      */
246     protected ManagedConnectionFactory getManagedConnectionFactory() {
247         return _factory;
248     }
249 
250     /***
251      * Returns the connection manager.
252      *
253      * @return the connection manager
254      */
255     protected ConnectionManager getConnectionManager() {
256         return _manager;
257     }
258 
259     /***
260      * Helper to return a {@link Properties} instance for the supplied
261      * map.
262      * <p/>
263      * All searches will be performed with properties prefixed by
264      * "org.exolab.jms.net.&lt;scheme&gt;." .
265      */
266     protected Properties getProperties(Map properties) {
267         String prefix = PROPERTY_PREFIX + _connectScheme + ".";
268         return new Properties(properties, prefix);
269     }
270 
271 }