it.jnrpe.plugin.tomcat.TomcatDataProvider.java Source code

Java tutorial

Introduction

Here is the source code for it.jnrpe.plugin.tomcat.TomcatDataProvider.java

Source

/*******************************************************************************
 * Copyright (c) 2007, 2014 Massimiliano Ziccardi
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 *******************************************************************************/
package it.jnrpe.plugin.tomcat;

import it.jnrpe.plugin.utils.Utils;

import java.io.StringReader;
import java.net.URL;
import java.util.Collection;
import java.util.HashMap;
import java.util.Map;
import java.util.Properties;

import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.xpath.XPath;
import javax.xml.xpath.XPathConstants;
import javax.xml.xpath.XPathFactory;

import org.apache.commons.codec.binary.Base64;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.NamedNodeMap;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
import org.xml.sax.InputSource;

class TomcatDataProvider implements IAppServerDataProvider {

    private String uri;
    private int port;
    private String username;
    private String password;
    private String hostname;
    private boolean useSSL;

    private String tomcatXML = null;

    private MemoryData jvmMemoryUsage = null;
    private Map<String, MemoryPoolData> memoryPoolData = new HashMap<String, MemoryPoolData>();
    private Map<String, ThreadData> connectorThreadData = new HashMap<String, ThreadData>();

    public TomcatDataProvider() {

    }

    public void init(String hostname, String uri, int port, String username, String password, boolean useSSL,
            int timeout) throws Exception {

        this.uri = uri;
        this.port = port;
        this.username = username;
        this.password = password;
        this.hostname = hostname;
        this.useSSL = useSSL;

        // Retrieve tomcat xml...
        String encoded = Base64.encodeBase64String((username + ":" + password).getBytes("UTF-8"));
        Properties props = new Properties();
        props.setProperty("Authorization", "Basic " + encoded);
        String response = Utils.getUrl(new URL(getUrl()), props, timeout * 1000);

        if (response == null) {
            throw new Exception("Null response received from tomcat");
        }
        tomcatXML = response;

        parseMemoryData();
        parseMemoryPools();
        parseConnectorsThreadData();
    }

    private void parseMemoryData() throws Exception {

        DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
        DocumentBuilder builder = factory.newDocumentBuilder();

        InputSource is = new InputSource(new StringReader(tomcatXML));

        Document doc = builder.parse(is);
        XPathFactory xPathfactory = XPathFactory.newInstance();
        XPath xpath = xPathfactory.newXPath();
        //Element root = (Element) xpath.compile("//status").evaluate(doc.getDocumentElement(), XPathConstants.NODE);
        Element memory = (Element) xpath.compile("//status/jvm/memory").evaluate(doc.getDocumentElement(),
                XPathConstants.NODE);

        long freeMem = Long.parseLong(memory.getAttribute("free"));
        long totalMem = Long.parseLong(memory.getAttribute("total"));
        long maxMem = Long.parseLong(memory.getAttribute("max"));

        jvmMemoryUsage = new MemoryData(freeMem, maxMem, totalMem);
    }

    private void parseMemoryPools() throws Exception {
        DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
        DocumentBuilder builder = factory.newDocumentBuilder();

        InputSource is = new InputSource(new StringReader(tomcatXML));

        Document doc = builder.parse(is);
        XPathFactory xPathfactory = XPathFactory.newInstance();
        XPath xpath = xPathfactory.newXPath();

        NodeList memoryPoolList = (NodeList) xpath.compile("//status/jvm/memorypool")
                .evaluate(doc.getDocumentElement(), XPathConstants.NODESET);

        for (int i = 0; i < memoryPoolList.getLength(); i++) {
            Node poolNode = memoryPoolList.item(i);
            NamedNodeMap atts = poolNode.getAttributes();
            final String poolName = atts.getNamedItem("name").getNodeValue();
            long usageInit = Long.parseLong(atts.getNamedItem("usageInit").getNodeValue());
            long usageCommitted = Long.parseLong(atts.getNamedItem("usageCommitted").getNodeValue());
            long usageMax = Long.parseLong(atts.getNamedItem("usageMax").getNodeValue());
            long usageUsed = Long.parseLong(atts.getNamedItem("usageUsed").getNodeValue());

            memoryPoolData.put(poolName,
                    new MemoryPoolData(poolName, usageInit, usageCommitted, usageMax, usageUsed));
        }
    }

    private void parseConnectorsThreadData() throws Exception {
        DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
        DocumentBuilder builder = factory.newDocumentBuilder();

        InputSource is = new InputSource(new StringReader(tomcatXML));

        Document doc = builder.parse(is);
        XPathFactory xPathfactory = XPathFactory.newInstance();
        XPath xpath = xPathfactory.newXPath();

        NodeList connectorsNodeList = (NodeList) xpath.compile("//status/connector")
                .evaluate(doc.getDocumentElement(), XPathConstants.NODESET);

        for (int i = 0; i < connectorsNodeList.getLength(); i++) {
            Node connector = connectorsNodeList.item(i);
            NodeList connectorChildren = connector.getChildNodes();

            final String connectorName = connector.getAttributes().getNamedItem("name").getNodeValue();
            for (int j = 0; j < connectorChildren.getLength(); j++) {
                Node node = connectorChildren.item(j);
                if (node.getNodeName().equalsIgnoreCase("threadInfo")) {

                    NamedNodeMap atts = node.getAttributes();

                    long maxThreads = Long.parseLong(atts.getNamedItem("maxThreads").getNodeValue());
                    long currentThreadsBusy = Long
                            .parseLong(atts.getNamedItem("currentThreadsBusy").getNodeValue());
                    long currentThreadCount = Long
                            .parseLong(atts.getNamedItem("currentThreadCount").getNodeValue());

                    connectorThreadData.put(connectorName,
                            new ThreadData(connectorName, currentThreadCount, currentThreadsBusy, maxThreads));
                }
            }
        }
    }

    private String getUrl() {

        String path = uri;

        if (!path.startsWith("/")) {
            path = "/" + uri;
        }

        String protocol;
        String credentials;

        if (useSSL) {
            protocol = "https://";
        } else {
            protocol = "http://";
        }

        if (password != null) {
            credentials = username + ":" + password;
        } else {
            credentials = username + ":";
        }

        String url = protocol + credentials + "@" + hostname + ":" + port + path;

        return url;
    }

    public MemoryData getJVMMemoryUsage() {
        return jvmMemoryUsage;
    }

    public Collection<MemoryPoolData> getMemoryPoolData() {
        return memoryPoolData.values();
    }

    public Collection<ThreadData> getThreadData() {
        return connectorThreadData.values();
    }

}