/*
* 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;
// Jetspeed imports
import org.apache.jetspeed.portal.PortletSet;
import org.apache.jetspeed.portal.PortletSkin;
import org.apache.jetspeed.portal.PortletController;
import org.apache.jetspeed.portal.PortletSetController;
import org.apache.jetspeed.portal.portlets.VelocityPortlet;
import org.apache.jetspeed.services.Profiler;
import org.apache.jetspeed.services.Registry;
import org.apache.jetspeed.services.PortalToolkit;
import org.apache.jetspeed.services.TemplateLocator;
import org.apache.jetspeed.services.rundata.JetspeedRunData;
import org.apache.jetspeed.om.BaseSecurityReference;
import org.apache.jetspeed.om.SecurityReference;
import org.apache.jetspeed.om.profile.Profile;
import org.apache.jetspeed.om.profile.ProfileLocator;
import org.apache.jetspeed.om.profile.ProfileException;
import org.apache.jetspeed.om.profile.QueryLocator;
import org.apache.jetspeed.om.registry.RegistryEntry;
import org.apache.jetspeed.om.registry.PortletEntry;
import org.apache.jetspeed.om.registry.PortletInfoEntry;
import org.apache.jetspeed.om.registry.base.BaseCategory;
import org.apache.jetspeed.om.profile.Portlets;
import org.apache.jetspeed.om.profile.psml.PsmlPortlets;
import org.apache.jetspeed.om.profile.Entry;
import org.apache.jetspeed.om.profile.psml.PsmlEntry;
import org.apache.jetspeed.om.profile.Reference;
import org.apache.jetspeed.om.profile.psml.PsmlReference;
import org.apache.jetspeed.om.profile.Skin;
import org.apache.jetspeed.om.profile.psml.PsmlSkin;
import org.apache.jetspeed.om.profile.MetaInfo;
import org.apache.jetspeed.om.profile.psml.PsmlMetaInfo;
import org.apache.jetspeed.om.profile.Controller;
import org.apache.jetspeed.om.profile.psml.PsmlController;
import org.apache.jetspeed.om.profile.Control;
import org.apache.jetspeed.om.profile.psml.PsmlControl;
import org.apache.jetspeed.om.profile.PSMLDocument;
import org.apache.jetspeed.om.security.JetspeedUser;
import org.apache.jetspeed.services.customlocalization.CustomLocalization;
import org.apache.jetspeed.services.idgenerator.JetspeedIdGenerator;
import org.apache.jetspeed.services.JetspeedSecurity;
import org.apache.jetspeed.services.logging.JetspeedLogFactoryService;
import org.apache.jetspeed.services.logging.JetspeedLogger;
import org.apache.jetspeed.services.security.PortalResource;
import org.apache.jetspeed.util.AutoProfile;
import org.apache.jetspeed.util.PortletSessionState;
import org.apache.jetspeed.util.template.JetspeedLink;
import org.apache.jetspeed.util.template.JetspeedLinkFactory;
import org.apache.jetspeed.services.statemanager.SessionState;
import org.apache.jetspeed.services.resources.JetspeedResources;
// Turbine stuff
import org.apache.turbine.util.DynamicURI;
import org.apache.turbine.util.RunData;
// Velocity Stuff
import org.apache.velocity.context.Context;
// Java imports
import java.util.ArrayList;
import java.util.Map;
import java.util.HashMap;
import java.util.TreeMap;
import java.util.LinkedList;
import java.util.List;
import java.util.Iterator;
import java.util.Collections;
import java.util.Comparator;
import java.text.MessageFormat;
/**
* This action implements the default portletset behavior customizer
*
* <p>Don't call it from the URL, the Portlet and the Action are automatically
* associated through the registry PortletName
*
* @author <a href="mailto:raphael@apache.org">Rapha�l Luta</a>
* @version $Id: CustomizeSetAction.java,v 1.51 2004/02/23 02:56:58 jford Exp $
*/
public class CustomizeSetAction extends VelocityPortletAction
{
private static final String USER_SELECTIONS = "session.portlets.user.selections";
private static final String UI_PORTLETS_SELECTED = "portletsSelected";
private static final String PORTLET_LIST = "session.portlets.list";
private static final String ALL_PORTLET_LIST = "session.all.portlets.list";
private static final String PORTLET_LIST_PAGE_SIZE = "session.portlets.page.size";
private static final String HIDE_EMPTY_CATEGORIES = "customizer.hide.empty.categories";
public static final String FILTER_FIELDS = "filter_fields";
public static final String FILTER_VALUES = "filter_values";
/**
* Static initialization of the logger for this class
*/
private static final JetspeedLogger logger = JetspeedLogFactoryService.getLogger(CustomizeSetAction.class.getName());
/**
* Subclasses must override this method to provide default behavior
* for the portlet action
*/
protected void buildNormalContext(VelocityPortlet portlet,
Context context,
RunData rundata) throws Exception
{
JetspeedRunData jdata = (JetspeedRunData) rundata;
SessionState customizationState = jdata.getPageSessionState();
Profile profile = jdata.getCustomizedProfile();
String mediaType = profile.getMediaType ();
// set velocity variable of mediatype (displayed in the customizer menu)
context.put("mtype", profile.getMediaType());
// make the list of already used panes/portlets available through the 'runs' reference
context.put("runs", AutoProfile.getPortletList(rundata));
// we should first retrieve the portlet to customize
PortletSet set = (PortletSet) (jdata).getCustomized();
//identify the portlet submode and build the appropriate subt-template path
String mode = rundata.getParameters().getString("mode");
if (mode == null)
{
mode = (String) customizationState.getAttribute("customize-mode");
if ((mode == null) || (mode.equalsIgnoreCase("addset")) || (mode.equalsIgnoreCase("general")))
{
mode = "layout";
}
}
else
{
if ((mediaType.equalsIgnoreCase("wml")) && (!mode.equalsIgnoreCase("add")))
{
mode = "layout";
}
customizationState.setAttribute("customize-mode", mode);
}
String template = (String) context.get("template");
if (template != null)
{
int idx = template.lastIndexOf(".");
if (idx > 0)
{
template = template.substring(0, idx);
}
StringBuffer buffer = new StringBuffer(template);
buffer.append("-").append(mode).append(".vm");
template = TemplateLocator.locatePortletTemplate(rundata, buffer.toString());
context.put("feature", template);
}
if (set == null)
{
return;
}
// get the customization state for this page
String customizedPaneName = (String) customizationState.getAttribute("customize-paneName");
if (customizedPaneName == null)
{
customizedPaneName = "*";
}
// generic context stuff
context.put("panename", customizedPaneName);
context.put("skin", set.getPortletConfig().getPortletSkin());
context.put("set", set);
context.put("action", "portlets.CustomizeSetAction");
context.put("controllers", buildInfoList(rundata, Registry.PORTLET_CONTROLLER, mediaType));
//context.put("skins", buildList(rundata, Registry.SKIN));
//context.put("securitys", buildList(rundata, Registry.SECURITY));
context.put("customizer", portlet);
String controllerName = set.getController().getConfig().getName();
context.put("currentController", controllerName);
context.put("currentSecurityRef", set.getPortletConfig().getSecurityRef());
/**
* Special handling for wml profiles
* no skins, no properties menuentry, no panes
* --------------------------------------------------------------------------
* last modified: 12/10/01
* Andreas Kempf, Siemens ICM S CP OP, Munich
* mailto: A.Kempf@web.de
*/
if (mediaType.equalsIgnoreCase("wml"))
{
context.put("currentSkin", "Not for wml!");
context.put("allowproperties", "false");
}
else
{
if (set.getPortletConfig().getSkin() != null)
{
context.put("currentSkin", set.getPortletConfig().getPortletSkin().getName());
}
context.put("allowproperties", "true");
}
context.put("allowpane", "false");
// do not allow panes for wml profiles
if ((!mediaType.equalsIgnoreCase("wml")) && (set.getController() instanceof PortletSetController))
{
if (customizedPaneName != null)
{
context.put("allowpane", "true");
}
}
else
{
context.put("allowportlet", "true");
}
// --------------------------------------------------------------------------
if ("add".equals(mode)) // build context for add mode
{
int start = rundata.getParameters().getInt("start", -1);
if (start < 0)
{
//System.out.println("Clearing session variables");
start = 0;
PortletSessionState.clearAttribute(rundata, USER_SELECTIONS);
PortletSessionState.clearAttribute(rundata, PORTLET_LIST);
}
ArrayList allPortlets = new ArrayList();
List portlets = buildPortletList(rundata, set, mediaType, allPortlets);
Map userSelections = getUserSelections(rundata);
// Build a list of categories from the available portlets
List categories = buildCategoryList(rundata, mediaType, allPortlets);
context.put("categories", categories);
context.put("parents", PortletFilter.buildParentList(allPortlets));
addFiltersToContext(rundata, context);
int size = getSize(portlet);
int end = Math.min(start + size, portlets.size());
if (start > 0)
{
context.put("prev", String.valueOf(Math.max(start - size, 0)));
}
if (start + size < portlets.size())
{
context.put("next", String.valueOf(start + size));
}
context.put("browser", portlets.subList(start, end));
context.put("size", new Integer(size));
context.put(UI_PORTLETS_SELECTED, userSelections);
context.put("portlets", portlets);
}
else if ("addref".equals(mode))
{
Iterator psmlIterator = null;
psmlIterator = Profiler.query(new QueryLocator(QueryLocator.QUERY_ALL));
// Set Start and End
int start = rundata.getParameters().getInt("start", 0);
int size = getSize(portlet);
// Only include entries in compatibale with the Media-type/Country/Language
List psmlList = new LinkedList();
Profile refProfile = null;
int profileCounter = 0;
while (psmlIterator.hasNext())
{
refProfile = (Profile) psmlIterator.next();
if (refProfile.getMediaType() != null)
{
if (profile.getMediaType().equals(refProfile.getMediaType()) == false)
{
continue;
}
}
if (profile.getLanguage() != null)
{
if (refProfile.getLanguage() != null)
{
if (profile.getLanguage().equals(refProfile.getLanguage()) == true)
{
if (profile.getCountry() != null)
{
if (refProfile.getCountry() != null)
{
if (profile.getCountry().equals(refProfile.getCountry()) == false)
{
// Profile and Ref are different countries
continue;
}
}
}
else
{
if (refProfile.getCountry() != null)
{
// Profile has no country and Ref has a country
continue;
}
}
}
else
{
// Profile and Ref are different languages
continue;
}
}
}
else
{
if (refProfile.getLanguage() != null)
{
// Profile has no Language and Ref has a country
continue;
}
}
if (profile.getPath().equals(refProfile.getPath()) == true)
{
// Do not allow Profile to reference it self
continue;
}
// Only add profiles to list that will be displayed
if (profileCounter >= (start + size))
{
break;
}
if (profileCounter >= start)
{
psmlList.add(refProfile);
}
profileCounter++;
}
// Add Start to context
if (start > 0)
{
context.put("prev", String.valueOf(Math.max(start - size, 0)));
}
// Set end to context
if ((size == psmlList.size()) && (psmlIterator.hasNext()))
{
context.put("next", String.valueOf(start + size));
}
context.put("psml", psmlList.iterator());
}
else // build context for layout mode
{
// nothing specific to do
}
}
public int getSize(VelocityPortlet portlet)
{
int size = 15;
try
{
size = Integer.parseInt(portlet.getPortletConfig()
.getInitParameter("size"));
}
catch (Exception e)
{
logger.debug("CustomizeSetAction: Init param 'size' not parsed");
}
return size;
}
/** Clean up the customization state */
public void doCancel(RunData rundata, Context context)
{
//((JetspeedRunData)rundata).setCustomized(null);
//rundata.setScreenTemplate("Home");
SessionState customizationState = ((JetspeedRunData) rundata).getPageSessionState();
customizationState.setAttribute("customize-mode", "layout");
}
/** Save the general informations for this set */
public void doSave(RunData rundata, Context context)
{
doMetainfo(rundata, context);
doSkin(rundata, context);
doLayout(rundata, context);
doSecurity(rundata, context);
Profile profile = ((JetspeedRunData) rundata).getCustomizedProfile();
try
{
String mtype = rundata.getParameters().getString("mtype");
if (mtype != null)
{
profile.setMediaType(mtype);
}
profile.store();
}
catch (Exception e)
{
logger.error("Exception occured while saving PSML", e);
}
}
/** Save customizations and get out of customization state */
public void doApply(RunData rundata, Context context)
{
doSave(rundata, context);
}
/** Add a new portlets element in the customized set */
public void doAddset(RunData rundata, Context context)
{
PortletSet set = (PortletSet) ((JetspeedRunData) rundata).getCustomized();
String title = rundata.getParameters().getString("title", "My Pane");
if (set != null)
{
Portlets portlets = ((JetspeedRunData) rundata).getCustomizedProfile()
.getDocument()
.getPortletsById(set.getID());
if (portlets != null)
{
Portlets p = new PsmlPortlets();
p.setMetaInfo(new PsmlMetaInfo());
p.getMetaInfo().setTitle(title);
p.setId(JetspeedIdGenerator.getNextPeid());
SecurityReference defaultRef = PortalToolkit.getDefaultSecurityRef(
((JetspeedRunData) rundata).getCustomizedProfile());
if (defaultRef != null)
{
if (logger.isDebugEnabled())
{
logger.debug("CustomizeSetAction: setting default portlet set security to [" + defaultRef.getParent() + "]");
}
p.setSecurityRef(defaultRef);
}
portlets.addPortlets(p);
}
}
SessionState customizationState = ((JetspeedRunData) rundata).getPageSessionState();
customizationState.setAttribute("customize-mode", "layout");
}
public void doPrevious(RunData rundata, Context context) throws Exception
{
int queryStart = rundata.getParameters().getInt("previous", 0);
String mtype = rundata.getParameters().getString("mtype", null);
maintainUserSelections(rundata);
JetspeedLink link = JetspeedLinkFactory.getInstance(rundata);
DynamicURI duri = null;
if (mtype == null)
{
duri = link.setTemplate("Customize").addQueryData("start", String.valueOf(queryStart));
}
else
{
duri = link.setTemplate("Customize").
addQueryData("start", String.valueOf(queryStart)).
addQueryData("mtype", mtype);
}
JetspeedLinkFactory.putInstance(link);
rundata.setRedirectURI(duri.toString());
return;
}
public void doNext(RunData rundata, Context context) throws Exception
{
int queryStart = rundata.getParameters().getInt("next", 0);
String mtype = rundata.getParameters().getString("mtype", null);
maintainUserSelections(rundata);
JetspeedLink link = JetspeedLinkFactory.getInstance(rundata);
DynamicURI duri = null;
if (mtype == null)
{
duri = link.setTemplate("Customize").addQueryData("start", String.valueOf(queryStart));
}
else
{
duri = link.setTemplate("Customize").
addQueryData("start", String.valueOf(queryStart)).
addQueryData("mtype", mtype);
}
JetspeedLinkFactory.putInstance(link);
rundata.setRedirectURI(duri.toString());
return;
}
protected void maintainUserSelections(RunData rundata) throws Exception
{
int size = rundata.getParameters().getInt("size", 0);
int previous = rundata.getParameters().getInt("previous", -1);
int start = 0;
if (previous >= 0)
{
start = previous + size;
}
String[] pnames = rundata.getParameters().getStrings("pname");
//System.out.println("start = "+start+" size = "+size);
//System.out.println("pnames = "+rundata.getParameters());
Map userSelections = getUserSelections(rundata);
List portlets = (List) PortletSessionState.getAttribute(rundata, PORTLET_LIST, null);
if (portlets != null)
{
int end = Math.min(start + size, portlets.size());
int pnamesIndex = 0;
//Go through all the portlets on this page and figure out which ones have been
//checked and which ones unchecked and accordingly update the userSelectionMap
for (int portletIndex = start; portletIndex < end; portletIndex++)
{
PortletEntry entry = (PortletEntry) portlets.get(portletIndex);
if (pnames != null
&& pnamesIndex < pnames.length
&& pnames[pnamesIndex].equals(entry.getName()))
{
userSelections.put(entry.getName(), entry);
pnamesIndex++;
}
else
{
userSelections.remove(entry.getName());
}
}
PortletSessionState.setAttribute(rundata, USER_SELECTIONS, userSelections);
/*
Iterator it = userSelections.keySet().iterator();
System.out.print("User Selections: ");
while (it.hasNext())
{
System.out.print(", "+it.next());
}
System.out.println("\n");
*/
}
else
{
throw new Exception("Master Portlet List is null!");
}
}
/** Add new portlets in the customized set */
public void doAdd(RunData rundata, Context context) throws Exception
{
/**
* Special handling for wml profiles
* no skins, no properties menuentry, no panes
* --------------------------------------------------------------------------
* last modified: 10/31/01
* Andreas Kempf, Siemens ICM S CP PE, Munich
* mailto: A.Kempf@web.de
*/
//boolean isWML = AutoProfile.doIt (rundata, true).getMediaType().equalsIgnoreCase("wml");
PortletSet set = (PortletSet) ((JetspeedRunData) rundata).getCustomized();
maintainUserSelections(rundata);
Map userSelections = getUserSelections(rundata);
String[] pnames = new String[userSelections.size()];
userSelections.keySet().toArray(pnames);
//String[] pnames = rundata.getParameters().getStrings("pname");
// Create a ClearPortletControl
Control ctrl = new PsmlControl();
ctrl.setName ("ClearPortletControl");
if ((pnames != null) && (set != null))
{
Portlets portlets = ((JetspeedRunData) rundata).getCustomizedProfile()
.getDocument()
.getPortletsById(set.getID());
List usedPortlets = AutoProfile.getPortletList(rundata);
boolean addIt;
int cc;
Entry usedEntry;
for (int i = 0; i < pnames.length; i++)
{
PortletEntry entry = (PortletEntry) Registry.getEntry(Registry.PORTLET, pnames[i]);
// add only new portlets!
if ((entry != null) && (portlets != null))
{
addIt = true;
/*
for (cc=0; cc<usedPortlets.size(); cc++)
{
usedEntry = (Entry) usedPortlets.get(cc);
if (entry.getName().equals(usedEntry.getParent()))
{
addIt = false;
break;
}
}
*/
if (addIt)
{
Entry p = new PsmlEntry();
// add the ClearPortletControl to wml entries
//if (isWML)
// p.setControl (ctrl);
p.setParent(pnames[i]);
p.setId(JetspeedIdGenerator.getNextPeid());
// SecurityReference defaultRef = PortalToolkit.getDefaultSecurityRef(
// ((JetspeedRunData) rundata).getCustomizedProfile());
// if (defaultRef != null)
// {
// if (Log.getLogger().isDebugEnabled())
// {
// Log.debug("CustomizeSetAction: setting default portlet security to [" + defaultRef.getParent() + "]");
// }
// p.setSecurityRef(defaultRef);
// }
portlets.addEntry(p);
}
}
}
}
// --------------------------------------------------------------------------
SessionState customizationState = ((JetspeedRunData) rundata).getPageSessionState();
customizationState.setAttribute("customize-mode", "layout");
/**
* Save changed wml profile
* --------------------------------------------------------------------------
* last modified: 10/31/01
* Andreas Kempf, Siemens ICM S CP PE, Munich
* mailto: A.Kempf@web.de
if (isWML)
{
((JetspeedRunData)rundata).getCustomizedProfile().store();
//rundata.save();
}
*/
}
/** Add new Reference in the customized set */
public void doAddref(RunData rundata, Context context) throws Exception
{
PortletSet set = (PortletSet) ((JetspeedRunData) rundata).getCustomized();
String[] refNames = rundata.getParameters().getStrings("refname");
// Create a ClearPortletControl
Control ctrl = new PsmlControl();
ctrl.setName ("ClearPortletControl");
if ((refNames != null) && (set != null))
{
Portlets portlets = ((JetspeedRunData) rundata).getCustomizedProfile()
.getDocument()
.getPortletsById(set.getID());
for (int i = 0; i < refNames.length; i++)
{
SecurityReference sref = getSecurityReference(rundata, refNames[i]);
if (sref != null)
{
Reference ref = new PsmlReference();
ref.setPath(refNames[i]);
ref.setSecurityRef(sref);
portlets.addReference(ref);
}
else
{
String tmpl = CustomLocalization.getString("CUSTOMIZER_ADD_REF_ERROR", rundata);
Object[] args = {
refNames[i]
};
String message = MessageFormat.format(tmpl, args).toString();
rundata.addMessage(message.concat("<br>"));
if (logger.isWarnEnabled())
{
logger.warn(message);
}
}
}
}
SessionState customizationState = ((JetspeedRunData) rundata).getPageSessionState();
customizationState.setAttribute("customize-mode", "layout");
}
/**
* Get the security reference from the outer portlet set
*
* @param path the psml locator path
* @return the security reference of the referenced resource
*/
protected SecurityReference getSecurityReference(RunData rundata, String path)
{
try
{
ProfileLocator locator = Profiler.createLocator();
locator.createFromPath(path);
Profile profile = Profiler.getProfile(locator);
if (profile != null)
{
PSMLDocument doc = profile.getDocument();
if (doc != null)
{
Portlets rootSet = doc.getPortlets();
/*
There is no way to do a check on a Portlets element, only a Entry element.
This can easily be added, but Im just under a release right now and it
could be perceived as too destabilizing -- david
if (JetspeedSecurity.checkPermission((JetspeedUser) rundata.getUser(),
rootSet,
JetspeedSecurity.PERMISSION_VIEW))
{
*/
return rootSet.getSecurityRef();
// }
}
}
}
catch (ProfileException e)
{
logger.error("Exception", e);
}
return null;
}
/** Sets the metainfo for this entry */
public void doMetainfo(RunData rundata, Context context)
{
PortletSet set = (PortletSet) ((JetspeedRunData) rundata).getCustomized();
String title = rundata.getParameters().getString("title");
String description = rundata.getParameters().getString("description");
if (set != null)
{
Portlets portlets = ((JetspeedRunData) rundata).getCustomizedProfile()
.getDocument()
.getPortletsById(set.getID());
if (portlets != null)
{
MetaInfo meta = portlets.getMetaInfo();
if (meta == null)
{
meta = new PsmlMetaInfo();
portlets.setMetaInfo(meta);
}
if (title != null)
{
meta.setTitle(title);
set.setTitle(title);
}
if(description != null)
{
meta.setDescription(description);
set.setDescription(description);
}
}
}
}
/** Updates the customized portlet entry */
public void doLayout(RunData rundata, Context context)
{
// we should first retrieve the portlet to customize and its parameters
// definition
PortletSet set = (PortletSet) ((JetspeedRunData) rundata).getCustomized();
try
{
String controller = rundata.getParameters().getString("controller");
if (controller != null)
{
Profile profile = ((JetspeedRunData) rundata).getCustomizedProfile();
PortletController pc = PortalToolkit.getController(controller);
if (pc != null)
{
set.setController(pc);
Portlets portlets = profile.getDocument().getPortletsById(set.getID());
Controller c = portlets.getController();
if (c == null)
{
c = new PsmlController();
portlets.setController(c);
}
c.setName(controller);
String linkedControl = pc.getConfig().getInitParameter("control");
if (linkedControl != null)
{
Control ctl = new PsmlControl();
ctl.setName(linkedControl);
portlets.setControl(ctl);
}
else
{
portlets.setControl(null);
}
}
}
}
catch (Exception e)
{
logger.error("Exception", e);
}
}
/**
* Set the skin in the PSML and the current PortletConfig
* using the HTML parameter "skin". If the parmeter is
* missing or 'blank', then the skin is set to null.
*
*/
/**
* Set the skin in the PSML and the current PortletConfig
* using the HTML parameter "skin". If the parmeter is
* missing or 'blank', then the skin is set to null.
*
*/
public void doSkin(RunData rundata, Context context)
{
// we should first retrieve the portlet to customize and its parameters
// definition
PortletSet set = (PortletSet) ((JetspeedRunData) rundata).getCustomized();
try
{
String skin = rundata.getParameters().getString("skin");
Profile profile = ((JetspeedRunData) rundata).getCustomizedProfile();
Portlets portlets = profile.getDocument().getPortletsById(set.getID());
// skin is neither null nor zero-length
if ((skin != null) && (skin.trim().length() > 0))
{
PortletSkin s = PortalToolkit.getSkin(skin);
if (s != null)
{
set.getPortletConfig().setPortletSkin(s);
Skin psmlSkin = portlets.getSkin();
if (psmlSkin == null)
{
portlets.setSkin(new PsmlSkin());
}
portlets.getSkin().setName(skin);
}
else
{
logger.warn("Unable to update skin for portlet set "
+ set.getID() + " because skin " + skin
+ " does not exist.");
return;
}
}
else
{
// skin is either null or zero-length
String custPortletSetID = portlets.getId();
String rootPortletSetID = profile.getRootSet().getID();
// set system default skin for root PSML element
if (custPortletSetID != null && rootPortletSetID != null &&
custPortletSetID.equals(rootPortletSetID))
{
// get system default skin
String defaultSkinName = JetspeedResources.getString("services.PortalToolkit.default.skin");
PortletSkin defaultSkin = PortalToolkit.getSkin(defaultSkinName);
if (defaultSkin != null)
{
set.getPortletConfig().setPortletSkin((PortletSkin) defaultSkin);
Skin psmlSkin = portlets.getSkin();
if (psmlSkin == null)
{
portlets.setSkin(new PsmlSkin());
}
portlets.getSkin().setName(defaultSkin.getName());
}
else
{
logger.warn("Unable to set default skin for root portlet set "
+ set.getID() + " because skin " + skin
+ " does not exist.");
return;
}
}
else
{
// By setting the skin to null, the parent's skin will be used.
set.getPortletConfig().setPortletSkin((PortletSkin) null);
portlets.setSkin(null);
}
}
}
catch (Exception e)
{
logger.error(e);
}
}
/**
* Set the SecuirtyRef in the PSML and the current PortletConfig
* using the HTML parameter "securityRef". If the parmeter is
* missing or 'blank', then the SecuriyReference is set to null.
*
*/
public void doSecurity(RunData rundata, Context context)
{
// we should first retrieve the portlet to customize and its parameters
// definition
PortletSet set = (PortletSet) ((JetspeedRunData) rundata).getCustomized();
try
{
String securityRefName = rundata.getParameters().getString("securityRef");
SecurityReference securityRef = null;
Profile profile = ((JetspeedRunData) rundata).getCustomizedProfile();
Portlets portlets = profile.getDocument().getPortletsById(set.getID());
if ((securityRefName != null) && (securityRefName.trim().length() > 0))
{
securityRef = new BaseSecurityReference();
securityRef.setParent(securityRefName);
}
set.getPortletConfig().setSecurityRef(securityRef);
portlets.setSecurityRef(securityRef);
}
catch (Exception e)
{
logger.error("Exception", e);
}
}
// Create a list of all available portlets
public static List buildPortletList(RunData data, PortletSet set, String mediaType, List allPortlets)
{
List list = new ArrayList();
Iterator i = Registry.get(Registry.PORTLET).listEntryNames();
while (i.hasNext())
{
PortletEntry entry = (PortletEntry) Registry.getEntry(Registry.PORTLET,
(String) i.next());
Iterator medias;
//Make a master portlet list, we will eventually us this to build a category list
allPortlets.add(entry);
// MODIFIED: Selection now takes care of the specified mediatype!
if (JetspeedSecurity.checkPermission((JetspeedUser) data.getUser(),
new PortalResource(entry),
JetspeedSecurity.PERMISSION_VIEW)
&& ((!entry.isHidden())
&& (!entry.getType().equals(PortletEntry.TYPE_ABSTRACT))
&& entry.hasMediaType(mediaType)))
{
list.add(entry);
}
}
String[] filterFields = (String[]) PortletSessionState.getAttribute(data, FILTER_FIELDS);
String[] filterValues = (String[]) PortletSessionState.getAttribute(data, FILTER_VALUES);
list = PortletFilter.filterPortlets(list, filterFields, filterValues);
Collections.sort(list,
new Comparator() {
public int compare(Object o1, Object o2)
{
String t1 = (((PortletEntry) o1).getTitle() != null)
? ((PortletEntry) o1).getTitle().toLowerCase()
: ((PortletEntry) o1).getName().toLowerCase();
String t2 = (((PortletEntry) o2).getTitle() != null)
? ((PortletEntry) o2).getTitle().toLowerCase()
: ((PortletEntry) o2).getName().toLowerCase();
return t1.compareTo(t2);
}
});
//this is used only by maintainUserSelection - which does not need the
//portlet list to be regenrated
PortletSessionState.setAttribute(data, PORTLET_LIST, list);
return list;
}
public static Map getUserSelections(RunData data)
{
Map userSelections = (Map) PortletSessionState.getAttribute(data, USER_SELECTIONS, null);
if (userSelections == null)
{
userSelections = new HashMap();
PortletSessionState.setAttribute(data, USER_SELECTIONS, userSelections);
}
return userSelections;
}
public static List buildInfoList(RunData data, String regName, String mediaType)
{
List list = new ArrayList();
String mime = ((JetspeedRunData) data).getCapability()
.getPreferredType()
.toString();
Iterator m = Registry.get(Registry.MEDIA_TYPE).listEntryNames();
// String mediaName = "html";
//
// while(m.hasNext())
// {
// MediaTypeEntry me = (MediaTypeEntry)
// Registry.getEntry(Registry.MEDIA_TYPE,(String)m.next());
//
// if (me!=null)
// {
// if (mime.equals(me.getMimeType()))
// {
// mediaName = me.getName();
// break;
// }
// }
// }
Iterator i = Registry.get(regName).listEntryNames();
while (i.hasNext())
{
PortletInfoEntry entry = (PortletInfoEntry) Registry.getEntry(regName,
(String) i.next());
// MODIFIED: Selection now takes care of the specified mediatype!
if (JetspeedSecurity.checkPermission((JetspeedUser) data.getUser(),
new PortalResource(entry),
JetspeedSecurity.PERMISSION_CUSTOMIZE)
&& ((!entry.isHidden())
&& entry.hasMediaType(mediaType)))
{
list.add(entry);
}
}
Collections.sort(list,
new Comparator() {
public int compare(Object o1, Object o2)
{
String t1 = (((RegistryEntry) o1).getTitle() != null)
? ((RegistryEntry) o1).getTitle()
: ((RegistryEntry) o1).getName();
String t2 = (((RegistryEntry) o2).getTitle() != null)
? ((RegistryEntry) o2).getTitle()
: ((RegistryEntry) o2).getName();
return t1.compareTo(t2);
}
});
return list;
}
public static List buildList(RunData data, String regName)
{
List list = new ArrayList();
Iterator i = Registry.get(regName).listEntryNames();
while (i.hasNext())
{
RegistryEntry entry = Registry.getEntry(regName, (String) i.next());
if (JetspeedSecurity.checkPermission((JetspeedUser) data.getUser(),
new PortalResource(entry),
JetspeedSecurity.PERMISSION_CUSTOMIZE)
&& (!entry.isHidden()))
{
list.add(entry);
}
}
Collections.sort(list,
new Comparator() {
public int compare(Object o1, Object o2)
{
String t1 = (((RegistryEntry) o1).getTitle() != null)
? ((RegistryEntry) o1).getTitle()
: ((RegistryEntry) o1).getName();
String t2 = (((RegistryEntry) o2).getTitle() != null)
? ((RegistryEntry) o2).getTitle()
: ((RegistryEntry) o2).getName();
return t1.compareTo(t2);
}
});
return list;
}
/**
* Builds a list of all portlet categories
* @param RunData current requests RunData object
* @param List portlets All available portlets
*/
public static List buildCategoryList(RunData data, String mediaType, List portlets)
{
boolean hideEmpties = JetspeedResources.getBoolean(HIDE_EMPTY_CATEGORIES, true);
TreeMap catMap = new TreeMap();
Iterator pItr = portlets.iterator();
while (pItr.hasNext())
{
PortletEntry entry = (PortletEntry) pItr.next();
if (hideEmpties)
{
if (JetspeedSecurity.checkPermission((JetspeedUser) data.getUser(),
new PortalResource(entry),
JetspeedSecurity.PERMISSION_VIEW)
&& ((!entry.isHidden())
&& (!entry.getType().equals(PortletEntry.TYPE_ABSTRACT))
&& entry.hasMediaType(mediaType)))
{
Iterator cItr = entry.listCategories();
while (cItr.hasNext())
{
BaseCategory cat = (BaseCategory) cItr.next();
catMap.put(cat.getName(), cat);
}
}
}
else
{
Iterator cItr = entry.listCategories();
while (cItr.hasNext())
{
BaseCategory cat = (BaseCategory) cItr.next();
catMap.put(cat.getName(), cat);
}
}
}
//BaseCategory allCat = new BaseCategory();
// allCat.setName("All Portlets");
// catMap.put(allCat.getName(), allCat);
return new ArrayList(catMap.values());
}
/**
* Adds a filter over the available portlets list based on category
*/
public void doFiltercategory(RunData rundata, Context context) throws Exception
{
String filterCat = rundata.getParameters().getString("filter_category", "All Portlets");
PortletSessionState.setAttribute(rundata, "filter_category", filterCat);
maintainUserSelections(rundata);
String mtype = rundata.getParameters().getString("mtype", null);
JetspeedLink link = JetspeedLinkFactory.getInstance(rundata);
DynamicURI duri = null;
if (mtype == null)
{
duri = link.setTemplate("Customize").addQueryData("start", "0");
}
else
{
duri = link.setTemplate("Customize").addQueryData("start", "0").addQueryData("mtype", mtype);
}
JetspeedLinkFactory.putInstance(link);
rundata.setRedirectURI(duri.toString());
return;
}
/**
* Adds a filter over the available portlets list based on category
*/
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];
if(filterField != null)
{
String filterValue = rundata.getParameters().getString(filterField + ":filter_value");
filterValues[i] = filterValue;
}
}
PortletSessionState.setAttribute(rundata, FILTER_FIELDS, filterFields);
PortletSessionState.setAttribute(rundata, FILTER_VALUES, filterValues);
maintainUserSelections(rundata);
String mtype = rundata.getParameters().getString("mtype", null);
JetspeedLink link = JetspeedLinkFactory.getInstance(rundata);
DynamicURI duri = null;
if (mtype == null)
{
duri = link.setTemplate("Customize").addQueryData("start", "0");
}
else
{
duri = link.setTemplate("Customize").addQueryData("start", "0").addQueryData("mtype", mtype);
}
JetspeedLinkFactory.putInstance(link);
rundata.setRedirectURI(duri.toString());
return;
}
private void addFiltersToContext(RunData data, Context context)
{
String[] filterFields = (String[]) PortletSessionState.getAttribute(data, FILTER_FIELDS);
String[] filterValues = (String[]) PortletSessionState.getAttribute(data, FILTER_VALUES);
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);
}
}
}
}