Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Improve logging in Synapse Expressions #2264

Merged
merged 1 commit into from
Dec 13, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -57,6 +57,7 @@
import org.apache.synapse.util.resolver.ResourceMap;
import org.apache.synapse.util.resolver.UserDefinedXmlSchemaURIResolver;
import org.apache.synapse.util.xpath.SourceXPathSupport;
import org.apache.synapse.util.xpath.SynapseExpression;
import org.apache.synapse.util.xpath.SynapseJsonPath;
import org.apache.synapse.util.xpath.SynapseXPath;
import org.xml.sax.SAXException;
Expand Down Expand Up @@ -279,10 +280,11 @@ public boolean mediate(MessageContext synCtx) {
String jsonPayload = null;
if (sourcePath != null) {
//evaluating
if (sourcePath instanceof SynapseJsonPath) {
if (sourcePath instanceof SynapseJsonPath || sourcePath instanceof SynapseExpression) {
jsonPayload = sourcePath.stringValueOf(synCtx);
} else {
handleException("Could not find the JSONPath evaluator for Source", synCtx);
handleException("Could not find JSONPath or Synapse Expression to extract the message " +
"to validate from the payload", synCtx);
}
} else {
jsonPayload = JsonUtil.jsonPayloadToString(a2mc);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -17,16 +17,12 @@
*/
package org.apache.synapse.util.synapse.expression.ast;


import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.apache.synapse.util.synapse.expression.context.EvaluationContext;

/**
* Represents a node in the AST that holds a signed expression. ex: ( -var.num1 )
*/
public class SignedExpressionNode implements ExpressionNode {
private static final Log log = LogFactory.getLog(SignedExpressionNode.class);
private final ExpressionNode expression;
private final boolean signed;

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,8 @@
*/
package org.apache.synapse.util.synapse.expression.visitor;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.apache.synapse.SynapseConstants;
import org.apache.synapse.util.synapse.expression.ast.*;
import org.apache.synapse.util.synapse.expression.constants.ExpressionConstants;
Expand All @@ -35,8 +37,13 @@
public class ExpressionVisitor extends ExpressionParserBaseVisitor<ExpressionNode>
implements ExpressionParserVisitor<ExpressionNode> {

private static final Log log = LogFactory.getLog(ExpressionVisitor.class);

@Override
public ExpressionNode visitExpression(ExpressionParser.ExpressionContext ctx) {
if (log.isDebugEnabled()) {
log.debug("Visiting expression: " + ctx.getText());
}
if (ctx.comparisonExpression() != null) {
return visitComparisonExpression(ctx.comparisonExpression());
} else if (ctx.conditionalExpression() != null) {
Expand All @@ -47,6 +54,9 @@ public ExpressionNode visitExpression(ExpressionParser.ExpressionContext ctx) {

@Override
public ExpressionNode visitComparisonExpression(ExpressionParser.ComparisonExpressionContext ctx) {
if (log.isDebugEnabled()) {
log.debug("Visiting comparison expression: " + ctx.getText());
}
if (ctx.logicalExpression() != null) {
if (ctx.logicalExpression().size() == 1) {
return visitLogicalExpression(ctx.logicalExpression().get(0));
Expand All @@ -64,6 +74,9 @@ public ExpressionNode visitComparisonExpression(ExpressionParser.ComparisonExpre

@Override
public ExpressionNode visitLogicalExpression(ExpressionParser.LogicalExpressionContext ctx) {
if (log.isDebugEnabled()) {
log.debug("Visiting logical expression: " + ctx.getText());
}
if (ctx.arithmeticExpression() != null) {
ExpressionNode left = visit(ctx.arithmeticExpression());
if (ctx.logicalExpression() != null && ctx.getChild(1) != null) {
Expand All @@ -77,6 +90,9 @@ public ExpressionNode visitLogicalExpression(ExpressionParser.LogicalExpressionC

@Override
public ExpressionNode visitArithmeticExpression(ExpressionParser.ArithmeticExpressionContext ctx) {
if (log.isDebugEnabled()) {
log.debug("Visiting arithmetic expression: " + ctx.getText());
}
if (ctx.term() != null) {
if (ctx.term().size() == 1) {
return visit(ctx.term().get(0));
Expand All @@ -94,6 +110,9 @@ public ExpressionNode visitArithmeticExpression(ExpressionParser.ArithmeticExpre

@Override
public ExpressionNode visitTerm(ExpressionParser.TermContext ctx) {
if (log.isDebugEnabled()) {
log.debug("Visiting term: " + ctx.getText());
}
if (ctx.factor() != null) {
if (ctx.factor().size() == 1) {
return visit(ctx.factor().get(0));
Expand All @@ -111,6 +130,9 @@ public ExpressionNode visitTerm(ExpressionParser.TermContext ctx) {

@Override
public ExpressionNode visitFactor(ExpressionParser.FactorContext ctx) {
if (log.isDebugEnabled()) {
log.debug("Visiting factor: " + ctx.getText());
}
if (ctx.literal() != null) {
return visit(ctx.literal());
} else if (ctx.functionCall() != null) {
Expand All @@ -135,6 +157,9 @@ public ExpressionNode visitFactor(ExpressionParser.FactorContext ctx) {

@Override
public ExpressionNode visitFunctionCall(ExpressionParser.FunctionCallContext ctx) {
if (log.isDebugEnabled()) {
log.debug("Visiting function call: " + ctx.getText());
}
ArgumentListNode parameterList = new ArgumentListNode();
if (ctx.expression() != null) {
for (ExpressionParser.ExpressionContext expressionContext : ctx.expression()) {
Expand Down Expand Up @@ -263,6 +288,9 @@ public ExpressionNode visitFunctionCall(ExpressionParser.FunctionCallContext ctx

@Override
public ExpressionNode visitLiteral(ExpressionParser.LiteralContext ctx) {
if (log.isDebugEnabled()) {
log.debug("Visiting literal: " + ctx.getText());
}
if (ctx.NUMBER() != null) {
return new LiteralNode(ctx.NUMBER().getText(), LiteralNode.Type.NUMBER);
} else if (ctx.BOOLEAN_LITERAL() != null) {
Expand All @@ -279,6 +307,9 @@ public ExpressionNode visitLiteral(ExpressionParser.LiteralContext ctx) {

@Override
public ExpressionNode visitArrayLiteral(ExpressionParser.ArrayLiteralContext ctx) {
if (log.isDebugEnabled()) {
log.debug("Visiting array literal: " + ctx.getText());
}
if (ctx.expression() != null) {
ArgumentListNode parameterList = new ArgumentListNode();
for (ExpressionParser.ExpressionContext expressionContext : ctx.expression()) {
Expand All @@ -291,6 +322,9 @@ public ExpressionNode visitArrayLiteral(ExpressionParser.ArrayLiteralContext ctx

@Override
public ExpressionNode visitVariableAccess(ExpressionParser.VariableAccessContext ctx) {
if (log.isDebugEnabled()) {
log.debug("Visiting variable access: " + ctx.getText());
}
Map<String, ExpressionNode> expressionNodeMap = new HashMap<>();
if (ctx.jsonPathExpression() != null) {
expressionNodeMap = visitJsonPath(ctx.jsonPathExpression());
Expand All @@ -300,6 +334,9 @@ public ExpressionNode visitVariableAccess(ExpressionParser.VariableAccessContext

@Override
public ExpressionNode visitPayloadAccess(ExpressionParser.PayloadAccessContext ctx) {
if (log.isDebugEnabled()) {
log.debug("Visiting payload access: " + ctx.getText());
}
Map<String, ExpressionNode> expressionNodeMap = new HashMap<>();
if (ctx.jsonPathExpression() != null) {
expressionNodeMap = visitJsonPath(ctx.jsonPathExpression());
Expand All @@ -308,6 +345,9 @@ public ExpressionNode visitPayloadAccess(ExpressionParser.PayloadAccessContext c
}

public Map<String, ExpressionNode> visitJsonPath(ExpressionParser.JsonPathExpressionContext ctx) {
if (log.isDebugEnabled()) {
log.debug("Visiting json path: " + ctx.getText());
}
Map<String, ExpressionNode> expressionNodeMap = new HashMap<>();
if (ctx.arrayIndex() != null) {
for (ExpressionParser.ArrayIndexContext expressionContext : ctx.arrayIndex()) {
Expand All @@ -319,6 +359,9 @@ public Map<String, ExpressionNode> visitJsonPath(ExpressionParser.JsonPathExpres

public ExpressionNode visitJsonPathAfterPayload(ExpressionParser.JsonPathExpressionContext ctx,
PredefinedFunctionNode functionNode, PayloadAccessNode.Type type) {
if (log.isDebugEnabled()) {
log.debug("Visiting json path after payload: " + ctx.getText());
}
Map<String, ExpressionNode> expressionNodeMap = new HashMap<>();
if (ctx.arrayIndex() != null) {
for (ExpressionParser.ArrayIndexContext expressionContext : ctx.arrayIndex()) {
Expand All @@ -330,6 +373,9 @@ public ExpressionNode visitJsonPathAfterPayload(ExpressionParser.JsonPathExpress

@Override
public ExpressionNode visitArrayIndex(ExpressionParser.ArrayIndexContext ctx) {
if (log.isDebugEnabled()) {
log.debug("Visiting array index: " + ctx.getText());
}
if (ctx.NUMBER() != null) {
return new LiteralNode(ctx.NUMBER().getText(), LiteralNode.Type.NUMBER);
} else if (ctx.STRING_LITERAL() != null) {
Expand All @@ -352,6 +398,9 @@ public ExpressionNode visitArrayIndex(ExpressionParser.ArrayIndexContext ctx) {

@Override
public ExpressionNode visitMultipleArrayIndices(ExpressionParser.MultipleArrayIndicesContext ctx) {
if (log.isDebugEnabled()) {
log.debug("Visiting multiple array indices: " + ctx.getText());
}
if (ctx.expression() != null) {
ArgumentListNode expressionNodes = new ArgumentListNode();
for (ExpressionParser.ExpressionContext expressionContext : ctx.expression()) {
Expand All @@ -364,6 +413,9 @@ public ExpressionNode visitMultipleArrayIndices(ExpressionParser.MultipleArrayIn

@Override
public ExpressionNode visitSliceArrayIndex(ExpressionParser.SliceArrayIndexContext ctx) {
if (log.isDebugEnabled()) {
log.debug("Visiting slice array index: " + ctx.getText());
}
if (ctx.signedExpressions() != null) {
ArgumentListNode expressionNodes = new ArgumentListNode();
if (ctx.getChildCount() == 2 && ctx.getChild(0).getText().equals(":")) {
Expand All @@ -382,6 +434,9 @@ public ExpressionNode visitSliceArrayIndex(ExpressionParser.SliceArrayIndexConte

@Override
public ExpressionNode visitSignedExpressions(ExpressionParser.SignedExpressionsContext ctx) {
if (log.isDebugEnabled()) {
log.debug("Visiting signed expressions: " + ctx.getText());
}
if (ctx.expression() != null) {
if (ctx.MINUS() != null) {
return new SignedExpressionNode(visit(ctx.expression()), true);
Expand All @@ -394,6 +449,9 @@ public ExpressionNode visitSignedExpressions(ExpressionParser.SignedExpressionsC

@Override
public ExpressionNode visitFilterExpression(ExpressionParser.FilterExpressionContext ctx) {
if (log.isDebugEnabled()) {
log.debug("Visiting filter expression: " + ctx.getText());
}
Map<String, ExpressionNode> expressionNodeMap = new HashMap<>();
if (ctx.filterComponent() != null) {
for (ExpressionParser.FilterComponentContext filterExpressionContext : ctx.filterComponent()) {
Expand All @@ -405,6 +463,9 @@ public ExpressionNode visitFilterExpression(ExpressionParser.FilterExpressionCon

@Override
public ExpressionNode visitFilterComponent(ExpressionParser.FilterComponentContext ctx) {
if (log.isDebugEnabled()) {
log.debug("Visiting filter component: " + ctx.getText());
}
if (ctx.payloadAccess() != null) {
return visit(ctx.payloadAccess());
} else if (ctx.stringOrOperator() != null) {
Expand All @@ -427,6 +488,9 @@ public ExpressionNode visitFilterComponent(ExpressionParser.FilterComponentConte

@Override
public ExpressionNode visitHeaderAccess(ExpressionParser.HeaderAccessContext ctx) {
if (log.isDebugEnabled()) {
log.debug("Visiting header access: " + ctx.getText());
}
if (ctx.propertyName() != null) {
return new HeadersAndPropertiesAccessNode(visit(ctx.propertyName()),
HeadersAndPropertiesAccessNode.Type.HEADER);
Expand All @@ -436,6 +500,9 @@ public ExpressionNode visitHeaderAccess(ExpressionParser.HeaderAccessContext ctx

@Override
public ExpressionNode visitPropertyName(ExpressionParser.PropertyNameContext ctx) {
if (log.isDebugEnabled()) {
log.debug("Visiting property name: " + ctx.getText());
}
if (ctx.ID() != null) {
return new LiteralNode(ctx.ID().getText(), LiteralNode.Type.STRING);
} else if (ctx.STRING_LITERAL() != null) {
Expand All @@ -446,6 +513,9 @@ public ExpressionNode visitPropertyName(ExpressionParser.PropertyNameContext ctx

@Override
public ExpressionNode visitConfigAccess(ExpressionParser.ConfigAccessContext ctx) {
if (log.isDebugEnabled()) {
log.debug("Visiting config access: " + ctx.getText());
}
if (ctx.propertyName() != null) {
return new HeadersAndPropertiesAccessNode(visit(ctx.propertyName()),
HeadersAndPropertiesAccessNode.Type.CONFIG);
Expand All @@ -455,6 +525,9 @@ public ExpressionNode visitConfigAccess(ExpressionParser.ConfigAccessContext ctx

@Override
public ExpressionNode visitPropertyAccess(ExpressionParser.PropertyAccessContext ctx) {
if (log.isDebugEnabled()) {
log.debug("Visiting property access: " + ctx.getText());
}
if (ctx.propertyName() != null) {
if (ctx.ID() != null) {
String scope = ctx.ID().getText();
Expand All @@ -471,6 +544,9 @@ public ExpressionNode visitPropertyAccess(ExpressionParser.PropertyAccessContext

@Override
public ExpressionNode visitParameterAccess(ExpressionParser.ParameterAccessContext ctx) {
if (log.isDebugEnabled()) {
log.debug("Visiting parameter access: " + ctx.getText());
}
if (ctx.propertyName() != null) {
if (ctx.ID() != null) {
String scope = ctx.ID().getText();
Expand All @@ -489,9 +565,11 @@ public ExpressionNode visitParameterAccess(ExpressionParser.ParameterAccessConte
return null;
}


@Override
public ExpressionNode visitConditionalExpression(ExpressionParser.ConditionalExpressionContext ctx) {
if (log.isDebugEnabled()) {
log.debug("Visiting conditional expression: " + ctx.getText());
}
ExpressionNode condition = null;
if (ctx.comparisonExpression() != null) {
condition = visit(ctx.comparisonExpression());
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -40,8 +40,6 @@

import java.util.HashMap;
import java.util.Map;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

/**
* Represents a Synapse Expression
Expand All @@ -51,7 +49,7 @@ public class SynapseExpression extends SynapsePath {
private static final Log log = LogFactory.getLog(SynapseExpression.class);
private final ExpressionNode expressionNode;
private final Map<String, String> namespaceMap = new HashMap<>();
private boolean isContentAware = false;
private final boolean isContentAware;

public SynapseExpression(String synapseExpression) throws JaxenException {
super(synapseExpression, org.apache.synapse.config.xml.SynapsePath.JSON_PATH, log);
Expand Down Expand Up @@ -79,6 +77,9 @@ public SynapseExpression(String synapseExpression) throws JaxenException {

@Override
public String stringValueOf(MessageContext synCtx) {
if (log.isDebugEnabled()) {
log.debug("Evaluating expression (stringValueOf): " + expression);
}
EvaluationContext context = new EvaluationContext();
context.setNamespaceMap(namespaceMap);
context.setSynCtx(synCtx);
Expand All @@ -88,11 +89,14 @@ public String stringValueOf(MessageContext synCtx) {

@Override
public Object objectValueOf(MessageContext synCtx) {
if (log.isDebugEnabled()) {
log.debug("Evaluating expression (objectValueOf): " + expression);
}
EvaluationContext context = new EvaluationContext();
context.setNamespaceMap(namespaceMap);
context.setSynCtx(synCtx);
ExpressionResult result = evaluateExpression(context, true);
return result != null ? result.getValue() : null;
return result != null ? result.getValue() : "";
}

private ExpressionResult evaluateExpression(EvaluationContext context, boolean isObjectValue) {
Expand Down
Loading