1 SAP Netweaver e Adobe BlazeDS http://desvino.altervista.org J2EE e Adobe BlazeDS Java EE è una piattaforma completa per lo sviluppo di applicazioni enterprise; Adobe Flex è leader nel mondo delle RIA (Rich Internet Application). L’integrazione di Java EE (applicazioni lato server Java-based) e Adobe Flex permette lo sviluppo di robuste applicazioni enterprise in grado di fornire interfacce accattivanti per l’utente finale. Framework Flex Adobe Flex è un framework open source per la crezione di applicazioni RIA che girano su Adobe Flash Player; Caratteristiche principali: struttura interamente a componenti (Flex SDK – User Interface Components), guidati da eventi ed integrati attraverso data binding. programmazione via codice MXML (linguaggio XML-based di tipo dichiarativo) e codice ActionScript 3 (AS3 – Object Oriented). la compilazione da origine ad un file SWF da eseguire in un Flash Player, o un file SWC che può essere utilizzato all’interno di altri file .swf. I file .swf vengono caricati su un application server e scaricati localmente nel client per essere eseguiti nel flash player del browser. Una applicazione RIA può comunicare con la business logic dei sistemi di back-end attraverso Adobe BlazeDS (applicazione web in tecnologia Java inserita in un application server Java) 2 SAP Netweaver e Adobe BlazeDS http://desvino.altervista.org Modello Architetturale con BlazeDS. Le principali funzionalità di BlazeDS includono i servizi RPC e di messaging. Caratteristiche principali di BlazeDS BlazeDS permette: invocazione di metodi Java remoti da un’applicazione Flex; conversione di oggetti Java in corrispondenti oggetti AS3 in risposta ad una chiamata di un metodo remoto; conversione di oggetti AS3 inviati da un’applicazione Flex in corrispondenti oggetti Java (argomenti dei metodi chiamati); scambio di messaggi tra applicazioni Flex e server Java; 3 SAP Netweaver e Adobe BlazeDS http://desvino.altervista.org gestione dei canali di comunicazione tra Flex e Java; comunicazione, tramite degli adattatori, con servizi JMS BlazeDS in definitiva prevede due tipi di interazioni: RPC (Remote Procedure Call) e Messaging Service. Le RPC permettono ai client di effettuare chiamate asincrone di servizi remoti che effettuano determinate operazioni sul server e restituiscono i risultati direttamente al client. I componenti RPC lato client, messi a disposizione nell’SDK, forniscono servizi HTTP (componente HTTPService), web service (componenti WebService) e remote object service (componenti RemoteObject). Il componente RemoteObject (lato client) permette di accedere a oggetti Java remoti senza la necessità di configurarli come web service. Uno dei principali vantaggi di BlazeDS è l’uso dell’AMF (Action Message Format) per la trasmissione dei dati tra Flex e Java. AMF è un protocollo binario supportato nativamente dal flash player, tale caratteristica rende la trasmissione veloce ed efficiente. A rendere più agevole l’uso del protocollo è la definizione di livelli di astrazione superiori che permettono di focalizzare l’attenzione sulla business logic trascurando i dettagli della comunicazione. Infatti le entità server side vengono invocate usando opportuni nomi logici (destination). Inoltre, quando un client interagisce con un servizio server-side tramite una destination, usa un canale di comunicazione (channel) per le comunicazioni da e verso il server. Un channel è l’astrazione di un canale di comunicazione che incapsula formato dei messaggi, protocollo di rete, gestisce l’ordine di consegna dei messaggi. Dal lato server un channel termina in un endpoint Java-based che ha il compito di effettuare l’unmarshalling dei messaggi e consegnarli al servizio opportuno. Channels ed Endpoints. In definitiva un channel è un oggetto lato client che rappresenta la connessione tra il componente Flex e il server BlazeDS. La configurazione di un canale e del relativo endpoint avviene tramite file di configurazione. 4 SAP Netweaver e Adobe BlazeDS http://desvino.altervista.org Sviluppo con NWDS Sfruttiamo la caratteristica offerta da BlazeDS (ver.3.0.0.544 per la jdk1.4) che permette l’invocazione di metodi Java remoti da un’applicazione Flex. Con l’ausilio di NetWeaver Developer Studio creiamo un progetto di tipo J2EE – Web Module Project (in pratica un WAR – WEB Archive) ed un progetto J2EE – Enterprise Application Project (in pratica un EAR – Enterprise Archive) che contiene il WAR e che sarà deployato sul nostro server. La nostra applicazione non farà altro che restituire al client FLEX una stringa contenente testo. Utilizziamo la prospettiva J2EE Development Perspective. J2EE – creazione Web Module Project J2EE Web Module Project – Project name 5 SAP Netweaver e Adobe BlazeDS http://desvino.altervista.org J2EE- creazione Enterprise Application Project Creiamo la classe MyFunction nella cartella source, package it.videsoft; all’interno deve essere presente il metodo, nel nostro caso doPing, richiamabile dal client FLEX. /* * Created on 28-gen-2011 */ package it.videsoft; /** * @author vdestefano */ public class MyFunction { private String result = " "; public String doPing(String input) { return input + " Hello BlazeDS!!!"; } } MyFunction class Per essere raggiungibile dall’esterno la classe MyFunction deve essere definita come destinazione all’interno del file remoting-config.xml (all’interno della cartella WEB.INF -> flex). <?xml version="1.0" encoding="UTF-8"?> <service id="remoting-service" class="flex.messaging.services.RemotingService"> <adapters> 6 SAP Netweaver e Adobe BlazeDS http://desvino.altervista.org <adapter-definition id="java-object" class="flex.messaging.services.remoting.adapters.JavaAdapter" default="true"/> </adapters> <destination id="MyFunction"> <properties> <source>it.videsoft.MyFunction</source> <scope>application</scope> </properties> <adapter ref="java-object"/> </destination> <default-channels> <!--channel ref="streaming-amf"/--> <channel ref="amf"/> </default-channels> </service> Remoting-config.xml Nella figura sottostante è possibile vedere la struttura completa dell’applicazione, WAR ed EAR. In particolare all’interno del file web.xml sono presenti: HttpFlexSession (listener-class flex.messaging.HttpFlexSession) MessageBrokerServlet (parametro services.configuration.file) All’interno della cartella WEB-INF -> flex (dobbiamo crearla noi ed inserirvi i file di configuarazione per BlazeDS) inseriamo i file (consigliato importarli da un progetto esistente o template): messaging-config.xml proxy-config.xml remoting-config.xml (contenente la nostra classe come destinazione) services-config.xml (inseriamo i nostri puntamenti al server) La cartella source contiene il package it.videsoft al cui interno va creata la classe MyFunction.java. La cartella webContent contiene la welcome page index.html e tutti i file necessari al funzionamento di FLEX sul client, swf file, html file etc. 7 SAP Netweaver e Adobe BlazeDS http://desvino.altervista.org Albero completo dalla prospettiva J2EE – WAR e EAR <?xml version="1.0" encoding="UTF-8"?> <services-config> <services> <service-include file-path="remoting-config.xml" /> <service-include file-path="proxy-config.xml" /> <service-include file-path="messaging-config.xml" /> </services> <security> <login-command class="flex.messaging.security.TomcatLoginCommand" server="Tomcat"/> <!-- Uncomment the correct app server <login-command class="flex.messaging.security.TomcatLoginCommand" server="JBoss"> <login-command class="flex.messaging.security.JRunLoginCommand" server="JRun"/> <login-command class="flex.messaging.security.WeblogicLoginCommand" server="Weblogic"/> <login-command class="flex.messaging.security.WebSphereLoginCommand" server="WebSphere"/> --> 8 SAP Netweaver e Adobe BlazeDS http://desvino.altervista.org <!-<security-constraint id="basic-read-access"> <auth-method>Basic</auth-method> <roles> <role>guests</role> <role>accountants</role> <role>employees</role> <role>managers</role> </roles> </security-constraint> --> </security> <channels> <channel-definition id="amf" class="mx.messaging.channels.AMFChannel"> <endpoint url="http://server:port/TestBlaze/messagebroker/amf" class="flex.messaging.endpoints.AMFEndpoint"/> </channel-definition> <channel-definition id="secure-amf" class="mx.messaging.channels.SecureAMFChannel"> <endpoint url="https://server:port/TestBlaze/messagebroker/amfsecure" class="flex.messaging.endpoints.SecureAMFEndpoint"/> <properties> <add-no-cache-headers>false</add-no-cache-headers> </properties> </channel-definition> <channel-definition id="std-polling-amf" class="mx.messaging.channels.AMFChannel"> <endpoint url="http://server:port/TestBlaze/messagebroker/amfpolling" class="flex.messaging.endpoints.AMFEndpoint"/> <properties> <polling-enabled>true</polling-enabled> <polling-interval-seconds>4</polling-interval-seconds> </properties> </channel-definition> <channel-definition id="fast-polling-amf" class="mx.messaging.channels.AMFChannel"> <endpoint url="http://server:port/TestBlaze/messagebroker/fastamfpolling" class="flex.messaging.endpoints.AMFEndpoint"/> <properties> <polling-enabled>true</polling-enabled> <polling-interval-seconds>1</polling-interval-seconds> </properties> </channel-definition> <channel-definition id="streaming-amf" class="mx.messaging.channels.StreamingAMFChannel"> <endpoint url="http://server:port/TestBlaze/messagebroker/streamingamf" class="flex.messaging.endpoints.StreamingAMFEndpoint"/> <properties> <idle-timeout-minutes>0</idle-timeout-minutes> <max-streaming-clients>10</max-streaming-clients> <server-to-client-heartbeat-millis>5000</server-to-clientheartbeat-millis> <user-agent-settings> <user-agent match-on="MSIE" kickstart-bytes="2048" maxstreaming-connections-per-session="2"/> 9 SAP Netweaver e Adobe BlazeDS http://desvino.altervista.org <user-agent match-on="Firefox" kickstart-bytes="2048" maxstreaming-connections-per-session="2"/> </user-agent-settings> </properties> </channel-definition> <channel-definition id="my-http" class="mx.messaging.channels.HTTPChannel"> <endpoint url="http://server:port/TestBlaze/messagebroker/http" class="flex.messaging.endpoints.HTTPEndpoint"/> </channel-definition> <channel-definition id="my-secure-http" class="mx.messaging.channels.SecureHTTPChannel"> <endpoint url="https://server:port/TestBlaze/messagebroker/httpsecure" class="flex.messaging.endpoints.SecureHTTPEndpoint"/> <properties> <add-no-cache-headers>false</add-no-cache-headers> </properties> </channel-definition> </channels> <logging> <target class="flex.messaging.log.ConsoleTarget" level="Error"> <properties> <prefix>[BlazeDS] </prefix> <includeDate>false</includeDate> <includeTime>false</includeTime> <includeLevel>false</includeLevel> <includeCategory>false</includeCategory> </properties> <filters> <pattern>Endpoint.*</pattern> <pattern>Service.*</pattern> <pattern>Configuration</pattern> </filters> </target> </logging> <system> <redeploy> <enabled>false</enabled> <!-<watch-interval>20</watch-interval> <watch-file>{context.root}/WEB-INF/flex/services-config.xml</watchfile> <watch-file>{context.root}/WEB-INF/flex/proxy-config.xml</watchfile> <watch-file>{context.root}/WEB-INF/flex/remoting-config.xml</watchfile> <watch-file>{context.root}/WEB-INF/flex/messagingconfig.xml</watch-file> <watch-file>{context.root}/WEB-INF/flex/data-managementconfig.xml</watch-file> <touch-file>{context.root}/WEB-INF/web.xml</touch-file> --> </redeploy> </system> </services-config> services-config.xml 10 SAP Netweaver e Adobe BlazeDS http://desvino.altervista.org <?xml version="1.0" encoding="UTF-8"?> <service id="proxy-service" class="flex.messaging.services.HTTPProxyService"> <properties> <connection-manager> <max-total-connections>100</max-total-connections> <default-max-connections-per-host>2</default-max-connections-perhost> </connection-manager> <allow-lax-ssl>true</allow-lax-ssl> </properties> <adapters> <adapter-definition id="http-proxy" class="flex.messaging.services.http.HTTPProxyAdapter" default="true"/> <adapter-definition id="soap-proxy" class="flex.messaging.services.http.SOAPProxyAdapter"/> </adapters> <default-channels> <channel ref="amf"/> </default-channels> <destination id="DefaultHTTP"> </destination> </service> proxy-config.xml <?xml version="1.0" encoding="UTF-8"?> <service id="message-service" class="flex.messaging.services.MessageService"> <adapters> <adapter-definition id="actionscript" class="flex.messaging.services.messaging.adapters.ActionScriptAdapter" default="true" /> <!-- <adapter-definition id="jms" class="flex.messaging.services.messaging.adapters.JMSAdapter"/> --> </adapters> <default-channels> <channel ref="fast-polling-amf"/> </default-channels> </service> messaging-config.xml <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE web-j2ee-engine SYSTEM "web-j2ee-engine.dtd"> <web-j2ee-engine/> war - web-j2ee-engine.xml Nella figure due sottostanti è possibile vedere il file web.xml per il WAR, oggetti Web e sorgente. 11 SAP Netweaver e Adobe BlazeDS http://desvino.altervista.org web.xml – Web Objects <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE web-app PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN" "http://java.sun.com/dtd/web-app_2_3.dtd"> <web-app> <display-name>Organigramma BLAZEDS</display-name> <description>Organigramma BLAZEDS WEB APP</description> <!-- Http Flex Session attribute and binding listener support --> <listener> <listener-class>flex.messaging.HttpFlexSession</listener-class> </listener> <!-- MessageBroker Servlet --> <servlet> <servlet-name>MessageBrokerServlet</servlet-name> <display-name>MessageBrokerServlet</display-name> <servlet-class>flex.messaging.MessageBrokerServlet</servlet-class> <init-param> <param-name>services.configuration.file</param-name> <param-value>/WEB-INF/flex/services-config.xml</param-value> </init-param> <load-on-startup>1</load-on-startup> </servlet> <servlet-mapping> <servlet-name>MessageBrokerServlet</servlet-name> <url-pattern>/messagebroker/*</url-pattern> </servlet-mapping> <welcome-file-list> <welcome-file>index.html</welcome-file> </welcome-file-list> </web-app> web.xml - sorgente 12 SAP Netweaver e Adobe BlazeDS http://desvino.altervista.org Il passo successivo concerne il build dell’applicazione e l’aggiunta del WAR all’EAR creato precedentemente. Build WAR e Add to EAR Project Build EAR 13 SAP Netweaver e Adobe BlazeDS http://desvino.altervista.org Deploy sul server J2EE In relazione all’EAR, all’interno del file application-j2ee-engine.xml devono essere presenti i riferimenti alle librerie ed ai servizi necessari al funzionamento dell’applicazione. EAR referenze 14 SAP Netweaver e Adobe BlazeDS http://desvino.altervista.org <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE application-j2ee-engine SYSTEM 'application-j2ee-engine.dtd'> <application-j2ee-engine> <reference reference-type="weak"> <reference-target provider-name="sap.com" targettype="service">jmx</reference-target> </reference> <reference reference-type="weak"> <reference-target provider-name="sap.com" targettype="library">tc~jmx</reference-target> </reference> <reference reference-type="weak"> <reference-target provider-name="sap.com" targettype="library">com.sap.mw.jco</reference-target> </reference> <provider-name>sap.com</provider-name> <fail-over-enable mode="disable" /> </application-j2ee-engine> application-j2ee-engine.xml Il file application.xml deve contenere informazioni della nostra applicazione relativamente a nome, descrizione, web-uri e context root. <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE application PUBLIC "-//Sun Microsystems, Inc.//DTD J2EE Application 1.3//EN" "http://java.sun.com/dtd/application_1_3.dtd"> <application> <display-name>OrgBlazeDSear</display-name> <description>EAR description</description> <module> <web> <web-uri>OrgBlazeDS.war</web-uri> <context-root>TestBlaze</context-root> </web> </module> </application> application.xml Il sorgente FLEX. <?xml version="1.0" encoding="utf-8"?> <mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute"> <mx:Script> <![CDATA[ import mx.rpc.events.FaultEvent; import mx.rpc.events.ResultEvent; 15 SAP Netweaver e Adobe BlazeDS http://desvino.altervista.org //Invoke method from J2EE Server private function doPing():void { var input:String = input.text; remoteObject.doPing(input); } // Handle the recevied message. private function resultHandler(event:ResultEvent):void { result.text = event.result.toString(); } // Handle a message fault. private function faultHandler(event:FaultEvent):void { result.text += "Error: " + event.fault.toString(); } ]]> </mx:Script> <mx:RemoteObject id="remoteObject" destination="MyFunction" result="resultHandler(event);" fault="faultHandler(event);"/> <mx:Label text="Your Name" x="10" y="12"/> <mx:TextInput id="input" text="" x="95" y="10" width="330"/> <mx:Button label="Send" click="doPing();" x="371" y="40"/> <mx:TextArea id="result" x="95" y="70" height="166" width="330" editable="false"/> <mx:Label text="Result" x="10" y="70"/> </mx:Application> L’applicazione FLEX deve conoscere la destinazione MyFunction, a tale scopo deve “vedere” service-config.xml. Nelle opzioni relative al compiling viene specificato un argomento addizionale ad hoc. Flex Compiler options 16 SAP Netweaver e Adobe BlazeDS http://desvino.altervista.org Ci sono diversi modi per eseguire l’applicazione sul portale. Un modo abbastanza semplice concerne la creazione di un componente portale ad hoc. All’interno del metodo doOnNodeReady inseriamo l’istruzione request.redirect("/TestBlaze/blaze1.html");. Sul portale creiamo una iview di tipo componente portale. Seguiamo i passi necessari selezionando il PAR deployato in precedenza. Eseguendo l’anteprima dell’IVIEW l’applicazione viene visualizzata nel browser. Il click sul pulsante Send ottiene come risultato la visualizzazione della stringa di output nella textArea corrispondente. anteprima dell’IView 17 SAP Netweaver e Adobe BlazeDS http://desvino.altervista.org Jars e librerie Nella figura sottostante sono visibili i jars contenenti le librerie necessarie al funzionamento dell’applicazione sia per quanto riguarda BlazeDS sia per quanto riguarda il portale SAP. Java Buil Path relativa al WAR Un progetto che utilizza BlazeDS deve contenere almeno i seguenti jars: BlazeDS jars