You are viewing a plain text version of this content. The canonical link for it is here.
Posted to users@tomee.apache.org by Camilo Rivera <ka...@hotmail.com> on 2009/08/05 23:52:46 UTC

Re: Unit testing code containing DirContext resource injection



David Blevins wrote:
> 
> 
> On Jul 14, 2009, at 1:16 PM, Allan Lykke Christensen wrote:
> 
>> Thanks for your response.  I realised that I was trying to over- 
>> engineer my code by having dynamic binding and look-up of objects  
>> using JNDI. It was not needed for the purpose of my application.  
>> Instead I've gone back to using a Resource Adapter for connecting to  
>> a Java Content Repository (JCR). Specifically, I'm using the  
>> Jackrabbit Content Repository. A JCA component was already provided  
>> (although a pain to install on Mac because of filename case issues)  
>> and I've managed to install it on GlassFish. This got me back to my  
>> original test case. Using the Resource Adapter (JCA 1.0), requires  
>> me to set-up a a Connector connection pool and resource which I  
>> bound to a JNDI name. The repository would then be available using  
>> the following DI:
>>
>> @Resource(mappedName="jcr/repository",  
>> type=javax.jcr.Repository.class) private Repository rep;
>>
>> But how do I tell OpenEJB about the resource so that I can add my  
>> own dummy repository before running my tests? Is it possible?
> 
> Sure, you can plug in any J2EE compliant Resource Adapter.  The  
> process for doing that in a Maven test environment is as a described  
> an email or two back.
> 
> As described in that other email, Maven will not add rar files  
> (Resource Adapter aRchives) to the classpath for some very stubborn  
> reason, so you have to sort of unwrap it by creating a module with the  
> same dependencies as the rar file and with the ra.xml file from the  
> rar extracted to src/resources/META-INF/ra.xml.  Fortunately  
> Jackrabbit uses maven and everything is up in maven repositories, so  
> the setup is much easier.  This worked for me:
> 
>    jackrabbit-rar
>    jackrabbit-rar/pom.xml
>    jackrabbit-rar/src
>    jackrabbit-rar/src/main
>    jackrabbit-rar/src/main/resources
>    jackrabbit-rar/src/main/resources/META-INF
>    jackrabbit-rar/src/main/resources/META-INF/ra.xml
> 
>    --pom.xml-------------
>    <?xml version="1.0" encoding="UTF-8"?>
>    <project xmlns="http://maven.apache.org/POM/4.0.0"
>      xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
>      xsi:schemaLocation="http://maven.apache.org/POM/4.0.0
>      http://maven.apache.org/maven-v4_0_0.xsd">
> 
>      <groupId>your.package</groupId>
>      <artifactId>jackrabbit-rar</artifactId>
>      <version>1.0-SNAPSHOT</version>
>      <modelVersion>4.0.0</modelVersion>
>      <packaging>jar</packaging>
>      <name>Jackrabbit Resource Adapter</name>
> 
>      <dependencies>
>        <dependency>
>          <groupId>org.apache.jackrabbit</groupId>
>          <artifactId>jackrabbit-jca</artifactId>
>          <version>1.5.6</version>
>        </dependency>
>        <dependency>
>          <groupId>javax.jcr</groupId>
>          <artifactId>jcr</artifactId>
>          <version>1.0</version>
>        </dependency>
>      </dependencies>
>    </project>
>    ----------------------
> 
> Adjust the <groupId> from "your.package" to whatever groupId you use  
> for your own modules.  Change the jackrabbit version to whatever you  
> are using.  Also remember the ra.xml file needs to be extracted from  
> the jackrabbit-jca.rar file.
> 
> Then you should add the "<module>jackrabbit-rar</module>" to your  
> parent pom.  Anywhere that needs to use the Jackrabbit Resource  
> Adapter just needs to declare a maven dependency on it like so:
> 
>      <dependency>
>        <groupId>your.package</groupId>
>        <artifactId>jackrabbit-rar</artifactId>
>        <version>1.0-SNAPSHOT</version>
>        <scope>provided</provided>
>      </dependency>
> 
> Once that is declared in your modules that use the Jackrabbit Resource  
> Adapter, all the injection points should work.  You should see some  
> log lines like the following that indicate the Resource Adapter (aka  
> Connector) is being found and deployed:
> 
>    INFO - Found ConnectorModule in classpath: /Users/dblevins/work/ 
> openejb3/examples/ear-testing/jackrabbit-rar/target/jackrabbit-rar-1.0- 
> SNAPSHOT.jar
>    ...
>    INFO - Beginning load: /Users/dblevins/work/openejb3/examples/ear- 
> testing/jackrabbit-rar/target/jackrabbit-rar-1.0-SNAPSHOT.jar
>    ...
>    INFO - Configuring Service(id=jackrabbit-rar-1.0-SNAPSHOT.jarRA,  
> type=Resource, provider-id=jackrabbit-rar-1.0-SNAPSHOT.jarRA)
>    INFO - Configuring Service(id=jackrabbit-rar-1.0-SNAPSHOT.jar,  
> type=Resource, provider-id=jackrabbit-rar-1.0-SNAPSHOT.jar)
>    ...
>    INFO - Enterprise application "classpath.ear" loaded.
> 
> I gave the above setup a try and it did deploy for me.  I don't know  
> what it takes to configure and use Jackrabbit itself, but this will  
> get you past the Maven limitation and allow OpenEJB to see and deploy  
> the rar like it would any compliant Resource Adapter.
> 
> Hope this helps!
> 
> -David
> 
> 
> 


