001: /*
002: License $Id: TCPHandler.java,v 1.7 2005/03/15 15:43:17 hendriks73 Exp $
003:
004: Copyright (c) 2001-2005 tagtraum industries.
005:
006: LGPL
007: ====
008:
009: jo! is free software; you can redistribute it and/or
010: modify it under the terms of the GNU Lesser General Public
011: License as published by the Free Software Foundation; either
012: version 2.1 of the License, or (at your option) any later version.
013:
014: jo! is distributed in the hope that it will be useful,
015: but WITHOUT ANY WARRANTY; without even the implied warranty of
016: MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
017: Lesser General Public License for more details.
018:
019: You should have received a copy of the GNU Lesser General Public
020: License along with this library; if not, write to the Free Software
021: Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
022:
023: For LGPL see <http://www.fsf.org/copyleft/lesser.txt>
024:
025:
026: Sun license
027: ===========
028:
029: This release contains software by Sun Microsystems. Therefore
030: the following conditions have to be met, too. They apply to the
031: files
032:
033: - lib/mail.jar
034: - lib/activation.jar
035: - lib/jsse.jar
036: - lib/jcert.jar
037: - lib/jaxp.jar
038: - lib/crimson.jar
039: - lib/servlet.jar
040: - lib/jnet.jar
041: - lib/jaas.jar
042: - lib/jaasmod.jar
043:
044: contained in this release.
045:
046: a. Licensee may not modify the Java Platform
047: Interface (JPI, identified as classes contained within the javax
048: package or any subpackages of the javax package), by creating additional
049: classes within the JPI or otherwise causing the addition to or modification
050: of the classes in the JPI. In the event that Licensee creates any
051: Java-related API and distribute such API to others for applet or
052: application development, you must promptly publish broadly, an accurate
053: specification for such API for free use by all developers of Java-based
054: software.
055:
056: b. Software is confidential copyrighted information of Sun and
057: title to all copies is retained by Sun and/or its licensors. Licensee
058: shall not modify, decompile, disassemble, decrypt, extract, or otherwise
059: reverse engineer Software. Software may not be leased, assigned, or
060: sublicensed, in whole or in part. Software is not designed or intended
061: for use in on-line control of aircraft, air traffic, aircraft navigation
062: or aircraft communications; or in the design, construction, operation or
063: maintenance of any nuclear facility. Licensee warrants that it will not
064: use or redistribute the Software for such purposes.
065:
066: c. Software is provided "AS IS," without a warranty
067: of any kind. ALL EXPRESS OR IMPLIED REPRESENTATIONS AND WARRANTIES,
068: INCLUDING ANY IMPLIED WARRANTY OF MERCHANTABILITY, FITNESS FOR A
069: PARTICULAR PURPOSE OR NON-INFRINGEMENT, ARE HEREBY EXCLUDED.
070:
071: d. This License is effective until terminated. Licensee may
072: terminate this License at any time by destroying all copies of Software.
073: This License will terminate immediately without notice from Sun if Licensee
074: fails to comply with any provision of this License. Upon such termination,
075: Licensee must destroy all copies of Software.
076:
077: e. Software, including technical data, is subject to U.S.
078: export control laws, including the U.S. Export Administration Act and its
079: associated regulations, and may be subject to export or import regulations
080: in other countries. Licensee agrees to comply strictly with all such
081: regulations and acknowledges that it has the responsibility to obtain
082: licenses to export, re-export, or import Software. Software may not be
083: downloaded, or otherwise exported or re-exported (i) into, or to a national
084: or resident of, Cuba, Iraq, Iran, North Korea, Libya, Sudan, Syria or any
085: country to which the U.S. has embargoed goods; or (ii) to anyone on the
086: U.S. Treasury Department's list of Specially Designated Nations or the U.S.
087: Commerce Department's Table of Denial Orders.
088:
089:
090: Feedback
091: ========
092:
093: We encourage your feedback and suggestions and want to use your feedback to
094: improve the Software. Send all such feedback to:
095: <feedback@tagtraum.com>
096:
097: For more information on tagtraum industries and jo!
098: please see <http://www.tagtraum.com/>.
099:
100:
101: */
102: package com.tagtraum.framework.server;
103:
104: import com.tagtraum.framework.log.C_Log;
105: import com.tagtraum.framework.log.Log;
106:
107: import java.net.Socket;
108:
109: /**
110: * Implementation of {@link I_TCPHandler}.
111: * in order to use this class simply override {@link #service()}.
112: *
113: * @author <a href="mailto:hs@tagtraum.com">Hendrik Schreiber</a>
114: * @version 1.1beta1 $Id: TCPHandler.java,v 1.7 2005/03/15 15:43:17 hendriks73 Exp $
115: */
116: public abstract class TCPHandler extends Handler implements
117: I_TCPHandler {
118:
119: /**
120: * Source-Version
121: */
122: public static String vcid = "$Id: TCPHandler.java,v 1.7 2005/03/15 15:43:17 hendriks73 Exp $";
123:
124: /**
125: * The used socket.
126: */
127: protected Socket socket = null;
128:
129: /**
130: * ThreadGroup-constructor.
131: */
132: public TCPHandler(ThreadGroup tg) {
133: super (tg);
134: }
135:
136: /**
137: * Handles a request/connection.
138: *
139: * @param aSocket Socket that shall be used
140: */
141: public synchronized void handleConnection(Socket aSocket)
142: throws HandlerException {
143: if (log.isLog(Log.METHOD)) {
144: log.log("TCPHandler#handleConnection(): " + getName(),
145: Log.METHOD);
146: }
147: this .socket = aSocket;
148: // wait until we are ready for a new request
149: while (!ready) {
150: try {
151: wait(100);
152: } catch (InterruptedException e) {
153: // ignore
154: }
155: }
156: // notify the waiting thread.
157: notify();
158: }
159:
160: /**
161: * Handlerloop. From this method {@link #service()} is called.
162: * All exceptions are logged, the socket is closed after
163: * the return from the {@link #service()} call.
164: */
165: public void run() {
166: if (log.isLog(Log.METHOD)) {
167: log.log("Ready to accept connections: " + getName(),
168: Log.METHOD);
169: }
170: while (!stopped) {
171: if (socket != null) {
172: serviceStart = System.currentTimeMillis();
173:
174: if (log.isLog(Log.METHOD)) {
175: log.log("TCPHandler#beforeService(): " + getName(),
176: Log.METHOD);
177: }
178:
179: try {
180: service();
181: } catch (OutOfMemoryError oome) {
182: // desperate attempt....
183: System.gc();
184: oome.printStackTrace();
185: if (log.isLog(C_Log.ERROR)) {
186: log.log(oome, C_Log.ERROR);
187: }
188: } catch (ThreadDeath td) {
189: // have to rethrow this so that it has an effect (see JDK Thread docs)
190: // and is not logged.
191: // td.printStackTrace();
192: throw td;
193: } catch (Throwable t) {
194: if (log.isLog(C_Log.ERROR)) {
195: log.log(t, C_Log.ERROR);
196: }
197: } finally {
198: serviceStart = -1;
199: if (log.isLog(Log.METHOD)) {
200: log.log("TCPHandler#afterService(): "
201: + getName(), Log.METHOD);
202: }
203: closeSocket();
204: service.recycleHandler(this );
205: }
206: } else {
207: try {
208: synchronized (this ) {
209: // signal that we have started and are waiting for connections
210: ready = true;
211: // notify the handleConnection() method that we are ready for a new connection
212: notify();
213: while (socket == null && !stopped) {
214: wait(11000);
215: }
216: ready = false;
217: }
218: } catch (InterruptedException ie) {
219: // ignore
220: }
221: }
222: }
223: }
224:
225: public boolean isSocketOpen() {
226: return socket != null;
227: }
228:
229: public void closeSocket() {
230: if (socket != null) {
231: try {
232: socket.close();
233: } catch (Exception ignore) {
234: }
235: socket = null;
236: }
237: }
238:
239: /**
240: * Returns the <code>Socket</code> of this request.
241: *
242: * @return <code>Socket</code> of this request
243: */
244: public Socket getSocket() {
245: return socket;
246: }
247:
248: /**
249: * Makes sure the socket is closed.
250: */
251: public synchronized void destroy() {
252: super.destroy();
253: closeSocket();
254: }
255:
256: }
|