diff --git a/AlgebraicDataflowArchitectureModel/models/DatabaseTest2.model b/AlgebraicDataflowArchitectureModel/models/DatabaseTest2.model index 5d5cc98..4bb93e0 100644 --- a/AlgebraicDataflowArchitectureModel/models/DatabaseTest2.model +++ b/AlgebraicDataflowArchitectureModel/models/DatabaseTest2.model @@ -1,23 +1,20 @@ init { db := { "accountAndBooks": { - "url": "jdbc:postgresql://localhost:5432/db", + "url": "jdbc:postgresql://localhost:5432/postgres", "user": "root", "password": "pass", "tables": { "accounts": { - "0": { - "name": "tmp" - } + "record": nil }, "books": { - "0": { - "name": "tmp" - } + "record": nil } } } } + current:= { "aid": { "value": 0, @@ -35,7 +32,7 @@ } native channel setRecord(dbName: Str, tableName: Str) { - out db.{dbName}.tables.{tableName}(curRecord: Json, setRecord(newRecord: Json)) = newRecord + out db.{dbName}.tables.{tableName}.record(curRecord, setRecord(newRecord)) = newRecord } native channel updateRecordOnChangeCurrent(varName: Str) { diff --git a/AlgebraicDataflowArchitectureModel/models/SimpleUI.model b/AlgebraicDataflowArchitectureModel/models/SimpleUI.model index 9b54346..ac3c51d 100644 --- a/AlgebraicDataflowArchitectureModel/models/SimpleUI.model +++ b/AlgebraicDataflowArchitectureModel/models/SimpleUI.model @@ -1,9 +1,3 @@ -init { - screen := {"widgets": {"001": {"type": "button", "text": "OK", "state": 0}, - "002": {"type": "textInput", "text": "", "state": 0}}, - "layout": true} -} - native channel ScreenUpdate { in screen(curSc: Json, update(curSc, nextSc)) = nextSc } diff --git a/AlgebraicDataflowArchitectureModel/models/SimpleUI3.model b/AlgebraicDataflowArchitectureModel/models/SimpleUI3.model new file mode 100644 index 0000000..14614ef --- /dev/null +++ b/AlgebraicDataflowArchitectureModel/models/SimpleUI3.model @@ -0,0 +1,98 @@ +init { + screen1 := { + "button1": { + "text": "bad" + } + } +} + +native channel ScreenUpdate { + in screen(curSc: Json, update(curSc, nextSc)) = nextSc +} + +native channel SetLayout { + in screen.layout(curLayout: Bool, setLayout(nextLayout)) = nextLayout +} + +native channel SetVisible(wid: Str) { + in screen.widgets.{wid}.visible(curVisible: Bool, setVisible(nextVisible)) = nextVisible +} + +native channel SetText(wid: Str) { + in screen.widgets.{wid}.text(curText: Str, setText(nextText)) = nextText +} + +native channel SetX(wid: Str) { + in screen.widgets.{wid}.x(curX: Int, setX(nextX)) = nextX +} + +native channel SetY(wid: Str) { + in screen.widgets.{wid}.y(curY: Int, setY(nextY)) = nextY +} + +native channel SetWidth(wid: Str) { + in screen.widgets.{wid}.width(curWidth: Int, setWidth(nextWidth)) = nextWidth +} + +native channel SetHeight(wid: Str) { + in screen.widgets.{wid}.height(curHeight: Int, setHeight(nextHeight)) = nextHeight +} + +native channel MouseEvent(wid: Str) { + out screen.widgets.{wid}.state(curState: Int, mouseEvent(nextState)) = nextState +} + +native channel TextEvent(wid: Str) { + out screen.widgets.{wid}.text(curText: Str, textEvent(nextText)) = nextText +} + +channel ChangeLayout { + out screen.layout(curLayout: Bool, changeLayout(layout)) = layout +} + +channel ChangeX(wid: Str) { + out screen.widgets.{wid}.x(curX: Int, changeX(x)) = x +} + +channel ChangeY(wid: Str) { + out screen.widgets.{wid}.y(curY: Int, changeY(y)) = y +} + +channel AddButton { + out screen.widgets(widgets: Map, addButton(wid: Str, text: Str)) = insert(widgets, wid, {"type": "button", "text": text, "state": 0, "wid": wid}) +} + +channel AddLabel { + out screen.widgets(widgets: Map, addLabel(wid: Str, text: Str)) = insert(widgets, wid, {"type": "label", "text": text, "state": 0, "wid": wid}) +} + +channel AddTextInput { + out screen.widgets(widgets: Map, addTextInput(wid: Str)) = insert(widgets, wid, {"type": "textInput", "text": "", "state": 0, "wid": wid}) +} + +channel buttonPushed1(wid: Str) { + in screen.widgets.{wid}.state(curState: Int, changeState(nextState: Int, nextWid)) = nextState + in screen.widgets.{wid}.wid(curWid: Int, changeState(nextState: Int, nextWid: Str)) = nextWid + out screen1.button1.text(curText: Str, changeState(nextState: Int, nextWid)) = if(nextWid == "w1", "hello", curText) +} + +channel buttonPushed2(wid: Str) { + in screen.widgets.{wid}.state(curState: Int, changeState(nextState: Int, nextWid)) = nextState + in screen.widgets.{wid}.wid(curWid: Int, changeState(nextState: Int, nextWid: Str)) = nextWid + out screen1.button1.text(curText: Str, changeState(nextState: Int, nextWid)) = if(nextWid == "w2", "bad", curText) +} + +channel buttonPushed3{ + in screen1.button1.text(curText: Str, changeText(nextText, nextTarget)) = nextText + in screen1.button1.target(curTarget: Str, changeText(nextText, nextTarget)) = nextTarget + out screen.widgets.{nextTarget}.text(curText, changeText(nextText, nextTarget)) = nextText +} + +channel C1 { + in screen1.input1.text(curText: Str, changeText(nextText)) = nextText + out screen1.button1.text(curText: Str, changeText(nextText)) = nextText +} + +channel setText { + out screen1.input1.text(curText: Str, changeText(nextText)) = nextText +} diff --git a/AlgebraicDataflowArchitectureModel/models/Test.model b/AlgebraicDataflowArchitectureModel/models/Test.model new file mode 100644 index 0000000..38c78b5 --- /dev/null +++ b/AlgebraicDataflowArchitectureModel/models/Test.model @@ -0,0 +1,18 @@ +channel Signup { + out accounts(accDB:Map, signup(aid:Str)) = insert(accDB, aid, {"favorites": nil, "books": nil}) + out keeplog(a:Str, signup(account))=account +} + +channel CreateBook(aid:Str) { + out accounts.{aid}.books(bookList:List, createBook(title:Str)) = append(bookList, {"title": title, "favorited": nil}) +} + +channel Slog { + out temp(a:Str,Slog(account))=account +} + +channel Login { + in temp(ac:Str,login(acoount: Str,accDB: Map))=account + ref accounts(accDB:Map, login(account: Str,accDB: Map)) + out keeplog(a:Str,login(account: Str, accDB: Map))=if(contains(accDB, account), account, "") +} \ No newline at end of file diff --git a/AlgebraicDataflowArchitectureModel/src/simulator/interfaces/db/DatabasePresenter.java b/AlgebraicDataflowArchitectureModel/src/simulator/interfaces/db/DatabasePresenter.java index 9dfffb3..b5a43b7 100644 --- a/AlgebraicDataflowArchitectureModel/src/simulator/interfaces/db/DatabasePresenter.java +++ b/AlgebraicDataflowArchitectureModel/src/simulator/interfaces/db/DatabasePresenter.java @@ -50,12 +50,12 @@ 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); + recordResource = res.getChildrenMap().get(dbName).getChildrenMap().get("tables").getChildrenMap().get(tableName).getChildrenMap().get("record"); break; } } - JsonTerm dbData = (JsonTerm) simulator.getCurState().getResource(recordResource.getParent().getParent().getResourceIdentifier()).getState().getValue(); + JsonTerm dbData = (JsonTerm) simulator.getCurState().getResource(recordResource.getParent().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("\"", ""); @@ -66,7 +66,7 @@ sender.updateRecord(tableName.replace("\"", ""), key, Integer.parseInt(newValue.toString())); break; case "Str": - sender.updateRecord(tableName, key, newValue.toString()); + sender.updateRecord(tableName.replace("\"", ""), key, newValue.toString()); break; } } diff --git a/AlgebraicDataflowArchitectureModel/src/simulator/interfaces/db/RecordSender.java b/AlgebraicDataflowArchitectureModel/src/simulator/interfaces/db/RecordSender.java index ef38abf..ee20994 100644 --- a/AlgebraicDataflowArchitectureModel/src/simulator/interfaces/db/RecordSender.java +++ b/AlgebraicDataflowArchitectureModel/src/simulator/interfaces/db/RecordSender.java @@ -10,6 +10,7 @@ import models.algebra.Expression; import models.algebra.Term; import models.dataConstraintModel.JsonTerm; +import models.dataConstraintModel.MapTerm; import models.dataConstraintModel.ResourcePath; import models.dataFlowModel.DataTransferChannel; import simulator.Resource; @@ -32,15 +33,46 @@ public void updateRecord(String tableName, String key, String 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.setString(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); } public void updateRecord(String tableName, String key, int value) { @@ -79,12 +111,14 @@ e.printStackTrace(); } + MapTerm test = new MapTerm(); + test.insert("1", new Constant("hello")); Expression message = channel.getOutputChannelMembers().iterator().next().getStateTransition().getMessageExpression(); - message = (Term)message.clone(); - ((Term) message).setChild(0, res); + Term termMessage = (Term)message.clone(); + termMessage.setChild(0, test); System.out.println(res); - sendToModel(message); + sendToModel(termMessage); } diff --git a/AlgebraicDataflowArchitectureModel/src/simulator/interfaces/swing/SwingPresenter.java b/AlgebraicDataflowArchitectureModel/src/simulator/interfaces/swing/SwingPresenter.java index 4d95497..056bcf6 100644 --- a/AlgebraicDataflowArchitectureModel/src/simulator/interfaces/swing/SwingPresenter.java +++ b/AlgebraicDataflowArchitectureModel/src/simulator/interfaces/swing/SwingPresenter.java @@ -2,16 +2,17 @@ import java.awt.Component; import java.awt.FlowLayout; -import java.util.HashMap; -import java.util.HashSet; -import java.util.Map; -import java.util.Set; import javax.swing.JButton; import javax.swing.JLabel; import javax.swing.JPanel; import javax.swing.JTextField; +import java.util.HashMap; +import java.util.HashSet; +import java.util.Map; +import java.util.Set; + import models.algebra.Constant; import models.algebra.Expression; import models.algebra.Term; diff --git a/AlgebraicDataflowArchitectureModel/src/tests/SakodaTest.java b/AlgebraicDataflowArchitectureModel/src/tests/SakodaTest.java new file mode 100644 index 0000000..f6c5e13 --- /dev/null +++ b/AlgebraicDataflowArchitectureModel/src/tests/SakodaTest.java @@ -0,0 +1,116 @@ +package tests; + +import org.junit.Test; + +import algorithms.TypeInference; +import models.algebra.Expression; +import models.algebra.Variable; +import models.dataConstraintModel.ChannelMember; +import models.dataConstraintModel.ResourcePath; +import models.dataFlowModel.DataTransferChannel; +import models.dataFlowModel.DataTransferModel; +import parser.Parser; +import parser.Parser.TokenStream; +import parser.exceptions.ExpectedColon; +import parser.exceptions.ExpectedRightBracket; +import parser.exceptions.WrongJsonExpression; +import simulator.Simulator; +import simulator.SystemState; + +public class SakodaTest { + private DataTransferModel model; + + @Test + public void test() { + try { + TokenStream stream = new Parser.TokenStream(); + Parser parser = new Parser(stream); + + model = new DataTransferModel(); + ResourcePath screen = new ResourcePath("screen"); + ResourcePath widgets = new ResourcePath(screen, "widgets"); + ResourcePath widget = new ResourcePath(widgets, new Variable("wid")); + ResourcePath type = new ResourcePath(widget, "type"); + ResourcePath text = new ResourcePath(widget, "text"); + ResourcePath id = new ResourcePath(widget, "id"); + ResourcePath state = new ResourcePath(widget, "state"); + ResourcePath visible = new ResourcePath(widget, "visible"); + ResourcePath x = new ResourcePath(widget, "x"); + ResourcePath y = new ResourcePath(widget, "y"); + ResourcePath w = new ResourcePath(widget, "w"); + ResourcePath h = new ResourcePath(widget, "h"); + + model.addResourcePath(screen); + model.addResourcePath(widgets); + model.addResourcePath(widget); + model.addResourcePath(type); + model.addResourcePath(id); + model.addResourcePath(text); + model.addResourcePath(state); + model.addResourcePath(visible); + model.addResourcePath(x); + model.addResourcePath(y); + model.addResourcePath(w); + model.addResourcePath(h); + + // JsonTerm elements = new JsonTerm(); + // for(Element element : l.getElements()) { + // JsonTerm elem = new JsonTerm(); + // elem.addMember("type", new Constant(element.getType())); + // elem.addMember("id", new Constant(element.getId())); + // elem.addMember("text", new Constant(element.getText())); + // elements.addMember(element.getId(), elem); + // } + // widgets.getResourceHierarchy().setInitialValue(elements); + + addNativeOutputChannel(stream, parser, screen, "ScreenUpdate", "curSc: Json", "update(curSc, nextSc)", "nextSc"); + addNativeOutputChannel(stream, parser, visible, "SetVisible", "curVisible: Bool", "setVisible(nextVisible)", "nextVisible"); + addNativeOutputChannel(stream, parser, text, "SetText", "curText: Str", "setText(nextText)", "nextText"); + addNativeInputChannel(stream, parser, state, "MouseEvent", "curState: Int", "mouseEvent(nextState)", "nextState"); + addNativeInputChannel(stream, parser, text, "MouseEvent", "curText: Str", "textEvent(nextText)", "nextText"); + + TypeInference.infer(model); + Simulator simulator = new Simulator(model); + simulator.init(); + SystemState s = simulator.getCurState(); + } catch (Exception e) { + e.printStackTrace(); + } + } + + private void addNativeOutputChannel(TokenStream stream, Parser parser, ResourcePath path, + String channelName, String curStateName, String messageName, String nextStateName) throws ExpectedRightBracket, WrongJsonExpression, ExpectedColon { + DataTransferChannel outputChannel = new DataTransferChannel(channelName); + outputChannel.setNative(true); + ChannelMember out = new ChannelMember(path); + stream.addLine(curStateName); + Expression curState = parser.parseTerm(stream, model); + stream.addLine(messageName); + Expression message = parser.parseTerm(stream, model); + stream.addLine(nextStateName); + Expression nextState = parser.parseTerm(stream, model); + out.getStateTransition().setCurStateExpression(curState); + out.getStateTransition().setMessageExpression(message); + out.getStateTransition().setNextStateExpression(nextState); + outputChannel.addChannelMemberAsInput(out); + model.addChannel(outputChannel); + } + + private void addNativeInputChannel(TokenStream stream, Parser parser, ResourcePath path, + String channelName, String curStateName, String messageName, String nextStateName) throws ExpectedRightBracket, WrongJsonExpression, ExpectedColon { + DataTransferChannel inputChannel = new DataTransferChannel(channelName); + inputChannel.setNative(true); + ChannelMember in = new ChannelMember(path); + stream.addLine(curStateName); + Expression curState = parser.parseTerm(stream, model); + stream.addLine(messageName); + Expression message = parser.parseTerm(stream, model); + stream.addLine(nextStateName); + Expression nextState = parser.parseTerm(stream, model); + in.getStateTransition().setCurStateExpression(curState); + in.getStateTransition().setMessageExpression(message); + in.getStateTransition().setNextStateExpression(nextState); + inputChannel.addChannelMemberAsOutput(in); + model.addInputChannel(inputChannel); + } +} \ No newline at end of file