Andre Broers’ personal blog

January 31, 2008

EJB3 + JPA on OC4J with Client

Filed under: 11g, ejb, j2ee, java, jpa, oc4j, oracle — broersa @ 9:08 am

Let’s use the previous JPA sample in an EJB. We start creating a datasource on the OC4J container. Then we create the entities again. After this we use the entities in a Stateless EJB which we will deploy to OC4J 11g. Finally we create a stand-alone client which calls the EJB.

We start with the creation of the datasource. We need a ConnectionPool.

java -jar $OC4J_ADMIN/j2ee/home/admin_client.jar deployer:oc4j:localhost oc4jadmin welcome -CreateJDBCConnectionPool -applicationName default -name HrConnectionPool -factoryClass oracle.jdbc.pool.OracleDataSource -user hr -password hr -url jdbc:oracle:thin:@localhost:1521:orcl

Test the connectionpool:

java -jar $OC4J_ADMIN/j2ee/home/admin_client.jar deployer:oc4j:localhost oc4jadmin welcome
-testConnectionPool -connectionPoolName HrConnectionPool -sqlStatement “select
* from dual” And the datasource:

java -jar $OC4J_ADMIN/j2ee/home/admin_client.jar deployer:oc4j:localhost oc4jadmin welcome -createManagedDataSource -applicationName default -dataSourceName HrDataSource -jndiLocation jdbc/HrDataSource -connectionPoolName HrConnectionPool

After this we create the entities:

/home/broersa/work/CountryApp/CountryJPAEJB/src/com/bekijkhet/entity/Country.java:


package com.bekijkhet.entity;

import java.io.Serializable;
import javax.persistence.*;

@Entity
@Table(name="COUNTRIES")
public class Country implements Serializable {
        private String id;
        private String name;
        private Region region;

        @Id
        @Column(name="COUNTRY_ID")
        public String getId() {
                return id;
        }

        public void setId(String id) {
                this.id = id;
        }

        @Column(name="COUNTRY_NAME")
        public String getName() {
                return name;
        }

        public void setName(String name) {
                this.name = name;
        }

        @ManyToOne(cascade={CascadeType.ALL})
        @JoinColumn(name="REGION_ID",nullable=false)
        public Region getRegion() {
                return region;
        }

        public void setRegion(Region region) {
                this.region = region;
        }
}

/home/broersa/work/CountryApp/CountryJPAEJB/src/com/bekijkhet/entity/Region.java


package com.bekijkhet.entity;

import java.io.Serializable;
import javax.persistence.*;
import static javax.persistence.CascadeType.*;
import static javax.persistence.FetchType.*;

import java.util.List;
import java.util.ArrayList;

@Entity
@Table(name="REGIONS")
public class Region implements Serializable {
        private int id;
        private String name;
        private List<Country> countries = new ArrayList<Country>();;

        @Id
        @Column(name="REGION_ID")
        public int getId() {
                return id;
        }

        public void setId(int id) {
                this.id = id;
        }

        @Column(name="REGION_NAME")
        public String getName() {
                return name;
        }

        public void setName(String name) {
                this.name = name;
        }

        @OneToMany(fetch=FetchType.EAGER, cascade={CascadeType.ALL}, mappedBy="region")
        public List<Country> getCountries() {
                return countries;
        }

        public void setCountries(List<Country> newValue) {
                this.countries = newValue;
        }
}

The EJB:/home/broersa/work/CountryApp/CountryJPAEJB/src/com/bekijkhet/country/CountryEJBLocal.java:


package com.bekijkhet.country;

import com.bekijkhet.entity.*;
import java.util.List;

public interface CountryEJBLocal {
  public List<Country> getCountriesByRegion(String region);
  public Region getRegionByCountry(String country);
}

/home/broersa/work/CountryApp/CountryJPAEJB/src/com/bekijkhet/country/CountryEJB.java:


package com.bekijkhet.country;
import java.util.List;
import com.bekijkhet.entity.*;
public interface CountryEJB {
  public List<Country> getCountriesByRegion(String region);
  public Region getRegionByCountry(String country);
  public void addorchangeCountry(Country country) ;
  public void addorchangeRegion(Region region) ;
  public void removeCountry(Country country) ;
  public void removeRegion(Region region) ;
  public List<Region> getAllRegions() ;
  public List<Country> getAllCountries();
}

/home/broersa/work/CountryApp/CountryJPAEJB/src/com/bekijkhet/country/CountryEJBBean.java


package com.bekijkhet.country;
import javax.ejb.Stateless;
import javax.ejb.Remote;
import javax.ejb.Local;

import java.util.List;
import com.bekijkhet.entity.*;
import javax.persistence.*;

@Stateless
@Remote(CountryEJB.class)
@Local(CountryEJBLocal.class)
public class CountryEJBBean implements CountryEJB,CountryEJBLocal {
  @PersistenceContext
  EntityManager em;

  public List<Country> getCountriesByRegion(String region) {
    Query q = em.createQuery("select r from Region r where r.name = :name");
    q.setParameter("name",region);
    Region r = (Region) q.getSingleResult();
//    r.getCountries().size();  // get the LAZY relation
    return r.getCountries();
  }

  public Region getRegionByCountry(String country) {
    Query q = em.createQuery("select c from Country c where c.name = :name");
    q.setParameter("name",country);
    Country c = (Country) q.getSingleResult();
    return c.getRegion();
  }

  public void addorchangeCountry(Country country) {
    em.persist(country);
  }

  public void addorchangeRegion(Region region) {
    em.persist(region);
  }

  public void removeCountry(Country country) {
    Country c = em.merge(country);
    em.remove(c);
  }

  public void removeRegion(Region region) {
    Region r = em.merge(region);
    em.remove(r);
  }

  public List<Region> getAllRegions() {
    Query q = em.createQuery("select r from Region r");
    List<Region> l = q.getResultList();
    return l;
  }

  public List<Country> getAllCountries() {
    Query q = em.createQuery("select c from Country c");
    List<Country> l = q.getResultList();
    return l;
  }
}

We need a persistence descriptor : /home/broersa/work/CountryApp/CountryJPAEJB/src/META-INF/persistence.xml:

<persistence>
  <persistence-unit name="MyPU">
    <jta-data-source>jdbc/HrDataSource</jta-data-source>
  </persistence-unit>
</persistence>

We need the build file:/home/broersa/work/CountryApp/CountryJPAEJB/build.xml:


<project name="CountryJPAEJB" default="dist" basedir=".">
    <description>
        simple example build file
    </description>
  <!-- set global properties for this build -->
  <property name="src" location="src"/>
  <property name="build" location="build"/>
  <property name="dist"  location="dist"/>

 <path id="files-classpath">
     <!--fileset dir="$HOME/oc4j_client_11110_preview/j2ee/home/lib" >
         <include name="persistence.jar"/>
     </fileset-->
     <pathelement location="/home/broersa/oc4j_client_11110_preview/j2ee/home/lib/persistence.jar"/>
     <pathelement location="/home/broersa/oc4j_client_11110_preview/j2ee/home/lib/ejb.jar"/>
 </path>

  <target name="init">
    <!-- Create the time stamp -->
    <tstamp/>
    <!-- Create the build directory structure used by compile -->
    <mkdir dir="${build}"/>
  </target>

  <target name="compile" depends="init"
        description="compile the source " >
    <!-- Compile the java code from ${src} into ${build} -->
    <javac srcdir="${src}" destdir="${build}">
      <classpath refid="files-classpath" />
    </javac>
  </target>

  <target name="dist" depends="compile"
        description="generate the distribution" >
    <!-- Create the distribution directory -->
    <mkdir dir="${dist}"/>
    <copy todir="${build}/META-INF">
                        <fileset dir="src/META-INF">
                                <include name="*" />
                        </fileset>
                   </copy>

    <!-- Put everything in ${build} into the MyProject-${DSTAMP}.jar file -->
    <jar jarfile="${dist}/CountryBean.jar" basedir="${build}"/>
  </target>

  <target name="clean"
        description="clean up" >
    <!-- Delete the ${build} and ${dist} directory trees -->
    <delete dir="${build}"/>
    <delete dir="${dist}"/>
  </target>
</project>

We can build and deploy the EJB:type “ant” to build the EJB.use the next command to deploy the ejb:

java -jar $OC4J_ADMIN/j2ee/home/admin_client.jar deployer:oc4j:localhost oc4jadmin welcome -deploy -file $HOME/work/CountryApp/CountryJPAEJB/dist/CountryBean.jar -deploymentName CountryBean

Now this is done we can create the client:

/home/broersa/work/CountryApp/CountryClient/com/bekijkhet/CountryClient.java:


package com.bekijkhet;
import javax.naming.*;
import com.bekijkhet.country.CountryEJB;
import com.bekijkhet.entity.*;
import java.util.Properties;
import java.util.List;

