diff --git a/org.eclipse.triquetrum.commands.api/src/main/java/org/eclipse/triquetrum/commands/api/services/ModelBuilderService.java b/org.eclipse.triquetrum.commands.api/src/main/java/org/eclipse/triquetrum/commands/api/services/ModelBuilderService.java index ef08708e..fb00cb75 100644 --- a/org.eclipse.triquetrum.commands.api/src/main/java/org/eclipse/triquetrum/commands/api/services/ModelBuilderService.java +++ b/org.eclipse.triquetrum.commands.api/src/main/java/org/eclipse/triquetrum/commands/api/services/ModelBuilderService.java @@ -10,18 +10,25 @@ *******************************************************************************/ package org.eclipse.triquetrum.commands.api.services; -public interface ModelBuilderService { +import java.util.Map; + +public interface ModelBuilderService { public Class getSupportedModelClass(); - public Actor insertActor(CompositeActor parent,String actorclass) throws TcQLException; + public CompositeActor createNewModel(String modelName); - public Director insertDirector(CompositeActor actor,String directorClass) throws TcQLException; + public boolean insertActor(CompositeActor parent,String actorName,String actorclass,Map parameters); - public Port insertPort(Actor actor, String portClass) throws TcQLException; + public boolean insertDirector(CompositeActor actor,String directorClass, String entityClass, Map params); - public Port insertParameter(Actor actor, String parameterClass) throws TcQLException; + public boolean insertPort(Actor actor, String portClass, String entityClass, Map params); - //TODO: add other needed methods + public boolean insertParameter(Actor actor, String parameterClass, String entityClass, Map params); + public CompositeActor getParent(Actor actor); + + public Actor getChild(String name); + + public boolean connect(Object currentActor, String from, String to); } diff --git a/org.eclipse.triquetrum.commands.xtext.ide/src/main/java/org/eclipse/triquetrum/commands/xtext/ide/TqCLLaunchShortcut.java b/org.eclipse.triquetrum.commands.xtext.ide/src/main/java/org/eclipse/triquetrum/commands/xtext/ide/TqCLLaunchShortcut.java index 2775d9a7..60dd85ee 100644 --- a/org.eclipse.triquetrum.commands.xtext.ide/src/main/java/org/eclipse/triquetrum/commands/xtext/ide/TqCLLaunchShortcut.java +++ b/org.eclipse.triquetrum.commands.xtext.ide/src/main/java/org/eclipse/triquetrum/commands/xtext/ide/TqCLLaunchShortcut.java @@ -19,7 +19,7 @@ public void launch(ISelection selection, String mode) { IFile file = (IFile) firstElement; java.net.URI rawLocationURI = file.getRawLocationURI(); TqclInterpreter interpreter = new TqclInterpreter(); - interpreter.interpret(file.getContents(), rawLocationURI); + interpreter.interpret(file.getName(),file.getContents(), rawLocationURI); } catch (CoreException e) { // TODO Auto-generated catch block e.printStackTrace(); diff --git a/org.eclipse.triquetrum.commands.xtext.tests/src/test/xtend-gen/org/eclipse/triquetrum/commands/tests/.TqclParsingTest.xtendbin b/org.eclipse.triquetrum.commands.xtext.tests/src/test/xtend-gen/org/eclipse/triquetrum/commands/tests/.TqclParsingTest.xtendbin index 7a01eca2..19390f01 100644 Binary files a/org.eclipse.triquetrum.commands.xtext.tests/src/test/xtend-gen/org/eclipse/triquetrum/commands/tests/.TqclParsingTest.xtendbin and b/org.eclipse.triquetrum.commands.xtext.tests/src/test/xtend-gen/org/eclipse/triquetrum/commands/tests/.TqclParsingTest.xtendbin differ diff --git a/org.eclipse.triquetrum.commands.xtext.ui/src/main/xtend-gen/org/eclipse/triquetrum/commands/ui/labeling/.TqclDescriptionLabelProvider.xtendbin b/org.eclipse.triquetrum.commands.xtext.ui/src/main/xtend-gen/org/eclipse/triquetrum/commands/ui/labeling/.TqclDescriptionLabelProvider.xtendbin index 9acdbdc3..f7316c62 100644 Binary files a/org.eclipse.triquetrum.commands.xtext.ui/src/main/xtend-gen/org/eclipse/triquetrum/commands/ui/labeling/.TqclDescriptionLabelProvider.xtendbin and b/org.eclipse.triquetrum.commands.xtext.ui/src/main/xtend-gen/org/eclipse/triquetrum/commands/ui/labeling/.TqclDescriptionLabelProvider.xtendbin differ diff --git a/org.eclipse.triquetrum.commands.xtext.ui/src/main/xtend-gen/org/eclipse/triquetrum/commands/ui/labeling/.TqclLabelProvider.xtendbin b/org.eclipse.triquetrum.commands.xtext.ui/src/main/xtend-gen/org/eclipse/triquetrum/commands/ui/labeling/.TqclLabelProvider.xtendbin index f3305cb5..14146135 100644 Binary files a/org.eclipse.triquetrum.commands.xtext.ui/src/main/xtend-gen/org/eclipse/triquetrum/commands/ui/labeling/.TqclLabelProvider.xtendbin and b/org.eclipse.triquetrum.commands.xtext.ui/src/main/xtend-gen/org/eclipse/triquetrum/commands/ui/labeling/.TqclLabelProvider.xtendbin differ diff --git a/org.eclipse.triquetrum.commands.xtext.ui/src/main/xtend-gen/org/eclipse/triquetrum/commands/ui/outline/.TqclOutlineTreeProvider.xtendbin b/org.eclipse.triquetrum.commands.xtext.ui/src/main/xtend-gen/org/eclipse/triquetrum/commands/ui/outline/.TqclOutlineTreeProvider.xtendbin index 6509b332..f5848866 100644 Binary files a/org.eclipse.triquetrum.commands.xtext.ui/src/main/xtend-gen/org/eclipse/triquetrum/commands/ui/outline/.TqclOutlineTreeProvider.xtendbin and b/org.eclipse.triquetrum.commands.xtext.ui/src/main/xtend-gen/org/eclipse/triquetrum/commands/ui/outline/.TqclOutlineTreeProvider.xtendbin differ diff --git a/org.eclipse.triquetrum.commands.xtext.ui/src/main/xtend-gen/org/eclipse/triquetrum/commands/ui/quickfix/.TqclQuickfixProvider.xtendbin b/org.eclipse.triquetrum.commands.xtext.ui/src/main/xtend-gen/org/eclipse/triquetrum/commands/ui/quickfix/.TqclQuickfixProvider.xtendbin index 614457d0..824b4927 100644 Binary files a/org.eclipse.triquetrum.commands.xtext.ui/src/main/xtend-gen/org/eclipse/triquetrum/commands/ui/quickfix/.TqclQuickfixProvider.xtendbin and b/org.eclipse.triquetrum.commands.xtext.ui/src/main/xtend-gen/org/eclipse/triquetrum/commands/ui/quickfix/.TqclQuickfixProvider.xtendbin differ diff --git a/org.eclipse.triquetrum.commands.xtext/src/main/java/org/eclipse/triquetrum/commands/interpreter/ConnectInterpreterComponent.java b/org.eclipse.triquetrum.commands.xtext/src/main/java/org/eclipse/triquetrum/commands/interpreter/ConnectInterpreterComponent.java new file mode 100644 index 00000000..93875c9d --- /dev/null +++ b/org.eclipse.triquetrum.commands.xtext/src/main/java/org/eclipse/triquetrum/commands/interpreter/ConnectInterpreterComponent.java @@ -0,0 +1,41 @@ +package org.eclipse.triquetrum.commands.interpreter; + +import java.util.Arrays; +import java.util.List; + +import org.eclipse.emf.common.util.EList; +import org.eclipse.emf.ecore.EClass; +import org.eclipse.emf.ecore.EObject; +import org.eclipse.triquetrum.commands.tqcl.Connect; +import org.eclipse.triquetrum.commands.tqcl.ConnectionPort; +import org.eclipse.triquetrum.commands.tqcl.TqclPackage; + +public class ConnectInterpreterComponent implements TqclInterpreterComponent { + + @Override + public void interpret(EObject element, InterpretContext context) { + if (element instanceof Connect) { + Connect connect = (Connect) element; + EList from = connect.getFrom(); + EList to = connect.getTo(); + for (ConnectionPort connectionPortFrom : from) { + for (ConnectionPort connectionPortTo : to) { + context.getModelBuilderService().connect(context.getCurrentActor(),createPortPath(connectionPortFrom),createPortPath(connectionPortTo)); + } + } + + } + + } + + private String createPortPath(ConnectionPort port) { + return port.getActor().getName()+"."+port.getPort(); + } + + @Override + public List intepretedEClasses() { + return Arrays.asList(TqclPackage.Literals.CONNECT); + } + +} + diff --git a/org.eclipse.triquetrum.commands.xtext/src/main/java/org/eclipse/triquetrum/commands/interpreter/GoInterpreterComponent.java b/org.eclipse.triquetrum.commands.xtext/src/main/java/org/eclipse/triquetrum/commands/interpreter/GoInterpreterComponent.java new file mode 100644 index 00000000..a2feded6 --- /dev/null +++ b/org.eclipse.triquetrum.commands.xtext/src/main/java/org/eclipse/triquetrum/commands/interpreter/GoInterpreterComponent.java @@ -0,0 +1,43 @@ +package org.eclipse.triquetrum.commands.interpreter; + +import java.util.Arrays; +import java.util.List; + +import org.eclipse.emf.ecore.EClass; +import org.eclipse.emf.ecore.EObject; +import org.eclipse.triquetrum.commands.tqcl.Go; +import org.eclipse.triquetrum.commands.tqcl.Insert; +import org.eclipse.triquetrum.commands.tqcl.TqclPackage; + +public class GoInterpreterComponent implements TqclInterpreterComponent { + + @SuppressWarnings({ "unchecked", "rawtypes" }) + @Override + public void interpret(EObject element, InterpretContext context) { + if (element instanceof Go) { + Go go = (Go) element; + String direction = go.getDirection(); + + switch (direction) { + case "into": + Insert actor = go.getActor(); + String name = actor.getName(); + context.setCurrentActor(context.getModelBuilderService().getChild(name)); + break; + case "out": + context.setCurrentActor(context.getModelBuilderService().getParent(context.getCurrentActor())); + break; + + default: + break; + } + } + } + + @Override + public List intepretedEClasses() { + return Arrays.asList(TqclPackage.Literals.GO); + } + +} + diff --git a/org.eclipse.triquetrum.commands.xtext/src/main/java/org/eclipse/triquetrum/commands/interpreter/InsertInterpreterComponent.java b/org.eclipse.triquetrum.commands.xtext/src/main/java/org/eclipse/triquetrum/commands/interpreter/InsertInterpreterComponent.java new file mode 100644 index 00000000..127c157d --- /dev/null +++ b/org.eclipse.triquetrum.commands.xtext/src/main/java/org/eclipse/triquetrum/commands/interpreter/InsertInterpreterComponent.java @@ -0,0 +1,59 @@ +package org.eclipse.triquetrum.commands.interpreter; + +import java.util.Arrays; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import org.eclipse.emf.ecore.EClass; +import org.eclipse.emf.ecore.EObject; +import org.eclipse.triquetrum.commands.api.services.TcQLException; +import org.eclipse.triquetrum.commands.tqcl.Category; +import org.eclipse.triquetrum.commands.tqcl.Insert; +import org.eclipse.triquetrum.commands.tqcl.Parameter; +import org.eclipse.triquetrum.commands.tqcl.TqclPackage; +import org.eclipse.triquetrum.commands.validation.TqCLUtils; + +public class InsertInterpreterComponent implements TqclInterpreterComponent { + + @SuppressWarnings({ "unchecked", "rawtypes" }) + @Override + public void interpret(EObject element, InterpretContext context) { + if (context instanceof Insert) { + Insert insert = (Insert) context; + Category category = insert.getCategory(); + String entityClass = insert.getEntityClass(); + String name = insert.getName(); + Map params = extractParameterMap(insert); + switch (category) { + case ACTOR: + context.getModelBuilderService().insertActor(context.getCurrentActor(), name, entityClass, params); + break; + case DIRECTOR: + context.getModelBuilderService().insertDirector(context.getCurrentActor(), name, entityClass, params); + break; + case PARAMETER: + context.getModelBuilderService().insertParameter(context.getCurrentActor(), name, entityClass, params); + break; + case PORT: + context.getModelBuilderService().insertPort(context.getCurrentActor(), name, entityClass, params); + break; + } + + } + } + + private Map extractParameterMap(Insert insert) { + Map params = new HashMap<>(); + for (Parameter parameter : insert.getParameters()) { + params.put(TqCLUtils.cleanParameterName(parameter.getId()), parameter.getValue()); + } + return params; + } + + @Override + public List intepretedEClasses() { + return Arrays.asList(TqclPackage.Literals.INSERT); + } + +} diff --git a/org.eclipse.triquetrum.commands.xtext/src/main/java/org/eclipse/triquetrum/commands/interpreter/InterpretContext.java b/org.eclipse.triquetrum.commands.xtext/src/main/java/org/eclipse/triquetrum/commands/interpreter/InterpretContext.java new file mode 100644 index 00000000..edafe974 --- /dev/null +++ b/org.eclipse.triquetrum.commands.xtext/src/main/java/org/eclipse/triquetrum/commands/interpreter/InterpretContext.java @@ -0,0 +1,41 @@ +package org.eclipse.triquetrum.commands.interpreter; + +import org.eclipse.triquetrum.commands.api.services.ModelBuilderService; + +public class InterpretContext { + + private ModelBuilderService modelBuilderService; + + private TqclInterpreter interpreter; + + private CompositeActor model; + + private Actor currentActor; + + public InterpretContext(TqclInterpreter interpreter,CompositeActor model,ModelBuilderService modelBuilderService) { + super(); + this.interpreter = interpreter; + this.model = model; + this.modelBuilderService = modelBuilderService; + } + + public TqclInterpreter getInterpreter() { + return interpreter; + } + + public ModelBuilderService getModelBuilderService() { + return modelBuilderService; + } + public CompositeActor getModel() { + return model; + } + + public Actor getCurrentActor() { + return currentActor; + } + + public void setCurrentActor(Actor currentActor) { + this.currentActor = currentActor; + } + +} diff --git a/org.eclipse.triquetrum.commands.xtext/src/main/java/org/eclipse/triquetrum/commands/interpreter/TqclInterpreter.java b/org.eclipse.triquetrum.commands.xtext/src/main/java/org/eclipse/triquetrum/commands/interpreter/TqclInterpreter.java index 898578f4..d9a07733 100644 --- a/org.eclipse.triquetrum.commands.xtext/src/main/java/org/eclipse/triquetrum/commands/interpreter/TqclInterpreter.java +++ b/org.eclipse.triquetrum.commands.xtext/src/main/java/org/eclipse/triquetrum/commands/interpreter/TqclInterpreter.java @@ -2,19 +2,39 @@ import java.io.IOException; import java.io.InputStream; +import java.util.HashMap; +import java.util.Map; import org.eclipse.emf.common.util.URI; +import org.eclipse.emf.ecore.EClass; import org.eclipse.emf.ecore.EObject; import org.eclipse.triquetrum.commands.TqclStandaloneSetup; +import org.eclipse.triquetrum.commands.api.services.ModelBuilderService; import org.eclipse.xtext.parser.IParseResult; import org.eclipse.xtext.resource.IResourceFactory; import org.eclipse.xtext.resource.XtextResource; import com.google.inject.Injector; -public class TqclInterpreter { +public class TqclInterpreter { - public void interpret(InputStream script, java.net.URI uri) { + private static Map components = new HashMap<>(); + + static + { + addComponent(new TriquetrumScriptInterpreterComponent()); + addComponent(new InsertInterpreterComponent()); + addComponent(new GoInterpreterComponent()); + addComponent(new ConnectInterpreterComponent()); + } + + private static void addComponent(TqclInterpreterComponent component){ + for (EClass eClass : component.intepretedEClasses()) { + components.put(eClass, component); + } + } + + public void interpret(String modelName,InputStream script, java.net.URI uri) { try { Injector injector = new TqclStandaloneSetup().createInjectorAndDoEMFRegistration(); IResourceFactory resourceFactory = injector.getInstance(IResourceFactory.class); @@ -22,11 +42,20 @@ public void interpret(InputStream script, java.net.URI uri) { XtextResource resource = (XtextResource) resourceFactory.createResource(URI.createURI(uri.getPath())); resource.load(script, null); IParseResult parseResult = resource.getParseResult(); - EObject rootASTElement = parseResult.getRootASTElement(); - System.out.println(""); + EObject root = parseResult.getRootASTElement(); + //TODO:get model builder + ModelBuilderService modelBuilderService = null; + CompositeActor model = modelBuilderService.createNewModel(modelName); + interpret(root, new InterpretContext(this,model,modelBuilderService)); + } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } + + void interpret(EObject element, InterpretContext context) + { + components.get(element.eClass()).interpret(element, context); + } } diff --git a/org.eclipse.triquetrum.commands.xtext/src/main/java/org/eclipse/triquetrum/commands/interpreter/TqclInterpreterComponent.java b/org.eclipse.triquetrum.commands.xtext/src/main/java/org/eclipse/triquetrum/commands/interpreter/TqclInterpreterComponent.java new file mode 100644 index 00000000..b909831f --- /dev/null +++ b/org.eclipse.triquetrum.commands.xtext/src/main/java/org/eclipse/triquetrum/commands/interpreter/TqclInterpreterComponent.java @@ -0,0 +1,13 @@ +package org.eclipse.triquetrum.commands.interpreter; + +import java.util.List; + +import org.eclipse.emf.ecore.EClass; +import org.eclipse.emf.ecore.EObject; + +public interface TqclInterpreterComponent { + + void interpret(EObject element, InterpretContext context); + + List intepretedEClasses(); +} diff --git a/org.eclipse.triquetrum.commands.xtext/src/main/java/org/eclipse/triquetrum/commands/interpreter/TriquetrumScriptInterpreterComponent.java b/org.eclipse.triquetrum.commands.xtext/src/main/java/org/eclipse/triquetrum/commands/interpreter/TriquetrumScriptInterpreterComponent.java new file mode 100644 index 00000000..ef1fa115 --- /dev/null +++ b/org.eclipse.triquetrum.commands.xtext/src/main/java/org/eclipse/triquetrum/commands/interpreter/TriquetrumScriptInterpreterComponent.java @@ -0,0 +1,32 @@ +package org.eclipse.triquetrum.commands.interpreter; + +import java.util.Arrays; +import java.util.List; + +import org.eclipse.emf.common.util.EList; +import org.eclipse.emf.ecore.EClass; +import org.eclipse.emf.ecore.EObject; +import org.eclipse.triquetrum.commands.tqcl.Command; +import org.eclipse.triquetrum.commands.tqcl.TqclPackage; +import org.eclipse.triquetrum.commands.tqcl.TriquetrumScript; + +public class TriquetrumScriptInterpreterComponent implements TqclInterpreterComponent { + + @Override + public void interpret(EObject element, InterpretContext context) { + if (element instanceof TriquetrumScript) { + TriquetrumScript script = (TriquetrumScript) element; + EList commands = script.getCommands(); + + for (Command command : commands) { + context.getInterpreter().interpret(command, context); + } + } + } + + @Override + public List intepretedEClasses() { + return Arrays.asList(TqclPackage.Literals.TRIQUETRUM_SCRIPT); + } + +}