You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@ant.apache.org by do...@apache.org on 2001/06/03 08:10:07 UTC
cvs commit: jakarta-ant/proposal/myrmidon/src/java/org/apache/myrmidon/converter Converter.java
donaldp 01/06/02 23:10:07
Modified: proposal/myrmidon/src/java/org/apache/ant/modules/basic
Property.java
proposal/myrmidon/src/java/org/apache/myrmidon/api
DataType.java Task.java
proposal/myrmidon/src/java/org/apache/myrmidon/components/converter
DefaultMasterConverter.java
proposal/myrmidon/src/java/org/apache/myrmidon/components/executor
DefaultExecutor.java
proposal/myrmidon/src/java/org/apache/myrmidon/components/type
DefaultTypeManager.java TypeFactory.java
TypeManager.java
proposal/myrmidon/src/java/org/apache/myrmidon/converter
Converter.java
Added: proposal/myrmidon/src/java/org/apache/myrmidon/components/type
MultiSourceTypeFactory.java
Removed: proposal/myrmidon/src/java/org/apache/myrmidon/components/type
TypedComponentSelector.java
Log:
Converted TypeManager so that types no longer have to implement Avalons 'Component' interface.
Revision Changes Path
1.12 +10 -4 jakarta-ant/proposal/myrmidon/src/java/org/apache/ant/modules/basic/Property.java
Index: Property.java
===================================================================
RCS file: /home/cvs/jakarta-ant/proposal/myrmidon/src/java/org/apache/ant/modules/basic/Property.java,v
retrieving revision 1.11
retrieving revision 1.12
diff -u -r1.11 -r1.12
--- Property.java 2001/06/02 14:28:40 1.11
+++ Property.java 2001/06/03 06:10:03 1.12
@@ -9,7 +9,6 @@
import org.apache.avalon.framework.component.ComponentException;
import org.apache.avalon.framework.component.ComponentManager;
-import org.apache.avalon.framework.component.ComponentSelector;
import org.apache.avalon.framework.component.Composable;
import org.apache.avalon.framework.configuration.Configurable;
import org.apache.avalon.framework.configuration.Configuration;
@@ -22,6 +21,8 @@
import org.apache.myrmidon.components.configurer.Configurer;
import org.apache.myrmidon.components.converter.MasterConverter;
import org.apache.myrmidon.components.type.TypeManager;
+import org.apache.myrmidon.components.type.TypeException;
+import org.apache.myrmidon.components.type.TypeFactory;
/**
* This is the property "task" to declare a binding of a datatype to a name.
@@ -35,7 +36,7 @@
private String m_name;
private Object m_value;
private boolean m_localScope = true;
- private ComponentSelector m_selector;
+ private TypeFactory m_factory;
private MasterConverter m_converter;
private Configurer m_configurer;
@@ -44,7 +45,12 @@
{
m_configurer = (Configurer)componentManager.lookup( Configurer.ROLE );
final TypeManager typeManager = (TypeManager)componentManager.lookup( TypeManager.ROLE );
- m_selector = (ComponentSelector)typeManager.lookup( DataType.ROLE + "Selector" );
+
+ try { m_factory = typeManager.getFactory( DataType.ROLE ); }
+ catch( final TypeException te )
+ {
+ throw new ComponentException( "Unable to retrieve factory from TypeManager", te );
+ }
m_converter = (MasterConverter)componentManager.lookup( MasterConverter.ROLE );
}
@@ -121,7 +127,7 @@
try
{
- final DataType value = (DataType)m_selector.select( child.getName() );
+ final DataType value = (DataType)m_factory.create( child.getName() );
setValue( value );
m_configurer.configure( value, child, getContext() );
}
1.2 +0 -3 jakarta-ant/proposal/myrmidon/src/java/org/apache/myrmidon/api/DataType.java
Index: DataType.java
===================================================================
RCS file: /home/cvs/jakarta-ant/proposal/myrmidon/src/java/org/apache/myrmidon/api/DataType.java,v
retrieving revision 1.1
retrieving revision 1.2
diff -u -r1.1 -r1.2
--- DataType.java 2001/06/02 14:28:42 1.1
+++ DataType.java 2001/06/03 06:10:04 1.2
@@ -7,8 +7,6 @@
*/
package org.apache.myrmidon.api;
-import org.apache.avalon.framework.component.Component;
-
/**
* Base class for those classes that can appear inside the build file
* as stand alone data types.
@@ -16,7 +14,6 @@
* @author <a href="mailto:donaldp@apache.org">Peter Donald</a>
*/
public interface DataType
- extends Component
{
String ROLE = "org.apache.myrmidon.api.DataType";
}
1.5 +0 -3 jakarta-ant/proposal/myrmidon/src/java/org/apache/myrmidon/api/Task.java
Index: Task.java
===================================================================
RCS file: /home/cvs/jakarta-ant/proposal/myrmidon/src/java/org/apache/myrmidon/api/Task.java,v
retrieving revision 1.4
retrieving revision 1.5
diff -u -r1.4 -r1.5
--- Task.java 2001/06/02 08:26:53 1.4
+++ Task.java 2001/06/03 06:10:04 1.5
@@ -7,8 +7,6 @@
*/
package org.apache.myrmidon.api;
-import org.apache.avalon.framework.component.Component;
-
/**
* This is the interface that tasks implement to be executed in Myrmidon runtime.
*
@@ -26,7 +24,6 @@
* @author <a href="mailto:donaldp@apache.org">Peter Donald</a>
*/
public interface Task
- extends Component
{
String ROLE = "org.apache.myrmidon.api.Task";
1.3 +11 -6 jakarta-ant/proposal/myrmidon/src/java/org/apache/myrmidon/components/converter/DefaultMasterConverter.java
Index: DefaultMasterConverter.java
===================================================================
RCS file: /home/cvs/jakarta-ant/proposal/myrmidon/src/java/org/apache/myrmidon/components/converter/DefaultMasterConverter.java,v
retrieving revision 1.2
retrieving revision 1.3
diff -u -r1.2 -r1.3
--- DefaultMasterConverter.java 2001/06/03 05:14:47 1.2
+++ DefaultMasterConverter.java 2001/06/03 06:10:04 1.3
@@ -9,11 +9,12 @@
import org.apache.avalon.framework.component.ComponentException;
import org.apache.avalon.framework.component.ComponentManager;
-import org.apache.avalon.framework.component.ComponentSelector;
import org.apache.avalon.framework.component.Composable;
import org.apache.avalon.framework.context.Context;
import org.apache.avalon.framework.logger.AbstractLoggable;
import org.apache.myrmidon.components.converter.MasterConverter;
+import org.apache.myrmidon.components.type.TypeException;
+import org.apache.myrmidon.components.type.TypeFactory;
import org.apache.myrmidon.components.type.TypeManager;
import org.apache.myrmidon.converter.Converter;
import org.apache.myrmidon.converter.ConverterException;
@@ -30,7 +31,7 @@
private final static boolean DEBUG = false;
private ConverterRegistry m_registry;
- private ComponentSelector m_selector;
+ private TypeFactory m_factory;
/**
* Retrieve relevent services needed to deploy.
@@ -44,7 +45,11 @@
m_registry = (ConverterRegistry)componentManager.lookup( ConverterRegistry.ROLE );
final TypeManager typeManager = (TypeManager)componentManager.lookup( TypeManager.ROLE );
- m_selector = (ComponentSelector)typeManager.lookup( Converter.ROLE + "Selector" );
+ try { m_factory = typeManager.getFactory( Converter.ROLE ); }
+ catch( final TypeException te )
+ {
+ throw new ComponentException( "Unable to retrieve factory from TypeManager", te );
+ }
}
/**
@@ -86,7 +91,7 @@
try
{
//TODO: Start caching converters instead of repeatedly instantiating em.
- final Converter converter = (Converter)m_selector.select( name );
+ final Converter converter = (Converter)m_factory.create( name );
if( DEBUG )
@@ -96,10 +101,10 @@
return converter.convert( destination, original, context );
}
- catch( final ComponentException ce )
+ catch( final TypeException te )
{
throw new ConverterException( "Badly configured TypeManager missing " +
- "converter definition" );
+ "converter definition", te );
}
}
}
1.8 +11 -6 jakarta-ant/proposal/myrmidon/src/java/org/apache/myrmidon/components/executor/DefaultExecutor.java
Index: DefaultExecutor.java
===================================================================
RCS file: /home/cvs/jakarta-ant/proposal/myrmidon/src/java/org/apache/myrmidon/components/executor/DefaultExecutor.java,v
retrieving revision 1.7
retrieving revision 1.8
diff -u -r1.7 -r1.8
--- DefaultExecutor.java 2001/06/02 14:28:43 1.7
+++ DefaultExecutor.java 2001/06/03 06:10:05 1.8
@@ -12,7 +12,6 @@
import org.apache.avalon.framework.component.Component;
import org.apache.avalon.framework.component.ComponentException;
import org.apache.avalon.framework.component.ComponentManager;
-import org.apache.avalon.framework.component.ComponentSelector;
import org.apache.avalon.framework.component.Composable;
import org.apache.avalon.framework.component.DefaultComponentManager;
import org.apache.avalon.framework.configuration.Configurable;
@@ -27,6 +26,8 @@
import org.apache.myrmidon.api.TaskException;
import org.apache.myrmidon.api.TaskException;
import org.apache.myrmidon.components.configurer.Configurer;
+import org.apache.myrmidon.components.type.TypeException;
+import org.apache.myrmidon.components.type.TypeFactory;
import org.apache.myrmidon.components.type.TypeManager;
public class DefaultExecutor
@@ -34,7 +35,7 @@
implements Executor, Composable
{
private Configurer m_configurer;
- private ComponentSelector m_selector;
+ private TypeFactory m_factory;
private ComponentManager m_componentManager;
@@ -53,7 +54,11 @@
m_configurer = (Configurer)componentManager.lookup( Configurer.ROLE );
final TypeManager typeManager = (TypeManager)componentManager.lookup( TypeManager.ROLE );
- m_selector = (ComponentSelector)typeManager.lookup( Task.ROLE + "Selector" );
+ try { m_factory = typeManager.getFactory( Task.ROLE ); }
+ catch( final TypeException te )
+ {
+ throw new ComponentException( "Unable to retrieve factory from TypeManager", te );
+ }
}
public void execute( final Configuration taskData, final TaskContext context )
@@ -88,11 +93,11 @@
{
try
{
- return (Task)m_selector.select( name );
+ return (Task)m_factory.create( name );
}
- catch( final ComponentException ce )
+ catch( final TypeException te )
{
- throw new TaskException( "Unable to create task " + name, ce );
+ throw new TaskException( "Unable to create task " + name, te );
}
}
1.5 +42 -58 jakarta-ant/proposal/myrmidon/src/java/org/apache/myrmidon/components/type/DefaultTypeManager.java
Index: DefaultTypeManager.java
===================================================================
RCS file: /home/cvs/jakarta-ant/proposal/myrmidon/src/java/org/apache/myrmidon/components/type/DefaultTypeManager.java,v
retrieving revision 1.4
retrieving revision 1.5
diff -u -r1.4 -r1.5
--- DefaultTypeManager.java 2001/06/03 05:31:17 1.4
+++ DefaultTypeManager.java 2001/06/03 06:10:05 1.5
@@ -8,9 +8,6 @@
package org.apache.myrmidon.components.type;
import java.util.HashMap;
-import org.apache.avalon.framework.component.Component;
-import org.apache.avalon.framework.component.ComponentException;
-import org.apache.avalon.framework.component.ComponentSelector;
/**
* The interface that is used to manage types.
@@ -21,80 +18,68 @@
implements TypeManager
{
///Parent type manager to inherit values from.
- private final TypeManager m_parent;
+ private final DefaultTypeManager m_parent;
- ///Maps role to TypedComponentSelector.
- private final HashMap m_roleMap = new HashMap();
+ ///Maps role to MultiSourceTypeFactory.
+ private final HashMap m_roleMap = new HashMap();
public DefaultTypeManager()
{
this( null );
}
- public DefaultTypeManager( final TypeManager parent )
+ public DefaultTypeManager( final DefaultTypeManager parent )
{
m_parent = parent;
}
- public Component lookup( final String role )
- throws ComponentException
+ public void registerType( final String role,
+ final String shorthandName,
+ final TypeFactory factory )
+ throws TypeException
{
- if( role.endsWith( "Selector" ) )
- {
- return createSelector( role );
- }
- else
- {
- throw new ComponentException( "Unable to provide implementation for '" +
- role + "'" );
- }
+ final MultiSourceTypeFactory msFactory = createFactory( role + "Selector" );
+ msFactory.register( shorthandName, factory );
}
- public void release( final Component component )
+ public TypeFactory getFactory( final String role )
+ throws TypeException
{
+ return createFactory( role + "Selector" );
}
- public void registerType( final String role,
- final String shorthandName,
- final TypeFactory factory )
- throws Exception
+ protected final MultiSourceTypeFactory lookupFactory( final String role )
{
- final TypedComponentSelector selector = createSelector( role + "Selector" );
- selector.register( shorthandName, factory );
+ return (MultiSourceTypeFactory)m_roleMap.get( role );
}
/**
- * Get a selector of appropriate role.
- * Create a Selector if none exists with same name.
+ * Get a factory of appropriate role.
+ * Create a Factory if none exists with same name.
*
* @param role the role name(must be name of work interface)
- * @return the Selector for interface
- * @exception ComponentException if role exists and not a selector, role does not
- * specify accessible work interface, or
+ * @return the Factory for interface
+ * @exception TypeException role does not specify accessible work interface
*/
- private TypedComponentSelector createSelector( final String role )
- throws ComponentException
+ private MultiSourceTypeFactory createFactory( final String role )
+ throws TypeException
{
- TypedComponentSelector selector = (TypedComponentSelector)m_roleMap.get( role );
- if( null != selector )
+ MultiSourceTypeFactory factory = (MultiSourceTypeFactory)m_roleMap.get( role );
+ if( null != factory )
{
- return selector;
+ return factory;
}
- if( null != m_parent )
+ final MultiSourceTypeFactory parentFactory = getParentTypedFactory( role );
+ if( null != parentFactory )
{
- final TypedComponentSelector parentSelector = getTypedSelector( m_parent, role );
-
- if( null != parentSelector )
- {
- selector = new TypedComponentSelector( parentSelector );
- }
+ factory = new MultiSourceTypeFactory( parentFactory );
}
- ///If we haven't goa selector try to create a new one
- if( null == selector )
+ ///If we haven't goa factory try to create a new one
+ if( null == factory )
{
- //Precondition that role.endsWith( "Selector" )
+ //Precondition that role.endsWith( "Factory" )
final int length = role.length() - 8;
final String workInterface = role.substring( 0, length );
@@ -102,30 +87,29 @@
{
//TODO: Should we use ContextClassLoader here ??? Or perhaps try that on failure??
final Class clazz = Class.forName( workInterface );
- selector = new TypedComponentSelector( clazz );
+ factory = new MultiSourceTypeFactory( clazz );
}
catch( final Exception e )
{
- throw new ComponentException( "Role '" + role + "' does not specify " +
- "accessible work interface" );
+ throw new TypeException( "Role '" + role + "' does not specify " +
+ "accessible work interface" );
}
}
- m_roleMap.put( role, selector );
+ m_roleMap.put( role, factory );
- return selector;
+ return factory;
}
- private TypedComponentSelector getTypedSelector( final TypeManager typeManager,
- final String role )
+ private MultiSourceTypeFactory getParentTypedFactory( final String role )
{
- try
+ if( null != m_parent )
{
- return (TypedComponentSelector)typeManager.lookup( role );
+ return m_parent.lookupFactory( role );
+ }
+ else
+ {
+ return null;
}
- catch( final ComponentException ce ) {}
- catch( final ClassCastException cce ) {}
-
- return null;
}
}
1.2 +5 -5 jakarta-ant/proposal/myrmidon/src/java/org/apache/myrmidon/components/type/TypeFactory.java
Index: TypeFactory.java
===================================================================
RCS file: /home/cvs/jakarta-ant/proposal/myrmidon/src/java/org/apache/myrmidon/components/type/TypeFactory.java,v
retrieving revision 1.1
retrieving revision 1.2
diff -u -r1.1 -r1.2
--- TypeFactory.java 2001/06/03 05:31:17 1.1
+++ TypeFactory.java 2001/06/03 06:10:05 1.2
@@ -8,19 +8,19 @@
package org.apache.myrmidon.components.type;
/**
- * Create a component based on role and hint.
+ * Create an instance on name.
*
* @author <a href="mailto:donaldp@apache.org">Peter Donald</a>
- * @version CVS $Revision: 1.1 $ $Date: 2001/06/03 05:31:17 $
+ * @version CVS $Revision: 1.2 $ $Date: 2001/06/03 06:10:05 $
*/
public interface TypeFactory
{
/**
- * Create a Component with appropriate name.
+ * Create a type instance based on name.
*
* @param name the name
- * @return the created component
- * @exception ComponentException if an error occurs
+ * @return the type instance
+ * @exception TypeException if an error occurs
*/
Object create( String name )
throws TypeException;
1.4 +5 -3 jakarta-ant/proposal/myrmidon/src/java/org/apache/myrmidon/components/type/TypeManager.java
Index: TypeManager.java
===================================================================
RCS file: /home/cvs/jakarta-ant/proposal/myrmidon/src/java/org/apache/myrmidon/components/type/TypeManager.java,v
retrieving revision 1.3
retrieving revision 1.4
diff -u -r1.3 -r1.4
--- TypeManager.java 2001/06/03 05:31:17 1.3
+++ TypeManager.java 2001/06/03 06:10:05 1.4
@@ -8,7 +8,6 @@
package org.apache.myrmidon.components.type;
import org.apache.avalon.framework.component.Component;
-import org.apache.avalon.framework.component.ComponentManager;
/**
* The interface that is used to manage types.
@@ -16,10 +15,13 @@
* @author <a href="mailto:donaldp@apache.org">Peter Donald</a>
*/
public interface TypeManager
- extends Component, ComponentManager
+ extends Component
{
String ROLE = "org.apache.myrmidon.components.type.TypeManager";
void registerType( String role, String shorthandName, TypeFactory factory )
- throws Exception;
+ throws TypeException;
+
+ TypeFactory getFactory( String role )
+ throws TypeException;
}
1.1 jakarta-ant/proposal/myrmidon/src/java/org/apache/myrmidon/components/type/MultiSourceTypeFactory.java
Index: MultiSourceTypeFactory.java
===================================================================
/*
* 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.components.type;
import java.util.HashMap;
/**
* This factory acts as a proxy to set of object factorys.
*
* @author <a href="mailto:donaldp@apache.org">Peter Donald</a>
*/
public class MultiSourceTypeFactory
implements TypeFactory
{
///Parent Selector
private final MultiSourceTypeFactory m_parent;
///Map of name->factory list
private final HashMap m_factorys = new HashMap();
///Type expected to be created from factorys
private final Class m_type;
public MultiSourceTypeFactory( final Class type )
{
m_type = type;
m_parent = null;
}
public MultiSourceTypeFactory( final MultiSourceTypeFactory parent )
{
m_type = parent.getType();
m_parent = parent;
}
/**
* Populate the ComponentSelector.
*/
public void register( final String name, final TypeFactory factory )
{
m_factorys.put( name, factory );
}
/**
* Create a type instance based on name.
*
* @param name the name
* @return the type instance
* @exception TypeException if an error occurs
*/
public Object create( final String name )
throws TypeException
{
TypeFactory factory = getTypeFactory( name );
if( null == factory && null != m_parent )
{
m_parent.getTypeFactory( name );
}
if( null == factory ) return null;
else
{
final Object object = factory.create( name );
if( !m_type.isInstance( object ) )
{
throw new TypeException( "Object '" + name + "' is not of " +
"correct Type (" + m_type.getName() + ")" );
}
return object;
}
}
/**
* Retrieve type managed by selector.
* Used by other instances of TypedComponentSelector.
*
* @return the type class
*/
protected final Class getType()
{
return m_type;
}
protected final TypeFactory getTypeFactory( final String name )
{
return (TypeFactory)m_factorys.get( name );
}
}
1.2 +0 -2 jakarta-ant/proposal/myrmidon/src/java/org/apache/myrmidon/converter/Converter.java
Index: Converter.java
===================================================================
RCS file: /home/cvs/jakarta-ant/proposal/myrmidon/src/java/org/apache/myrmidon/converter/Converter.java,v
retrieving revision 1.1
retrieving revision 1.2
diff -u -r1.1 -r1.2
--- Converter.java 2001/06/02 14:28:43 1.1
+++ Converter.java 2001/06/03 06:10:06 1.2
@@ -7,7 +7,6 @@
*/
package org.apache.myrmidon.converter;
-import org.apache.avalon.framework.component.Component;
import org.apache.avalon.framework.context.Context;
/**
@@ -16,7 +15,6 @@
* @author <a href="mailto:donaldp@apache.org">Peter Donald</a>
*/
public interface Converter
- extends Component
{
String ROLE = "org.apache.myrmidon.converter.Converter";