This is an automated email from the ASF dual-hosted git repository. mbien pushed a commit to branch master in repository https://gitbox.apache.org/repos/asf/roller.git
commit 5a675ae518c1eb693e7198c6bded776a55369dc0 Author: Michael Bien <[email protected]> AuthorDate: Sat Jul 10 10:23:23 2021 +0200 Extracted common reflection code into new Reflection util. --- .../weblogger/business/GuiceWebloggerProvider.java | 3 +- .../weblogger/business/WebloggerFactory.java | 3 +- .../business/plugins/PluginManagerImpl.java | 63 ++++++----------- .../weblogger/business/runnable/TaskRunner.java | 3 +- .../business/runnable/ThreadManagerImpl.java | 3 +- .../roller/weblogger/ui/core/RollerContext.java | 14 ++-- .../ui/core/plugins/UIPluginManagerImpl.java | 32 +++------ .../weblogger/ui/rendering/RendererManager.java | 62 ++++++----------- .../ui/rendering/filters/RequestMappingFilter.java | 52 ++++---------- .../weblogger/ui/rendering/model/ModelLoader.java | 3 +- .../plugins/comments/CommentValidationManager.java | 23 ++----- .../servlets/CommentAuthenticatorServlet.java | 3 +- .../ui/rendering/servlets/CommentServlet.java | 3 +- .../apache/roller/weblogger/util/Reflection.java | 79 ++++++++++++++++++++++ .../roller/weblogger/util/cache/CacheManager.java | 42 +++++------- 15 files changed, 185 insertions(+), 203 deletions(-) diff --git a/app/src/main/java/org/apache/roller/weblogger/business/GuiceWebloggerProvider.java b/app/src/main/java/org/apache/roller/weblogger/business/GuiceWebloggerProvider.java index 021ccfb..f48f86a 100644 --- a/app/src/main/java/org/apache/roller/weblogger/business/GuiceWebloggerProvider.java +++ b/app/src/main/java/org/apache/roller/weblogger/business/GuiceWebloggerProvider.java @@ -23,6 +23,7 @@ import com.google.inject.Injector; import com.google.inject.Module; import java.util.Objects; import org.apache.roller.weblogger.config.WebloggerConfig; +import org.apache.roller.weblogger.util.Reflection; /** @@ -58,7 +59,7 @@ public class GuiceWebloggerProvider implements WebloggerProvider { Objects.requireNonNull(moduleClassname, "moduleClassname cannot be null"); try { - Module module = (Module) Class.forName(moduleClassname).getDeclaredConstructor().newInstance(); + Module module = (Module) Reflection.newInstance(moduleClassname); injector = Guice.createInjector(module); } catch (ThreadDeath t) { throw t; diff --git a/app/src/main/java/org/apache/roller/weblogger/business/WebloggerFactory.java b/app/src/main/java/org/apache/roller/weblogger/business/WebloggerFactory.java index 12303fe..6e1f4cb 100644 --- a/app/src/main/java/org/apache/roller/weblogger/business/WebloggerFactory.java +++ b/app/src/main/java/org/apache/roller/weblogger/business/WebloggerFactory.java @@ -22,6 +22,7 @@ import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.apache.roller.weblogger.business.startup.WebloggerStartup; import org.apache.roller.weblogger.config.WebloggerConfig; +import org.apache.roller.weblogger.util.Reflection; /** @@ -84,7 +85,7 @@ public final class WebloggerFactory { String providerClassname = WebloggerConfig.getProperty("weblogger.provider.class"); if(providerClassname != null) { try { - defaultProvider = (WebloggerProvider) Class.forName(providerClassname).getDeclaredConstructor().newInstance(); + defaultProvider = (WebloggerProvider) Reflection.newInstance(providerClassname); } catch (ReflectiveOperationException ex) { throw new BootstrapException("Error instantiating default provider: " + providerClassname + "; exception message: " + ex.getMessage(), ex); } diff --git a/app/src/main/java/org/apache/roller/weblogger/business/plugins/PluginManagerImpl.java b/app/src/main/java/org/apache/roller/weblogger/business/plugins/PluginManagerImpl.java index 7f6dc2a..27c77e9 100644 --- a/app/src/main/java/org/apache/roller/weblogger/business/plugins/PluginManagerImpl.java +++ b/app/src/main/java/org/apache/roller/weblogger/business/plugins/PluginManagerImpl.java @@ -23,6 +23,7 @@ import org.apache.roller.weblogger.business.plugins.entry.WeblogEntryPlugin; import java.util.LinkedHashMap; import java.util.List; import java.util.Map; +import java.util.stream.Collectors; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.apache.roller.weblogger.config.WebloggerConfig; @@ -33,6 +34,7 @@ import org.apache.roller.weblogger.WebloggerException; import org.apache.roller.weblogger.business.plugins.comment.WeblogEntryCommentPlugin; import org.apache.roller.weblogger.pojos.WeblogEntryComment; import org.apache.roller.weblogger.util.HTMLSanitizer; +import org.apache.roller.weblogger.util.Reflection; /** @@ -43,7 +45,7 @@ public class PluginManagerImpl implements PluginManager { private static final Log log = LogFactory.getLog(PluginManagerImpl.class); // Plugin classes keyed by plugin name - static Map<String, Class<? extends WeblogEntryPlugin>> mPagePlugins = new LinkedHashMap<>(); + private static final Map<String, Class<? extends WeblogEntryPlugin>> mPagePlugins = new LinkedHashMap<>(); // Comment plugins private final List<WeblogEntryCommentPlugin> commentPlugins = new ArrayList<>(); @@ -78,7 +80,7 @@ public class PluginManagerImpl implements PluginManager { for (Class<? extends WeblogEntryPlugin> pluginClass : mPagePlugins.values()) { try { - WeblogEntryPlugin plugin = pluginClass.getDeclaredConstructor().newInstance(); + WeblogEntryPlugin plugin = Reflection.newInstance(pluginClass); plugin.init(website); ret.put(plugin.getName(), plugin); } catch (ReflectiveOperationException | WebloggerException e) { @@ -92,17 +94,14 @@ public class PluginManagerImpl implements PluginManager { public String applyWeblogEntryPlugins(Map<String, WeblogEntryPlugin> pagePlugins, WeblogEntry entry, String str) { String ret = str; - WeblogEntry copy = new WeblogEntry(entry); - List<String> entryPlugins = copy.getPluginsList(); + List<String> plugins = entry.getPluginsList(); - if (entryPlugins != null) { - for (String key : entryPlugins) { - WeblogEntryPlugin pagePlugin = pagePlugins.get(key); - if (pagePlugin != null) { - ret = pagePlugin.render(entry, ret); - } else { - log.error("ERROR: plugin not found: " + key); - } + for (String key : plugins) { + WeblogEntryPlugin pagePlugin = pagePlugins.get(key); + if (pagePlugin != null) { + ret = pagePlugin.render(entry, ret); + } else { + log.warn("plugin not found: " + key); } } @@ -159,8 +158,7 @@ public class PluginManagerImpl implements PluginManager { log.debug(pluginStr); } if (pluginStr != null) { - String[] plugins = StringUtils.stripAll( - StringUtils.split(pluginStr, ",") ); + String[] plugins = StringUtils.stripAll(StringUtils.split(pluginStr, ",")); for (String plugin : plugins) { if (log.isDebugEnabled()) { log.debug("try " + plugin); @@ -168,10 +166,10 @@ public class PluginManagerImpl implements PluginManager { try { Class<?> clazz = Class.forName(plugin); - if (isPagePlugin(clazz)) { + if (Reflection.implementsInterface(clazz, WeblogEntryPlugin.class)) { @SuppressWarnings("unchecked") Class<? extends WeblogEntryPlugin> pluginClass = (Class<? extends WeblogEntryPlugin>)clazz; - WeblogEntryPlugin weblogEntryPlugin = pluginClass.getDeclaredConstructor().newInstance(); + WeblogEntryPlugin weblogEntryPlugin = Reflection.newInstance(pluginClass); mPagePlugins.put(weblogEntryPlugin.getName(), pluginClass); } else { log.warn(clazz + " is not a PagePlugin"); @@ -189,35 +187,14 @@ public class PluginManagerImpl implements PluginManager { */ private void loadCommentPlugins() { - log.debug("Initializing comment plugins"); - - String pluginStr = WebloggerConfig.getProperty("comment.formatter.classnames"); - if (pluginStr != null) { - String[] plugins = StringUtils.stripAll(StringUtils.split(pluginStr, ",")); - for (int i=0; i < plugins.length; i++) { - log.debug("trying " + plugins[i]); - - try { - WeblogEntryCommentPlugin plugin = (WeblogEntryCommentPlugin) Class.forName(plugins[i]).getDeclaredConstructor().newInstance(); - - // make sure and maintain ordering - commentPlugins.add(i, plugin); - - log.debug("Configured comment plugin: "+plugins[i]); - - } catch (ReflectiveOperationException e) { - log.error("unable to create " + plugins[i]); - } - } + try { + commentPlugins.addAll(Reflection.newInstancesFromProperty("comment.formatter.classnames")); + } catch (ReflectiveOperationException e) { + log.error("unable to create comment plugins", e); } - } - - private static boolean isPagePlugin(Class<?> clazz) { - for (Class<?> inter : clazz.getInterfaces()) - if (inter.equals(WeblogEntryPlugin.class)) - return true; - return false; + log.info("Configured comment plugins"); + log.info(commentPlugins.stream().map(t -> t.getClass().toString()).collect(Collectors.joining(",", "[", "]"))); } @Override diff --git a/app/src/main/java/org/apache/roller/weblogger/business/runnable/TaskRunner.java b/app/src/main/java/org/apache/roller/weblogger/business/runnable/TaskRunner.java index 8cd3494..27c614a 100644 --- a/app/src/main/java/org/apache/roller/weblogger/business/runnable/TaskRunner.java +++ b/app/src/main/java/org/apache/roller/weblogger/business/runnable/TaskRunner.java @@ -18,6 +18,7 @@ package org.apache.roller.weblogger.business.runnable; import java.io.File; +import org.apache.roller.weblogger.util.Reflection; import org.apache.roller.weblogger.util.StandaloneWebappClassLoader; /** @@ -57,7 +58,7 @@ public class TaskRunner { Thread.currentThread().setContextClassLoader(cl); // Go! - Runnable task = (Runnable)Class.forName(taskClassName).getDeclaredConstructor().newInstance(); + Runnable task = (Runnable) Reflection.newInstance(taskClassName); task.run(); } } diff --git a/app/src/main/java/org/apache/roller/weblogger/business/runnable/ThreadManagerImpl.java b/app/src/main/java/org/apache/roller/weblogger/business/runnable/ThreadManagerImpl.java index c515bed..15ec908 100644 --- a/app/src/main/java/org/apache/roller/weblogger/business/runnable/ThreadManagerImpl.java +++ b/app/src/main/java/org/apache/roller/weblogger/business/runnable/ThreadManagerImpl.java @@ -34,6 +34,7 @@ import org.apache.roller.weblogger.WebloggerException; import org.apache.roller.weblogger.business.InitializationException; import org.apache.roller.weblogger.config.WebloggerConfig; import org.apache.roller.weblogger.pojos.TaskLock; +import org.apache.roller.weblogger.util.Reflection; import static org.apache.roller.util.RollerConstants.GRACEFUL_SHUTDOWN_WAIT_IN_MILLISECONDS; import static org.apache.roller.util.RollerConstants.GRACEFUL_SHUTDOWN_WAIT_IN_SECONDS; @@ -75,7 +76,7 @@ public abstract class ThreadManagerImpl implements ThreadManager { LOG.info("Initializing task: " + taskName); try { - RollerTask task = (RollerTask) Class.forName(taskClassName).getDeclaredConstructor().newInstance(); + RollerTask task = (RollerTask) Reflection.newInstance(taskClassName); task.init(taskName); // make sure there is a tasklock record in the db diff --git a/app/src/main/java/org/apache/roller/weblogger/ui/core/RollerContext.java b/app/src/main/java/org/apache/roller/weblogger/ui/core/RollerContext.java index cc0f749..2979fcf 100644 --- a/app/src/main/java/org/apache/roller/weblogger/ui/core/RollerContext.java +++ b/app/src/main/java/org/apache/roller/weblogger/ui/core/RollerContext.java @@ -45,6 +45,7 @@ import org.apache.roller.weblogger.business.startup.WebloggerStartup; import org.apache.roller.weblogger.ui.core.plugins.UIPluginManager; import org.apache.roller.weblogger.ui.core.plugins.UIPluginManagerImpl; import org.apache.roller.weblogger.ui.core.security.AutoProvision; +import org.apache.roller.weblogger.util.Reflection; import org.apache.roller.weblogger.util.cache.CacheManager; import org.apache.velocity.runtime.RuntimeSingleton; import org.springframework.beans.factory.NoSuchBeanDefinitionException; @@ -365,14 +366,11 @@ public class RollerContext extends ContextLoaderListener return null; } - Class<?>[] interfaces = clazz.getInterfaces(); - for (Class<?> clazz2 : interfaces) { - if (clazz2.equals(AutoProvision.class)) { - try { - return (AutoProvision) clazz.getDeclaredConstructor().newInstance(); - } catch (ReflectiveOperationException e) { - log.warn("ReflectiveOperationException while creating: " + clazzName, e); - } + if (Reflection.implementsInterface(clazz, AutoProvision.class)) { + try { + return (AutoProvision) Reflection.newInstance(clazz); + } catch (ReflectiveOperationException e) { + log.warn("ReflectiveOperationException while creating: " + clazzName, e); } } return null; diff --git a/app/src/main/java/org/apache/roller/weblogger/ui/core/plugins/UIPluginManagerImpl.java b/app/src/main/java/org/apache/roller/weblogger/ui/core/plugins/UIPluginManagerImpl.java index 51f96c3..07fd5e2 100644 --- a/app/src/main/java/org/apache/roller/weblogger/ui/core/plugins/UIPluginManagerImpl.java +++ b/app/src/main/java/org/apache/roller/weblogger/ui/core/plugins/UIPluginManagerImpl.java @@ -25,7 +25,7 @@ import java.util.Map; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.apache.roller.weblogger.config.WebloggerConfig; -import org.apache.commons.lang3.StringUtils; +import org.apache.roller.weblogger.util.Reflection; /** @@ -91,28 +91,14 @@ public final class UIPluginManagerImpl implements UIPluginManager { log.debug("Initializing entry editor plugins"); - String editorStr = WebloggerConfig.getProperty("plugins.weblogEntryEditors"); - if (editorStr != null) { - - String[] editorList = StringUtils.stripAll(StringUtils.split(editorStr, ",")); - for (int i=0; i < editorList.length; i++) { - - log.debug("trying editor " + editorList[i]); - - try { - WeblogEntryEditor editor = (WeblogEntryEditor) Class.forName(editorList[i]) - .getDeclaredConstructor().newInstance(); - - // looks okay, add it to the map - this.editors.put(editor.getId(), editor); - - } catch(ClassCastException cce) { - log.error("It appears that your editor does not implement "+ - "the WeblogEntryEditor interface", cce); - } catch(Exception e) { - log.error("Unable to instantiate editor ["+editorList[i]+"]", e); - } - } + try { + Reflection.<WeblogEntryEditor>newInstancesFromProperty("plugins.weblogEntryEditors") + .forEach(editor -> this.editors.put(editor.getId(), editor)); + } catch(ClassCastException cce) { + log.error("It appears that your editor does not implement "+ + "the WeblogEntryEditor interface", cce); + } catch(Exception e) { + log.error("Unable to instantiate editors", e); } if(this.editors.isEmpty()) { diff --git a/app/src/main/java/org/apache/roller/weblogger/ui/rendering/RendererManager.java b/app/src/main/java/org/apache/roller/weblogger/ui/rendering/RendererManager.java index 4a1defc..6769714 100644 --- a/app/src/main/java/org/apache/roller/weblogger/ui/rendering/RendererManager.java +++ b/app/src/main/java/org/apache/roller/weblogger/ui/rendering/RendererManager.java @@ -17,14 +17,15 @@ */ package org.apache.roller.weblogger.ui.rendering; +import java.util.ArrayList; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; -import org.apache.roller.weblogger.config.WebloggerConfig; import org.apache.roller.weblogger.pojos.Template; -import java.util.HashSet; -import java.util.Set; +import java.util.List; +import java.util.stream.Collectors; import org.apache.roller.weblogger.ui.rendering.mobile.MobileDeviceRepository; +import org.apache.roller.weblogger.util.Reflection; /** * Returns Renderer for Template via configured RendererFactories. @@ -37,48 +38,22 @@ import org.apache.roller.weblogger.ui.rendering.mobile.MobileDeviceRepository; public final class RendererManager { private static final Log log = LogFactory.getLog(RendererManager.class); + // a set of all renderer factories we are consulting - private static final Set<RendererFactory> rendererFactories = new HashSet<>(); + private static final List<RendererFactory> rendererFactories = new ArrayList<>(); static { + // lookup set of renderer factories we are going to use - String rollerFactories = WebloggerConfig.getProperty("rendering.rollerRendererFactories"); - String userFactories = WebloggerConfig.getProperty("rendering.userRendererFactories"); - - // instantiate user defined renderer factory classes - if (userFactories != null && !userFactories.isBlank()) { - - RendererFactory rendererFactory; - String[] uFactories = userFactories.split(","); - for (String uFactory :uFactories) { - try { - rendererFactory = (RendererFactory) Class.forName(uFactory).getDeclaredConstructor().newInstance(); - rendererFactories.add(rendererFactory); - } catch (ClassCastException cce) { - log.error("It appears that your factory does not implement " - + "the RendererFactory interface", cce); - } catch (ReflectiveOperationException e) { - log.error("Unable to instantiate renderer factory [" + uFactory + "]", e); - } - } + try { + rendererFactories.addAll(Reflection.newInstancesFromProperty("rendering.userRendererFactories")); + } catch (ReflectiveOperationException ex) { + log.error("Unable to create user rendering factories", ex); } - - // instantiate roller standard renderer factory classes - if (rollerFactories != null && !rollerFactories.isBlank()) { - - RendererFactory rendererFactory; - String[] rFactories = rollerFactories.split(","); - for (String rFactory : rFactories) { - try { - rendererFactory = (RendererFactory) Class.forName(rFactory).getDeclaredConstructor().newInstance(); - rendererFactories.add(rendererFactory); - } catch (ClassCastException cce) { - log.error("It appears that your factory does not implement " - + "the RendererFactory interface", cce); - } catch (ReflectiveOperationException e) { - log.error("Unable to instantiate renderer factory [" + rFactory + "]", e); - } - } + try { + rendererFactories.addAll(Reflection.newInstancesFromProperty("rendering.rollerRendererFactories")); + } catch (ReflectiveOperationException ex) { + log.error("Unable to create roller rendering factories", ex); } if (rendererFactories.isEmpty()) { @@ -87,7 +62,9 @@ public final class RendererManager { + "Rendering probably won't function as you expect."); } - log.info("Renderer Manager Initialized."); + log.info("Renderer Manager Initialized, "+ rendererFactories.size()+" factories configured."); + log.info(rendererFactories.stream().map(t -> t.getClass().toString()).collect(Collectors.joining(",", "[", "]"))); + } // this class is non-instantiable @@ -115,7 +92,6 @@ public final class RendererManager { } } - throw new RenderingException("No renderer found for template " - + template.getId() + "!"); + throw new RenderingException("No renderer found for template " + template.getId() + "!"); } } diff --git a/app/src/main/java/org/apache/roller/weblogger/ui/rendering/filters/RequestMappingFilter.java b/app/src/main/java/org/apache/roller/weblogger/ui/rendering/filters/RequestMappingFilter.java index 46d828c..4c56fb9 100644 --- a/app/src/main/java/org/apache/roller/weblogger/ui/rendering/filters/RequestMappingFilter.java +++ b/app/src/main/java/org/apache/roller/weblogger/ui/rendering/filters/RequestMappingFilter.java @@ -21,6 +21,7 @@ package org.apache.roller.weblogger.ui.rendering.filters; import java.io.IOException; import java.util.ArrayList; import java.util.List; +import java.util.stream.Collectors; import javax.servlet.Filter; import javax.servlet.FilterChain; import javax.servlet.FilterConfig; @@ -31,8 +32,8 @@ import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; -import org.apache.roller.weblogger.config.WebloggerConfig; import org.apache.roller.weblogger.ui.rendering.RequestMapper; +import org.apache.roller.weblogger.util.Reflection; /** * Provides generalized request mapping capabilities. @@ -52,42 +53,16 @@ public class RequestMappingFilter implements Filter { @Override public void init(FilterConfig filterConfig) { - // lookup set of request mappers we are going to use - String rollerMappers = WebloggerConfig.getProperty("rendering.rollerRequestMappers"); - String userMappers = WebloggerConfig.getProperty("rendering.userRequestMappers"); - - // instantiate user defined request mapper classes - if(userMappers != null && !userMappers.isBlank()) { - RequestMapper requestMapper; - String[] uMappers = userMappers.split(","); - for (String uMapper : uMappers) { - try { - requestMapper = (RequestMapper) Class.forName(uMapper).getDeclaredConstructor().newInstance(); - requestMappers.add(requestMapper); - } catch(ClassCastException cce) { - log.error("It appears that your mapper does not implement "+ - "the RequestMapper interface", cce); - } catch(ReflectiveOperationException e) { - log.error("Unable to instantiate request mapper ["+uMapper+"]", e); - } - } + // instantiate user defined and standard roller request mapper classes + try { + requestMappers.addAll(Reflection.newInstancesFromProperty("rendering.userRequestMappers")); + } catch (ReflectiveOperationException ex) { + log.error("Unable to load user request mappers", ex); } - - // instantiate roller standard request mapper classes - if(rollerMappers != null && !rollerMappers.isBlank()) { - RequestMapper requestMapper; - String[] rMappers = rollerMappers.split(","); - for (String rMapper : rMappers) { - try { - requestMapper = (RequestMapper) Class.forName(rMapper).getDeclaredConstructor().newInstance(); - requestMappers.add(requestMapper); - } catch(ClassCastException cce) { - log.error("It appears that your mapper does not implement "+ - "the RequestMapper interface", cce); - } catch(ReflectiveOperationException e) { - log.error("Unable to instantiate request mapper ["+rMapper+"]", e); - } - } + try { + requestMappers.addAll(Reflection.newInstancesFromProperty("rendering.rollerRequestMappers")); + } catch (ReflectiveOperationException ex) { + log.error("Unable to load roller request mappers", ex); } if(requestMappers.isEmpty()) { @@ -96,8 +71,9 @@ public class RequestMappingFilter implements Filter { "Weblog urls probably won't function as you expect."); } - log.info("Request mapping filter initialized, "+requestMappers.size()+ - " mappers configured."); + log.info("Request mapping filter initialized, "+requestMappers.size()+" mappers configured."); + log.info(requestMappers.stream().map(t -> t.getClass().toString()).collect(Collectors.joining(",", "[", "]"))); + } diff --git a/app/src/main/java/org/apache/roller/weblogger/ui/rendering/model/ModelLoader.java b/app/src/main/java/org/apache/roller/weblogger/ui/rendering/model/ModelLoader.java index 1a2e9cf..01404fb 100644 --- a/app/src/main/java/org/apache/roller/weblogger/ui/rendering/model/ModelLoader.java +++ b/app/src/main/java/org/apache/roller/weblogger/ui/rendering/model/ModelLoader.java @@ -22,6 +22,7 @@ import java.util.Map; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.apache.roller.weblogger.WebloggerException; +import org.apache.roller.weblogger.util.Reflection; import org.apache.roller.weblogger.util.Utilities; @@ -45,7 +46,7 @@ public class ModelLoader { if (models != null) { for (String model : models) { try { - Model pageModel = (Model) Class.forName(model).getDeclaredConstructor().newInstance(); + Model pageModel = (Model) Reflection.newInstance(model); pageModel.init(initData); modelMap.put(pageModel.getModelName(), pageModel); } catch (WebloggerException re) { diff --git a/app/src/main/java/org/apache/roller/weblogger/ui/rendering/plugins/comments/CommentValidationManager.java b/app/src/main/java/org/apache/roller/weblogger/ui/rendering/plugins/comments/CommentValidationManager.java index 162d615..f09580b 100644 --- a/app/src/main/java/org/apache/roller/weblogger/ui/rendering/plugins/comments/CommentValidationManager.java +++ b/app/src/main/java/org/apache/roller/weblogger/ui/rendering/plugins/comments/CommentValidationManager.java @@ -20,13 +20,13 @@ package org.apache.roller.weblogger.ui.rendering.plugins.comments; import java.util.ArrayList; import java.util.List; +import java.util.stream.Collectors; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.apache.roller.util.RollerConstants; -import org.apache.roller.weblogger.config.WebloggerConfig; import org.apache.roller.weblogger.pojos.WeblogEntryComment; +import org.apache.roller.weblogger.util.Reflection; import org.apache.roller.weblogger.util.RollerMessages; -import org.apache.roller.weblogger.util.Utilities; /** * Responsible for loading validators and using them to validate comments. @@ -40,22 +40,13 @@ public class CommentValidationManager { // instantiate the validators that are configured try { - String vals = WebloggerConfig.getProperty("comment.validator.classnames"); - String[] valsarray = Utilities.stringToStringArray(vals, ","); - for (String arrayVal : valsarray) { - try { - CommentValidator val = (CommentValidator) Class.forName(arrayVal).getDeclaredConstructor().newInstance(); - validators.add(val); - log.info("Configured CommentValidator: " + val.getName() + " / " + val.getClass().getName()); - } catch (ReflectiveOperationException ex) { - log.warn("Error creating comment validator: " + arrayVal, ex); - } - } - - } catch (Exception e) { - log.error("Error instantiating comment validators"); + validators.addAll(Reflection.newInstancesFromProperty("comment.validator.classnames")); + } catch (ReflectiveOperationException ex) { + log.error("Error instantiating comment validators", ex); } + log.info("Configured " + validators.size() + " CommentValidators"); + log.info(validators.stream().map(t -> t.getClass().toString()).collect(Collectors.joining(",", "[", "]"))); } /** diff --git a/app/src/main/java/org/apache/roller/weblogger/ui/rendering/servlets/CommentAuthenticatorServlet.java b/app/src/main/java/org/apache/roller/weblogger/ui/rendering/servlets/CommentAuthenticatorServlet.java index 860fc93..b808050 100644 --- a/app/src/main/java/org/apache/roller/weblogger/ui/rendering/servlets/CommentAuthenticatorServlet.java +++ b/app/src/main/java/org/apache/roller/weblogger/ui/rendering/servlets/CommentAuthenticatorServlet.java @@ -30,6 +30,7 @@ import org.apache.commons.logging.LogFactory; import org.apache.roller.weblogger.config.WebloggerConfig; import org.apache.roller.weblogger.ui.rendering.plugins.comments.CommentAuthenticator; import org.apache.roller.weblogger.ui.rendering.plugins.comments.DefaultCommentAuthenticator; +import org.apache.roller.weblogger.util.Reflection; /** @@ -77,7 +78,7 @@ public class CommentAuthenticatorServlet extends HttpServlet { // lookup the authenticator we are going to use and instantiate it try { String name = WebloggerConfig.getProperty("comment.authenticator.classname"); - this.authenticator = (CommentAuthenticator) Class.forName(name).getDeclaredConstructor().newInstance(); + this.authenticator = (CommentAuthenticator) Reflection.newInstance(name); } catch(ReflectiveOperationException e) { mLogger.error(e); diff --git a/app/src/main/java/org/apache/roller/weblogger/ui/rendering/servlets/CommentServlet.java b/app/src/main/java/org/apache/roller/weblogger/ui/rendering/servlets/CommentServlet.java index fbb6263..ed27db1 100644 --- a/app/src/main/java/org/apache/roller/weblogger/ui/rendering/servlets/CommentServlet.java +++ b/app/src/main/java/org/apache/roller/weblogger/ui/rendering/servlets/CommentServlet.java @@ -53,6 +53,7 @@ import org.apache.roller.weblogger.util.GenericThrottle; import org.apache.roller.weblogger.util.IPBanList; import org.apache.roller.weblogger.util.MailUtil; import org.apache.roller.weblogger.util.I18nMessages; +import org.apache.roller.weblogger.util.Reflection; import org.apache.roller.weblogger.util.RollerMessages; import org.apache.roller.weblogger.util.RollerMessages.RollerMessage; import org.apache.roller.weblogger.util.URLUtilities; @@ -92,7 +93,7 @@ public class CommentServlet extends HttpServlet { // lookup the authenticator we are going to use and instantiate it try { String name = WebloggerConfig.getProperty("comment.authenticator.classname"); - this.authenticator = (CommentAuthenticator) Class.forName(name).getDeclaredConstructor().newInstance(); + this.authenticator = (CommentAuthenticator) Reflection.newInstance(name); } catch (ReflectiveOperationException e) { log.error(e); } finally { diff --git a/app/src/main/java/org/apache/roller/weblogger/util/Reflection.java b/app/src/main/java/org/apache/roller/weblogger/util/Reflection.java new file mode 100644 index 0000000..92b1364 --- /dev/null +++ b/app/src/main/java/org/apache/roller/weblogger/util/Reflection.java @@ -0,0 +1,79 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. The ASF licenses this file to You + * 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. For additional information regarding + * copyright in this work, please see the NOTICE file in the top level + * directory of this distribution. + */ + +package org.apache.roller.weblogger.util; + +import java.lang.reflect.Constructor; +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; +import org.apache.roller.weblogger.config.WebloggerConfig; + +/** + * Utility methods for common reflection tasks. + */ +public final class Reflection { + + private Reflection() {} + + + public static Object newInstance(String className) throws ReflectiveOperationException { + return newInstance(Class.forName(className)); + } + + public static <T> T newInstance(Class<T> clazz) throws ReflectiveOperationException { + Constructor<T> constructor = clazz.getDeclaredConstructor(); + constructor.setAccessible(true); + return constructor.newInstance(); + } + + public static <T> List<T> newInstances(String[] classList) throws ReflectiveOperationException { + + List<T> instances = new ArrayList<>(); + + for (String klass : classList) { + @SuppressWarnings("unchecked") + T instance = (T) Reflection.newInstance(klass); // throws CCE if instance dos not match T + instances.add(instance); + } + + return instances; + } + + public static <T> List<T> newInstancesFromProperty(String property) throws ReflectiveOperationException { + + String classList = WebloggerConfig.getProperty(property); + + if (classList != null && !classList.isBlank()) { + return newInstances(classList.split(",")); + } + + return Collections.emptyList(); + } + + /** + * Returns true if the given class directly implements the given interface. + */ + public static boolean implementsInterface(Class<?> clazz, Class<?> interfaze) { + for (Class<?> inter : clazz.getInterfaces()) + if (inter.equals(interfaze)) + return true; + return false; + } + +} diff --git a/app/src/main/java/org/apache/roller/weblogger/util/cache/CacheManager.java b/app/src/main/java/org/apache/roller/weblogger/util/cache/CacheManager.java index 9b44a30..3b6c0a7 100644 --- a/app/src/main/java/org/apache/roller/weblogger/util/cache/CacheManager.java +++ b/app/src/main/java/org/apache/roller/weblogger/util/cache/CacheManager.java @@ -33,6 +33,7 @@ import org.apache.roller.weblogger.pojos.WeblogCategory; import org.apache.roller.weblogger.pojos.WeblogEntry; import org.apache.roller.weblogger.pojos.WeblogTemplate; import org.apache.roller.weblogger.pojos.Weblog; +import org.apache.roller.weblogger.util.Reflection; /** @@ -50,19 +51,19 @@ import org.apache.roller.weblogger.pojos.Weblog; */ public final class CacheManager { - private final static Log log = LogFactory.getLog(CacheManager.class); + private static final Log log = LogFactory.getLog(CacheManager.class); private static final String DEFAULT_FACTORY = "org.apache.roller.weblogger.util.cache.ExpiringLRUCacheFactoryImpl"; // a reference to the cache factory in use - private static CacheFactory cacheFactory = null; + private static final CacheFactory cacheFactory; // a set of all registered cache handlers - private static Set<CacheHandler> cacheHandlers = new HashSet<>(); + private static final Set<CacheHandler> cacheHandlers = new HashSet<>(); // a map of all registered caches - private static Map<String, Cache> caches = new HashMap<>(); + private static final Map<String, Cache> caches = new HashMap<>(); static { @@ -70,8 +71,9 @@ public final class CacheManager { String classname = WebloggerConfig.getProperty("cache.defaultFactory"); // use reflection to instantiate our factory class + CacheFactory factory = null; try { - cacheFactory = (CacheFactory) Class.forName(classname).getDeclaredConstructor().newInstance(); + factory = (CacheFactory) Reflection.newInstance(classname); } catch(ClassCastException cce) { log.error("It appears that your factory does not implement "+ "the CacheFactory interface",cce); @@ -80,39 +82,29 @@ public final class CacheManager { " falling back on default", e); } - if(cacheFactory == null) { + if(factory == null) { try { // hmm ... failed to load the specified cache factory // lets try our default - cacheFactory = (CacheFactory) Class.forName(DEFAULT_FACTORY).getDeclaredConstructor().newInstance(); + factory = (CacheFactory) Reflection.newInstance(DEFAULT_FACTORY); } catch(ReflectiveOperationException e) { log.fatal("Failed to instantiate a cache factory", e); throw new RuntimeException(e); } } + cacheFactory = factory; log.info("Cache Manager Initialized."); log.info("Cache Factory = "+cacheFactory.getClass().getName()); // add custom handlers - String customHandlers = WebloggerConfig.getProperty("cache.customHandlers"); - if(customHandlers != null && !customHandlers.isBlank()) { - - String[] cHandlers = customHandlers.split(","); - for (String cHandler : cHandlers) { - // use reflection to instantiate the handler class - try { - CacheHandler customHandler = (CacheHandler) Class.forName(cHandler).getDeclaredConstructor().newInstance(); - - cacheHandlers.add(customHandler); - } catch(ClassCastException cce) { - log.error("It appears that your handler does not implement "+ - "the CacheHandler interface",cce); - } catch(ReflectiveOperationException e) { - log.error("Unable to instantiate cache handler ["+cHandler+"]", e); - } - } + try { + cacheHandlers.addAll(Reflection.newInstancesFromProperty("cache.customHandlers")); + } catch(ClassCastException cce) { + log.error("It appears that at least one custom handler does not implement the CacheHandler interface", cce); + } catch(ReflectiveOperationException e) { + log.error("Unable to instantiate custom cache handlers", e); } } @@ -151,7 +143,7 @@ public final class CacheManager { try { // use reflection to instantiate the factory class - CacheFactory factory = (CacheFactory) Class.forName(classname).getDeclaredConstructor().newInstance(); + CacheFactory factory = (CacheFactory) Reflection.newInstance(classname); // now ask for a new cache cache = factory.constructCache(properties);
