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: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED]