Ralph, I found the previous veto/not veto experience very uncomfortable and
I would much prefer some discussion first before driving it to that extreme.

Gary, I could not find any callers for this new method {{String
LogEvent#getContextMap(String)}}. Does this mean that the problem has
already been resolved? Perhaps this was resolved by changing the semantics
of {{Map<String, String> LogEvent#getContextMap()}} to always return a
non-null map? Now that this method is not used and there is no need for it
any more, can this method be removed?


On Sat, May 17, 2014 at 3:47 PM, Ralph Goers <[email protected]>wrote:

> Gary - The name is very bad. Why anything named “getContextMap” would not
> return some form of the whole map is beyond me. Calling getContextMap(key)
> is just confusing.  Why do you consider getContextMapValue “weird”? It
> seems perfectly appropriate to me.  Also, I thought in another email you
> said getContextMap never returned null - or did I misread that?
>
> Remko - when you say you don’t like it are you saying you are prepared to
> veto it?
>
> Ralph
>
> On May 16, 2014, at 4:21 PM, Remko Popma <[email protected]> wrote:
>
> > Sorry, but I honestly don't like this change.
> >
> > First, you'll probably find that this is incomplete: the client code
> also likely needs to know the key values, so in future we'd have to add a
> "getContextKeys()" method. (Any api that has a "getValue(key)" method needs
> a "getKeys()" method too.)
> >
> > You mentioned you had trouble finding a good name, sometimes that is a
> sign that the method doesn't "belong" there.
> >
> > Finally it seems overkill to change an interface and four
> implementations to get a tiny benefit in one or two places.
> >
> > As an alternative, client code could extract the event's map into a
> local variable, and replace this local variable with Collections.EMPTY_MAP
> if it was null. From then on just use the local var without checking for
> null.
> >
> > Or we could change the semantics of event.getContextMap() to never
> return null. - Implementation note: if we do this, I'd prefer to do the
> null checking in the getter methods instead of in the constructor: keeping
> the instance variables null (when constructed with null) makes
> serialization faster.
> >
> > Sent from my iPhone
> >
> >> On 2014/05/17, at 3:14, [email protected] wrote:
> >>
> >> Author: ggregory
> >> Date: Fri May 16 18:14:45 2014
> >> New Revision: 1595279
> >>
> >> URL: http://svn.apache.org/r1595279
> >> Log:
> >> Add LogEvent.getContextMap(String) to support easy ports from Log4j
> version 1.2's getProperty(String) method. Since LogEvent.getContextMap()
> can return null, it is cumbersome to use since a null check is required for
> bullet-proof code, adding this 1-arg String method addresses the issue
> cleanly. getContextMap(String) is not a great method name, but
> getContextMapValue(String) seems weird and Log4j 1.2's getProperty(String)
> name does not fit.
> >>
> >> Modified:
> >>
> logging/log4j/log4j2/trunk/log4j-core/src/main/java/org/apache/logging/log4j/core/AbstractLogEvent.java
> >>
> logging/log4j/log4j2/trunk/log4j-core/src/main/java/org/apache/logging/log4j/core/LogEvent.java
> >>
> logging/log4j/log4j2/trunk/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/db/jpa/BasicLogEventEntity.java
> >>
> logging/log4j/log4j2/trunk/log4j-core/src/main/java/org/apache/logging/log4j/core/async/RingBufferLogEvent.java
> >>
> logging/log4j/log4j2/trunk/log4j-core/src/main/java/org/apache/logging/log4j/core/impl/Log4jLogEvent.java
> >>
> logging/log4j/log4j2/trunk/log4j-core/src/main/java/org/apache/logging/log4j/core/layout/HTMLLayout.java
> >>
> logging/log4j/log4j2/trunk/log4j-flume-ng/src/main/java/org/apache/logging/log4j/flume/appender/FlumeEvent.java
> >>
> >> Modified:
> logging/log4j/log4j2/trunk/log4j-core/src/main/java/org/apache/logging/log4j/core/AbstractLogEvent.java
> >> URL:
> http://svn.apache.org/viewvc/logging/log4j/log4j2/trunk/log4j-core/src/main/java/org/apache/logging/log4j/core/AbstractLogEvent.java?rev=1595279&r1=1595278&r2=1595279&view=diff
> >>
> ==============================================================================
> >> ---
> logging/log4j/log4j2/trunk/log4j-core/src/main/java/org/apache/logging/log4j/core/AbstractLogEvent.java
> (original)
> >> +++
> logging/log4j/log4j2/trunk/log4j-core/src/main/java/org/apache/logging/log4j/core/AbstractLogEvent.java
> Fri May 16 18:14:45 2014
> >> @@ -37,6 +37,11 @@ public abstract class AbstractLogEvent i
> >>    }
> >>
> >>    @Override
> >> +    public String getContextMap(String key) {
> >> +        return null;
> >> +    }
> >> +
> >> +    @Override
> >>    public ContextStack getContextStack() {
> >>        return null;
> >>    }
> >>
> >> Modified:
> logging/log4j/log4j2/trunk/log4j-core/src/main/java/org/apache/logging/log4j/core/LogEvent.java
> >> URL:
> http://svn.apache.org/viewvc/logging/log4j/log4j2/trunk/log4j-core/src/main/java/org/apache/logging/log4j/core/LogEvent.java?rev=1595279&r1=1595278&r2=1595279&view=diff
> >>
> ==============================================================================
> >> ---
> logging/log4j/log4j2/trunk/log4j-core/src/main/java/org/apache/logging/log4j/core/LogEvent.java
> (original)
> >> +++
> logging/log4j/log4j2/trunk/log4j-core/src/main/java/org/apache/logging/log4j/core/LogEvent.java
> Fri May 16 18:14:45 2014
> >> @@ -39,6 +39,15 @@ public interface LogEvent extends Serial
> >>    Map<String, String> getContextMap();
> >>
> >>    /**
> >> +     * Gets the value at the given key in the context map.
> >> +     *
> >> +     * @param key the key to query
> >> +     * @return the value to which the specified key is mapped, or
> {@code null} if this map contains no mapping for the key or there is no
> >> +     *         map.
> >> +     */
> >> +    String getContextMap(String key);
> >> +
> >> +    /**
> >>     * Gets the NDC data.
> >>     *
> >>     * @return A copy of the Nested Diagnostic Context or null;
> >> @@ -160,4 +169,5 @@ public interface LogEvent extends Serial
> >>     * @see #getSource()
> >>     */
> >>    void setIncludeLocation(boolean locationRequired);
> >> +
> >> }
> >>
> >> Modified:
> logging/log4j/log4j2/trunk/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/db/jpa/BasicLogEventEntity.java
> >> URL:
> http://svn.apache.org/viewvc/logging/log4j/log4j2/trunk/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/db/jpa/BasicLogEventEntity.java?rev=1595279&r1=1595278&r2=1595279&view=diff
> >>
> ==============================================================================
> >> ---
> logging/log4j/log4j2/trunk/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/db/jpa/BasicLogEventEntity.java
> (original)
> >> +++
> logging/log4j/log4j2/trunk/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/db/jpa/BasicLogEventEntity.java
> Fri May 16 18:14:45 2014
> >> @@ -207,6 +207,18 @@ public abstract class BasicLogEventEntit
> >>    }
> >>
> >>    /**
> >> +     * Gets the value at the given key in the context map.
> >> +     *
> >> +     * @param key the key to query
> >> +     * @return the value to which the specified key is mapped, or
> {@code null} if this map contains no mapping for the key or there is no
> >> +     *         map.
> >> +     */
> >> +    @Override
> >> +    public String getContextMap(String key) {
> >> +        return this.getWrappedEvent().getContextMap(key);
> >> +    }
> >> +
> >> +    /**
> >>     * Gets the context stack. Annotated with {@code @Convert(converter
> = ContextStackAttributeConverter.class)}.
> >>     *
> >>     * @return the context stack.
> >>
> >> Modified:
> logging/log4j/log4j2/trunk/log4j-core/src/main/java/org/apache/logging/log4j/core/async/RingBufferLogEvent.java
> >> URL:
> http://svn.apache.org/viewvc/logging/log4j/log4j2/trunk/log4j-core/src/main/java/org/apache/logging/log4j/core/async/RingBufferLogEvent.java?rev=1595279&r1=1595278&r2=1595279&view=diff
> >>
> ==============================================================================
> >> ---
> logging/log4j/log4j2/trunk/log4j-core/src/main/java/org/apache/logging/log4j/core/async/RingBufferLogEvent.java
> (original)
> >> +++
> logging/log4j/log4j2/trunk/log4j-core/src/main/java/org/apache/logging/log4j/core/async/RingBufferLogEvent.java
> Fri May 16 18:14:45 2014
> >> @@ -190,6 +190,11 @@ public class RingBufferLogEvent implemen
> >>       return contextMap;
> >>   }
> >>
> >> +    @Override
> >> +    public String getContextMap(String key) {
> >> +        return contextMap == null ? null : contextMap.get(key);
> >> +    }
> >> +
> >>   @Override
> >>   public ContextStack getContextStack() {
> >>       return contextStack;
> >>
> >> Modified:
> logging/log4j/log4j2/trunk/log4j-core/src/main/java/org/apache/logging/log4j/core/impl/Log4jLogEvent.java
> >> URL:
> http://svn.apache.org/viewvc/logging/log4j/log4j2/trunk/log4j-core/src/main/java/org/apache/logging/log4j/core/impl/Log4jLogEvent.java?rev=1595279&r1=1595278&r2=1595279&view=diff
> >>
> ==============================================================================
> >> ---
> logging/log4j/log4j2/trunk/log4j-core/src/main/java/org/apache/logging/log4j/core/impl/Log4jLogEvent.java
> (original)
> >> +++
> logging/log4j/log4j2/trunk/log4j-core/src/main/java/org/apache/logging/log4j/core/impl/Log4jLogEvent.java
> Fri May 16 18:14:45 2014
> >> @@ -299,6 +299,18 @@ public class Log4jLogEvent implements Lo
> >>    }
> >>
> >>    /**
> >> +     * Gets the value at the given key in the context map.
> >> +     *
> >> +     * @param key the key to query
> >> +     * @return the value to which the specified key is mapped, or
> {@code null} if this map contains no mapping for the key or there is no
> >> +     *         map.
> >> +     */
> >> +    @Override
> >> +    public String getContextMap(String key) {
> >> +        return contextMap == null ? null : contextMap.get(key);
> >> +    }
> >> +
> >> +    /**
> >>     * Returns the StackTraceElement for the caller. This will be the
> entry that occurs right
> >>     * before the first occurrence of FQCN as a class name.
> >>     * @return the StackTraceElement for the caller.
> >>
> >> Modified:
> logging/log4j/log4j2/trunk/log4j-core/src/main/java/org/apache/logging/log4j/core/layout/HTMLLayout.java
> >> URL:
> http://svn.apache.org/viewvc/logging/log4j/log4j2/trunk/log4j-core/src/main/java/org/apache/logging/log4j/core/layout/HTMLLayout.java?rev=1595279&r1=1595278&r2=1595279&view=diff
> >>
> ==============================================================================
> >> ---
> logging/log4j/log4j2/trunk/log4j-core/src/main/java/org/apache/logging/log4j/core/layout/HTMLLayout.java
> (original)
> >> +++
> logging/log4j/log4j2/trunk/log4j-core/src/main/java/org/apache/logging/log4j/core/layout/HTMLLayout.java
> Fri May 16 18:14:45 2014
> >> @@ -166,7 +166,7 @@ public final class HTMLLayout extends Ab
> >>        sbuf.append("</td>").append(Constants.LINE_SEPARATOR);
> >>        sbuf.append("</tr>").append(Constants.LINE_SEPARATOR);
> >>
> >> -        if (event.getContextStack().getDepth() > 0) {
> >> +        if (event.getContextStack() != null &&
> !event.getContextStack().isEmpty()) {
> >>            sbuf.append("<tr><td bgcolor=\"#EEEEEE\" style=\"font-size :
> ").append(fontSize);
> >>            sbuf.append(";\" colspan=\"6\" ");
> >>            sbuf.append("title=\"Nested Diagnostic Context\">");
> >> @@ -174,7 +174,7 @@ public final class HTMLLayout extends Ab
> >>            sbuf.append("</td></tr>").append(Constants.LINE_SEPARATOR);
> >>        }
> >>
> >> -        if (event.getContextMap().size() > 0) {
> >> +        if (event.getContextMap() != null &&
> !event.getContextMap().isEmpty()) {
> >>            sbuf.append("<tr><td bgcolor=\"#EEEEEE\" style=\"font-size :
> ").append(fontSize);
> >>            sbuf.append(";\" colspan=\"6\" ");
> >>            sbuf.append("title=\"Mapped Diagnostic Context\">");
> >>
> >> Modified:
> logging/log4j/log4j2/trunk/log4j-flume-ng/src/main/java/org/apache/logging/log4j/flume/appender/FlumeEvent.java
> >> URL:
> http://svn.apache.org/viewvc/logging/log4j/log4j2/trunk/log4j-flume-ng/src/main/java/org/apache/logging/log4j/flume/appender/FlumeEvent.java?rev=1595279&r1=1595278&r2=1595279&view=diff
> >>
> ==============================================================================
> >> ---
> logging/log4j/log4j2/trunk/log4j-flume-ng/src/main/java/org/apache/logging/log4j/flume/appender/FlumeEvent.java
> (original)
> >> +++
> logging/log4j/log4j2/trunk/log4j-flume-ng/src/main/java/org/apache/logging/log4j/flume/appender/FlumeEvent.java
> Fri May 16 18:14:45 2014
> >> @@ -62,7 +62,7 @@ public class FlumeEvent extends SimpleEv
> >>
> >>    private final LogEvent event;
> >>
> >> -    private final Map<String, String> ctx = new HashMap<String,
> String>();
> >> +    private final Map<String, String> contextMap = new HashMap<String,
> String>();
> >>
> >>    private final boolean compress;
> >>
> >> @@ -95,7 +95,7 @@ public class FlumeEvent extends SimpleEv
> >>                for (String str : array) {
> >>                    str = str.trim();
> >>                    if (mdc.containsKey(str)) {
> >> -                        ctx.put(str, mdc.get(str));
> >> +                        contextMap.put(str, mdc.get(str));
> >>                    }
> >>                }
> >>            }
> >> @@ -108,12 +108,12 @@ public class FlumeEvent extends SimpleEv
> >>                }
> >>                for (final Map.Entry<String, String> entry :
> mdc.entrySet()) {
> >>                    if (!list.contains(entry.getKey())) {
> >> -                        ctx.put(entry.getKey(), entry.getValue());
> >> +                        contextMap.put(entry.getKey(),
> entry.getValue());
> >>                    }
> >>                }
> >>            }
> >>        } else {
> >> -            ctx.putAll(mdc);
> >> +            contextMap.putAll(mdc);
> >>        }
> >>
> >>        if (required != null) {
> >> @@ -140,7 +140,7 @@ public class FlumeEvent extends SimpleEv
> >>            headers.put(GUID, guid);
> >>        }
> >>
> >> -        addContextData(mdcPrefix, headers, ctx);
> >> +        addContextData(mdcPrefix, headers, contextMap);
> >>    }
> >>
> >>    protected void addStructuredData(final String prefix, final
> Map<String, String> fields,
> >> @@ -291,7 +291,19 @@ public class FlumeEvent extends SimpleEv
> >>     */
> >>    @Override
> >>    public Map<String, String> getContextMap() {
> >> -        return ctx;
> >> +        return contextMap;
> >> +    }
> >> +
> >> +    /**
> >> +     * Gets the value at the given key in the context map.
> >> +     *
> >> +     * @param key the key to query
> >> +     * @return the value to which the specified key is mapped, or
> {@code null} if this map contains no mapping for the key or there is no
> >> +     *         map.
> >> +     */
> >> +    @Override
> >> +    public String getContextMap(String key) {
> >> +        return contextMap == null ? null : contextMap.get(key);
> >>    }
> >>
> >>    /**
> >>
> >>
> >
> > ---------------------------------------------------------------------
> > To unsubscribe, e-mail: [email protected]
> > For additional commands, e-mail: [email protected]
> >
>
>
> ---------------------------------------------------------------------
> To unsubscribe, e-mail: [email protected]
> For additional commands, e-mail: [email protected]
>
>

Reply via email to