Showing posts with label portalspi. Show all posts
Showing posts with label portalspi. Show all posts

RedirectURLGeneratorFactory Service

WebSphere Portal SPI has a RedirectURLGeneratorFactoryService that can be called only from the processAction() method and used for creating URLs to either portal page or portlet. So far if i wanted to create a URL pointing to a page, only method that i knew was to create a URL mapping and then redirect to that URL

I wanted to try how RedirectURLGeneratorFactoryService works so i created a sample portlet that makes use of this service for redirecting to either a page or portlet, you can download the sample code from here

Important Note: I could use the RedirectURLGeneratorFactoryService to create URL to page and that worked but i am not able to get it working to target a portlet, I am not sure if its because i am not using it right or this is a issue with the WPS 6.1.5 version that i am using

This is how my RedirectServicePortlet.java looks like

package com.webspherenotes.portlet;

import java.io.IOException;

import javax.naming.CompositeName;
import javax.naming.InitialContext;
import javax.naming.InvalidNameException;
import javax.naming.Name;
import javax.naming.NamingException;
import javax.portlet.ActionRequest;
import javax.portlet.ActionResponse;
import javax.portlet.GenericPortlet;
import javax.portlet.PortletException;
import javax.portlet.PortletRequest;
import javax.portlet.PortletResponse;
import javax.portlet.RenderRequest;
import javax.portlet.RenderResponse;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;

import com.ibm.portal.ModelException;
import com.ibm.portal.ObjectID;
import com.ibm.portal.content.ContentModel;
import com.ibm.portal.content.ContentPage;
import com.ibm.portal.content.LayoutControl;
import com.ibm.portal.content.LayoutModel;
import com.ibm.portal.model.ContentModelHome;
import com.ibm.portal.model.PortletModelHome;
import com.ibm.portal.portlet.service.PortletServiceHome;
import com.ibm.portal.portlet.service.state.RedirectURLGeneratorFactoryService;
import com.ibm.portal.portletmodel.PortletModel;
import com.ibm.portal.portletmodel.PortletWindow;
import com.ibm.portal.state.EngineURL;
import com.ibm.portal.state.RedirectURLGenerator;
import com.ibm.portal.state.exceptions.StateException;

