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