Web services status checking servlets, new clustalo x32 binary from Fabian, other...
[jabaws.git] / webservices / compbio / stat / servlet / HttpCodeResponseServiceStatus.java
diff --git a/webservices/compbio/stat/servlet/HttpCodeResponseServiceStatus.java b/webservices/compbio/stat/servlet/HttpCodeResponseServiceStatus.java
new file mode 100644 (file)
index 0000000..c72f02c
--- /dev/null
@@ -0,0 +1,111 @@
+package compbio.stat.servlet;\r
+\r
+import java.io.IOException;\r
+import java.io.PrintWriter;\r
+import java.io.StringWriter;\r
+import java.util.Arrays;\r
+\r
+import javax.servlet.ServletException;\r
+import javax.servlet.http.HttpServlet;\r
+import javax.servlet.http.HttpServletRequest;\r
+import javax.servlet.http.HttpServletResponse;\r
+\r
+import org.apache.log4j.Logger;\r
+\r
+import compbio.util.Util;\r
+import compbio.ws.client.Services;\r
+import compbio.ws.client.WSTester;\r
+\r
+/**\r
+ * This servlet checks the webservice coming as pathinfo and returns http code\r
+ * as a reply. If the web service functions correctly then OK (200) is returned.\r
+ * otherwise Service unavailable (503). When the webservice is not recognised\r
+ * unknown service error (400) is sent as a response.\r
+ * \r
+ * If no pathinfo is specified all web services are checked and OK is returned\r
+ * only if all webservices are functioning.\r
+ * \r
+ * @author pvtroshin\r
+ * \r
+ */\r
+public class HttpCodeResponseServiceStatus extends HttpServlet {\r
+\r
+       private final static Logger log = Logger\r
+                       .getLogger(HttpCodeResponseServiceStatus.class);\r
+\r
+       @Override\r
+       protected void doGet(HttpServletRequest req, HttpServletResponse resp)\r
+                       throws ServletException, IOException {\r
+\r
+               Services[] servicesToTest = null;\r
+               String path = req.getPathInfo();\r
+               if (!Util.isEmpty(path)) {\r
+                       // test a particular service\r
+                       // e.g. /DisEMBLWS\r
+                       path = path.trim().substring(1);\r
+                       Services service = Services.getService(path);\r
+                       if (service == null) {\r
+                               resp.sendError(\r
+                                               HttpServletResponse.SC_BAD_REQUEST,\r
+                                               "Unknown service name: " + path\r
+                                                               + "\n Known services are: "\r
+                                                               + Arrays.toString(Services.values())); // bad\r
+                               // request\r
+                               return;\r
+                       }\r
+                       servicesToTest = new Services[]{service};\r
+               } else {\r
+                       // assume all services require testing\r
+                       servicesToTest = Services.values();\r
+               }\r
+\r
+               // find out the application path to give it to the tester\r
+               // e.g.\r
+               // http://localhost:8080/jabaws/HttpCodeResponseServiceStatus/DisEMBLWS\r
+               // convert it to http://localhost:8080/jabaws\r
+               StringBuffer jabawspath = req.getRequestURL();\r
+               jabawspath = jabawspath.delete(\r
+                               jabawspath.indexOf("/"\r
+                                               + HttpCodeResponseServiceStatus.class.getSimpleName()),\r
+                               jabawspath.length());\r
+               boolean operating = false;\r
+               // save for the future use\r
+               Services failedService = null;\r
+               String failMessage = "";\r
+               for (Services serv : servicesToTest) {\r
+                       String serverPath = jabawspath.toString();\r
+                       StringWriter testres = new StringWriter();\r
+                       PrintWriter writer = new PrintWriter(testres, true);\r
+                       // test\r
+                       try {\r
+                               WSTester tester = new WSTester(serverPath, writer);\r
+                               operating = tester.checkService(serv);\r
+                       } catch (Exception e) {\r
+                               log.info(e, e.getCause());\r
+                               writer.println("Fails to connect to a web service: " + serv\r
+                                               + " With " + e.getLocalizedMessage() + "\nDetails: ");\r
+                               // if one service fails, everything fails\r
+                               operating = false;\r
+                       } finally {\r
+                               writer.close();\r
+                       }\r
+                       if (!operating) {\r
+                               failedService = serv;\r
+                               failMessage = testres.toString();\r
+                               break;\r
+                       }\r
+               }\r
+\r
+               if (operating) {\r
+                       resp.setStatus(HttpServletResponse.SC_OK); // OK\r
+               } else {\r
+                       // Internal server error - Service Unavailable\r
+                       resp.sendError(HttpServletResponse.SC_SERVICE_UNAVAILABLE,\r
+                                       "Service: " + failedService\r
+                                                       + "\n is not available! Error message:\n "\r
+                                                       + failMessage);\r
+\r
+               }\r
+\r
+       }\r
+}\r