/* * Jopr Management Platform * Copyright (C) 2005-2008 Red Hat, Inc. * All rights reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License, version 2, as * published by the Free Software Foundation, and/or the GNU Lesser * General Public License, version 2.1, also as published by the Free * Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License and the GNU Lesser General Public License * for more details. * * You should have received a copy of the GNU General Public License * and the GNU Lesser General Public License along with this program; * if not, write to the Free Software Foundation, Inc., * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ package org.jboss.on.plugins.tomcat.helper; import java.io.File; import java.io.FileInputStream; import java.io.IOException; import java.io.InputStream; import java.util.HashMap; import javax.xml.parsers.ParserConfigurationException; import javax.xml.parsers.SAXParser; import javax.xml.parsers.SAXParserFactory; import org.xml.sax.Attributes; import org.xml.sax.SAXException; import org.xml.sax.helpers.DefaultHandler; /** * Config parsing intended only for Tomcat server auto discovery. Copied over from the 1.4 source tree. */ public class TomcatConfig { private static HashMap<File, TomcatConfig> cache = null; private String address; private String port; private long lastModified = 0; private TomcatConfig() { } /** * This constructor is intended to provide TomcatConfig instances not * based on an XML file (as opposed to the (cached) instances obtained from {@link #getConfig(File)} method). * * @param port * @param address */ public TomcatConfig(String port, String address) { this.port = port; this.address = address; } public static synchronized TomcatConfig getConfig(File configXML) { if (cache == null) { cache = new HashMap<File, TomcatConfig>(); } TomcatConfig cfg = cache.get(configXML); long lastModified = configXML.lastModified(); if ((cfg == null) || (lastModified != cfg.lastModified)) { cfg = new TomcatConfig(); cfg.lastModified = lastModified; cache.put(configXML, cfg); try { cfg.read(configXML); } catch (IOException e) { } } return cfg; } public String getPort() { return port; } public String getAddress() { return address; } private void read(File file) throws IOException { FileInputStream is = null; try { is = new FileInputStream(file); parse(is); } catch (SAXException e) { throw new IllegalArgumentException(e.getMessage()); } catch (ParserConfigurationException e) { throw new IllegalArgumentException(e.getMessage()); } finally { if (is != null) { try { is.close(); } catch (IOException e) { } } } } private void parse(InputStream is) throws IOException, SAXException, ParserConfigurationException { SAXParserFactory factory = SAXParserFactory.newInstance(); SAXParser parser = factory.newSAXParser(); TomcatConnectorHandler handler = new TomcatConnectorHandler(); parser.parse(is, handler); port = handler.getPort(); address = handler.getAddress(); } static class TomcatConnectorHandler extends DefaultHandler { private String address; private String port; public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException { if (!qName.equals("Connector")) { return; } if (attributes.getValue("protocolHandlerClassName") != null) { //e.g. org.apache.jk.server.JkCoyoteHandler return; } if (attributes.getValue("protocol") != null) { // JbossAS 4.2 now has Tomcat6 and it explicitly defines the protocol if (!attributes.getValue("protocol").toLowerCase().contains("http")) { //e.g. probably AJP/1.3 return; } } String className = attributes.getValue("className"); if (className != null) { if (className.endsWith("WarpConnector") //e.g. 4.0.x || className.endsWith("Ajp13Connector")) { return; } } this.port = attributes.getValue("port"); this.address = attributes.getValue("address"); } protected String getPort() { return port; } protected String getAddress() { return address; } } public static void main(String[] args) throws Exception { for (int i = 0; i < args.length; i++) { TomcatConfig cfg = TomcatConfig.getConfig(new File(args[i])); System.out.println("Port=" + cfg.getPort() + " [" + args[i] + "]"); } } }