diff --git a/AlgebraicDataflowArchitectureModel/prototypes/Java/GroupChat/PULL-first/Account.java b/AlgebraicDataflowArchitectureModel/prototypes/Java/GroupChat/PULL-first/Account.java index f3b44a8..6aa36f4 100644 --- a/AlgebraicDataflowArchitectureModel/prototypes/Java/GroupChat/PULL-first/Account.java +++ b/AlgebraicDataflowArchitectureModel/prototypes/Java/GroupChat/PULL-first/Account.java @@ -3,9 +3,9 @@ public class Account { private Map notifications; public Map getValue() { - Map temp_nil1 = new HashMap<>(); - temp_nil1.put("notifications",this.getNotifications()); - return temp_nil1; + Map temp_nil5 = new HashMap<>(); + temp_nil5.put("notifications",this.getNotifications()); + return temp_nil5; } public Map getNotifications() { return new HashMap<>(notifications); diff --git a/AlgebraicDataflowArchitectureModel/prototypes/Java/GroupChat/PULL-first/Group.java b/AlgebraicDataflowArchitectureModel/prototypes/Java/GroupChat/PULL-first/Group.java index 0a7a638..7a9159a 100644 --- a/AlgebraicDataflowArchitectureModel/prototypes/Java/GroupChat/PULL-first/Group.java +++ b/AlgebraicDataflowArchitectureModel/prototypes/Java/GroupChat/PULL-first/Group.java @@ -1,29 +1,29 @@ import java.util.*; public class Group { + private List members; private List messages; private Account account; private Accounts accounts; - private List members; public Map getValue() { - Map temp_nil0 = new HashMap<>(); - temp_nil0.put("members",this.getMembers()); - temp_nil0.put("messages",this.getMessages()); - return temp_nil0; - } - public List getMessages() { - return this.messages; + Map temp_nil4 = new HashMap<>(); + temp_nil4.put("messages",this.getMessages()); + temp_nil4.put("members",this.getMembers()); + return temp_nil4; } public List getMembers() { return this.members; } + public List getMessages() { + return this.messages; + } public String getMember(int mno) { return this.members.get(mno); } public void postMessage(String gid, String message) { this.messages.add(message); for (int mno = 0; mno < this.members.size(); mno++) { - String member = this.groups.getGroup(gid).getMember(mno); + String member = getMember(mno); this.account = accounts.getAccount(member); this.account.updateNotificationsFromMessages(gid, mno, messages, member); } @@ -31,9 +31,9 @@ public void addGroupMember(String gid, String aid) { this.members.add(aid); } - public Group(List messages, Accounts accounts, List members) { + public Group(List members, List messages, Accounts accounts) { + this.members = members; this.messages = messages; this.accounts = accounts; - this.members = members; } } \ No newline at end of file diff --git a/AlgebraicDataflowArchitectureModel/prototypes/Java/GroupChat/PULL-first/GroupChat.java b/AlgebraicDataflowArchitectureModel/prototypes/Java/GroupChat/PULL-first/GroupChat.java index c61b0f9..201f338 100644 --- a/AlgebraicDataflowArchitectureModel/prototypes/Java/GroupChat/PULL-first/GroupChat.java +++ b/AlgebraicDataflowArchitectureModel/prototypes/Java/GroupChat/PULL-first/GroupChat.java @@ -7,33 +7,33 @@ accounts = new Accounts(); groups = new Groups(); } + public List getMembers(String gid) { + return this.groups.getGroup(gid).getMembers(); + } + public void addGroupMember(String gid, String aid) { + this.groups.getGroup(gid).addGroupMember(gid, aid); + } public Map getNotifications(String v1) { return this.accounts.getAccount(m.get(mno)).getNotifications(); } public void hasRead(String aid, String gid) { this.accounts.getAccount(aid).hasRead(aid, gid); } + public Map getGroup(String gid) { + return this.groups.getGroup(gid).getValue(); + } public List getMessages(String gid) { return this.groups.getGroup(gid).getMessages(); } public void postMessage(String gid, String message) { this.groups.getGroup(gid).postMessage(gid, message); } - public List getMembers(String gid) { - return this.groups.getGroup(gid).getMembers(); - } - public void addGroupMember(String gid, String aid) { - this.groups.getGroup(gid).addGroupMember(gid, aid); - } public Map getAccounts() { return this.accounts.getValue(); } public void signUp(String aid) { this.accounts.signUp(aid); } - public Map getGroup(String gid) { - return this.groups.getGroup(gid).getValue(); - } public Map getAccount(String v1) { return this.accounts.getAccount(m.get(mno)).getValue(); } diff --git a/AlgebraicDataflowArchitectureModel/prototypes/Java/GroupChat/PULL-first/Groups.java b/AlgebraicDataflowArchitectureModel/prototypes/Java/GroupChat/PULL-first/Groups.java index 293f508..014bc27 100644 --- a/AlgebraicDataflowArchitectureModel/prototypes/Java/GroupChat/PULL-first/Groups.java +++ b/AlgebraicDataflowArchitectureModel/prototypes/Java/GroupChat/PULL-first/Groups.java @@ -9,6 +9,6 @@ return this.value.get(gid); } public void createGroup(String gid) { - this.value.put(gid,new Group(new ArrayList<>(), accounts, new ArrayList<>())); + this.value.put(gid,new Group(new ArrayList<>(), new ArrayList<>(), accounts)); } } \ No newline at end of file diff --git a/AlgebraicDataflowArchitectureModel/prototypes/Java/GroupChat/PUSH-first/Account.java b/AlgebraicDataflowArchitectureModel/prototypes/Java/GroupChat/PUSH-first/Account.java index b41f785..830c8ce 100644 --- a/AlgebraicDataflowArchitectureModel/prototypes/Java/GroupChat/PUSH-first/Account.java +++ b/AlgebraicDataflowArchitectureModel/prototypes/Java/GroupChat/PUSH-first/Account.java @@ -3,9 +3,9 @@ public class Account { private Map notifications; public Map getValue() { - Map temp_nil3 = new HashMap<>(); - temp_nil3.put("notifications",this.getNotifications()); - return temp_nil3; + Map temp_nil7 = new HashMap<>(); + temp_nil7.put("notifications",this.getNotifications()); + return temp_nil7; } public Map getNotifications() { return new HashMap<>(notifications); diff --git a/AlgebraicDataflowArchitectureModel/prototypes/Java/GroupChat/PUSH-first/Group.java b/AlgebraicDataflowArchitectureModel/prototypes/Java/GroupChat/PUSH-first/Group.java index c109cca..660e433 100644 --- a/AlgebraicDataflowArchitectureModel/prototypes/Java/GroupChat/PUSH-first/Group.java +++ b/AlgebraicDataflowArchitectureModel/prototypes/Java/GroupChat/PUSH-first/Group.java @@ -1,29 +1,29 @@ import java.util.*; public class Group { + private List members; private List messages; private Account account; private Accounts accounts; - private List members; public Map getValue() { - Map temp_nil2 = new HashMap<>(); - temp_nil2.put("members",this.getMembers()); - temp_nil2.put("messages",this.getMessages()); - return temp_nil2; - } - public List getMessages() { - return this.messages; + Map temp_nil6 = new HashMap<>(); + temp_nil6.put("messages",this.getMessages()); + temp_nil6.put("members",this.getMembers()); + return temp_nil6; } public List getMembers() { return this.members; } + public List getMessages() { + return this.messages; + } public String getMember(int mno) { return this.members.get(mno); } public void postMessage(String gid, String message) { this.messages.add(message); for (int mno = 0; mno < this.members.size(); mno++) { - String member = this.groups.getGroup(gid).getMember(mno); + String member = getMember(mno); this.account = accounts.getAccount(member); this.account.updateNotificationsFromMessages(gid, mno, messages, member); } @@ -31,9 +31,9 @@ public void addGroupMember(String gid, String aid) { this.members.add(aid); } - public Group(List messages, Accounts accounts, List members) { + public Group(List members, List messages, Accounts accounts) { + this.members = members; this.messages = messages; this.accounts = accounts; - this.members = members; } } \ No newline at end of file diff --git a/AlgebraicDataflowArchitectureModel/prototypes/Java/GroupChat/PUSH-first/GroupChat.java b/AlgebraicDataflowArchitectureModel/prototypes/Java/GroupChat/PUSH-first/GroupChat.java index c61b0f9..201f338 100644 --- a/AlgebraicDataflowArchitectureModel/prototypes/Java/GroupChat/PUSH-first/GroupChat.java +++ b/AlgebraicDataflowArchitectureModel/prototypes/Java/GroupChat/PUSH-first/GroupChat.java @@ -7,33 +7,33 @@ accounts = new Accounts(); groups = new Groups(); } + public List getMembers(String gid) { + return this.groups.getGroup(gid).getMembers(); + } + public void addGroupMember(String gid, String aid) { + this.groups.getGroup(gid).addGroupMember(gid, aid); + } public Map getNotifications(String v1) { return this.accounts.getAccount(m.get(mno)).getNotifications(); } public void hasRead(String aid, String gid) { this.accounts.getAccount(aid).hasRead(aid, gid); } + public Map getGroup(String gid) { + return this.groups.getGroup(gid).getValue(); + } public List getMessages(String gid) { return this.groups.getGroup(gid).getMessages(); } public void postMessage(String gid, String message) { this.groups.getGroup(gid).postMessage(gid, message); } - public List getMembers(String gid) { - return this.groups.getGroup(gid).getMembers(); - } - public void addGroupMember(String gid, String aid) { - this.groups.getGroup(gid).addGroupMember(gid, aid); - } public Map getAccounts() { return this.accounts.getValue(); } public void signUp(String aid) { this.accounts.signUp(aid); } - public Map getGroup(String gid) { - return this.groups.getGroup(gid).getValue(); - } public Map getAccount(String v1) { return this.accounts.getAccount(m.get(mno)).getValue(); } diff --git a/AlgebraicDataflowArchitectureModel/prototypes/Java/GroupChat/PUSH-first/Groups.java b/AlgebraicDataflowArchitectureModel/prototypes/Java/GroupChat/PUSH-first/Groups.java index 293f508..014bc27 100644 --- a/AlgebraicDataflowArchitectureModel/prototypes/Java/GroupChat/PUSH-first/Groups.java +++ b/AlgebraicDataflowArchitectureModel/prototypes/Java/GroupChat/PUSH-first/Groups.java @@ -9,6 +9,6 @@ return this.value.get(gid); } public void createGroup(String gid) { - this.value.put(gid,new Group(new ArrayList<>(), accounts, new ArrayList<>())); + this.value.put(gid,new Group(new ArrayList<>(), new ArrayList<>(), accounts)); } } \ No newline at end of file diff --git a/AlgebraicDataflowArchitectureModel/prototypes/Java/OnlineBattleGame2/PULL-first/Account.java b/AlgebraicDataflowArchitectureModel/prototypes/Java/OnlineBattleGame2/PULL-first/Account.java index fa4b204..ecc737a 100644 --- a/AlgebraicDataflowArchitectureModel/prototypes/Java/OnlineBattleGame2/PULL-first/Account.java +++ b/AlgebraicDataflowArchitectureModel/prototypes/Java/OnlineBattleGame2/PULL-first/Account.java @@ -1,34 +1,33 @@ import java.util.*; public class Account { - private int point; private String name; + private int point; public Map getValue() { - Map temp_nil5 = new HashMap<>(); - temp_nil5.put("point",this.getPoint()); - temp_nil5.put("name",this.getName()); - return temp_nil5; - } - public int getPoint() { - return point; + Map temp_nil9 = new HashMap<>(); + temp_nil9.put("name",this.getName()); + temp_nil9.put("point",this.getPoint()); + return temp_nil9; } public String getName() { return this.name; } + public int getPoint() { + return point; + } public void updatePointFromBattle(String self, String rid, int mno, boolean battle, String id) { int temp_if0; if (hasWon) { temp_if0 = (this.point+1); } else { temp_if0 = this.point; - } - this.point = temp_if0; + }this.point = temp_if0; } public void changeName(String aid, String name) { this.name = name; } - public Account(int point, String name) { - this.point = point; + public Account(String name, int point) { this.name = name; + this.point = point; } } \ No newline at end of file diff --git a/AlgebraicDataflowArchitectureModel/prototypes/Java/OnlineBattleGame2/PULL-first/Accounts.java b/AlgebraicDataflowArchitectureModel/prototypes/Java/OnlineBattleGame2/PULL-first/Accounts.java index b5e61df..6d92c89 100644 --- a/AlgebraicDataflowArchitectureModel/prototypes/Java/OnlineBattleGame2/PULL-first/Accounts.java +++ b/AlgebraicDataflowArchitectureModel/prototypes/Java/OnlineBattleGame2/PULL-first/Accounts.java @@ -9,6 +9,6 @@ return this.value.get(mid); } public void signUp(String name, String aid) { - this.value.put(aid,new Account(0, name)); + this.value.put(aid,new Account(name, 0)); } } \ No newline at end of file diff --git a/AlgebraicDataflowArchitectureModel/prototypes/Java/OnlineBattleGame2/PULL-first/Member.java b/AlgebraicDataflowArchitectureModel/prototypes/Java/OnlineBattleGame2/PULL-first/Member.java index 0cc0df7..33658d5 100644 --- a/AlgebraicDataflowArchitectureModel/prototypes/Java/OnlineBattleGame2/PULL-first/Member.java +++ b/AlgebraicDataflowArchitectureModel/prototypes/Java/OnlineBattleGame2/PULL-first/Member.java @@ -5,10 +5,10 @@ private Account account; private Accounts accounts; public Map getValue() { - Map temp_nil6 = new HashMap<>(); - temp_nil6.put("id",this.getId()); - temp_nil6.put("name",this.getName()); - return temp_nil6; + Map temp_nil10 = new HashMap<>(); + temp_nil10.put("id",this.getId()); + temp_nil10.put("name",this.getName()); + return temp_nil10; } public String getId() { return this.id; diff --git a/AlgebraicDataflowArchitectureModel/prototypes/Java/OnlineBattleGame2/PULL-first/OnlineBattleGame2.java b/AlgebraicDataflowArchitectureModel/prototypes/Java/OnlineBattleGame2/PULL-first/OnlineBattleGame2.java index ddcae1c..69fc17e 100644 --- a/AlgebraicDataflowArchitectureModel/prototypes/Java/OnlineBattleGame2/PULL-first/OnlineBattleGame2.java +++ b/AlgebraicDataflowArchitectureModel/prototypes/Java/OnlineBattleGame2/PULL-first/OnlineBattleGame2.java @@ -13,14 +13,17 @@ public Map getAccount(String mid) { return this.accounts.getAccount(mid).getValue(); } - public boolean getBattle(String rid) { - return this.rooms.getRoom(rid).getBattle(); + public String getName(String mid) { + return this.accounts.getAccount(mid).getName(); } - public void battle(String rid, boolean hasWon) { - this.rooms.getRoom(rid).battle(rid, hasWon); + public void changeName(String aid, String name) { + this.accounts.getAccount(aid).changeName(aid, name); } - public Map getMember(String rid, int mno) { - return this.rooms.getRoom(rid).getMembers().getMember(mno).getValue(); + public int getPoint(String mid) { + return this.accounts.getAccount(mid).getPoint(); + } + public Map getRoom(String rid) { + return this.rooms.getRoom(rid).getValue(); } public List getMembers(String rid) { return this.rooms.getRoom(rid).getMembers().getValue(); @@ -28,20 +31,17 @@ public void addRoomMember(String rid, String id) { this.rooms.getRoom(rid).getMembers().addRoomMember(rid, id); } - public int getPoint(String mid) { - return this.accounts.getAccount(mid).getPoint(); - } - public String getName(String mid) { - return this.accounts.getAccount(mid).getName(); - } - public void changeName(String aid, String name) { - this.accounts.getAccount(aid).changeName(aid, name); - } public String getName(String rid, int mno) { return this.rooms.getRoom(rid).getMembers().getMember(mno).getName(); } - public Map getRoom(String rid) { - return this.rooms.getRoom(rid).getValue(); + public Map getMember(String rid, int mno) { + return this.rooms.getRoom(rid).getMembers().getMember(mno).getValue(); + } + public boolean getBattle(String rid) { + return this.rooms.getRoom(rid).getBattle(); + } + public void battle(String rid, boolean hasWon) { + this.rooms.getRoom(rid).battle(rid, hasWon); } public Map getAccounts() { return this.accounts.getValue(); diff --git a/AlgebraicDataflowArchitectureModel/prototypes/Java/OnlineBattleGame2/PULL-first/Room.java b/AlgebraicDataflowArchitectureModel/prototypes/Java/OnlineBattleGame2/PULL-first/Room.java index 1a1a3c6..ff4155c 100644 --- a/AlgebraicDataflowArchitectureModel/prototypes/Java/OnlineBattleGame2/PULL-first/Room.java +++ b/AlgebraicDataflowArchitectureModel/prototypes/Java/OnlineBattleGame2/PULL-first/Room.java @@ -6,10 +6,10 @@ private Account account; private Accounts accounts; public Map getValue() { - Map temp_nil4 = new HashMap<>(); - temp_nil4.put("battle",this.getBattle()); - temp_nil4.put("members",this.members.getValue()); - return temp_nil4; + Map temp_nil8 = new HashMap<>(); + temp_nil8.put("battle",this.getBattle()); + temp_nil8.put("members",this.members.getValue()); + return temp_nil8; } public Members getMembers() { return this.members; @@ -20,7 +20,7 @@ public void battle(String rid, boolean hasWon) { this.battle = hasWon; for (int mno = 0; mno < this.members.getValue().size(); mno++) { - String id = this.rooms.getRoom(rid).getMembers().getMember(mno).getId(); + String id = this.members.getMember(mno).getId(); this.account = accounts.getAccount(id); this.account.updatePointFromBattle(mid, rid, mno, battle, id); } diff --git a/AlgebraicDataflowArchitectureModel/prototypes/Java/OnlineBattleGame2/PUSH-first/Account.java b/AlgebraicDataflowArchitectureModel/prototypes/Java/OnlineBattleGame2/PUSH-first/Account.java index e7ba6d9..5ad3e48 100644 --- a/AlgebraicDataflowArchitectureModel/prototypes/Java/OnlineBattleGame2/PUSH-first/Account.java +++ b/AlgebraicDataflowArchitectureModel/prototypes/Java/OnlineBattleGame2/PUSH-first/Account.java @@ -4,10 +4,10 @@ private int point; private String name; public Map getValue() { - Map temp_nil8 = new HashMap<>(); - temp_nil8.put("point",this.getPoint()); - temp_nil8.put("name",this.getName()); - return temp_nil8; + Map temp_nil12 = new HashMap<>(); + temp_nil12.put("name",this.getName()); + temp_nil12.put("point",this.getPoint()); + return temp_nil12; } public int getPoint() { return point; @@ -21,8 +21,7 @@ temp_if1 = (this.point+1); } else { temp_if1 = this.point; - } - this.point = temp_if1; + }this.point = temp_if1; } public void changeName(String aid, String name) { this.name = name; diff --git a/AlgebraicDataflowArchitectureModel/prototypes/Java/OnlineBattleGame2/PUSH-first/Member.java b/AlgebraicDataflowArchitectureModel/prototypes/Java/OnlineBattleGame2/PUSH-first/Member.java index 12fa3ce..7e548af 100644 --- a/AlgebraicDataflowArchitectureModel/prototypes/Java/OnlineBattleGame2/PUSH-first/Member.java +++ b/AlgebraicDataflowArchitectureModel/prototypes/Java/OnlineBattleGame2/PUSH-first/Member.java @@ -5,10 +5,10 @@ private Accounts accounts; private String id; public Map getValue() { - Map temp_nil9 = new HashMap<>(); - temp_nil9.put("id",this.getId()); - temp_nil9.put("name",this.getName()); - return temp_nil9; + Map temp_nil13 = new HashMap<>(); + temp_nil13.put("id",this.getId()); + temp_nil13.put("name",this.getName()); + return temp_nil13; } public String getName() { return name; diff --git a/AlgebraicDataflowArchitectureModel/prototypes/Java/OnlineBattleGame2/PUSH-first/OnlineBattleGame2.java b/AlgebraicDataflowArchitectureModel/prototypes/Java/OnlineBattleGame2/PUSH-first/OnlineBattleGame2.java index 07aff4b..a2fbee5 100644 --- a/AlgebraicDataflowArchitectureModel/prototypes/Java/OnlineBattleGame2/PUSH-first/OnlineBattleGame2.java +++ b/AlgebraicDataflowArchitectureModel/prototypes/Java/OnlineBattleGame2/PUSH-first/OnlineBattleGame2.java @@ -10,14 +10,11 @@ public Map getAccount(String mid) { return this.accounts.getAccount(mid).getValue(); } - public boolean getBattle(String rid) { - return this.rooms.getRoom(rid).getBattle(); + public int getPoint(String mid) { + return this.accounts.getAccount(mid).getPoint(); } - public void battle(String rid, boolean hasWon) { - this.rooms.getRoom(rid).battle(rid, hasWon); - } - public Map getMember(String rid, int mno) { - return this.rooms.getRoom(rid).getMembers().getMember(mno).getValue(); + public Map getRoom(String rid) { + return this.rooms.getRoom(rid).getValue(); } public List getMembers(String rid) { return this.rooms.getRoom(rid).getMembers().getValue(); @@ -31,17 +28,20 @@ public String getId(String rid, int mno) { return this.rooms.getRoom(rid).getMembers().getMember(mno).getId(); } - public int getPoint(String mid) { - return this.accounts.getAccount(mid).getPoint(); - } public String getName(String mid) { return this.accounts.getAccount(mid).getName(); } public void changeName(String aid, String name) { this.accounts.getAccount(aid).changeName(aid, name); } - public Map getRoom(String rid) { - return this.rooms.getRoom(rid).getValue(); + public Map getMember(String rid, int mno) { + return this.rooms.getRoom(rid).getMembers().getMember(mno).getValue(); + } + public boolean getBattle(String rid) { + return this.rooms.getRoom(rid).getBattle(); + } + public void battle(String rid, boolean hasWon) { + this.rooms.getRoom(rid).battle(rid, hasWon); } public Map getAccounts() { return this.accounts.getValue(); diff --git a/AlgebraicDataflowArchitectureModel/prototypes/Java/OnlineBattleGame2/PUSH-first/Room.java b/AlgebraicDataflowArchitectureModel/prototypes/Java/OnlineBattleGame2/PUSH-first/Room.java index 52138d9..ccc1b77 100644 --- a/AlgebraicDataflowArchitectureModel/prototypes/Java/OnlineBattleGame2/PUSH-first/Room.java +++ b/AlgebraicDataflowArchitectureModel/prototypes/Java/OnlineBattleGame2/PUSH-first/Room.java @@ -6,10 +6,10 @@ private Account account; private Accounts accounts; public Map getValue() { - Map temp_nil7 = new HashMap<>(); - temp_nil7.put("battle",this.getBattle()); - temp_nil7.put("members",this.members.getValue()); - return temp_nil7; + Map temp_nil11 = new HashMap<>(); + temp_nil11.put("battle",this.getBattle()); + temp_nil11.put("members",this.members.getValue()); + return temp_nil11; } public Members getMembers() { return this.members; @@ -20,7 +20,7 @@ public void battle(String rid, boolean hasWon) { this.battle = hasWon; for (int mno = 0; mno < this.members.getValue().size(); mno++) { - String id = this.rooms.getRoom(rid).getMembers().getMember(mno).getId(); + String id = this.members.getMember(mno).getId(); this.account = accounts.getAccount(id); this.account.updatePointFromBattle(mid, rid, mno, battle, id); } diff --git a/AlgebraicDataflowArchitectureModel/src/generators/CodeGenerator.java b/AlgebraicDataflowArchitectureModel/src/generators/CodeGenerator.java index ef1c564..d3257f0 100644 --- a/AlgebraicDataflowArchitectureModel/src/generators/CodeGenerator.java +++ b/AlgebraicDataflowArchitectureModel/src/generators/CodeGenerator.java @@ -523,16 +523,16 @@ : DataConstraintModel.typeInt); } // use the cached value as the current state - return new Field(targetRes.getLeafResourceName(), + return new Field(langSpec.toVariableName(getComponentName(targetRes.getResourceHierarchy(), langSpec)), targetRes.getResourceStateType() != null ? targetRes.getResourceStateType() : DataConstraintModel.typeInt); } @Override public Expression getNextStateAccessorFor(ChannelMember target, ChannelMember from) { - ResourcePath targerRes= target.getResource(); - return new Parameter(targerRes.getLeafResourceName(), - targerRes.getResourceStateType() != null ? targerRes.getResourceStateType() + ResourcePath targetRes= target.getResource(); + return new Parameter(langSpec.toVariableName(getComponentName(targetRes.getResourceHierarchy(), langSpec)), + targetRes.getResourceStateType() != null ? targetRes.getResourceStateType() : DataConstraintModel.typeInt); } @@ -544,7 +544,7 @@ : DataConstraintModel.typeInt); } // for reference channel member - return new Parameter(targetRes.getLeafResourceName(), + return new Parameter(langSpec.toVariableName(getComponentName(targetRes.getResourceHierarchy(), langSpec)), targetRes.getResourceStateType() != null ? targetRes.getResourceStateType() : DataConstraintModel.typeInt); } @@ -612,9 +612,23 @@ : DataConstraintModel.typeInt); } // for reference channel member - Term getter = new Term(new Symbol(getterOfResourceState, 1, Symbol.Type.METHOD)); - getter.addChild(new Field(targetRes.getLeafResourceName(), targetRes.getResourceStateType())); - return getter; + if (fromRes.isAncestorOf(targetRes)) { + Stack pathStack = new Stack<>(); + ResourcePath curPath = targetRes; + do { + pathStack.push(curPath); + curPath = curPath.getParent(); + } while (!curPath.equals(fromRes)); + // iterate from the fromRes resource + return getRelativePath(targetRes, pathStack); + } + if (generatesComponent(targetRes.getResourceHierarchy())) { + Term getter = new Term(new Symbol(getterOfResourceState, 1, Symbol.Type.METHOD)); + getter.addChild(new Field(langSpec.toVariableName(getComponentName(targetRes.getResourceHierarchy(), langSpec)), targetRes.getResourceStateType())); + return getter; + } else { + return new Field(langSpec.toVariableName(getComponentName(targetRes.getResourceHierarchy(), langSpec)), targetRes.getResourceStateType()); + } } else { // (#3) access from the outside of the hierarchy (must be kept consistent with #4) Stack pathStack = new Stack<>(); @@ -624,93 +638,76 @@ curPath = curPath.getParent(); } while (curPath != null); // iterate from the root resource - Term getter = null; - int v = 1; - int arity = 2; - boolean doesChainInvocations = true; - while (!pathStack.empty()) { - curPath = pathStack.pop(); - String typeName = getComponentName(curPath.getResourceHierarchy(), langSpec); - if (getter == null) { - // root resource - String fieldName = langSpec.toVariableName(typeName); - getter = new Field(fieldName, new Type(typeName, typeName)); - } else { - if (generatesComponent(curPath.getResourceHierarchy())) { - if (arity == 2) { - Term newGetter = new Term(new Symbol(getterPrefix + typeName, -1, Symbol.Type.METHOD)); - newGetter.addChild(getter); - if (curPath.getResourceHierarchy().getNumParameters() > 0) { - Variable var = null; - Expression param = curPath.getLastParam(); - if (param instanceof Variable) { - var = (Variable) param; - } else if (param instanceof Term) { - var = new Variable("v" + v, ((Term) param).getType()); - } - if (var != null) { - newGetter.addChild(var); - newGetter.getSymbol().setArity(2); - } - v++; - } - getter = newGetter; - } else { - // add the last path parameter. - if (curPath.getResourceHierarchy().getNumParameters() > 0) { - Variable var = null; - Expression param = curPath.getLastParam(); - if (param instanceof Variable) { - var = (Variable) param; - } else if (param instanceof Term) { - var = new Variable("v" + v, ((Term) param).getType()); - } - if (var != null) { - getter.getSymbol().setArity(arity); - getter.addChild(var); - } - v++; - } - } - arity = 2; - doesChainInvocations = true; - } else { - // to get a descendant resource directly. (e.g, .todos.{year}.{month}.{day}.{id} ==> .getTodos().getTodo(year, month, day, id)) - if (doesChainInvocations) { - Term newGetter = new Term(new Symbol(getterPrefix + typeName, -1, Symbol.Type.METHOD)); - newGetter.addChild(getter); - getter = newGetter; - doesChainInvocations = false; - } + return getRelativePath(targetRes, pathStack); + } + } + + private Expression getRelativePath(ResourcePath targetRes, Stack pathStack) { + ResourcePath curPath; + Term getter = null; + int arity = 2; + boolean doesChainInvocations = true; + while (!pathStack.empty()) { + curPath = pathStack.pop(); + String typeName = getComponentName(curPath.getResourceHierarchy(), langSpec); + if (getter == null && generatesComponent(curPath.getResourceHierarchy())) { + // root resource + String fieldName = langSpec.toVariableName(typeName); + getter = new Field(fieldName, new Type(typeName, typeName)); + } else { + if (generatesComponent(curPath.getResourceHierarchy())) { + if (arity == 2) { + Term newGetter = new Term(new Symbol(getterPrefix + typeName, -1, Symbol.Type.METHOD)); + newGetter.addChild(getter); if (curPath.getResourceHierarchy().getNumParameters() > 0) { - // may change the symbol name - getter.getSymbol().changeName("get" + typeName); - // add a path parameter. - Variable var = null; Expression param = curPath.getLastParam(); - if (param instanceof Variable) { - var = (Variable) param; - } else if (param instanceof Term) { - var = new Variable("v" + v, ((Term) param).getType()); + if (param != null) { + newGetter.addChild(param); + newGetter.getSymbol().setArity(2); } - if (var != null) { + } + getter = newGetter; + } else { + // add the last path parameter. + if (curPath.getResourceHierarchy().getNumParameters() > 0) { + Expression param = curPath.getLastParam(); + if (param != null) { getter.getSymbol().setArity(arity); - getter.addChild(var); - arity++; + getter.addChild(param); } - v++; + } + } + arity = 2; + doesChainInvocations = true; + } else { + // to get a descendant resource directly. (e.g, .todos.{year}.{month}.{day}.{id} ==> .getTodos().getTodo(year, month, day, id)) + if (doesChainInvocations) { + Term newGetter = new Term(new Symbol(getterPrefix + typeName, -1, Symbol.Type.METHOD)); + newGetter.addChild(getter); + getter = newGetter; + doesChainInvocations = false; + } + if (curPath.getResourceHierarchy().getNumParameters() > 0) { + // may change the symbol name + getter.getSymbol().changeName("get" + typeName); + // add a path parameter. + Expression param = curPath.getLastParam(); + if (param != null) { + getter.getSymbol().setArity(arity); + getter.addChild(param); + arity++; } } } } - - if (generatesComponent(targetRes.getResourceHierarchy())) { - Term newGetter = new Term(new Symbol(getterOfResourceState, 1, Symbol.Type.METHOD)); - newGetter.addChild(getter); - getter = newGetter; - } - return getter; } + + if (generatesComponent(targetRes.getResourceHierarchy())) { + Term newGetter = new Term(new Symbol(getterOfResourceState, 1, Symbol.Type.METHOD)); + newGetter.addChild(getter); + getter = newGetter; + } + return getter; } }; } @@ -727,16 +724,16 @@ : DataConstraintModel.typeInt); } // use the cached value as the current state - return new Parameter(targetRes.getLeafResourceName(), + return new Parameter(langSpec.toVariableName(getComponentName(targetRes.getResourceHierarchy(), langSpec)), targetRes.getResourceStateType() != null ? targetRes.getResourceStateType() : DataConstraintModel.typeInt); } @Override public Expression getNextStateAccessorFor(ChannelMember target, ChannelMember from) { - ResourcePath targerRes= target.getResource(); - return new Parameter(targerRes.getLeafResourceName(), - targerRes.getResourceStateType() != null ? targerRes.getResourceStateType() + ResourcePath targetRes= target.getResource(); + return new Parameter(langSpec.toVariableName(getComponentName(targetRes.getResourceHierarchy(), langSpec)), + targetRes.getResourceStateType() != null ? targetRes.getResourceStateType() : DataConstraintModel.typeInt); } @@ -748,7 +745,7 @@ : DataConstraintModel.typeInt); } // for reference channel member - return new Parameter(targetRes.getLeafResourceName(), + return new Parameter(langSpec.toVariableName(getComponentName(targetRes.getResourceHierarchy(), langSpec)), targetRes.getResourceStateType() != null ? targetRes.getResourceStateType() : DataConstraintModel.typeInt); } diff --git a/AlgebraicDataflowArchitectureModel/src/generators/CodeGeneratorFromDataFlowGraph.java b/AlgebraicDataflowArchitectureModel/src/generators/CodeGeneratorFromDataFlowGraph.java index fd19c1a..ddc0eb2 100644 --- a/AlgebraicDataflowArchitectureModel/src/generators/CodeGeneratorFromDataFlowGraph.java +++ b/AlgebraicDataflowArchitectureModel/src/generators/CodeGeneratorFromDataFlowGraph.java @@ -304,6 +304,9 @@ String updateStatement; if (exp instanceof Term && ((Term) exp).getSymbol().isImplWithSideEffect()) { updateStatement = sideEffects[0]; + if (updateStatement.endsWith("\n")) { + updateStatement = updateStatement.substring(0, updateStatement.length() - 1); + } } else { updateStatement = sideEffects[0] + langSpec.getFieldAccessor(fieldOfResourceState) + langSpec.getAssignment() + newState + langSpec.getStatementDelimiter(); } @@ -987,14 +990,20 @@ if (generatesComponent(outRes)) { if (updateExp instanceof Term && ((Term) updateExp).getSymbol().isImplWithSideEffect()) { updateStatement = sideEffects[0]; + if (updateStatement.endsWith("\n")) { + updateStatement = updateStatement.substring(0, updateStatement.length() - 1); + } } else { updateStatement = sideEffects[0] + langSpec.getFieldAccessor(fieldOfResourceState) + langSpec.getAssignment() + newState + langSpec.getStatementDelimiter(); // this.value = ... } } else { if (sideEffects[0] != null) { - updateStatement = sideEffects[0]; + updateStatement = sideEffects[0]; String resourceName = langSpec.toVariableName(getComponentName(outRes, langSpec)); updateStatement = updateStatement.replace(langSpec.getFieldAccessor(fieldOfResourceState), langSpec.getFieldAccessor(resourceName)); + if (updateStatement.endsWith("\n")) { + updateStatement = updateStatement.substring(0, updateStatement.length() - 1); + } } if (DataConstraintModel.typeList.isAncestorOf(resourceNode.getParent().getResourceStateType())) { Term selector = new Term(DataConstraintModel.set); @@ -1193,50 +1202,87 @@ } // Also take into account the channel hierarchy to determine push/pull transfer. if (descendantDstChannels.contains(chNode2)) { - outsideOutputResource = true; // Regarded as (broadcasting) push transfer. + outsideOutputResource2 = true; // Regarded as (broadcasting) push transfer. } if (ancestorDstChannels.contains(chNode2)) { - outsideInputResource = true; // Regarded as (collecting) pull transfer. + outsideInputResource2 = true; // Regarded as (collecting) pull transfer. } if ((((PushPullAttribute) dOut.getAttribute()).getSelectedOption() == PushPullValue.PUSH && !outsideInputResource2) || outsideOutputResource2) { // PUSH transfer + boolean addForStatement = false; + String forVarName = null; + if (descendantDstChannels.contains(chNode2)) { + // For hierarchical channels (broadcasting push transfer). + if (ch2.getSelectors() != null && ch2.getSelectors().size() > 0) { + Expression selExp = ch2.getSelectors().get(0).getExpression(); + Type selType = null; + if (selExp instanceof Variable) { + selType = ((Variable) selExp).getType(); + forVarName = ((Variable) selExp).getName(); + ChannelMember insideChMem = null; + for (ChannelMember cm :ch2.getInputChannelMembers()) { + if (!cm.isOutside()) { + insideChMem = cm; + break; + } + } + if (insideChMem == null) { + for (ChannelMember cm :ch2.getReferenceChannelMembers()) { + if (!cm.isOutside()) { + insideChMem = cm; + break; + } + } + } + if (insideChMem == null) { + for (ChannelMember cm :ch2.getOutputChannelMembers()) { + if (!cm.isOutside()) { + insideChMem = cm; + break; + } + } + } + ResourcePath insideResPath = insideChMem.getResource(); + while (insideResPath.getParent() != null && (insideResPath.getLastParam() == null || !insideResPath.getLastParam().equals(selExp))) { + insideResPath = insideResPath.getParent(); + } + insideResPath = insideResPath.getParent(); + String parent = getPullAccessor().getDirectStateAccessorFor(insideResPath, resourceNode.getPrimaryResourcePath()).toImplementation(new String[] {}); + if (insideResPath != null) { + if (selType.equals(DataConstraintModel.typeInt)) { + // make a for loop (for a list) for broadcasting. + update.addStatement(langSpec.getForStatement(forVarName, parent)); + addForStatement = true; + } else if (selType.equals(DataConstraintModel.typeString)) { + // make a for loop (for a map) for broadcasting. + update.addStatement(langSpec.getForStatement(forVarName, DataConstraintModel.typeString.getInterfaceTypeName(), parent)); + addForStatement = true; + } + } + } else if (selExp instanceof Term) { + // not supported. + } + } + } + // Get the value of reference member to call the update method. List params = new ArrayList<>(); - // Values of path parameters. - for (Expression pathParam: out.getResource().getPathParams()) { - if (pathParam instanceof Variable) { - Variable pathVar = (Variable) pathParam; - params.add(pathVar.getName()); - } - } - // Values of channel parameters. - for (Selector selector: ch.getAllSelectors()) { - if (selector.getExpression() instanceof Variable) { - Variable selVar = (Variable) selector.getExpression(); - params.add(selVar.getName()); - } - } - // Value of the source side (input side) resource. - ResourceHierarchy srcRes2 = resourceNode.getResourceHierarchy(); - if (generatesComponent(srcRes2)) { - params.add(langSpec.getFieldAccessor(fieldOfResourceState)); - } else { - params.add(langSpec.getFieldAccessor(langSpec.toVariableName(srcRes2.getResourceName()))); - srcRes2 = srcRes2.getParent(); - } Map> referredResources = new HashMap<>(); Set referredSet = referredResources.get(update); for (ChannelMember rc: ch2.getReferenceChannelMembers()) { - // to get the value of reference member. ResourcePath ref = rc.getResource(); if (referredSet == null) { referredSet = new HashSet<>(); referredResources.put(update, referredSet); } if (!resourceNode.getInSideResources().contains(ref)) { - String refVarName = ref.getLeafResourceName(); + String refVarName = langSpec.toVariableName(getComponentName(ref.getResourceHierarchy(), langSpec)); if (!referredSet.contains(ref)) { referredSet.add(ref); - Expression refGetter = getPullAccessor().getCurrentStateAccessorFor(rc, in); + ResourcePath srcRes = in.getResource(); + if (!generatesComponent(srcRes.getResourceHierarchy())) { + srcRes = srcRes.getParent(); + } + Expression refGetter = getPullAccessor().getDirectStateAccessorFor(ref, srcRes); String[] sideEffects = new String[] {""}; String refExp = refGetter.toImplementation(sideEffects); String refTypeName = ref.getResourceStateType().getInterfaceTypeName(); @@ -1245,6 +1291,62 @@ params.add(refVarName); } } + // Update fields to refer to outside resources. + try { + Map>> resourcePaths = ch2.fillOutsideResourcePaths(out, getPullAccessor()); + if (resourcePaths != null && resourcePaths.size() > 0) { + for (ChannelMember outsideMember: resourcePaths.keySet()) { + ResourcePath outsidePath = resourcePaths.get(outsideMember).getKey(); + if (!generatesComponent(outsidePath.getResourceHierarchy())) { + outsidePath = outsidePath.getParent(); + } + String outsideResName = langSpec.toVariableName(getComponentName(outsidePath.getResourceHierarchy(), langSpec)); + Expression outsideExp = getPullAccessor().getDirectStateAccessorFor(outsidePath, null); + if (generatesComponent(outsidePath.getResourceHierarchy())) { + outsideExp = ((Term) outsideExp).getChild(0); + } + if (outsideExp instanceof Field) { + outsideExp = new Variable(((Field) outsideExp).getSymbol().getName(), ((Field) outsideExp).getType()); + } else if (outsideExp instanceof Term) { + for (Entry fieldEnt: ((Term) outsideExp).getSubTerms(Field.class).entrySet()) { + Position pos = fieldEnt.getKey(); + Field field = fieldEnt.getValue(); + Variable var = new Variable(field.getSymbol().getName(), field.getType()); + ((Term) outsideExp).replaceSubTerm(pos, var); + } + } + String[] sideEffects = new String[] {""}; + String outsideAccessor = outsideExp.toImplementation(sideEffects); + update.addStatement(langSpec.getFieldAccessor(outsideResName) + langSpec.getAssignment() + outsideAccessor + langSpec.getStatementDelimiter()); // change the reference field. + } + } + } catch (ParameterizedIdentifierIsFutureWork | ResolvingMultipleDefinitionIsFutureWork + | InvalidMessage | UnificationFailed | ValueUndefined e) { + e.printStackTrace(); + } + // Values of path parameters to call the update method. + for (Expression pathParam: out.getResource().getPathParams()) { + if (pathParam instanceof Variable) { + Variable pathVar = (Variable) pathParam; + params.add(pathVar.getName()); + } + } + // Values of channel parameters to call the update method. + for (Selector selector: ch.getAllSelectors()) { + if (selector.getExpression() instanceof Variable) { + Variable selVar = (Variable) selector.getExpression(); + params.add(selVar.getName()); + } + } + // Value of the source side (input side) resource to call the update method. + ResourceHierarchy srcRes2 = resourceNode.getResourceHierarchy(); + if (generatesComponent(srcRes2)) { + params.add(langSpec.getFieldAccessor(fieldOfResourceState)); + } else { + params.add(langSpec.getFieldAccessor(langSpec.toVariableName(srcRes2.getResourceName()))); + srcRes2 = srcRes2.getParent(); + } + // Call the update method. String updateMethodName = null; ResourceHierarchy dstRes = dstNode.getResourceHierarchy(); if (!generatesComponent(dstRes)) { @@ -1268,6 +1370,10 @@ update.addStatement(langSpec.getMethodInvocation(langSpec.getFieldAccessor(dstCompName), updateMethodName, params) + langSpec.getStatementDelimiter()); // this.dst.updateDstFromSrc(value, refParams); } + if (addForStatement) { + // Close the for loop + update.addStatement(langSpec.getEndForStatement(forVarName)); + } } } if (outsideInputMembers2.size() > 0) { @@ -1287,8 +1393,8 @@ resourcePaths = ch2.fillOutsideResourcePaths(out, getPullAccessor()); if (resourcePaths != null && resourcePaths.size() > 0) { for (ChannelMember outsideMember: outsideInputMembers2) { - for (ChannelMember dependingMember: resourcePaths.get(outsideMember).getValue()) { - if (dependingMember.getResource().equals(srcRes2)) { + for (ChannelMember dependedMember: resourcePaths.get(outsideMember).getValue()) { + if (dependedMember.getResource().equals(srcRes2)) { // An outside input resource path depends on srcRes. ResourcePath outsidePath = resourcePaths.get(outsideMember).getKey(); if (!generatesComponent(outsidePath.getResourceHierarchy())) { @@ -1299,14 +1405,6 @@ if (generatesComponent(outsidePath.getResourceHierarchy())) { outsideExp = ((Term) outsideExp).getChild(0); } - Expression nextExp = dependingMember.getStateTransition().getNextStateExpression(); - if (nextExp != null && outsideExp instanceof Term) { - if (nextExp instanceof Variable) { - outsideExp = ((Term) outsideExp).substitute((Variable) nextExp, new Field(langSpec.toVariableName(getComponentName(dependingMember.getResource().getResourceHierarchy(), langSpec)))); - } else { - // ToDo. - } - } String[] sideEffects = new String[] {""}; String outsideAccessor = outsideExp.toImplementation(sideEffects); String updateReference = langSpec.getFieldAccessor(outsideResName) + langSpec.getAssignment() + outsideAccessor + langSpec.getStatementDelimiter(); @@ -1631,6 +1729,9 @@ String updateStatement; if (updateExp instanceof Term && ((Term) updateExp).getSymbol().isImplWithSideEffect()) { updateStatement = sideEffects[0]; + if (updateStatement.endsWith("\n")) { + updateStatement = updateStatement.substring(0, updateStatement.length() - 1); + } } else { updateStatement = sideEffects[0] + langSpec.getFieldAccessor(fieldOfResourceState) + langSpec.getAssignment() + newState + langSpec.getStatementDelimiter(); } @@ -1641,6 +1742,9 @@ updateStatement = sideEffects[0]; String resourceName = langSpec.toVariableName(getComponentName(resource, langSpec)); updateStatement = updateStatement.replace(langSpec.getFieldAccessor(fieldOfResourceState), langSpec.getFieldAccessor(resourceName)); + if (updateStatement.endsWith("\n")) { + updateStatement = updateStatement.substring(0, updateStatement.length() - 1); + } } if (DataConstraintModel.typeList.isAncestorOf(resourceNode.getParent().getResourceStateType())) { Term selector = new Term(DataConstraintModel.set); @@ -1675,12 +1779,13 @@ // Add an invocation to an update method (for a chain of update method invocations). for (Edge resToCh: resourceNode.getOutEdges()) { DataFlowEdge dOut = (DataFlowEdge) resToCh; - DataTransferChannel ch2 = ((ChannelNode) resToCh.getDestination()).getChannel(); + ChannelNode directDstChNode = (ChannelNode) resToCh.getDestination(); + DataTransferChannel directDstCh = directDstChNode.getChannel(); // Check if the input resource is outside of the channel scope. boolean outsideInputResource2 = false; ChannelMember in = null; Set outsideInputMembers2 = new HashSet<>(); - for (ChannelMember cm: ch2.getInputChannelMembers()) { + for (ChannelMember cm: directDstCh.getInputChannelMembers()) { if (resourceNode.getOutSideResources().contains(cm.getResource())) { if (cm.isOutside()) { outsideInputResource2 = true; // Regarded as pull transfer. @@ -1691,8 +1796,22 @@ outsideInputMembers2.add(cm); } } - for (Edge chToRes: resToCh.getDestination().getOutEdges()) { + // Should take into account the channel hierarchy. + Set ancestorDstChannels = directDstChNode.getAncestors(); + Set descendantDstChannels = directDstChNode.getDescendants(); + Set outEdges = new HashSet<>(); + outEdges.addAll(directDstChNode.getOutEdges()); + for (ChannelNode ancestorDst: ancestorDstChannels) { + outEdges.addAll(ancestorDst.getOutEdges()); + } + for (ChannelNode descendantDst: descendantDstChannels) { + outEdges.addAll(descendantDst.getOutEdges()); + } + for (Edge chToRes: outEdges) { + // For each data transfer to dstNode:ResourceNode. ResourceNode dstNode = ((ResourceNode) chToRes.getDestination()); + ChannelNode chNode2 = (ChannelNode) chToRes.getSource(); + DataTransferChannel ch2 = chNode2.getChannel(); // Check if the output resource is outside of the channel scope. boolean outsideOutputResource2 = false; ChannelMember out2 = null; @@ -1705,45 +1824,89 @@ } } } + // Also take into account the channel hierarchy to determine push/pull transfer. + if (descendantDstChannels.contains(chNode2)) { + outsideOutputResource2 = true; // Regarded as (broadcasting) push transfer. + } + if (ancestorDstChannels.contains(chNode2)) { + outsideInputResource2 = true; // Regarded as (collecting) pull transfer. + } if ((((PushPullAttribute) dOut.getAttribute()).getSelectedOption() == PushPullValue.PUSH && !outsideInputResource2) || outsideOutputResource2) { // PUSH transfer - Map> referredResources = new HashMap<>(); + boolean addForStatement = false; + String forVarName = null; + if (descendantDstChannels.contains(chNode2)) { + // For hierarchical channels (broadcasting push transfer). + if (ch2.getSelectors() != null && ch2.getSelectors().size() > 0) { + Expression selExp = ch2.getSelectors().get(0).getExpression(); + Type selType = null; + if (selExp instanceof Variable) { + selType = ((Variable) selExp).getType(); + forVarName = ((Variable) selExp).getName(); + ChannelMember insideChMem = null; + for (ChannelMember cm :ch2.getInputChannelMembers()) { + if (!cm.isOutside()) { + insideChMem = cm; + break; + } + } + if (insideChMem == null) { + for (ChannelMember cm :ch2.getReferenceChannelMembers()) { + if (!cm.isOutside()) { + insideChMem = cm; + break; + } + } + } + if (insideChMem == null) { + for (ChannelMember cm :ch2.getOutputChannelMembers()) { + if (!cm.isOutside()) { + insideChMem = cm; + break; + } + } + } + ResourcePath insideResPath = insideChMem.getResource(); + while (insideResPath.getParent() != null && (insideResPath.getLastParam() == null || !insideResPath.getLastParam().equals(selExp))) { + insideResPath = insideResPath.getParent(); + } + insideResPath = insideResPath.getParent(); + String parent = getPullAccessor().getDirectStateAccessorFor(insideResPath, resourceNode.getPrimaryResourcePath()).toImplementation(new String[] {}); + if (insideResPath != null) { + if (selType.equals(DataConstraintModel.typeInt)) { + // make a for loop (for a list) for broadcasting. + input.addStatement(langSpec.getForStatement(forVarName, parent)); + addForStatement = true; + } else if (selType.equals(DataConstraintModel.typeString)) { + // make a for loop (for a map) for broadcasting. + input.addStatement(langSpec.getForStatement(forVarName, DataConstraintModel.typeString.getInterfaceTypeName(), parent)); + addForStatement = true; + } + } + } else if (selExp instanceof Term) { + // not supported. + } + } + } + // Get the value of reference member to call the update method. List params = new ArrayList<>(); - // Values of path parameters. - for (Expression pathParam: out2.getResource().getPathParams()) { - if (pathParam instanceof Variable) { - Variable pathVar = (Variable) pathParam; - params.add(pathVar.getName()); - } - } - // Values of channel parameters. - for (Selector selector: ch2.getAllSelectors()) { - if (selector.getExpression() instanceof Variable) { - Variable selVar = (Variable) selector.getExpression(); - params.add(selVar.getName()); - } - } - // Value of the source side (input side) resource. - ResourceHierarchy srcRes = resourceNode.getResourceHierarchy(); - if (generatesComponent(srcRes)) { - params.add(langSpec.getFieldAccessor(fieldOfResourceState)); - } else { - params.add(langSpec.getFieldAccessor(langSpec.toVariableName(srcRes.getResourceName()))); - srcRes = srcRes.getParent(); - } + Map> referredResources = new HashMap<>(); Set referredSet = referredResources.get(input); for (ChannelMember rc: ch2.getReferenceChannelMembers()) { - // to get the value of reference member. ResourcePath ref = rc.getResource(); if (referredSet == null) { referredSet = new HashSet<>(); referredResources.put(input, referredSet); } if (!resourceNode.getOutSideResources().contains(ref)) { - String refVarName = ref.getLeafResourceName(); + String refVarName = langSpec.toVariableName(getComponentName(ref.getResourceHierarchy(), langSpec)); if (!referredSet.contains(ref)) { referredSet.add(ref); - Expression refGetter = getPullAccessor().getCurrentStateAccessorFor(rc, in); + ResourcePath srcRes = in.getResource(); + if (!generatesComponent(srcRes.getResourceHierarchy())) { + srcRes = srcRes.getParent(); + } + Expression refGetter = getPullAccessor().getDirectStateAccessorFor(ref, srcRes); String[] sideEffects = new String[] {""}; String refExp = refGetter.toImplementation(sideEffects); String refTypeName = ref.getResourceStateType().getInterfaceTypeName(); @@ -1752,6 +1915,62 @@ params.add(refVarName); } } + // Update fields to refer to outside resources. + try { + Map>> resourcePaths = ch2.fillOutsideResourcePaths(out2, getPullAccessor()); + if (resourcePaths != null && resourcePaths.size() > 0) { + for (ChannelMember outsideMember: resourcePaths.keySet()) { + ResourcePath outsidePath = resourcePaths.get(outsideMember).getKey(); + if (!generatesComponent(outsidePath.getResourceHierarchy())) { + outsidePath = outsidePath.getParent(); + } + String outsideResName = langSpec.toVariableName(getComponentName(outsidePath.getResourceHierarchy(), langSpec)); + Expression outsideExp = getPullAccessor().getDirectStateAccessorFor(outsidePath, null); + if (generatesComponent(outsidePath.getResourceHierarchy())) { + outsideExp = ((Term) outsideExp).getChild(0); + } + if (outsideExp instanceof Field) { + outsideExp = new Variable(((Field) outsideExp).getSymbol().getName(), ((Field) outsideExp).getType()); + } else if (outsideExp instanceof Term) { + for (Entry fieldEnt: ((Term) outsideExp).getSubTerms(Field.class).entrySet()) { + Position pos = fieldEnt.getKey(); + Field field = fieldEnt.getValue(); + Variable var = new Variable(field.getSymbol().getName(), field.getType()); + ((Term) outsideExp).replaceSubTerm(pos, var); + } + } + String[] sideEffects = new String[] {""}; + String outsideAccessor = outsideExp.toImplementation(sideEffects); + input.addStatement(langSpec.getFieldAccessor(outsideResName) + langSpec.getAssignment() + outsideAccessor + langSpec.getStatementDelimiter()); // change the reference field. + } + } + } catch (ParameterizedIdentifierIsFutureWork | ResolvingMultipleDefinitionIsFutureWork + | InvalidMessage | UnificationFailed | ValueUndefined e) { + e.printStackTrace(); + } + // Values of path parameters to call the update method. + for (Expression pathParam: out2.getResource().getPathParams()) { + if (pathParam instanceof Variable) { + Variable pathVar = (Variable) pathParam; + params.add(pathVar.getName()); + } + } + // Values of channel parameters to call the update method. + for (Selector selector: ch2.getAllSelectors()) { + if (selector.getExpression() instanceof Variable) { + Variable selVar = (Variable) selector.getExpression(); + params.add(selVar.getName()); + } + } + // Value of the source side (input side) resource to call the update method. + ResourceHierarchy srcRes = resourceNode.getResourceHierarchy(); + if (generatesComponent(srcRes)) { + params.add(langSpec.getFieldAccessor(fieldOfResourceState)); + } else { + params.add(langSpec.getFieldAccessor(langSpec.toVariableName(srcRes.getResourceName()))); + srcRes = srcRes.getParent(); + } + // Call the update method. String updateMethodName = null; ResourceHierarchy dstRes = dstNode.getResourceHierarchy(); if (!generatesComponent(dstRes)) { @@ -1775,22 +1994,26 @@ input.addStatement(langSpec.getMethodInvocation(langSpec.getFieldAccessor(dstCompName), updateMethodName, params) + langSpec.getStatementDelimiter()); // this.dst.updateDstFromSrc(value, refParams); } + if (addForStatement) { + // Close the for loop. + input.addStatement(langSpec.getEndForStatement(forVarName)); + } } } if (outsideInputMembers2.size() > 0) { if (!generatesComponent(resourceNode.getResourceHierarchy())) { - ResourcePath srcRes2 = resourceNode.getOutSideResource(ch2); - for (ChannelMember out2: ch2.getOutputChannelMembers()) { + ResourcePath srcRes2 = resourceNode.getOutSideResource(directDstCh); + for (ChannelMember out2: directDstCh.getOutputChannelMembers()) { if (!generatesComponent(out2.getResource().getResourceHierarchy())) { ResourcePath dstRes2 = out2.getResource(); if (srcRes2.getParent().equals(dstRes2.getParent())) { Map>> resourcePaths = null; try { - resourcePaths = ch2.fillOutsideResourcePaths(out2, getPullAccessor()); + resourcePaths = directDstCh.fillOutsideResourcePaths(out2, getPullAccessor()); if (resourcePaths != null && resourcePaths.size() > 0) { for (ChannelMember outsideMember: outsideInputMembers2) { - for (ChannelMember dependingMember: resourcePaths.get(outsideMember).getValue()) { - if (dependingMember.getResource().equals(srcRes2)) { + for (ChannelMember dependedMember: resourcePaths.get(outsideMember).getValue()) { + if (dependedMember.getResource().equals(srcRes2)) { // An outside input resource path depends on srcRes. ResourcePath outsidePath = resourcePaths.get(outsideMember).getKey(); if (!generatesComponent(outsidePath.getResourceHierarchy())) { @@ -1801,14 +2024,6 @@ if (generatesComponent(outsidePath.getResourceHierarchy())) { outsideExp = ((Term) outsideExp).getChild(0); } - Expression nextExp = dependingMember.getStateTransition().getNextStateExpression(); - if (nextExp != null && outsideExp instanceof Term) { - if (nextExp instanceof Variable) { - outsideExp = ((Term) outsideExp).substitute((Variable) nextExp, new Field(langSpec.toVariableName(getComponentName(dependingMember.getResource().getResourceHierarchy(), langSpec)))); - } else { - // ToDo. - } - } String[] sideEffects = new String[] {""}; String outsideAccessor = outsideExp.toImplementation(sideEffects); input.addStatement(langSpec.getFieldAccessor(outsideResName) + langSpec.getAssignment() + outsideAccessor + langSpec.getStatementDelimiter()); // change the reference field. diff --git a/AlgebraicDataflowArchitectureModel/src/generators/ILanguageSpecific.java b/AlgebraicDataflowArchitectureModel/src/generators/ILanguageSpecific.java index 6c86540..baf40f3 100644 --- a/AlgebraicDataflowArchitectureModel/src/generators/ILanguageSpecific.java +++ b/AlgebraicDataflowArchitectureModel/src/generators/ILanguageSpecific.java @@ -35,6 +35,10 @@ String getConstructorInvocation(String componentName, List parameters); String getReturnStatement(String returnValue); String getIfStatement(Term condition, String block); + String getForStatement(String varName, String list); + String getForStatement(String varName, String varType, String map); + String getEndForStatement(); + String getEndForStatement(String varName); String toComponentName(String name); String toVariableName(String name); String getMainComponentName(); diff --git a/AlgebraicDataflowArchitectureModel/src/generators/JavaCodeGenerator.java b/AlgebraicDataflowArchitectureModel/src/generators/JavaCodeGenerator.java index 7e3548f..b39e9fc 100644 --- a/AlgebraicDataflowArchitectureModel/src/generators/JavaCodeGenerator.java +++ b/AlgebraicDataflowArchitectureModel/src/generators/JavaCodeGenerator.java @@ -1301,6 +1301,16 @@ : DataConstraintModel.typeInt); } // for reference channel member + if (fromRes.isAncestorOf(targetRes)) { + Stack pathStack = new Stack<>(); + ResourcePath curPath = targetRes; + do { + pathStack.push(curPath); + curPath = curPath.getParent(); + } while (!curPath.equals(fromRes)); + // iterate from the fromRes resource + return getRelativePath(targetRes, pathStack); + } if (generatesComponent(targetRes.getResourceHierarchy())) { Term getter = new Term(new Symbol("getValue", 1, Symbol.Type.METHOD)); getter.addChild(new Field(toVariableName(getComponentName(targetRes.getResourceHierarchy())), targetRes.getResourceStateType())); @@ -1317,79 +1327,75 @@ curPath = curPath.getParent(); } while (curPath != null); // iterate from the root resource - Term getter = null; - int v = 1; - int arity = 2; - boolean doesChainInvocations = true; - while (!pathStack.empty()) { - curPath = pathStack.pop(); - String typeName = getComponentName(curPath.getResourceHierarchy()); - if (getter == null) { - // root resource - String fieldName = toVariableName(typeName); - getter = new Field(fieldName, new Type(typeName, typeName)); - } else { - if (generatesComponent(curPath.getResourceHierarchy())) { - if (arity == 2) { - Term newGetter = new Term(new Symbol("get" + typeName, -1, Symbol.Type.METHOD)); - newGetter.addChild(getter); - if (curPath.getResourceHierarchy().getNumParameters() > 0) { - Expression param = curPath.getLastParam(); - if (param != null) { - newGetter.addChild(param); - newGetter.getSymbol().setArity(2); - } - } - getter = newGetter; - } else { - // add the last path parameter. - if (curPath.getResourceHierarchy().getNumParameters() > 0) { - Expression param = curPath.getLastParam(); - if (param != null) { - getter.getSymbol().setArity(arity); - getter.addChild(param); - } - v++; - } - } - arity = 2; - doesChainInvocations = true; - } else { - // to get a descendant resource directly. (e.g, .todos.{year}.{month}.{day}.{id} ==> .getTodos().getTodo(year, month, day, id)) - if (doesChainInvocations) { - Term newGetter = new Term(new Symbol("get" + typeName, -1, Symbol.Type.METHOD)); - newGetter.addChild(getter); - getter = newGetter; - doesChainInvocations = false; - } + return getRelativePath(targetRes, pathStack); + } + } + + private Expression getRelativePath(ResourcePath targetRes, Stack pathStack) { + ResourcePath curPath; + Term getter = null; + int arity = 2; + boolean doesChainInvocations = true; + while (!pathStack.empty()) { + curPath = pathStack.pop(); + String typeName = getComponentName(curPath.getResourceHierarchy()); + if (getter == null && generatesComponent(curPath.getResourceHierarchy())) { + // root resource + String fieldName = toVariableName(typeName); + getter = new Field(fieldName, new Type(typeName, typeName)); + } else { + if (generatesComponent(curPath.getResourceHierarchy())) { + if (arity == 2) { + Term newGetter = new Term(new Symbol("get" + typeName, -1, Symbol.Type.METHOD)); + newGetter.addChild(getter); if (curPath.getResourceHierarchy().getNumParameters() > 0) { - // may change the symbol name - getter.getSymbol().changeName("get" + typeName); - // add a path parameter. - Variable var = null; Expression param = curPath.getLastParam(); - if (param instanceof Variable) { - var = (Variable) param; - } else if (param instanceof Term) { - var = new Variable("v" + v, ((Term) param).getType()); + if (param != null) { + newGetter.addChild(param); + newGetter.getSymbol().setArity(2); } - if (var != null) { + } + getter = newGetter; + } else { + // add the last path parameter. + if (curPath.getResourceHierarchy().getNumParameters() > 0) { + Expression param = curPath.getLastParam(); + if (param != null) { getter.getSymbol().setArity(arity); - getter.addChild(var); - arity++; + getter.addChild(param); } - v++; + } + } + arity = 2; + doesChainInvocations = true; + } else { + // to get a descendant resource directly. (e.g, .todos.{year}.{month}.{day}.{id} ==> .getTodos().getTodo(year, month, day, id)) + if (doesChainInvocations) { + Term newGetter = new Term(new Symbol("get" + typeName, -1, Symbol.Type.METHOD)); + newGetter.addChild(getter); + getter = newGetter; + doesChainInvocations = false; + } + if (curPath.getResourceHierarchy().getNumParameters() > 0) { + // may change the symbol name + getter.getSymbol().changeName("get" + typeName); + // add a path parameter. + Expression param = curPath.getLastParam(); + if (param != null) { + getter.getSymbol().setArity(arity); + getter.addChild(param); + arity++; } } } } - if (generatesComponent(targetRes.getResourceHierarchy())) { - Term newGetter = new Term(new Symbol("getValue", 1, Symbol.Type.METHOD)); - newGetter.addChild(getter); - getter = newGetter; - } - return getter; } + if (generatesComponent(targetRes.getResourceHierarchy())) { + Term newGetter = new Term(new Symbol("getValue", 1, Symbol.Type.METHOD)); + newGetter.addChild(getter); + getter = newGetter; + } + return getter; } }; diff --git a/AlgebraicDataflowArchitectureModel/src/generators/JavaMethodBodyGenerator.java b/AlgebraicDataflowArchitectureModel/src/generators/JavaMethodBodyGenerator.java index f7574c6..5503479 100644 --- a/AlgebraicDataflowArchitectureModel/src/generators/JavaMethodBodyGenerator.java +++ b/AlgebraicDataflowArchitectureModel/src/generators/JavaMethodBodyGenerator.java @@ -68,6 +68,7 @@ ResourceNode src = (ResourceNode) resToCh.getSource(); ChannelNode directDstChNode = (ChannelNode) resToCh.getDestination(); DataTransferChannel directDstCh = directDstChNode.getChannel(); + // Should take into account the channel hierarchy. Set ancestorDstChannels = directDstChNode.getAncestors(); Set descendantDstChannels = directDstChNode.getDescendants(); Set outEdges = new HashSet<>(); @@ -173,6 +174,9 @@ if (JavaCodeGenerator.generatesComponent(outRes)) { if (updateExp instanceof Term && ((Term) updateExp).getSymbol().isImplWithSideEffect()) { updateStatement = sideEffects[0]; + if (updateStatement.endsWith("\n")) { + updateStatement = updateStatement.substring(0, updateStatement.length() - 1); + } } else { updateStatement = sideEffects[0] + "this.value = " + newState + ";"; } @@ -180,6 +184,9 @@ if (sideEffects[0] != null) { updateStatement = sideEffects[0]; updateStatement = updateStatement.replace(".value", "." + JavaCodeGenerator.toVariableName(JavaCodeGenerator.getComponentName(outRes))); + if (updateStatement.endsWith("\n")) { + updateStatement = updateStatement.substring(0, updateStatement.length() - 1); + } } if (DataConstraintModel.typeList.isAncestorOf(outRes.getParent().getResourceStateType())) { Term selector = new Term(DataConstraintModel.set); @@ -300,7 +307,7 @@ } // src side (for a chain of update method invocations) ChannelMember in = null; - for (ChannelMember cm: ch.getInputChannelMembers()) { + for (ChannelMember cm: directDstCh.getInputChannelMembers()) { if (src.getOutSideResources().contains(cm.getResource())) { in = cm; break; @@ -315,6 +322,32 @@ // For caller update methods for (MethodDeclaration srcUpdate: getUpdateMethods(srcComponent, srcResName)) { ResourcePath dstRes = out.getResource(); + // Get the value of reference member to call the update method. + String refParams = ""; + Set referredSet = referredResources.get(srcUpdate); + for (ChannelMember rc: ch.getReferenceChannelMembers()) { + ResourcePath ref = rc.getResource(); + if (referredSet == null) { + referredSet = new HashSet<>(); + referredResources.put(srcUpdate, referredSet); + } + if (!dst.getInSideResources().contains(ref)) { + String refVarName = JavaCodeGenerator.toVariableName(JavaCodeGenerator.getComponentName(ref.getResourceHierarchy())); + if (!referredSet.contains(ref)) { + referredSet.add(ref); + ResourcePath srcRes = in.getResource(); + if (!JavaCodeGenerator.generatesComponent(srcRes.getResourceHierarchy())) { + srcRes = srcRes.getParent(); + } + Expression refGetter = JavaCodeGenerator.pullAccessor.getDirectStateAccessorFor(ref, srcRes); + String[] sideEffects = new String[] {""}; + String refExp = refGetter.toImplementation(sideEffects); + String refTypeName = ref.getResourceStateType().getInterfaceTypeName(); + srcUpdate.addStatement(sideEffects[0] + refTypeName + " " + refVarName + " = " + refExp + ";"); + } + refParams += ", " + refVarName; + } + } // Update fields to refer to outside resources. Map>> resourcePaths = ch.fillOutsideResourcePaths(out, JavaCodeGenerator.pullAccessor); if (resourcePaths != null && resourcePaths.size() > 0) { @@ -359,28 +392,6 @@ chParams += selVar.getName() + ", "; } } - String refParams = ""; - Set referredSet = referredResources.get(srcUpdate); - for (ChannelMember rc: ch.getReferenceChannelMembers()) { - // to get the value of reference member to call the update method. - ResourcePath ref = rc.getResource(); - if (referredSet == null) { - referredSet = new HashSet<>(); - referredResources.put(srcUpdate, referredSet); - } - if (!dst.getInSideResources().contains(ref)) { - String refVarName = JavaCodeGenerator.toVariableName(JavaCodeGenerator.getComponentName(ref.getResourceHierarchy())); - if (!referredSet.contains(ref)) { - referredSet.add(ref); - Expression refGetter = JavaCodeGenerator.pullAccessor.getCurrentStateAccessorFor(rc, in); - String[] sideEffects = new String[] {""}; - String refExp = refGetter.toImplementation(sideEffects); - String refTypeName = ref.getResourceStateType().getInterfaceTypeName(); - srcUpdate.addFirstStatement(sideEffects[0] + refTypeName + " " + refVarName + " = " + refExp + ";"); - } - refParams += ", " + refVarName; - } - } // Call the update method. String updateMethodName = null; if (JavaCodeGenerator.generatesComponent(dst.getResourceHierarchy())) { @@ -462,6 +473,32 @@ // For caller input methods for (MethodDeclaration srcInput: getInputMethods(srcComponent, src, model)) { ResourcePath dstRes = out.getResource(); + // Get the value of reference member to call the update method. + String refParams = ""; + Set referredSet = referredResources.get(srcInput); + for (ChannelMember rc: ch.getReferenceChannelMembers()) { + ResourcePath ref = rc.getResource(); + if (referredSet == null) { + referredSet = new HashSet<>(); + referredResources.put(srcInput, referredSet); + } + if (!dst.getInSideResources().contains(ref)) { + String refVarName = JavaCodeGenerator.toVariableName(JavaCodeGenerator.getComponentName(ref.getResourceHierarchy())); + if (!referredSet.contains(ref)) { + referredSet.add(ref); + ResourcePath srcRes = in.getResource(); + if (!JavaCodeGenerator.generatesComponent(srcRes.getResourceHierarchy())) { + srcRes = srcRes.getParent(); + } + Expression refGetter = JavaCodeGenerator.pullAccessor.getDirectStateAccessorFor(ref, srcRes); + String[] sideEffects = new String[] {""}; + String refExp = refGetter.toImplementation(sideEffects); + String refTypeName = ref.getResourceStateType().getInterfaceTypeName(); + srcInput.addStatement(sideEffects[0] + refTypeName + " " + refVarName + " = " + refExp + ";"); + } + refParams += ", " + refVarName; + } + } // Update fields to refer to outside resources. Map>> resourcePaths = ch.fillOutsideResourcePaths(out, JavaCodeGenerator.pullAccessor); if (resourcePaths != null && resourcePaths.size() > 0) { @@ -506,28 +543,6 @@ chParams += selVar.getName() + ", "; } } - String refParams = ""; - Set referredSet = referredResources.get(srcInput); - for (ChannelMember rc: ch.getReferenceChannelMembers()) { - // to get the value of reference member to call the update method. - ResourcePath ref = rc.getResource(); - if (referredSet == null) { - referredSet = new HashSet<>(); - referredResources.put(srcInput, referredSet); - } - if (!dst.getInSideResources().contains(ref)) { - String refVarName = JavaCodeGenerator.toVariableName(JavaCodeGenerator.getComponentName(ref.getResourceHierarchy())); - if (!referredSet.contains(ref)) { - referredSet.add(ref); - Expression refGetter = JavaCodeGenerator.pullAccessor.getCurrentStateAccessorFor(rc, in); - String[] sideEffects = new String[] {""}; - String refExp = refGetter.toImplementation(sideEffects); - String refTypeName = ref.getResourceStateType().getInterfaceTypeName(); - srcInput.addFirstStatement(sideEffects[0] + refTypeName + " " + refVarName + " = " + refExp + ";"); - } - refParams += ", " + refVarName; - } - } // Call the update method. String updateMethodName = null; if (JavaCodeGenerator.generatesComponent(dst.getResourceHierarchy())) { @@ -690,7 +705,6 @@ if (JavaCodeGenerator.generatesComponent(outsidePath.getResourceHierarchy())) { outsideExp = ((Term) outsideExp).getChild(0); } - Expression nextExp = dependedMember.getStateTransition().getNextStateExpression(); if (dstComponent == dependedComponent) { // In the common parent. if (dependedNode != null) { // Inspect further dependency. @@ -948,6 +962,9 @@ String updateStatement; if (updateExp instanceof Term && ((Term) updateExp).getSymbol().isImplWithSideEffect()) { updateStatement = sideEffects[0]; + if (updateStatement.endsWith("\n")) { + updateStatement = updateStatement.substring(0, updateStatement.length() - 1); + } } else { updateStatement = sideEffects[0] + "this.value = " + newState + ";"; } @@ -957,8 +974,11 @@ } else { String updateStatement = ""; if (sideEffects[0] != null) { - updateStatement = sideEffects[0].replace("\n", ""); + updateStatement = sideEffects[0]; updateStatement = updateStatement.replace(".value", "." + JavaCodeGenerator.toVariableName(JavaCodeGenerator.getComponentName(resource))); + if (updateStatement.endsWith("\n")) { + updateStatement = updateStatement.substring(0, updateStatement.length() - 1); + } } if (DataConstraintModel.typeList.isAncestorOf(resource.getParent().getResourceStateType())) { Term selector = new Term(DataConstraintModel.set); diff --git a/AlgebraicDataflowArchitectureModel/src/generators/JavaSpecific.java b/AlgebraicDataflowArchitectureModel/src/generators/JavaSpecific.java index 6134a5f..dfe5850 100644 --- a/AlgebraicDataflowArchitectureModel/src/generators/JavaSpecific.java +++ b/AlgebraicDataflowArchitectureModel/src/generators/JavaSpecific.java @@ -192,6 +192,26 @@ } @Override + public String getForStatement(String varName, String list) { + return "for (int " + varName + getAssignment() + "0; " + varName + " < " + list + ".size(); " + varName + "++) {"; + } + + @Override + public String getForStatement(String varName, String varType, String map) { + return "for (" + varType + " " + varName + ": " + map + ".keySet()) {"; + } + + @Override + public String getEndForStatement() { + return "}"; + } + + @Override + public String getEndForStatement(String varName) { + return "}"; + } + + @Override public String toComponentName(String name) { return name.substring(0, 1).toUpperCase() + name.substring(1); } diff --git a/AlgebraicDataflowArchitectureModel/src/generators/JerseyCodeGenerator.java b/AlgebraicDataflowArchitectureModel/src/generators/JerseyCodeGenerator.java index 76dd5b2..ae93b32 100644 --- a/AlgebraicDataflowArchitectureModel/src/generators/JerseyCodeGenerator.java +++ b/AlgebraicDataflowArchitectureModel/src/generators/JerseyCodeGenerator.java @@ -1483,7 +1483,6 @@ } while (curPath != null); // iterate from the `from' resource Term getter = null; - int v = 1; int arity = 2; boolean doesChainInvocations = true; while (!pathStack.empty()) { @@ -1499,35 +1498,21 @@ Term newGetter = new Term(new Symbol("get" + typeName, -1, Symbol.Type.METHOD)); newGetter.addChild(getter); if (curPath.getResourceHierarchy().getNumParameters() > 0) { - Variable var = null; Expression param = curPath.getLastParam(); - if (param instanceof Variable) { - var = (Variable) param; - } else if (param instanceof Term) { - var = new Variable("v" + v, ((Term) param).getType()); - } - if (var != null) { - newGetter.addChild(var); + if (param != null) { + newGetter.addChild(param); newGetter.getSymbol().setArity(2); } - v++; } getter = newGetter; } else { // add the last path parameter. if (curPath.getResourceHierarchy().getNumParameters() > 0) { - Variable var = null; Expression param = curPath.getLastParam(); - if (param instanceof Variable) { - var = (Variable) param; - } else if (param instanceof Term) { - var = new Variable("v" + v, ((Term) param).getType()); - } - if (var != null) { + if (param != null) { getter.getSymbol().setArity(arity); - getter.addChild(var); + getter.addChild(param); } - v++; } } arity = 2; @@ -1544,19 +1529,12 @@ // may change the symbol name getter.getSymbol().changeName("get" + typeName); // add a path parameter. - Variable var = null; Expression param = curPath.getLastParam(); - if (param instanceof Variable) { - var = (Variable) param; - } else if (param instanceof Term) { - var = new Variable("v" + v, ((Term) param).getType()); - } - if (var != null) { + if (param != null) { getter.getSymbol().setArity(arity); - getter.addChild(var); + getter.addChild(param); arity++; } - v++; } } } diff --git a/AlgebraicDataflowArchitectureModel/src/tests/JavaCodeGeneratorTest.java b/AlgebraicDataflowArchitectureModel/src/tests/JavaCodeGeneratorTest.java index 24dd6c2..7dd659f 100644 --- a/AlgebraicDataflowArchitectureModel/src/tests/JavaCodeGeneratorTest.java +++ b/AlgebraicDataflowArchitectureModel/src/tests/JavaCodeGeneratorTest.java @@ -51,7 +51,7 @@ public void test() { testAccounts(); testClock(); -// testCustomerManagement(); // Two methods with the same signature are generated. *** temporarily does now work correctly *** + testCustomerManagement(); // Two methods with the same signature are generated. testGroupChat(); testInventoryManagement(); // testOnlineBattleGame(); // A feature has not been implemented for Java prototype generation. @@ -434,7 +434,7 @@ 2))), Map.entry("setOrganization", Map.entry("void", Map.entry(List.of("String","String"), - 3))), + 4))), Map.entry("Customer", Map.entry("void", Map.entry(List.of("Companies","String"), 3)))))); @@ -1357,7 +1357,7 @@ 2)))))); checkStructure(generatedCode, exprectedStructure); - generateCheckCode(generatedCode); +// generateCheckCode(generatedCode); } catch (FileNotFoundException | ExpectedChannel | ExpectedChannelName | ExpectedLeftCurlyBracket | ExpectedInOrOutOrRefOrSubKeyword | ExpectedStateTransition | ExpectedEquals | ExpectedRHSExpression | WrongLHSExpression