You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@mina.apache.org by ng...@apache.org on 2010/01/05 23:53:43 UTC

svn commit: r896258 - in /mina/sandbox/vysper/branches/nbxml-sax/src: main/java/org/apache/vysper/xml/fragment/ test/java/org/apache/vysper/xml/fragment/

Author: ngn
Date: Tue Jan  5 22:53:32 2010
New Revision: 896258

URL: http://svn.apache.org/viewvc?rev=896258&view=rev
Log:
Separate attributes and namespace declarations

Removed:
    mina/sandbox/vysper/branches/nbxml-sax/src/main/java/org/apache/vysper/xml/fragment/NamespaceAttribute.java
Modified:
    mina/sandbox/vysper/branches/nbxml-sax/src/main/java/org/apache/vysper/xml/fragment/AbstractXMLElementBuilder.java
    mina/sandbox/vysper/branches/nbxml-sax/src/main/java/org/apache/vysper/xml/fragment/FragmentFactory.java
    mina/sandbox/vysper/branches/nbxml-sax/src/main/java/org/apache/vysper/xml/fragment/Renderer.java
    mina/sandbox/vysper/branches/nbxml-sax/src/main/java/org/apache/vysper/xml/fragment/StackNamespaceResolver.java
    mina/sandbox/vysper/branches/nbxml-sax/src/main/java/org/apache/vysper/xml/fragment/XMLElement.java
    mina/sandbox/vysper/branches/nbxml-sax/src/main/java/org/apache/vysper/xml/fragment/XMLElementBuilder.java
    mina/sandbox/vysper/branches/nbxml-sax/src/test/java/org/apache/vysper/xml/fragment/RendererTestCase.java
    mina/sandbox/vysper/branches/nbxml-sax/src/test/java/org/apache/vysper/xml/fragment/StackNamespaceResolverTestCase.java

Modified: mina/sandbox/vysper/branches/nbxml-sax/src/main/java/org/apache/vysper/xml/fragment/AbstractXMLElementBuilder.java
URL: http://svn.apache.org/viewvc/mina/sandbox/vysper/branches/nbxml-sax/src/main/java/org/apache/vysper/xml/fragment/AbstractXMLElementBuilder.java?rev=896258&r1=896257&r2=896258&view=diff
==============================================================================
--- mina/sandbox/vysper/branches/nbxml-sax/src/main/java/org/apache/vysper/xml/fragment/AbstractXMLElementBuilder.java (original)
+++ mina/sandbox/vysper/branches/nbxml-sax/src/main/java/org/apache/vysper/xml/fragment/AbstractXMLElementBuilder.java Tue Jan  5 22:53:32 2010
@@ -21,7 +21,9 @@
 package org.apache.vysper.xml.fragment;
 
 import java.util.ArrayList;
+import java.util.HashMap;
 import java.util.List;
