/* * GeoTools - The Open Source Java GIS Toolkit * http://geotools.org * * (C) 2002-2008, Open Source Geospatial Foundation (OSGeo) * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; * version 2.1 of the License. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. */ package org.geotools.xs; import junit.framework.TestCase; import org.eclipse.xsd.XSDElementDeclaration; import org.eclipse.xsd.XSDFactory; import org.eclipse.xsd.XSDSchema; import org.eclipse.xsd.XSDSimpleTypeDefinition; import org.eclipse.xsd.util.XSDParser; import org.picocontainer.defaults.DefaultPicoContainer; import java.io.BufferedWriter; import java.io.File; import java.io.FileWriter; import java.io.IOException; import java.io.PrintWriter; import java.lang.reflect.Field; import java.net.URL; import java.util.HashMap; import java.util.Map; import javax.xml.namespace.QName; import org.geotools.xml.Binding; import org.geotools.xml.ElementInstance; import org.geotools.xml.Schemas; import org.geotools.xml.SimpleBinding; import org.geotools.xml.impl.BindingLoader; import org.geotools.xml.impl.ElementImpl; import org.geotools.xml.impl.PicoMap; public abstract class TestSchema extends TestCase { public static URL url; public static XSDSchema schema; public static XSDSchema xsd; public static BindingLoader factory; static { url = TestSchema.class.getResource("sample.xsd"); try { schema = Schemas.parse(url.toString()); } catch (IOException e) { throw new RuntimeException(e); } xsd = schema.getSchemaForSchema(); Map bindings = new HashMap(); new XSConfiguration().registerBindings(new PicoMap(bindings)); factory = new BindingLoader(bindings); } protected XSDSimpleTypeDefinition typeDef; protected SimpleBinding strategy; protected QName qname; public TestSchema() { } public TestSchema(String name) { super(name); } /** * Limited to a search of simple types, no QName required. * * @param name * @return XSDSimpleTypeDefinition */ public XSDSimpleTypeDefinition xsdSimple(String name) { Map simpleTypes = xsd.getSimpleTypeIdMap(); //System.out.println( simpleTypes ); return (XSDSimpleTypeDefinition) simpleTypes.get(name); } public QName xs(String name) throws Exception { Class xs = XS.class; Field[] fields = xs.getFields(); for (int i = 0; i < fields.length; i++) { Field field = fields[i]; if (field.getName().equalsIgnoreCase(name)) { return (QName) field.get(null); } } throw new IllegalArgumentException(name); } public Binding stratagy(QName qname) throws Exception { return factory.loadBinding(qname, new DefaultPicoContainer()); } public Binding stratagy(String name) throws Exception { return factory.loadBinding(xs(name), new DefaultPicoContainer()); } public ElementInstance element(String text, QName qname) { // create a fake element declaration and element instance XSDElementDeclaration declaration = XSDFactory.eINSTANCE.createXSDElementDeclaration(); declaration.setTypeDefinition(xsdSimple(qname.getLocalPart())); ElementInstance element = new ElementImpl(declaration); element.setText(text); return element; } public ElementInstance element(String text, QName original, String name) { try { File temp = File.createTempFile("name", "xsd"); FileWriter file = new FileWriter(temp); BufferedWriter buff = new BufferedWriter(file); PrintWriter print = new PrintWriter(buff); print.println("<?xml version=\"1.0\" encoding=\"UTF-8\"?>" + " <xsd:schema xmlns:my=\"http://mails/refractions/net\"" + " xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\"" + " targetNamespace=\"http://localhost//test\">" + " <xsd:element name=\"" + name + "\" type=\"xsd:" + original.getLocalPart() + "\"/>" + "</xsd:schema>"); URL url = temp.toURL(); XSDParser parser = new XSDParser(); parser.parse(url.toString()); XSDSchema schema = parser.getSchema(); Map map = schema.getSimpleTypeIdMap(); return (ElementInstance) map.get(name); } catch (Throwable t) { t.printStackTrace(); return null; } } /** * Will call the parse method on the strategy object, passing it * <code>given</code> to use as a value. It will then perform * <code>assertEquals(expected, result);</code> * * @param given the value to pass to the parse method * @param expected used to compare against the result of the parse method * @throws Exception */ public void validateValues(String given, Object expected) throws Exception { Object result = strategy.parse(element(given, qname), given); assertEquals(expected, result); } /** * Each subclass must indicate which kind of QName they wish to operate against. */ protected abstract QName getQName(); protected void setUp() throws Exception { // TODO Auto-generated method stub super.setUp(); qname = getQName(); if (qname != null) { typeDef = xsdSimple(qname.getLocalPart()); strategy = (SimpleBinding) stratagy(qname); } } public void testSetUp() { if (getQName() != null) { assertNotNull("XSD typedef", typeDef); assertNotNull(strategy); } } }