/*
# Licensed Materials - Property of IBM
# Copyright IBM Corp. 2015
*/
package com.ibm.streamsx.topology.internal.functional.ops;
import static com.ibm.streamsx.topology.internal.functional.FunctionalHelper.getOutputMapping;
import com.ibm.streams.operator.OperatorContext;
import com.ibm.streams.operator.OutputTuple;
import com.ibm.streams.operator.StreamingData.Punctuation;
import com.ibm.streams.operator.StreamingOutput;
import com.ibm.streams.operator.model.Icons;
import com.ibm.streams.operator.model.InputPortSet;
import com.ibm.streams.operator.model.OutputPortSet;
import com.ibm.streams.operator.model.PrimitiveOperator;
import com.ibm.streamsx.topology.function.Function;
import com.ibm.streamsx.topology.internal.functional.FunctionalHandler;
import com.ibm.streamsx.topology.internal.spljava.SPLMapping;
@PrimitiveOperator
@InputPortSet(cardinality = 1)
@OutputPortSet(cardinality = 1)
@Icons(location16 = "opt/icons/functor_16.gif", location32 = "opt/icons/functor_32.gif")
public class FunctionMultiTransform extends FunctionQueueableFunctor {
private FunctionalHandler<Function<Object, Iterable<Object>>> transformHandler;
private SPLMapping<Object> outputMapping;
private StreamingOutput<OutputTuple> output;
@Override
public synchronized void initialize(OperatorContext context)
throws Exception {
super.initialize(context);
transformHandler = createLogicHandler();
output = getOutput(0);
outputMapping = getOutputMapping(this, 0);
}
@Override
public void tuple(Object tuple)
throws Exception {
final Function<Object, Iterable<Object>> transform = transformHandler.getLogic();
Iterable<Object> modValues;
synchronized (transform) {
modValues = transform.apply(tuple);
}
if (modValues != null) {
for (Object modValue : modValues) {
if (modValue != null)
output.submit(outputMapping.convertTo(modValue));
}
}
}
@Override
public void mark(Punctuation mark) throws Exception {
output.punctuate(mark);
}
}