cziegeler 2002/09/25 04:45:35
Modified: src/java/org/apache/cocoon/components/source SourceUtil.java
src/java/org/apache/cocoon/webapps/session/connector
ResourceConnectorImpl.java
src/java/org/apache/cocoon/xml IncludeXMLConsumer.java
src/java/org/apache/cocoon/transformation
CIncludeTransformer.java
Removed: src/java/org/apache/cocoon/webapps/session/connector
URLRewriter.java
Log:
Start of merging cinclude transformer with session transformer include capabilities.
Revision Changes Path
1.6 +122 -1
xml-cocoon2/src/java/org/apache/cocoon/components/source/SourceUtil.java
Index: SourceUtil.java
===================================================================
RCS file:
/home/cvs/xml-cocoon2/src/java/org/apache/cocoon/components/source/SourceUtil.java,v
retrieving revision 1.5
retrieving revision 1.6
diff -u -r1.5 -r1.6
--- SourceUtil.java 13 Jun 2002 11:25:48 -0000 1.5
+++ SourceUtil.java 25 Sep 2002 11:45:34 -0000 1.6
@@ -51,15 +51,26 @@
package org.apache.cocoon.components.source;
import java.io.IOException;
+import java.util.Iterator;
+import java.util.Map;
+
import org.apache.avalon.excalibur.xml.XMLizable;
import org.apache.avalon.framework.component.ComponentException;
import org.apache.avalon.framework.component.ComponentManager;
+import org.apache.avalon.framework.parameters.Parameters;
import org.apache.cocoon.ProcessingException;
import org.apache.cocoon.ResourceNotFoundException;
+import org.apache.cocoon.environment.ObjectModelHelper;
+import org.apache.cocoon.environment.Request;
+import org.apache.cocoon.environment.SourceResolver;
+import org.apache.cocoon.xml.IncludeXMLConsumer;
+import org.apache.cocoon.xml.XMLConsumer;
import org.apache.cocoon.xml.dom.DOMBuilder;
import org.apache.excalibur.source.Source;
import org.apache.excalibur.source.SourceException;
import org.apache.excalibur.source.SourceNotFoundException;
+import org.apache.excalibur.source.SourceParameters;
+import org.apache.excalibur.source.impl.URLSource;
import org.apache.excalibur.xmlizer.XMLizer;
import org.xml.sax.ContentHandler;
import org.xml.sax.InputSource;
@@ -113,6 +124,36 @@
}
/**
+ * Generates SAX events from the given source
+ * <b>NOTE</b> : if the implementation can produce lexical events, care should
be taken
+ * that <code>handler</code> can actually
+ * directly implement the LexicalHandler interface!
+ *
+ * @param source the data
+ * @throws ProcessingException if no suitable converter is found
+ */
+ static public void toSAX( Source source,
+ ContentHandler handler,
+ ComponentManager manager,
+ Parameters typeParameters,
+ boolean filterDocumentEvent)
+ throws SAXException, IOException, ProcessingException {
+
+
+ // Test for url rewriting
+ if (typeParameters != null
+ && typeParameters.getParameter(URLRewriter.PARAMETER_MODE, null) !=
null) {
+ handler = new URLRewriter(typeParameters, handler);
+ }
+ if (filterDocumentEvent) {
+ IncludeXMLConsumer filter = new IncludeXMLConsumer(handler);
+ toSAX(source, filter, manager);
+ } else {
+ toSAX(source, handler, manager);
+ }
+ }
+
+ /**
* Generates a DOM from the given source
* @param source the data
* @throws ProcessingException if no suitable converter is found
@@ -160,5 +201,85 @@
} catch (SourceException se) {
throw handle(se);
}
+ }
+
+ /**
+ * Get a <code>Source</code> object
+ */
+ static public Source getSource(String uri,
+ Parameters typeParameters,
+ SourceParameters resourceParameters,
+ SourceResolver resolver,
+ Map objectModel)
+ throws IOException, SAXException, SourceException {
+
+ // Test: local uri (= same servlet/cocoon) ?
+ if (uri.startsWith("/") == true) {
+ // server-absolute url is transformed to absolute url
+ Request request = ObjectModelHelper.getRequest(objectModel);
+ uri = request.getScheme() + "://" +
+ request.getServerName() + ":" + request.getServerPort() + uri;
+ }
+
+ // first step: encode parameters which are already appended to the url
+ int queryPos = uri.indexOf('?');
+ if (queryPos != -1) {
+ String queryString = uri.substring(queryPos+1);
+ SourceParameters queries = new SourceParameters(queryString);
+ if (queries.hasParameters()) {
+ StringBuffer buffer;
+ buffer = new StringBuffer(uri.substring(0, queryPos));
+ String current;
+ Iterator iter = queries.getParameterNames();
+ char separator = '?';
+ Iterator values;
+ while (iter.hasNext() == true) {
+ current = (String)iter.next();
+ values = queries.getParameterValues(current);
+ while (values.hasNext()) {
+ buffer.append(separator)
+ .append(current)
+ .append('=')
+
.append(org.apache.excalibur.source.SourceUtil.encode((String)values.next()));
+ separator = '&';
+ }
+ }
+ uri = buffer.toString();
+ }
+ }
+ boolean followRedirects = (typeParameters != null ?
+
typeParameters.getParameterAsBoolean("followRedirects", true)
+ : true);
+ String method = (typeParameters != null ?
typeParameters.getParameter("method", "GET")
+ : "GET");
+ if (method.equalsIgnoreCase("POST") == true
+ && (resourceParameters == null || resourceParameters.hasParameters() ==
false)) {
+ method = "GET";
+ }
+ if ((method.equalsIgnoreCase("POST") == false
+ || uri.startsWith("cocoon:") == true)
+ && resourceParameters != null
+ && resourceParameters.hasParameters()) {
+
+ int pos = uri.indexOf(";jsessionid=");
+ if (uri.startsWith("cocoon:") == false) {
+ if (pos != -1) uri = uri.substring(0, pos);
+ uri = org.apache.excalibur.source.SourceUtil.appendParameters(uri,
resourceParameters);
+ } else {
+ StringBuffer buf;
+ if (pos == -1) {
+ buf = new StringBuffer(uri);
+ } else {
+ buf = new StringBuffer(uri.substring(0, pos));
+ }
+ buf.append((uri.indexOf('?') == -1 ? '?' : '&'));
+ buf.append(resourceParameters.getEncodedQueryString());
+ uri = buf.toString();
+ }
+ }
+ Map resolverParameters = new java.util.HashMap();
+ resolverParameters.put(URLSource.HTTP_METHOD, method);
+ resolverParameters.put(URLSource.REQUEST_PARAMETERS, resourceParameters);
+ return resolver.resolveURI(uri, null, resolverParameters);
}
}
1.7 +4 -84
xml-cocoon2/src/java/org/apache/cocoon/webapps/session/connector/ResourceConnectorImpl.java
Index: ResourceConnectorImpl.java
===================================================================
RCS file:
/home/cvs/xml-cocoon2/src/java/org/apache/cocoon/webapps/session/connector/ResourceConnectorImpl.java,v
retrieving revision 1.6
retrieving revision 1.7
diff -u -r1.6 -r1.7
--- ResourceConnectorImpl.java 31 Jul 2002 13:13:32 -0000 1.6
+++ ResourceConnectorImpl.java 25 Sep 2002 11:45:34 -0000 1.7
@@ -76,6 +76,7 @@
import org.apache.cocoon.Processor;
import org.apache.cocoon.ResourceNotFoundException;
import org.apache.cocoon.components.RequestLifecycleComponent;
+import org.apache.cocoon.components.source.URLRewriter;
import org.apache.cocoon.environment.Context;
import org.apache.cocoon.environment.Environment;
import org.apache.cocoon.environment.ObjectModelHelper;
@@ -169,87 +170,6 @@
}
/**
- * Get a <code>Source</code> object
- */
- private Source getSource(String uri,
- Parameters typeParameters,
- SourceParameters resourceParameters)
- throws IOException, SAXException, SourceException {
-
- // Test: local uri (= same servlet/cocoon) ?
- if (uri.startsWith("/") == true) {
- // server-absolute url is transformed to absolute url
- Request request = ObjectModelHelper.getRequest(objectModel);
- uri = request.getScheme() + "://" +
- request.getServerName() + ":" + request.getServerPort() + uri;
- }
-
- // first step: encode parameters which are already appended to the url
- int queryPos = uri.indexOf('?');
- if (queryPos != -1) {
- String queryString = uri.substring(queryPos+1);
- SourceParameters queries = new SourceParameters(queryString);
- if (queries.hasParameters()) {
- StringBuffer buffer;
- buffer = new StringBuffer(uri.substring(0, queryPos));
- String current;
- Iterator iter = queries.getParameterNames();
- char separator = '?';
- Iterator values;
- while (iter.hasNext() == true) {
- current = (String)iter.next();
- values = queries.getParameterValues(current);
- while (values.hasNext()) {
- buffer.append(separator)
- .append(current)
- .append('=')
- .append(SourceUtil.encode((String)values.next()));
- separator = '&';
- }
- }
- uri = buffer.toString();
- }
- }
- boolean followRedirects = (typeParameters != null ?
-
typeParameters.getParameterAsBoolean("followRedirects", true)
- : true);
- String method = (typeParameters != null ?
typeParameters.getParameter("method", "GET")
- : "GET");
- if (method.equalsIgnoreCase("POST") == true
- && (resourceParameters == null || resourceParameters.hasParameters() ==
false)) {
- method = "GET";
- }
- if ((method.equalsIgnoreCase("POST") == false
- || uri.startsWith("cocoon:") == true)
- && resourceParameters != null
- && resourceParameters.hasParameters()) {
-
- int pos = uri.indexOf(";jsessionid=");
- if (uri.startsWith("cocoon:") == false) {
- if (pos != -1) uri = uri.substring(0, pos);
- uri = SourceUtil.appendParameters(uri, resourceParameters);
- } else {
- StringBuffer buf;
- if (pos == -1) {
- buf = new StringBuffer(uri);
- } else {
- buf = new StringBuffer(uri.substring(0, pos));
- }
- buf.append((uri.indexOf('?') == -1 ? '?' : '&'));
- buf.append(resourceParameters.getEncodedQueryString());
- uri = buf.toString();
- }
- }
- if (this.getLogger().isInfoEnabled() == true) {
- this.getLogger().info("Getting content of '"+uri+"' using method " +
method);
- }
- Map resolverParameters = new java.util.HashMap();
- resolverParameters.put(URLSource.HTTP_METHOD, method);
- resolverParameters.put(URLSource.REQUEST_PARAMETERS, resourceParameters);
- return this.resolver.resolveURI(uri, null, resolverParameters);
- }
-
- /**
* Load XML
*/
private DocumentFragment loadXMLFromURI(Parameters typeParameters,
@@ -287,7 +207,7 @@
}
Source input = null;
try {
- input = this.getSource(uri, typeParameters, resourceParameters);
+ input = org.apache.cocoon.components.source.SourceUtil.getSource(uri,
typeParameters, resourceParameters, this.resolver, this.objectModel);
if (input != null) {
this.resolver.toSAX(input, filter);
@@ -696,7 +616,7 @@
Source input = null;
try {
- input = this.getSource(uri, typeParameters, resourceParameters);
+ input = org.apache.cocoon.components.source.SourceUtil.getSource(uri,
typeParameters, resourceParameters, this.resolver, this.objectModel);
this.resolver.toSAX( input, filter );
} finally {
this.resolver.release(input);
1.9 +2 -2
xml-cocoon2/src/java/org/apache/cocoon/xml/IncludeXMLConsumer.java
Index: IncludeXMLConsumer.java
===================================================================
RCS file:
/home/cvs/xml-cocoon2/src/java/org/apache/cocoon/xml/IncludeXMLConsumer.java,v
retrieving revision 1.8
retrieving revision 1.9
diff -u -r1.8 -r1.9
--- IncludeXMLConsumer.java 2 Jul 2002 22:01:45 -0000 1.8
+++ IncludeXMLConsumer.java 25 Sep 2002 11:45:35 -0000 1.9
@@ -105,7 +105,7 @@
*/
public IncludeXMLConsumer (ContentHandler contentHandler) {
this.contentHandler = contentHandler;
- this.lexicalHandler = null;
+ this.lexicalHandler = (contentHandler instanceof LexicalHandler ?
(LexicalHandler)contentHandler : null);
}
/**
1.11 +163 -13
xml-cocoon2/src/java/org/apache/cocoon/transformation/CIncludeTransformer.java
Index: CIncludeTransformer.java
===================================================================
RCS file:
/home/cvs/xml-cocoon2/src/java/org/apache/cocoon/transformation/CIncludeTransformer.java,v
retrieving revision 1.10
retrieving revision 1.11
diff -u -r1.10 -r1.11
--- CIncludeTransformer.java 25 Sep 2002 10:40:25 -0000 1.10
+++ CIncludeTransformer.java 25 Sep 2002 11:45:35 -0000 1.11
@@ -59,10 +59,12 @@
import org.apache.cocoon.components.source.SourceUtil;
import org.apache.cocoon.environment.SourceResolver;
import org.apache.cocoon.xml.IncludeXMLConsumer;
+import org.apache.cocoon.xml.XMLUtils;
import org.apache.avalon.excalibur.xml.Parser;
import org.apache.avalon.excalibur.xml.xpath.XPathProcessor;
import org.apache.excalibur.source.Source;
import org.apache.excalibur.source.SourceException;
+import org.apache.excalibur.source.SourceParameters;
import org.w3c.dom.Document;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
@@ -89,7 +91,7 @@
* @author <a href="mailto:[EMAIL PROTECTED]">Andrew C. Oliver</a>
* @version CVS $Id$
*/
-public class CIncludeTransformer extends AbstractTransformer
+public class CIncludeTransformer extends AbstractSAXTransformer
implements Composable {
public static final String CINCLUDE_NAMESPACE_URI =
"http://apache.org/cocoon/include/1.0";
@@ -100,6 +102,27 @@
public static final String CINCLUDE_INCLUDE_ELEMENT_NS_ATTRIBUTE = "ns";
public static final String CINCLUDE_INCLUDE_ELEMENT_PREFIX_ATTRIBUTE = "prefix";
+ public static final String CINCLUDE_INCLUDEXML_ELEMENT = "includexml";
+ public static final String CINCLUDE_INCLUDEXML_ELEMENT_IGNORE_ERRORS_ATTRIBUTE
= "ignoreErrors";
+ public static final String CINCLUDE_SRC_ELEMENT = "src";
+ public static final String CINCLUDE_CONFIGURATION_ELEMENT = "configuration";
+ public static final String CINCLUDE_PARAMETERS_ELEMENT = "parameters";
+ public static final String CINCLUDE_PARAMETER_ELEMENT = "parameter";
+ public static final String CINCLUDE_NAME_ELEMENT = "name";
+ public static final String CINCLUDE_VALUE_ELEMENT = "value";
+
+ private static final int STATE_OUTSIDE = 0;
+ private static final int STATE_INCLUDE = 1;
+
+ /** The configuration of includexml */
+ protected Parameters configurationParameters;
+
+ /** The parameters for includexml */
+ protected SourceParameters resourceParameters;
+
+ /** The current state: STATE_ */
+ protected int state;
+
/** The <code>SourceResolver</code> */
protected SourceResolver sourceResolver;
@@ -108,12 +131,21 @@
/**
+ * Constructor
+ * Set the namespace
+ */
+ public CIncludeTransformer() {
+ this.namespaceURI = CINCLUDE_NAMESPACE_URI;
+ }
+
+ /**
* Setup the component.
*/
public void setup(SourceResolver resolver, Map objectModel,
String source, Parameters parameters)
throws ProcessingException, SAXException, IOException {
this.sourceResolver = resolver;
+ this.state = STATE_OUTSIDE;
}
/**
@@ -129,13 +161,13 @@
public void recycle() {
super.recycle();
this.sourceResolver = null;
+ this.configurationParameters = null;
+ this.resourceParameters = null;
}
- public void startElement(String uri, String name, String raw, Attributes attr)
- throws SAXException {
- if (uri != null && name != null
- && uri.equals(CINCLUDE_NAMESPACE_URI)
- && name.equals(CINCLUDE_INCLUDE_ELEMENT)) {
+ public void startTransformingElement(String uri, String name, String raw,
Attributes attr)
+ throws ProcessingException ,IOException, SAXException {
+ if (name.equals(CINCLUDE_INCLUDE_ELEMENT)) {
this.processCIncludeElement(attr.getValue("",CINCLUDE_INCLUDE_ELEMENT_SRC_ATTRIBUTE),
attr.getValue("",CINCLUDE_INCLUDE_ELEMENT_ELEMENT_ATTRIBUTE),
@@ -143,18 +175,136 @@
attr.getValue("",CINCLUDE_INCLUDE_ELEMENT_NS_ATTRIBUTE),
attr.getValue("",CINCLUDE_INCLUDE_ELEMENT_PREFIX_ATTRIBUTE));
+ // Element: include
+ } else if (name.equals(CINCLUDE_INCLUDEXML_ELEMENT)
+ && this.state == STATE_OUTSIDE) {
+ this.state = STATE_INCLUDE;
+ String ignoreErrors = attr.getValue("",
CINCLUDE_INCLUDEXML_ELEMENT_IGNORE_ERRORS_ATTRIBUTE);
+ if (ignoreErrors == null || ignoreErrors.length() == 0) {
+ ignoreErrors = "false";
+ }
+ this.stack.push(new Boolean(this.ignoreEmptyCharacters));
+ this.stack.push(new Boolean(this.ignoreWhitespaces));
+ this.stack.push(ignoreErrors);
+
+ this.ignoreEmptyCharacters = false;
+ this.ignoreWhitespaces = true;
+
+ // target
+ } else if (name.equals(CINCLUDE_SRC_ELEMENT)
+ && this.state == STATE_INCLUDE) {
+ this.startTextRecording();
+
+ // configparameters
+ } else if (name.equals(CINCLUDE_CONFIGURATION_ELEMENT)
+ && this.state == STATE_INCLUDE) {
+ stack.push("end");
+
+ // parameters
+ } else if (name.equals(CINCLUDE_PARAMETERS_ELEMENT)
+ && this.state == STATE_INCLUDE) {
+ stack.push("end");
+
+ // parameter
+ } else if (name.equals(CINCLUDE_PARAMETER_ELEMENT)
+ && this.state == STATE_INCLUDE) {
+
+ // parameter name
+ } else if (name.equals(CINCLUDE_NAME_ELEMENT)
+ && this.state == STATE_INCLUDE) {
+ this.startTextRecording();
+
+ // parameter value
+ } else if (name.equals(CINCLUDE_VALUE_ELEMENT)
+ && this.state == STATE_INCLUDE) {
+
this.startSerializedXMLRecording(XMLUtils.defaultSerializeToXMLFormat(true));
+
} else {
- super.startElement(uri, name, raw, attr);
+ super.startTransformingElement(uri, name, raw, attr);
}
}
- public void endElement(String uri, String name, String raw) throws SAXException
{
- if (uri != null && name != null
- && uri.equals(CINCLUDE_NAMESPACE_URI)
- && name.equals(CINCLUDE_INCLUDE_ELEMENT)) {
+ public void endTransformingElement(String uri, String name, String raw)
+ throws ProcessingException, IOException, SAXException {
+ if (name.equals(CINCLUDE_INCLUDE_ELEMENT)) {
+ // do nothing
return;
+
+ // Element: includexml
+ } else if (name.equals(CINCLUDE_INCLUDEXML_ELEMENT)
+ && this.state == STATE_INCLUDE) {
+
+ this.state = STATE_OUTSIDE;
+
+ final String resource = (String)stack.pop();
+
+ final boolean ignoreErrors = ((String)stack.pop()).equals("true");
+
+ Source source = null;
+ try {
+ source = SourceUtil.getSource(resource,
+ this.configurationParameters,
+ this.resourceParameters,
+ this.resolver,
+ this.objectModel);
+
+ SourceUtil.toSAX(source, this.xmlConsumer, manager,
this.configurationParameters, true);
+
+ } catch (SourceException se) {
+ throw SourceUtil.handle(se);
+ } finally {
+ this.sourceResolver.release(source);
+ }
+
+ // restore values
+ this.ignoreWhitespaces = ((Boolean)stack.pop()).booleanValue();
+ this.ignoreEmptyCharacters = ((Boolean)stack.pop()).booleanValue();
+
+ // src element
+ } else if (name.equals(CINCLUDE_SRC_ELEMENT)
+ && this.state == STATE_INCLUDE) {
+
+ this.stack.push(this.endTextRecording());
+
+ } else if (name.equals(CINCLUDE_PARAMETERS_ELEMENT)
+ && this.state == STATE_INCLUDE) {
+ this.resourceParameters = new SourceParameters();
+ // Now get the parameters off the stack
+ String label = (String)stack.pop();
+ String value;
+ while (!label.equals("end")) {
+ value = (String)stack.pop();
+ this.resourceParameters.setParameter(label, value);
+ label = (String)stack.pop();
+ }
+
+ } else if (name.equals(CINCLUDE_CONFIGURATION_ELEMENT) == true
+ && this.state == STATE_INCLUDE) {
+ this.configurationParameters = new Parameters();
+ // Now get the parameters off the stack
+ String label = (String)stack.pop();
+ String value;
+ while (!label.equals("end")) {
+ value = (String)stack.pop();
+ this.configurationParameters.setParameter(label, value);
+ label = (String)stack.pop();
+ }
+
+ } else if (name.equals(CINCLUDE_PARAMETER_ELEMENT) == true
+ && this.state == STATE_INCLUDE) {
+
+ } else if (name.equals(CINCLUDE_NAME_ELEMENT) == true
+ && this.state == STATE_INCLUDE) {
+ stack.push(this.endTextRecording());
+
+ // parameter value
+ } else if (name.equals(CINCLUDE_VALUE_ELEMENT) == true
+ && this.state == STATE_INCLUDE) {
+ stack.push(this.endSerializedXMLRecording());
+
+ } else {
+ super.endTransformingElement(uri, name, raw);
}
- super.endElement(uri, name, raw);
}
protected void processCIncludeElement(String src, String element,
----------------------------------------------------------------------
In case of troubles, e-mail: [EMAIL PROTECTED]
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]