/**
* Copyright (c) 2012-2016 Marsha Chechik, Alessio Di Sandro, Michalis Famelis,
* Rick Salay.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* Alessio Di Sandro - Implementation.
*/
package edu.toronto.cs.se.modelepedia.classdiagram.operator;
import java.util.Map;
import java.util.Set;
import java.util.Map.Entry;
import org.eclipse.emf.ecore.EObject;
import edu.toronto.cs.se.mmint.MMINTException;
import edu.toronto.cs.se.mmint.MIDTypeHierarchy;
import edu.toronto.cs.se.mmint.mid.relationship.Mapping;
import edu.toronto.cs.se.mmint.mid.relationship.MappingReference;
import edu.toronto.cs.se.mmint.mid.relationship.ModelElementEndpoint;
import edu.toronto.cs.se.mmint.mid.relationship.ModelElementReference;
import edu.toronto.cs.se.mmint.mid.relationship.ModelEndpointReference;
import edu.toronto.cs.se.mmint.mid.relationship.ModelRel;
import edu.toronto.cs.se.mmint.mid.utils.FileUtils;
import edu.toronto.cs.se.modelepedia.classdiagram.Association;
import edu.toronto.cs.se.modelepedia.operator.match.ModelMatch;
public class CDMatch extends ModelMatch {
@Override
protected void createMatchLinks(ModelRel matchRel, Map<String, Set<EObject>> modelObjAttrs, Map<EObject, ModelEndpointReference> modelObjTable) throws MMINTException {
Mapping rootMappingType = MIDTypeHierarchy.getRootMappingType();
ModelElementEndpoint rootModelElemTypeEndpoint = MIDTypeHierarchy.getRootModelElementTypeEndpoint();
for (Entry<String, Set<EObject>> entry : modelObjAttrs.entrySet()) {
Set<EObject> modelObjs = entry.getValue();
if (modelObjs.size() < 2) {
continue;
}
String modelObjAttr = entry.getKey();
boolean associations = modelObjs.stream().allMatch(modelObj -> modelObj instanceof Association);
if (associations) {
Association association = (Association) modelObjs.iterator().next();
String srcAttr = (String) FileUtils.getModelObjectFeature(association.getSource(), matchAttribute);
Set<EObject> srcMatch = modelObjAttrs.get(srcAttr);
String tgtAttr = (String) FileUtils.getModelObjectFeature(association.getTarget(), matchAttribute);
Set<EObject> tgtMatch = modelObjAttrs.get(tgtAttr);
boolean endpointsCheck =
modelObjs.stream()
.map(modelObj -> ((Association) modelObj).getSource())
.allMatch(clazz -> srcMatch.contains(clazz)) &&
modelObjs.stream()
.map(modelObj -> ((Association) modelObj).getTarget())
.allMatch(clazz -> tgtMatch.contains(clazz));
if (!endpointsCheck) {
continue;
}
}
// create link
MappingReference matchMappingRef = rootMappingType.createInstanceAndReference((modelObjs.size() == 2), matchRel);
matchMappingRef.getObject().setName(modelObjAttr);
for (EObject modelObj : modelObjs) {
ModelEndpointReference modelEndpointRef = modelObjTable.get(modelObj);
// create model element
ModelElementReference matchModelElemRef = modelEndpointRef.createModelElementInstanceAndReference(modelObj, null);
// create model element endpoints
rootModelElemTypeEndpoint.createInstanceAndReference(matchModelElemRef, matchMappingRef);
}
}
}
}