OK, also done. On Wed, Jan 27, 2016 at 2:07 PM, Remko Popma <[email protected]> wrote:
> Perhaps you also want to add this to the LogManager.shutdown() methods, > since I imagine that's what people will actually use/look at. > > Sent from my iPhone > > On 2016/01/27, at 18:20, Mikael Ståldal <[email protected]> wrote: > > OK, done. > > On Wed, Jan 27, 2016 at 6:17 AM, Remko Popma <[email protected]> > wrote: > >> Mikael, feel free to update the javadoc when you have time. >> >> >> On Wednesday, 27 January 2016, Remko Popma <[email protected]> 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 <[email protected]> >>> 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 <[email protected]> wrote: >>> >>>> I like it! >>>> >>>> On 25 January 2016 at 18:23, Ralph Goers <[email protected]> >>>> 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 <[email protected]> wrote: >>>>> >>>>> How about Terminable? It's even a real word to boot. >>>>> >>>>> On 25 January 2016 at 18:15, Ralph Goers <[email protected]> >>>>> 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 <[email protected]> >>>>>> 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 < >>>>>> [email protected]> 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 <[email protected]> >>>>>>> wrote: >>>>>>> >>>>>>> On Sun, Jan 24, 2016 at 10:07 PM, Gary Gregory < >>>>>>> [email protected]> wrote: >>>>>>> >>>>>>>> On Sun, Jan 24, 2016 at 1:54 PM, Ralph Goers < >>>>>>>> [email protected]> 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 <[email protected]> >>>>>>>>> wrote: >>>>>>>>> >>>>>>>>> Resending, got a error from my phone... >>>>>>>>> ---------- Forwarded message ---------- >>>>>>>>> From: "Gary Gregory" <[email protected]> >>>>>>>>> Date: Jan 24, 2016 1:41 PM >>>>>>>>> Subject: Re: logging-log4j2 git commit: LOG4J2-124 - Add shutdown >>>>>>>>> methods to LogManager >>>>>>>>> To: <[email protected]> >>>>>>>>> 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, <[email protected]> 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 <[email protected]> >>>>>>>>>> Authored: Sun Jan 24 11:18:41 2016 -0700 >>>>>>>>>> Committer: Ralph Goers <[email protected]> >>>>>>>>>> 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: [email protected] | [email protected] >>>>>>>> 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: [email protected] | [email protected] >>>>>>> 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: [email protected] | [email protected] >>>>>> 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 <[email protected]> >>>>> >>>>> >>>>> >>>> >>>> >>>> -- >>>> Matt Sicker <[email protected]> >>>> >>> >>> >>> >>> -- >>> [image: MagineTV] >>> >>> *Mikael Ståldal* >>> Senior software developer >>> >>> *Magine TV* >>> [email protected] >>> 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. >>> >>> > > > -- > [image: MagineTV] > > *Mikael Ståldal* > Senior software developer > > *Magine TV* > [email protected] > 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. > > -- [image: MagineTV] *Mikael Ståldal* Senior software developer *Magine TV* [email protected] 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.
