/*
# Licensed Materials - Property of IBM
# Copyright IBM Corp. 2015
*/
package com.ibm.streamsx.topology.internal.tester.ops;
import java.net.InetSocketAddress;
import java.nio.ByteBuffer;
import java.util.ArrayList;
import java.util.List;
import java.util.Queue;
import org.apache.mina.core.future.WriteFuture;
import com.ibm.streams.operator.OperatorContext;
import com.ibm.streams.operator.StreamingData.Punctuation;
import com.ibm.streams.operator.StreamingInput;
import com.ibm.streams.operator.Tuple;
import com.ibm.streams.operator.encoding.BinaryEncoding;
import com.ibm.streams.operator.model.InputPortSet;
import com.ibm.streams.operator.model.Libraries;
import com.ibm.streams.operator.model.Parameter;
import com.ibm.streams.operator.model.PrimitiveOperator;
import com.ibm.streams.operator.samples.patterns.TupleConsumer;
import com.ibm.streamsx.topology.internal.tester.TCPTestClient;
import com.ibm.streamsx.topology.internal.tester.TestTuple;
@PrimitiveOperator
@InputPortSet
@Libraries("opt/apache-mina-2.0.2/dist/*")
public class TesterSink extends TupleConsumer {
private String host;
private int port;
private BinaryEncoding[] encoders;
private TCPTestClient[] clients;
@Override
public void initialize(OperatorContext context) throws Exception {
super.initialize(context);
setBatchSize(1);
setPreserveOrder(true);
InetSocketAddress addr = new InetSocketAddress(getHost(), getPort());
clients = new TCPTestClient[context.getNumberOfStreamingInputs()];
encoders = new BinaryEncoding[context.getNumberOfStreamingInputs()];
for (StreamingInput<Tuple> input : context.getStreamingInputs()) {
TCPTestClient client = new TCPTestClient(addr);
client.connect();
clients[input.getPortNumber()] = client;
encoders[input.getPortNumber()] = input.getStreamSchema()
.newNativeBinaryEncoding();
}
}
@Override
protected boolean processBatch(Queue<BatchedTuple> batch) throws Exception {
List<WriteFuture> futures = new ArrayList<>(batch.size());
for (BatchedTuple bt : batch) {
int portIndex = bt.getStream().getPortNumber();
TCPTestClient client = clients[portIndex];
BinaryEncoding be = encoders[portIndex];
byte[] tupleData = new byte[(int) be.getEncodedSize(bt.getTuple())];
be.encodeTuple(bt.getTuple(), ByteBuffer.wrap(tupleData));
TestTuple tt = new TestTuple(portIndex, tupleData);
futures.add(client.writeTuple(tt));
}
for (WriteFuture future : futures) {
future.await();
}
return false;
}
@Override
public void processPunctuation(StreamingInput<Tuple> port, Punctuation mark)
throws Exception {
super.processPunctuation(port, mark);
if (mark == Punctuation.FINAL_MARKER) {
int portIndex = port.getPortNumber();
TestTuple finalTupleMarker = new TestTuple(portIndex, new byte[0]);
TCPTestClient client = clients[portIndex];
client.writeTuple(finalTupleMarker).await();
}
}
public int getPort() {
return port;
}
@Parameter
public void setPort(int port) {
this.port = port;
}
public String getHost() {
return host;
}
@Parameter
public void setHost(String host) {
this.host = host;
}
@Override
public void shutdown() throws Exception {
for (TCPTestClient client : clients) {
client.close();
}
super.shutdown();
}
}