/** * Copyright (c) 2002-2004 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.assertFalse; import java.io.IOException; import java.io.StringWriter; import java.net.MalformedURLException; import org.eclipse.emf.common.util.URI; import org.eclipse.emf.ecore.EPackage; import org.eclipse.emf.ecore.impl.EPackageRegistryImpl; import org.eclipse.emf.ecore.resource.Resource; import org.eclipse.emf.ecore.resource.ResourceSet; import org.eclipse.emf.ecore.resource.URIConverter; import org.eclipse.emf.ecore.resource.impl.ResourceSetImpl; import org.eclipse.emf.ecore.util.BasicExtendedMetaData; import org.eclipse.emf.ecore.util.ExtendedMetaData; import org.eclipse.emf.ecore.xmi.XMLResource; import org.eclipse.emf.ecore.xmi.impl.XMLResourceFactoryImpl; import org.eclipse.emf.test.common.TestUtil; import org.eclipse.emf.test.models.library.Book; import org.eclipse.emf.test.models.library.Library; import org.eclipse.emf.test.models.library.LibraryFactory; import org.eclipse.emf.test.models.library.LibraryPackage; import org.eclipse.emf.test.models.library.Writer; import org.eclipse.emf.test.xml.AllSuites; import org.junit.After; import org.junit.Before; import org.junit.Test; public class LaxFeatureNamespaceMatchingTest { final static String BASE_XML_URI = TestUtil.getPluginDirectory(AllSuites.PLUGIN_ID) + "/data/xml/"; final static String LF = System.getProperty("line.separator"); ResourceSet resourceSet; @Before public void setUp() throws Exception { resourceSet = new ResourceSetImpl(); LibraryPackage.eINSTANCE.eClass(); resourceSet.getResourceFactoryRegistry().getExtensionToFactoryMap().put ("*", new XMLResourceFactoryImpl() { @Override public Resource createResource(URI uri) { XMLResource result = (XMLResource)super.createResource(uri); ExtendedMetaData extendedMetaData = new BasicExtendedMetaData(new EPackageRegistryImpl(EPackage.Registry.INSTANCE)) { @Override protected boolean isFeatureNamespaceMatchingLax() { return true; } }; extendedMetaData.putPackage(null, LibraryPackage.eINSTANCE); result.getDefaultLoadOptions().put(XMLResource.OPTION_EXTENDED_META_DATA, extendedMetaData); result.getDefaultSaveOptions().put(XMLResource.OPTION_EXTENDED_META_DATA, Boolean.TRUE); result.getDefaultLoadOptions().put(XMLResource.OPTION_USE_ENCODED_ATTRIBUTE_STYLE, Boolean.TRUE); result.getDefaultSaveOptions().put(XMLResource.OPTION_USE_ENCODED_ATTRIBUTE_STYLE, Boolean.TRUE); result.getDefaultLoadOptions().put(XMLResource.OPTION_USE_LEXICAL_HANDLER, Boolean.TRUE); return result; } }); } @After public void tearDown() throws Exception { resourceSet = null; } @Test public void test() throws MalformedURLException, IOException { Resource firstLibraryResource = resourceSet.createResource(URI.createFileURI(BASE_XML_URI + "first.library")); Library firstLibrary = LibraryFactory.eINSTANCE.createLibrary(); firstLibrary.setName("first"); Book firstBook = LibraryFactory.eINSTANCE.createBook(); firstBook.setTitle("First Book"); firstLibrary.getBooks().add(firstBook); firstLibraryResource.getContents().add(firstLibrary); StringWriter firstWriter = new StringWriter(); firstLibraryResource.save(new URIConverter.WriteableOutputStream(firstWriter, "UTF-8"), null); Resource secondLibraryResource = resourceSet.createResource(URI.createFileURI(BASE_XML_URI + "second.library")); Library secondLibrary = LibraryFactory.eINSTANCE.createLibrary(); secondLibrary.setName("second"); Book secondBook = LibraryFactory.eINSTANCE.createBook(); secondBook.setTitle("Second Book"); secondLibrary.getBooks().add(secondBook); secondLibraryResource.getContents().add(secondLibrary); StringWriter secondWriter = new StringWriter(); secondLibraryResource.save(new URIConverter.WriteableOutputStream(secondWriter, "UTF-8"), null); XMLResource mainLibraryResource = (XMLResource)resourceSet.createResource(URI.createFileURI(BASE_XML_URI + "main.library")); Library mainLibrary = LibraryFactory.eINSTANCE.createLibrary(); mainLibrary.setName("main"); Writer firstAuthor = LibraryFactory.eINSTANCE.createWriter(); firstAuthor.setName("First Author"); firstAuthor.getBooks().add(firstBook); mainLibrary.getWriters().add(firstAuthor); Writer secondAuthor = LibraryFactory.eINSTANCE.createWriter(); secondAuthor.setName("Second Author"); secondAuthor.getBooks().add(secondBook); mainLibrary.getWriters().add(secondAuthor); mainLibraryResource.getContents().add(mainLibrary); StringWriter mainWriter = new StringWriter(); mainLibraryResource.save(new URIConverter.WriteableOutputStream(mainWriter, "UTF-8"), null); String expectedResult = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>" + LF + "<org.eclipse.emf.test.models.library:Library xmlns:org.eclipse.emf.test.models.library=\"http:///org.eclipse.emf.test.models/Library\" name=\"main\">" + LF + " <writers name=\"First Author\" books=\"first.library#//@books.0\"/>" + LF + " <writers name=\"Second Author\" books=\"second.library#//@books.0\"/>" + LF + "</org.eclipse.emf.test.models.library:Library>" + LF; String result = mainWriter.toString(); assertEquals(expectedResult, result); Resource reloadedMainLibraryResource = resourceSet.createResource(URI.createFileURI(BASE_XML_URI + "/main2.library")); result = result.replaceAll(":?org\\.eclipse\\.emf\\.test\\.models\\.library:?", ""); assertFalse(expectedResult.equals(result)); // System.err.println("###" + result); reloadedMainLibraryResource.load(new URIConverter.ReadableInputStream(result), null); mainWriter = new StringWriter(); mainLibraryResource.save(new URIConverter.WriteableOutputStream(mainWriter, "UTF-8"), null); result = mainWriter.toString(); assertEquals(expectedResult, result); reloadedMainLibraryResource = resourceSet.createResource(URI.createFileURI(BASE_XML_URI + "/main3.library")); result = result.replaceAll("<writers ", "<org.eclipse.emf.test.models.library:writers "); assertFalse(expectedResult.equals(result)); // System.err.println("###" + result); reloadedMainLibraryResource.load(new URIConverter.ReadableInputStream(result), null); mainWriter = new StringWriter(); mainLibraryResource.save(new URIConverter.WriteableOutputStream(mainWriter, "UTF-8"), null); assertEquals(expectedResult, mainWriter.toString()); reloadedMainLibraryResource = resourceSet.createResource(URI.createFileURI(BASE_XML_URI + "/main4.library")); result = result.replaceAll(":?org.eclipse.emf.test.models.library:?", "").replaceAll("xmlns=[^ ]* ", ""); // System.err.println("###" + result); assertFalse(expectedResult.equals(result)); reloadedMainLibraryResource.load(new URIConverter.ReadableInputStream(result), null); mainWriter = new StringWriter(); mainLibraryResource.save(new URIConverter.WriteableOutputStream(mainWriter, "UTF-8"), null); result = mainWriter.toString(); assertEquals(expectedResult, result); } }