@Test public void maintainsCurrentDataTypeClassWhenTransformerOutputTypeIsObject() throws Exception { Message message = of(TEST_PAYLOAD); Transformer transformer = mock(Transformer.class); when(transformer.isSourceDataTypeSupported(any())).thenReturn(true); DataType outputDataType = DataType.builder().type(Object.class).mediaType(ANY).build(); when(transformer.getReturnDataType()).thenReturn(outputDataType); when(transformer.transform(message)).thenReturn(TEST_PAYLOAD); CoreEvent muleEvent = mock(CoreEvent.class); Message result = transformationService.applyTransformers(message, muleEvent, singletonList(transformer)); assertDataType(result, String.class, ANY, DEFAULT_ENCODING); }
@Test public void transformerIsNeverCalledWithANullValue() throws MuleException { MuleContext muleContext = mock(MuleContext.class); MuleConfiguration muleConfiguration = mock(MuleConfiguration.class); when(muleContext.getConfiguration()).thenReturn(muleConfiguration); ExtendedTransformationService transformationService = new ExtendedTransformationService(muleContext); Transformer transformer1 = mock(Transformer.class); when(transformer1.transform(any(Object.class))).thenReturn(null); when(transformer1.isSourceDataTypeSupported(any(DataType.class))).thenReturn(true); when(transformer1.getReturnDataType()).thenReturn(DataType.OBJECT); Transformer transformer2 = mock(Transformer.class); when(transformer2.transform(any(Object.class))).thenReturn("foo"); when(transformer2.isSourceDataTypeSupported(any(DataType.class))).thenReturn(true); when(transformer2.getReturnDataType()).thenReturn(DataType.OBJECT); Message message = transformationService.applyTransformers(of(""), null, transformer1, transformer2); assertEquals("foo", message.getPayload().getValue()); verify(transformer1, never()).transform(null); verify(transformer1, never()).isAcceptNull(); verify(transformer2, never()).transform(null); verify(transformer2, never()).isAcceptNull(); } }
public Transformer build() { Transformer transformer; if (name == null || name.isEmpty()) { transformer = mock(getClassToMock()); } else { transformer = mock(getClassToMock(), name); doReturn(name).when(transformer).getName(); } if (resultDataType != null) { doReturn(resultDataType).when(transformer).getReturnDataType(); } if (sourceDataTypes != null) { doReturn(Arrays.asList(sourceDataTypes)).when(transformer).getSourceDataTypes(); when(transformer.isSourceDataTypeSupported(argThat(new SupportsSourceDataType()))).thenReturn(true); } try { doReturn(value).when(transformer).transform(Mockito.any(Object.class)); } catch (TransformerException e) { // Not going to happen during mock setup } return transformer; }
@Test public void updatesEncodingOnTransformation() throws Exception { Message message = Message.builder().value(TEST_PAYLOAD).mediaType(APPLICATION_XML_DEFAULT).build(); Transformer transformer = mock(Transformer.class); when(transformer.isSourceDataTypeSupported(any())).thenReturn(true); DataType outputDataType = DataType.builder().type(Integer.class).charset(CUSTOM_ENCODING).build(); when(transformer.getReturnDataType()).thenReturn(outputDataType); when(transformer.transform(anyObject())).thenReturn(Integer.valueOf(1)); CoreEvent muleEvent = mock(CoreEvent.class); Message result = transformationService.applyTransformers(message, muleEvent, singletonList(transformer)); assertDataType(result, Integer.class, APPLICATION_XML, CUSTOM_ENCODING); }
@Test public void updatesMimeTypeOnTransformation() throws Exception { Message message = Message.builder().value(TEST_PAYLOAD).mediaType(ANY.withCharset(CUSTOM_ENCODING)).build(); Transformer transformer = mock(Transformer.class); when(transformer.isSourceDataTypeSupported(any())).thenReturn(true); DataType outputDataType = DataType.builder().type(Integer.class).mediaType(APPLICATION_XML).build(); when(transformer.getReturnDataType()).thenReturn(outputDataType); when(transformer.transform(any(Message.class))).thenReturn(1); CoreEvent muleEvent = mock(CoreEvent.class); Message result = transformationService.applyTransformers(message, muleEvent, singletonList(transformer)); assertDataType(result, Integer.class, APPLICATION_XML, CUSTOM_ENCODING); }
@Test public void updatesTypeOnTransformation() throws Exception { Message message = Message.builder().value(1).mediaType(APPLICATION_XML_DEFAULT).build(); Transformer transformer = mock(Transformer.class); when(transformer.isSourceDataTypeSupported(any())).thenReturn(true); DataType outputDataType = DataType.builder().type(Integer.class).mediaType(ANY).charset(DEFAULT_ENCODING).build(); when(transformer.getReturnDataType()).thenReturn(outputDataType); when(transformer.transform(anyObject())).thenReturn(1); CoreEvent muleEvent = mock(CoreEvent.class); Message result = transformationService.applyTransformers(message, muleEvent, singletonList(transformer)); assertDataType(result, Integer.class, APPLICATION_XML, DEFAULT_ENCODING); }
@Override public DataType getReturnDataType() { return transformer.getReturnDataType(); }
@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) + capitalize(target); } return name; }
public TransformerChain(Transformer... transformers) { this(Arrays.asList(transformers)); this.name = generateTransformerName(); setReturnDataType(transformers[transformers.length - 1].getReturnDataType()); }
@Override default ProcessingType getProcessingType() { if (getReturnDataType().isStreamType() || getSourceDataTypes().stream().anyMatch(dataType -> dataType.isStreamType())) { return IO_RW; } else { return CPU_INTENSIVE; } }
/** * Checks whether a given value is a valid output for a transformer. * * @param transformer the transformer used to validate * @param value the output value * @throws TransformerException if the output value is of a unexpected type. */ public static void checkTransformerReturnClass(Transformer transformer, Object value) throws TransformerException { if (value == null && (transformer instanceof AbstractTransformer && ((AbstractTransformer) transformer).isAllowNullReturn())) { return; } if (transformer.getReturnDataType() != null) { DataTypeParamsBuilder dtBuilder = DataType.builder().fromObject(value); if (!(value instanceof DataHandler) && !(value instanceof DataSource)) { // To avoid getting an error because the DataType was constructed with a default mediaType dtBuilder = dtBuilder.mediaType(transformer.getReturnDataType().getMediaType()); } DataType dt = dtBuilder.build(); if (!transformer.getReturnDataType().isCompatibleWith(dt)) { throw new TransformerException(transformUnexpectedType(dt, transformer.getReturnDataType()), transformer); } } if (LOGGER.isDebugEnabled()) { LOGGER.debug("The transformed value is of expected type. Type is: " + ClassUtils.getSimpleName(value.getClass())); } }
private void init() { inputWeighting = Integer.MAX_VALUE; List<DataType> sourceTypes = transformer.getSourceDataTypes(); for (DataType type : sourceTypes) { int weighting = getWeighting(-1, inputClass, type.getType()); if (weighting < inputWeighting && weighting != -1) { inputWeighting = weighting; } } outputWeighting = getWeighting(-1, outputClass, transformer.getReturnDataType().getType()); inputWeighting = (inputWeighting == Integer.MAX_VALUE ? -1 : inputWeighting); outputWeighting = (outputWeighting == Integer.MAX_VALUE ? -1 : outputWeighting); }
@Test public void transformerIsNeverCalledWithANullValue() throws MuleException { MuleContext muleContext = mock(MuleContext.class); MuleConfiguration muleConfiguration = mock(MuleConfiguration.class); when(muleContext.getConfiguration()).thenReturn(muleConfiguration); ExtendedTransformationService transformationService = new ExtendedTransformationService(muleContext); Transformer transformer1 = mock(Transformer.class); when(transformer1.transform(any(Object.class))).thenReturn(null); when(transformer1.isSourceDataTypeSupported(any(DataType.class))).thenReturn(true); when(transformer1.getReturnDataType()).thenReturn(DataType.OBJECT); Transformer transformer2 = mock(Transformer.class); when(transformer2.transform(any(Object.class))).thenReturn("foo"); when(transformer2.isSourceDataTypeSupported(any(DataType.class))).thenReturn(true); when(transformer2.getReturnDataType()).thenReturn(DataType.OBJECT); Message message = transformationService.applyTransformers(of(""), null, transformer1, transformer2); assertEquals("foo", message.getPayload().getValue()); verify(transformer1, never()).transform(null); verify(transformer1, never()).isAcceptNull(); verify(transformer2, never()).transform(null); verify(transformer2, never()).isAcceptNull(); } }
public Transformer build() { Transformer transformer; if (name == null || name.isEmpty()) { transformer = mock(getClassToMock()); } else { transformer = mock(getClassToMock(), name); doReturn(name).when(transformer).getName(); } if (resultDataType != null) { doReturn(resultDataType).when(transformer).getReturnDataType(); } if (sourceDataTypes != null) { doReturn(Arrays.asList(sourceDataTypes)).when(transformer).getSourceDataTypes(); when(transformer.isSourceDataTypeSupported((DataType) argThat(new SupportsSourceDataType()))).thenReturn(true); } try { doReturn(value).when(transformer).transform(Mockito.any(Object.class)); } catch (TransformerException e) { // Not going to happen during mock setup } return transformer; }
@Test public void maintainsCurrentDataTypeClassWhenTransformerOutputTypeIsObject() throws Exception { Message message = of(TEST_PAYLOAD); Transformer transformer = mock(Transformer.class); when(transformer.isSourceDataTypeSupported(any())).thenReturn(true); DataType outputDataType = DataType.builder().type(Object.class).mediaType(ANY).build(); when(transformer.getReturnDataType()).thenReturn(outputDataType); when(transformer.transform(message)).thenReturn(TEST_PAYLOAD); CoreEvent muleEvent = mock(CoreEvent.class); Message result = transformationService.applyTransformers(message, muleEvent, singletonList(transformer)); assertDataType(result, String.class, ANY, DEFAULT_ENCODING); }
@Test public void updatesEncodingOnTransformation() throws Exception { Message message = Message.builder().value(TEST_PAYLOAD).mediaType(APPLICATION_XML_DEFAULT).build(); Transformer transformer = mock(Transformer.class); when(transformer.isSourceDataTypeSupported(any())).thenReturn(true); DataType outputDataType = DataType.builder().type(Integer.class).charset(CUSTOM_ENCODING).build(); when(transformer.getReturnDataType()).thenReturn(outputDataType); when(transformer.transform(anyObject())).thenReturn(Integer.valueOf(1)); CoreEvent muleEvent = mock(CoreEvent.class); Message result = transformationService.applyTransformers(message, muleEvent, singletonList(transformer)); assertDataType(result, Integer.class, APPLICATION_XML, CUSTOM_ENCODING); }
@Test public void updatesMimeTypeOnTransformation() throws Exception { Message message = Message.builder().value(TEST_PAYLOAD).mediaType(ANY.withCharset(CUSTOM_ENCODING)).build(); Transformer transformer = mock(Transformer.class); when(transformer.isSourceDataTypeSupported(any())).thenReturn(true); DataType outputDataType = DataType.builder().type(Integer.class).mediaType(APPLICATION_XML).build(); when(transformer.getReturnDataType()).thenReturn(outputDataType); when(transformer.transform(anyString())).thenReturn(1); CoreEvent muleEvent = mock(CoreEvent.class); Message result = transformationService.applyTransformers(message, muleEvent, singletonList(transformer)); assertDataType(result, Integer.class, APPLICATION_XML, CUSTOM_ENCODING); }
@Test public void updatesTypeOnTransformation() throws Exception { Message message = Message.builder().value(1).mediaType(APPLICATION_XML_DEFAULT).build(); Transformer transformer = mock(Transformer.class); when(transformer.isSourceDataTypeSupported(any())).thenReturn(true); DataType outputDataType = DataType.builder().type(Integer.class).mediaType(ANY).charset(DEFAULT_ENCODING).build(); when(transformer.getReturnDataType()).thenReturn(outputDataType); when(transformer.transform(anyObject())).thenReturn(1); CoreEvent muleEvent = mock(CoreEvent.class); Message result = transformationService.applyTransformers(message, muleEvent, singletonList(transformer)); assertDataType(result, Integer.class, APPLICATION_XML, DEFAULT_ENCODING); }
private Message transformMessage(final Message message, final CoreEvent event, final Transformer transformer) throws MessageTransformerException, TransformerException { Object result; if (transformer instanceof MessageTransformer) { result = ((MessageTransformer) transformer).transform(message, event); } else { result = transformer.transform(message); } if (result instanceof Message) { return (Message) result; } else { // We need to use message from event if it's available in case the transformer mutated the message by creating // a new message instance. This issue goes away once transformers are cleaned up and always return event or // message. See MULE-9342 Message messagePostTransform = (event != null && event.getMessage() != null) ? event.getMessage() : message; return Message.builder(messagePostTransform).value(result) .mediaType(mergeMediaType(messagePostTransform, transformer.getReturnDataType())).build(); } }
@Override public Object transformMessage(CoreEvent event, Charset outputEncoding) throws MessageTransformerException { Message result = event.getMessage(); Object temp = event.getMessage(); Transformer lastTransformer = null; for (Object element : transformers) { lastTransformer = (Transformer) element; try { temp = lastTransformer.transform(temp); } catch (TransformerException e) { throw new MessageTransformerException(lastTransformer, e, event.getMessage()); } if (temp instanceof Message) { result = (Message) temp; } else { result = Message.builder(event.getMessage()).value(temp).build(); event = CoreEvent.builder(event).message(result).build(); } } if (lastTransformer != null && Message.class.isAssignableFrom(lastTransformer.getReturnDataType().getType())) { return result; } else { return result.getPayload().getValue(); } }