You are viewing a plain text version of this content. The canonical link for it is here.
Posted to cvs@cocoon.apache.org by vg...@apache.org on 2005/08/30 19:13:41 UTC

svn commit: r264814 - in /cocoon/branches/BRANCH_2_1_X: src/java/org/apache/cocoon/transformation/SourceWritingTransformer.java status.xml

Author: vgritsenko
Date: Tue Aug 30 10:13:31 2005
New Revision: 264814

URL: http://svn.apache.org/viewcvs?rev=264814&view=rev
Log:
    <action dev="VG" type="update">
      SourceWritingTransformer supports all allowed nodes when using
      <code>source:write</code> to create new document.
    </action>


Modified:
    cocoon/branches/BRANCH_2_1_X/src/java/org/apache/cocoon/transformation/SourceWritingTransformer.java
    cocoon/branches/BRANCH_2_1_X/status.xml

Modified: cocoon/branches/BRANCH_2_1_X/src/java/org/apache/cocoon/transformation/SourceWritingTransformer.java
URL: http://svn.apache.org/viewcvs/cocoon/branches/BRANCH_2_1_X/src/java/org/apache/cocoon/transformation/SourceWritingTransformer.java?rev=264814&r1=264813&r2=264814&view=diff
==============================================================================
--- cocoon/branches/BRANCH_2_1_X/src/java/org/apache/cocoon/transformation/SourceWritingTransformer.java (original)
+++ cocoon/branches/BRANCH_2_1_X/src/java/org/apache/cocoon/transformation/SourceWritingTransformer.java Tue Aug 30 10:13:31 2005
@@ -42,6 +42,7 @@
 import org.w3c.dom.Document;
 import org.w3c.dom.DocumentFragment;
 import org.w3c.dom.Node;
+import org.w3c.dom.NodeList;
 import org.xml.sax.Attributes;
 import org.xml.sax.SAXException;
 
