001: /* Copyright (c) 2001-2005, The HSQL Development Group
002: * All rights reserved.
003: *
004: * Redistribution and use in source and binary forms, with or without
005: * modification, are permitted provided that the following conditions are met:
006: *
007: * Redistributions of source code must retain the above copyright notice, this
008: * list of conditions and the following disclaimer.
009: *
010: * Redistributions in binary form must reproduce the above copyright notice,
011: * this list of conditions and the following disclaimer in the documentation
012: * and/or other materials provided with the distribution.
013: *
014: * Neither the name of the HSQL Development Group nor the names of its
015: * contributors may be used to endorse or promote products derived from this
016: * software without specific prior written permission.
017: *
018: * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
019: * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
020: * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
021: * ARE DISCLAIMED. IN NO EVENT SHALL HSQL DEVELOPMENT GROUP, HSQLDB.ORG,
022: * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
023: * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
024: * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
025: * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
026: * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
027: * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
028: * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
029: */
030:
031: package org.hsqldb;
032:
033: import java.lang.reflect.Constructor;
034: import java.lang.reflect.InvocationTargetException;
035: import java.net.InetAddress;
036: import java.net.ServerSocket;
037: import java.net.Socket;
038:
039: /**
040: * Base class for producing the Socket objects used by HSQLDB.
041: *
042: * @author unsaved@users
043: * @author boucherb@users
044: * @version 1.7.2
045: * @since 1.7.2
046: */
047: public class HsqlSocketFactory {
048:
049: // ----------------------------- static members ---------------------------------
050: private static HsqlSocketFactory plainImpl;
051: private static HsqlSocketFactory sslImpl;
052:
053: // ------------------------------ constructors ---------------------------------
054:
055: /**
056: * External construction disabled. New factory instances are retreived
057: * through the newHsqlSocketFactory method instead.
058: */
059: protected HsqlSocketFactory() throws Exception {
060: }
061:
062: // ------------------------- factory builder method ----------------------------
063:
064: /**
065: * Retrieves an HsqlSocketFactory whose subclass and attributes are
066: * determined by the specified argument, tls.
067: *
068: * @param tls whether to retrieve a factory producing SSL sockets
069: * @throws Exception if the new factory cannot be constructed or is
070: * of the wrong type
071: * @return a new factory
072: */
073: public static HsqlSocketFactory getInstance(boolean tls)
074: throws Exception {
075: return tls ? getSSLImpl() : getPlainImpl();
076: }
077:
078: // -------------------------- public instance methods --------------------------
079: public void configureSocket(Socket socket) {
080:
081: // default: do nothing
082: }
083:
084: /**
085: * Returns a server socket bound to the specified port.
086: * The socket is configured with the socket options
087: * given to this factory.
088: *
089: * @return the ServerSocket
090: * @param port the port to which to bind the ServerSocket
091: * @throws Exception if a network error occurs
092: */
093: public ServerSocket createServerSocket(int port) throws Exception {
094: return new ServerSocket(port);
095: }
096:
097: /**
098: * Returns a server socket bound to the specified port.
099: * The socket is configured with the socket options
100: * given to this factory.
101: *
102: * @return the ServerSocket
103: * @param port the port to which to bind the ServerSocket
104: * @throws Exception if a network error occurs
105: */
106: public ServerSocket createServerSocket(int port, String address)
107: throws Exception {
108: return new ServerSocket(port, 128, InetAddress
109: .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 createSocket(String host, int port) throws Exception {
123: return new Socket(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 {
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 {
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 implClass)
174: throws Exception {
175:
176: Class clazz;
177: Constructor ctor;
178: Class[] ctorParm;
179: Object[] ctorArg;
180: Object factory;
181:
182: clazz = Class.forName(implClass);
183: ctorParm = new Class[0];
184:
185: // protected constructor
186: ctor = clazz.getDeclaredConstructor(ctorParm);
187: ctorArg = new Object[0];
188:
189: try {
190: factory = ctor.newInstance(ctorArg);
191: } catch (InvocationTargetException e) {
192: Throwable t = e.getTargetException();
193:
194: throw (t instanceof Exception) ? ((Exception) t)
195: : new RuntimeException(t.toString());
196: }
197:
198: return (HsqlSocketFactory) factory;
199: }
200:
201: // --
202: }
|