[jboss-cvs] jboss-seam/examples/hibernate2/src ...
Michael Yuan
michael.yuan at jboss.com
Sat Jul 21 20:15:19 EDT 2007
User: myuan
Date: 07/07/21 20:15:19
Added: examples/hibernate2/src SeamFilterWebSphereHack.java
Log:
WebSphere hack
Revision Changes Path
1.1 date: 2007/07/22 00:15:19; author: myuan; state: Exp;jboss-seam/examples/hibernate2/src/SeamFilterWebSphereHack.java
Index: SeamFilterWebSphereHack.java
===================================================================
import java.io.IOException;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import org.jboss.seam.Component;
import org.jboss.seam.ScopeType;
import org.jboss.seam.contexts.Lifecycle;
import org.jboss.seam.core.Init;
import org.jboss.seam.log.LogProvider;
import org.jboss.seam.log.Logging;
import org.jboss.seam.util.SortItem;
import org.jboss.seam.util.Sorter;
import org.jboss.seam.web.AbstractFilter;
/**
* A servlet filter that orchestrates the stack of Seam
* component filters, and controls ordering. Filter
* ordering is specified via the @Filter annotation.
* Filters may optionally extend AbstractFilter.
*
* @see org.jboss.seam.annotations.web.Filter
* @see AbstractFilter
*
* @author Shane Bryzak
*
*/
public class SeamFilterWebSphereHack implements Filter
{
private static final LogProvider log = Logging.getLogProvider(SeamFilterWebSphereHack.class);
private List<Filter> filters;
private class FilterChainImpl implements FilterChain
{
private FilterChain chain;
private int index;
private FilterChainImpl(FilterChain chain)
{
this.chain = chain;
index = -1;
}
public void doFilter(ServletRequest request, ServletResponse response)
throws IOException, ServletException
{
if ( ++index < filters.size() )
{
Filter filter = filters.get(index);
if (filter instanceof AbstractFilter)
{
AbstractFilter bf = (AbstractFilter) filter;
log.info("URL pattern in SeamFiler:" + bf.getUrlPattern());
log.info("Set it to null for WebSphere (ugly hack)");
bf.setUrlPattern(null);
if ( bf.isMappedToCurrentRequestPath(request) )
{
filter.doFilter(request, response, this);
}
else
{
this.doFilter(request, response);
}
}
else
{
filter.doFilter(request, response, this);
}
}
else
{
chain.doFilter(request, response);
}
}
}
public void init(FilterConfig filterConfig) throws ServletException
{
Lifecycle.mockApplication();
try
{
filters = getSortedFilters();
for ( Filter filter : filters )
{
log.info( "Initializing filter: " + Component.getComponentName(filter.getClass()));
filter.init(filterConfig);
}
}
finally
{
Lifecycle.unmockApplication();
}
}
private List<Filter> getSortedFilters()
{
//retrieve the Filter instances from the application context
Map<String, SortItem<Filter>> sortItemsMap = new HashMap<String, SortItem<Filter>>();
List<SortItem<Filter>> sortItems = new ArrayList<SortItem<Filter>>();
for (String filterName : Init.instance().getInstalledFilters())
{
Filter filter = (Filter) Component.getInstance(filterName, ScopeType.APPLICATION);
SortItem<Filter> si = new SortItem<Filter>(filter);
sortItemsMap.put(filterName, si);
sortItems.add(si);
}
//create sort items
for (SortItem<Filter> sortItem : sortItems)
{
org.jboss.seam.annotations.web.Filter filterAnn = getFilterAnnotation(sortItem.getObj().getClass());
if ( filterAnn != null )
{
for (String s : Arrays.asList( filterAnn.around() ) )
{
SortItem<Filter> aroundSortItem = sortItemsMap.get(s);
if (sortItem!=null && aroundSortItem != null) sortItem.getAround().add( aroundSortItem );
}
for (String s : Arrays.asList( filterAnn.within() ) )
{
SortItem<Filter> withinSortItem = sortItemsMap.get(s);
if (sortItem!=null && withinSortItem != null) sortItem.getWithin().add( withinSortItem );
}
}
}
// Do the sort
Sorter<Filter> sList = new Sorter<Filter>();
sortItems = sList.sort(sortItems);
List<Filter> sorted = new ArrayList<Filter>();
for (SortItem<Filter> si: sortItems) sorted.add( si.getObj() );
return sorted;
}
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
throws IOException, ServletException
{
new FilterChainImpl(chain).doFilter(request, response);
}
public void destroy()
{
for (Filter filter: filters)
{
filter.destroy();
}
}
private org.jboss.seam.annotations.web.Filter getFilterAnnotation(Class<?> clazz)
{
while (!Object.class.equals(clazz))
{
if (clazz.isAnnotationPresent(org.jboss.seam.annotations.web.Filter.class))
{
return clazz.getAnnotation(org.jboss.seam.annotations.web.Filter.class);
}
else
{
clazz = clazz.getSuperclass();
}
}
return null;
}
}
More information about the jboss-cvs-commits
mailing list