Return-Path: Delivered-To: apmail-incubator-aries-dev-archive@minotaur.apache.org Received: (qmail 71233 invoked from network); 30 Sep 2010 11:05:53 -0000 Received: from unknown (HELO mail.apache.org) (140.211.11.3) by 140.211.11.9 with SMTP; 30 Sep 2010 11:05:53 -0000 Received: (qmail 36758 invoked by uid 500); 30 Sep 2010 11:05:52 -0000 Delivered-To: apmail-incubator-aries-dev-archive@incubator.apache.org Received: (qmail 36618 invoked by uid 500); 30 Sep 2010 11:05:50 -0000 Mailing-List: contact aries-dev-help@incubator.apache.org; run by ezmlm Precedence: bulk List-Help: List-Unsubscribe: List-Post: List-Id: Reply-To: aries-dev@incubator.apache.org Delivered-To: mailing list aries-dev@incubator.apache.org Received: (qmail 36610 invoked by uid 99); 30 Sep 2010 11:05:49 -0000 Received: from athena.apache.org (HELO athena.apache.org) (140.211.11.136) by apache.org (qpsmtpd/0.29) with ESMTP; Thu, 30 Sep 2010 11:05:49 +0000 X-ASF-Spam-Status: No, hits=0.0 required=10.0 tests=FREEMAIL_FROM,RCVD_IN_DNSWL_NONE,SPF_PASS,T_TO_NO_BRKTS_FREEMAIL X-Spam-Check-By: apache.org Received-SPF: pass (athena.apache.org: domain of alasdair.nottingham@gmail.com designates 74.125.83.47 as permitted sender) Received: from [74.125.83.47] (HELO mail-gw0-f47.google.com) (74.125.83.47) by apache.org (qpsmtpd/0.29) with ESMTP; Thu, 30 Sep 2010 11:05:44 +0000 Received: by gwb1 with SMTP id 1so691351gwb.6 for ; Thu, 30 Sep 2010 04:05:23 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=gamma; h=domainkey-signature:mime-version:received:sender:received :in-reply-to:references:date:x-google-sender-auth:message-id:subject :from:to:content-type:content-transfer-encoding; bh=bGSdUmZpsRQOBseZJAuvNHHwjv3P/IKtovLgAwQdZ3s=; b=qpMb96k9ge9vTs3rg9fQi93xcgG6SRU4hcLVwlF2VqQWt9If990VikXjYNGZgEgNCo arkulb4VOY8Yv7igZ4MDaU4YCsUvrpVGBSZ73ubIhDw96/CrCBLQuYVEdPkjc6f+u+lg XUw5XwqcZ6+2Pud6WOIWnpvhdRpprGJw/obys= DomainKey-Signature: a=rsa-sha1; c=nofws; d=gmail.com; s=gamma; h=mime-version:sender:in-reply-to:references:date :x-google-sender-auth:message-id:subject:from:to:content-type :content-transfer-encoding; b=SNSPDuQc3sXOwVrol9+XARAXONRsdewUnxBL3eStvOiDdFYqCa2T1+6yAef3aQdGhs IzJEVhaqcYBRCjBHhWxSUNOK7P3BPZlVhyA3EtIJlPg0WWjU4hEMhPU0lyO78QTg1qPc JIURkh+ekx/zBcq9qMmVln2wgmkdSNH/nfA40= MIME-Version: 1.0 Received: by 10.224.80.133 with SMTP id t5mr2407929qak.42.1285844723495; Thu, 30 Sep 2010 04:05:23 -0700 (PDT) Sender: alasdair.nottingham@gmail.com Received: by 10.229.231.69 with HTTP; Thu, 30 Sep 2010 04:05:22 -0700 (PDT) In-Reply-To: References: <811F2598-EF2A-4FF4-81C6-2FFDA50B3449@gmail.com> <8C1D6720-80C6-4723-BBB5-8BF537FEC141@apache.org> Date: Thu, 30 Sep 2010 12:05:22 +0100 X-Google-Sender-Auth: TlcGnDXkSjkR5fL6RsgokVHvFUE Message-ID: Subject: Re: Aries Blueprint and cglib From: Alasdair Nottingham To: aries-dev@incubator.apache.org Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: quoted-printable So I agree if there is no need to proxy the service we shouldn't do it. In general you should only pay for it if you use it. Not sure I follow your disagreement, but I suspect I just don't know enough about your scenario. Alasdair On 30 September 2010 11:52, Guillaume Nodet wrote: > I agree we should not bend the design if not needed. =A0However, removing > potential problems that our users might run into is a good goal. =A0 =A0I= 'm also > wondering the need to create a proxy at all if the quiesce thingy isn't u= sed > (which mean if the quiesce api is not wired). =A0 In that case, we could > (should ?) expose the real object instead of wrapping it. > > Also I somewhat disagree about your analysis. =A0The client side supports > greedy proxying on collections, which won't work if we only expose a jdk > proxy. =A0Well, it will work, but really brings nothing... > > On Thu, Sep 30, 2010 at 12:08, Alasdair Nottingham wrote= : > >> I'm sorry I disagree with this. OSGi is a modularity system, so when >> using it you should absolutely not be dependant on the implementation >> of a service. Code that does this is badly designed, not modular and >> not using OSGi correctly. I do not think we should be designing our >> code to take into account these kinds of clients. >> >> I'm not expressing a view on whether we should use asm by default. I'm >> just saying this is a really poor reason for asking for the change. >> >> Alasdair >> >> On 30 September 2010 10:16, Guillaume Nodet wrote: >> > Right, so that's why exporting all classes actaully fixes the probelm. >> =A0But >> > what I meant is that people making mistakes is not a sufficient reason= to >> > brake their code. >> > That doesn't change my remark: =A0should we prefer using subclass prox= ies >> to >> > not disturb users ? Does it have any drawback? >> > >> > On Thu, Sep 30, 2010 at 11:10, Alasdair Nottingham >> wrote: >> > >> >> Your client code is broken. You shouldn't rely on a service >> >> implementing an interface or extending a class it isn't published >> >> using. >> >> >> >> On 29 September 2010 07:00, Guillaume Nodet wrote: >> >> > I just find Karaf a bit broken due to this behavior. =A0I wonder if= we >> >> should >> >> > use asm with subclass proxying by default (if asm is available) >> instead >> >> of >> >> > using a jdk proxy. =A0 I think making sure the real class is still >> >> available >> >> > would help reduce the possible problems. >> >> > In my cas, there was some code which was checking the class of an >> >> exported >> >> > service using instanceof, and that was broken due to the use of >> proxies. >> >> =A0As >> >> > a workaround, it's possible to force the use of subclass proxies by >> using >> >> > auto-export=3D"all-classes" on the service (which kinda makes sense= in >> my >> >> > case). >> >> > Thoughts? >> >> > >> >> > On Mon, Sep 27, 2010 at 08:52, Alasdair Nottingham >> >> wrote: >> >> > >> >> >> Before the 4.3 draft was published I would have said there is no >> issue. >> >> >> When 4.3 compendium is published one of the specs relies on readin= g >> >> >> annotations from the service implementation, so we need to make su= re >> the >> >> >> proxy has the target classes annotations. >> >> >> >> >> >> Alasdair >> >> >> >> >> >> On 27 Sep 2010, at 07:37, Guillaume Nodet wrote= : >> >> >> >> >> >> > Btw, after having done the changes in blueprint, I hit one small >> >> (maybe?) >> >> >> > problem which I want to report and gather feedback on. >> >> >> > By default, the ServiceRecipe will add a quiesce interceptor on >> >> exported >> >> >> > services. =A0That looks good, but it has the side effect of not >> exposing >> >> >> the >> >> >> > bean itself as a service, so I had to change the tests that were >> >> >> asserting >> >> >> > assertSame() to assertEquals(). =A0I'm not sure if it has any >> >> consequence >> >> >> on >> >> >> > TCK or something like that, but I wanted to report it. >> >> >> > I think this problem was kinda hidden because in the tests, the = asm >> >> lib >> >> >> was >> >> >> > not available, so interceptors were not configured at all (this >> also >> >> >> means >> >> >> > that the behavior was actually already present when asm was >> >> available). >> >> >> > >> >> >> > On Mon, Sep 27, 2010 at 08:27, Alasdair Nottingham > > >> >> >> wrote: >> >> >> > >> >> >> >> I have indeed. I'm currently making changes which "improve" the >> way >> >> it >> >> >> >> handles services, but we will see what people think. After that >> I'll >> >> >> look at >> >> >> >> the proxying code. >> >> >> >> >> >> >> >> Alasdair >> >> >> >> >> >> >> >> Alasdair Nottingham >> >> >> >> >> >> >> >> On 27 Sep 2010, at 07:02, Guillaume Nodet >> wrote: >> >> >> >> >> >> >> >>> Yeah, I haven't looked at the JNDI code recently. =A0I know yo= u've >> >> been >> >> >> >>> working on it lately, but it sounds like a good idea to share >> those >> >> >> bits. >> >> >> >>> >> >> >> >>> On Mon, Sep 27, 2010 at 07:56, Alasdair Nottingham < >> not@apache.org> >> >> >> >> wrote: >> >> >> >>> >> >> >> >>>> Hi, >> >> >> >>>> >> >> >> >>>> Couple of things the JNDI code uses CGLib for parodying, I gu= ess >> we >> >> >> >> should >> >> >> >>>> also be using ASM. I'm also wondering if it makes sense for J= NDI >> >> and >> >> >> >>>> blueprint should share damping code, at the least the proxy >> >> generation >> >> >> >> could >> >> >> >>>> be common, what do you think? >> >> >> >>>> >> >> >> >>>> Alasdair >> >> >> >>>> >> >> >> >>>> Alasdair Nottingham >> >> >> >>>> >> >> >> >>>> On 26 Sep 2010, at 22:09, Guillaume Nodet >> >> wrote: >> >> >> >>>> >> >> >> >>>>> Btw, i've raised and fixed ARIES-427 for that, so the next >> release >> >> >> will >> >> >> >>>> have no dependencies on cglib, and the blueprint bundle inclu= des >> >> the >> >> >> >> needed >> >> >> >>>> asm classes, so that it has no dependencies beyong slf4j and = the >> >> osgi >> >> >> >>>> packages. >> >> >> >>>>> >> >> >> >>>>> On Sun, Sep 26, 2010 at 19:40, Bengt Rodehav < >> bengt@rodehav.com> >> >> >> >> wrote: >> >> >> >>>>> Not sure I follow you Guillaume. >> >> >> >>>>> >> >> >> >>>>> How do I ensure that cglib is "present" when Blueprint >> resolves? >> >> What >> >> >> I >> >> >> >>>> did was to add the following line to Karaf's startup.properti= es: >> >> >> >>>>> >> >> >> >>>>> >> >> >> >>>> >> >> >> >> >> >> >> >> >> >> org/apache/servicemix/bundles/org.apache.servicemix.bundles.cglib/2.1_3_= 4/org.apache.servicemix.bundles.cglib-2.1_3_4.jar=3D12 >> >> >> >>>>> >> >> >> >>>>> It worked, but maybe that was by accident. What is the prope= r >> way >> >> to >> >> >> do >> >> >> >>>> it? >> >> >> >>>>> >> >> >> >>>>> /Bengt >> >> >> >>>>> >> >> >> >>>>> 2010/9/26 Guillaume Nodet >> >> >> >>>>> Start level won't help in that case. =A0The start level is f= or >> >> starting >> >> >> >>>> bundles, not resolving them. =A0The resolution will be done i= f the >> >> >> bundle >> >> >> >> is >> >> >> >>>> present, so your behavior can only happen the first time you >> >> install >> >> >> >> gclib >> >> >> >>>> *after* blueprint. >> >> >> >>>>> >> >> >> >>>>> >> >> >> >>>>> On Sun, Sep 26, 2010 at 11:09, Bengt Rodehav < >> bengt@rodehav.com> >> >> >> >> wrote: >> >> >> >>>>> OK - sounds like you have a plan. I'm not that familiar with >> asm >> >> vs >> >> >> >> cglib >> >> >> >>>> and therefore don't know why this problem would go away if yo= u >> >> >> switched >> >> >> >> from >> >> >> >>>> cglib to asm. >> >> >> >>>>> >> >> >> >>>>> Another way is, of course, to use OSGi services for this as >> well. >> >> I >> >> >> can >> >> >> >>>> well imagine a "Byte code manipulator service". However you'd >> have >> >> to >> >> >> >>>> encapsulate both asm and cglib behind a common interface. >> >> >> >>>>> >> >> >> >>>>> Meanwhile, I'll make sure that the cglib bundle's startlevel= is >> >> lower >> >> >> >>>> than Aries Blueprint... >> >> >> >>>>> >> >> >> >>>>> /Bengt >> >> >> >>>>> >> >> >> >>>>> 2010/9/26 Guillaume Nodet >> >> >> >>>>> >> >> >> >>>>> A trick is to use both an optional import + a dynamic import >> >> without >> >> >> a >> >> >> >>>> star... =A0That way the dynamic stuff isn't too 'icky' ... >> >> >> >>>>> Anyway, i agree to try getting rid of cglib. >> >> >> >>>>> >> >> >> >>>>> >> >> >> >>>>> On Sun, Sep 26, 2010 at 08:41, Johan Edstrom < >> seijoed@gmail.com> >> >> >> >> wrote: >> >> >> >>>>> As an outside spectator that does a lot of osgi,getting rid = of >> >> cglib >> >> >> >>>> would be great. >> >> >> >>>>> Dynamic imports are kinda "ICK" >> >> >> >>>>> >> >> >> >>>>> >> >> >> >>>>> /je >> >> >> >>>>> >> >> >> >>>>> On Sep 26, 2010, at 12:35 AM, Guillaume Nodet wrote: >> >> >> >>>>> >> >> >> >>>>>> That's not the way it works in OSGi. =A0This is true for >> services, >> >> not >> >> >> >> so >> >> >> >>>> much for packages. =A0There are ways to improve that by using= a >> >> >> >>>> DynamicImport-Package though ... >> >> >> >>>>>> Anyway, I think we should use asm instead of cglib for >> proxying, >> >> as >> >> >> >>>> it's done for interceptors. =A0We get then get rid of cglib a= nd >> only >> >> >> >> depend on >> >> >> >>>> asm when needed. =A0All the code is already available afaik. >> >> >> >>>>>> >> >> >> >>>>>> >> >> >> >>>>>> On Sun, Sep 26, 2010 at 03:48, Bengt Rodehav < >> bengt@rodehav.com> >> >> >> >>>> wrote: >> >> >> >>>>>> That will work but I regard this as a bug in Blueprint. A w= ell >> >> >> behaved >> >> >> >>>> OSGi citizen should keep track of dependencies coming and goi= ng. >> It >> >> >> >>>> shouldn't matter if cglib was not present when Blueprint was >> >> started >> >> >> as >> >> >> >> long >> >> >> >>>> as its there when it's needed (in this case when creating my >> >> blueprint >> >> >> >>>> container that requires interceptors). >> >> >> >>>>>> >> >> >> >>>>>> Should I create a JIRA for this? >> >> >> >>>>>> >> >> >> >>>>>> /Bengt >> >> >> >>>>>> >> >> >> >>>>>> 2010/9/25 Guillaume Nodet >> >> >> >>>>>> >> >> >> >>>>>> Try to restart or osgi:refresh the blueprint bundle in case >> the >> >> >> wiring >> >> >> >>>> hasn't been correctly done. >> >> >> >>>>>> >> >> >> >>>>>> >> >> >> >>>>>> On Sat, Sep 25, 2010 at 18:11, Bengt Rodehav < >> bengt@rodehav.com> >> >> >> >>>> wrote: >> >> >> >>>>>> It seems like the Aries Blueprint bundle requires cglib (or >> asm) >> >> to >> >> >> be >> >> >> >>>> installed before Blueprint is activated. If I first install >> >> Blueprint, >> >> >> >> then >> >> >> >>>> cglib and then my bundle requiring transaction interceptors i= t >> >> fails >> >> >> >> with >> >> >> >>>> with following exception: >> >> >> >>>>>> >> >> >> >>>>>> 2010-09-25 18:10:24,998 | ERROR | rint Extender: 2 | >> >> >> >>>> BlueprintContainerImpl =A0 =A0 =A0 =A0 =A0 | >> container.BlueprintContainerImpl >> >> >> =A0342 >> >> >> >> | >> >> >> >>>> Unable to start blueprint container for bundle refdata >> >> >> >>>>>> >> >> org.osgi.service.blueprint.container.ComponentDefinitionException: >> >> >> >>>> Interceptors have been configured but neither asm nor cglib a= re >> >> >> >> available >> >> >> >>>>>> =A0 =A0 at >> >> >> >>>> >> >> >> >> >> >> >> >> >> >> org.apache.aries.blueprint.container.BeanRecipe.addInterceptors(BeanReci= pe.java:694)[7:org.apache.aries.blueprint:0.2.0.incubating] >> >> >> >>>>>> =A0 =A0 at >> >> >> >>>> >> >> >> >> >> >> >> >> >> >> org.apache.aries.blueprint.container.BeanRecipe.internalCreate(BeanRecip= e.java:748)[7:org.apache.aries.blueprint:0.2.0.incubating] >> >> >> >>>>>> =A0 =A0 at >> >> >> >>>> >> >> >> >> >> >> >> >> >> >> org.apache.aries.blueprint.di.AbstractRecipe.create(AbstractRecipe.java:= 64)[7:org.apache.aries.blueprint:0.2.0.incubating] >> >> >> >>>>>> =A0 =A0 at >> >> >> >>>> >> >> >> >> >> >> >> >> >> >> org.apache.aries.blueprint.container.BlueprintRepository.createInstances= (BlueprintRepository.java:219)[7:org.apache.aries.blueprint:0.2.0.incubatin= g] >> >> >> >>>>>> =A0 =A0 at >> >> >> >>>> >> >> >> >> >> >> >> >> >> >> org.apache.aries.blueprint.container.BlueprintRepository.createAll(Bluep= rintRepository.java:147)[7:org.apache.aries.blueprint:0.2.0.incubating] >> >> >> >>>>>> =A0 =A0 at >> >> >> >>>> >> >> >> >> >> >> >> >> >> >> org.apache.aries.blueprint.container.BlueprintContainerImpl.instantiateE= agerComponents(BlueprintContainerImpl.java:624)[7:org.apache.aries.blueprin= t:0.2.0.incubating] >> >> >> >>>>>> =A0 =A0 at >> >> >> >>>> >> >> >> >> >> >> >> >> >> >> org.apache.aries.blueprint.container.BlueprintContainerImpl.doRun(Bluepr= intContainerImpl.java:315)[7:org.apache.aries.blueprint:0.2.0.incubating] >> >> >> >>>>>> =A0 =A0 at >> >> >> >>>> >> >> >> >> >> >> >> >> >> >> org.apache.aries.blueprint.container.BlueprintContainerImpl.run(Blueprin= tContainerImpl.java:213)[7:org.apache.aries.blueprint:0.2.0.incubating] >> >> >> >>>>>> =A0 =A0 at >> >> >> >>>> >> >> >> >> >> >> >> >> >> >> java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:441)[= :1.6.0_18] >> >> >> >>>>>> =A0 =A0 at >> >> >> >>>> >> >> >> >> >> >> >> >> >> >> java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:303)[:1.6.= 0_18] >> >> >> >>>>>> =A0 =A0 at >> >> >> >>>> >> java.util.concurrent.FutureTask.run(FutureTask.java:138)[:1.6.0_18] >> >> >> >>>>>> =A0 =A0 at >> >> >> >>>> >> >> >> >> >> >> >> >> >> >> java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.acc= ess$301(ScheduledThreadPoolExecutor.java:98)[:1.6.0_18] >> >> >> >>>>>> =A0 =A0 at >> >> >> >>>> >> >> >> >> >> >> >> >> >> >> java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run= (ScheduledThreadPoolExecutor.java:207)[:1.6.0_18] >> >> >> >>>>>> =A0 =A0 at >> >> >> >>>> >> >> >> >> >> >> >> >> >> >> java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecuto= r.java:886)[:1.6.0_18] >> >> >> >>>>>> =A0 =A0 at >> >> >> >>>> >> >> >> >> >> >> >> >> >> >> java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.ja= va:908)[:1.6.0_18] >> >> >> >>>>>> =A0 =A0 at java.lang.Thread.run(Thread.java:619)[:1.6.0_18] >> >> >> >>>>>> Caused by: java.lang.ClassNotFoundException: >> >> >> >>>> net.sf.cglib.proxy.Enhancer >> >> >> >>>>>> =A0 =A0 at >> >> >> >>>> >> >> >> >> >> >> >> >> >> >> org.apache.felix.framework.ModuleImpl.findClassOrResourceByDelegation(Mo= duleImpl.java:772)[org.apache.felix.framework-3.0.2.jar:] >> >> >> >>>>>> =A0 =A0 at >> >> >> >>>> >> >> >> >> >> >> >> >> >> >> org.apache.felix.framework.ModuleImpl.access$200(ModuleImpl.java:73)[org= .apache.felix.framework-3.0.2.jar:] >> >> >> >>>>>> =A0 =A0 at >> >> >> >>>> >> >> >> >> >> >> >> >> >> >> org.apache.felix.framework.ModuleImpl$ModuleClassLoader.loadClass(Module= Impl.java:1690)[org.apache.felix.framework-3.0.2.jar:] >> >> >> >>>>>> =A0 =A0 at >> >> >> >>>> java.lang.ClassLoader.loadClass(ClassLoader.java:248)[:1.6.0_= 18] >> >> >> >>>>>> =A0 =A0 at >> >> >> >>>> >> >> >> >> >> >> >> >> >> >> org.apache.aries.blueprint.container.BeanRecipe.addInterceptors(BeanReci= pe.java:691)[7:org.apache.aries.blueprint:0.2.0.incubating] >> >> >> >>>>>> =A0 =A0 ... 15 more >> >> >> >>>>>> >> >> >> >>>>>> >> >> >> >>>>>> If I make sure that cglib is started before Blueprint then >> >> >> everything >> >> >> >>>> works. Shouldn't it be enough that cglib is installed by the >> time I >> >> >> >> install >> >> >> >>>> my bundle requiring interceptors. Blueprint should pick up cg= lib >> >> when >> >> >> it >> >> >> >> is >> >> >> >>>> installed even if it happens after Blueprint itself is starte= d. >> >> >> >>>>>> >> >> >> >>>>>> I use Karaf 2.1, Aries 0.2-incubating and the Servicemix >> >> packaging >> >> >> of >> >> >> >>>> cglib version 2.1_3_4. >> >> >> >>>>>> >> >> >> >>>>>> /Bengt >> >> >> >>>>>> >> >> >> >>>>>> >> >> >> >>>>>> >> >> >> >>>>>> -- >> >> >> >>>>>> Cheers, >> >> >> >>>>>> Guillaume Nodet >> >> >> >>>>>> ------------------------ >> >> >> >>>>>> Blog: http://gnodet.blogspot.com/ >> >> >> >>>>>> ------------------------ >> >> >> >>>>>> Open Source SOA >> >> >> >>>>>> http://fusesource.com >> >> >> >>>>>> >> >> >> >>>>>> >> >> >> >>>>>> >> >> >> >>>>>> >> >> >> >>>>>> >> >> >> >>>>>> >> >> >> >>>>>> -- >> >> >> >>>>>> Cheers, >> >> >> >>>>>> Guillaume Nodet >> >> >> >>>>>> ------------------------ >> >> >> >>>>>> Blog: http://gnodet.blogspot.com/ >> >> >> >>>>>> ------------------------ >> >> >> >>>>>> Open Source SOA >> >> >> >>>>>> http://fusesource.com >> >> >> >>>>>> >> >> >> >>>>>> >> >> >> >>>>> >> >> >> >>>>> Johan Edstrom >> >> >> >>>>> >> >> >> >>>>> joed@opennms.org >> >> >> >>>>> >> >> >> >>>>> They that can give up essential liberty to purchase a little >> >> >> temporary >> >> >> >>>> safety, deserve neither liberty nor safety. >> >> >> >>>>> >> >> >> >>>>> Benjamin Franklin, Historical Review of Pennsylvania, 1759 >> >> >> >>>>> >> >> >> >>>>> >> >> >> >>>>> >> >> >> >>>>> >> >> >> >>>>> >> >> >> >>>>> >> >> >> >>>>> >> >> >> >>>>> >> >> >> >>>>> -- >> >> >> >>>>> Cheers, >> >> >> >>>>> Guillaume Nodet >> >> >> >>>>> ------------------------ >> >> >> >>>>> Blog: http://gnodet.blogspot.com/ >> >> >> >>>>> ------------------------ >> >> >> >>>>> Open Source SOA >> >> >> >>>>> http://fusesource.com >> >> >> >>>>> >> >> >> >>>>> >> >> >> >>>>> >> >> >> >>>>> >> >> >> >>>>> >> >> >> >>>>> >> >> >> >>>>> -- >> >> >> >>>>> Cheers, >> >> >> >>>>> Guillaume Nodet >> >> >> >>>>> ------------------------ >> >> >> >>>>> Blog: http://gnodet.blogspot.com/ >> >> >> >>>>> ------------------------ >> >> >> >>>>> Open Source SOA >> >> >> >>>>> http://fusesource.com >> >> >> >>>>> >> >> >> >>>>> >> >> >> >>>>> >> >> >> >>>>> >> >> >> >>>>> >> >> >> >>>>> >> >> >> >>>>> -- >> >> >> >>>>> Cheers, >> >> >> >>>>> Guillaume Nodet >> >> >> >>>>> ------------------------ >> >> >> >>>>> Blog: http://gnodet.blogspot.com/ >> >> >> >>>>> ------------------------ >> >> >> >>>>> Open Source SOA >> >> >> >>>>> http://fusesource.com >> >> >> >>>>> >> >> >> >>>>> >> >> >> >>>> >> >> >> >>> >> >> >> >>> >> >> >> >>> >> >> >> >>> -- >> >> >> >>> Cheers, >> >> >> >>> Guillaume Nodet >> >> >> >>> ------------------------ >> >> >> >>> Blog: http://gnodet.blogspot.com/ >> >> >> >>> ------------------------ >> >> >> >>> Open Source SOA >> >> >> >>> http://fusesource.com >> >> >> >> >> >> >> > >> >> >> > >> >> >> > >> >> >> > -- >> >> >> > Cheers, >> >> >> > Guillaume Nodet >> >> >> > ------------------------ >> >> >> > Blog: http://gnodet.blogspot.com/ >> >> >> > ------------------------ >> >> >> > Open Source SOA >> >> >> > http://fusesource.com >> >> >> >> >> > >> >> > >> >> > >> >> > -- >> >> > Cheers, >> >> > Guillaume Nodet >> >> > ------------------------ >> >> > Blog: http://gnodet.blogspot.com/ >> >> > ------------------------ >> >> > Open Source SOA >> >> > http://fusesource.com >> >> > >> >> >> >> >> >> >> >> -- >> >> Alasdair Nottingham >> >> not@apache.org >> >> >> > >> > >> > >> > -- >> > Cheers, >> > Guillaume Nodet >> > ------------------------ >> > Blog: http://gnodet.blogspot.com/ >> > ------------------------ >> > Open Source SOA >> > http://fusesource.com >> > >> >> >> >> -- >> Alasdair Nottingham >> not@apache.org >> > > > > -- > Cheers, > Guillaume Nodet > ------------------------ > Blog: http://gnodet.blogspot.com/ > ------------------------ > Open Source SOA > http://fusesource.com > --=20 Alasdair Nottingham not@apache.org