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); + } + +}