logging-log4j-dev mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From Remko Popma <remko.po...@gmail.com>
Subject Re: logging-log4j2 git commit: LOG4J2-124 - Add shutdown methods to LogManager
Date Wed, 27 Jan 2016 05:17:50 GMT
Mikael, feel free to update the javadoc when you have time.

On Wednesday, 27 January 2016, Remko Popma <remko.popma@gmail.com> wrote:

> Since the async loggers and appenders will wait until their queue has been
> cleared by the background thread, it is a blocking call.
>
> We should probably add a sentence to the java doc to clarify this.
>
> Sent from my iPhone
>
> On 2016/01/26, at 18:15, Mikael Ståldal <mikael.staldal@magine.com
> <javascript:_e(%7B%7D,'cvml','mikael.staldal@magine.com');>> wrote:
>
> I think that we should be clear, in Javadoc, about whether this new method
> is synchronous/blocking or not.
>
> (I could say the same about quite a few existing methods as well, but
> let's at least start to be clear about new methods from now.)
>
> On Tue, Jan 26, 2016 at 1:31 AM, Matt Sicker <boards@gmail.com
> <javascript:_e(%7B%7D,'cvml','boards@gmail.com');>> wrote:
>
>> I like it!
>>
>> On 25 January 2016 at 18:23, Ralph Goers <ralph.goers@dslextreme.com
>> <javascript:_e(%7B%7D,'cvml','ralph.goers@dslextreme.com');>> wrote:
>>
>>> Then the method name would be terminate?  I could live with that.  I
>>> also like the fact that when something goes wrong with it then it would be
>>> interminable ;-)
>>>
>>> Ralph
>>>
>>> On Jan 25, 2016, at 5:18 PM, Matt Sicker <boards@gmail.com
>>> <javascript:_e(%7B%7D,'cvml','boards@gmail.com');>> wrote:
>>>
>>> How about Terminable? It's even a real word to boot.
>>>
>>> On 25 January 2016 at 18:15, Ralph Goers <ralph.goers@dslextreme.com
>>> <javascript:_e(%7B%7D,'cvml','ralph.goers@dslextreme.com');>> wrote:
>>>
>>>> Yes, well - Serializable actually sounds like it should be a real word.
>>>> Shutdownable doesn’t - in fact, my mail editor just split it into two words
>>>> to “help” me. I take a different view. A class that declares it implements
>>>> an interface isn’t “capable” of anything - it just implements the
>>>> interface. The interface name is what tells you that the implementing class
>>>> is able to do something, which is why you have Comparable instead of just
>>>> Compare, Cloneable instead of just Clone,  or Closeable instead of just
>>>> Close. Would you want Stop instead of Stoppable?  I view “able” as just
a
>>>> shorthand way of saying “Capable”, but unfortunately that just doesn’t
>>>> sound right with Shutdown (at least to me).
>>>>
>>>> Here are some “able” alternatives - presumably each would have a
>>>> corresponding method name instead of shutdown:
>>>> Terminateable.
>>>> Completeable.
>>>> Concludeable.
>>>> Haltable.
>>>> Dismissable.
>>>> Expireable.
>>>>
>>>> I suppose we could also use Stoppable but that seems odd since stop is
>>>> part of Lifecycle.
>>>>
>>>> Got a preference?
>>>>
>>>> Ralph
>>>>
>>>>
>>>>
>>>> On Jan 25, 2016, at 4:35 PM, Gary Gregory <garydgregory@gmail.com
>>>> <javascript:_e(%7B%7D,'cvml','garydgregory@gmail.com');>> wrote:
>>>>
>>>> I see some interfaces with "*Capable*" in the name here and there in
>>>> the FOSS world (but not in the JRE) so I am a little more comfortable with
>>>> it.
>>>>
>>>> I still see plain old "Shutdown" as simpler.
>>>>
>>>> I think I've boiled down my feel for this name to the fact that the
>>>> Capable postfix is redundant since a class implementing any interface is
>>>> "capable" of that functionality. IOW we have Serializable vs.
>>>> SerializationCabable, which means the same thing.
>>>>
>>>> Gary
>>>>
>>>> On Mon, Jan 25, 2016 at 7:27 AM, Ralph Goers <
>>>> ralph.goers@dslextreme.com
>>>> <javascript:_e(%7B%7D,'cvml','ralph.goers@dslextreme.com');>> wrote:
>>>>
>>>>> What does it feel weird to you?  To be honest, I originally named the
>>>>> interface ‘Shutdown” and then changed it since it really is about
>>>>> implementing a behavior and “Shutdown” alone doesn’t really describe
that.
>>>>>
>>>>> Ralph
>>>>>
>>>>> On Jan 24, 2016, at 11:09 PM, Gary Gregory <garydgregory@gmail.com
>>>>> <javascript:_e(%7B%7D,'cvml','garydgregory@gmail.com');>> wrote:
>>>>>
>>>>> On Sun, Jan 24, 2016 at 10:07 PM, Gary Gregory <garydgregory@gmail.com
>>>>> <javascript:_e(%7B%7D,'cvml','garydgregory@gmail.com');>> wrote:
>>>>>
>>>>>> On Sun, Jan 24, 2016 at 1:54 PM, Ralph Goers <
>>>>>> ralph.goers@dslextreme.com
>>>>>> <javascript:_e(%7B%7D,'cvml','ralph.goers@dslextreme.com');>>
wrote:
>>>>>>
>>>>>>> Yes, Shutdownable is too weird.
>>>>>>>
>>>>>>
>>>>>> How about calling it simply "Shutdown" then? FooCapable feels weird
>>>>>> to me.
>>>>>>
>>>>>> Can anyone think of other (one-method or not) optional feature-like
>>>>>> interfaces in the JRE or other code base?
>>>>>>
>>>>>
>>>>> hm... ShutdownService?
>>>>>
>>>>> Gary
>>>>>
>>>>>
>>>>>>
>>>>>> Gary
>>>>>>
>>>>>> Closeable would imply there is a close method, not a shutdown
>>>>>>> method.  I have my doubts about the try-with-resources use case
here.
>>>>>>> Virtually all usages are probably going to be to disable automatic
shutdown
>>>>>>> and then the user placing the shutdown call somewhere they can
control,
>>>>>>> which probably will have nothing to do with initialization of
logging.
>>>>>>>
>>>>>>> Ralph
>>>>>>>
>>>>>>> On Jan 24, 2016, at 2:43 PM, Gary Gregory <garydgregory@gmail.com
>>>>>>> <javascript:_e(%7B%7D,'cvml','garydgregory@gmail.com');>>
wrote:
>>>>>>>
>>>>>>> Resending, got a error from my phone...
>>>>>>> ---------- Forwarded message ----------
>>>>>>> From: "Gary Gregory" <garydgregory@gmail.com
>>>>>>> <javascript:_e(%7B%7D,'cvml','garydgregory@gmail.com');>>
>>>>>>> Date: Jan 24, 2016 1:41 PM
>>>>>>> Subject: Re: logging-log4j2 git commit: LOG4J2-124 - Add shutdown
>>>>>>> methods to LogManager
>>>>>>> To: <dev@logging.apache.org
>>>>>>> <javascript:_e(%7B%7D,'cvml','dev@logging.apache.org');>>
>>>>>>> Cc:
>>>>>>>
>>>>>>> Hi all,
>>>>>>>
>>>>>>> Any reason not use the usual -able postfix instead of
>>>>>>> ShutdownCapable: Shutdownable sounds too weird? What about reusing
plain
>>>>>>> old Closeable? That means you could use the context in a try-with-resources
>>>>>>> block, a bonus.
>>>>>>>
>>>>>>> Gary
>>>>>>> On Jan 24, 2016 10:18 AM, <rgoers@apache.org
>>>>>>> <javascript:_e(%7B%7D,'cvml','rgoers@apache.org');>>
wrote:
>>>>>>>
>>>>>>>> Repository: logging-log4j2
>>>>>>>> Updated Branches:
>>>>>>>>   refs/heads/master 7d3aac4b9 -> 2df3f0e72
>>>>>>>>
>>>>>>>>
>>>>>>>> LOG4J2-124 - Add shutdown methods to LogManager
>>>>>>>>
>>>>>>>>
>>>>>>>> Project: http://git-wip-us.apache.org/repos/asf/logging-log4j2/repo
>>>>>>>> Commit:
>>>>>>>> http://git-wip-us.apache.org/repos/asf/logging-log4j2/commit/2df3f0e7
>>>>>>>> Tree:
>>>>>>>> http://git-wip-us.apache.org/repos/asf/logging-log4j2/tree/2df3f0e7
>>>>>>>> Diff:
>>>>>>>> http://git-wip-us.apache.org/repos/asf/logging-log4j2/diff/2df3f0e7
>>>>>>>>
>>>>>>>> Branch: refs/heads/master
>>>>>>>> Commit: 2df3f0e7262c90e3fe1700f053eebf18491650d9
>>>>>>>> Parents: 7d3aac4
>>>>>>>> Author: Ralph Goers <rgoers@nextiva.com
>>>>>>>> <javascript:_e(%7B%7D,'cvml','rgoers@nextiva.com');>>
>>>>>>>> Authored: Sun Jan 24 11:18:41 2016 -0700
>>>>>>>> Committer: Ralph Goers <rgoers@nextiva.com
>>>>>>>> <javascript:_e(%7B%7D,'cvml','rgoers@nextiva.com');>>
>>>>>>>> Committed: Sun Jan 24 11:18:41 2016 -0700
>>>>>>>>
>>>>>>>>
>>>>>>>> ----------------------------------------------------------------------
>>>>>>>>  .../org/apache/logging/log4j/LogManager.java    | 62
>>>>>>>> ++++++++++++++++++++
>>>>>>>>  .../logging/log4j/spi/ShutdownCapable.java      | 17 ++++++
>>>>>>>>  .../apache/logging/log4j/LogManagerTest.java    |  7 +++
>>>>>>>>  .../logging/log4j/core/LoggerContext.java       |  8 ++-
>>>>>>>>  4 files changed, 93 insertions(+), 1 deletion(-)
>>>>>>>>
>>>>>>>> ----------------------------------------------------------------------
>>>>>>>>
>>>>>>>>
>>>>>>>>
>>>>>>>> http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/2df3f0e7/log4j-api/src/main/java/org/apache/logging/log4j/LogManager.java
>>>>>>>>
>>>>>>>> ----------------------------------------------------------------------
>>>>>>>> diff --git
>>>>>>>> a/log4j-api/src/main/java/org/apache/logging/log4j/LogManager.java
>>>>>>>> b/log4j-api/src/main/java/org/apache/logging/log4j/LogManager.java
>>>>>>>> index f10e5a8..64c6ee5 100644
>>>>>>>> ---
>>>>>>>> a/log4j-api/src/main/java/org/apache/logging/log4j/LogManager.java
>>>>>>>> +++
>>>>>>>> b/log4j-api/src/main/java/org/apache/logging/log4j/LogManager.java
>>>>>>>> @@ -27,6 +27,7 @@ import
>>>>>>>> org.apache.logging.log4j.simple.SimpleLoggerContextFactory;
>>>>>>>>  import org.apache.logging.log4j.spi.LoggerContext;
>>>>>>>>  import org.apache.logging.log4j.spi.LoggerContextFactory;
>>>>>>>>  import org.apache.logging.log4j.spi.Provider;
>>>>>>>> +import org.apache.logging.log4j.spi.ShutdownCapable;
>>>>>>>>  import org.apache.logging.log4j.status.StatusLogger;
>>>>>>>>  import org.apache.logging.log4j.util.LoaderUtil;
>>>>>>>>  import org.apache.logging.log4j.util.PropertiesUtil;
>>>>>>>> @@ -285,6 +286,67 @@ public class LogManager {
>>>>>>>>      }
>>>>>>>>
>>>>>>>>      /**
>>>>>>>> +     * Shutdown using the default LoggerContext.
>>>>>>>> +     * @since 2.6
>>>>>>>> +     */
>>>>>>>> +    public static void shutdown() {
>>>>>>>> +        shutdown(getContext());
>>>>>>>> +    }
>>>>>>>> +
>>>>>>>> +    /**
>>>>>>>> +     * Shutdown the logging system if the logging system
supports
>>>>>>>> it.
>>>>>>>> +     * @param currentContext if true the LoggerContext for
the
>>>>>>>> caller of this method will be used.
>>>>>>>> +     * @since 2.6
>>>>>>>> +     */
>>>>>>>> +    public static void shutdown(boolean currentContext)
{
>>>>>>>> +        shutdown(getContext(currentContext));
>>>>>>>> +    }
>>>>>>>> +
>>>>>>>> +    /**
>>>>>>>> +     * Shutdown the logging system if the logging system
supports
>>>>>>>> it.
>>>>>>>> +     * @param loader The ClassLoader for the context. If
null the
>>>>>>>> context will attempt to determine the appropriate
>>>>>>>> +     *            ClassLoader.
>>>>>>>> +     * @param currentContext if false the LoggerContext
>>>>>>>> appropriate for the caller of this method will be used.
>>>>>>>> +     * @since 2.6
>>>>>>>> +     */
>>>>>>>> +    public static void shutdown(final ClassLoader loader,
final
>>>>>>>> boolean currentContext) {
>>>>>>>> +        shutdown(getContext(loader, currentContext));
>>>>>>>> +    }
>>>>>>>> +
>>>>>>>> +    /**
>>>>>>>> +     * Shutdown the logging system if the logging system
supports
>>>>>>>> it.
>>>>>>>> +     * @param context the LoggerContext.
>>>>>>>> +     * @since 2.6
>>>>>>>> +     */
>>>>>>>> +    public static void shutdown(LoggerContext context) {
>>>>>>>> +        if (context != null && context instanceof
ShutdownCapable)
>>>>>>>> {
>>>>>>>> +            ((ShutdownCapable) context).shutdown();
>>>>>>>> +        }
>>>>>>>> +    }
>>>>>>>> +
>>>>>>>> +    /**
>>>>>>>> +     * Shutdown the logging system if the logging system
supports
>>>>>>>> it.
>>>>>>>> +     * @param fqcn The fully qualified class name of the
Class
>>>>>>>> that this method is a member of.
>>>>>>>> +     * @param currentContext if false the LoggerContext
>>>>>>>> appropriate for the caller of this method will be used.
>>>>>>>> +     * @since 2.6
>>>>>>>> +     */
>>>>>>>> +    protected static void shutdown(final String fqcn, final
>>>>>>>> boolean currentContext) {
>>>>>>>> +        shutdown(getContext(fqcn, currentContext));
>>>>>>>> +    }
>>>>>>>> +
>>>>>>>> +    /**
>>>>>>>> +     * Shutdown the logging system if the logging system
supports
>>>>>>>> it.
>>>>>>>> +     * @param fqcn The fully qualified class name of the
Class
>>>>>>>> that this method is a member of.
>>>>>>>> +     * @param loader The ClassLoader for the context. If
null the
>>>>>>>> context will attempt to determine the appropriate
>>>>>>>> +     *            ClassLoader.
>>>>>>>> +     * @param currentContext if false the LoggerContext
>>>>>>>> appropriate for the caller of this method will be used.
>>>>>>>> +     * @since 2.6
>>>>>>>> +     */
>>>>>>>> +    protected static void shutdown(final String fqcn, final
>>>>>>>> ClassLoader loader, final boolean currentContext) {
>>>>>>>> +        shutdown(getContext(fqcn, loader, currentContext));
>>>>>>>> +    }
>>>>>>>> +
>>>>>>>> +    /**
>>>>>>>>       * Returns the current LoggerContextFactory.
>>>>>>>>       *
>>>>>>>>       * @return The LoggerContextFactory.
>>>>>>>>
>>>>>>>>
>>>>>>>> http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/2df3f0e7/log4j-api/src/main/java/org/apache/logging/log4j/spi/ShutdownCapable.java
>>>>>>>>
>>>>>>>> ----------------------------------------------------------------------
>>>>>>>> diff --git
>>>>>>>> a/log4j-api/src/main/java/org/apache/logging/log4j/spi/ShutdownCapable.java
>>>>>>>> b/log4j-api/src/main/java/org/apache/logging/log4j/spi/ShutdownCapable.java
>>>>>>>> new file mode 100644
>>>>>>>> index 0000000..a46ef60
>>>>>>>> --- /dev/null
>>>>>>>> +++
>>>>>>>> b/log4j-api/src/main/java/org/apache/logging/log4j/spi/ShutdownCapable.java
>>>>>>>> @@ -0,0 +1,17 @@
>>>>>>>> +/*
>>>>>>>> + * Copyright (c) 2016 Nextiva, Inc. to Present.
>>>>>>>> + * All rights reserved.
>>>>>>>> + */
>>>>>>>> +package org.apache.logging.log4j.spi;
>>>>>>>> +
>>>>>>>> +/**
>>>>>>>> + * Interface to be implemented by LoggerContext's that provide
a
>>>>>>>> shutdown method.
>>>>>>>> + * @since 2.6
>>>>>>>> + */
>>>>>>>> +public interface ShutdownCapable {
>>>>>>>> +
>>>>>>>> +    /**
>>>>>>>> +     * Requests that the logging implementation shut down.
>>>>>>>> +     */
>>>>>>>> +    void shutdown();
>>>>>>>> +}
>>>>>>>>
>>>>>>>>
>>>>>>>> http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/2df3f0e7/log4j-api/src/test/java/org/apache/logging/log4j/LogManagerTest.java
>>>>>>>>
>>>>>>>> ----------------------------------------------------------------------
>>>>>>>> diff --git
>>>>>>>> a/log4j-api/src/test/java/org/apache/logging/log4j/LogManagerTest.java
>>>>>>>> b/log4j-api/src/test/java/org/apache/logging/log4j/LogManagerTest.java
>>>>>>>> index 48f0eea..596a9f2 100644
>>>>>>>> ---
>>>>>>>> a/log4j-api/src/test/java/org/apache/logging/log4j/LogManagerTest.java
>>>>>>>> +++
>>>>>>>> b/log4j-api/src/test/java/org/apache/logging/log4j/LogManagerTest.java
>>>>>>>> @@ -17,6 +17,7 @@
>>>>>>>>  package org.apache.logging.log4j;
>>>>>>>>
>>>>>>>>  import
>>>>>>>> org.apache.logging.log4j.message.ParameterizedMessageFactory;
>>>>>>>> +import org.apache.logging.log4j.spi.LoggerContext;
>>>>>>>>  import org.junit.Test;
>>>>>>>>
>>>>>>>>  import static org.junit.Assert.*;
>>>>>>>> @@ -53,4 +54,10 @@ public class LogManagerTest {
>>>>>>>>          assertNotNull("No Logger returned", logger);
>>>>>>>>          assertTrue("Incorrect Logger name: " +
>>>>>>>> logger.getName(),LogManagerTest.class.getName().equals(logger.getName()));
>>>>>>>>      }
>>>>>>>> +
>>>>>>>> +    @Test
>>>>>>>> +    public void testShutdown() {
>>>>>>>> +        LoggerContext loggerContext = LogManager.getContext(false);
>>>>>>>> +        LogManager.shutdown(loggerContext);
>>>>>>>> +    }
>>>>>>>>  }
>>>>>>>>
>>>>>>>>
>>>>>>>> http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/2df3f0e7/log4j-core/src/main/java/org/apache/logging/log4j/core/LoggerContext.java
>>>>>>>>
>>>>>>>> ----------------------------------------------------------------------
>>>>>>>> diff --git
>>>>>>>> a/log4j-core/src/main/java/org/apache/logging/log4j/core/LoggerContext.java
>>>>>>>> b/log4j-core/src/main/java/org/apache/logging/log4j/core/LoggerContext.java
>>>>>>>> index 42efbb5..fcdfc16 100644
>>>>>>>> ---
>>>>>>>> a/log4j-core/src/main/java/org/apache/logging/log4j/core/LoggerContext.java
>>>>>>>> +++
>>>>>>>> b/log4j-core/src/main/java/org/apache/logging/log4j/core/LoggerContext.java
>>>>>>>> @@ -45,6 +45,7 @@ import
>>>>>>>> org.apache.logging.log4j.message.MessageFactory;
>>>>>>>>  import org.apache.logging.log4j.spi.AbstractLogger;
>>>>>>>>  import org.apache.logging.log4j.spi.LoggerContextFactory;
>>>>>>>>  import org.apache.logging.log4j.spi.LoggerContextKey;
>>>>>>>> +import org.apache.logging.log4j.spi.ShutdownCapable;
>>>>>>>>
>>>>>>>>  import static
>>>>>>>> org.apache.logging.log4j.core.util.ShutdownCallbackRegistry.*;
>>>>>>>>
>>>>>>>> @@ -54,7 +55,7 @@ import static
>>>>>>>> org.apache.logging.log4j.core.util.ShutdownCallbackRegistry.*;
>>>>>>>>   * filters, etc and will be atomically updated whenever
a
>>>>>>>> reconfigure occurs.
>>>>>>>>   */
>>>>>>>>  public class LoggerContext extends AbstractLifeCycle implements
>>>>>>>> org.apache.logging.log4j.spi.LoggerContext,
>>>>>>>> -        ConfigurationListener {
>>>>>>>> +        ShutdownCapable, ConfigurationListener {
>>>>>>>>
>>>>>>>>      /**
>>>>>>>>       * Property name of the property change event fired
if the
>>>>>>>> configuration is changed.
>>>>>>>> @@ -278,6 +279,11 @@ public class LoggerContext extends
>>>>>>>> AbstractLifeCycle implements org.apache.loggi
>>>>>>>>      }
>>>>>>>>
>>>>>>>>      @Override
>>>>>>>> +    public void shutdown() {
>>>>>>>> +        stop();
>>>>>>>> +    }
>>>>>>>> +
>>>>>>>> +    @Override
>>>>>>>>      public void stop() {
>>>>>>>>          LOGGER.debug("Stopping LoggerContext[name={}, {}]...",
>>>>>>>> getName(), this);
>>>>>>>>          configLock.lock();
>>>>>>>>
>>>>>>>>
>>>>>>>
>>>>>>
>>>>>>
>>>>>> --
>>>>>> E-Mail: garydgregory@gmail.com
>>>>>> <javascript:_e(%7B%7D,'cvml','garydgregory@gmail.com');> |
>>>>>> ggregory@apache.org
>>>>>> <javascript:_e(%7B%7D,'cvml','ggregory@apache.org');>
>>>>>> Java Persistence with Hibernate, Second Edition
>>>>>> <http://www.manning.com/bauer3/>
>>>>>> JUnit in Action, Second Edition <http://www.manning.com/tahchiev/>
>>>>>> Spring Batch in Action <http://www.manning.com/templier/>
>>>>>> Blog: http://garygregory.wordpress.com
>>>>>> Home: http://garygregory.com/
>>>>>> Tweet! http://twitter.com/GaryGregory
>>>>>>
>>>>>
>>>>>
>>>>>
>>>>> --
>>>>> E-Mail: garydgregory@gmail.com
>>>>> <javascript:_e(%7B%7D,'cvml','garydgregory@gmail.com');> |
>>>>> ggregory@apache.org
>>>>> <javascript:_e(%7B%7D,'cvml','ggregory@apache.org');>
>>>>> Java Persistence with Hibernate, Second Edition
>>>>> <http://www.manning.com/bauer3/>
>>>>> JUnit in Action, Second Edition <http://www.manning.com/tahchiev/>
>>>>> Spring Batch in Action <http://www.manning.com/templier/>
>>>>> Blog: http://garygregory.wordpress.com
>>>>> Home: http://garygregory.com/
>>>>> Tweet! http://twitter.com/GaryGregory
>>>>>
>>>>>
>>>>>
>>>>
>>>>
>>>> --
>>>> E-Mail: garydgregory@gmail.com
>>>> <javascript:_e(%7B%7D,'cvml','garydgregory@gmail.com');> | ggregory@apache.org
>>>> <javascript:_e(%7B%7D,'cvml','ggregory@apache.org');>
>>>> Java Persistence with Hibernate, Second Edition
>>>> <http://www.manning.com/bauer3/>
>>>> JUnit in Action, Second Edition <http://www.manning.com/tahchiev/>
>>>> Spring Batch in Action <http://www.manning.com/templier/>
>>>> Blog: http://garygregory.wordpress.com
>>>> Home: http://garygregory.com/
>>>> Tweet! http://twitter.com/GaryGregory
>>>>
>>>>
>>>>
>>>
>>>
>>> --
>>> Matt Sicker <boards@gmail.com
>>> <javascript:_e(%7B%7D,'cvml','boards@gmail.com');>>
>>>
>>>
>>>
>>
>>
>> --
>> Matt Sicker <boards@gmail.com
>> <javascript:_e(%7B%7D,'cvml','boards@gmail.com');>>
>>
>
>
>
> --
> [image: MagineTV]
>
> *Mikael Ståldal*
> Senior software developer
>
> *Magine TV*
> mikael.staldal@magine.com
> <javascript:_e(%7B%7D,'cvml','mikael.staldal@magine.com');>
> Grev Turegatan 3  | 114 46 Stockholm, Sweden  |   www.magine.com
>
> Privileged and/or Confidential Information may be contained in this
> message. If you are not the addressee indicated in this message
> (or responsible for delivery of the message to such a person), you may not
> copy or deliver this message to anyone. In such case,
> you should destroy this message and kindly notify the sender by reply
> email.
>
>

Mime
View raw message