/** * 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; }