Clover coverage report - ConfigKit - 1.2
Coverage timestamp: Wed Dec 3 2003 14:29:16 EST
file stats: LOC: 128   Methods: 3
NCLOC: 67   Classes: 1
30 day Evaluation Version distributed via the Maven Jar Repository. Clover is not free. You have 30 days to evaluate it. Please visit http://www.thecortex.net/clover to obtain a licensed version of Clover
 
 Source file Conditionals Statements Methods TOTAL
ResolverFactory.java 100% 100% 100% 100%
coverage
 1   
 /*
 2   
  * Copyright (C) The Spice Group. All rights reserved.
 3   
  *
 4   
  * This software is published under the terms of the Spice
 5   
  * Software License version 1.1, a copy of which has been included
 6   
  * with this distribution in the LICENSE.txt file.
 7   
  */
 8   
 package org.codehaus.spice.configkit;
 9   
 
 10   
 import java.io.IOException;
 11   
 import java.io.InputStream;
 12   
 import java.net.URL;
 13   
 import java.util.ArrayList;
 14   
 import java.util.Enumeration;
 15   
 import java.util.List;
 16   
 import javax.xml.parsers.ParserConfigurationException;
 17   
 import javax.xml.parsers.SAXParserFactory;
 18   
 import org.xml.sax.EntityResolver;
 19   
 import org.xml.sax.InputSource;
 20   
 import org.xml.sax.SAXException;
 21   
 import org.xml.sax.XMLReader;
 22   
 
 23   
 /**
 24   
  * This is a utility class for creating an EntityResolver that can resolve all
 25   
  * entitys contained within ClassLoader. The entitys are discovered by looking
 26   
  * in a catalog file <code>META-INF/spice/catalog.xml</code>. The format of the
 27   
  * catalog file is;
 28   
  *
 29   
  * <pre>
 30   
  *   &lt;catalog version="1.0"&gt;
 31   
  *     &lt;entity publicId="-//PHOENIX/Assembly DTD Version 1.0//EN"
 32   
  *             resource="org/apache/avalon/phoenix/tools/assembly.dtd"/&gt;
 33   
  *     &lt;entity systemId="http://jakarta.apache.org/phoenix/assembly_1_0.dtd"
 34   
  *             resource="org/apache/avalon/phoenix/tools/assembly.dtd"/&gt;
 35   
  *     &lt;entity publicId=""-//PHOENIX/Mx Info DTD Version 1.0//EN""
 36   
  *             systemId="http://jakarta.apache.org/phoenix/mxinfo_1_0.dtd"
 37   
  *             resource="org/apache/avalon/phoenix/tools/mxinfo.dtd"/&gt;
 38   
  *   &lt;/catalog&gt;
 39   
  * </pre>
 40   
  *
 41   
  * <p>Note that at least one of <code>publicId</code> or <code>systemId</code>
 42   
  * must be specified and <code>resource</code> must always be specified.
 43   
  *
 44   
  * @author Peter Donald
 45   
  * @version $Revision: 1.1 $ $Date: 2003/12/03 03:19:28 $
 46   
  */
 47   
 public final class ResolverFactory
 48   
 {
 49   
     /** Constant for location where catalog is loaded. */
 50   
     private static final String CATALOG_RESOURCE = "META-INF/spice/catalog.xml";
 51   
 
 52   
     /**
 53   
      * @param classLoader the ClassLoader to scan for catalog files
 54   
      * @return an Entity Resolver that will resolver all the entitys defined in
 55   
      *         catalog and loadable from ClassLoader
 56   
      * @throws SAXException if unable to parse a Catalog file
 57   
      * @throws IOException if unable to load a Catalog file
 58   
      */
 59  13
     public static final EntityResolver createResolver(
 60   
         final ClassLoader classLoader )
 61   
         throws ParserConfigurationException, SAXException, IOException
 62   
     {
 63  13
         if( null == classLoader )
 64   
         {
 65  2
             throw new NullPointerException( "classLoader" );
 66   
         }
 67  11
         final List entitys = new ArrayList();
 68  11
         final Enumeration resources = classLoader.getResources(
 69   
             CATALOG_RESOURCE );
 70  11
         while( resources.hasMoreElements() )
 71   
         {
 72  11
             final URL url = (URL)resources.nextElement();
 73  11
             parseCatalog( url, entitys );
 74   
         }
 75  10
         final EntityInfo[] infos = (EntityInfo[])entitys.
 76   
             toArray( new EntityInfo[ entitys.size() ] );
 77  10
         return new ConfigKitEntityResolver( infos, classLoader );
 78   
     }
 79   
 
 80   
     /**
 81   
      * Helper method to parse a catalog specified by url and add all the
 82   
      * discovered entitys to the entity list.
 83   
      *
 84   
      * @param url the url of catalog
 85   
      * @param entitys the list of entitys
 86   
      * @throws SAXException if unable to parse catalog
 87   
      * @throws IOException if unable to read catalog from url
 88   
      */
 89  11
     private static void parseCatalog( final URL url, final List entitys )
 90   
         throws ParserConfigurationException, SAXException, IOException
 91   
     {
 92  11
         final InputStream inputStream = url.openStream();
 93  11
         try
 94   
         {
 95  11
             final XMLReader xmlReader = createXMLReader();
 96  10
             final CatalogHandler handler = new CatalogHandler( entitys );
 97  10
             xmlReader.setContentHandler( handler );
 98  10
             xmlReader.setErrorHandler( handler );
 99  10
             xmlReader.parse( new InputSource( inputStream ) );
 100   
         }
 101   
         finally
 102   
         {
 103  11
             try
 104   
             {
 105  11
                 inputStream.close();
 106   
             }
 107   
             catch( final IOException ioe )
 108   
             {
 109   
                 //ignore as probably means it already closed
 110   
             }
 111   
         }
 112   
     }
 113   
 
 114   
     /**
 115   
      * Create an XMLReader.
 116   
      *
 117   
      * @return the created XMLReader
 118   
      * @throws SAXException if unable to create reader
 119   
      */
 120  11
     private static XMLReader createXMLReader()
 121   
         throws SAXException, ParserConfigurationException
 122   
     {
 123  11
         final SAXParserFactory saxParserFactory = SAXParserFactory.newInstance();
 124  10
         saxParserFactory.setNamespaceAware( false );
 125  10
         return saxParserFactory.newSAXParser().getXMLReader();
 126   
     }
 127   
 }
 128