/*
* 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 static java.util.Collections.singletonList;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.fail;
import static org.mule.runtime.api.message.Message.of;
import static org.mule.runtime.core.util.SystemUtils.getDefaultEncoding;
import org.mule.runtime.api.exception.MuleException;
import org.mule.runtime.api.message.Message;
import org.mule.runtime.api.metadata.DataType;
import org.mule.runtime.core.api.TransformationService;
import org.mule.runtime.core.api.transformer.MessageTransformerException;
import org.mule.runtime.core.api.transformer.Transformer;
import org.mule.runtime.core.api.transformer.TransformerException;
import org.mule.tck.junit4.AbstractMuleContextTestCase;
import java.nio.charset.Charset;
import org.junit.Before;
import org.junit.Test;
public class TransformerChainingTestCase extends AbstractMuleContextTestCase {
private TransformationService transformationService;
@Before
public void setUp() throws Exception {
transformationService = new TransformationService(muleContext);
}
@Test
public void testSingleChainedTransformer() throws Exception {
AbstractTransformer validTransformer = (AbstractTransformer) this.getIncreaseByOneTransformer();
assertNotNull(validTransformer);
Message message = of(new Integer(0));
Transformer messageTransformer = new TransformerChain(validTransformer);
message = transformationService.applyTransformers(message, eventBuilder().message(of(0)).build(),
messageTransformer);
Object transformedMessage = message.getPayload().getValue();
assertNotNull(transformedMessage);
assertEquals(new Integer(1), transformedMessage);
}
@Test
public void testTwoChainedTransformers() throws Exception {
AbstractTransformer validTransformer = (AbstractTransformer) this.getIncreaseByOneTransformer();
assertNotNull(validTransformer);
Message message = of(new Integer(0));
Transformer messageTransformer = new TransformerChain(validTransformer, validTransformer);
message = transformationService.applyTransformers(message, eventBuilder().message(of(0)).build(),
singletonList(messageTransformer));
Object transformedMessage = message.getPayload().getValue();
assertNotNull(transformedMessage);
assertEquals(new Integer(2), transformedMessage);
}
@Test
public void testThreeChainedTransformers() throws Exception {
AbstractTransformer validTransformer = (AbstractTransformer) this.getIncreaseByOneTransformer();
assertNotNull(validTransformer);
Message message = of(new Integer(0));
Transformer messageTransformer = new TransformerChain(validTransformer, validTransformer, validTransformer);
message = transformationService.applyTransformers(message, eventBuilder().message(of(0)).build(),
messageTransformer);
Object transformedMessage = message.getPayload().getValue();
assertNotNull(transformedMessage);
assertEquals(new Integer(3), transformedMessage);
}
@Test(expected = MessageTransformerException.class)
public void testIgnoreBadInputBreaksWithTransformationOrderInvalidValidWhenEnforcedOn() throws Exception {
AbstractTransformer invalidTransformer = (AbstractTransformer) this.getInvalidTransformer();
assertNotNull(invalidTransformer);
invalidTransformer.setIgnoreBadInput(true);
AbstractTransformer validTransformer = (AbstractTransformer) this.getIncreaseByOneTransformer();
assertNotNull(validTransformer);
Message message = of(new Integer(0));
Transformer messageTransformer = new TransformerChain(invalidTransformer, validTransformer);
transformationService.applyTransformers(message, eventBuilder().message(of(0)).build(), messageTransformer);
}
@Test
public void testIgnoreBadInputBreaksChainWithTransformationOrderInvalidValid() throws Exception {
AbstractTransformer invalidTransformer = (AbstractTransformer) this.getInvalidTransformer();
assertNotNull(invalidTransformer);
invalidTransformer.setIgnoreBadInput(false);
AbstractTransformer validTransformer = (AbstractTransformer) this.getIncreaseByOneTransformer();
assertNotNull(validTransformer);
Message message = of(new Integer(0));
Transformer messageTransformer = new TransformerChain(invalidTransformer, validTransformer);
try {
transformationService.applyTransformers(message, eventBuilder().message(of(0)).build(), messageTransformer);
fail("Transformer chain is expected to fail because of invalid transformer within chain.");
} catch (MuleException tfe) {
// ignore
}
}
@Test
public void testIgnoreBadInputBreaksChainWithTransformationOrderValidInvalid() throws Exception {
AbstractTransformer invalidTransformer = (AbstractTransformer) this.getInvalidTransformer();
assertNotNull(invalidTransformer);
invalidTransformer.setIgnoreBadInput(false);
AbstractTransformer validTransformer = (AbstractTransformer) this.getIncreaseByOneTransformer();
assertNotNull(validTransformer);
Message message = of(new Integer(0));
Transformer messageTransformer = new TransformerChain(validTransformer, invalidTransformer);
try {
transformationService.applyTransformers(message, eventBuilder().message(of(0)).build(), messageTransformer);
fail("Transformer chain is expected to fail because of invalid transformer within chain.");
} catch (MuleException tfe) {
assertNotNull(tfe);
}
}
private Transformer getInvalidTransformer() throws Exception {
AbstractTransformer transformer = new AbstractTransformer() {
@Override
protected Object doTransform(final Object src, final Charset encoding) throws TransformerException {
throw new RuntimeException("This transformer must not perform any transformations.");
}
};
// Use this class as a bogus source type to enforce a simple invalid transformer
transformer.registerSourceType(DataType.fromType(this.getClass()));
return transformer;
}
private Transformer getIncreaseByOneTransformer() throws Exception {
AbstractTransformer transformer = new AbstractTransformer() {
@Override
protected Object doTransform(Object src, Charset encoding) throws TransformerException {
return new Integer(((Integer) src).intValue() + 1);
}
};
DataType integerDataType = DataType.fromType(Integer.class);
transformer.registerSourceType(integerDataType);
transformer.setReturnDataType(DataType.builder(integerDataType).charset(getDefaultEncoding(muleContext)).build());
return transformer;
}
}