public Flow connect(String name, Map<String, Tap> sources, Map<String, Tap> sinks, Map<String, Tap> traps, Pipe... tails) {
LoggingHadoopPlanner planner = new LoggingHadoopPlanner(flowStepStrategy, getProperties());
planner.initialize(this);
String flowName = name != null ? name : defaultFlowName;
FlowDef definition = new FlowDef()
.setName(flowName)
.addTails(tails)
.addSources(sources)
.addSinks(sinks)
.addTraps(traps);
if(getProperties().containsKey(CascadingUtil.CASCADING_RUN_ID)){
// cascading checkpointing fails if the job is named creatively with special chars. Be safe for now and only allow path-friendly chars
if(!CHECKPOINT_SAFE_NAME.matcher(flowName).matches()){
throw new RuntimeException("Flow name "+flowName+" not compatible with checkpointing! Remove special characters from name.");
}
definition.setRunID((String) getProperties().get(CascadingUtil.CASCADING_RUN_ID));
}
return planner.buildFlow(definition);
}