diff --git a/AlgebraicDataflowArchitectureModel/src/algorithm/DerivingStorageResources.java b/AlgebraicDataflowArchitectureModel/src/algorithm/DerivingStorageResources.java index 70f2248..0ae7a19 100644 --- a/AlgebraicDataflowArchitectureModel/src/algorithm/DerivingStorageResources.java +++ b/AlgebraicDataflowArchitectureModel/src/algorithm/DerivingStorageResources.java @@ -1,5 +1,9 @@ package algorithm; -public class DerivingStorageResources { +import models.dataFlowModel.DataFlowModel; +public class DerivingStorageResources { + public void run(DataFlowModel model) { + + } } diff --git a/AlgebraicDataflowArchitectureModel/src/algorithm/UpdateConflictCheck.java b/AlgebraicDataflowArchitectureModel/src/algorithm/UpdateConflictCheck.java index 4e5db4f..080ec7b 100644 --- a/AlgebraicDataflowArchitectureModel/src/algorithm/UpdateConflictCheck.java +++ b/AlgebraicDataflowArchitectureModel/src/algorithm/UpdateConflictCheck.java @@ -4,6 +4,7 @@ import models.*; import models.dataConstraintModel.ChannelGenerator; +import models.dataConstraintModel.ChannelMember; import models.dataConstraintModel.IdentifierTemplate; import models.dataFlowModel.DataFlowModel; import models.dataFlowModel.DataflowChannelGenerator; @@ -58,6 +59,7 @@ public boolean run(DataFlowModel model) { init(); + boolean check = true; for (Node node : model.getResourceDependencyGraph().getNodes()) { if (ids.containsKey(node)) { strongconnect(node); @@ -66,8 +68,14 @@ System.out.println(strong.size() + " " +model.getResourceDependencyGraph().getNodes().size()); for(ChannelGenerator cg:model.getChannelGenerators()) { DataflowChannelGenerator data = (DataflowChannelGenerator)cg; - + for(ChannelMember channel:data.getChannelMembers()) { + for(ChannelMember another:data.getChannelMembers()) { + if(!channel.equals(another)) { + check = channel.getIdentifierTemplate() != another.getIdentifierTemplate(); + } + } + } } - return strong.size() == 0; + return strong.size() == 0 && check; } } diff --git a/AlgebraicDataflowArchitectureModel/src/tests/DerivingStorageResourcesTest.java b/AlgebraicDataflowArchitectureModel/src/tests/DerivingStorageResourcesTest.java new file mode 100644 index 0000000..15e00e8 --- /dev/null +++ b/AlgebraicDataflowArchitectureModel/src/tests/DerivingStorageResourcesTest.java @@ -0,0 +1,101 @@ +package tests; + +import static org.junit.Assert.assertEquals; + +import org.junit.Test; + +import algorithm.DerivingStorageResources; +import models.Edge; +import models.dataConstraintModel.ChannelMember; +import models.dataConstraintModel.ChannelSelector; +import models.dataConstraintModel.GroupSelector; +import models.dataConstraintModel.IdentifierTemplate; +import models.dataFlowModel.DataFlowModel; +import models.dataFlowModel.DataflowChannelGenerator; +import models.dataFlowModel.ResourceDependencyGraph; + +public class DerivingStorageResourcesTest { + @Test + public void test() { + // Construct a data-flow architecture model. + DataFlowModel model = new DataFlowModel(); + IdentifierTemplate customer_off = new IdentifierTemplate("customers.{customer_id}.off", 1); // an identifier template to specify a customer's + // office resource + IdentifierTemplate company_add = new IdentifierTemplate("companies.{company_id}.add", 1); // an identifier template to specify a companie's + // address resource + IdentifierTemplate customer_add = new IdentifierTemplate("customers.{customer_id}.add", 1); // an identifier template to specify a customer's + // address resource + + // === gin_1 === + // + // {x1}.customer_off(c, set(x)) = x + // {x1}.customer_off(c, e) = c + // + DataflowChannelGenerator gin_1 = new DataflowChannelGenerator("gin_1"); // set customer's office (an input channel) + GroupSelector x1 = new GroupSelector(); + ChannelMember customer_off_1 = new ChannelMember(customer_off); + customer_off_1.addSelector(x1); // x1 is determined by the path parameter in customer's office template, and + // serves as a group selector in this channel + gin_1.addChannelMember(customer_off_1); + assertEquals(customer_off.getNumberOfParameters(), customer_off_1.getSelectors().size()); + + // === gin_2 === + // + // {x2}.company_add(a, set(y)) = y + // {x2}.company_add(a, e) = a + // + DataflowChannelGenerator gin_2 = new DataflowChannelGenerator("gin_2"); // set companie's address (an input channel) + GroupSelector x2 = new GroupSelector(); + ChannelMember company_add_1 = new ChannelMember(company_add); + company_add_1.addSelector(x2); // x2 is determined by the path parameter in companie's address template, and + // serves as a group selector in this channel + gin_2.addChannelMember(company_add_1); + assertEquals(company_add.getNumberOfParameters(), company_add_1.getSelectors().size()); + + // === g === + // + // {x3}.customer_off( c, update(y, z)) = y + // {y}.company_add( a1, update(y, z)) = z + // {x3}.customer_add(a2, update(y, z)) = z + // + DataflowChannelGenerator g = new DataflowChannelGenerator("g"); // update customer's address + GroupSelector x3 = new GroupSelector(); + ChannelSelector y = new ChannelSelector(); + ChannelMember customer_off_2 = new ChannelMember(customer_off); + ChannelMember company_add_2 = new ChannelMember(company_add); + ChannelMember customer_add_2 = new ChannelMember(customer_add); + customer_off_2.addSelector(x3); // x3 is determined by the path parameter in customer's office template, and + // serves as a group selector in this channel + company_add_2.addSelector(y); // y is determined by the value of the customer's office resource, and serves as + // a channel selector in this channel + customer_add_2.addSelector(x3); // x3 determines the path parameter in customer's address template to update + g.addChannelMemberAsInput(customer_off_2); + g.addChannelMemberAsInput(customer_add_2); + g.addChannelMemberAsOutput(company_add_2); + assertEquals(customer_off.getNumberOfParameters(), customer_off_2.getSelectors().size()); + assertEquals(customer_add.getNumberOfParameters(), customer_add_2.getSelectors().size()); + assertEquals(company_add.getNumberOfParameters(), company_add_2.getSelectors().size()); + + // Construct a data-flow architecture model. + model.addIOChannelGenerator(gin_1); + model.addIOChannelGenerator(gin_2); + model.addChannelGenerator(g); + + // Check the model. + assertEquals(3, model.getIdentifierTemplates().size()); + assertEquals(2, model.getIOChannelGenerators().size()); + assertEquals(1, model.getChannelGenerators().size()); + + // Extract the resource dependency graph. + ResourceDependencyGraph resourceDependencyGraph = model.getResourceDependencyGraph(); + + // Check the graph. + assertEquals(3, resourceDependencyGraph.getNodes().size()); + assertEquals(2, resourceDependencyGraph.getEdges().size()); + for (Edge e : resourceDependencyGraph.getEdges()) { + System.out.println(e.getSource() + "->" + e.getDestination()); + } + DerivingStorageResources storage = new DerivingStorageResources(); + storage.run(model); + } +}