LOG4J2-1447 Jackson changes for the migration of Map<String,String> to 
ContextData


Project: http://git-wip-us.apache.org/repos/asf/logging-log4j2/repo
Commit: http://git-wip-us.apache.org/repos/asf/logging-log4j2/commit/0f402af3
Tree: http://git-wip-us.apache.org/repos/asf/logging-log4j2/tree/0f402af3
Diff: http://git-wip-us.apache.org/repos/asf/logging-log4j2/diff/0f402af3

Branch: 
refs/heads/LOG4J2-1010&LOG4J2-1447-injectable-contextdata&better-datastructure
Commit: 0f402af31ecbfe308f77a8156e85391048e2a681
Parents: 3cb8aa6
Author: rpopma <[email protected]>
Authored: Wed Jul 27 01:22:59 2016 +0900
Committer: rpopma <[email protected]>
Committed: Wed Jul 27 01:22:59 2016 +0900

----------------------------------------------------------------------
 .../ContextDataAsEntryListDeserializer.java     |  57 +++++++
 .../ContextDataAsEntryListSerializer.java       |  58 ++++++++
 .../core/jackson/ContextDataDeserializer.java   |  65 ++++++++
 .../core/jackson/ContextDataSerializer.java     |  64 ++++++++
 .../log4j/core/jackson/Initializers.java        |   2 +-
 .../log4j/core/jackson/LogEventJsonMixIn.java   |  16 +-
 .../log4j/core/jackson/LogEventMixIn.java       | 138 -----------------
 .../jackson/LogEventWithContextListMixIn.java   | 148 +++++++++++++++++++
 8 files changed, 407 insertions(+), 141 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/0f402af3/log4j-core/src/main/java/org/apache/logging/log4j/core/jackson/ContextDataAsEntryListDeserializer.java
----------------------------------------------------------------------
diff --git 
a/log4j-core/src/main/java/org/apache/logging/log4j/core/jackson/ContextDataAsEntryListDeserializer.java
 
b/log4j-core/src/main/java/org/apache/logging/log4j/core/jackson/ContextDataAsEntryListDeserializer.java
new file mode 100644
index 0000000..6ae28ec
--- /dev/null
+++ 
b/log4j-core/src/main/java/org/apache/logging/log4j/core/jackson/ContextDataAsEntryListDeserializer.java
@@ -0,0 +1,57 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache license, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the license for the specific language governing permissions and
+ * limitations under the license.
+ */
+package org.apache.logging.log4j.core.jackson;
+
+import java.io.IOException;
+import java.util.List;
+import java.util.Map;
+
+import org.apache.logging.log4j.core.impl.ArrayContextData;
+import org.apache.logging.log4j.core.impl.MutableContextData;
+
+import com.fasterxml.jackson.core.JsonParser;
+import com.fasterxml.jackson.core.JsonProcessingException;
+import com.fasterxml.jackson.core.type.TypeReference;
+import com.fasterxml.jackson.databind.DeserializationContext;
+import com.fasterxml.jackson.databind.deser.std.StdDeserializer;
+
+/**
+ * <p>
+ * <em>Consider this class private.</em>
+ * </p>
+ */
+public class ContextDataAsEntryListDeserializer extends 
StdDeserializer<MutableContextData> {
+
+    private static final long serialVersionUID = 1L;
+
+    ContextDataAsEntryListDeserializer() {
+        super(Map.class);
+    }
+
+    @Override
+    public MutableContextData deserialize(final JsonParser jp, final 
DeserializationContext ctxt) throws IOException,
+            JsonProcessingException {
+        final List<MapEntry> list = jp.readValueAs(new 
TypeReference<List<MapEntry>>() {
+            // empty
+        });
+        final MutableContextData contextData = new 
ArrayContextData(list.size());
+        for (final MapEntry mapEntry : list) {
+            contextData.putValue(mapEntry.getKey(), mapEntry.getValue());
+        }
+        return contextData;
+    }
+}

http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/0f402af3/log4j-core/src/main/java/org/apache/logging/log4j/core/jackson/ContextDataAsEntryListSerializer.java
----------------------------------------------------------------------
diff --git 
a/log4j-core/src/main/java/org/apache/logging/log4j/core/jackson/ContextDataAsEntryListSerializer.java
 
