code: private void configure(Map<String, Object> configuration) throws IOException {
          List<TaskConfig> configList = new ArrayList<TaskConfig>();
          configList.addAll(parseConfig(configuration));
          for (TaskConfig taskConfig : configList) {
              if (TraceComponent.isAnyTracingEnabled() && tc.isDebugEnabled()) {
                  Tr.debug(tc, "Task config " + this, taskConfig);
              }
              if (taskConfig.getEnabled()) {
                  //Create the task, set the configuration and add it to the map if it's not already present.
                  Task task = new TaskImpl();
                  if (task != null) {
                      //Check if task already exist (by check if the source id is already in the taskMap)
                      //if not, we set the task with the new config and get appropriate handler based on the type of source
                      //else, we simply replace the config in the original task with the modified config
                      if (!taskMap.containsKey(taskConfig.sourceId())) {
                          task.setHandlerName(getHandlerName());
                          task.setConfig(taskConfig);
                          taskMap.putIfAbsent(taskConfig.sourceId(), task);
                      } else {
                          taskMap.get(taskConfig.sourceId()).setConfig(taskConfig);
                      }
                  }
              }
          }
      }
docs: /*
  Process the configuration and create the relevant tasks
  Target is also initialized using the information provided in the configuration