Adding registry web service and changes to WStester and JWS2Client code. Bugs in...
[jabaws.git] / webservices / compbio / ws / server / RegistryWS.java
1 package compbio.ws.server;\r
2 \r
3 import java.io.PrintWriter;\r
4 import java.io.StringWriter;\r
5 import java.io.Writer;\r
6 import java.util.Date;\r
7 import java.util.Map;\r
8 import java.util.Set;\r
9 import java.util.concurrent.ConcurrentHashMap;\r
10 \r
11 import javax.annotation.Resource;\r
12 import javax.jws.WebService;\r
13 import javax.servlet.http.HttpServletRequest;\r
14 import javax.xml.ws.WebServiceContext;\r
15 import javax.xml.ws.handler.MessageContext;\r
16 \r
17 import org.apache.log4j.Logger;\r
18 \r
19 import compbio.data.msa.JABAService;\r
20 import compbio.ws.client.Jws2Client;\r
21 import compbio.ws.client.Services;\r
22 import compbio.ws.client.WSTester;\r
23 \r
24 /**\r
25  * TODO\r
26  * \r
27  * @author pvtroshin\r
28  * \r
29  */\r
30 @WebService(endpointInterface = "compbio.data.msa.RegistryWS", targetNamespace = "http://msa.data.compbio/01/12/2010/", serviceName = "RegistryWS")\r
31 public class RegistryWS implements compbio.data.msa.RegistryWS, JABAService {\r
32 \r
33         // Ask for resource injection\r
34         @Resource\r
35         WebServiceContext wsContext;\r
36 \r
37         private static Logger statLog = Logger.getLogger("RegistryWS-stats");\r
38         private static Logger log = Logger.getLogger(RegistryWS.class);\r
39 \r
40         private final static Map<Services, Date> operating = new ConcurrentHashMap<Services, Date>();\r
41 \r
42         /**\r
43          * 1) Check that the actual executable is configured\r
44          * \r
45          * 2) Check whether the service is enabled?\r
46          * \r
47          * 3) Attempt to execute?\r
48          * \r
49          * @return\r
50          */\r
51         @Override\r
52         public Set<Services> getSupportedServices() {\r
53                 init();\r
54                 return operating.keySet();\r
55         }\r
56 \r
57         private void init() {\r
58                 // This can be run concurrently\r
59                 if (operating.isEmpty()) {\r
60                         testAllServices();\r
61                 }\r
62         }\r
63         @Override\r
64         public Date getLastTestedOn(Services service) {\r
65                 return operating.get(service);\r
66         }\r
67 \r
68         @Override\r
69         public String testAllServices() {\r
70                 Writer testlog = new StringWriter();\r
71                 PrintWriter writer = new PrintWriter(testlog, true);\r
72                 WSTester tester = new WSTester(writer);\r
73 \r
74                 for (Services service : Services.values()) {\r
75                         JABAService ws = Jws2Client.connect(getServicePath(), service);\r
76                         if (tester.checkService(ws)) {\r
77                                 operating.put(service, new Date());\r
78                         }\r
79                 }\r
80                 return testlog.toString();\r
81         }\r
82 \r
83         private String getServicePath() {\r
84                 assert wsContext != null : "WS context injection failed!";\r
85                 MessageContext msContext = wsContext.getMessageContext();\r
86                 HttpServletRequest request = (HttpServletRequest) msContext\r
87                                 .get(MessageContext.SERVLET_REQUEST);\r
88 \r
89                 StringBuffer server = request.getRequestURL();\r
90                 server = server.delete(server.lastIndexOf("/"), server.length());\r
91                 return server.toString();\r
92         }\r
93 \r
94         @Override\r
95         public String testService(Services service) {\r
96                 String server = getServicePath();\r
97                 Writer testlog = new StringWriter();\r
98                 PrintWriter writer = new PrintWriter(testlog, true);\r
99                 WSTester tester = new WSTester(writer);\r
100                 writer.println("Attempting to connect to the service " + service\r
101                                 + " on the server " + server + "...");\r
102                 JABAService ws = Jws2Client.connect(server, service);\r
103                 writer.println("Connected successfully!");\r
104                 try {\r
105                         boolean succeed = tester.checkService(ws);\r
106                         if (succeed) {\r
107                                 // TODO extract messages (see WSTester main)\r
108                                 writer.println("Check is completed. The Service "\r
109                                                 + service.toString() + " IS WORKING");\r
110                                 operating.put(service, new Date());\r
111                         } else {\r
112                                 writer.println("Check is completed. The Service "\r
113                                                 + service.toString() + " HAS SOME PROBLEMS");\r
114                         }\r
115                 } finally {\r
116                         writer.close();\r
117                 }\r
118                 return testlog.toString();\r
119         }\r
120         @Override\r
121         public boolean isOperating(Services service) {\r
122                 init();\r
123                 return operating.containsKey(service);\r
124         }\r
125 \r
126 }\r