public class RedirectServicePortlet extends GenericPortlet {

RedirectURLGeneratorFactoryService redirectionURLGeneratorFactoryService;

ContentModelHome contentModelHome;
PortletModelHome portletModelHome;

public void init() throws PortletException {
System.out.println("Entering RedirectServicePortlet.init()");
try {
InitialContext ctx = new InitialContext();
final PortletServiceHome redirectServiceHome = (PortletServiceHome) ctx
.lookup("portletservice/com.ibm.portal.portlet.service.state.RedirectURLGeneratorFactoryService");
redirectionURLGeneratorFactoryService = (RedirectURLGeneratorFactoryService) redirectServiceHome
.getPortletService(RedirectURLGeneratorFactoryService.class);

contentModelHome = (ContentModelHome) ctx
.lookup(ContentModelHome.JNDI_NAME);
portletModelHome = (PortletModelHome) ctx
.lookup(PortletModelHome.JNDI_NAME);
} catch (NamingException e) {
e.printStackTrace(System.out);
}
System.out.println("Exiting RedirectServicePortlet.init()");
}

protected void doView(RenderRequest request, RenderResponse response)
throws PortletException, IOException {
System.out.println("Entering RedirectServicePortlet.doView()");
response.setContentType("text/html");
getPortletContext().getRequestDispatcher("/index.jsp").include(request,
response);
System.out.println("Exiting RedirectServicePortlet.doView()");

}

public void processAction(ActionRequest request, ActionResponse response)
throws PortletException, IOException {
System.out.println("Entering RedirectServicePortlet.processAction()");
try {
RedirectURLGenerator redirectURLGenerator = redirectionURLGeneratorFactoryService
.getURLGenerator(request, response);
if(request.getParameter("action").equals("portlet")){
ObjectID portletWindowObjectId = getPortletWindowID(request, response,
"com.webspherenotes.popup.static", "com.webspherenotes.popup.control");
System.out.println("Control object Id " + portletWindowObjectId);
EngineURL portletRedirectURL = redirectURLGenerator
.createPortletURL(portletWindowObjectId);
System.out.println("After creating URL " + portletRedirectURL.toString());
response.sendRedirect(portletRedirectURL.toString());
}else{
ObjectID pageObjectId = getObjectID("com.webspherenotes.popup.static");
EngineURL pageRedirectURL = redirectURLGenerator.createPageURL(pageObjectId);
System.out.println("After creating URL " + pageRedirectURL.toString());
response.sendRedirect(pageRedirectURL.toString());
}

} catch (StateException e) {
e.printStackTrace(System.out);
}
System.out.println("Exiting RedirectServicePortlet.processAction()");
}

private ObjectID getPortletWindowID(PortletRequest request,
PortletResponse response, String pageUniqueName,
String controlUniqueName) {
try {
ContentModel contentModel = contentModelHome
.getContentModelProvider().getContentModel(
(ServletRequest) request,
(ServletResponse) response);
ContentPage contentPage = (ContentPage) contentModel.getLocator()
.findByUniqueName(pageUniqueName);
System.out.println("Content Page " + contentPage);
LayoutModel layoutModel = contentModel.getLayoutModel(contentPage);
LayoutControl layoutControl = (LayoutControl) layoutModel
.getLocator().findByUniqueName(controlUniqueName);
System.out.println("Layout Control " + layoutControl);
PortletModel portletModel = portletModelHome
.getPortletModelProvider().getPortletModel(contentPage,
(ServletRequest) request,
(ServletResponse) response);
PortletWindow portletWindow = portletModel
.getPortletWindow(layoutControl);
System.out.println("Porltet Window " + portletWindow);
return portletWindow.getObjectID();
} catch (ModelException e) {
e.printStackTrace();
}
return null;
}

private ObjectID getObjectID(String uniqueNameStr) {
try {
InitialContext ctx = new InitialContext();
final Name uniqueName = new CompositeName("portal:uniquename");
uniqueName.add(uniqueNameStr);
ObjectID oidForUniqueName = (ObjectID) ctx.lookup(uniqueName);
return oidForUniqueName;
} catch (InvalidNameException e) {
e.printStackTrace(System.out);
} catch (NamingException e) {
e.printStackTrace(System.out);
}
return null;
}
}


In the doView() method of the portlet i am forwarding control to a JSP that displays two actionURLs, when user clicks on either of this URL the control will go to processAction() method and in side that method i check if name of the action parameter is page, i am getting ObjectID of a page which has uniquename com.webspherenotes.popup.static, then calling redirectURLGenerator.createPageURL(pageObjectId); method to create redirect URL to the page. Finally i am calling ActionResponse.sendRedirect() method to redirect to the page URL,

If you click other Redirect to portlet then the processAction() method will try to find a PortletWindow for a com.webspherenotes.popup.control LayoutControl on the com.webspherenotes.popup.static page. Then i am calling redirectURLGenerator.createPortletURL(portletWindowObjectId) method for creating URL to a portlet on a page and then redirecting it. THe URL is getting created but clicking on it does not redirect

Generic method to get ObjectID from unique Name

When your using Portal SPI or POrtal Controller SPI to either read portal information or modify it, you will notice that most of the methods take com.ibm.portal.ObjectID as argument. So far i used object specific methods to get the ObjectID from unique name

But it seems that you can use the following method to look up ObjectID from JNDI COntext


private ObjectID getObjectID(String uniqueNameStr){
try {
InitialContext ctx = new InitialContext();
final Name uniqueName = new CompositeName("portal:uniquename");
uniqueName.add(uniqueNameStr);
ObjectID oidForUniqueName = (ObjectID) ctx.lookup(uniqueName);
return oidForUniqueName;
} catch (InvalidNameException e) {
e.printStackTrace(System.out);
} catch (NamingException e) {
e.printStackTrace(System.out);
}
return null;
}


You can call this method with unique name of either page, portlet or navigation node and it will return you the instance of com.ibm.portal.ObjectID for that unique name.

