... and as far as I know Pax Exam (at least 1.x) only provides means
to wait for the system bundle startup. If your testcase has some
prerequisites that need to be met before test logic is run (i.e. you
need some bundles to be started, services to be registered, Spring
contexts to be created, Camel components to be detected and so on and
so forth), you need to code these checks by yourself.

Bartek

2011/4/25 Mark Nuttall <[email protected]>:
> Hi Matt,
>> With in PaxExam how do I control the creation/start order of bundles?
> It's pretty much a given in OSGi that cannot rely on or control bundle start
> ordering. It's an asynchronous environment, and application code needs to
> written so as to cope with that. This is why Valentin wrote,
> "To work around that I would suggest waiting for one of the services that
> the JNDI bundle installs for
> example org.osgi.service.jndi.JNDIContextManager or
>  org.osgi.service.jndi.JNDIProviderAdmin at the start of the test (via
> getOsgiService or otherwise). This resolves the problem for me."
> Your code will both work, and be more robust if you change it to wait for
> JNDI to start, rather than attempt to enforce start ordering.
> Regards,
> Mark
> On 21 April 2011 18:09, Matt Madhavan <[email protected]> wrote:
>>
>> Hi Valentine,
>> Thanks for the reply! Hi Andreas feel free to chime in as well!
>> With in PaxExam how do I control the creation/start order of bundles?
>> For instance inside the configuration method:
>> @org.ops4j.pax.exam.junit.Configuration
>> public static Option[] configuration() {
>> Option[] options = options(
>> bootDelegationPackages("javax.transaction",
>> "javax.transaction.*"),
>> // Log
>> mavenBundle("org.ops4j.pax.logging", "pax-logging-api"),
>> mavenBundle("org.ops4j.pax.logging", "pax-logging-service"),
>> mavenBundle("org.eclipse.equinox", "cm"),
>> mavenBundle("org.eclipse.osgi", "services"),
>> mavenBundle("org.ops4j.pax.web", "pax-web-extender-war"),
>> mavenBundle("org.ops4j.pax.web", "pax-web-jetty-bundle"),
>> mavenBundle("org.ops4j.pax.web", "pax-web-jsp"),
>> mavenBundle("org.apache.derby", "derby"),
>> mavenBundle("org.apache.geronimo.specs",
>> "geronimo-jpa_2.0_spec"),
>> Is there any way to specify the start order of the bundles? Or have some
>> specified bundles start only after certain bundles start?
>>
>> Thanks
>> Matt
>> On Wed, Apr 20, 2011 at 7:48 AM, Valentin Mahrwald
>> <[email protected]> wrote:
>>>
>>> Hi Matt,
>>> thanks for the code I have finally figured it out. What happens is that
>>> the test bundle runs before most of the framework is properly started. In
>>> particular, your test code executes before the JNDI activator had chance to
>>> install the InitialContextFactoryBuilder.
>>> That is not a bug though just an unfortunate and confusing consequence of
>>> the dynamics.
>>> To work around that I would suggest waiting for one of the services that
>>> the JNDI bundle installs for
>>> example org.osgi.service.jndi.JNDIContextManager
>>> or org.osgi.service.jndi.JNDIProviderAdmin at the start of the test (via
>>> getOsgiService or otherwise). This resolves the problem for me.
>>> Hope this helps,
>>> Valentin
>>>
>>> On 19 Apr 2011, at 23:14, Matt Madhavan wrote:
>>>
>>> Hi Valentin,
>>> I'm attaching my Itest java source code. Please take a look at it and let
>>> me know. If you want I can send you the whole project, next time
>>> Thanks
>>> Matt
>>>
>>> On Tue, Apr 19, 2011 at 12:44 PM, Valentin Mahrwald
>>> <[email protected]> wrote:
>>>>
>>>> Hi Matt,
>>>> it is hard to say what is going wrong, from the stack trace though I can
>>>> say that the OSGiInitialContextFactoryBuilder the root to all OSGi
>>>> integration is not installed. That means either
>>>> a) the JNDI activator (org.apache.aries.jndi.startup.Activator) did not
>>>> run
>>>> b) It failed to set itself as the InitialContextFactoryBuilder. In that
>>>> case there should be a "Cannot set the InitialContextFactoryBuilder ..."
>>>> info message in the itest logs somewhere.
>>>> I suspect that a) is the more likely case, in which case something went
>>>> wrong. Could you post your exact configuration settings - best with 
>>>> specific
>>>> maven versions - so I can try to reproduce the problem?
>>>> Regards,
>>>> Valentin
>>>>
>>>> On 18 Apr 2011, at 21:28, Matt Madhavan wrote:
>>>>
>>>> Hello Valentin,
>>>> I have all the bundles you have mentioned. Its still not starting :( Any
>>>> more ideas?
>>>> Thanks
>>>> Matt
>>>>
>>>> On Mon, Apr 18, 2011 at 2:31 PM, Valentin Mahrwald
>>>> <[email protected]> wrote:
>>>>>
>>>>> Hi Matt,
>>>>> the stack trace looks like in the ITest there is no Aries JNDI provider
>>>>> (either because it is not installed or has failed to start).
>>>>> In the blog tests there is:
>>>>>             mavenBundle("org.apache.aries.jndi",
>>>>> "org.apache.aries.jndi" )
>>>>> Plus at least the following dependencies I believe:
>>>>>             mavenBundle("org.apache.aries.proxy",
>>>>> "org.apache.aries.proxy"),
>>>>>             mavenBundle("org.apache.aries", "org.apache.aries.util" ),
>>>>>             mavenBundle("org.ops4j.pax.logging", "pax-logging-api"),
>>>>>             mavenBundle("org.ops4j.pax.logging",
>>>>> "pax-logging-service"),
>>>>>             mavenBundle("asm", "asm-all" )
>>>>> If you have those already in the setup, then I would assume that the
>>>>> JNDI bundle has not started correctly :(
>>>>> Regards,
>>>>> Valentin
>>>>> On 18 Apr 2011, at 20:22, Matt Madhavan wrote:
>>>>>
>>>>> Hello,
>>>>> I have a service defined as follows:
>>>>> <bean id="persistenceImpl"
>>>>>
>>>>> class="com.hcsc.itf.osgi.samples.bp_sdm_jpa.jpa.BlogPersistenceServiceImpl">
>>>>> <tx:transaction method="*" value="Required" />
>>>>> <jpa:context property="entityManager" unitname="blogExample" />
>>>>> </bean>
>>>>> <service id="blogJPAPersistenceService" ref="persistenceImpl"
>>>>>
>>>>> interface="com.hcsc.itf.osgi.samples.bp_sdm_jpa.api.persistence.BlogPersistenceService">
>>>>>   <service-properties>
>>>>>      <entry key="osgi.jndi.service.name"
>>>>> value="persistence/bpJPAPersistenceService"/>
>>>>>    </service-properties>
>>>>> </service>
>>>>> When I do Integration test (I'm using PAX-Exam/Pax_runner(1.5.0) with
>>>>> Equinox) I can look up the Service as follows with no problem.
>>>>>  @Test public void testPeristence() throws Exception {
>>>>> BlogPersistenceService jpaService = getOsgiService(
>>>>> BlogPersistenceService.class,
>>>>> "osgi.jndi.service.name=persistence/bpJPAPersistenceService", 10000);
>>>>> But I wanted to,look up the same service as a raw JNDI Look up as
>>>>> follows:
>>>>> @Test public void testPeristence() throws Exception { InitialContext ic
>>>>> = new InitialContext(); BlogPersistenceService jpaService =
>>>>> (BlogPersistenceService) ic.lookup("osgi:service/" +
>>>>> "com.hcsc.itf.osgi.samples.bp_sdm_jpa.api.persistence.BlogPersistenceService");
>>>>>
>>>>>
>>>>> I'm getting the following Exception. (Please note that I'm in essence
>>>>> doing the same thing as Apache Aries Blog sample!)
>>>>> javax.naming.NoInitialContextException: Need to specify class name in
>>>>> environment or system property, or as an applet parameter, or in an
>>>>> application resource file:  java.naming.factory.initial
>>>>> at
>>>>> javax.naming.spi.NamingManager.getInitialContext(NamingManager.java:645)
>>>>> at
>>>>> javax.naming.InitialContext.getDefaultInitCtx(InitialContext.java:288)
>>>>> at
>>>>> javax.naming.InitialContext.getURLOrDefaultInitCtx(InitialContext.java:325)
>>>>> at javax.naming.InitialContext.lookup(InitialContext.java:392)
>>>>> at
>>>>> com.hcsc.itf.osgi.samples.bp_sdm_jpa.itests.jpa.BpJpaJndiLookUpITest.testPeristence(BpJpaJndiLookUpITest.java:41)
>>>>> at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
>>>>> at
>>>>> sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
>>>>> at
>>>>> sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
>>>>> at java.lang.reflect.Method.invoke(Method.java:597)
>>>>> at
>>>>> org.ops4j.pax.exam.junit.extender.impl.internal.CallableTestMethodImpl.injectContextAndInvoke(CallableTestMethodImpl.java:143)
>>>>> at
>>>>> org.ops4j.pax.exam.junit.extender.impl.internal.CallableTestMethodImpl.call(CallableTestMethodImpl.java:105)
>>>>> at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
>>>>> at
>>>>> sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
>>>>> at
>>>>> sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
>>>>> at java.lang.reflect.Method.invoke(Method.java:597)
>>>>> at
>>>>> org.ops4j.pax.exam.rbc.internal.RemoteBundleContextImpl.remoteCall(RemoteBundleContextImpl.java:80)
>>>>> at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
>>>>> at
>>>>> sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
>>>>> at
>>>>> sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
>>>>> at java.lang.reflect.Method.invoke(Method.java:597)
>>>>> at sun.rmi.server.UnicastServerRef.dispatch(UnicastServerRef.java:305)
>>>>> at sun.rmi.transport.Transport$1.run(Transport.java:159)
>>>>> at java.security.AccessController.doPrivileged(Native Method)
>>>>> at sun.rmi.transport.Transport.serviceCall(Transport.java:155)
>>>>> at
>>>>> sun.rmi.transport.tcp.TCPTransport.handleMessages(TCPTransport.java:535)
>>>>> at
>>>>> sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run0(TCPTransport.java:790)
>>>>> at
>>>>> sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run(TCPTransport.java:649)
>>>>> at
>>>>> java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:886)
>>>>> at
>>>>> java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908)
>>>>> at java.lang.Thread.run(Thread.java:662)
>>>>> I'm kind of lost! I'm doing the exact thing as done in the Aries Blog
>>>>> sample! Any ideas please?
>>>>> Thanks
>>>>> Matt
>>>>>
>>>>>
>>>>>
>>>>
>>>>
>>>
>>> <BpJpaJndiLookUpITest.java>
>>
>
>

Reply via email to