b/log4j-core/src/main/java/org/apache/logging/log4j/core/jackson/ContextDataAsEntryListSerializer.java
new file mode 100644
index 0000000..8fbffdf
--- /dev/null
+++ 
b/log4j-core/src/main/java/org/apache/logging/log4j/core/jackson/ContextDataAsEntryListSerializer.java
@@ -0,0 +1,58 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache license, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the license for the specific language governing permissions and
+ * limitations under the license.
+ */
+package org.apache.logging.log4j.core.jackson;
+
+import java.io.IOException;
+import java.util.Map;
+
+import org.apache.logging.log4j.core.ContextData;
+import org.apache.logging.log4j.core.util.BiConsumer;
+
+import com.fasterxml.jackson.core.JsonGenerationException;
+import com.fasterxml.jackson.core.JsonGenerator;
+import com.fasterxml.jackson.databind.SerializerProvider;
+import com.fasterxml.jackson.databind.ser.std.StdSerializer;
+
+/**
+ * <p>
+ * <em>Consider this class private.</em>
+ * </p>
+ */
+public class ContextDataAsEntryListSerializer extends 
StdSerializer<ContextData> {
+
+    private static final long serialVersionUID = 1L;
+
+    protected ContextDataAsEntryListSerializer() {
+        super(Map.class, false);
+    }
+
+    @Override
+    public void serialize(final ContextData contextData, final JsonGenerator 
jgen, final SerializerProvider provider)
+            throws IOException, JsonGenerationException {
+
+        final MapEntry[] pairs = new MapEntry[contextData.size()];
+        contextData.forEach(new BiConsumer<String, Object>() {
+            int i = 0;
+
+            @Override
+            public void accept(final String key, final Object value) {
+                pairs[i++] = new MapEntry(key, String.valueOf(value));
+            }
+        });
+        jgen.writeObject(pairs);
+    }
+}

http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/0f402af3/log4j-core/src/main/java/org/apache/logging/log4j/core/jackson/ContextDataDeserializer.java
----------------------------------------------------------------------
diff --git 
a/log4j-core/src/main/java/org/apache/logging/log4j/core/jackson/ContextDataDeserializer.java
 
b/log4j-core/src/main/java/org/apache/logging/log4j/core/jackson/ContextDataDeserializer.java
new file mode 100644
index 0000000..b6e7041
--- /dev/null
+++ 
b/log4j-core/src/main/java/org/apache/logging/log4j/core/jackson/ContextDataDeserializer.java
@@ -0,0 +1,65 @@
+
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache license, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the license for the specific language governing permissions and
+ * limitations under the license.
+ */
+package org.apache.logging.log4j.core.jackson;
+
+import java.io.IOException;
+import java.util.Map;
+
+import org.apache.logging.log4j.core.impl.ArrayContextData;
+import org.apache.logging.log4j.core.impl.MutableContextData;
+
+import com.fasterxml.jackson.core.JsonParser;
+import com.fasterxml.jackson.core.JsonProcessingException;
+import com.fasterxml.jackson.core.JsonToken;
+import com.fasterxml.jackson.databind.DeserializationContext;
+import com.fasterxml.jackson.databind.deser.std.StdDeserializer;
+
+/**
+ * <p>
+ * <em>Consider this class private.</em>
+ * </p>
+ */
+public class ContextDataDeserializer extends 
StdDeserializer<MutableContextData> {
+
+    private static final long serialVersionUID = 1L;
+
+    ContextDataDeserializer() {
+        super(Map.class);
+    }
+
+    @Override
+    public MutableContextData deserialize(final JsonParser jp, final 
DeserializationContext ctxt) throws IOException,
+            JsonProcessingException {
+
+        // Sanity check: verify that we got "Json Object":
+//        JsonToken tok = jp.nextToken();
+//        if (tok != JsonToken.START_OBJECT) {
+//            throw new IOException("Expected data to start with an Object");
+//        }
+        final MutableContextData contextData = new ArrayContextData();
+        // Iterate over object fields:
+        while (jp.nextToken() != JsonToken.END_OBJECT) {
+            String fieldName = jp.getCurrentName();
+
+            // move to value
+            jp.nextToken();
+            contextData.putValue(fieldName, jp.getText());
+        }
+        return contextData;
+    }
+}

