Skip to content
Snippets Groups Projects
Commit 5ea4487c authored by Jens Bendisposto's avatar Jens Bendisposto
Browse files

translate EMF to own representation

parent 80ee2efc
Branches
Tags
No related merge requests found
Showing
with 286 additions and 120 deletions
...@@ -5,9 +5,7 @@ Bundle-SymbolicName: de.prob.core;singleton:=true ...@@ -5,9 +5,7 @@ Bundle-SymbolicName: de.prob.core;singleton:=true
Bundle-Version: 9.2.2.qualifier Bundle-Version: 9.2.2.qualifier
Require-Bundle: org.eclipse.core.runtime;bundle-version="[3.5.0,4.0.0)", Require-Bundle: org.eclipse.core.runtime;bundle-version="[3.5.0,4.0.0)",
org.rodinp.core;bundle-version="[1.3.1,1.7.0)", org.rodinp.core;bundle-version="[1.3.1,1.7.0)",
org.eventb.core;bundle-version="[2.1.0,2.6.0)", org.eventb.core;bundle-version="[2.1.0,2.6.0)"
org.eventb.emf.core;bundle-version="2.2.4",
org.eventb.emf.persistence;bundle-version="2.4.0"
Bundle-ActivationPolicy: lazy Bundle-ActivationPolicy: lazy
Eclipse-BundleShape: dir Eclipse-BundleShape: dir
Bundle-Vendor: HHU Düsseldorf STUPS Group Bundle-Vendor: HHU Düsseldorf STUPS Group
...@@ -61,6 +59,7 @@ Export-Package: com.thoughtworks.xstream, ...@@ -61,6 +59,7 @@ Export-Package: com.thoughtworks.xstream,
de.be4.ltl.core.parser.node, de.be4.ltl.core.parser.node,
de.be4.ltl.core.parser.parser, de.be4.ltl.core.parser.parser,
de.hhu.stups.sablecc.patch, de.hhu.stups.sablecc.patch,
de.prob.animator.domainobjects,
de.prob.cli, de.prob.cli,
de.prob.cli.clipatterns, de.prob.cli.clipatterns,
de.prob.cliparser, de.prob.cliparser,
...@@ -83,9 +82,10 @@ Export-Package: com.thoughtworks.xstream, ...@@ -83,9 +82,10 @@ Export-Package: com.thoughtworks.xstream,
de.prob.eventb.translator, de.prob.eventb.translator,
de.prob.eventb.translator.flow, de.prob.eventb.translator.flow,
de.prob.eventb.translator.internal, de.prob.eventb.translator.internal,
de.prob.eventb.translator2,
de.prob.exceptions, de.prob.exceptions,
de.prob.logging, de.prob.logging,
de.prob.model.eventb,
de.prob.model.representation,
de.prob.parser, de.prob.parser,
de.prob.parserbase, de.prob.parserbase,
de.prob.prolog.match, de.prob.prolog.match,
......
...@@ -13,7 +13,6 @@ import java.io.IOException; ...@@ -13,7 +13,6 @@ import java.io.IOException;
import java.util.HashMap; import java.util.HashMap;
import java.util.Map; import java.util.Map;
import org.eclipse.emf.common.command.Command;
import org.osgi.service.prefs.Preferences; import org.osgi.service.prefs.Preferences;
import com.thoughtworks.xstream.XStream; import com.thoughtworks.xstream.XStream;
...@@ -347,16 +346,5 @@ public final class Animator { ...@@ -347,16 +346,5 @@ public final class Animator {
if (implementation != null) implementation.sendUserInterruptSignal(); if (implementation != null) implementation.sendUserInterruptSignal();
} }
public static void serializeModel(Model model) {
XStream xstream = new XStream(new JettisonMappedXmlDriver());
String xml = xstream.toXML(model);
try {
FileWriter fw = new FileWriter("model.xml");
final BufferedWriter bw = new BufferedWriter(fw);
bw.write(xml);
bw.close();
} catch (IOException e1) {
System.out.println("could not create file");
}
}
} }
package de.prob.eventb.translator2;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import org.eclipse.emf.common.util.EList;
import org.eventb.core.IEventBRoot;
import org.eventb.emf.core.EventBNamedCommentedComponentElement;
import org.eventb.emf.core.Project;
import org.eventb.emf.core.context.CarrierSet;
import org.eventb.emf.core.context.Context;
import org.eventb.emf.core.machine.Machine;
import org.eventb.emf.persistence.ProjectResource;
import org.rodinp.core.IRodinProject;
import de.be4.classicalb.core.parser.node.ADeferredSetSet;
import de.be4.classicalb.core.parser.node.PSet;
import de.be4.classicalb.core.parser.node.TIdentifierLiteral;
import de.prob.prolog.output.IPrologTermOutput;
public class EMFEventBTranslator {
private final Project project;
public EMFEventBTranslator(IEventBRoot main) {
IRodinProject rodinProject = main.getRodinProject();
ProjectResource resource = new ProjectResource(rodinProject);
try {
resource.load(null);
} catch (IOException e) {
e.printStackTrace();
}
project = (Project) resource.getContents().get(0);
}
public void print(IPrologTermOutput pto) {
for (EventBNamedCommentedComponentElement e : project.getComponents()) {
if (e instanceof Context) {
printContext(pto, (Context) e);
} else {
printMachine(pto, (Machine) e);
}
}
}
public void printContext(IPrologTermOutput pto, Context c) {
EList<CarrierSet> sets = c.getSets();
final List<PSet> setList = new ArrayList<PSet>(sets.size());
for (CarrierSet s : sets) {
final ADeferredSetSet deferredSet = new ADeferredSetSet(
Arrays.asList(new TIdentifierLiteral[] { new TIdentifierLiteral(
s.getName()) }));
setList.add(deferredSet);
}
}
public void printMachine(IPrologTermOutput pto, Machine m) {
}
}
package de.prob.model.eventb;
import java.util.Collections;
import java.util.List;
import de.prob.model.representation.IEntity;
public class Action implements IEntity {
private final String code;
private final String name;
public Action(String code, String name) {
this.code = code;
this.name = name;
}
@Override
public List<IEntity> getChildren() {
return Collections.emptyList();
}
@Override
public boolean hasChildren() {
return false;
}
public String getCode() {
return code;
}
public String getName() {
return name;
}
}
...@@ -26,8 +26,8 @@ public class EBContext extends Label { ...@@ -26,8 +26,8 @@ public class EBContext extends Label {
constants.addChild(new EventB(constant)); constants.addChild(new EventB(constant));
} }
public void addAxiom(final String axiom) { public void addAxiom(final String axiom, String aname) {
axioms.addChild(new EventB(axiom)); axioms.addChild(new EventB(axiom,aname));
} }
} }
...@@ -16,7 +16,7 @@ public class EBEvent extends Label { ...@@ -16,7 +16,7 @@ public class EBEvent extends Label {
public EBEvent(final String name) { public EBEvent(final String name) {
super(name); super(name);
children.addAll(Arrays.asList(new IEntity[] { refines, parameters, children.addAll(Arrays.asList(new IEntity[] { refines, parameters,
guards, witnesses, actions })); guards }));
} }
@Override @Override
...@@ -32,15 +32,15 @@ public class EBEvent extends Label { ...@@ -32,15 +32,15 @@ public class EBEvent extends Label {
parameters.addChild(new EventB(parameter)); parameters.addChild(new EventB(parameter));
} }
public void addGuard(final String guard) { public void addGuard(final String guard, String gname) {
guards.addChild(new EventB(guard)); guards.addChild(new EventB(guard,gname));
} }
public void addWitness(final String witness) { public void addWitness(final String witness,String wname) {
witnesses.addChild(new EventB(witness)); witnesses.addChild(new EventB(witness,wname));
} }
public void addAction(final String action) { public void addAction(final String action, String aname) {
actions.addChild(new Label(action)); actions.addChild(new Action(action, aname));
} }
} }
...@@ -22,8 +22,8 @@ public class EBMachine extends Label { ...@@ -22,8 +22,8 @@ public class EBMachine extends Label {
variables.addChild(new EventB(variable)); variables.addChild(new EventB(variable));
} }
public void addInvariant(final String invariant) { public void addInvariant(final String invariant, String iname) {
invariants.addChild(new EventB(invariant)); invariants.addChild(new EventB(invariant, iname));
} }
public void addVariant(final String variant) { public void addVariant(final String variant) {
......
...@@ -32,8 +32,15 @@ public class EventB implements IEvalElement, IEntity { ...@@ -32,8 +32,15 @@ public class EventB implements IEvalElement, IEntity {
private String kind; private String kind;
private Node ast = null; private Node ast = null;
public EventB(final String code) { private final String name;
public EventB(final String code, String name) {
this.code = code; this.code = code;
this.name = name;
}
public EventB(String code) {
this(code, "");
} }
private void ensureParsed() { private void ensureParsed() {
...@@ -118,4 +125,8 @@ public class EventB implements IEvalElement, IEntity { ...@@ -118,4 +125,8 @@ public class EventB implements IEvalElement, IEntity {
return false; return false;
} }
public String getName() {
return name;
}
} }
...@@ -4,12 +4,19 @@ import java.util.ArrayList; ...@@ -4,12 +4,19 @@ import java.util.ArrayList;
import java.util.List; import java.util.List;
import de.prob.model.representation.Label; import de.prob.model.representation.Label;
import de.prob.model.representation.RefType.ERefType;
public class Model { public class Model {
public List<Relationship> relationships = new ArrayList<Relationship>(); public final String serialization_version = "1";
public final String name;
public final List<Relationship> relationships = new ArrayList<Relationship>();
public void addRelationship(final Label from, final Label to) { public Model(String name) {
relationships.add(new Relationship(from, to)); this.name = name;
}
public void addRelationship(final Label from, final Label to, ERefType type) {
relationships.add(new Relationship(from, to,type));
} }
} }
package de.prob.model.eventb; package de.prob.model.eventb;
import de.prob.model.representation.Label; import de.prob.model.representation.Label;
import de.prob.model.representation.RefType.ERefType;
public class Relationship { public class Relationship {
public final Label from; public final Label from;
public final Label to; public final Label to;
public final ERefType type;
public Relationship(Label from,Label to) { public Relationship(Label from, Label to, ERefType type) {
this.from = from; this.from = from;
this.to = to; this.to = to;
this.type = type;
} }
} }
package de.prob.model.representation;
public class RefType {
private final ERefType relationship;
/*
* RefType is used for both ClassicalBModels and EventBModels
*
* ClassicalB: SEES, USES, REFINES, INCLUDES, IMPORTS EventB: SEES, REFINES,
* EXTENDS
*/
public enum ERefType {
SEES, USES, REFINES, INCLUDES, IMPORTS, EXTENDS
}
public RefType(final ERefType relationship) {
this.relationship = relationship;
}
@Override
public String toString() {
return relationship.toString();
}
public ERefType getRelationship() {
return relationship;
}
}
package de.prob.ui.eventb; package de.prob.ui.eventb;
import java.io.ByteArrayOutputStream;
import java.io.File; import java.io.File;
import java.io.FileWriter; import java.io.FileWriter;
import java.io.IOException; import java.io.IOException;
import java.io.PrintWriter; import java.io.PrintWriter;
import java.io.StringWriter;
import java.io.Writer; import java.io.Writer;
import java.util.Collections; import java.util.zip.GZIPOutputStream;
import java.util.HashMap;
import java.util.Map;
import org.apache.commons.codec.binary.Base64; import org.apache.commons.codec.binary.Base64;
import org.eclipse.core.commands.AbstractHandler; import org.eclipse.core.commands.AbstractHandler;
...@@ -17,8 +15,6 @@ import org.eclipse.core.commands.ExecutionException; ...@@ -17,8 +15,6 @@ import org.eclipse.core.commands.ExecutionException;
import org.eclipse.core.commands.IHandler; import org.eclipse.core.commands.IHandler;
import org.eclipse.core.runtime.Platform; import org.eclipse.core.runtime.Platform;
import org.eclipse.core.runtime.preferences.InstanceScope; import org.eclipse.core.runtime.preferences.InstanceScope;
import org.eclipse.emf.ecore.xmi.XMLResource;
import org.eclipse.emf.ecore.xmi.impl.XMLResourceImpl;
import org.eclipse.jface.dialogs.MessageDialog; import org.eclipse.jface.dialogs.MessageDialog;
import org.eclipse.jface.viewers.ISelection; import org.eclipse.jface.viewers.ISelection;
import org.eclipse.jface.viewers.IStructuredSelection; import org.eclipse.jface.viewers.IStructuredSelection;
...@@ -34,9 +30,12 @@ import org.osgi.service.prefs.BackingStoreException; ...@@ -34,9 +30,12 @@ import org.osgi.service.prefs.BackingStoreException;
import org.osgi.service.prefs.Preferences; import org.osgi.service.prefs.Preferences;
import org.rodinp.core.IRodinProject; import org.rodinp.core.IRodinProject;
import com.thoughtworks.xstream.XStream;
import de.prob.core.translator.TranslationFailedException; import de.prob.core.translator.TranslationFailedException;
import de.prob.eventb.translator.TranslatorFactory; import de.prob.eventb.translator.TranslatorFactory;
import de.prob.logging.Logger; import de.prob.logging.Logger;
import de.prob.model.eventb.Model;
public class ExportNewCoreHandler extends AbstractHandler implements IHandler { public class ExportNewCoreHandler extends AbstractHandler implements IHandler {
...@@ -117,8 +116,8 @@ public class ExportNewCoreHandler extends AbstractHandler implements IHandler { ...@@ -117,8 +116,8 @@ public class ExportNewCoreHandler extends AbstractHandler implements IHandler {
TranslatorFactory.translate(root, new PrintWriter(fw)); TranslatorFactory.translate(root, new PrintWriter(fw));
fw.append('\n'); fw.append('\n');
fw.append("emf_model('" + root.getComponentName() + "',\"" fw.append("eclipse_model('" + root.getComponentName() + "',\""
+ serialize(project) + "\")."); + serialize(project, root.getComponentName()) + "\").");
} catch (TranslationFailedException e) { } catch (TranslationFailedException e) {
e.notifyUserOnce(); e.notifyUserOnce();
...@@ -135,22 +134,24 @@ public class ExportNewCoreHandler extends AbstractHandler implements IHandler { ...@@ -135,22 +134,24 @@ public class ExportNewCoreHandler extends AbstractHandler implements IHandler {
} }
} }
private static String serialize(Project project) { private static String serialize(Project project, String maincomponent) {
NewCoreModelTranslation translation = new NewCoreModelTranslation();
StringWriter sw = new StringWriter(); Model model = translation.translate(project, maincomponent);
Map<Object, Object> options = new HashMap<Object, Object>(); // XStream xstream = new XStream(new JettisonMappedXmlDriver());
options.put(XMLResource.OPTION_ROOT_OBJECTS, XStream xstream = new XStream();
Collections.singletonList(project)); String xml = xstream.toXML(model);
options.put(XMLResource.OPTION_FORMATTED, false); ByteArrayOutputStream out = new ByteArrayOutputStream();
XMLResourceImpl ri = new XMLResourceImpl(); GZIPOutputStream gzip;
byte[] bytes;
try { try {
ri.save(sw, options); gzip = new GZIPOutputStream(out);
} catch (IOException e1) { gzip.write(xml.getBytes());
e1.printStackTrace(); gzip.close();
bytes = out.toByteArray();
} catch (IOException e) {
bytes = xml.getBytes();
} }
return Base64.encodeBase64String(bytes);
String xml = Base64.encodeBase64String(sw.toString().getBytes());
return xml;
} }
private static boolean isSafeToWrite(final String filename) { private static boolean isSafeToWrite(final String filename) {
......
package de.prob.ui.eventb;
import static de.prob.model.representation.RefType.ERefType.*;
import java.util.HashMap;
import java.util.Map;
import java.util.Map.Entry;
import org.eclipse.emf.common.util.EList;
import org.eventb.emf.core.EventBNamedCommentedComponentElement;
import org.eventb.emf.core.Project;
import org.eventb.emf.core.context.Axiom;
import org.eventb.emf.core.context.CarrierSet;
import org.eventb.emf.core.context.Constant;
import org.eventb.emf.core.context.Context;
import org.eventb.emf.core.machine.Action;
import org.eventb.emf.core.machine.Event;
import org.eventb.emf.core.machine.Guard;
import org.eventb.emf.core.machine.Invariant;
import org.eventb.emf.core.machine.Machine;
import org.eventb.emf.core.machine.Parameter;
import org.eventb.emf.core.machine.Variable;
import org.eventb.emf.core.machine.Variant;
import org.eventb.emf.core.machine.Witness;
import de.prob.model.eventb.EBContext;
import de.prob.model.eventb.EBEvent;
import de.prob.model.eventb.EBMachine;
import de.prob.model.eventb.Model;
import de.prob.model.representation.Label;
public class NewCoreModelTranslation {
private HashMap<String, Label> components;
public Model translate(final Project p, final String mainComponent) {
this.components = new HashMap<String, Label>();
Model model = new Model(mainComponent);
final Map<String, EventBNamedCommentedComponentElement> allComponents = new HashMap<String, EventBNamedCommentedComponentElement>();
for (final EventBNamedCommentedComponentElement cmpt : p
.getComponents()) {
final String name = cmpt.doGetName();
allComponents.put(name, cmpt);
if (cmpt instanceof Context) {
components.put(name, createContext((Context) cmpt));
} else if (cmpt instanceof Machine) {
components.put(name, createMachine((Machine) cmpt));
}
}
for (Entry<String, EventBNamedCommentedComponentElement> entry : allComponents
.entrySet()) {
EventBNamedCommentedComponentElement element = entry.getValue();
final String name = element.doGetName();
final Label from = components.get(name);
Label to = null;
if (element instanceof Context) {
for (final Context context : ((Context) element).getExtends()) {
final String ctxName = context.doGetName();
to = components.get(ctxName);
model.addRelationship(from, to, EXTENDS);
}
}
if (element instanceof Machine) {
for (final Context context : ((Machine) element).getSees()) {
final String ctxName = context.doGetName();
to = components.get(ctxName);
model.addRelationship(from, to, SEES);
}
for (final Machine machine : ((Machine) element).getRefines()) {
final String mName = machine.doGetName();
to = components.get(mName);
model.addRelationship(from, to, REFINES);
}
}
}
return model;
}
private Label createMachine(Machine machine) {
EBMachine m = new EBMachine(machine.getName());
for (Event event : machine.getEvents()) {
m.addEvent(createEvent(event));
}
for (Variable variable : machine.getVariables()) {
m.addVariable(variable.getName());
}
Variant variant = machine.getVariant();
if (variant != null)
m.addVariant(variant.getExpression());
for (Invariant invariant : machine.getInvariants()) {
m.addInvariant(invariant.getPredicate(), invariant.getName());
}
return m;
}
private EBEvent createEvent(Event event) {
EBEvent e = new EBEvent(event.getName());
for (Witness witness : event.getWitnesses()) {
e.addWitness(witness.getPredicate(), witness.getName());
}
for (Guard guard : event.getGuards()) {
e.addGuard(guard.getPredicate(), guard.getName());
}
for (Parameter parameter : event.getParameters()) {
e.addParameter(parameter.getName());
}
for (String string : event.getRefinesNames()) {
e.addParameter(string);
}
EList<Action> actions = event.getActions();
for (Action action : actions) {
e.addAction(action.getAction(), action.getName());
}
return e;
}
private Label createContext(Context c) {
String name = c.getName();
EBContext context = new EBContext(name);
EList<Axiom> axioms = c.getAxioms();
for (Axiom axiom : axioms) {
context.addAxiom(axiom.getPredicate(), axiom.doGetName());
}
for (Constant constant : c.getConstants()) {
context.addConstant(constant.doGetName());
}
for (CarrierSet carrierSet : c.getSets()) {
context.addSet(carrierSet.doGetName());
}
return context;
}
}
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment