Creating Portal/Portlet URL from outside the portal

WebSphere Portal provides a PortalStateManagerService that you can use for creating a URL to either a portal page or portlet. You can use it for passing render parameters to portlet or even to invoke action on a particular portlet.

The PortalStateManagerService can be called from outside the portal, i.e. from a EJB or a separate J2EE application with a restriction that "The artifact that uses this kind of service must run in the same JVM as the portal that provides the service."

I built a sample J2EE application, which has a servlet that creates a URL to portal page and render URL to portlet (I am also setting render parameters), you can download it from here. When you click on the URL generated by servlet it opens that URL in a popup dialog box.


  • In order to create a URL to portal from outside the portal, first you will have to create a class that implements ServletContext interface, this class provides information that service needs for creating URL

    package com.webspherenotes.misc.popup;
    import java.nio.charset.Charset;
    import com.ibm.portal.state.accessors.url.ServerContext;
    public class DemoServerContext implements ServerContext{

    public String getContextPath() {
    return "/wpcert";
    }

    public String getHomeProtected() {
    return "/mydemo";
    }

    public String getHomePublic() {
    return "/demo";
    }

    public String getHostName() {
    return "localhost";
    }

    public String getHostPortHTTP() {
    return "10040";
    }

    public String getHostPortHTTPS() {
    return "10041";
    }

    public Charset getURLCharset() {
    return Charset.defaultCharset();
    }

    }

    The DemoServerContext has methods that portal uses for getting values required for building final portal URL, i am providing information about my local portal here

  • Once the DemoServerContext is ready create a PortalURLGenerationServlet.java like this

    package com.webspherenotes.misc.popup;

    import java.io.IOException;
    import java.util.Locale;

    import javax.naming.InitialContext;
    import javax.naming.NamingException;
    import javax.servlet.ServletException;
    import javax.servlet.http.HttpServlet;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;

    import com.ibm.portal.state.EngineURL;
    import com.ibm.portal.state.accessors.exceptions.CannotInsertSelectionNodeException;
    import com.ibm.portal.state.accessors.exceptions.MissingUniqueNameException;
    import com.ibm.portal.state.accessors.exceptions.UnknownUniqueNameException;
    import com.ibm.portal.state.accessors.portlet.PortletAccessorController;
    import com.ibm.portal.state.accessors.portlet.PortletAccessorFactory;
    import com.ibm.portal.state.accessors.selection.SelectionAccessorController;
    import com.ibm.portal.state.accessors.selection.SelectionAccessorFactory;
    import com.ibm.portal.state.accessors.solo.SoloAccessorController;
    import com.ibm.portal.state.accessors.solo.SoloAccessorFactory;
    import com.ibm.portal.state.accessors.url.ServerContext;
    import com.ibm.portal.state.accessors.url.URLAccessorFactory;
    import com.ibm.portal.state.exceptions.CannotCloneDocumentModelException;
    import com.ibm.portal.state.exceptions.CannotCreateDocumentException;
    import com.ibm.portal.state.exceptions.CannotInstantiateAccessorException;
    import com.ibm.portal.state.exceptions.InvalidConstantException;
    import com.ibm.portal.state.exceptions.StateManagerException;
    import com.ibm.portal.state.exceptions.UnknownAccessorTypeException;
    import com.ibm.portal.state.service.PortalStateManagerService;
    import com.ibm.portal.state.service.PortalStateManagerServiceHome;


    /**
    * Servlet implementation class PortalURLGenerationServlet
    */
    public class PortalURLGenerationServlet extends HttpServlet {
    private static final long serialVersionUID = 1L;

    PortalStateManagerServiceHome portalStateManagerServiceHome;


    public void init() throws ServletException {
    System.out.println("Entering PortalURLGenerationServlet.init()");
    try {
    InitialContext context = new InitialContext();
    portalStateManagerServiceHome =
    (PortalStateManagerServiceHome)context.lookup(PortalStateManagerServiceHome.JNDI_NAME);
    System.out.println ("Portal State Manager Service HOme " + portalStateManagerServiceHome);
    } catch (NamingException e) {
    e.printStackTrace(System.out);
    }

    System.out.println("Exiting PortalURLGenerationServlet.init()");
    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response)
    throws ServletException, IOException {
    System.out.println("Entering PortalURLGenerationService.doGet()");
    response.setContentType("text/html");
    String portalPageURL = getPortalPageURL();
    request.setAttribute("portalPageURL", portalPageURL);
    String portletURL = getPortletURL();
    request.setAttribute("portletURL", portletURL);
    getServletContext().getRequestDispatcher("/index.jsp").include(request, response);
    System.out.println("Exiting PortalURLGenerationService.doGet()");
    }

    private String getPortalPageURL(){
    PortalStateManagerService portalstateManagerService = null;
    System.out.println("Entering getPortalStateManagerServiceURL " + portalStateManagerServiceHome);
    try {
    portalstateManagerService =
    portalStateManagerServiceHome.getPortalStateManagerService(new DemoServerContext(),
    new Locale("en","US"), null, false, false);
    System.out.println("Portal state manager service " + portalstateManagerService);
    final URLAccessorFactory urlFct =
    (URLAccessorFactory)portalstateManagerService.getAccessorFactory(URLAccessorFactory.class);
    ServerContext serverContext;

    // the URL should be based on the current request state
    final EngineURL url = urlFct.newURL( new DemoServerContext(),
    false,false,portalstateManagerService.newState(),null);

    final SelectionAccessorFactory selectionAccessorFactory =
    portalstateManagerService.getAccessorFactory(SelectionAccessorFactory.class);
    SelectionAccessorController selectionAccessorCOntroller =
    selectionAccessorFactory.getSelectionController(url.getState());
    selectionAccessorCOntroller.setSelection("com.webspherenotes.popup.static");

    String finalURL = url.toString();
    System.out.println("Portal Page URL " + finalURL);
    return finalURL;

    } catch (StateManagerException e) {
    e.printStackTrace(System.out);
    } catch (UnknownAccessorTypeException e) {
    e.printStackTrace(System.out);
    } catch (CannotInstantiateAccessorException e) {
    e.printStackTrace(System.out);
    } catch (InvalidConstantException e) {
    e.printStackTrace(System.out);
    } catch (CannotCloneDocumentModelException e) {
    e.printStackTrace(System.out);
    } catch (CannotCreateDocumentException e) {
    e.printStackTrace(System.out);
    } catch (MissingUniqueNameException e) {
    e.printStackTrace(System.out);
    } catch (UnknownUniqueNameException e) {
    e.printStackTrace(System.out);
    } catch (CannotInsertSelectionNodeException e) {
    e.printStackTrace(System.out);
    }finally{
    if(portalstateManagerService != null)
    portalstateManagerService.dispose();
    }
    return null;
    }

    private String getPortletURL(){
    PortalStateManagerService portalstateManagerService = null;
    System.out.println("Entering getPortalStateManagerServiceURL " + portalStateManagerServiceHome);
    try {
    portalstateManagerService =portalStateManagerServiceHome.getPortalStateManagerService(new DemoServerContext(),
    new Locale("en","US"), null, false, false);
    System.out.println("Portal state manager service " + portalstateManagerService);
    final URLAccessorFactory urlFct = (URLAccessorFactory)portalstateManagerService.getAccessorFactory(URLAccessorFactory.class);
    ServerContext serverContext;

    // the URL should be based on the current request state
    final EngineURL url = urlFct.newURL( new DemoServerContext(),false,false,portalstateManagerService.newState(),null);

    final SelectionAccessorFactory selectionAccessorFactory =
    portalstateManagerService.getAccessorFactory(SelectionAccessorFactory.class);
    SelectionAccessorController selectionAccessorCOntroller =
    selectionAccessorFactory.getSelectionController(url.getState());
    selectionAccessorCOntroller.setSelection("com.webspherenotes.popup.static");


    final PortletAccessorFactory portletFct =
    (PortletAccessorFactory)portalstateManagerService.getAccessorFactory(PortletAccessorFactory.class);
    final PortletAccessorController portletCtrl =
    portletFct.getPortletController("com.webspherenotes.popup.control", url.getState());
    portletCtrl.getParameters().put("userName", new String[]{"portalStateManagerService"});


    String finalURL = url.toString();
    System.out.println("Portlet URL " + finalURL);
    return finalURL;

    } catch (StateManagerException e) {
    e.printStackTrace(System.out);
    } catch (UnknownAccessorTypeException e) {
    e.printStackTrace(System.out);
    } catch (CannotInstantiateAccessorException e) {
    e.printStackTrace(System.out);
    } catch (InvalidConstantException e) {
    e.printStackTrace(System.out);
    } catch (CannotCloneDocumentModelException e) {
    e.printStackTrace(System.out);
    } catch (CannotCreateDocumentException e) {
    e.printStackTrace(System.out);
    } catch (MissingUniqueNameException e) {
    e.printStackTrace(System.out);
    } catch (UnknownUniqueNameException e) {
    e.printStackTrace(System.out);
    } catch (CannotInsertSelectionNodeException e) {
    e.printStackTrace(System.out);
    }finally{
    if(portalstateManagerService != null)
    portalstateManagerService.dispose();
    }
    return null;
    }


    private String getPartionedURL(){
    PortalStateManagerService portalstateManagerService = null;
    System.out.println("Entering getPortalStateManagerServiceURL " + portalStateManagerServiceHome);
    try {
    portalstateManagerService =portalStateManagerServiceHome.getPortalStateManagerService(new DemoServerContext(),
    new Locale("en","US"), null, false, false);
    System.out.println("Portal state manager service " + portalstateManagerService);
    final URLAccessorFactory urlFct = (URLAccessorFactory)portalstateManagerService.getAccessorFactory(URLAccessorFactory.class);
    ServerContext serverContext;

    // the URL should be based on the current request state
    final EngineURL url = urlFct.newURL( new DemoServerContext(),false,false,portalstateManagerService.newState(),null);

    final SelectionAccessorFactory selectionAccessorFactory =
    portalstateManagerService.getAccessorFactory(SelectionAccessorFactory.class);
    SelectionAccessorController selectionAccessorCOntroller = selectionAccessorFactory.getSelectionController(url.getState());
    selectionAccessorCOntroller.setSelection("com.webspherenotes.popup.static");


    final PortletAccessorFactory portletFct =
    (PortletAccessorFactory)portalstateManagerService.getAccessorFactory(PortletAccessorFactory.class);
    final PortletAccessorController portletCtrl =
    portletFct.getPortletController("com.webspherenotes.popup.control", url.getState());
    portletCtrl.getParameters().put("userName", new String[]{"portalStateManagerService"});


    String finalURL = url.toString();
    System.out.println("Portlet URL " + finalURL);
    return finalURL;

    } catch (StateManagerException e) {
    e.printStackTrace(System.out);
    } catch (UnknownAccessorTypeException e) {
    e.printStackTrace(System.out);
    } catch (CannotInstantiateAccessorException e) {
    e.printStackTrace(System.out);
    } catch (InvalidConstantException e) {
    e.printStackTrace(System.out);
    } catch (CannotCloneDocumentModelException e) {
    e.printStackTrace(System.out);
    } catch (CannotCreateDocumentException e) {
    e.printStackTrace(System.out);
    } catch (MissingUniqueNameException e) {
    e.printStackTrace(System.out);
    } catch (UnknownUniqueNameException e) {
    e.printStackTrace(System.out);
    } catch (CannotInsertSelectionNodeException e) {
    e.printStackTrace(System.out);
    }finally{
    if(portalstateManagerService != null)
    portalstateManagerService.dispose();
    }
    return null;
    }
    }

    The PortalURLGenerationServlet class has two important methods

    1. getPortalPageURL(): This method is used for creating URL to page with unique name com.webspherenotes.popup.static. The SelectionAccessorController class is used for setting the portal page that you want to target

    2. getPortletURL(): This method is used for creating URL to com.webspherenotes.popup.static page on that page i do have Demo portlet and i did assign com.webspherenotes.popup.control unique name to the control element that contains the popup portlet, I am using PortletAccessorFactory for setting render parameters to this portlet



  • Make sure that the anonymous users have user rights to com.webspherenotes.popup.static page and the portlet, so that when that page opens it does not ask for user to login



After deploying my sample application i tried clicking on Portal URL button and this is the portal window that i get

1 comment:

Anonymous said...

the portlet u have in the example is JSR168? cause i implement the same thing, but somehow i can't retrieve the render parameter from the portlet