Author: mcconnell
Date: Fri Jun 11 13:03:24 2004
New Revision: 21106

Added:
   
avalon/trunk/runtime/merlin/unit/src/java/org/apache/avalon/merlin/unit/MerlinTestSuite.java
Log:
sorting thing out in merlin unit

Added: 
avalon/trunk/runtime/merlin/unit/src/java/org/apache/avalon/merlin/unit/MerlinTestSuite.java
==============================================================================
--- (empty file)
+++ 
avalon/trunk/runtime/merlin/unit/src/java/org/apache/avalon/merlin/unit/MerlinTestSuite.java
        Fri Jun 11 13:03:24 2004
@@ -0,0 +1,374 @@
+/* 

+ * Copyright 2004 Apache Software Foundation

+ * Licensed  under the  Apache License,  Version 2.0  (the "License");

+ * you may not use  this file  except in  compliance with the License.

+ * You may obtain a copy of the License at 

+ * 

+ *   http://www.apache.org/licenses/LICENSE-2.0

+ * 

+ * Unless required by applicable law or agreed to in writing, software

+ * distributed  under the  License is distributed on an "AS IS" BASIS,

+ * WITHOUT  WARRANTIES OR CONDITIONS  OF ANY KIND, either  express  or

+ * implied.

+ * 

+ * See the License for the specific language governing permissions and

+ * limitations under the License.

+ */

+

+package org.apache.avalon.merlin.unit;

+

+import java.io.File;

+import java.util.Map;

+import java.lang.reflect.Method;

+import java.lang.reflect.InvocationTargetException;

+

+import junit.framework.TestCase;

+import junit.framework.TestSuite;

+

+import org.apache.avalon.repository.Artifact;

+import org.apache.avalon.repository.provider.Builder;

+import org.apache.avalon.repository.provider.InitialContext;

+import org.apache.avalon.repository.provider.InitialContextFactory;

+import org.apache.avalon.repository.provider.Factory;

+import org.apache.avalon.repository.main.DefaultInitialContextFactory;

+import org.apache.avalon.repository.main.DefaultBuilder;

+

+import org.apache.avalon.util.env.Env;

+import org.apache.avalon.util.exception.ExceptionHelper;

+

+/**

+ * Test case that usaes the repository builder to deploy the 

+ * Merlin default application factory.

+ * 

+ * @author <a href="mailto:[EMAIL PROTECTED]">Avalon Development Team</a>

+ * @version $Revision: 1.27 $

+ */

+public class MerlinTestSuite extends TestSuite