@@ -606,16 +607,18 @@
         String message = "";
         String target = systemID;
         try {
-            source = this.resolver.resolveURI( systemID );
-            if ( ! (source instanceof ModifiableSource)) {
-                throw new ProcessingException("Source '"+systemID+"' is not writeable.");
+            source = this.resolver.resolveURI(systemID);
+            if (! (source instanceof ModifiableSource)) {
+                throw new ProcessingException("Source '" + systemID + "' is not writeable.");
             }
-            ModifiableSource ws = (ModifiableSource)source;
+            ModifiableSource ws = (ModifiableSource) source;
             exists = ws.exists();
             target = source.getURI();
-            if ( exists && this.state == STATE_INSERT ) {
-                                message = "content inserted at: " + path;
-                resource = SourceUtil.toDOM( source );
+
+            // Insert?
+            if (exists && this.state == STATE_INSERT) {
+                message = "content inserted at: " + path;
+                resource = SourceUtil.toDOM(source);
                 // import the fragment
                 Node importNode = resource.importNode(fragment, true);
                 // get the node
@@ -626,20 +629,15 @@
                     try {
                         Node replaceNode = DOMUtil.getSingleNode(parent, replacePath, this.xpathProcessor);
                         // now get the parent of this node until it is the parent node for insertion
-                        while (replaceNode != null && replaceNode.getParentNode().equals(parent) == false) {
+                        while (replaceNode != null && !replaceNode.getParentNode().equals(parent)) {
                            replaceNode = replaceNode.getParentNode();
                         }
+
                         if (replaceNode != null) {
                             if (overwrite) {
                                 if (parent.getNodeType() == Node.DOCUMENT_NODE) {
                                     // replacing of the document element is not allowed
-                                    DOMParser parser = (DOMParser)this.manager.lookup(DOMParser.ROLE);
-                                    try {
-                                        resource = parser.createDocument();
-                                    } finally {
-                                        this.manager.release( parser );
-                                    }
-
+                                    resource = newDocument();
                                     resource.appendChild(resource.importNode(importNode, true));
                                     parent = resource;
                                     replaceNode = resource.importNode(replaceNode, true);
@@ -671,36 +669,63 @@
                 } else { // no replace path, just do an insert at end
                     parent.appendChild(importNode);
                 }
+
+            // Create?
             } else if (create) {
-                DOMParser parser = (DOMParser)this.manager.lookup(DOMParser.ROLE);
-                try {
-                    resource = parser.createDocument();
-                } finally {
-                    this.manager.release( parser );
-                }
-                // import the fragment
+                // Create new document
+                resource = newDocument();
+
+                // Import the fragment
                 Node importNode = resource.importNode(fragment, true);
-                if ( path.equals("") ) {  // this is allowed in write
-                    resource.appendChild(importNode.getFirstChild());
+
+                if (path.equals("")) {
+                    // Parent node is document itself
+                    NodeList nodes = importNode.getChildNodes();
+                    for (int i = 0; i < nodes.getLength();) {
+                        Node node = nodes.item(i);
+                        switch (node.getNodeType()) {
+                            case Node.ELEMENT_NODE:
+                                // May throw exception if fragment has more than one element
+                                resource.appendChild(node);
+                                break;
+
+                            case Node.DOCUMENT_TYPE_NODE:
+                            case Node.PROCESSING_INSTRUCTION_NODE:
+                            case Node.COMMENT_NODE:
+                                resource.appendChild(node);
+                                break;
+
+                            default:
+                                // Ignore all other nodes
+                                i++;
+                                break;
+                        }
+                    }
                     message = "entire source overwritten";
 
                 } else {
-                    // get the node
+                    // Get the parent node
                     Node parent = DOMUtil.selectSingleNode(resource, path, this.xpathProcessor);
-                    // add fragment
+                    // Add a fragment
                     parent.appendChild(importNode);
                     message = "content appended to: " + path;
                 }
+
+            // Oops: Document does not exist and create is not allowed.
             } else {
                 message = "create not allowed";
                 resource = null;/**/
             }
 
-            // write source
-            if ( resource != null) {
+
+            // Write source
+            if (resource != null) {
                 resource.normalize();
                 // use serializer
-                if (localSerializer == null) localSerializer = this.configuredSerializerName;
+                if (localSerializer == null) {
+                    localSerializer = this.configuredSerializerName;
+                }
+
                 if (localSerializer != null) {
                     // Lookup the Serializer
                     ServiceSelector selector = null;
@@ -725,16 +750,16 @@
                                 }
                                 throw new ProcessingException("Could not process your document.", t);
                             } finally {
-                                if ( selector != null ) {
-                                        selector.release( serializer );
-                                        this.manager.release( selector );
+                                if (selector != null) {
+                                    selector.release(serializer);
+                                    this.manager.release(selector);
                                 }
                             }
                         }
                     }
                 } else {
                     if (getLogger().isDebugEnabled()) {
-                        getLogger().debug("ERROR no serializer");
+                        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.";
@@ -756,15 +781,17 @@
             }
             message = "There was a problem resolving that source: [" + systemID + "] : " + se;
         } finally {
-            this.resolver.release( source );
+            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; }
+        if (!failed) {
+            action = (exists) ? ACTION_OVER : ACTION_NEW;
+        }
 
-        this.reportResult(localSerializer, tagname, message, target, result, action);
+        reportResult(localSerializer, tagname, message, target, result, action);
     }
 
     private void reportResult(String localSerializer,
@@ -798,13 +825,21 @@
         sendEndElementEvent(RESULT_ELEMENT);
     }
 
+    private Document newDocument() throws SAXException, ServiceException {
+        DOMParser parser = (DOMParser) this.manager.lookup(DOMParser.ROLE);
+        try {
+            return parser.createDocument();
+        } finally {
+            this.manager.release(parser);
+        }
+    }
 
     /* (non-Javadoc)
      * @see org.apache.avalon.framework.service.Serviceable#service(ServiceManager)
      */
     public void service(ServiceManager manager) throws ServiceException {
         super.service(manager);
-        this.xpathProcessor = (XPathProcessor)this.manager.lookup(XPathProcessor.ROLE);
+        this.xpathProcessor = (XPathProcessor) this.manager.lookup(XPathProcessor.ROLE);
     }
 
     /* (non-Javadoc)

Modified: cocoon/branches/BRANCH_2_1_X/status.xml
URL: http://svn.apache.org/viewcvs/cocoon/branches/BRANCH_2_1_X/status.xml?rev=264814&r1=264813&r2=264814&view=diff
==============================================================================
--- cocoon/branches/BRANCH_2_1_X/status.xml (original)
+++ cocoon/branches/BRANCH_2_1_X/status.xml Tue Aug 30 10:13:31 2005
@@ -197,6 +197,10 @@
   <changes>
   <release version="@version@" date="@date@">
     <action dev="VG" type="update">
+      SourceWritingTransformer supports all allowed nodes when using
+      <code>source:write</code> to create new document.
+    </action>
+    <action dev="VG" type="update">
       LocaleMatcher can save resulting locale into request, session or cookie
       (if configured).
     </action>