1 8 package org.codehaus.loom.components.util; 9 10 import java.io.IOException ; 11 import javax.xml.parsers.ParserConfigurationException ; 12 import javax.xml.parsers.SAXParser ; 13 import javax.xml.parsers.SAXParserFactory ; 14 import org.apache.avalon.framework.CascadingException; 15 import org.codehaus.spice.configkit.ConfigValidator; 16 import org.codehaus.spice.configkit.ConfigValidatorFactory; 17 import org.codehaus.spice.configkit.ResolverFactory; 18 import org.codehaus.spice.configkit.ValidateException; 19 import org.codehaus.spice.configkit.ValidationIssue; 20 import org.codehaus.spice.configkit.ValidationResult; 21 import org.codehaus.dna.Configuration; 22 import org.codehaus.dna.Logger; 23 import org.codehaus.dna.impl.SAXConfigurationHandler; 24 import org.xml.sax.ContentHandler ; 25 import org.xml.sax.EntityResolver ; 26 import org.xml.sax.InputSource ; 27 import org.xml.sax.SAXException ; 28 import org.xml.sax.SAXParseException ; 29 import org.xml.sax.XMLReader ; 30 31 37 public class ConfigurationBuilder 38 { 39 public static final String ASSEMBLY_SCHEMA = "-//LOOM/Assembly DTD Version 1.0//EN"; 40 41 42 private static EntityResolver c_resolver; 43 44 48 public static Configuration build( final InputSource input, 49 final String publicId, 50 final Logger logger ) 51 throws Exception 52 { 53 setupResolver(); 54 final SAXConfigurationHandler handler = new SAXConfigurationHandler(); 55 if( null == publicId ) 56 { 57 final SAXParserFactory saxParserFactory = SAXParserFactory.newInstance(); 58 saxParserFactory.setNamespaceAware( false ); 59 final SAXParser saxParser = saxParserFactory.newSAXParser(); 60 final XMLReader reader = saxParser.getXMLReader(); 61 reader.setEntityResolver( c_resolver ); 62 reader.setContentHandler( handler ); 63 reader.setErrorHandler( handler ); 64 reader.parse( input ); 65 } 66 else 67 { 68 final InputSource inputSource = c_resolver.resolveEntity( publicId, 69 null ); 70 if( null == inputSource ) 71 { 72 final String message = "Unable to locate schema with publicID=" + 73 publicId; 74 throw new IllegalStateException ( message ); 75 } 76 77 final ConfigValidator validator = 78 ConfigValidatorFactory.create( inputSource, c_resolver ); 79 final ValidationResult result = validator.validate( input, 80 (ContentHandler )handler ); 81 processValidationResults( result, logger ); 82 } 83 return handler.getConfiguration(); 84 } 85 86 94 public static void processValidationResults( final ValidationResult result, 95 final Logger logger ) 96 throws Exception 97 { 98 if( !result.isValid() ) 99 { 100 final ValidationIssue[] issues = result.getIssues(); 101 for( int i = 0; i < issues.length; i++ ) 102 { 103 final ValidationIssue issue = issues[ i ]; 104 final SAXParseException exception = issue.getException(); 105 final String message = exception.getMessage() + 106 " on line " + 107 exception.getLineNumber(); 108 if( issue.isWarning() ) 109 { 110 logger.info( message ); 111 } 112 else if( issue.isError() ) 113 { 114 logger.warn( message ); 115 } 116 else if( issue.isFatalError() ) 117 { 118 logger.error( message ); 119 } 120 } 121 final ValidateException exception = result.getException(); 122 throw new CascadingException( exception.getMessage(), exception ); 123 } 124 } 125 126 private static void setupResolver() 127 throws ParserConfigurationException , SAXException , IOException 128 { 129 if( null == c_resolver ) 130 { 131 c_resolver = 132 ResolverFactory.createResolver( 133 ConfigurationBuilder.class.getClassLoader() ); 134 } 135 } 136 } 137 | Popular Tags |