blob: 7500af6cffa351bdc9113aa6ddff902087cd6ff7 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2010 Florian Thienel and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* Florian Thienel - initial API and implementation
*******************************************************************************/
package org.eclipse.vex.core.internal.dom;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertNull;
import static org.junit.Assert.assertTrue;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import javax.xml.parsers.ParserConfigurationException;
import org.eclipse.core.runtime.QualifiedName;
import org.eclipse.vex.core.internal.io.DocumentReader;
import org.eclipse.vex.core.internal.io.DocumentWriter;
import org.eclipse.vex.core.provisional.dom.IAttribute;
import org.eclipse.vex.core.provisional.dom.IDocument;
import org.eclipse.vex.core.provisional.dom.IElement;
import org.junit.Test;
import org.xml.sax.SAXException;
/**
* @author Florian Thienel
*/
public class NamespaceTest {
@Test
public void attributeQualifiedName() throws Exception {
final IAttribute attributeWithoutNamespace = new Attribute(null, "localName", "value");
assertEquals("localName", attributeWithoutNamespace.getQualifiedName().toString());
final IAttribute attributeWithNamespace = new Attribute(null, new QualifiedName("http://namespace/uri", "localName"), "value");
assertEquals("http://namespace/uri:localName", attributeWithNamespace.getQualifiedName().toString());
}
@Test
public void declareNamespace() throws Exception {
final IElement element = new Element("element");
assertNull(element.getNamespaceURI("nsPrefix"));
assertNull(element.getNamespacePrefix("http://namespace/uri"));
element.declareNamespace("nsPrefix", "http://namespace/uri");
assertEquals("http://namespace/uri", element.getNamespaceURI("nsPrefix"));
assertEquals("nsPrefix", element.getNamespacePrefix("http://namespace/uri"));
}
@Test
public void transitiveNamespaceDeclaration() throws Exception {
final Element parent = new Element("parent");
final Element child = new Element("child");
child.setParent(parent);
assertNull(child.getNamespaceURI("nsPrefix"));
assertNull(child.getNamespacePrefix("http://namespace/uri"));
parent.declareNamespace("nsPrefix", "http://namespace/uri");
assertEquals("http://namespace/uri", child.getNamespaceURI("nsPrefix"));
assertEquals("nsPrefix", child.getNamespacePrefix("http://namespace/uri"));
}
@Test
public void removeNamespaceDeclaration() throws Exception {
final IElement element = new Element("element");
element.declareNamespace("nsPrefix", "http://namespace/uri");
assertEquals("http://namespace/uri", element.getNamespaceURI("nsPrefix"));
assertEquals("nsPrefix", element.getNamespacePrefix("http://namespace/uri"));
element.removeNamespace("nsPrefix");
assertNull(element.getNamespaceURI("nsPrefix"));
assertNull(element.getNamespacePrefix("http://namespace/uri"));
}
@Test
public void overloadNamespaceDeclaration() throws Exception {
final IElement element = new Element("element");
element.declareNamespace("nsPrefix", "http://namespace/uri");
element.declareNamespace("nsPrefix2", "http://namespace/uri");
assertEquals("http://namespace/uri", element.getNamespaceURI("nsPrefix"));
assertEquals("http://namespace/uri", element.getNamespaceURI("nsPrefix2"));
assertNotNull(element.getNamespacePrefix("http://namespace/uri"));
}
@Test
public void overrideNamespaceDeclaration() throws Exception {
final Element parent = new Element("parent");
final Element child = new Element("child");
child.setParent(parent);
parent.declareNamespace("nsPrefix", "http://namespace/uri");
assertEquals("http://namespace/uri", child.getNamespaceURI("nsPrefix"));
assertEquals("nsPrefix", child.getNamespacePrefix("http://namespace/uri"));
child.declareNamespace("nsPrefix", "http://namespace2/uri");
assertNull(child.getNamespacePrefix("http://namespace/uri"));
assertEquals("http://namespace2/uri", child.getNamespaceURI("nsPrefix"));
assertEquals("nsPrefix", child.getNamespacePrefix("http://namespace2/uri"));
}
@Test
public void ignoreEmptyNamespaceURI() throws Exception {
final IElement element = new Element("element");
element.declareNamespace("nsPrefix", null);
assertNull(element.getNamespaceURI("nsPrefix"));
assertNull(element.getNamespacePrefix(null));
element.declareNamespace("nsPrefix", "");
assertNull(element.getNamespaceURI("nsPrefix"));
assertNull(element.getNamespacePrefix(""));
element.declareNamespace("nsPrefix", " ");
assertNull(element.getNamespaceURI("nsPrefix"));
assertNull(element.getNamespacePrefix(" "));
assertNull(element.getNamespacePrefix(""));
}
@Test
public void handleDefaultNamespace() throws Exception {
final IElement element = new Element("element");
assertNull(element.getDefaultNamespaceURI());
element.declareDefaultNamespace("http://namespace/uri");
assertEquals("http://namespace/uri", element.getDefaultNamespaceURI());
}
@Test
public void getDeclaredDefaultNamespaceURI() throws Exception {
final Element element = new Element("element");
final Element child = new Element("child");
element.addChild(child);
assertNull(element.getDeclaredDefaultNamespaceURI());
element.declareDefaultNamespace("http://namespace/default/element");
assertEquals("http://namespace/default/element", element.getDeclaredDefaultNamespaceURI());
assertNull(child.getDeclaredDefaultNamespaceURI());
child.declareDefaultNamespace("http://namespace/default/child");
assertEquals("http://namespace/default/child", child.getDeclaredDefaultNamespaceURI());
}
@Test
public void getDeclaredNamespacePrefixes() throws Exception {
final Element element = new Element("element");
final Element child = new Element("child");
element.addChild(child);
assertTrue(element.getDeclaredNamespacePrefixes().isEmpty());
element.declareDefaultNamespace("http://namespace/default/element");
assertTrue(element.getDeclaredNamespacePrefixes().isEmpty());
element.declareNamespace("ns1", "http://namespace/uri/1");
assertEquals(1, element.getDeclaredNamespacePrefixes().size());
assertTrue(element.getDeclaredNamespacePrefixes().contains("ns1"));
element.declareNamespace("ns2", "http://namespace/uri/2");
assertEquals(2, element.getDeclaredNamespacePrefixes().size());
assertTrue(element.getDeclaredNamespacePrefixes().contains("ns1"));
assertTrue(element.getDeclaredNamespacePrefixes().contains("ns2"));
assertTrue(child.getDeclaredNamespacePrefixes().isEmpty());
child.declareNamespace("ns3", "http://namespace/uri/3");
assertEquals(1, child.getDeclaredNamespacePrefixes().size());
assertTrue(child.getDeclaredNamespacePrefixes().contains("ns3"));
}
@Test
public void elementLocalName() throws Exception {
final IElement elementWithoutNamespace = new Element("localName");
assertEquals("localName", elementWithoutNamespace.getLocalName());
final IElement elementWithNamespace = new Element(new QualifiedName("http://namespace/uri", "localName"));
assertEquals("localName", elementWithNamespace.getLocalName());
}
@Test
public void elementQualifiedName() throws Exception {
final IElement elementWithoutNamespace = new Element("localName");
assertEquals("localName", elementWithoutNamespace.getQualifiedName().toString());
final IElement elementWithNamespace = new Element(new QualifiedName("http://namespace/uri", "localName"));
assertEquals("http://namespace/uri:localName", elementWithNamespace.getQualifiedName().toString());
}
@Test
public void elementPrefix() throws Exception {
final IElement elementWithoutNamespace = new Element("element");
assertNull(elementWithoutNamespace.getPrefix());
final IElement elementWithNamespace = new Element(new QualifiedName("http://namespace/uri", "element"));
elementWithNamespace.declareNamespace("nsPrefix", "http://namespace/uri");
assertEquals("nsPrefix", elementWithNamespace.getPrefix());
final IElement elementWithDefaultNamespace = new Element(new QualifiedName("http://namespace/uri", "element"));
elementWithDefaultNamespace.declareDefaultNamespace("http://namespace/uri");
assertNull(elementWithDefaultNamespace.getPrefix());
}
@Test
public void elementPrefixedName() throws Exception {
final IElement elementWithoutNamespace = new Element("element");
assertEquals("element", elementWithoutNamespace.getPrefixedName());
final IElement elementWithNamespace = new Element(new QualifiedName("http://namespace/uri", "element"));
elementWithNamespace.declareNamespace("nsPrefix", "http://namespace/uri");
assertEquals("nsPrefix:element", elementWithNamespace.getPrefixedName());
final IElement elementWithDefaultNamespace = new Element(new QualifiedName("http://namespace/uri", "element"));
elementWithDefaultNamespace.declareDefaultNamespace("http://namespace/uri");
assertEquals("element", elementWithDefaultNamespace.getPrefixedName());
}
@Test
public void attributePrefixedName() throws Exception {
final IElement element = new Element(new QualifiedName("http://namespace/uri/1", "element"));
element.declareDefaultNamespace("http://namespace/uri/default");
element.declareNamespace("ns1", "http://namespace/uri/1");
element.declareNamespace("ns2", "http://namespace/uri/2");
element.setAttribute("attribute1", "value1");
element.setAttribute(new QualifiedName("http://namespace/uri/1", "attribute2"), "value2");
element.setAttribute(new QualifiedName("http://namespace/uri/2", "attribute3"), "value3");
assertEquals("attribute1", element.getAttribute("attribute1").getPrefixedName());
assertEquals("attribute2", element.getAttribute(new QualifiedName("http://namespace/uri/1", "attribute2")).getPrefixedName());
assertEquals("ns2:attribute3", element.getAttribute(new QualifiedName("http://namespace/uri/2", "attribute3")).getPrefixedName());
}
@Test
public void readNamespaceDeclarations() throws Exception {
final IDocument document = readDocumentFromString("<ns1:a xmlns=\"http://namespace/default\" xmlns:ns1=\"http://namespace/uri/1\"/>");
final IElement rootElement = document.getRootElement();
assertEquals("http://namespace/default", rootElement.getDefaultNamespaceURI());
assertEquals("http://namespace/uri/1", rootElement.getNamespaceURI("ns1"));
}
private IDocument readDocumentFromString(final String documentContent) throws IOException, ParserConfigurationException, SAXException {
return new DocumentReader().read(documentContent);
}
@Test
public void readNestedNamespaceDeclarations() throws Exception {
final IDocument document = readDocumentFromString("<ns1:a xmlns=\"http://namespace/default\" xmlns:ns1=\"http://namespace/uri/1\">" + "<ns2:b xmlns:ns2=\"http://namespace/uri/2\"/>"
+ "</ns1:a>");
final IElement rootElement = document.getRootElement();
final IElement nestedElement = rootElement.childElements().first();
assertEquals("http://namespace/default", nestedElement.getDefaultNamespaceURI());
assertEquals("http://namespace/uri/1", nestedElement.getNamespaceURI("ns1"));
assertEquals("http://namespace/uri/2", nestedElement.getNamespaceURI("ns2"));
assertNull(rootElement.getNamespaceURI("ns2"));
}
@Test
public void evaluateElementPrefix() throws Exception {
final IDocument document = readDocumentFromString("<ns1:a xmlns=\"http://namespace/default\" xmlns:ns1=\"http://namespace/uri/1\">" + "<ns2:b xmlns:ns2=\"http://namespace/uri/2\"/>" + "<c />"
+ "</ns1:a>");
final IElement rootElement = document.getRootElement();
assertEquals("http://namespace/uri/1", rootElement.getQualifiedName().getQualifier());
assertEquals("a", rootElement.getLocalName());
assertEquals("ns1:a", rootElement.getPrefixedName());
final IElement firstNestedElement = rootElement.childElements().first();
assertEquals("http://namespace/uri/2", firstNestedElement.getQualifiedName().getQualifier());
assertEquals("b", firstNestedElement.getLocalName());
assertEquals("ns2:b", firstNestedElement.getPrefixedName());
final IElement secondNestedElement = rootElement.childElements().get(1);
assertEquals("http://namespace/default", secondNestedElement.getQualifiedName().getQualifier());
assertEquals("c", secondNestedElement.getLocalName());
assertEquals("c", secondNestedElement.getPrefixedName());
}
@Test
public void evaluateAttributePrefix() throws Exception {
final IDocument document = readDocumentFromString("<ns1:a xmlns=\"http://namespace/default\" xmlns:ns1=\"http://namespace/uri/1\" attr1=\"value1\">"
+ "<ns2:b xmlns:ns2=\"http://namespace/uri/2\" ns1:attr2=\"value2\" ns2:attr3=\"value3\" attr4=\"value4\" />" + "<c ns1:attr5=\"value5\" attr6=\"value6\" />" + "</ns1:a>");
final IElement rootElement = document.getRootElement();
assertTrue(rootElement.getAttributeNames().contains(new QualifiedName("http://namespace/uri/1", "attr1")));
assertFalse(rootElement.getAttributeNames().contains(new QualifiedName("http://namespace/default", "attr1")));
assertFalse(rootElement.getAttributeNames().contains(new QualifiedName("", "attr1")));
assertFalse(rootElement.getAttributeNames().contains(new QualifiedName(null, "attr1")));
final IElement firstNestedElement = rootElement.childElements().first();
assertTrue(firstNestedElement.getAttributeNames().contains(new QualifiedName("http://namespace/uri/1", "attr2")));
assertTrue(firstNestedElement.getAttributeNames().contains(new QualifiedName("http://namespace/uri/2", "attr3")));
assertTrue(firstNestedElement.getAttributeNames().contains(new QualifiedName("http://namespace/uri/2", "attr4")));
final IElement secondNestedElement = rootElement.childElements().get(1);
assertTrue(secondNestedElement.getAttributeNames().contains(new QualifiedName("http://namespace/uri/1", "attr5")));
assertTrue(secondNestedElement.getAttributeNames().contains(new QualifiedName("http://namespace/default", "attr6")));
}
@Test
public void readWriteCycle() throws Exception {
final String inputContent = "<?xml version='1.0' encoding='UTF-8'?> <ns1:a xmlns=\"http://namespace/default\" xmlns:ns1=\"http://namespace/uri/1\" attr1=\"value1\"> "
+ "<ns2:b xmlns:ns2=\"http://namespace/uri/2\" ns1:attr2=\"value2\" attr3=\"value3\"/> " + "<c attr4=\"value4\" ns1:attr5=\"value5\"/>" + "</ns1:a> ";
final IDocument document = readDocumentFromString(inputContent);
final DocumentWriter documentWriter = new DocumentWriter();
final ByteArrayOutputStream buffer = new ByteArrayOutputStream();
documentWriter.write(document, buffer);
final String outputContent = new String(buffer.toByteArray()).replaceAll("\\s+", " ");
assertEquals(inputContent, outputContent);
}
@Test
public void allVisibleNamespacePrefixes() throws Exception {
final Element parent = new Element("parent");
final Element element = new Element("element");
final Element child = new Element("child");
parent.addChild(element);
parent.declareDefaultNamespace("http://namespace/uri/parent/default");
parent.declareNamespace("ns1", "http://namespace/uri/1");
parent.declareNamespace("ns2", "http://namespace/uri/2");
element.addChild(child);
element.declareNamespace("ns3", "http://namespace/uri/3");
element.declareNamespace("ns1", "http://namespace/uri/1a");
child.declareDefaultNamespace("http://namespace/uri/child/default");
assertEquals(2, parent.getNamespacePrefixes().size());
assertTrue(parent.getNamespacePrefixes().contains("ns1"));
assertTrue(parent.getNamespacePrefixes().contains("ns2"));
assertEquals(3, element.getNamespacePrefixes().size());
assertTrue(element.getNamespacePrefixes().contains("ns1"));
assertTrue(element.getNamespacePrefixes().contains("ns2"));
assertTrue(element.getNamespacePrefixes().contains("ns3"));
assertEquals(3, child.getNamespacePrefixes().size());
assertTrue(child.getNamespacePrefixes().contains("ns1"));
assertTrue(child.getNamespacePrefixes().contains("ns2"));
assertTrue(child.getNamespacePrefixes().contains("ns3"));
}
}