+import java.util.Map;
 import java.util.Stack;
 
 /**
@@ -36,6 +38,7 @@
         public ElementStruct parentElement = null;
         public XMLElement element = null;
         public List<Attribute> attributes = null;
+        public Map<String, String> namespaces = null;
         public List<XMLFragment> innerFragments = null;
     }
 
@@ -62,16 +65,17 @@
         stack.push(currentElement);
     }
 
-    public AbstractXMLElementBuilder(String elementName, String namespaceURI, String namespacePrefix, List<Attribute> attributes, List<XMLFragment> innerFragments) {
+    public AbstractXMLElementBuilder(String elementName, String namespaceURI, String namespacePrefix, List<Attribute> attributes, Map<String, String> namespaces, List<XMLFragment> innerFragments) {
         startNewElement(elementName, namespaceURI, namespacePrefix);
         resultingElement = currentElement.element;
         if(attributes != null) currentElement.attributes.addAll(attributes);
+        if(namespaces != null) currentElement.namespaces.putAll(namespaces);
         if(innerFragments != null) currentElement.innerFragments.addAll(innerFragments);
         stack.push(currentElement);
     }
     
-    protected XMLElement createElement(String namespaceURI, String name, String namespacePrefix, List<Attribute> attributes, List<XMLFragment> innerFragments) {
-    	return new XMLElement(namespaceURI, name, namespacePrefix, attributes, innerFragments);
+    protected XMLElement createElement(String namespaceURI, String name, String namespacePrefix, List<Attribute> attributes, Map<String, String> namespaces, List<XMLFragment> innerFragments) {
+    	return new XMLElement(namespaceURI, name, namespacePrefix, attributes, innerFragments, namespaces);
     }
     
     private void startNewElement(String name, String namespaceURI, String namespacePrefix) {
@@ -79,19 +83,15 @@
         // TODO handle the namespace, given by URI, currently always NULL in XMLElement constructors
         ElementStruct element = new ElementStruct();
         element.attributes = new ArrayList<Attribute>();
+        element.namespaces = new HashMap<String, String>();
         element.innerFragments = new ArrayList<XMLFragment>();
-        element.element = createElement(namespaceURI, name, namespacePrefix, element.attributes, element.innerFragments);
+        element.element = createElement(namespaceURI, name, namespacePrefix, element.attributes, element.namespaces, element.innerFragments);
 
         currentElement = element;
     }
     
-	public B addNamespaceAttribute(String value) {
-        addAttribute(new NamespaceAttribute(value));
-        return (B) this;
-    }
-
-    public B addNamespaceAttribute(String namespacePrefix, String value) {
-        addAttribute(new NamespaceAttribute(namespacePrefix, value));
+    public B declareNamespace(String namespacePrefix, String value) {
+        currentElement.namespaces.put(namespacePrefix, value);
         return (B) this;
     }
 

Modified: mina/sandbox/vysper/branches/nbxml-sax/src/main/java/org/apache/vysper/xml/fragment/FragmentFactory.java
URL: http://svn.apache.org/viewvc/mina/sandbox/vysper/branches/nbxml-sax/src/main/java/org/apache/vysper/xml/fragment/FragmentFactory.java?rev=896258&r1=896257&r2=896258&view=diff
==============================================================================
--- mina/sandbox/vysper/branches/nbxml-sax/src/main/java/org/apache/vysper/xml/fragment/FragmentFactory.java (original)
+++ mina/sandbox/vysper/branches/nbxml-sax/src/main/java/org/apache/vysper/xml/fragment/FragmentFactory.java Tue Jan  5 22:53:32 2010
@@ -34,7 +34,7 @@
     }
 
     public static XMLElement createElementWithInnerText(String namespaceURI, String name, String text) {
-        return new XMLElement(namespaceURI, name, null, null, asList(new XMLText(text)));
+        return new XMLElement(namespaceURI, name, null, null, asList(new XMLText(text)), null);
     }
 
     

Modified: mina/sandbox/vysper/branches/nbxml-sax/src/main/java/org/apache/vysper/xml/fragment/Renderer.java
URL: http://svn.apache.org/viewvc/mina/sandbox/vysper/branches/nbxml-sax/src/main/java/org/apache/vysper/xml/fragment/Renderer.java?rev=896258&r1=896257&r2=896258&view=diff
==============================================================================
--- mina/sandbox/vysper/branches/nbxml-sax/src/main/java/org/apache/vysper/xml/fragment/Renderer.java (original)
+++ mina/sandbox/vysper/branches/nbxml-sax/src/main/java/org/apache/vysper/xml/fragment/Renderer.java Tue Jan  5 22:53:32 2010
@@ -83,10 +83,8 @@
         	// nor normal attributes containing namespace declarations (probably due to
         	// the parser not correctly creating namespace attributes for these which are then 
         	// copied into for example error responses)
-        	if(!(attribute instanceof NamespaceAttribute) && !hasXmlnsReservedName(attribute)) {
-        		openElementBuffer.append(" ");
-        		renderAttribute(openElementBuffer, attribute, nsResolver);
-        	}
+    		openElementBuffer.append(" ");
+    		renderAttribute(openElementBuffer, attribute, nsResolver);
         }
         openElementBuffer.append(">");
 

Modified: mina/sandbox/vysper/branches/nbxml-sax/src/main/java/org/apache/vysper/xml/fragment/StackNamespaceResolver.java
URL: http://svn.apache.org/viewvc/mina/sandbox/vysper/branches/nbxml-sax/src/main/java/org/apache/vysper/xml/fragment/StackNamespaceResolver.java?rev=896258&r1=896257&r2=896258&view=diff
==============================================================================
--- mina/sandbox/vysper/branches/nbxml-sax/src/main/java/org/apache/vysper/xml/fragment/StackNamespaceResolver.java (original)
+++ mina/sandbox/vysper/branches/nbxml-sax/src/main/java/org/apache/vysper/xml/fragment/StackNamespaceResolver.java Tue Jan  5 22:53:32 2010
@@ -23,6 +23,7 @@
 import java.util.LinkedHashMap;
 import java.util.Map;
 import java.util.Stack;
+import java.util.Map.Entry;
 
 
 /**
@@ -47,21 +48,16 @@
 		Map<String, String> ns = new LinkedHashMap<String, String>();
 		if(!elements.isEmpty()) {
 			XMLElement topElm = elements.peek();
-			for(Attribute attribute : topElm.getAttributes()) {
-				if(attribute instanceof NamespaceAttribute) {
-					NamespaceAttribute nsAttr = (NamespaceAttribute) attribute;
-					ns.put(nsAttr.getPrefix(), nsAttr.getValue());
-				}
+			for(Entry<String, String> entry : topElm.getDeclaredNamespaces().entrySet()) {
+				ns.put(entry.getKey(), entry.getValue());
 			}
 			
 			// look for any generated prefixes for attributes
 			for(Attribute attribute : topElm.getAttributes()) {
-				if(!(attribute instanceof NamespaceAttribute)) {
-					String attrNs = attribute.getNamespaceUri();
-					if(attrNs.length() > 0 && resolvePrefix(attrNs, false) == null) {
-						// attribute is in a namespace, and that namespace is not declared
-						ns.put(resolvePrefix(attrNs), attrNs);						
-					}
+				String attrNs = attribute.getNamespaceUri();
+				if(attrNs.length() > 0 && resolvePrefix(attrNs, false) == null) {
+					// attribute is in a namespace, and that namespace is not declared
+					ns.put(resolvePrefix(attrNs), attrNs);						
 				}
 			}
 			
@@ -122,16 +118,7 @@
 	}
 	
 	private String resolveUri(XMLElement elm, String prefix) {
-		for(Attribute attribute : elm.getAttributes()) {
-			if(attribute instanceof NamespaceAttribute) {
-				NamespaceAttribute nsAttr = (NamespaceAttribute) attribute;
-				if(nsAttr.getPrefix().equals(prefix)) {
-					return nsAttr.getValue();
-				}
-			}
-		}
-		
-		return null;
+		return elm.getDeclaredNamespaces().get(prefix);
 	}
 	
 	public String resolvePrefix(String uri) {
@@ -166,12 +153,9 @@
 	}
 	
 	private String resolvePrefix(XMLElement elm, String uri) {
-		for(Attribute attribute : elm.getAttributes()) {
-			if(attribute instanceof NamespaceAttribute) {
-				NamespaceAttribute nsAttr = (NamespaceAttribute) attribute;
-				if(nsAttr.getValue().equals(uri)) {
-					return nsAttr.getPrefix();
-				}
+		for(Entry<String, String> entry : elm.getDeclaredNamespaces().entrySet()) {
+			if(entry.getValue().equals(uri)) {
+				return entry.getKey();
 			}
 		}
 		

Modified: mina/sandbox/vysper/branches/nbxml-sax/src/main/java/org/apache/vysper/xml/fragment/XMLElement.java
URL: http://svn.apache.org/viewvc/mina/sandbox/vysper/branches/nbxml-sax/src/main/java/org/apache/vysper/xml/fragment/XMLElement.java?rev=896258&r1=896257&r2=896258&view=diff
==============================================================================
--- mina/sandbox/vysper/branches/nbxml-sax/src/main/java/org/apache/vysper/xml/fragment/XMLElement.java (original)
+++ mina/sandbox/vysper/branches/nbxml-sax/src/main/java/org/apache/vysper/xml/fragment/XMLElement.java Tue Jan  5 22:53:32 2010
@@ -46,18 +46,28 @@
     private String namespacePrefix;
 
     private List<Attribute> attributes;
+    private Map<String, String> namespaces;
     private List<XMLFragment> innerFragments;
     protected XMLElementVerifier xmlElementVerifier;
 
     public XMLElement(String namespaceURI, String name, String namespacePrefix, Attribute[] attributes, XMLFragment[] innerFragments) {
-        this(namespaceURI, name, namespacePrefix, FragmentFactory.asList(attributes), FragmentFactory.asList(innerFragments));
+        this(namespaceURI, name, namespacePrefix, attributes, innerFragments, null);
+    }
+    
+    public XMLElement(String namespaceURI, String name, String namespacePrefix, Attribute[] attributes, XMLFragment[] innerFragments, Map<String, String> namespaces) {
+        this(namespaceURI, name, namespacePrefix, FragmentFactory.asList(attributes), FragmentFactory.asList(innerFragments), namespaces);
     }
 
     public XMLElement(String namespaceURI, String name, String namespacePrefix, List<Attribute> attributes, List<XMLFragment> innerFragments) {
+    	this(namespaceURI, name, namespacePrefix, attributes, innerFragments, null);
+    }
+    
+    public XMLElement(String namespaceURI, String name, String namespacePrefix, List<Attribute> attributes, List<XMLFragment> innerFragments, Map<String, String> namespaces) {
         this.namespaceURI = namespaceURI == null ? Namespaces.DEFAULT_NAMESPACE_URI : namespaceURI;
     	this.namespacePrefix = namespacePrefix == null ? Namespaces.DEFAULT_NAMESPACE_PREFIX : namespacePrefix;
         this.name = name;
         this.attributes = (attributes == null) ? Collections.EMPTY_LIST : Collections.unmodifiableList(attributes);
+        this.namespaces = (namespaces == null) ? Collections.EMPTY_MAP : Collections.unmodifiableMap(namespaces);
         this.innerFragments = (innerFragments == null) ? Collections.EMPTY_LIST : Collections.unmodifiableList(innerFragments);
         if (name == null) throw new IllegalArgumentException("XMLElement name cannot be null");
     }
@@ -111,6 +121,9 @@
         else return attribute.getValue();
     }
 
+    public Map<String, String> getDeclaredNamespaces() {
+    	return namespaces;
+    }
     
     public String getXMLLang() {
         return getAttributeValue(Namespaces.XML, "lang");

Modified: mina/sandbox/vysper/branches/nbxml-sax/src/main/java/org/apache/vysper/xml/fragment/XMLElementBuilder.java
URL: http://svn.apache.org/viewvc/mina/sandbox/vysper/branches/nbxml-sax/src/main/java/org/apache/vysper/xml/fragment/XMLElementBuilder.java?rev=896258&r1=896257&r2=896258&view=diff
==============================================================================
--- mina/sandbox/vysper/branches/nbxml-sax/src/main/java/org/apache/vysper/xml/fragment/XMLElementBuilder.java (original)
+++ mina/sandbox/vysper/branches/nbxml-sax/src/main/java/org/apache/vysper/xml/fragment/XMLElementBuilder.java Tue Jan  5 22:53:32 2010
@@ -21,6 +21,7 @@
 package org.apache.vysper.xml.fragment;
 
 import java.util.List;
+import java.util.Map;
 
 
 /**
@@ -43,8 +44,14 @@
     }
 
 	public XMLElementBuilder(String elementName, String namespaceURI,
-			String namespacePrefix, List<Attribute> attributes,
+			String namespacePrefix, List<Attribute> attributes, 
 			List<XMLFragment> innerFragments) {
-		super(elementName, namespaceURI, namespacePrefix, attributes, innerFragments);
+		super(elementName, namespaceURI, namespacePrefix, attributes, null, innerFragments);
+	}
+    
+	public XMLElementBuilder(String elementName, String namespaceURI,
+			String namespacePrefix, List<Attribute> attributes, Map<String, String> namespaces,
+			List<XMLFragment> innerFragments) {
+		super(elementName, namespaceURI, namespacePrefix, attributes, namespaces, innerFragments);
 	}
 }

Modified: mina/sandbox/vysper/branches/nbxml-sax/src/test/java/org/apache/vysper/xml/fragment/RendererTestCase.java
URL: http://svn.apache.org/viewvc/mina/sandbox/vysper/branches/nbxml-sax/src/test/java/org/apache/vysper/xml/fragment/RendererTestCase.java?rev=896258&r1=896257&r2=896258&view=diff
==============================================================================
--- mina/sandbox/vysper/branches/nbxml-sax/src/test/java/org/apache/vysper/xml/fragment/RendererTestCase.java (original)
+++ mina/sandbox/vysper/branches/nbxml-sax/src/test/java/org/apache/vysper/xml/fragment/RendererTestCase.java Tue Jan  5 22:53:32 2010
@@ -19,14 +19,8 @@
  */
 package org.apache.vysper.xml.fragment;
 
