use of org.mule.runtime.api.streaming.bytes.CursorStreamProvider in project mule by mulesoft.
the class StreamingUtilsTestCase method consumeJsonRepeatableInputStreamPayload.
@Test
@Description("Test that repeatable stream in the payload is consumed into another fully in memory stream provider while maintaining " + "the original media type")
public void consumeJsonRepeatableInputStreamPayload() throws Exception {
CursorStreamProvider payload = asCursorProvider(TEST_PAYLOAD);
CoreEvent event = consumeRepeatablePayload(getEventBuilder().message(Message.builder().payload(TypedValue.of(payload)).mediaType(APPLICATION_JSON).build()).build());
assertConsumedRepeatableInputStream(payload, event);
assertThat(event.getMessage().getPayload().getDataType().getMediaType(), is(APPLICATION_JSON));
}
use of org.mule.runtime.api.streaming.bytes.CursorStreamProvider in project mule by mulesoft.
the class CursorManager method manage.
/**
* Becomes aware of the given {@code provider} and returns a replacement provider which is managed by the runtime, allowing for
* automatic resource handling
*
* @param provider the provider to be tracked
* @param creatorEvent the event that created the provider
* @return a {@link CursorContext}
*/
public CursorProvider manage(CursorProvider provider, CoreEvent creatorEvent) {
final BaseEventContext ownerContext = ((BaseEventContext) creatorEvent.getContext()).getRootContext();
registerEventContext(ownerContext);
registry.getUnchecked(ownerContext.getId()).addProvider(provider);
final CursorContext context = new CursorContext(provider, ownerContext);
if (provider instanceof CursorStreamProvider) {
return new ManagedCursorStreamProvider(context, this);
} else if (provider instanceof CursorIteratorProvider) {
return new ManagedCursorIteratorProvider(context, this);
}
throw new MuleRuntimeException(createStaticMessage("Unknown cursor provider type: " + context.getClass().getName()));
}
use of org.mule.runtime.api.streaming.bytes.CursorStreamProvider in project mule by mulesoft.
the class StreamingUtils method consumeRepeatablePayload.
/**
* If the {@code event} has a repeatable payload (instance of {@link CursorProvider}), then this method returns a new
* event which payload has an equivalent, already consumed structure. This functionality makes sense for cases like
* caching in which the contents of the stream need to survive the completion of the event that generated it.
* <p>
* If the payload is a {@link CursorStreamProvider}, then it will be consumed into a {@link ByteArrayCursorStreamProvider}
* so that the contents are fully in memory while still keeping repeatable byte streaming semantics.
* <p>
* If the payload is a {@link CursorIteratorProvider}, then the contents will be consumed into a {@link List}.
* <p>
* In any other case, the same input event is returned
*
* @param event an event which might have a repeatable payload
* @return a {@link CoreEvent}
* @since 4.1
*/
public static CoreEvent consumeRepeatablePayload(CoreEvent event) {
TypedValue payload = event.getMessage().getPayload();
final Object originalPayload = payload.getValue();
if (originalPayload == null) {
return event;
}
DataType originalDataType = payload.getDataType();
TypedValue replacedPayload = null;
if (originalPayload instanceof CursorStreamProvider) {
Object consumedPayload = asCursorProvider(toByteArray((CursorStreamProvider) originalPayload));
replacedPayload = new TypedValue(consumedPayload, DataType.builder(originalDataType).type(consumedPayload.getClass()).build());
} else if (originalPayload instanceof CursorIteratorProvider) {
List consumed = new LinkedList<>();
((CursorIteratorProvider) originalPayload).openCursor().forEachRemaining(consumed::add);
DataType newDataType;
if (originalDataType instanceof CollectionDataType) {
final CollectionDataType collectionDataType = (CollectionDataType) originalDataType;
newDataType = DataType.builder(originalDataType).collectionType(consumed.getClass()).itemType(collectionDataType.getItemDataType().getType()).itemMediaType(collectionDataType.getItemDataType().getMediaType()).build();
} else {
newDataType = DataType.builder(originalDataType).type(consumed.getClass()).build();
}
replacedPayload = new TypedValue(consumed, newDataType);
}
if (replacedPayload != null) {
event = CoreEvent.builder(event).message(Message.builder(event.getMessage()).payload(replacedPayload).build()).build();
}
return event;
}
use of org.mule.runtime.api.streaming.bytes.CursorStreamProvider in project mule by mulesoft.
the class CustomJavaSerializationProtocol method doSerialize.
/**
* {@inheritDoc}
*/
@Override
protected byte[] doSerialize(Object object) throws Exception {
// TODO: MULE-11939
if (object instanceof CursorStreamProvider) {
try (CursorStream cursor = ((CursorStreamProvider) object).openCursor()) {
object = toByteArray(cursor);
}
}
validateForSerialization(object);
ByteArrayOutputStream outputStream = new ByteArrayOutputStream(512);
try (ObjectOutputStream out = new ArtifactClassLoaderObjectOutputStream(classLoaderRepository, outputStream)) {
out.writeObject(object);
} catch (IOException ex) {
throw new SerializationException("Cannot serialize object", ex);
}
return outputStream.toByteArray();
}
use of org.mule.runtime.api.streaming.bytes.CursorStreamProvider in project mule by mulesoft.
the class InputStreamToByteArrayTestCase method transformCursorStreamProvider.
@Test
public void transformCursorStreamProvider() throws Exception {
InputStream inputStream = new ByteArrayInputStream(DONKEY.getBytes());
CursorStreamProvider provider = new InMemoryCursorStreamProvider(inputStream, InMemoryCursorStreamConfig.getDefault(), new SimpleByteBufferManager());
assertThat(transformer.transform(provider), equalTo(DONKEY.getBytes()));
}
Aggregations