blob: 37a30f954065753eca7fcaf86d0a64d0102d0029 [file] [log] [blame]
/*
* 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;
/**
* The interface that is used to manage types.
*
* @author <a href="mailto:donaldp@apache.org">Peter Donald</a>
*/
public class DefaultTypeManager
implements TypeManager
{
///Parent type manager to inherit values from.
private final DefaultTypeManager m_parent;
///Maps role to MultiSourceTypeFactory.
private final HashMap m_roleMap = new HashMap();
public DefaultTypeManager()
{
this( null );
}
public DefaultTypeManager( final DefaultTypeManager parent )
{
m_parent = parent;
}
public void registerType( final String role,
final String shorthandName,
final TypeFactory factory )
throws TypeException
{
final MultiSourceTypeFactory msFactory = createFactory( role );
msFactory.register( shorthandName, factory );
}
public TypeFactory getFactory( final String role )
throws TypeException
{
return createFactory( role );
}
public TypeManager createChildTypeManager()
{
return new DefaultTypeManager( this );
}
protected final MultiSourceTypeFactory lookupFactory( final String role )
{
return (MultiSourceTypeFactory)m_roleMap.get( role );
}
/**
* 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 Factory for interface
* @exception TypeException role does not specify accessible work interface
*/
private MultiSourceTypeFactory createFactory( final String role )
throws TypeException
{
MultiSourceTypeFactory factory = (MultiSourceTypeFactory)m_roleMap.get( role );
if( null != factory )
{
return factory;
}
final MultiSourceTypeFactory parentFactory = getParentTypedFactory( role );
if( null != parentFactory )
{
factory = new MultiSourceTypeFactory( parentFactory );
}
///If we haven't got factory try to create a new one
if( null == factory )
{
try
{
//TODO: Should we use ContextClassLoader here ??? Or perhaps try that on failure??
final Class clazz = Class.forName( role );
factory = new MultiSourceTypeFactory( clazz );
}
catch( final Exception e )
{
throw new TypeException( "Role '" + role + "' does not specify " +
"accessible work interface" );
}
}
m_roleMap.put( role, factory );
return factory;
}
private MultiSourceTypeFactory getParentTypedFactory( final String role )
{
if( null != m_parent )
{
return m_parent.lookupFactory( role );
}
else
{
return null;
}
}
}