blob: 0a5c44d051dab88e8bbb36c1f8e0665c94acd99b [file] [log] [blame]
/*
* 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 misc.detailed;
import org.apache.xmlbeans.SchemaType;
import org.apache.xmlbeans.SchemaTypeLoader;
import org.apache.xmlbeans.XmlBeans;
import org.junit.Test;
import javax.xml.namespace.QName;
import java.io.File;
import java.net.URL;
import java.net.URLClassLoader;
import java.util.ArrayList;
import java.util.List;
import static org.junit.Assert.*;
/* Test class loading using XmlBeans.getContextLoader() after changes to SystemCache.java (r240333)
* Now a custom implementation of the SystemCache can be provided
*/
public class SystemCacheClassloadersTest {
@Test
public void testSystemCacheAndThreadLocal()
{
Thread testThread = new SystemCacheThread("SchemTypeLoader Test Thread");
try {
testThread.start();
}
catch (Exception e) {
e.printStackTrace();
}
finally {
try {
testThread.join();
}
catch (InterruptedException ie) {
ie.printStackTrace();
}
}
}
public static class SystemCacheThread extends Thread
{
private String name;
SystemCacheThread(String threadName)
{
super();
name = threadName;
}
/**
*/
public void run()
{
System.out.println("Run Method of thread " + name);
try {
// test classloading from 2 different scomp jars using the default impl of SystemCache
testDefaultSystemCacheClassLoading();
}
catch (Throwable t) {
t.printStackTrace();
}
}
void testDefaultSystemCacheClassLoading()
{
try {
// create classloaders here
String xbean_home = System.getProperty("xbean.rootdir");
if (xbean_home == null) {
xbean_home = new File(".").getAbsolutePath();
}
String[] domPaths = {
"build/classes",
"build/test-syscache/2/classes",
"build/test-syscache/2/generated-resources"
};
List<URL> domUrls = new ArrayList<URL>();
for (String p : domPaths) {
domUrls.add(new File(xbean_home, p).toURI().toURL());
}
String[] miscPaths = {
"build/classes",
"build/test-syscache/1/classes",
"build/test-syscache/1/generated-resources"
};
List<URL> miscUrls = new ArrayList<URL>();
for (String p : miscPaths) {
miscUrls.add(new File(xbean_home, p).toURI().toURL());
}
URLClassLoader domCL = new URLClassLoader(domUrls.toArray(new URL[0]));
URLClassLoader miscCL = new URLClassLoader(miscUrls.toArray(new URL[0]));
// define the Qnames of types to look for in the compiled xbeans after switching the class loaders
QName domTypeQName = new QName("http://xbean/misc/SyscacheTests2", "elementT");
QName miscPersonTypeQName = new QName("http://xbean/misc/SyscacheTests1", "personType", "test");
setContextClassLoader(domCL);
//System.out.println("Testing elementT Type From dom tests complexTypeTest.xsd");
SchemaTypeLoader initialDomLoader = XmlBeans.getContextTypeLoader();
SchemaType domSchemaType = initialDomLoader.findType(domTypeQName);
assertNotNull(domSchemaType);
assertEquals("Invalid Type!", domSchemaType.getFullJavaImplName(), "xbean.misc.syscacheTests2.impl.ElementTImpl");
// -ve test, look for the person type from cases\misc\syscachetest.xsd
SchemaType personTypeFromMiscTests = initialDomLoader.findType(miscPersonTypeQName);
assertNull(personTypeFromMiscTests);
// switch the SchemaTypeLoader
setContextClassLoader(miscCL);
//System.out.println("Testing Person Type From misc syscachetests.xsd");
SchemaTypeLoader initialMiscSchemaLoader = XmlBeans.getContextTypeLoader();
SchemaType miscPersonType = initialMiscSchemaLoader.findType(miscPersonTypeQName);
assertNotNull(miscPersonType);
assertEquals("Invalid Type!", miscPersonType.getFullJavaImplName(), "xbean.misc.syscacheTests1.impl.PersonTypeImpl");
// -ve test
SchemaType personTypeFromMisc = initialMiscSchemaLoader.findType(domTypeQName);
assertNull(personTypeFromMisc);
// reload the original loader
setContextClassLoader(domCL);
SchemaTypeLoader secondDomLoader = XmlBeans.getContextTypeLoader();
assertNotNull(secondDomLoader.findType(domTypeQName));
assertSame("SchemaTypeLoaders expected to be equal", initialDomLoader, secondDomLoader);
setContextClassLoader(miscCL);
SchemaTypeLoader secondMiscLoader = XmlBeans.getContextTypeLoader();
assertSame("SchemaTypeLoaders expected to be equal", initialMiscSchemaLoader, secondMiscLoader);
}
catch (Throwable t) {
t.printStackTrace();
}
}
}
}