1つのリソースに2つの入出力チャンネルが接続しているとき,また1つのリソースが2種類の入力メッセージ受けるときに正しく生成できなかった不具合を修正した.
1 parent a33dfc2 commit 6acbf0a43dc42d85d60e6bde47984e4653ed06af
Naoya Nitta authored on 30 May 2022
Showing 4 changed files
View
2
■■■
AlgebraicDataflowArchitectureModel/src/algorithms/JavaCodeGenerator.java
// Declare input methods in resources and the main type.
for (ChannelGenerator cg : model.getIOChannelGenerators()) {
for (ChannelMember cm : cg.getChannelMembers()) {
if (cm.getIdentifierTemplate().getResourceName().equals(type.getTypeName().toLowerCase())) {
if (cm.getIdentifierTemplate().equals(rn.getIdentifierTemplate())) {
Expression message = cm.getStateTransition().getMessageExpression();
if (message.getClass() == Term.class) {
ArrayList<VariableDeclaration> params = new ArrayList<>();
for (Variable var: message.getVariables().values()) {
View
28
AlgebraicDataflowArchitectureModel/src/algorithms/JavaMethodBodyGenerator.java
if (getter.getBody() == null || getter.getBody().getStatements().size() == 0) {
getter.addStatement("return value;");
}
// methods for input events
Map.Entry<DataflowChannelGenerator, Set<ChannelMember>> ioChannelAndMembers = getIOChannelAndMembers(resource, model);
if (ioChannelAndMembers != null) {
Set<ChannelMember> outs = ioChannelAndMembers.getValue();
Map<DataflowChannelGenerator, Set<ChannelMember>> ioChannelsAndMembers = getIOChannelsAndMembers(resource, model);
for (Map.Entry<DataflowChannelGenerator, Set<ChannelMember>> entry: ioChannelsAndMembers.entrySet()) {
Set<ChannelMember> outs = entry.getValue();
for (ChannelMember out: outs) {
MethodDeclaration input = getInputMethod(type, out);
if (input != null) {
String[] sideEffects = new String[] {""};
Expression updateExp = ioChannelAndMembers.getKey().deriveUpdateExpressionOf(out, JavaCodeGenerator.pushAccessor);
Expression updateExp = entry.getKey().deriveUpdateExpressionOf(out, JavaCodeGenerator.pushAccessor);
String newState = updateExp.toImplementation(sideEffects);
String updateStatement;
if (updateExp instanceof Term && ((Term) updateExp).getSymbol().isImplWithSideEffect()) {
updateStatement = sideEffects[0];
}
return null;
}
private static Map.Entry<DataflowChannelGenerator, Set<ChannelMember>> getIOChannelAndMembers(ResourceNode resource, DataFlowModel model) {
Set<ChannelMember> channelMembers = new HashSet<>();
DataflowChannelGenerator channel = null;
private static Map<DataflowChannelGenerator, Set<ChannelMember>> getIOChannelsAndMembers(ResourceNode resource, DataFlowModel model) {
Map<DataflowChannelGenerator, Set<ChannelMember>> ioChannelsAndMembers = new HashMap<>();
for (ChannelGenerator c: model.getIOChannelGenerators()) {
DataflowChannelGenerator ch = (DataflowChannelGenerator) c;
// I/O channel
for (ChannelMember out: ch.getOutputChannelMembers()) {
if (out.getIdentifierTemplate().equals(resource.getIdentifierTemplate())) {
if (out.getStateTransition().getMessageExpression() instanceof Term || out.getStateTransition().getMessageExpression() instanceof Variable) {
channel = ch;
Set<ChannelMember> channelMembers = ioChannelsAndMembers.get(ch);
if (channelMembers == null) {
channelMembers = new HashSet<>();
ioChannelsAndMembers.put(ch, channelMembers);
}
channelMembers.add(out);
}
}
}
}
if (channel == null) return null;
return new AbstractMap.SimpleEntry<>(channel, channelMembers);
return ioChannelsAndMembers;
}
 
private static List<MethodDeclaration> getInputMethods(TypeDeclaration type, ResourceNode resource, DataFlowModel model) {
List<MethodDeclaration> inputs = new ArrayList<>();
View
2
■■■
AlgebraicDataflowArchitectureModel/src/algorithms/JerseyCodeGenerator.java
// Declare input methods in resources.
for (ChannelGenerator cg : model.getIOChannelGenerators()) {
for (ChannelMember cm : cg.getChannelMembers()) {
if (cm.getIdentifierTemplate().getResourceName().equals(type.getTypeName().toLowerCase())) {
if (cm.getIdentifierTemplate().equals(rn.getIdentifierTemplate())) {
Expression message = cm.getStateTransition().getMessageExpression();
if (message.getClass() == Term.class) {
ArrayList<VariableDeclaration> params = new ArrayList<>();
for (Variable var: message.getVariables().values()) {
View
AlgebraicDataflowArchitectureModel/src/algorithms/JerseyMethodBodyGenerator.java