blob: 887c1279f70c8b098254847f6344e9ee646d93b7 [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;
/**
* 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 )
{
factory = m_parent.getTypeFactory( name );
}
if( null == factory )
{
throw new TypeException( "Failed to locate factory for '" + name + "'" );
}
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 );
}
}