http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/0f402af3/log4j-core/src/main/java/org/apache/logging/log4j/core/jackson/ContextDataSerializer.java
----------------------------------------------------------------------
diff --git 
a/log4j-core/src/main/java/org/apache/logging/log4j/core/jackson/ContextDataSerializer.java
 
b/log4j-core/src/main/java/org/apache/logging/log4j/core/jackson/ContextDataSerializer.java
new file mode 100644
index 0000000..8868c0d
--- /dev/null
+++ 
b/log4j-core/src/main/java/org/apache/logging/log4j/core/jackson/ContextDataSerializer.java
@@ -0,0 +1,64 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache license, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the license for the specific language governing permissions and
+ * limitations under the license.
+ */
+package org.apache.logging.log4j.core.jackson;
+
+import java.io.IOException;
+import java.util.Map;
+
+import org.apache.logging.log4j.core.ContextData;
+import org.apache.logging.log4j.core.util.TriConsumer;
+
+import com.fasterxml.jackson.core.JsonGenerationException;
+import com.fasterxml.jackson.core.JsonGenerator;
+import com.fasterxml.jackson.databind.SerializerProvider;
+import com.fasterxml.jackson.databind.ser.std.StdSerializer;
+
+/**
+ * <p>
+ * <em>Consider this class private.</em>
+ * </p>
+ */
+public class ContextDataSerializer extends StdSerializer<ContextData> {
+
+    private static final long serialVersionUID = 1L;
+
+    protected ContextDataSerializer() {
+        super(Map.class, false);
+    }
+
+    @Override
+    public void serialize(final ContextData contextData, final JsonGenerator 
jgen,
+            final SerializerProvider provider) throws IOException, 
JsonGenerationException {
+
+        jgen.writeStartObject();
+        contextData.forEach(WRITE_STRING_FIELD_INTO, jgen);
+        jgen.writeEndObject();
+    }
+
+    private static final TriConsumer<String, Object, JsonGenerator> 
WRITE_STRING_FIELD_INTO =
+            new TriConsumer<String, Object, JsonGenerator>() {
+
+        @Override
+        public void accept(final String key, final Object value, final 
JsonGenerator jsonGenerator) {
+            try {
+                jsonGenerator.writeStringField(key, String.valueOf(value));
+            } catch (final Exception ex) {
+                throw new IllegalStateException("Problem with key " + key, ex);
+            }
+        }
+    };
+}

http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/0f402af3/log4j-core/src/main/java/org/apache/logging/log4j/core/jackson/Initializers.java
----------------------------------------------------------------------
diff --git 
a/log4j-core/src/main/java/org/apache/logging/log4j/core/jackson/Initializers.java
 
