/*
* 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.Collections;
import java.util.Comparator;
import java.util.Iterator;
import java.util.List;
import org.apache.jetspeed.om.registry.RegistryEntry;
import org.apache.jetspeed.portal.Portlet;
import org.apache.jetspeed.services.Registry;
import org.apache.jetspeed.util.PortletSessionState;
import org.apache.turbine.util.RunData;
import org.apache.velocity.context.Context;
/**
* This action enables to browse any of the system registries for displaying
* available entries and information on these entries
*
* @author <a href="mailto:raphael@apache.org">Rapha謖 Luta</a>
* @version $ID$
*/
public class RegistryBrowseAction extends GenericMVCAction
{
public static final String PREFIX = "RegistryBrowseAction:";
public static final String REFRESH = "refresh";
public static final String FILTER_FIELDS = "filter_fields";
public static final String FILTER_VALUES = "filter_values";
public static final String START = "start";
public static final String RESULTS = "results";
public static final String FILTERED_RESULTS = "filtered_results";
/**
* Subclasses must override this method to provide default behavior
* for the portlet action
*/
protected void buildNormalContext( Portlet portlet,
Context context,
RunData rundata )
{
String regName = portlet.getPortletConfig()
.getInitParameter("registry",Registry.PORTLET);
Boolean refresh = (Boolean)PortletSessionState.getAttribute(rundata, PREFIX + regName + ":" + REFRESH, Boolean.FALSE);
if(refresh.equals(Boolean.TRUE))
{
PortletSessionState.clearAttribute(portlet, rundata, START);
PortletSessionState.clearAttribute(portlet, rundata, RESULTS);
PortletSessionState.clearAttribute(portlet, rundata, FILTERED_RESULTS);
PortletSessionState.clearAttribute(rundata, PREFIX + regName + ":" + REFRESH);
}
int start = getStart(rundata, portlet);
if (start < 0) start = 0;
String pageSize = portlet.getPortletConfig()
.getInitParameter("page-size","20");
int size = Integer.parseInt(pageSize);
int prev = start-size;
if(prev < 0)
{
prev = 0;
}
String[] filterFields = (String[]) PortletSessionState.getAttribute(portlet, rundata, FILTER_FIELDS);
String[] filterValues = (String[]) PortletSessionState.getAttribute(portlet, rundata, FILTER_VALUES);
List regEntries = (List)PortletSessionState.getAttribute(portlet, rundata, RESULTS);
List filteredEntries = (List)PortletSessionState.getAttribute(portlet, rundata, FILTERED_RESULTS);
if(regEntries == null)
{
Iterator i = Registry.get(regName).listEntryNames();
regEntries = new ArrayList();
while(i.hasNext())
{
String name = (String)i.next();
RegistryEntry regEntry = Registry.getEntry(regName,name);
if ( (regEntry!=null) && (!regEntry.isHidden()) )
{
regEntries.add(regEntry);
}
}
Collections.sort(regEntries,
new Comparator() {
public int compare(Object o1, Object o2)
{
String t1 = ((RegistryEntry) o1).getName().toLowerCase();
String t2 = ((RegistryEntry) o2).getName().toLowerCase();
return t1.compareTo(t2);
}
});
PortletSessionState.setAttribute(portlet, rundata, RESULTS, regEntries);
filteredEntries = filter(regEntries, filterFields, filterValues);
PortletSessionState.setAttribute(portlet, rundata, FILTERED_RESULTS, filteredEntries);
}
if(filterFields != null && filterValues != null && filterFields.length == filterValues.length)
{
for(int i=0; i<filterFields.length; i++)
{
String field = filterFields[i];
String value = filterValues[i];
context.put(field + "_filter_value", value);
}
}
int end = start+size;
if(end> filteredEntries.size())
{
end = filteredEntries.size();
}
List pageEntries = filteredEntries.subList(start, end);
context.put("registry", pageEntries);
context.put("filtered_entries", filteredEntries);
if (start > 0)
{
context.put("prev",String.valueOf(prev));
}
if (end < filteredEntries.size())
{
context.put("next",String.valueOf(end));
}
}
/**
* @param rundata The turbine rundata context for this request.
* @param portlet The portlet
* @return The value of the start variable
*/
private int getStart(RunData rundata, Portlet portlet)
{
int start = 0;
Integer startInteger = rundata.getParameters().getInteger(START, -1);
if(startInteger.intValue() == -1) {
startInteger = (Integer) PortletSessionState.getAttribute(portlet, rundata, START);
if(startInteger != null) {
start = startInteger.intValue();
}
} else {
PortletSessionState.setAttribute(portlet, rundata, START, startInteger);
start = startInteger.intValue();
}
return start;
}
/**
* Adds a filter over the available portlets list based on category
*
* @param rundata The turbine rundata context for this request.
* @param context The velocity context for this request.
*/
public void doFilter(RunData rundata, Context context) throws Exception
{
String[] filterFields = rundata.getParameters().getStrings("filter_field");
String[] filterValues = new String[filterFields.length];
for(int i=0; i<filterFields.length; i++)
{
String filterField = filterFields[i];
String filterValue = rundata.getParameters().getString(filterField + ":filter_value");
filterValues[i] = filterValue;
}
String regName = getPortlet(context).getPortletConfig()
.getInitParameter("registry",Registry.PORTLET);
PortletSessionState.setAttribute(getPortlet(context), rundata, FILTER_FIELDS, filterFields);
PortletSessionState.setAttribute(getPortlet(context), rundata, FILTER_VALUES, filterValues);
PortletSessionState.setAttribute(rundata, PREFIX + regName + ":" + REFRESH, Boolean.TRUE);
}
/**
* Method that filters the registry entries. This should be overridden in
* child classes to determine what filters each browser will support. By
* default, this implemenation does no filtering.
*
* @param entries The list of registry entries to filter.
* @param fields The array of filter names
* @param values The array of filter values. This should be in a 1:1 ratio with the fitler names.
* @return The list of filtered portlets.
*/
protected List filter(List entries, String[] fields, String[] values) {
return entries;
}
}