Author: craigmcc Date: Sat Jul 23 17:45:15 2005 New Revision: 224591 URL: http://svn.apache.org/viewcvs?rev=224591&view=rev Log: Factor the configuration parsing into a separate utility class that does not itself depend on web tier APIs (and can thus be used in other contexts).
Added: struts/shale/trunk/core-library/src/java/org/apache/shale/dialog/config/ConfigurationParser.java Modified: struts/shale/trunk/core-library/src/java/org/apache/shale/dialog/config/ConfigurationInit.java Modified: struts/shale/trunk/core-library/src/java/org/apache/shale/dialog/config/ConfigurationInit.java URL: http://svn.apache.org/viewcvs/struts/shale/trunk/core-library/src/java/org/apache/shale/dialog/config/ConfigurationInit.java?rev=224591&r1=224590&r2=224591&view=diff ============================================================================== --- struts/shale/trunk/core-library/src/java/org/apache/shale/dialog/config/ConfigurationInit.java (original) +++ struts/shale/trunk/core-library/src/java/org/apache/shale/dialog/config/ConfigurationInit.java Sat Jul 23 17:45:15 2005 @@ -19,26 +19,13 @@ import java.net.URL; import java.util.HashMap; import java.util.Map; -import javax.faces.FactoryFinder; -import javax.faces.application.Application; -import javax.faces.application.ApplicationFactory; import javax.servlet.ServletContext; import org.apache.commons.chain.Command; import org.apache.commons.chain.Context; -import org.apache.commons.digester.Digester; -import org.apache.commons.digester.Rule; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; -import org.apache.shale.dialog.Dialog; import org.apache.shale.dialog.Globals; -import org.apache.shale.dialog.impl.ActionStateImpl; -import org.apache.shale.dialog.impl.DialogImpl; -import org.apache.shale.dialog.impl.EndStateImpl; -import org.apache.shale.dialog.impl.SubdialogStateImpl; -import org.apache.shale.dialog.impl.TransitionImpl; -import org.apache.shale.dialog.impl.ViewStateImpl; -import org.xml.sax.Attributes; -import org.xml.sax.InputSource; + /** * <p>Command executed at web application startup to configure the @@ -57,14 +44,6 @@ /** - * <p>Registration information for the DTD we will use to validate.</p> - */ - private static final String REGISTRATIONS[] = - { "-//Apache Software Foundation//DTD Shale Dialog Configuration 1.0//EN", - "/org/apache/shale/dialog/dialog.dtd" }; - - - /** * <p>Log instance for this class.</p> */ private final Log log = LogFactory.getLog(getClass()); @@ -81,6 +60,11 @@ Map map = new HashMap(); scontext.setAttribute(Globals.DIALOGS, map); + // Initialize the parser utility we will use to parse resources + ConfigurationParser parser = new ConfigurationParser(); + parser.setDialogs(map); + parser.setValidating(true); + // Acquire the list of context relative resource paths // for resources we will be loading String resources = scontext.getInitParameter(Globals.CONFIGURATION_PARAM); @@ -89,7 +73,6 @@ } // Parse any resources specified by the developer - Digester digester = digester(); String path = null; while (true) { int comma = resources.indexOf(","); @@ -107,13 +90,15 @@ if (url == null) { throw new IllegalArgumentException(path); } - parse(digester, url, map); + parser.setResource(url); + parser.parse(); } // Parse the default resource (if it exists) URL url = scontext.getResource(DEFAULT); if (url != null) { - parse(digester, url, map); + parser.setResource(url); + parser.parse(); } // Allow other configuration activities to proceed @@ -121,138 +106,6 @@ log.debug("Total dialogs configured: " + map.size()); } return false; - - } - - - /** - * <p>Return a fully configured <code>Digester</code> instance.</p> - */ - private Digester digester() { - - Digester digester = new Digester(); - - // Configure global characteristics - digester.setNamespaceAware(false); - digester.setUseContextClassLoader(false); - digester.setValidating(true); - - // Register local copy of our DTDs - for (int i = 0; i < REGISTRATIONS.length; i += 2) { - URL url = this.getClass().getResource(REGISTRATIONS[i+1]); - digester.register(REGISTRATIONS[i], url.toString()); - } - - // Configure processing rules - - // dialogs/dialog - digester.addObjectCreate("dialogs/dialog", "className", DialogImpl.class); - digester.addSetProperties("dialogs/dialog"); - digester.addRule("dialogs/dialog", new AddDialogRule()); - - // dialogs/dialog/action - digester.addObjectCreate("dialogs/dialog/action", "className", - ActionStateImpl.class); - digester.addSetProperties("dialogs/dialog/action"); - digester.addSetNext("dialogs/dialog/action", - "addState", "org.apache.shale.dialog.State"); - - // dialogs/dialog/action/transition - digester.addObjectCreate("dialogs/dialog/action/transition", "className", - TransitionImpl.class); - digester.addSetProperties("dialogs/dialog/action/transition"); - digester.addSetNext("dialogs/dialog/action/transition", - "addTransition", "org.apache.shale.dialog.Transition"); - - // dialogs/dialog/end - digester.addObjectCreate("dialogs/dialog/end", "className", - EndStateImpl.class); - digester.addSetProperties("dialogs/dialog/end"); - digester.addSetNext("dialogs/dialog/end", - "addState", "org.apache.shale.dialog.State"); - - // dialogs/dialog/end/transition - digester.addObjectCreate("dialogs/dialog/end/transition", "className", - TransitionImpl.class); - digester.addSetProperties("dialogs/dialog/end/transition"); - digester.addSetNext("dialogs/dialog/end/transition", - "addTransition", "org.apache.shale.dialog.Transition"); - - // dialogs/dialog/subdialog - digester.addObjectCreate("dialogs/dialog/subdialog", "className", - SubdialogStateImpl.class); - digester.addSetProperties("dialogs/dialog/subdialog"); - digester.addSetNext("dialogs/dialog/subdialog", - "addState", "org.apache.shale.dialog.State"); - - // dialogs/dialog/subdialog/transition - digester.addObjectCreate("dialogs/dialog/subdialog/transition", "className", - TransitionImpl.class); - digester.addSetProperties("dialogs/dialog/subdialog/transition"); - digester.addSetNext("dialogs/dialog/subdialog/transition", - "addTransition", "org.apache.shale.dialog.Transition"); - - // dialogs/dialog/transition - digester.addObjectCreate("dialogs/dialog/transition", "className", - TransitionImpl.class); - digester.addSetProperties("dialogs/dialog/transition"); - digester.addSetNext("dialogs/dialog/transition", - "addTransition", "org.apache.shale.dialog.Transition"); - - // dialogs/dialog/view - digester.addObjectCreate("dialogs/dialog/view", "className", - ViewStateImpl.class); - digester.addSetProperties("dialogs/dialog/view"); - digester.addSetNext("dialogs/dialog/view", - "addState", "org.apache.shale.dialog.State"); - - // dialogs/dialog/view/transition - digester.addObjectCreate("dialogs/dialog/view/transition", "className", - TransitionImpl.class); - digester.addSetProperties("dialogs/dialog/view/transition"); - digester.addSetNext("dialogs/dialog/view/transition", - "addTransition", "org.apache.shale.dialog.Transition"); - - return digester; - - } - - - /** - * <p>Parse the specified configuration resource with the specified - * <code>Digester</code> instance.</p> - * - * @param digester <code>Digester</code> instance to use - * @param url URL of configuration resource - * @param map Map of [EMAIL PROTECTED] Dialog} information - */ - private void parse(Digester digester, URL url, Map map) throws Exception { - - if (log.isDebugEnabled()) { - log.debug("parse(url=" + url.toExternalForm() + ")"); - } - - digester.clear(); - digester.push(map); - InputSource source = new InputSource(url.toExternalForm()); - source.setByteStream(url.openStream()); - digester.parse(source); - - } - - - // -------------------------------------------- Private Rule Implementations - - - static class AddDialogRule extends Rule { - - public void end() throws Exception { - - Dialog dialog = (Dialog) getDigester().peek(); - Map map = (Map) getDigester().peek(1); - map.put(dialog.getName(), dialog); - - } } Added: struts/shale/trunk/core-library/src/java/org/apache/shale/dialog/config/ConfigurationParser.java URL: http://svn.apache.org/viewcvs/struts/shale/trunk/core-library/src/java/org/apache/shale/dialog/config/ConfigurationParser.java?rev=224591&view=auto ============================================================================== --- struts/shale/trunk/core-library/src/java/org/apache/shale/dialog/config/ConfigurationParser.java (added) +++ struts/shale/trunk/core-library/src/java/org/apache/shale/dialog/config/ConfigurationParser.java Sat Jul 23 17:45:15 2005 @@ -0,0 +1,277 @@ +/* + * Copyright 2004-2005 The Apache Software Foundation. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.apache.shale.dialog.config; + +import java.io.IOException; +import java.net.URL; +import java.util.Map; +import org.apache.commons.digester.Digester; +import org.apache.commons.digester.Rule; +import org.apache.shale.dialog.Dialog; +import org.apache.shale.dialog.impl.ActionStateImpl; +import org.apache.shale.dialog.impl.DialogImpl; +import org.apache.shale.dialog.impl.EndStateImpl; +import org.apache.shale.dialog.impl.SubdialogStateImpl; +import org.apache.shale.dialog.impl.TransitionImpl; +import org.apache.shale.dialog.impl.ViewStateImpl; +import org.xml.sax.InputSource; +import org.xml.sax.SAXException; + +/** + * <p>Configuration utility for parsing configuration resources for + * defining dialogs. This class has no dependencies on web tier APIs, + * only on the parsing technology (Commons Digester) being used.</p> + * + * <p>To use this utility, instantiate a new instance and set the + * <code>dialogs</code>, <code>resource</code>, and <code>validating</code> + * properties. Then, call the <code>parse()</code> method. You can parse + * more than one resource by resetting the <code>resource</code> + * property and calling <code>parse()</code> again.</p> + */ + +public class ConfigurationParser { + + + // ------------------------------------------------------ Instance Variables + + + /** + * <p>Registration information for the DTD we will use to validate.</p> + */ + private static final String REGISTRATIONS[] = + { "-//Apache Software Foundation//DTD Shale Dialog Configuration 1.0//EN", + "/org/apache/shale/dialog/dialog.dtd" }; + + + // -------------------------------------------------------------- Properties + + + /** + * <p><code>Map</code> of <code>Dialog</code> instances resulting + * from parsing, keyed by dialog name.</p> + */ + private Map dialogs = null; + + + /** + * <p>Return the <code>Map</code> of <code>Dialog</code> instances + * into which parsed information will be stored, keyed by dialog + * name.</p> + */ + public Map getDialogs() { + return this.dialogs; + } + + + /** + * <p>Set the <code>Map</code> of <code>Dialog</code> instances + * into which parsed information will be stored, keyed by dialog + * name.</p> + * + * @param dialogs The new map + */ + public void setDialogs(Map dialogs) { + this.dialogs = dialogs; + } + + + /** + * <p>The URL of the configuration resource to be parsed.</p> + */ + private URL resource = null; + + + /** + * <p>Return the URL of the configuration resource to be parsed.</p> + */ + public URL getResource() { + return this.resource; + } + + + /** + * <p>Set the URL of the configuration resource to be parsed.</p. + * + * @param resource The new resource URL + */ + public void setResource(URL resource) { + this.resource = resource; + } + + + /** + * <p>Flag indicating whether we should do a validating parse or not.</p> + */ + private boolean validating = true; + + + /** + * <p>Return a flag indicating whether we will be doing a validating parse + * or not. Default value is <code>true</code>.</p> + */ + public boolean isValidating() { + return this.validating; + } + + + /** + * <p>Set a flag indicating whether we will be doing a validating parse + * or not.</p> + * + * @param validating New flag value + */ + public void setValidating(boolean validating) { + this.validating = validating; + } + + + // ---------------------------------------------------------- Public Methods + + + /** + * <p>Parse the configuration resource identified by the <code>resource</code> + * property, storing resulting information in the <code>Map</code> specified + * by the <code>dialogs</code> property.</p> + * + * @exception IOException if an input/output error occurs + * @exception SAXException if an XML parsing error occurs + */ + public void parse() throws IOException, SAXException { + + Digester digester = digester(); + digester.clear(); + digester.push(getDialogs()); + InputSource source = new InputSource(getResource().toExternalForm()); + source.setByteStream(getResource().openStream()); + digester.parse(source); + + } + + + // --------------------------------------------------------- Private Methods + + + /** + * <p>Return a fully configured <code>Digester</code> instance.</p> + */ + private Digester digester() { + + Digester digester = new Digester(); + + // Configure global characteristics + digester.setNamespaceAware(false); + digester.setUseContextClassLoader(false); + digester.setValidating(isValidating()); + + // Register local copy of our DTDs + for (int i = 0; i < REGISTRATIONS.length; i += 2) { + URL url = this.getClass().getResource(REGISTRATIONS[i+1]); + digester.register(REGISTRATIONS[i], url.toString()); + } + + // Configure processing rules + + // dialogs/dialog + digester.addObjectCreate("dialogs/dialog", "className", DialogImpl.class); + digester.addSetProperties("dialogs/dialog"); + digester.addRule("dialogs/dialog", new AddDialogRule()); + + // dialogs/dialog/action + digester.addObjectCreate("dialogs/dialog/action", "className", + ActionStateImpl.class); + digester.addSetProperties("dialogs/dialog/action"); + digester.addSetNext("dialogs/dialog/action", + "addState", "org.apache.shale.dialog.State"); + + // dialogs/dialog/action/transition + digester.addObjectCreate("dialogs/dialog/action/transition", "className", + TransitionImpl.class); + digester.addSetProperties("dialogs/dialog/action/transition"); + digester.addSetNext("dialogs/dialog/action/transition", + "addTransition", "org.apache.shale.dialog.Transition"); + + // dialogs/dialog/end + digester.addObjectCreate("dialogs/dialog/end", "className", + EndStateImpl.class); + digester.addSetProperties("dialogs/dialog/end"); + digester.addSetNext("dialogs/dialog/end", + "addState", "org.apache.shale.dialog.State"); + + // dialogs/dialog/end/transition + digester.addObjectCreate("dialogs/dialog/end/transition", "className", + TransitionImpl.class); + digester.addSetProperties("dialogs/dialog/end/transition"); + digester.addSetNext("dialogs/dialog/end/transition", + "addTransition", "org.apache.shale.dialog.Transition"); + + // dialogs/dialog/subdialog + digester.addObjectCreate("dialogs/dialog/subdialog", "className", + SubdialogStateImpl.class); + digester.addSetProperties("dialogs/dialog/subdialog"); + digester.addSetNext("dialogs/dialog/subdialog", + "addState", "org.apache.shale.dialog.State"); + + // dialogs/dialog/subdialog/transition + digester.addObjectCreate("dialogs/dialog/subdialog/transition", "className", + TransitionImpl.class); + digester.addSetProperties("dialogs/dialog/subdialog/transition"); + digester.addSetNext("dialogs/dialog/subdialog/transition", + "addTransition", "org.apache.shale.dialog.Transition"); + + // dialogs/dialog/transition + digester.addObjectCreate("dialogs/dialog/transition", "className", + TransitionImpl.class); + digester.addSetProperties("dialogs/dialog/transition"); + digester.addSetNext("dialogs/dialog/transition", + "addTransition", "org.apache.shale.dialog.Transition"); + + // dialogs/dialog/view + digester.addObjectCreate("dialogs/dialog/view", "className", + ViewStateImpl.class); + digester.addSetProperties("dialogs/dialog/view"); + digester.addSetNext("dialogs/dialog/view", + "addState", "org.apache.shale.dialog.State"); + + // dialogs/dialog/view/transition + digester.addObjectCreate("dialogs/dialog/view/transition", "className", + TransitionImpl.class); + digester.addSetProperties("dialogs/dialog/view/transition"); + digester.addSetNext("dialogs/dialog/view/transition", + "addTransition", "org.apache.shale.dialog.Transition"); + + return digester; + + } + + + // -------------------------------------------- Private Rule Implementations + + + static class AddDialogRule extends Rule { + + public void end() throws Exception { + + Dialog dialog = (Dialog) getDigester().peek(); + Map map = (Map) getDigester().peek(1); + map.put(dialog.getName(), dialog); + + } + + } + + +} --------------------------------------------------------------------- To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED]