blob: abe703bd678d194674e9df491f28bb2a53c72b1e [file] [log] [blame]
/*
* 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.myfaces.extensions.scripting.sandbox;
import org.apache.myfaces.extensions.scripting.core.support.AbstractGeneratorTestCase;
import org.apache.myfaces.extensions.scripting.sandbox.loader.ReloadingClassLoader;
import org.junit.Ignore;
import java.io.File;
/**
* <p>Test class for
* <code>org.apache.myfaces.extensions.scripting.sandbox.loader.ReloadingClassLoader</code></p>
*/
@Ignore
public class ReloadingClassLoaderTest extends AbstractGeneratorTestCase {
// ------------------------------------------ Test methods
public void testCompileAndLoadFile() throws Exception {
// Compile a dynamically generated class ..
compileFile("/src/main/java", "/target/test-classes", "org/apache/myfaces/extensions/scripting/Greeter.java", new String[]{
"package org.apache.myfaces.extensions.scripting; ",
" ",
"public class Greeter { ",
" ",
" public String sayHello() { ",
" return \"Hello World\"; ",
" } ",
"} "
});
ClassLoader classLoader = buildClassLoader("/target/test-classes");
// .. and try to load it afterwards.
Class greeterClass = classLoader.loadClass("org.apache.myfaces.extensions.scripting.Greeter");
assertNotNull(greeterClass);
assertEquals("org.apache.myfaces.extensions.scripting.Greeter", greeterClass.getName());
Object greeter = greeterClass.newInstance();
String greeting = (String) greeter.getClass().getMethod("sayHello").invoke(greeter);
assertEquals("Hello World", greeting);
}
public void testCompileAndLoadFileMultipleTimes() throws Exception {
// Compile a dynamically generated class ..
compileFile("/src/main/java", "/target/test-classes", "org/apache/myfaces/extensions/scripting/Greeter.java", new String[]{
"package org.apache.myfaces.extensions.scripting; ",
" ",
"public class Greeter { ",
" ",
" public String sayHello() { ",
" return \"Hello World\"; ",
" } ",
"} "
});
ClassLoader classLoader = buildClassLoader("/target/test-classes");
// .. and try to load it afterwards ..
Class firstGreeterClass = classLoader.loadClass("org.apache.myfaces.extensions.scripting.Greeter");
assertNotNull(firstGreeterClass);
assertEquals("org.apache.myfaces.extensions.scripting.Greeter", firstGreeterClass.getName());
// .. more than once using the same classloader.
Class secondGreeterClass = classLoader.loadClass("org.apache.myfaces.extensions.scripting.Greeter");
assertNotNull(secondGreeterClass);
assertEquals("org.apache.myfaces.extensions.scripting.Greeter", secondGreeterClass.getName());
assertSame(firstGreeterClass, secondGreeterClass);
}
public void testRecompileAndLoadFile() throws Exception {
// Compile a dynamically generated class.
compileFile("/src/main/java", "/target/test-classes", "org/apache/myfaces/extensions/scripting/Greeter.java", new String[]{
"package org.apache.myfaces.extensions.scripting; ",
" ",
"public class Greeter { ",
" ",
" public String sayHello() { ",
" return \"Hello World\"; ",
" } ",
"} "
});
ClassLoader classLoader = buildClassLoader("/target/test-classes");
Class firstGreeterClass = classLoader.loadClass("org.apache.myfaces.extensions.scripting.Greeter");
assertNotNull(firstGreeterClass);
assertEquals("org.apache.myfaces.extensions.scripting.Greeter", firstGreeterClass.getName());
Object firstGreeter = firstGreeterClass.newInstance();
String greeting = (String) firstGreeterClass.getMethod("sayHello").invoke(firstGreeter);
assertEquals("Hello World", greeting);
Thread.sleep(1000);
// Modify the source code
// Compile a dynamically generated class ..
compileFile("/src/main/java", "/target/test-classes", "org/apache/myfaces/extensions/scripting/Greeter.java", new String[]{
"package org.apache.myfaces.extensions.scripting; ",
" ",
"public class Greeter { ",
" ",
" public String sayHello() { ",
" return \"Hello Universe\"; ",
" } ",
"} "
});
// Reload the class and verify it again
Class secondGreeterClass = classLoader.loadClass("org.apache.myfaces.extensions.scripting.Greeter");
assertNotNull(secondGreeterClass);
assertEquals("org.apache.myfaces.extensions.scripting.Greeter", secondGreeterClass.getName());
// However, it has to be a new Class object
assertNotSame(firstGreeterClass, secondGreeterClass);
Object secondGreeter = secondGreeterClass.newInstance();
greeting = (String) secondGreeterClass.getMethod("sayHello").invoke(secondGreeter);
assertEquals("Hello Universe", greeting);
}
public void testOverrideFile() throws Exception {
ClassLoader classLoader = buildClassLoader("/target/test-classes");
Greeter greeter = (Greeter) classLoader.loadClass(
"org.apache.myfaces.extensions.scripting.sandbox.DefaultGreeter").newInstance();
assertEquals("Hello", greeter.sayHello());
// Compile a dynamically generated class.
compileFile("/src/main/java", "/target/test-classes", "org/apache/myfaces/extensions/scripting/loader/DefaultGreeter.java", new String[]{
"package org.apache.myfaces.extensions.scripting.sandbox.loader; ",
" ",
"public class DefaultGreeter implements Greeter { ",
" ",
" public String sayHello() { ",
" return \"Hi\"; ",
" } ",
"} "
});
greeter = (Greeter) classLoader.loadClass(
"org.apache.myfaces.extensions.scripting.sandbox.DefaultGreeter").newInstance();
assertEquals("Hi", greeter.sayHello());
}
public void testOverrideFileAndCheckDependentClass() throws Exception {
ReloadingClassLoader classLoader = buildClassLoader("/target/test-classes");
PersonGreeter greeter = (PersonGreeter) classLoader.loadClass(
"org.apache.myfaces.extensions.scripting.sandbox.DefaultPersonGreeter").newInstance();
assertEquals("Hello John Doe!", greeter.sayHello("John Doe"));
// Compile a dynamically generated class.
compileFile("/src/main/java", "/target/test-classes", "org/apache/myfaces/extensions/scripting/loader/DefaultGreeter.java", new String[]{
"package org.apache.myfaces.extensions.scripting.sandbox.loader; ",
" ",
"public class DefaultGreeter implements Greeter { ",
" ",
" public String sayHello() { ",
" return \"Hi\"; ",
" } ",
"} "
});
// Note that the person greeter still uses the outdated version of the class file.
greeter = (PersonGreeter) classLoader.loadClass(
"org.apache.myfaces.extensions.scripting.sandbox.DefaultPersonGreeter").newInstance();
assertEquals("Hello John Doe!", greeter.sayHello("John Doe"));
// However, now we're forcefully reloading this class in order to reflect the changes.
classLoader.reloadClass("org.apache.myfaces.extensions.scripting.sandbox.DefaultPersonGreeter");
// Note that the person greeter still uses the outdated version of the class file.
greeter = (PersonGreeter) classLoader.loadClass(
"org.apache.myfaces.extensions.scripting.sandbox.DefaultPersonGreeter").newInstance();
assertEquals("Hi John Doe!", greeter.sayHello("John Doe"));
}
public void testCompileAndLoadFileWithDependencies() throws Exception {
compileFile("/src/main/java", "/target/test-classes", "org/apache/myfaces/extensions/scripting/DummyCompiler.java", new String[]{
"package org.apache.myfaces.extensions.scripting; ",
" ",
"import java.io.File; ",
"import org.apache.myfaces.extensions.scripting.sandbox.compiler.Compiler; ",
"import org.apache.myfaces.extensions.scripting.api.CompilationResult; ",
" ",
"public class DummyCompiler implements Compiler { ",
" ",
" public CompilationResult compile(File s, File t, String f, ClassLoader c) { ",
" return null; ",
" } ",
" ",
" public CompilationResult compile(File s, File t, File f, ClassLoader c) { ",
" return null; ",
" } ",
"} "
});
// Create a new class loader to load the dynamically compiled class
ClassLoader classLoader = buildClassLoader("/target/test-classes");
// Load the dynamically compiled class
Class dummyCompilerClass = classLoader.loadClass("org.apache.myfaces.extensions.scripting.DummyCompiler");
assertNotNull(dummyCompilerClass);
assertEquals("org.apache.myfaces.extensions.scripting.DummyCompiler", dummyCompilerClass.getName());
}
public void testLoadParentClassFile() throws Exception {
ClassLoader classLoader = buildClassLoader("/target/test-classes");
Class compilerInterface = classLoader.loadClass("org.apache.myfaces.extensions.scripting.sandbox.compiler.Compiler");
assertNotNull(compilerInterface);
assertEquals("org.apache.myfaces.extensions.scripting.sandbox.compiler.Compiler", compilerInterface.getName());
}
public void testOutdatedCheck() throws Exception {
// Compile a dynamically generated class ..
compileFile("/src/main/java", "/target/test-classes", "org/apache/myfaces/extensions/scripting/Greeter.java", new String[]{
"package org.apache.myfaces.extensions.scripting; ",
" ",
"public class Greeter { ",
" ",
" public String sayHello() { ",
" return \"Hello World\"; ",
" } ",
"} "
});
ReloadingClassLoader classLoader = buildClassLoader("/target/test-classes");
Class firstGreeterClass = classLoader.loadClass("org.apache.myfaces.extensions.scripting.Greeter");
assertNotNull(firstGreeterClass);
assertEquals("org.apache.myfaces.extensions.scripting.Greeter", firstGreeterClass.getName());
assertFalse(classLoader.isOutdated(firstGreeterClass));
Thread.sleep(1000);
// Modify the source code ..
compileFile("/src/main/java", "/target/test-classes", "org/apache/myfaces/extensions/scripting/Greeter.java", new String[]{
"package org.apache.myfaces.extensions.scripting; ",
" ",
"public class Greeter { ",
" ",
" public String sayHello() { ",
" return \"Hello Universe\"; ",
" } ",
"} "
});
// .. and test whether the classloader recognizes that we've got an outdated Class reference here.
assertTrue(classLoader.isOutdated(firstGreeterClass));
}
// ------------------------------------------ Utility methods
protected ReloadingClassLoader buildClassLoader(String compilationDirectory) {
return new ReloadingClassLoader(getClass().getClassLoader(),
new File(buildAbsolutePath(compilationDirectory)));
}
}