/**
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you 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 org.apache.cxf.jca.core.classloader;
import java.io.InputStream;
import java.net.URL;
import java.security.ProtectionDomain;
import java.util.logging.Level;
import java.util.logging.Logger;
import org.apache.cxf.common.logging.LogUtils;
import org.apache.cxf.helpers.IOUtils;
import org.junit.Assert;
import org.junit.Before;
import org.junit.Test;
public class PlugInClassLoaderTest extends Assert {
private static final Logger LOG = LogUtils.getLogger(PlugInClassLoaderTest.class);
private static boolean debug;
PlugInClassLoader plugInClassLoader;
@Before
public void setUp() throws Exception {
plugInClassLoader = new PlugInClassLoader(getClass().getClassLoader());
if (debug) {
LOG.setLevel(Level.INFO);
} else {
LOG.setLevel(Level.WARNING);
}
}
@Test
public void testLoadClassWithPlugInClassLoader() throws Exception {
Class<?> resultClass = plugInClassLoader.loadClass(
"org.apache.cxf.jca.dummy.Dummy");
assertEquals("wrong class", "org.apache.cxf.jca.dummy.Dummy",
resultClass.getName());
assertEquals("class loader must be the plugInClassLoader",
plugInClassLoader, resultClass.getClassLoader());
}
@Test
public void testInheritsClassLoaderProtectionDomain()
throws Exception {
Class<?> resultClass = plugInClassLoader.loadClass(
"org.apache.cxf.jca.dummy.Dummy");
ProtectionDomain pd1 = plugInClassLoader.getClass().getProtectionDomain();
ProtectionDomain pd2 = resultClass.getProtectionDomain();
LOG.info("PluginClassLoader protection domain: " + pd1);
LOG.info("resultClass protection domain: " + pd2);
assertEquals("protection domain has to be inherited from the PluginClassLoader. ",
pd1, pd2);
}
@Test
public void testLoadClassWithParentClassLoader() throws Exception {
Class<?> resultClass = plugInClassLoader.loadClass("org.omg.CORBA.ORB");
assertEquals("wrong class", "org.omg.CORBA.ORB", resultClass.getName());
assertTrue("class loader must NOT be the plugInClassLoader",
!(plugInClassLoader.equals(resultClass.getClassLoader())));
}
@Test
public void testLoadNonExistentClassWithPlugInClassLoader()
throws Exception {
try {
plugInClassLoader.loadClass("org.objectweb.foo.bar");
fail("Expected ClassNotFoundException");
} catch (ClassNotFoundException ex) {
LOG.fine("Exception message: " + ex.getMessage());
assertNotNull("Exception message must not be null.", ex.getMessage());
assertTrue("not found class must be part of the message. ",
ex.getMessage().indexOf("org.objectweb.foo.bar") > -1);
}
}
@Test
public void testLoadNonFilteredButAvailableClassWithPlugInClassLoader()
throws Exception {
String className = "javax.resource.ResourceException";
// ensure it is available
getClass().getClassLoader().loadClass(className);
try {
Class<?> claz = plugInClassLoader.loadClass(className);
assertEquals("That should be same classloader ", claz.getClassLoader(),
getClass().getClassLoader());
} catch (ClassNotFoundException ex) {
fail("Do not Expect ClassNotFoundException");
}
}
@Test
public void testLoadResourceWithPluginClassLoader()
throws Exception {
Class<?> resultClass = plugInClassLoader.loadClass(
"org.apache.cxf.jca.dummy.Dummy");
URL url = resultClass.getResource("dummy.txt");
LOG.info("URL: " + url);
assertTrue("bad url: " + url, url.toString().startsWith("classloader:"));
InputStream configStream = url.openStream();
assertNotNull("stream must not be null. ", configStream);
assertTrue("unexpected stream class: " + configStream.getClass(),
configStream instanceof java.io.ByteArrayInputStream);
byte[] bytes = new byte[10];
configStream.read(bytes, 0, bytes.length);
String result = IOUtils.newStringFromBytes(bytes);
LOG.fine("dummy.txt contents: " + result);
assertEquals("unexpected dummy.txt contents.", "blah,blah.", result);
}
@Test
public void testLoadSlashResourceWithPluginClassLoader()
throws Exception {
Class<?> resultClass = plugInClassLoader.loadClass(
"org.apache.cxf.jca.dummy.Dummy");
URL url = resultClass.getResource("/META-INF/MANIFEST.MF");
LOG.info("URL: " + url);
assertTrue("bad url: " + url, url.toString().startsWith("classloader:"));
InputStream configStream = url.openStream();
assertNotNull("stream must not be null. ", configStream);
assertTrue("unexpected stream class: " + configStream.getClass(),
configStream instanceof java.io.ByteArrayInputStream);
byte[] bytes = new byte[21];
configStream.read(bytes, 0, bytes.length);
String result = IOUtils.newStringFromBytes(bytes);
LOG.fine("dummy.txt contents: " + result);
assertTrue("unexpected dummy.txt contents:" + result, result.indexOf("Manifest-Version: 1.0") != -1);
}
@Test
public void testLoadNonExistentResourceWithPluginClassLoader()
throws Exception {
Class<?> resultClass = plugInClassLoader.loadClass(
"org.apache.cxf.jca.dummy.Dummy");
URL url = resultClass.getResource("foo.txt");
assertNull("url must be null. ", url);
}
@Test
public void testLoadNonExistentDirectory() throws Exception {
URL url = plugInClassLoader.findResource("foo/bar/");
assertNull("url must be null. ", url);
}
@Test
public void testLoadNonExistentNestedDirectory() throws Exception {
URL url = plugInClassLoader.findResource("foo!/bar/");
assertNull("url must be null. ", url);
}
}