00001
00025
package org.objectweb.cjdbc.controller.core;
00026
00027
import java.io.IOException;
00028
import java.net.InetAddress;
00029
import java.net.ServerSocket;
00030
import java.net.Socket;
00031
import java.util.ArrayList;
00032
00033
import javax.net.ServerSocketFactory;
00034
00035
import org.objectweb.cjdbc.common.i18n.Translate;
00036
import org.objectweb.cjdbc.common.log.Trace;
00037
import org.objectweb.cjdbc.common.net.SSLException;
00038
import org.objectweb.cjdbc.common.net.SocketFactoryFactory;
00039
import org.objectweb.cjdbc.common.stream.CJDBCOutputStream;
00040
00051 public class ControllerServerThread extends Thread
00052 {
00053 private ServerSocket
serverSocket;
00054 private static final SecurityException
BLOCKED =
new SecurityException(
00055
Translate
00056 .get(
"controller.server.thread.security.connection.refused"));
00057 private boolean isKilled =
false;
00058 private boolean isShuttingDown =
false;
00059 protected Controller controller;
00061 protected ArrayList
controllerServerThreadPendingQueue =
new ArrayList();
00066 protected int idleWorkerThreads = 0;
00067
00069 static Trace
logger = Trace
00070 .getLogger(
"org.objectweb.cjdbc.controller.core.Controller");
00071
00077 public ControllerServerThread(
Controller controller)
00078 {
00079 super(
"ControllerServerThread");
00080
this.controller = controller;
00081
00082
try
00083 {
00084
00085 InetAddress bindAddress = InetAddress
00086 .getByName(controller.
getIPAddress());
00087
00088
00089
if (!controller.
getIPAddress().equals(
ControllerConstants.DEFAULT_IP))
00090 {
00091
00092
00093
00094
00095
00096
00097
00098
if (controller.
isSecurityEnabled()
00099 && controller.
getSecurity().
isSSLEnabled())
00100 {
00101 ServerSocketFactory sslFact =
SocketFactoryFactory
00102 .createServerFactory(controller.
getSecurity().
getSslConfig());
00103
serverSocket = sslFact.createServerSocket(controller.
getPortNumber(),
00104 controller.
getBacklogSize(), bindAddress);
00105 }
00106
else
00107 {
00108
serverSocket =
new ServerSocket(controller.
getPortNumber(),
00109 controller.
getBacklogSize(), bindAddress);
00110 }
00111 }
00112
else
00113 {
00114
00115
00116
00117
00118
if (controller.
isSecurityEnabled()
00119 && controller.
getSecurity().
isSSLEnabled())
00120 {
00121 ServerSocketFactory sslFact =
SocketFactoryFactory
00122 .createServerFactory(controller.
getSecurity().
getSslConfig());
00123
serverSocket = sslFact.createServerSocket(controller.
getPortNumber(),
00124 controller.
getBacklogSize());
00125 }
00126
else
00127 {
00128
serverSocket =
new ServerSocket(controller.
getPortNumber(),
00129 controller.
getBacklogSize());
00130 }
00131 }
00132
00133 }
00134
catch (java.net.BindException e)
00135 {
00136
00137
00138
logger.fatal(
Translate.get(
"controller.server.thread.illegal.ip",
00139
new String[]{controller.
getIPAddress(), e.getMessage()}));
00140 controller.
endOfController(e);
00141 }
00142
catch (IOException e)
00143 {
00144 logger.
fatal(
Translate.get(
"controller.server.thread.socket.failed",
00145 controller.
getPortNumber() +
""));
00146 controller.
endOfController(e);
00147 }
00148
catch (SSLException e)
00149 {
00150 logger.fatal(Translate.get(
"controller.server.thread.socket.failed",
00151 controller.getPortNumber() +
""));
00152 controller.endOfController(e);
00153 }
00154
if (logger.isInfoEnabled())
00155 {
00156 logger.info(Translate.get(
"controller.server.thread.waiting.connections",
00157
new String[]{serverSocket.getInetAddress().getHostAddress(),
00158 String.valueOf(serverSocket.getLocalPort())}));
00159 logger.debug(Translate.get(
"controller.server.thread.backlog.size",
""
00160 + controller.getBacklogSize()));
00161 }
00162 }
00163
00168 public void run()
00169 {
00170
if (controller == null)
00171 {
00172 logger.error(
Translate.get(
"controller.server.thread.controller.null"));
00173 isKilled =
true;
00174 }
00175
00176 Socket clientSocket = null;
00177
while (!isKilled && !isShuttingDown)
00178 {
00179
try
00180 {
00181
00182 clientSocket = serverSocket.accept();
00183
if (isKilled || isShuttingDown)
00184
break;
00185
if (controller.isSecurityEnabled()
00186 && !controller.getSecurity().allowConnection(clientSocket))
00187 {
00188 logger.warn(
Translate.get(
00189
"controller.server.thread.connection.refused", clientSocket
00190 .getInetAddress().getHostName()));
00191
CJDBCOutputStream out =
new CJDBCOutputStream(clientSocket);
00192 out.
writeObject(BLOCKED);
00193 out.
flush();
00194 clientSocket = null;
00195
continue;
00196 }
00197
else
00198 {
00199
if (logger.isDebugEnabled())
00200 logger.debug(
Translate.get(
00201
"controller.server.thread.connection.accept", clientSocket
00202 .getInetAddress().getHostName()));
00203 }
00204
boolean createThread =
false;
00205
if (isKilled || isShuttingDown)
00206
break;
00207
synchronized (controllerServerThreadPendingQueue)
00208 {
00209
00210 controllerServerThreadPendingQueue.add(clientSocket);
00211
00212
00213
if (idleWorkerThreads == 0)
00214 createThread =
true;
00215
else
00216
00217
00218
00219
00220 controllerServerThreadPendingQueue.notifyAll();
00221 }
00222
if (createThread)
00223 {
00224
ControllerWorkerThread thread =
new ControllerWorkerThread(
this);
00225 thread.start();
00226
if (logger.isDebugEnabled())
00227 logger.debug(
Translate.get(
"controller.server.thread.starting"));
00228 }
00229 }
00230
catch (IOException e)
00231 {
00232
if (!isShuttingDown)
00233 {
00234 logger.warn(
Translate.get(
00235
"controller.server.thread.new.connection.error", e),e);
00236 }
00237 }
00238 }
00239
if (logger.isInfoEnabled())
00240 logger.info(
Translate.get(
"controller.server.thread.terminating"));
00241 }
00242
00246 public void shutdown()
00247 {
00248 isShuttingDown =
true;
00249
00250
try
00251 {
00252 serverSocket.close();
00253 }
00254
catch (Exception e)
00255 {
00256 logger.warn(
Translate.get(
"controller.shutdown.server.socket.exception"),
00257 e);
00258 }
00259
int nbSockets = controllerServerThreadPendingQueue.size();
00260 Socket socket = null;
00261
for (
int i = 0; i < nbSockets; i++)
00262 {
00263 socket = (Socket) controllerServerThreadPendingQueue.get(i);
00264 logger.info(
Translate.get(
"controller.shutdown.client.socket", socket
00265 .getInetAddress().toString()));
00266
00267
00268
00269
00270
00271
00272
00273
00274
00275
00276
00277
00278
00279
00280
00281
00282
00283
00284
00285 }
00286
this.controllerServerThreadPendingQueue = null;
00287 }
00288
00292 public int getControllerServerThreadPendingQueueSize()
00293 {
00294
synchronized (controllerServerThreadPendingQueue)
00295 {
00296
return controllerServerThreadPendingQueue.size();
00297 }
00298 }
00299
00303 public int getIdleWorkerThreads()
00304 {
00305
synchronized (controllerServerThreadPendingQueue)
00306 {
00307
return idleWorkerThreads;
00308 }
00309 }
00310
00316 public boolean isShuttingDown()
00317 {
00318
return isShuttingDown;
00319 }
00320 }