/**
* 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.rss;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.util.Collection;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
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.EPackage.Registry;
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.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.ecore.xmi.util.XMLProcessor;
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.XSDDiagnostic;
import org.eclipse.xsd.XSDDiagnosticSeverity;
import org.eclipse.xsd.ecore.XSDEcoreBuilder;
import org.eclipse.xsd.impl.XSDDiagnosticImpl;
import org.eclipse.xsd.util.XSDResourceFactoryImpl;
/**
* General tests for RSS reading/writing
*/
public class RSSTests extends TestCase
{
XSDEcoreBuilder xsdEcoreBuilder;
URI schemaURI;
DocumentBuilder builder;
final static String BASE_RSS_URI = "file:///" + TestUtil.getPluginDirectory(AllSuites.PLUGIN_ID) + "/data/rss/";
public RSSTests(String name)
{
super(name);
}
public static Test suite()
{
TestSuite ts = new TestSuite("RSSTests");
ts.addTest(new RSSTests("testLoadEMF21_AtomRSS10v11"));
ts.addTest(new RSSTests("testLoadEMF22_XMLProcessor_AtomRSS10v11"));
return ts;
}
/**
* @see junit.framework.TestCase#setUp()
*/
@Override
protected void setUp() throws Exception
{
xsdEcoreBuilder = new XSDEcoreBuilder();
xsdEcoreBuilder.setValidate(true);
Resource.Factory.Registry.INSTANCE.getExtensionToFactoryMap().put("xsd", new XSDResourceFactoryImpl());
Resource.Factory.Registry.INSTANCE.getExtensionToFactoryMap().put("*", new XMLResourceFactoryImpl());
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
factory.setNamespaceAware(true);
builder = factory.newDocumentBuilder();
}
/*
* Bug #81512
*/
public void testLoadEMF21_AtomRSS10v11() throws Exception
{
String schema = "atom10v11_simple.xsd";
validateSchema(schema);
loadAndSaveEMF21(schema, "atom10v11_sample.xml");
}
/*
* Bug #81512
*/
public void testLoadEMF22_XMLProcessor_AtomRSS10v11() throws Exception
{
String schema = "atom10v11_simple.xsd";
schemaURI = URI.createURI(BASE_RSS_URI + schema);
loadAndSaveEMF22_XMLProcessor(schema, "atom10v11_sample.xml");
}
protected void validateSchema(String schema) throws Exception {
// get schema
schemaURI = URI.createURI(BASE_RSS_URI + schema);
assertTrue("Schema file is not available - " + BASE_RSS_URI + schema, schemaURI.isFile());
// this is still the EMF2.1 way
xsdEcoreBuilder.generate(schemaURI);
List<XSDDiagnostic> results = xsdEcoreBuilder.getDiagnostics();
for (Iterator<XSDDiagnostic> iter = results.iterator(); iter.hasNext();) {
assertTrue(getXSDDiagnosticMessage((XSDDiagnosticImpl)iter.next()).toString(),false);
}
}
// EMF 2.1 way of loading an xml doc using schema
protected void loadAndSaveEMF21(String schema, String rss) throws Exception
{
HashMap<String, Object> options = new HashMap<String, Object>();
ResourceSet rs = new ResourceSetImpl();
Registry packageRegistry = rs.getPackageRegistry();
@SuppressWarnings("unchecked") Collection<EPackage> packageList = (Collection<EPackage>)(Collection<?>)xsdEcoreBuilder.generate(schemaURI);
for (EPackage epackage : packageList)
{
String nsURI = epackage.getNsURI();
packageRegistry.put(nsURI, epackage);
}
ExtendedMetaData extendedMetaData = new BasicExtendedMetaData(packageRegistry);
options.put(XMLResource.OPTION_EXTENDED_META_DATA, extendedMetaData);
// Must turn on this option when using EMF21 synatax; turned on automatically for generated code and XMLProcessor
// The option allows <link href="..."> to be serialized w/o losing the href="..." part
options.put(XMLResource.OPTION_USE_ENCODED_ATTRIBUTE_STYLE, Boolean.TRUE);
//load XML
Resource resource = rs.createResource(URI.createURI(BASE_RSS_URI + rss));
resource.load(options);
// compare with CompareXML
ByteArrayOutputStream outputstream = new ByteArrayOutputStream(2064);
resource.save(outputstream, options);
CompareXML.compareFiles(builder, BASE_RSS_URI + rss, new ByteArrayInputStream(outputstream.toByteArray()));
}
// EMF 2.2 way, using XMLProcessor
protected void loadAndSaveEMF22_XMLProcessor(String schema, String rss) throws Exception
{
// load schema, then XML
XMLProcessor processor = new XMLProcessor(schemaURI);
Resource resource = processor.load(BASE_RSS_URI + rss, null);
// compare with CompareXML
ByteArrayOutputStream outputstream = new ByteArrayOutputStream(2064);
processor.save(outputstream, resource, null);
CompareXML.compareFiles(builder, BASE_RSS_URI + rss, new ByteArrayInputStream(outputstream.toByteArray()));
}
private static StringBuffer getXSDDiagnosticMessage(XSDDiagnosticImpl diagnostic)
{
StringBuffer message = new StringBuffer();
XSDDiagnosticSeverity sev = diagnostic.getSeverity();
switch (sev.getValue())
{
case XSDDiagnosticSeverity.WARNING:
message.append("Warning: ");
break;
case XSDDiagnosticSeverity.ERROR:
message.append("Error: ");
break;
case XSDDiagnosticSeverity.FATAL:
message.append("Fatal Error: ");
break;
}
message.append("Line ");
message.append(diagnostic.getLine());
message.append(" - ");
message.append(diagnostic.getMessage());
return message;
}
}