Web services status checking servlets, new clustalo x32 binary from Fabian, other...
[jabaws.git] / webservices / compbio / stat / servlet / HttpCodeResponseServiceStatus.java
1 package compbio.stat.servlet;\r
2 \r
3 import java.io.IOException;\r
4 import java.io.PrintWriter;\r
5 import java.io.StringWriter;\r
6 import java.util.Arrays;\r
7 \r
8 import javax.servlet.ServletException;\r
9 import javax.servlet.http.HttpServlet;\r
10 import javax.servlet.http.HttpServletRequest;\r
11 import javax.servlet.http.HttpServletResponse;\r
12 \r
13 import org.apache.log4j.Logger;\r
14 \r
15 import compbio.util.Util;\r
16 import compbio.ws.client.Services;\r
17 import compbio.ws.client.WSTester;\r
18 \r
19 /**\r
20  * This servlet checks the webservice coming as pathinfo and returns http code\r
21  * as a reply. If the web service functions correctly then OK (200) is returned.\r
22  * otherwise Service unavailable (503). When the webservice is not recognised\r
23  * unknown service error (400) is sent as a response.\r
24  * \r
25  * If no pathinfo is specified all web services are checked and OK is returned\r
26  * only if all webservices are functioning.\r
27  * \r
28  * @author pvtroshin\r
29  * \r
30  */\r
31 public class HttpCodeResponseServiceStatus extends HttpServlet {\r
32 \r
33         private final static Logger log = Logger\r
34                         .getLogger(HttpCodeResponseServiceStatus.class);\r
35 \r
36         @Override\r
37         protected void doGet(HttpServletRequest req, HttpServletResponse resp)\r
38                         throws ServletException, IOException {\r
39 \r
40                 Services[] servicesToTest = null;\r
41                 String path = req.getPathInfo();\r
42                 if (!Util.isEmpty(path)) {\r
43                         // test a particular service\r
44                         // e.g. /DisEMBLWS\r
45                         path = path.trim().substring(1);\r
46                         Services service = Services.getService(path);\r
47                         if (service == null) {\r
48                                 resp.sendError(\r
49                                                 HttpServletResponse.SC_BAD_REQUEST,\r
50                                                 "Unknown service name: " + path\r
51                                                                 + "\n Known services are: "\r
52                                                                 + Arrays.toString(Services.values())); // bad\r
53                                 // request\r
54                                 return;\r
55                         }\r
56                         servicesToTest = new Services[]{service};\r
57                 } else {\r
58                         // assume all services require testing\r
59                         servicesToTest = Services.values();\r
60                 }\r
61 \r
62                 // find out the application path to give it to the tester\r
63                 // e.g.\r
64                 // http://localhost:8080/jabaws/HttpCodeResponseServiceStatus/DisEMBLWS\r
65                 // convert it to http://localhost:8080/jabaws\r
66                 StringBuffer jabawspath = req.getRequestURL();\r
67                 jabawspath = jabawspath.delete(\r
68                                 jabawspath.indexOf("/"\r
69                                                 + HttpCodeResponseServiceStatus.class.getSimpleName()),\r
70                                 jabawspath.length());\r
71                 boolean operating = false;\r
72                 // save for the future use\r
73                 Services failedService = null;\r
74                 String failMessage = "";\r
75                 for (Services serv : servicesToTest) {\r
76                         String serverPath = jabawspath.toString();\r
77                         StringWriter testres = new StringWriter();\r
78                         PrintWriter writer = new PrintWriter(testres, true);\r
79                         // test\r
80                         try {\r
81                                 WSTester tester = new WSTester(serverPath, writer);\r
82                                 operating = tester.checkService(serv);\r
83                         } catch (Exception e) {\r
84                                 log.info(e, e.getCause());\r
85                                 writer.println("Fails to connect to a web service: " + serv\r
86                                                 + " With " + e.getLocalizedMessage() + "\nDetails: ");\r
87                                 // if one service fails, everything fails\r
88                                 operating = false;\r
89                         } finally {\r
90                                 writer.close();\r
91                         }\r
92                         if (!operating) {\r
93                                 failedService = serv;\r
94                                 failMessage = testres.toString();\r
95                                 break;\r
96                         }\r
97                 }\r
98 \r
99                 if (operating) {\r
100                         resp.setStatus(HttpServletResponse.SC_OK); // OK\r
101                 } else {\r
102                         // Internal server error - Service Unavailable\r
103                         resp.sendError(HttpServletResponse.SC_SERVICE_UNAVAILABLE,\r
104                                         "Service: " + failedService\r
105                                                         + "\n is not available! Error message:\n "\r
106                                                         + failMessage);\r
107 \r
108                 }\r
109 \r
110         }\r
111 }\r