1 Reply Latest reply on May 27, 2008 8:36 AM by pasc_dev

    Can we redirect from a portlet to an external resource or se

    pasc_dev

      Hello,

      we are trying to redirect from a controler portlet to an website like www.google.fr or a servlet.

      We are working on :
      - sdk 6,
      - seam 2.0.0 GA
      - Jboss portal 2.6.
      - protletBridge 1.0.0.B2
      - richfaces.

      I am trying to redirect from a portlet to a servlet view. So, I have a session bean. This session Bean is the portlet controler, and has an subcontroler. The subcontroler has the responsability to redirect to an external resource.

      We invoque the method of the subcontroler with a <h:commandButton/>.
      But an java.lang.IllegalStateException is throwed.



      java.lang.IllegalStateException: sendRedirect cannot be called after setPortletMode/setWindowState/setRenderParameter/setRenderParameters has been called previously
      at org.jboss.portal.portlet.impl.jsr168.api.ActionResponseImpl.sendRedirect(ActionResponseImpl.java:153)
      at org.jboss.portal.portlet.impl.jsr168.api.ActionResponseImpl.sendRedirect(ActionResponseImpl.java:130)
      at com.smalltox.business.paiement.PaiementController.listen(PaiementController.java:30)
      at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
      at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
      at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
      at java.lang.reflect.Method.invoke(Method.java:597)
      at org.jboss.el.util.ReflectionUtil.invokeMethod(ReflectionUtil.java:328)
      at org.jboss.el.util.ReflectionUtil.invokeMethod(ReflectionUtil.java:341)
      at org.jboss.el.parser.AstPropertySuffix.invoke(AstPropertySuffix.java:58)
      at org.jboss.el.parser.AstValue.invoke(AstValue.java:96)
      at org.jboss.el.MethodExpressionImpl.invoke(MethodExpressionImpl.java:276)
      at org.jboss.seam.el.OptionalParameterMethodExpression.invoke(OptionalParameterMethodExpression.java:39)
      at com.sun.facelets.el.TagMethodExpression.invoke(TagMethodExpression.java:68)
      at javax.faces.event.MethodExpressionActionListener.processAction(MethodExpressionActionListener.java:88)
      at javax.faces.event.ActionEvent.processListener(ActionEvent.java:77)
      at javax.faces.component.UIComponentBase.broadcast(UIComponentBase.java:746)
      at javax.faces.component.UICommand.broadcast(UICommand.java:368)
      at org.ajax4jsf.component.AjaxViewRoot.processEvents(AjaxViewRoot.java:316)
      at org.ajax4jsf.component.AjaxViewRoot.broadcastEvents(AjaxViewRoot.java:291)
      at org.ajax4jsf.component.AjaxViewRoot.processPhase(AjaxViewRoot.java:248)
      at org.ajax4jsf.component.AjaxViewRoot.processApplication(AjaxViewRoot.java:461)
      at com.sun.faces.lifecycle.InvokeApplicationPhase.execute(InvokeApplicationPhase.java:97)
      at com.sun.faces.lifecycle.LifecycleImpl.phase(LifecycleImpl.java:251)
      at com.sun.faces.lifecycle.LifecycleImpl.execute(LifecycleImpl.java:117)
      at org.jboss.portletbridge.AbstractAjaxBridge.execute(AbstractAjaxBridge.java:133)
      at org.jboss.portletbridge.AjaxPortletBridge.doFacesRequest(AjaxPortletBridge.java:160)
      at javax.portlet.faces.GenericFacesPortlet.processAction(GenericFacesPortlet.java:273)
      at org.jboss.portal.portlet.impl.jsr168.PortletContainerImpl.invokeAction(PortletContainerImpl.java:458)
      at org.jboss.portal.portlet.impl.jsr168.PortletContainerImpl.dispatch(PortletContainerImpl.java:401)
      at org.jboss.portal.portlet.container.PortletContainerInvoker$1.invoke(PortletContainerInvoker.java:86)
      at org.jboss.portal.common.invocation.Invocation.invokeNext(Invocation.java:131)
      at org.jboss.portal.core.aspects.portlet.TransactionInterceptor.org$jboss$portal$core$aspects$portlet$TransactionInterceptor$invokeNotSupported$aop(TransactionInterceptor.java:86)
      at org.jboss.portal.core.aspects.portlet.TransactionInterceptor$invokeNotSupported_N4547270787964792031.invokeNext(TransactionInterceptor$invokeNotSupported_N4547270787964792031.java)
      at org.jboss.aspects.tx.TxPolicy.invokeInNoTx(TxPolicy.java:66)
      at org.jboss.aspects.tx.TxInterceptor$NotSupported.invoke(TxInterceptor.java:112)
      at org.jboss.portal.core.aspects.portlet.TransactionInterceptor$invokeNotSupported_N4547270787964792031.invokeNext(TransactionInterceptor$invokeNotSupported_N4547270787964792031.java)
      at org.jboss.aspects.tx.TxPolicy.invokeInNoTx(TxPolicy.java:66)
      at org.jboss.aspects.tx.TxInterceptor$NotSupported.invoke(TxInterceptor.java:102)
      at org.jboss.portal.core.aspects.portlet.TransactionInterceptor$invokeNotSupported_N4547270787964792031.invokeNext(TransactionInterceptor$invokeNotSupported_N4547270787964792031.java)
      at org.jboss.portal.core.aspects.portlet.TransactionInterceptor.invokeNotSupported(TransactionInterceptor.java)
      at org.jboss.portal.core.aspects.portlet.TransactionInterceptor.invoke(TransactionInterceptor.java:56)
      at org.jboss.portal.portlet.invocation.PortletInterceptor.invoke(PortletInterceptor.java:38)
      at org.jboss.portal.common.invocation.Invocation.invokeNext(Invocation.java:115)
      at org.jboss.portal.core.aspects.portlet.HeaderInterceptor.invoke(HeaderInterceptor.java:50)
      at org.jboss.portal.portlet.invocation.PortletInterceptor.invoke(PortletInterceptor.java:38)
      at org.jboss.portal.common.invocation.Invocation.invokeNext(Invocation.java:115)
      at org.jboss.portal.portlet.aspects.portlet.ProducerCacheInterceptor.invoke(ProducerCacheInterceptor.java:53)
      at org.jboss.portal.portlet.invocation.PortletInterceptor.invoke(PortletInterceptor.java:38)
      at org.jboss.portal.common.invocation.Invocation.invokeNext(Invocation.java:115)
      at org.jboss.portal.core.aspects.portlet.AjaxInterceptor.invoke(AjaxInterceptor.java:51)
      at org.jboss.portal.portlet.invocation.PortletInterceptor.invoke(PortletInterceptor.java:38)
      at org.jboss.portal.common.invocation.Invocation.invokeNext(Invocation.java:115)
      at org.jboss.portal.portlet.aspects.portlet.ModesInterceptor.invoke(ModesInterceptor.java:62)
      at org.jboss.portal.portlet.invocation.PortletInterceptor.invoke(PortletInterceptor.java:38)
      at org.jboss.portal.common.invocation.Invocation.invokeNext(Invocation.java:115)
      at org.jboss.portal.portlet.bridge.BridgeInterceptor.invoke(BridgeInterceptor.java:47)
      at org.jboss.portal.portlet.invocation.PortletInterceptor.invoke(PortletInterceptor.java:38)
      at org.jboss.portal.common.invocation.Invocation.invokeNext(Invocation.java:115)
      at org.jboss.portal.portlet.aspects.portlet.WindowStatesInterceptor.invoke(WindowStatesInterceptor.java:55)
      at org.jboss.portal.portlet.invocation.PortletInterceptor.invoke(PortletInterceptor.java:38)
      at org.jboss.portal.common.invocation.Invocation.invokeNext(Invocation.java:115)
      at org.jboss.portal.portlet.aspects.portlet.PortletSessionSynchronizationInterceptor.invoke(PortletSessionSynchronizationInterceptor.java:80)
      at org.jboss.portal.portlet.invocation.PortletInterceptor.invoke(PortletInterceptor.java:38)
      at org.jboss.portal.common.invocation.Invocation.invokeNext(Invocation.java:115)
      at org.jboss.portal.portlet.aspects.portlet.ContextTrackerInterceptor.invoke(ContextTrackerInterceptor.java:46)
      at org.jboss.portal.portlet.invocation.PortletInterceptor.invoke(PortletInterceptor.java:38)
      at org.jboss.portal.common.invocation.Invocation.invokeNext(Invocation.java:115)
      at org.jboss.portal.portlet.aspects.portlet.ContextDispatcherInterceptor$1.doCallback(ContextDispatcherInterceptor.java:104)
      at org.jboss.portal.web.command.CommandDispatcher$CallbackCommand.execute(CommandDispatcher.java:74)
      at sun.reflect.GeneratedMethodAccessor420.invoke(Unknown Source)
      at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
      at java.lang.reflect.Method.invoke(Method.java:597)
      at org.jboss.portal.web.command.CommandServlet.doGet(CommandServlet.java:131)
      at org.jboss.portal.web.command.CommandServlet.doPost(CommandServlet.java:162)
      at javax.servlet.http.HttpServlet.service(HttpServlet.java:710)
      at javax.servlet.http.HttpServlet.service(HttpServlet.java:803)
      at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290)
      at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
      at org.apache.catalina.core.ApplicationDispatcher.invoke(ApplicationDispatcher.java:654)
      at org.apache.catalina.core.ApplicationDispatcher.doInclude(ApplicationDispatcher.java:557)
      at org.apache.catalina.core.ApplicationDispatcher.include(ApplicationDispatcher.java:481)
      at org.jboss.portal.web.command.CommandServlet.include(CommandServlet.java:80)
      at org.jboss.portal.web.command.CommandDispatcher.include(CommandDispatcher.java:50)
      at org.jboss.portal.web.jboss.JBossWebContext.include(JBossWebContext.java:66)
      at org.jboss.portal.web.ServletContainer.include(ServletContainer



      i have tryed several ways to redirect :



      FacesContext facesContext = FacesContext.getCurrentInstance();
      ExternalContext externalContext = facesContext.getExternalContext();
      externalContext.redirect("http://www.amazon.com/exec/obidos/ASIN/0596005393");
      facesContext.responseComplete();






      FacesContext facesContext = FacesContext.getCurrentInstance();
      ExternalContext externalContext = facesContext.getExternalContext();
      ActionResponse actionResponse = (ActionResponse) objresp;
      actionResponse.sendRedirect("http://www.amazon.com/exec/obidos/ASIN/0596005393");





      FacesContext facesContext = FacesContext.getCurrentInstance();
      ExternalContext externalContext = facesContext.getExternalContext();
      JBossActionResponse objresp = (JBossActionResponse) externalContext.getResponse();
      objresp.sendRedirect("http://www.amazon.com/exec/obidos/ASIN/0596005393");



      So, i have tryed to launch the redirection by an ActionListener. In this case, the same exception is appeared.

      I need to know :
      - my code is wrong ? in this case, what is the correct way to redirect ?
      - this is a limitation or a bug of portlet bridge ? So, do you fix it ? and can you give us a date ?
      - are they alternate solutions ?

      I am disappointed. Indeed, with Liferay, it is really easy to redirect to an external resource. Liferay give us tools to do it. But, with portal + seam + portlet bridge, it seems terribly difficult.

      I give you all details :

      portlet controler :



      @Name("testControler4Buy")
      @Scope(ScopeType.SESSION)
      public class TestControler4Buy {

      private String amount = "200";
      private String devise = "euro";

      private PaiementController payCtrl = null;

      public String getAmount() {
      return amount;
      }
      public void setAmount(String amount) {
      this.amount = amount;
      }
      public String getDevise() {
      return devise;
      }
      public void setDevise(String devise) {
      this.devise = devise;
      }

      public PaiementController getPayCtrl() {
      if (this.payCtrl == null) {
      this.payCtrl = new PaiementController();
      }
      return this.payCtrl;
      }

      }



      SubController :



      public class PaiementController {


      public void listen(ActionEvent event) {

      FacesContext facesContext = FacesContext.getCurrentInstance();
      ExternalContext externalContext = facesContext.getExternalContext();

      try {
      JBossActionResponse objresp = (JBossActionResponse) externalContext.getResponse();
      objresp.sendRedirect("http://www.amazon.com/exec/obidos/ASIN/0596005393");
      }catch(IOException e) {
      e.printStackTrace();
      }



      }

      public void goToPaiementView() {

      FacesContext facesContext = FacesContext.getCurrentInstance();
      ExternalContext externalContext = facesContext.getExternalContext();



      try {

      if (objresp instance of JBossActionResponse ) {

      JBossActionResponse objresp = (JBossActionResponse); externalContext.getResponse(); objresp.sendRedirect("http://www.amazon.com/exec/obidos/ASIN/0596005393");
      }
      }catch(IOException e) {
      e.printStackTrace();
      }

      try { externalContext.redirect("http://www.amazon.com/exec/obidos/ASIN/0596005393");
      facesContext.responseComplete();

      } catch(Exception e) {
      e.printStackTrace();
      e.toString();
      }

      }
      }





      Portlet View :



      <?xml version="1.0" encoding="utf-8"?>
      <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
      "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
      <html xmlns="http://www.w3.org/1999/xhtml"
      xmlns:s="http://jboss.com/products/seam/taglib"
      xmlns:h="http://java.sun.com/jsf/html"
      xmlns:f="http://java.sun.com/jsf/core">
      <head>
      <title>Hello World</title>
      </head>
      <body>
      <h:form>
      <h:inputText value="#{testControler4Buy.amount}"/>
      <h:inputText value="#{testControler4Buy.devise}"/>
      <h:commandButton actionListener="#{testControler4Buy.payCtrl.listen}"
      action="#{testControler4Buy.payCtrl.goToPaiementView}"
      value="paiement"/>
      <h:outputLink value="http://localhost:8080/smalltox/servlet/RequestServlet">
      <h:outputText value="paiment"/>
      </h:outputLink>
      </h:form>
      </body>
      </html>





      The Target Servlet :



      public class RequestServlet extends HttpServlet {

      public void service (HttpServletRequest request,
      HttpServletResponse response) throws ServletException, IOException{

      try{

      PrintWriter out;
      response.setContentType("text/html");
      out = response.getWriter();

      out.println ("");
      out.println ("<BODY bgcolor=#ffffff>");
      out.println ("<Font color=#000000>");
      out.println ("
      <H1>Test de l'API JAVA SHERLOCKS</H1>


      ");

      /* Initialisation du chemin du fichier pathfile (Ã modifier)
      ex :
      -> Windows : SIPSApiWeb api = new SIPSApiWeb("c:\\repertoire\\pathfile");
      -> Unix : SIPSApiWeb api = new SIPSApiWeb("/home/repertoire/pathfile");
      */
      SIPSApiWeb api = new SIPSApiWeb("C:\\working\\sherlocks\\test\\param\\pathfile");


      /* Initialisation de l'objet d'appel */
      SIPSDataObject call = (SIPSDataObject) new SIPSCallParm();

      // Paramètres obligatoires
      // ex : merchant_id = 014295303911111
      call.setValue("merchant_id","014295303911111");

      // ex : merchant_country = fr
      call.setValue("merchant_country","fr");

      // Affectation du montant de la transaction dans la plus petite unité
      // monétaire du pays
      // ex : 123,00 Euros ==> 12300 (currency_code = 978)
      call.setValue("amount","12300");

      // Affectation du code monétaire ISO 4217 pour la transaction
      // ex : Euro ==> 978
      call.setValue("currency_code","978");

      // Affectation d'un numéro identifiant pour la transaction
      // Attention aux reserves sur l'affectation automatique
      // cf Guide du developpeur
      // call.setValue("transaction_id","123456");

      // Valorisation des autres données de la transaction
      // facultatives, à compléter au besoin
      // Les valeurs proposées ne sont que des exemples
      // Les champs et leur utilisation sont expliqués dans le Dictionnaire des données
      //
      // call.setValue("normal_return_url","http://www.maboutique.fr/servlet/ResponseServlet");
      // call.setValue("cancel_return_url","http://www.maboutique.fr/servlet/ResponseServlet");
      // call.setValue("automatic_response_url","http://www.maboutique.fr/servlet/AutoResponseServlet");
      // call.setValue("language","fr");
      // call.setValue("payment_means","CB,2,VISA,2,MASTERCARD,2");
      // call.setValue("header_flag","no");
      // call.setValue("capture_day","");
      // call.setValue("capture_mode","");
      // call.setValue("bgcolor","");
      // call.setValue("block_align","");
      // call.setValue("block_order","");
      // call.setValue("textcolor","");
      // call.setValue("receipt_complement","");
      // call.setValue("caddie","mon caddie");
      // call.setValue("customer_id","");
      // call.setValue("customer_email","");
      // call.setValue("data","");
      // call.setValue("return_context","");
      // call.setValue("target","");
      // call.setValue("order_id","");


      // Les valeurs suivantes ne sont utilisables qu'en pré-production
      // Elles nécessitent l'installation de vos logos et templates sur
      // le serveur de paiement
      //
      // call.setValue("normal_return_logo","");
      // call.setValue("cancel_return_logo","");
      // call.setValue("submit_logo","");
      // call.setValue("logo_id","");
      // call.setValue("logo_id2","");
      // call.setValue("advert","");
      // call.setValue("background_id","");
      // call.setValue("templatefile","mon_template");


      // Insertion de la commande dans votre base de données
      // avec le status "en cours"
      // ...

      // Appel de l'api SIPS payment

      /* test */
      String test = api.sipsPaymentCallFunc(call);
      /* test */
      out.println(test /*api.sipsPaymentCallFunc(call)*/);

      out.println ("

      ");
      out.println ("");
      out.println ("");

      out.close();

      }

      catch(Exception e){

      PrintWriter out;
      response.setContentType("text/html");
      out = response.getWriter();

      out.println ("
      ");
      out.println ("
      ");
      out.println("Error = "+e);
      out.println ("
      ");
      out.println ("");
      out.println ("");

      out.close();
      }
      }
      }


      web.xml



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

      <web-app version="2.5"
      xmlns="http://java.sun.com/xml/ns/javaee"
      xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
      xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">



      <!-- SHERLOCKS DEBUT -->
      <servlet>
      <servlet-name>RequestServlet</servlet-name>
      <servlet-class>com.smalltox.sherlocks.RequestServlet</servlet-class>
      </servlet>
      <servlet-mapping>
      <servlet-name>RequestServlet</servlet-name>
      <url-pattern>/servlet/RequestServlet</url-pattern>
      </servlet-mapping>

      <servlet>
      <servlet-name>ResponseServlet</servlet-name>
      <servlet-class>com.smalltox.sherlocks.ResponseServlet</servlet-class>
      </servlet>
      <servlet-mapping>
      <servlet-name>ResponseServlet</servlet-name>
      <url-pattern>/servlet/ResponseServlet</url-pattern>
      </servlet-mapping>

      <servlet>
      <servlet-name>AutoResponseServlet</servlet-name>
      <servlet-class>com.smalltox.sherlocks.AutoResponseServlet</servlet-class>
      </servlet>
      <servlet-mapping>
      <servlet-name>AutoResponseServlet</servlet-name>
      <url-pattern>/servlet/AutoResponseServlet</url-pattern>
      </servlet-mapping>

      <!-- SHERLOCKS FIN -->

      <description>RichFacesPortlet</description>

      <listener>
      <listener-class>org.jboss.seam.servlet.SeamListener</listener-class>
      </listener>

      <listener>
      <listener-class>com.sun.faces.config.ConfigureListener</listener-class>
      </listener>

      <context-param>
      <param-name>org.ajax4jsf.VIEW_HANDLERS</param-name>
      <param-value>org.jboss.portletbridge.application.FaceletPortletViewHandler</param-value>
      </context-param>

      <context-param>
      <param-name>javax.portlet.faces.renderPolicy</param-name>
      <param-value>ALWAYS_DELEGATE</param-value>
      </context-param>

      <context-param>
      <param-name>org.ajax4jsf.RESOURCE_URI_PREFIX</param-name>
      <param-value>rfRes</param-value>
      </context-param>

      <context-param>
      <param-name>org.richfaces.LoadStyleStrategy</param-name>
      <param-value>NONE</param-value>
      </context-param>

      <context-param>
      <param-name>org.richfaces.LoadScriptStrategy</param-name>
      <param-value>NONE</param-value>
      </context-param>

      <context-param>
      <param-name>org.ajax4jsf.COMPRESS_SCRIPT</param-name>
      <param-value>false</param-value>
      </context-param>

      <!-- JSF -->

      <context-param>
      <param-name>javax.faces.DEFAULT_SUFFIX</param-name>
      <param-value>.xhtml</param-value>
      </context-param>

      <context-param>
      <param-name>facelets.DEVELOPMENT</param-name>
      <param-value>true</param-value>
      </context-param>

      <filter>
      <display-name>Ajax4jsf Filter</display-name>
      <filter-name>ajax4jsf</filter-name>
      <filter-class>org.ajax4jsf.Filter</filter-class>
      </filter>
      <filter-mapping>
      <filter-name>ajax4jsf</filter-name>
      <servlet-name>FacesServlet</servlet-name>
      <dispatcher>FORWARD</dispatcher>
      <dispatcher>REQUEST</dispatcher>
      <dispatcher>INCLUDE</dispatcher>
      </filter-mapping>

      <servlet>
      <servlet-name>FacesServlet</servlet-name>
      <servlet-class>javax.faces.webapp.FacesServlet</servlet-class>
      <load-on-startup>1</load-on-startup>
      </servlet>

      <servlet-mapping>
      <servlet-name>FacesServlet</servlet-name>
      <url-pattern>/faces/*</url-pattern>
      </servlet-mapping>

      <servlet-mapping>
      <servlet-name>FacesServlet</servlet-name>
      <url-pattern>*.seam</url-pattern>
      </servlet-mapping>

      <session-config>
      <session-timeout>10</session-timeout>
      </session-config>
      </web-app>




      Thanks for your attention.