boolean matchAndFill(GeneratedArchetypeReference ar1, ArchetypeReference ar2, Map<String, Guide> guideMap, Calendar date) {
Collection<ElementInstance> emptyElementInstances = new ArrayList<ElementInstance>();
boolean matches = matches(ar1, ar2, guideMap, date);
if (!matches) {
return false;
} else {
if (ar2 instanceof GeneratedArchetypeReference) {
for (String idElement : ar1.getElementInstancesMap().keySet()) {
ElementInstance ei1 = ar1.getElementInstancesMap().get(idElement);
ElementInstance ei2 = ar2.getElementInstancesMap().get(idElement);
if (!(ei1 instanceof PredicateGeneratedElementInstance) && ei2 == null) {
ei2 = ei1.clone();
emptyElementInstances.add(ei2);
}
if (ei1 instanceof GeneratedElementInstance && ei2 instanceof GeneratedElementInstance) {
((GeneratedElementInstance) ei2).getRuleReferences().addAll(((GeneratedElementInstance) ei1).getRuleReferences());
}
}
for (ElementInstance elementInstance : emptyElementInstances) {
elementInstance.setArchetypeReference(ar2);
}
}
}
return true;
}