cziegeler 2003/01/31 04:37:54
Modified: src/java/org/apache/cocoon/transformation Tag:
cocoon_2_0_3_branch AbstractSAXTransformer.java
CIncludeTransformer.java
Log:
Backporting session, authentication and portal framework
Revision Changes Path
No revision
No revision
1.2.2.3 +19 -12
xml-cocoon2/src/java/org/apache/cocoon/transformation/AbstractSAXTransformer.java
Index: AbstractSAXTransformer.java
===================================================================
RCS file:
/home/cvs/xml-cocoon2/src/java/org/apache/cocoon/transformation/AbstractSAXTransformer.java,v
retrieving revision 1.2.2.2
retrieving revision 1.2.2.3
diff -u -r1.2.2.2 -r1.2.2.3
--- AbstractSAXTransformer.java 30 Jan 2003 16:20:14 -0000 1.2.2.2
+++ AbstractSAXTransformer.java 31 Jan 2003 12:37:54 -0000 1.2.2.3
@@ -99,7 +99,7 @@
* <li>Process the information</li>
* <li>Create new events from the processed information</li>
* </ul><p>
- * For all these four purposes the AbstractSunshineTransformer offers some
+ * For all these four purposes the AbstractSAXTransformer offers some
* powerful methods and hooks:
* <p>
* Namespace handling<p>
@@ -163,7 +163,7 @@
/**
* This is the default namespace used by the transformer.
- * It should be set by in the constructor.
+ * It should be set in the constructor.
*/
protected String defaultNamespaceURI;
@@ -192,6 +192,9 @@
/** The SourceResolver for this request */
protected SourceResolver resolver;
+ /** Are we already initialized for the current request? */
+ private boolean isInitialized;
+
/** Empty attributes (for performance). This can be used
* do create own attributes, but make sure to clean them
* afterwords.
@@ -241,6 +244,7 @@
this.resolver = resolver;
this.parameters = par;
this.source = src;
+ this.isInitialized = false;
// get the current namespace
this.namespaceURI = this.parameters.getParameter("namespaceURI",
this.defaultNamespaceURI);
@@ -287,12 +291,15 @@
*/
public void startDocument()
throws SAXException {
+ if ( !this.isInitialized ) {
try {
this.setupTransforming();
} catch (ProcessingException local) {
throw new SAXException("ProcessingException: " + local, local);
} catch (IOException ioe) {
throw new SAXException("IOException: " + ioe, ioe);
+ }
+ this.isInitialized = true;
}
if (this.ignoreEventsCount == 0) super.startDocument();
}
@@ -325,8 +332,8 @@
// this is our namespace:
try {
this.startTransformingElement(uri, name, raw, attr);
- } catch (ProcessingException sunShineException) {
- throw new SAXException("ProcessingException: " + sunShineException,
sunShineException);
+ } catch (ProcessingException pException) {
+ throw new SAXException("ProcessingException: " + pException,
pException);
} catch (IOException ioe) {
throw new SAXException("Exception occured during processing: " +
ioe, ioe);
}
@@ -350,9 +357,9 @@
// this is our namespace:
try {
this.endTransformingElement(uri, name, raw);
- } catch (ProcessingException sunShineException) {
- throw new SAXException("ProcessingException: " + sunShineException,
- sunShineException);
+ } catch (ProcessingException pException) {
+ throw new SAXException("ProcessingException: " + pException,
+ pException);
} catch (IOException ioe) {
throw new SAXException("Exception occured during processing: " +
ioe, ioe);
}
@@ -431,7 +438,7 @@
/**
* Start DocumentFragment recording.
- * All invoming events are recorded and not forwarded. The resulting
+ * All invoking events are recorded and not forwarded. The resulting
* DocumentFragment can be obtained by the matching endRecording() call.
*/
public void startRecording()
@@ -442,7 +449,7 @@
DOMBuilder builder = new DOMBuilder();
this.addRecorder(builder);
builder.startDocument();
- builder.startElement("", "sunShine", "sunShine", new AttributesImpl());
+ builder.startElement("", "cocoon", "cocoon", new AttributesImpl());
this.sendStartPrefixMapping();
@@ -453,7 +460,7 @@
/**
* Stop DocumentFragment recording.
- * All invoming events are recorded and not forwarded. This method returns
+ * All invoking events are recorded and not forwarded. This method returns
* the resulting DocumentFragment.
*/
public DocumentFragment endRecording()
@@ -465,7 +472,7 @@
this.sendEndPrefixMapping();
DOMBuilder builder = (DOMBuilder)this.removeRecorder();
- builder.endElement("", "sunShine", "sunShine");
+ builder.endElement("", "cocoon", "cocoon");
builder.endDocument();
// Create Document Fragment
1.6.2.1 +270 -37
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.6
retrieving revision 1.6.2.1
diff -u -r1.6 -r1.6.2.1
--- CIncludeTransformer.java 22 Feb 2002 07:03:56 -0000 1.6
+++ CIncludeTransformer.java 31 Jan 2003 12:37:54 -0000 1.6.2.1
@@ -50,15 +50,27 @@
*/
package org.apache.cocoon.transformation;
-import org.apache.avalon.framework.component.ComponentManager;
-import org.apache.avalon.framework.component.Composable;
+import org.apache.avalon.excalibur.xml.xpath.XPathProcessor;
+import org.apache.avalon.framework.component.Component;
+import org.apache.avalon.framework.component.ComponentException;
import org.apache.avalon.framework.parameters.Parameters;
import org.apache.cocoon.ProcessingException;
+import org.apache.cocoon.components.parser.Parser;
+import org.apache.cocoon.components.source.SourceUtil;
import org.apache.cocoon.environment.Source;
import org.apache.cocoon.environment.SourceResolver;
import org.apache.cocoon.xml.IncludeXMLConsumer;
+import org.apache.cocoon.xml.XMLUtils;
+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;
import org.xml.sax.Attributes;
+import org.xml.sax.ContentHandler;
+import org.xml.sax.InputSource;
import org.xml.sax.SAXException;
+import org.xml.sax.ext.LexicalHandler;
import org.xml.sax.helpers.AttributesImpl;
import java.io.IOException;
@@ -73,39 +85,79 @@
* <code>prefix</code> it is possible to specify an element
* which surrounds the included content.
*
+ * This transformer also supports a more verbose but flexible version:
+ * <cinclude:includexml xmlns:cinclude="http://apache.org/cocoon/include/1.0"
ignoreErrors="false">
+ * <cinclude:src>THE SRC URI</cinclude:src>
+ * <!-- This is an optional configuration block -->
+ * <cinclude:configuration>
+ * <!-- For example if you want to make a HTTP POST -->
+ * <cinclude:parameter>
+ * <cinclude:name>method</cinclude:name>
+ * <cinclude:value>POST</cinclude:value>
+ * </cinclude:parameter>
+ * </cinclude:configuration>
+ * <!-- The following are optional parameters appended to the URI -->
+ * <cinclude:parameters>
+ * <cinclude:parameter>
+ * <cinclude:name>a name</cinclude:name>
+ * <cinclude:value>a value</cinclude:value>
+ * </cinclude:parameter>
+ * <!-- more can follow -->
+ * </cinclude:parameters>
+ * </cinclude:includexml>
+ *
* @author <a href="mailto:[EMAIL PROTECTED]">Carsten Ziegeler</a>
+ * @author <a href="mailto:[EMAIL PROTECTED]">Andrew C. Oliver</a>
* @version CVS $Id$
*/
-public class CIncludeTransformer extends AbstractTransformer
-implements Composable {
+public class CIncludeTransformer
+extends AbstractSAXTransformer {
public static final String CINCLUDE_NAMESPACE_URI =
"http://apache.org/cocoon/include/1.0";
public static final String CINCLUDE_INCLUDE_ELEMENT = "include";
public static final String CINCLUDE_INCLUDE_ELEMENT_SRC_ATTRIBUTE = "src";
public static final String CINCLUDE_INCLUDE_ELEMENT_ELEMENT_ATTRIBUTE =
"element";
+ public static final String CINCLUDE_INCLUDE_ELEMENT_SELECT_ATTRIBUTE = "select";
public static final String CINCLUDE_INCLUDE_ELEMENT_NS_ATTRIBUTE = "ns";
public static final String CINCLUDE_INCLUDE_ELEMENT_PREFIX_ATTRIBUTE = "prefix";
- /** The <code>SourceResolver</code> */
- protected SourceResolver sourceResolver;
-
- /** The current <code>ComponentManager</code>. */
- protected ComponentManager manager = null;
-
+ 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;
+
+ /**
+ * 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;
- }
-
- /**
- * Composable Interface
- */
- public final void compose(final ComponentManager manager) {
- this.manager = manager;
+ super.setup(resolver, objectModel, source, parameters);
+ this.state = STATE_OUTSIDE;
}
/**
@@ -113,45 +165,193 @@
*/
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),
+
attr.getValue("",CINCLUDE_INCLUDE_ELEMENT_SELECT_ATTRIBUTE),
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");
+
+ if (this.getLogger().isDebugEnabled()) {
+ getLogger().debug("Processing CIncludexml element: src=" + resource
+ + ", ignoreErrors=" + ignoreErrors
+ + ", configuration=" + this.configurationParameters
+ + ", parameters=" + this.resourceParameters);
+ }
+ Source source = null;
+ try {
+ source = SourceUtil.getSource(resource,
+ this.configurationParameters,
+ this.resourceParameters,
+ this.resolver);
+
+ SourceUtil.toSAX(source, this.xmlConsumer, manager,
this.configurationParameters, true);
+
+ } catch (SourceException se) {
+ if (!ignoreErrors) throw SourceUtil.handle(se);
+ } catch (SAXException se) {
+ if (!ignoreErrors) throw se;
+ } catch (IOException ioe) {
+ if (!ignoreErrors) throw ioe;
+ } catch (ProcessingException pe) {
+ if (!ignoreErrors) throw pe;
+ } finally {
+ if (source != null) source.recycle();
+ }
+
+ // 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 key = null;
+ String value = null;
+ while (!label.equals("end")) {
+ if (label.equals("name")) key = (String)stack.pop();
+ if (label.equals("value")) value = (String)stack.pop();
+ if (key != null && value != null) {
+ this.resourceParameters.setParameter(key, value);
+ key = null;
+ value = null;
+ }
+ 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 key = null;
+ String value = null;
+ while (!label.equals("end")) {
+ if (label.equals("name")) key = (String)stack.pop();
+ if (label.equals("value")) value = (String)stack.pop();
+ if (key != null && value != null) {
+ this.configurationParameters.setParameter(key, value);
+ key = null;
+ value = null;
+ }
+ 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());
+ stack.push("name");
+
+ // parameter value
+ } else if (name.equals(CINCLUDE_VALUE_ELEMENT) == true
+ && this.state == STATE_INCLUDE) {
+ stack.push(this.endSerializedXMLRecording());
+ stack.push("value");
+
+ } else {
+ super.endTransformingElement(uri, name, raw);
}
- super.endElement(uri, name, raw);
}
- protected void processCIncludeElement(String src, String element, String ns,
String prefix)
+ protected void processCIncludeElement(String src, String element,
+ String select, String ns, String prefix)
throws SAXException {
if (element == null) element="";
+ if (select == null) select="";
if (ns == null) ns="";
if (prefix == null) prefix="";
+ if (this.getLogger().isDebugEnabled()) {
getLogger().debug("Processing CInclude element: src=" + src
+ ", element=" + element
+ + ", select=" + select
+ ", ns=" + ns
+ ", prefix=" + prefix);
+ }
IncludeXMLConsumer consumer = new IncludeXMLConsumer(this);
@@ -168,16 +368,49 @@
Source source = null;
try {
- source = this.sourceResolver.resolve(src);
- source.toSAX(consumer);
+ source = this.resolver.resolve(src);
+
+ if (!"".equals(select)) {
+
+
+ Parser parser = null;
+ XPathProcessor processor = null;
+
+ try {
+ parser = (Parser)this.manager.lookup(Parser.ROLE);
+ processor =
(XPathProcessor)this.manager.lookup(XPathProcessor.ROLE);
+
+ InputSource input = SourceUtil.getInputSource(source);
+
+ Document document = parser.parseDocument(input);
+ NodeList list = processor.selectNodeList(document, select);
+ int length = list.getLength();
+ for (int i=0; i<length; i++) {
+ IncludeXMLConsumer.includeNode((Node)list.item(i),
+ (ContentHandler)this,
+ (LexicalHandler)this);
+ }
+ } finally {
+ this.manager.release(parser);
+ this.manager.release((Component)processor);
+ }
+ } else {
+ String mimeType = null;
+ if ( null != this.configurationParameters ) {
+ mimeType =
this.configurationParameters.getParameter("mime-type", mimeType);
+ }
+ SourceUtil.toSAX(source, mimeType, consumer, super.manager);
+ }
+
+
} catch (IOException e) {
- getLogger().error("CIncludeTransformer", e);
throw new SAXException("CIncludeTransformer could not read resource",
e);
} catch (ProcessingException e){
- getLogger().error("Could not stream input", e);
throw new SAXException("Exception in CIncludeTransformer",e);
+ } catch(ComponentException e) {
+ throw new SAXException(e);
} finally {
- source.recycle();
+ if (source != null) source.recycle();
}
if (!"".equals(element)) {
----------------------------------------------------------------------
In case of troubles, e-mail: [EMAIL PROTECTED]
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]