mpo 2003/12/22 08:43:11
Modified: src/blocks/woody/java/org/apache/cocoon/woody/transformation
WidgetReplacingPipe.java
src/blocks/woody/java/org/apache/cocoon/woody/generation
WoodyGenerator.java
Added: src/blocks/woody/java/org/apache/cocoon/woody/transformation
WoodyPipeLineConfig.java
Log:
Refactoring the common configuration settings for Generator and Transformer.
Making sure the same flow-integration support is now available on the
Generator.
And hoping that future additions on either side will be beneficial to the
other component as well.
Revision Changes Path
1.17 +6 -35
cocoon-2.1/src/blocks/woody/java/org/apache/cocoon/woody/transformation/WidgetReplacingPipe.java
Index: WidgetReplacingPipe.java
===================================================================
RCS file:
/home/cvs/cocoon-2.1/src/blocks/woody/java/org/apache/cocoon/woody/transformation/WidgetReplacingPipe.java,v
retrieving revision 1.16
retrieving revision 1.17
diff -u -r1.16 -r1.17
--- WidgetReplacingPipe.java 8 Dec 2003 21:32:26 -0000 1.16
+++ WidgetReplacingPipe.java 22 Dec 2003 16:43:11 -0000 1.17
@@ -55,13 +55,12 @@
import java.util.Locale;
import org.apache.avalon.excalibur.pool.Recyclable;
+import org.apache.cocoon.i18n.I18nUtils;
import org.apache.cocoon.woody.Constants;
import org.apache.cocoon.woody.formmodel.Repeater;
import org.apache.cocoon.woody.formmodel.Widget;
-import org.apache.cocoon.woody.formmodel.Form;
import org.apache.cocoon.xml.AbstractXMLPipe;
import org.apache.cocoon.xml.SaxBuffer;
-import org.apache.cocoon.i18n.I18nUtils;
import org.apache.commons.jxpath.JXPathException;
import org.xml.sax.Attributes;
import org.xml.sax.SAXException;
@@ -93,11 +92,6 @@
private static final String FORM_TEMPLATE_EL = "form-template";
private static final String STYLING_EL = "styling";
- /**
- * Default key under which the woody form is stored in the JXPath
context.
- */
- public static final String WOODY_FORM = "woody-form";
-
protected Widget contextWidget;
/**
@@ -133,7 +127,7 @@
protected boolean repeaterWidget;
protected WoodyTemplateTransformer.InsertStylingContentHandler
stylingHandler = new WoodyTemplateTransformer.InsertStylingContentHandler();
- protected WoodyTemplateTransformer pipeContext;
+ protected WoodyPipeLineConfig pipeContext;
/**
* Have we encountered a <wi:style> element in a widget ?
@@ -146,7 +140,7 @@
protected String namespacePrefix;
- public void init(Widget newContextWidget, WoodyTemplateTransformer
newPipeContext) {
+ public void init(Widget newContextWidget, WoodyPipeLineConfig
newPipeContext) {
contextWidget = newContextWidget;
inWidgetElement = false;
elementNestingCounter = 0;
@@ -214,34 +208,11 @@
AttributesImpl attrsCopy = new
AttributesImpl(attributes);
attrsCopy.removeAttribute(attributes.getIndex(LOCATION));
attributes = attrsCopy;
-
- Object form =
pipeContext.getJXPathContext().getValue(formJXPath);
- if (form == null) {
- throw new SAXException("No form found at location
\"" + formJXPath + "\".");
- }
- if (!(form instanceof Form)) {
- throw new SAXException("Object returned by
expression \"" + formJXPath + "\" is not a Woody Form.");
- }
- contextWidget = (Form)form;
- } else if (pipeContext.getAttributeName() != null) { // then
see if an attribute-name was specified
- contextWidget =
(Form)pipeContext.getRequest().getAttribute(pipeContext.getAttributeName());
- if (contextWidget == null) {
- throw new SAXException("No form found in request
attribute with name \"" + pipeContext.getAttributeName() + "\"");
- }
- } else { // and then see if we got a form from the flow
- formJXPath = "/" + WoodyTemplateTransformer.WOODY_FORM;
- Object form = null;
- try {
- form =
pipeContext.getJXPathContext().getValue(formJXPath);
- } catch (JXPathException e) { /* do nothing */ }
- if (form != null) {
- contextWidget = (Form)form;
- } else {
- throw new SAXException("No Woody form found.");
- }
}
+ contextWidget = pipeContext.findForm(formJXPath);
// ====> Determine the Locale
+ //TODO pull this locale stuff also up in the Config object?
String localeAttr = attributes.getValue("locale");
if (localeAttr != null) { // first use value of locale
attribute if any
1.1
cocoon-2.1/src/blocks/woody/java/org/apache/cocoon/woody/transformation/WoodyPipeLineConfig.java
Index: WoodyPipeLineConfig.java
===================================================================
/*
* File WoodyPipeLineConfig.java
* created by mpo
* on Dec 19, 2003 | 12:38:34 PM
*
* (c) 2003 - Outerthought BVBA
*/
package org.apache.cocoon.woody.transformation;
import java.util.Locale;
import java.util.Map;
import org.apache.avalon.framework.parameters.Parameters;
import org.apache.cocoon.components.flow.FlowHelper;
import org.apache.cocoon.components.flow.WebContinuation;
import org.apache.cocoon.environment.ObjectModelHelper;
import org.apache.cocoon.environment.Request;
import org.apache.cocoon.environment.Session;
import org.apache.cocoon.i18n.I18nUtils;
import org.apache.cocoon.woody.formmodel.Form;
import org.apache.commons.jxpath.JXPathContext;
import org.apache.commons.jxpath.JXPathException;
import org.apache.commons.jxpath.Variables;
import org.xml.sax.SAXException;
/**
* WoodyPipeLineConfig
*/
public class WoodyPipeLineConfig {
/**
* Default key under which the woody form is stored in the JXPath context.
*/
public static final String WOODY_FORM = "woody-form";
/**
* Name of the request attribute under which the Woody form is stored
(optional). */
private final String attributeName;
/**
* Pointer to the current request object. */
private final Request request;
/**
* Initialized jxpathcontext to evaluate passed expressions with. */
private final JXPathContext jxpathContext;
/**
* Containts locale specified as a parameter to the transformer, if any.
*/
private final Locale localeParameter;
/**
* The locale currently used by the transformer. */
private Locale locale;
private WoodyPipeLineConfig(String attName, Request req, JXPathContext
jxpc, Locale localeParam) {
this.attributeName = attName;
this.request = req;
this.jxpathContext =jxpc;
this.localeParameter = localeParam;
}
public static WoodyPipeLineConfig createConfig(Map objectModel,
Parameters parameters) {
// create and set the jxpathContext...
Object flowContext = FlowHelper.getContextObject(objectModel);
WebContinuation wk = FlowHelper.getWebContinuation(objectModel);
JXPathContext jxpc = JXPathContext.newContext(flowContext);
Variables vars = jxpc.getVariables();
vars.declareVariable("continuation", wk);
Request request = ObjectModelHelper.getRequest(objectModel);
vars.declareVariable("request", request);
Session session = request.getSession(false);
vars.declareVariable("session", session);
vars.declareVariable("parameters", parameters);
String attributeName = parameters.getParameter("attribute-name",
null);
Locale localeParameter = null;
String localeStr = parameters.getParameter("locale", null);
if (localeStr != null) {
localeParameter = I18nUtils.parseLocale(localeStr);
}
return new WoodyPipeLineConfig(attributeName, request, jxpc,
localeParameter);
}
/**
* Overloads [EMAIL PROTECTED] #findForm(String)} by setting the
jxpath-expression to null
*/
public Form findForm() throws SAXException {
return this.findForm(null);
}
/**
* Finds the form from the current request-context based on the settings
of
* this configuration object. The fall-back search-procedure is as
follows:
* <ol><li>Use the provided jxpathEpression (if not null)</li>
* <li>Use the setting of the 'attribute-name' parameter on the
request</li>
* <li>Obtainn the form from it's default location in the flow
context</li>
* </ol>
*
* @param jxpathExpression that should be pointing to the form
* @return the found form if found
* @throws SAXException in any of the folowing cases:
* <ul><li>The provided jxpathExpression (if not null) is not pointing to
* a [EMAIL PROTECTED] Form} instance.</li>
* <li>The request is not holding a [EMAIL PROTECTED] Form} instance
under the key
* specified by 'attribute-name' (if specified)</li>
* <li>Both jxpathExpresiion and 'attribute-name' were not specified AND
* also the default location was not holding a valid [EMAIL PROTECTED]
Form} instance.</li>
* </ol>
*/
public Form findForm(String jxpathExpression) throws SAXException {
if (jxpathExpression != null) {
Object form = this.jxpathContext.getValue(jxpathExpression);
if (form == null) {
throw new SAXException("No form found at location \"" +
jxpathExpression + "\".");
}
if (!(form instanceof Form)) {
throw new SAXException("Object returned by expression \"" +
jxpathExpression + "\" is not a Woody Form.");
}
return (Form)form;
} else if (this.attributeName != null) { // then see if an
attribute-name was specified
Object form = this.request.getAttribute(this.attributeName);
if (form == null) {
throw new SAXException("No form found in request attribute
with name \"" + this.attributeName + "\"");
}
if (!(form instanceof Form)) {
throw new SAXException("Object found in request (attribute =
'" + this.attributeName + "') is not a Woody Form.");
}
return (Form)form;
} else { // and then see if we got a form from the flow
jxpathExpression = "/" + WoodyPipeLineConfig.WOODY_FORM;
Object form = null;
try {
form = this.jxpathContext.getValue(jxpathExpression);
} catch (JXPathException e) { /* do nothing */ }
if (form != null) {
return (Form)form;
} else {
throw new SAXException("No Woody form found.");
}
}
}
public JXPathContext getJXPathContext() {
return jxpathContext;
}
public String getAttributeName() {
return attributeName;
}
public Request getRequest() {
return request;
}
public JXPathContext getJxpathContext() {
return jxpathContext;
}
// public void setJxpathContext(JXPathContext jxpathContext) {
// this.jxpathContext = jxpathContext;
// }
public Locale getLocale() {
return locale;
}
public void setLocale(Locale locale) {
this.locale = locale;
}
public Locale getLocaleParameter() {
return localeParameter;
}
}
1.4 +17 -25
cocoon-2.1/src/blocks/woody/java/org/apache/cocoon/woody/generation/WoodyGenerator.java
Index: WoodyGenerator.java
===================================================================
RCS file:
/home/cvs/cocoon-2.1/src/blocks/woody/java/org/apache/cocoon/woody/generation/WoodyGenerator.java,v
retrieving revision 1.3
retrieving revision 1.4
diff -u -r1.3 -r1.4
--- WoodyGenerator.java 27 Oct 2003 19:58:19 -0000 1.3
+++ WoodyGenerator.java 22 Dec 2003 16:43:11 -0000 1.4
@@ -50,21 +50,19 @@
*/
package org.apache.cocoon.woody.generation;
-import org.apache.cocoon.generation.AbstractGenerator;
+import java.io.IOException;
+import java.util.Locale;
+import java.util.Map;
+
+import org.apache.avalon.framework.parameters.Parameters;
import org.apache.cocoon.ProcessingException;
-import org.apache.cocoon.woody.formmodel.Form;
-import org.apache.cocoon.woody.Constants;
import org.apache.cocoon.environment.SourceResolver;
-import org.apache.cocoon.environment.Request;
-import org.apache.cocoon.environment.ObjectModelHelper;
-import org.apache.avalon.framework.parameters.Parameters;
-import org.apache.avalon.framework.parameters.ParameterException;
+import org.apache.cocoon.generation.AbstractGenerator;
+import org.apache.cocoon.woody.Constants;
+import org.apache.cocoon.woody.formmodel.Form;
+import org.apache.cocoon.woody.transformation.WoodyPipeLineConfig;
import org.xml.sax.SAXException;
-import java.io.IOException;
-import java.util.Map;
-import java.util.Locale;
-
/**
* A generator that streams an XML representation of a Woody [EMAIL
PROTECTED] Form}. This will
* recursively contain the XML for all widgets on the form. This can then be
styled
@@ -73,8 +71,11 @@
* <p>An alternative approach that requires less (or even none) XSLT work is
offered by
* the [EMAIL PROTECTED]
org.apache.cocoon.woody.transformation.WoodyTemplateTransformer
WoodyTemplateTransformer}.
*
- * <p>The Form whose XML should be produced should reside in a request
attribute, whose
- * name should be provided to this generator as a sitemap parameter called
"attribute-name".
+ * <p>The Form whose XML should be produced should reside either
+ * <ol><li> In a request attribute, whose name should be provided to this
+ * generator as a sitemap parameter called "attribute-name".</li>
+ * <li> Or else at its default-location in the flow context-object.</li>
+ * </ol>
*/
public class WoodyGenerator extends AbstractGenerator {
@@ -83,18 +84,9 @@
public void setup(SourceResolver resolver, Map objectModel, String src,
Parameters par)
throws ProcessingException, SAXException, IOException {
super.setup(resolver, objectModel, src, par);
- // get the form from a request attribute
- String formAttribute;
- try {
- formAttribute = parameters.getParameter("attribute-name");
- } catch (ParameterException e) {
- throw new ProcessingException("Missing 'attribute-name'
parameter for WoodyGenerator.");
- }
- Request request = ObjectModelHelper.getRequest(objectModel);
- form = (Form)request.getAttribute(formAttribute);
- if (form == null) {
- throw new ProcessingException("WoodyGenerator cannot find a form
in the request attribute named " + formAttribute);
- }
+
+ WoodyPipeLineConfig config =
WoodyPipeLineConfig.createConfig(objectModel, parameters);
+ form = config.findForm();
}
public void recycle() {