All Downloads are FREE. Search and download functionalities are using the official Maven repository.

org.nakedobjects.metamodel.commons.factory.InstanceFactory Maven / Gradle / Ivy

The newest version!
package org.nakedobjects.metamodel.commons.factory;

import org.nakedobjects.metamodel.commons.ensure.Assert;
import org.nakedobjects.metamodel.commons.lang.CastUtils;


public class InstanceFactory {

    public static Object createInstance(final String className) {
        return createInstance(className, (Class)null, null);
    }

    public static Object createInstance(final Class cls) {
        return createInstance(cls, (Class)null, null);
    }

    public static  T createInstance(final String className, final Class requiredClass) {
        return createInstance(className, (Class)null, requiredClass);
    }

    public static  T createInstance(final Class cls, final Class requiredClass) {
        return createInstance(cls, (Class)null, requiredClass);
    }

    public static  T createInstance(final String className, final String defaultTypeName, final Class requiredType) {
        Class defaultType = null;
        if (defaultTypeName != null) {
        	try {
        		defaultType = CastUtils.cast(Thread.currentThread().getContextClassLoader().loadClass(defaultTypeName));
        		if (defaultType == null) {
        			throw new InstanceCreationClassException("Failed to load default type '" + defaultTypeName + "'");
        		}
        	} catch (final ClassNotFoundException e) {
        		throw new UnavailableClassException("The default type '" + defaultTypeName + "' cannot be found");
        	} catch (final NoClassDefFoundError e) {
        		throw new InstanceCreationClassException("Default type '" + defaultTypeName + "' found, but is missing a dependent class: " + e.getMessage(), e);
        	}
        }
        return createInstance(className, defaultType, requiredType);
    }

    public static  T createInstance(final Class cls, final String defaultTypeName, final Class requiredType) {
        Class defaultType = null;
        if (defaultTypeName != null) {
        	defaultType = loadClass(defaultTypeName, requiredType);
        	try {
        		defaultType = CastUtils.cast(Thread.currentThread().getContextClassLoader().loadClass(defaultTypeName));
        		if (defaultType == null) {
        			throw new InstanceCreationClassException("Failed to load default type '" + defaultTypeName + "'");
        		}
        	} catch (final ClassNotFoundException e) {
        		throw new UnavailableClassException("The default type '" + defaultTypeName + "' cannot be found");
        	} catch (final NoClassDefFoundError e) {
        		throw new InstanceCreationClassException("Default type '" + defaultTypeName + "' found, but is missing a dependent class: " + e.getMessage(), e);
        	}
        }
        return createInstance(cls, defaultType, requiredType);
    }

    public static  T createInstance(final String className, final Class defaultType, final Class requiredType) {
        Assert.assertNotNull("Class to instantiate must be specified", className);
        Class cls = null;
        try {
            cls = Thread.currentThread().getContextClassLoader().loadClass(className);
            if (cls == null) {
                throw new InstanceCreationClassException("Failed to load class '" + className + "'");
            }
            return createInstance(cls, defaultType, requiredType);
        } catch (final ClassNotFoundException e) {
            if (className.indexOf('.') == -1) {
                throw new UnavailableClassException("The component '" + className + "' cannot be found");
            }
            throw new UnavailableClassException("The class '" + className + "' cannot be found");
        } catch (final NoClassDefFoundError e) {
            throw new InstanceCreationClassException("Class '" + className + "' found , but is missing a dependent class: " + e.getMessage(), e);
        }
    }

    public static  T createInstance(final Class cls, final Class defaultType, final Class requiredType) {
        Assert.assertNotNull("Class to instantiate must be specified", cls);
        try {
            if (requiredType == null || requiredType.isAssignableFrom(cls)) {
                final Class tClass = CastUtils.cast(cls);
                return tClass.newInstance();
            } else {
                throw new InstanceCreationClassException("Class '" + cls.getName() + "' is not of type '" + requiredType + "'");
            }
        } catch (final NoClassDefFoundError e) {
            throw new InstanceCreationClassException("Class '" + cls + "'found , but is missing a dependent class: " + e.getMessage(), e);
        } catch (final InstantiationException e) {
            throw new InstanceCreationException("Could not instantiate an object of class '" + cls.getName() + "'; "
                    + e.getMessage());
        } catch (final IllegalAccessException e) {
            throw new InstanceCreationException("Could not access the class '" + cls.getName() + "'; " + e.getMessage());
        }
    }

	public static Class loadClass(
			String className) {
        Assert.assertNotNull("Class to instantiate must be specified", className);
    	try {
    		return Thread.currentThread().getContextClassLoader().loadClass(className);
    	} catch (final ClassNotFoundException e) {
    		throw new UnavailableClassException("The default type '" + className + "' cannot be found");
    	} catch (final NoClassDefFoundError e) {
    		throw new InstanceCreationClassException("Default type '" + className + "' found, but is missing a dependent class: " + e.getMessage(), e);
    	}
	}

	public static  Class loadClass(
			String className, Class requiredType) {
        Assert.assertNotNull("Class to instantiate must be specified", className);
    	try {
    		Class loadedClass = loadClass(className);
    		if (requiredType != null && !requiredType.isAssignableFrom(loadedClass)) {
    			throw new InstanceCreationClassException("Class '" + className + "' is not of type '" + requiredType + "'");
    		}
			return CastUtils.cast(loadedClass);
    	} catch (final NoClassDefFoundError e) {
    		throw new InstanceCreationClassException("Default type '" + className + "' found, but is missing a dependent class: " + e.getMessage(), e);
    	}
	}

}
// Copyright (c) Naked Objects Group Ltd.




© 2015 - 2024 Weber Informatics LLC | Privacy Policy