I tried calling it for a page, portlet and Portlet Window like this

protected void doView(RenderRequest request, RenderResponse response)
throws PortletException, IOException {
System.out.println("Entering DynamicUIPortlet.doView()");
PrintWriter out = response.getWriter();
out.println("com.webspherenotes.popup.static " +
getObjectID("com.webspherenotes.popup.static") +"
");
out.println("com.webspherenotes.popup.control " +
getObjectID("com.webspherenotes.popup.control") +"
");
out.println("com.webspherenotes.popup.portlet " +
getObjectID("com.webspherenotes.popup.portlet") +"
");
System.out.println("Exiting DynamicUIPortlet.doView()");
}


I am calling the getObjectID() method with different unique names and printing output in the doView() method this is what i get

Querying data about your environment

You can use the AdminPortletModel interface to find out more information about your portal installation, things like what all Web applications are installed on your portal, the PortletDefintions means all the portlets installed on your portal. I built this sample portlet to demonstrate that


package com.wpcertification.spi;

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

import javax.naming.InitialContext;
import javax.naming.NamingException;
import javax.portlet.GenericPortlet;
import javax.portlet.PortletException;
import javax.portlet.RenderRequest;
import javax.portlet.RenderResponse;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import com.ibm.portal.ModelException;
import com.ibm.portal.model.PortletModelHome;
import com.ibm.portal.portletmodel.PortletDefinition;
import com.ibm.portal.portletmodel.WebApplication;
import com.ibm.portal.portletmodel.admin.AdminPortletModel;
import com.ibm.portal.portletmodel.admin.PortletDefinitionList;
import com.ibm.portal.portletmodel.admin.WebApplicationList;

public class PortletDeflistPortlet extends GenericPortlet{

PortletModelHome portletModelHome;

public void init() throws PortletException {
System.out.println("Entering PortalPOCPortlet.init()");
try {
InitialContext context = new InitialContext();
portletModelHome =(PortletModelHome) context.lookup("portal:service/model/PortletModel");
System.out.println("PortletModelHome " + portletModelHome);
} catch (NamingException e) {
e.printStackTrace(System.out);
}
System.out.println("Entering PortalPOCPortlet.init()");
}

protected void doView(RenderRequest request, RenderResponse response)
throws PortletException, IOException {
response.setContentType("text/html");
response.getWriter().println("**************** Portlet Web Applications ************
");
printPortletApplicationList(request,response);
response.getWriter().println("**************** Portlet Definitions ************
");

printPortletDefinitionList(request,response);
response.getWriter().println("**********************************************************************
");
}

public void printPortletApplicationList(RenderRequest request, RenderResponse response){
System.out.println("Entering PortalPOCPortlet.getObjectIdOfPortlet()");
try {
AdminPortletModel adminModel = portletModelHome.getPortletModelProvider().getAdminPortletModel((HttpServletRequest)request, (HttpServletResponse)response);
WebApplicationList webApplicationList = adminModel.getWebApplicationList();

Iterator webAppIt = webApplicationList.iterator();
while(webAppIt.hasNext()){
WebApplication webApplication = (WebApplication)webAppIt.next();
response.getWriter().println(webApplication.getObjectID() +" " +webApplication.getContextRoot() +"
");
}
} catch (ModelException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
System.out.println("Exiting PortalPOCPortlet.getObjectIdOfPortlet()");
}

public void printPortletDefinitionList(RenderRequest request, RenderResponse response){
System.out.println("Entering PortalPOCPortlet.getObjectIdOfPortlet()");
try {
AdminPortletModel adminModel = portletModelHome.getPortletModelProvider().getAdminPortletModel((HttpServletRequest)request, (HttpServletResponse)response);
PortletDefinitionList portletDefinitionList = adminModel.getPortletDefinitionList();

Iterator portletDefinitionIt = portletDefinitionList.iterator();
while(portletDefinitionIt.hasNext()){
PortletDefinition portletDefinition = portletDefinitionIt.next();
response.getWriter().println(portletDefinition.getObjectID().toString() +" " + portletDefinition.getObjectID().getUniqueName() +" " + portletDefinition.getTitle(new Locale("en","US"))+" " + portletDefinition.getDescription(new Locale("en","US")) +"
");
}
} catch (ModelException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
System.out.println("Exiting PortalPOCPortlet.getObjectIdOfPortlet()");
}

}

Finding uniqueName from ObjectId of the portlet and other way round

When your working with Portal Model then you might need a way to figure out unique name of the portlet from its ObjectId and other way. I built this POC to do that. In


import java.io.IOException;
import java.util.Iterator;

import javax.naming.InitialContext;
import javax.naming.NamingException;
import javax.portlet.GenericPortlet;
import javax.portlet.PortletException;
import javax.portlet.PortletRequest;
import javax.portlet.PortletResponse;
import javax.portlet.RenderRequest;
import javax.portlet.RenderResponse;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import com.ibm.portal.ModelException;
import com.ibm.portal.ObjectID;
import com.ibm.portal.model.PortletModelHome;
import com.ibm.portal.portletmodel.PortletDefinition;
import com.ibm.portal.portletmodel.admin.AdminPortletModel;
import com.ibm.portal.portletmodel.admin.PortletDefinitionList;

public class PortletUniqueNamePortlet extends GenericPortlet{
PortletModelHome portletModelHome;

public void init() throws PortletException {
System.out.println("Entering PortalPOCPortlet.init()");
try {
InitialContext context = new InitialContext();
portletModelHome =(PortletModelHome) context.lookup("portal:service/model/PortletModel");
System.out.println("PortletModelHome " + portletModelHome);
} catch (NamingException e) {
e.printStackTrace(System.out);
}
System.out.println("Entering PortalPOCPortlet.init()");
}

protected void doView(RenderRequest request, RenderResponse response)
throws PortletException, IOException {
response.setContentType("text/html");
response.getWriter().println("Object Id of the sitemap portlet " + getObjectIdOfPortlet(request, response, "wps.p.Sitemap"));
response.getWriter().println("
Unique Name of the sitemap portlet " + getUniqueNameOfPortlet(request, response, getObjectIDStr(getObjectIdOfPortlet(request, response, "wps.p.Sitemap"))));

}

public static String getObjectIDStr(ObjectID objectID){
String temp = objectID.toString();
int firstInd = temp.indexOf("'");
String result = temp.substring(firstInd+1, temp.indexOf("'", firstInd+1 ));
return result;
}

public ObjectID getObjectIdOfPortlet(PortletRequest request, PortletResponse response, String portletUniqueName){
System.out.println("Entering PortalPOCPortlet.getObjectIdOfPortlet()");
try {
AdminPortletModel adminModel = portletModelHome.getPortletModelProvider().getAdminPortletModel((HttpServletRequest)request, (HttpServletResponse)response);
PortletDefinition portletDef = adminModel.getPortletDefinitionList().getLocator().findByUniqueName(portletUniqueName);
return portletDef.getObjectID();
} catch (ModelException e) {
e.printStackTrace();
}
System.out.println("Exiting PortalPOCPortlet.getObjectIdOfPortlet()");
return null;
}

public String getUniqueNameOfPortlet(PortletRequest request, PortletResponse response, String portletObjectId){
System.out.println("Entering PortalPOCPortlet.getUniqueNameOfPortlet()");
try {
AdminPortletModel adminModel = portletModelHome.getPortletModelProvider().getAdminPortletModel((HttpServletRequest)request, (HttpServletResponse)response);
PortletDefinitionList portletDefinitionList = adminModel.getPortletDefinitionList();
Iterator portletDefinitionIterator = portletDefinitionList.iterator();
while(portletDefinitionIterator.hasNext()){
PortletDefinition portletDefinition = portletDefinitionIterator.next();
String currentObjectIdStr = getObjectIDStr(portletDefinition.getObjectID());
if(currentObjectIdStr.equals(portletObjectId)){
return portletDefinition.getObjectID().getUniqueName();
}
}
} catch (ModelException e) {
e.printStackTrace();
}
System.out.println("Not able to find portlet for given portletObjectId");
return null;
}
}