From: <ap...@vh...> - 2005-09-22 04:24:57
|
Author: apevec Date: 2005-09-22 06:15:27 +0200 (Thu, 22 Sep 2005) New Revision: 899 Modified: trunk/ccm-ldn-portal/application.xml trunk/ccm-ldn-portal/src/com/arsdigita/london/portal/Workspace.java trunk/ccm-ldn-portal/src/com/arsdigita/london/portal/WorkspaceConfig.java trunk/ccm-ldn-portal/src/com/arsdigita/london/portal/WorkspaceConfig_parameter.properties trunk/ccm-ldn-portal/src/com/arsdigita/london/portal/ui/PortletTypeForm.java Log: SF patch [ 1185913 ] Restrict available portlet types Two initialisation parameters: com.arsdigita.london.portal.excluded_portlet_types and com.arsdigita.london.portal.admin_only_portlet_types They prevent specified types from appearing in the drop down lists. The values are string arrays of portlet application type object types. Modified: trunk/ccm-ldn-portal/application.xml =================================================================== --- trunk/ccm-ldn-portal/application.xml 2005-09-22 03:20:38 UTC (rev 898) +++ trunk/ccm-ldn-portal/application.xml 2005-09-22 04:15:27 UTC (rev 899) @@ -3,11 +3,12 @@ name="ccm-ldn-portal" prettyName="Portal" version="1.4.3" - release="1" + release="2" webapp="ROOT"> <ccm:dependencies> <ccm:requires name="ccm-core" version="6.1.2"/> <ccm:requires name="ccm-cms" version="6.1.2"/> + <ccm:requires name="ccm-ldn-subsite" version="1.4.2"/> <ccm:requires name="ccm-forum" version="1.4.2" relation="ge"/> <ccm:requires name="ccm-ldn-navigation" version="1.4.5"/> <ccm:requires name="ccm-ldn-rss" version="1.4.2"/> Modified: trunk/ccm-ldn-portal/src/com/arsdigita/london/portal/Workspace.java =================================================================== --- trunk/ccm-ldn-portal/src/com/arsdigita/london/portal/Workspace.java 2005-09-22 03:20:38 UTC (rev 898) +++ trunk/ccm-ldn-portal/src/com/arsdigita/london/portal/Workspace.java 2005-09-22 04:15:27 UTC (rev 899) @@ -63,6 +63,12 @@ public static final String PAGES = "pages"; + /** + * store this as a static variable as it cannot change during the lifetime of the ccm service + */ + private static Workspace defaultHomepageWorkspace = null; + + public Workspace(DataObject obj) { super(obj); } @@ -149,6 +155,37 @@ return workspace; } + /** + * + * retrieve the workspace that is created during loading of the ccm-ldn-portal application and + * is set as the defaultworkspace for the site. + * + * Returns null if there are no workspaces (though presumably if that is the case, ccm-ldn-portal + * hasn't been loaded and so I don't know how you are invoking this method!) + * + * @return + */ + public static Workspace getDefaultHomepageWorkspace() { + if (null == defaultHomepageWorkspace) { + // default homepage workspace is created during com.arsdigita.london.portal.Loader + // it's attributes are all load variables that are lost as soon as the application + // is loaded. So, finding the default homepage workspace is a bit tricky - can't filter on name + // or anything else that is site specific - best bet is to assume + // that it is the first workspace created (a reasonable assumption at the moment because + // it is created straight after the Workspace application type is created. + WorkspaceCollection workspaces = Workspace.retrieveAll(); + workspaces.addOrder(Application.TIMESTAMP); + if (workspaces.next()) { + defaultHomepageWorkspace = workspaces.getWorkspace(); + } + workspaces.close(); + + + } + return defaultHomepageWorkspace; + + } + public void beforeSave() { // If no permissions are configured, then setup empty groups if (get(PARTY) == null) { Modified: trunk/ccm-ldn-portal/src/com/arsdigita/london/portal/WorkspaceConfig.java =================================================================== --- trunk/ccm-ldn-portal/src/com/arsdigita/london/portal/WorkspaceConfig.java 2005-09-22 03:20:38 UTC (rev 898) +++ trunk/ccm-ldn-portal/src/com/arsdigita/london/portal/WorkspaceConfig.java 2005-09-22 04:15:27 UTC (rev 899) @@ -22,14 +22,20 @@ import com.arsdigita.util.parameter.BooleanParameter; import com.arsdigita.util.parameter.Parameter; +import com.arsdigita.util.parameter.StringArrayParameter; import com.arsdigita.util.parameter.URLParameter; import com.arsdigita.util.parameter.StringParameter; import com.arsdigita.util.UncheckedWrapperException; import java.io.InputStream; import java.io.IOException; +import java.lang.reflect.Array; import java.net.URL; import java.net.MalformedURLException; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collections; +import java.util.List; import org.apache.log4j.Logger; @@ -41,6 +47,8 @@ private URLParameter m_adapters; private StringParameter m_defaultLayout; private BooleanParameter m_createUserWorkspaces; + private Parameter m_excludedPortletTypes; + private Parameter m_adminPortletTypes; public WorkspaceConfig() { try { @@ -63,10 +71,16 @@ Parameter.REQUIRED, Boolean.TRUE); + m_excludedPortletTypes = new StringArrayParameter + ("com.arsdigita.london.portal.excluded_portlet_types", Parameter.OPTIONAL, new String[0]); + m_adminPortletTypes = new StringArrayParameter + ("com.arsdigita.london.portal.admin_only_portlet_types", Parameter.OPTIONAL, new String[0]); + register(m_adapters); register(m_defaultLayout); - register(m_createUserWorkspaces); - + register(m_createUserWorkspaces); + register(m_excludedPortletTypes); + register(m_adminPortletTypes); loadInfo(); } @@ -83,6 +97,17 @@ } public boolean getCreateUserWorkspaces() { - return ((Boolean)get(m_createUserWorkspaces)).booleanValue(); + return ((Boolean)get(m_createUserWorkspaces)).booleanValue(); } + + public List getExcludedPortletTypes() { + String[] excludedTypes = (String[])get(m_excludedPortletTypes); + return Arrays.asList(excludedTypes); + } + + public List getAdminPortletTypes() { + String[] adminTypes = (String[])get(m_adminPortletTypes); + return Arrays.asList(adminTypes); + } + } Modified: trunk/ccm-ldn-portal/src/com/arsdigita/london/portal/WorkspaceConfig_parameter.properties =================================================================== --- trunk/ccm-ldn-portal/src/com/arsdigita/london/portal/WorkspaceConfig_parameter.properties 2005-09-22 03:20:38 UTC (rev 898) +++ trunk/ccm-ldn-portal/src/com/arsdigita/london/portal/WorkspaceConfig_parameter.properties 2005-09-22 04:15:27 UTC (rev 899) @@ -13,3 +13,12 @@ com.arsdigita.london.portal.create_user_workspaces.format=[boolean] com.arsdigita.london.portal.create_user_workspaces.example=false +com.arsdigita.london.portal.excluded_portlet_types.title=Portlet types not available on this site +com.arsdigita.london.portal.excluded_portlet_types.purpose=Prevent these type appearing in the drop down list of portlets to add to the page +com.arsdigita.london.portal.excluded_portlet_types.format=[string,string,string] +com.arsdigita.london.portal.excluded_portlet_types.example=com.arsdigita.london.portal.portlet.ApplicationDirectoryPortlet,com.arsdigita.london.portal.portlet.TimeOfDayPortlet + +com.arsdigita.london.portal.admin_only_portlet_types.title=Portlet types only available to page admin +com.arsdigita.london.portal.admin_only_portlet_types.purpose=Only available to administrator of homepage, or subsite frontpage +com.arsdigita.london.portal.admin_only_portlet_types.format=[string,string,string] +com.arsdigita.london.portal.admin_only_portlet_types.example=com.arsdigita.london.portal.portlet.ApplicationDirectoryPortlet,com.arsdigita.london.portal.portlet.TimeOfDayPortlet Modified: trunk/ccm-ldn-portal/src/com/arsdigita/london/portal/ui/PortletTypeForm.java =================================================================== --- trunk/ccm-ldn-portal/src/com/arsdigita/london/portal/ui/PortletTypeForm.java 2005-09-22 03:20:38 UTC (rev 898) +++ trunk/ccm-ldn-portal/src/com/arsdigita/london/portal/ui/PortletTypeForm.java 2005-09-22 04:15:27 UTC (rev 899) @@ -19,23 +19,38 @@ import com.arsdigita.bebop.Label; import com.arsdigita.bebop.form.SingleSelect; import com.arsdigita.bebop.form.Submit; + +import java.util.List; import java.util.TooManyListenersException; import com.arsdigita.bebop.parameters.NotNullValidationListener; import com.arsdigita.bebop.PageState; import com.arsdigita.bebop.event.PrintListener; import com.arsdigita.bebop.form.OptionGroup; import com.arsdigita.bebop.event.PrintEvent; +import com.arsdigita.kernel.Kernel; +import com.arsdigita.kernel.User; +import com.arsdigita.kernel.permissions.PermissionDescriptor; +import com.arsdigita.kernel.permissions.PermissionService; +import com.arsdigita.kernel.permissions.PrivilegeDescriptor; +import com.arsdigita.london.portal.Workspace; +import com.arsdigita.london.subsite.Subsite; +import com.arsdigita.persistence.Filter; import com.arsdigita.portal.PortletTypeCollection; import com.arsdigita.portal.PortletType; +import com.arsdigita.web.Application; import com.arsdigita.bebop.form.Option; import com.arsdigita.bebop.SimpleContainer; + import java.math.BigDecimal; +import org.apache.log4j.Logger; + public class PortletTypeForm extends Form { private Label m_portletTypeLabel; private SingleSelect m_portletType; private Submit m_submit; + private static Logger s_log = Logger.getLogger(PortletTypeForm.class); private PrintListener m_portletTypePrintListener = new PrintListener() { public void prepare(PrintEvent e) { @@ -45,8 +60,39 @@ PortletTypeCollection portletTypes = PortletType.retrieveAllPortletTypes(); + List excludedTypes = Workspace.getConfig().getExcludedPortletTypes(); + if (!excludedTypes.isEmpty()) { + Filter excludedTypesFilter = + portletTypes.addFilter(Application.OBJECT_TYPE + " not in :nonDisplayTypes"); + excludedTypesFilter.set("nonDisplayTypes", excludedTypes); + } + User thisUser = (User) Kernel.getContext().getParty(); + if (thisUser == null) { + // can't actually happen, as user must be logged in at the point when the page with this portal in edit mode was requested + thisUser = Kernel.getPublicUser(); + } + Workspace mainWorkspace; + if (Subsite.getContext().hasSite()) { + mainWorkspace = (Workspace) Subsite.getContext().getSite().getFrontPage(); + } else { + mainWorkspace = Workspace.getDefaultHomepageWorkspace(); + } + + PermissionDescriptor admin = new PermissionDescriptor( + PrivilegeDescriptor.ADMIN, + mainWorkspace, + thisUser); + if (PermissionService.checkPermission(admin)) { + s_log.debug(thisUser.getName() + " has admin rights on the current workspace"); + } else { + s_log.debug(thisUser.getName() + " cannot administer the current main workspace"); + List adminTypes = Workspace.getConfig().getAdminPortletTypes(); + if (!adminTypes.isEmpty()) { + Filter adminTypesFilter = portletTypes.addFilter(Application.OBJECT_TYPE + " not in :adminTypes"); + adminTypesFilter.set("adminTypes", adminTypes); + } + } portletTypes.addOrder("title"); - while (portletTypes.next()) { PortletType portletType = portletTypes.getPortletType(); Option option = new Option |