/*
* Copyright (c) MuleSoft, Inc. All rights reserved. http://www.mulesoft.com
* The software in this package is published under the terms of the CPAL v1.0
* license, a copy of which has been included with this distribution in the
* LICENSE.txt file.
*/
package org.mule.runtime.module.extension.internal.loader.java;
import static org.mule.runtime.api.i18n.I18nMessageFactory.createStaticMessage;
import static org.mule.runtime.core.util.ClassUtils.withContextClassLoader;
import static org.mule.runtime.api.util.Preconditions.checkArgument;
import static org.mule.runtime.module.extension.internal.util.IntrospectionUtils.checkInstantiable;
import org.mule.runtime.api.exception.MuleRuntimeException;
import org.mule.runtime.extension.api.runtime.config.ConfigurationFactory;
/**
* Implementation of {@link ConfigurationFactory} which creates instances based on a given {@link Class} which is assumed to have
* a default and public constructor.
*
* @since 3.7.0
*/
public final class TypeAwareConfigurationFactory implements ConfigurationFactory {
private final Class<?> configurationType;
private final ClassLoader extensionClassLoader;
/**
* Creates an instance of a given {@code configurationType} on each invocation to {@link #newInstance()}.
*
* @param configurationType the type to be instantiated. Must be not {@code null}, and have a public default constructor
* @param extensionClassLoader the {@link ClassLoader} on which the extension is loaded
* @throws IllegalArgumentException if the type is {@code null} or doesn't have a default public constructor
*/
public TypeAwareConfigurationFactory(Class<?> configurationType, ClassLoader extensionClassLoader) {
checkArgument(configurationType != null, "configuration type cannot be null");
checkArgument(extensionClassLoader != null, "extensionClassLoader type cannot be null");
checkInstantiable(configurationType);
this.configurationType = configurationType;
this.extensionClassLoader = extensionClassLoader;
}
/**
* Returns a new instance on each invocation {@inheritDoc}
*/
@Override
public Object newInstance() {
try {
return withContextClassLoader(extensionClassLoader, configurationType::newInstance);
} catch (Exception e) {
throw new MuleRuntimeException(createStaticMessage("Could not instantiate configuration of type "
+ configurationType.getName()), e);
}
}
/**
* {@inheritDoc}
*/
@Override
public Class<?> getObjectType() {
return configurationType;
}
}