Wednesday, 22 October 2014

Exploring Controller SPI in websphere portal8.0

Controller SPI :-  It is an enhancment for Model SPI where controller api can write information to persistence database but Model SPI cannot do it.

The resources that are exposed by the controller can be modified through specific interfaces which match their read-only counterparts. For an example, refer to the following class list:
Classes from the read-only model . . .. . . are reflected in the Controller SPI by the following classes
ContentNode
  • MarkupCapable
  • Localized
  • Identifiable
  • ActiveFlag
ModifiableContentNode
  • ModifiableMarkupCapable
  • ModifiableLocalized
  • ModifiableIdentifiable
  • ModifiableActiveFlag
Controllers available in Controller SPI :-

ContentModelProvider :- To obtain a ContentModelController, perform a lookup for the string ContentModelControllerHome.CONTENT_MODEL_CONTROLLER_JNDI_NAME.
LayoutModelProvider :- cannot be obtained via a JNDI lookup. You obtain it through its associated ContentModelController.
PortletModelprovider :- To obtain a ContentModelController, perform a lookup for the string PortletModelControllerHome.PORTLET_MODEL_CONTROLLER_JNDI_NAME

Example for combination of ContentModel and LayoutModel provider {Using below code you can add a portlet to a page}:-



package com.ibm.modelspiportlet;

import java.io.*;
import java.util.*;
import java.util.logging.Logger;

import javax.naming.CompositeName;
import javax.naming.Context;
import javax.naming.InitialContext;
import javax.naming.Name;
import javax.portlet.*;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;

import com.ibm.portal.Locator;
import com.ibm.portal.ModelException;
import com.ibm.portal.Modifiable;
import com.ibm.portal.ObjectID;
import com.ibm.portal.content.ContentModel;
import com.ibm.portal.content.ContentModelController;
import com.ibm.portal.content.ContentPage;
import com.ibm.portal.content.LayoutContainer;
import com.ibm.portal.content.LayoutControl;
import com.ibm.portal.content.LayoutControlCreationContext;
import com.ibm.portal.content.LayoutModelController;
import com.ibm.portal.content.ModifiableLayoutNode;
import com.ibm.portal.identification.Identification;
import com.ibm.portal.model.ContentModelHome;
import com.ibm.portal.model.ContentModelProvider;
import com.ibm.portal.portlet.service.model.PortletModelProvider;
import com.ibm.portal.model.controller.ContentModelControllerHome;
import com.ibm.portal.model.controller.CreationContextBuilderFactory;
import com.ibm.portal.portlet.service.PortletServiceHome;
import com.ibm.portal.portletmodel.PortletDefinition;
import com.ibm.portal.portletmodel.admin.AdminPortletModel;
import com.ibm.portal.portletmodel.admin.PortletDefinitionList;
import com.ibm.ws.portletcontainer.portlet.PortletUtils;
import com.ibm.ws.portletcontainer.util.PortletModelHelper;

/**
 * A sample portlet based on GenericPortlet
 */
public class ModelSpiPortlet5Portlet extends GenericPortlet {

public static final String JSP_FOLDER    = "/_ModelSpiPortlet5/jsp/";    // JSP folder name

public static final String VIEW_JSP      = "ModelSpiPortlet5PortletView";  

public static final Logger logger = Logger.getLogger(ModelSpiPortlet5Portlet.class.getName());

// JSP file name to be rendered on the view mode
ContentModelHome home = null;
ContentModelControllerHome homeCtrl = null;
PortletServiceHome psh = null;
Identification idf = null;
ObjectID portletDefOID = null;

/**
* @see javax.portlet.Portlet#init()
*/
public void init() throws PortletException{
super.init();
try {
Context ictx = new InitialContext();
//get content model so that we can retrieve layout model
home = (ContentModelHome)ictx.lookup("portal:service/model/ContentModel");
//get portlet service home
psh = (PortletServiceHome) ictx.lookup(PortletModelProvider.JNDI_NAME);
idf = (Identification)ictx.lookup(Identification.JNDI_NAME);

//Logic to lookup for the portlet objectId
Name portletName = new CompositeName("portal:config/portletdefinition");
//<portlet-app id=/> pick this id 
portletName.add("com.ibm.modelspiportlet.ModelSpiPortlet.1d8fd6a194");
//<portlet-name/> pick this from portlet .xml
portletName.add("DisplayPortlet");
portletDefOID = (ObjectID) ictx.lookup(portletName);
}
catch(Exception e)
{
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());

// Invoke the JSP to render
PortletRequestDispatcher rd = getPortletContext().getRequestDispatcher(getJspFilePath(request, VIEW_JSP));
rd.include(request,response);
}

/**
* Process an action request.
* @see javax.portlet.Portlet#processAction(javax.portlet.ActionRequest, javax.portlet.ActionResponse)
*/
public void processAction(ActionRequest request, ActionResponse response) throws PortletException, java.io.IOException {
//Retrieve ContentModelController object
ContentModelController ctrl = null;
ContentModel contentmodel = null;
try{
if (home != null
{
ContentModelProvider provider = home.getContentModelProvider();
contentmodel =provider.getContentModel((ServletRequest) PortletUtils.getHttpServletRequest(request), (ServletResponse) PortletUtils.getHttpServletResponse(response));
}
//Get controller model provider
Context ictx = new InitialContext();
homeCtrl = (ContentModelControllerHome)
ictx.lookup(ContentModelControllerHome.CONTENT_MODEL_CONTROLLER_JNDI_NAME);
if (homeCtrl != null
{
ctrl = homeCtrl.getContentModelControllerProvider().createContentModelController(contentmodel);
}
//Now we got controller object to access content model now we will retrieve controller for layout model controller.
ContentPage Page = (ContentPage)ctrl.getLocator().findByUniqueName("inter.page");
LayoutModelController  lmController=ctrl.getLayoutModelController(Page);
//Retrieve Portlet model provider
PortletModelProvider provider = (PortletModelProvider) psh.getPortletService(PortletModelProvider.class);
AdminPortletModel model = provider.getAdminPortletModel(request, response);
//Now we have to add portlet to above page
CreationContextBuilderFactory factory = CreationContextBuilderFactory.getInstance();
LayoutControlCreationContext context = factory.newLayoutControlCreationContext(getPortletDefinitionByOID(model), null);
//Insert portlet to a page
Modifiable control = lmController.create(LayoutControl.class, context);
lmController.insert(control, null, null);

// commit the content model controller. If you commit content model layout model will be also commented
ctrl.commit();
}catch(Exception exp){
exp.printStackTrace();
}
}

public PortletDefinition getPortletDefinitionByOID (AdminPortletModel pModel) throws ModelException {
//get the definition list
PortletDefinitionList pdList = pModel.getPortletDefinitionList();
//Now get locator to find the portlet
Locator pdLocator = pdList.getLocator();
PortletDefinition portletDefinition =
(PortletDefinition)pdLocator.findByID(portletDefOID);
logger.info("title:-"+portletDefinition.getTitle(Locale.ENGLISH));
return portletDefinition;
}

/**
* 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";
}


}

No comments:

Post a Comment

Custom single threaded java server

 package com.diffengine.csv; import java.io.*; import java.net.*; import java.util.Date; public class Server { public static void main(Str...