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

Reply via email to