1 /* Copyright (c) 2013 Alexander Sherstnev
\r
2 * Copyright (c) 2011 Peter Troshin
\r
4 * JAva Bioinformatics Analysis Web Services (JABAWS) @version: 2.0
\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
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
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
16 * Any republication or derived work distributed in source code form
\r
17 * must include this copyright and license notice.
\r
20 package compbio.stat.servlet;
\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
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
49 import org.apache.log4j.Logger;
\r
51 import compbio.ws.client.Services;
\r
52 import compbio.ws.client.WSTester;
\r
57 * <li>Test web services and display results on the web page</li>
\r
64 public class ServiceStatus extends HttpServlet {
\r
66 private final static Logger log = Logger.getLogger(ServiceStatus.class);
\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
85 protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
\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
93 List<String> eps = new ArrayList<String>();
\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
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
124 String serverPath = new String();
\r
125 for (String endpoint : eps) {
\r
126 serverPath = endpoint + req.getContextPath();
\r
128 //System.out.println("Testing services at " + serverPath);
\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
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
147 result.details = testres.toString();
\r
148 testResults.add(result);
\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