Roll back some changes in WSDL of RegistryWS for some time: restore back compatibility
[jabaws.git] / webservices / compbio / ws / server / RegistryWS.java
index dda265e..8be071e 100644 (file)
@@ -1,3 +1,20 @@
+/* Copyright (c) 2011 Peter Troshin\r
+ *  \r
+ *  JAva Bioinformatics Analysis Web Services (JABAWS) @version: 2.0     \r
+ * \r
+ *  This library is free software; you can redistribute it and/or modify it under the terms of the\r
+ *  Apache License version 2 as published by the Apache Software Foundation\r
+ * \r
+ *  This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without\r
+ *  even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the Apache \r
+ *  License for more details.\r
+ * \r
+ *  A copy of the license is in apache_license.txt. It is also available here:\r
+ * @see: http://www.apache.org/licenses/LICENSE-2.0.txt\r
+ * \r
+ * Any republication or derived work distributed in source code form\r
+ * must include this copyright and license notice.\r
+ */\r
 package compbio.ws.server;\r
 \r
 import java.io.PrintWriter;\r
@@ -16,6 +33,7 @@ import javax.xml.ws.handler.MessageContext;
 \r
 import org.apache.log4j.Logger;\r
 \r
+import compbio.data.msa.Category;\r
 import compbio.data.msa.JABAService;\r
 import compbio.ws.client.Services;\r
 import compbio.ws.client.WSTester;\r
@@ -26,7 +44,7 @@ import compbio.ws.client.WSTester;
  * @author pvtroshin\r
  * \r
  */\r
-@WebService(endpointInterface = "compbio.data.msa.RegistryWS", targetNamespace = "http://msa.data.compbio/01/12/2010/", serviceName = "RegistryWS")\r
+@WebService(endpointInterface = "compbio.data.msa.RegistryWS", targetNamespace = JABAService.V2_SERVICE_NAMESPACE, serviceName = "RegistryWS")\r
 public class RegistryWS implements compbio.data.msa.RegistryWS, JABAService {\r
 \r
        // Ask for resource injection\r
@@ -35,25 +53,68 @@ public class RegistryWS implements compbio.data.msa.RegistryWS, JABAService {
 \r
        private static Logger log = Logger.getLogger(RegistryWS.class);\r
 \r
+       /**\r
+        * Stores tested and passed (the test) services and their testing time\r
+        */\r
        private final static Map<Services, Date> operating = new ConcurrentHashMap<Services, Date>();\r
+       private final static Map<Services, Date> nonoperating = new ConcurrentHashMap<Services, Date>();\r
+\r
+       /**\r
+        * Indicate whether the services were tested at all\r
+        */\r
+       private static boolean allTested = false;\r
 \r
        @Override\r
        public Set<Services> getSupportedServices() {\r
                init();\r
                return operating.keySet();\r
        }\r
-\r
+/* FOR FUTURE RELEASES!!!\r
+       @Override\r
+       public Set<Services> getNonoperatedServices() {\r
+               init();\r
+               return nonoperating.keySet();\r
+       }\r
+*/\r
        private void init() {\r
-               // This should not be run concurrently\r
-               if (operating.isEmpty()) {\r
+               // Do not allow tests to run concurrently\r
+               if (timeToTest()) {\r
                        synchronized (operating) {\r
-                               if (operating.isEmpty()) {\r
+                               if (timeToTest()) {\r
                                        testAllServices();\r
+                                       allTested = true;\r
                                }\r
                        }\r
                }\r
        }\r
 \r
+       private boolean timeToTest() {\r
+               if (!allTested) {\r
+                       return true;\r
+               }\r
+               // 24 h\r
+               if (getLongestUntestedServiceTime() > 3600 * 24) {\r
+                       return true;\r
+               }\r
+               return false;\r
+       }\r
+\r
+       /**\r
+        * Return time in seconds for the test for the oldest unchecked service\r
+        * \r
+        * @return\r
+        */\r
+       private int getLongestUntestedServiceTime() {\r
+               int timePassed = 0;\r
+               for (Services serv : operating.keySet()) {\r
+                       int lasttimepassed = getLastTested(serv);\r
+                       if (timePassed < lasttimepassed) {\r
+                               timePassed = lasttimepassed;\r
+                       }\r
+               }\r
+               return timePassed;\r
+       }\r
+\r
        @Override\r
        public int getLastTested(Services service) {\r
                Date testedOn = getLastTestedOn(service);\r
@@ -83,12 +144,20 @@ public class RegistryWS implements compbio.data.msa.RegistryWS, JABAService {
                Writer testlog = new StringWriter();\r
                PrintWriter writer = new PrintWriter(testlog, true);\r
                WSTester tester = new WSTester(getServicePath(), writer);\r
-               // This is done deliberately to prevent malicious user from overloading\r
-               // the server\r
+               // This is done deliberately to prevent malicious user from overloading the server\r
                synchronized (operating) {\r
                        for (Services service : Services.values()) {\r
-                               if (tester.checkService(service)) {\r
-                                       operating.put(service, new Date());\r
+                               try {\r
+                                       if (tester.checkService(service)) {\r
+                                               operating.put(service, new Date());\r
+                                       } else {\r
+                                               nonoperating.put(service, new Date());\r
+                                       }\r
+                               } catch (Exception e) {\r
+                                       log.info(e, e.getCause());\r
+                                       String rep = "Fails to connect to a web service: " + service + " with";\r
+                                       writer.println(rep + e.getLocalizedMessage() + "\nDetails: ");\r
+                                       e.printStackTrace(writer);\r
                                }\r
                        }\r
                }\r
@@ -99,8 +168,7 @@ public class RegistryWS implements compbio.data.msa.RegistryWS, JABAService {
        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
+               HttpServletRequest request = (HttpServletRequest) msContext.get(MessageContext.SERVLET_REQUEST);\r
 \r
                StringBuffer server = request.getRequestURL();\r
                server = server.delete(server.lastIndexOf("/"), server.length());\r
@@ -120,16 +188,30 @@ public class RegistryWS implements compbio.data.msa.RegistryWS, JABAService {
                                        operating.put(service, new Date());\r
                                }\r
                        }\r
+               } catch (Exception e) {\r
+                       log.info(e, e.getCause());\r
+                       writer.println("Fails to connect to a web service: " + service\r
+                                       + " With " + e.getLocalizedMessage() + "\nDetails: ");\r
+                       e.printStackTrace(writer);\r
                } finally {\r
                        writer.close();\r
                }\r
                return testlog.toString();\r
        }\r
-\r
        @Override\r
        public boolean isOperating(Services service) {\r
                init();\r
                return operating.containsKey(service);\r
        }\r
 \r
+       @Override\r
+       public String getServiceDescription(Services service) {\r
+               return service.getServiceInfo();\r
+       }\r
+\r
+       @Override\r
+       public Set<Category> getServiceCategories() {\r
+               return Category.getCategories();\r
+       }\r
+\r
 }\r