diff --git a/AlgebraicDataflowArchitectureModel/src/algorithms/JavaCodeGenerator.java b/AlgebraicDataflowArchitectureModel/src/algorithms/JavaCodeGenerator.java index de89ba5..4941a19 100644 --- a/AlgebraicDataflowArchitectureModel/src/algorithms/JavaCodeGenerator.java +++ b/AlgebraicDataflowArchitectureModel/src/algorithms/JavaCodeGenerator.java @@ -218,6 +218,17 @@ } } } + } else if (message.getClass() == Variable.class) { + MethodDeclaration input = new MethodDeclaration( + ((Variable) cm.getStateTransition().getMessageExpression()).getName(), + false, typeVoid, null); + type.addMethod(input); + String str = ((Variable) cm.getStateTransition().getMessageExpression()).getName(); + input = getMethod(mainType, str); + if (input == null) { + input = new MethodDeclaration(str, false, typeVoid, null); + mainType.addMethod(input); + } } } } diff --git a/AlgebraicDataflowArchitectureModel/src/algorithms/JavaMethodBodyGenerator.java b/AlgebraicDataflowArchitectureModel/src/algorithms/JavaMethodBodyGenerator.java index 2737c34..b2f0f0a 100644 --- a/AlgebraicDataflowArchitectureModel/src/algorithms/JavaMethodBodyGenerator.java +++ b/AlgebraicDataflowArchitectureModel/src/algorithms/JavaMethodBodyGenerator.java @@ -162,8 +162,7 @@ if (ioChannelAndMembers != null) { Set outs = ioChannelAndMembers.getValue(); for (ChannelMember out: outs) { - Term message = (Term) out.getStateTransition().getMessageExpression(); - MethodDeclaration input = getMethod(type, message.getSymbol().getName()); + MethodDeclaration input = getInputMethod(type, out); if (input != null) { String[] sideEffects = new String[] {""}; Expression updateExp = ioChannelAndMembers.getKey().deriveUpdateExpressionOf(out, JavaCodeGenerator.pushAccessor); @@ -182,9 +181,12 @@ if (mainInput != null) { String args = ""; String delimitar = ""; - for (Variable var: message.getVariables().values()) { - args += delimitar + var.getName(); - delimitar = ", "; + if (out.getStateTransition().getMessageExpression() instanceof Term) { + Term message = (Term) out.getStateTransition().getMessageExpression(); + for (Variable var: message.getVariables().values()) { + args += delimitar + var.getName(); + delimitar = ", "; + } } mainInput.addStatement("this." + resourceName + "." + input.getName() + "(" + args + ");"); } @@ -233,8 +235,7 @@ // I/O channel for (ChannelMember out: ch.getOutputChannelMembers()) { if (out.getIdentifierTemplate().equals(resource.getIdentifierTemplate())) { - if (out.getStateTransition().getMessageExpression() instanceof Term) { - // not an identity element + if (out.getStateTransition().getMessageExpression() instanceof Term || out.getStateTransition().getMessageExpression() instanceof Variable) { channel = ch; channelMembers.add(out); } @@ -251,18 +252,26 @@ // I/O channel for (ChannelMember out: channel.getOutputChannelMembers()) { if (out.getIdentifierTemplate().equals(resource.getIdentifierTemplate())) { - if (out.getStateTransition().getMessageExpression() instanceof Term) { - // not an identity element - Term message = (Term) out.getStateTransition().getMessageExpression(); - MethodDeclaration input = getMethod(type, message.getSymbol().getName()); - return input; - } + MethodDeclaration input = getInputMethod(type, out); + if (input != null) return input; } } } return null; } + private static MethodDeclaration getInputMethod(TypeDeclaration type, ChannelMember out) { + MethodDeclaration input = null; + if (out.getStateTransition().getMessageExpression() instanceof Term) { + Term message = (Term) out.getStateTransition().getMessageExpression(); + input = getMethod(type, message.getSymbol().getImplName()); + } else if (out.getStateTransition().getMessageExpression() instanceof Variable) { + Variable message = (Variable) out.getStateTransition().getMessageExpression(); + input = getMethod(type, message.getName()); + } + return input; + } + private static MethodDeclaration getMethod(TypeDeclaration type, String methodName) { for (MethodDeclaration m: type.getMethods()) { if (m.getName().equals(methodName)) return m; diff --git a/AlgebraicDataflowArchitectureModel/src/algorithms/JerseyCodeGenerator.java b/AlgebraicDataflowArchitectureModel/src/algorithms/JerseyCodeGenerator.java index 18556d6..4a1bf2e 100644 --- a/AlgebraicDataflowArchitectureModel/src/algorithms/JerseyCodeGenerator.java +++ b/AlgebraicDataflowArchitectureModel/src/algorithms/JerseyCodeGenerator.java @@ -149,6 +149,16 @@ input.addAnnotation(new Annotation("POST")); } type.addMethod(input); + } else if (message.getClass() == Variable.class) { + MethodDeclaration input = new MethodDeclaration( + ((Variable) cm.getStateTransition().getMessageExpression()).getName(), + false, typeVoid, null); + 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 89446db..0007bcd 100644 --- a/AlgebraicDataflowArchitectureModel/src/algorithms/JerseyMethodBodyGenerator.java +++ b/AlgebraicDataflowArchitectureModel/src/algorithms/JerseyMethodBodyGenerator.java @@ -22,6 +22,7 @@ import models.algebra.Type; import models.algebra.UnificationFailed; import models.algebra.ValueUndefined; +import models.algebra.Variable; import models.dataConstraintModel.ChannelGenerator; import models.dataConstraintModel.ChannelMember; import models.dataConstraintModel.DataConstraintModel; @@ -224,8 +225,7 @@ if (ioChannelAndMembers != null) { Set outs = ioChannelAndMembers.getValue(); for (ChannelMember out: outs) { - Term message = (Term) out.getStateTransition().getMessageExpression(); - MethodDeclaration input = getMethod(type, message.getSymbol().getName()); + MethodDeclaration input = getInputMethod(type, out); if (input != null) { Expression updateExp = ioChannelAndMembers.getKey().deriveUpdateExpressionOf(out, JerseyCodeGenerator.pushAccessor); String[] sideEffects = new String[] {""}; @@ -390,8 +390,7 @@ // I/O channel for (ChannelMember out: ch.getOutputChannelMembers()) { if (out.getIdentifierTemplate().equals(resource.getIdentifierTemplate())) { - if (out.getStateTransition().getMessageExpression() instanceof Term) { - // not an identity element + if (out.getStateTransition().getMessageExpression() instanceof Term || out.getStateTransition().getMessageExpression() instanceof Variable) { channel = ch; channelMembers.add(out); } @@ -408,18 +407,26 @@ // I/O channel for (ChannelMember out: channel.getOutputChannelMembers()) { if (out.getIdentifierTemplate().equals(resource.getIdentifierTemplate())) { - if (out.getStateTransition().getMessageExpression() instanceof Term) { - // not an identity element - Term message = (Term) out.getStateTransition().getMessageExpression(); - MethodDeclaration input = getMethod(type, message.getSymbol().getName()); - return input; - } + MethodDeclaration input = getInputMethod(type, out); + if (input != null) return input; } } } return null; } + private static MethodDeclaration getInputMethod(TypeDeclaration type, ChannelMember out) { + MethodDeclaration input = null; + if (out.getStateTransition().getMessageExpression() instanceof Term) { + Term message = (Term) out.getStateTransition().getMessageExpression(); + input = getMethod(type, message.getSymbol().getImplName()); + } else if (out.getStateTransition().getMessageExpression() instanceof Variable) { + Variable message = (Variable) out.getStateTransition().getMessageExpression(); + input = getMethod(type, message.getName()); + } + return input; + } + private static MethodDeclaration getMethod(TypeDeclaration type, String methodName) { for (MethodDeclaration m: type.getMethods()) { if (m.getName().equals(methodName)) return m; diff --git a/AlgebraicDataflowArchitectureModel/src/models/dataConstraintModel/StateTransition.java b/AlgebraicDataflowArchitectureModel/src/models/dataConstraintModel/StateTransition.java index e3493b5..011045a 100644 --- a/AlgebraicDataflowArchitectureModel/src/models/dataConstraintModel/StateTransition.java +++ b/AlgebraicDataflowArchitectureModel/src/models/dataConstraintModel/StateTransition.java @@ -157,13 +157,15 @@ Expression messageTerm = getMessageExpression(); HashMap messageVars = messageTerm.getVariables(); - for (Entry messageVarEnt: messageVars.entrySet()) { - Variable var = messageVarEnt.getValue(); - Position varPos = messageVarEnt.getKey(); - Expression valueCalc = concreteMessage.getSubTerm(varPos); - if (valueCalc != null) { - if (bindings.get(var) != null) throw new ResolvingMultipleDefinitionIsFutureWork(); - bindings.put(var, valueCalc); + if (concreteMessage != null) { + for (Entry messageVarEnt: messageVars.entrySet()) { + Variable var = messageVarEnt.getValue(); + Position varPos = messageVarEnt.getKey(); + Expression valueCalc = concreteMessage.getSubTerm(varPos); + if (valueCalc != null) { + if (bindings.get(var) != null) throw new ResolvingMultipleDefinitionIsFutureWork(); + bindings.put(var, valueCalc); + } } } diff --git a/AlgebraicDataflowArchitectureModel/src/models/dataFlowModel/DataflowChannelGenerator.java b/AlgebraicDataflowArchitectureModel/src/models/dataFlowModel/DataflowChannelGenerator.java index 2839622..40dd36d 100644 --- a/AlgebraicDataflowArchitectureModel/src/models/dataFlowModel/DataflowChannelGenerator.java +++ b/AlgebraicDataflowArchitectureModel/src/models/dataFlowModel/DataflowChannelGenerator.java @@ -219,7 +219,9 @@ Expression curOutputStateAccessor = stateAccessor.getCurrentStateAccessorFor(targetIdentifier, targetIdentifier); if (unifiedMessage == null) { // for IOChannel - unifiedMessage = (Term) targetMember.getStateTransition().getMessageExpression(); + if (targetMember.getStateTransition().getMessageExpression() instanceof Term) { + unifiedMessage = (Term) targetMember.getStateTransition().getMessageExpression(); + } } return targetMember.getStateTransition().deriveNextStateExpressionFor(curOutputStateAccessor, unifiedMessage); }