1 /* 2 * Replica is published under the terms 3 * of the Apache Software License. 4 */ 5 package replica.server; 6 7 import java.io.BufferedReader; 8 import java.io.BufferedWriter; 9 import java.io.IOException; 10 import java.io.InputStream; 11 import java.io.InputStreamReader; 12 import java.io.OutputStreamWriter; 13 import java.net.Socket; 14 import java.util.logging.Level; 15 import java.util.logging.Logger; 16 17 import replica.command.*; 18 import replica.core.ApplicationMessage; 19 import replica.session.SessionManager; 20 21 /*** 22 * @author Pedro Costa 23 * @author Helder Silva 24 * @since 15/Jan/2004 25 */ 26 public class ServerProcess implements Runnable { 27 28 static Logger logger = Logger.getLogger(ServerProcess.class.getName()); 29 30 private Socket socket; 31 private boolean alive = true; 32 private CommandProcessor commandProcessor; 33 private SessionManager sessionManager; 34 private BufferedWriter writer; 35 36 String sessionId; 37 38 private final static char RETURN = '\r'; 39 private final static char NEW_LINE = '\n'; 40 private final static char SPACE = ' '; 41 private char endOfCommand = ';'; 42 43 /*** 44 * Default constructor. 45 * 46 */ 47 public ServerProcess(){ 48 super(); 49 } 50 51 /*** 52 * Start a new session connected to the process. 53 * 54 */ 55 void initSession(){ 56 sessionId = sessionManager.createSession(null, null); 57 sessionManager.getSession(sessionId).putObject("SERVER_PROCESS", this); 58 59 logger.log(Level.INFO,"Created session id:[" + sessionId + "] for " + remoteAddressToString() + "."); 60 } 61 62 /*** 63 * Constructor that receives the socket to be used by this server process. 64 * 65 * @param socket 66 */ 67 public ServerProcess( Socket socket ){ 68 this(); 69 setSocket( socket ); 70 } 71 72 /* (non-Javadoc) 73 * @see java.lang.Runnable#run() 74 */ 75 public void run() { 76 try{ 77 initSession(); 78 processStream( getSocket().getInputStream() ); 79 } 80 catch(IOException e){ 81 e.printStackTrace(); 82 } 83 finally{ 84 logger.log(Level.INFO,"Lost connection to " + remoteAddressToString() + "."); 85 86 if( getSocket() != null ){ 87 try{ getSocket().close(); }catch(IOException e){ } 88 } 89 destroySession(); 90 } 91 } 92 93 /*** 94 * Process commands from the given input stream. 95 */ 96 void processStream(InputStream stream) throws IOException{ 97 98 BufferedReader reader = null; 99 100 try{ 101 102 reader = new BufferedReader( new InputStreamReader( stream ) ); 103 104 int read = -1; 105 StringBuffer buffer = new StringBuffer(); 106 while( ( read = reader.read() ) != -1 ){ 107 if( read != NEW_LINE && read != RETURN ){ 108 if( read == endOfCommand ){ 109 buffer.append(SPACE).append((char)read); 110 logger.info("Received from " 111 +remoteAddressToString()+" msg [" 112 +buffer.toString()+"]."); 113 ApplicationMessage msg = new ApplicationMessage( 114 sessionId, buffer.toString() ); 115 msg.setOriginator(ApplicationMessage.SERVER_MODULE); 116 Object res = getCommandProcessor().process( msg ); 117 if( res != null && res.toString().trim().length() > 0 ) 118 sendResponse( res.toString() ); 119 buffer = new StringBuffer(); 120 } 121 else{ 122 buffer.append((char)read); 123 } 124 } 125 else{ 126 buffer.append( SPACE ); 127 } 128 } 129 130 // Connection Lost 131 } 132 finally{ 133 if( reader != null ){ 134 try{ reader.close(); }catch(Throwable t){ } 135 } 136 } 137 } 138 139 public void sendResponse(String response){ 140 141 logger.info("Received response : [" + response + "]."); 142 143 try{ 144 if( writer == null ) 145 writer = new BufferedWriter( new OutputStreamWriter( 146 getSocket().getOutputStream() ) ); 147 148 writer.write(response); 149 if(!response.endsWith("\n")); 150 writer.write("\n"); 151 writer.flush(); 152 } 153 catch(IOException e){ 154 logger.log( 155 Level.SEVERE, "Problem sending message to user. msg:["+response+"], addr:" + remoteAddressToString(), e); 156 } 157 } 158 159 public void destroySession(){ 160 sessionManager.destroySession(sessionId); 161 logger.log(Level.INFO,"Removed session id:[" + sessionId + "] for " + remoteAddressToString() + "."); 162 } 163 164 /*** 165 * @return 166 */ 167 public Socket getSocket() { 168 return socket; 169 } 170 171 /*** 172 * @param socket 173 */ 174 public void setSocket(Socket socket) { 175 this.socket = socket; 176 } 177 178 /*** 179 * @return 180 */ 181 public synchronized boolean isAlive() { 182 return alive; 183 } 184 185 /*** 186 * @param b 187 */ 188 public synchronized void setAlive(boolean b) { 189 alive = b; 190 } 191 /*** 192 * @return 193 */ 194 public CommandProcessor getCommandProcessor() { 195 return commandProcessor; 196 } 197 198 /*** 199 * @param processor 200 */ 201 public void setCommandProcessor(CommandProcessor processor) { 202 commandProcessor = processor; 203 } 204 205 /*** 206 * Returns the connected remote address as a string. 207 * Mostly used for logging. 208 * @return 209 */ 210 private String remoteAddressToString(){ 211 if(getSocket() == null) 212 return "[]"; 213 214 return "[" + getSocket().getInetAddress() + ":" + getSocket().getPort() + "]"; 215 } 216 217 /*** 218 * @return 219 */ 220 public SessionManager getSessionManager() { 221 return sessionManager; 222 } 223 224 /*** 225 * @param manager 226 */ 227 public void setSessionManager(SessionManager manager) { 228 sessionManager = manager; 229 } 230 231 }

This page was automatically generated by Maven