/* | |
* 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(); | |
} | |
} | |
} | |
} |