Hello David,

I have followed your instructions and it worked great. Unfortunately, I
haven't been able to find a way to expose jackrabbit as a JNDI resource.
This was possible in JBoss by defining a *-ds file like the following:

<connection-factories> 
	<tx-connection-factory>
		<jndi-name>jcr/local</jndi-name> 
		<xa-transaction/>
		<rar-name>etask-jackrabbit-jca.rar</rar-name>
		<connection-definition>javax.jcr.Repository</connection-definition>
		<config-property name="homeDir"
type="java.lang.String">C:/path/to/repository</config-property>
		<config-property name="configFile"
type="java.lang.String">classpath:repository.xml</config-property>
		<config-property name="bindSessionToTransaction"
type="java.lang.Boolean">true</config-property>
	</tx-connection-factory>
</connection-factories>

I didn't find any documentation as to the way to deploy such a resource (the
repository). Do you know of any site where I can find this?

Regards,

Camilo.
-- 
View this message in context: http://www.nabble.com/Unit-testing-code-containing-DirContext-resource-injection-tp24101774p24836874.html
Sent from the OpenEJB User mailing list archive at Nabble.com.


Re: Unit testing code containing DirContext resource injection

Posted by David Blevins <da...@visi.com>.
On Aug 5, 2009, at 2:52 PM, Camilo Rivera wrote:

