You are viewing a plain text version of this content. The canonical link for it is here.
Posted to cvs@avalon.apache.org by ni...@apache.org on 2004/05/22 09:37:51 UTC

svn commit: rev 20207 - in avalon/trunk/tools/magic/engine/src: dist/plugins/plugin java/org/apache/merlin/magic

Author: niclas
Date: Sat May 22 00:37:51 2004
New Revision: 20207

Modified:
   avalon/trunk/tools/magic/engine/src/dist/plugins/plugin/build.bsh
   avalon/trunk/tools/magic/engine/src/java/org/apache/merlin/magic/Builder.java
   avalon/trunk/tools/magic/engine/src/java/org/apache/merlin/magic/FacadeFactory.java
   avalon/trunk/tools/magic/engine/src/java/org/apache/merlin/magic/PluginContext.java
   avalon/trunk/tools/magic/engine/src/java/org/apache/merlin/magic/PluginFacade.java
   avalon/trunk/tools/magic/engine/src/java/org/apache/merlin/magic/PluginServiceManager.java
   avalon/trunk/tools/magic/engine/src/java/org/apache/merlin/magic/ScriptFacade.java
Log:
Added plugin.validate method, which will compile the beanshell script of a Plugin using the Java compiler (javac) to quicker find compilation errors.

Modified: avalon/trunk/tools/magic/engine/src/dist/plugins/plugin/build.bsh
==============================================================================
--- avalon/trunk/tools/magic/engine/src/dist/plugins/plugin/build.bsh	(original)
+++ avalon/trunk/tools/magic/engine/src/dist/plugins/plugin/build.bsh	Sat May 22 00:37:51 2004
@@ -1,48 +1,122 @@
  
 import java.io.File;
 
+import org.apache.merlin.magic.AbstractPlugin;
 import org.apache.merlin.magic.Plugin;
 import org.apache.merlin.magic.PluginContext;
+import org.apache.merlin.magic.PluginFacade;
+import org.apache.merlin.magic.PluginServiceManager;
 
 import org.apache.avalon.framework.context.Context;
 import org.apache.avalon.framework.context.Contextualizable;
 
-import org.apache.avalon.framework.logger.AbstractLogEnabled;
+import org.apache.avalon.framework.service.Serviceable;
+import org.apache.avalon.framework.service.ServiceException;
+import org.apache.avalon.framework.service.ServiceManager;
 
 import org.apache.tools.ant.Project;
 import org.apache.tools.ant.taskdefs.Copy;
+import org.apache.tools.ant.taskdefs.Delete;
+import org.apache.tools.ant.taskdefs.Javac;
 import org.apache.tools.ant.types.FileSet;
+import org.apache.tools.ant.types.Path;
 
-public class PluginPlugin extends AbstractLogEnabled
-    implements Contextualizable, Plugin
+public class PluginPlugin extends AbstractPlugin
+    implements Serviceable
 {
-    private PluginContext m_PluginContext;
+    private PluginServiceManager m_ServiceManager;
     
-    public void contextualize( Context ctx )
+    public void service( ServiceManager man )
+        throws ServiceException
     {
-        m_PluginContext = (PluginContext) ctx;
+        m_ServiceManager = (PluginServiceManager) man;
     }
     
     public void install()
     {
-        getLogger().info( "Installing plugin: " + m_PluginContext.getProjectName() );
+        getLogger().info( "Installing plugin: " + m_Context.getProjectName() );
 
-        String projectName = m_PluginContext.getProjectName();
+        String projectName = m_Context.getProjectName();
                 
-        File systemDir = m_PluginContext.getSystemDir();
+        File systemDir = m_Context.getSystemDir();
         File localpluginrepo = new File( systemDir, "plugins/" + projectName );
-        File srcDir = new File( m_PluginContext.getProjectDir(), "src/dist" );
+        File srcDir = new File( m_Context.getProjectDir(), "src/dist" );
 
-        Project project = m_PluginContext.getAntProject();
         FileSet src = new FileSet();
         src.setDir( srcDir );
         
-        Copy copy = project.createTask( "copy" );
+        Copy copy = m_Project.createTask( "copy" );
         copy.setVerbose( true );
         copy.setTodir( localpluginrepo );
         copy.addFileset( src );
         copy.execute();        
     
         getLogger().info( "Sucess!" );
+    }
+
+    /* Copies the plugin to a Java file and tries to compile it */
+    public void validate()
+        throws ServiceException
+    {
+        File srcDir = new File( m_Context.getProjectDir(), "src/dist/" );
+        File srcFile = new File( srcDir, "build.bsh" );
+        File destDir = m_Context.getTempDir();
+
+        /* Remove any existing content in the Temp dir. */
+        Delete delete = m_Project.createTask( "delete" );
+        delete.setDir( destDir );
+        delete.init();
+        delete.execute();
+        destDir.mkdirs();
+
+        PluginServiceManager sm = m_ServiceManager;
+        
+        PluginFacade pf = sm.getFacade( srcDir );
+        String classname = pf.getPluginClassname();
+        
+        File classfile = new File( destDir, classname + ".java" );
+        
+        Copy copy = m_Project.createTask( "copy" );
+        copy.setVerbose( true );
+        copy.setTofile( classfile  );
+        copy.setFile( srcFile );
+        copy.execute();
+        
+        String classpath = m_Context.getProperty( "java.class.path" );
+         
+        Javac javac = (Javac) m_Project.createTask( "javac" );
+        /* Set the destination */
+        javac.setDestdir( destDir );
+        javac.setDeprecation( true );
+        javac.setDebug( true );
+        javac.setVerbose( false );
+        
+        /* Add Class path defined in the build.properties  */
+        Path cp = javac.createClasspath();
+        Path.PathElement pe = cp.createPathElement();
+        pe.setPath( classpath );
+        /* Later; also add dependency Jars */
+        
+        /* Add the source path */
+        Path src = javac.createSrc();
+        Path.PathElement srcPE = src.createPathElement();
+        srcPE.setLocation( destDir );
+        
+        javac.init();
+        javac.execute(); 
+        
+        getLogger().info( "Compile successful." );
+    }
+    
+    public void loadAll()
+        throws ServiceException
+    {
+        File systemDir = m_Context.getSystemDir();
+        File localpluginrepo = new File( systemDir, "plugins/" + projectName );
+        String[] plugins = localpluginrepo.list();
+        for( int i=0 ; i < plugins.length ; i++ )
+        {
+            m_ServiceManager.lookup( plugins[i] );
+        }
     }
 }

