public ModuleRegistry moduleRegistry() {
    ModuleRegistry registry = mock(ModuleRegistry.class);
    Resource resource = mock(Resource.class);
    ArrayList<ModuleDefinition> definitions = new ArrayList<ModuleDefinition>();
    definitions.add(
        new ModuleDefinition(ModuleType.TAP.getTypeName(), ModuleType.TAP.getTypeName(), resource));
    when(registry.findDefinitions(ModuleType.TAP.getTypeName())).thenReturn(definitions);

    definitions = new ArrayList<ModuleDefinition>();
    definitions.add(
        new ModuleDefinition(
            ModuleType.SINK.getTypeName(), ModuleType.SINK.getTypeName(), resource));
    when(registry.findDefinitions("file")).thenReturn(definitions);

    when(registry.lookup("file", ModuleType.SINK.getTypeName()))
        .thenReturn(
            new ModuleDefinition(
                ModuleType.SINK.getTypeName(), ModuleType.SINK.getTypeName(), resource));
    when(registry.lookup("tap", ModuleType.SOURCE.getTypeName()))
        .thenReturn(
            new ModuleDefinition(
                ModuleType.SOURCE.getTypeName(), ModuleType.SOURCE.getTypeName(), resource));

    return registry;
  }
  private ModuleType determineType(ModuleDeploymentRequest request, int lastIndex) {
    ModuleType moduleType = getNamedChannelModuleType(request, lastIndex);
    if (moduleType != null) {
      return moduleType;
    }
    String type = null;
    String name = request.getModule();
    int index = request.getIndex();
    List<ModuleDefinition> defs = moduleRegistry.findDefinitions(name);

    if (defs.size() == 0) {
      throw new RuntimeException("Module definition is missing for " + name);
    }
    if (defs.size() == 1) {
      type = defs.get(0).getType();
    }
    if (lastIndex == 0) {
      for (ModuleDefinition def : defs) {
        if (def.getType().equals(ModuleType.JOB.getTypeName())) {
          type = def.getType();
        }
      }
    } else if (index == 0) {
      type = ModuleType.SOURCE.getTypeName();
    } else if (index == lastIndex) {
      type = ModuleType.SINK.getTypeName();
    }
    if (type == null) {
      throw new NoSuchModuleException(name);
    }
    return verifyModuleOfTypeExists(request, name, type);
  }
 private ModuleType getNamedChannelModuleType(ModuleDeploymentRequest request, int lastIndex) {
   String type = null;
   String moduleName = request.getModule();
   int index = request.getIndex();
   if (request.getSourceChannelName() != null) {
     if (index == lastIndex) {
       if (request.getSinkChannelName() != null) {
         type = ModuleType.PROCESSOR.getTypeName();
       } else {
         type = ModuleType.SINK.getTypeName();
       }
     } else {
       type = ModuleType.PROCESSOR.getTypeName();
     }
   } else if (request.getSinkChannelName() != null) {
     if (index == 0) {
       type = ModuleType.SOURCE.getTypeName();
     } else {
       type = ModuleType.PROCESSOR.getTypeName();
     }
   }
   return (type == null) ? null : verifyModuleOfTypeExists(request, moduleName, type);
 }