+{

+    //----------------------------------------------------------

+    // static

+    //----------------------------------------------------------

+

+    private static final String MERLIN_PROPERTIES = "merlin.properties";

+

+    private static final String IMPLEMENTATION_KEY = "merlin.implementation";

+

+    private static final String DEPLOYMENT_MODEL_CLASSNAME = 

+      "org.apache.avalon.composition.model.DeploymentModel";

+

+    private static File getWorkDir()

+    {

+        String path = System.getProperty( "project.dir" );

+        if( null != path )

+        {

+            return new File( path );

+        }

+        else

+        {

+            return new File( System.getProperty( "user.dir" ) );

+        }

+    }

+

+    //----------------------------------------------------------

+    // immutable state

+    //----------------------------------------------------------

+

+    private Object m_kernel;

+

+    private ClassLoader m_classloader;

+

+    private Object m_root;

+

+    private Method m_locate;

+    private Method m_runtime;

+    private Method m_resolve;

+    private Method m_shutdown;

+

+    //----------------------------------------------------------

+    // constructor

+    //----------------------------------------------------------

+

+    /**

+     * Constructor for MerlinEmbeddedTest.

+     * @param name the name of the testcase

+     */

+    public MerlinTestSuite()

+    {

+        super();

+        initialize();

+    }

+

+    /**

+     * Constructor for MerlinEmbeddedTest.

+     * @param name the name of the testcase

+     */

+    public MerlinTestSuite( Class clazz )

+    {

+        super( clazz );

+        initialize();

+    }

+

+    /**

+     * Constructor for MerlinEmbeddedTest.

+     * @param name the name of the testcase

+     */

+    public MerlinTestSuite( String name )

+    {

+        super( name );

+        initialize();

+    }

+

+    /**

+     * Constructor for MerlinEmbeddedTest.

+     * @param name the name of the testcase

+     */

+    public MerlinTestSuite( Class clazz, String name )

+    {

+        super( clazz, name );

+        initialize();

+    }

+

+    /**

+     * Constructor for MerlinEmbeddedTest.

+     * @param name the name of the testcase

+     */

+    private void initialize()

+    {

+

+        ClassLoader classloader = MerlinTestSuite.class.getClassLoader();

+

+        try

+        {

+            File basedir = getBaseDirectory();

+            File home = getHomeDirectory();

+

+            Artifact artifact = DefaultBuilder.createImplementationArtifact( 

+              classloader, home, basedir, 

+              MERLIN_PROPERTIES, IMPLEMENTATION_KEY );

+

+            InitialContextFactory icFactory = 

+              new DefaultInitialContextFactory( "merlin", basedir );

+            icFactory.setCacheDirectory( getCacheDirectory() );

+

+            InitialContext context = icFactory.createInitialContext();

+

+            Builder builder = new DefaultBuilder( context, artifact );

+            m_classloader = builder.getClassLoader();

+            Factory factory = builder.getFactory();

+            Map criteria = factory.createDefaultCriteria();

+

+            //

+            // set the defaults

+            //

+

+            criteria.put( "merlin.context", "target" );

+            criteria.put( "merlin.server", "true" );

+            criteria.put( "merlin.code.security.enabled", "false" );

+

+            //

+            // if the deployment path is undefined then the best we 

+            // can do is to assume ${basedir}/target/classes and/or

+            // ${basedir}/target/test-classes contains a BLOCK-INF/block.xml

+            // and from this, derive a merlin.deployment value

+            //

+

+            String[] deployment = (String[]) criteria.get( "merlin.deployment" );

+            if( deployment.length == 0 )

+            {

+                String path = buildDefaultTestPath();

+                if( null != path )

+                {

+                    criteria.put( "merlin.deployment", path );

+                }

+                else

+                {

+                    final String error = 

+                      "Cannot locate a deployment objective.";

+                    throw new IllegalStateException( error );

+                }

+            }

+

+            //

+            // if the ${merlin.override} value is undefined, check for 

+            // the existance of an override file in ${basedir}/conf/config.xml

+            // and if it exists assign it as the override parameter

+            //

+

+            if( null == criteria.get( "merlin.override" ) )

+            {  

+                String override = buildDefaultOverridePath();

+                if( null != override )

+                {

+                    criteria.put( "merlin.override", override );

+                }

+            }

+

+            //

+            // go ahead with the deployment of the kernel

+            //

+

+            m_kernel = factory.create( criteria );

+            m_shutdown =

+              m_kernel.getClass().getMethod( 

+                "shutdown", 

+                new Class[0] );

+            Method method = 

+              m_kernel.getClass().getMethod( 

+                "getModel", 

+                new Class[0] );

+            m_root = method.invoke( m_kernel, new Object[0] );

+            m_locate = 

+              m_root.getClass().getMethod( 

+                "getModel", 

+                new Class[]{ String.class } );

+            Class modelClass = 

+              m_classloader.loadClass( DEPLOYMENT_MODEL_CLASSNAME );

+            m_resolve = 

+              modelClass.getMethod( "resolve", new Class[0] );

+        }

+        catch( Throwable e )

+        {

+            final String error = ExceptionHelper.packException( e, true );

+            System.out.println( error );

+            throw new RuntimeException( error );

+        }

+    }

+

+    public void tearDown()

+    {

+        m_classloader = null;

+        m_root = null;

+        m_locate = null;

+        m_resolve = null;

+

+        try

+        {

+            m_shutdown.invoke( m_kernel, new Object[0] );

+        }

+        catch( Throwable e )

+        {

+            // ignore

+        }

+

+        m_shutdown = null;

+    }

+

+    //----------------------------------------------------------------------

+    // protected

+    //----------------------------------------------------------------------

+

+    protected Object resolve( String path ) throws Exception

+    {

+        if( null == m_kernel ) 

+          throw new IllegalStateException( "kernel does not exist" );

+

+        try

+        {

+            Object model =  m_locate.invoke( m_root, new Object[]{ path } );

+            return m_resolve.invoke( model, new Object[0] );

+        }

+        catch( InvocationTargetException ite )

+        {

+            Throwable cause = ite.getTargetException();

+            final String error = ExceptionHelper.packException( cause, true );

+            throw new Exception( error );

+        }

+        catch( Throwable e )

+        {

+            final String error = ExceptionHelper.packException( e, true );

+            throw new Exception( error );

+        }

+    }

+

+    //----------------------------------------------------------------------

+    // utilities

+    //----------------------------------------------------------------------

+

+    private String buildDefaultOverridePath()

+    {

+        File base = getBaseDirectory();

+        File config = new File( base, "config.xml" );

+        if( config.exists() ) return "config.xml";

+        return null;

+    }

+

+    private String buildDefaultTestPath()

+    {

+        File base = getBaseDirectory();

+        File classes = new File( base, "target/classes/BLOCK-INF/block.xml" );

+        File tests = new File( base, "target/test-classes/BLOCK-INF/block.xml" );

+        if( classes.exists() && tests.exists() )

+        {

+            return "target/classes,target/test-classes";

+        }

+        else if( classes.exists() )

+        {

+            return "target/classes";

+        }

+        else if( tests.exists() )

+        {

+            return "target/test-classes";

+        }

+        return null;

+    }

+

+    private File getBaseDirectory()

+    {

+        return getWorkDir();

+    }

+

+   /**

+    * Return the merlin home directory.

+    * @return the merlin install directory

+    */

+    private static File getMerlinHome()

+    {

+        return new File( getMerlinHomePath() );

+    }

+

+   /**

+    * Return the merlin home directory path.

+    * @return the merlin install directory path

+    */

+    private static String getMerlinHomePath()

+    {

+        try

+        {

+            String merlin = 

+              System.getProperty( 

+                "merlin.home", 

+                Env.getEnvVariable( "MERLIN_HOME" ) );

+            if( null != merlin ) return merlin;

+            return System.getProperty( "user.home" ) 

+              + File.separator + ".merlin";

+        }

+        catch( Throwable e )

+        {

+            final String error = 

+              "Internal error while attempting to access MERLIN_HOME environment.";

+            final String message = 

+              ExceptionHelper.packException( error, e, true );

+            throw new RuntimeException( message );

+        }

+    }

+

+    private File getHomeDirectory()

+    {

+        return getCacheDirectory().getParentFile();

+    }

+

+    private File getCacheDirectory()

+    {

+        String cache = System.getProperty( "project.repository.cache.path" );

+        if( null != cache )

+        {

+            return new File( cache );

+        }

+        else

+        {

+            throw new IllegalStateException( "don't know what to do yet" );

+        }

+    }

+

+}

+


---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]

Reply via email to