You are viewing a plain text version of this content. The canonical link for it is here.
Posted to cvs@cocoon.apache.org by gk...@apache.org on 2008/06/22 13:49:22 UTC

svn commit: r670345 - in /cocoon/trunk/blocks/cocoon-template/cocoon-template-impl/src: changes/ main/java/org/apache/cocoon/template/instruction/ test/java/org/apache/cocoon/template/jxtg/ test/resources/org/apache/cocoon/template/jxtg/

Author: gkossakowski
Date: Sun Jun 22 04:49:21 2008
New Revision: 670345

URL: http://svn.apache.org/viewvc?rev=670345&view=rev
Log:
COCOON-2212: Added check for name correctnes in jx:attribute.

Thanks to Kamal Bhatt for providing a patch.

Added:
    cocoon/trunk/blocks/cocoon-template/cocoon-template-impl/src/test/resources/org/apache/cocoon/template/jxtg/jxAttribute-failDueToEmptyName.xml
    cocoon/trunk/blocks/cocoon-template/cocoon-template-impl/src/test/resources/org/apache/cocoon/template/jxtg/jxAttribute-failDueToInvalidName.xml
Modified:
    cocoon/trunk/blocks/cocoon-template/cocoon-template-impl/src/changes/changes.xml
    cocoon/trunk/blocks/cocoon-template/cocoon-template-impl/src/main/java/org/apache/cocoon/template/instruction/Attribute.java
    cocoon/trunk/blocks/cocoon-template/cocoon-template-impl/src/test/java/org/apache/cocoon/template/jxtg/JXTemplateGeneratorTestCase.java

Modified: cocoon/trunk/blocks/cocoon-template/cocoon-template-impl/src/changes/changes.xml
URL: http://svn.apache.org/viewvc/cocoon/trunk/blocks/cocoon-template/cocoon-template-impl/src/changes/changes.xml?rev=670345&r1=670344&r2=670345&view=diff
==============================================================================
--- cocoon/trunk/blocks/cocoon-template/cocoon-template-impl/src/changes/changes.xml (original)
+++ cocoon/trunk/blocks/cocoon-template/cocoon-template-impl/src/changes/changes.xml Sun Jun 22 04:49:21 2008
@@ -28,6 +28,9 @@
       <action dev="gkossakowski" type="add" fixes-bug="COCOON-2211" due-to="Kamal Bhatt" due-to-email="bhatt@tt.com.au">
         Added support for jx:element - the instructions that allow dynamic element creation.
       </action>
+      <action dev="gkossakowski" type="add" fixes-bug="COCOON-2212" due-to="Kamal Bhatt" due-to-email="bhatt@tt.com.au">
+        Added check for name correctnes in jx:attribute.
+      </action>
     </release>
     <release version="1.0.0-RC1" date="2007-??-??" description="unreleased">  
       

Modified: cocoon/trunk/blocks/cocoon-template/cocoon-template-impl/src/main/java/org/apache/cocoon/template/instruction/Attribute.java
URL: http://svn.apache.org/viewvc/cocoon/trunk/blocks/cocoon-template/cocoon-template-impl/src/main/java/org/apache/cocoon/template/instruction/Attribute.java?rev=670345&r1=670344&r2=670345&view=diff
==============================================================================
--- cocoon/trunk/blocks/cocoon-template/cocoon-template-impl/src/main/java/org/apache/cocoon/template/instruction/Attribute.java (original)
+++ cocoon/trunk/blocks/cocoon-template/cocoon-template-impl/src/main/java/org/apache/cocoon/template/instruction/Attribute.java Sun Jun 22 04:49:21 2008
@@ -21,7 +21,6 @@
 
 import org.apache.cocoon.el.objectmodel.ObjectModel;
 import org.apache.cocoon.el.parsing.Subst;
-import org.apache.cocoon.template.JXTemplateGenerator;
 import org.apache.cocoon.template.environment.ExecutionContext;
 import org.apache.cocoon.template.environment.ParsingContext;
 import org.apache.cocoon.template.script.Invoker;
@@ -31,35 +30,28 @@
 import org.apache.cocoon.xml.ContentHandlerWrapper;
 import org.apache.cocoon.xml.XMLConsumer;
 import org.apache.cocoon.xml.util.NamespacesTable;
