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); + +}