b/log4j-core/src/main/java/org/apache/logging/log4j/core/jackson/Initializers.java
index d0cbe2d..7d361f0 100644
--- 
a/log4j-core/src/main/java/org/apache/logging/log4j/core/jackson/Initializers.java
+++ 
b/log4j-core/src/main/java/org/apache/logging/log4j/core/jackson/Initializers.java
@@ -45,7 +45,7 @@ class Initializers {
             // Log4j API classes: we do not want to edit those with Jackson 
annotations because the API module should not depend on Jackson.
             context.setMixInAnnotations(Marker.class, MarkerMixIn.class);
             context.setMixInAnnotations(Level.class, LevelMixIn.class);
-            context.setMixInAnnotations(LogEvent.class, LogEventMixIn.class);
+            context.setMixInAnnotations(LogEvent.class, 
LogEventWithContextListMixIn.class);
             // Log4j Core classes: we do not want to bring in Jackson at 
runtime if we do not have to.
             context.setMixInAnnotations(ExtendedStackTraceElement.class, 
ExtendedStackTraceElementMixIn.class);
             context.setMixInAnnotations(ThrowableProxy.class, 
ThrowableProxyMixIn.class);

http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/0f402af3/log4j-core/src/main/java/org/apache/logging/log4j/core/jackson/LogEventJsonMixIn.java
----------------------------------------------------------------------
diff --git 
a/log4j-core/src/main/java/org/apache/logging/log4j/core/jackson/LogEventJsonMixIn.java
 
b/log4j-core/src/main/java/org/apache/logging/log4j/core/jackson/LogEventJsonMixIn.java
index 4f0478e..2338cb0 100644
--- 
a/log4j-core/src/main/java/org/apache/logging/log4j/core/jackson/LogEventJsonMixIn.java
+++ 
b/log4j-core/src/main/java/org/apache/logging/log4j/core/jackson/LogEventJsonMixIn.java
@@ -21,6 +21,7 @@ import java.util.Map;
 import org.apache.logging.log4j.Level;
 import org.apache.logging.log4j.Marker;
 import org.apache.logging.log4j.ThreadContext.ContextStack;
+import org.apache.logging.log4j.core.ContextData;
 import org.apache.logging.log4j.core.LogEvent;
 import org.apache.logging.log4j.core.impl.ThrowableProxy;
 import org.apache.logging.log4j.message.Message;
@@ -45,13 +46,24 @@ abstract class LogEventJsonMixIn implements LogEvent {
 
     private static final long serialVersionUID = 1L;
 
-    @JsonProperty(JsonConstants.ELT_CONTEXT_MAP)
-    @JacksonXmlProperty(namespace = XmlConstants.XML_NAMESPACE, localName = 
XmlConstants.ELT_CONTEXT_MAP)
+//    @JsonProperty(JsonConstants.ELT_CONTEXT_MAP)
+//    @JacksonXmlProperty(namespace = XmlConstants.XML_NAMESPACE, localName = 
XmlConstants.ELT_CONTEXT_MAP)
 //    @JsonSerialize(using = MapSerializer.class)
 //    @JsonDeserialize(using = MapDeserializer.class)
     @Override
+    @JsonIgnore
+//    @JsonProperty(JsonConstants.ELT_CONTEXT_MAP)
+//    @JacksonXmlProperty(namespace = XmlConstants.XML_NAMESPACE, localName = 
XmlConstants.ELT_CONTEXT_MAP)
     public abstract Map<String, String> getContextMap();
 
+    @JsonProperty(JsonConstants.ELT_CONTEXT_MAP)
+    @JacksonXmlProperty(namespace = XmlConstants.XML_NAMESPACE, localName = 
XmlConstants.ELT_CONTEXT_MAP)
+    @JsonSerialize(using = ContextDataSerializer.class)
+    @JsonDeserialize(using = ContextDataDeserializer.class)
+    //@JsonIgnore
+    @Override
+    public abstract ContextData getContextData();
+
     @JsonProperty(JsonConstants.ELT_CONTEXT_STACK)
     @JacksonXmlElementWrapper(namespace = XmlConstants.XML_NAMESPACE, 
localName = XmlConstants.ELT_CONTEXT_STACK)
     @JacksonXmlProperty(namespace = XmlConstants.XML_NAMESPACE, localName = 
XmlConstants.ELT_CONTEXT_STACK_ITEM)

http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/0f402af3/log4j-core/src/main/java/org/apache/logging/log4j/core/jackson/LogEventMixIn.java
----------------------------------------------------------------------
diff --git 
a/log4j-core/src/main/java/org/apache/logging/log4j/core/jackson/LogEventMixIn.java
 
