From a2dc176076b863f536784fbcd8ade84e85ce455c Mon Sep 17 00:00:00 2001 From: Peter Donald Date: Fri, 8 Jun 2001 09:06:41 +0000 Subject: [PATCH] Abstract task to define types. git-svn-id: https://svn.apache.org/repos/asf/ant/core/trunk@269120 13f79535-47bb-0310-9956-ffa450edef68 --- .../myrmidon/framework/AbstractTypeDef.java | 115 ++++++++++++++++++ 1 file changed, 115 insertions(+) create mode 100644 proposal/myrmidon/src/java/org/apache/myrmidon/framework/AbstractTypeDef.java diff --git a/proposal/myrmidon/src/java/org/apache/myrmidon/framework/AbstractTypeDef.java b/proposal/myrmidon/src/java/org/apache/myrmidon/framework/AbstractTypeDef.java new file mode 100644 index 000000000..e45725fa8 --- /dev/null +++ b/proposal/myrmidon/src/java/org/apache/myrmidon/framework/AbstractTypeDef.java @@ -0,0 +1,115 @@ +/* + * Copyright (C) The Apache Software Foundation. All rights reserved. + * + * This software is published under the terms of the Apache Software License + * version 1.1, a copy of which has been included with this distribution in + * the LICENSE file. + */ +package org.apache.myrmidon.framework; + +import java.io.File; +import java.net.URL; +import java.net.URLClassLoader; +import org.apache.avalon.framework.component.ComponentException; +import org.apache.avalon.framework.component.ComponentManager; +import org.apache.avalon.framework.component.Composable; +import org.apache.myrmidon.api.AbstractTask; +import org.apache.myrmidon.api.TaskException; +import org.apache.myrmidon.components.deployer.RoleManager; +import org.apache.myrmidon.components.type.DefaultTypeFactory; +import org.apache.myrmidon.components.type.TypeException; +import org.apache.myrmidon.components.type.TypeManager; + +/** + * Abstract task to extend to define a type. + * + * TODO: Make this support classpath sub-element in future + * + * @author Peter Donald + */ +public abstract class AbstractTypeDef + extends AbstractTask + implements Composable +{ + private String m_lib; + private String m_name; + private String m_className; + private TypeManager m_typeManager; + private RoleManager m_roleManager; + + public void compose( final ComponentManager componentManager ) + throws ComponentException + { + m_typeManager = (TypeManager)componentManager.lookup( TypeManager.ROLE ); + m_roleManager = (RoleManager)componentManager.lookup( RoleManager.ROLE ); + } + + public void setLib( final String lib ) + { + //In the future this would be replaced by ClassPath sub-element + m_lib = lib; + } + + public void setName( final String name ) + { + m_name = name; + } + + public void setClassname( final String className ) + { + m_className = className; + } + + public void execute() + throws TaskException + { + if( null == m_name ) + { + throw new TaskException( "Must specify name parameter" ); + } + else if( null == m_className ) + { + throw new TaskException( "Must specify classname parameter" ); + } + + final String typeName = getTypeName(); + final String role = m_roleManager.getRoleForName( typeName ); + + final ClassLoader classLoader = createClassLoader(); + final DefaultTypeFactory factory = new DefaultTypeFactory( classLoader ); + factory.addNameClassMapping( m_name, m_className ); + + try { m_typeManager.registerType( role, m_name, factory ); } + catch( final TypeException te ) + { + throw new TaskException( "Failed to register type", te ); + } + } + + protected ClassLoader createClassLoader() + throws TaskException + { + //TODO: Make this support classpath sub-element in future + + try + { + final File file = getContext().resolveFile( m_lib ); + final URL url = file.getCanonicalFile().toURL(); + final ClassLoader classLoader = + Thread.currentThread().getContextClassLoader(); + + return new URLClassLoader( new URL[] { url }, classLoader ); + } + catch( final Exception e ) + { + throw new TaskException( "Failed to build classLoader due to: " + e, e ); + } + } + + protected final TypeManager getTypeManager() + { + return m_typeManager; + } + + protected abstract String getTypeName(); +}