[jboss-cvs] jboss-seam/src/main/org/jboss/seam/init ...
Emmanuel Bernard
emmanuel.bernard at jboss.com
Wed Apr 18 02:40:04 EDT 2007
User: ebernard
Date: 07/04/18 02:40:04
Modified: src/main/org/jboss/seam/init Initialization.java
Added: src/main/org/jboss/seam/init JavaHotRedeployable.java
NoHotRedeployable.java GroovyHotRedeployable.java
RedeployableStrategy.java
Log:
JBSEAM-1199 Support for .groovy deployment in WEB-INF/dev Cannot be used to write EJB 3 Groovy session beans
JBSEAM-1200 Support for Groovy in the seam-gen environment
Revision Changes Path
1.167 +56 -51 jboss-seam/src/main/org/jboss/seam/init/Initialization.java
(In the diff below, changes in quantity of whitespace are not shown.)
Index: Initialization.java
===================================================================
RCS file: /cvsroot/jboss/jboss-seam/src/main/org/jboss/seam/init/Initialization.java,v
retrieving revision 1.166
retrieving revision 1.167
diff -u -b -r1.166 -r1.167
--- Initialization.java 26 Mar 2007 17:53:57 -0000 1.166
+++ Initialization.java 18 Apr 2007 06:40:04 -0000 1.167
@@ -5,12 +5,9 @@
*/
package org.jboss.seam.init;
-import java.io.File;
import java.io.IOException;
import java.io.InputStream;
-import java.net.MalformedURLException;
import java.net.URL;
-import java.net.URLClassLoader;
import java.util.ArrayList;
import java.util.Enumeration;
import java.util.HashMap;
@@ -21,6 +18,7 @@
import java.util.Set;
import java.util.StringTokenizer;
import java.util.TreeSet;
+import java.lang.reflect.Constructor;
import javax.servlet.ServletContext;
import javax.servlet.http.HttpSession;
@@ -57,7 +55,7 @@
/**
* @author Gavin King
* @author <a href="mailto:theute at jboss.org">Thomas Heute</a>
- * @version $Revision: 1.166 $
+ * @version $Revision: 1.167 $
*/
public class Initialization
{
@@ -73,9 +71,6 @@
private Map<String, NamespaceDescriptor> namespaceMap = new HashMap<String, NamespaceDescriptor>();
private final Map<String, EventListenerDescriptor> eventListenerDescriptors = new HashMap<String, EventListenerDescriptor>();
- private File[] hotDeployPaths;
- private ClassLoader hotDeployClassLoader;
-
public Initialization(ServletContext servletContext)
{
this.servletContext = servletContext;
@@ -485,11 +480,10 @@
log.info("initializing Seam");
Lifecycle.beginInitialization(servletContext);
Contexts.getApplicationContext().set(Component.PROPERTIES, properties);
- initHotDeployClassLoader();
- scanForHotDeployableComponents();
+ RedeployableStrategy redeployStrategy = getRedeployableInitialization();
+ scanForHotDeployableComponents(redeployStrategy);
scanForComponents();
-
- addComponent( new ComponentDescriptor(Init.class), Contexts.getApplicationContext() );
+ addComponent( new ComponentDescriptor(Init.class), Contexts.getApplicationContext(), redeployStrategy );
Init init = (Init) Component.getInstance(Init.class, ScopeType.APPLICATION);
ComponentDescriptor desc = findDescriptor(Jbpm.class);
if (desc != null && desc.isInstalled())
@@ -497,10 +491,10 @@
init.setJbpmInstalled(true);
}
init.setTimestamp( System.currentTimeMillis() );
- init.setHotDeployPaths(hotDeployPaths);
+ init.setHotDeployPaths( redeployStrategy.getPaths() );
addSpecialComponents(init);
- installComponents(init);
+ installComponents(init, redeployStrategy);
Lifecycle.endInitialization();
log.info("done initializing Seam");
return this;
@@ -521,56 +515,67 @@
}
Contexts.getApplicationContext().remove(name + ".component");
}
- initHotDeployClassLoader();
- scanForHotDeployableComponents();
+ //TODO open the ability to reuse the classloader by looking at the components class classloaders
+ RedeployableStrategy redeployStrategy = getRedeployableInitialization();
+ scanForHotDeployableComponents(redeployStrategy);
init.setTimestamp( System.currentTimeMillis() );
- init.setHotDeployPaths(hotDeployPaths);
- installComponents(init);
+ init.setHotDeployPaths(redeployStrategy.getPaths());
+ installComponents(init, redeployStrategy);
Lifecycle.endInitialization();
log.info("done redeploying");
return this;
}
- private void initHotDeployClassLoader()
- {
+ private RedeployableStrategy getRedeployableInitialization() {
+ //really a factory
ClassLoader contextClassLoader = Thread.currentThread().getContextClassLoader();
- try
- {
URL resource = contextClassLoader.getResource("META-INF/debug.xhtml");
- if (resource!=null)
- {
- String path = resource.toExternalForm();
- String hotDeployDirectory = path.substring( 9, path.length()-46 ) + "dev";
- File directory = new File(hotDeployDirectory);
- if ( directory.exists() )
+ boolean isGroovy = false;
+ try {
+ Reflections.classForName( "groovy.lang.GroovyObject" );
+ isGroovy = true;
+ }
+ catch (ClassNotFoundException e)
{
- URL url = directory.toURL();
- /*File[] jars = directory.listFiles( new FilenameFilter() {
- public boolean accept(File file, String name) { return name.endsWith(".jar"); }
- } );
- URL[] urls = new URL[jars.length];
- for (int i=0; i<jars.length; i++)
+ //groovy is not there
+ }
+ if (resource!=null && isGroovy)
{
- urls[i] = jars[i].toURL();
- }*/
- URL[] urls = {url};
- hotDeployClassLoader = new URLClassLoader(urls, contextClassLoader);
- hotDeployPaths = new File[] {directory};
+ log.debug("Using Java+Groovy hot deploy");
+ return buildRedeployableInitializer( "org.jboss.seam.init.GroovyHotRedeployable", resource );
+ }
+ else if (resource!=null) {
+ log.debug("Using Java hot deploy");
+ return buildRedeployableInitializer( "org.jboss.seam.init.JavaHotRedeployable", resource );
}
+// else if (isGroovy) {
+// //TODO Implement it even when debug is not set up
+// }
+ else {
+ log.debug("No hot deploy used");
+ return buildRedeployableInitializer( "org.jboss.seam.init.NoHotRedeployable", resource );
}
}
- catch (MalformedURLException mue)
+
+ private RedeployableStrategy buildRedeployableInitializer(String classname, URL resource)
{
- throw new RuntimeException(mue);
+ try {
+ Class initializer = Reflections.classForName( classname );
+ Constructor ctr = initializer.getConstructor( URL.class );
+ return (RedeployableStrategy) ctr.newInstance( resource );
+ }
+ catch (Exception e)
+ {
+ throw new RuntimeException( "Unable to instanciate redeployable strategy: " + classname );
}
}
- private void scanForHotDeployableComponents()
- {
- if ( hotDeployClassLoader!=null )
+ private void scanForHotDeployableComponents(RedeployableStrategy redeployStrategy)
{
+ ComponentScanner scanner = redeployStrategy.getScanner();
+ if (scanner != null) {
Set<Class<Object>> scannedClasses = new HashSet<Class<Object>>();
- scannedClasses.addAll( new ComponentScanner(null, hotDeployClassLoader).getClasses() );
+ scannedClasses.addAll(scanner.getClasses());
Set<Package> scannedPackages = new HashSet<Package>();
for (Class<Object> scannedClass: scannedClasses)
{
@@ -781,7 +786,7 @@
}
}
- private void installComponents(Init init)
+ private void installComponents(Init init, RedeployableStrategy redeployStrategy)
{
log.info("Installing components...");
Context context = Contexts.getApplicationContext();
@@ -793,7 +798,7 @@
String compName = componentDescriptor.getName() + COMPONENT_SUFFIX;
if (!context.isSet(compName)) {
- addComponent(componentDescriptor, context);
+ addComponent(componentDescriptor, context, redeployStrategy);
if (componentDescriptor.isAutoCreate()) {
init.addAutocreateVariable( componentDescriptor.getName() );
@@ -842,7 +847,7 @@
* This actually creates a real Component and should only be called when
* we want to install a component
*/
- protected void addComponent(ComponentDescriptor descriptor, Context context)
+ protected void addComponent(ComponentDescriptor descriptor, Context context, RedeployableStrategy redeployStrategy)
{
String name = descriptor.getName();
String componentName = name + COMPONENT_SUFFIX;
@@ -855,7 +860,7 @@
descriptor.getJndiName()
);
context.set(componentName, component);
- if ( descriptor.getComponentClass().getClassLoader()==hotDeployClassLoader )
+ if ( redeployStrategy.isFromHotDeployClassLoader( descriptor.getComponentClass() ) )
{
Init.instance().addHotDeployableComponent( component.getName() );
}
1.1 date: 2007/04/18 06:40:04; author: ebernard; state: Exp;jboss-seam/src/main/org/jboss/seam/init/JavaHotRedeployable.java
Index: JavaHotRedeployable.java
===================================================================
//$Id: JavaHotRedeployable.java,v 1.1 2007/04/18 06:40:04 ebernard Exp $
package org.jboss.seam.init;
import java.io.File;
import java.net.MalformedURLException;
import java.net.URL;
import java.net.URLClassLoader;
import org.jboss.seam.deployment.ComponentScanner;
import org.jboss.seam.log.LogProvider;
import org.jboss.seam.log.Logging;
/**
* Hot redeployment of Java classes
*
* @author Emmanuel Bernard
*/
public class JavaHotRedeployable implements RedeployableStrategy
{
private static final LogProvider log = Logging.getLogProvider(JavaHotRedeployable.class);
protected File[] paths;
protected ClassLoader classLoader;
public JavaHotRedeployable(URL resource)
{
try
{
String path = resource.toExternalForm();
String hotDeployDirectory = path.substring(9, path.length() - 46) + "dev";
File directory = new File(hotDeployDirectory);
if (directory.exists())
{
URL url = directory.toURL();
/*File[] jars = directory.listFiles( new FilenameFilter() {
public boolean accept(File file, String name) { return name.endsWith(".jar"); }
} );
URL[] urls = new URL[jars.length];
for (int i=0; i<jars.length; i++)
{
urls[i] = jars[i].toURL();
}*/
URL[] urls = { url };
classLoader = new URLClassLoader(urls, Thread.currentThread().getContextClassLoader());
paths = new File[] { directory };
}
}
catch (MalformedURLException mue)
{
throw new RuntimeException(mue);
}
}
public ClassLoader getClassLoader()
{
return classLoader;
}
public File[] getPaths()
{
return paths;
}
public ComponentScanner getScanner()
{
//no classloader means we did not find the path
return classLoader != null ? new ComponentScanner(null, classLoader) : null;
}
public boolean isFromHotDeployClassLoader(Class componentClass)
{
return componentClass.getClassLoader() == classLoader;
}
}
1.1 date: 2007/04/18 06:40:04; author: ebernard; state: Exp;jboss-seam/src/main/org/jboss/seam/init/NoHotRedeployable.java
Index: NoHotRedeployable.java
===================================================================
//$Id: NoHotRedeployable.java,v 1.1 2007/04/18 06:40:04 ebernard Exp $
package org.jboss.seam.init;
import java.io.File;
import java.net.URL;
import org.jboss.seam.deployment.ComponentScanner;
/**
* No hot deployment environment
*
* @author Emmanuel Bernard
*/
public class NoHotRedeployable implements RedeployableStrategy
{
public NoHotRedeployable(URL resource) {
}
public ClassLoader getClassLoader()
{
return null;
}
public File[] getPaths()
{
return null;
}
public ComponentScanner getScanner()
{
return null;
}
public boolean isFromHotDeployClassLoader(Class componentClass)
{
return false;
}
}
1.1 date: 2007/04/18 06:40:04; author: ebernard; state: Exp;jboss-seam/src/main/org/jboss/seam/init/GroovyHotRedeployable.java
Index: GroovyHotRedeployable.java
===================================================================
//$Id: GroovyHotRedeployable.java,v 1.1 2007/04/18 06:40:04 ebernard Exp $
package org.jboss.seam.init;
import java.net.URL;
import groovy.lang.GroovyClassLoader;
import org.codehaus.groovy.control.CompilerConfiguration;
import org.jboss.seam.deployment.ComponentScanner;
import org.jboss.seam.deployment.GroovyComponentScanner;
import org.jboss.seam.log.LogProvider;
import org.jboss.seam.log.Logging;
/**
* Support Groovy file loading as well as Java class loading
* from hot directory
*
* @author Emmanuel Bernard
*/
public class GroovyHotRedeployable extends JavaHotRedeployable
{
private static final String DEFAULT_SCRIPT_EXTENSION = new CompilerConfiguration().getDefaultScriptExtension();
private static final LogProvider log = Logging.getLogProvider(GroovyHotRedeployable.class);
public GroovyHotRedeployable(URL resource)
{
super(resource);
/**
* No need for the Groovy Hotdeploy capability since the parent classloader needs
* to be replaced to hot deploy classes
*/
if (classLoader != null) classLoader = new GroovyClassLoader(classLoader);
}
public ComponentScanner getScanner()
{
return classLoader != null ?
new GroovyComponentScanner(null, (GroovyClassLoader) getClassLoader(), DEFAULT_SCRIPT_EXTENSION) :
null;
}
public boolean isFromHotDeployClassLoader(Class componentClass)
{
//loaded by groovy or java
if (classLoader == null) return false;
ClassLoader classClassLoader = componentClass.getClassLoader().getParent(); //Groovy use an Inner Delegate CL
return classClassLoader == classLoader || classClassLoader == classLoader.getParent();
}
}
1.1 date: 2007/04/18 06:40:04; author: ebernard; state: Exp;jboss-seam/src/main/org/jboss/seam/init/RedeployableStrategy.java
Index: RedeployableStrategy.java
===================================================================
//$Id: RedeployableStrategy.java,v 1.1 2007/04/18 06:40:04 ebernard Exp $
package org.jboss.seam.init;
import java.io.File;
import org.jboss.seam.deployment.ComponentScanner;
import org.jboss.seam.deployment.Scanner;
/**
* Abstract the redeployable initialization mechanism
* to prevent hard dependency between Seam and the
* scripting language infrastructure
*
* @author Emmanuel Bernard
*/
public interface RedeployableStrategy
{
/**
* Mandatory constructor
*
* @param resource url containing the redeployable files
*/
//RedeployableInitialization(URL resource);
ClassLoader getClassLoader();
File[] getPaths();
ComponentScanner getScanner();
boolean isFromHotDeployClassLoader(Class componentClass);
}
More information about the jboss-cvs-commits
mailing list