From cf0c50e4fedf219f79a462615bb0ba603ce99378 Mon Sep 17 00:00:00 2001 From: OszkarSemerath Date: Wed, 21 Jun 2017 18:44:04 +0200 Subject: Model translator and sanitiser from original yakindu files to simplified metamodel. Added a sample Main function. --- .../.classpath | 8 +++ .../.gitignore | 5 ++ .../hu.bme.mit.inf.yakinduModelExtractor/.project | 34 +++++++++ .../.settings/org.eclipse.jdt.core.prefs | 7 ++ .../META-INF/MANIFEST.MF | 16 +++++ .../build.properties | 4 ++ .../hu/bme/mit/inf/yakinduModelExtractor/Main.java | 44 ++++++++++++ .../inf/yakinduModelExtractor/ModelManager.java | 79 +++++++++++++++++++++ .../Yakindu2CommonModel.xtend | 82 ++++++++++++++++++++++ 9 files changed, 279 insertions(+) create mode 100644 Domains/hu.bme.mit.inf.yakinduModelExtractor/.classpath create mode 100644 Domains/hu.bme.mit.inf.yakinduModelExtractor/.gitignore create mode 100644 Domains/hu.bme.mit.inf.yakinduModelExtractor/.project create mode 100644 Domains/hu.bme.mit.inf.yakinduModelExtractor/.settings/org.eclipse.jdt.core.prefs create mode 100644 Domains/hu.bme.mit.inf.yakinduModelExtractor/META-INF/MANIFEST.MF create mode 100644 Domains/hu.bme.mit.inf.yakinduModelExtractor/build.properties create mode 100644 Domains/hu.bme.mit.inf.yakinduModelExtractor/src/hu/bme/mit/inf/yakinduModelExtractor/Main.java create mode 100644 Domains/hu.bme.mit.inf.yakinduModelExtractor/src/hu/bme/mit/inf/yakinduModelExtractor/ModelManager.java create mode 100644 Domains/hu.bme.mit.inf.yakinduModelExtractor/src/hu/bme/mit/inf/yakinduModelExtractor/Yakindu2CommonModel.xtend (limited to 'Domains') diff --git a/Domains/hu.bme.mit.inf.yakinduModelExtractor/.classpath b/Domains/hu.bme.mit.inf.yakinduModelExtractor/.classpath new file mode 100644 index 00000000..1c96fe2f --- /dev/null +++ b/Domains/hu.bme.mit.inf.yakinduModelExtractor/.classpath @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/Domains/hu.bme.mit.inf.yakinduModelExtractor/.gitignore b/Domains/hu.bme.mit.inf.yakinduModelExtractor/.gitignore new file mode 100644 index 00000000..a9d27f1b --- /dev/null +++ b/Domains/hu.bme.mit.inf.yakinduModelExtractor/.gitignore @@ -0,0 +1,5 @@ +/bin/ +/src-gen/ +/vql-gen/ +/xtend-gen/ +/output/ \ No newline at end of file diff --git a/Domains/hu.bme.mit.inf.yakinduModelExtractor/.project b/Domains/hu.bme.mit.inf.yakinduModelExtractor/.project new file mode 100644 index 00000000..7ac6f61e --- /dev/null +++ b/Domains/hu.bme.mit.inf.yakinduModelExtractor/.project @@ -0,0 +1,34 @@ + + + hu.bme.mit.inf.yakinduModelExtractor + + + + + + org.eclipse.xtext.ui.shared.xtextBuilder + + + + + org.eclipse.jdt.core.javabuilder + + + + + org.eclipse.pde.ManifestBuilder + + + + + org.eclipse.pde.SchemaBuilder + + + + + + org.eclipse.pde.PluginNature + org.eclipse.jdt.core.javanature + org.eclipse.xtext.ui.shared.xtextNature + + diff --git a/Domains/hu.bme.mit.inf.yakinduModelExtractor/.settings/org.eclipse.jdt.core.prefs b/Domains/hu.bme.mit.inf.yakinduModelExtractor/.settings/org.eclipse.jdt.core.prefs new file mode 100644 index 00000000..295926d9 --- /dev/null +++ b/Domains/hu.bme.mit.inf.yakinduModelExtractor/.settings/org.eclipse.jdt.core.prefs @@ -0,0 +1,7 @@ +eclipse.preferences.version=1 +org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled +org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.8 +org.eclipse.jdt.core.compiler.compliance=1.8 +org.eclipse.jdt.core.compiler.problem.assertIdentifier=error +org.eclipse.jdt.core.compiler.problem.enumIdentifier=error +org.eclipse.jdt.core.compiler.source=1.8 diff --git a/Domains/hu.bme.mit.inf.yakinduModelExtractor/META-INF/MANIFEST.MF b/Domains/hu.bme.mit.inf.yakinduModelExtractor/META-INF/MANIFEST.MF new file mode 100644 index 00000000..c2535002 --- /dev/null +++ b/Domains/hu.bme.mit.inf.yakinduModelExtractor/META-INF/MANIFEST.MF @@ -0,0 +1,16 @@ +Manifest-Version: 1.0 +Bundle-ManifestVersion: 2 +Bundle-Name: YakinduModelExtractor +Bundle-SymbolicName: hu.bme.mit.inf.yakinduModelExtractor +Bundle-Version: 1.0.0.qualifier +Bundle-RequiredExecutionEnvironment: JavaSE-1.8 +Require-Bundle: hu.bme.mit.inf.dslreasoner.domains.yakindu.sgraph;bundle-version="1.0.0", + org.yakindu.sct.model.sgraph;bundle-version="2.9.2", + org.eclipse.core.runtime;bundle-version="3.12.0", + org.eclipse.gmf.runtime.notation;bundle-version="1.8.0", + org.eclipse.emf.ecore.xmi, + com.google.guava, + org.eclipse.xtext.xbase.lib, + org.eclipse.xtend.lib, + org.eclipse.xtend.lib.macro + diff --git a/Domains/hu.bme.mit.inf.yakinduModelExtractor/build.properties b/Domains/hu.bme.mit.inf.yakinduModelExtractor/build.properties new file mode 100644 index 00000000..41eb6ade --- /dev/null +++ b/Domains/hu.bme.mit.inf.yakinduModelExtractor/build.properties @@ -0,0 +1,4 @@ +source.. = src/ +output.. = bin/ +bin.includes = META-INF/,\ + . diff --git a/Domains/hu.bme.mit.inf.yakinduModelExtractor/src/hu/bme/mit/inf/yakinduModelExtractor/Main.java b/Domains/hu.bme.mit.inf.yakinduModelExtractor/src/hu/bme/mit/inf/yakinduModelExtractor/Main.java new file mode 100644 index 00000000..ec525fd6 --- /dev/null +++ b/Domains/hu.bme.mit.inf.yakinduModelExtractor/src/hu/bme/mit/inf/yakinduModelExtractor/Main.java @@ -0,0 +1,44 @@ +package hu.bme.mit.inf.yakinduModelExtractor; + +import java.util.List; + +import org.eclipse.emf.common.util.TreeIterator; +import org.eclipse.emf.ecore.EObject; +import org.yakindu.sct.model.sgraph.State; +import org.yakindu.sct.model.sgraph.Statechart; + +public class Main { + + public static void main(String[] args) { + ModelManager manager = new ModelManager(); + Yakindu2CommonModel converter = new Yakindu2CommonModel(); + + String years[] = {"2015","2016","2017"}; + for(String year : years) { + String folderPath = "D:\\Eclipse\\GIT\\RemoHF\\"+year; + // Loading folder + List paths = manager.loadAllModelPathsInDirectory(folderPath); + + int index = 1; + for(String path : paths) { + Statechart s = null; + try{ + EObject root = manager.loadModel(path); + s = (Statechart) root; + } catch (Exception e) { + System.out.println("unable to load: "+ path); + } + + if(s!=null) { + EObject s2 = converter.transform(s); + manager.saveModel(s2, "output/R"+year+index+".xmi"); + } + System.out.println(year + " Progress: " + 100.0*index/paths.size() + "%"); + index++; + } + + System.out.println(year + " done."); + } + System.out.println("All done."); + } +} diff --git a/Domains/hu.bme.mit.inf.yakinduModelExtractor/src/hu/bme/mit/inf/yakinduModelExtractor/ModelManager.java b/Domains/hu.bme.mit.inf.yakinduModelExtractor/src/hu/bme/mit/inf/yakinduModelExtractor/ModelManager.java new file mode 100644 index 00000000..85fd208c --- /dev/null +++ b/Domains/hu.bme.mit.inf.yakinduModelExtractor/src/hu/bme/mit/inf/yakinduModelExtractor/ModelManager.java @@ -0,0 +1,79 @@ +package hu.bme.mit.inf.yakinduModelExtractor; + +import java.io.BufferedWriter; +import java.io.File; +import java.io.FileOutputStream; +import java.io.IOException; +import java.io.OutputStreamWriter; +import java.io.Writer; +import java.util.LinkedList; +import java.util.List; + +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; +import org.eclipse.emf.ecore.xmi.impl.XMIResourceFactoryImpl; +import org.eclipse.gmf.runtime.notation.NotationPackage; +import org.yakindu.sct.model.sgraph.SGraphPackage; + +public class ModelManager { + ResourceSet resourceSet; + + public ModelManager() { + init(); + } + + public void init() { + SGraphPackage.eINSTANCE.eClass(); + NotationPackage.eINSTANCE.eClass(); + resourceSet = new ResourceSetImpl(); + Resource.Factory.Registry.INSTANCE.getExtensionToFactoryMap().put("*", new XMIResourceFactoryImpl()); + } + + public List loadAllModelPathsInDirectory(String path) { + File directory = new File(path); + if(directory.exists() && directory.isDirectory()) { + List filePaths = new LinkedList<>(); + for(File f : directory.listFiles()) { + if(f.isFile()) { + String filePath = f.getPath(); + if(filePath.endsWith("sct")) { + filePaths.add(filePath); + } + } + } + return filePaths; + } else { + throw new IllegalArgumentException("invalid path"); + } + } + + public EObject loadModel(String path) { + Resource resource = this.resourceSet.getResource(URI.createFileURI(path), true); + return resource.getContents().get(0); + } + + public boolean saveModel(EObject root, String path) { + Resource resource = this.resourceSet.createResource(URI.createURI(path)); + resource.getContents().add(root); + try { + resource.save(null); + return true; + } catch (IOException e) { + System.err.println("Unable to save file: "+path); + return false; + } + } + + public boolean saveFile(String path, String content) { + try (Writer writer = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(path), "utf-8"))) { + writer.write(content.toString()); + return true; + } catch (IOException ex) { + System.err.println("Unable to save file: "+path); + return false; + } + } +} diff --git a/Domains/hu.bme.mit.inf.yakinduModelExtractor/src/hu/bme/mit/inf/yakinduModelExtractor/Yakindu2CommonModel.xtend b/Domains/hu.bme.mit.inf.yakinduModelExtractor/src/hu/bme/mit/inf/yakinduModelExtractor/Yakindu2CommonModel.xtend new file mode 100644 index 00000000..d9219d5a --- /dev/null +++ b/Domains/hu.bme.mit.inf.yakinduModelExtractor/src/hu/bme/mit/inf/yakinduModelExtractor/Yakindu2CommonModel.xtend @@ -0,0 +1,82 @@ +package hu.bme.mit.inf.yakinduModelExtractor + +import org.yakindu.sct.model.sgraph.Statechart +import org.yakindu.sct.model.sgraph.SGraphPackage +import hu.bme.mit.inf.dslreasoner.domains.yakindu.sgraph.yakindumm.YakindummPackage +import hu.bme.mit.inf.dslreasoner.domains.yakindu.sgraph.yakindumm.YakindummFactory +import org.eclipse.emf.ecore.EObject +import org.eclipse.emf.ecore.EClass +import java.util.HashMap +import org.eclipse.emf.ecore.EReference +import java.util.List + +class Yakindu2CommonModel { + val yakinduSGraphPackage = org.yakindu.sct.model.sgraph.SGraphPackage.eINSTANCE + val commonSGraphPackage = YakindummPackage.eINSTANCE + val extension YakindummFactory factory = YakindummFactory.eINSTANCE + + def transform(Statechart s) { + val o2o = new HashMap + o2o.put(s,s.copyObject) + for(content: s.eAllContents.toIterable) { + val copied = content.copyObject + if(copied !== null) { + o2o.put(content,copied) + } + } + + for(sourceObjectEntry : o2o.entrySet) { + val originalSource = sourceObjectEntry.key + val copiedSource = sourceObjectEntry.value + for(originalReference : originalSource.eClass.EAllReferences) { + if(originalReference.isMany) { + val originalTargets = originalSource.eGet(originalReference) as List + for(originalTarget : originalTargets) { + if(o2o.containsKey(originalTarget)) { + copyReference(originalReference,copiedSource,o2o.get(originalTarget)) + } + } + } else { + val originalTarget = originalSource.eGet(originalReference) as EObject + if(o2o.containsKey(originalTarget)) { + copyReference(originalReference,copiedSource,o2o.get(originalTarget)) + } + } + } + } + return o2o.get(s) + } + + def private copyObject(EObject o) { + if(o.createCopy) { + val className = o.eClass.name + //if(className =="Exit") println("Exit") + val correspondingClass = commonSGraphPackage.EClassifiers.filter(EClass).filter[it.name == className].head + if(correspondingClass != null) { + return factory.create(correspondingClass) + } else { + println(className) + return null + } + } + else return null + } + + def private copyReference(EReference reference, EObject source, EObject target) { + val correspondingSourceClass = commonSGraphPackage.EClassifiers.filter(EClass).filter[it.name == reference.EContainingClass.name].head + if(correspondingSourceClass !== null) { + val correspondingReference = correspondingSourceClass.EReferences.filter[it.name === reference.name].head + if(correspondingReference !== null) { + if(correspondingReference.isMany) { + (source.eGet(correspondingReference) as List).add(target) + } else { + source.eSet(correspondingReference,target); + } + } + } + } + + def private createCopy(EObject o) { + o.eClass.EPackage === yakinduSGraphPackage + } +} \ No newline at end of file -- cgit v1.2.3-54-g00ecf