public class CountryClient {
  public static void main(String[] args) {
    try {
      Properties props = new Properties();
      props.put("java.naming.factory.initial","com.evermind.server.ApplicationClientInitialContextFactory");
      props.put("java.naming.provider.url","ormi://localhost/CountryBean");
      props.put("java.naming.security.principal","oc4jadmin");
      props.put("java.naming.security.credentials","welcome");
      InitialContext ctx = new InitialContext(props);
      CountryEJB h = (CountryEJB)ctx.lookup("CountryEJBBean");

      System.out.println("The Netherlands has region: " + h.getRegionByCountry("Netherlands").getName());
      List<Country> l1 = h.getCountriesByRegion("Europe");
      System.out.println("Europe has the following countries:");
      for (Country c : l1) {
       System.out.println("  " + c.getName());
      }
      System.out.println("All regions:");
      List<Region> l2 = h.getAllRegions();
      for (Region r : l2) {
       System.out.println("  " + r.getName());
      }
      System.out.println("All countries:");
      List<Country> l3 = h.getAllCountries();
      for (Country c2 : l3) {
       System.out.println("  " + c2.getName() + " - " + c2.getRegion().getName());
      }

      Region r3 = new Region();
      r3.setName("MyRegion1");
      r3.setId(1001);
      Country c3 = new Country();
      c3.setName("MyCountry1");
      c3.setId("31");
      c3.setRegion(r3);
      r3.getCountries().add(c3);
      h.addorchangeCountry(c3);

      Region r4 = new Region();
      r4.setName("MyRegion2");
      r4.setId(1002);
      Country c4 = new Country();
      c4.setName("MyCountry2");
      c4.setId("32");
      c4.setRegion(r4);
      r4.getCountries().add(c4);
      h.addorchangeRegion(r4);

      System.out.println("All regions:");
      List<Region> l5 = h.getAllRegions();
      for (Region r5 : l5) {
       System.out.println("  " + r5.getName());
      }
      System.out.println("All countries:");
      List<Country> l6 = h.getAllCountries();
      for (Country c6 : l6) {
       System.out.println("  " + c6.getName() + " - " + c6.getRegion().getName());
      }
    }
    catch (Exception e) {
      System.out.println(e);
      e.printStackTrace();
    }
  }
}

/home/broersa/work/CountryApp/CountryClient/com/bekijkhet/META-INF/application-client.xml:

<?xml version="1.0" encoding="UTF-8"?>
<application-client version="1.4" xmlns="http://java.sun.com/xml/ns/j2ee"
                xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
                xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee

http://java.sun.com/xml/ns/j2ee/application-client_1_4.xsd">

  <display-name>CountryClient</display-name>
  <description>test</description>
</application-client>

Compile the client:javac -cp $OC4J_HOME/j2ee/home/oc4jclient.jar:/home/broersa/work/CountryApp/CountryJPAEJB/dist/CountryBean.jar:. -d . CountryClient.javaAnd test the client:java -cp $OC4J_HOME/j2ee/home/oc4jclient.jar:/home/broersa/work/CountryApp/CountryJPAEJB/dist/CountryBean.jar:. com.bekijkhet.CountryClient

The Netherlands has region: Europe
Europe has the following countries:
Belgium
Switzerland
Germany
Denmark
France
Italy
Netherlands
United Kingdom
All regions:
Europe
Americas
Asia
Middle East and Africa
All countries:
Argentina – Americas
Australia – Asia
Belgium – Europe
Brazil – Americas
Canada – Americas
Switzerland – Europe
China – Asia
Germany – Europe
Denmark – Europe
Egypt – Middle East and Africa
France – Europe
HongKong – Asia
Israel – Middle East and Africa
India – Asia
Italy – Europe
Japan – Asia
Kuwait – Middle East and Africa
Mexico – Americas
Nigeria – Middle East and Africa
Netherlands – Europe
Singapore – Asia
United Kingdom – Europe
United States of America – Americas
Zambia – Middle East and Africa
Zimbabwe – Middle East and Africa
All regions:
Europe
Americas
Asia
Middle East and Africa
MyRegion1
MyRegion2
All countries:
MyCountry1 – MyRegion1
MyCountry2 – MyRegion2
Argentina – Americas
Australia – Asia
Belgium – Europe
Brazil – Americas
Canada – Americas
Switzerland – Europe
China – Asia
Germany – Europe
Denmark – Europe
Egypt – Middle East and Africa
France – Europe
HongKong – Asia
Israel – Middle East and Africa
India – Asia
Italy – Europe
Japan – Asia
Kuwait – Middle East and Africa
Mexico – Americas
Nigeria – Middle East and Africa
Netherlands – Europe
Singapore – Asia
United Kingdom – Europe
United States of America – Americas
Zambia – Middle East and Africa
Zimbabwe – Middle East and Africa

