/**
* Copyright 2010 Marko Lavikainen
*
* 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 net.contextfw.web.application.internal.classloading;
import static net.contextfw.web.application.configuration.Configuration.RELOADABLE_CLASSES;
import static net.contextfw.web.application.configuration.Configuration.VIEW_COMPONENT_ROOT_PACKAGE;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertNotSame;
import static org.junit.Assert.assertTrue;
import java.util.Set;
import net.contextfw.web.application.configuration.Configuration;
import net.contextfw.web.application.development.DevelopmentModeListener;
import net.contextfw.web.application.internal.development.ClassLoaderProvider;
import net.contextfw.web.application.internal.development.DevelopmentToolsImpl;
import net.contextfw.web.application.internal.development.InternalDevelopmentTools;
import net.contextfw.web.application.internal.development.ReloadingClassLoader;
import net.contextfw.web.application.internal.development.ReloadingClassLoaderConf;
import org.apache.commons.lang.mutable.MutableBoolean;
import org.junit.Before;
import org.junit.Test;
public class ReloadingClassLoaderTest {
private Configuration conf;
@Before
public void setup() {
conf = Configuration.getDefaults()
.add(VIEW_COMPONENT_ROOT_PACKAGE, "net.contextfw.views");
}
@Test
public void Reloadable_Packages() {
conf = conf
.add(RELOADABLE_CLASSES.includedPackage("net.contextfw", false))
.add(RELOADABLE_CLASSES.includedPackage("net.contextfw.web2", false))
.add(RELOADABLE_CLASSES.includedPackage("net.contextfw", false))
.add(RELOADABLE_CLASSES.includedPackage("net.contextfw.web"));
ReloadingClassLoaderConf rConf = new ReloadingClassLoaderConf(conf);
assertTrue(rConf.isInReloadablePackage("net.contextfw.Link"));
assertTrue(rConf.isInReloadablePackage("net.contextfw.web.SomeClass"));
assertTrue(rConf.isInReloadablePackage("net.contextfw.web2.SomeClass"));
assertTrue(rConf.isInReloadablePackage("net.contextfw.web.sub.SomeClass"));
assertTrue(rConf.isInReloadablePackage("net.contextfw.views.SomeClass"));
assertTrue(rConf.isInReloadablePackage("net.contextfw.views.sub.SomeClass"));
assertFalse(rConf.isInReloadablePackage("net.contextfw.a.Link"));
assertFalse(rConf.isInReloadablePackage("net.contextfw.web2.sub.SomeClass"));
assertFalse(rConf.isInReloadablePackage("net.contextfw.web2.sub.sab.SomeClass"));
Set<String> names = rConf.getReloadablePackageNames();
assertTrue(names.contains("net.contextfw.web"));
assertTrue(names.contains("net.contextfw.views"));
}
@Test
public void Excluded_Classes() {
conf = conf
.add(RELOADABLE_CLASSES.excludedClass(String.class))
.add(RELOADABLE_CLASSES.excludedClass(ReloadingClassLoader.class));
ReloadingClassLoaderConf rConf = new ReloadingClassLoaderConf(conf);
Set<Class<?>> classes = rConf.getExcludedClasses();
assertEquals(2, classes.size());
assertTrue(classes.contains(String.class));
assertTrue(classes.contains(ReloadingClassLoader.class));
}
@Test
public void Load_Classes() throws ClassNotFoundException {
conf = conf
.add(RELOADABLE_CLASSES.includedPackage("net.contextfw.web.application.internal.classloading", false))
.add(RELOADABLE_CLASSES.excludedClass(NonReloadable.class));
InternalDevelopmentTools tools = new DevelopmentToolsImpl(conf);
final MutableBoolean classesReloaded = new MutableBoolean(false);
final MutableBoolean resourcesReloaded = new MutableBoolean(false);
tools.addListener(new DevelopmentModeListener() {
@Override
public void resourcesReloaded() {
resourcesReloaded.setValue(true);
}
@Override
public void classesReloaded(ClassLoader classLoader) {
classesReloaded.setValue(true);
}
});
ClassLoader classLoader = tools.reloadClasses();
tools.reloadResources();
assertTrue(classesReloaded.booleanValue());
assertTrue(resourcesReloaded.booleanValue());
Class<?> reloadable =
classLoader.loadClass("net.contextfw.web.application.internal.classloading.Reloadable");
Class<?> nonReloadable =
classLoader.loadClass("net.contextfw.web.application.internal.classloading.NonReloadable");
assertEquals(NonReloadable.class, nonReloadable);
assertNotSame(Reloadable.class, reloadable);
assertEquals(String.class, classLoader.loadClass("java.lang.String"));
}
@Test(expected=ClassNotFoundException.class)
public void Throw_Class_CastException() throws ClassNotFoundException {
conf = conf
.add(RELOADABLE_CLASSES.includedPackage("net.contextfw.web.application.internal.classloading", false))
.add(RELOADABLE_CLASSES.excludedClass(NonReloadable.class));
ClassLoaderProvider provider = new ClassLoaderProvider(
new ReloadingClassLoaderConf(conf));
ClassLoader classLoader = provider.reload();
classLoader.loadClass("net.contextfw.web.application.internal.classloading.Reloadaple");
}
}