diff --git a/AlgebraicDataflowArchitectureModel/models/DatabaseTest2.model b/AlgebraicDataflowArchitectureModel/models/DatabaseTest2.model new file mode 100644 index 0000000..5d5cc98 --- /dev/null +++ b/AlgebraicDataflowArchitectureModel/models/DatabaseTest2.model @@ -0,0 +1,47 @@ +init { + db := { + "accountAndBooks": { + "url": "jdbc:postgresql://localhost:5432/db", + "user": "root", + "password": "pass", + "tables": { + "accounts": { + "0": { + "name": "tmp" + } + }, + "books": { + "0": { + "name": "tmp" + } + } + } + } + } + current:= { + "aid": { + "value": 0, + "dbName": "accountAndBooks", + "table": "accounts", + "key": "aid" + }, + "bid": { + "value": 0, + "dbName": "accountAndBooks", + "table": "books", + "key": "bid" + } + } +} + +native channel setRecord(dbName: Str, tableName: Str) { + out db.{dbName}.tables.{tableName}(curRecord: Json, setRecord(newRecord: Json)) = newRecord +} + +native channel updateRecordOnChangeCurrent(varName: Str) { + in current.{varName}.value(currentData, updateRecord(newCurrentData)) = newCurrentData +} + +channel updateCurrent(varName: Str) { + out current.{varName}.value(curValue: Int, setValue(newValue: Int)) = newValue +} \ No newline at end of file diff --git a/AlgebraicDataflowArchitectureModel/src/application/simulator/UISimulatorWindow.java b/AlgebraicDataflowArchitectureModel/src/application/simulator/UISimulatorWindow.java index 0f4448a..e0f739c 100644 --- a/AlgebraicDataflowArchitectureModel/src/application/simulator/UISimulatorWindow.java +++ b/AlgebraicDataflowArchitectureModel/src/application/simulator/UISimulatorWindow.java @@ -6,6 +6,7 @@ import simulator.Simulator; import simulator.interfaces.db.DatabasePresenter; import simulator.interfaces.rest.RestPresenter; +import simulator.interfaces.sql.SQLPresenter; import simulator.interfaces.swing.SwingPresenter; import simulator.interfaces.timers.TimerService; @@ -18,6 +19,7 @@ private TimerService timerService; private RestPresenter rest; + private SQLPresenter sql; private DatabasePresenter db; public UISimulatorWindow(Simulator simulator) { @@ -26,6 +28,7 @@ mainPanel = new JPanel(); presenter = new SwingPresenter(mainPanel, simulator); rest = new RestPresenter(simulator); + sql = new SQLPresenter(simulator); db = new DatabasePresenter(simulator); this.add(mainPanel); diff --git a/AlgebraicDataflowArchitectureModel/src/simulator/interfaces/db/DatabasePresenter.java b/AlgebraicDataflowArchitectureModel/src/simulator/interfaces/db/DatabasePresenter.java index 0378c89..9dfffb3 100644 --- a/AlgebraicDataflowArchitectureModel/src/simulator/interfaces/db/DatabasePresenter.java +++ b/AlgebraicDataflowArchitectureModel/src/simulator/interfaces/db/DatabasePresenter.java @@ -1,7 +1,9 @@ package simulator.interfaces.db; +import models.algebra.Constant; import models.algebra.Expression; import models.algebra.Term; +import models.dataConstraintModel.JsonTerm; import models.dataConstraintModel.ResourcePath; import models.dataFlowModel.DataTransferChannel; import simulator.Event; @@ -13,44 +15,62 @@ public class DatabasePresenter implements INativeReceiver{ - - public final String sendQueryChannelName = "sendQuery"; - public final String setResultChannelName = "setResult"; + public final String updateCurrentChannelName = "updateCurrent"; + public final String setRecordChannelName = "setRecord"; + public final String updateRecordChannelName = "updateRecordOnChangeCurrent"; protected Simulator simulator; - protected DataTransferChannel sendQueryChannel; - protected DataTransferChannel setResultChannel; + protected DataTransferChannel setRecordChannel; + protected DataTransferChannel updateRecord; public DatabasePresenter(Simulator simulator) { this.simulator = simulator; - sendQueryChannel = (DataTransferChannel) simulator.getModel().getChannel(sendQueryChannelName); - setResultChannel = (DataTransferChannel) simulator.getModel().getInputChannel(setResultChannelName); - simulator.addNativeReceiver(this, sendQueryChannel); + setRecordChannel = (DataTransferChannel) simulator.getModel().getInputChannel(setRecordChannelName); + updateRecord = (DataTransferChannel) simulator.getModel().getChannel(updateRecordChannelName); + simulator.addNativeReceiver(this, updateRecord); } + @Override public void onReceiveFromModel(Event event, SystemState nextSystemState) { Expression message = event.getMessage(); + Constant newValue = (Constant)((Term) message).getChild(0); 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("\"", "")); + ResourceIdentifier identifier = event.getResourceIdentifier(path); +// String varName = identifier.getPathParams().get(0).toString().replace("\"",""); + ResourcePath parent = identifier.getParent(); + ResourceIdentifier parentIdent = event.getResourceIdentifier(parent); + JsonTerm data =(JsonTerm) simulator.getCurState().getResource(parentIdent).getState().getValue(); + String key = data.get("key").toString().replace("\"", ""); + String tableName = data.get("table").toString(); + String dbName = data.get("dbName").toString(); + + ResourcePath recordPath = setRecordChannel.getOutputResources().iterator().next(); + Resource recordResource = null; + for(var res : nextSystemState.getRootResources()) { + if(res.getResourceIdentifier().toString().equals("db")) { + recordResource = res.getChildrenMap().get(dbName).getChildrenMap().get("tables").getChildrenMap().get(tableName); + break; + } + } + + JsonTerm dbData = (JsonTerm) simulator.getCurState().getResource(recordResource.getParent().getParent().getResourceIdentifier()).getState().getValue(); + String dbUrl = dbData.get("url").toString().replace("\"", ""); + String dbUser = dbData.get("user").toString().replace("\"", ""); + String dbPass = dbData.get("password").toString().replace("\"", ""); + RecordSender sender = new RecordSender(simulator, setRecordChannel, recordPath, recordResource, dbUrl, dbUser, dbPass); + + switch(newValue.getType().getTypeName()) { + case "Int": + sender.updateRecord(tableName.replace("\"", ""), key, Integer.parseInt(newValue.toString())); + break; + case "Str": + sender.updateRecord(tableName, key, newValue.toString()); + break; } } + + } diff --git a/AlgebraicDataflowArchitectureModel/src/simulator/interfaces/db/RecordSender.java b/AlgebraicDataflowArchitectureModel/src/simulator/interfaces/db/RecordSender.java new file mode 100644 index 0000000..ef38abf --- /dev/null +++ b/AlgebraicDataflowArchitectureModel/src/simulator/interfaces/db/RecordSender.java @@ -0,0 +1,91 @@ +package simulator.interfaces.db; + +import java.sql.Connection; +import java.sql.DriverManager; +import java.sql.PreparedStatement; +import java.sql.ResultSet; +import java.sql.SQLException; + +import models.algebra.Constant; +import models.algebra.Expression; +import models.algebra.Term; +import models.dataConstraintModel.JsonTerm; +import models.dataConstraintModel.ResourcePath; +import models.dataFlowModel.DataTransferChannel; +import simulator.Resource; +import simulator.Simulator; +import simulator.interfaces.NativeSender; + +public class RecordSender extends NativeSender{ + + private String url; + private String user; + private String pass; + + public RecordSender(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 updateRecord(String tableName, String key, String value) { + String query = "SELECT * FROM "+ tableName + " WHERE "+ key + " = ?"; + try{ + Connection conn = DriverManager.getConnection(url, user, pass); + PreparedStatement pstmt = conn.prepareStatement(query); + pstmt.setString(1, value); + ResultSet rs = pstmt.executeQuery(); + } catch (SQLException e) { + // TODO 自動生成された catch ブロック + e.printStackTrace(); + } + } + + public void updateRecord(String tableName, String key, int value) { + String query = "SELECT * FROM "+ tableName + " WHERE "+ key + " = ?"; + JsonTerm res = new JsonTerm(); + + try{ + Connection conn = DriverManager.getConnection(url, user, pass); + PreparedStatement pstmt = conn.prepareStatement(query); + pstmt.setInt(1, value); + ResultSet rs = pstmt.executeQuery(); + + var meta = rs.getMetaData(); + int primaryNum = -1; + for(int i = 1; i <= meta.getColumnCount(); i++) { + if(meta.getColumnName(i).equals(key)) { + primaryNum = i; + break; + } + } + + while(rs.next()) { + String primaryData = rs.getString(primaryNum); + res.addMember(primaryData, new JsonTerm()); + for(int i = 1; i <= meta.getColumnCount(); i++) { + if(i == primaryNum) { + continue; + } + String columnName = meta.getColumnName(i); + Constant data = new Constant(rs.getString(i)); + ((JsonTerm) res.get(primaryData)).addMember(columnName, data); + } + } + } catch (SQLException e) { + // TODO 自動生成された catch ブロック + e.printStackTrace(); + } + + + Expression message = channel.getOutputChannelMembers().iterator().next().getStateTransition().getMessageExpression(); + message = (Term)message.clone(); + ((Term) message).setChild(0, res); + System.out.println(res); + sendToModel(message); + + } + +} diff --git a/AlgebraicDataflowArchitectureModel/src/simulator/interfaces/db/ResultSender.java b/AlgebraicDataflowArchitectureModel/src/simulator/interfaces/db/ResultSender.java deleted file mode 100644 index bcf9e07..0000000 --- a/AlgebraicDataflowArchitectureModel/src/simulator/interfaces/db/ResultSender.java +++ /dev/null @@ -1,70 +0,0 @@ -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); - } - -} diff --git a/AlgebraicDataflowArchitectureModel/src/simulator/interfaces/html/HtmlElement.java b/AlgebraicDataflowArchitectureModel/src/simulator/interfaces/html/HtmlElement.java index 9696e1f..ca94bdc 100644 --- a/AlgebraicDataflowArchitectureModel/src/simulator/interfaces/html/HtmlElement.java +++ b/AlgebraicDataflowArchitectureModel/src/simulator/interfaces/html/HtmlElement.java @@ -20,7 +20,7 @@ HtmlElement(String type, String id, String text){ this.type = type; - this.id = id; + this.id = id.replace("\"", ""); this.text = text; styles = new HashMap<>(); classes = new HashSet<>(); @@ -45,7 +45,7 @@ public MapTerm toMap() { MapTerm res = new MapTerm(); res.insert("\"type\"", new Constant("\"" + type + "\"")); - res.insert("\"id\"", new Constant(id)); + res.insert("\"id\"", new Constant("\"" + id + "\"")); res.insert("\"text\"", new Constant(text)); MapTerm stylesMap = new MapTerm(); for(String prop : styles.keySet()) { diff --git a/AlgebraicDataflowArchitectureModel/src/simulator/interfaces/html/HtmlElementMouseSender.java b/AlgebraicDataflowArchitectureModel/src/simulator/interfaces/html/HtmlElementMouseSender.java index ab2d513..4b05ecd 100644 --- a/AlgebraicDataflowArchitectureModel/src/simulator/interfaces/html/HtmlElementMouseSender.java +++ b/AlgebraicDataflowArchitectureModel/src/simulator/interfaces/html/HtmlElementMouseSender.java @@ -13,9 +13,14 @@ public class HtmlElementMouseSender extends NativeSender implements IRestEventListener{ + private HtmlScreenSender screenSender; + public HtmlElementMouseSender(Simulator simulator, DataTransferChannel channel, ResourcePath resourcePath, - Resource resource) { + Resource resource, HtmlScreenSender screenSender) { super(simulator, channel, resourcePath, resource); + this.screenSender = screenSender; + System.out.println(resource.getResourceIdentifier().getPathParams().get(0)); + System.out.println(simulator.getCurState().getResource(resource.getResourceIdentifier()).getChildrenMap().get("onPressed").getState().getValue()); } @Override @@ -26,12 +31,16 @@ Term termMessage = (Term)eventMessage.clone(); termMessage.setChild(0, one); sendToModel(termMessage); + } else if(method.equals("onMouseReleased")) { Constant zero = new Constant("0", DataConstraintModel.typeInt); Expression eventMessage = channel.getOutputChannelMembers().iterator().next().getStateTransition().getMessageExpression(); Term termMessage = (Term) eventMessage.clone(); termMessage.setChild(0, zero); sendToModel(termMessage); + + JsonTerm term = (JsonTerm) simulator.getCurState().getResource(resource.getResourceIdentifier()).getChildrenMap().get("onPressed").getState().getValue(); + screenSender.changeScreen((JsonTerm)term.get(new Constant("data"))); } } diff --git a/AlgebraicDataflowArchitectureModel/src/simulator/interfaces/html/HtmlPresenter.java b/AlgebraicDataflowArchitectureModel/src/simulator/interfaces/html/HtmlPresenter.java index 9e09d9d..039af3e 100644 --- a/AlgebraicDataflowArchitectureModel/src/simulator/interfaces/html/HtmlPresenter.java +++ b/AlgebraicDataflowArchitectureModel/src/simulator/interfaces/html/HtmlPresenter.java @@ -27,6 +27,7 @@ public final String setTextChannelName = "SetText"; public final String mouseEventChannelName = "MouseEvent"; public final String textEventChannelName = "TextEvent"; + public final String changeScreenChannelName = "ChangeScreen"; protected Simulator simulator; protected DataTransferChannel screenUpdateChannel; @@ -34,6 +35,7 @@ protected DataTransferChannel mouseEventChannel; protected DataTransferChannel textEventChannel; protected DataTransferChannel setTextChannel; + protected DataTransferChannel changeScreenChannel; protected Map> channelAndResourcesForReceiving = new HashMap<>(); @@ -50,11 +52,40 @@ mouseEventChannel = (DataTransferChannel) simulator.getModel().getInputChannel(mouseEventChannelName); setTextChannel = (DataTransferChannel) simulator.getModel().getChannel(setTextChannelName); textEventChannel = (DataTransferChannel) simulator.getModel().getInputChannel(textEventChannelName); + changeScreenChannel = (DataTransferChannel) simulator.getModel().getInputChannel(changeScreenChannelName); simulator.addNativeReceiver(this, screenUpdateChannel); elements = elems; + initScreen(); } + + private void initScreen() { + Expression initScExp = simulator.getCurState().getResource("screen").getState().getValue(); + if (initScExp instanceof JsonTerm) { + JsonTerm sendData = new JsonTerm(); + sendData.addMember("\"method\"", new Constant("\"updateHtml\"")); + JsonTerm sendElements = new JsonTerm(); + ListTerm addElements = new ListTerm(); + ListTerm delElements = new ListTerm(); + JsonTerm nextSc = (JsonTerm) initScExp; + Expression newWidgets = nextSc.get("widgets"); + + if (newWidgets instanceof MapTerm) { + + Set newWidSet = new HashSet<>(((MapTerm) newWidgets).keySet()); + + if (!newWidSet.isEmpty()) { + addNewWidgets(newWidSet, simulator.getCurState().getResource("screen"), newWidgets, addElements); + } + } + + sendElements.addMember("\"add\"", addElements); + sendElements.addMember("\"delete\"", delElements); + sendData.addMember("\"data\"", sendElements); + ws.send(sendData.toString()); + } + } @Override public void onReceiveFromModel(Event event, SystemState nextSystemState) { @@ -103,36 +134,10 @@ } } - private void initScreen() { - Expression initScExp = simulator.getCurState().getResource("screen").getState().getValue(); - if (initScExp instanceof JsonTerm) { - JsonTerm sendData = new JsonTerm(); - sendData.addMember("\"method\"", new Constant("\"updateHtml\"")); - JsonTerm sendElements = new JsonTerm(); - ListTerm addElements = new ListTerm(); - ListTerm delElements = new ListTerm(); - - JsonTerm nextSc = (JsonTerm) initScExp; - Expression newWidgets = nextSc.get("widgets"); - - if (newWidgets instanceof MapTerm) { - - Set newWidSet = new HashSet<>(((MapTerm) newWidgets).keySet()); - - if (!newWidSet.isEmpty()) { - addNewWidgets(newWidSet, simulator.getCurState().getResource("screen"), newWidgets, addElements); - } - } - - sendElements.addMember("\"add\"", addElements); - sendElements.addMember("\"delete\"", delElements); - sendData.addMember("\"data\"", sendElements); - ws.send(sendData.toString()); - } - } private void addNewWidgets(Set newWidSet, Resource screenResource, Expression newWidgets, ListTerm addElements) { - + + Resource widgetsResource = screenResource.getChildrenMap().get("widgets"); for(String newWid: newWidSet) { Expression value = ((MapTerm) newWidgets).get(newWid); @@ -140,10 +145,11 @@ JsonTerm widget = (JsonTerm) value; Resource widgetResource = widgetsResource.getChildrenMap().get(newWid); Expression type = widget.get("type"); - + HtmlScreenSender screenSender = new HtmlScreenSender(simulator, changeScreenChannel, changeScreenChannel.getOutputResources().iterator().next(), + screenResource); switch(type.toString()) { case "\"button\"": - addButton(widget, newWid, addElements, widgetResource); + addButton(widget, newWid, addElements, widgetResource, screenSender); break; case "\"label\"": addLabel(widget, newWid, addElements, widgetResource); @@ -157,35 +163,12 @@ } - private void addNewWidgets(Set newWidSet, SystemState nextSystemState, ResourceIdentifier ri, Expression newWidgets, ListTerm addElements) { - Resource screenResource = nextSystemState.getResource(ri); - Resource widgetsResource = screenResource.getChildrenMap().get("widgets"); - for(String newWid: newWidSet) { - Expression value = ((MapTerm) newWidgets).get(newWid); - if(value instanceof JsonTerm) { - JsonTerm widget = (JsonTerm) value; - Resource widgetResource = widgetsResource.getChildrenMap().get(newWid); - Expression type = widget.get("\"type\""); - - switch(type.toString()) { - case "\"button\"": - addButton(widget, newWid, addElements, widgetResource); - break; - case "\"label\"": - addLabel(widget, newWid, addElements, widgetResource); - break; - case "\"textInput\"": - addTextInput(widget, newWid, addElements, widgetResource); - break; - } - } - } - + addNewWidgets(newWidSet, screenResource, newWidgets, addElements); } - private void addButton(JsonTerm widget, String wid, ListTerm addElements, Resource widgetResource) { + private void addButton(JsonTerm widget, String wid, ListTerm addElements, Resource widgetResource, HtmlScreenSender screenSender) { String text = widget.get("text").toString(); HtmlElement button = new HtmlElement("button", wid, text); @@ -206,7 +189,7 @@ //ボタンが押されたり離されたりした時を検知 ResourcePath resPath = mouseEventChannel.getOutputResources().iterator().next(); - button.setRestEventListener(new HtmlElementMouseSender(simulator, mouseEventChannel, resPath, widgetResource)); + button.setRestEventListener(new HtmlElementMouseSender(simulator, mouseEventChannel, resPath, widgetResource, screenSender)); //ボタンが透明になったことを通知 HtmlElementVisibilityReceiver nativeVisibilityReceiver = new HtmlElementVisibilityReceiver(button, ws); @@ -322,7 +305,6 @@ addElements.append(textInput.toMap()); } - private void deleteOldWidgets(Set oldWidSet, ListTerm delElements) { for (String oldWid : oldWidSet) { elements.remove(oldWid); diff --git a/AlgebraicDataflowArchitectureModel/src/simulator/interfaces/html/HtmlScreenSender.java b/AlgebraicDataflowArchitectureModel/src/simulator/interfaces/html/HtmlScreenSender.java new file mode 100644 index 0000000..774093d --- /dev/null +++ b/AlgebraicDataflowArchitectureModel/src/simulator/interfaces/html/HtmlScreenSender.java @@ -0,0 +1,27 @@ +package simulator.interfaces.html; + +import models.algebra.Expression; +import models.algebra.Term; +import models.dataConstraintModel.JsonTerm; +import models.dataConstraintModel.ResourcePath; +import models.dataFlowModel.DataTransferChannel; +import simulator.Resource; +import simulator.Simulator; +import simulator.interfaces.NativeSender; + +public class HtmlScreenSender extends NativeSender{ + + public HtmlScreenSender(Simulator simulator, DataTransferChannel channel, ResourcePath resourcePath, + Resource resource) { + super(simulator, channel, resourcePath, resource); + } + + public void changeScreen(JsonTerm screen) { + System.out.println(screen); + Expression eventMessage = channel.getOutputChannelMembers().iterator().next().getStateTransition().getMessageExpression(); + Term termMessage = (Term) eventMessage.clone(); + termMessage.setChild(0, screen); + sendToModel(termMessage); + } + +} diff --git a/AlgebraicDataflowArchitectureModel/src/simulator/interfaces/sql/ResultSender.java b/AlgebraicDataflowArchitectureModel/src/simulator/interfaces/sql/ResultSender.java new file mode 100644 index 0000000..b1091fa --- /dev/null +++ b/AlgebraicDataflowArchitectureModel/src/simulator/interfaces/sql/ResultSender.java @@ -0,0 +1,70 @@ +package simulator.interfaces.sql; + +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); + } + +} diff --git a/AlgebraicDataflowArchitectureModel/src/simulator/interfaces/sql/SQLPresenter.java b/AlgebraicDataflowArchitectureModel/src/simulator/interfaces/sql/SQLPresenter.java new file mode 100644 index 0000000..d08f106 --- /dev/null +++ b/AlgebraicDataflowArchitectureModel/src/simulator/interfaces/sql/SQLPresenter.java @@ -0,0 +1,56 @@ +package simulator.interfaces.sql; + +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 SQLPresenter implements INativeReceiver{ + + + public final String sendQueryChannelName = "sendQuery"; + public final String setResultChannelName = "setResult"; + + protected Simulator simulator; + + protected DataTransferChannel sendQueryChannel; + protected DataTransferChannel setResultChannel; + + public SQLPresenter(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("\"", "")); + } + } + +}