public boolean matches(GeneratedArchetypeReference ar1, ArchetypeReference ar2, Map<String, Guide> guideMap, Calendar date) { if (!ar1.getIdArchetype().equals(ar2.getIdArchetype())) { return false; } else { for (String idElement : ar1.getElementInstancesMap().keySet()) { ElementInstance ei1 = ar1.getElementInstancesMap().get(idElement); ElementInstance ei2 = ar2.getElementInstancesMap().get(idElement); if (ei1 instanceof PredicateGeneratedElementInstance) { if (ei2 != null) { OperatorKind operatorKind = ((PredicateGeneratedElementInstance) ei1).getOperatorKind(); Set<String> guideIds = new HashSet<>(); DataValue dv = getResolveDataValueIfNeeded(guideMap, date, ei1, guideIds); DataValue dv2 = getResolveDataValueIfNeeded(guideMap, date, ei2, guideIds); Collection<Guide> guides = getGuides(guideMap, guideIds); if (!matches(dv, dv2, operatorKind, guides)) { return false; } } else { return false; } } } return true; } }