JWS-121 & JWS-111 Adding ‘timestamp’ (string formatted date + time) to the HttpServ...
[jabaws.git] / webservices / compbio / stat / servlet / ServiceStatus.java
1 /* Copyright (c) 2013 Alexander Sherstnev\r
2  * Copyright (c) 2011 Peter Troshin\r
3  *  \r
4  *  JAva Bioinformatics Analysis Web Services (JABAWS) @version: 2.0     \r
5  * \r
6  *  This library is free software; you can redistribute it and/or modify it under the terms of the\r
7  *  Apache License version 2 as published by the Apache Software Foundation\r
8  * \r
9  *  This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without\r
10  *  even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the Apache \r
11  *  License for more details.\r
12  * \r
13  *  A copy of the license is in apache_license.txt. It is also available here:\r
14  * @see: http://www.apache.org/licenses/LICENSE-2.0.txt\r
15  * \r
16  * Any republication or derived work distributed in source code form\r
17  * must include this copyright and license notice.\r
18  */\r
19 \r
20 package compbio.stat.servlet;\r
21 \r
22 import java.io.IOException;\r
23 import java.io.PrintWriter;\r
24 import java.io.StringWriter;\r
25 import java.lang.management.ManagementFactory;\r
26 import java.net.InetAddress;\r
27 import java.net.UnknownHostException;\r
28 import java.util.ArrayList;\r
29 import java.util.Iterator;\r
30 import java.util.List;\r
31 import java.util.Set;\r
32 import java.util.Calendar;\r
33 import java.text.SimpleDateFormat;\r
34 \r
35 import javax.management.AttributeNotFoundException;\r
36 import javax.management.InstanceNotFoundException;\r
37 import javax.management.MBeanException;\r
38 import javax.management.MBeanServer;\r
39 import javax.management.MalformedObjectNameException;\r
40 import javax.management.ObjectName;\r
41 import javax.management.Query;\r
42 import javax.management.ReflectionException;\r
43 import javax.servlet.RequestDispatcher;\r
44 import javax.servlet.ServletException;\r
45 import javax.servlet.http.HttpServlet;\r
46 import javax.servlet.http.HttpServletRequest;\r
47 import javax.servlet.http.HttpServletResponse;\r
48 \r
49 import org.apache.log4j.Logger;\r
50 \r
51 import compbio.ws.client.Services;\r
52 import compbio.ws.client.WSTester;\r
53 \r
54 /**\r
55  * Use cases:\r
56  * <dl>\r
57  * <li>Test web services and display results on the web page</li>\r
58  * </dl>\r
59  * \r
60  * @author pvtroshin\r
61  * \r
62  */\r
63 \r
64 public class ServiceStatus extends HttpServlet {\r
65 \r
66         private final static Logger log = Logger.getLogger(ServiceStatus.class);\r
67 \r
68         private List<String> getEndPoints() throws MalformedObjectNameException, NullPointerException, UnknownHostException,\r
69                         AttributeNotFoundException, InstanceNotFoundException, MBeanException, ReflectionException {\r
70                 MBeanServer mbs = ManagementFactory.getPlatformMBeanServer();\r
71                 Set<ObjectName> objs = mbs.queryNames(new ObjectName("*:type=Connector,*"),\r
72                                 Query.match(Query.attr("protocol"), Query.value("HTTP/1.1")));\r
73                 List<String> endPoints = new ArrayList<String>();\r
74                 for (Iterator<ObjectName> i = objs.iterator(); i.hasNext();) {\r
75                         ObjectName obj = i.next();\r
76                         String scheme = mbs.getAttribute(obj, "scheme").toString();\r
77                         String port = obj.getKeyProperty("port");\r
78                         String hostname = InetAddress.getLocalHost().getHostName();\r
79                         endPoints.add(scheme + "://" + hostname + ":" + port);\r
80                 }\r
81                 return endPoints;\r
82         }\r
83 \r
84         @Override\r
85         protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {\r
86                 /**\r
87                  * // PROBLEM: the code tries to test not WS endpoints on an internal\r
88                  * Tomcat, but on an external // endpoints with wrong info on the\r
89                  * proxing StringBuffer jabawspath = req.getRequestURL(); jabawspath =\r
90                  * jabawspath.delete(jabawspath.lastIndexOf("/"), jabawspath.length());\r
91                  * String serverPath = jabawspath.toString();\r
92                  */\r
93                 List<String> eps = new ArrayList<String>();\r
94                 try {\r
95                         eps = getEndPoints();\r
96                 } catch (MalformedObjectNameException e) {\r
97                         // TODO Auto-generated catch block\r
98                         e.printStackTrace();\r
99                 } catch (AttributeNotFoundException e) {\r
100                         // TODO Auto-generated catch block\r
101                         e.printStackTrace();\r
102                 } catch (InstanceNotFoundException e) {\r
103                         // TODO Auto-generated catch block\r
104                         e.printStackTrace();\r
105                 } catch (NullPointerException e) {\r
106                         // TODO Auto-generated catch block\r
107                         e.printStackTrace();\r
108                 } catch (MBeanException e) {\r
109                         // TODO Auto-generated catch block\r
110                         e.printStackTrace();\r
111                 } catch (ReflectionException e) {\r
112                         // TODO Auto-generated catch block\r
113                         e.printStackTrace();\r
114                 }\r
115                 if (1 != eps.size()) {\r
116                         log.info(eps.size() + "EndPoints found");\r
117                         //System.out.println("      " + eps.size() + " EndPoints found");\r
118                         for (String endpoint : eps) {\r
119                                 log.info(eps.size() + "EndPoint is " + endpoint);\r
120                                 //System.out.println("   EndPoint is " + endpoint);\r
121                         }\r
122                 }\r
123 \r
124                 String serverPath = new String();\r
125                 for (String endpoint : eps) {\r
126                         serverPath = endpoint + req.getContextPath();\r
127                 }\r
128                 //System.out.println("Testing services at " + serverPath);\r
129 \r
130                 List<ServiceTestResult> testResults = new ArrayList<ServiceTestResult>();\r
131                 long startTime = System.nanoTime();\r
132                 for (Services service : Services.values()) {\r
133                         StringWriter testres = new StringWriter();\r
134                         PrintWriter writer = new PrintWriter(testres, true);\r
135                         WSTester tester = new WSTester(serverPath, writer);\r
136                         ServiceTestResult result = new ServiceTestResult(service);\r
137                         try {\r
138                                 result.failed = tester.checkService(service);\r
139                         } catch (Exception e) {\r
140                                 log.info(e, e.getCause());\r
141                                 String mess = "Fails to connect to the web service: " + service + ". Reason: ";\r
142                                 writer.println(mess + e.getLocalizedMessage() + "\nDetails: ");\r
143                                 e.printStackTrace(writer);\r
144                         } finally {\r
145                                 writer.close();\r
146                         }\r
147                         result.details = testres.toString();\r
148                         testResults.add(result);\r
149                 }\r
150                 req.setAttribute("results", testResults);\r
151                 long endTime = System.nanoTime();\r
152 //              req.setAttribute("timeexec", (endTime - startTime) / 1000000);\r
153                 req.setAttribute("timeexec", (endTime - startTime) / 100000000);\r
154                 String timeStamp = new SimpleDateFormat("dd/MM/yyyy HH:mm:ss").format(\r
155                                 Calendar.getInstance().getTime());\r
156                 req.setAttribute("timestamp", timeStamp);\r
157                 RequestDispatcher rd = req.getRequestDispatcher("statpages/ServicesStatus.jsp");\r
158                 rd.forward(req, resp);\r
159         }\r
160 \r
161 }\r