add response to head method
[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 doHead(HttpServletRequest req, HttpServletResponse resp)\r
38                         throws ServletException, IOException {\r
39                 doGet(req, resp);\r
40         }\r
41 \r
42         @Override\r
43         protected void doGet(HttpServletRequest req, HttpServletResponse resp)\r
44                         throws ServletException, IOException {\r
45 \r
46                 Services[] servicesToTest = null;\r
47                 String path = req.getPathInfo();\r
48                 if (!Util.isEmpty(path)) {\r
49                         // test a particular service\r
50                         // e.g. /DisEMBLWS\r
51                         path = path.trim().substring(1);\r
52                         Services service = Services.getService(path);\r
53                         if (service == null) {\r
54                                 resp.sendError(\r
55                                                 HttpServletResponse.SC_BAD_REQUEST,\r
56                                                 "Unknown service name: " + path\r
57                                                                 + "\n Known services are: "\r
58                                                                 + Arrays.toString(Services.values())); // bad\r
59                                 // request\r
60                                 return;\r
61                         }\r
62                         servicesToTest = new Services[]{service};\r
63                 } else {\r
64                         // assume all services require testing\r
65                         servicesToTest = Services.values();\r
66                 }\r
67 \r
68                 // find out the application path to give it to the tester\r
69                 // e.g.\r
70                 // http://localhost:8080/jabaws/HttpCodeResponseServiceStatus/DisEMBLWS\r
71                 // convert it to http://localhost:8080/jabaws\r
72                 StringBuffer jabawspath = req.getRequestURL();\r
73                 jabawspath = jabawspath.delete(\r
74                                 jabawspath.indexOf("/"\r
75                                                 + HttpCodeResponseServiceStatus.class.getSimpleName()),\r
76                                 jabawspath.length());\r
77                 boolean operating = false;\r
78                 // save for the future use\r
79                 Services failedService = null;\r
80                 String failMessage = "";\r
81                 for (Services serv : servicesToTest) {\r
82                         String serverPath = jabawspath.toString();\r
83                         StringWriter testres = new StringWriter();\r
84                         PrintWriter writer = new PrintWriter(testres, true);\r
85                         // test\r
86                         try {\r
87                                 WSTester tester = new WSTester(serverPath, writer);\r
88                                 operating = tester.checkService(serv);\r
89                         } catch (Exception e) {\r
90                                 log.info(e, e.getCause());\r
91                                 writer.println("Fails to connect to a web service: " + serv\r
92                                                 + " With " + e.getLocalizedMessage() + "\nDetails: ");\r
93                                 // if one service fails, everything fails\r
94                                 operating = false;\r
95                         } finally {\r
96                                 writer.close();\r
97                         }\r
98                         if (!operating) {\r
99                                 failedService = serv;\r
100                                 failMessage = testres.toString();\r
101                                 break;\r
102                         }\r
103                 }\r
104 \r
105                 if (operating) {\r
106                         resp.setStatus(HttpServletResponse.SC_OK); // OK\r
107                 } else {\r
108                         // Internal server error - Service Unavailable\r
109                         resp.sendError(HttpServletResponse.SC_SERVICE_UNAVAILABLE,\r
110                                         "Service: " + failedService\r
111                                                         + "\n is not available! Error message:\n "\r
112                                                         + failMessage);\r
113 \r
114                 }\r
115 \r
116         }\r
117 }\r