-import org.apache.vysper.xml.fragment.Attribute;
-import org.apache.vysper.xml.fragment.NamespaceAttribute;
-import org.apache.vysper.xml.fragment.Namespaces;
-import org.apache.vysper.xml.fragment.Renderer;
-import org.apache.vysper.xml.fragment.XMLElement;
-import org.apache.vysper.xml.fragment.XMLElementBuilder;
-import org.apache.vysper.xml.fragment.XMLFragment;
-import org.apache.vysper.xml.fragment.XMLText;
+import java.util.HashMap;
+import java.util.Map;
 
 import junit.framework.TestCase;
 
@@ -68,8 +62,7 @@
 	public void testRenderNamespacedAttribute() {
 		XMLElement elm = new XMLElement(null, "foo", null, new Attribute[]{
 				new Attribute("http://example.com", "attr1", "value1"),
-				new NamespaceAttribute("pr1", "http://example.com")
-				}, null);
+				}, null, nsMap("pr1", "http://example.com"));
 		assertRendering("<foo xmlns:pr1=\"http://example.com\" pr1:attr1=\"value1\"></foo>", elm);
 	}
 
@@ -100,22 +93,26 @@
 //		assertRendering("<foo attr=\"value\" />", elm);
 //	}
 	
+	private Map<String, String> nsMap(String... ns) {
+		Map<String, String> nsMap = new HashMap<String, String>();
+		for(int i = 1; i < ns.length; i += 2) {
+			nsMap.put(ns[i - 1], ns[i]);
+		}
+		return nsMap;
+	}
+	
 	public void testRenderNonNamespaceElement() {
 		XMLElement elm = new XMLElement(null, "foo", null, (Attribute[])null, null);
 		assertRendering("<foo></foo>", elm);
 	}
 	
 	public void testRenderDefaultNamespaceElement() {
-		XMLElement elm = new XMLElement(null, "foo", null, new Attribute[]{
-				new NamespaceAttribute("http://example.com")
-		}, null);
+		XMLElement elm = new XMLElement(null, "foo", null, (Attribute[])null, null, nsMap("", "http://example.com"));
 		assertRendering("<foo xmlns=\"http://example.com\"></foo>", elm);
 	}
 
 	public void testRenderPrefixedNamespaceWithDeclarationElement() {
-		XMLElement elm = new XMLElement("http://example.com", "foo", "pr", new Attribute[]{
-				new NamespaceAttribute("pr", "http://example.com")
-		}, null);
+		XMLElement elm = new XMLElement("http://example.com", "foo", "pr", (Attribute[])null, null, nsMap("pr", "http://example.com"));
 		assertRendering("<pr:foo xmlns:pr=\"http://example.com\"></pr:foo>", elm);
 	}
 
