1 EJB e Portal Component Object http://desvino.altervista.org In questo tutorial studiamo come sfruttare la tecnologia EJB, Enterprise JavaBean, all interno del SAP Netweaver Portal. In breve, EJB è un architettura a componenti distribuita che permette lo sviluppo e il deploy delle componenti business relativamente ad applicazioni J2EE. In particolare, utilizziamo un bean session statless per ottenere dall UME, User Management Engine, del portale l utente loggato. Non è scopo di questo tutorial illustrare nel dettaglio il funzionamento di EJB o di un session bean nello specifico. Nelle figure sottostanti elenchiamo i passi necessari per la creazione di un progetto di tipo J2EE EJB Module Project e di un session bean stateless con l ausilio del NetWeaver Developer Studio (NWDS). NWDS Nuovo progetto J2EE EJB Module Project NWDS nuovo EJB
2 EJB e Portal Component Object http://desvino.altervista.org NWDS nome, progetto, tipo e package per il bean Nella figura seguente vediamo le interfacce e classi da estendere: Remote Interface: javax.ejb.ejbobject. Definisce i servizi che il bean deve implementare (metodi di logica); Home Interface: javax.ejb.ejbhome. La classe "Factory", cioè la classe che si occupa della creazione del bean; Bean Class: javax.ejb.sessionbean. Questa classe deve riprendere i metodi della Remote Interface ed è questa che conterrà la logica applicativa vera e propria; Local Interface: javax.ejb.ejblocalobject. Come per Remote Interface, con la differenza che l'accesso non avviene su rete; Local Home: javax.ejb.ejblocalhome. Come per Home Interface, con la differenza che l'accesso è diretto;
3 EJB e Portal Component Object http://desvino.altervista.org NWDS interfacce e superclassi per il bean NWDS crea in automatico un deployment descriptor, ejb-jar.xml, ed un deployment descriptor specific per il server J2EE, ejb-j2ee-engine.xml. <?xml version="1.0" encoding="utf-8"?> <!DOCTYPE ejb-jar PUBLIC "-//Sun Microsystems, Inc.//DTD Enterprise JavaBeans 2.0//EN" "http://java.sun.com/dtd/ejb-jar_2_0.dtd"> <ejb-jar> <description>ejb JAR description</description> <display-name>ejb JAR</display-name> <enterprise-beans> <session> <ejb-name>testejbbean</ejb-name> <home>it.videsfot.testejbhome</home> <remote>it.videsoft.testejb</remote> <local-home>it.videsoft.testejblocalhome</local-home> <local>it.videsoft.testejblocal</local> <ejb-class>it.videsoft.testejbbean</ejb-class> <session-type>stateless</session-type> <transaction-type>container</transaction-type> </session> </enterprise-beans> </ejb-jar> ejb-jar.xml <?xml version="1.0" encoding="utf-8"?> <!DOCTYPE ejb-j2ee-engine SYSTEM "ejb-j2ee-engine.dtd">
4 EJB e Portal Component Object http://desvino.altervista.org <ejb-j2ee-engine> <enterprise-beans> <enterprise-bean> <ejb-name>testejbbean</ejb-name> <jndi-name>testejbbean</jndi-name> <session-props/> </enterprise-bean> </enterprise-beans> </ejb-j2ee-engine> ejb-j2ee-engine.xml La struttura completa del progetto è visibile nella figura sottostante. Sono presenti sia l EJB module project che l ear. Struttura progetto EJBTEST La classe TestEjbBean implementa l interfaccia SessionBean. Per il nostro scopo abbiamo bisogno di implementare soltanto il metodo getuser(). Infatti, al suo interno creiamo un oggetto di tipo IUser ed otteniamo dalla UMFactory l utente loggato. I metodi get della classe IUser consentono di ottenere i dati che ci interessano. Affinchè sia possibile utilizzare l API UME è necessario aggiungere al build path relativo al modulo EJB la libreria esterna com.sap.security.api presente nella cartella sap/ide/ie70/eclipse import javax.ejb.sessionbean; import javax.ejb.sessioncontext; import javax.ejb.createexception; import com.sap.security.api.iuser; import com.sap.security.api.umfactory;
5 EJB e Portal Component Object http://desvino.altervista.org * @ejbhome <{it.videsoft.testejbhome> * @ejblocal <{it.videsoft.testejblocal> * @ejblocalhome <{it.videsoft.testejblocalhome> * @ejbremote <{it.videsoft.testejb> * @stateless * @transactiontype Container public class TestEjbBean implements SessionBean { public void ejbremove() { public void ejbactivate() { public void ejbpassivate() { public void setsessioncontext(sessioncontext context) { mycontext = context; private SessionContext mycontext; * Business Method. public String getuser() { IUser user = UMFactory.getAuthenticator().getLoggedInUser(); String result = "UniqueID: " + user.getuniqueid() + " " + "UniqueName: " + user.getuniquename() + " " + "FirstName: " + user.getfirstname() + " " + "LastName: " + user.getlastname() + " " + "Name: " + user.getname() + " " + "DisplayName: " + user.getdisplayname(); return result; * Create Method. public void ejbcreate() throws CreateException { // TODO : Implement TestEjbBean.java import javax.ejb.ejbobject; import java.rmi.remoteexception; public interface TestEjb extends EJBObject { * Business Method. public String getuser() throws RemoteException; TestEjb.java
6 EJB e Portal Component Object http://desvino.altervista.org import javax.ejb.ejbhome; import java.rmi.remoteexception; import javax.ejb.createexception; public interface TestEjbHome extends EJBHome { * Create Method. public TestEjb create() throws CreateException, RemoteException; TestEjbHome.java import javax.ejb.ejblocalobject; public interface TestEjbLocal extends EJBLocalObject { * Business Method. public String getuser(); TestEjbLocal.java import javax.ejb.ejblocalhome; import javax.ejb.createexception; public interface TestEjbLocalHome extends EJBLocalHome { * Create Method. public TestEjbLocal create() throws CreateException; TestEjbLocalHome.java Per effettuare il deploy sul server, creiamo un nuovo Enterprise Application Project ed aggiungiamo ad esso il modulo EJB creato in precedenza. ear deploy su J2EE
7 EJB e Portal Component Object http://desvino.altervista.org Utilizziamo l EJB deployato sul nostro server J2EE, all interno di un componente portale. Creiamo un nuovo progetto di tipo Portal Application Project e chiamiamolo PCEjb, successivamente creiamo un Portal Application Object e chiamiamo anch esso PCEjb. Il componente portale non far altro che richiamare l EJB per ottenere dal metodo getuser l utente loggato e restituirlo nella response. Il passo iniziale concerne lo specificare, all interno dello Java Build Path relativo al progetto, raggiungibile attraverso tasto destro -> properties, il progetto EJBTEST nella tab Projects (Required projects on the build path). PCEjb Java Build Path import com.sapportals.portal.prt.component.*; import it.saisei.testejb; import it.saisei.testejbhome; import java.rmi.remoteexception; import javax.ejb.createexception; import javax.naming.context; import javax.naming.initialcontext; import javax.naming.namingexception; import javax.rmi.portableremoteobject; public class PCEjb extends AbstractPortalComponent { public void docontent(iportalcomponentrequest request, IPortalComponentResponse response) {
8 EJB e Portal Component Object http://desvino.altervista.org try { InitialContext ic = new InitialContext(); Context context = new InitialContext(); Object objref = context.lookup("testejbbean"); TestEjbHome home = (TestEjbHome) PortableRemoteObject.narrow(objref,TestEjbHome.class); try{ TestEjb testejb = home.create(); response.write(testejb.getuser()); catch(createexception e) {response.write("create Exception " + e.getmessage()); catch(remoteexception e1) {response.write("remote Exception " + e1.getmessage()); catch(namingexception e2) { response.write("naming Exception " + e2.getmessage()); PCEjb.java Nel file di configurazione portalapp.xml è necessario specificare il riferimento al progetto (ear) contenente l EJB, inserendo la riga <property name="privatesharingreference" value="sapj2ee::sap.com/ejbtestear"/> <?xml version="1.0" encoding="utf-8"?> <application> <application-config> <property name="privatesharingreference" value="sapj2ee::sap.com/ejbtestear"/> </application-config> <components> <component name="pcejb"> <component-config> <property name="classname" value="it.videsoft.pcejb"/> </component-config> <component-profile/> </component> </components> <services/> </application> portalapp.xml L ultimo passo concerne la creazione di una IView di tipo componente prortale e la sua esecuzione in preview. risultato dell esecuzione di una Iview di tipo componente portale