diff --git a/AlgebraicDataflowArchitectureModel/src/application/editor/Editor.java b/AlgebraicDataflowArchitectureModel/src/application/editor/Editor.java index d5ca291..a9f4355 100644 --- a/AlgebraicDataflowArchitectureModel/src/application/editor/Editor.java +++ b/AlgebraicDataflowArchitectureModel/src/application/editor/Editor.java @@ -797,9 +797,11 @@ Map>> dependency = ch.fillOutsideResourcePaths(ch.getOutputChannelMembers().iterator().next(), JavaCodeGenerator.pullAccessor); for (ChannelMember srcMem: dependency.keySet()) { ResourceNode srcNode = dataFlowGraph.getResourceNode(srcMem.getResource()); - for (ChannelMember dstMem: dependency.get(srcMem).getValue()) { - ResourceNode dstNode = dataFlowGraph.getResourceNode(dstMem.getResource()); - resourceDpendency.add(new AbstractMap.SimpleEntry<>(srcNode, dstNode)); + if (srcNode != null) { + for (ChannelMember dstMem: dependency.get(srcMem).getValue()) { + ResourceNode dstNode = dataFlowGraph.getResourceNode(dstMem.getResource()); + resourceDpendency.add(new AbstractMap.SimpleEntry<>(srcNode, dstNode)); + } } } } catch (ParameterizedIdentifierIsFutureWork | ResolvingMultipleDefinitionIsFutureWork | InvalidMessage diff --git a/AlgebraicDataflowArchitectureModel/src/models/dataFlowModel/DataTransferModel.java b/AlgebraicDataflowArchitectureModel/src/models/dataFlowModel/DataTransferModel.java index 8bef89f..3bf7c9e 100644 --- a/AlgebraicDataflowArchitectureModel/src/models/dataFlowModel/DataTransferModel.java +++ b/AlgebraicDataflowArchitectureModel/src/models/dataFlowModel/DataTransferModel.java @@ -71,44 +71,79 @@ ChannelNode srcChannelNode = dataFlowGraph.addChannelNode(parentChannelNode, srcDfChannel); for (ResourcePath dstRes: srcDfChannel.getOutputResources()) { Map> chToNodes = resourceMap.get(dstRes.getResourceHierarchy()); // ResourceNodes that have the same ResourceHierarchy. + Set dstResSet = new HashSet<>(); if (dstRes.getNumberOfParameters() == 0) { // ResourcePath without parameter corresponds to a global ResourceNode. if (chToNodes == null) { + // Create a new global ResourceNode. ResourceNode dstResNode = addResourceNodes(dataFlowGraph, dstRes, null, resourceMap); + dstResSet.add(dstResNode); + } else { + // Select global ResourceNodes. + dstResSet.addAll(chToNodes.get(null)); } } else { if (chToNodes == null) { - // There is no ResourcePath. + // There is no corresponding ResourceNode. + // Create new ResourceNode. ResourceNode dstResNode = addResourceNodes(dataFlowGraph, dstRes, srcDfChannel, resourceMap); + dstResSet.add(dstResNode); } else { // There already has been a ResourceNode. - boolean bExists = false; - for (Set nodes: chToNodes.values()) { - for (ResourceNode node: nodes) { - for (ResourcePath res: node.getInSideResources()) { - if (res.toString().equals(dstRes.toString())) { - bExists = true; - break; + if (chToNodes.get(srcDfChannel) != null && chToNodes.get(srcDfChannel).size() > 0) { + // There already has been a channel-local ResourceNode. + for (ResourceNode localResNode: chToNodes.get(srcDfChannel)) { + for (ResourcePath localResPath: localResNode.getInSideResources()) { + if (localResPath.toString().equals(dstRes.toString())) { + // Channel-local ResourcePath should be identical, and the identical ResourcePath is selected on top priority. + dstResSet.add(localResNode); } } - if (bExists) break; - if (node.getOutSideResource() != null && node.getOutSideResource().toString().equals(dstRes.toString())) { - bExists = true; - break; - } } - if (bExists) break; } - if (!bExists) { + // Search a common channel-local ancestor. + if (dstResSet.size() == 0) { + ResourcePath dstParent = dstRes.getParent(); + while (dstParent != null && dstParent.getNumberOfParameters() > 0) { + if (resourceMap.get(dstParent.getResourceHierarchy()) != null && resourceMap.get(dstParent.getResourceHierarchy()).get(srcDfChannel) != null) { + for (ResourceNode localParentNode: resourceMap.get(dstParent.getResourceHierarchy()).get(srcDfChannel)) { + if (localParentNode.getOutSideResource().toString().equals(dstParent.toString())) { + // There already has been a common channel-local ancestor. + ResourceNode dstResNode = addResourceNodes(dataFlowGraph, dstRes, srcDfChannel, resourceMap); + dstResSet.add(dstResNode); + break; + } + for (ResourcePath localParentPath: localParentNode.getInSideResources()) { + if (localParentPath.toString().equals(dstParent.toString())) { + // There already has been a common channel-local ancestor. + ResourceNode dstResNode = addResourceNodes(dataFlowGraph, dstRes, srcDfChannel, resourceMap); + dstResSet.add(dstResNode); + break; + } + } + if (dstResSet.size() > 0) break; + } + if (dstResSet.size() > 0) break; + } + dstParent = dstParent.getParent(); + } + } + if (dstResSet.size() == 0) { + for (Set nodes: chToNodes.values()) { + // Select all corresponding ResourceNodes. + dstResSet.addAll(nodes); + } + } + if (dstResSet.size() == 0) { + // Otherwise create a new ResourceNode. ResourceNode dstResNode = addResourceNodes(dataFlowGraph, dstRes, srcDfChannel, resourceMap); + dstResSet.add(dstResNode); } } } - for (Set dstResSet: resourceMap.get(dstRes.getResourceHierarchy()).values()) { - for (ResourceNode dstResNode: dstResSet) { - dstResNode.addInSideResource(srcDfChannel, dstRes); - dataFlowGraph.addEdge(srcChannelNode, dstResNode); // Connect to each ResourceNode that has the same ResourceHierarchy. - } + for (ResourceNode dstResNode: dstResSet) { + dstResNode.addInSideResource(srcDfChannel, dstRes); + dataFlowGraph.addEdge(srcChannelNode, dstResNode); // Connect to each ResourceNode that has the same ResourceHierarchy. } } for (Channel childChannel: srcDfChannel.getChildren()) { @@ -116,40 +151,41 @@ } } - private ResourceNode addResourceNodes(DataFlowGraph dataFlowGraph, ResourcePath resPath, DataTransferChannel dfChannel, + private ResourceNode addResourceNodes(DataFlowGraph dataFlowGraph, ResourcePath resPath, DataTransferChannel dfChannel, Map>> resourceMap) { ResourceNode resNode = null; + if (resPath.getNumberOfParameters() == 0) { + dfChannel = null; + } if (resPath.getParent() == null) { resNode = dataFlowGraph.addResourceNode(null, dfChannel, resPath); } else { - // Search a parent ResourceNode that does not have resPath as its child. + // Search an identical parent ResourceNode. ResourceNode parent = null; + DataTransferChannel parentDfChannel = dfChannel; + if (resPath.getParent().getNumberOfParameters() == 0) { + parentDfChannel = null; + } if (resourceMap.get(resPath.getResourceHierarchy().getParent()) != null) { - for (Set nodes: resourceMap.get(resPath.getResourceHierarchy().getParent()).values()) { + Set nodes = resourceMap.get(resPath.getResourceHierarchy().getParent()).get(parentDfChannel); + if (nodes != null) { for (ResourceNode node: nodes) { - // For each node, every child should be unique. - if (resPath.getResourceHierarchy().getNumParameters() > 0) { - // Children that have parameters are distinguished. + if (node.getOutSideResource().toString().equals(resPath.getParent().toString())) { parent = node; break; } - boolean bExists = false; - for (ResourceNode child: node.getChildren()) { - if (child.getResourceHierarchy().getResourceName().equals(resPath.getResourceHierarchy().getResourceName())) { - bExists = true; // node already has resPath as its child. + for (ResourcePath r: node.getInSideResources()) { + if (r.toString().equals(resPath.getParent().toString())) { + parent = node; break; } } - if (!bExists) { - parent = node; - break; - } + if (parent != null) break; } - if (parent != null) break; } } if (parent == null) { - parent = addResourceNodes(dataFlowGraph, resPath.getParent(), dfChannel, resourceMap); + parent = addResourceNodes(dataFlowGraph, resPath.getParent(), parentDfChannel, resourceMap); } resNode = dataFlowGraph.addResourceNode(parent, dfChannel, resPath); }