January 28, 2008

Stand Alone JPA client using Oracle 11g Database HR schema

Filed under: 11g, java, jpa, oc4j, oracle — broersa @ 7:14 pm

In this sample we will create a stand alone java app which uses the JPA (Toplink) api to connect to the HR sample schema in a Oracle database.

The hr schema must be unlocked and database must be accessible via the network.

We will start with the persistence.xml file.

/home/broersa/work/CountryApp/CountryJPA/build/META-INF/persistence.xml


<persistence xmlns="http://java.sun.com/xml/ns/persistence" version="1.0">
<persistence-unit name="default">
    <provider>
        oracle.toplink.essentials.PersistenceProvider
    </provider>
    <exclude-unlisted-classes>false</exclude-unlisted-classes>
    <properties>
        <property name="toplink.logging.level" value="INFO"/>
        <property name="toplink.jdbc.driver" value="oracle.jdbc.OracleDriver"/>
        <property name="toplink.jdbc.url" value="jdbc:oracle:thin:centos.bekijkhet.com:l521:orcl"/>
        <property name="toplink.jdbc.password" value="hr"/>
        <property name="toplink.jdbc.user" value="hr"/>
    </properties>
</persistence-unit>
</persistence>

After this the entities which represent the database objects. I choose the regions and countries tables.

/home/broersa/work/CountryApp/CountryJPA/src/com/bekijkhet/entity/Region.java

package com.bekijkhet.entity;

import java.io.Serializable;
import javax.persistence.*;
import static javax.persistence.CascadeType.*;

import java.util.List;
import java.util.ArrayList;

@Entity
@Table(name="REGIONS")
public class Region implements Serializable {
        private int id;
        private String name;
        private List<Country> countries = new ArrayList<Country>();;

        @Id
        @Column(name="REGION_ID")
        public int getId() {
                return id;
        }

        public void setId(int id) {
                this.id = id;
        }

        @Column(name="REGION_NAME")
        public String getName() {
                return name;
        }

        public void setName(String name) {
                this.name = name;
        }

        @OneToMany(cascade={CascadeType.ALL}, mappedBy="region")
        public List<Country> getCountries() {
                return countries;
        }

        public void setCountries(List<Country> newValue) {
                this.countries = newValue;
        }
}

/home/broersa/work/CountryApp/CountryJPA/src/com/bekijkhet/entity/Country.java

package com.bekijkhet.entity;

import java.io.Serializable;
import javax.persistence.*;

@Entity
@Table(name="COUNTRIES")
public class Country implements Serializable {
        private String id;
        private String name;
        private Region region;

        @Id
        @Column(name="COUNTRY_ID")
        public String getId() {
                return id;
        }

        public void setId(String id) {
                this.id = id;
        }

        @Column(name="COUNTRY_NAME")
        public String getName() {
                return name;
        }

        public void setName(String name) {
                this.name = name;
        }

        @ManyToOne()
        @JoinColumn(name="REGION_ID",nullable=false)
        public Region getRegion() {
                return region;
        }

        public void setRegion(Region region) {
                this.region = region;
        }
}

 Compile the entities:

cd /home/broersa/work/CountryApp/CountryJPA

