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- 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 - getPortletURL(): This method is used for creating URL to
com.webspherenotes.popup.staticpage on that page i do have Demo portlet and i did assigncom.webspherenotes.popup.controlunique name to the control element that contains the popup portlet, I am using PortletAccessorFactory for setting render parameters to this portlet
- getPortalPageURL(): This method is used for creating URL to page with unique name
- Make sure that the anonymous users have user rights to
com.webspherenotes.popup.staticpage 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:
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
Post a Comment