Modified: avalon/trunk/tools/magic/engine/src/java/org/apache/merlin/magic/Builder.java
==============================================================================
--- avalon/trunk/tools/magic/engine/src/java/org/apache/merlin/magic/Builder.java	(original)
+++ avalon/trunk/tools/magic/engine/src/java/org/apache/merlin/magic/Builder.java	Sat May 22 00:37:51 2004
@@ -17,6 +17,7 @@
     private File     m_SystemDir;
     private File     m_ProjectDir;
     private File     m_PluginsDir;
+    private File     m_TempDir;
     
     public Builder( String[] methods, File projectDir )
     {
@@ -27,6 +28,9 @@
         m_SystemDir = findSystemDir();
         m_ProjectDir = projectDir;
         m_PluginsDir = new File( m_SystemDir, "plugins" );
+        m_TempDir = new File( m_SystemDir, "temp" );
+        m_TempDir.mkdirs();
+        
         m_Logger = new ConsoleLogger();
         
         m_Logger.info( " System Directory: " + m_SystemDir );
@@ -45,7 +49,6 @@
         PluginServiceManager sm = new PluginServiceManager( factory, globalProps );
         sm.enableLogging( m_Logger );
         
-        loadAllPlugins( sm );
         for( int i=0 ; i < m_CallMethods.length ; i++ )
         {
             String methodname = m_CallMethods[i];
@@ -96,6 +99,7 @@
         props.put( "magic.plugins.dir", m_PluginsDir.getAbsolutePath() );
         props.put( "magic.repository.dir", new File( m_SystemDir, "repository" ).toString() );
         props.put( "magic.project.dir", m_ProjectDir.getAbsolutePath() );
+        props.put( "magic.temp.dir", m_TempDir.getAbsolutePath() );
         return props;
     }
     
@@ -105,21 +109,5 @@
         File systemDir = new File( system );
         return systemDir;
     }
-    
-    private void loadAllPlugins( PluginServiceManager sm )
-    {
-        String[] plugins = m_PluginsDir.list();
-        for( int i=0 ; i < plugins.length ; i++ )
-        {
-            try
-            {
-                sm.lookup( plugins[i] );
-            } catch( ServiceException e )
-            {
-                m_Logger.error( "Unable to load plugin: " + plugins[i], e );
-            }
-        }
-    }
-    
 } 
  

Modified: avalon/trunk/tools/magic/engine/src/java/org/apache/merlin/magic/FacadeFactory.java
==============================================================================
--- avalon/trunk/tools/magic/engine/src/java/org/apache/merlin/magic/FacadeFactory.java	(original)
+++ avalon/trunk/tools/magic/engine/src/java/org/apache/merlin/magic/FacadeFactory.java	Sat May 22 00:37:51 2004
@@ -1,6 +1,7 @@
 package org.apache.merlin.magic;
 
 import java.io.File;
