Adding registry web service and changes to WStester and JWS2Client code. Bugs in...
[jabaws.git] / webservices / compbio / ws / server / RegistryWS.java
diff --git a/webservices/compbio/ws/server/RegistryWS.java b/webservices/compbio/ws/server/RegistryWS.java
new file mode 100644 (file)
index 0000000..869807b
--- /dev/null
@@ -0,0 +1,126 @@
+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