/*
* 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.core.transformer;
import org.mule.runtime.api.lifecycle.InitialisationException;
import org.mule.runtime.api.message.Message;
import org.mule.runtime.api.metadata.DataType;
import org.mule.runtime.core.api.Event;
import org.mule.runtime.core.api.MuleContext;
import org.mule.runtime.core.api.transformer.Transformer;
import org.mule.runtime.core.api.transformer.TransformerException;
import org.mule.runtime.core.util.StringUtils;
import java.nio.charset.Charset;
import java.util.Arrays;
import java.util.Collections;
import java.util.LinkedList;
import java.util.List;
/**
* A referencable chain of transformers that can be used as a single transformer
*/
public class TransformerChain extends AbstractMessageTransformer {
private List<Transformer> transformers;
public TransformerChain(List<Transformer> transformers) {
super();
if (transformers.size() < 1) {
throw new IllegalArgumentException("You must set at least one transformer");
}
this.transformers = new LinkedList<>(transformers);
}
public TransformerChain(Transformer... transformers) {
this(Arrays.asList(transformers));
this.name = generateTransformerName();
setReturnDataType(transformers[transformers.length - 1].getReturnDataType());
}
public TransformerChain(String name, List<Transformer> transformers) {
this(transformers);
this.name = name;
}
public TransformerChain(String name, Transformer... transformers) {
this(name, Arrays.asList(transformers));
}
@Override
public Object transformMessage(Event event, Charset outputEncoding) throws TransformerException {
Message result = event.getMessage();
Object temp = event.getMessage();
Transformer lastTransformer = null;
for (Object element : transformers) {
lastTransformer = (Transformer) element;
temp = lastTransformer.transform(temp);
if (temp instanceof Message) {
result = (Message) temp;
} else {
result = Message.builder(event.getMessage()).payload(temp).build();
event = Event.builder(event).message(result).build();
}
}
if (lastTransformer != null && Message.class.isAssignableFrom(lastTransformer.getReturnDataType().getType())) {
return result;
} else {
return result.getPayload().getValue();
}
}
@Override
public void initialise() throws InitialisationException {
for (Transformer transformer : transformers) {
transformer.initialise();
}
}
@Override
public void setMuleContext(MuleContext muleContext) {
super.setMuleContext(muleContext);
for (Transformer transformer : transformers) {
transformer.setMuleContext(muleContext);
}
}
@Override
protected String generateTransformerName() {
String name = transformers.get(0).getClass().getSimpleName();
int i = name.indexOf("To");
DataType dt = transformers.get(transformers.size() - 1).getReturnDataType();
if (i > 0 && dt != null) {
String target = dt.getType().getSimpleName();
if (target.equals("byte[]")) {
target = "byteArray";
}
name = name.substring(0, i + 2) + StringUtils.capitalize(target);
}
return name;
}
public List<Transformer> getTransformers() {
return Collections.unmodifiableList(transformers);
}
}