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