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 75d5162..e0f739c 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.sql.SQLPresenter; import simulator.interfaces.swing.SwingPresenter; @@ -18,7 +19,8 @@ private TimerService timerService; private RestPresenter rest; - private SQLPresenter db; + private SQLPresenter sql; + private DatabasePresenter db; public UISimulatorWindow(Simulator simulator) { setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE); @@ -26,7 +28,8 @@ mainPanel = new JPanel(); presenter = new SwingPresenter(mainPanel, simulator); rest = new RestPresenter(simulator); - db = new SQLPresenter(simulator); + sql = new SQLPresenter(simulator); + db = new DatabasePresenter(simulator); this.add(mainPanel); timerService = new TimerService(simulator); diff --git a/AlgebraicDataflowArchitectureModel/src/simulator/interfaces/db/DatabasePresenter.java b/AlgebraicDataflowArchitectureModel/src/simulator/interfaces/db/DatabasePresenter.java new file mode 100644 index 0000000..9dfffb3 --- /dev/null +++ b/AlgebraicDataflowArchitectureModel/src/simulator/interfaces/db/DatabasePresenter.java @@ -0,0 +1,76 @@ +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; +import simulator.Resource; +import simulator.ResourceIdentifier; +import simulator.Simulator; +import simulator.SystemState; +import simulator.interfaces.INativeReceiver; + +public class DatabasePresenter implements INativeReceiver{ + + public final String updateCurrentChannelName = "updateCurrent"; + public final String setRecordChannelName = "setRecord"; + public final String updateRecordChannelName = "updateRecordOnChangeCurrent"; + + protected Simulator simulator; + + protected DataTransferChannel setRecordChannel; + protected DataTransferChannel updateRecord; + + public DatabasePresenter(Simulator simulator) { + this.simulator = simulator; + 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 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); + + } + +}