Example #1
0
  /**
   * Swaps eligible arguments in relations to address symmetry.
   *
   * @param newArgs
   * @return
   */
  private static Map<Class<? extends Markable>, List<? extends Markable>> swapSymmetricalArgs(
      Map<Class<? extends Markable>, List<? extends Markable>> newArgs) {

    Map<Class<? extends Markable>, List<? extends Markable>> result =
        new HashMap<Class<? extends Markable>, List<? extends Markable>>(newArgs);

    Set<Class<? extends Markable>> labels = SYMMETRIC_CLASSES.keySet();
    for (Class<? extends Markable> label : labels) {
      Class<? extends Markable> swapWithLabel = SYMMETRIC_CLASSES.get(label);

      List<? extends Markable> origMarkables = newArgs.get(label);
      Markable firstMarkable = JAXBUtil.unwrapFromList(origMarkables); // first element to swap

      if (firstMarkable == null) firstMarkable = createMarkable(label);
      Markable firstClone = JAXBUtil.copyObj(firstMarkable);

      origMarkables = newArgs.get(swapWithLabel);
      Markable secondMarkable = JAXBUtil.unwrapFromList(origMarkables); // second element to swap
      if (secondMarkable == null) secondMarkable = createMarkable(swapWithLabel);
      Markable secondClone = JAXBUtil.copyObj(secondMarkable);

      swap(firstClone, secondClone);

      // set those which received value from nulls to nulls.
      if (firstClone.getStart() == null) firstClone = null;
      if (secondClone.getStart() == null) secondClone = null;

      result.put(label, JAXBUtil.wrapToList(firstClone));
      result.put(swapWithLabel, JAXBUtil.wrapToList(secondClone));
    }
    return result;
  }