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