/**
* Copyright (c) 2002-2007 IBM Corporation 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:
* IBM - Initial API and implementation
*/
package org.eclipse.emf.test.xml.xmi;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.fail;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.util.HashMap;
import javax.xml.XMLConstants;
import javax.xml.namespace.QName;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import org.eclipse.emf.common.util.URI;
import org.eclipse.emf.ecore.resource.Resource;
import org.eclipse.emf.ecore.resource.ResourceSet;
import org.eclipse.emf.ecore.resource.impl.ResourceSetImpl;
import org.eclipse.emf.ecore.util.ExtendedMetaData;
import org.eclipse.emf.ecore.xmi.XMLResource;
import org.eclipse.emf.ecore.xmi.impl.GenericXMLResourceFactoryImpl;
import org.eclipse.emf.ecore.xmi.impl.XMLResourceFactoryImpl;
import org.eclipse.emf.ecore.xml.type.XMLTypeFactory;
import org.eclipse.emf.ecore.xml.type.util.XMLTypeUtil;
import org.eclipse.emf.test.common.TestUtil;
import org.eclipse.emf.test.models.qname.DocumentRoot;
import org.eclipse.emf.test.models.qname.QNameFactory;
import org.eclipse.emf.test.models.qname.QNamePackage;
import org.eclipse.emf.test.xml.AllSuites;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
/**
* XMI tests: loading qname.xml
*/
public class QNameTest
{
final static String BASE_XML_URI = TestUtil.getPluginDirectory(AllSuites.PLUGIN_ID) + "/data/xml/";
final static String BASE_XMI_URI = TestUtil.getPluginDirectory(AllSuites.PLUGIN_ID) + "/data/xmi/";
protected DocumentBuilder builder;
protected String inputXML;
protected String expectedXML;
protected HashMap<String, Object> options;
@Before
public void setUp() throws Exception
{
QNamePackage.eINSTANCE.getName();
Resource.Factory.Registry.INSTANCE.getExtensionToFactoryMap().put("xml", new XMLResourceFactoryImpl());
inputXML = BASE_XML_URI + "qname.xml";
expectedXML = BASE_XMI_URI + "qnameOutput.xml";
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
factory.setNamespaceAware(true);
builder = factory.newDocumentBuilder();
options = new HashMap<String, Object>();
}
@After
public void tearDown() throws Exception
{
builder = null;
options = null;
}
@Test
public void testQname() throws Exception
{
URI uri = URI.createFileURI(inputXML);
ResourceSet resourceSet = new ResourceSetImpl();
Resource resource = resourceSet.createResource(uri);
options.put(XMLResource.OPTION_EXTENDED_META_DATA, ExtendedMetaData.INSTANCE);
resource.load(options);
ByteArrayOutputStream outputstream = new ByteArrayOutputStream(2064);
resource.save(outputstream, options);
CompareXML.compareFiles(builder, expectedXML, new ByteArrayInputStream(outputstream.toByteArray()));
}
@Test
public void testNullPrefixQname() throws Exception
{
ResourceSet resourceSet = new ResourceSetImpl();
resourceSet.getResourceFactoryRegistry().getExtensionToFactoryMap().put("xml", new GenericXMLResourceFactoryImpl());
Resource resource = resourceSet.createResource(URI.createURI("dummy.xml"));
DocumentRoot documentRoot = QNameFactory.eINSTANCE.createDocumentRoot();
documentRoot.getXMLNSPrefixMap().put("", "namespace");
documentRoot.setAnyE(XMLTypeFactory.eINSTANCE.createQName("namespace", "qname", ""));
resource.getContents().add(documentRoot);
ByteArrayOutputStream outputstream = new ByteArrayOutputStream(2064);
resource.save(outputstream, options);
ByteArrayInputStream in = new ByteArrayInputStream(outputstream.toByteArray());
Resource resource2 = resourceSet.createResource(URI.createURI("dummy2.xml"));
resource2.load(in, options);
DocumentRoot documentRoot2 = (DocumentRoot)resource2.getContents().get(0);
QName qname = documentRoot2.getAnyE();
assertEquals(qname.getPrefix(), "");
}
@Test
public void testValidQNames()
{
QName qname = (QName)XMLTypeUtil.createQName("http://www.example.org/test", "name", "test");
assertEquals("http://www.example.org/test", qname.getNamespaceURI());
assertEquals("name", qname.getLocalPart());
assertEquals("test", qname.getPrefix());
qname = (QName)XMLTypeUtil.createQName(null, "name", "test");
assertEquals(XMLConstants.NULL_NS_URI, qname.getNamespaceURI());
assertEquals("name", qname.getLocalPart());
assertEquals("test", qname.getPrefix());
qname = (QName)XMLTypeUtil.createQName("http://www.example.org/test", "name", null);
assertEquals("http://www.example.org/test", qname.getNamespaceURI());
assertEquals("name", qname.getLocalPart());
assertEquals(XMLConstants.DEFAULT_NS_PREFIX, qname.getPrefix());
qname = (QName)XMLTypeUtil.createQName(null, "name", null);
assertEquals(XMLConstants.NULL_NS_URI, qname.getNamespaceURI());
assertEquals("name", qname.getLocalPart());
assertEquals(XMLConstants.DEFAULT_NS_PREFIX, qname.getPrefix());
try
{
qname = (QName)XMLTypeUtil.createQName("http://www.example.org/test", null, "test");
fail("null local part is invalid and should not be allowed");
}
catch (IllegalArgumentException e)
{
// This is expected: a null local part is not allowed.
}
}
}