--- /dev/null
+package compbio.ws.server;\r
+\r
+import java.io.PrintWriter;\r
+import java.io.StringWriter;\r
+import java.io.Writer;\r
+import java.util.Date;\r
+import java.util.Map;\r
+import java.util.Set;\r
+import java.util.concurrent.ConcurrentHashMap;\r
+\r
+import javax.annotation.Resource;\r
+import javax.jws.WebService;\r
+import javax.servlet.http.HttpServletRequest;\r
+import javax.xml.ws.WebServiceContext;\r
+import javax.xml.ws.handler.MessageContext;\r
+\r
+import org.apache.log4j.Logger;\r
+\r
+import compbio.data.msa.JABAService;\r
+import compbio.ws.client.Jws2Client;\r
+import compbio.ws.client.Services;\r
+import compbio.ws.client.WSTester;\r
+\r
+/**\r
+ * TODO\r
+ * \r
+ * @author pvtroshin\r
+ * \r
+ */\r
+@WebService(endpointInterface = "compbio.data.msa.RegistryWS", targetNamespace = "http://msa.data.compbio/01/12/2010/", serviceName = "RegistryWS")\r
+public class RegistryWS implements compbio.data.msa.RegistryWS, JABAService {\r
+\r
+ // Ask for resource injection\r
+ @Resource\r
+ WebServiceContext wsContext;\r
+\r
+ private static Logger statLog = Logger.getLogger("RegistryWS-stats");\r
+ private static Logger log = Logger.getLogger(RegistryWS.class);\r
+\r
+ private final static Map<Services, Date> operating = new ConcurrentHashMap<Services, Date>();\r
+\r
+ /**\r
+ * 1) Check that the actual executable is configured\r
+ * \r
+ * 2) Check whether the service is enabled?\r
+ * \r
+ * 3) Attempt to execute?\r
+ * \r
+ * @return\r
+ */\r
+ @Override\r
+ public Set<Services> getSupportedServices() {\r
+ init();\r
+ return operating.keySet();\r
+ }\r
+\r
+ private void init() {\r
+ // This can be run concurrently\r
+ if (operating.isEmpty()) {\r
+ testAllServices();\r
+ }\r
+ }\r
+ @Override\r
+ public Date getLastTestedOn(Services service) {\r
+ return operating.get(service);\r
+ }\r
+\r
+ @Override\r
+ public String testAllServices() {\r
+ Writer testlog = new StringWriter();\r
+ PrintWriter writer = new PrintWriter(testlog, true);\r
+ WSTester tester = new WSTester(writer);\r
+\r
+ for (Services service : Services.values()) {\r
+ JABAService ws = Jws2Client.connect(getServicePath(), service);\r
+ if (tester.checkService(ws)) {\r
+ operating.put(service, new Date());\r
+ }\r
+ }\r
+ return testlog.toString();\r
+ }\r
+\r
+ private String getServicePath() {\r
+ assert wsContext != null : "WS context injection failed!";\r
+ MessageContext msContext = wsContext.getMessageContext();\r
+ HttpServletRequest request = (HttpServletRequest) msContext\r
+ .get(MessageContext.SERVLET_REQUEST);\r
+\r
+ StringBuffer server = request.getRequestURL();\r
+ server = server.delete(server.lastIndexOf("/"), server.length());\r
+ return server.toString();\r
+ }\r
+\r
+ @Override\r
+ public String testService(Services service) {\r
+ String server = getServicePath();\r
+ Writer testlog = new StringWriter();\r
+ PrintWriter writer = new PrintWriter(testlog, true);\r
+ WSTester tester = new WSTester(writer);\r
+ writer.println("Attempting to connect to the service " + service\r
+ + " on the server " + server + "...");\r
+ JABAService ws = Jws2Client.connect(server, service);\r
+ writer.println("Connected successfully!");\r
+ try {\r
+ boolean succeed = tester.checkService(ws);\r
+ if (succeed) {\r
+ // TODO extract messages (see WSTester main)\r
+ writer.println("Check is completed. The Service "\r
+ + service.toString() + " IS WORKING");\r
+ operating.put(service, new Date());\r
+ } else {\r
+ writer.println("Check is completed. The Service "\r
+ + service.toString() + " HAS SOME PROBLEMS");\r
+ }\r
+ } finally {\r
+ writer.close();\r
+ }\r
+ return testlog.toString();\r
+ }\r
+ @Override\r
+ public boolean isOperating(Services service) {\r
+ init();\r
+ return operating.containsKey(service);\r
+ }\r
+\r
+}\r