b/log4j-core/src/main/java/org/apache/logging/log4j/core/jackson/LogEventMixIn.java
deleted file mode 100644
index ab9cd19..0000000
--- 
a/log4j-core/src/main/java/org/apache/logging/log4j/core/jackson/LogEventMixIn.java
+++ /dev/null
@@ -1,138 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements. See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache license, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License. You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the license for the specific language governing permissions and
- * limitations under the license.
- */
-package org.apache.logging.log4j.core.jackson;
-
-import java.util.Map;
-
-import org.apache.logging.log4j.Level;
-import org.apache.logging.log4j.Marker;
-import org.apache.logging.log4j.ThreadContext.ContextStack;
-import org.apache.logging.log4j.core.LogEvent;
-import org.apache.logging.log4j.core.impl.ThrowableProxy;
-import org.apache.logging.log4j.message.Message;
-
-import com.fasterxml.jackson.annotation.JsonFilter;
-import com.fasterxml.jackson.annotation.JsonIgnore;
-import com.fasterxml.jackson.annotation.JsonProperty;
-import com.fasterxml.jackson.annotation.JsonPropertyOrder;
-import com.fasterxml.jackson.annotation.JsonRootName;
-import com.fasterxml.jackson.databind.annotation.JsonDeserialize;
-import com.fasterxml.jackson.databind.annotation.JsonSerialize;
-import 
com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlElementWrapper;
-import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlProperty;
-import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlRootElement;
-
-@JsonRootName(XmlConstants.ELT_EVENT)
-@JacksonXmlRootElement(namespace = XmlConstants.XML_NAMESPACE, localName = 
XmlConstants.ELT_EVENT)
-@JsonFilter("org.apache.logging.log4j.core.impl.Log4jLogEvent")
-@JsonPropertyOrder({ "timeMillis", "threadName", "level", "loggerName", 
"marker", "message", "thrown", XmlConstants.ELT_CONTEXT_MAP,
-        JsonConstants.ELT_CONTEXT_STACK, "loggerFQCN", "Source", "endOfBatch" 
})
-abstract class LogEventMixIn implements LogEvent {
-
-    private static final long serialVersionUID = 1L;
-
-    @JsonProperty(JsonConstants.ELT_CONTEXT_MAP)
-    @JacksonXmlProperty(namespace = XmlConstants.XML_NAMESPACE, localName = 
XmlConstants.ELT_CONTEXT_MAP)
-    @JsonSerialize(using = ListOfMapEntrySerializer.class)
-    @JsonDeserialize(using = ListOfMapEntryDeserializer.class)
-    @Override
-    public abstract Map<String, String> getContextMap();
-
-    @JsonProperty(JsonConstants.ELT_CONTEXT_STACK)
-    @JacksonXmlElementWrapper(namespace = XmlConstants.XML_NAMESPACE, 
localName = XmlConstants.ELT_CONTEXT_STACK)
-    @JacksonXmlProperty(namespace = XmlConstants.XML_NAMESPACE, localName = 
XmlConstants.ELT_CONTEXT_STACK_ITEM)
-    @Override
-    public abstract ContextStack getContextStack();
-
-    @JsonProperty()
-    @JacksonXmlProperty(isAttribute = true)
-    @Override
-    public abstract Level getLevel();
-
-    @JsonProperty()
-    @JacksonXmlProperty(isAttribute = true)
-    @Override
-    public abstract String getLoggerFqcn();
-
-    @JsonProperty()
-    @JacksonXmlProperty(isAttribute = true)
-    @Override
-    public abstract String getLoggerName();
-
-    @JsonProperty(JsonConstants.ELT_MARKER)
-    @JacksonXmlProperty(namespace = XmlConstants.XML_NAMESPACE, localName = 
XmlConstants.ELT_MARKER)
-    @Override
-    public abstract Marker getMarker();
-
-    @JsonProperty(JsonConstants.ELT_MESSAGE)
-    @JsonSerialize(using = MessageSerializer.class)
-    @JsonDeserialize(using = SimpleMessageDeserializer.class)
-    @JacksonXmlProperty(namespace = XmlConstants.XML_NAMESPACE, localName = 
XmlConstants.ELT_MESSAGE)
-    @Override
-    public abstract Message getMessage();
-
-    @JsonProperty(JsonConstants.ELT_SOURCE)
-    @JsonDeserialize(using = Log4jStackTraceElementDeserializer.class)
-    @JacksonXmlProperty(namespace = XmlConstants.XML_NAMESPACE, localName = 
XmlConstants.ELT_SOURCE)
-    @Override
-    public abstract StackTraceElement getSource();
-
-    @Override
-    @JsonProperty("threadId")
-    @JacksonXmlProperty(isAttribute = true, localName = "threadId")
-    public abstract long getThreadId();
-
-    @Override
-    @JsonProperty("thread")
-    @JacksonXmlProperty(isAttribute = true, localName = "thread")
-    public abstract String getThreadName();
-
-    @Override
-    @JsonProperty("threadPriority")
-    @JacksonXmlProperty(isAttribute = true, localName = "threadPriority")
-    public abstract int getThreadPriority();
-
-    @JsonIgnore
-    @Override
-    public abstract Throwable getThrown();
-
-    @JsonProperty(JsonConstants.ELT_THROWN)
-    @JacksonXmlProperty(namespace = XmlConstants.XML_NAMESPACE, localName = 
XmlConstants.ELT_THROWN)
-    @Override
-    public abstract ThrowableProxy getThrownProxy();
-
-    @JsonProperty()
-    @JacksonXmlProperty(isAttribute = true)
-    @Override
-    public abstract long getTimeMillis();
-
-    @JsonProperty()
-    @JacksonXmlProperty(isAttribute = true)
-    @Override
-    public abstract boolean isEndOfBatch();
-
-    @JsonIgnore
-    @Override
-    public abstract boolean isIncludeLocation();
-
-    @Override
-    public abstract void setEndOfBatch(boolean endOfBatch);
-
-    @Override
-    public abstract void setIncludeLocation(boolean locationRequired);
-
-}