+import java.io.IOException;
 
 import org.apache.avalon.framework.logger.AbstractLogEnabled;
 import org.apache.avalon.framework.logger.LogEnabled;
@@ -18,10 +19,20 @@
         File bshFile = new File( pluginDir, "build.bsh" );
         if( bshFile.exists() )
         {
-            ScriptFacade facade = new ScriptFacade( context );
-            if( facade instanceof LogEnabled )
-                ((LogEnabled) facade).enableLogging( getLogger() );
-            return facade;
+            try
+            {
+                if( getLogger().isDebugEnabled() )
+                    getLogger().debug( "Creating Script Facade: " + context.getProjectName() );
+                ScriptFacade facade = new ScriptFacade( context );
+                if( facade instanceof LogEnabled )
+                {
+                    ((LogEnabled) facade).enableLogging( getLogger() );
+                }
+                return facade;
+            } catch( IOException e )
+            {
+                throw new CreationException( "Can't read the script for: " + pluginDir, e );
+            }
         }
         throw new CreationException( "Unknown type of plugin: " + pluginDir );
     }

Modified: avalon/trunk/tools/magic/engine/src/java/org/apache/merlin/magic/PluginContext.java
==============================================================================
--- avalon/trunk/tools/magic/engine/src/java/org/apache/merlin/magic/PluginContext.java	(original)
+++ avalon/trunk/tools/magic/engine/src/java/org/apache/merlin/magic/PluginContext.java	Sat May 22 00:37:51 2004
@@ -22,12 +22,19 @@
     private String m_PluginName;
     private File m_PluginDir;
     private File m_SystemDir;
+    private File m_TempDir;
    
     private Project  m_AntProject;
     
     
+    PluginContext( File scriptDir )
+    {
+        this( "fake", new File( "." ), new Properties(), "fake plugin", 
+              scriptDir, new File( "." ), new File( "." ) );
+    }
+    
     PluginContext( String projectname, File projectDir, Properties projectProps,
-                   String pluginname, File pluginDir, File systemDir )
+                   String pluginname, File pluginDir, File systemDir, File tempDir )
     {
         m_ProjectName = projectname.trim();
         m_ProjectDir = projectDir;
@@ -37,6 +44,7 @@
         m_PluginName = pluginname.trim();
         
         m_SystemDir = systemDir;
+        m_TempDir = tempDir;
         initializeAntProject();
     }
 
@@ -67,6 +75,8 @@
             return getPluginDir();
         if( "system.dir".equals( entry ) )
             return getSystemDir();
+        if( "temp.dir".equals( entry ) )
+            return getTempDir();
         return null;
     }
     
@@ -98,6 +108,11 @@
     public File getSystemDir()
     {
         return m_SystemDir;
+    }
+    
+    public File getTempDir()
+    {
+        return m_TempDir;
     }
     
     public String getPluginClassname()

Modified: avalon/trunk/tools/magic/engine/src/java/org/apache/merlin/magic/PluginFacade.java
==============================================================================
--- avalon/trunk/tools/magic/engine/src/java/org/apache/merlin/magic/PluginFacade.java	(original)
+++ avalon/trunk/tools/magic/engine/src/java/org/apache/merlin/magic/PluginFacade.java	Sat May 22 00:37:51 2004
@@ -14,4 +14,8 @@
     /** Returns the context for the Plugin.
      */
     PluginContext getPluginContext();
+    
+    /** Return the Classname of the Plugin represented by the Facade.
+     **/
+    String getPluginClassname();
 } 

Modified: avalon/trunk/tools/magic/engine/src/java/org/apache/merlin/magic/PluginServiceManager.java
==============================================================================
--- avalon/trunk/tools/magic/engine/src/java/org/apache/merlin/magic/PluginServiceManager.java	(original)
+++ avalon/trunk/tools/magic/engine/src/java/org/apache/merlin/magic/PluginServiceManager.java	Sat May 22 00:37:51 2004
@@ -26,6 +26,7 @@
     private File m_SystemDir;
     private File m_ProjectDir;
     private File m_LocalPlugins;
+    private File m_TempDir;
 
     private Properties m_GlobalProperties;
     private FacadeFactory m_FacadeFactory;
@@ -40,6 +41,7 @@
         m_SystemDir = new File( globalprops.getProperty( "magic.home.dir" ) );
         m_LocalPlugins = new File( globalprops.getProperty( "magic.plugins.dir" ) );;
         m_ProjectDir = new File( globalprops.getProperty( "magic.project.dir" ) );;
+        m_TempDir = new File( globalprops.getProperty( "magic.temp.dir" ) );;
     }
         
     public Object lookup( String service )
