Uploaded image for project: 'Portals Bridges (Retired)'
  1. Portals Bridges (Retired)
  2. PB-35

Multiple instances of the same bridge application behave badly due to ID conflicts

    XMLWordPrintableJSON

Details

    • Bug
    • Status: Resolved
    • Major
    • Resolution: Fixed
    • None
    • 1.0.1
    • jsf
    • None
    • Tested in Liferay

    Description

      I am using the myFaces implementation of JSF in conjunction with the Apache portal bridge.

      I have no issue when I use the portlet as a single instance. All is beautiful. When I make the portlet multi-instance the eorld comes tumbling down. All the javascript and component ID's are the same.


      I know myfaces looks to the external context to call help create a unique id for the components which should call response.namespace();

      You can see in the HTML output of the lifray install that unqiue names are being generated for the each portlet (both the same "flavor")

      portlet [com.liferay.portlet.PortletSessionImpl@608486] namespace response[_contentRepositoryBrowser-wide_WAR_contentRepositoryBrowser_INSTANCE_Ju5n_]

      portlet [com.liferay.portlet.PortletSessionImpl@1919998] namespace response[_contentRepositoryBrowser-wide_WAR_contentRepositoryBrowser_INSTANCE_1cKB_]

      I know myFaces makes the following call on create unique Id:
      public String createUniqueId()

      { ExternalContext extCtx = FacesContext.getCurrentInstance().getExternalContext(); return extCtx.encodeNamespace(UNIQUE_ID_PREFIX + _uniqueIdCounter++); }

      which in the end should pickup the names given by RenderResponse.getNamespace(), yet that is no where in the HTML output.

      As far as I can tell this is because the external context implementation provided with the apache jsf portlet bridge does the following:

      /**

      • @see javax.faces.context.ExternalContext#encodeNamespace(java.lang.String)
        */
        public String encodeNamespace(String s) { return s; }

      according to the documentation for ExternalContext.encodeNamespace(..)
      Return the specified name, after prefixing it with a namespace that ensures that it will be unique within the context of a particular page.

      Servlet: The input value must be returned unchanged.

      Portlet: The returned value must be the input value prefixed by the value returned by the javax.portlet.RenderResponse method getNamespace().

      Attachments

        1. PortletUIViewRoot.java
          1 kB
          Matthew Bruzek

        Activity

          People

            taylor David Sean Taylor
            rdanner russ danner
            Votes:
            1 Vote for this issue
            Watchers:
            3 Start watching this issue

            Dates

              Created:
              Updated:
              Resolved: