/* * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER. * * Copyright (c) 2010-2011 Oracle and/or its affiliates. All rights reserved. * * The contents of this file are subject to the terms of either the GNU * General Public License Version 2 only ("GPL") or the Common Development * and Distribution License("CDDL") (collectively, the "License"). You * may not use this file except in compliance with the License. You can * obtain a copy of the License at * http://glassfish.java.net/public/CDDL+GPL_1_1.html * or packager/legal/LICENSE.txt. See the License for the specific * language governing permissions and limitations under the License. * * When distributing the software, include this License Header Notice in each * file and include the License file at packager/legal/LICENSE.txt. * * GPL Classpath Exception: * Oracle designates this particular file as subject to the "Classpath" * exception as provided by Oracle in the GPL Version 2 section of the License * file that accompanied this code. * * Modifications: * If applicable, add the following below the License Header, with the fields * enclosed by brackets [] replaced by your own identifying information: * "Portions Copyright [year] [name of copyright owner]" * * Contributor(s): * If you wish your version of this file to be governed by only the CDDL or * only the GPL Version 2, indicate your decision by adding "[Contributor] * elects to include this software in this distribution under the [CDDL or GPL * Version 2] license." If you don't indicate a single choice of license, a * recipient has the option to distribute your version of this file under * either the CDDL, the GPL Version 2 or to extend the choice of license to * its licensees as provided above. However, if you add GPL Version 2 code * and therefore, elected the GPL Version 2 license, then the option applies * only if the new code is made subject to such option by the copyright * holder. */ package com.sun.jersey.test.functional.monitoring.commons; import com.sun.jersey.api.client.Client; import com.sun.jersey.api.client.WebResource; import com.sun.jersey.api.client.filter.LoggingFilter; import org.codehaus.jettison.json.JSONException; import org.codehaus.jettison.json.JSONObject; import javax.ws.rs.core.MediaType; import javax.ws.rs.core.UriBuilder; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.net.URI; import java.util.logging.Level; import java.util.logging.Logger; /** * * @author naresh */ public class ResourceMonitor { private WebResource monitoringResource; private String applicationName; private String glassFishHome; private String asadminCommand = "asadmin"; public ResourceMonitor(String applicationName) { URI monitoringUri = UriBuilder .fromUri("http://localhost/monitoring/domain/server/applications/" + applicationName + "/jersey/resources") .port(getAdminPort(4848)) .build(); Client client = Client.create(); monitoringResource = client.resource(monitoringUri); monitoringResource.addFilter(new LoggingFilter()); this.applicationName = applicationName; } public ResourceMonitor(String applicationName, String glassFishHome) { this(applicationName); this.glassFishHome = glassFishHome; this.asadminCommand = glassFishHome + System.getProperty("file.separator") + "bin" + System.getProperty("file.separator") + asadminCommand; } private int getAdminPort(int adminPort) { return ((System.getProperty("JERSEY_ADMIN_PORT") != null) ? Integer.parseInt(System.getProperty("JERSEY_ADMIN_PORT")) : adminPort); } public String getResourceMonitoredValue(String monitorAttribute) { String monitoredData = monitoringResource .accept(MediaType.APPLICATION_JSON) .get(String.class); JSONObject jSONObject; try { jSONObject = new JSONObject(monitoredData); JSONObject resourceJSON = jSONObject.getJSONObject("Resources"); return resourceJSON.getString(monitorAttribute); } catch (JSONException ex) { ex.printStackTrace(); } return ""; } public String getResourceHitCountValue(String hitcountcategory) { String monitoredData = monitoringResource .accept(MediaType.APPLICATION_JSON) .get(String.class); JSONObject jSONObject; try { jSONObject = new JSONObject(monitoredData); JSONObject resourceJSON = jSONObject.getJSONObject("Resources"); resourceJSON = resourceJSON.getJSONObject(hitcountcategory); return resourceJSON.toString(); } catch (JSONException ex) { } return ""; } public int getPerResourceHitCountValue(String hitcountcategory, String resourceClassFullyQualifiedName) { String monitoredData = monitoringResource .accept(MediaType.APPLICATION_JSON) .get(String.class); JSONObject jSONObject; try { jSONObject = new JSONObject(monitoredData); JSONObject resourceJSON = jSONObject.getJSONObject("Resources"); resourceJSON = resourceJSON.getJSONObject(hitcountcategory); return resourceJSON.getInt(resourceClassFullyQualifiedName); } catch (JSONException ex) { } return 0; } public int getResourceMonitoredIntValueFromAdminCLI(String monitorAttribute, String resourceClassName) { String value = getResourceMonitoredValueFromAdminCLI(monitorAttribute, resourceClassName); System.out.println("ATTRIBUTE VALUE ::#" + value + "#"); return (value == null || value.equals("")) ? 0 : Integer.parseInt(value); } public String getResourceMonitoredValueFromAdminCLI(String monitorAttribute, String resourceClassName) { String resourceIdentifier = getResourceIdentifierForResource(resourceClassName); System.out.println("JERSEY RESOURCE ID :: " + resourceIdentifier); if (resourceIdentifier != null) { try { StringBuilder stringBuilder = new StringBuilder(); stringBuilder.append(asadminCommand).append(" --port=") .append(getAdminPort(4848)) .append(" get -m server.*"); Process process = Runtime.getRuntime().exec(stringBuilder.toString()); try { System.out.println("asadmin get status :: " + process.waitFor()); } catch (InterruptedException ex) { Logger.getLogger(ResourceMonitor.class.getName()).log(Level.SEVERE, null, ex); } //Process process = Runtime.getRuntime().exec(stringBuilder.toString()); InputStream inputStream = process.getInputStream(); BufferedReader in = new BufferedReader( new InputStreamReader(inputStream)); String line = null; StringBuilder monitoredData = new StringBuilder(); while ((line = in.readLine()) != null) { if(line.contains(applicationName) && line.contains(resourceIdentifier) && line.contains("."+monitorAttribute)) { System.out.println(line); monitoredData.append(line.split("=")[1].trim()); break; } } return monitoredData.toString(); } catch (IOException ex) { Logger.getLogger(ResourceMonitor.class.getName()).log(Level.SEVERE, null, ex); } } return null; } private String getResourceIdentifierForResource(String resourceClassName) { try { StringBuilder stringBuilder = new StringBuilder(); stringBuilder.append(asadminCommand).append(" --port=") .append(getAdminPort(4848)) .append(" get -m server.*"); Process process = Runtime.getRuntime().exec(stringBuilder.toString()); try { System.out.println("asadmin get status :: " + process.waitFor()); } catch (InterruptedException ex) { Logger.getLogger(ResourceMonitor.class.getName()).log(Level.SEVERE, null, ex); } InputStream inputStream = process.getInputStream(); BufferedReader in = new BufferedReader( new InputStreamReader(inputStream)); String line = null; StringBuilder monitoredData = new StringBuilder(); while ((line = in.readLine()) != null) { if(line.contains(applicationName) && line.contains(resourceClassName)) { System.out.println(line); monitoredData.append(line.split("=")[0].trim()); break; } } int jerseyResourcesIndex = monitoredData.indexOf("jersey.resources"); // read the index of the "." which precedes the resource identifier int resourceIdStartIndex = monitoredData.indexOf(".", jerseyResourcesIndex + 7); // read the index of the "." which follows the resource identifier int resourceIdEndIndex = monitoredData.indexOf(".", resourceIdStartIndex + 1); System.out.println("RESOURCE IDENTIFIER READS :: " + monitoredData); System.out.print("RESOURCE IDENTIFIER INDICES :: " + resourceIdStartIndex + " and " + resourceIdEndIndex); if (jerseyResourcesIndex == -1) { return null; } return monitoredData.substring(resourceIdStartIndex + 1, resourceIdEndIndex); } catch (IOException ex) { Logger.getLogger(ResourceMonitor.class.getName()).log(Level.SEVERE, null, ex); } return null; } }