com.ibm.portal.navigation package defines the navigation model (NavigationModel) which represents a view on content model used for navigation. As described in section "The sub package com.ibm.portal.content", the topology of the navigation model currently corresponds with that of the content model - each node in the content model has an equivalent navigation node at the same hierarchical level.
The elements of the navigation model are NavigationNodes. Each such node can reference a ContentNode. The navigation nodes have a title that is provided through the Localized interface.
In this example, i am displaying all portal pages with url.
Sample Code:
package com.ibm.mynavigationmodelprovider;
import java.io.*;
import java.util.*;
import javax.naming.Context;
import javax.naming.InitialContext;
import javax.naming.NameNotFoundException;
import javax.naming.NamingException;
import javax.portlet.*;
import com.ibm.portal.MetaData;
import com.ibm.portal.ModelException;
import com.ibm.portal.ObjectID;
import com.ibm.portal.ObjectNotFoundException;
import com.ibm.portal.content.ContentNode;
import com.ibm.portal.identification.Identification;
import com.ibm.portal.model.LocalizedStringResolver;
import com.ibm.portal.navigation.NavigationModel;
import com.ibm.portal.navigation.NavigationNode;
import com.ibm.portal.portlet.service.PortletServiceHome;
import com.ibm.portal.portlet.service.model.NavigationModelProvider;
import com.ibm.portal.serialize.SerializationException;
import com.ibm.portal.state.EngineURL;
import com.ibm.portal.state.PortletStateManager;
import com.ibm.portal.state.URLFactory;
import com.ibm.portal.state.accessors.selection.SelectionAccessorController;
import com.ibm.portal.state.accessors.selection.SelectionAccessorFactory;
import com.ibm.portal.state.service.PortletStateManagerService;
/**
* A sample portlet based on GenericPortlet
*/
public class MyNavigationModelProviderPortlet extends GenericPortlet {
public static final String JSP_FOLDER = "/_MyNavigationModelProvider/jsp/"; // JSP folder name
public static final String VIEW_JSP = "MyNavigationModelProviderPortletView"; // JSP file name to be rendered on the view mode
PortletServiceHome psh;
private Identification idSvc;
public static LocalizedStringResolver localizedStringResolver=null;
protected PortletStateManagerService service;
private static final String JNDI_NAME =
"portletservice/com.ibm.portal.state.service.PortletStateManagerService";
/**
* @see javax.portlet.Portlet#init()
*/
public void init() throws PortletException{
super.init();
try {
Context ctx = new InitialContext();
psh = (PortletServiceHome) ctx.lookup(NavigationModelProvider.JNDI_NAME);
idSvc = (Identification)ctx.lookup(Identification.JNDI_NAME);
localizedStringResolver= (LocalizedStringResolver)ctx.lookup("portal:service/model/LocalizedStringResolver");
final PortletServiceHome serviceHome = (PortletServiceHome)ctx.lookup(JNDI_NAME);
service = (PortletStateManagerService)
serviceHome.getPortletService(PortletStateManagerService.class);
} catch(NameNotFoundException ex) {
ex.printStackTrace();
} catch (NamingException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
/**
* Serve up the <code>view</code> mode.
*
* @see javax.portlet.GenericPortlet#doView(javax.portlet.RenderRequest, javax.portlet.RenderResponse)
*/
public void doView(RenderRequest request, RenderResponse response) throws PortletException, IOException {
// Set the MIME type for the render response
response.setContentType(request.getResponseContentType());
NavigationModelProvider provider = (NavigationModelProvider) psh.getPortletService(NavigationModelProvider.class);
try {
NavigationModel model = provider.getNavigationModel(request, response);
NavigationNode root = (NavigationNode) model.getRoot();
ArrayList<Item> pages=new ArrayList<Item>();
pages.clear();
addChildren(root, model, pages, request, 0,response);
request.setAttribute("result", pages);
}
catch (ModelException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
// Invoke the JSP to render
PortletRequestDispatcher rd = getPortletContext().getRequestDispatcher(getJspFilePath(request, VIEW_JSP));
rd.include(request,response);
}
// TODO Auto-generated method stub
/**
* @param root
* @param navigationModel
* @param pageGroups
* @throws Exception
*/
private void addChildren(NavigationNode node,
NavigationModel navigationModel, ArrayList pages, PortletRequest request,
int level,PortletResponse response) throws Exception {
Iterator i = navigationModel.getChildren(node);
if (i != null) {
while (i.hasNext()) {
boolean bDoNotDisplay = false;
NavigationNode n = (NavigationNode) i.next();
ContentNode content = n.getContentNode();
if (content instanceof MetaData) {
MetaData md = (MetaData) content;
Object hiddenAttr = md.getValue("hidden");
if (hiddenAttr != null
&& "Yes".equalsIgnoreCase(hiddenAttr.toString())) {
bDoNotDisplay = true;
}
}
if (!bDoNotDisplay) {
StringBuffer title = new StringBuffer(localizedStringResolver.getTitle(n, request.getLocales()));
String uniqueName = null;
if (n.getContentNode() != null
&& n.getContentNode().getObjectID() != null
&& n.getContentNode().getObjectID().getUniqueName() != null) {
uniqueName = n.getContentNode().getObjectID()
.getUniqueName();
}
if (uniqueName != null) {
String url=createPageURL(uniqueName, request, response);
pages.add(new Item(url, title.toString()));
}
}
if (navigationModel.getChildren(n) != null) {
addChildren(n, navigationModel, pages, request, level + 1,response);
}
}
}
}
/**
* SelectionAccessorFactory:
* Provides accessors to read and write portal page selection information.
* Use the SelectionAccessorController to create a URL to another portal page.
*/
public String createPageURL(final String uniquepagename,PortletRequest request, PortletResponse response) throws Exception {
// get the needed factories
URLFactory urlFactory=null;
SelectionAccessorController selCtrl=null;
try{
PortletStateManager manager = service.getPortletStateManager(request, response);
urlFactory = manager.getURLFactory();
EngineURL url=urlFactory.newURL(null);
SelectionAccessorFactory selFct = (SelectionAccessorFactory)manager.getAccessorFactory(SelectionAccessorFactory.class);
selCtrl = selFct.getSelectionAccessorController(url.getState());
selCtrl.setSelection(uniquepagename);
return url.writeDispose(new StringWriter()).toString();
}
catch(Exception e)
{
e.printStackTrace();
throw e;
}
finally
{
if(null !=selCtrl)selCtrl.dispose();
if(null !=urlFactory)urlFactory.dispose();
}
}
/**
* Returns JSP file path.
*
* @param request Render request
* @param jspFile JSP file name
* @return JSP file path
*/
private static String getJspFilePath(RenderRequest request, String jspFile) {
String markup = request.getProperty("wps.markup");
if( markup == null )
markup = getMarkup(request.getResponseContentType());
return JSP_FOLDER + markup + "/" + jspFile + "." + getJspExtension(markup);
}
/**
* Convert MIME type to markup name.
*
* @param contentType MIME type
* @return Markup name
*/
private static String getMarkup(String contentType) {
if( "text/vnd.wap.wml".equals(contentType) )
return "wml";
else
return "html";
}
/**
* Returns the file extension for the JSP file
*
* @param markupName Markup name
* @return JSP extension
*/
private static String getJspExtension(String markupName) {
return "jsp";
}
}
ScreenShot:
Click here to download sample code
Hi,why NavigationModelProvider.JNDI_NAME can not be resolved? thanks
ReplyDeletewhich version server u are using.
ReplyDeleteHi, I am getting the same error 'NavigationModelProvider.JNDI_NAME can not be resolved'. I am using Websphere Portal Server 6.1
ReplyDeleteIt will work on portal 7 and 8 ... try it
ReplyDelete