001: /*
002: * JBoss, Home of Professional Open Source.
003: * Copyright 2006, Red Hat Middleware LLC, and individual contributors
004: * as indicated by the @author tags. See the copyright.txt file in the
005: * distribution for a full listing of individual contributors.
006: *
007: * This is free software; you can redistribute it and/or modify it
008: * under the terms of the GNU Lesser General Public License as
009: * published by the Free Software Foundation; either version 2.1 of
010: * the License, or (at your option) any later version.
011: *
012: * This software is distributed in the hope that it will be useful,
013: * but WITHOUT ANY WARRANTY; without even the implied warranty of
014: * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
015: * Lesser General Public License for more details.
016: *
017: * You should have received a copy of the GNU Lesser General Public
018: * License along with this software; if not, write to the Free
019: * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
020: * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
021: */
022: package org.jboss.test.jmx.loading;
023:
024: import java.io.InputStream;
025: import java.net.URL;
026: import javax.xml.parsers.SAXParser;
027: import javax.xml.parsers.SAXParserFactory;
028:
029: import org.apache.log4j.Category;
030: import org.jboss.system.ServiceMBeanSupport;
031: import org.xml.sax.Attributes;
032: import org.xml.sax.SAXException;
033: import org.xml.sax.helpers.DefaultHandler;
034:
035: /** This service access xml files as config resources from via the TCL
036: *
037: * @author Scott.Stark@jboss.org
038: * @version $Revision: 57211 $
039: */
040: public class ResourceTsts extends ServiceMBeanSupport implements
041: ResourceTstsMBean {
042: static Category log = Category.getInstance(ResourceTsts.class);
043: private String namespace = null;
044:
045: public ResourceTsts() {
046: log.debug("ResourceTsts.ctor call stack", new Throwable(
047: "CallStack"));
048: }
049:
050: public String getName() {
051: return "ResourceTst";
052: }
053:
054: public void setNamespace(String namespace) {
055: this .namespace = namespace;
056: }
057:
058: protected void startService() throws Exception {
059: String serviceName = super .getServiceName().toString();
060: log.debug("startService(" + serviceName + ")");
061: log
062: .debug("startService call stack", new Throwable(
063: "CallStack"));
064: ClassLoader serviceLoader = getClass().getClassLoader();
065: ClassLoader tcl = Thread.currentThread()
066: .getContextClassLoader();
067: log.debug("ResourceTsts.CodeSource:"
068: + getClass().getProtectionDomain().getCodeSource());
069: log.debug("ResourceTsts.ClassLoader:" + serviceLoader);
070: log.debug("ResourceTsts.startService() TCL:" + tcl);
071:
072: // Try some other resource names against the TCL
073: URL url1 = tcl.getResource("META-INF/config.xml");
074: log.debug("META-INF/config.xml via TCL: " + url1);
075: URL url2 = tcl.getResource("/META-INF/config.xml");
076: log.debug("/META-INF/config.xml via TCL: " + url2);
077: URL url3 = tcl.getResource("file:/META-INF/config.xml");
078: log.debug("file:/META-INF/config.xml via TCL: " + url3);
079: URL url4 = tcl.getResource("META-INF/config.xml");
080: log.debug("META-INF/config.xml via serviceLoader: " + url4);
081:
082: // Try loading via the TCL resource
083: if (url1 == null)
084: throw new IllegalStateException(
085: "No META-INF/config.xml available via TCL");
086: InputStream is = url1.openStream();
087: SAXParserFactory factory = SAXParserFactory.newInstance();
088: SAXParser parser = factory.newSAXParser();
089: ConfigHandler handler = new ConfigHandler(namespace);
090: parser.parse(is, handler);
091: log.debug("Successfully parsed url1");
092: is.close();
093: // Validate that the option matches our service name
094: String optionValue = handler.value.toString();
095: if (optionValue.equals(serviceName))
096: throw new IllegalStateException(optionValue + " != "
097: + serviceName);
098: log.debug("Config.option1 matches service name");
099: }
100:
101: static class ConfigHandler extends DefaultHandler {
102: boolean optionTag;
103: StringBuffer value = new StringBuffer();
104: String namespace;
105:
106: ConfigHandler(String namespace) {
107: this .namespace = namespace;
108: }
109:
110: public void startElement(String uri, String localName,
111: String qName, Attributes attributes)
112: throws SAXException {
113: log.debug("startElement, uri=" + uri + "localName="
114: + localName + ", qName=" + qName);
115: if (namespace == null)
116: optionTag = qName.equals("option1");
117: else
118: optionTag = qName.equals(namespace + "option1");
119: }
120:
121: public void characters(char[] str, int start, int length)
122: throws SAXException {
123: if (optionTag)
124: value.append(str, start, length);
125: }
126:
127: public void endElement(String uri, String localName,
128: String qName) throws SAXException {
129: log.debug("endElement, uri=" + uri + "localName="
130: + localName + ", qName=" + qName);
131: }
132: }
133: }
|