You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@struts.apache.org by cr...@apache.org on 2005/07/24 02:45:20 UTC

svn commit: r224591 - in /struts/shale/trunk/core-library/src/java/org/apache/shale/dialog/config: ConfigurationInit.java ConfigurationParser.java

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 {@link 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: dev-unsubscribe@struts.apache.org
For additional commands, e-mail: dev-help@struts.apache.org