[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