blob: 05010b52957319c9f6c7e637f9e3b966b88bf4ba [file]
/* Copyright 2004 The Apache Software Foundation
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package compile.scomp.detailed;
import compile.scomp.common.CompileTestBase;
import compile.scomp.common.mockobj.TestBindingConfig;
import compile.scomp.common.mockobj.TestFiler;
import org.apache.xmlbeans.*;
import org.apache.xmlbeans.impl.xb.xmlconfig.ConfigDocument;
import org.junit.jupiter.api.Test;
import javax.xml.namespace.QName;
import java.io.File;
import java.util.ArrayList;
import java.util.List;
import java.util.stream.Stream;
import static common.Common.*;
import static compile.scomp.common.CompileTestBase.*;
import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.junit.jupiter.api.Assertions.assertTrue;
/**
* Ensure that several compilation mechanisms all generate
* the same schematypesystem
*/
public class XmlBeanCompilationTests {
/**
* Filer != null for BindingConfig to be used
*/
@Test
void test_bindingconfig_extension_compilation() throws Exception {
TestFiler f = new TestFiler();
//initialize all of the values
String extCaseDir = XBEAN_CASE_ROOT + P + "extensions" + P;
String extSrcDir = getRootFile() + P + "src" + P + "test" + P + "java" + P + "xmlobject" + P + "extensions" + P;
File[] cPath = CompileTestBase.getClassPath();
String dir = extCaseDir + P + "interfaceFeature" + P + "averageCase";
String dir2 = extCaseDir + P + "prePostFeature" + P + "ValueRestriction";
ConfigDocument.Config bConf = ConfigDocument.Factory.parse(new File(dir + P + "po.xsdconfig")).getConfig();
ConfigDocument.Config cConf = ConfigDocument.Factory.parse(new File(dir2 + P + "company.xsdconfig")).getConfig();
String simpleConfig = "<xb:config " +
"xmlns:xb=\"http://xml.apache.org/xmlbeans/2004/02/xbean/config\"\n" +
" xmlns:ep=\"http://xbean.interface_feature/averageCase/PurchaseOrder\">\n" +
"<xb:namespace uri=\"http://xbean.interface_feature/averageCase/PurchaseOrder\">\n" +
"<xb:package>com.easypo</xb:package>\n" +
"</xb:namespace></xb:config>";
ConfigDocument.Config confDoc = ConfigDocument.Factory.parse(simpleConfig).getConfig();
ConfigDocument.Config[] confs = new ConfigDocument.Config[]{bConf, confDoc, cConf};
File[] fList = Stream.of(
"averageCase" + P + "existing" + P + "FooHandler.java",
"averageCase" + P + "existing" + P + "IFoo.java",
"ValueRestriction" + P + "existing" + P + "ISetter.java",
"ValueRestriction" + P + "existing" + P + "SetterHandler.java"
).map(path -> new File(extSrcDir + P + "interfaceFeature" + P + path)).toArray(File[]::new);
//use created BindingConfig
TestBindingConfig bind = new TestBindingConfig(confs, fList, cPath);
//set XSDs
XmlObject obj1 = XmlObject.Factory.parse(new File(dir + P + "po.xsd"));
XmlObject obj2 = XmlObject.Factory.parse(new File(dir2 + P + "company.xsd"));
XmlObject[] schemas = {obj1, obj2};
//filer must be present on this method
List<XmlError> xm_errors = new ArrayList<>();
XmlOptions xm_opts = new XmlOptions();
xm_opts.setErrorListener(xm_errors);
xm_opts.setSavePrettyPrint();
SchemaTypeSystem apiSts = XmlBeans.compileXmlBeans("apiCompile", null,
schemas, bind, XmlBeans.getBuiltinTypeSystem(), f, xm_opts);
assertTrue(bind.isIslookupPrefixForNamespace(), "isIslookupPrefixForNamespace not invoked");
assertTrue(bind.isIslookupPackageForNamespace(), "isIslookupPackageForNamespace not invoked");
assertTrue(bind.isIslookupSuffixForNamespace(), "isIslookupSuffixForNamespace not invoked");
assertTrue(bind.isIslookupJavanameForQName(), "isIslookupJavanameForQName not invoked");
assertTrue(bind.isIsgetInterfaceExtensionsString(), "isIsgetInterfaceExtensionsString not invoked");
assertTrue(bind.isIsgetInterfaceExtensions(), "isIsgetInterfaceExtensions not invoked");
assertTrue(bind.isIsgetPrePostExtensions(), "isIsgetPrePostExtensions not invoked");
assertTrue(bind.isIsgetPrePostExtensionsString(), "isIsgetPrePostExtensionsString not invoked");
}
/**
* Verify basic incremental compilation
* and compilation with partial SOM usages
*/
@Test
void test_incrCompile() throws Exception {
XmlObject obj1 = XmlObject.Factory.parse(FOR_XSD);
obj1.documentProperties().setSourceName("OBJ1");
XmlObject[] schemas = {obj1};
QName sts1 = new QName("http://baz", "elName");
XmlObject obj2 = XmlObject.Factory.parse(INCR_XSD);
obj2.documentProperties().setSourceName("OBJ2");
XmlObject[] schemas2 = {obj2};
QName sts2 = new QName("http://bar", "elName");
XmlObject obj3 = XmlObject.Factory.parse(ERR_XSD);
obj3.documentProperties().setSourceName("OBJ3");
XmlObject[] schemas3 = {obj3};
QName sts3 = new QName("http://bar", "elErrName");
SchemaTypeSystem sts;
List<XmlError> err = new ArrayList<>();
XmlOptions opt = new XmlOptions().setErrorListener(err);
opt.setCompilePartialTypesystem();
//BASIC COMPILATION
sts = XmlBeans.compileXmlBeans(null, null, schemas, null, XmlBeans.getBuiltinTypeSystem(), null, opt);
assertTrue(err.isEmpty(), "Errors should have been empty");
// find element in the type System
assertTrue(findGlobalElement(sts.globalElements(), sts1), "Could Not find Type from first Type System: " + sts1);
//SIMPLE INCR COMPILATION
sts = XmlBeans.compileXmlBeans(null, sts, schemas2, null, XmlBeans.getBuiltinTypeSystem(), null, opt);
assertTrue(err.isEmpty(), "Errors should have been empty");
// find element in the type System
assertTrue(findGlobalElement(sts.globalElements(), sts1), "Could Not find Type from first Type System: " + sts1);
assertTrue(findGlobalElement(sts.globalElements(), sts2), "Could Not find Type from 2nd Type System: " + sts2);
//BUILDING OFF BASE SIMPLE INCR COMPILATION
sts = XmlBeans.compileXmlBeans(null, sts, schemas2, null, sts, null, opt);
assertTrue(err.isEmpty(), "Errors should have been empty");
// find element in the type System
assertTrue(findGlobalElement(sts.globalElements(), sts1), "Could Not find Type from first Type System: " + sts1);
assertTrue(findGlobalElement(sts.globalElements(), sts2), "Could Not find Type from 2nd Type System: " + sts2);
//INCR COMPILATION WITH RECOVERABLE ERROR
err.clear();
SchemaTypeSystem b = XmlBeans.compileXmlBeans(null, sts, schemas3, null, XmlBeans.getBuiltinTypeSystem(), null, opt);
// find element in the type System
assertTrue(findGlobalElement(b.globalElements(), sts1), "Could Not find Type from first Type System: " + sts1);
assertTrue(findGlobalElement(b.globalElements(), sts2), "Could Not find Type from 2nd Type System: " + sts2);
assertTrue(findGlobalElement(b.globalElements(), sts3), "Could Not find Type from 3rd Type System: " + sts3);
//compare to the expected xm_errors
assertEquals(1, err.size());
XmlError xErr = err.get(0);
assertEquals("src-resolve", xErr.getErrorCode());
assertEquals("type 'bType@http://baz' not found.", xErr.getMessage());
}
}