--- /dev/null
+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