KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > org > codehaus > loom > components > util > ConfigurationBuilder


1 /*
2  * Copyright (C) The Loom Group. All rights reserved.
3  *
4  * This software is published under the terms of the Loom
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.loom.components.util;
9
10 import java.io.IOException JavaDoc;
11 import javax.xml.parsers.ParserConfigurationException JavaDoc;
12 import javax.xml.parsers.SAXParser JavaDoc;
13 import javax.xml.parsers.SAXParserFactory JavaDoc;
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 JavaDoc;
25 import org.xml.sax.EntityResolver JavaDoc;
26 import org.xml.sax.InputSource JavaDoc;
27 import org.xml.sax.SAXException JavaDoc;
28 import org.xml.sax.SAXParseException JavaDoc;
29 import org.xml.sax.XMLReader JavaDoc;
30
31 /**
32  * Utility class used to load Configuration trees from XML files.
33  *
34  * @author Peter Donald
35  * @version $Revision: 1.2 $ $Date: 2004/05/01 12:48:33 $
36  */

37 public class ConfigurationBuilder
38 {
39     public static final String JavaDoc ASSEMBLY_SCHEMA = "-//LOOM/Assembly DTD Version 1.0//EN";
40
41     /** The resolver that builder uses. */
42     private static EntityResolver JavaDoc c_resolver;
43
44     /**
45      * Build a configuration object using an XML InputSource object, and
46      * optionally validate the xml against the DTD.
47      */

48     public static Configuration build( final InputSource JavaDoc input,
49                                        final String JavaDoc publicId,
50                                        final Logger logger )
51         throws Exception JavaDoc
52     {
53         setupResolver();
54         final SAXConfigurationHandler handler = new SAXConfigurationHandler();
55         if( null == publicId )
56         {
57             final SAXParserFactory JavaDoc saxParserFactory = SAXParserFactory.newInstance();
58             saxParserFactory.setNamespaceAware( false );
59             final SAXParser JavaDoc saxParser = saxParserFactory.newSAXParser();
60             final XMLReader JavaDoc 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 JavaDoc inputSource = c_resolver.resolveEntity( publicId,
69                                                                       null );
70             if( null == inputSource )
71             {
72                 final String JavaDoc message = "Unable to locate schema with publicID=" +
73                     publicId;
74                 throw new IllegalStateException JavaDoc( message );
75             }
76
77             final ConfigValidator validator =
78                 ConfigValidatorFactory.create( inputSource, c_resolver );
79             final ValidationResult result = validator.validate( input,
80                                                                 (ContentHandler JavaDoc)handler );
81             processValidationResults( result, logger );
82         }
83         return handler.getConfiguration();
84     }
85
86     /**
87      * Process validation results. Print out any warnings or errors and if
88      * validation failed then throw an exception.
89      *
90      * @param result the validation results
91      * @param logger the logger to print messages to
92      * @throws java.lang.Exception if validation failed
93      */

94     public static void processValidationResults( final ValidationResult result,
95                                                  final Logger logger )
96         throws Exception JavaDoc
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 JavaDoc exception = issue.getException();
105                 final String JavaDoc 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 JavaDoc, SAXException JavaDoc, IOException JavaDoc
128     {
129         if( null == c_resolver )
130         {
131             c_resolver =
132             ResolverFactory.createResolver(
133                 ConfigurationBuilder.class.getClassLoader() );
134         }
135     }
136 }
137
Popular Tags