/******************************************************************************* * Copyright 2012 Pradeep Nambiar, Pexus LLC * * Source File: src/org/perf/utils/WebSpherePortletInfoGetterImpl.java * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. ******************************************************************************/ /* * Acknowledgement: * Part of code in this file is derived from example code from Sunil Pant's * WebSphere Portal blog at: * http://wpcertification.blogspot.com/2010/05/finding-out-unique-name-of-portlet-that.html * */ package org.perf.log.utils; import java.util.Iterator; import java.util.LinkedList; import java.util.List; import java.util.Locale; import javax.naming.InitialContext; import javax.naming.NamingException; import javax.portlet.PortletRequest; import javax.portlet.PortletResponse; import javax.portlet.filter.ActionRequestWrapper; import javax.portlet.filter.ActionResponseWrapper; import javax.portlet.filter.EventRequestWrapper; import javax.portlet.filter.EventResponseWrapper; import javax.portlet.filter.RenderRequestWrapper; import javax.portlet.filter.RenderResponseWrapper; import javax.portlet.filter.ResourceRequestWrapper; import javax.portlet.filter.ResourceResponseWrapper; import javax.servlet.ServletRequest; import javax.servlet.ServletRequestWrapper; import javax.servlet.ServletResponse; import javax.servlet.ServletResponseWrapper; import org.perf.log.logger.Logger; import org.perf.log.logger.LoggerFactory; import com.ibm.portal.ModelException; import com.ibm.portal.ObjectID; import com.ibm.portal.content.ContentModel; import com.ibm.portal.content.ContentNode; import com.ibm.portal.content.ContentPage; import com.ibm.portal.content.LayoutContainer; import com.ibm.portal.content.LayoutControl; import com.ibm.portal.content.LayoutModel; import com.ibm.portal.content.LayoutNode; import com.ibm.portal.model.ContentModelHome; import com.ibm.portal.model.NavigationSelectionModelHome; import com.ibm.portal.model.NavigationSelectionModelProvider; import com.ibm.portal.model.PortletModelHome; import com.ibm.portal.navigation.NavigationNode; import com.ibm.portal.navigation.NavigationSelectionModel; import com.ibm.portal.portletmodel.PortletDefinition; import com.ibm.portal.portletmodel.PortletModel; import com.ibm.portal.portletmodel.PortletWindow; public class WebSpherePortletInfoGetterImpl implements PortletInfoGetter { static Logger logger = LoggerFactory.getLogger("WebSpherePortletInfoGetterImpl"); private static ContentModelHome contentModelHome = null; private static NavigationSelectionModelHome navigationSelectionModelHome = null; private static PortletModelHome portletModelHome = null; static { try { InitialContext context = new InitialContext(); navigationSelectionModelHome = (NavigationSelectionModelHome) context .lookup(NavigationSelectionModelHome.JNDI_NAME); contentModelHome = (ContentModelHome) context .lookup(ContentModelHome.JNDI_NAME); portletModelHome = (PortletModelHome) context .lookup(PortletModelHome.JNDI_NAME); } catch (NamingException e) { logger.error(e.getMessage(), e); } } private static List getAllChildLayoutContainer(LayoutNode subtreeRoot, LayoutModel lm) throws ModelException { List aList = new LinkedList(); if (subtreeRoot instanceof LayoutContainer) { aList.add(subtreeRoot); Iterator itr = lm.getChildren(subtreeRoot); while (itr.hasNext()) { Object o = itr.next(); Iterator itr2 = getAllChildLayoutContainer((LayoutNode) o, lm) .iterator(); while (itr2.hasNext()) { Object o1 = itr2.next(); aList.add(o1); } } } return aList; } public static List getAllChildPortlets(LayoutNode subtreeRoot, LayoutModel lm) throws ModelException { List aList = new LinkedList(); if (subtreeRoot instanceof LayoutContainer) { Iterator itr = lm.getChildren(subtreeRoot); while (itr.hasNext()) { Object o = itr.next(); Iterator itr2 = getAllChildPortlets((LayoutNode) o, lm) .iterator(); while (itr2.hasNext()) { Object o1 = itr2.next(); aList.add(o1); } } } else { aList.add(subtreeRoot); } return aList; } private 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; } @Override public String getPageName(PortletRequest request, PortletResponse response) { ServletRequest servletRequest; ServletResponse servletResponse; if ((servletRequest = getServletRequest(request)) == null) return null; if ((servletResponse = getServletResponse(response)) == null) return null; try { NavigationSelectionModelProvider provider = navigationSelectionModelHome .getNavigationSelectionModelProvider(); NavigationSelectionModel model = provider .getNavigationSelectionModel(servletRequest, servletResponse); NavigationNode navigationNode = (NavigationNode) model .getSelectedNode(); ContentNode contentNode = navigationNode.getContentNode(); /************* * if (contentNode.getObjectID().getUniqueName() != null) { * logger.debug( * "###getPageTitle: The portlet is getting rendered on " + * contentNode.getObjectID().getUniqueName()); } else { * logger.debug( * "###getPageTitle: The portlet is getting rendered on " + * contentNode.getObjectID()); } *****************/ String pageTitle = contentNode.getTitle(request.getLocale()); if (pageTitle == null) { pageTitle = contentNode.getTitle(new Locale("en")); if (pageTitle == null) { pageTitle = contentNode.getObjectID().getUniqueName(); if (pageTitle == null) pageTitle = contentNode.getObjectID().toString(); } } return pageTitle; } catch (ModelException e) { logger .debug("###getPageTitle: Error in PageNameFilter.getPageTitle() " + e.getMessage()); } return null; } @Override public String getName(PortletRequest request, PortletResponse response) { ServletRequest servletRequest; ServletResponse servletResponse; if ((servletRequest = getServletRequest(request)) == null) return null; if ((servletResponse = getServletResponse(response)) == null) return null; try { if (navigationSelectionModelHome != null) { NavigationSelectionModelProvider provider = navigationSelectionModelHome .getNavigationSelectionModelProvider(); NavigationSelectionModel model = provider .getNavigationSelectionModel(servletRequest, servletResponse); ContentModel contentModel = contentModelHome .getContentModelProvider().getContentModel( servletRequest, servletResponse); NavigationNode navigationNode = (NavigationNode) model .getSelectedNode(); ContentNode contentNode = navigationNode.getContentNode(); ContentPage contentPage = (ContentPage) contentModel .getLocator().findByID(contentNode.getObjectID()); LayoutModel layoutModel = contentModel .getLayoutModel(contentPage); List portletList = getAllChildPortlets((LayoutNode) layoutModel .getRoot(), layoutModel); // logger.debug("####getPortletName:portletList.size=" + // portletList.size()); String nameSpaceStr = response.getNamespace(); // logger.debug("####getPortletName:nameSpaceStr=" + // nameSpaceStr); String nameSpacePortletId = nameSpaceStr.substring(3); // logger.debug("####getPortletName:nameSpacePorteletId=" + // nameSpacePortletId); nameSpacePortletId = nameSpacePortletId.substring(0, nameSpacePortletId.length() - 1); // logger.debug("####getPortletName:nameSpacePorteletId=" + // nameSpacePortletId); for (int i = 0; i < portletList.size(); i++) { LayoutControl container = (LayoutControl) portletList .get(i); String currentWindowObjectId = getObjectIDStr(container .getObjectID()); // logger.debug("####getPortletName:currentWindowObjectId=" // + currentWindowObjectId); if (nameSpacePortletId.equals(currentWindowObjectId)) { String portletName = getPortletName(servletRequest, servletResponse, contentPage, container); // logger.debug("####getPortletName:portletName=" + // portletName); return portletName; } } } } catch (ModelException e) { logger.error("Error in RequestResponseUtils.getPortletName() " + e.getMessage(), e); } // logger.debug("####getPortletName:returning null"); return null; } private static String getPortletName(ServletRequest request, ServletResponse response, ContentPage contentPage, LayoutControl layoutControl) { try { PortletModel portletModel = portletModelHome .getPortletModelProvider().getPortletModel(contentPage, request, response); PortletWindow portletWindow = portletModel .getPortletWindow(layoutControl); // logger.debug("portletWindow = " + portletWindow); PortletDefinition portletDefinition = portletModel .getPortletDefinition(portletWindow); // logger.debug("portletDefinition = " + portletDefinition); // logger.debug("portletName (getObjectID) = " + // portletDefinition.getObjectID().toString()); // logger.debug("portletName (uniqueName) = " + // portletDefinition.getObjectID().getUniqueName()); Locale enLocale = new Locale("en"); // logger.debug("portletName (getDescription) = " + // portletDefinition.getDescription(enLocale)); // logger.debug("portletName (getTitle) = " + // portletDefinition.getTitle(enLocale)); if (portletDefinition.getObjectID().getUniqueName() != null) return portletDefinition.getObjectID().getUniqueName(); else if (portletDefinition.getTitle(enLocale) != null) return portletDefinition.getTitle(enLocale); else return portletDefinition.getObjectID().toString(); } catch (ModelException e) { logger.error("Error in getPortletName() " + e.getMessage(), e); } return null; } private static ServletRequest getServletRequest(PortletRequest request) { if (request instanceof ServletRequest) return (ServletRequest) request; else if (request instanceof ServletRequestWrapper) return ((ServletRequestWrapper) request).getRequest(); else if (request instanceof ActionRequestWrapper) return (ServletRequest) ((ActionRequestWrapper) request) .getRequest(); else if (request instanceof RenderRequestWrapper) return (ServletRequest) ((RenderRequestWrapper) request) .getRequest(); else if (request instanceof ResourceRequestWrapper) return (ServletRequest) ((ResourceRequestWrapper) request) .getRequest(); else if (request instanceof EventRequestWrapper) return (ServletRequest) ((EventRequestWrapper) request) .getRequest(); else return null; } private static ServletResponse getServletResponse(PortletResponse response) { if (response instanceof ServletResponse) return (ServletResponse) response; else if (response instanceof ServletResponseWrapper) return ((ServletResponseWrapper) response).getResponse(); else if (response instanceof ActionResponseWrapper) return (ServletResponse) ((ActionResponseWrapper) response) .getResponse(); else if (response instanceof RenderResponseWrapper) return (ServletResponse) ((RenderResponseWrapper) response) .getResponse(); else if (response instanceof ResourceResponseWrapper) return (ServletResponse) ((ResourceResponseWrapper) response) .getResponse(); else if (response instanceof EventResponseWrapper) return (ServletResponse) ((EventResponseWrapper) response) .getResponse(); else return null; } }