Friday, June 24, 2011

Accessing Query String parameter in WebSphere Portal with Dynacache

1) Create a jar of below class

import com.ibm.websphere.cache.DistributedMap;
import java.io.IOException;
import java.util.Enumeration;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.naming.InitialContext;
import javax.naming.NamingException;
import javax.servlet.*;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;

public class ParameterFilter
implements Filter
{

public static final String PARAMETER_PREFIX = "param.";
public static final String DYNACACHE_NAME = "services/cache/catalog/parameters";
public static final Logger logger = Logger.getLogger(com/ibm/catalog/servlet/filter/ParameterFilter.getName());
private DistributedMap map;

public ParameterFilter()
{
map = null;
}

public void init(FilterConfig arg0)
throws ServletException
{
try
{
InitialContext ic = new InitialContext();
map = (DistributedMap)ic.lookup("services/cache/catalog/parameters");
ic.close();
}
catch(NamingException ne)
{
logger.log(Level.SEVERE, "NamingException error", ne);
}
}

public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
throws IOException, ServletException
{
HttpServletRequest httpRequest = (HttpServletRequest)request;
HttpSession session = httpRequest.getSession();
Enumeration parms = httpRequest.getParameterNames();
if(logger.isLoggable(Level.INFO))
logger.log(Level.INFO, "Parameter prefix: param.");
while(parms.hasMoreElements())
{
String key = (String)parms.nextElement();
if(key != null && key.startsWith("param."))
{
String cleanKey = key.substring("param.".length());
StringBuffer sb = new StringBuffer(cleanKey);
String values[] = httpRequest.getParameterValues(key);
sb.append(".count");
map.put(sb.toString(), (new Integer(values.length)).toString());
for(int i = 0; i < values.length; i++)
{
sb = new StringBuffer(cleanKey);
sb.append(".");
sb.append((new Integer(i)).toString());
sb.append(".");
sb.append(session.getId());
map.put(sb.toString(), values[i]);
if(logger.isLoggable(Level.INFO))
logger.log(Level.INFO, (new StringBuilder("Parameter Filter: ")).append(sb.toString()).append(" -- ").append(values[i]).toString());
}

}
}
if(chain != null)
chain.doFilter(request, response);
}

public void destroy()
{
}

}
-------------------------------------------------------------------------------------
2)Create Dynacache
JNDI name: services/cache/catalog/parameters

3)Add the following code to the web.xml file:



<filter>
<filter-name>Parameter Filter
<filter-class>
com.ibm.catalog.servlet.filter.ParameterFilter
</filter-class>
</filter>
<filter-mapping>
<filter-name>
Parameter Filter
</filter-name>
<url-pattern>/myportal/*
</filter-mapping>
<filter-mapping>
<filter-name>
Parameter Filter
</filter-name>
<url-pattern>/portal/*
</filter-mapping>


---------------------------------------------------------------------

import com.ibm.websphere.cache.DistributedMap;
import java.util.*;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.naming.InitialContext;
import javax.naming.NamingException;
import javax.portlet.PortletSession;
import javax.portlet.RenderRequest;

public class AccessManagerUtils
{

public static final String DYNACACHE_NAME = "services/cache/catalog/parameters";
public static final String PARAMETER_PREFIX = "param.";
private static final String EXTERN_PARAMETERS_GOTTEN = "ExternParametersGotten";
private DistributedMap parameterMap;
public static final Logger logger = Logger.getLogger(com/ibm/fs/bic/accessmanager/AccessManagerUtils.getName());

public AccessManagerUtils()
{
parameterMap = null;
parameterMap = getParameterMap("services/cache/catalog/parameters");
}

protected DistributedMap getParameterMap(String mapName)
{
DistributedMap dm = null;
try
{
InitialContext ic = new InitialContext();
if(logger.isLoggable(Level.INFO))
logger.log(Level.INFO, (new StringBuilder("Opening parameter cache with name: ")).append(mapName).toString());
dm = (DistributedMap)ic.lookup(mapName);
ic.close();
}
catch(NamingException e)
{
logger.log(Level.SEVERE, "NamingException while looking up the distributed map.", e);
}
return dm;
}

protected String getExternParameter(RenderRequest request, String name)
{
getDynacacheMultipleParameters(request);
StringBuffer key = new StringBuffer("param.");
key.append(name);
String values[] = (String[])request.getAttribute(key.toString());
if(values != null)
return values[0];
else
return null;
}

protected String[] getExternParameterValues(RenderRequest request, String name)
{
getDynacacheMultipleParameters(request);
StringBuffer key = new StringBuffer("param.");
key.append(name);
String values[] = (String[])request.getAttribute(key.toString());
if(values != null)
return values;
else
return null;
}

protected int getDynacacheSingleParameters(RenderRequest request)
{
PortletSession session = request.getPortletSession();
int parmCount = 0;
Set keys = parameterMap.keySet();
Iterator iter = keys.iterator();
if(request.getAttribute("ExternParametersGotten") != null || parameterMap.isEmpty())
return -1;
while(iter.hasNext())
{
String key = (String)iter.next();
int dot = key.indexOf('.');
if(dot > 0)
key = key.substring(0, dot);
String values[] = getDynacacheParameterValues(key, request.getPortletSession().getId());
if(values != null)
{
parmCount++;
StringBuffer sb = new StringBuffer("param.");
sb.append(key);
request.setAttribute(sb.toString(), values[0]);
session.setAttribute(sb.toString(), values[0]);
}
}
request.setAttribute("ExternParametersGotten", "done");
return parmCount;
}

private int getDynacacheMultipleParameters(RenderRequest request)
{
if(request.getAttribute("ExternParametersGotten") != null)
return -1;
int parmCount = 0;
Set keys = parameterMap.keySet();
for(Iterator iter = keys.iterator(); iter.hasNext();)
{
String key = (String)iter.next();
int dot = key.indexOf('.');
if(dot > 0)
key = key.substring(0, dot);
String values[] = getDynacacheParameterValues(key, request.getPortletSession().getId());
if(values != null)
{
parmCount++;
StringBuffer sb = new StringBuffer("param.");
sb.append(key);
request.setAttribute(sb.toString(), values);
}
}

request.setAttribute("ExternParametersGotten", "done");
return parmCount;
}

private String[] getDynacacheParameterValues(String key, String sessionId)
{
StringBuffer sb = new StringBuffer(key);
sb.append(".count");
String countStr = (String)parameterMap.get(sb.toString());
if(countStr == null)
{
sb = new StringBuffer(key);
sb.append(".");
sb.append(sessionId);
String value = (String)parameterMap.get(sb.toString());
if(value != null)
{
parameterMap.remove(sb.toString());
String values[] = {
value
};
return values;
} else
{
return null;
}
}
parameterMap.remove(sb.toString());
int count = Integer.parseInt(countStr);
ArrayList valList = new ArrayList(count);
for(int i = 0; i < count; i++)
{
sb = new StringBuffer(key);
sb.append(".");
sb.append(i);
sb.append(".");
sb.append(sessionId);
valList.add(parameterMap.get(sb.toString()));
if(logger.isLoggable(Level.INFO))
logger.log(Level.INFO, (new StringBuilder("Portlet parm: ")).append(sb.toString()).append(" -- ").append((String)parameterMap.get(sb.toString())).toString());
parameterMap.remove(sb.toString());
}

String values[] = new String[valList.size()];
for(int i = 0; i < values.length; i++)
values[i] = (String)valList.get(i);

return values;
}

}
------------------------------------------------------------------------

Accessing in portlets.



import java.io.IOException;
import java.io.PrintWriter;
import javax.portlet.*;


public class AccessManager extends GenericPortlet
{

public static final String JSP_FOLDER = "/_BIC_AccessManager/jsp/";
public static final String ACCESS_MANAGER_SERVLET = "/AccessManagerServlet";
public static final String VIEW_JSP = "AccessManagerView";
public static final String SESSION_BEAN = "AccessManagerSessionBean";
public static final String FORM_SUBMIT = "AccessManagerFormSubmit";
public static final String FORM_TEXT = "AccessManagerFormText";
private AccessManagerUtils utils;

public AccessManager()
{
utils = null;
}

public void init()
throws PortletException
{
super.init();
utils = new AccessManagerUtils();
}

public void doView(RenderRequest request, RenderResponse response)
throws PortletException, IOException
{
response.setContentType(request.getResponseContentType());
utils.getDynacacheSingleParameters(request);
AccessManagerSessionBean sessionBean = getSessionBean(request);
if(sessionBean == null)
{
response.getWriter().println("NO PORTLET SESSION YET");
return;
} else
{
PortletRequestDispatcher rd = getPortletContext().getRequestDispatcher(getJspFilePath(request, "AccessManagerView"));
rd.include(request, response);
return;
}
}
--------------------------------------------------------------------------------

1 comment:

Followers