http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/0f402af3/log4j-core/src/main/java/org/apache/logging/log4j/core/jackson/LogEventWithContextListMixIn.java
----------------------------------------------------------------------
diff --git 
a/log4j-core/src/main/java/org/apache/logging/log4j/core/jackson/LogEventWithContextListMixIn.java
 
b/log4j-core/src/main/java/org/apache/logging/log4j/core/jackson/LogEventWithContextListMixIn.java
new file mode 100644
index 0000000..e40c65a
--- /dev/null
+++ 
b/log4j-core/src/main/java/org/apache/logging/log4j/core/jackson/LogEventWithContextListMixIn.java
@@ -0,0 +1,148 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache license, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the license for the specific language governing permissions and
+ * limitations under the license.
+ */
+package org.apache.logging.log4j.core.jackson;
+
+import java.util.Map;
+
+import org.apache.logging.log4j.Level;
+import org.apache.logging.log4j.Marker;
+import org.apache.logging.log4j.ThreadContext.ContextStack;
+import org.apache.logging.log4j.core.ContextData;
+import org.apache.logging.log4j.core.LogEvent;
+import org.apache.logging.log4j.core.impl.ThrowableProxy;
+import org.apache.logging.log4j.message.Message;
+
+import com.fasterxml.jackson.annotation.JsonFilter;
+import com.fasterxml.jackson.annotation.JsonIgnore;
+import com.fasterxml.jackson.annotation.JsonProperty;
+import com.fasterxml.jackson.annotation.JsonPropertyOrder;
+import com.fasterxml.jackson.annotation.JsonRootName;
+import com.fasterxml.jackson.databind.annotation.JsonDeserialize;
+import com.fasterxml.jackson.databind.annotation.JsonSerialize;
+import 
com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlElementWrapper;
+import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlProperty;
+import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlRootElement;
+
+@JsonRootName(XmlConstants.ELT_EVENT)
+@JacksonXmlRootElement(namespace = XmlConstants.XML_NAMESPACE, localName = 
XmlConstants.ELT_EVENT)
+@JsonFilter("org.apache.logging.log4j.core.impl.Log4jLogEvent")
+@JsonPropertyOrder({ "timeMillis", "threadName", "level", "loggerName", 
"marker", "message", "thrown", XmlConstants.ELT_CONTEXT_MAP,
+        JsonConstants.ELT_CONTEXT_STACK, "loggerFQCN", "Source", "endOfBatch" 
})
+abstract class LogEventWithContextListMixIn implements LogEvent {
+
+    private static final long serialVersionUID = 1L;
+
+//    @JsonProperty(JsonConstants.ELT_CONTEXT_MAP)
+//    @JacksonXmlProperty(namespace = XmlConstants.XML_NAMESPACE, localName = 
XmlConstants.ELT_CONTEXT_MAP)
+//    @JsonSerialize(using = ListOfMapEntrySerializer.class)
+//    @JsonDeserialize(using = ListOfMapEntryDeserializer.class)
+    @Override
+    @JsonIgnore
+    public abstract Map<String, String> getContextMap();
+
+    @JsonProperty(JsonConstants.ELT_CONTEXT_MAP)
+    @JacksonXmlProperty(namespace = XmlConstants.XML_NAMESPACE, localName = 
XmlConstants.ELT_CONTEXT_MAP)
+    @JsonSerialize(using = ContextDataAsEntryListSerializer.class)
+    @JsonDeserialize(using = ContextDataAsEntryListDeserializer.class)
+//    @JsonIgnore
+    @Override
+    public abstract ContextData getContextData();
+
+    @JsonProperty(JsonConstants.ELT_CONTEXT_STACK)
+    @JacksonXmlElementWrapper(namespace = XmlConstants.XML_NAMESPACE, 
localName = XmlConstants.ELT_CONTEXT_STACK)
+    @JacksonXmlProperty(namespace = XmlConstants.XML_NAMESPACE, localName = 
XmlConstants.ELT_CONTEXT_STACK_ITEM)
+    @Override
+    public abstract ContextStack getContextStack();
+
+    @JsonProperty()
+    @JacksonXmlProperty(isAttribute = true)
+    @Override
+    public abstract Level getLevel();
+
+    @JsonProperty()
+    @JacksonXmlProperty(isAttribute = true)
+    @Override
+    public abstract String getLoggerFqcn();
+
+    @JsonProperty()
+    @JacksonXmlProperty(isAttribute = true)
+    @Override
+    public abstract String getLoggerName();
+
+    @JsonProperty(JsonConstants.ELT_MARKER)
+    @JacksonXmlProperty(namespace = XmlConstants.XML_NAMESPACE, localName = 
XmlConstants.ELT_MARKER)
+    @Override
+    public abstract Marker getMarker();
+
+    @JsonProperty(JsonConstants.ELT_MESSAGE)
+    @JsonSerialize(using = MessageSerializer.class)
+    @JsonDeserialize(using = SimpleMessageDeserializer.class)
+    @JacksonXmlProperty(namespace = XmlConstants.XML_NAMESPACE, localName = 
XmlConstants.ELT_MESSAGE)
+    @Override
+    public abstract Message getMessage();
+
+    @JsonProperty(JsonConstants.ELT_SOURCE)
+    @JsonDeserialize(using = Log4jStackTraceElementDeserializer.class)
+    @JacksonXmlProperty(namespace = XmlConstants.XML_NAMESPACE, localName = 
XmlConstants.ELT_SOURCE)
+    @Override
+    public abstract StackTraceElement getSource();
+
+    @Override
+    @JsonProperty("threadId")
+    @JacksonXmlProperty(isAttribute = true, localName = "threadId")
+    public abstract long getThreadId();
+
+    @Override
+    @JsonProperty("thread")
+    @JacksonXmlProperty(isAttribute = true, localName = "thread")
+    public abstract String getThreadName();
+
+    @Override
+    @JsonProperty("threadPriority")
+    @JacksonXmlProperty(isAttribute = true, localName = "threadPriority")
+    public abstract int getThreadPriority();
+
+    @JsonIgnore
+    @Override
+    public abstract Throwable getThrown();
+
+    @JsonProperty(JsonConstants.ELT_THROWN)
+    @JacksonXmlProperty(namespace = XmlConstants.XML_NAMESPACE, localName = 
XmlConstants.ELT_THROWN)
+    @Override
+    public abstract ThrowableProxy getThrownProxy();
+
+    @JsonProperty()
+    @JacksonXmlProperty(isAttribute = true)
+    @Override
+    public abstract long getTimeMillis();
+
+    @JsonProperty()
+    @JacksonXmlProperty(isAttribute = true)
+    @Override
+    public abstract boolean isEndOfBatch();
+
+    @JsonIgnore
+    @Override
+    public abstract boolean isIncludeLocation();
+
+    @Override
+    public abstract void setEndOfBatch(boolean endOfBatch);
+
+    @Override
+    public abstract void setIncludeLocation(boolean locationRequired);
+
+}

Reply via email to