001: /**
002: * JOnAS: Java(TM) Open Application Server
003: * Copyright (C) 1999 Bull S.A.
004: * Contact: jonas-team@objectweb.org
005: *
006: * This library is free software; you can redistribute it and/or
007: * modify it under the terms of the GNU Lesser General Public
008: * License as published by the Free Software Foundation; either
009: * version 2.1 of the License, or 1any later version.
010: *
011: * This library is distributed in the hope that it will be useful,
012: * but WITHOUT ANY WARRANTY; without even the implied warranty of
013: * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
014: * Lesser General Public License for more details.
015: *
016: * You should have received a copy of the GNU Lesser General Public
017: * License along with this library; if not, write to the Free Software
018: * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
019: * USA
020: *
021: * Initial developer: Philippe Coq
022: * --------------------------------------------------------------------------
023: * $Id: JDigester.java 7486 2005-10-07 22:30:10Z glapouch $
024: * --------------------------------------------------------------------------
025: */package org.objectweb.jonas_lib.deployment.digester;
026:
027: import java.io.IOException;
028: import java.io.Reader;
029:
030: import org.apache.commons.digester.Digester;
031: import org.objectweb.jonas_lib.deployment.api.DTDs;
032: import org.objectweb.jonas_lib.deployment.api.DeploymentDescException;
033: import org.objectweb.jonas_lib.deployment.api.Schemas;
034: import org.objectweb.jonas_lib.deployment.rules.JRuleSetBase;
035: import org.objectweb.jonas_lib.deployment.validation.JEntityResolver;
036: import org.objectweb.jonas_lib.deployment.xml.TopLevelElement;
037:
038: /**
039: * This class defines a Digester for the xml parsing of
040: * deployment descriptors standard and specific
041: *
042: * @author Philippe Coq
043: */
044:
045: public class JDigester extends Digester {
046:
047: /**
048: * Construct an instance of a JDigester which is a Digester
049: * that is configured for parsing the deployment descriptors standards
050: * and specifics used in JOnAS application.
051: * the Digester contains the rules for the xml parsing
052: * By default the created digester is set with:
053: * useContextClassLoader = true
054: * @param ruleSet an object that extends JRuleSetBase
055: * @param parsingWithValidation flag for xmlvalidation
056: * @param namespaceAware must be true when schema is used
057: * @param dtds mapping between publicId and local Urls of DTDs
058: * @param schemas local urls for the schemas
059: * @throws DeploymentDescException if the deployment descriptors are corrupted.
060: */
061:
062: public JDigester(JRuleSetBase ruleSet,
063: boolean parsingWithValidation, boolean namespaceAware,
064: DTDs dtds, Schemas schemas) throws DeploymentDescException {
065: super ();
066:
067: String packageName = ruleSet.getClass().getPackage().getName();
068: String rootPackageName = packageName.substring(0, packageName
069: .lastIndexOf('.'));
070:
071: // Set the validation process
072: setNamespaceAware(namespaceAware);
073: setValidating(parsingWithValidation);
074:
075: // Define an error handler
076: setErrorHandler(new JErrorHandler());
077:
078: // Register all Sun dtds/Schemas
079: JEntityResolver jEntityResolver = new JEntityResolverWithDigester(
080: this );
081: jEntityResolver.addDtds(dtds);
082: jEntityResolver.addSchemas(schemas);
083: setEntityResolver(jEntityResolver);
084:
085: // Set the schema that Digester must use
086: if (parsingWithValidation) {
087: try {
088: setFeature(
089: "http://apache.org/xml/features/validation/schema",
090: true);
091: } catch (Exception ee) {
092: throw new DeploymentDescException(
093: "Error setting feature", ee);
094: }
095: }
096:
097: org.apache.commons.logging.Log log = org.apache.commons.logging.LogFactory
098: .getLog(rootPackageName + ".digester");
099: setLogger(log);
100:
101: // Set the encoding feature
102: try {
103: setFeature(
104: "http://apache.org/xml/features/allow-java-encodings",
105: true);
106: } catch (Exception ee) {
107: throw new DeploymentDescException("Error setting feature",
108: ee);
109: }
110:
111: // Use Thread classloader by default
112: setUseContextClassLoader(true);
113:
114: // Add rules
115: addRuleSet(ruleSet);
116: }
117:
118: /**
119: * Parse the deployment descrptor
120: * @param reader the Reader of the XML file.
121: * @param fileName the name of the file.
122: * @param element top level xml element
123: * which is a structure containing the result of the xml parsing.
124: * @throws DeploymentDescException if the deployment descriptor
125: * is corrupted.
126: */
127: public void parse(Reader reader, String fileName,
128: TopLevelElement element) throws DeploymentDescException {
129: try {
130: clear();
131: push(element);
132: parse(reader);
133: } catch (Exception ioe) {
134: throw new DeploymentDescException(
135: "Error when parsing XML document " + fileName, ioe);
136: } finally {
137: if (reader != null) {
138: try {
139: reader.close();
140: } catch (IOException ignored) {
141: getLogger().warn("Can't close '" + fileName + "'");
142: }
143: }
144: push(null);
145: }
146: }
147:
148: }
|