Skip to content

Commit cd28c00

Browse files
Improve log mediator to support string templating
1 parent 651cd57 commit cd28c00

File tree

5 files changed

+101
-3
lines changed

5 files changed

+101
-3
lines changed

modules/core/src/main/java/org/apache/synapse/config/xml/LogMediatorFactory.java

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,7 @@
3232
*
3333
* <pre>
3434
* &lt;log [level="simple|headers|full|custom"]&gt;
35+
* &lt;message&gt;String template&lt;/message&gt;
3536
* &lt;property&gt; *
3637
* &lt;/log&gt;
3738
* </pre>
@@ -52,6 +53,8 @@ public class LogMediatorFactory extends AbstractMediatorFactory {
5253
private static final QName ATT_LEVEL = new QName("level");
5354
private static final QName ATT_SEPERATOR = new QName("separator");
5455
private static final QName ATT_CATEGORY = new QName("category");
56+
protected static final QName ELEMENT_MESSAGE_Q
57+
= new QName(XMLConfigConstants.SYNAPSE_NAMESPACE, "message");
5558

5659
public QName getTagQName() {
5760
return LOG_Q;
@@ -64,7 +67,13 @@ public Mediator createSpecificMediator(OMElement elem, Properties properties) {
6467
// after successfully creating the mediator
6568
// set its common attributes such as tracing etc
6669
processAuditStatus(logMediator,elem);
67-
70+
71+
OMElement messageElement = elem.getFirstChildWithName(ELEMENT_MESSAGE_Q);
72+
if (messageElement != null && messageElement.getText() != null) {
73+
logMediator.setMessageTemplate(messageElement.getText());
74+
logMediator.setLogLevel(LogMediator.MESSAGE_TEMPLATE);
75+
}
76+
6877
// Set the high level set of properties to be logged (i.e. log level)
6978
OMAttribute level = elem.getAttribute(ATT_LEVEL);
7079
if (level != null) {

modules/core/src/main/java/org/apache/synapse/config/xml/LogMediatorSerializer.java

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,12 +20,14 @@
2020
package org.apache.synapse.config.xml;
2121

2222
import org.apache.axiom.om.OMElement;
23+
import org.apache.commons.lang3.StringUtils;
2324
import org.apache.synapse.Mediator;
2425
import org.apache.synapse.mediators.builtin.LogMediator;
2526

2627
/**
2728
* <pre>
2829
* &lt;log [level="simple|headers|full|custom"] [separator="string"] [category="INFO|TRACE|DEBUG|WARN|ERROR|FATAL"]&gt;
30+
* &lt;message&gt;String template&lt;/message&gt;
2931
* &lt;property&gt; *
3032
* &lt;/log&gt;
3133
* </pre>
@@ -42,7 +44,7 @@ public OMElement serializeSpecificMediator(Mediator m) {
4244
OMElement log = fac.createOMElement("log", synNS);
4345
saveTracingState(log,mediator);
4446

45-
if (mediator.getLogLevel() != LogMediator.SIMPLE) {
47+
if (StringUtils.isBlank(mediator.getMessageTemplate()) && mediator.getLogLevel() != LogMediator.SIMPLE) {
4648
log.addAttribute(fac.createOMAttribute(
4749
"level", nullNS,
4850
mediator.getLogLevel() == LogMediator.HEADERS ? "headers" :
@@ -73,6 +75,12 @@ public OMElement serializeSpecificMediator(Mediator m) {
7375
"separator", nullNS, mediator.getSeparator()));
7476
}
7577

78+
if (StringUtils.isNotBlank(mediator.getMessageTemplate())) {
79+
OMElement onCompleteElem = fac.createOMElement("message", synNS);
80+
onCompleteElem.setText(mediator.getMessageTemplate());
81+
log.addChild(onCompleteElem);
82+
}
83+
7684
super.serializeProperties(log, mediator.getProperties());
7785

7886
serializeComments(log, mediator.getCommentsList());

modules/core/src/main/java/org/apache/synapse/mediators/builtin/LogMediator.java

Lines changed: 29 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -29,14 +29,17 @@
2929
import org.apache.synapse.SynapseLog;
3030
import org.apache.synapse.commons.json.JsonUtil;
3131
import org.apache.synapse.commons.CorrelationConstants;
32+
import org.apache.synapse.config.xml.SynapsePath;
3233
import org.apache.synapse.core.axis2.Axis2MessageContext;
3334
import org.apache.synapse.mediators.AbstractMediator;
3435
import org.apache.synapse.mediators.MediatorProperty;
36+
import org.apache.synapse.util.InlineExpressionUtil;
3537

3638
import java.util.ArrayList;
3739
import java.util.Iterator;
3840
import java.util.List;
39-
41+
import java.util.regex.Matcher;
42+
import java.util.regex.Pattern;
4043

4144
/**
4245
* Logs the specified message into the configured logger. The log levels specify
@@ -56,6 +59,9 @@ public class LogMediator extends AbstractMediator {
5659
/** all attributes of level 'simple' and the SOAP envelope and any properties */
5760
public static final int FULL = 3;
5861

62+
/** The message template and the additional properties specified to the Log mediator */
63+
public static final int MESSAGE_TEMPLATE = 4;
64+
5965
public static final int CATEGORY_INFO = 0;
6066
public static final int CATEGORY_DEBUG = 1;
6167
public static final int CATEGORY_TRACE = 2;
@@ -74,6 +80,8 @@ public class LogMediator extends AbstractMediator {
7480
/** The holder for the custom properties */
7581
private final List<MediatorProperty> properties = new ArrayList<MediatorProperty>();
7682

83+
private String messageTemplate;
84+
7785
/**
7886
* Logs the current message according to the supplied semantics
7987
*
@@ -143,6 +151,8 @@ private String getLogMessage(MessageContext synCtx) {
143151
return getHeadersLogMessage(synCtx);
144152
case FULL:
145153
return getFullLogMessage(synCtx);
154+
case MESSAGE_TEMPLATE:
155+
return processMessageTemplate(synCtx, messageTemplate);
146156
default:
147157
return "Invalid log level specified";
148158
}
@@ -288,6 +298,16 @@ public void setCategory(int category) {
288298
}
289299
}
290300

301+
public String getMessageTemplate() {
302+
303+
return messageTemplate;
304+
}
305+
306+
public void setMessageTemplate(String messageTemplate) {
307+
308+
this.messageTemplate = messageTemplate;
309+
}
310+
291311
private String trimLeadingSeparator(StringBuffer sb) {
292312
String retStr = sb.toString();
293313
if (retStr.startsWith(separator)) {
@@ -297,8 +317,16 @@ private String trimLeadingSeparator(StringBuffer sb) {
297317
}
298318
}
299319

320+
private String processMessageTemplate(MessageContext synCtx, String template) {
321+
StringBuffer result = new StringBuffer();
322+
result.append(InlineExpressionUtil.processInLineTemplate(synCtx, template));
323+
setCustomProperties(result, synCtx);
324+
return result.toString();
325+
}
326+
300327
@Override
301328
public boolean isContentAware() {
329+
// TODO Use the new simplified expression model to check if the log mediator is content aware
302330
if (logLevel == CUSTOM) {
303331
for (MediatorProperty property : properties) {
304332
if (property.getExpression() != null && property.getExpression().isContentAware()) {

modules/core/src/main/java/org/apache/synapse/util/InlineExpressionUtil.java

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,9 @@ public final class InlineExpressionUtil {
4949
// Regex to identify expressions in inline text
5050
private static final Pattern EXPRESSION_PATTERN = Pattern.compile("(\\{[^\\s\",<>}\\]]+})");
5151

52+
// Regex to identify synapse expressions #[expression] in inline text
53+
private static final Pattern EXPRESSION_PLACEHOLDER_PATTERN = Pattern.compile("#\\[(.+?)\\]");
54+
5255
private InlineExpressionUtil() {
5356

5457
}
@@ -197,4 +200,37 @@ private static boolean isValidXML(String stringToValidate) {
197200
}
198201
return false;
199202
}
203+
204+
/**
205+
* Process the inline template and replace the synapse expressions with the resolved values
206+
*
207+
* @param synCtx Message Context
208+
* @param template Inline template
209+
* @return Processed inline template
210+
*/
211+
public static String processInLineTemplate(MessageContext synCtx, String template) {
212+
213+
Matcher matcher = EXPRESSION_PLACEHOLDER_PATTERN.matcher(template);
214+
StringBuffer result = new StringBuffer();
215+
while (matcher.find()) {
216+
// Extract the expression inside #[...]
217+
String placeholder = matcher.group(1);
218+
// Dummy resolver for expressions to test the Log mediator
219+
// TODO update the #getDynamicValue method with synapse expressions and replace this
220+
String replacement = ExpressionResolver.resolve(placeholder, synCtx);
221+
matcher.appendReplacement(result, Matcher.quoteReplacement(replacement));
222+
}
223+
matcher.appendTail(result);
224+
return result.toString();
225+
}
226+
227+
static class ExpressionResolver {
228+
public static String resolve(String expression, MessageContext synCtx) {
229+
String variableName = expression.substring(5);
230+
if (synCtx.getVariable(variableName) != null) {
231+
return synCtx.getVariable(variableName).toString();
232+
}
233+
return expression;
234+
}
235+
}
200236
}

modules/core/src/test/java/org/apache/synapse/config/xml/LogMediatorSerializationTest.java

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -51,6 +51,12 @@ public LogMediatorSerializationTest() {
5151
logMediatorSerializer = new LogMediatorSerializer();
5252
}
5353

54+
public void testLogMediatorSerializationWithTemplate() throws Exception {
55+
56+
assertTrue(serialization(getXmlOfLogMediatorWithTemplate(), logMediatorFactory, logMediatorSerializer));
57+
assertTrue(serialization(getXmlOfLogMediatorWithTemplateAndProps(), logMediatorFactory, logMediatorSerializer));
58+
}
59+
5460
public void testLogMediatorSerializationSenarioOne() throws Exception {
5561

5662
// assertTrue(serialization(getXmlOfMediatorScenarioOne(SIMPLE), logMediatorFactory, logMediatorSerializer));
@@ -130,6 +136,17 @@ private String getXmlOfMediatorScenarioOne(String level) {
130136

131137
}
132138

139+
private String getXmlOfLogMediatorWithTemplate() {
140+
return "<log xmlns=\"http://ws.apache.org/ns/synapse\">" +
141+
"<message>Processing message with ID: 123</message></log>";
142+
}
143+
144+
private String getXmlOfLogMediatorWithTemplateAndProps() {
145+
return "<log xmlns=\"http://ws.apache.org/ns/synapse\">" +
146+
"<message>Processing message with ID: 123</message>" +
147+
"<property name=\"Text\" value=\"Sending quote request\"/></log>";
148+
}
149+
133150
private String getXmlOfMediatorScenarioOneA(String level) {
134151
return "<log level=\"" +
135152
level + "\"><property name=\"Text\" value=\"Sending quote request\"/></log>";

0 commit comments

Comments
 (0)