+import org.apache.commons.lang.StringUtils;
 import org.apache.xml.serialize.TextSerializer;
 import org.xml.sax.Attributes;
 import org.xml.sax.Locator;
 import org.xml.sax.SAXException;
 import org.xml.sax.SAXParseException;
-import org.xml.sax.helpers.AttributesImpl;
 
 /**
  * @version $Id$
  */
 public class Attribute extends Instruction {
-
+    public static  final String XML_ATTR_NAME_BLANK = "parameter: \"name\" is required";
+    public static final String XML_ATTR_NAME_INVALID = "parameter: \"name\" is an invalid XML attribute name";
+    
     private Subst name;
     private Subst value;
 
     public Attribute(ParsingContext parsingContext, StartElement raw, Attributes attrs, Stack stack)
             throws SAXException {
         super(raw);
-
-        Locator locator = getLocation();
-        String name = attrs.getValue("name");
-        if (name == null) {
-            throw new SAXParseException("parameter: \"name\" is required", locator, null);
-        }
-        this.name = parsingContext.getStringTemplateParser().compileExpr(name, "parameter: \"name\": ", locator);
-
-        String value = attrs.getValue("value");
-
-        this.value = parsingContext.getStringTemplateParser().compileExpr(value, "parameter: \"value\": ", locator);
+        this.name = getSubst("name", attrs, parsingContext, true);
+        this.value = getSubst("value", attrs, parsingContext, false);
     }
 
     public Event execute(final XMLConsumer consumer, ObjectModel objectModel,
@@ -70,13 +62,16 @@
         String valueStr = "";
         try {
             nameStr = this.name.getStringValue(objectModel);
-
+          
+            if (StringUtils.isBlank(nameStr))
+                throw new SAXParseException(XML_ATTR_NAME_BLANK, getLocation());
+
+            if (!nameStr.matches("[A-Za-z][^\\s:]*"))
+                throw new SAXParseException(XML_ATTR_NAME_INVALID, getLocation());  
+            
             if (this.value != null)
                 valueStr = this.value.getStringValue(objectModel);
             else {
-                final Attributes EMPTY_ATTRS = new AttributesImpl();
-                String elementName = "attribute";
-
                 TextSerializer serializer = new TextSerializer();
                 StringWriter writer = new StringWriter();
                 serializer.setOutputCharStream(writer);
@@ -84,23 +79,34 @@
                 ContentHandlerWrapper contentHandler = new ContentHandlerWrapper(serializer, serializer);
                 contentHandler.startDocument();
 
-                // TODO is root element necessary for TextSerializer?
-                contentHandler.startElement(JXTemplateGenerator.NS, elementName, elementName, EMPTY_ATTRS);
                 Invoker.execute(contentHandler, objectModel, executionContext, macroContext, namespaces, this.getNext(), this
                         .getEndInstruction());
-                contentHandler.endElement(JXTemplateGenerator.NS, elementName, elementName);
                 contentHandler.endDocument();
                 valueStr = writer.toString();
             }
         } catch (Exception exc) {
             throw new SAXParseException(exc.getMessage(), getLocation(), exc);
         }
-        if (consumer instanceof AttributeAwareXMLConsumer) {
+        if (consumer instanceof AttributeAwareXMLConsumer) {           
             AttributeAwareXMLConsumer c = (AttributeAwareXMLConsumer) consumer;
             c.attribute("", nameStr, nameStr, "CDATA", valueStr == null ? "" : valueStr);
         } else
             throw new SAXParseException("consumer is not attribute aware", getLocation());
+        
         return getEndInstruction().getNext();
     }
+    
+    private Subst getSubst(String attrName, Attributes attrs, ParsingContext parsingContext, boolean isRequired)
+            throws SAXParseException {
+        Locator locator = getLocation();
+        String value = attrs.getValue(attrName);
+        if (isRequired && value == null) {
+            throw new SAXParseException("parameter: \"" + attrName + "\" is required", locator, null);
+        } else if (!isRequired && value == null) {
+            return null;
+        }
+
+        return parsingContext.getStringTemplateParser().compileExpr(value, "parameter: \"" + attrName + "\": ", locator);
+    }     
 
 }

Modified: cocoon/trunk/blocks/cocoon-template/cocoon-template-impl/src/test/java/org/apache/cocoon/template/jxtg/JXTemplateGeneratorTestCase.java
URL: http://svn.apache.org/viewvc/cocoon/trunk/blocks/cocoon-template/cocoon-template-impl/src/test/java/org/apache/cocoon/template/jxtg/JXTemplateGeneratorTestCase.java?rev=670345&r1=670344&r2=670345&view=diff
==============================================================================
--- cocoon/trunk/blocks/cocoon-template/cocoon-template-impl/src/test/java/org/apache/cocoon/template/jxtg/JXTemplateGeneratorTestCase.java (original)
+++ cocoon/trunk/blocks/cocoon-template/cocoon-template-impl/src/test/java/org/apache/cocoon/template/jxtg/JXTemplateGeneratorTestCase.java Sun Jun 22 04:49:21 2008
@@ -28,6 +28,7 @@
 import org.xml.sax.SAXParseException;
 
 import org.apache.cocoon.template.instruction.Element;
+import org.apache.cocoon.template.instruction.Attribute;
 
 /**
  * @version SVN $Id$
@@ -185,6 +186,35 @@
         getNewObjectModel().cleanupLocalContext();
     }
 
+    public void testAttributeFailDueToEmptyName() throws Exception {
+	String inputURI = docBase + "jxAttribute-failDueToEmptyName.xml";
+        getNewObjectModel().markLocalContext();
+        boolean error = false;
+        
+        try {
+            generate(JX, inputURI, EMPTY_PARAMS);
+        } catch (SAXParseException e) {            
+            if (e.getMessage().equals(Attribute.XML_ATTR_NAME_BLANK))
+        	error = true;        
+        }
+        assertTrue("should throw sax exception due to empty name", error);      
+        getNewObjectModel().cleanupLocalContext();
+    }    
+    
+    public void testAttributeFailDueToInvalidName() throws Exception {
+	String inputURI = docBase + "jxAttribute-failDueToInvalidName.xml";
+        getNewObjectModel().markLocalContext();
+        boolean error = false;    
+        try {
+            generate(JX, inputURI, EMPTY_PARAMS);
+        } catch (SAXParseException e) {          
+            if (e.getMessage().equals(Attribute.XML_ATTR_NAME_INVALID))
+        	error = true;        
+        }
+        assertTrue("should throw sax exception due to invalid name", error);      
+        getNewObjectModel().cleanupLocalContext();
+    }    
+    
     public void testFormatDate() throws Exception {
         String inputURI = docBase + "formatDate.xml";
         String outputURI = docBase + "formatDate-output.xml";
@@ -269,7 +299,7 @@
         getNewObjectModel().cleanupLocalContext();
     }
 
-    public void testPrefixMappingFailDueToNoNameSpecified() throws Exception {
+    public void testElementFailDueToNoNameSpecified() throws Exception {
         String inputURI = docBase + "jxElement-noNameSpecified.xml";
         getNewObjectModel().markLocalContext();
         boolean error = false;
@@ -283,7 +313,7 @@
         getNewObjectModel().cleanupLocalContext();
     }
     
-    public void testPrefixMappingFailDueToInvalidNameSpecified() throws Exception {
+    public void testElementFailDueToInvalidNameSpecified() throws Exception {
         String inputURI = docBase + "jxElement-invalidNameSpecified.xml";
         getNewObjectModel().markLocalContext();
         boolean error = false;
@@ -298,7 +328,7 @@
         getNewObjectModel().cleanupLocalContext();
     }
     
-    public void testPrefixMappingFailDueToMissingNamespaceSpecifedPrefix() throws Exception {
+    public void testElementFailDueToMissingNamespaceSpecifedPrefix() throws Exception {
 	String inputURI = docBase + "jxElement-missingNamespacePrefixSpecified.xml";
         getNewObjectModel().markLocalContext();
         boolean error = false;
@@ -313,7 +343,7 @@
         getNewObjectModel().cleanupLocalContext();
     }    
     
-    public void testPrefixMappingFailDueToEmptyName() throws Exception {
+    public void testElementFailDueToEmptyName() throws Exception {
 	String inputURI = docBase + "jxElement-failDueToEmptyName.xml";
         getNewObjectModel().markLocalContext();
         boolean error = false;
@@ -328,7 +358,7 @@
         getNewObjectModel().cleanupLocalContext();
     }      
     
-    public void testPrefixMappingFailDueToInvalidPrefix() throws Exception {
+    public void testElementFailDueToInvalidPrefix() throws Exception {
 	String inputURI = docBase + "jxElement-failDueToInvalidPrefix.xml";
         getNewObjectModel().markLocalContext();
         boolean error = false;

Added: cocoon/trunk/blocks/cocoon-template/cocoon-template-impl/src/test/resources/org/apache/cocoon/template/jxtg/jxAttribute-failDueToEmptyName.xml
URL: http://svn.apache.org/viewvc/cocoon/trunk/blocks/cocoon-template/cocoon-template-impl/src/test/resources/org/apache/cocoon/template/jxtg/jxAttribute-failDueToEmptyName.xml?rev=670345&view=auto
==============================================================================
--- cocoon/trunk/blocks/cocoon-template/cocoon-template-impl/src/test/resources/org/apache/cocoon/template/jxtg/jxAttribute-failDueToEmptyName.xml (added)
+++ cocoon/trunk/blocks/cocoon-template/cocoon-template-impl/src/test/resources/org/apache/cocoon/template/jxtg/jxAttribute-failDueToEmptyName.xml Sun Jun 22 04:49:21 2008
@@ -0,0 +1,23 @@
+<?xml version="1.0"?>
+<!--
+  Licensed to the Apache Software Foundation (ASF) under one or more
+  contributor license agreements.  See the NOTICE file distributed with
+  this work for additional information regarding copyright ownership.
+  The ASF licenses this file to You under the Apache License, Version 2.0
+  (the "License"); you may not use this file except in compliance with
+  the License.  You may obtain a copy of the License at
+
+      http://www.apache.org/licenses/LICENSE-2.0
+
+  Unless required by applicable law or agreed to in writing, software
+  distributed under the License is distributed on an "AS IS" BASIS,
+  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  See the License for the specific language governing permissions and
+  limitations under the License.
+-->
+<root xmlns:jx="http://apache.org/cocoon/templates/jx/1.0">
+    <jx:set var="a" value=""/>
+    <one>
+      <jx:attribute name="${a}">asdf</jx:attribute>
+    </one>
+</root>

Added: cocoon/trunk/blocks/cocoon-template/cocoon-template-impl/src/test/resources/org/apache/cocoon/template/jxtg/jxAttribute-failDueToInvalidName.xml
URL: http://svn.apache.org/viewvc/cocoon/trunk/blocks/cocoon-template/cocoon-template-impl/src/test/resources/org/apache/cocoon/template/jxtg/jxAttribute-failDueToInvalidName.xml?rev=670345&view=auto
==============================================================================
--- cocoon/trunk/blocks/cocoon-template/cocoon-template-impl/src/test/resources/org/apache/cocoon/template/jxtg/jxAttribute-failDueToInvalidName.xml (added)
+++ cocoon/trunk/blocks/cocoon-template/cocoon-template-impl/src/test/resources/org/apache/cocoon/template/jxtg/jxAttribute-failDueToInvalidName.xml Sun Jun 22 04:49:21 2008
@@ -0,0 +1,23 @@
+<?xml version="1.0"?>
+<!--
+  Licensed to the Apache Software Foundation (ASF) under one or more
+  contributor license agreements.  See the NOTICE file distributed with
+  this work for additional information regarding copyright ownership.
+  The ASF licenses this file to You under the Apache License, Version 2.0
+  (the "License"); you may not use this file except in compliance with
+  the License.  You may obtain a copy of the License at
+
+      http://www.apache.org/licenses/LICENSE-2.0
+
+  Unless required by applicable law or agreed to in writing, software
+  distributed under the License is distributed on an "AS IS" BASIS,
+  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  See the License for the specific language governing permissions and
+  limitations under the License.
+-->
+<root xmlns:jx="http://apache.org/cocoon/templates/jx/1.0">
+  <jx:set var="a" value="Invalid Name"/>
+  <one>
+    <jx:attribute name="${a}">asdf</jx:attribute>
+  </one>
+</root>