package ca.mcgill.ecse.dslreasoner.realistic.metrics.calculator.validation import java.util.ArrayList import java.util.HashMap import java.util.List import java.util.Map import org.eclipse.emf.common.notify.Notifier import org.eclipse.emf.common.util.URI import org.eclipse.emf.ecore.resource.impl.ResourceSetImpl import org.eclipse.viatra.addon.validation.core.api.IConstraintSpecification import org.eclipse.viatra.query.runtime.api.ViatraQueryEngine import org.eclipse.viatra.query.runtime.api.impl.BaseGeneratedPatternGroup import org.eclipse.viatra.query.runtime.emf.EMFScope class ConstraintCollection{ val constraints = new ArrayList(); var BaseGeneratedPatternGroup patterns; var List resources = new ArrayList(); new(List constraints, List uris, BaseGeneratedPatternGroup patterns){ this.constraints.addAll(constraints); this.patterns = patterns; setURIs(uris); } new(List constraints, BaseGeneratedPatternGroup patterns){ this.constraints.addAll(constraints); this.patterns = patterns; } def addModel(Notifier n ){ resources.add(n); } def setURIs(List uris){ val resSet = new ResourceSetImpl(); for(uri : uris){ var resource = resSet.getResource(URI.createURI(uri), true); resources.add(resource); } println('reading model finished') } def List calculateViolations(){ var results = new ArrayList(); for(resource : resources){ val engine = initEngine(resource); var matches = constraints.stream.mapToInt([ele| ele.querySpecification.getMatcher(engine).countMatches]).sum(); results.add(matches); } return results; } def ArrayList> calculateViolationMaps(){ val result = new ArrayList>() for(resource : resources){ val map = new HashMap(); val engine = initEngine(resource); constraints.forEach[ var count = it.querySpecification.getMatcher(engine).countMatches; map.put(it.querySpecification.simpleName, count); ]; result.add(map); } return result; } private def initEngine(Notifier r){ var engine = ViatraQueryEngine.on(new EMFScope(r)); //init patterns with the new engine patterns.prepare(engine); return engine; } }