@@ -115,6 +117,15 @@
         return m_PluginsByKey.containsKey( service );
     }
     
+    public PluginFacade getFacade( File scriptDir )
+        throws CreationException
+    {
+        PluginContext ctx = new PluginContext( scriptDir );
+        
+        PluginFacade facade = m_FacadeFactory.create( ctx );
+        return facade;
+    }
+    
     private void addCyclicMarker( String service )
     {
         synchronized( m_PluginsByKey )
@@ -150,11 +161,12 @@
         String projectName = props.getProperty( "project.name" );
         
         PluginContext ctx = new PluginContext( projectName, m_ProjectDir, 
-            props, service, pluginDir, m_SystemDir );
+            props, service, pluginDir, m_SystemDir, m_TempDir );
         
         try
         {
             PluginFacade facade = m_FacadeFactory.create( ctx );
+            ctx.setPluginClassname( facade.getPluginClassname() );
             return facade;
         } catch( CreationException e )
         {

Modified: avalon/trunk/tools/magic/engine/src/java/org/apache/merlin/magic/ScriptFacade.java
==============================================================================
--- avalon/trunk/tools/magic/engine/src/java/org/apache/merlin/magic/ScriptFacade.java	(original)
+++ avalon/trunk/tools/magic/engine/src/java/org/apache/merlin/magic/ScriptFacade.java	Sat May 22 00:37:51 2004
@@ -20,11 +20,16 @@
     
     private PluginContext m_Context;
     private String m_Script;
+    private String m_Classname;
     private Plugin m_Plugin;
     
     ScriptFacade( PluginContext context )
+        throws IOException
     {
         m_Context = context;
+        m_Script = readScript( m_Context.getPluginDir() );
+        m_Classname = findName();
+        m_Context.setPluginClassname( m_Classname );
     }
     
     String getScript()
@@ -37,6 +42,11 @@
         return m_Context;
     }
 
+    public String getPluginClassname()
+    {
+        return m_Classname;
+    }
+    
     /** Returns the Plugin instance of that this PluginDelegate refers to.
      */
     public Plugin resolve()
@@ -45,11 +55,6 @@
         if( m_Plugin != null )
             return m_Plugin;
             
-        m_Script = readScript( m_Context.getPluginDir() );
-        String classname = findName( m_Script );
-        m_Context.setPluginClassname( classname );
-        classname = classname + "Plugin";
-        
         Interpreter.DEBUG = false;
         Interpreter bsh = new Interpreter();
         
@@ -59,11 +64,11 @@
         
         BshClassManager classman = bsh.getClassManager();
         
-        if( ! classman.classExists( classname ) )
+        if( ! classman.classExists( m_Classname ) )
         {
             bsh.eval( m_Script );
         }
-        String expr1 = "import org.apache.merlin.magic.Plugin;  Plugin plugin = new " + classname + "();";
+        String expr1 = "import org.apache.merlin.magic.Plugin;  Plugin plugin = new " + m_Classname + "();";
         bsh.eval( expr1 );
         m_Plugin = (Plugin) bsh.get( "plugin" );
         return m_Plugin;
@@ -74,7 +79,7 @@
         m_Plugin = null;
     }
     
-    private String readScript( File dir )
+    String readScript( File dir )
         throws IOException
     {
         File scriptFile = new File( dir, SCRIPT_FILE_NAME );
@@ -89,6 +94,7 @@
             while( line != null )
             {
                 buf.append( line );
+                buf.append( "\n" );
                 line = br.readLine();
             }
             return buf.toString();
@@ -101,12 +107,12 @@
         }                
     }
     
-    private String findName( String script )
+    String findName()
         throws IllegalArgumentException
     {
         // TODO: Performance improvement possible by parsing a char[] instead.
         
-        StringTokenizer st = new StringTokenizer( script, " \n\r\t", false );
+        StringTokenizer st = new StringTokenizer( m_Script, " \n\r\t", false );
         while( st.hasMoreTokens() )
         {
             String token = st.nextToken();
@@ -114,12 +120,12 @@
             {
                 String classname = st.nextToken();
                 if( classname.endsWith( "Plugin" ) )
-                    return classname.substring( 0, classname.length() - 6);
+                    return classname;
                 else
                     throw new IllegalArgumentException( "Plugins must have 'Plugin' at the end of the name:" + classname );
             }
         }
-        throw new IllegalArgumentException( "The plugin script does not contain a class.\n" + script );
+        throw new IllegalArgumentException( "The plugin script does not contain a class.\n" + m_Script );
     }
 } 
  

---------------------------------------------------------------------
To unsubscribe, e-mail: cvs-unsubscribe@avalon.apache.org
For additional commands, e-mail: cvs-help@avalon.apache.org