SessionState customizationState =
((JetspeedRunData) rundata).getPageSessionState();
// we should first retrieve the portlet to customize and its parameters
// definition
Portlet p = ((JetspeedRunData) rundata).getCustomized();
Vector params =
(Vector) customizationState.getAttribute("customize-parameters");
String newSecurityParent =
rundata.getParameters().getString("_security_ref");
String newSkinName =
(String) rundata.getParameters().getString("_skin");
String newTitle =
(String) rundata.getParameters().getString("current_title");
String newControlName =
(String) rundata.getParameters().getString("_control");
boolean changeRequested =
((params != null)
|| (newSkinName != null)
|| (newSecurityParent != null)
|| (newTitle != null)
|| (newControlName != null));
boolean madePsChange = false;
boolean madePcChange = false;
if ((p == null) || (changeRequested == false))
{
doCancel(rundata, context);
return;
}
PortletConfig pc = p.getPortletConfig();
Profile profile = ((JetspeedRunData) rundata).getCustomizedProfile();
Entry entry = profile.getDocument().getEntryById(p.getID());
// Only update the security ref if the parent changed
if ((newSecurityParent != null))
{
boolean securityChanged = false;
SecurityReference currentSecurityRef = pc.getSecurityRef();
if (currentSecurityRef != null)
{
securityChanged =
(newSecurityParent.equals(currentSecurityRef.getParent())
== false);
}
else
{
securityChanged = (newSecurityParent.trim().length() > 0);
}
if (securityChanged == true)
{
SecurityReference securityRef = null;
if ((newSecurityParent.trim().length() > 0))
{
securityRef = new BaseSecurityReference();
securityRef.setParent(newSecurityParent);
}
// Note: setting the portlet's config may not be a good idea -
// it might be used as the Portlet for other PSMLDocument Entries that
// have a different idea of security - and the caching of Portlets does
// NOT include security -ggolden.
pc.setSecurityRef(securityRef);
entry.setSecurityRef(securityRef);
madePcChange = true;
}
}
// Only update the skin if the name changed
if (newSkinName != null)
{
boolean skinChanged = false;
String currentSkinName = null;
if (pc.getSkin() != null)
currentSkinName = pc.getPortletSkin().getName();
if (currentSkinName != null)
{
skinChanged = (newSkinName.equals(currentSkinName) == false);
}
else
{
skinChanged = (newSkinName.trim().length() > 0);
}
if (skinChanged == true)
{
PortletSkin skin = null;
if ((newSkinName.trim().length() > 0))
{
skin = PortalToolkit.getSkin(newSkinName);
if (skin != null)
{
// Note: setting the portlet's config may not be a good idea -
// it might be used as the Portlet for other PSMLDocument Entries that
// have a different idea of skin - and the caching of Portlets does
// NOT include skin -ggolden.
pc.setPortletSkin(skin);
Skin psmlSkin = entry.getSkin();
if (psmlSkin == null)
{
entry.setSkin(new PsmlSkin());
}
entry.getSkin().setName(newSkinName);
}
else
{
logger.warn(
"Unable to update skin for portlet entry "
+ entry.getId()
+ " because skin "
+ skin
+ " does not exist.");
}
}
else
{
// Note: setting the portlet's config may not be a good idea -
// it might be used as the Portlet for other PSMLDocument Entries that
// have a different idea of skin - and the caching of Portlets does
// NOT include skin -ggolden.
pc.setPortletSkin(null);
entry.setSkin(null);
}
madePcChange = true;
}
}
// Only update the title if the title changed
if (newTitle != null)
{
boolean titleChanged = false;
String currentTitle = entry.getTitle();
MetaData md = pc.getMetainfo();
if (currentTitle == null && md != null && md.getTitle() != null)
currentTitle = md.getTitle();
if (currentTitle != null)
{
titleChanged = (newTitle.equals(currentTitle) == false);
}
else
{
titleChanged = (newTitle.trim().length() > 0);
}
if (titleChanged == true)
{
if ((newTitle.trim().length() > 0))
{
// Note: setting the portlet's config may not be a good idea -
// it might be used as the Portlet for other PSMLDocument Entries that
// have a different idea of title - and the caching of Portlets does
// NOT include title -ggolden.
if (md == null)
{
md = new MetaData();
pc.setMetainfo(md);
}
md.setTitle(newTitle);
entry.setTitle(newTitle);
madePcChange = true;
}
}
}
// Only update the control if the name changed
if (newControlName != null)
{
boolean controlChanged = false;
String currentControlName = null;
if (entry.getControl() != null)
currentControlName = entry.getControl().getName();
if (currentControlName != null)
{
controlChanged = (newControlName.equals(currentControlName) == false);
}
else
{
controlChanged = (newControlName.trim().length() > 0);
}
if (controlChanged == true)
{
PortletControl control = null;
if ((newControlName.trim().length() > 0))
{
control = PortalToolkit.getControl(newControlName);
if (control != null)
{
Control psmlControl = new PsmlControl();
psmlControl.setName(newControlName);
entry.setControl(psmlControl);
}
else
{
logger.warn(
"Unable to update control for portlet entry "
+ entry.getId()
+ " because control "
+ newControlName
+ " does not exist.");
}
}
else
{
entry.setControl(null);
}
madePcChange = true;
}
}
// Update paramaters
try
{
PortletInstance instance =
PersistenceManager.getInstance(p, rundata);
PortletEntry regEntry =
(PortletEntry) Registry.getEntry(Registry.PORTLET, p.getName());
Iterator i = params.iterator();
//System.out.println("==========================================");
while (i.hasNext())
{
Parameter param = (Parameter) i.next();
String name = param.getName();
String newValue = null;
String[] testArray = rundata.getParameters().getStrings(name);
if (testArray != null && testArray.length > 1)
{
newValue =
org.apache.jetspeed.util.StringUtils.arrayToString(
testArray,
",");
}
else
{
newValue = rundata.getParameters().getString(name);
if (newValue == null)
{
newValue = "";
}
}
String regValue = regEntry.getParameter(name).getValue();
//param.getValue();
String psmlValue = instance.getAttribute(name);
//System.out.println(name + "= [" + psmlValue + "] in psml");
//System.out.println(name + "= [" + regValue + "] in registry");
// New value for this parameter exists
if (newValue != null)
{
//System.out.println(name + "= [" + newValue + "] in request");
// New value differs from registry - record it in psml
if (!regValue.equals(newValue)
|| !psmlValue.equals(newValue))
{
instance.setAttribute(name, newValue);
psmlValue = newValue;
//System.out.println("setting attribute for [" + name + "] to [" + newValue + "]");
}
madePsChange = true;
}
// Remove duplicate parameters from psml
if (psmlValue != null && psmlValue.equals(regValue))
{
//System.out.println("removing attribute for [" + name + "]");
instance.removeAttribute(name);
madePsChange = true;
}
}
// save all the changes
if ((madePsChange == true) || (madePcChange == true))
{
try
{
JetspeedRunData jdata = (JetspeedRunData) rundata;
profile.store();
//FIXME: this hack is due to the corrupted lifecycle of the portlet in the
//current API when caching is activated
p.init();
org
.apache
.jetspeed
.util
.PortletSessionState
.setPortletConfigChanged(
p,
rundata);
}
catch (PortletException e)
{
logger.error(
"Customizer failed to reinitialize the portlet "
+ p.getName(),
e);
}
catch (Exception e)
{
logger.error("Unable to save profile ", e);