diff --git a/AlgebraicDataflowArchitectureModel/.classpath b/AlgebraicDataflowArchitectureModel/.classpath
index 3e99697..dfdecbb 100644
--- a/AlgebraicDataflowArchitectureModel/.classpath
+++ b/AlgebraicDataflowArchitectureModel/.classpath
@@ -1,12 +1,13 @@
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/AlgebraicDataflowArchitectureModel/lib/postgresql-42.7.4.jar b/AlgebraicDataflowArchitectureModel/lib/postgresql-42.7.4.jar
new file mode 100644
index 0000000..091b4d1
--- /dev/null
+++ b/AlgebraicDataflowArchitectureModel/lib/postgresql-42.7.4.jar
Binary files differ
diff --git a/AlgebraicDataflowArchitectureModel/models/DatabaseTest.model b/AlgebraicDataflowArchitectureModel/models/DatabaseTest.model
new file mode 100644
index 0000000..0ba12a5
--- /dev/null
+++ b/AlgebraicDataflowArchitectureModel/models/DatabaseTest.model
@@ -0,0 +1,15 @@
+channel LoadDatabase {
+ out database(dbs: Map, load(url: Str, user: Str, pass: Str)) = insert(dbs, url, {"user": user, "password": pass, "query": "", "result": ""})
+}
+
+channel executeQuery(url: Str) {
+ out database.{url}.query(query: Str, execute(newQuery)) = newQuery
+}
+
+native channel sendQuery(url: Str) {
+ in database.{url}.query(query: Str, sendQuery(newQuery)) = newQuery
+}
+
+native channel setResult(url: Str) {
+ out database.{url}.result(resutlt: Str, setResult(newResult: Str)) = newResult
+}
\ No newline at end of file
diff --git a/AlgebraicDataflowArchitectureModel/src/application/simulator/InputEventCellEditor.java b/AlgebraicDataflowArchitectureModel/src/application/simulator/InputEventCellEditor.java
index 46bc39a..41ec4d5 100644
--- a/AlgebraicDataflowArchitectureModel/src/application/simulator/InputEventCellEditor.java
+++ b/AlgebraicDataflowArchitectureModel/src/application/simulator/InputEventCellEditor.java
@@ -75,6 +75,7 @@
protected int minimumWidth = DEFAULT_MIN_WIDTH;
protected int minimumHeight = DEFAULT_MIN_HEIGHT;
+ private SimulatorWindow window;
private Object editingCell;
private EventObject trigger;
private JComboBox comboBox;
@@ -84,7 +85,8 @@
private Editor editor;
private boolean bReflectingArchitectureModel = false;
- public InputEventCellEditor(mxGraphComponent graphComponent, Simulator simulator, Editor editor) {
+ public InputEventCellEditor(SimulatorWindow window, mxGraphComponent graphComponent, Simulator simulator, Editor editor) {
+ this.window = window;
this.graphComponent = graphComponent;
this.simulator = simulator;
this.editor = editor;
@@ -109,26 +111,8 @@
ArrayList eventMessages = new ArrayList<>();//messageList
ResourcePath eventResPath = null;
- for(Channel ch : simulator.getModel().getInputChannels()) {//all channel
- if(((DataTransferChannel)ch).getInputResources().size()== 0) {//ioch Or normalch
- for(ChannelMember out: ((DataTransferChannel)ch).getOutputChannelMembers()) {
- ResourcePath resPath = out.getResource();
- if(resId.isInstanceOf(resPath)) {//account.uid == acounts.123
- eventResPath = resPath;
- eventChs.add(((DataTransferChannel)ch));
- String message = null;
- Expression mesExp = out.getStateTransition().getMessageExpression();//sync(a,b)
- eventMessages.add(mesExp);
- if(mesExp instanceof Term) {
- message = ((Term) mesExp).getSymbol().toString();//sync
- }else if(mesExp instanceof Variable) {
- message = ((Variable) mesExp).getName();//x,y,z..
- }
- messages.add(message);//pulldown
-
- }
- }
- }
+ for (Channel ch: simulator.getModel().getInputChannels()) {//all channel
+ eventResPath = getSelectableMessages(ch, resId, eventChs, messages, eventMessages, eventResPath);
}
if(messages.isEmpty()) {
@@ -140,7 +124,7 @@
JPanel eventChoice = new JPanel();
eventChoice.add(event);//FirstEventChoice
- int ret = JOptionPane.showConfirmDialog(null, eventChoice, "Event Choice", JOptionPane.OK_CANCEL_OPTION);
+ int ret = JOptionPane.showConfirmDialog(window, eventChoice, "Event Choice", JOptionPane.OK_CANCEL_OPTION);
if (ret == JOptionPane.OK_OPTION) {
JPanel inputEvent = new JPanel();
@@ -157,7 +141,7 @@
JTextArea textArea = new JTextArea(eventMessages.get(eventNum).toString(), 10, 30);//EventInput
inputEvent.add(textArea);
- int approve = JOptionPane.showConfirmDialog(null, inputEvent, "Event Code", JOptionPane.OK_CANCEL_OPTION);
+ int approve = JOptionPane.showConfirmDialog(window, inputEvent, "Event Code", JOptionPane.OK_CANCEL_OPTION);
if (approve == JOptionPane.OK_OPTION) {
try {
@@ -172,7 +156,7 @@
// SimulationLayout layout = new SimulationLayout(simulator.getCurState());
// layout.constructSimulateGraph(graph, simulator);
- graphComponent.setCellEditor(new InputEventCellEditor(graphComponent, simulator, this.editor));
+ graphComponent.setCellEditor(new InputEventCellEditor(window, graphComponent, simulator, this.editor));
} catch (ParameterizedIdentifierIsFutureWork | ResolvingMultipleDefinitionIsFutureWork
| InvalidMessage | UnificationFailed | ValueUndefined | ExpectedRightBracket | WrongJsonExpression | ExpectedColon | ExpectedDoubleQuotation e) {
@@ -204,6 +188,33 @@
}
}
+ private ResourcePath getSelectableMessages(Channel ch, ResourceIdentifier resId,
+ ArrayList eventChs, ArrayList messages, ArrayList eventMessages,
+ ResourcePath eventResPath) {
+ if (((DataTransferChannel)ch).getInputResources().size() == 0) {//ioch Or normalch
+ for (ChannelMember out: ((DataTransferChannel)ch).getOutputChannelMembers()) {
+ ResourcePath resPath = out.getResource();
+ if (resId.isInstanceOf(resPath)) {//account.uid == acounts.123
+ eventResPath = resPath;
+ eventChs.add(((DataTransferChannel)ch));
+ String message = null;
+ Expression mesExp = out.getStateTransition().getMessageExpression();//sync(a,b)
+ eventMessages.add(mesExp);
+ if (mesExp instanceof Term) {
+ message = ((Term) mesExp).getSymbol().toString();//sync
+ } else if(mesExp instanceof Variable) {
+ message = ((Variable) mesExp).getName();//x,y,z..
+ }
+ messages.add(message);//pulldown
+ }
+ }
+ for (Channel childCh: ch.getChildren()) {
+ eventResPath = getSelectableMessages(childCh, resId, eventChs, messages, eventMessages, eventResPath);
+ }
+ }
+ return eventResPath;
+ }
+
// private mxGraph constructNextSimulateGraph(Set simulateRes, DataTransferModel model,DataFlowGraph dataFlowGraph, mxGraph nextGraph) {
// bReflectingArchitectureModel = true;
// ((mxGraphModel) nextGraph.getModel()).clear();
diff --git a/AlgebraicDataflowArchitectureModel/src/application/simulator/SimulatorWindow.java b/AlgebraicDataflowArchitectureModel/src/application/simulator/SimulatorWindow.java
index 9bcacd4..5470a65 100644
--- a/AlgebraicDataflowArchitectureModel/src/application/simulator/SimulatorWindow.java
+++ b/AlgebraicDataflowArchitectureModel/src/application/simulator/SimulatorWindow.java
@@ -93,7 +93,7 @@
simulator = new Simulator(model);
SimulationLayout layout = new SimulationLayout(simulator.getCurState());
layout.constructSimulateGraph(graph, simulator);
- graphComponent.setCellEditor(new InputEventCellEditor(graphComponent, simulator, this.editor));
+ graphComponent.setCellEditor(new InputEventCellEditor(this, graphComponent, simulator, this.editor));
simulator.addSystemReceiver(this);
menuBar = new SimulatorMenuBar(this);
diff --git a/AlgebraicDataflowArchitectureModel/src/application/simulator/UISimulatorWindow.java b/AlgebraicDataflowArchitectureModel/src/application/simulator/UISimulatorWindow.java
index d3d03a6..0f4448a 100644
--- a/AlgebraicDataflowArchitectureModel/src/application/simulator/UISimulatorWindow.java
+++ b/AlgebraicDataflowArchitectureModel/src/application/simulator/UISimulatorWindow.java
@@ -4,6 +4,7 @@
import javax.swing.JPanel;
import simulator.Simulator;
+import simulator.interfaces.db.DatabasePresenter;
import simulator.interfaces.rest.RestPresenter;
import simulator.interfaces.swing.SwingPresenter;
import simulator.interfaces.timers.TimerService;
@@ -17,6 +18,7 @@
private TimerService timerService;
private RestPresenter rest;
+ private DatabasePresenter db;
public UISimulatorWindow(Simulator simulator) {
setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
@@ -24,6 +26,7 @@
mainPanel = new JPanel();
presenter = new SwingPresenter(mainPanel, simulator);
rest = new RestPresenter(simulator);
+ db = new DatabasePresenter(simulator);
this.add(mainPanel);
timerService = new TimerService(simulator);
diff --git a/AlgebraicDataflowArchitectureModel/src/parser/Parser.java b/AlgebraicDataflowArchitectureModel/src/parser/Parser.java
index 3362f4f..abec1de 100644
--- a/AlgebraicDataflowArchitectureModel/src/parser/Parser.java
+++ b/AlgebraicDataflowArchitectureModel/src/parser/Parser.java
@@ -166,11 +166,14 @@
}
String leftBracket = stream.next();
if (leftBracket.equals(LEFT_BRACKET)) {
- // has a selector
- String selector = stream.next();
- Variable var = parseVariable(stream, model, selector);
- channel.addSelector(var);
- String rightBracket = stream.next();
+ // has selectors
+ String rightBracket = null;
+ do {
+ String selector = stream.next();
+ Variable var = parseVariable(stream, model, selector);
+ channel.addSelector(var);
+ rightBracket = stream.next();
+ } while (rightBracket.equals(COMMA));
if (!rightBracket.equals(RIGHT_BRACKET)) throw new ExpectedRightBracket(stream.getLine());
leftBracket = stream.next();
}
diff --git a/AlgebraicDataflowArchitectureModel/src/simulator/ResourceIdentifier.java b/AlgebraicDataflowArchitectureModel/src/simulator/ResourceIdentifier.java
index d454391..d0463cf 100644
--- a/AlgebraicDataflowArchitectureModel/src/simulator/ResourceIdentifier.java
+++ b/AlgebraicDataflowArchitectureModel/src/simulator/ResourceIdentifier.java
@@ -24,7 +24,12 @@
}
public void setPathParam(int paramIdx, Constant param) {
- pathParams.set(paramIdx, param);
+ if (paramIdx < pathParams.size()) {
+ pathParams.set(paramIdx, param);
+ if (parent != null) {
+ ((ResourceIdentifier) parent).setPathParam(paramIdx, param);
+ }
+ }
}
public boolean equals(ResourceIdentifier another) {
diff --git a/AlgebraicDataflowArchitectureModel/src/simulator/interfaces/db/DatabasePresenter.java b/AlgebraicDataflowArchitectureModel/src/simulator/interfaces/db/DatabasePresenter.java
new file mode 100644
index 0000000..0378c89
--- /dev/null
+++ b/AlgebraicDataflowArchitectureModel/src/simulator/interfaces/db/DatabasePresenter.java
@@ -0,0 +1,56 @@
+package simulator.interfaces.db;
+
+import models.algebra.Expression;
+import models.algebra.Term;
+import models.dataConstraintModel.ResourcePath;
+import models.dataFlowModel.DataTransferChannel;
+import simulator.Event;
+import simulator.Resource;
+import simulator.ResourceIdentifier;
+import simulator.Simulator;
+import simulator.SystemState;
+import simulator.interfaces.INativeReceiver;
+
+public class DatabasePresenter implements INativeReceiver{
+
+
+ public final String sendQueryChannelName = "sendQuery";
+ public final String setResultChannelName = "setResult";
+
+ protected Simulator simulator;
+
+ protected DataTransferChannel sendQueryChannel;
+ protected DataTransferChannel setResultChannel;
+
+ public DatabasePresenter(Simulator simulator) {
+ this.simulator = simulator;
+ sendQueryChannel = (DataTransferChannel) simulator.getModel().getChannel(sendQueryChannelName);
+ setResultChannel = (DataTransferChannel) simulator.getModel().getInputChannel(setResultChannelName);
+ simulator.addNativeReceiver(this, sendQueryChannel);
+ }
+
+ @Override
+ public void onReceiveFromModel(Event event, SystemState nextSystemState) {
+ Expression message = event.getMessage();
+ ResourcePath path = event.getInputResourcePath();
+ ResourceIdentifier ri = event.getResourceIdentifier(path);
+ String dbUrl = ri.getPathParams().get(0).toString().replace("\"", "");
+ if(message instanceof Term && ((Term) message).getChildren().size() >= 1) {
+ Expression query = ((Term) message).getChild(0);
+ System.out.println(simulator.getCurState());
+ String user = simulator.getCurState().getResource("database." + dbUrl + ".user").getState().getValue().toString().replace("\"", "");
+ String pass = simulator.getCurState().getResource("database." + dbUrl + ".password").getState().getValue().toString().replace("\"", "");
+
+ System.out.println(user);
+ System.out.println(pass);
+
+ Resource sqlRes = nextSystemState.getResource(event.getInputResource().getResourceIdentifier());
+ Resource resultRes = sqlRes.getParent().getChildrenMap().get("result");
+
+ ResourcePath resPath = setResultChannel.getOutputResources().iterator().next();
+ ResultSender sender = new ResultSender(simulator, setResultChannel, resPath, resultRes, dbUrl, user, pass);
+ sender.executeQuery(query.toString().replace("\"", ""));
+ }
+ }
+
+}
diff --git a/AlgebraicDataflowArchitectureModel/src/simulator/interfaces/db/ResultSender.java b/AlgebraicDataflowArchitectureModel/src/simulator/interfaces/db/ResultSender.java
new file mode 100644
index 0000000..bcf9e07
--- /dev/null
+++ b/AlgebraicDataflowArchitectureModel/src/simulator/interfaces/db/ResultSender.java
@@ -0,0 +1,70 @@
+package simulator.interfaces.db;
+
+import java.sql.Connection;
+import java.sql.DriverManager;
+import java.sql.ResultSet;
+import java.sql.SQLException;
+import java.sql.Statement;
+
+import models.algebra.Constant;
+import models.algebra.Expression;
+import models.algebra.Term;
+import models.dataConstraintModel.DataConstraintModel;
+import models.dataConstraintModel.ResourcePath;
+import models.dataFlowModel.DataTransferChannel;
+import simulator.Resource;
+import simulator.Simulator;
+import simulator.interfaces.NativeSender;
+
+public class ResultSender extends NativeSender{
+
+ private String url;
+ private String user;
+ private String pass;
+
+ public ResultSender(Simulator simulator, DataTransferChannel channel, ResourcePath resourcePath,
+ Resource resource, String url, String user, String pass) {
+ super(simulator, channel, resourcePath, resource);
+ this.url = url;
+ this.user = user;
+ this.pass = pass;
+ }
+
+ public void executeQuery(String query) {
+ StringBuilder resCSV = new StringBuilder();
+ try(
+ Connection conn = DriverManager.getConnection(url, user, pass);
+ Statement stmt = conn.createStatement();
+ ResultSet rs = stmt.executeQuery(query)
+ ){
+ var meta = rs.getMetaData();
+ for(int i = 1; i <= meta.getColumnCount(); i++) {
+ resCSV.append(meta.getColumnName(i));
+ if(i != meta.getColumnCount()) {
+ resCSV.append(",");
+ } else {
+ resCSV.append("\n");
+ }
+ }
+ while(rs.next()) {
+ for(int i = 1; i <= meta.getColumnCount(); i++) {
+ resCSV.append(rs.getString(i));
+ if(i != meta.getColumnCount()) {
+ resCSV.append(",");
+ } else {
+ resCSV.append("\n");
+ }
+ }
+ }
+ } catch(SQLException e) {
+ resCSV.append("sql error");
+ e.printStackTrace();
+ }
+ Constant res = new Constant(resCSV.toString(), DataConstraintModel.typeString);
+ Expression message = channel.getOutputChannelMembers().iterator().next().getStateTransition().getMessageExpression();
+ message = (Term) message.clone();
+ ((Term) message).setChild(0, res);
+ sendToModel(message);
+ }
+
+}