code: public void putDestination(List<Descriptor> descriptors, int branchId, State state) {
  
      if (!hasLineageInfo(state)) {
        log.warn("State has no lineage info but branch " + branchId + " puts {} descriptors", descriptors.size());
        return;
      }
  
      log.info(String.format("Put destination %s for branch %d", Descriptor.toJson(descriptors), branchId));
  
      synchronized (state.getProp(getKey(NAME_KEY))) {
        List<Descriptor> resolvedDescriptors = new ArrayList<>();
        for (Descriptor descriptor : descriptors) {
          Descriptor resolvedDescriptor = resolver.resolve(descriptor, state);
          if (resolvedDescriptor == null) {
            continue;
          }
          resolvedDescriptors.add(resolvedDescriptor);
        }
  
        String destinationKey = getKey(BRANCH, branchId, LineageEventBuilder.DESTINATION);
        String currentDestinations = state.getProp(destinationKey);
        List<Descriptor> allDescriptors = Lists.newArrayList();
        if (StringUtils.isNotEmpty(currentDestinations)) {
          allDescriptors = Descriptor.fromJsonList(currentDestinations);
        }
        allDescriptors.addAll(resolvedDescriptors);
  
        state.setProp(destinationKey, Descriptor.toJson(allDescriptors));
      }
    }
docs: Put data {@link Descriptor}s of a destination dataset to a state
  
  @param descriptors It can be a single item list which just has the dataset descriptor or a list
  of dataset partition descriptors