diff --git a/AlgebraicDataflowArchitectureModel/models/SimpleUI4.model b/AlgebraicDataflowArchitectureModel/models/SimpleUI4.model new file mode 100644 index 0000000..c6be552 --- /dev/null +++ b/AlgebraicDataflowArchitectureModel/models/SimpleUI4.model @@ -0,0 +1,118 @@ +init { + screenTemplates := { + "screen1":{ + "widgets": { + "e6f7bcd0c6554748a87b74a3b39eea82": {"type": "button", "text": "button", "visible": true, "x": 175, "y": 200, "width": 100, "height": 40}, + "f6af87118f8c4fa284a4a226f5369dd7": {"type": "label", "text": "label", "visible": true, "x": 99, "y": 23, "width": 100, "height": 40}, + "idInput": {"type": "textInput", "text": "textInput", "visible": true, "x": 94, "y": 64, "width": 100, "height": 40}, + "nameInput": {"type": "textInput", "text": "textInput", "visible": true, "x": 96, "y": 126, "width": 100, "height": 40} + }, + "layout": false +}, + "screen2":{ + "widgets": { + "6ce2109a701e4883ac50f3f726ee1e47": {"type": "button", "text": "button", "visible": true, "x": 141, "y": 43, "width": 355, "height": 164} + }, + "layout": false +} + } + idInput := "idInput" + nameInput := "nameInput" +} +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 ChangeCurScreen { + out curScreen(curScId: Str, changeCurScreen(nextScId)) = nextScId +} + +channel ScreenTransition { + in curScreen(curScId: Str, transScreen(nextScId, screen)) = nextScId + ref screenTemplates.{nextScId}(screen, transScreen(nextScId, screen)) + out screen(curS, transScreen(nextScId, screen)) = screen +} + +channel EventDispatch(wid: Str) { + in screen.widgets.{wid}.state(curState: Int, dispatchEvent(curScId, wid, nextState)) = nextState + ref curScreen(curScId: Str, dispatchEvent(curScId, wid, nextState)) + out screenTemplates.{curScId}.widgets.{wid}.state(curState: Int, dispatchEvent(curScId, wid, nextState)) = nextState +} + +channel EventDispatch2(wid: Str) { + in screen.widgets.{wid}.text(curText: Str, dispatchEvent2(curScId, wid, nextText)) = nextText + ref curScreen(curScId: Str, dispatchEvent2(curScId, wid, nextText)) + out screenTemplates.{curScId}.widgets.{wid}.text(curText: Str, dispatchEvent2(curScId, wid, nextText)) = nextText +} + +channel e6f7bcd0c6554748a87b74a3b39eea82AccountsSetData(scId: Str, wid: Str){ + in screenTemplates.{scId="screen1"}.widgets.{wid="e6f7bcd0c6554748a87b74a3b39eea82"}.state(curState, e6f7bcd0c6554748a87b74a3b39eea82AccountsSetData(nextState, id, idInput, name, nameInput, accountsRef)) = nextState + ref idInput(idInput, e6f7bcd0c6554748a87b74a3b39eea82AccountsSetData(nextState, id, idInput, name, nameInput, accountsRef)) + ref screen.widgets.{idInput}.text(id, e6f7bcd0c6554748a87b74a3b39eea82AccountsSetData(nextState, id, idInput, name, nameInput, accountsRef)) + ref nameInput(nameInput, e6f7bcd0c6554748a87b74a3b39eea82AccountsSetData(nextState, id, idInput, name, nameInput, accountsRef)) + ref screen.widgets.{nameInput}.text(name, e6f7bcd0c6554748a87b74a3b39eea82AccountsSetData(nextState, id, idInput, name, nameInput, accountsRef)) + ref accounts(accountsRef, e6f7bcd0c6554748a87b74a3b39eea82AccountsSetData(nextState, id, idInput, name, nameInput, accountsRef)) + out accounts(accounts: Map, e6f7bcd0c6554748a87b74a3b39eea82AccountsSetData(nextState, id, idInput, name, nameInput, accountsRef)) = if((nextState == 0) && (id != "") && (!contains(accountsRef, id)), insert(accounts, id, {"name": name}), accounts) +} + +channel addTweets { + out tweets(tweets: Map, addTweets(tid: Str, contents: Str, idOfAuthor: Str)) = insert(tweets, tid, {"contents": contents,"idOfAuthor": idOfAuthor}) +} + +channel changeContentsOfTweets(tid: Str) { + out tweets.{tid}.contents(contents: Str, changeContentsOfTweets(newContents: Str)) = newContents +} + +channel changeIdOfAuthorOfTweets(tid: Str) { + out tweets.{tid}.idOfAuthor(idOfAuthor: Str, changeIdOfAuthorOfTweets(newIdOfAuthor: Str)) = newIdOfAuthor +} + +channel nameOfAuthorOfTweets(tid: Str){ + in tweets.{tid}.idOfAuthor(idOfAuthor: Str, nameOfAuthorOfTweets(newIdOfAuthor: Str, newNameOfAuthor: Str)) = newIdOfAuthor + in accounts.{newIdOfAuthor}.name(name: Str, nameOfAuthorOfTweets(newIdOfAuthor, newNameOfAuthor)) = newNameOfAuthor + out tweets.{tid}.nameOfAuthor(nameOfAuthor, nameOfAuthorOfTweets(newIdOfAuthor, newNameOfAuthor)) = newNameOfAuthor +} + +channel addAccounts { + out accounts(accounts: Map, addAccounts(id: Str, name: Str)) = insert(accounts, id, {"name": name}) +} + +channel changeNameOfAccounts(id: Str) { + out accounts.{id}.name(name: Str, changeNameOfAccounts(newName: Str)) = newName +} diff --git a/AlgebraicDataflowArchitectureModel/models/SimpleUI5.model b/AlgebraicDataflowArchitectureModel/models/SimpleUI5.model new file mode 100644 index 0000000..6fbe7bc --- /dev/null +++ b/AlgebraicDataflowArchitectureModel/models/SimpleUI5.model @@ -0,0 +1,88 @@ +init { + screenTemplates := { + "000": { + "widgets": { + "001": {"type": "textInput", "text": "", "state": 0, "visible": true}, + "002": {"type": "button", "text": "Next", "state": 0, "visible": true}, + "003": {"type": "table", "text": "", "state": 0, "visible": true, "colName": append(append(nil, "id"), "name"), "rowNum": 0, "source": "basic", "colDatas": nil} + }, + "layout": true + } + } + tmp := -100 +} + +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 ChangeCurScreen { + out curScreen(curScId: Str, changeCurScreen(nextScId)) = nextScId +} + +channel ScreenTransition { + in curScreen(curScId: Str, transScreen(nextScId, screen)) = nextScId + ref screenTemplates.{nextScId}(screen, transScreen(nextScId, screen)) + out screen(curS, transScreen(nextScId, screen)) = screen +} + +channel EventDispatch(wid: Str) { + in screen.widgets.{wid}.state(curState: Int, dispatchEvent(curScId, wid, nextState)) = nextState + ref curScreen(curScId: Str, dispatchEvent(curScId, wid, nextState)) + out screenTemplates.{curScId}.widgets.{wid}.state(curState: Int, dispatchEvent(curScId, wid, nextState)) = nextState +} + +channel EventDispatch2(wid: Str) { + in screen.widgets.{wid}.text(curText: Str, dispatchEvent2(curScId, wid, nextText)) = nextText + ref curScreen(curScId: Str, dispatchEvent2(curScId, wid, nextText)) + out screenTemplates.{curScId}.widgets.{wid}.text(curText: Str, dispatchEvent2(curScId, wid, nextText)) = nextText +} + +channel addBasic { + out basic(basic: Map, addBasic(id: Str, name: Str)) = insert(basic, id, {"name": name}) +} + +channel changeNameOfBasic(id: Str) { + out basic.{id}.name(curName, changeNameOfBasic(nextName)) = nextName +} + +channel tmp(wid: Str) { + in screen.widgets.{wid="002"}.state(curState: Int, tmp(nextState)) = nextState + out tmp(curTmp: Int, tmp(nextState)) = nextState +} \ No newline at end of file diff --git a/AlgebraicDataflowArchitectureModel/src/simulator/interfaces/html/HtmlElementTextReceiver.java b/AlgebraicDataflowArchitectureModel/src/simulator/interfaces/html/HtmlElementTextReceiver.java index 5998a45..024f9fa 100644 --- a/AlgebraicDataflowArchitectureModel/src/simulator/interfaces/html/HtmlElementTextReceiver.java +++ b/AlgebraicDataflowArchitectureModel/src/simulator/interfaces/html/HtmlElementTextReceiver.java @@ -14,8 +14,11 @@ protected HtmlElement element; private final IWebSocketMessageSender ws; - public HtmlElementTextReceiver(HtmlElement elem, IWebSocketMessageSender ws) { + private final String sessionId; + + public HtmlElementTextReceiver(HtmlElement elem, IWebSocketMessageSender ws, String sessionId) { this.ws = ws; + this.sessionId = sessionId; element = elem; } @@ -34,7 +37,7 @@ datas.insert("\"newText\"", new Constant(text.toString())); json.addMember("\"datas\"", datas); - ws.send(json.toString()); + ws.send(json.toString(), sessionId); } } } diff --git a/AlgebraicDataflowArchitectureModel/src/simulator/interfaces/html/HtmlElementVisibilityReceiver.java b/AlgebraicDataflowArchitectureModel/src/simulator/interfaces/html/HtmlElementVisibilityReceiver.java index 3d981e4..06f7859 100644 --- a/AlgebraicDataflowArchitectureModel/src/simulator/interfaces/html/HtmlElementVisibilityReceiver.java +++ b/AlgebraicDataflowArchitectureModel/src/simulator/interfaces/html/HtmlElementVisibilityReceiver.java @@ -15,10 +15,12 @@ protected HtmlElement element; private final IWebSocketMessageSender ws; + private final String sessionId; - public HtmlElementVisibilityReceiver(HtmlElement elem, IWebSocketMessageSender ws){ + public HtmlElementVisibilityReceiver(HtmlElement elem, IWebSocketMessageSender ws, String sessionId){ this.element = elem; this.ws = ws; + this.sessionId = sessionId; } @Override @@ -37,7 +39,7 @@ datas.insert("display", new Constant("none")); json.addMember("datas", datas); - ws.send(json.toString()); + ws.send(json.toString(), sessionId); } else { @@ -50,7 +52,7 @@ datas.insert("display", new Constant("null")); json.addMember("datas", datas); - ws.send(json.toString()); + ws.send(json.toString(), sessionId); } } } diff --git a/AlgebraicDataflowArchitectureModel/src/simulator/interfaces/html/HtmlPresenter.java b/AlgebraicDataflowArchitectureModel/src/simulator/interfaces/html/HtmlPresenter.java index 9b40eff..e1c88ee 100644 --- a/AlgebraicDataflowArchitectureModel/src/simulator/interfaces/html/HtmlPresenter.java +++ b/AlgebraicDataflowArchitectureModel/src/simulator/interfaces/html/HtmlPresenter.java @@ -41,10 +41,13 @@ protected IWebSocketMessageSender ws; + private final String sessionId; + - public HtmlPresenter(Simulator simulator, IWebSocketMessageSender ws, Map elems) { + public HtmlPresenter(Simulator simulator, IWebSocketMessageSender ws, Map elems, String sessionId) { this.simulator = simulator; this.ws = ws; + this.sessionId = sessionId; screenUpdateChannel = (DataTransferChannel) simulator.getModel().getChannel(screenUpdateChannelName); setVisibleChannel = (DataTransferChannel) simulator.getModel().getChannel(setVisibleChannelName); mouseEventChannel = (DataTransferChannel) simulator.getModel().getInputChannel(mouseEventChannelName); @@ -57,15 +60,17 @@ } private void initScreen() { - Expression initScExp = simulator.getCurState().getResource("screen").getState().getValue(); + Expression curScreenExp = simulator.getCurState().getResource("curScreen").getState().getValue(); + System.out.println(curScreenExp); + Expression initScExp = simulator.getCurState().getResource("screenTemplates").getChildrenMap().get(curScreenExp.toString()).getState().getValue(); if (initScExp instanceof JsonTerm) { JsonTerm sendData = new JsonTerm(); - sendData.addMember("\"method\"", new Constant("\"updateHtml\"")); + sendData.addMember("method", new Constant("updateHtml")); JsonTerm sendElements = new JsonTerm(); ListTerm addElements = new ListTerm(); ListTerm delElements = new ListTerm(); - JsonTerm nextSc = (JsonTerm) initScExp; + JsonTerm nextSc = (JsonTerm) (initScExp); Expression newWidgets = nextSc.get("widgets"); if (newWidgets instanceof MapTerm) { @@ -77,10 +82,10 @@ } } - sendElements.addMember("\"add\"", addElements); - sendElements.addMember("\"delete\"", delElements); - sendData.addMember("\"data\"", sendElements); - ws.send(sendData.toString()); + sendElements.addMember("add", addElements); + sendElements.addMember("delete", delElements); + sendData.addMember("data", sendElements); + ws.send(sendData.toString(), sessionId); } } @@ -97,7 +102,7 @@ if (curScExp instanceof JsonTerm && nextScExp instanceof JsonTerm) { JsonTerm sendData = new JsonTerm(); - sendData.addMember("\"method\"", new Constant("\"updateHtml\"")); + sendData.addMember("method", new Constant("updateHtml")); JsonTerm sendElements = new JsonTerm(); ListTerm addElements = new ListTerm(); ListTerm delElements = new ListTerm(); @@ -123,10 +128,10 @@ } } - sendElements.addMember("\"add\"", addElements); - sendElements.addMember("\"delete\"", delElements); - sendData.addMember("\"data\"", sendElements); - ws.send(sendData.toString()); + sendElements.addMember("add", addElements); + sendElements.addMember("delete", delElements); + sendData.addMember("data", sendElements); + ws.send(sendData.toString(), sessionId); } } } @@ -143,13 +148,13 @@ Resource widgetResource = widgetsResource.getChildrenMap().get(newWid); Expression type = widget.get("type"); switch(type.toString()) { - case "\"button\"": + case "button": addButton(widget, newWid, addElements, widgetResource); break; - case "\"label\"": + case "label": addLabel(widget, newWid, addElements, widgetResource); break; - case "\"textInput\"": + case "textInput": addTextInput(widget, newWid, addElements, widgetResource); break; } @@ -168,18 +173,18 @@ HtmlElement button = new HtmlElement("button", wid, text); Set keySet = widget.keySet(); - button.setStyle("\"position\"", "\"absolute\""); + button.setStyle("position", "absolute"); if(keySet.contains("x")) { - button.setStyle("\"left\"", "\"" + widget.get("x") + "px\""); + button.setStyle("left", "" + widget.get("x") + "px"); } if(keySet.contains("y")) { - button.setStyle("\"top\"", "\"" + widget.get("y") + "px\""); + button.setStyle("top", "" + widget.get("y") + "px"); } if(keySet.contains("width")) { - button.setStyle("\"width\"", "\"" + widget.get("width") + "px\""); + button.setStyle("width", "" + widget.get("width") + "px"); } if(keySet.contains("height")) { - button.setStyle("\"height\"", "\"" + widget.get("height") + "px\""); + button.setStyle("height", "" + widget.get("height") + "px"); } //ボタンが押されたり離されたりした時を検知 @@ -187,7 +192,7 @@ button.setRestEventListener(new HtmlElementMouseSender(simulator, mouseEventChannel, resPath, widgetResource)); //ボタンが透明になったことを通知 - HtmlElementVisibilityReceiver nativeVisibilityReceiver = new HtmlElementVisibilityReceiver(button, ws); + HtmlElementVisibilityReceiver nativeVisibilityReceiver = new HtmlElementVisibilityReceiver(button, ws, sessionId); simulator.addNativeReceiver(nativeVisibilityReceiver, setVisibleChannel, widgetResource); Map resources = channelAndResourcesForReceiving.get(setVisibleChannel); if (resources == null) { @@ -197,7 +202,7 @@ resources.put(wid, widgetResource); //ボタンの文字が変わったことを通知 - HtmlElementTextReceiver nativeTextReceiver = new HtmlElementTextReceiver(button, ws); + HtmlElementTextReceiver nativeTextReceiver = new HtmlElementTextReceiver(button, ws, sessionId); simulator.addNativeReceiver(nativeTextReceiver, setTextChannel, widgetResource); resources = channelAndResourcesForReceiving.get(setTextChannel); if (resources == null) { @@ -215,22 +220,22 @@ HtmlElement label = new HtmlElement("label", wid, text); Set keySet = widget.keySet(); - label.setStyle("\"position\"", "\"absolute\""); + label.setStyle("position", "absolute"); if(keySet.contains("x")) { - label.setStyle("\"left\"", "\"" + widget.get("x") + "px\""); + label.setStyle("left", "" + widget.get("x") + "px"); } if(keySet.contains("y")) { - label.setStyle("\"top\"", "\"" + widget.get("y") + "px\""); + label.setStyle("top", "" + widget.get("y") + "px"); } if(keySet.contains("width")) { - label.setStyle("\"width\"", "\"" + widget.get("width") + "px\""); + label.setStyle("width", "" + widget.get("width") + "px"); } if(keySet.contains("height")) { - label.setStyle("\"height\"", "\"" + widget.get("height") + "px\""); + label.setStyle("height", "" + widget.get("height") + "px"); } //ボタンが透明になったことを通知 - HtmlElementVisibilityReceiver nativeVisibilityReceiver = new HtmlElementVisibilityReceiver(label, ws); + HtmlElementVisibilityReceiver nativeVisibilityReceiver = new HtmlElementVisibilityReceiver(label, ws, sessionId); simulator.addNativeReceiver(nativeVisibilityReceiver, setVisibleChannel, widgetResource); Map resources = channelAndResourcesForReceiving.get(setVisibleChannel); if (resources == null) { @@ -240,7 +245,7 @@ resources.put(wid, widgetResource); //ボタンの文字が変わったことを通知 - HtmlElementTextReceiver nativeTextReceiver = new HtmlElementTextReceiver(label, ws); + HtmlElementTextReceiver nativeTextReceiver = new HtmlElementTextReceiver(label, ws, sessionId); simulator.addNativeReceiver(nativeTextReceiver, setTextChannel, widgetResource); resources = channelAndResourcesForReceiving.get(setTextChannel); if (resources == null) { @@ -258,18 +263,18 @@ HtmlElement textInput = new HtmlElement("textInput", wid, text); Set keySet = widget.keySet(); - textInput.setStyle("\"position\"", "\"absolute\""); + textInput.setStyle("position", "absolute"); if(keySet.contains("x")) { - textInput.setStyle("\"left\"", "\"" + widget.get("x") + "px\""); + textInput.setStyle("left", "" + widget.get("x") + "px"); } if(keySet.contains("y")) { - textInput.setStyle("\"top\"", "\"" + widget.get("y") + "px\""); + textInput.setStyle("top", "" + widget.get("y") + "px"); } if(keySet.contains("width")) { - textInput.setStyle("\"width\"", "\"" + widget.get("width") + "px\""); + textInput.setStyle("width", "" + widget.get("width") + "px"); } if(keySet.contains("height")) { - textInput.setStyle("\"height\"", "\"" + widget.get("height") + "px\""); + textInput.setStyle("height", "" + widget.get("height") + "px"); } //文字の変更を検知 @@ -277,7 +282,7 @@ textInput.setRestEventListener(new HtmlElementTextSender(simulator, textEventChannel, resPath, widgetResource)); //ボタンが透明になったことを通知 - HtmlElementVisibilityReceiver nativeVisibilityReceiver = new HtmlElementVisibilityReceiver(textInput, ws); + HtmlElementVisibilityReceiver nativeVisibilityReceiver = new HtmlElementVisibilityReceiver(textInput, ws, sessionId); simulator.addNativeReceiver(nativeVisibilityReceiver, setVisibleChannel, widgetResource); Map resources = channelAndResourcesForReceiving.get(setVisibleChannel); if (resources == null) { @@ -287,7 +292,7 @@ resources.put(wid, widgetResource); //ボタンの文字が変わったことを通知 - HtmlElementTextReceiver nativeTextReceiver = new HtmlElementTextReceiver(textInput, ws); + HtmlElementTextReceiver nativeTextReceiver = new HtmlElementTextReceiver(textInput, ws, sessionId); simulator.addNativeReceiver(nativeTextReceiver, setTextChannel, widgetResource); resources = channelAndResourcesForReceiving.get(setTextChannel); if (resources == null) { diff --git a/AlgebraicDataflowArchitectureModel/src/simulator/interfaces/html/IWebSocketMessageSender.java b/AlgebraicDataflowArchitectureModel/src/simulator/interfaces/html/IWebSocketMessageSender.java index e48fe6b..90873f0 100644 --- a/AlgebraicDataflowArchitectureModel/src/simulator/interfaces/html/IWebSocketMessageSender.java +++ b/AlgebraicDataflowArchitectureModel/src/simulator/interfaces/html/IWebSocketMessageSender.java @@ -2,6 +2,6 @@ public interface IWebSocketMessageSender { - void send(String message); + void send(String message, String sessionId); }