You are viewing a plain text version of this content. The canonical link for it is here.
Posted to jetspeed-dev@portals.apache.org by ta...@apache.org on 2017/12/01 02:52:44 UTC
svn commit: r1816790 - in /portals/jetspeed-2/portal/trunk:
components/jetspeed-portlet-factory/src/main/java/org/apache/jetspeed/factory/
jetspeed-portal-resources/src/main/resources/assembly/
jetspeed-portal-resources/src/main/resources/conf/jetspeed/
Author: taylor
Date: Fri Dec 1 02:52:44 2017
New Revision: 1816790
URL: http://svn.apache.org/viewvc?rev=1816790&view=rev
Log:
JS2-1363: Jetspeed Portlet Factory extension to provide factories for creating portlets, filters and validators
Modified:
portals/jetspeed-2/portal/trunk/components/jetspeed-portlet-factory/src/main/java/org/apache/jetspeed/factory/JetspeedPortletFactory.java
portals/jetspeed-2/portal/trunk/jetspeed-portal-resources/src/main/resources/assembly/registry.xml
portals/jetspeed-2/portal/trunk/jetspeed-portal-resources/src/main/resources/conf/jetspeed/jetspeed.properties
Modified: portals/jetspeed-2/portal/trunk/components/jetspeed-portlet-factory/src/main/java/org/apache/jetspeed/factory/JetspeedPortletFactory.java
URL: http://svn.apache.org/viewvc/portals/jetspeed-2/portal/trunk/components/jetspeed-portlet-factory/src/main/java/org/apache/jetspeed/factory/JetspeedPortletFactory.java?rev=1816790&r1=1816789&r2=1816790&view=diff
==============================================================================
--- portals/jetspeed-2/portal/trunk/components/jetspeed-portlet-factory/src/main/java/org/apache/jetspeed/factory/JetspeedPortletFactory.java (original)
+++ portals/jetspeed-2/portal/trunk/components/jetspeed-portlet-factory/src/main/java/org/apache/jetspeed/factory/JetspeedPortletFactory.java Fri Dec 1 02:52:44 2017
@@ -16,28 +16,6 @@
*/
package org.apache.jetspeed.factory;
-import java.io.IOException;
-import java.lang.reflect.Method;
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Locale;
-import java.util.Map;
-import java.util.MissingResourceException;
-import java.util.PropertyResourceBundle;
-import java.util.ResourceBundle;
-
-import javax.portlet.GenericPortlet;
-import javax.portlet.Portlet;
-import javax.portlet.PortletException;
-import javax.portlet.PortletMode;
-import javax.portlet.PortletURLGenerationListener;
-import javax.portlet.PreferencesValidator;
-import javax.portlet.UnavailableException;
-import javax.portlet.filter.PortletFilter;
-import javax.servlet.ServletContext;
-
import org.apache.jetspeed.PortalContext;
import org.apache.jetspeed.components.portletregistry.RegistryEventListener;
import org.apache.jetspeed.container.ContainerInfo;
@@ -58,6 +36,28 @@ import org.apache.portals.bridges.common
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
+import javax.portlet.GenericPortlet;
+import javax.portlet.Portlet;
+import javax.portlet.PortletException;
+import javax.portlet.PortletMode;
+import javax.portlet.PortletURLGenerationListener;
+import javax.portlet.PreferencesValidator;
+import javax.portlet.UnavailableException;
+import javax.portlet.filter.PortletFilter;
+import javax.servlet.ServletContext;
+import java.io.IOException;
+import java.lang.reflect.InvocationTargetException;
+import java.lang.reflect.Method;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Locale;
+import java.util.Map;
+import java.util.MissingResourceException;
+import java.util.PropertyResourceBundle;
+import java.util.ResourceBundle;
+
/**
* <p>
* JetspeedPortletFactory
@@ -70,10 +70,9 @@ import org.slf4j.LoggerFactory;
* @version $Id$
*
*/
-public class JetspeedPortletFactory implements PortletFactory, RegistryEventListener
-{
+public class JetspeedPortletFactory implements PortletFactory, RegistryEventListener {
private static final Logger log = LoggerFactory.getLogger(JetspeedPortletFactory.class);
-
+
private Map<String, Map<String, PortletInstance>> portletCache;
private Map<String, Map<String, PreferencesValidator>> validatorCache;
private Map<String, Map<String, PortletFilterInstance>> portletFilterCache;
@@ -108,29 +107,33 @@ public class JetspeedPortletFactory impl
* Delegated portlet unique name for config mode
*/
private String customConfigModePortletUniqueName;
-
+
/**
* Flag whether the instantiated proxy will switch preview mode to built-in
* preview markup generating portlet or not.
*/
private boolean autoSwitchPreviewMode;
-
+
/**
* Delegated portlet unique name for preview mode
*/
private String customPreviewModePortletUniqueName;
- public JetspeedPortletFactory(RequestDispatcherService rdService)
- {
+ private boolean isFactoryExtensionsEnabled = false;
+
+ public JetspeedPortletFactory(RequestDispatcherService rdService) {
this(rdService, false, false);
}
-
- public JetspeedPortletFactory(RequestDispatcherService rdService, boolean autoSwitchConfigMode, boolean autoSwitchEditDefaultsModeToEditMode)
- {
+
+ public JetspeedPortletFactory(RequestDispatcherService rdService, boolean autoSwitchConfigMode, boolean autoSwitchEditDefaultsModeToEditMode) {
this(rdService, autoSwitchConfigMode, autoSwitchEditDefaultsModeToEditMode, false);
}
-
- public JetspeedPortletFactory(RequestDispatcherService rdService, boolean autoSwitchConfigMode, boolean autoSwitchEditDefaultsModeToEditMode, boolean autoSwitchPreviewMode)
+
+ public JetspeedPortletFactory(RequestDispatcherService rdService, boolean autoSwitchConfigMode, boolean autoSwitchEditDefaultsModeToEditMode, boolean autoSwitchPreviewMode) {
+ this(rdService, autoSwitchConfigMode, autoSwitchEditDefaultsModeToEditMode, false, false);
+ }
+
+ public JetspeedPortletFactory(RequestDispatcherService rdService, boolean autoSwitchConfigMode, boolean autoSwitchEditDefaultsModeToEditMode, boolean autoSwitchPreviewMode, boolean isFactoryExtensionsEnabled)
{
this.rdService = rdService;
this.portletCache = Collections.synchronizedMap(new HashMap<String, Map<String, PortletInstance>>());
@@ -145,6 +148,7 @@ public class JetspeedPortletFactory impl
this.autoSwitchPreviewMode = autoSwitchPreviewMode;
this.portletProxyUsed = (this.autoSwitchConfigMode || this.autoSwitchEditDefaultsModeToEditMode || this.autoSwitchPreviewMode);
this.servletContextProvider = new JetspeedServletContextProviderImpl(rdService);
+ this.isFactoryExtensionsEnabled = isFactoryExtensionsEnabled;
}
protected ResourceBundle loadResourceBundle( Locale locale, String bundleName, ClassLoader cl )
@@ -310,8 +314,7 @@ public class JetspeedPortletFactory impl
try
{
Class<?> clazz = paCl.loadClass(className);
- validator = (PreferencesValidator) clazz.newInstance();
-
+ validator = (PreferencesValidator) createExtendedFactoryObject(clazz, "createValidator", pdName, paName);
if (instanceCache == null)
{
instanceCache = Collections.synchronizedMap(new HashMap<String, PreferencesValidator>());
@@ -442,7 +445,7 @@ public class JetspeedPortletFactory impl
* Gets a portlet by either creating it or returning a handle to it from the
* portlet 'cache'
*
- * @param portletDefinition
+ * @param pd
* The definition of the portlet
* @return PortletInstance
* @throws PortletException
@@ -456,7 +459,7 @@ public class JetspeedPortletFactory impl
* Gets a portlet by either creating it or returning a handle to it from the
* portlet 'cache'
*
- * @param portletDefinition
+ * @param pd
* The definition of the portlet
* @return PortletInstance
* @throws PortletException
@@ -510,12 +513,12 @@ public class JetspeedPortletFactory impl
// complete
// and thereby releasing all its ClassLoader locks as
// needed for local portlets.
-
+ Portlet newInstance = (Portlet)createExtendedFactoryObject(clazz, "createPortlet", pdName, paName);
if (proxyUsed)
{
portlet = new JetspeedPortletProxyInstance(
pd.getPortletName(),
- (Portlet) clazz.newInstance(),
+ newInstance,
this.autoSwitchEditDefaultsModeToEditMode,
this.autoSwitchConfigMode, this.customConfigModePortletUniqueName,
this.autoSwitchPreviewMode, this.customPreviewModePortletUniqueName
@@ -523,7 +526,7 @@ public class JetspeedPortletFactory impl
}
else
{
- portlet = new JetspeedPortletInstance(pdName, (Portlet)clazz.newInstance());
+ portlet = new JetspeedPortletInstance(pdName, newInstance);
}
}
finally
@@ -707,7 +710,7 @@ public class JetspeedPortletFactory impl
try
{
Class<? extends Object> clazz = paCl.loadClass(filter.getFilterClass());
- PortletFilter portletFilter = (PortletFilter) clazz.newInstance();
+ PortletFilter portletFilter = (PortletFilter)createExtendedFactoryObject(clazz, "createFilter", filterName, paName);
filterInstance = new JetspeedPortletFilterInstance(filter, portletFilter);
}
catch (ClassNotFoundException e)
@@ -716,7 +719,7 @@ public class JetspeedPortletFactory impl
log.error(message);
throw new UnavailableException(message);
}
- catch (InstantiationException e)
+ catch (InstantiationException | InvocationTargetException e)
{
String message = "The filter class instantiation fail: " + filter.getFilterClass();
log.error(message);
@@ -931,4 +934,52 @@ public class JetspeedPortletFactory impl
{
portletUpdated(pd);
}
+
+ /**
+ * Provide the portlet provider with the ability to create its own portlets, portlet filters, and validators
+ *
+ * Three static factory methods supported as
+ * createPortlet
+ * createFilter
+ * createValidator
+ *
+ * @param clazz the portlet class
+ * @param factoryMethod the factory create method to invoke
+ * @param name the name of the portlet
+ * @param paName the portlet application name
+ * @return a new Portlet, PortletFilter, or PreferencesValidator
+ * @throws InvocationTargetException
+ * @throws InstantiationException
+ * @throws IllegalAccessException
+ */
+ protected Object createExtendedFactoryObject(Class clazz, String factoryMethod, String name, String paName)
+ throws InvocationTargetException, InstantiationException, IllegalAccessException {
+ if (!isFactoryExtensionsEnabled) {
+ return clazz.newInstance();
+ }
+ Object newInstance = null;
+ Method method = null;
+ try {
+ method = clazz.getMethod(factoryMethod, Class.class, String.class, String.class);
+ }
+ catch (NoSuchMethodException e) {
+ return clazz.newInstance();
+ }
+ if (method != null) {
+ try {
+ newInstance = method.invoke(null, clazz, name, paName);
+ if (newInstance == null) {
+ newInstance = clazz.newInstance();
+ }
+ }
+ catch(Exception e) {
+ log.error("Failed to invoke class factory method: " + e.getMessage(), e);
+ newInstance = clazz.newInstance();
+ }
+ }
+ else {
+ newInstance = clazz.newInstance();
+ }
+ return newInstance;
+ }
}
Modified: portals/jetspeed-2/portal/trunk/jetspeed-portal-resources/src/main/resources/assembly/registry.xml
URL: http://svn.apache.org/viewvc/portals/jetspeed-2/portal/trunk/jetspeed-portal-resources/src/main/resources/assembly/registry.xml?rev=1816790&r1=1816789&r2=1816790&view=diff
==============================================================================
--- portals/jetspeed-2/portal/trunk/jetspeed-portal-resources/src/main/resources/assembly/registry.xml (original)
+++ portals/jetspeed-2/portal/trunk/jetspeed-portal-resources/src/main/resources/assembly/registry.xml Fri Dec 1 02:52:44 2017
@@ -39,6 +39,9 @@
<constructor-arg index="3">
<value>${supported.portletmode.autoswitch.preview}</value>
</constructor-arg>
+ <constructor-arg index="4">
+ <value>${factory.portlet.extensions}</value>
+ </constructor-arg>
<!-- Surrogate portlet for config modes. -->
<property name="customConfigModePortletUniqueName">
<value>${supported.portletmode.autoswitch.config.surrogate.portlet}</value>
Modified: portals/jetspeed-2/portal/trunk/jetspeed-portal-resources/src/main/resources/conf/jetspeed/jetspeed.properties
URL: http://svn.apache.org/viewvc/portals/jetspeed-2/portal/trunk/jetspeed-portal-resources/src/main/resources/conf/jetspeed/jetspeed.properties?rev=1816790&r1=1816789&r2=1816790&view=diff
==============================================================================
--- portals/jetspeed-2/portal/trunk/jetspeed-portal-resources/src/main/resources/conf/jetspeed/jetspeed.properties (original)
+++ portals/jetspeed-2/portal/trunk/jetspeed-portal-resources/src/main/resources/conf/jetspeed/jetspeed.properties Fri Dec 1 02:52:44 2017
@@ -474,5 +474,11 @@ autorefresh.enabled = true
#-------------------------------------------------------------------------
resource.loader.filesystem = true
+#-------------------------------------------------------------------------
+# Enable loading portlets from factory extensions
+# since 2.3.2
+#-------------------------------------------------------------------------
+factory.portlet.extensions = false
+
---------------------------------------------------------------------
To unsubscribe, e-mail: jetspeed-dev-unsubscribe@portals.apache.org
For additional commands, e-mail: jetspeed-dev-help@portals.apache.org