/** * 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.xsdecore; import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.io.File; import java.io.FileOutputStream; import java.util.Collection; import java.util.Collections; import java.util.Iterator; import java.util.Vector; import javax.xml.parsers.DocumentBuilder; import javax.xml.parsers.DocumentBuilderFactory; import junit.framework.Test; import junit.framework.TestCase; import junit.framework.TestSuite; import org.eclipse.emf.common.util.URI; import org.eclipse.emf.ecore.EPackage; 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.xmi.XMIResource; import org.eclipse.emf.ecore.xmi.impl.EcoreResourceFactoryImpl; import org.eclipse.emf.test.common.TestUtil; import org.eclipse.emf.test.xml.AllSuites; import org.eclipse.emf.test.xml.xmi.CompareXML; import org.eclipse.xsd.ecore.XSDEcoreBuilder; import org.eclipse.xsd.util.XSDResourceFactoryImpl; /** * Test for conversion from XSD to ECore - compare against expected output */ public class XSD2EcoreTest extends TestCase { DocumentBuilder builder = null; XSDEcoreBuilder xsdEcoreBuilder; Resource resource; // list of xsd files to generate .ecore Vector<String> xsdfiles; // expected output for .ecore files for given xsd files Vector<String> ecorefiles; // base uri of the xsd and ecore files final static String BASE_XSD_URI = TestUtil.getTestCommonDirectory() + "/models/MovieDB/"; final static String BASE_ECORE_URI = TestUtil.getTestCommonDirectory() + "/models/MovieDB/"; // to serialize .ecore files turn this on final static boolean SERIALISE_ECORE = false; public XSD2EcoreTest(String name) { super(name); } public static Test suite() { TestSuite ts = new TestSuite("XSD2EcoreTest"); ts.addTest(new XSD2EcoreTest("xsd2ecore")); return ts; } /** * @see junit.framework.TestCase#setUp() */ @Override protected void setUp() throws Exception { xsdEcoreBuilder = new XSDEcoreBuilder(); ecorefiles = new Vector<String>(); xsdfiles = new Vector<String>(); Resource.Factory.Registry.INSTANCE.getExtensionToFactoryMap().put("xsd", new XSDResourceFactoryImpl()); Resource.Factory.Registry.INSTANCE.getExtensionToFactoryMap().put("ecore", new EcoreResourceFactoryImpl()); DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); factory.setNamespaceAware(true); builder = factory.newDocumentBuilder(); // Add XSD file to convert to ECORE xsdfiles.add(BASE_XSD_URI + "order.xsd"); // Add in the right order the files to compare with the output ecorefiles.add(BASE_ECORE_URI + "db.ecore"); ecorefiles.add(BASE_ECORE_URI + "customer.ecore"); ecorefiles.add(BASE_ECORE_URI + "order.ecore"); } /** * @see junit.framework.TestCase#tearDown() */ @Override protected void tearDown() throws Exception { builder = null; xsdEcoreBuilder = null; xsdfiles = null; ecorefiles = null; } public void xsd2ecore() throws Exception { URI uri = null; for (int k = 0; k < xsdfiles.size(); k++) { File file = new File(xsdfiles.get(k)); uri = URI.createFileURI(file.getCanonicalFile().toString()); // generate resources Collection<Resource> resources = xsdEcoreBuilder.generateResources(uri); // fix ecore generated resources resources = fixEcoreResorces(resources); int counter = 0; for (Iterator<Resource> rs = resources.iterator(); rs.hasNext();) { resource = rs.next(); ByteArrayOutputStream outputstream = new ByteArrayOutputStream(2064); resource.save(outputstream, Collections.EMPTY_MAP); if (SERIALISE_ECORE) { FileOutputStream fileoutput = new FileOutputStream(BASE_ECORE_URI+"out" + counter + ".xml"); resource.save(fileoutput, Collections.EMPTY_MAP); //resource.save(System.out, Collections.EMPTY_MAP); } String expectedOutput = ecorefiles.get(counter++); CompareXML.compareFiles(builder, expectedOutput ,new ByteArrayInputStream(outputstream.toByteArray()) ); } } } Collection<Resource> fixEcoreResorces(Collection<Resource> generatedResources) { ResourceSet resourceSet = new ResourceSetImpl(); for (Resource resource : generatedResources) { if (resource instanceof XMIResource) { // fix resource URI EPackage ePackage = (EPackage)resource.getContents().get(0); String ecoreFileName = ePackage.getName(); int index = ecoreFileName.lastIndexOf('.'); if (index >= 0) { ecoreFileName = ecoreFileName.substring(index+1); } ecoreFileName = ecoreFileName + ".ecore"; URI ecoreURI = URI.createFileURI(TestUtil.getPluginDirectory(AllSuites.PLUGIN_ID) + "/data/xsd_ecore/" + ecoreFileName); Resource newResource = resourceSet.createResource(URI.createURI("*.ecore")); newResource.setURI(ecoreURI); // fix Name of resource String name = ePackage.getName(); int dot = name.lastIndexOf("."); if (dot != -1) { name = name.substring(dot + 1); ePackage.setName(name); } newResource.getContents().add(ePackage); } } return resourceSet.getResources(); } }