diff --git a/AlgebraicDataflowArchitectureModel/src/algorithms/JerseyCodeGenerator.java b/AlgebraicDataflowArchitectureModel/src/algorithms/JerseyCodeGenerator.java index 903c8f5..dfd8574 100644 --- a/AlgebraicDataflowArchitectureModel/src/algorithms/JerseyCodeGenerator.java +++ b/AlgebraicDataflowArchitectureModel/src/algorithms/JerseyCodeGenerator.java @@ -103,10 +103,14 @@ param.addAnnotation(new Annotation("FormParam", "\"" + srcName + "\"")); vars.add(param); MethodDeclaration update = new MethodDeclaration("update" + srcResName, false, typeVoid, vars); - if (((StoreAttribute) rn.getAttribute()).isNeeded()) { - update.addAnnotation(new Annotation("POST")); - } else { - update.addAnnotation(new Annotation("PUT")); + for (ChannelMember cm: re.getChannelGenerator().getOutputChannelMembers()) { + if (cm.getIdentifierTemplate() == rn.getIdentifierTemplate()) { + if (cm.getStateTransition().isRightUnary()) { + update.addAnnotation(new Annotation("PUT")); + } else { + update.addAnnotation(new Annotation("POST")); + } + } } if (rn.getInEdges().size() > 1) { // For each source resource, a child resource is defined in the destination resource so that its state can be updated separately. @@ -139,10 +143,10 @@ MethodDeclaration input = new MethodDeclaration( ((Term) cm.getStateTransition().getMessageExpression()).getSymbol().getImplName(), false, typeVoid, params); - if (((StoreAttribute) rn.getAttribute()).isNeeded()) { - input.addAnnotation(new Annotation("POST")); - } else { + if (cm.getStateTransition().isRightUnary()) { input.addAnnotation(new Annotation("PUT")); + } else { + input.addAnnotation(new Annotation("POST")); } type.addMethod(input); } diff --git a/AlgebraicDataflowArchitectureModel/src/algorithms/JerseyMethodBodyGenerator.java b/AlgebraicDataflowArchitectureModel/src/algorithms/JerseyMethodBodyGenerator.java index 42f4707..edc2624 100644 --- a/AlgebraicDataflowArchitectureModel/src/algorithms/JerseyMethodBodyGenerator.java +++ b/AlgebraicDataflowArchitectureModel/src/algorithms/JerseyMethodBodyGenerator.java @@ -125,10 +125,10 @@ } // src side (for a chain of update method invocations) String httpMethod = null; - if (((StoreAttribute) dst.getAttribute()).isNeeded()) { - httpMethod = "post"; - } else { + if (out.getStateTransition().isRightUnary()) { httpMethod = "put"; + } else { + httpMethod = "post"; } for (MethodDeclaration srcUpdate: getUpdateMethods(srcType)) { if (srcUpdate != null) { diff --git a/AlgebraicDataflowArchitectureModel/src/algorithms/NecessityOfStoringResourceStates.java b/AlgebraicDataflowArchitectureModel/src/algorithms/NecessityOfStoringResourceStates.java index b533a79..35e5a9d 100644 --- a/AlgebraicDataflowArchitectureModel/src/algorithms/NecessityOfStoringResourceStates.java +++ b/AlgebraicDataflowArchitectureModel/src/algorithms/NecessityOfStoringResourceStates.java @@ -15,15 +15,7 @@ channels.addAll(model.getChannelGenerators()); for (ChannelGenerator generator: channels) { for (ChannelMember member: ((DataflowChannelGenerator) generator).getOutputChannelMembers()) { - boolean flag = false; - Expression curexp = member.getStateTransition().getCurStateExpression(); - Expression nextexp = member.getStateTransition().getNextStateExpression(); - for (Position pos : curexp.getVariables().keySet()) { - if (nextexp.contains(curexp.getVariables().get(pos))) { - flag = true; - break; - } - } + boolean flag = !member.getStateTransition().isRightUnary(); // The state does not need to be stored if the state transition function is right unary. for (Node node : graph.getNodes()) { if (((ResourceNode) node).getIdentifierTemplate().equals(member.getIdentifierTemplate())) { setStoreAttribute(flag, (ResourceNode) node); diff --git a/AlgebraicDataflowArchitectureModel/src/models/dataConstraintModel/StateTransition.java b/AlgebraicDataflowArchitectureModel/src/models/dataConstraintModel/StateTransition.java index 2bfb09b..cf41733 100644 --- a/AlgebraicDataflowArchitectureModel/src/models/dataConstraintModel/StateTransition.java +++ b/AlgebraicDataflowArchitectureModel/src/models/dataConstraintModel/StateTransition.java @@ -40,6 +40,13 @@ public void setMessageExpression(Expression messageExpression) { this.messageExpression = messageExpression; } + + public boolean isRightUnary() { + for (Position pos : curStateExpression.getVariables().keySet()) { + if (nextStateExpression.contains(curStateExpression.getVariables().get(pos))) return false; + } + return true; + } public Expression deriveMessageConstraintFor(Expression curStateValue, Expression nextStateValue) throws InvalidMessage, ResolvingMultipleDefinitionIsFutureWork { HashMap> bindings = new HashMap<>();