diff --git a/AlgebraicDataflowArchitectureModel/src/simulator/ChannelState.java b/AlgebraicDataflowArchitectureModel/src/simulator/ChannelState.java index 1fdc906..9fd4993 100644 --- a/AlgebraicDataflowArchitectureModel/src/simulator/ChannelState.java +++ b/AlgebraicDataflowArchitectureModel/src/simulator/ChannelState.java @@ -75,16 +75,18 @@ public List> getDependedChannelSelectorValues(Map dependingVarToVal) { List> channelValuesList = new ArrayList<>(); if (dependingParamAndValues != null) { - boolean isMatch = true; + boolean doesMatch = true; for (Expression dependingVariable: dependingVarToVal.keySet()) { if (dependingParamAndValues.keySet().contains(dependingVariable)) { if (!dependingParamAndValues.get(dependingVariable).equals(dependingVarToVal.get(dependingVariable))) { - isMatch = false; + doesMatch = false; } } } - if (isMatch) { - return new ArrayList<>(); + if (doesMatch) { + List> chValsList = new ArrayList<>(); + chValsList.add(new ArrayList<>()); + return chValsList; } else { return null; } diff --git a/AlgebraicDataflowArchitectureModel/src/simulator/Event.java b/AlgebraicDataflowArchitectureModel/src/simulator/Event.java index dcffc1a..13df0a0 100644 --- a/AlgebraicDataflowArchitectureModel/src/simulator/Event.java +++ b/AlgebraicDataflowArchitectureModel/src/simulator/Event.java @@ -44,14 +44,6 @@ // Extract channel parameters from the output resource. List channelSelectors = channel.getAllSelectors(); -// Set outputResPathSet = null; -// for (Selector sel: channelSelectors) { -// if (outputResPathSet == null) { -// outputResPathSet = channelSelectorToOutputResourcePathParam.get(sel).keySet(); -// } else { -// outputResPathSet.retainAll(channelSelectorToOutputResourcePathParam.get(sel).keySet()); -// } -// } for (Selector sel: channelSelectors) { int paramIdx = channelSelectorToOutputResourcePathParam.get(sel).get(outputResPath); Resource ancestor = outputResource; @@ -94,6 +86,22 @@ } } } + + public Event(DataTransferChannel channel, ResourcePath inputResPath, Resource inputResource, List channelSelectorValues, Map dependingVarToVal) { + this.channel = channel; + this.isInput = false; + this.inputResourcePath = inputResPath; + this.inputResources.add(inputResource); + connectChannelSelectorAndPathParameters(); + + // Extract channel parameters from the input resource. + List channelSelectors = channel.getAllSelectors(); + for (int i = 0; i < channelSelectors.size(); i++) { + Selector sel = channelSelectors.get(i); + channelSelectorAndValues.add(new AbstractMap.SimpleEntry<>(sel, channelSelectorValues.get(i))); + } + this.dependingParameters = dependingVarToVal; + } private void connectChannelSelectorAndPathParameters() { List channelSelectors = channel.getAllSelectors(); @@ -305,16 +313,22 @@ ResourceIdentifier resId = ResourceIdentifier.createFrom(resPath); for (Map.Entry chParamEnt: channelSelectorAndValues) { Selector sel = chParamEnt.getKey(); - Integer paramIdx = channelSelectorToInputResourcePathParam.get(sel).get(resPath); - if (paramIdx != null) { - resId.setPathParam(paramIdx, chParamEnt.getValue()); + Map inputPathParamEnt = channelSelectorToInputResourcePathParam.get(sel); + if (inputPathParamEnt != null) { + Integer paramIdx = inputPathParamEnt.get(resPath); + if (paramIdx != null) { + resId.setPathParam(paramIdx, chParamEnt.getValue()); + } } } for (Map.Entry chParamEnt: channelSelectorAndValues) { Selector sel = chParamEnt.getKey(); - Integer paramIdx = channelSelectorToOutputResourcePathParam.get(sel).get(resPath); - if (paramIdx != null) { - resId.setPathParam(paramIdx, chParamEnt.getValue()); + Map outputPathParamEnt = channelSelectorToOutputResourcePathParam.get(sel); + if (outputPathParamEnt != null) { + Integer paramIdx = outputPathParamEnt.get(resPath); + if (paramIdx != null) { + resId.setPathParam(paramIdx, chParamEnt.getValue()); + } } } for (Expression var: dependingParameters.keySet()) { diff --git a/AlgebraicDataflowArchitectureModel/src/simulator/Simulator.java b/AlgebraicDataflowArchitectureModel/src/simulator/Simulator.java index 1987099..0438833 100644 --- a/AlgebraicDataflowArchitectureModel/src/simulator/Simulator.java +++ b/AlgebraicDataflowArchitectureModel/src/simulator/Simulator.java @@ -227,8 +227,8 @@ } } if (doesMatch) { - Event nextEvent = new Event(channel, inResPath, nextSystemState.getResource(inResId)); - nextEvent.updateChannelSelectorValues(channelSelectorValues); + Event nextEvent = new Event(channel, inResPath, nextSystemState.getResource(inResId), channelSelectorValues, dependingVarToVal); + nextEvents.add(nextEvent); } } } diff --git a/AlgebraicDataflowArchitectureModel/src/tests/SimulatorTest.java b/AlgebraicDataflowArchitectureModel/src/tests/SimulatorTest.java index b6988f9..cbac9dc 100644 --- a/AlgebraicDataflowArchitectureModel/src/tests/SimulatorTest.java +++ b/AlgebraicDataflowArchitectureModel/src/tests/SimulatorTest.java @@ -11,6 +11,7 @@ import models.algebra.UnificationFailed; import models.algebra.ValueUndefined; import models.algebra.Variable; +import models.algebra.Constant; import models.dataConstraintModel.ChannelMember; import models.dataConstraintModel.DataConstraintModel; import models.dataConstraintModel.ResourcePath; @@ -51,6 +52,9 @@ ResourcePath company2 = new ResourcePath(companies, new Variable("cid2", DataConstraintModel.typeString)); // "companies.{cid2}" ResourcePath company2_add = new ResourcePath(company2, "add"); // "companies.{cid2}.add" + ResourcePath companyA = new ResourcePath(companies, + new Constant("\"A\"", DataConstraintModel.typeString)); // "companies.A" + ResourcePath companyA_add = new ResourcePath(companyA, "add"); // "companies.{cid2}.add" model.addResourcePath(customer_off); model.addResourcePath(customer_add); model.addResourcePath(company_add); @@ -89,49 +93,67 @@ // For channel CIO_SetCustomerOff DataTransferChannel cio_setCustomerOff = new DataTransferChannel("CIO_SetCustomerOff", new Variable("uid")); // set customer's office ChannelMember customer_off_1 = new ChannelMember(customer_off); + stream.addLine("cid:Str"); + Expression curStateExp2 = parser.parseTerm(stream, model); + customer_off_1.getStateTransition().setCurStateExpression(curStateExp2); + stream.addLine("setOff(cid2:Str)"); + Expression messageExp2 = parser.parseTerm(stream, model); + customer_off_1.getStateTransition().setMessageExpression(messageExp2); + stream.addLine("cid2"); + Expression nextStateExp2 = parser.parseTerm(stream, model); + customer_off_1.getStateTransition().setNextStateExpression(nextStateExp2); cio_setCustomerOff.addChannelMemberAsOutput(customer_off_1); // For channel CIO_SetCompanyAdd DataTransferChannel cio_setCompanyAdd = new DataTransferChannel("CIO_SetCompanyAdd", new Variable("cid")); // set companie's address ChannelMember company_add_1 = new ChannelMember(company_add); + stream.addLine("a1:Str"); + Expression curStateExp3 = parser.parseTerm(stream, model); + company_add_1.getStateTransition().setCurStateExpression(curStateExp3); + stream.addLine("setAdd(a2:Str)"); + Expression messageExp3 = parser.parseTerm(stream, model); + company_add_1.getStateTransition().setMessageExpression(messageExp3); + stream.addLine("a2"); + Expression nextStateExp3 = parser.parseTerm(stream, model); + company_add_1.getStateTransition().setNextStateExpression(nextStateExp3); cio_setCompanyAdd.addChannelMemberAsOutput(company_add_1); // For channel C DataTransferChannel c = new DataTransferChannel("C", new Variable("uid")); // update customer's address ChannelMember customer_off_2 = new ChannelMember(customer_off); stream.addLine("cid:Str"); - Expression curStateExp2 = parser.parseTerm(stream, model); - customer_off_2.getStateTransition().setCurStateExpression(curStateExp2); + Expression curStateExp4 = parser.parseTerm(stream, model); + customer_off_2.getStateTransition().setCurStateExpression(curStateExp4); stream.addLine("sync(cid2:Str, add2:Str)"); - Expression messageExp2 = parser.parseTerm(stream, model); - customer_off_2.getStateTransition().setMessageExpression(messageExp2); + Expression messageExp4 = parser.parseTerm(stream, model); + customer_off_2.getStateTransition().setMessageExpression(messageExp4); stream.addLine("cid2"); - Expression nextStateExp2 = parser.parseTerm(stream, model); - customer_off_2.getStateTransition().setNextStateExpression(nextStateExp2); + Expression nextStateExp4 = parser.parseTerm(stream, model); + customer_off_2.getStateTransition().setNextStateExpression(nextStateExp4); c.addChannelMemberAsInput(customer_off_2); ChannelMember company_add_2 = new ChannelMember(company2_add); stream.addLine("a1:Str"); - Expression curStateExp3 = parser.parseTerm(stream, model); - company_add_2.getStateTransition().setCurStateExpression(curStateExp3); + Expression curStateExp5 = parser.parseTerm(stream, model); + company_add_2.getStateTransition().setCurStateExpression(curStateExp5); stream.addLine("sync(cid2:Str, add2:Str)"); - Expression messageExp3 = parser.parseTerm(stream, model); - company_add_2.getStateTransition().setMessageExpression(messageExp3); + Expression messageExp5 = parser.parseTerm(stream, model); + company_add_2.getStateTransition().setMessageExpression(messageExp5); stream.addLine("add2"); - Expression nextStateExp3 = parser.parseTerm(stream, model); - company_add_2.getStateTransition().setNextStateExpression(nextStateExp3); + Expression nextStateExp5 = parser.parseTerm(stream, model); + company_add_2.getStateTransition().setNextStateExpression(nextStateExp5); c.addChannelMemberAsInput(company_add_2); ChannelMember customer_add_2 = new ChannelMember(customer_add); stream.addLine("a3:Str"); - Expression curStateExp4 = parser.parseTerm(stream, model); - customer_add_2.getStateTransition().setCurStateExpression(curStateExp4); + Expression curStateExp6 = parser.parseTerm(stream, model); + customer_add_2.getStateTransition().setCurStateExpression(curStateExp6); stream.addLine("sync(cid2:Str, add2:Str)"); - Expression messageExp4 = parser.parseTerm(stream, model); - customer_add_2.getStateTransition().setMessageExpression(messageExp4); + Expression messageExp6 = parser.parseTerm(stream, model); + customer_add_2.getStateTransition().setMessageExpression(messageExp6); stream.addLine("add2"); - Expression nextStateExp4 = parser.parseTerm(stream, model); - customer_add_2.getStateTransition().setNextStateExpression(nextStateExp4); + Expression nextStateExp6 = parser.parseTerm(stream, model); + customer_add_2.getStateTransition().setNextStateExpression(nextStateExp6); c.addChannelMemberAsOutput(customer_add_2); model.addIOChannel(cio_setCustomerOff); @@ -152,7 +174,7 @@ System.out.println("companies:" + initialState.getResource(ResourceIdentifier.createFrom(companies)).getState().getValue()); System.out.println("customers:" + initialState.getResource(ResourceIdentifier.createFrom(customers)).getState().getValue()); - // Next state + // Next state (companies.addCompany("A", "Osaka")) stream.addLine("addCompany(\"A\", \"Osaka\")"); Expression messageAddComp = parser.parseTerm(stream, model); Event addCompany = new Event(cio_addCompany, messageAddComp, companies, initialState.getResource(ResourceIdentifier.createFrom(companies))); @@ -167,7 +189,7 @@ System.out.println("companies:" + nextState.getResource(ResourceIdentifier.createFrom(companies)).getState().getValue()); System.out.println("customers:" + nextState.getResource(ResourceIdentifier.createFrom(customers)).getState().getValue()); - // After the next state + // After the next state (customers.addCustomer("1", "A")) stream.addLine("addCustomer(\"1\", \"A\")"); Expression messageAddCust = parser.parseTerm(stream, model); Event addCustomer = new Event(cio_addCustomer, messageAddCust, customers, nextState.getResource(ResourceIdentifier.createFrom(customers))); @@ -182,6 +204,19 @@ System.out.println("companies:" + nextNextState.getResource(ResourceIdentifier.createFrom(companies)).getState().getValue()); System.out.println("customers:" + nextNextState.getResource(ResourceIdentifier.createFrom(customers)).getState().getValue()); + // After the next next state (companies.A.setAdd("Tokyo")) + stream.addLine("setAdd(\"Tokyo\")"); + Expression messageSetAdd = parser.parseTerm(stream, model); + Event setAdd = new Event(cio_setCompanyAdd, messageSetAdd, company_add, nextNextState.getResource(ResourceIdentifier.createFrom(companyA_add))); + simulator.transition(setAdd); + SystemState nextNextNextState = simulator.getCurState(); + Resource customersRes2 = nextNextNextState.getResource(ResourceIdentifier.createFrom(customers)); + assertTrue(customersRes2.getState() instanceof MapResourceState); + assertEquals(1, customersRes2.getChildren().size()); + assertEquals(1, ((MapResourceState) customersRes2.getState()).getChildStates().size()); + System.out.println("companies:" + nextNextNextState.getResource(ResourceIdentifier.createFrom(companies)).getState().getValue()); + System.out.println("customers:" + nextNextNextState.getResource(ResourceIdentifier.createFrom(customers)).getState().getValue()); + } catch (ExpectedRightBracket | WrongJsonExpression | ExpectedColon | ParameterizedIdentifierIsFutureWork | ResolvingMultipleDefinitionIsFutureWork | InvalidMessage | UnificationFailed | ValueUndefined e) { e.printStackTrace(); }