One use case that I have at hand at the moment is that I want to be able to verify that my appenders have the expected configuration attributes. For example, I would like to be able to verify that my syslog appender is connecting to the expected host,port,protocol, etc.
On Wed, Jan 27, 2016 at 3:19 PM, Mikael Ståldal <[email protected]> wrote: > It would be useful if Apostolis Giannakidis can explain the use case > behind this request, now it is a bit abstract to me. > > On Wed, Jan 27, 2016 at 4:13 PM, Matt Sicker <[email protected]> wrote: > >> I mean keeping the Node tree to get attributes. It would only work from >> config files (and the config builder classes). We get questions every so >> often about modifying the config programmatically which would either need >> to maintain more Nodes or just be unsupported. >> >> On 27 January 2016 at 09:09, Mikael Ståldal <[email protected]> >> wrote: >> >> > I don't quite understand what you mean. >> > >> > On Wed, Jan 27, 2016 at 4:02 PM, Matt Sicker <[email protected]> wrote: >> > >> > > That sounds a little fragile as some people either create or modify >> their >> > > creation directly from the plugin factories. >> > > >> > > On 27 January 2016 at 07:05, Mikael Ståldal < >> [email protected]> >> > > wrote: >> > > >> > > > Then perhaps we should keep the node tree and expose it for this >> kind >> > of >> > > > queries, something like this: >> > > > >> > > > String hostname = loggerContext.getConfiguration(). >> > > > getAttributesForAppender("syslogAppender").get("host"); >> > > > >> > > > This would require a new method in >> > > > org.apache.logging.log4j.core.config.Configuration: >> > > > >> > > > public Map<String, String> getAttributesForAppender(String >> > appenderName); >> > > > >> > > > >> > > > >> > > > On Wed, Jan 27, 2016 at 1:27 PM, Ralph Goers < >> > [email protected] >> > > > >> > > > wrote: >> > > > >> > > > > While I understand your point, the node tree is discarded after >> the >> > > > > plugins are created. We would have to keep it around for this to >> > work. >> > > > > Furthermore, each component would need to have a reference to its >> > > > > corresponding node, which we obviously don't currently do. >> > > > > >> > > > > Ralph >> > > > > >> > > > > > On Jan 27, 2016, at 2:33 AM, Mikael Ståldal < >> > > [email protected] >> > > > > >> > > > > wrote: >> > > > > > >> > > > > > To me it does not seems good to force all Appender >> implementations >> > to >> > > > > > implement this. Especially not since the next logical step would >> > then >> > > > be >> > > > > to >> > > > > > do the same with other components such as Layouts. That would >> be a >> > > lot >> > > > of >> > > > > > work in total, and also add more work for all future components, >> > > > > including >> > > > > > 3rd party plugins. >> > > > > > >> > > > > > I think it makes more sense, and would be less work in total, if >> > the >> > > > > > configuration system would store and expose those attributes >> > without >> > > > > > involving the components themselves. >> > > > > > >> > > > > > On Wed, Jan 27, 2016 at 7:14 AM, Gary Gregory < >> > > [email protected]> >> > > > > > wrote: >> > > > > > >> > > > > >> Apostolis, >> > > > > >> >> > > > > >> You are warmly welcome to contribute to Log4j. You can create a >> > JIRA >> > > > and >> > > > > >> attach a patch in unified diff file format. Unit tests as part >> of >> > > the >> > > > > patch >> > > > > >> are a must IMO. Feel free to flush out any design or >> > implementation >> > > > > here on >> > > > > >> the dev ML. >> > > > > >> >> > > > > >> Thank you! >> > > > > >> Gary >> > > > > >> >> > > > > >> On Tue, Jan 26, 2016 at 5:02 PM, Ralph Goers < >> > > > > [email protected]> >> > > > > >> wrote: >> > > > > >> >> > > > > >>> All the attributes have to have String representations to be >> > usable >> > > > in >> > > > > >> the >> > > > > >>> XML, JSON & Properties configurations. Yes, the Map could >> contain >> > > > > Objects >> > > > > >>> but then every one of them has to be cast to its real object >> to >> > be >> > > > > >> usable. >> > > > > >>> >> > > > > >>> The map should be read-only because modifying its contents >> would >> > > have >> > > > > no >> > > > > >>> effect on the appender. >> > > > > >>> >> > > > > >>> The map should not be stored in an ivar but constructed >> whenever >> > > the >> > > > > >>> attributes are retrieved. Otherwise it will be temping to just >> > keep >> > > > > them >> > > > > >> in >> > > > > >>> a map and not as individual attributes, which would cause >> > problems. >> > > > > >>> >> > > > > >>> If you have nesting such as MyAppender extends MyBaseAppender >> > > > extends >> > > > > >>> AbstractOutputStreamAppender extends AbstractAppender, I >> > envision a >> > > > > >>> fillAttributes method at each “level” that fills in the >> > attributes >> > > it >> > > > > >> knows >> > > > > >>> about, so fillAttributeMap(map) should always call >> > > > > >>> super.fillAttributeMap(map) - except in AbstractAppender of >> > course >> > > - >> > > > > and >> > > > > >>> should call it before filling in its own attributes so that it >> > can >> > > > > >> override >> > > > > >>> any values provided by the base Appenders. If the primary >> > Appender >> > > > > does >> > > > > >>> not implement fillAttributeMap then only the attributes of its >> > > super >> > > > > >>> classes will be included, which is actually correct for the >> > > > > >> SyslogAppender. >> > > > > >>> >> > > > > >>> Ralph >> > > > > >>> >> > > > > >>>> On Jan 26, 2016, at 5:24 PM, Apostolis Giannakidis < >> > > > > >>> [email protected]> wrote: >> > > > > >>>> >> > > > > >>>> One thing to note here. Correct me if I am wrong, but the map >> > > should >> > > > > >>>> be Map<String, >> > > > > >>>> Object> because not all attributes are Strings. From the top >> of >> > my >> > > > > >> head, >> > > > > >>> I >> > > > > >>>> know that an attribute could also be a boolean. >> > > > > >>>> >> > > > > >>>> On Wed, Jan 27, 2016 at 12:06 AM, Gary Gregory < >> > > > > [email protected] >> > > > > >>> >> > > > > >>>> wrote: >> > > > > >>>> >> > > > > >>>>> I could see AbstractAppender implementing a getAttributes() >> > > method >> > > > > >> like >> > > > > >>>>> this: >> > > > > >>>>> >> > > > > >>>>> public Map<String, String> getAttributes() { >> > > > > >>>>> Map<String, String> map = new HashMap<>(); >> > > > > >>>>> fillAttributeMap(map); >> > > > > >>>>> // (1) should the map be read-only? why? >> > > > > >>>>> // (2) if the map is cached in an ivar, the it must be >> > > > updated >> > > > > >> by >> > > > > >>>>> each appender when an attribute changes, so >> > > > > >>>>> // I'd say no and follow the KISS principle for now. >> > > > > >>>>> return map; >> > > > > >>>>> } >> > > > > >>>>> >> > > > > >>>>> protected void fillAttributeMap(Map<String, String> map) { >> > > > > >>>>> // ... >> > > > > >>>>> } >> > > > > >>>>> >> > > > > >>>>> The boilerplate of creating and/or managing the map can be >> in >> > > > > >>>>> getAttributes(). >> > > > > >>>>> Actually filling in the map in is done in fillAttributeMap() >> > > which >> > > > > >> each >> > > > > >>>>> appender can override. >> > > > > >>>>> >> > > > > >>>>> fillAttributeMap() could be abstract to force each appender >> to >> > > make >> > > > > >> sure >> > > > > >>>>> developers pay attention to providing an implementation. >> > > > > >>>>> >> > > > > >>>>> Gary >> > > > > >>>>> >> > > > > >>>>> >> > > > > >>>>> On Tue, Jan 26, 2016 at 3:46 PM, Apostolis Giannakidis < >> > > > > >>>>> [email protected]> wrote: >> > > > > >>>>> >> > > > > >>>>>> Well, since the idea is to add it to the Appender >> interface, >> > it >> > > > > means >> > > > > >>>>> that >> > > > > >>>>>> all concrete Appenders need to be modified as well. So, >> yes, I >> > > can >> > > > > >> give >> > > > > >>>>> it >> > > > > >>>>>> a try to implement it for all the Appenders. One other >> simple >> > > way >> > > > > >> would >> > > > > >>>>> be >> > > > > >>>>>> to implement it once in the AbstractAppender so that all >> its >> > > > > >> subclasses >> > > > > >>>>>> will inherit it. >> > > > > >>>>>> >> > > > > >>>>>> On Tue, Jan 26, 2016 at 9:15 PM, Gary Gregory < >> > > > > >> [email protected]> >> > > > > >>>>>> wrote: >> > > > > >>>>>> >> > > > > >>>>>>> On Tue, Jan 26, 2016 at 1:06 PM, Apostolis Giannakidis < >> > > > > >>>>>>> [email protected]> wrote: >> > > > > >>>>>>> >> > > > > >>>>>>>> Actually, since this seems to be a useful feature, I >> would >> > > love >> > > > to >> > > > > >> do >> > > > > >>>>>> the >> > > > > >>>>>>>> patch myself and contribute it to the project, if you >> don't >> > > > mind. >> > > > > >>>>>>>> >> > > > > >>>>>>> >> > > > > >>>>>>> Do you plan on implementing this for all Appenders? >> > > > > >>>>>>> >> > > > > >>>>>>> Gary >> > > > > >>>>>>> >> > > > > >>>>>>>> >> > > > > >>>>>>>> On Tue, Jan 26, 2016 at 8:56 PM, Ralph Goers < >> > > > > >>>>>> [email protected] >> > > > > >>>>>>>> >> > > > > >>>>>>>> wrote: >> > > > > >>>>>>>> >> > > > > >>>>>>>>> Actually, I kind of like the idea of adding a >> > getAttributes() >> > > > > >>>>> method >> > > > > >>>>>> to >> > > > > >>>>>>>>> the Appender interface. Then each concrete Appender >> would >> > do: >> > > > > >>>>>>>>> >> > > > > >>>>>>>>> public void getAttributes() { >> > > > > >>>>>>>>> Map<String, String> attributes = new HashMap<>(); >> > > > > >>>>>>>>> super.getAttributes(attributes): >> > > > > >>>>>>>>> attributes.put(“myAttribute1”, “value1”); >> > > > > >>>>>>>>> return Collections.unmodifiableMap(attributes); >> > > > > >>>>>>>>> } >> > > > > >>>>>>>>> >> > > > > >>>>>>>>> >> > > > > >>>>>>>>> >> > > > > >>>>>>>>>> On Jan 26, 2016, at 1:28 PM, Gary Gregory < >> > > > > >>>>> [email protected]> >> > > > > >>>>>>>>> wrote: >> > > > > >>>>>>>>>> >> > > > > >>>>>>>>>> How about adding getters for the fields >> > > > > >>>>>>>>>> in >> > org.apache.logging.log4j.core.net.AbstractSocketManager? >> > > > > >>>>>>>>>> >> > > > > >>>>>>>>>> Gary >> > > > > >>>>>>>>>> >> > > > > >>>>>>>>>> On Tue, Jan 26, 2016 at 12:20 PM, Matt Sicker < >> > > > [email protected] >> > > > > > >> > > > > >>>>>>>> wrote: >> > > > > >>>>>>>>>> >> > > > > >>>>>>>>>>> You could always use reflection to access it for now. >> > > > > >>>>>>>>>>> >> > > > > >>>>>>>>>>> On 26 January 2016 at 14:17, Apostolis Giannakidis < >> > > > > >>>>>>>>>>> [email protected] >> > > > > >>>>>>>>>>>> wrote: >> > > > > >>>>>>>>>>> >> > > > > >>>>>>>>>>>> Thank you very much for the prompt reply Ralph. >> > > > > >>>>>>>>>>>> >> > > > > >>>>>>>>>>>> As far as I can see, the SyslogAppender class does >> not >> > > > expose >> > > > > a >> > > > > >>>>>> way >> > > > > >>>>>>>> to >> > > > > >>>>>>>>>>>> access these attributes. So, if there is no other >> way of >> > > > > >>>>>> accessing >> > > > > >>>>>>>>> these >> > > > > >>>>>>>>>>>> attributes, then I am not able to retrieve the >> > attributes >> > > > that >> > > > > >>>>> I >> > > > > >>>>>>> want >> > > > > >>>>>>>>>>> from >> > > > > >>>>>>>>>>>> the existing SyslogAppender implementation. If I >> > > understand >> > > > > >>>>>>>> correctly, >> > > > > >>>>>>>>>>>> correct me if I am wrong, I might have to create my >> own >> > > that >> > > > > >>>>>>> exposes >> > > > > >>>>>>>>>>> these >> > > > > >>>>>>>>>>>> attributes. >> > > > > >>>>>>>>>>>> >> > > > > >>>>>>>>>>>> Apos >> > > > > >>>>>>>>>>>> >> > > > > >>>>>>>>>>>> On Tue, Jan 26, 2016 at 8:03 PM, Ralph Goers < >> > > > > >>>>>>>>> [email protected] >> > > > > >>>>>>>>>>>> >> > > > > >>>>>>>>>>>> wrote: >> > > > > >>>>>>>>>>>> >> > > > > >>>>>>>>>>>>> Not exactly. You can do: >> > > > > >>>>>>>>>>>>> >> > > > > >>>>>>>>>>>>> Appender appender = >> > > > > >>>>>>>>>>> ctx.getConfiguration().getAppender(“syslogAppender”); >> > > > > >>>>>>>>>>>>> >> > > > > >>>>>>>>>>>>> then you would have to do >> > > > > >>>>>>>>>>>>> >> > > > > >>>>>>>>>>>>> SyslogAppender syslogAppender = (SyslogAppender) >> > > appender; >> > > > > >>>>>>>>>>>>> >> > > > > >>>>>>>>>>>>> normally you would probably use instanceof to >> verify it >> > > is >> > > > > >>>>>>> actually >> > > > > >>>>>>>> a >> > > > > >>>>>>>>>>>>> SyslogAppender. >> > > > > >>>>>>>>>>>>> >> > > > > >>>>>>>>>>>>> Once you have that you can call whatever methods the >> > > > > >>>>>>> SyslogAppender >> > > > > >>>>>>>>>>>>> exposes for getting its attributes. They are not >> stored >> > > in >> > > > a >> > > > > >>>>> Map >> > > > > >>>>>>>>>>> however, >> > > > > >>>>>>>>>>>>> so you can’t just call a generic getAttribute >> method. >> > > > > >>>>>>>>>>>>> >> > > > > >>>>>>>>>>>>> Ralph >> > > > > >>>>>>>>>>>>> >> > > > > >>>>>>>>>>>>> >> > > > > >>>>>>>>>>>>>> On Jan 26, 2016, at 11:58 AM, Apostolis >> Giannakidis < >> > > > > >>>>>>>>>>>>> [email protected]> wrote: >> > > > > >>>>>>>>>>>>>> >> > > > > >>>>>>>>>>>>>> Hello team, >> > > > > >>>>>>>>>>>>>> >> > > > > >>>>>>>>>>>>>> I have created a logger with an appender using the >> > > > > >>>>>>>>>>> ConfigurationBuilder >> > > > > >>>>>>>>>>>>> and >> > > > > >>>>>>>>>>>>>> the AppenderComponentBuilder. >> > > > > >>>>>>>>>>>>>> >> > > > > >>>>>>>>>>>>>> Let's say that this is how I create my appender: >> > > > > >>>>>>>>>>>>>> >> > > > > >>>>>>>>>>>>>> AppenderComponentBuilder appenderBuilder = >> > > > > >>>>>>>>>>>>>> builder.newAppender( "syslogAppender", >> > > > > >>>>> "Syslog" ) >> > > > > >>>>>>>>>>>>>> .addAttribute( "protocol", "TCP" ) >> > > > > >>>>>>>>>>>>>> .addAttribute( "host", "localhost" ) >> > > > > >>>>>>>>>>>>>> .addAttribute( "port", 514 ) >> > > > > >>>>>>>>>>>>>> .addAttribute( "facility", "LOCAL2" ) >> > > > > >>>>>>>>>>>>>> .addAttribute( "immediateFlush", true ) >> > > > > >>>>>>>>>>>>>> .addAttribute( "newLine", true ); >> > > > > >>>>>>>>>>>>>> >> > > > > >>>>>>>>>>>>>> Then, after I finish creating the builder I use the >> > > > > >>>>>>>>>>>>>> Configurator.initialize( builder.build() ) to get >> the >> > > > > >>>>>>>> LoggerContext. >> > > > > >>>>>>>>>>>>>> >> > > > > >>>>>>>>>>>>>> Is there any way I can access the attributes of the >> > > > appender >> > > > > >>>>>>>> through >> > > > > >>>>>>>>>>>> the >> > > > > >>>>>>>>>>>>>> LoggerContext? >> > > > > >>>>>>>>>>>>>> >> > > > > >>>>>>>>>>>>>> For example something like this: >> > > > > >>>>>>>>>>>>>> >> > > > > >>>>>>>>>>>>>> LoggerContext ctx = Configurator.initialize( >> > > > builder.build() >> > > > > >>>>> ); >> > > > > >>>>>>>>>>>>>> >> > > > > >>>>>>>>>>>>>> String hostname = >> > > > > >>>>>>>>>>>>>> >> > > > > >>>>>>>>>>>>> >> > > > > >>>>>>>>>>>> >> > > > > >>>>>>>>>>> >> > > > > >>>>>>>>> >> > > > > >>>>>>>> >> > > > > >>>>>>> >> > > > > >>>>>> >> > > > > >>>>> >> > > > > >>> >> > > > > >> >> > > > > >> > > > >> > > >> > >> ctx.getConfiguration()..getAppenders().get("syslogAppender").getAttribute("host"); >> > > > > >>>>>>>>>>>>>> >> > > > > >>>>>>>>>>>>>> Thank you all very much for your help. >> > > > > >>>>>>>>>>>>>> >> > > > > >>>>>>>>>>>>>> Apostolis >> > > > > >>>>>>>>>>>>> >> > > > > >>>>>>>>>>>>> >> > > > > >>>>>>>>>>>>> >> > > > > >>>>>>>>>>>>> >> > > > > >>>>>>>> >> > > > > >> >> > > --------------------------------------------------------------------- >> > > > > >>>>>>>>>>>>> To unsubscribe, e-mail: >> > > > > >>>>>> [email protected] >> > > > > >>>>>>>>>>>>> For additional commands, e-mail: >> > > > > >>>>>>> [email protected] >> > > > > >>>>>>>>>>>>> >> > > > > >>>>>>>>>>>>> >> > > > > >>>>>>>>>>>> >> > > > > >>>>>>>>>>> >> > > > > >>>>>>>>>>> >> > > > > >>>>>>>>>>> >> > > > > >>>>>>>>>>> -- >> > > > > >>>>>>>>>>> Matt Sicker <[email protected]> >> > > > > >>>>>>>>>>> >> > > > > >>>>>>>>>> >> > > > > >>>>>>>>>> >> > > > > >>>>>>>>>> >> > > > > >>>>>>>>>> -- >> > > > > >>>>>>>>>> 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 >> > > > > >>>>>>>>> >> > > > > >>>>>>>>> >> > > > > >>>>>>>>> >> > > > > >>>>>>>>> >> > > > > >>>>> >> > > > >> --------------------------------------------------------------------- >> > > > > >>>>>>>>> To unsubscribe, e-mail: >> > > > > [email protected] >> > > > > >>>>>>>>> For additional commands, e-mail: >> > > > > >>>>> [email protected] >> > > > > >>>>>>>>> >> > > > > >>>>>>>>> >> > > > > >>>>>>>> >> > > > > >>>>>>> >> > > > > >>>>>>> >> > > > > >>>>>>> >> > > > > >>>>>>> -- >> > > > > >>>>>>> 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 >> > > > > >>>>> >> > > > > >>> >> > > > > >>> >> > > > > >>> >> > > > > >>> >> > > --------------------------------------------------------------------- >> > > > > >>> To unsubscribe, e-mail: >> > [email protected] >> > > > > >>> For additional commands, e-mail: >> > > [email protected] >> > > > > >>> >> > > > > >>> >> > > > > >> >> > > > > >> >> > > > > >> -- >> > > > > >> 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 >> > > > > >> >> > > > > > >> > > > > > >> > > > > > >> > > > > > -- >> > > > > > [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. >> > > > > >> > > > > >> > > > > >> --------------------------------------------------------------------- >> > > > > To unsubscribe, e-mail: [email protected] >> > > > > For additional commands, e-mail: >> [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. >> > > > >> > > >> > > >> > > >> > > -- >> > > 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. >> > >> >> >> >> -- >> 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. >
