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/21 13:22:43 UTC
svn commit: rev 20192 - in avalon/trunk/tools/magic: artifact artifact/src/dist engine/src/java/org/apache/merlin/magic engine/src/test engine/src/test/org engine/src/test/org/apache engine/src/test/org/apache/merlin engine/src/test/org/apache/merlin/magic
Author: niclas
Date: Fri May 21 04:22:41 2004
New Revision: 20192
Added:
avalon/trunk/tools/magic/artifact/build.properties
avalon/trunk/tools/magic/artifact/src/dist/build.bsh
avalon/trunk/tools/magic/artifact/src/dist/build.properties
avalon/trunk/tools/magic/engine/src/java/org/apache/merlin/magic/Artifact.java
avalon/trunk/tools/magic/engine/src/test/
avalon/trunk/tools/magic/engine/src/test/org/
avalon/trunk/tools/magic/engine/src/test/org/apache/
avalon/trunk/tools/magic/engine/src/test/org/apache/merlin/
avalon/trunk/tools/magic/engine/src/test/org/apache/merlin/magic/
avalon/trunk/tools/magic/engine/src/test/org/apache/merlin/magic/PluginContextTestCase.java
avalon/trunk/tools/magic/engine/src/test/org/apache/merlin/magic/test.properties
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/PluginContext.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:
More work on the Magic stuff...
Added: avalon/trunk/tools/magic/artifact/build.properties
==============================================================================
--- (empty file)
+++ avalon/trunk/tools/magic/artifact/build.properties Fri May 21 04:22:41 2004
@@ -0,0 +1,2 @@
+
+project.name = artifact
Added: avalon/trunk/tools/magic/artifact/src/dist/build.bsh
==============================================================================
--- (empty file)
+++ avalon/trunk/tools/magic/artifact/src/dist/build.bsh Fri May 21 04:22:41 2004
@@ -0,0 +1,106 @@
+
+import java.io.BufferedInputStream;
+import java.io.BufferedOutputStream;
+import java.io.File;
+import java.io.FileOutputStream;
+import java.io.InputStream;
+
+import java.net.URL;
+
+import java.util.ArrayList;
+import java.util.Iterator;
+
+import org.apache.merlin.magic.Artifact;
+import org.apache.merlin.magic.Plugin;
+import org.apache.merlin.magic.PluginContext;
+
+import org.apache.avalon.framework.context.Context;
+import org.apache.avalon.framework.context.Contextualizable;
+
+import org.apache.avalon.framework.logger.AbstractLogEnabled;
+
+import org.apache.tools.ant.Project;
+import org.apache.tools.ant.types.Path;
+
+public class ArtifactPlugin extends AbstractLogEnabled
+ implements Plugin, Contextualizable
+{
+ private PluginContext m_PluginContext;
+
+ private Project m_Project;
+
+ private ArrayList m_CompileListeners;
+
+ private boolean m_Compiled = false;
+
+ public void contextualize( Context ctx )
+ {
+ m_PluginContext = (PluginContext) ctx;
+ m_Project = m_PluginContext.getAntProject();
+ }
+
+ public ClassLoader getClassloader( Artifact[] dependencies )
+ {
+ }
+
+ public Path getClassPath( Artifact[] dependencies )
+ {
+ }
+
+ public void upload( Artifact artifact )
+ {
+ }
+
+ private void download( Artifact artifact, File dest )
+ throws IOException, MalformedURLException
+ {
+ FileOutputStream out = null;
+ BufferedOutputStream bos = null;
+ try
+ {
+ out = new FileOutputStream( dest );
+ bos = new BufferedOutputStream( out );
+ URL url = toRemoteFile( artifact );
+ Connection conn = url.openConnection();
+ conn.connect();
+ InputStream in = conn.getInputStream();
+ BufferedInputStream bis = new BufferedInputStream( in );
+ int b;
+ while( ( b = bis.read() ) != -1 )
+ {
+ bos.write( b );
+ }
+ } finally
+ {
+ if( out != null )
+ out.close();
+ if( bos != null )
+ bos.close();
+ if( in != null )
+ in.close();
+ if( bis != null )
+ bis.close();
+ }
+ }
+
+ private URL toRemoteURL( Artifact artifact )
+ throws MalformedURLException
+ {
+ String href = artifact.getRepository() + "/" +
+ artifact.getGroupId() + "/" +
+ artifact.getType() + "s/" +
+ artifact.getArtifactId() + "-" +
+ artifact.getVersion() + ".jar" ;
+ return new URL( href );
+ }
+
+ private File toLocalFile( Artifact artifact )
+ {
+ String href = m_PluginContext.getProperty( "artifact.local.repository.dir" ) + "/" +
+ artifact.getGroupId() + "/" +
+ artifact.getType() + "s/" +
+ artifact.getArtifactId() + "-" +
+ artifact.getVersion() + ".jar" ;
+ return new URL( href );
+ }
+}
Added: avalon/trunk/tools/magic/artifact/src/dist/build.properties
==============================================================================
--- (empty file)
+++ avalon/trunk/tools/magic/artifact/src/dist/build.properties Fri May 21 04:22:41 2004
@@ -0,0 +1,2 @@
+
+artifact.local.repository.dir = ${user.dir}/.maven/repository
\ No newline at end of file
Added: avalon/trunk/tools/magic/engine/src/java/org/apache/merlin/magic/Artifact.java
==============================================================================
--- (empty file)
+++ avalon/trunk/tools/magic/engine/src/java/org/apache/merlin/magic/Artifact.java Fri May 21 04:22:41 2004
@@ -0,0 +1,63 @@
+
+package org.apache.merlin.magic;
+
+
+public class Artifact
+{
+ private static final String DEFAULT_REPOSITORY = "http://www.ibiblio.org/maven";
+
+ private String m_Repository;
+ private String m_ArtifactId;
+ private String m_GroupId;
+ private String m_Version;
+ private String m_Type;
+
+ public Artifact( String id, String version )
+ {
+ this( id, id, version );
+ }
+
+ public Artifact( String artifactId, String groupId, String version)
+ {
+ this( artifactId, groupId, version, "jar" );
+ }
+
+ public Artifact( String artifactId, String groupId, String version, String type )
+ {
+ this( artifactId, groupId, version, type, DEFAULT_REPOSITORY );
+ }
+
+ public Artifact( String artifactId, String groupId, String version, String type, String repository )
+ {
+ m_Repository = repository;
+ m_ArtifactId = artifactId;
+ m_GroupId = groupId;
+ m_Version = version;
+ m_Type = type;
+ }
+
+ public String getRepository()
+ {
+ return m_Repository;
+ }
+
+ public String getGroupId()
+ {
+ return m_GroupId;
+ }
+
+ public String getType()
+ {
+ return m_Type;
+ }
+
+ public String getArtifactId()
+ {
+ return m_ArtifactId;
+ }
+
+ public String getVersion()
+ {
+ return m_Version;
+ }
+}
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 Fri May 21 04:22:41 2004
@@ -1,21 +1,13 @@
package org.apache.merlin.magic;
-import org.apache.avalon.framework.logger.LogEnabled;
-import org.apache.avalon.framework.logger.Logger;
-import org.apache.avalon.framework.logger.ConsoleLogger;
-
-import org.apache.avalon.framework.service.ServiceException;
-
-import bsh.Interpreter;
-
import java.io.File;
-import java.io.FileReader;
-
import java.lang.reflect.Method;
-
-import java.net.URL;
-
import java.util.Properties;
+
+import org.apache.avalon.framework.logger.ConsoleLogger;
+import org.apache.avalon.framework.logger.LogEnabled;
+import org.apache.avalon.framework.logger.Logger;
+import org.apache.avalon.framework.service.ServiceException;
public class Builder
{
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 Fri May 21 04:22:41 2004
@@ -1,15 +1,15 @@
package org.apache.merlin.magic;
-import bsh.Interpreter;
-
import java.io.File;
import java.util.Properties;
-
-import org.apache.tools.ant.Project;
+import java.util.Stack;
+import java.util.StringTokenizer;
import org.apache.avalon.framework.context.Context;
-
import org.apache.avalon.framework.logger.AbstractLogEnabled;
+import org.apache.tools.ant.Project;
+
+import bsh.Interpreter;
public class PluginContext extends AbstractLogEnabled
implements Context
@@ -29,12 +29,12 @@
PluginContext( String projectname, File projectDir, Properties projectProps,
String pluginname, File pluginDir, File systemDir )
{
- m_ProjectName = projectname;
+ m_ProjectName = projectname.trim();
m_ProjectDir = projectDir;
m_ProjectProperties = projectProps;
m_PluginDir = pluginDir;
- m_PluginName = pluginname;
+ m_PluginName = pluginname.trim();
m_SystemDir = systemDir;
initializeAntProject();
@@ -112,7 +112,12 @@
public String getProperty( String name )
{
- return m_ProjectProperties.getProperty( name );
+ name = name.trim();
+ String value = m_ProjectProperties.getProperty( name );
+ if( value == null )
+ return null;
+ value = value.trim();
+ return resolve( value );
}
public Project getAntProject()
@@ -128,5 +133,74 @@
public void enableBeanShellTracing( boolean on )
{
Interpreter.TRACE = on;
+ }
+
+ public String resolve( String value )
+ {
+ // optimization for common case.
+ int pos1 = value.indexOf( "${" );
+ if( pos1 < 0 )
+ return value;
+
+ Stack stack = new Stack();
+ StringTokenizer st = new StringTokenizer( value, "${}", true );
+
+ while( st.hasMoreTokens() )
+ {
+ String token = st.nextToken();
+ if( token.equals( "}" ) )
+ {
+ String name = (String) stack.pop();
+ String open = (String) stack.pop();
+ if( open.equals( "${" ) )
+ {
+ String propValue = getProperty( name );
+ if( propValue == null )
+ push( stack, "${" + name + "}" );
+ else
+ push( stack, propValue );
+ }
+ else
+ {
+ push( stack, "${" + name + "}" );
+ }
+ }
+ else
+ {
+ if( token.equals( "$" ) )
+ stack.push( "$" );
+ else
+ {
+ push( stack, token );
+ }
+ }
+ }
+ String result = "";
+ while( stack.size() > 0 )
+ {
+ result = (String) stack.pop() + result;
+ }
+ return result;
+ }
+
+ private void push( Stack stack , String value )
+ {
+ if( stack.size() > 0 )
+ {
+ String data = (String) stack.pop();
+ if( data.equals( "${" ) )
+ {
+ stack.push( data );
+ stack.push( value );
+ }
+ else
+ {
+ stack.push( data + value );
+ }
+ }
+ else
+ {
+ stack.push( value );
+ }
}
}
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 Fri May 21 04:22:41 2004
@@ -3,21 +3,17 @@
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
-
-import java.util.Map;
import java.util.HashMap;
+import java.util.Map;
import java.util.Properties;
import org.apache.avalon.framework.activity.Initializable;
-
+import org.apache.avalon.framework.context.Contextualizable;
import org.apache.avalon.framework.logger.AbstractLogEnabled;
import org.apache.avalon.framework.logger.LogEnabled;
-
-import org.apache.avalon.framework.context.Contextualizable;
-
-import org.apache.avalon.framework.service.Serviceable;
import org.apache.avalon.framework.service.ServiceException;
import org.apache.avalon.framework.service.ServiceManager;
+import org.apache.avalon.framework.service.Serviceable;
public class PluginServiceManager extends AbstractLogEnabled
implements ServiceManager
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 Fri May 21 04:22:41 2004
@@ -1,19 +1,17 @@
package org.apache.merlin.magic;
-import bsh.EvalError;
-import bsh.Interpreter;
-import bsh.BshClassManager;
-
import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.io.IOException;
-
-import java.util.Properties;
import java.util.StringTokenizer;
import org.apache.avalon.framework.logger.AbstractLogEnabled;
+import bsh.BshClassManager;
+import bsh.EvalError;
+import bsh.Interpreter;
+
public class ScriptFacade extends AbstractLogEnabled
implements PluginFacade
@@ -66,9 +64,9 @@
{
bsh.eval( m_Script );
}
- String expr1 = "import org.apache.merlin.magic.Plugin; Plugin plugin = new " + classname + "();";
- System.out.println( expr1 );
- bsh.eval( expr1 );
+ String expr1 = "import org.apache.merlin.magic.Plugin; Plugin plugin = new " + classname + "();";
+ System.out.println( expr1 );
+ bsh.eval( expr1 );
m_Plugin = (Plugin) bsh.get( "plugin" );
return m_Plugin;
}
Added: avalon/trunk/tools/magic/engine/src/test/org/apache/merlin/magic/PluginContextTestCase.java
==============================================================================
--- (empty file)
+++ avalon/trunk/tools/magic/engine/src/test/org/apache/merlin/magic/PluginContextTestCase.java Fri May 21 04:22:41 2004
@@ -0,0 +1,107 @@
+package org.apache.merlin.magic;
+
+import java.io.File;
+import java.io.InputStream;
+import java.util.Properties;
+
+import junit.framework.TestCase;
+
+
+/**
+ * @author Niclas Hedhman, niclas@hedhman.org
+ */
+public class PluginContextTestCase extends TestCase
+{
+
+ private PluginContext m_Context;
+ private File m_PluginDir;
+ private File m_SystemDir;
+ private File m_ProjectDir;
+
+ /*
+ * @see TestCase#setUp()
+ */
+ protected void setUp() throws Exception
+ {
+ super.setUp();
+ m_ProjectDir = new File( "target/projectdir");
+ m_ProjectDir.mkdir();
+
+ Properties projectProps = new Properties();
+ InputStream in = getClass().getResourceAsStream( "test.properties");
+ projectProps.load( in );
+
+ m_PluginDir = new File( "target/plugins");
+ m_PluginDir.mkdir();
+
+ m_SystemDir = new File( "target/system");
+ m_SystemDir.mkdir();
+
+ m_Context = new PluginContext( " testcase project ", m_ProjectDir, projectProps,
+ "testcase plugin", m_PluginDir, m_SystemDir );
+ m_Context.setPluginClassname( "TestCasePlugin");
+ }
+
+ public void testGetProjectName()
+ {
+ assertEquals( "Project Name failed.", "testcase project", m_Context.getProjectName());
+ }
+
+ public void testGetProjectDir()
+ {
+ assertEquals( "Project Dir failed.", m_ProjectDir, m_Context.getProjectDir());
+ }
+
+ public void testGetProjectProperties()
+ {
+ }
+
+ public void testGetPluginName()
+ {
+ assertEquals( "Plugin Name failed.", "testcase plugin", m_Context.getPluginName());
+ }
+
+ public void testGetPluginDir()
+ {
+ assertEquals( "Plugin Dir failed.", m_PluginDir, m_Context.getPluginDir());
+ }
+
+ public void testGetSystemDir()
+ {
+ assertEquals( "System Dir failed.", m_SystemDir, m_Context.getSystemDir());
+ }
+
+ public void testGetPluginClassname()
+ {
+ assertEquals( "Plugin ClassName failed.", "TestCasePlugin", m_Context.getPluginClassname());
+ }
+
+ public void testGetProperty()
+ {
+ String p1 = "niclas${abc.def}hedhman";
+ String value = m_Context.resolve( p1 );
+ assertEquals( "Unresolvable failed.", p1, value );
+
+ p1 = "niclas ${a.property } hedhman";
+ value = m_Context.resolve( p1 );
+ assertEquals( "Single Level resolution failed.", "niclas has the surname of hedhman", value );
+
+ p1 = "${a2.this}";
+ value = m_Context.resolve( p1 );
+ assertEquals( "Property resolution failed.", "this is", value );
+
+ p1 = "Hey, ${a2.${a1}} ${a2.${a4}} ${a3}";
+ value = m_Context.resolve( p1 );
+ assertEquals( "Nested resolution failed.", "Hey, this is this is not this is funky", value );
+
+ p1 = "${${${${${${b1}}}}}}";
+ value = m_Context.resolve( p1 );
+ assertEquals( "Nested resolution failed.", "YEAH!!!!", value );
+ }
+
+ public void testGetAntProject()
+ {
+ assertTrue( "Ant Project failed.", m_Context.getAntProject() != null );
+ assertEquals( "Ant Project failed.", "testcase project", m_Context.getAntProject().getName() );
+ }
+}
Added: avalon/trunk/tools/magic/engine/src/test/org/apache/merlin/magic/test.properties
==============================================================================
--- (empty file)
+++ avalon/trunk/tools/magic/engine/src/test/org/apache/merlin/magic/test.properties Fri May 21 04:22:41 2004
@@ -0,0 +1,16 @@
+
+a.property = has the surname of
+
+a1 = this
+a2.this = ${a1} is
+a3 = ${a2.${a1}} funky
+a2.not = ${a1} is not
+a4 = not
+
+b1 = b2
+b2 = b3
+b3 = b4
+b4 = b5
+b5 = b6
+b6 = YEAH!!!!
+
---------------------------------------------------------------------
To unsubscribe, e-mail: cvs-unsubscribe@avalon.apache.org
For additional commands, e-mail: cvs-help@avalon.apache.org