/** * Copyright 2004-2016 Riccardo Solmi. All rights reserved. * This file is part of the Whole Platform. * * The Whole Platform 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, either version 3 of the License, or * (at your option) any later version. * * The Whole Platform 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. * * You should have received a copy of the GNU Lesser General Public License * along with the Whole Platform. If not, see <http://www.gnu.org/licenses/>. */ package org.whole.lang.xsd.util; import java.io.File; import java.io.FilenameFilter; import java.io.InputStream; import java.util.Comparator; import java.util.HashMap; import java.util.Map; import org.junit.Assert; import org.junit.Before; import org.junit.BeforeClass; import org.junit.Test; import org.junit.experimental.categories.Category; import org.whole.lang.bindings.BindingManagerFactory; import org.whole.lang.bindings.IBindingManager; import org.whole.lang.codebase.FilePersistenceProvider; import org.whole.lang.codebase.StreamPersistenceProvider; import org.whole.lang.matchers.Matcher; import org.whole.lang.model.IEntity; import org.whole.lang.models.codebase.ArtifactsModel; import org.whole.lang.models.model.Model; import org.whole.lang.operations.InterpreterOperation; import org.whole.lang.operations.NormalizerOperation; import org.whole.lang.queries.model.PathExpression; import org.whole.lang.rdb.codebase.OrderedMatcher; import org.whole.lang.reflect.EntityDescriptor; import org.whole.lang.reflect.ReflectionFactory; import org.whole.lang.util.BehaviorUtils; import org.whole.lang.xsd.codebase.ModelToXmlSchemaQuery; import org.whole.lang.xsd.codebase.XsdPersistenceKit; import org.whole.lang.xsd.codebase.XsiPersistenceKit; import org.whole.lang.xsd.model.Schema; import org.whole.lang.xsd.reflect.XsdEntityDescriptorEnum; import org.whole.lang.xsd.reflect.XsdFeatureDescriptorEnum; import org.whole.test.KnownFailingTests; import org.whole.test.SlowTests; /** * @author Enrico Persiani */ public class XsdLanguageTest { private Map<EntityDescriptor<?>, Comparator<IEntity>> comparatorsMap = new HashMap<EntityDescriptor<?>, Comparator<IEntity>>(); @BeforeClass public static void deployWholePlatform() { ReflectionFactory.deployWholePlatform(); } @Before public void setUp() { comparatorsMap.put(XsdEntityDescriptorEnum.NamespaceDecls, new OrderedMatcher.SimpleFeatureComparator(XsdFeatureDescriptorEnum.uri)); comparatorsMap.put(XsdEntityDescriptorEnum.SchemaComponents, new OrderedMatcher.SimpleFeatureComparator(XsdFeatureDescriptorEnum.name)); comparatorsMap.put(XsdEntityDescriptorEnum.Particles, new Comparator<IEntity>() { public int compare(IEntity o1, IEntity o2) { String s1 = Matcher.isAssignableAsIsFrom(XsdEntityDescriptorEnum.NamedComponent, o1) ?//TODO test was isAssignableFrom o1.wGet(XsdFeatureDescriptorEnum.name).wStringValue() : o1.wGet(XsdFeatureDescriptorEnum.ref).wStringValue(); String s2 = Matcher.isAssignableAsIsFrom(XsdEntityDescriptorEnum.NamedComponent, o2) ?//TODO test was isAssignableFrom o2.wGet(XsdFeatureDescriptorEnum.name).wStringValue() : o2.wGet(XsdFeatureDescriptorEnum.ref).wStringValue(); return s1.compareTo(s2); } }); } private Schema loadXsd(String fileName) throws Exception { return (Schema) XsdPersistenceKit.instance().readModel( new StreamPersistenceProvider(getInputStream(fileName))); } private InputStream getInputStream(String fileName) { return getClass().getResourceAsStream(fileName); } private void loadSchemaInstance(String schemaFileName, String... instanceFileNames) throws Exception { IBindingManager bm = BindingManagerFactory.instance.createArguments(); String folderLocation = new File("test/org/whole/lang/xsd/util").getAbsolutePath(); bm.wDefValue("folderLocation", folderLocation); bm.wDefValue("packageName", ""); Schema xsd = loadXsd(schemaFileName); InterpreterOperation.interpret(xsd, bm); for (String instanceFileName : instanceFileNames) XsiPersistenceKit.instance().readModel( new StreamPersistenceProvider(getInputStream(instanceFileName))); } @Test public void testXsdNormalization() { try { Schema xsdNormalized1 = NormalizerOperation.normalize(loadXsd("schema-to-normalize.xsd")); Schema xsdNormalized2 = loadXsd("schema-normalized.xsd"); Assert.assertTrue(OrderedMatcher.match(xsdNormalized2, xsdNormalized1, comparatorsMap)); } catch (Exception e) { Assert.fail(e.getMessage()); } } @Category(SlowTests.class) @Test public void testXsdPersistence() { File file = null; try { IBindingManager bm = BindingManagerFactory.instance.createBindingManager(); File folder = new File("test/org/whole/lang/xsd/util"); bm.wDefValue("folderLocation", folder.getAbsolutePath()); bm.wDefValue("packageName", ""); FilenameFilter xsdFilenameFilter = new FilenameFilter() { public boolean accept(File dir, String name) { return name.endsWith(".xsd"); } }; for (File f : folder.listFiles(xsdFilenameFilter)) XsdPersistenceKit.instance().readModel(new FilePersistenceProvider(file = f, bm)); folder = new File("test/org/whole/lang/xsd/util/xsd"); bm.wDefValue("folderLocation", folder.getAbsolutePath()); bm.wDefValue("packageName", ""); for (File f : folder.listFiles(xsdFilenameFilter)) XsdPersistenceKit.instance().readModel(new FilePersistenceProvider(file = f, bm)); } catch (Exception e) { Assert.fail("Cannot load "+file+" cause:\n"+e.getMessage()); } } @Test public void testModelToXsdMapping() { try { IBindingManager bm = BindingManagerFactory.instance.createBindingManager(); PathExpression path = new ModelToXmlSchemaQuery().create(); Model model = new ArtifactsModel().create(); Assert.assertNotNull(BehaviorUtils.evaluateFirstResult(path, model, bm)); IEntity mappedXsd = bm.wGet("schema"); IEntity xsd = loadXsd("artifacts.xsd"); Assert.assertTrue(OrderedMatcher.match(xsd, mappedXsd, comparatorsMap)); } catch (Exception e) { Assert.fail(e.getMessage()); } } @Category(KnownFailingTests.class) @Test public void testArtifactsMappedModel() { try { IBindingManager bm = BindingManagerFactory.instance.createBindingManager(); PathExpression path = new ModelToXmlSchemaQuery().create(); Model model = new ArtifactsModel().create(); Assert.assertNotNull(BehaviorUtils.evaluateFirstResult(path, model, bm)); InterpreterOperation.interpret(bm.wGet("mapping")); bm.wDefValue("folderLocation", new File("test/org/whole/lang/xsd/util").getAbsolutePath()); bm.wDefValue("packageName", ""); IEntity artifacts = XsiPersistenceKit.instance().readModel(new StreamPersistenceProvider(getInputStream("Artifacts.xml"), null, bm)); Assert.assertTrue(Matcher.match(new Artifacts().create(), artifacts)); } catch (Exception e) { Assert.fail(e.getMessage()); } } @Category({KnownFailingTests.class, SlowTests.class}) @Test public void testBpel20Instance() { try { loadSchemaInstance("wsbpel_2_0.xsd", "wsbpel_2_0.xml", "Div.bpel", "ReceiveMessageFromApplication.bpel", "ReceiveTwoOperandForSum.bpel", "SlaveProcess.bpel", "StringMessageReceive.bpel", "Sum.bpel", "SumReceiveProcess.bpel", "Java2BPELException.bpel", "MasterProcess.bpel"); } catch (Exception e) { Assert.fail(e.getMessage()); } } @Category(KnownFailingTests.class) @Test public void testXslt20Instance() { Assert.fail(); // force failure since test is unable to download imported schemas try { loadSchemaInstance("xslt20.xsd", "xslt20.xml"); } catch (Exception e) { Assert.fail(e.getMessage()); } } @Category(KnownFailingTests.class) @Test public void testJsp21Instance() { Assert.fail(); // force failure since test is unable to download imported schemas try { loadSchemaInstance("jsp_2_1.xsd", "jsp_2_1.xml"); } catch (Exception e) { Assert.fail(e.getMessage()); } } @Category(KnownFailingTests.class) @Test public void testXhtml11Instance() { Assert.fail(); // force failure since test is unable to download imported schemas try { loadSchemaInstance("xhtml11.xsd", "xhtml11.xml"); } catch (Exception e) { Assert.fail(e.getMessage()); } } @Category(KnownFailingTests.class) @Test public void testXForms10Instance() { Assert.fail(); // force failure since test is unable to download imported schemas try { loadSchemaInstance("XForms-Schema10.xsd", "XForms-Schema10.xml"); } catch (Exception e) { Assert.fail(e.getMessage()); } } }