diff --git a/models/Timer.model b/models/Timer.model new file mode 100644 index 0000000..83a66d5 --- /dev/null +++ b/models/Timer.model @@ -0,0 +1,15 @@ +native channel TimersUpdated { + in timers(curTimers: Map, update(curTimers, nextTimers)) = nextTimers +} + +native channel TimerEvent(tid: Str) { + out timers.{tid}.count(count: Long, tick()) = count + 1 +} + +channel StartTimer { + out timers(timers: Map, startTimer(tid: Str, interval: Long)) = insert(timers, tid, {"interval": interval, "count": 0}) +} + +channel ClearTimer { + out timers(timers: Map, clearTimer(tid: Str)) = delete(timers, tid) +} diff --git a/src/main/java/com/example/test/dtram/Dtram.java b/src/main/java/com/example/test/dtram/Dtram.java index bd82f67..b958ae3 100644 --- a/src/main/java/com/example/test/dtram/Dtram.java +++ b/src/main/java/com/example/test/dtram/Dtram.java @@ -8,22 +8,21 @@ import org.springframework.stereotype.Component; +import com.example.test.pojo.Layout; + +import algorithms.TypeInference; import models.algebra.Expression; -import models.algebra.InvalidMessage; -import models.algebra.ParameterizedIdentifierIsFutureWork; -import models.algebra.UnificationFailed; -import models.algebra.ValueUndefined; +import models.algebra.Variable; import models.dataConstraintModel.ChannelMember; import models.dataConstraintModel.JsonTerm; import models.dataConstraintModel.ResourcePath; import models.dataFlowModel.DataTransferChannel; import models.dataFlowModel.DataTransferModel; -import models.dataFlowModel.ResolvingMultipleDefinitionIsFutureWork; import parser.Parser; +import parser.Parser.TokenStream; import parser.exceptions.ExpectedColon; import parser.exceptions.ExpectedRightBracket; import parser.exceptions.WrongJsonExpression; -import simulator.Event; import simulator.Simulator; import simulator.interfaces.html.HtmlElement; import simulator.interfaces.html.HtmlPresenter; @@ -59,30 +58,106 @@ } } + public void constructModel(Layout l) { + 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); + + + + } catch (Exception e) { + // TODO 自動生成された catch ブロック + 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); + } + public void startSimulator() { simulator = new Simulator(model); simulator.init(); presenter = new HtmlPresenter(simulator, ws, elements); System.out.println(simulator.getCurState().getResource("screen.widgets")); - try { - Parser.TokenStream stream = new Parser.TokenStream(); - Parser p = new Parser(stream); - stream.addLine("init(\"\")"); - Expression eventMessage = p.parseTerm(stream, model); - - ResourcePath eventResPath = null; - DataTransferChannel initChannel = (DataTransferChannel) model.getInputChannel("Init"); - for(ChannelMember out: initChannel.getOutputChannelMembers()) { - eventResPath = out.getResource(); - } - Event newEvent = new Event(initChannel, eventMessage, eventResPath, simulator.getCurState().getResource("screen.widgets")); - simulator.transition(newEvent); - - } catch (ExpectedRightBracket | WrongJsonExpression | ExpectedColon | - ParameterizedIdentifierIsFutureWork | ResolvingMultipleDefinitionIsFutureWork | InvalidMessage | UnificationFailed | ValueUndefined e) { - // TODO 自動生成された catch ブロック - e.printStackTrace(); - } } public void onRestEvent(String id, String method, JsonTerm message) { diff --git a/src/main/java/com/example/test/pojo/Element.java b/src/main/java/com/example/test/pojo/Element.java new file mode 100644 index 0000000..a5f70d0 --- /dev/null +++ b/src/main/java/com/example/test/pojo/Element.java @@ -0,0 +1,49 @@ +package com.example.test.pojo; + +import java.util.Map; + +public class Element { + private String type; + private String id; + private String className; + private String text; + private Map style; + private Map bounds; + Element(){} + public String getType() { + return type; + } + public void setType(String type) { + this.type = type; + } + public String getId() { + return id; + } + public void setId(String id) { + this.id = id; + } + public String getClassName() { + return className; + } + public void setClassName(String className) { + this.className = className; + } + public String getText() { + return text; + } + public void setText(String text) { + this.text = text; + } + public Map getStyle() { + return style; + } + public void setStyle(Map style) { + this.style = style; + } + public Map getBounds() { + return bounds; + } + public void setBounds(Map bounds) { + this.bounds = bounds; + } +} \ No newline at end of file diff --git a/src/main/java/com/example/test/pojo/Layout.java b/src/main/java/com/example/test/pojo/Layout.java new file mode 100644 index 0000000..8057ee3 --- /dev/null +++ b/src/main/java/com/example/test/pojo/Layout.java @@ -0,0 +1,14 @@ +package com.example.test.pojo; + +import java.util.List; + +public class Layout { + private List elements; + Layout(){} + public void setElements(List elems) { + elements = elems; + } + public List getElements(){ + return elements; + } +} diff --git a/src/main/java/com/example/test/rest_controllers/OpenModelController.java b/src/main/java/com/example/test/rest_controllers/OpenModelController.java index f15e62c..5c83f16 100644 --- a/src/main/java/com/example/test/rest_controllers/OpenModelController.java +++ b/src/main/java/com/example/test/rest_controllers/OpenModelController.java @@ -1,10 +1,12 @@ package com.example.test.rest_controllers; import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.RestController; +import com.example.test.pojo.Layout; import com.example.test.services.ModelHandleService; @RestController @@ -22,4 +24,14 @@ modelService.openModel(path); } + @PostMapping("/layout_json") + public void layoutJson(@RequestBody Layout l) { + modelService.loadLayout(l); + } + + } + + + + diff --git a/src/main/java/com/example/test/services/ModelHandleService.java b/src/main/java/com/example/test/services/ModelHandleService.java index 4ef8ee8..b073757 100644 --- a/src/main/java/com/example/test/services/ModelHandleService.java +++ b/src/main/java/com/example/test/services/ModelHandleService.java @@ -3,6 +3,7 @@ import org.springframework.stereotype.Service; import com.example.test.dtram.Dtram; +import com.example.test.pojo.Layout; @Service public class ModelHandleService { @@ -18,4 +19,9 @@ dtram.startSimulator(); } + public void loadLayout(Layout l) { + dtram.constructModel(l); + dtram.startSimulator(); + } + }