PipelineTranslatorUtils { public static BiMap<String, Integer> createOutputMap(Iterable<String> localOutputs) { ImmutableBiMap.Builder<String, Integer> builder = ImmutableBiMap.builder(); int outputIndex = 0; for (String tag : Sets.newTreeSet(localOutputs)) { builder.put(tag, outputIndex); outputIndex++; } return builder.build(); } private  PipelineTranslatorUtils(); static BiMap<String, Integer> createOutputMap(Iterable<String> localOutputs); static Coder<WindowedValue<T>> instantiateCoder(
      String collectionId, RunnerApi.Components components); static WindowingStrategy getWindowingStrategy(
      String pCollectionId, RunnerApi.Components components); static boolean hasUnboundedPCollections(RunnerApi.Pipeline pipeline); static void fireEligibleTimers(
      InMemoryTimerInternals timerInternals,
      Map<KV<String, String>, FnDataReceiver<Timer>> timerReceivers,
      Object currentTimerKey); static WindowedValue.WindowedValueCoder<T> getWindowedValueCoder(
      String pCollectionId, RunnerApi.Components components); static String getInputId(PipelineNode.PTransformNode transformNode); static String getOutputId(PipelineNode.PTransformNode transformNode); static String getExecutableStageIntermediateId(PipelineNode.PTransformNode transformNode);  }
@Test public void testOutputMapCreation() { List<String> outputs = Arrays.asList("output1", "output2", "output3"); BiMap<String, Integer> outputMap = PipelineTranslatorUtils.createOutputMap(outputs); Map<Object, Object> expected = ImmutableMap.builder().put("output1", 0).put("output2", 1).put("output3", 2).build(); assertThat(outputMap, is(expected)); }