/*
# 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.getInputMapping;
import java.util.List;
import com.ibm.streams.operator.OperatorContext;
import com.ibm.streams.operator.OutputTuple;
import com.ibm.streams.operator.StreamingInput;
import com.ibm.streams.operator.StreamingOutput;
import com.ibm.streams.operator.Tuple;
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.ToIntFunction;
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/split_16.gif", location32 = "opt/icons/split_32.gif")
public class FunctionSplit extends FunctionFunctor {
private FunctionalHandler<ToIntFunction<Object>> splitterHandler;
private SPLMapping<?> mapping;
private int n;
private List<StreamingOutput<OutputTuple>> oports;
@Override
public void initialize(OperatorContext context) throws Exception {
super.initialize(context);
splitterHandler = createLogicHandler();
OperatorContext ctxt = getOperatorContext();
oports = ctxt.getStreamingOutputs();
n = oports.size();
mapping = getInputMapping(this, 0);
}
@Override
public void process(StreamingInput<Tuple> stream, Tuple tuple)
throws Exception {
Object value = mapping.convertFrom(tuple);
final ToIntFunction<Object> splitter = splitterHandler.getLogic();
int r;
synchronized (splitter) {
r = splitter.applyAsInt(value);
}
if (r >= 0)
oports.get(r % n).submit(tuple);
}
}