KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > org > hsqldb > HsqlSocketFactory


1 /* Copyright (c) 2001-2005, The HSQL Development Group
2  * All rights reserved.
3  *
4  * Redistribution and use in source and binary forms, with or without
5  * modification, are permitted provided that the following conditions are met:
6  *
7  * Redistributions of source code must retain the above copyright notice, this
8  * list of conditions and the following disclaimer.
9  *
10  * Redistributions in binary form must reproduce the above copyright notice,
11  * this list of conditions and the following disclaimer in the documentation
12  * and/or other materials provided with the distribution.
13  *
14  * Neither the name of the HSQL Development Group nor the names of its
15  * contributors may be used to endorse or promote products derived from this
16  * software without specific prior written permission.
17  *
18  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
19  * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
20  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
21  * ARE DISCLAIMED. IN NO EVENT SHALL HSQL DEVELOPMENT GROUP, HSQLDB.ORG,
22  * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
23  * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
24  * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
25  * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
26  * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
27  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
28  * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
29  */

30
31
32 package org.hsqldb;
33
34 import java.lang.reflect.Constructor JavaDoc;
35 import java.lang.reflect.InvocationTargetException JavaDoc;
36 import java.net.InetAddress JavaDoc;
37 import java.net.ServerSocket JavaDoc;
38 import java.net.Socket JavaDoc;
39
40 /**
41  * Base class for producing the Socket objects used by HSQLDB.
42  *
43  * @author unsaved@users
44  * @author boucherb@users
45  * @version 1.7.2
46  * @since 1.7.2
47  */

48 public class HsqlSocketFactory {
49
50 // ----------------------------- static members ---------------------------------
51
private static HsqlSocketFactory plainImpl;
52     private static HsqlSocketFactory sslImpl;
53
54 // ------------------------------ constructors ---------------------------------
55

56     /**
57      * External construction disabled. New factory instances are retreived
58      * through the newHsqlSocketFactory method instead.
59      */

60     protected HsqlSocketFactory() throws Exception JavaDoc {}
61
62 // ------------------------- factory builder method ----------------------------
63

64     /**
65      * Retrieves an HsqlSocketFactory whose subclass and attributes are
66      * determined by the specified argument, tls.
67      *
68      * @param tls whether to retrieve a factory producing SSL sockets
69      * @throws Exception if the new factory cannot be constructed or is
70      * of the wrong type
71      * @return a new factory
72      */

73     public static HsqlSocketFactory getInstance(boolean tls)
74     throws Exception JavaDoc {
75         return tls ? getSSLImpl()
76                    : getPlainImpl();
77     }
78
79 // -------------------------- public instance methods --------------------------
80
public void configureSocket(Socket JavaDoc socket) {
81
82         // default: do nothing
83
}
84
85     /**
86      * Returns a server socket bound to the specified port.
87      * The socket is configured with the socket options
88      * given to this factory.
89      *
90      * @return the ServerSocket
91      * @param port the port to which to bind the ServerSocket
92      * @throws Exception if a network error occurs
93      */

94     public ServerSocket JavaDoc createServerSocket(int port) throws Exception JavaDoc {
95         return new ServerSocket JavaDoc(port);
96     }
97
98     /**
99      * Returns a server socket bound to the specified port.
100      * The socket is configured with the socket options
101      * given to this factory.
102      *
103      * @return the ServerSocket
104      * @param port the port to which to bind the ServerSocket
105      * @throws Exception if a network error occurs
106      */

107     public ServerSocket JavaDoc createServerSocket(int port,
108                                            String JavaDoc address) throws Exception JavaDoc {
109         return new ServerSocket JavaDoc(port, 128, InetAddress.getByName(address));
110     }
111
112     /**
113      * Creates a socket and connects it to the specified remote host at the
114      * specified remote port. This socket is configured using the socket options
115      * established for this factory.
116      *
117      * @return the socket
118      * @param host the server host
119      * @param port the server port
120      * @throws Exception if a network error occurs
121      */

122     public Socket JavaDoc createSocket(String JavaDoc host, int port) throws Exception JavaDoc {
123         return new Socket JavaDoc(host, port);
124     }
125
126     /**
127      * Retrieves whether this factory produces secure sockets.
128      *
129      * @return true if this factory produces secure sockets
130      */

131     public boolean isSecure() {
132         return false;
133     }
134
135 // ------------------------ static utility methods -----------------------------
136
private static HsqlSocketFactory getPlainImpl() throws Exception JavaDoc {
137
138         synchronized (HsqlSocketFactory.class) {
139             if (plainImpl == null) {
140                 plainImpl = new HsqlSocketFactory();
141             }
142         }
143
144         return plainImpl;
145     }
146
147     private static HsqlSocketFactory getSSLImpl() throws Exception JavaDoc {
148
149         synchronized (HsqlSocketFactory.class) {
150             if (sslImpl == null) {
151                 sslImpl = newFactory("org.hsqldb.HsqlSocketFactorySecure");
152             }
153         }
154
155         return sslImpl;
156     }
157
158     /**
159      * Retrieves a new HsqlSocketFactory whose class
160      * is determined by the implClass argument. The basic contract here
161      * is that implementations constructed by this method should return
162      * true upon calling isSecure() iff they actually create secure sockets.
163      * There is no way to guarantee this directly here, so it is simply
164      * trusted that an implementation is secure if it returns true
165      * for calls to isSecure();
166      *
167      * @return a new secure socket factory
168      * @param implClass the fully qaulified name of the desired
169      * class to construct
170      * @throws Exception if a new secure socket factory cannot
171      * be constructed
172      */

173     private static HsqlSocketFactory newFactory(String JavaDoc implClass)
174     throws Exception JavaDoc {
175
176         Class JavaDoc clazz;
177         Constructor JavaDoc ctor;
178         Class JavaDoc[] ctorParm;
179         Object JavaDoc[] ctorArg;
180         Object JavaDoc factory;
181
182         clazz = Class.forName(implClass);
183         ctorParm = new Class JavaDoc[0];
184
185         // protected constructor
186
ctor = clazz.getDeclaredConstructor(ctorParm);
187         ctorArg = new Object JavaDoc[0];
188
189         try {
190             factory = ctor.newInstance(ctorArg);
191         } catch (InvocationTargetException JavaDoc e) {
192             Throwable JavaDoc t = e.getTargetException();
193
194             throw (t instanceof Exception JavaDoc) ? ((Exception JavaDoc) t)
195                                            : new RuntimeException JavaDoc(
196                                                t.toString());
197         }
198
199         return (HsqlSocketFactory) factory;
200     }
201
202 // --
203
}
204
Popular Tags