test WS on internal server in the case of proxying
[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.Collections;\r
33 \r
34 import javax.management.AttributeNotFoundException;\r
35 import javax.management.InstanceNotFoundException;\r
36 import javax.management.MBeanException;\r
37 import javax.management.MBeanServer;\r
38 import javax.management.MalformedObjectNameException;\r
39 import javax.management.ObjectName;\r
40 import javax.management.Query;\r
41 import javax.management.ReflectionException;\r
42 import javax.servlet.RequestDispatcher;\r
43 import javax.servlet.ServletException;\r
44 import javax.servlet.http.HttpServlet;\r
45 import javax.servlet.http.HttpServletRequest;\r
46 import javax.servlet.http.HttpServletResponse;\r
47 \r
48 import org.apache.log4j.Logger;\r
49 \r
50 import compbio.ws.client.Services;\r
51 import compbio.ws.client.WSTester;\r
52 \r
53 /**\r
54  * Use cases:\r
55  * <dl>\r
56  * <li>Test web services and display results on the web page</li>\r
57  * </dl>\r
58  * \r
59  * @author pvtroshin\r
60  * \r
61  */\r
62 \r
63 public class ServiceStatus extends HttpServlet {\r
64 \r
65         private final static Logger log = Logger.getLogger(ServiceStatus.class);\r
66 \r
67         private List<String> getEndPoints() throws MalformedObjectNameException, NullPointerException, UnknownHostException,\r
68                         AttributeNotFoundException, InstanceNotFoundException, MBeanException, ReflectionException {\r
69                 MBeanServer mbs = ManagementFactory.getPlatformMBeanServer();\r
70                 Set<ObjectName> objs = mbs.queryNames(new ObjectName("*:type=Connector,*"),\r
71                                 Query.match(Query.attr("protocol"), Query.value("HTTP/1.1")));\r
72                 List<String> endPoints = new ArrayList<String>();\r
73                 for (Iterator<ObjectName> i = objs.iterator(); i.hasNext();) {\r
74                         ObjectName obj = i.next();\r
75                         String scheme = mbs.getAttribute(obj, "scheme").toString();\r
76                         String port = obj.getKeyProperty("port");\r
77                         String hostname = InetAddress.getLocalHost().getHostName();\r
78                         endPoints.add(scheme + "://" + hostname + ":" + port);\r
79                 }\r
80                 return endPoints;\r
81         }\r
82 \r
83         @Override\r
84         protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {\r
85                 /**\r
86                  * // PROBLEM: the code tries to test not WS endpoints on an internal\r
87                  * Tomcat, but on an external // endpoints with wrong info on the\r
88                  * proxing StringBuffer jabawspath = req.getRequestURL(); jabawspath =\r
89                  * jabawspath.delete(jabawspath.lastIndexOf("/"), jabawspath.length());\r
90                  * String serverPath = jabawspath.toString();\r
91                  */\r
92                 List<String> eps = new ArrayList<String>();\r
93                 try {\r
94                         eps = getEndPoints();\r
95                 } catch (MalformedObjectNameException e) {\r
96                         // TODO Auto-generated catch block\r
97                         e.printStackTrace();\r
98                 } catch (AttributeNotFoundException e) {\r
99                         // TODO Auto-generated catch block\r
100                         e.printStackTrace();\r
101                 } catch (InstanceNotFoundException e) {\r
102                         // TODO Auto-generated catch block\r
103                         e.printStackTrace();\r
104                 } catch (NullPointerException e) {\r
105                         // TODO Auto-generated catch block\r
106                         e.printStackTrace();\r
107                 } catch (MBeanException e) {\r
108                         // TODO Auto-generated catch block\r
109                         e.printStackTrace();\r
110                 } catch (ReflectionException e) {\r
111                         // TODO Auto-generated catch block\r
112                         e.printStackTrace();\r
113                 }\r
114                 if (1 != eps.size()) {\r
115                         log.info(eps.size() + "EndPoints found");\r
116                         //System.out.println("      " + eps.size() + " EndPoints found");\r
117                         for (String endpoint : eps) {\r
118                                 log.info(eps.size() + "EndPoint is " + endpoint);\r
119                                 //System.out.println("   EndPoint is " + endpoint);\r
120                         }\r
121                 }\r
122 \r
123                 String serverPath = new String();\r
124                 for (String endpoint : eps) {\r
125                         serverPath = endpoint + req.getContextPath();\r
126                 }\r
127                 //System.out.println("Testing services at " + serverPath);\r
128 \r
129                 List<ServiceTestResult> testResults = new ArrayList<ServiceTestResult>();\r
130                 long startTime = System.nanoTime();\r
131                 for (Services service : Services.values()) {\r
132                         StringWriter testres = new StringWriter();\r
133                         PrintWriter writer = new PrintWriter(testres, true);\r
134                         WSTester tester = new WSTester(serverPath, writer);\r
135                         ServiceTestResult result = new ServiceTestResult(service);\r
136                         try {\r
137                                 result.failed = tester.checkService(service);\r
138                         } catch (Exception e) {\r
139                                 log.info(e, e.getCause());\r
140                                 String mess = "Fails to connect to the web service: " + service + ". Reason: ";\r
141                                 writer.println(mess + e.getLocalizedMessage() + "\nDetails: ");\r
142                                 e.printStackTrace(writer);\r
143                         } finally {\r
144                                 writer.close();\r
145                         }\r
146                         result.details = testres.toString();\r
147                         testResults.add(result);\r
148                 }\r
149                 req.setAttribute("results", testResults);\r
150                 long endTime = System.nanoTime();\r
151                 req.setAttribute("timeexec", (endTime - startTime) / 1000000);\r
152                 RequestDispatcher rd = req.getRequestDispatcher("statpages/ServicesStatus.jsp");\r
153                 rd.forward(req, resp);\r
154         }\r
155 \r
156 }\r