4 package org.pcmm.rcd.impl;
6 import org.pcmm.PCMMConstants;
7 import org.pcmm.PCMMProperties;
8 import org.pcmm.concurrent.IWorkerPool;
9 import org.pcmm.concurrent.impl.WorkerPool;
10 import org.pcmm.messages.impl.MessageFactory;
11 import org.pcmm.rcd.IPCMMServer;
12 import org.pcmm.state.IState;
13 import org.slf4j.Logger;
14 import org.slf4j.LoggerFactory;
15 import org.umu.cops.stack.COPSHeader.OPCode;
16 import org.umu.cops.stack.COPSMsg;
18 import java.io.IOException;
19 import java.net.ServerSocket;
20 import java.net.Socket;
21 import java.util.concurrent.Executors;
23 // import org.junit.Assert;
28 * @see pcmm.rcd.IPCMMServer
30 public abstract class AbstractPCMMServer implements IPCMMServer {
31 protected Logger logger;
33 * A ServerSocket to accept messages ( OPN requests)
35 private ServerSocket serverSocket;
37 private Socket stopSocket;
39 private volatile boolean keepAlive;
47 protected AbstractPCMMServer() {
48 this(PCMMProperties.get(PCMMConstants.PCMM_PORT, Integer.class));
51 protected AbstractPCMMServer(int port) {
52 // XXX - Assert.assertTrue(port >= 0 && port <= 65535);
55 logger = LoggerFactory.getLogger(getClass().getName());
56 int poolSize = PCMMProperties.get(PCMMConstants.PS_POOL_SIZE, Integer.class);
57 pool = new WorkerPool(poolSize);
63 * @see pcmm.rcd.IPCMMServer#startServer()
65 public void startServer() {
66 if (serverSocket != null)
69 serverSocket = new ServerSocket(port);
70 logger.info("Server started and listening on port :" + port);
71 } catch (IOException e) {
72 logger.error(e.getMessage());
74 // execute this in a single thread executor
75 Executors.newSingleThreadExecutor().execute(new Runnable() {
79 Socket socket = serverSocket.accept();
80 logger.info("Accepted a new connection from :" + socket.getInetAddress().getHostAddress() + ":" + socket.getPort());
82 pool.schedule(getPCMMClientHandler(socket));
83 logger.info("Handler attached tp : " + socket.getInetAddress().getHostAddress() + ":" + socket.getPort());
85 logger.info("connection to be closed : " + socket.getInetAddress().getHostAddress() + ":" + socket.getPort());
88 } catch (IOException e) {
89 logger.error(e.getMessage());
93 if (stopSocket != null && stopSocket.isConnected()) {
94 logger.info("Cleaning up");
97 if (serverSocket != null && serverSocket.isBound()) {
98 logger.info("Server about to stop");
100 logger.info("Server stopped");
102 } catch (IOException e) {
103 logger.error(e.getMessage());
110 * This client is used to handle requests from within the Application
113 * @param socket - the connection to the PCMM server
114 * @return client handler
116 protected abstract IPCMMClientHandler getPCMMClientHandler(Socket socket);
121 * @see pcmm.rcd.IPCMMServer#stopServer()
123 public void stopServer() {
127 if (serverSocket != null) {
128 stopSocket = new Socket(serverSocket.getInetAddress(), serverSocket.getLocalPort());
129 logger.info("STOP socket created and attached");
131 } catch (Exception e) {
132 logger.error(e.getMessage());
139 * @see pcmm.state.IStateful#recordState()
141 public void recordState() {
148 * @see pcmm.state.IStateful#getRecoredState()
150 public IState getRecoredState() {
155 * @return the serverSocket
157 public ServerSocket getServerSocket() {
162 * @param serverSocket
163 * the serverSocket to set
165 public void setServerSocket(ServerSocket serverSocket) {
166 this.serverSocket = serverSocket;
172 public int getPort() {
180 public void setPort(int port) {
187 * @see pcmm.rcd.IPCMMServer.IPCMMClientHandler
189 public abstract class AbstractPCMMClientHandler extends AbstractPCMMClient
190 implements IPCMMClientHandler {
192 protected boolean sendCCMessage = false;
194 public AbstractPCMMClientHandler(Socket socket) {
200 public boolean disconnect() {
201 // XXX send CC message
202 sendCCMessage = true;
204 * is this really needed ?
206 // if (getSocket() != null)
207 // handlersPool.remove(getSocket());
208 COPSMsg message = MessageFactory.getInstance().create(OPCode.CC);
209 sendRequest(message);
210 return super.disconnect();