Canigó - Servei de portlets 2.3.x
SERVEI DE PORTLETSIntroducció
PropòsitEl Servei de Portlets té com a propòsit oferir un pont entre els components del Framework i les implementacions dels Portals. En aquest document es detalla com configurar aplicacions fetes amb el Framework per a que siguin compatibles amb dues implementacions de Portals: Apache Jetspeed 2.0 i Vignette 7.2.2. Context i Escenaris d'ÚsEl Servei de Portlets es troba dins dels serveis de Presentació de canigo. Per a la utilització d'canigo en Portals, serà necessaria la utilització de la implementació d'Apache (Jetspeed 2.0) o la de Vignette (Vignette Portal 7.2.2). Versions i DependènciesLes dependències descrites a la següent url son requerides per tal de compilar i fer funcionar el projecte: VersionsEn la utilització del Framework amb el servei de portlets, només està suportada la versió 1.0 . GlossariPortal Portlet Page Site Descripció DetalladaArquitectura i ComponentsL'arquitectura del Servei de Portlets és basa en l'ús dels components del Framework complint els requeriments de la implementació de Portal que estiguem utilitzant. Interfícies i Components GenèricsEls tags del servei es troben definits mitjançant un conjunt d'interfícies que defineixen què s'espera de les implementacions mitjançant un conjunt de mètodes. Es pot trobar tota la documentació JavaDoc y el codi font referent aquests components a les següents urls: JavaDoc: http://canigo.ctti.gencat.net/confluence/canigodocs/site/canigo2_0/canigo-services-portlets/apidocs/index.html Instal- lació i ConfiguracióInstal- lacióPer a la utilització del Servei de Portlets és necessària una prèvia instal- lació del portal en un servidor (Tomcat, Weblogic, Websphere, etc..). Per fer-ho haurem de seguir el manual d'instal- lació de Vignette. En aquest document s'explicarà la instal- lació del Portal de Vignette sobre un servidor Apache Tomcat 5.0.28. Instal- lació Apache Jetspeed 2.0En aquesta implementació de portal apache ha decidit oferir conjuntament el servidor i el portal. El servidor és, realment, un Apache Tomcat i el portal és una aplicació anomenada jetspeed desplegada en ell. Si la instal- lació ha estat correcta, accedint a []http://host:Port/jetspeed hauríem d'accedir a la pàgina principal de Jestpeed. Instal- lació Apache Tomcat 5.0.28 - Vignette Portal 7.2.2Per assegurar-nos de que el portal s'ha instal- lat correctament, ens hem d'assegurar que s'ha desplegat l'aplicació portal dins de %TOMCAT_HOME%\webapps i que s'ha creat el fitxer de context del portal (portal.xml) dins de %TOMCAT_HOME%\conf\Catalina\localhost. També haurem de comprovar que en el directori %TOMCAT_HOME%\shared\lib hi tenim les següents llibreries: portlet.jar Si la instal- lació ha estat correcta, accedint a http://host:Port/portal/console hauríem d'accedir a la pàgina de login del Vignette Portal. ConfiguracióL'apartat de configuració varia notablement depenent del servidor i de la implementació de portal que fem servir. Per això s'han definit configuracions específiques a part de la general. Configuració GeneralPer a configurar una aplicació per poder desplegar-se dins d'un portal, haurem de seguir els següents passos:
Aquest fitxer descriu el nom i la classe del portlet (portals-bridges-struts-1.2.7-1.0.jar) i la implementació de la interface ServletContextProvider d'Struts-Bridge (portals-bridges-commons-1.0.jar). En aquest cas, la implementació ens l'ha de facilitar el proveïdor del portal.
... <bean id="acegiFilterInterceptor" class="com.atosorigin.canigo.services.portlets.struts.FilterInterceptor" singleton="false"> <property name="filterClass" value="net.sf.acegisecurity.util.FilterToBeanProxy"> </property> <property name="configMap"> <map> <entry key="targetClass" value="net.sf.acegisecurity.util.FilterChainProxy"> </entry> <entry key="init" value="lazy"></entry> </map> </property> <property name="order" value="2"></property> <property name="urlPatternList"> <list> <value>/*/</value> </list> </property> </bean> <bean id="localeFilterInterceptor" class="com.atosorigin.canigo.services.portlets.struts.FilterInterceptor" singleton="false"> <property name="filterClass" value="net.gencat.ctti.canigo.services.web.i18n.StrutsLocaleFilter"> </property> <property name="order" value="0"></property> <property name="urlPatternList"> <list> <value>*.do</value> <value>*.doc</value> <value>*.report</value> <value>*.pdf</value> <value>/dwr/*</value> <value>*.xls</value> </list> </property> </bean> ...
Configuració Apache Jetspeed 2.0Per a configurar una aplicació per poder desplegar-se dins del portal Jestpeed 2.0, haurem de seguir els següents passos:
Aquest fitxer descriu el nom i la classe del portlet (portals-bridges-struts-1.2.7-1.0.jar) i la implementació de la interface ServletContextProvider d'Struts-Bridge (portals-bridges-commons-1.0.jar). En aquest cas, la implementació es troba dins de la llibreria jetspeed-commons-2.0.jar.
<?xml version="1.0" encoding="UTF-8"?> <Context path="/canigo-samples-jPetstore-portlets" debug="5" reloadable="true" crossContext="true"> <Resource auth="Container" name="canigoDS" type="javax.sql.DataSource"/> <ResourceParams name="canigoDS"> <parameter> <name>driverClassName</name> <value>oracle.jdbc.driver.OracleDriver</value> </parameter> <parameter> <name>url</name> <value>jdbc:oracle:thin:@bna-s007.es.int.atosorigin.com:1521:Legolas</value> </parameter> <parameter> <name>username</name> <value>username</value> </parameter> <parameter> <name>password</name> <value>password</value> </parameter> <parameter> <name>maxActive</name> <value>20</value> </parameter> <parameter> <name>maxIdle</name> <value>10</value> </parameter> <parameter> <name>maxWait</name> <value>-1</value> </parameter> </ResourceParams> </Context>
... <bean id="acegiFilterInterceptor" class="com.atosorigin.canigo.services.portlets.struts.FilterInterceptor" singleton="false"> <property name="filterClass" value="net.sf.acegisecurity.util.FilterToBeanProxy"> </property> <property name="configMap"> <map> <entry key="targetClass" value="net.sf.acegisecurity.util.FilterChainProxy"> </entry> <entry key="init" value="lazy"></entry> </map> </property> <property name="order" value="2"></property> <property name="urlPatternList"> <list> <value>/*/</value> </list> </property> </bean> <bean id="localeFilterInterceptor" class="com.atosorigin.canigo.services.portlets.struts.FilterInterceptor" singleton="false"> <property name="filterClass" value="net.gencat.ctti.canigo.services.web.i18n.StrutsLocaleFilter"> </property> <property name="order" value="0"></property> <property name="urlPatternList"> <list> <value>*.do</value> <value>*.doc</value> <value>*.report</value> <value>*.pdf</value> <value>/dwr/*</value> <value>*.xls</value> </list> </property> </bean> ...
Configuració Tomcat 5.0.28 - Vignette7.2.2Per a configurar una aplicació per poder desplegar-se dins d'un portal, haurem de seguir els següents passos:
Aquest fitxer descriu el nom i la classe del portlet i la implementació de la interface ServletContextProvider d'Struts-Bridge (portals-bridges-commmons-1.0.jar). En aquest cas, la implementació es troba dins de la llibreria vgn-portal-jsrextensions-1.0.jar.
<?xml version="1.0" encoding="UTF-8"?> <Context path="/canigo-samples-jPetstore-portlets" debug="5" reloadable="true" crossContext="true"> <Resource auth="Container" name="canigoDS" type="javax.sql.DataSource"/> <ResourceParams name="canigoDS"> <parameter> <name>driverClassName</name> <value>oracle.jdbc.driver.OracleDriver</value> </parameter> <parameter> <name>url</name> <value>jdbc:oracle:thin:@bna-s007.es.int.atosorigin.com:1521:Legolas</value> </parameter> <parameter> <name>username</name> <value>username</value> </parameter> <parameter> <name>password</name> <value>password</value> </parameter> <parameter> <name>maxActive</name> <value>20</value> </parameter> <parameter> <name>maxIdle</name> <value>10</value> </parameter> <parameter> <name>maxWait</name> <value>-1</value> </parameter> </ResourceParams> </Context>
<bean id="strutsMenuFilterInterceptor" class="com.atosorigin.canigo.services.portlets.struts.FilterInterceptor" singleton="false"> <property name="filterClass" value="net.gencat.ctti.canigo.samples.jpetstore.struts.menu.AcegiPermissionsFilter"> </property> <property name="urlPatternList"> <list> <value>*.do</value> </list> </property> <property name="order" value="3"></property> </bean> <bean id="UrlRewriteFilterInterceptor" class="com.atosorigin.canigo.services.portlets.struts.FilterInterceptor" singleton="false"> <property name="filterClass" value="net.gencat.ctti.canigo.services.web.filter.urlrewrite.UrlRewriteFilter"> </property> <property name="configMap"> <map> <entry key="logLevel" value="LOG4J"></entry> </map> </property> <property name="order" value="4"></property> <property name="urlPatternList"> <list> <value>/*/</value> </list> </property> </bean> <bean id="acegiFilterInterceptor" class="com.atosorigin.canigo.services.portlets.struts.FilterInterceptor" singleton="false"> <property name="filterClass" value="net.sf.acegisecurity.util.FilterToBeanProxy"> </property> <property name="configMap"> <map> <entry key="targetClass" value="net.sf.acegisecurity.util.FilterChainProxy"> </entry> <entry key="init" value="lazy"></entry> </map> </property> <property name="order" value="2"></property> <property name="urlPatternList"> <list> <value>/*/</value> </list> </property> </bean> <bean id="localeFilterInterceptor" class="com.atosorigin.canigo.services.portlets.struts.FilterInterceptor" singleton="false"> <property name="filterClass" value="net.gencat.ctti.canigo.services.web.i18n.StrutsLocaleFilter"> </property> <property name="order" value="0"></property> <property name="urlPatternList"> <list> <value>*.do</value> <value>*.doc</value> <value>*.report</value> <value>*.pdf</value> <value>/dwr/*</value> <value>*.xls</value> </list> </property> </bean> <bean id="jstlLocaleFilterInterceptor" class="com.atosorigin.canigo.services.portlets.struts.FilterInterceptor" singleton="false"> <property name="filterClass" value="net.gencat.ctti.canigo.services.web.i18n.JSTLLocaleFilter"> </property> <property name="order" value="1"></property> <property name="urlPatternList"> <list> <value>*.do</value> <value>*.doc</value> <value>*.report</value> <value>*.pdf</value> <value>/dwr/*</value> <value>*.xls</value> </list> </property> </bean>
El goal canigo: PortletPackageTool ddd modifica el war que tenim creat en el directori \target. El goal canigo:WarPortletPackageTool crea prèviament el war en el directori \target. Per a que aquest goal funcioni hem de tenir definida la propietat ctti.war.wtp.module dins del fitxer project.properties:
ctti.war.wtp.module=canigo-samples-jPetstore-portlets També és necessari tenir en el repositori maven la llibreria vgn-portal-ant.jar, que trobarem a %PORTAL_HOME%\ant\lib_portal. També hi hem de tenir les llibreries d'ant i de xalan. Les modificacions que fa aquesta eina en el fitxer.xml són les següents: <!-- ADDED BY VIGNETTE PORTLET PACKAGING TOOL. DO NOT EDIT --><context-param>
<param-name>contextPath</param-name>
<param-value>appContextPath</param-value>
<description>Context root to which this web application is deployed. Used by the Portal JSR
168 implementation.</description>
</context-param>
<!-- END THIS VIGNETTE PACKAGING TOOL ADDITION. -->
<!-- ADDED BY VIGNETTE PORTLET PACKAGING TOOL. DO NOT EDIT -->
<filter>
<filter-name>PortletApplicationSecurityFilter</filter-name>
<filter-class>com.vignette.portal.portlet.jsrcontainer.PortletApplicationSecurityFilter</filter-class>
</filter>
<!-- END THIS VIGNETTE PACKAGING TOOL ADDITION. -->
<!-- ADDED BY VIGNETTE PORTLET PACKAGING TOOL. DO NOT EDIT -->
<filter-mapping>
<filter-name>PortletApplicationSecurityFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<!-- END THIS VIGNETTE PACKAGING TOOL ADDITION. -->
<!-- ADDED BY VIGNETTE PORTLET PACKAGING TOOL. DO NOT EDIT -->
<listener>
<listener-class>com.vignette.portal.portlet.jsrcontainer.PortletApplicationServletContextListener
</listener-class>
</listener>
<!-- END THIS VIGNETTE PACKAGING TOOL ADDITION. -->
<!-- ADDED BY VIGNETTE PORTLET PACKAGING TOOL. DO NOT EDIT -->
<servlet>
<servlet-name>PortletCommandServlet</servlet-name>
<display-name>Portlet Command Servlet</display-name>
<description>Utilized by Portal to invoke JSR 168 portlets</description>
<servlet-class>com.vignette.portal.portlet.jsrcontainer.PortletCommandServlet</servlet-class>
</servlet>
<!-- END THIS VIGNETTE PACKAGING TOOL ADDITION. -->
<!-- ADDED BY VIGNETTE PORTLET PACKAGING TOOL. DO NOT EDIT -->
<servlet-mapping>
<servlet-name>PortletCommandServlet</servlet-name>
<url-pattern>/portletCommand/*</url-pattern>
</servlet-mapping>
<!-- END THIS VIGNETTE PACKAGING TOOL ADDITION. -->
Seguint tots els passos descrits fins aquest punt, simplement arrancant el servidor el Vignette Portal reconeixerà l'aplicació que hem deployat en el servidor com un portlet. Els components que el Framework encara no suporta en la seva integració amb el Servei de Portlets són els següents:
Els components suportats pel Framework són els següents:
Eines de SuportDebug de les PàginesEn l'ús de les nostres pàgines és convenient sempre conèixer si estan ben construïdes. Aquesta comprovació es pot realitzar amb l'extensió 'Web Developer' i 'Javascript Debugger', que ens permetràn detectar problemàtiques de les nostres pàgines. Preguntes Freqüents
Si al provar d'accedir a qualsevol mòdul de l'aplicació portal de Vignette ens trobem amb una excepció del tipus "java.lang.ClassNotFoundException", el més probable és que algun mòdul de Vignette no s'hagi deployat correctament. Per solucionar-ho haurem de redeployar el mòdul. Això ho farem copiant el fitxer ".car" corresponent del directori %VIGNETTE_HOME%\system\bootstrap a %VIGNETTE_HOME%\deployment\upload i fent un restart del Tomcat. Això ho trobarem explicat amb més detall en el document portalinstallguide.pdf en l'apartat de "upgrade portal".
Quan deployem per primera vegada el portal de Vignette o redeployem algun dels seus mòduls, depenent de la màquina on es trobi el servidor, pot ser que veiem l'avís de "This system is currently starting up." durant molt de temps i sembli que el portal s'hagi bloquejat. No és així, si editem el log corresponent (%VIGNETTE_HOME%\logs) veurem que el portal realment està arrancant. |