@@ -126,13 +123,13 @@
 
 	public void testRenderDeclaredNamespaceElement() {
 		XMLElementBuilder builder = new XMLElementBuilder("foo", "http://example.com");
-		builder.addNamespaceAttribute("pr", "http://example.com");
+		builder.declareNamespace("pr", "http://example.com");
 		assertRendering("<pr:foo xmlns:pr=\"http://example.com\"></pr:foo>", builder.build());
 	}
 
 	public void testRenderInnerNamespacedElement() {
 		XMLElementBuilder builder = new XMLElementBuilder("foo", "http://example.com");
-		builder.addNamespaceAttribute("pr", "http://other.com");
+		builder.declareNamespace("pr", "http://other.com");
 		builder.startInnerElement("bar", "http://other.com");
 		assertRendering("<foo xmlns:pr=\"http://other.com\" xmlns=\"http://example.com\"><pr:bar></pr:bar></foo>", builder.build());
 	}

Modified: mina/sandbox/vysper/branches/nbxml-sax/src/test/java/org/apache/vysper/xml/fragment/StackNamespaceResolverTestCase.java
URL: http://svn.apache.org/viewvc/mina/sandbox/vysper/branches/nbxml-sax/src/test/java/org/apache/vysper/xml/fragment/StackNamespaceResolverTestCase.java?rev=896258&r1=896257&r2=896258&view=diff
==============================================================================
--- mina/sandbox/vysper/branches/nbxml-sax/src/test/java/org/apache/vysper/xml/fragment/StackNamespaceResolverTestCase.java (original)
+++ mina/sandbox/vysper/branches/nbxml-sax/src/test/java/org/apache/vysper/xml/fragment/StackNamespaceResolverTestCase.java Tue Jan  5 22:53:32 2010
@@ -35,8 +35,8 @@
 
 	public void testPushSingleElement() {
 		XMLElement elm = new XMLElementBuilder("foo")
-			.addNamespaceAttribute("pr1", "url1")
-			.addNamespaceAttribute("pr2", "url2").build();
+			.declareNamespace("pr1", "url1")
+			.declareNamespace("pr2", "url2").build();
 		
 		resolver.push(elm);
 		
@@ -70,8 +70,8 @@
 	
 	public void testPushSingleNamespacedElement() {
 		XMLElement elm = new XMLElementBuilder("foo", "defaulturl")
-			.addNamespaceAttribute("pr1", "url1")
-			.addNamespaceAttribute("pr2", "url2").build();
+			.declareNamespace("pr1", "url1")
+			.declareNamespace("pr2", "url2").build();
 		
 		resolver.push(elm);
 		
@@ -103,7 +103,7 @@
 
 	public void testPrefixedInheritance() {
 		XMLElement elm = new XMLElementBuilder("foo", "url1")
-		.addNamespaceAttribute("pr1", "url1")
+		.declareNamespace("pr1", "url1")
 		.build();
 		XMLElement innerElm = new XMLElementBuilder("inner", "url1").build();