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… package it.videsoft; import javax.ejb.SessionBean; import javax.ejb.SessionContext; import javax.ejb.CreateException; import com.sap.security.api.IUser; import com.sap.security.api.UMFactory; /** EJB e Portal Component Object 5 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 package it.videsoft; import javax.ejb.EJBObject; import java.rmi.RemoteException; public interface TestEjb extends EJBObject { /** * Business Method. */ public String getUser() throws RemoteException; } TestEjb.java EJB e Portal Component Object 6 http://desvino.altervista.org package it.videsoft; 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 package it.videsoft; import javax.ejb.EJBLocalObject; public interface TestEjbLocal extends EJBLocalObject { /** * Business Method. */ public String getUser(); } TestEjbLocal.java package it.videsoft; 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 package it.videsoft; import import import import import import import import import com.sapportals.portal.prt.component.*; it.saisei.TestEjb; it.saisei.TestEjbHome; java.rmi.RemoteException; javax.ejb.CreateException; javax.naming.Context; javax.naming.InitialContext; javax.naming.NamingException; 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