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 2003/08/09 21:48:54 UTC
cvs commit: cocoon-2.1/src/java/org/apache/cocoon/transformation AbstractSAXTransformer.java
cziegeler 2003/08/09 12:48:54
Modified: src/java/org/apache/cocoon/transformation
AbstractSAXTransformer.java
Log:
Better namespace support for own transformers
Revision Changes Path
1.5 +72 -6 cocoon-2.1/src/java/org/apache/cocoon/transformation/AbstractSAXTransformer.java
Index: AbstractSAXTransformer.java
===================================================================
RCS file: /home/cvs/cocoon-2.1/src/java/org/apache/cocoon/transformation/AbstractSAXTransformer.java,v
retrieving revision 1.4
retrieving revision 1.5
diff -u -r1.4 -r1.5
--- AbstractSAXTransformer.java 19 Jun 2003 11:19:25 -0000 1.4
+++ AbstractSAXTransformer.java 9 Aug 2003 19:48:54 -0000 1.5
@@ -197,9 +197,11 @@
*/
protected AttributesImpl emptyAttributes = new AttributesImpl();
- /** The namespaces */
+ /** The namespaces and their prefixes */
private List namespaces = new ArrayList(5);
-
+ /** The current prefix for our namespace */
+ private String ourPrefix;
+
/**
* Avalon Configurable Interface
*/
@@ -270,6 +272,7 @@
this.parameters = null;
this.source = null;
this.namespaces.clear();
+ this.ourPrefix = null;
}
/**
@@ -739,6 +742,20 @@
* Send SAX events to the next pipeline component.
* The startElement event for the given element is send
* to the next component in the current pipeline.
+ * The element has the namespace of the transformer,
+ * but not attributes
+ * @param localname The name of the event.
+ */
+ public void sendStartElementEventNS(String localname)
+ throws SAXException {
+ this.startElement(this.namespaceURI,
+ localname, this.ourPrefix+':' + localname, emptyAttributes);
+ }
+
+ /**
+ * Send SAX events to the next pipeline component.
+ * The startElement event for the given element is send
+ * to the next component in the current pipeline.
* The element has no namespace.
* @param localname The name of the event.
* @param attr The Attributes of the element
@@ -750,6 +767,20 @@
/**
* Send SAX events to the next pipeline component.
+ * The startElement event for the given element is send
+ * to the next component in the current pipeline.
+ * The element has the namespace of the transformer.
+ * @param localname The name of the event.
+ * @param attr The Attributes of the element
+ */
+ public void sendStartElementEventNS(String localname, Attributes attr)
+ throws SAXException {
+ this.startElement(this.namespaceURI,
+ localname, this.ourPrefix+':' + localname, attr);
+ }
+
+ /**
+ * Send SAX events to the next pipeline component.
* The endElement event for the given element is send
* to the next component in the current pipeline.
* The element has no namespace.
@@ -762,6 +793,19 @@
/**
* Send SAX events to the next pipeline component.
+ * The endElement event for the given element is send
+ * to the next component in the current pipeline.
+ * The element has the namespace of the transformer.
+ * @param localname The name of the event.
+ */
+ public void sendEndElementEventNS(String localname)
+ throws SAXException {
+ this.endElement(this.namespaceURI,
+ localname, this.ourPrefix+':' + localname);
+ }
+
+ /**
+ * Send SAX events to the next pipeline component.
* The node is parsed and the events are send to
* the next component in the pipeline.
* @param node The tree to be included.
@@ -854,6 +898,9 @@
public void startPrefixMapping(String prefix, String uri)
throws SAXException {
if (prefix != null) this.namespaces.add(new String[] {prefix, uri});
+ if ( this.namespaceURI != null && this.namespaceURI.equals(uri)) {
+ this.ourPrefix = prefix;
+ }
if (this.ignoreEventsCount == 0) super.startPrefixMapping(prefix, uri);
}
@@ -868,18 +915,37 @@
int l = this.namespaces.size();
int i = l-1;
String currentPrefix;
- while (found == false && i >= 0) {
+ while (!found && i >= 0) {
currentPrefix = ((String[])this.namespaces.get(i))[0];
- if (currentPrefix.equals(prefix) == true) {
+ if (currentPrefix.equals(prefix)) {
found = true;
} else {
i--;
}
}
- if (found == false) {
+ if (!found) {
throw new SAXException("Namespace for prefix '"+ prefix + "' not found.");
}
this.namespaces.remove(i);
+ if ( prefix.equals(this.ourPrefix) ) {
+ this.ourPrefix = null;
+ // now search if we have a different prefix for our namespace
+ found = false;
+ l = this.namespaces.size();
+ i = l-1;
+ String currentNS;
+ while (!found && i >= 0) {
+ currentNS = ((String[])this.namespaces.get(i))[1];
+ if (currentNS.equals(this.namespaceURI)) {
+ found = true;
+ } else {
+ i--;
+ }
+ }
+ if ( found ) {
+ this.ourPrefix = ((String[])this.namespaces.get(i))[0];
+ }
+ }
}
if (this.ignoreEventsCount == 0) super.endPrefixMapping(prefix);
}