javac -cp /home/broersa/oc4j_client_11110_preview/j2ee/home/lib/persistence.jar:build -d build src/com/bekijkhet/entity/*.java

After this the client app:

/home/broersa/work/CountryApp/CountryJPA/src/com/bekijkhet/client/Client.java:


package com.bekijkhet.client;

import javax.persistence.EntityManager;
import javax.persistence.Persistence;
import javax.persistence.EntityManagerFactory;
import javax.persistence.Query;

import java.util.List;

import com.bekijkhet.entity.*;

public class Client {
  private static EntityManagerFactory emf;
  private static EntityManager em;

  public static void main(String[] args) {

    emf = Persistence.createEntityManagerFactory("default");
    em = emf.createEntityManager();

    // Find a country with region
    Query q1 = em.createQuery("select c from Country c where c.id = :id");
    q1.setParameter("id","NL");
    Country c1 = (Country) q1.getSingleResult();
    System.out.println(c1.getName() + " - " + c1.getRegion().getName());

    // Find a region with countries
    Query q2 = em.createQuery("select r from Region r where r.id = :id");
    q2.setParameter("id",1);
    Region r2 = (Region) q2.getSingleResult();
    System.out.println(r2.getName());
    List<Country> l2 = r2.getCountries();
    for (Country c2 : l2) {
      System.out.println("  " + c2.getName());
    }

    // Add a region with two countries
    em.getTransaction().begin();
    Region r3 = new Region();
    r3.setId(1001);
    r3.setName("MyRegion1");
    Country c31 = new Country();
    c31.setId("31");
    c31.setName("MyCountry31");
    c31.setRegion(r3);
    r3.getCountries().add(c31);
    Country c32 = new Country();
    c32.setId("32");
    c32.setName("MyCountry32");
    c32.setRegion(r3);
    r3.getCountries().add(c32);

    em.persist(r3);
    em.getTransaction().commit();

    // List the added region with countries
    Query q4 = em.createQuery("select r from Region r where r.id = :id");
    q4.setParameter("id",1001);
    Region r4 = (Region) q4.getSingleResult();
    System.out.println(r4.getName());
    List<Country> l4 = r4.getCountries();
    for (Country c4 : l4) {
      System.out.println("  " + c4.getName());
    }

    // Change the country names
    em.getTransaction().begin();
    Query q5 = em.createQuery("select r from Region r where r.id = :id");
    q5.setParameter("id",1001);
    Region r5 = (Region) q5.getSingleResult();
    List<Country> l5 = r5.getCountries();
    for (Country c5 : l5) {
      c5.setName(c5.getName()+"-changed");
    }
    em.getTransaction().commit();

    // List the added region with countries
    Query q6 = em.createQuery("select r from Region r where r.id = :id");
    q6.setParameter("id",1001);
    Region r6 = (Region) q6.getSingleResult();
    System.out.println(r6.getName());
    List<Country> l6 = r6.getCountries();
    for (Country c6 : l6) {
      System.out.println("  " + c6.getName());
    }

    // Remove samples
    // Remove a single detail
    em.getTransaction().begin();
    Query q7 = em.createQuery("select r from Region r where r.id = :id");
    q7.setParameter("id",1001);
    Region r7 = (Region) q7.getSingleResult();
    System.out.println(r7.getName());
    List<Country> l7 = r7.getCountries();
    em.remove(l7.get(1));
    em.getTransaction().commit();

    // Remove samples
    // Remove the whole region
    em.getTransaction().begin();
    Query q8 = em.createQuery("select r from Region r where r.id = :id");
    q8.setParameter("id",1001);
    Region r8 = (Region) q8.getSingleResult();
    System.out.println(r8.getName());
    em.remove(r8);
    em.getTransaction().commit();

    em.close();

  }
}

compile and run:

cd /home/broersa/work/CountryApp/CountryJPA

javac -cp /home/broersa/oc4j_client_11110_preview/j2ee/home/lib/persistence.jar:build -d build src/com/bekijkhet/client/*.java

java -cp /home/broersa/oc4j_client_11110_preview/j2ee/home/lib/persistence.jar:/home/broersa/toplink_11.1.1.0_071214_preview-3/lib/java/api/toplink.jar:/home/broersa/myclasses/ojdbc6.jar:build -javaagent:/home/broersa/toplink_11.1.1.0_071214_preview-3/lib/java/internal/toplink-essentials-agent.jar com.bekijkhet.client.Client

[TopLink Info]: 2008.01.28 08:09:38.718–ServerSession(9519074)–TopLink, version: Oracle TopLink Essentials – 2.0 (Build SNAPSHOT (06/04/2007))
[TopLink Info]: 2008.01.28 08:09:41.744–ServerSession(9519074)–file:/home/broersa/work/CountryApp/CountryJPA/build/-default login successful
Netherlands – Europe
Europe
Belgium
Switzerland
Germany
Denmark
France
Italy
Netherlands
United Kingdom
MyRegion1
MyCountry31
MyCountry32
MyRegion1
MyCountry31-changed
MyCountry32-changed
MyRegion1
MyRegion1

Create OC4J 11 client environment

Filed under: 11g, linux, oc4j — broersa @ 6:40 pm

After some new installs over here I have a new Oracle VMware server based on Centos 5. I installed the oc4j 11 standalone server as the oracle user. This article describes how to create a client environment to build applications and deploy them to the remote oc4j.

I installed under root the package ant ( yum install ant ).

I installed under root the latest jdk in /usr/local (jdk-6u4-linux-i586.bin)

I added the JAVA_HOME to my .bash_profile

I added the $JAVA_HOME/bin to my PATH in the .bash_profile (in front of the rest)

In my home dir I created a directory oc4j_client_11110_preview in which I unzipped the oc4j_client_11110_preview.zip.

I added the OC4J_HOME to my .bash_profile

In my home dir I created a directory toplink_11.1.1.0_071214_preview-3 in which I unzipped the toplink_11.1.1.0_071214_preview-3.zip.

I added the TOPLINK_HOME to my .bash_profile

In my home dir I created a directory oc4j_admin_client_11110_preview in which I unzipped the oc4j_admin_client_11110_preview.zip.

I added the OC4J_ADMIN to my .bash_profile

In my home dir I created a directory myclasses wherin I downloaded ojdbc6.jar from Oracle JDBC download page.

now I have the needed jar libraries.

December 20, 2007

Change oc4jadmin password

Filed under: oc4j, oracle, security — broersa @ 2:23 pm

To change the password for the oc4jadmin administrator in oc4j stand alone you have to type a new password in the the system-jazn-data.xml file. Replace the encrypted string with the plain new password superseded with an exclamation point “!”. The next time you start oc4j it will encrypt the password.

November 20, 2007

Client calls EJB on Glassfish which calls EJB on OC4J 11G

Filed under: ejb, glassfish, j2ee, java, oc4j, oracle — broersa @ 9:21 pm

In this blog I’m showing a way to call an EJB in an OC4J container from an EJB in a Glassfish container.

Let’s start with the EJB in the OC4J 11G container:

broersa@debian1:~/work/HelloApp/HelloOrion/src/com/bekijkhet/orion$ cat HelloOrionLocal.java


package com.bekijkhet.orion;
public interface HelloOrionLocal {
  public String sayHello();
  public String sayHelloLocal();
}

broersa@debian1:~/work/HelloApp/HelloOrion/src/com/bekijkhet/orion$ cat HelloOrion.java


package com.bekijkhet.orion;
public interface HelloOrion {
  public String sayHello();
  public String sayHelloRemote();
}

broersa@debian1:~/work/HelloApp/HelloOrion/src/com/bekijkhet/orion$ cat HelloOrionBean.java


package com.bekijkhet.orion;
import javax.ejb.Stateless;
import javax.ejb.Remote;
import javax.ejb.Local;
@Stateless
@Remote(HelloOrion.class)
@Local(HelloOrionLocal.class)
public class HelloOrionBean implements HelloOrion,HelloOrionLocal {
  public String sayHello() {
    return "Hello Orion!!!!";
  }
  public String sayHelloLocal() {
    return "Hello Local Orion!!!!";
  }
  public String sayHelloRemote() {
    return "Hello Remote Orion!!!!";
  }
}

broersa@debian1:~/work/HelloApp/HelloOrion$ cat build.xml


<project name="HelloEJB" default="dist" basedir=".">
    <description>
        simple example build file
    </description>
  <!-- set global properties for this build -->
  <property name="src" location="src"/>
  <property name="build" location="build"/>
  <property name="dist"  location="dist"/>

  <target name="init">
    <!-- Create the time stamp -->
    <tstamp/>
    <!-- Create the build directory structure used by compile -->
    <mkdir dir="${build}"/>
  </target>

  <target name="compile" depends="init"
        description="compile the source " >
    <!-- Compile the java code from ${src} into ${build} -->
    <javac srcdir="${src}" destdir="${build}"/>
  </target>

  <target name="dist" depends="compile"
        description="generate the distribution" >
    <!-- Create the distribution directory -->
    <mkdir dir="${dist}"/>

    <!-- Put everything in ${build} into the MyProject-${DSTAMP}.jar file -->
    <jar jarfile="${dist}/HelloOrion.jar" basedir="${build}"/>
  </target>

  <target name="clean"
        description="clean up" >
    <!-- Delete the ${build} and ${dist} directory trees -->
    <delete dir="${build}"/>
    <delete dir="${dist}"/>
  </target>
</project>

Type ‘asant dist’ to create the EJB.Deploy the Bean to the OC4J container:

java -jar $ORACLE_HOME/j2ee/home/admin_client.jar deployer:oc4j:localhost oc4jadmin welcome -deploy -file $HOME/work/HelloApp/HelloOrion/dist/HelloOrion.jar -deploymentName HelloOrion

Now it is time to create the Bean in the Glassfish container which calls the HelloOrion Bean.First we need the Interface from the HelloOrion Bean that we gonna call in the OC4J container. I could include it in a jar file, but for the simplicity I just copy it in the HelloEJB project.

broersa@debian1:~/work/HelloApp/HelloEJB/src/com/bekijkhet/orion$ cat HelloOrion.java


package com.bekijkhet.orion;
public interface HelloOrion {
  public String sayHello();
  public String sayHelloRemote();
}

Then we need the actual Bean.

broersa@debian1:~/work/HelloApp/HelloEJB/src/com/bekijkhet$ cat Hello.java


package com.bekijkhet;
public interface Hello {
  public String sayHello();
}

broersa@debian1:~/work/HelloApp/HelloEJB/src/com/bekijkhet$ cat HelloBean.java


package com.bekijkhet;
import javax.ejb.Stateless;
import javax.ejb.EJB;
import javax.ejb.Remote;
import java.util.Properties;
import java.net.URL;
import javax.naming.*;
import com.bekijkhet.orion.HelloOrion;
@Stateless
@Remote(Hello.class)
public class HelloBean implements Hello {

  static String CONFIG_PROPERTIES = "ejb.properties";

  public String sayHello() {
    URL url = null;
    Properties props = null;
    HelloOrion h = null;
    // Use the ClassLoader to get the properties of the Bean to call
    url = Thread.currentThread().getContextClassLoader().getResource(CONFIG_PROPERTIES);
    if (url == null) {
      return "The configuration could not be found: " + CONFIG_PROPERTIES;
    } else {
      props = new Properties();
      try {
        props.load(url.openStream());
      }
      catch (java.io.IOException e) {
        return "Could not read configuration file from URL";
      }
    }
    try {
      Context ctx = new InitialContext(props);
      h = (HelloOrion)ctx.lookup("HelloOrionBean");
    } catch ( Exception e) { return e.toString(); }
    return "Hello From Glassfish!!!! "  + h.sayHelloRemote();
  }
}

broersa@debian1:~/work/HelloApp/HelloEJB/properties$ cat ejb.properties


java.naming.factory.initial=com.evermind.server.rmi.RMIInitialContextFactory
java.naming.provider.url=ormi://localhost/HelloOrion
java.naming.security.principal=oc4jadmin
java.naming.security.credentials=welcome

broersa@debian1:~/work/HelloApp/HelloEJB$ cat build.xml

<project name="HelloEJB" default="dist" basedir=".">
    <description>
        simple example build file
    </description>
  <!-- set global properties for this build -->
  <property name="src" location="src"/>
  <property name="build" location="build"/>
  <property name="dist"  location="dist"/>

  <target name="init">
    <!-- Create the time stamp -->
    <tstamp/>
    <!-- Create the build directory structure used by compile -->
    <mkdir dir="${build}"/>
  </target>

  <target name="compile" depends="init"
        description="compile the source " >
    <!-- Compile the java code from ${src} into ${build} -->
    <javac srcdir="${src}" destdir="${build}"/>
  </target>

  <target name="dist" depends="compile"
        description="generate the distribution" >
    <!-- Create the distribution directory -->
    <mkdir dir="${dist}"/>
    <copy todir="${build}">
                        <fileset dir="properties">
                                <include name="*" />
                        </fileset>
                   </copy>

    <!-- Put everything in ${build} into the MyProject-${DSTAMP}.jar file -->
    <jar jarfile="${dist}/HelloBean.jar" basedir="${build}"/>
  </target>

  <target name="clean"
        description="clean up" >
    <!-- Delete the ${build} and ${dist} directory trees -->
    <delete dir="${build}"/>
    <delete dir="${dist}"/>
  </target>
</project>

Type asant dist to create the distribution jar.Type asadmin deploy dist/HelloBean.jar to deploy the Bean to glassfish.In this bean I use the classloader to get the properties to call the OC4J bean from a flat file which must be in the Classpath. After this I create a Inital context. To create this context Glassfish needs the $ORACLE_HOME/j2ee/home/oc4jclient.jar in $GLASSFISH/lib directory. After copying this jar you need to restart the Glassfish server.Now it is time to create a simple client to call the EJB in the glassfish container which calls the EJB in OC4J.

broersa@debian1:~/work/HelloApp/HelloClient/src/com/bekijkhet/helloclient$ cat HelloClient.java


package com.bekijkhet.helloclient;
import javax.naming.*;
import com.bekijkhet.Hello;
public class HelloClient {
  public static void main(String[] args) {
    try {
      InitialContext ctx = new InitialContext();
      Hello h = (Hello)ctx.lookup("com.bekijkhet.Hello");
     System.out.println(h.sayHello());
    }
    catch (Exception e) {
      System.out.println(e);
      e.printStackTrace();
    }
  }
}

javac -cp $GLASSFISH_HOME/lib/appserv-rt.jar:$GLASSFISH_HOME/lib/javaee.jar:$HOME/work/HelloApp/HelloEJB/dist/HelloBean.jar:. -d . HelloClient.java

java -cp $GLASSFISH_HOME/lib/appserv-rt.jar:$GLASSFISH_HOME/lib/javaee.jar:$HOME/work/HelloApp/HelloEJB/dist/HelloBean.jar:. com.bekijkhet.helloclient.HelloClient

Hello From Glassfish!!!! Hello Remote Orion!!!!

November 9, 2007

oc4j 11g Spy tool

Filed under: j2ee, oc4j, oracle — broersa @ 11:30 am

To get some extra (clickable) info about the oc4j appserver try the following link:

http://localhost:8888/dms0/Spy

Stateless EJB and client using OC4J 11G

Filed under: ejb, j2ee, java, oc4j, oracle — broersa @ 10:50 am

In a previous blog I showed a sample of a helloworld stateless ejb on glassfish. In this entry I use the same EJB but I will deploy the bean to the OC4J 11G container. I will use the same client to connect to the OC4J deployed bean. The principles are the same but to connect to the OC4J container we’ll need some other libraries and some new config files. Lets start with the deployment of the EJB to the OC4J container:

java -jar $ORACLE_HOME/j2ee/home/admin_client.jar deployer:oc4j:localhost oc4jadmin welcome -deploy -file $HOME/work/HelloApp/HelloEJB/dist/lib/HelloBean-<date>.jar -deploymentName HelloEJB

After deploying we get to the client side. First we need the client source.

broersa@debian1:~/work/HelloApp/HelloClient/src/com/bekijkhet/helloclient$ cat HelloClient2.java


package com.bekijkhet.helloclient;
import javax.naming.*;
import com.bekijkhet.Hello;
public class HelloClient2 {
  public static void main(String[] args) {
    try {
      InitialContext ctx = new InitialContext();
      // Piece of code to list all remote JNDI resources
      //NamingEnumeration e = ctx.list("");
      //while (e.hasMore()) {
      //  System.out.println(e.next());
      //}
      Hello h = (Hello)ctx.lookup("HelloBean");
      System.out.println(h.sayHello());
      System.out.println(h.sayHelloRemote());
      // Will fail because we call the Remote Business interface
      // System.out.println(h.sayHelloLocal());
    }
    catch (Exception e) {
      e.printStackTrace();
    }
  }
}

Notice that by default the lookup needs the Bean name HelloBean.

For OC4J to lookup the InitialContext we need a properties file. This file has to be in the classpath. We use the current directory.

broersa@debian1:~/work/HelloApp/HelloClient/src/com/bekijkhet/helloclient$ cat jndi.properties

java.naming.factory.initial=com.evermind.server.ApplicationClientInitialContextFactory
java.naming.provider.url=ormi://localhost/HelloEJB
java.naming.security.principal=oc4jadmin
java.naming.security.credentials=welcome

OC4J also expects a application-client.xml deployment descriptior:

broersa@debian1:~/work/HelloApp/HelloClient/src/com/bekijkhet/helloclient/META-INF$ cat application-client.xml


<?xml version="1.0" encoding="UTF-8"?>

<application-client xmlns="http://java.sun.com/xml/ns/j2ee"
                    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
                    xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee

http://java.sun.com/xml/ns/j2ee/application-client_1_4.xsd"

                    version="1.4">

  <display-name>Client of the earsample</display-name>
  <description>client of the earsample</description>

</application-client>

After this we can compile the client:

javac -cp $ORACLE_HOME/j2ee/home/oc4j.jar:$ORACLE_HOME/j2ee/home/oc4jclient.jar:$HOME/work/HelloApp/HelloEJB/dist/lib/HelloBean-<date>.jar:. -d . HelloClient2.java

And then run the client:

java -cp $ORACLE_HOME/j2ee/home/oc4j.jar:$ORACLE_HOME/j2ee/home/oc4jclient.jar:$HOME/work/HelloApp/HelloEJB/dist/lib/HelloBean-<date>.jar:. com.bekijkhet.helloclient.HelloClient2

Hello World!!!!
Hello Remote World!!!!

Install OC4J 11G stand alone on Linux

Filed under: j2ee, java, oc4j, oracle — broersa @ 10:11 am

The way I did it was:

  • Install a jdk 1.5 or higher and set env var: export JAVA_HOME=$HOME/<jdkdir>
  • Download the zip file from http://www.oracle.com/technology/tech/java/oc4j/11/index.html
  • Create a directory oc4j in your homedir from that directory unzip the oracle zip file
  • Create a env var: export ORACLE_HOME=$HOME/oc4j
  • cd $ORACLE_HOME/bin
  • ./oc4j -start
  • enter an admin password (since this is the first start)
  • check the serverstatus on http://localhost:8888

Have fun..

Blog at WordPress.com.