/** * 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 java.io.StringReader; import java.io.StringWriter; import javax.xml.parsers.DocumentBuilder; import javax.xml.parsers.DocumentBuilderFactory; import javax.xml.transform.Transformer; import javax.xml.transform.TransformerFactory; import javax.xml.transform.dom.DOMSource; import javax.xml.transform.stream.StreamResult; 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.URIConverter; import org.eclipse.emf.ecore.resource.impl.ResourceSetImpl; import org.eclipse.emf.ecore.xmi.XMLResource; import org.eclipse.emf.ecore.xmi.XMLResource.ResourceEntityHandler; import org.eclipse.emf.ecore.xmi.impl.GenericXMLResourceFactoryImpl; import org.eclipse.emf.ecore.xmi.impl.ResourceEntityHandlerImpl; 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; import org.w3c.dom.Document; import org.xml.sax.InputSource; public class URIHandlerTest { final static String BASE_XML_URI = TestUtil.getPluginDirectory(AllSuites.PLUGIN_ID) + "/data/xml/"; final static String LF = System.getProperty("line.separator"); protected ResourceSet resourceSet; @Before public void setUp() throws Exception { resourceSet = new ResourceSetImpl(); LibraryPackage.eINSTANCE.eClass(); resourceSet.getResourceFactoryRegistry().getExtensionToFactoryMap().put ("*", new GenericXMLResourceFactoryImpl() { @Override public Resource createResource(URI uri) { XMLResource result = (XMLResource)super.createResource(uri); ResourceEntityHandlerImpl resourceEntityHandler = new ResourceEntityHandlerImpl("_"); result.getDefaultSaveOptions().put(XMLResource.OPTION_RESOURCE_ENTITY_HANDLER, resourceEntityHandler); result.getDefaultLoadOptions().put(XMLResource.OPTION_RESOURCE_ENTITY_HANDLER, resourceEntityHandler); return result; } }); } @After public void tearDown() throws Exception { resourceSet = null; } @Test public void testEntityHandler() throws Exception { 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); ResourceEntityHandler resourceEntityHandler = (ResourceEntityHandler)(mainLibraryResource).getDefaultLoadOptions().get(XMLResource.OPTION_RESOURCE_ENTITY_HANDLER); resourceEntityHandler.handleEntity("first", firstLibraryResource.getURI().toString()); resourceEntityHandler.handleEntity("second", secondLibraryResource.getURI().toString()); StringWriter mainWriter = new StringWriter(); mainLibraryResource.save(new URIConverter.WriteableOutputStream(mainWriter, "UTF-8"), null); mainLibraryResource.setURI(URI.createFileURI(BASE_XML_URI + "/vault/main.library")); mainWriter = new StringWriter(); mainLibraryResource.save(new URIConverter.WriteableOutputStream(mainWriter, "UTF-8"), null); assertEquals ("<?xml version=\"1.0\" encoding=\"UTF-8\"?>" + LF + "<!DOCTYPE org.eclipse.emf.test.models.library:Library [" + LF + "<!ENTITY first \"../first.library\">" + LF + "<!ENTITY second \"../second.library\">" + LF + "]>" + LF + "<org.eclipse.emf.test.models.library:Library xmlns:org.eclipse.emf.test.models.library=\"http:///org.eclipse.emf.test.models/Library\"" + LF + " name=\"main\">" + LF + " <writers name=\"First Author\" books=\"&first;#//@books.0\"/>" + LF + " <writers name=\"Second Author\" books=\"&second;#//@books.0\"/>" + LF + "</org.eclipse.emf.test.models.library:Library>" + LF, mainWriter.toString()); Document document = mainLibraryResource.save(null, null, null); TransformerFactory transformerFactory = TransformerFactory.newInstance(); Transformer transformer = transformerFactory.newTransformer(); mainWriter = new StringWriter(); transformer.transform(new DOMSource(document), new StreamResult(mainWriter)); DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); factory.setNamespaceAware(true); DocumentBuilder builder = factory.newDocumentBuilder(); StringReader stringReader = new StringReader ("<?xml version=\"1.0\" encoding=\"UTF-8\"?>" + "<org.eclipse.emf.test.models.library:Library xmlns:org.eclipse.emf.test.models.library=\"http:///org.eclipse.emf.test.models/Library\" name=\"main\">" + "<writers books=\"../first.library#//@books.0\" name=\"First Author\"/>" + "<writers books=\"../second.library#//@books.0\" name=\"Second Author\"/>" + "</org.eclipse.emf.test.models.library:Library>"); Document document2 = builder.parse(new InputSource(stringReader)); CompareXML.compareDocuments ("", document2, document); Resource reloadedMainLibraryResource = resourceSet.createResource(URI.createFileURI(BASE_XML_URI + "/vault/main2.library")); reloadedMainLibraryResource.load(new URIConverter.ReadableInputStream(mainWriter.toString()), null); Library reloadedMainLibrary = ((Library)reloadedMainLibraryResource.getContents().get(0)); Writer reloadedFirstAuthor = reloadedMainLibrary.getWriters().get(0); Book reloadedFirstBook = reloadedFirstAuthor.getBooks().get(0); assertEquals(firstLibraryResource.getURI(), reloadedFirstBook.eResource().getURI()); } }