Skip to main content
summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authortarendt2012-11-22 09:20:27 -0500
committertarendt2012-11-22 09:20:27 -0500
commitbac11a91c4dfa34966a13838ab58dded23b6591b (patch)
treecf0a41432c134721d9aa4c6da013c3e9a53872e9
parentc2a057199734bb6d49994b09e01198d6dcca23f8 (diff)
downloadorg.eclipse.emf.refactor.refactoring-bac11a91c4dfa34966a13838ab58dded23b6591b.tar.gz
org.eclipse.emf.refactor.refactoring-bac11a91c4dfa34966a13838ab58dded23b6591b.tar.xz
org.eclipse.emf.refactor.refactoring-bac11a91c4dfa34966a13838ab58dded23b6591b.zip
manager class HenshinRuntimeManager added
-rw-r--r--org.eclipse.emf.refactor.refactoring.henshin/src/org/eclipse/emf/refactor/refactoring/henshin/interfaces/IHenshinController.java3
-rw-r--r--org.eclipse.emf.refactor.refactoring.henshin/src/org/eclipse/emf/refactor/refactoring/henshin/managers/HenshinFileManager.java36
-rw-r--r--org.eclipse.emf.refactor.refactoring.henshin/src/org/eclipse/emf/refactor/refactoring/henshin/managers/HenshinRuntimeManager.java208
-rw-r--r--org.eclipse.emf.refactor.refactoring.henshin/src/org/eclipse/emf/refactor/refactoring/henshin/runtime/CheckConditionsCommand.java3
4 files changed, 248 insertions, 2 deletions
diff --git a/org.eclipse.emf.refactor.refactoring.henshin/src/org/eclipse/emf/refactor/refactoring/henshin/interfaces/IHenshinController.java b/org.eclipse.emf.refactor.refactoring.henshin/src/org/eclipse/emf/refactor/refactoring/henshin/interfaces/IHenshinController.java
index 7e246ba..4faeff6 100644
--- a/org.eclipse.emf.refactor.refactoring.henshin/src/org/eclipse/emf/refactor/refactoring/henshin/interfaces/IHenshinController.java
+++ b/org.eclipse.emf.refactor.refactoring.henshin/src/org/eclipse/emf/refactor/refactoring/henshin/interfaces/IHenshinController.java
@@ -10,6 +10,7 @@
*******************************************************************************/
package org.eclipse.emf.refactor.refactoring.henshin.interfaces;
+import org.eclipse.emf.refactor.refactoring.henshin.managers.HenshinRuntimeManager;
import org.eclipse.emf.refactor.refactoring.interfaces.IController;
/**
@@ -26,7 +27,7 @@ public interface IHenshinController extends IController {
* @return HenshinRunner that executes Henshin transformations using
* the Henshin interpreter.
*/
- public HenshinRunner getHenshinRunner();
+ public HenshinRuntimeManager getHenshinRuntimeManager();
/**
* @see org.eclipse.emf.refactor.common.core.IController#
diff --git a/org.eclipse.emf.refactor.refactoring.henshin/src/org/eclipse/emf/refactor/refactoring/henshin/managers/HenshinFileManager.java b/org.eclipse.emf.refactor.refactoring.henshin/src/org/eclipse/emf/refactor/refactoring/henshin/managers/HenshinFileManager.java
new file mode 100644
index 0000000..b9f9e2d
--- /dev/null
+++ b/org.eclipse.emf.refactor.refactoring.henshin/src/org/eclipse/emf/refactor/refactoring/henshin/managers/HenshinFileManager.java
@@ -0,0 +1,36 @@
+package org.eclipse.emf.refactor.refactoring.henshin.managers;
+
+import java.io.File;
+import java.io.FileFilter;
+
+import org.eclipse.emf.common.util.URI;
+import org.eclipse.emf.ecore.EObject;
+import org.eclipse.emf.ecore.resource.Resource;
+import org.eclipse.emf.ecore.resource.ResourceSet;
+import org.eclipse.emf.ecore.resource.impl.ResourceSetImpl;
+
+public class HenshinFileManager {
+
+ private final static String HENSHIN_EXT = ".henshin";
+
+ public static File[] getAllHenshinFiles(String path) {
+ File file = new File(path);
+ FileFilter ff = new FileFilter() {
+ @Override
+ public boolean accept(File pathname) {
+ if (pathname.getName().endsWith(HENSHIN_EXT)) {
+ return true;
+ } else {
+ return false;
+ }
+ }
+ };
+ return file.listFiles(ff);
+ }
+
+ public static EObject loadFile(String filename) {
+ ResourceSet resourceSet = new ResourceSetImpl();
+ Resource resource = resourceSet.getResource(URI.createFileURI(filename), true);
+ return resource.getContents().get(0);
+ }
+}
diff --git a/org.eclipse.emf.refactor.refactoring.henshin/src/org/eclipse/emf/refactor/refactoring/henshin/managers/HenshinRuntimeManager.java b/org.eclipse.emf.refactor.refactoring.henshin/src/org/eclipse/emf/refactor/refactoring/henshin/managers/HenshinRuntimeManager.java
new file mode 100644
index 0000000..9026ec9
--- /dev/null
+++ b/org.eclipse.emf.refactor.refactoring.henshin/src/org/eclipse/emf/refactor/refactoring/henshin/managers/HenshinRuntimeManager.java
@@ -0,0 +1,208 @@
+/*******************************************************************************
+ * Copyright (c) Philipps University of Marburg. 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:
+ * Philipps University of Marburg - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.emf.refactor.refactoring.henshin.managers;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.eclipse.emf.ecore.EObject;
+import org.eclipse.emf.ecore.util.EcoreUtil;
+import org.eclipse.emf.henshin.interpreter.EGraph;
+import org.eclipse.emf.henshin.interpreter.Engine;
+import org.eclipse.emf.henshin.interpreter.RuleApplication;
+import org.eclipse.emf.henshin.interpreter.UnitApplication;
+import org.eclipse.emf.henshin.interpreter.impl.EGraphImpl;
+import org.eclipse.emf.henshin.interpreter.impl.EngineImpl;
+import org.eclipse.emf.henshin.interpreter.impl.UnitApplicationImpl;
+import org.eclipse.emf.henshin.model.HenshinFactory;
+import org.eclipse.emf.henshin.model.Module;
+import org.eclipse.emf.henshin.model.Parameter;
+import org.eclipse.emf.henshin.model.Unit;
+import org.eclipse.emf.refactor.refactoring.henshin.interfaces.IHenshinDataManagement;
+import org.eclipse.emf.refactor.refactoring.henshin.interfaces.IHenshinInformation;
+import org.eclipse.emf.refactor.refactoring.henshin.runtime.HenshinApplicationMonitor;
+
+/**
+ * Class that executes Henshin transformations using the Henshin
+ * interpreter.
+ * @generated NOT
+ * @author Thorsten Arendt
+ */
+public class HenshinRuntimeManager {
+
+ /**
+ * Given selection of EObjects the model refactoring
+ * shall be executed on.
+ */
+ protected final List<EObject> selection;
+
+ public final static String HENSHINEXTENSION = ".henshin";
+ private static final String MAINUNIT = "mainUnit";
+
+ /**
+ * Corresponding HenshinDataManagement object which specifies
+ * data concerning a model refactoring that shall be executed by
+ * EMF model transformations using Henshin.
+ */
+ private IHenshinDataManagement dataManagementObject;
+
+ /**
+ * Factory for creating Henshin objects.
+ */
+ private static HenshinFactory henshinFactory = HenshinFactory.eINSTANCE;
+
+ /**
+ * Henshin transformation system to be executed.
+ */
+ private Module module = henshinFactory.createModule();
+
+ /**
+ * Default constructor using a selection of EObjects the model refactoring
+ * shall be executed on and the corresponding HenshinDataManagement object
+ * which specifies data concerning a model refactoring that shall be
+ * executed by EMF model transformations using Henshin.
+ * @param selection Given selection of EObjects the model refactoring
+ * shall be executed on.
+ * @param dataManagementObject Corresponding HenshinDataManagement object
+ * which specifies data concerning a model refactoring that shall be
+ * executed by EMF model transformations using Henshin.
+ */
+ public HenshinRuntimeManager
+ (List<EObject> selection, IHenshinDataManagement dataManagementObject){
+ this.selection = selection;
+ this.dataManagementObject = dataManagementObject;
+ }
+
+ /**
+ * Static method for checking initial or final conditions of a EMF
+ * model refactoring using Henshin transformations.
+ * @param henshinInformation Corresponding HenshinInformation object
+ * specifying a Henshin file that shall be used.
+ * @param root Root object of the EMF model to be refactored.
+ * @return List of messages indicating errors which occur during
+ * conditions checking.
+ */
+ public static List<String> checkConditions
+ (IHenshinInformation henshinInformation, EObject root) {
+ List<String> result = new ArrayList<String>();
+ if (henshinInformation.isTransformationFileSpecified()) {
+ String path = henshinInformation.getTransformationFileName()
+ + HENSHINEXTENSION;
+ Module checkTransformationSystem =
+ (Module) HenshinFileManager.loadFile(path);
+ EGraph graph = new EGraphImpl();
+ graph.addTree(root);
+ Engine engine = new EngineImpl();
+
+ Unit mainUnit =
+ checkTransformationSystem.getUnit(MAINUNIT);
+
+ UnitApplication unitApplication = new UnitApplicationImpl(engine);
+ unitApplication.setUnit(mainUnit);
+ unitApplication.setEGraph(graph);
+
+
+ // Map <Parameter, Object> values = new HashMap<Parameter, Object>();
+ for (Parameter par : mainUnit.getParameters()){
+ try {
+ /*values.put(par,
+ henshinInformation.getHenshinDataManagement()
+ .getInPortByName(par.getName()).getValue());*/
+ unitApplication.setParameterValue(par.getName(),
+ henshinInformation.getHenshinDataManagement()
+ .getInPortByName(par.getName()).getValue());
+ } catch (IllegalArgumentException ex) {
+ ex.printStackTrace();
+ }
+ }
+
+ HenshinApplicationMonitor am = new HenshinApplicationMonitor();
+
+ unitApplication.execute(am);
+ List<RuleApplication> appliedRules = am.getAppliedRules();
+ for (UnitApplication ua : appliedRules) {
+ result.add(((RuleApplication) ua).getResultMatch().getRule().getDescription());
+ }
+/* while (!appliedRules.empty()) {
+ RuleApplication appliedRule = appliedRules.pop();
+ if ((null != appliedRule.getDescription())
+ && (! appliedRule.getDescription().isEmpty())) {
+ result.add
+ (appliedRule.getMatch().getRule().getDescription());
+ }
+ } */
+ }
+ return result;
+ }
+
+ /**
+ * Method that executes the EMF model refactoring using Henshin.
+ */
+ public void run(){
+ if (this.dataManagementObject.getCreateChangeHenshinInformation()
+ .isTransformationFileSpecified()) {
+ String path = this.dataManagementObject
+ .getCreateChangeHenshinInformation()
+ .getTransformationFileName() + HENSHINEXTENSION;
+ this.module =
+ (Module) HenshinFileManager.loadFile(path);
+ EObject root = EcoreUtil.getRootContainer(selection.get(0));
+ EGraph graph = new EGraphImpl();
+ graph.addTree(root);
+ Engine engine = new EngineImpl();
+
+ Unit mainUnit =
+ this.module.getUnit(MAINUNIT);
+ UnitApplication unitApplication = new UnitApplicationImpl(engine);
+ unitApplication.setUnit(mainUnit);
+ unitApplication.setEGraph(graph);
+
+ // Map <Parameter, Object> values = new HashMap<Parameter, Object>();
+ for (Parameter par : mainUnit.getParameters()){
+ try {
+ unitApplication.setParameterValue(par.getName(),
+ this.dataManagementObject
+ .getInPortByName(par.getName()).getValue());
+ /*values.put
+ (par, this.dataManagementObject
+ .getInPortByName(par.getName()).getValue()); */
+ } catch (IllegalArgumentException ex) {
+ ex.printStackTrace();
+ }
+ }
+
+ unitApplication.execute(null);
+ }
+ }
+
+// private final static String MAIN_RULE = "mainRule";
+// private final static String CONTEXT = "context";
+//
+// public static double run(String transformationPath, EObject context) {
+// EObject root = EcoreUtil.getRootContainer(context);
+// EGraph graph = new EGraphImpl();
+// graph.addTree(root);
+// Engine engine = new EngineImpl();
+// Module module = (Module) HenshinFileManager.loadFile(transformationPath);
+// Rule rule = (Rule) module.getUnit(MAIN_RULE);
+// Match prematch = new MatchImpl(rule);
+// for (Parameter par : rule.getParameters()) {
+// if (par.getName().equals(CONTEXT)) {
+// prematch.setParameterValue(par, context);
+// }
+// }
+// RuleApplication application = new RuleApplicationImpl(engine, graph, rule, prematch);
+// List<Match> matches = InterpreterUtil.findAllMatches(engine,
+// application.getRule(), application.getEGraph(),
+// application.getPartialMatch());
+// return matches.size();
+// }
+}
diff --git a/org.eclipse.emf.refactor.refactoring.henshin/src/org/eclipse/emf/refactor/refactoring/henshin/runtime/CheckConditionsCommand.java b/org.eclipse.emf.refactor.refactoring.henshin/src/org/eclipse/emf/refactor/refactoring/henshin/runtime/CheckConditionsCommand.java
index 01384b4..f2f83f0 100644
--- a/org.eclipse.emf.refactor.refactoring.henshin/src/org/eclipse/emf/refactor/refactoring/henshin/runtime/CheckConditionsCommand.java
+++ b/org.eclipse.emf.refactor.refactoring.henshin/src/org/eclipse/emf/refactor/refactoring/henshin/runtime/CheckConditionsCommand.java
@@ -16,6 +16,7 @@ import org.eclipse.emf.common.command.AbstractCommand;
import org.eclipse.emf.ecore.EObject;
import org.eclipse.emf.ecore.change.util.ChangeRecorder;
import org.eclipse.emf.refactor.refactoring.henshin.interfaces.IHenshinInformation;
+import org.eclipse.emf.refactor.refactoring.henshin.managers.HenshinRuntimeManager;
/**
* Class used for checking initial an final conditions of
@@ -73,7 +74,7 @@ public class CheckConditionsCommand extends AbstractCommand {
public void execute() {
//Start Recorder:
ChangeRecorder changeRecorder = new ChangeRecorder(root);
- this.messages = HenshinRunner.checkConditions
+ this.messages = HenshinRuntimeManager.checkConditions
(this.henshinInformation, this.root);
//Undo
changeRecorder.endRecording().applyAndReverse();

Back to the top