/* * 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.config.spring.dsl.processor; import static org.apache.commons.lang.StringUtils.isNotEmpty; import static org.mule.runtime.api.util.Preconditions.checkArgument; import static org.mule.runtime.core.util.ClassUtils.instanciateClass; import org.mule.runtime.api.exception.MuleRuntimeException; import org.mule.runtime.api.metadata.DataType; import org.mule.runtime.api.metadata.DataTypeParamsBuilder; import org.mule.runtime.core.api.transformer.Transformer; import org.mule.runtime.core.transformer.AbstractTransformer; import org.mule.runtime.core.util.ClassUtils; import org.mule.runtime.dsl.api.component.AbstractAnnotatedObjectFactory; import org.mule.runtime.dsl.api.component.ObjectFactory; /** * {@link ObjectFactory} for transformer in Mules. * * The transformer class that will be created need to be provided by setting the {@code transformerClass} attribute. The * recommended approach is to make use of * {@link org.mule.runtime.config.spring.dsl.model.CoreComponentBuildingDefinitionProvider#getTransformerBaseBuilderForClass(Class)} * or {@code CoreComponentBuildingDefinitionProvider#getTransformerBaseBuilder()}. * * This class can also be used as the base class for other {@code ObjectFactory}s that need to inject additional field to the * created transformer. The {@code createInstance} method can be override to create the transformer instance and the * {@code postProcessInstance} method can be used to do additional stuff over the transformer instance like doing additional * parameter configuration. */ public class TransformerObjectFactory extends AbstractAnnotatedObjectFactory<Transformer> { private Class<? extends AbstractTransformer> transformerClass; private String name; private boolean ignoreBadInput; private String returnClass; private String encoding; private String mimeType; @Override public final Transformer doGetObject() throws Exception { AbstractTransformer transformerInstance = createInstance(); if (returnClass != null || mimeType != null) { DataTypeParamsBuilder builder = DataType.builder().type(getReturnType()); if (isNotEmpty(mimeType)) { builder.mediaType(mimeType); } transformerInstance.setReturnDataType(builder.charset(encoding).build()); } transformerInstance.setIgnoreBadInput(ignoreBadInput); transformerInstance.setName(name); postProcessInstance(transformerInstance); return transformerInstance; } /** * Template method for subclasses to customize the transformer instance. * * @param transformerInstance the instantiated transformer instance with the basic configuration. */ protected void postProcessInstance(AbstractTransformer transformerInstance) {} /** * Template method for creating the transformer instance. * * @return a transformer instance * @throws NoSuchMethodException * @throws InstantiationException * @throws IllegalAccessException * @throws java.lang.reflect.InvocationTargetException */ protected AbstractTransformer createInstance() { checkArgument(transformerClass != null, "Default createInstance method is used but no transformerClass was provided"); try { return instanciateClass(transformerClass, new Object[0]); } catch (Exception e) { throw new MuleRuntimeException(e); } } private Class<?> getReturnType() { Class<?> returnType = Object.class; if (returnClass != null) { try { returnType = ClassUtils.getClass(returnClass); } catch (ClassNotFoundException e) { throw new MuleRuntimeException(e); } } return returnType; } public void setTransformerClass(Class<? extends AbstractTransformer> transformerClass) { this.transformerClass = transformerClass; } public void setName(String name) { this.name = name; } public void setReturnClass(String returnClass) { this.returnClass = returnClass; } public void setIgnoreBadInput(boolean ignoreBadInput) { this.ignoreBadInput = ignoreBadInput; } public void setEncoding(String encoding) { this.encoding = encoding; } public void setMimeType(String mimeType) { this.mimeType = mimeType; } }