blob: a5f76a159bf600456edb80cf50de05ce434912a2 [file] [log] [blame]
/**
* <copyright>
* OCL2AC is developed by Nebras Nassar based on an initial version developed by Thorsten Arendt and Jan Steffen Becker.
* </copyright>
*/
package de.unimarburg.swt.ocl2ac.tool.commands;
import java.util.ArrayList;
import java.util.Date;
import java.util.GregorianCalendar;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.eclipse.core.resources.IFile;
import org.eclipse.emf.common.util.BasicEList;
import org.eclipse.emf.common.util.URI;
import org.eclipse.emf.ecore.EPackage;
import org.eclipse.emf.ecore.resource.Resource;
import org.eclipse.emf.ecore.resource.ResourceSet;
import org.eclipse.emf.ecore.resource.impl.ResourceSetImpl;
import org.eclipse.emf.ecore.xmi.impl.XMIResourceFactoryImpl;
import org.eclipse.ocl.pivot.Constraint;
import org.eclipse.ocl.pivot.ExpressionInOCL;
import org.eclipse.ocl.pivot.Model;
import org.eclipse.ocl.pivot.PivotFactory;
import org.eclipse.ocl.pivot.PivotPackage;
import de.unimarburg.swt.ocl2ac.ocl2gc.core.Translator;
import graph.GraphFactory;
import laxcondition.Condition;
import laxcondition.LaxCondition;
import laxcondition.LaxconditionFactory;
public class OCL2LaxCondCommand extends Translator {
public HashMap<Condition, List<String>> mapCon2Var;
public OCL2LaxCondCommand(IFile oclasFile, IFile ecoreFile) {
this.oclasFile = oclasFile;
this.ecoreFile = ecoreFile;
this.invariants = new BasicEList<Constraint>();
this.laxconditionFactory = LaxconditionFactory.eINSTANCE;
this.mapCon2Var = new HashMap<Condition, List<String>>();
this.graphFactory = GraphFactory.eINSTANCE;
this.oclFactory = PivotFactory.eINSTANCE;
this.varIndex = 1;
initModels();
prepareOCLModel();
refactorOCLModel();
}
/**
* supporting static ePackage for a given meta-model
*/
protected void initModels() {
URI uriOclAS = URI.createPlatformResourceURI(this.oclasFile.getFullPath().toString(), true);
URI uriEcore = URI.createPlatformResourceURI(this.ecoreFile.getFullPath().toString(), true);
if (uriOclAS != null && uriEcore != null) {
// Load the input models and the corresponding invariants
PivotPackage.eINSTANCE.eClass();
Resource.Factory.Registry reg = Resource.Factory.Registry.INSTANCE;
Map<String, Object> m = reg.getExtensionToFactoryMap();
m.put("*.oclas", new XMIResourceFactoryImpl());
ResourceSet resSet = new ResourceSetImpl();
Resource resourceOclAS = resSet.getResource(uriOclAS, true);
this.oclModel = (Model) resourceOclAS.getContents().get(0);
// Load Ecore for meta/type model references
Resource resourceEcore = resSet.getResource(uriEcore, true);
EPackage dynamicEPackage = (EPackage) resourceEcore.getContents().get(0);
this.setTypeModel(EPackage.Registry.INSTANCE.getEPackage(dynamicEPackage.getNsURI()));
if (this.getTypeModel() == null)
this.setTypeModel(dynamicEPackage);
System.out.println(getTypeModel());
}
}
/**
* The entry point
*
* @return
*/
public List<Condition> getSetofLaxConditions() {
long start = System.currentTimeMillis();
Date date = new GregorianCalendar().getTime();
List<Condition> arrayList = new ArrayList<Condition>();
System.out.println("### The number of OCL Invariants is: " + invariants.size() + " ####");
for (Constraint inv : invariants) {
System.out.println("=====[ Invariant Name: " + inv.getName() + " ]=====");
if (inv.getOwnedSpecification() != null) {
ExpressionInOCL exprInOcl = null;
exprInOcl = (ExpressionInOCL) inv.getOwnedSpecification();
System.out.println("---[ Invariant Body: " + exprInOcl.getOwnedBody() + " ]---");
if (exprInOcl.getOwnedBody() != null) {
try {
Condition condition = laxconditionFactory.createCondition();
condition.setName(inv.getName());
condition.setTypeGraph(this.getTypeModel());
// The entry point
LaxCondition laxCondition = translate_I(inv);
if (laxCondition == null)
continue;
condition.setLaxCondition(laxCondition);
// get variables
this.mapCon2Var.put(condition, varNames);
varNames = new ArrayList<String>();
arrayList.add(condition);
} catch (Exception e) {
System.err.println("The OCL constraint " + inv.getName() + " is not well translated");
System.out.println(e.getMessage());
}
}
}
}
long stop = System.currentTimeMillis();
System.out.println((stop - start));
return arrayList;
}
}