1 /* 2 * Replica is published under the terms 3 * of the Apache Software License. 4 */ 5 package replica.server; 6 7 import java.io.IOException; 8 import java.net.*; 9 import java.util.List; 10 import java.util.Vector; 11 import java.util.logging.Level; 12 import java.util.logging.Logger; 13 14 import org.springframework.context.ApplicationContext; 15 16 /*** 17 * @author Pedro Costa 18 * @author Helder Silva 19 * @since 15/Jan/2004 20 */ 21 public class Listener implements Runnable { 22 23 static Logger logger = Logger.getLogger(Listener.class.getName()); 24 25 private int port = 7654; 26 private boolean alive = true; 27 private List serverProcesses = new Vector(); 28 29 private ApplicationContext context; 30 private String serverProcessBeanId = "serverProcess"; 31 32 ServerSocket server; 33 34 /*** 35 * Default Constructor. 36 */ 37 public Listener() { 38 super(); 39 } 40 41 public Listener(ApplicationContext context){ 42 this(); 43 setContext(context); 44 } 45 46 /* (non-Javadoc) 47 * @see java.lang.Runnable#run() 48 */ 49 public void run() { 50 while(isAlive()){ 51 try{ 52 logger.log( Level.INFO, "Starting listener on port " + getPort() + "."); 53 54 server = new ServerSocket(getPort()); 55 56 while( isAlive() ){ 57 createNewServerProcess( server.accept() ); 58 } 59 } 60 catch(IOException e){ 61 e.printStackTrace(); 62 } 63 finally{ 64 logger.log( Level.INFO, "Stoping listener on port " + getPort() + "."); 65 66 if( server != null ){ 67 try{ server.close(); }catch(Throwable t){ } 68 } 69 } 70 } 71 } 72 73 /*** 74 * Create a new socket process for a new connection. 75 * 76 * @param socket new connection. 77 */ 78 protected void createNewServerProcess( Socket socket ){ 79 logger.log( Level.INFO, "Received connection on port " + getPort() + " from [" + socket.getInetAddress() + ":"+ socket.getPort() + "]."); 80 81 Thread t = new Thread( getNewServerProcess(socket) ); 82 t.start(); 83 getServerProcesses().add( t ); 84 new Thread( new Monitor( t ) ).start(); 85 } 86 87 protected ServerProcess getNewServerProcess( Socket socket ){ 88 89 ServerProcess serverProcess = (ServerProcess)getContext().getBean(getServerProcessBeanId()); 90 serverProcess.setSocket( socket ); 91 return serverProcess; 92 } 93 94 /*** 95 * @return 96 */ 97 public int getPort() { 98 return port; 99 } 100 101 /*** 102 * @param i 103 */ 104 public void setPort(int i) { 105 port = i; 106 } 107 108 /*** 109 * @return 110 */ 111 public synchronized boolean isAlive() { 112 return alive; 113 } 114 115 /*** 116 * @param b 117 */ 118 public synchronized void setAlive(boolean b) { 119 alive = b; 120 } 121 122 /*** 123 * Stops the listener; 124 * 125 */ 126 public synchronized void stop(){ 127 if( isAlive() ){ 128 setAlive( false ); 129 Socket s = null; 130 try{ 131 s = new Socket("localhost", getPort()); 132 } 133 catch(IOException e){ 134 logger.log( Level.WARNING, e.getMessage(), e ); 135 } 136 finally{ 137 if ( s != null ){ try{ s.close(); }catch(IOException e){} } 138 } 139 } 140 } 141 142 /*** 143 * @return 144 */ 145 public List getServerProcesses() { 146 return serverProcesses; 147 } 148 149 /*** 150 * @param list 151 */ 152 private void setServerProcesses(List list) { 153 serverProcesses = list; 154 } 155 156 /*** 157 * Simple Monitor for when a Server Process ends, 158 * and remove it from the list of running processes. 159 * 160 * @author Pedro Costa 161 * @version 16/Jan/2004 - 23:58:07 162 */ 163 private class Monitor implements Runnable{ 164 // the thread to be monitored 165 Thread master; 166 Monitor( Thread t ){ 167 master = t; 168 } 169 170 public void run(){ 171 if( master != null ){ 172 try{ 173 master.join(); 174 } 175 catch(InterruptedException e){ 176 } 177 178 getServerProcesses().remove( master ); 179 180 logger.log( Level.FINE, "Removed server process."); 181 } 182 } 183 } 184 185 /*** 186 * @return 187 */ 188 public ApplicationContext getContext() { 189 return context; 190 } 191 192 /*** 193 * @param context 194 */ 195 public void setContext(ApplicationContext context) { 196 this.context = context; 197 } 198 199 /*** 200 * @return 201 */ 202 public String getServerProcessBeanId() { 203 return serverProcessBeanId; 204 } 205 206 /*** 207 * @param string 208 */ 209 public void setServerProcessBeanId(String string) { 210 serverProcessBeanId = string; 211 } 212 213 }

This page was automatically generated by Maven