Author: rgoers
Date: Mon Jul 23 04:36:52 2012
New Revision: 1364491
URL: http://svn.apache.org/viewvc?rev=1364491&view=rev
Log:
Rename FormattedMessage to MultiFormatMessage. Add JSON and JAVA as supported
MapMessage formats.
Added:
logging/log4j/log4j2/trunk/api/src/main/java/org/apache/logging/log4j/message/MultiformatMessage.java
- copied, changed from r1364421,
logging/log4j/log4j2/trunk/api/src/main/java/org/apache/logging/log4j/message/FormattedMessage.java
Removed:
logging/log4j/log4j2/trunk/api/src/main/java/org/apache/logging/log4j/message/FormattedMessage.java
Modified:
logging/log4j/log4j2/trunk/api/src/main/java/org/apache/logging/log4j/message/MapMessage.java
logging/log4j/log4j2/trunk/api/src/main/java/org/apache/logging/log4j/message/StructuredDataMessage.java
logging/log4j/log4j2/trunk/api/src/test/java/org/apache/logging/log4j/message/MapMessageTest.java
logging/log4j/log4j2/trunk/core/src/main/java/org/apache/logging/log4j/core/pattern/MessagePatternConverter.java
Modified:
logging/log4j/log4j2/trunk/api/src/main/java/org/apache/logging/log4j/message/MapMessage.java
URL:
http://svn.apache.org/viewvc/logging/log4j/log4j2/trunk/api/src/main/java/org/apache/logging/log4j/message/MapMessage.java?rev=1364491&r1=1364490&r2=1364491&view=diff
==============================================================================
---
logging/log4j/log4j2/trunk/api/src/main/java/org/apache/logging/log4j/message/MapMessage.java
(original)
+++
logging/log4j/log4j2/trunk/api/src/main/java/org/apache/logging/log4j/message/MapMessage.java
Mon Jul 23 04:36:52 2012
@@ -26,17 +26,19 @@ import java.util.TreeMap;
/**
* Represents a Message that consists of a Map.
*/
-public class MapMessage implements FormattedMessage, Serializable {
+public class MapMessage implements MultiformatMessage, Serializable {
/**
* When set as the format specifier causes the Map to be formatted as XML.
*/
- public static final String XML = "XML";
+
+ public enum MapFormat {
+ XML, JSON, JAVA
+ }
+
private static final long serialVersionUID = -5031471831131487120L;
private final Map<String, String> data;
- private String format = null;
-
/**
* Constructor.
*/
@@ -53,23 +55,6 @@ public class MapMessage implements Forma
}
/**
- * The format String. Specifying "xml" will cause the message to be XML.
- * @param format The message format.
- */
- public void setFormat(String format) {
- this.format = format;
- }
-
- /**
- * Return the format String.
- * @return the format String.
- */
- public String getFormat() {
- return this.format;
- }
-
-
- /**
* Return the data elements as if they were parameters on the logging
event.
* @return the data elements.
*/
@@ -149,21 +134,44 @@ public class MapMessage implements Forma
* @return The formatted String.
*/
public String asString() {
- return asString(format == null ? "" : format);
+ return asString((MapFormat) null);
}
+ public String asString(String format) {
+ try {
+ return asString(MapFormat.valueOf(format.toUpperCase()));
+ } catch (IllegalArgumentException ex) {
+ return asString();
+ }
+ }
/**
* Format the Structured data as described in RFC 5424.
*
* @param format The format identifier. Ignored in this implementation.
* @return The formatted String.
*/
- public String asString(String format) {
+ private String asString(MapFormat format) {
StringBuilder sb = new StringBuilder();
- if (format.equalsIgnoreCase(XML)) {
- asXML(sb);
- } else {
+ if (format == null) {
appendMap(sb);
+ } else {
+ switch (format) {
+ case XML : {
+ asXML(sb);
+ break;
+ }
+ case JSON : {
+ asJSON(sb);
+ break;
+ }
+ case JAVA : {
+ asJava(sb);
+ break;
+ }
+ default : {
+ appendMap(sb);
+ }
+ }
}
return sb.toString();
}
@@ -185,6 +193,30 @@ public class MapMessage implements Forma
return asString();
}
+ /**
+ *
+ * @param formats An array of Strings that provide extra information about
how to format the message.
+ * MapMessage uses the first format specifier it recognizes. The supported
formats are XML, JSON, and
+ * JAVA. The default format is key1="value1" key2="value2" as required by
RFC 5424 messages.
+ *
+ * @return The formatted message.
+ */
+ public String getFormattedMessage(String[] formats) {
+ if (formats == null || formats.length == 0) {
+ return asString();
+ } else {
+ for (String format : formats) {
+ for (MapFormat f : MapFormat.values()) {
+ if (f.name().equalsIgnoreCase(format)) {
+ return asString(f);
+ }
+ }
+ }
+ return asString();
+ }
+
+ }
+
protected void appendMap(StringBuilder sb) {
SortedMap<String, String> sorted = new TreeMap<String, String>(data);
boolean first = true;
@@ -197,6 +229,36 @@ public class MapMessage implements Forma
}
}
+ protected void asJSON(StringBuilder sb) {
+ SortedMap<String, String> sorted = new TreeMap<String, String>(data);
+ boolean first = true;
+ sb.append("{");
+ for (Map.Entry<String, String> entry : sorted.entrySet()) {
+ if (!first) {
+ sb.append(", ");
+ }
+ first = false;
+ sb.append("\"").append(entry.getKey()).append("\":");
+ sb.append("\"").append(entry.getValue()).append("\"");
+ }
+ sb.append("}");
+ }
+
+
+ protected void asJava(StringBuilder sb) {
+ SortedMap<String, String> sorted = new TreeMap<String, String>(data);
+ boolean first = true;
+ sb.append("{");
+ for (Map.Entry<String, String> entry : sorted.entrySet()) {
+ if (!first) {
+ sb.append(", ");
+ }
+ first = false;
+
sb.append(entry.getKey()).append("=\"").append(entry.getValue()).append("\"");
+ }
+ sb.append("}");
+ }
+
public MapMessage newInstance(Map<String, String> map) {
return new MapMessage(map);
}
Copied:
logging/log4j/log4j2/trunk/api/src/main/java/org/apache/logging/log4j/message/MultiformatMessage.java
(from r1364421,
logging/log4j/log4j2/trunk/api/src/main/java/org/apache/logging/log4j/message/FormattedMessage.java)
URL:
http://svn.apache.org/viewvc/logging/log4j/log4j2/trunk/api/src/main/java/org/apache/logging/log4j/message/MultiformatMessage.java?p2=logging/log4j/log4j2/trunk/api/src/main/java/org/apache/logging/log4j/message/MultiformatMessage.java&p1=logging/log4j/log4j2/trunk/api/src/main/java/org/apache/logging/log4j/message/FormattedMessage.java&r1=1364421&r2=1364491&rev=1364491&view=diff
==============================================================================
---
logging/log4j/log4j2/trunk/api/src/main/java/org/apache/logging/log4j/message/FormattedMessage.java
(original)
+++
logging/log4j/log4j2/trunk/api/src/main/java/org/apache/logging/log4j/message/MultiformatMessage.java
Mon Jul 23 04:36:52 2012
@@ -17,21 +17,20 @@
package org.apache.logging.log4j.message;
/**
- * A Message that can have a format String attached to it. The format string
is used by the
+ * A Message that can render itself in more than one way. The format string is
used by the
* Message implementation as extra information that it may use to help it to
determine how
* to format itself. For example, MapMessage accepts a format of "XML" to tell
it to render
* the Map as XML instead of its default format of {key1="value1"
key2="value2"}.
*/
-public interface FormattedMessage extends Message {
- /**
- * Set the message format.
- * @param format The message format.
- */
- void setFormat(String format);
+public interface MultiformatMessage extends Message {
/**
- * Return the message format.
- * @return the message format String.
+ * Returns the Message formatted as a String.
+ *
+ * @param formats An array of Strings that provide extra information about
how to format the message.
+ * Each MultiformatMessage implementation is free to use the provided
formats however they choose.
+ *
+ * @return The message String.
*/
- String getFormat();
+ String getFormattedMessage(String[] formats);
}
Modified:
logging/log4j/log4j2/trunk/api/src/main/java/org/apache/logging/log4j/message/StructuredDataMessage.java
URL:
http://svn.apache.org/viewvc/logging/log4j/log4j2/trunk/api/src/main/java/org/apache/logging/log4j/message/StructuredDataMessage.java?rev=1364491&r1=1364490&r2=1364491&view=diff
==============================================================================
---
logging/log4j/log4j2/trunk/api/src/main/java/org/apache/logging/log4j/message/StructuredDataMessage.java
(original)
+++
logging/log4j/log4j2/trunk/api/src/main/java/org/apache/logging/log4j/message/StructuredDataMessage.java
Mon Jul 23 04:36:52 2012
@@ -22,11 +22,11 @@ import java.util.Map;
/**
* Represents a Message that conforms to RFC 5424
(http://tools.ietf.org/html/rfc5424).
*/
-public class StructuredDataMessage extends MapMessage implements
FormattedMessage, Serializable {
+public class StructuredDataMessage extends MapMessage implements
MultiformatMessage, Serializable {
/**
* Full message format includes the type and message.
*/
- public static final String FULL = "full";
+ public static final String FULL = "FULL";
private static final long serialVersionUID = 1703221292892071920L;
private static final int MAX_LENGTH = 32;
@@ -243,9 +243,32 @@ public class StructuredDataMessage exten
return asString(FULL, null);
}
+ /**
+ * Format the message according the the specified format.
+ * @param formats An array of Strings that provide extra information about
how to format the message.
+ * StructuredDataMessage accepts only a format of "FULL" which will cause
the event type to be
+ * prepended and the event message to be appended. Specifying any other
value will cause only the
+ * StructuredData to be included. The default is "FULL".
+ *
+ * @return
+ */
+ @Override
+ public String getFormattedMessage(String[] formats) {
+ if (formats != null && formats.length > 0) {
+ for (String format : formats) {
+ if (format.equalsIgnoreCase(FULL)) {
+ return asString(FULL, null);
+ }
+ }
+ return asString(null, null);
+ } else {
+ return asString(FULL, null);
+ }
+ }
+
@Override
public String toString() {
- return asString(null);
+ return asString(null, null);
}
Modified:
logging/log4j/log4j2/trunk/api/src/test/java/org/apache/logging/log4j/message/MapMessageTest.java
URL:
http://svn.apache.org/viewvc/logging/log4j/log4j2/trunk/api/src/test/java/org/apache/logging/log4j/message/MapMessageTest.java?rev=1364491&r1=1364490&r2=1364491&view=diff
==============================================================================
---
logging/log4j/log4j2/trunk/api/src/test/java/org/apache/logging/log4j/message/MapMessageTest.java
(original)
+++
logging/log4j/log4j2/trunk/api/src/test/java/org/apache/logging/log4j/message/MapMessageTest.java
Mon Jul 23 04:36:52 2012
@@ -40,13 +40,34 @@ public class MapMessageTest {
public void testXML() {
String testMsg = "Test message {}";
MapMessage msg = new MapMessage();
- msg.setFormat("XML");
msg.put("message", testMsg);
msg.put("project", "Log4j");
- String result = msg.getFormattedMessage();
+ String result = msg.getFormattedMessage(new String[]{"XML"});
String expected = "<Map>\n <Entry key=message>Test message
{}</Entry>\n" +
" <Entry key=project>Log4j</Entry>\n" +
"</Map>";
assertEquals(expected, result);
}
+
+ @Test
+ public void testJSON() {
+ String testMsg = "Test message {}";
+ MapMessage msg = new MapMessage();
+ msg.put("message", testMsg);
+ msg.put("project", "Log4j");
+ String result = msg.getFormattedMessage(new String[]{"JSON"});
+ String expected = "{\"message\":\"Test message {}\",
\"project\":\"Log4j\"}";
+ assertEquals(expected, result);
+ }
+
+ @Test
+ public void testJava() {
+ String testMsg = "Test message {}";
+ MapMessage msg = new MapMessage();
+ msg.put("message", testMsg);
+ msg.put("project", "Log4j");
+ String result = msg.getFormattedMessage(new String[]{"Java"});
+ String expected = "{message=\"Test message {}\", project=\"Log4j\"}";
+ assertEquals(expected, result);
+ }
}
Modified:
logging/log4j/log4j2/trunk/core/src/main/java/org/apache/logging/log4j/core/pattern/MessagePatternConverter.java
URL:
http://svn.apache.org/viewvc/logging/log4j/log4j2/trunk/core/src/main/java/org/apache/logging/log4j/core/pattern/MessagePatternConverter.java?rev=1364491&r1=1364490&r2=1364491&view=diff
==============================================================================
---
logging/log4j/log4j2/trunk/core/src/main/java/org/apache/logging/log4j/core/pattern/MessagePatternConverter.java
(original)
+++
logging/log4j/log4j2/trunk/core/src/main/java/org/apache/logging/log4j/core/pattern/MessagePatternConverter.java
Mon Jul 23 04:36:52 2012
@@ -18,7 +18,7 @@ package org.apache.logging.log4j.core.pa
import org.apache.logging.log4j.core.LogEvent;
import org.apache.logging.log4j.core.config.plugins.Plugin;
-import org.apache.logging.log4j.message.FormattedMessage;
+import org.apache.logging.log4j.message.MultiformatMessage;
import org.apache.logging.log4j.message.Message;
/**
@@ -28,7 +28,7 @@ import org.apache.logging.log4j.message.
@ConverterKeys({"m", "msg", "message" })
public final class MessagePatternConverter extends LogEventPatternConverter {
- private final String format;
+ private final String[] formats;
/**
* Private constructor.
@@ -36,7 +36,7 @@ public final class MessagePatternConvert
*/
private MessagePatternConverter(final String[] options) {
super("Message", "message");
- format = (options != null && options.length > 0) ? options[0] : null;
+ formats = options;
}
/**
@@ -54,9 +54,12 @@ public final class MessagePatternConvert
*/
public void format(final LogEvent event, final StringBuilder toAppendTo) {
Message msg = event.getMessage();
- if (msg != null && msg instanceof FormattedMessage) {
- ((FormattedMessage) msg).setFormat(format);
+ if (msg != null) {
+ if (msg instanceof MultiformatMessage) {
+ toAppendTo.append(((MultiformatMessage)
msg).getFormattedMessage(formats));
+ } else{
+ toAppendTo.append(msg.getFormattedMessage());
+ }
}
- toAppendTo.append(msg.getFormattedMessage());
}
}