package org.cagrid.gme.service.impl; import junit.framework.TestCase; import org.apache.xerces.dom.DOMInputImpl; import org.apache.xerces.xni.parser.XMLParseException; import org.apache.xerces.xs.LSInputList; import org.apache.xerces.xs.XSModel; import org.cagrid.gme.model.XMLSchema; import org.cagrid.gme.service.impl.common.XSDUtil; import org.cagrid.gme.service.impl.dao.XMLSchemaInformationDao; import org.cagrid.gme.service.impl.sax.GMEXMLSchemaLoader; import org.w3c.dom.ls.LSInput; import java.io.File; import java.net.URI; import java.util.ArrayList; import java.util.List; public class XercesSchemaTestCase extends TestCase { public void testNoImports() { try { List<XMLSchema> schemas = new ArrayList<XMLSchema>(); URI ns = new URI("gme://caGrid.caBIG/1.0/gov.nih.nci.cagrid.metadata.common"); schemas.add(XSDUtil.createSchema(ns, new File("src/test/resources/schema/cagrid/common/common.xsd"))); XSModel model = loadSchemas(schemas, null); assertEquals(2, model.getNamespaceItems().getLength()); } catch (Exception e) { e.printStackTrace(); fail(e.getMessage()); } } public void testMissingImportFailure() { testFailingSchema("gme://caGrid.caBIG/1.0/gov.nih.nci.cagrid.metadata", "src/test/resources/schema/cagrid/caGridMetadata.xsd"); } public void testMissingType() { testFailingSchema("gme://missingtype", "src/test/resources/schema/invalid/missingtype.xsd"); } public void testMissingInclude() { testFailingSchema("gme://missinginclude", "src/test/resources/schema/invalid/missinginclude.xsd"); } public void testDuplicateElements() { testFailingSchema("gme://duplicateelements", "src/test/resources/schema/invalid/duplicateelements.xsd"); } // public void testIncludes() { // try { // // XSModel model = // loadSchemas(GMETestSchemaBundles.getSimpleIncludeBundle(), null); // // assertEquals(2, model.getNamespaceItems().getLength()); // } catch (Exception e) { // e.printStackTrace(); // fail(e.getMessage()); // } // } public void testImports() { try { List<XMLSchema> schemas = new ArrayList<XMLSchema>(); URI ns1 = new URI("gme://caGrid.caBIG/1.0/gov.nih.nci.cagrid.metadata.dataservice"); schemas.add(XSDUtil.createSchema(ns1, new File("src/test/resources/schema/cagrid/data/data.xsd"))); URI ns2 = new URI("gme://caGrid.caBIG/1.0/gov.nih.nci.cagrid.metadata.common"); schemas.add(XSDUtil.createSchema(ns2, new File("src/test/resources/schema/cagrid/common/common.xsd"))); XSModel model = loadSchemas(schemas, null); // TODO: why is this 4, and not 3? how can we prevent it from // processing schemas from imports that we've already processed assertEquals(4, model.getNamespaceItems().getLength()); } catch (Exception e) { e.printStackTrace(); fail(e.getMessage()); } } private void testFailingSchema(String namepace, String location) { assertNotNull("Cannot test a null namespace.", namepace); assertNotNull("Cannot test a null location.", location); try { List<XMLSchema> schemas = new ArrayList<XMLSchema>(); URI ns1 = new URI(namepace); schemas.add(XSDUtil.createSchema(ns1, new File(location))); try { XSModel model = loadSchemas(schemas, null); fail("Parser should have thrown exception due to missing import!"); } catch (XMLParseException e) { // expected } } catch (Exception e) { e.printStackTrace(); fail(e.getMessage()); } } private static final XSModel loadSchemas(final List<XMLSchema> schemas, XMLSchemaInformationDao dao) throws IllegalArgumentException, XMLParseException { if (schemas == null) { throw new IllegalArgumentException("Schemas must be non null."); } LSInputList list = new LSInputList() { public LSInput item(int index) { DOMInputImpl input = new DOMInputImpl(); input.setSystemId(schemas.get(index).getRootDocument().getSystemID()); input.setStringData(schemas.get(index).getRootDocument().getSchemaText()); return input; } public int getLength() { return schemas.size(); } }; GMEXMLSchemaLoader schemaLoader = new GMEXMLSchemaLoader(schemas, dao); XSModel model = schemaLoader.loadInputList(list); if (model == null) { throw schemaLoader.getErrorHandler().createXMLParseException(); } return model; } public static void main(String[] args) { junit.textui.TestRunner.run(XercesSchemaTestCase.class); } }