further work on registry & WSTester nearly there
[jabaws.git] / webservices / compbio / ws / server / RegistryWS.java
index 869807b..dda265e 100644 (file)
@@ -17,12 +17,11 @@ import javax.xml.ws.handler.MessageContext;
 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
+ * JABAWS services registry\r
  * \r
  * @author pvtroshin\r
  * \r
@@ -34,20 +33,10 @@ public class RegistryWS implements compbio.data.msa.RegistryWS, JABAService {
        @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
@@ -55,28 +44,55 @@ public class RegistryWS implements compbio.data.msa.RegistryWS, JABAService {
        }\r
 \r
        private void init() {\r
-               // This can be run concurrently\r
+               // This should not be run concurrently\r
                if (operating.isEmpty()) {\r
-                       testAllServices();\r
+                       synchronized (operating) {\r
+                               if (operating.isEmpty()) {\r
+                                       testAllServices();\r
+                               }\r
+                       }\r
                }\r
        }\r
+\r
+       @Override\r
+       public int getLastTested(Services service) {\r
+               Date testedOn = getLastTestedOn(service);\r
+               if (testedOn != null) {\r
+                       return (int) ((System.currentTimeMillis() - testedOn.getTime()) / 1000);\r
+               }\r
+               return 0;\r
+       }\r
+\r
+       /**\r
+        * Can potentially return null if the service has not been tested yet.\r
+        */\r
        @Override\r
        public Date getLastTestedOn(Services service) {\r
-               return operating.get(service);\r
+               if (operating.containsKey(service)) {\r
+                       return operating.get(service);\r
+               }\r
+               return null;\r
        }\r
 \r
+       /**\r
+        * TODO improve reporting. stop testing service on unsupported runtime env\r
+        * exception\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
+               WSTester tester = new WSTester(getServicePath(), writer);\r
+               // This is done deliberately to prevent malicious user from overloading\r
+               // the server\r
+               synchronized (operating) {\r
+                       for (Services service : Services.values()) {\r
+                               if (tester.checkService(service)) {\r
+                                       operating.put(service, new Date());\r
+                               }\r
                        }\r
                }\r
+               writer.close();\r
                return testlog.toString();\r
        }\r
 \r
@@ -96,27 +112,20 @@ public class RegistryWS implements compbio.data.msa.RegistryWS, JABAService {
                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
+               WSTester tester = new WSTester(server, writer);\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
+                       synchronized (operating) {\r
+                               boolean succeed = tester.checkService(service);\r
+                               if (succeed) {\r
+                                       operating.put(service, new Date());\r
+                               }\r
                        }\r
                } finally {\r
                        writer.close();\r
                }\r
                return testlog.toString();\r
        }\r
+\r
        @Override\r
        public boolean isOperating(Services service) {\r
                init();\r