/* * JBoss, Home of Professional Open Source. * Copyright 2008, Red Hat Middleware LLC, and individual contributors * as indicated by the @author tags. See the copyright.txt file in the * distribution for a full listing of individual contributors. * * This is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as * published by the Free Software Foundation; either version 2.1 of * the License, or (at your option) any later version. * * This software 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 * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this software; if not, write to the Free * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA * 02110-1301 USA, or see the FSF site: http://www.fsf.org. */ package org.jboss.test.classloader.resource; import java.io.BufferedReader; import java.io.InputStream; import java.io.InputStreamReader; import java.net.URL; import java.util.Enumeration; import org.jboss.system.ServiceMBeanSupport; /** A simple service to test resource loading. @author Adrian.Brock@HappeningTimes.com @author Scott.Stark@jboss.org @version $Revision: 81036 $ */ public class ResourceTest extends ServiceMBeanSupport implements ResourceTestMBean, Runnable { private Exception threadEx; private boolean running; private String dtdName; public String getDtdName() { return dtdName; } public void setDtdName(String dtdName) { this.dtdName = dtdName; } protected void startService() throws Exception { // Run a thread in the background looking for rsrc using a different loader Thread t = new Thread(this, "RsrcLoader"); synchronized( ResourceTest.class ) { t.start(); ResourceTest.class.wait(); } loadLocalResource(); loadGlobalResource(); loadServerLibResource(); findResources(); running = false; t.join(); if( threadEx != null ) throw threadEx; } protected void stopService() throws Exception { running = false; } /** * Checks we can find a local resource in our deployment unit */ public void loadLocalResource() throws Exception { log.info("Looking for resource: META-INF/jboss-service.xml"); ClassLoader cl = getClass().getClassLoader(); URL serviceXML = cl.getResource("META-INF/jboss-service.xml"); if (serviceXML == null) throw new Exception("Cannot find META-INF/jboss-service.xml"); log.info("Found META-INF/jboss-service.xml: "+serviceXML); InputStream is = serviceXML.openStream(); BufferedReader reader = new BufferedReader(new InputStreamReader(is)); String line = reader.readLine(); boolean foundService = false; while (line != null && foundService == false ) { if (line.indexOf("org.jboss.test.classloader.resource.ResourceTest") != -1) foundService = true; line = reader.readLine(); } is.close(); if( foundService == false ) throw new Exception("Wrong META-INF/jboss-service.xml"); // Look for the dtds/sample.dtd log.info("Looking for resource: "+dtdName); URL dtd = cl.getResource(dtdName); if( dtd == null ) throw new Exception("Failed to find "+dtdName); log.info("Found "+dtdName+": "+dtd); } /** * Checks we can find a global resource located in the conf dir */ public void loadGlobalResource() throws Exception { ClassLoader loader = getClass().getClassLoader(); log.info("loadGlobalResource, loader="+loader); URL resURL = loader.getResource("standardjboss.xml"); if (resURL == null) throw new Exception("Cannot find standardjboss.xml"); resURL = loader.getResource("jboss-log4j.xml"); if (resURL == null) throw new Exception("Cannot find jboss-log4j.xml"); resURL = loader.getResource("jndi.properties"); if (resURL == null) throw new Exception("Cannot find jndi.properties"); } public void loadServerLibResource() throws Exception { ClassLoader loader = getClass().getClassLoader(); log.info("loadServerLibResource, loader="+loader); URL resURL = loader.getResource("org/apache/log4j/xml/log4j.dtd"); if (resURL == null) throw new Exception("Cannot find org/apache/log4j/xml/log4j.dtd"); log.info("Found log4j.dtd: "+resURL); } /** Check that the URLClassLoader.getResources locates the resource * across the repository class loader. */ public void findResources() throws Exception { ClassLoader loader = getClass().getClassLoader(); log.info("findResources, loader="+loader); Enumeration resURLs = loader.getResources("META-INF/MANIFEST.MF"); if ( resURLs == null || resURLs.hasMoreElements() == false ) throw new Exception("Cannot find META-INF/MANIFEST.MF"); int count = 0; log.debug("Begin META-INF/MANIFESTs"); while( resURLs.hasMoreElements() ) { URL url = (URL) resURLs.nextElement(); count ++; log.debug(url); } log.debug("End META-INF/MANIFESTs, count="+count); if ( count <= 0 ) throw new Exception("Did not find multiple META-INF/MANIFEST.MFs"); } /** Load resources in the background to test MT access to the repository * during resource lookup */ public void run() { ClassLoader loader = getClass().getClassLoader(); do { synchronized( ResourceTest.class ) { ResourceTest.class.notify(); log.info("Notified start thread"); } // Load some resouces located from the JavaMail mail.jar try { javax.mail.Session.getInstance(System.getProperties()); Class sessionClass = loader.loadClass("javax.mail.Session"); log.info("Loading JavaMail resources using: "+sessionClass.getClassLoader()); URL resURL = sessionClass.getResource("/META-INF/javamail.default.address.map"); if( resURL == null ) throw new Exception("Failed to find javamail.default.address.map"); resURL = sessionClass.getResource("/META-INF/javamail.default.providers"); if( resURL == null ) throw new Exception("Failed to find javamail.default.providers"); resURL = sessionClass.getResource("/META-INF/javamail.charset.map"); if( resURL == null ) throw new Exception("Failed to find javamail.charset.map"); resURL = sessionClass.getResource("/META-INF/mailcap"); if( resURL == null ) throw new Exception("Failed to find mailcap"); log.info("Found all JavaMail resources"); // Look for a resource that does not exist resURL = sessionClass.getResource("nowhere-to-be-found.xml"); } catch(Exception e) { threadEx = e; log.error("Failed to load resource", e); break; } } while( running ); } }