FlowElement element = input.getOwner();
assert element.getDescription().getKind() == FlowElementKind.OPERATOR;
OperatorDescription desc = (OperatorDescription) element.getDescription();
Class<? extends Annotation> annotationType = desc.getDeclaration().getAnnotationType();
Class<? extends Annotation> sideDataType;
FlowElementInput master;
FlowElementInput tx;
if (annotationType == MasterJoin.class) {
sideDataType = SideDataJoin.class;
master = getInput(element, MasterJoin.ID_INPUT_MASTER);
tx = getInput(element, MasterJoin.ID_INPUT_TRANSACTION);
} else if (annotationType == MasterBranch.class) {
sideDataType = SideDataBranch.class;
master = getInput(element, MasterBranch.ID_INPUT_MASTER);
tx = getInput(element, MasterBranch.ID_INPUT_TRANSACTION);
} else if (annotationType == MasterCheck.class) {
sideDataType = SideDataCheck.class;
master = getInput(element, MasterCheck.ID_INPUT_MASTER);
tx = getInput(element, MasterCheck.ID_INPUT_TRANSACTION);
} else if (annotationType == MasterJoinUpdate.class) {
sideDataType = SideDataJoinUpdate.class;
master = getInput(element, MasterJoinUpdate.ID_INPUT_MASTER);
tx = getInput(element, MasterJoinUpdate.ID_INPUT_TRANSACTION);
} else {
return false;
}
if (master.equals(input) == false) {
return false;
}
OperatorDescription.Builder builder = createSideDataOperator(desc, sideDataType);
builder.addInput(
tx.getDescription().getName(),
tx.getDescription().getDataType());
builder.addResource(createResource(source, master, tx));
FlowElement rewrite = new FlowElement(builder.toDescription());
for (FlowElementOutput upstream : tx.getOpposites()) {
PortConnection.connect(upstream, rewrite.getInputPorts().get(0));
}
List<FlowElementOutput> originalOutputs = element.getOutputPorts();
List<FlowElementOutput> rewriteOutputs = rewrite.getOutputPorts();