package net.wasdev.twelvefactorapp; import java.io.ByteArrayInputStream; import java.io.IOException; import java.io.InputStream; import java.io.PrintWriter; import javax.json.Json; import javax.json.JsonArray; import javax.json.JsonException; import javax.json.JsonObject; import javax.json.JsonReader; import javax.json.JsonReaderFactory; import javax.json.JsonValue; import javax.servlet.annotation.WebServlet; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import javax.ws.rs.client.Client; import javax.ws.rs.client.ClientBuilder; import javax.ws.rs.client.Invocation; import javax.ws.rs.client.WebTarget; import javax.ws.rs.core.MediaType; import javax.ws.rs.core.Response; @WebServlet("/admin/stats") public class AdminServlet extends HttpServlet { private static final long serialVersionUID = 1L; private static String statsExtension = "/IBMJMXConnectorREST/mbeans/WebSphere%3Aname%3D12-factor-application.net.wasdev.twelvefactorapp.JaxrsApplication%2Ctype%3DServletStats/attributes?attribute=RequestCountDetails"; @Override public void doGet(HttpServletRequest httpRequest, HttpServletResponse httpResponse) throws IOException { String authorizationHeaderName = "Authorization"; String authorizationHeaderValue = "Basic " + javax.xml.bind.DatatypeConverter.printBase64Binary("kate:password".getBytes("UTF-8")); String url = ""; String requestURI = httpRequest.getRequestURI().toString(); String requestUrl = httpRequest.getRequestURL().toString(); String subUrl = requestUrl.substring(0, requestUrl.indexOf(requestURI)); url = subUrl + statsExtension; Client client = ClientBuilder.newClient(); WebTarget target = client.target(url); Invocation.Builder invoBuild = target.request(MediaType.APPLICATION_JSON).header(authorizationHeaderName, authorizationHeaderValue); Response response = invoBuild.get(); String resp = response.readEntity(String.class); response.close(); // String stats = parse(resp); String stats = resp; PrintWriter out = httpResponse.getWriter(); out.println("Stats: " + stats + " Status: " + httpResponse.getStatus()); } // Not quite working yet - getting a decoding error private String parse(String stats) throws IOException { // Convert string to jsonObject InputStream is = new ByteArrayInputStream(stats.getBytes("UTF-8")); JsonReader reader = Json.createReader(is); String output = ""; try { JsonArray jsonArray = reader.readArray(); JsonObject jsonObject = jsonArray.getJsonObject(0); JsonObject topLevelValue = (JsonObject) jsonObject.get("value"); JsonObject value = (JsonObject) topLevelValue.get("value"); JsonValue currentValue = value.get("currentValue"); JsonValue desc = value.get("description"); output = "Stats:" + desc.toString() + ": " + currentValue.toString(); } catch (JsonException e) { reader.close(); is.close(); if (e.getMessage().equals("Cannot read JSON array, found JSON object")) { output = "MXBean not created yet, the application must be accessed at least " + "once to get statistics"; } else { output = "A JSON Exception occurred: " + e.getMessage(); } } reader.close(); is.close(); return output; } }