blob: 5293c8a2d4f388fa4bed70c37425f78cbbe68eb5 [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.net.URL;
import java.util.HashMap;
import java.net.URLClassLoader;
/**
* Create a type instance based on name.
*
* @author <a href="mailto:donaldp@apache.org">Peter Donald</a>
* @version CVS $Revision$ $Date$
*/
public class DefaultTypeFactory
implements TypeFactory
{
///A Map of shortnames to classnames
private final HashMap m_classNames = new HashMap();
///A list of URLs from which classLoader is constructed
private final URL[] m_urls;
///The parent classLoader (if any)
private final ClassLoader m_parent;
///The parent classLoader (if any)
private ClassLoader m_classLoader;
public DefaultTypeFactory( final URL url )
{
this( new URL[] { url } );
}
public DefaultTypeFactory( final URL[] urls )
{
this( urls, Thread.currentThread().getContextClassLoader() );
}
public DefaultTypeFactory( final URL[] urls, final ClassLoader parent )
{
m_urls = urls;
m_parent = parent;
}
public DefaultTypeFactory( final ClassLoader classLoader )
{
this( null, null );
m_classLoader = classLoader;
}
public void addNameClassMapping( final String name, final String className )
{
m_classNames.put( name, className );
}
/**
* Create a type instance with appropriate name.
*
* @param name the name
* @return the created instance
* @exception TypeException if an error occurs
*/
public Object create( final String name )
throws TypeException
{
final String className = getClassName( name );
try
{
return getClassLoader().loadClass( className ).newInstance();
}
catch( final Exception e )
{
throw new TypeException( "Unable to instantiate '" + name + "'", e );
}
}
private String getClassName( final String name )
throws TypeException
{
final String className = (String)m_classNames.get( name );
if( null == className )
{
throw new TypeException( "Malconfigured factory, no clasname for '" +
name + "'" );
}
return className;
}
private ClassLoader getClassLoader()
{
if( null == m_classLoader )
{
m_classLoader = new URLClassLoader( m_urls, m_parent );
}
return m_classLoader;
}
}