You are viewing a plain text version of this content. The canonical link for it is here.
Posted to cvs@cocoon.apache.org by cz...@apache.org on 2002/07/01 16:43:17 UTC
cvs commit: xml-cocoon2/src/java/org/apache/cocoon/xml XMLUtils.java
cziegeler 2002/07/01 07:43:17
Modified: src/java/org/apache/cocoon/serialization
AbstractTextSerializer.java HTMLSerializer.java
TextSerializer.java XMLSerializer.java
src/java/org/apache/cocoon/transformation
SourceWritingTransformer.java
src/java/org/apache/cocoon/xml XMLUtils.java
Log:
Fixing namespace problem with SourceWritingTransformer by using a workaround for a known Xalan bug
Revision Changes Path
1.11 +14 -2 xml-cocoon2/src/java/org/apache/cocoon/serialization/AbstractTextSerializer.java
Index: AbstractTextSerializer.java
===================================================================
RCS file: /home/cvs/xml-cocoon2/src/java/org/apache/cocoon/serialization/AbstractTextSerializer.java,v
retrieving revision 1.10
retrieving revision 1.11
diff -u -r1.10 -r1.11
--- AbstractTextSerializer.java 28 May 2002 13:08:13 -0000 1.10
+++ AbstractTextSerializer.java 1 Jul 2002 14:43:17 -0000 1.11
@@ -171,6 +171,18 @@
}
/**
+ * Helper for TransformerHandler.
+ */
+ protected TransformerHandler getTransformerHandler()
+ throws javax.xml.transform.TransformerException {
+ // return this.getTransformerFactory().newTransformerHandler();
+ // FIXME - This is a workaround for bug #5779 of Xalan
+ return this.getTransformerFactory().newTransformerHandler(
+ new javax.xml.transform.stream.StreamSource(new java.io.StringReader(org.apache.cocoon.xml.XMLUtils.xalanBugStylesheet)));
+ // End workaround
+ }
+
+ /**
* Set the <code>OutputStream</code> where the XML should be serialized.
*/
public void setOutputStream(OutputStream out) {
@@ -306,7 +318,7 @@
String prefix = "nsp";
String check = "xmlns:" + prefix + "='" + uri + "'";
- TransformerHandler handler = factory.newTransformerHandler();
+ TransformerHandler handler = this.getTransformerHandler();
handler.setResult(new StreamResult(writer));
handler.getTransformer().setOutputProperties(format);
1.6 +2 -2 xml-cocoon2/src/java/org/apache/cocoon/serialization/HTMLSerializer.java
Index: HTMLSerializer.java
===================================================================
RCS file: /home/cvs/xml-cocoon2/src/java/org/apache/cocoon/serialization/HTMLSerializer.java,v
retrieving revision 1.5
retrieving revision 1.6
diff -u -r1.5 -r1.6
--- HTMLSerializer.java 22 Feb 2002 07:03:55 -0000 1.5
+++ HTMLSerializer.java 1 Jul 2002 14:43:17 -0000 1.6
@@ -70,7 +70,7 @@
public void setOutputStream(OutputStream out) {
try {
super.setOutputStream(out);
- handler = getTransformerFactory().newTransformerHandler();
+ handler = this.getTransformerHandler();
format.put(OutputKeys.METHOD,"html");
handler.setResult(new StreamResult(this.output));
handler.getTransformer().setOutputProperties(format);
1.6 +2 -2 xml-cocoon2/src/java/org/apache/cocoon/serialization/TextSerializer.java
Index: TextSerializer.java
===================================================================
RCS file: /home/cvs/xml-cocoon2/src/java/org/apache/cocoon/serialization/TextSerializer.java,v
retrieving revision 1.5
retrieving revision 1.6
diff -u -r1.5 -r1.6
--- TextSerializer.java 22 Feb 2002 07:03:55 -0000 1.5
+++ TextSerializer.java 1 Jul 2002 14:43:17 -0000 1.6
@@ -70,7 +70,7 @@
public void setOutputStream(OutputStream out) {
try {
super.setOutputStream(out);
- handler = getTransformerFactory().newTransformerHandler();
+ handler = this.getTransformerHandler();
format.put(OutputKeys.METHOD,"text");
handler.setResult(new StreamResult(this.output));
handler.getTransformer().setOutputProperties(format);
1.6 +2 -2 xml-cocoon2/src/java/org/apache/cocoon/serialization/XMLSerializer.java
Index: XMLSerializer.java
===================================================================
RCS file: /home/cvs/xml-cocoon2/src/java/org/apache/cocoon/serialization/XMLSerializer.java,v
retrieving revision 1.5
retrieving revision 1.6
diff -u -r1.5 -r1.6
--- XMLSerializer.java 22 Feb 2002 07:03:55 -0000 1.5
+++ XMLSerializer.java 1 Jul 2002 14:43:17 -0000 1.6
@@ -70,7 +70,7 @@
public void setOutputStream(OutputStream out) {
try {
super.setOutputStream(out);
- this.handler = getTransformerFactory().newTransformerHandler();
+ this.handler = this.getTransformerHandler();
format.put(OutputKeys.METHOD,"xml");
handler.setResult(new StreamResult(this.output));
handler.getTransformer().setOutputProperties(format);
1.6 +117 -117 xml-cocoon2/src/java/org/apache/cocoon/transformation/SourceWritingTransformer.java
Index: SourceWritingTransformer.java
===================================================================
RCS file: /home/cvs/xml-cocoon2/src/java/org/apache/cocoon/transformation/SourceWritingTransformer.java,v
retrieving revision 1.5
retrieving revision 1.6
diff -u -r1.5 -r1.6
--- SourceWritingTransformer.java 1 Jul 2002 08:53:39 -0000 1.5
+++ SourceWritingTransformer.java 1 Jul 2002 14:43:17 -0000 1.6
@@ -110,13 +110,13 @@
* <source:path>[Optional] XPath to specify how your content is wrapped</source:path> - eg: "doc" (your content is placed inside a <doc/> root tag). NOTE: if this value is omitted, your content MUST have only ONE top-level node.
* <source:fragment>The XML Fragment to be written</source:fragment> - eg: "<foo><bar id="dogcow"/></foo>" or "<foo/><bar><dogcow/><bar/>" etc. NOTE: the second example type, can only be used when the <source:path/> tag has been specified.
* <source:write>
- *
+ *
* <source:insert create="[true]|false" overwrite="[true]|false"> - inserts content into an existing asset, if @create is 'true' (default), a new asset will be created if one does not already exist. If @overwrite is set to 'true' the data is only inserted if the node specified by the 'replacePath' does not exists.
* <source:source>The System ID of the asset to be written to</source:source> - eg: "docs/blah.xml" or "context://blah.xml" etc.
* <source:path>XPath specifying the node into which the content is inserted</source:path> - eg: "doc" (your content is appended as the last child of the <doc/> root tag), or "doc/section[3]". NOTE: this tag is required in <source:insert/> unlike <source:write/> where it is optional.
* <source:replace>[Optional] XPath (relative to <source:path/>) to the node that is replaced by your new content</source:replace> - eg: "foo/bar/dogcow/@status='cut'" (is equivalent to this in XSLT: select="foo[bar/dogcow/@status='cut']").
* <source:reinsert>[Optional] The XPath (relative to <source:replace/>) to backup the overwritten node to</source:reinsert> - eg: "foo/versions" or "/doc/versions/foo". NOTE: If specified and a node is replaced, all children of this replaced node will be reinserted at the given path.
- * <source:fragment>The XML Fragment to be written</source:fragment> - eg: "<foo><bar id="dogcow"/></foo>" or "<foo/><bar><dogcow/><bar/>" etc.
+ * <source:fragment>The XML Fragment to be written</source:fragment> - eg: "<foo><bar id="dogcow"/></foo>" or "<foo/><bar><dogcow/><bar/>" etc.
* <source:insert>
* </pre>
*
@@ -126,7 +126,7 @@
* <page>
* ...
* <source:write xmlns:source="http://apache.org/cocoon/source/1.0">
- * <source:source>context://doc/editable/my.xml</source:source>
+ * <source:source>context://doc/editable/my.xml</source:source>
* <source:fragment><page>
* <title>Hello World</title>
* <content>
@@ -143,8 +143,8 @@
* <page>
* ...
* <source:insert xmlns:source="http://apache.org/cocoon/source/1.0">
- * <source:source>context://doc/editable/my.xml</source:source>
- * <source:path>page/content</source:path>
+ * <source:source>context://doc/editable/my.xml</source:source>
+ * <source:path>page/content</source:path>
* <source:fragment>
* <p>This paragraph gets <emp>inserted</emp>.</p>
* <p>With this one, at the end of the content.</p>
@@ -178,9 +178,9 @@
* <page>
* ...
* <source:insert xmlns:source="http://apache.org/cocoon/source/1.0">
- * <source:source>context://doc/editable/my.xml"</source:source>
- * <source:path>page/content</source:path>
- * <source:replace>p[1]</source:replace>
+ * <source:source>context://doc/editable/my.xml"</source:source>
+ * <source:path>page/content</source:path>
+ * <source:replace>p[1]</source:replace>
* <source:fragment>
* <p>This paragraph <emp>replaces</emp> the first paragraph.</p>
* </source:fragment>
@@ -236,7 +236,7 @@
* If overwrite is true (the default) the node is replaced. If it is false
* the node is not inserted if the replace node is available.</p>
*
- * <p>[JQ] - the way I understand this, looking at the code:
+ * <p>[JQ] - the way I understand this, looking at the code:
* <pre>
* if 'replace' is not specified, your 'fragment' is appended as a child of 'path'.
* if 'replace' is specified and it exists and 'overwrite' is true, your 'fragment' is inserted in 'path', before 'replace' and then 'replace' is deleted.
@@ -262,8 +262,8 @@
public static final String SWT_URI = "http://apache.org/cocoon/source/1.0";
public static final String DEFAULT_SERIALIZER = "xml";
-
- /** incoming elements */
+
+ /** incoming elements */
public static final String WRITE_ELEMENT = "write";
public static final String INSERT_ELEMENT = "insert";
public static final String PATH_ELEMENT = "path";
@@ -278,11 +278,11 @@
public static final String ACTION_ELEMENT = "action";
public static final String MESSAGE_ELEMENT = "message";
public static final String SERIALIZER_ELEMENT = "serializer";
- /** main (write or insert) tag attributes */
+ /** main (write or insert) tag attributes */
public static final String SERIALIZER_ATTRIBUTE = "serializer";
public static final String CREATE_ATTRIBUTE = "create";
public static final String OVERWRITE_ATTRIBUTE = "overwrite";
- /** results */
+ /** results */
public static final String RESULT_FAILED = "failed";
public static final String RESULT_SUCCESS = "success";
public static final String ACTION_NONE = "none";
@@ -489,7 +489,7 @@
name);
this.state = STATE_OUTSIDE;
-
+
} else if (name.equals(WRITE_ELEMENT) == true && this.state == STATE_WRITE) {
// get the information from the stack
@@ -507,7 +507,7 @@
fileName = (String)this.stack.pop();
} else if (tag.equals("FRAGMENT") == true) {
fragment = (DocumentFragment)this.stack.pop();
- }
+ }
} while (tag.equals("WRITE") == false);
final String localSerializer = (String)this.stack.pop();
final boolean overwrite = this.stack.pop().equals("true");
@@ -522,7 +522,7 @@
reinsert,
localSerializer,
name);
-
+
this.state = STATE_OUTSIDE;
// Element: file
@@ -639,7 +639,7 @@
exists = ws.exists();
target = source.getSystemId();
if ( exists == true && this.state == STATE_INSERT ) {
- message = "content inserted at: " + path;
+ message = "content inserted at: " + path;
resource = SourceUtil.toDOM( source, this.manager );
// import the fragment
Node importNode = resource.importNode(fragment, true);
@@ -656,8 +656,8 @@
}
if (replaceNode != null) {
if (overwrite == true) {
- parent.replaceChild(importNode, replaceNode);
- message += ", replacing: " + replacePath;
+ parent.replaceChild(importNode, replaceNode);
+ message += ", replacing: " + replacePath;
if (reinsertPath != null) {
Node insertAt = XMLUtil.getSingleNode(importNode, reinsertPath);
if (insertAt != null) {
@@ -665,13 +665,13 @@
insertAt.appendChild(replaceNode.getFirstChild());
}
} else { // reinsert point null
- message = "replace failed, could not find your reinsert path: " + reinsertPath;
- resource = null;
+ message = "replace failed, could not find your reinsert path: " + reinsertPath;
+ resource = null;
}
}
} else { // overwrite was false
- message = "replace failed, no overwrite allowed.";
- resource = null;/**/
+ message = "replace failed, no overwrite allowed.";
+ resource = null;/**/
}
} else { // specified replaceNode was not found
parent.appendChild(importNode);
@@ -683,28 +683,28 @@
parent.appendChild(importNode);
}
} else if (create == true) {
- Parser parser = (Parser)this.manager.lookup(Parser.ROLE);
- try {
- resource = parser.createDocument();
- } finally {
- this.manager.release( parser );
- }
- // import the fragment
- Node importNode = resource.importNode(fragment, true);
- if ( path.equals("") ) { // this is allowed in write
- resource.appendChild(importNode);
- message = "entire source overwritten";
-
- } else {
- // get the node
- Node parent = XMLUtil.selectSingleNode(resource, path);
- // add fragment
- parent.appendChild(importNode);
- message = "content appended to: " + path;
- }
+ Parser parser = (Parser)this.manager.lookup(Parser.ROLE);
+ try {
+ resource = parser.createDocument();
+ } finally {
+ this.manager.release( parser );
+ }
+ // import the fragment
+ Node importNode = resource.importNode(fragment, true);
+ if ( path.equals("") ) { // this is allowed in write
+ resource.appendChild(importNode);
+ message = "entire source overwritten";
+
+ } else {
+ // get the node
+ Node parent = XMLUtil.selectSingleNode(resource, path);
+ // add fragment
+ parent.appendChild(importNode);
+ message = "content appended to: " + path;
+ }
} else {
- message = "create not allowed";
- resource = null;/**/
+ message = "create not allowed";
+ resource = null;/**/
}
// write source
@@ -720,94 +720,94 @@
// use serializer
if (localSerializer == null) localSerializer = this.configuredSerializerName;
if (localSerializer != null) {
- // Lookup the Serializer
- ComponentSelector selector = null;
- Serializer serializer = null;
- OutputStream oStream = null;
- try {
- selector = (ComponentSelector)manager.lookup(Serializer.ROLE + "Selector");
- serializer = (Serializer)selector.select(localSerializer);
- oStream = ws.getOutputStream();
- serializer.setOutputStream(oStream);
- DOMStreamer streamer = new DOMStreamer(serializer);
- streamer.stream(resource);
- } finally {
- if (oStream != null) {
- oStream.flush();
- try {
- oStream.close();
- failed = false;
- } catch (Throwable t) {
- if (this.getLogger().isDebugEnabled() == true) {
- this.getLogger().debug("FAIL (oStream.close) exception"+t);
- throw new ProcessingException("Could not process your document.", t);
- }
- } finally {
- if ( selector != null ) {
- selector.release( serializer );
- this.manager.release( selector );
- }
- }
- }
- }
+ // Lookup the Serializer
+ ComponentSelector selector = null;
+ Serializer serializer = null;
+ OutputStream oStream = null;
+ try {
+ selector = (ComponentSelector)manager.lookup(Serializer.ROLE + "Selector");
+ serializer = (Serializer)selector.select(localSerializer);
+ oStream = ws.getOutputStream();
+ serializer.setOutputStream(oStream);
+ DOMStreamer streamer = new DOMStreamer(serializer);
+ streamer.stream(resource);
+ } finally {
+ if (oStream != null) {
+ oStream.flush();
+ try {
+ oStream.close();
+ failed = false;
+ } catch (Throwable t) {
+ if (this.getLogger().isDebugEnabled() == true) {
+ this.getLogger().debug("FAIL (oStream.close) exception"+t);
+ throw new ProcessingException("Could not process your document.", t);
+ }
+ } finally {
+ if ( selector != null ) {
+ selector.release( serializer );
+ this.manager.release( selector );
+ }
+ }
+ }
+ }
} else {
- if (this.getLogger().isDebugEnabled() == true) {
- this.getLogger().debug("ERROR no serializer");
- }
- //throw new ProcessingException("No serializer specified for writing to source " + systemID);
- message = "That source requires a serializer, please add the appropirate tag to your code.";
+ if (this.getLogger().isDebugEnabled() == true) {
+ this.getLogger().debug("ERROR no serializer");
+ }
+ //throw new ProcessingException("No serializer specified for writing to source " + systemID);
+ message = "That source requires a serializer, please add the appropirate tag to your code.";
}
}
- }
+ }
} catch (DOMException de) {
- if (this.getLogger().isDebugEnabled() == true) {
- this.getLogger().debug("FAIL exception: "+de);
- }
+ if (this.getLogger().isDebugEnabled() == true) {
+ this.getLogger().debug("FAIL exception: "+de);
+ }
//throw new ProcessingException("Could not process your document.", de);
message = "There was a problem manipulating your document: " + de;
} catch (ComponentException ce) {
- if (this.getLogger().isDebugEnabled() == true) {
- this.getLogger().debug("FAIL exception: "+ce);
- }
+ if (this.getLogger().isDebugEnabled() == true) {
+ this.getLogger().debug("FAIL exception: "+ce);
+ }
//throw new ProcessingException("Unable to lookup component.", ce);
message = "There was a problem looking up a component: " + ce;
} catch (SourceException se) {
- if (this.getLogger().isDebugEnabled() == true) {
- this.getLogger().debug("FAIL exception: "+se);
- }
+ if (this.getLogger().isDebugEnabled() == true) {
+ this.getLogger().debug("FAIL exception: "+se);
+ }
//throw new ProcessingException("Error during resolving "+systemID, se);
message = "There was a problem resolving that source: [" + systemID + "] : " + se;
} finally {
this.resolver.release( source );
}
-
- // Report result
- String result = (failed) ? RESULT_FAILED : RESULT_SUCCESS;
- String action = ACTION_NONE;
- if (!failed) { action = (exists) ? ACTION_OVER : ACTION_NEW; }
-
- sendStartElementEvent(RESULT_ELEMENT);
- sendStartElementEvent(EXECUTION_ELEMENT);
- sendTextEvent(result);
- sendEndElementEvent(EXECUTION_ELEMENT);
- sendStartElementEvent(MESSAGE_ELEMENT);
- sendTextEvent(message);
- sendEndElementEvent(MESSAGE_ELEMENT);
- sendStartElementEvent(BEHAVIOUR_ELEMENT);
- sendTextEvent(tagname);
- sendEndElementEvent(BEHAVIOUR_ELEMENT);
- sendStartElementEvent(ACTION_ELEMENT);
- sendTextEvent(action);
- sendEndElementEvent(ACTION_ELEMENT);
- sendStartElementEvent(SOURCE_ELEMENT);
- sendTextEvent(target);
- sendEndElementEvent(SOURCE_ELEMENT);
- if (localSerializer != null) {
- sendStartElementEvent(SERIALIZER_ELEMENT);
- sendTextEvent(localSerializer);
- sendEndElementEvent(SERIALIZER_ELEMENT);
- }
- sendEndElementEvent(RESULT_ELEMENT);
+
+ // Report result
+ String result = (failed) ? RESULT_FAILED : RESULT_SUCCESS;
+ String action = ACTION_NONE;
+ if (!failed) { action = (exists) ? ACTION_OVER : ACTION_NEW; }
+
+ sendStartElementEvent(RESULT_ELEMENT);
+ sendStartElementEvent(EXECUTION_ELEMENT);
+ sendTextEvent(result);
+ sendEndElementEvent(EXECUTION_ELEMENT);
+ sendStartElementEvent(MESSAGE_ELEMENT);
+ sendTextEvent(message);
+ sendEndElementEvent(MESSAGE_ELEMENT);
+ sendStartElementEvent(BEHAVIOUR_ELEMENT);
+ sendTextEvent(tagname);
+ sendEndElementEvent(BEHAVIOUR_ELEMENT);
+ sendStartElementEvent(ACTION_ELEMENT);
+ sendTextEvent(action);
+ sendEndElementEvent(ACTION_ELEMENT);
+ sendStartElementEvent(SOURCE_ELEMENT);
+ sendTextEvent(target);
+ sendEndElementEvent(SOURCE_ELEMENT);
+ if (localSerializer != null) {
+ sendStartElementEvent(SERIALIZER_ELEMENT);
+ sendTextEvent(localSerializer);
+ sendEndElementEvent(SERIALIZER_ELEMENT);
+ }
+ sendEndElementEvent(RESULT_ELEMENT);
if (this.getLogger().isDebugEnabled() == true) {
this.getLogger().debug("END insertFragment");
1.8 +3 -3 xml-cocoon2/src/java/org/apache/cocoon/xml/XMLUtils.java
Index: XMLUtils.java
===================================================================
RCS file: /home/cvs/xml-cocoon2/src/java/org/apache/cocoon/xml/XMLUtils.java,v
retrieving revision 1.7
retrieving revision 1.8
diff -u -r1.7 -r1.8
--- XMLUtils.java 8 May 2002 11:36:09 -0000 1.7
+++ XMLUtils.java 1 Jul 2002 14:43:17 -0000 1.8
@@ -215,7 +215,7 @@
}
// FIXME - for Xalan bug
- private static String stylesheet = "<?xml version=\"1.0\"?><xsl:stylesheet version=\"1.0\""+
+ public static String xalanBugStylesheet = "<?xml version=\"1.0\"?><xsl:stylesheet version=\"1.0\""+
" xmlns:xsl=\"http://www.w3.org/1999/XSL/Transform\">"+
"<xsl:template match=\"node()|@*\"><xsl:copy>"+
"<xsl:apply-templates select=\"node()|@*\"/>"+
@@ -233,7 +233,7 @@
Transformer transformer;
// transformer = TransformerFactory.newInstance().newTransformer();
// FIXME - This is a workaround for bug #5779 of Xalan
- transformer = TransformerFactory.newInstance().newTransformer(new StreamSource(new java.io.StringReader(stylesheet)));
+ transformer = TransformerFactory.newInstance().newTransformer(new StreamSource(new java.io.StringReader(xalanBugStylesheet)));
// End workaround
transformer.setOutputProperties(format);
transformer.transform(new DOMSource(node), new StreamResult(writer));
----------------------------------------------------------------------
In case of troubles, e-mail: webmaster@xml.apache.org
To unsubscribe, e-mail: cocoon-cvs-unsubscribe@xml.apache.org
For additional commands, e-mail: cocoon-cvs-help@xml.apache.org