001: /**
002: * Licensed to the Apache Software Foundation (ASF) under one or more
003: * contributor license agreements. See the NOTICE file distributed with
004: * this work for additional information regarding copyright ownership.
005: * The ASF licenses this file to You under the Apache License, Version 2.0
006: * (the "License"); you may not use this file except in compliance with
007: * the License. You may obtain a copy of the License at
008: *
009: * http://www.apache.org/licenses/LICENSE-2.0
010: *
011: * Unless required by applicable law or agreed to in writing, software
012: * distributed under the License is distributed on an "AS IS" BASIS,
013: * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
014: * See the License for the specific language governing permissions and
015: * limitations under the License.
016: */package org.apache.openejb.client;
017:
018: import java.io.IOException;
019: import java.io.InputStream;
020: import java.io.OutputStream;
021: import java.io.StreamCorruptedException;
022: import java.net.Socket;
023: import java.net.URI;
024: import java.net.ConnectException;
025: import java.util.Properties;
026:
027: public class SocketConnectionFactory implements ConnectionFactory {
028:
029: public void init(Properties props) {
030: }
031:
032: public Connection getConnection(URI uri) throws java.io.IOException {
033: SocketConnection conn = new SocketConnection();
034: conn.open(uri);
035: return conn;
036: }
037:
038: class SocketConnection implements Connection {
039:
040: Socket socket = null;
041:
042: OutputStream socketOut = null;
043:
044: InputStream socketIn = null;
045:
046: protected void open(URI uri) throws IOException {
047: /*-----------------------*/
048: /* Open socket to server */
049: /*-----------------------*/
050: try {
051: socket = new Socket(uri.getHost(), uri.getPort());
052: socket.setTcpNoDelay(true);
053: } catch (ConnectException e) {
054: throw new ConnectException(
055: "Cannot connect to server '"
056: + uri.toString()
057: + "'. Check that the server is started and that the specified serverURL is correct.");
058:
059: } catch (IOException e) {
060: throw new IOException("Cannot connect to server: '"
061: + uri.toString() + "'. Exception: "
062: + e.getClass().getName() + " : "
063: + e.getMessage());
064:
065: } catch (SecurityException e) {
066: throw new IOException(
067: "Cannot access server: '"
068: + uri.toString()
069: + "' due to security restrictions in the current VM: "
070: + e.getClass().getName() + " : "
071: + e.getMessage());
072:
073: } catch (Throwable e) {
074: throw new IOException(
075: "Cannot connect to server: '"
076: + uri.toString()
077: + "' due to an unkown exception in the OpenEJB client: "
078: + e.getClass().getName() + " : "
079: + e.getMessage());
080: }
081:
082: }
083:
084: public void close() throws IOException {
085: try {
086: if (socketOut != null)
087: socketOut.close();
088: if (socketIn != null)
089: socketIn.close();
090: if (socket != null)
091: socket.close();
092: } catch (Throwable t) {
093: throw new IOException(
094: "Error closing connection with server: "
095: + t.getMessage());
096: }
097: }
098:
099: public InputStream getInputStream() throws IOException {
100: /*----------------------------------*/
101: /* Open input streams */
102: /*----------------------------------*/
103: try {
104: socketIn = socket.getInputStream();
105: } catch (StreamCorruptedException e) {
106: throw new IOException(
107: "Cannot open input stream to server, the stream has been corrupted: "
108: + e.getClass().getName() + " : "
109: + e.getMessage());
110:
111: } catch (IOException e) {
112: throw new IOException(
113: "Cannot open input stream to server: "
114: + e.getClass().getName() + " : "
115: + e.getMessage());
116:
117: } catch (Throwable e) {
118: throw new IOException(
119: "Cannot open output stream to server: "
120: + e.getClass().getName() + " : "
121: + e.getMessage());
122: }
123: return socketIn;
124: }
125:
126: public OutputStream getOuputStream() throws IOException {
127: /*----------------------------------*/
128: /* Openning output streams */
129: /*----------------------------------*/
130: try {
131: socketOut = socket.getOutputStream();
132: } catch (IOException e) {
133: throw new IOException(
134: "Cannot open output stream to server: "
135: + e.getClass().getName() + " : "
136: + e.getMessage());
137:
138: } catch (Throwable e) {
139: throw new IOException(
140: "Cannot open output stream to server: "
141: + e.getClass().getName() + " : "
142: + e.getMessage());
143: }
144: return socketOut;
145: }
146:
147: }
148: }
|