>
>
>
> David Blevins wrote:
>>
>>
>> On Jul 14, 2009, at 1:16 PM, Allan Lykke Christensen wrote:
>>
>>> Thanks for your response.  I realised that I was trying to over-
>>> engineer my code by having dynamic binding and look-up of objects
>>> using JNDI. It was not needed for the purpose of my application.
>>> Instead I've gone back to using a Resource Adapter for connecting to
>>> a Java Content Repository (JCR). Specifically, I'm using the
>>> Jackrabbit Content Repository. A JCA component was already provided
>>> (although a pain to install on Mac because of filename case issues)
>>> and I've managed to install it on GlassFish. This got me back to my
>>> original test case. Using the Resource Adapter (JCA 1.0), requires
>>> me to set-up a a Connector connection pool and resource which I
>>> bound to a JNDI name. The repository would then be available using
>>> the following DI:
>>>
>>> @Resource(mappedName="jcr/repository",
>>> type=javax.jcr.Repository.class) private Repository rep;
>>>
>>> But how do I tell OpenEJB about the resource so that I can add my
>>> own dummy repository before running my tests? Is it possible?
>>
>> Sure, you can plug in any J2EE compliant Resource Adapter.  The
>> process for doing that in a Maven test environment is as a described
>> an email or two back.
>>
>> As described in that other email, Maven will not add rar files
>> (Resource Adapter aRchives) to the classpath for some very stubborn
>> reason, so you have to sort of unwrap it by creating a module with  
>> the
>> same dependencies as the rar file and with the ra.xml file from the
>> rar extracted to src/resources/META-INF/ra.xml.  Fortunately
>> Jackrabbit uses maven and everything is up in maven repositories, so
>> the setup is much easier.  This worked for me:
>>
>>   jackrabbit-rar
>>   jackrabbit-rar/pom.xml
>>   jackrabbit-rar/src
>>   jackrabbit-rar/src/main
>>   jackrabbit-rar/src/main/resources
>>   jackrabbit-rar/src/main/resources/META-INF
>>   jackrabbit-rar/src/main/resources/META-INF/ra.xml
>>
>>   --pom.xml-------------
>>   <?xml version="1.0" encoding="UTF-8"?>
>>   <project xmlns="http://maven.apache.org/POM/4.0.0"
>>     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
>>     xsi:schemaLocation="http://maven.apache.org/POM/4.0.0
>>     http://maven.apache.org/maven-v4_0_0.xsd">
>>
>>     <groupId>your.package</groupId>
>>     <artifactId>jackrabbit-rar</artifactId>
>>     <version>1.0-SNAPSHOT</version>
>>     <modelVersion>4.0.0</modelVersion>
>>     <packaging>jar</packaging>
>>     <name>Jackrabbit Resource Adapter</name>
>>
>>     <dependencies>
>>       <dependency>
>>         <groupId>org.apache.jackrabbit</groupId>
>>         <artifactId>jackrabbit-jca</artifactId>
>>         <version>1.5.6</version>
>>       </dependency>
>>       <dependency>
>>         <groupId>javax.jcr</groupId>
>>         <artifactId>jcr</artifactId>
>>         <version>1.0</version>
>>       </dependency>
>>     </dependencies>
>>   </project>
>>   ----------------------
>>
>> Adjust the <groupId> from "your.package" to whatever groupId you use
>> for your own modules.  Change the jackrabbit version to whatever you
>> are using.  Also remember the ra.xml file needs to be extracted from
>> the jackrabbit-jca.rar file.
>>
>> Then you should add the "<module>jackrabbit-rar</module>" to your
>> parent pom.  Anywhere that needs to use the Jackrabbit Resource
>> Adapter just needs to declare a maven dependency on it like so:
>>
>>     <dependency>
>>       <groupId>your.package</groupId>
>>       <artifactId>jackrabbit-rar</artifactId>
>>       <version>1.0-SNAPSHOT</version>
>>       <scope>provided</provided>
>>     </dependency>
>>
>> Once that is declared in your modules that use the Jackrabbit  
>> Resource
>> Adapter, all the injection points should work.  You should see some
>> log lines like the following that indicate the Resource Adapter (aka
>> Connector) is being found and deployed:
>>
>>   INFO - Found ConnectorModule in classpath: /Users/dblevins/work/
>> openejb3/examples/ear-testing/jackrabbit-rar/target/jackrabbit- 
>> rar-1.0-
>> SNAPSHOT.jar
>>   ...
>>   INFO - Beginning load: /Users/dblevins/work/openejb3/examples/ear-
>> testing/jackrabbit-rar/target/jackrabbit-rar-1.0-SNAPSHOT.jar
>>   ...
>>   INFO - Configuring Service(id=jackrabbit-rar-1.0-SNAPSHOT.jarRA,
>> type=Resource, provider-id=jackrabbit-rar-1.0-SNAPSHOT.jarRA)
>>   INFO - Configuring Service(id=jackrabbit-rar-1.0-SNAPSHOT.jar,
>> type=Resource, provider-id=jackrabbit-rar-1.0-SNAPSHOT.jar)
>>   ...
>>   INFO - Enterprise application "classpath.ear" loaded.
>>
>> I gave the above setup a try and it did deploy for me.  I don't know
>> what it takes to configure and use Jackrabbit itself, but this will
>> get you past the Maven limitation and allow OpenEJB to see and deploy
>> the rar like it would any compliant Resource Adapter.
>>
>> Hope this helps!
>>
>> -David
>>
>>
>>
>
>
> Hello David,
>
> I have followed your instructions and it worked great.  
> Unfortunately, I
> haven't been able to find a way to expose jackrabbit as a JNDI  
> resource.
> This was possible in JBoss by defining a *-ds file like the following:
>
> <connection-factories>
> 	<tx-connection-factory>
> 		<jndi-name>jcr/local</jndi-name>
> 		<xa-transaction/>
> 		<rar-name>etask-jackrabbit-jca.rar</rar-name>
> 		<connection-definition>javax.jcr.Repository</connection-definition>
> 		<config-property name="homeDir"
> type="java.lang.String">C:/path/to/repository</config-property>
> 		<config-property name="configFile"
> type="java.lang.String">classpath:repository.xml</config-property>
> 		<config-property name="bindSessionToTransaction"
> type="java.lang.Boolean">true</config-property>
> 	</tx-connection-factory>
> </connection-factories>
>
> I didn't find any documentation as to the way to deploy such a  
> resource (the
> repository). Do you know of any site where I can find this?

Once the Resource Adapter is deployed you should be able to use any of  
these techniques to get a reference to any object that the Resource  
Adapter can create.

   http://openejb.apache.org/3.0/resource-ref-for-datasource.html

This doc shows DataSource, but the @Resource annotation can be used to  
get references of Resource Adapter created objects put into JNDI for  
lookup and optionally for injection.

Hope that was the answer you were looking for.  Let me know if that  
doesn't do the trick.

-David