/**
* Copyright (C) 2009 eXo Platform SAS.
*
* This is free software; you can redistribute it and/or modify it
* under the terms of the GNU Lesser General Public License as
* published by the Free Software Foundation; either version 2.1 of
* the License, or (at your option) any later version.
*
* This software is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this software; if not, write to the Free
* Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
* 02110-1301 USA, or see the FSF site: http://www.fsf.org.
*/
package org.exoplatform.portal.pom.config.tasks;
import org.exoplatform.portal.application.PortletPreferences;
import org.exoplatform.portal.application.Preference;
import org.exoplatform.portal.pom.config.POMTask;
import org.exoplatform.portal.pom.data.Mapper;
import org.exoplatform.portal.pom.config.POMSession;
import org.exoplatform.portal.pom.spi.portlet.Portlet;
import org.exoplatform.portal.pom.spi.portlet.PortletBuilder;
import org.gatein.mop.api.content.Customization;
import org.gatein.mop.api.workspace.ObjectType;
import org.gatein.mop.api.workspace.Page;
import org.gatein.mop.api.workspace.Site;
import org.gatein.mop.api.workspace.Workspace;
import org.gatein.mop.api.workspace.ui.UIWindow;
import java.util.ArrayList;
/**
* @author <a href="mailto:julien.viet@exoplatform.com">Julien Viet</a>
* @version $Revision$
*/
public abstract class PortletPreferencesTask
{
/*
WindowID:
- persistenceId : portal#classic:/web/BannerPortlet/testPortletPreferences
- owner : portal#classic
- portletApplicationName : web
- portletName: BannerPortlet
- uniqueID : testPortletPreferences
*/
/** . */
protected final ObjectType<? extends Site> siteType;
/** . */
protected final String ownerType;
/** . */
protected final String ownerId;
/** . */
protected final String applicationName;
/** . */
protected final String portletName;
/** . */
protected final String instanceName;
/** . */
protected final String windowId;
protected PortletPreferencesTask(String windowId)
{
String[] chunks = Mapper.parseWindowId(windowId);
if (chunks.length < 4 || chunks.length > 5)
{
throw new IllegalArgumentException("Invalid window id " + windowId);
}
//
this.ownerType = chunks[0];
this.siteType = Mapper.parseSiteType(chunks[0]);
this.ownerId = chunks[1];
this.applicationName = chunks[2];
this.portletName = chunks[3];
this.instanceName = chunks.length > 4 ? chunks[4] : null;
this.windowId = windowId;
}
public static class Save extends PortletPreferencesTask implements POMTask<Void>
{
/** . */
private final PortletPreferences prefs;
public Save(PortletPreferences prefs)
{
super(prefs.getWindowId());
//
this.prefs = prefs;
}
public Class<Void> getValueType()
{
return Void.class;
}
public Void run(POMSession session) throws Exception
{
Workspace workspace = session.getWorkspace();
Site site = workspace.getSite(siteType, ownerId);
//
Customization customization = null;
if (site != null)
{
if (instanceName.startsWith("@"))
{
String id = instanceName.substring(1);
UIWindow window = session.findObjectById(ObjectType.WINDOW, id);
// Should check it's pointing to same instance though
customization = window.getCustomization();
}
else
{
int pos = instanceName.indexOf("#");
if (pos != -1)
{
String a = instanceName.substring(0, pos);
String b = instanceName.substring(pos + 1);
Page page = site.getRootPage().getChild("pages").getChild(b);
Customization c = page.getCustomizationContext().getCustomization(a);
if (c != null)
{
c.destroy();
}
customization =
page.getCustomizationContext().customize(a, Portlet.CONTENT_TYPE, applicationName + "/" + portletName,
new PortletBuilder().build());
}
else
{
Customization c = site.getCustomizationContext().getCustomization(instanceName);
if (c != null)
{
c.destroy();
}
customization =
site.getCustomizationContext().customize(instanceName, Portlet.CONTENT_TYPE, applicationName + "/" + portletName,
new PortletBuilder().build());
}
}
}
//
if (customization != null)
{
PortletBuilder builder = new PortletBuilder();
ArrayList<Preference> list = prefs.getPreferences();
if (list != null)
{
for (Preference pref : list)
{
builder.add(pref.getName(), pref.getValues(), pref.isReadOnly());
}
}
customization.setState(builder.build());
}
else
{
session.addPortletPreferences(prefs);
}
//
return null;
}
}
public static class Load extends PortletPreferencesTask implements POMTask<PortletPreferences>
{
public Load(String windowId)
{
super(windowId);
}
public Class<PortletPreferences> getValueType()
{
return PortletPreferences.class;
}
public PortletPreferences run(POMSession session) throws Exception
{
Workspace workspace = session.getWorkspace();
Site site = workspace.getSite(siteType, ownerId);
if (site == null)
{
throw new IllegalArgumentException("Cannot load portlet preferences " + windowId
+ " as the corresponding portal " + ownerId + " with type " + siteType + " does not exist");
}
//
if (instanceName != null)
{
Customization<Portlet> customization;
if (instanceName.startsWith("@"))
{
String id = instanceName.substring(1);
UIWindow window = session.findObjectById(ObjectType.WINDOW, id);
customization = (Customization<Portlet>)window.getCustomization();
}
else
{
int pos = instanceName.indexOf('#');
if (pos == -1)
{
customization = (Customization<Portlet>)site.getCustomizationContext().getCustomization(instanceName);
}
else
{
String a = instanceName.substring(0, pos);
String b = instanceName.substring(pos + 1);
Page page = site.getRootPage().getChild("pages").getChild(b);
customization = (Customization<Portlet>)page.getCustomizationContext().getCustomization(a);
}
}
//
if (customization != null)
{
Portlet state = customization.getVirtualState();
if (state != null)
{
ArrayList<Preference> list = new ArrayList<Preference>();
for (org.exoplatform.portal.pom.spi.portlet.Preference preference : state)
{
Preference pref = new Preference();
pref.setName(preference.getName());
pref.setValues(new ArrayList<String>(preference.getValues()));
pref.setReadOnly(preference.isReadOnly());
list.add(pref);
}
PortletPreferences prefs = new PortletPreferences();
prefs.setWindowId(windowId);
prefs.setPreferences(list);
return prefs;
}
}
}
//
return null;
}
}
}