/*
* Copyright 2000-2004 The Apache Software Foundation.
*
* 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.
*/
package org.apache.jetspeed.modules.actions.portlets;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.Iterator;
import java.util.List;
import java.util.TreeMap;
import org.apache.jetspeed.om.registry.PortletEntry;
import org.apache.jetspeed.om.registry.base.BaseCategory;
import org.apache.jetspeed.services.Registry;
import org.apache.jetspeed.services.logging.JetspeedLogFactoryService;
import org.apache.jetspeed.services.logging.JetspeedLogger;
/**
* An abstract class with helper methods for filtering Portlets.
*
* @author <a href="mailto:jford@apache.org">Jeremy Ford</a>
* @version $Id: PortletFilter.java,v 1.3 2004/02/23 02:56:58 jford Exp $
*/
public abstract class PortletFilter
{
/**
* Static initialization of the logger for this class
*/
private static final JetspeedLogger logger =
JetspeedLogFactoryService.getLogger(PortletFilter.class.getName());
/**
* Method that filters a list of portlets based on a give filter name/value.
*
* @param portlets List of portlets to filter
* @param field The name of the filter
* @param value The value of the filter
* @return List of portlets that met the filter criteria
*/
public static List filterPortlets(
List portlets,
String field,
String value)
{
String[] fields = { field };
String[] values = { value };
return filterPortlets(portlets, fields, values);
}
/**
* Method that filters a list of portlets based on certain criteria.
*
* @param portlets The list of portlets to filter
* @param fields The list of fields
* @param values The list of values. This should be in a 1:1 ratio with the fields.
* @return List of portlets that met the filter criteria
*/
public static List filterPortlets(
List portlets,
String[] fields,
String[] values)
{
List filteredPortlets = new ArrayList();
Iterator portletIter = portlets.iterator();
while (portletIter.hasNext())
{
PortletEntry entry = (PortletEntry) portletIter.next();
if (isFilteredIn(entry, fields, values))
{
filteredPortlets.add(entry);
}
}
return filteredPortlets;
}
/**
* Method that checks a portlet entry to see if it matches the given
* filter criteria.
*
* @param entry The entry to filter
* @param fields The list of fields.
* @param values The list of values. This should be in a 1:1 ratio with the fields.
* @return
*/
private static boolean isFilteredIn(
PortletEntry entry,
String[] fields,
String[] values)
{
boolean result = true;
if (fields != null && values != null && fields.length == values.length)
{
for (int i = 0; i < fields.length && result; i++)
{
String field = fields[i];
String value = values[i];
if (field == null
|| value == null
|| field.length() == 0
|| value.length() == 0)
{
//skip and add to list
}
else if (field.equals("category"))
{
result = result && entry.hasCategory(value);
}
else if (field.equals("media_type"))
{
result = result && entry.hasMediaType(value);
}
else if (field.equals("parent"))
{
if (entry.getParent() != null)
{
result = result && entry.getParent().equals(value);
}
else
{
result = false;
}
}
else if (field.equals("type"))
{
if (entry.getType() != null)
{
result = result && entry.getType().equals(value);
}
else
{
result = false;
}
}
/*
else if(field.equals("permission"))
{
result = JetspeedSecurity.checkPermission((JetspeedUser) rundata.getUser(),
new PortalResource(entry),
value);
}
*/
else
{
logger.warn("Invalid filter " + field + " attempted");
}
}
}
return result;
}
/**
* Builds a list of all portlet categories
*
* @param List portlets portlets to scan for categories
* @return List of categories
*/
public static List buildCategoryList(List portlets)
{
TreeMap catMap = new TreeMap();
Iterator pItr = portlets.iterator();
while (pItr.hasNext())
{
PortletEntry entry = (PortletEntry) pItr.next();
Iterator cItr = entry.listCategories();
while (cItr.hasNext())
{
BaseCategory cat = (BaseCategory) cItr.next();
catMap.put(cat.getName(), cat);
}
}
return new ArrayList(catMap.values());
}
/**
* Method to return all portlets in the Portlet Registry
*
* @return List of portlets
*/
public static List getAllPortlets()
{
List regEntries = new ArrayList();
Iterator iter = Registry.get(Registry.PORTLET).listEntryNames();
while (iter.hasNext())
{
String entryName = (String) iter.next();
regEntries.add(Registry.getEntry(Registry.PORTLET, entryName));
}
return regEntries;
}
/**
* Method that returns a list of parents from the provided list of portlets.
*
* @param portlets List of portlets to search for parents
* @return List of portlets that are parents
*/
public static List buildParentList(List portlets)
{
HashSet parentSet = new HashSet();
Iterator portletIter = portlets.iterator();
while (portletIter.hasNext())
{
PortletEntry regEntry = (PortletEntry) portletIter.next();
String regType = regEntry.getType();
if (regType.equalsIgnoreCase(PortletEntry.TYPE_ABSTRACT))
{
parentSet.add(regEntry);
}
}
return new ArrayList(parentSet);
}
}