This is an automated email from the ASF dual-hosted git repository.

juanpablo pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/jspwiki.git

commit 725454d4cfe72c0e7e43df4a4a623c2be9ad076c
Author: Juan Pablo Santos Rodríguez <[email protected]>
AuthorDate: Sun Nov 28 23:23:02 2021 +0100

    Type ClassUtil#findClass methods and extract ClassUtil#buildInstance from 
ClassUtil#getMappedObject
    
    ClassUtil#buildInstance comes with several overloads in order to simplify 
code elsewhere
---
 .../providers/WikiAttachmentAdapterProvider.java   |   9 +-
 .../wiki/providers/WikiPageAdapterProvider.java    |  11 +-
 .../src/main/java/org/apache/wiki/WikiEngine.java  |   2 +-
 .../wiki/attachment/DefaultAttachmentManager.java  |  18 +--
 .../wiki/auth/DefaultAuthenticationManager.java    |  10 +-
 .../wiki/auth/DefaultAuthorizationManager.java     |  19 +--
 .../org/apache/wiki/auth/DefaultUserManager.java   |  21 ++--
 .../wiki/auth/authorize/DefaultGroupManager.java   |  17 +--
 .../apache/wiki/diff/DefaultDifferenceManager.java |   8 +-
 .../apache/wiki/filters/DefaultFilterManager.java  |  23 ++--
 .../org/apache/wiki/pages/DefaultPageManager.java  |  30 ++---
 .../java/org/apache/wiki/pages/PageSorter.java     |   4 +-
 .../apache/wiki/plugin/DefaultPluginManager.java   |   8 +-
 .../wiki/providers/CachingAttachmentProvider.java  |  26 ++---
 .../org/apache/wiki/providers/CachingProvider.java |  19 +--
 .../wiki/render/DefaultRenderingManager.java       |  16 +--
 .../apache/wiki/search/DefaultSearchManager.java   |  15 +--
 .../apache/wiki/search/LuceneSearchProvider.java   |  19 ++-
 .../wiki/ui/admin/DefaultAdminBeanManager.java     |   6 +-
 .../java/org/apache/wiki/xmlrpc/RPCServlet.java    |  11 +-
 .../src/main/resources/ini/jspwiki.properties      |  16 +--
 .../main/java/org/apache/wiki/util/ClassUtil.java  | 129 +++++++++++++++------
 .../java/org/apache/wiki/util/ClassUtilTest.java   |   8 +-
 23 files changed, 221 insertions(+), 224 deletions(-)

diff --git 
a/jspwiki-210-adapters/src/main/java/org/apache/wiki/providers/WikiAttachmentAdapterProvider.java
 
b/jspwiki-210-adapters/src/main/java/org/apache/wiki/providers/WikiAttachmentAdapterProvider.java
index f7d6a0a..28e78cc 100644
--- 
a/jspwiki-210-adapters/src/main/java/org/apache/wiki/providers/WikiAttachmentAdapterProvider.java
+++ 
b/jspwiki-210-adapters/src/main/java/org/apache/wiki/providers/WikiAttachmentAdapterProvider.java
@@ -65,14 +65,13 @@ public class WikiAttachmentAdapterProvider implements 
AttachmentProvider {
         final String classname = TextUtil.getRequiredProperty( properties, 
PROP_ADAPTER_IMPL );
         try {
             LOG.debug( "Page provider class: '" + classname + "'" );
-            final Class<?> providerclass = 
ClassUtil.findClass("org.apache.wiki.providers", classname);
-            provider = ( WikiAttachmentProvider ) providerclass.newInstance();
-        } catch( final IllegalAccessException | InstantiationException | 
ClassNotFoundException e ) {
-            LOG.error( "Could not instantiate " + classname, e );
+            provider = ClassUtil.buildInstance( "org.apache.wiki.providers", 
classname );
+        } catch( final ReflectiveOperationException e ) {
+            LOG.error( "Could not instantiate {}", classname, e );
             throw new IOException( e.getMessage(), e );
         }
 
-        LOG.debug( "Initializing attachment provider class " + provider );
+        LOG.debug( "Initializing attachment provider class {}", provider );
         provider.initialize( engine, properties );
     }
 
diff --git 
a/jspwiki-210-adapters/src/main/java/org/apache/wiki/providers/WikiPageAdapterProvider.java
 
b/jspwiki-210-adapters/src/main/java/org/apache/wiki/providers/WikiPageAdapterProvider.java
index 6dc8b2b..0c02a0b 100644
--- 
a/jspwiki-210-adapters/src/main/java/org/apache/wiki/providers/WikiPageAdapterProvider.java
+++ 
b/jspwiki-210-adapters/src/main/java/org/apache/wiki/providers/WikiPageAdapterProvider.java
@@ -65,15 +65,14 @@ public class WikiPageAdapterProvider implements 
PageProvider {
                   "implementing the new 
org.apache.wiki.api.providers.PageProvider public API" );
         final String classname = TextUtil.getRequiredProperty( properties, 
PROP_ADAPTER_IMPL );
         try {
-            LOG.debug( "Page provider class: '" + classname + "'" );
-            final Class<?> providerclass = 
ClassUtil.findClass("org.apache.wiki.providers", classname);
-            provider = ( WikiPageProvider ) providerclass.newInstance();
-        } catch( final IllegalAccessException | InstantiationException | 
ClassNotFoundException e ) {
-            LOG.error( "Could not instantiate " + classname, e );
+            LOG.debug( "Page provider class: '{}'", classname );
+            provider = ClassUtil.buildInstance( "org.apache.wiki.providers", 
classname );
+        } catch( final ReflectiveOperationException e ) {
+            LOG.error( "Could not instantiate {}", classname, e );
             throw new IOException( e.getMessage(), e );
         }
 
-        LOG.debug( "Initializing page provider class " + provider );
+        LOG.debug( "Initializing page provider class {}", provider );
         provider.initialize( engine, properties );
     }
 
diff --git a/jspwiki-main/src/main/java/org/apache/wiki/WikiEngine.java 
b/jspwiki-main/src/main/java/org/apache/wiki/WikiEngine.java
index 54e9545..d620239 100644
--- a/jspwiki-main/src/main/java/org/apache/wiki/WikiEngine.java
+++ b/jspwiki-main/src/main/java/org/apache/wiki/WikiEngine.java
@@ -307,7 +307,7 @@ public class WikiEngine implements Engine {
         try {
             final String aclClassName = m_properties.getProperty( 
PROP_ACL_MANAGER_IMPL, ClassUtil.getMappedClass( AclManager.class.getName() 
).getName() );
             final String urlConstructorClassName = TextUtil.getStringProperty( 
props, PROP_URLCONSTRUCTOR, "DefaultURLConstructor" );
-            final Class< ? > urlclass = ClassUtil.findClass( 
"org.apache.wiki.url", urlConstructorClassName );
+            final Class< URLConstructor > urlclass = ClassUtil.findClass( 
"org.apache.wiki.url", urlConstructorClassName );
 
             initComponent( CommandResolver.class, this, props );
             initComponent( urlclass.getName(), URLConstructor.class );
diff --git 
a/jspwiki-main/src/main/java/org/apache/wiki/attachment/DefaultAttachmentManager.java
 
b/jspwiki-main/src/main/java/org/apache/wiki/attachment/DefaultAttachmentManager.java
index 9a75aaa..885a3e2 100644
--- 
a/jspwiki-main/src/main/java/org/apache/wiki/attachment/DefaultAttachmentManager.java
+++ 
b/jspwiki-main/src/main/java/org/apache/wiki/attachment/DefaultAttachmentManager.java
@@ -72,7 +72,7 @@ public class DefaultAttachmentManager implements 
AttachmentManager {
      *  Wikiengine.getManager( AttachmentManager.class ) if you're making a 
module for JSPWiki.
      *
      *  @param engine The wikiengine that owns this attachment manager.
-     *  @param props A list of properties from which the AttachmentManager 
will seek its configuration. Typically this is the "jspwiki.properties".
+     *  @param props A list of properties from which the AttachmentManager 
will seek its configuration. Typically, this is the "jspwiki.properties".
      */
     // FIXME: Perhaps this should fail somehow.
     public DefaultAttachmentManager( final Engine engine, final Properties 
props ) {
@@ -100,23 +100,17 @@ public class DefaultAttachmentManager implements 
AttachmentManager {
             if( m_cacheManager.cacheExists( cacheName ) ) {
                 m_dynamicAttachments = m_cacheManager.getCache( cacheName );
             } else {
-                log.info( "cache with name " + cacheName + " not found in 
ehcache.xml, creating it with defaults." );
+                log.info( "cache with name {} not found in ehcache.xml, 
creating it with defaults.", cacheName );
                 m_dynamicAttachments = new Cache( cacheName, 
DEFAULT_CACHECAPACITY, false, false, 0, 0 );
                 m_cacheManager.addCache( m_dynamicAttachments );
             }
 
-            final Class< ? > providerclass = ClassUtil.findClass( 
"org.apache.wiki.providers", classname );
-
-            m_provider = ( AttachmentProvider )providerclass.newInstance();
+            m_provider = ClassUtil.buildInstance( "org.apache.wiki.providers", 
classname );
             m_provider.initialize( m_engine, props );
-        } catch( final ClassNotFoundException e ) {
-            log.error( "Attachment provider class not found",e);
-        } catch( final InstantiationException e ) {
-            log.error( "Attachment provider could not be created", e );
-        } catch( final IllegalAccessException e ) {
-            log.error( "You may not access the attachment provider class", e );
+        } catch( final ReflectiveOperationException e ) {
+            log.error( "Attachment provider class could not be instantiated", 
e );
         } catch( final NoRequiredPropertyException e ) {
-            log.error( "Attachment provider did not find a property that it 
needed: " + e.getMessage(), e );
+            log.error( "Attachment provider did not find a property that it 
needed: {}", e.getMessage(), e );
             m_provider = null; // No, it did not work.
         } catch( final IOException e ) {
             log.error( "Attachment provider reports IO error", e );
diff --git 
a/jspwiki-main/src/main/java/org/apache/wiki/auth/DefaultAuthenticationManager.java
 
b/jspwiki-main/src/main/java/org/apache/wiki/auth/DefaultAuthenticationManager.java
index ed4552c..ed817ae 100644
--- 
a/jspwiki-main/src/main/java/org/apache/wiki/auth/DefaultAuthenticationManager.java
+++ 
b/jspwiki-main/src/main/java/org/apache/wiki/auth/DefaultAuthenticationManager.java
@@ -36,6 +36,7 @@ import org.apache.wiki.auth.login.WikiCallbackHandler;
 import org.apache.wiki.event.WikiEventListener;
 import org.apache.wiki.event.WikiEventManager;
 import org.apache.wiki.event.WikiSecurityEvent;
+import org.apache.wiki.util.ClassUtil;
 import org.apache.wiki.util.TextUtil;
 import org.apache.wiki.util.TimedCounterList;
 
@@ -45,7 +46,6 @@ import javax.security.auth.login.LoginException;
 import javax.security.auth.spi.LoginModule;
 import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpSession;
-import java.lang.reflect.InvocationTargetException;
 import java.security.Principal;
 import java.util.Collections;
 import java.util.HashMap;
@@ -123,7 +123,7 @@ public class DefaultAuthenticationManager implements 
AuthenticationManager {
         // Look up the LoginModule class
         final String loginModuleClassName = TextUtil.getStringProperty( props, 
PROP_LOGIN_MODULE, DEFAULT_LOGIN_MODULE );
         try {
-            m_loginModuleClass = ( Class< ? extends LoginModule > 
)Class.forName( loginModuleClassName );
+            m_loginModuleClass = ClassUtil.findClass( "", loginModuleClassName 
);
         } catch( final ClassNotFoundException e ) {
             log.error( e.getMessage(), e );
             throw new WikiException( "Could not instantiate LoginModule 
class.", e );
@@ -172,7 +172,7 @@ public class DefaultAuthenticationManager implements 
AuthenticationManager {
                 principals = authenticationMgr.doJAASLogin( 
CookieAuthenticationLoginModule.class, handler, options );
             }
 
-            // If the container logged the user in successfully, tell the 
Session (and add all of the Principals)
+            // If the container logged the user in successfully, tell the 
Session (and add all the Principals)
             if ( principals.size() > 0 ) {
                 fireEvent( WikiSecurityEvent.LOGIN_AUTHENTICATED, 
getLoginPrincipal( principals ), session );
                 for( final Principal principal : principals ) {
@@ -320,8 +320,8 @@ public class DefaultAuthenticationManager implements 
AuthenticationManager {
         // Instantiate the login module
         final LoginModule loginModule;
         try {
-            loginModule = clazz.getDeclaredConstructor().newInstance();
-        } catch( final InstantiationException | IllegalAccessException | 
NoSuchMethodException | InvocationTargetException e ) {
+            loginModule = ClassUtil.buildInstance( clazz );
+        } catch( final ReflectiveOperationException e ) {
             throw new WikiSecurityException( e.getMessage(), e );
         }
 
diff --git 
a/jspwiki-main/src/main/java/org/apache/wiki/auth/DefaultAuthorizationManager.java
 
b/jspwiki-main/src/main/java/org/apache/wiki/auth/DefaultAuthorizationManager.java
index 3c42a85..5737b54 100644
--- 
a/jspwiki-main/src/main/java/org/apache/wiki/auth/DefaultAuthorizationManager.java
+++ 
b/jspwiki-main/src/main/java/org/apache/wiki/auth/DefaultAuthorizationManager.java
@@ -275,23 +275,16 @@ public class DefaultAuthorizationManager implements 
AuthorizationManager {
      */
     private Authorizer getAuthorizerImplementation( final Properties props ) 
throws WikiException {
         final String authClassName = props.getProperty( PROP_AUTHORIZER, 
DEFAULT_AUTHORIZER );
-        return ( Authorizer )locateImplementation( authClassName );
+        return locateImplementation( authClassName );
     }
 
-    private Object locateImplementation( final String clazz ) throws 
WikiException {
+    private Authorizer locateImplementation( final String clazz ) throws 
WikiException {
         if ( clazz != null ) {
             try {
-                final Class< ? > authClass = ClassUtil.findClass( 
"org.apache.wiki.auth.authorize", clazz );
-                return authClass.newInstance();
-            } catch( final ClassNotFoundException e ) {
-                log.fatal( "Authorizer " + clazz + " cannot be found", e );
-                throw new WikiException( "Authorizer " + clazz + " cannot be 
found", e );
-            } catch( final InstantiationException e ) {
-                log.fatal( "Authorizer " + clazz + " cannot be created", e );
-                throw new WikiException( "Authorizer " + clazz + " cannot be 
created", e );
-            } catch( final IllegalAccessException e ) {
-                log.fatal( "You are not allowed to access this authorizer 
class", e );
-                throw new WikiException( "You are not allowed to access this 
authorizer class", e );
+                return ClassUtil.buildInstance( 
"org.apache.wiki.auth.authorize", clazz );
+            } catch( final ReflectiveOperationException e ) {
+                log.fatal( "Authorizer {} cannot be instantiated", clazz, e );
+                throw new WikiException( "Authorizer " + clazz + " cannot be 
instantiated", e );
             }
         }
 
diff --git 
a/jspwiki-main/src/main/java/org/apache/wiki/auth/DefaultUserManager.java 
b/jspwiki-main/src/main/java/org/apache/wiki/auth/DefaultUserManager.java
index e8facc0..99e78c6 100644
--- a/jspwiki-main/src/main/java/org/apache/wiki/auth/DefaultUserManager.java
+++ b/jspwiki-main/src/main/java/org/apache/wiki/auth/DefaultUserManager.java
@@ -121,24 +121,19 @@ public class DefaultUserManager implements UserManager {
         try {
             dbClassName = TextUtil.getRequiredProperty( 
m_engine.getWikiProperties(), PROP_DATABASE );
 
-            log.info( "Attempting to load user database class " + dbClassName 
);
-            final Class<?> dbClass = ClassUtil.findClass( 
USERDATABASE_PACKAGE, dbClassName );
-            m_database = (UserDatabase) dbClass.newInstance();
+            log.info( "Attempting to load user database class {}", dbClassName 
);
+            m_database = ClassUtil.buildInstance( USERDATABASE_PACKAGE, 
dbClassName );
             m_database.initialize( m_engine, m_engine.getWikiProperties() );
-            log.info("UserDatabase initialized.");
+            log.info( "UserDatabase initialized." );
         } catch( final NoSuchElementException | NoRequiredPropertyException e 
) {
-            log.error( "You have not set the '"+PROP_DATABASE+"'. You need to 
do this if you want to enable user management by JSPWiki.", e );
-        } catch( final ClassNotFoundException e ) {
-            log.error( "UserDatabase class " + dbClassName + " cannot be 
found", e );
-        } catch( final InstantiationException e ) {
-            log.error( "UserDatabase class " + dbClassName + " cannot be 
created", e );
-        } catch( final IllegalAccessException e ) {
-            log.error( "You are not allowed to access this user database 
class", e );
+            log.error( "You have not set the '{}'. You need to do this if you 
want to enable user management by JSPWiki.", PROP_DATABASE, e );
+        } catch( final ReflectiveOperationException e ) {
+            log.error( "UserDatabase {} cannot be instantiated", dbClassName, 
e );
         } catch( final WikiSecurityException e ) {
-            log.error( "Exception initializing user database: " + 
e.getMessage(), e );
+            log.error( "Exception initializing user database: {}", 
e.getMessage(), e );
         } finally {
             if( m_database == null ) {
-                log.info("I could not create a database object you specified 
(or didn't specify), so I am falling back to a default.");
+                log.info( "I could not create a database object you specified 
(or didn't specify), so I am falling back to a default." );
                 m_database = new DummyUserDatabase();
             }
         }
diff --git 
a/jspwiki-main/src/main/java/org/apache/wiki/auth/authorize/DefaultGroupManager.java
 
b/jspwiki-main/src/main/java/org/apache/wiki/auth/authorize/DefaultGroupManager.java
index 86fad07..4252bef 100644
--- 
a/jspwiki-main/src/main/java/org/apache/wiki/auth/authorize/DefaultGroupManager.java
+++ 
b/jspwiki-main/src/main/java/org/apache/wiki/auth/authorize/DefaultGroupManager.java
@@ -111,21 +111,12 @@ public class DefaultGroupManager implements GroupManager, 
Authorizer, WikiEventL
             if( dbClassName == null ) {
                 dbClassName = XMLGroupDatabase.class.getName();
             }
-            log.info( "Attempting to load group database class " + dbClassName 
);
-            final Class< ? > dbClass = ClassUtil.findClass( 
"org.apache.wiki.auth.authorize", dbClassName );
-            m_groupDatabase = ( GroupDatabase )dbClass.newInstance();
+            log.info( "Attempting to load group database class {}" + 
dbClassName );
+            m_groupDatabase = ClassUtil.buildInstance( 
"org.apache.wiki.auth.authorize", dbClassName );
             m_groupDatabase.initialize( m_engine, m_engine.getWikiProperties() 
);
             log.info( "Group database initialized." );
-        } catch( final ClassNotFoundException e ) {
-            log.error( "GroupDatabase class " + dbClassName + " cannot be 
found.", e );
-            dbInstantiationError = "Failed to locate GroupDatabase class " + 
dbClassName;
-            cause = e;
-        } catch( final InstantiationException e ) {
-            log.error( "GroupDatabase class " + dbClassName + " cannot be 
created.", e );
-            dbInstantiationError = "Failed to create GroupDatabase class " + 
dbClassName;
-            cause = e;
-        } catch( final IllegalAccessException e ) {
-            log.error( "You are not allowed to access group database class " + 
dbClassName + ".", e );
+        } catch( final ReflectiveOperationException e ) {
+            log.error( "UserDatabase {} cannot be instantiated", dbClassName, 
e );
             dbInstantiationError = "Access GroupDatabase class " + dbClassName 
+ " denied";
             cause = e;
         } catch( final NoRequiredPropertyException e ) {
diff --git 
a/jspwiki-main/src/main/java/org/apache/wiki/diff/DefaultDifferenceManager.java 
b/jspwiki-main/src/main/java/org/apache/wiki/diff/DefaultDifferenceManager.java
index e01a635..9b8bc34 100644
--- 
a/jspwiki-main/src/main/java/org/apache/wiki/diff/DefaultDifferenceManager.java
+++ 
b/jspwiki-main/src/main/java/org/apache/wiki/diff/DefaultDifferenceManager.java
@@ -29,7 +29,6 @@ import org.apache.wiki.pages.PageManager;
 import org.apache.wiki.util.ClassUtil;
 
 import java.io.IOException;
-import java.lang.reflect.InvocationTargetException;
 import java.util.Properties;
 
 
@@ -58,10 +57,9 @@ public class DefaultDifferenceManager implements 
DifferenceManager {
     private void loadProvider( final Properties props ) {
         final String providerClassName = props.getProperty( 
PROP_DIFF_PROVIDER, TraditionalDiffProvider.class.getName() );
         try {
-            final Class< ? > providerClass = 
ClassUtil.findClass("org.apache.wiki.diff", providerClassName );
-            m_provider = (DiffProvider) 
providerClass.getDeclaredConstructor().newInstance();
-        } catch( final ClassNotFoundException | NoSuchMethodException | 
InstantiationException | IllegalAccessException | InvocationTargetException e ) 
{
-            log.warn("Failed loading DiffProvider, will use 
NullDiffProvider.", e);
+            m_provider = ClassUtil.buildInstance( "org.apache.wiki.diff", 
providerClassName );
+        } catch( final ReflectiveOperationException e ) {
+            log.warn( "Failed loading DiffProvider, will use 
NullDiffProvider.", e );
         }
 
         if( m_provider == null ) {
diff --git 
a/jspwiki-main/src/main/java/org/apache/wiki/filters/DefaultFilterManager.java 
b/jspwiki-main/src/main/java/org/apache/wiki/filters/DefaultFilterManager.java
index 7d01dba..abc6c33 100644
--- 
a/jspwiki-main/src/main/java/org/apache/wiki/filters/DefaultFilterManager.java
+++ 
b/jspwiki-main/src/main/java/org/apache/wiki/filters/DefaultFilterManager.java
@@ -129,27 +129,20 @@ public class DefaultFilterManager extends 
BaseModuleManager implements FilterMan
         try {
             final PageFilterInfo info = m_filterClassMap.get( className );
             if( info != null && !checkCompatibility( info ) ) {
-                log.warn( "Filter '" + info.getName() + "' not compatible with 
this version of JSPWiki" );
+                log.warn( "Filter '{}' not compatible with this version of 
JSPWiki", info.getName() );
                 return;
             }
 
-            final int priority = 0; // FIXME: Currently fixed.
-            final Class< ? > cl = ClassUtil.findClass( 
"org.apache.wiki.filters", className );
-            final PageFilter filter = (PageFilter)cl.newInstance();
+            final int priority = 0;
+            final PageFilter filter = ClassUtil.buildInstance( 
"org.apache.wiki.filters", className );
             filter.initialize( m_engine, props );
 
             addPageFilter( filter, priority );
-            log.info("Added page filter "+cl.getName()+" with priority 
"+priority);
-        } catch( final ClassNotFoundException e ) {
-            log.error("Unable to find the filter class: "+className);
-        } catch( final InstantiationException e ) {
-            log.error("Cannot create filter class: "+className);
-        } catch( final IllegalAccessException e ) {
-            log.error("You are not allowed to access class: "+className);
-        } catch( final ClassCastException e ) {
-            log.error("Suggested class is not a PageFilter: "+className);
+            log.info( "Added page filter {} with priority {}", 
filter.getClass().getName(), priority );
+        } catch( final ReflectiveOperationException e ) {
+            log.error( "Unable to instantiate PageFilter: {}", className );
         } catch( final FilterException e ) {
-            log.error("Filter "+className+" failed to initialize itself.", e);
+            log.error( "Filter {} failed to initialize itself.", className, e 
);
         }
     }
 
@@ -157,7 +150,7 @@ public class DefaultFilterManager extends BaseModuleManager 
implements FilterMan
     /**
      *  Initializes the filters from an XML file.
      *
-     *  @param props The list of properties.  Typically jspwiki.properties
+     *  @param props The list of properties. Typically, jspwiki.properties
      *  @throws WikiException If something goes wrong.
      */
     protected void initialize( final Properties props ) throws WikiException {
diff --git 
a/jspwiki-main/src/main/java/org/apache/wiki/pages/DefaultPageManager.java 
b/jspwiki-main/src/main/java/org/apache/wiki/pages/DefaultPageManager.java
index 0cf9820..1186a3c 100644
--- a/jspwiki-main/src/main/java/org/apache/wiki/pages/DefaultPageManager.java
+++ b/jspwiki-main/src/main/java/org/apache/wiki/pages/DefaultPageManager.java
@@ -124,26 +124,18 @@ public class DefaultPageManager implements PageManager {
         pageSorter.initialize( props );
 
         try {
-            LOG.debug("Page provider class: '" + classname + "'");
-            final Class<?> providerclass = 
ClassUtil.findClass("org.apache.wiki.providers", classname);
-            m_provider = ( PageProvider ) providerclass.newInstance();
-
-            LOG.debug("Initializing page provider class " + m_provider);
-            m_provider.initialize(m_engine, props);
-        } catch (final ClassNotFoundException e) {
-            LOG.error("Unable to locate provider class '" + classname + "' (" 
+ e.getMessage() + ")", e);
-            throw new WikiException("No provider class. (" + e.getMessage() + 
")", e);
-        } catch (final InstantiationException e) {
-            LOG.error("Unable to create provider class '" + classname + "' (" 
+ e.getMessage() + ")", e);
-            throw new WikiException("Faulty provider class. (" + 
e.getMessage() + ")", e);
-        } catch (final IllegalAccessException e) {
-            LOG.error("Illegal access to provider class '" + classname + "' (" 
+ e.getMessage() + ")", e);
-            throw new WikiException("Illegal provider class. (" + 
e.getMessage() + ")", e);
-        } catch (final NoRequiredPropertyException e) {
-            LOG.error("Provider did not found a property it was looking for: " 
+ e.getMessage(), e);
+            LOG.debug( "Page provider class: '{}'", classname );
+            m_provider = ClassUtil.buildInstance( "org.apache.wiki.providers", 
classname );
+            LOG.debug( "Initializing page provider class {}", m_provider );
+            m_provider.initialize( m_engine, props );
+        } catch( final ReflectiveOperationException e ) {
+            LOG.error( "Unable to instantiate provider class '{}' ({})", 
classname, e.getMessage(), e );
+            throw new WikiException( "Illegal provider class. (" + 
e.getMessage() + ")", e );
+        } catch( final NoRequiredPropertyException e ) {
+            LOG.error("Provider did not found a property it was looking for: 
{}", e.getMessage(), e);
             throw e;  // Same exception works.
-        } catch (final IOException e) {
-            LOG.error("An I/O exception occurred while trying to create a new 
page provider: " + classname, e);
+        } catch( final IOException e ) {
+            LOG.error("An I/O exception occurred while trying to create a new 
page provider: {}", classname, e);
             throw new WikiException("Unable to start page provider: " + 
e.getMessage(), e);
         }
 
diff --git a/jspwiki-main/src/main/java/org/apache/wiki/pages/PageSorter.java 
b/jspwiki-main/src/main/java/org/apache/wiki/pages/PageSorter.java
index 4cb3142..f284d75 100644
--- a/jspwiki-main/src/main/java/org/apache/wiki/pages/PageSorter.java
+++ b/jspwiki-main/src/main/java/org/apache/wiki/pages/PageSorter.java
@@ -88,14 +88,14 @@ public class PageSorter implements Comparator< String > {
      * 
      * @param props this Engine's properties.
      */
-    @SuppressWarnings( "unchecked" )
     public void initialize( final Properties props ) {
         // Default is Java natural order
         m_comparator = JavaNaturalComparator.DEFAULT_JAVA_COMPARATOR;
         final String className = props.getProperty( PROP_PAGE_NAME_COMPARATOR 
);
         if( className != null && !className.isEmpty() ) {
             try {
-                m_comparator = ( Comparator< String > )ClassUtil.findClass( 
"org.apache.wiki.util.comparators", className ).newInstance();
+                final Class< Comparator< String > > cl = ClassUtil.findClass( 
"org.apache.wiki.util.comparators", className );
+                m_comparator = ClassUtil.buildInstance( cl );;
             } catch( final Exception e ) {
                 LOG.error( "Falling back to default \"natural\" comparator", e 
);
             }
diff --git 
a/jspwiki-main/src/main/java/org/apache/wiki/plugin/DefaultPluginManager.java 
b/jspwiki-main/src/main/java/org/apache/wiki/plugin/DefaultPluginManager.java
index c36d631..d131803 100644
--- 
a/jspwiki-main/src/main/java/org/apache/wiki/plugin/DefaultPluginManager.java
+++ 
b/jspwiki-main/src/main/java/org/apache/wiki/plugin/DefaultPluginManager.java
@@ -239,7 +239,7 @@ public class DefaultPluginManager extends BaseModuleManager 
implements PluginMan
         return ClassUtil.findClass( m_searchPath, m_externalJars, classname );
     }
 
-    /** Outputs a HTML-formatted version of a stack trace. */
+    /** Outputs an HTML-formatted version of a stack trace. */
     private String stackTrace( final Map<String,String> params, final 
Throwable t ) {
         final Element div = XhtmlUtil.element( XHTML.div, "Plugin execution 
failed, stack trace follows:" );
         div.setAttribute( XHTML.ATTR_class, "debug" );
@@ -463,7 +463,7 @@ public class DefaultPluginManager extends BaseModuleManager 
implements PluginMan
         private String    m_className;
         private String    m_alias;
         private String    m_ajaxAlias;
-        private Class<?>  m_clazz;
+        private Class< Plugin >  m_clazz;
 
         private boolean m_initialized;
 
@@ -582,12 +582,12 @@ public class DefaultPluginManager extends 
BaseModuleManager implements PluginMan
          *  @throws IllegalAccessException If the class cannot be accessed.
          */
 
-        public Plugin newPluginInstance( final List< String > searchPath, 
final List< String > externalJars) throws ClassNotFoundException, 
InstantiationException, IllegalAccessException {
+        public Plugin newPluginInstance( final List< String > searchPath, 
final List< String > externalJars) throws ReflectiveOperationException {
             if( m_clazz == null ) {
                 m_clazz = ClassUtil.findClass( searchPath, externalJars 
,m_className );
             }
 
-            return ( Plugin )m_clazz.newInstance();
+            return ClassUtil.buildInstance( m_clazz );
         }
 
         /**
diff --git 
a/jspwiki-main/src/main/java/org/apache/wiki/providers/CachingAttachmentProvider.java
 
b/jspwiki-main/src/main/java/org/apache/wiki/providers/CachingAttachmentProvider.java
index 8825185..dad7375 100644
--- 
a/jspwiki-main/src/main/java/org/apache/wiki/providers/CachingAttachmentProvider.java
+++ 
b/jspwiki-main/src/main/java/org/apache/wiki/providers/CachingAttachmentProvider.java
@@ -61,7 +61,7 @@ public class CachingAttachmentProvider implements 
AttachmentProvider {
     private final CacheManager m_cacheManager = CacheManager.getInstance();
 
     /** Default cache capacity for now. */
-    public static final int m_capacity = 1000;
+    public static final int m_capacity = 1_000;
 
     /** The cache contains Collection objects which contain Attachment 
objects. The key is the parent wiki page name (String). */
     private Cache m_cache;
@@ -80,10 +80,6 @@ public class CachingAttachmentProvider implements 
AttachmentProvider {
     private final long m_cacheMisses = 0;
     private final long m_cacheHits = 0;
 
-    /** The extension to append to directory names to denote an attachment 
directory. */
-    public static final String DIR_EXTENSION   = "-att";
-
-
     private boolean m_gotall;
 
     /**
@@ -121,19 +117,11 @@ public class CachingAttachmentProvider implements 
AttachmentProvider {
         }
 
         try {
-            final Class< ? > providerclass = ClassUtil.findClass( 
"org.apache.wiki.providers", classname );
-            m_provider = ( AttachmentProvider )providerclass.newInstance();
-
-            log.debug( "Initializing real provider class " + m_provider );
+            m_provider = ClassUtil.buildInstance( "org.apache.wiki.providers", 
classname );
+            log.debug( "Initializing real provider class {}", m_provider );
             m_provider.initialize( engine, properties );
-        } catch( final ClassNotFoundException e ) {
-            log.error( "Unable to locate provider class " + classname, e );
-            throw new IllegalArgumentException( "no provider class", e );
-        } catch( final InstantiationException e ) {
-            log.error( "Unable to create provider class " + classname, e );
-            throw new IllegalArgumentException( "faulty provider class", e );
-        } catch( final IllegalAccessException e ) {
-            log.error( "Illegal access to provider class " + classname, e );
+        } catch( final ReflectiveOperationException e ) {
+            log.error( "Unable to instantiate provider class {}", classname, e 
);
             throw new IllegalArgumentException( "illegal provider class", e );
         }
     }
@@ -314,9 +302,9 @@ public class CachingAttachmentProvider implements 
AttachmentProvider {
     }
 
     /**
-     * Gets the provider class name, and cache statistics (misscount 
and,hitcount of the attachment cache).
+     * Gets the provider class name, and cache statistics (misscount and 
hitcount of the attachment cache).
      *
-     * @return A plain string with all the above mentioned values.
+     * @return A plain string with all the above-mentioned values.
      */
     @Override
     public synchronized String getProviderInfo() {
diff --git 
a/jspwiki-main/src/main/java/org/apache/wiki/providers/CachingProvider.java 
b/jspwiki-main/src/main/java/org/apache/wiki/providers/CachingProvider.java
index c70484e..de9e651 100644
--- a/jspwiki-main/src/main/java/org/apache/wiki/providers/CachingProvider.java
+++ b/jspwiki-main/src/main/java/org/apache/wiki/providers/CachingProvider.java
@@ -136,12 +136,9 @@ public class CachingProvider implements PageProvider {
             m_cacheManager.addCache(m_historyCache);
         }
 
-        //
         // m_cache.getCacheEventNotificationService().registerListener(new 
CacheItemCollector());
 
-        //
         //  Find and initialize real provider.
-        //
         final String classname;
         try {
             classname = TextUtil.getRequiredProperty( properties, 
PageManager.PROP_PAGEPROVIDER );
@@ -150,19 +147,11 @@ public class CachingProvider implements PageProvider {
         }
 
         try {
-            final Class< ? > providerclass = ClassUtil.findClass( 
"org.apache.wiki.providers", classname );
-            m_provider = ( PageProvider )providerclass.newInstance();
-
-            log.debug( "Initializing real provider class " + m_provider );
+            m_provider = ClassUtil.buildInstance( "org.apache.wiki.providers", 
classname );
+            log.debug( "Initializing real provider class {}", m_provider );
             m_provider.initialize( engine, properties );
-        } catch( final ClassNotFoundException e ) {
-            log.error( "Unable to locate provider class " + classname, e );
-            throw new IllegalArgumentException( "no provider class", e );
-        } catch( final InstantiationException e ) {
-            log.error( "Unable to create provider class " + classname, e );
-            throw new IllegalArgumentException( "faulty provider class", e );
-        } catch( final IllegalAccessException e ) {
-            log.error( "Illegal access to provider class " + classname, e );
+        } catch( final ReflectiveOperationException e ) {
+            log.error( "Unable to instantiate provider class {}", classname, e 
);
             throw new IllegalArgumentException( "illegal provider class", e );
         }
     }
diff --git 
a/jspwiki-main/src/main/java/org/apache/wiki/render/DefaultRenderingManager.java
 
b/jspwiki-main/src/main/java/org/apache/wiki/render/DefaultRenderingManager.java
index ab06733..59ad3a7 100644
--- 
a/jspwiki-main/src/main/java/org/apache/wiki/render/DefaultRenderingManager.java
+++ 
b/jspwiki-main/src/main/java/org/apache/wiki/render/DefaultRenderingManager.java
@@ -109,20 +109,20 @@ public class DefaultRenderingManager implements 
RenderingManager {
         m_engine = engine;
         m_markupParserClass = properties.getProperty( PROP_PARSER, 
DEFAULT_PARSER );
         if( !ClassUtil.assignable( m_markupParserClass, 
MarkupParser.class.getName() ) ) {
-               log.warn( m_markupParserClass + " does not subclass " + 
MarkupParser.class.getName() + " reverting to default markup parser." );
+               log.warn( "{} does not subclass {} reverting to default markup 
parser.", m_markupParserClass, MarkupParser.class.getName() );
                m_markupParserClass = DEFAULT_PARSER;
         }
-        log.info( "Using " + m_markupParserClass + " as markup parser." );
+        log.info( "Using {} as markup parser.", m_markupParserClass );
 
         m_beautifyTitle  = TextUtil.getBooleanProperty( properties, 
PROP_BEAUTIFYTITLE, m_beautifyTitle );
         m_useCache = "true".equals( properties.getProperty( 
PageManager.PROP_USECACHE ) );
 
         if( m_useCache ) {
             final String documentCacheName = engine.getApplicationName() + "." 
+ DOCUMENTCACHE_NAME;
-            if (m_cacheManager.cacheExists(documentCacheName)) {
-                m_documentCache = m_cacheManager.getCache(documentCacheName);
+            if( m_cacheManager.cacheExists( documentCacheName ) ) {
+                m_documentCache = m_cacheManager.getCache( documentCacheName );
             } else {
-                log.info( "cache with name " + documentCacheName + " not found 
in ehcache.xml, creating it with defaults." );
+                log.info( "cache with name {} not found in ehcache.xml, 
creating it with defaults.", documentCacheName );
                 m_documentCache = new Cache( documentCacheName, 
DEFAULT_CACHESIZE, false, false, m_cacheExpiryPeriod, m_cacheExpiryPeriod );
                 m_cacheManager.addCache( m_documentCache );
             }
@@ -135,9 +135,9 @@ public class DefaultRenderingManager implements 
RenderingManager {
         m_rendererConstructor = initRenderer( renderImplName, rendererParams );
         m_rendererWysiwygConstructor = initRenderer( renderWysiwygImplName, 
rendererParams );
 
-        log.info( "Rendering content with " + renderImplName + "." );
+        log.info( "Rendering content with {}.", renderImplName );
 
-        WikiEventManager.getInstance().addWikiEventListener( 
m_engine.getManager( FilterManager.class ),this );
+        WikiEventManager.addWikiEventListener( m_engine.getManager( 
FilterManager.class ),this );
     }
 
     private Constructor< ? > initRenderer( final String renderImplName, final 
Class< ? >[] rendererParams ) throws WikiException {
@@ -443,7 +443,7 @@ public class DefaultRenderingManager implements 
RenderingManager {
                     final Collection< String > referringPages = 
m_engine.getManager( ReferenceManager.class ).findReferrers( pageName );
 
                     //
-                    //  Flush also those pages that refer to this page (if an 
nonexistent page
+                    //  Flush also those pages that refer to this page (if a 
nonexistent page
                     //  appears, we need to flush the HTML that refers to the 
now-existent page)
                     //
                     if( referringPages != null ) {
diff --git 
a/jspwiki-main/src/main/java/org/apache/wiki/search/DefaultSearchManager.java 
b/jspwiki-main/src/main/java/org/apache/wiki/search/DefaultSearchManager.java
index a3da54f..2c5c1db 100644
--- 
a/jspwiki-main/src/main/java/org/apache/wiki/search/DefaultSearchManager.java
+++ 
b/jspwiki-main/src/main/java/org/apache/wiki/search/DefaultSearchManager.java
@@ -215,7 +215,7 @@ public class DefaultSearchManager extends BasePageFilter 
implements SearchManage
 
             sw.stop();
             if( log.isDebugEnabled() ) {
-                log.debug( "AJAX search complete in " + sw );
+                log.debug( "AJAX search complete in {}", sw );
             }
             return list;
         }
@@ -236,22 +236,19 @@ public class DefaultSearchManager extends BasePageFilter 
implements SearchManage
     }
 
     private void loadSearchProvider( final Properties properties ) {
-        // See if we're using Lucene, and if so, ensure that its index 
directory is up to date.
-
+        // See if we're using Lucene, and if so, ensure that its index 
directory is up-to-date.
         final String providerClassName = TextUtil.getStringProperty( 
properties, PROP_SEARCHPROVIDER, DEFAULT_SEARCHPROVIDER );
 
         try {
-            final Class<?> providerClass = ClassUtil.findClass( 
"org.apache.wiki.search", providerClassName );
-            m_searchProvider = ( SearchProvider )providerClass.newInstance();
-        } catch( final ClassNotFoundException | InstantiationException | 
IllegalAccessException e ) {
-            log.warn("Failed loading SearchProvider, will use 
BasicSearchProvider.", e);
+            m_searchProvider = ClassUtil.buildInstance( 
"org.apache.wiki.search", providerClassName );
+        } catch( final ReflectiveOperationException e ) {
+            log.warn( "Failed loading SearchProvider, will use 
BasicSearchProvider.", e );
         }
 
         if( null == m_searchProvider ) {
-            // FIXME: Make a static with the default search provider
             m_searchProvider = new BasicSearchProvider();
         }
-        log.debug("Loaded search provider " + m_searchProvider);
+        log.debug( "Loaded search provider {}", m_searchProvider );
     }
 
     /** {@inheritDoc} */
diff --git 
a/jspwiki-main/src/main/java/org/apache/wiki/search/LuceneSearchProvider.java 
b/jspwiki-main/src/main/java/org/apache/wiki/search/LuceneSearchProvider.java
index 40b6378..2436290 100644
--- 
a/jspwiki-main/src/main/java/org/apache/wiki/search/LuceneSearchProvider.java
+++ 
b/jspwiki-main/src/main/java/org/apache/wiki/search/LuceneSearchProvider.java
@@ -68,9 +68,18 @@ import org.apache.wiki.util.ClassUtil;
 import org.apache.wiki.util.FileUtil;
 import org.apache.wiki.util.TextUtil;
 
-import java.io.*;
-import java.lang.reflect.Constructor;
-import java.util.*;
+import java.io.File;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.InputStreamReader;
+import java.io.StringReader;
+import java.io.StringWriter;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.Date;
+import java.util.List;
+import java.util.Properties;
 import java.util.concurrent.Executor;
 import java.util.concurrent.Executors;
 
@@ -318,9 +327,7 @@ public class LuceneSearchProvider implements SearchProvider 
{
 
     private Analyzer getLuceneAnalyzer() throws ProviderException {
         try {
-            final Class< ? > clazz = ClassUtil.findClass( "", m_analyzerClass 
);
-            final Constructor< ? > constructor = clazz.getConstructor();
-            return ( Analyzer )constructor.newInstance();
+            return ClassUtil.buildInstance( m_analyzerClass );
         } catch( final Exception e ) {
             final String msg = "Could not get LuceneAnalyzer class " + 
m_analyzerClass + ", reason: ";
             log.error( msg, e );
diff --git 
a/jspwiki-main/src/main/java/org/apache/wiki/ui/admin/DefaultAdminBeanManager.java
 
b/jspwiki-main/src/main/java/org/apache/wiki/ui/admin/DefaultAdminBeanManager.java
index 9c33c5f..9267e41 100644
--- 
a/jspwiki-main/src/main/java/org/apache/wiki/ui/admin/DefaultAdminBeanManager.java
+++ 
b/jspwiki-main/src/main/java/org/apache/wiki/ui/admin/DefaultAdminBeanManager.java
@@ -32,6 +32,7 @@ import org.apache.wiki.ui.admin.beans.FilterBean;
 import org.apache.wiki.ui.admin.beans.PluginBean;
 import org.apache.wiki.ui.admin.beans.SearchManagerBean;
 import org.apache.wiki.ui.admin.beans.UserBean;
+import org.apache.wiki.util.ClassUtil;
 
 import javax.management.DynamicMBean;
 import javax.management.InstanceAlreadyExistsException;
@@ -144,11 +145,10 @@ public class DefaultAdminBeanManager implements 
WikiEventListener, AdminBeanMana
             final String abname = wikiModuleInfo.getAdminBeanClass();
             try {
                 if( abname != null && !abname.isEmpty() ) {
-                    final Class< ? > abclass = Class.forName( abname );
-                    final AdminBean ab = ( AdminBean )abclass.newInstance();
+                    final AdminBean ab = ClassUtil.buildInstance( abname );
                     registerAdminBean( ab );
                 }
-            } catch( final ClassNotFoundException | InstantiationException | 
IllegalAccessException e ) {
+            } catch( final ReflectiveOperationException e ) {
                 log.error( e.getMessage(), e );
             }
         }
diff --git a/jspwiki-main/src/main/java/org/apache/wiki/xmlrpc/RPCServlet.java 
b/jspwiki-main/src/main/java/org/apache/wiki/xmlrpc/RPCServlet.java
index c18f3b2..74c1d14 100644
--- a/jspwiki-main/src/main/java/org/apache/wiki/xmlrpc/RPCServlet.java
+++ b/jspwiki-main/src/main/java/org/apache/wiki/xmlrpc/RPCServlet.java
@@ -24,6 +24,7 @@ import org.apache.wiki.api.core.Context;
 import org.apache.wiki.api.core.ContextEnum;
 import org.apache.wiki.api.core.Engine;
 import org.apache.wiki.api.spi.Wiki;
+import org.apache.wiki.util.ClassUtil;
 import org.apache.xmlrpc.ContextXmlRpcHandler;
 import org.apache.xmlrpc.Invoker;
 import org.apache.xmlrpc.XmlRpcContext;
@@ -71,8 +72,8 @@ public class RPCServlet extends HttpServlet {
         rpchandler.initialize( m_engine );
         m_xmlrpcServer.addHandler( prefix, rpchandler );
         */
-        final Class< ? > handlerClass = Class.forName( handlerName );
-        m_xmlrpcServer.addHandler( prefix, new LocalHandler(handlerClass) );
+        final Class< WikiRPCHandler > handlerClass = ClassUtil.findClass( "", 
handlerName );
+        m_xmlrpcServer.addHandler( prefix, new LocalHandler( handlerClass ) );
     }
 
     /**
@@ -155,16 +156,16 @@ public class RPCServlet extends HttpServlet {
     }
 
     private static class LocalHandler implements ContextXmlRpcHandler {
-        private final Class< ? > m_clazz;
+        private final Class< WikiRPCHandler > m_clazz;
 
-        public LocalHandler( final Class< ? > clazz )
+        public LocalHandler( final Class< WikiRPCHandler > clazz )
         {
             m_clazz = clazz;
         }
 
         @Override
         public Object execute( final String method, final Vector params, final 
XmlRpcContext context ) throws Exception {
-            final WikiRPCHandler rpchandler = (WikiRPCHandler) 
m_clazz.newInstance();
+            final WikiRPCHandler rpchandler = ClassUtil.buildInstance( m_clazz 
);
             rpchandler.initialize( 
((WikiXmlRpcContext)context).getWikiContext() );
 
             final Invoker invoker = new Invoker( rpchandler );
diff --git a/jspwiki-main/src/main/resources/ini/jspwiki.properties 
b/jspwiki-main/src/main/resources/ini/jspwiki.properties
index 631c475..1f0ee8a 100644
--- a/jspwiki-main/src/main/resources/ini/jspwiki.properties
+++ b/jspwiki-main/src/main/resources/ini/jspwiki.properties
@@ -71,17 +71,21 @@ jspwiki.pageProvider = FileSystemProvider
 #jspwiki.pageNameComparator.class =
 
 #
-#  Set to true, if you want to cache page data into memory.  This is
-#  in general a good idea.
+#  Set to true, if you want to cache page data into memory.  This is in 
general a good idea.
 #
 #  Default is true (use cache).
 #
-#  NB: This replaces the JSPWiki 1.x "CachingProvider" setting, since it
-#      probably was too confusing.
+#  NB: This replaces the JSPWiki 1.x "CachingProvider" setting, since it 
probably was too confusing.
 #
 jspwiki.usePageCache = true
 
 #
+# Specify file from classpath that holds ehcache configuration.
+#
+# By default, JSPWiki caches will hold up to 1.000 elements, except the RSS 
cache, which will hold up to 250 elements
+jspwiki.cache.custom-config-file = jspwiki-ehcache.xml
+
+#
 #  Determines where wiki files are kept for FileSystemProvider i.e.:
 #
 #  jspwiki.fileSystemProvider.pageDir = /p/web/www-data/jspwiki/
@@ -445,10 +449,6 @@ jspwiki.plugin.externalJars =
 # At this time, entries here are strictly for development and testing.
 #
 
-# Disable internal caching of pre-constructed document DOMs.
-# This may be necessary if you require custom rendering that must not be 
cached.
-#jspwiki.renderingManager.useCache = false
-
 # Markup parser class name; it must be a subclass of 
org.apache.wiki.parser.MarkupParser
 
jspwiki.renderingManager.markupParser=org.apache.wiki.parser.JSPWikiMarkupParser
 
diff --git a/jspwiki-util/src/main/java/org/apache/wiki/util/ClassUtil.java 
b/jspwiki-util/src/main/java/org/apache/wiki/util/ClassUtil.java
index 9db58e8..bac608b 100644
--- a/jspwiki-util/src/main/java/org/apache/wiki/util/ClassUtil.java
+++ b/jspwiki-util/src/main/java/org/apache/wiki/util/ClassUtil.java
@@ -41,19 +41,18 @@ import java.util.jar.JarEntry;
 import java.util.jar.JarFile;
 
 /**
- *  Contains useful utilities for class file manipulation.  This is a static 
class,
- *  so there is no need to instantiate it.
+ * Contains useful utilities for class file manipulation. This is a static 
class, so there is no need to instantiate it.
  *
- *  @since 2.1.29.
+ * @since 2.1.29.
  */
 public final class ClassUtil {
 
     private static final Logger log = LogManager.getLogger(ClassUtil.class);
 
-    /** The location of the classmappings.xml document. It will be searched 
for in the classpath.  It's value is "{@value}". */
+    /** The location of the classmappings.xml document. It will be searched 
for in the classpath. Its value is "{@value}". */
     public  static final String MAPPINGS = "ini/classmappings.xml";
 
-    /** The location of the classmappings-extra.xml document. It will be 
searched for in the classpath.  It's value is "{@value}". */
+    /** The location of the classmappings-extra.xml document. It will be 
searched for in the classpath. Its value is "{@value}". */
     public  static final String MAPPINGS_EXTRA = "ini/classmappings-extra.xml";
 
     /** Initialize the class mappings document. */
@@ -100,17 +99,18 @@ public final class ClassUtil {
      * @return The class, if it was found.
      *  @throws ClassNotFoundException if this particular class cannot be 
found from the list.
      */
-    public static Class<?> findClass( final List< String > packages,  final 
List< String > externaljars, final String className ) throws 
ClassNotFoundException {
+    @SuppressWarnings( "unchecked" )
+    public static < T > Class< T > findClass( final List< String > packages,  
final List< String > externaljars, final String className ) throws 
ClassNotFoundException {
         if (!classLoaderSetup) {
             loader = setupClassLoader(externaljars);
         }
 
         try {
-            return loader.loadClass( className );
+            return ( Class< T > )loader.loadClass( className );
         } catch( final ClassNotFoundException e ) {
             for( final String packageName : packages ) {
                 try {
-                    return loader.loadClass( packageName + "." + className );
+                    return ( Class< T > )loader.loadClass( packageName + "." + 
className );
                 } catch( final ClassNotFoundException ex ) {
                     // This is okay, we go to the next package.
                 }
@@ -122,7 +122,7 @@ public final class ClassUtil {
     }
 
     /**
-     * Setup the plugin classloader, checking if there are external JARS to 
add.
+     * Set up the plugin classloader, checking if there are external JARS to 
add.
      * 
      * @param externaljars external jars to load into the classloader.
      * @return the classloader that can load classes from the configured 
external jars or, if not specified, the classloader that loaded this class.
@@ -157,19 +157,19 @@ public final class ClassUtil {
     }
 
     /**
+     * It will first attempt to instantiate the class directly from the 
className, and will then try to prefix it with the packageName.
      *
-     *  It will first attempt to instantiate the class directly from the 
className, and will then try to prefix it with the packageName.
-     *
-     *  @param packageName A package name (such as "org.apache.wiki.plugins").
-     *  @param className The class name to find.
-     *  @return The class, if it was found.
-     *  @throws ClassNotFoundException if this particular class cannot be 
found.
+     * @param packageName A package name (such as "org.apache.wiki.plugins").
+     * @param className The class name to find.
+     * @return The class, if it was found.
+     * @throws ClassNotFoundException if this particular class cannot be found.
      */
-    public static Class< ? > findClass( final String packageName, final String 
className ) throws ClassNotFoundException {
+    @SuppressWarnings( "unchecked" )
+    public static < T > Class< T > findClass( final String packageName, final 
String className ) throws ClassNotFoundException {
         try {
-            return ClassUtil.class.getClassLoader().loadClass( className );
+            return ( Class< T > )ClassUtil.class.getClassLoader().loadClass( 
className );
         } catch( final ClassNotFoundException e ) {
-            return ClassUtil.class.getClassLoader().loadClass( packageName + 
"." + className );
+            return ( Class< T > )ClassUtil.class.getClassLoader().loadClass( 
packageName + "." + className );
         }
     }
     
@@ -268,10 +268,9 @@ public final class ClassUtil {
      *  @throws ReflectiveOperationException If the class cannot be found or 
instantiated.
      *  @since 2.5.40
      */
-    @SuppressWarnings("unchecked")
     public static < T > T getMappedObject( final String requestedClass ) 
throws ReflectiveOperationException, IllegalArgumentException {
         final Object[] initargs = {};
-        return ( T )getMappedObject(requestedClass, initargs );
+        return getMappedObject( requestedClass, initargs );
     }
 
     /**
@@ -297,23 +296,7 @@ public final class ClassUtil {
     @SuppressWarnings( "unchecked" )
     public static < T > T getMappedObject( final String requestedClass, final 
Object... initargs ) throws ReflectiveOperationException, 
IllegalArgumentException {
         final Class< ? > cl = getMappedClass( requestedClass );
-        final Constructor< ? >[] ctors = cl.getConstructors();
-        
-        //  Try to find the proper constructor by comparing the initargs array 
classes and the constructor types.
-        for( final Constructor< ? > ctor : ctors ) {
-            final Class< ? >[] params = ctor.getParameterTypes();
-            if( params.length == initargs.length ) {
-                for( int arg = 0; arg < initargs.length; arg++ ) {
-                    if( params[ arg ].isAssignableFrom( initargs[ arg 
].getClass() ) ) {
-                        //  Ha, found it!  Instantiating and returning...
-                        return ( T )ctor.newInstance( initargs );
-                    }
-                }
-            }
-        }
-        
-        //  No arguments, so we can just call a default constructor and ignore 
the arguments.
-        return ( T )cl.getDeclaredConstructor().newInstance();
+        return ( T )buildInstance( cl, initargs );
     }
 
     /**
@@ -368,5 +351,77 @@ public final class ClassUtil {
     public static Map< String, String > getExtraClassMappings() {
         return c_classMappingsExtra;
     }
+
+    /**
+     * This method is used to instantiate a given class.
+     *
+     * @param className The name of the class you wish to instantiate.
+     * @return An instantiated Object.
+     * @throws ReflectiveOperationException If the class cannot be found or 
instantiated.
+     * @since 2.11.1
+     */
+    public static < T > T buildInstance( final String className ) throws 
ReflectiveOperationException {
+        return buildInstance( "", className );
+    }
+
+    /**
+     * This method is used to instantiate a given class.
+     * <p>
+     * * It will first attempt to instantiate the class directly from the 
className, and will then try to prefix it with the packageName.
+     *
+     * @param packageName A package name (such as "org.apache.wiki.plugins").
+     * @param className The class name to find.
+     * @return An instantiated Object.
+     * @throws ReflectiveOperationException If the class cannot be found or 
instantiated.
+     * @since 2.11.1
+     */
+    public static < T > T buildInstance( final String packageName, final 
String className ) throws ReflectiveOperationException {
+        return buildInstance( findClass( packageName, className ) );
+    }
+
+    /**
+     * This method is used to instantiate a given class.
+     *
+     * @param from The name of the class you wish to instantiate.
+     * @return An instantiated Object.
+     * @throws ReflectiveOperationException If the class cannot be found or 
instantiated.
+     * @since 2.11.1
+     */
+    public static < T > T buildInstance( final Class< T > from ) throws 
ReflectiveOperationException {
+        final Object[] initArgs = {};
+        return buildInstance( from, initArgs );
+    }
+
+    /**
+     * This method is used to instantiate a given class.
+     * <p>
+     * This method takes in an object array for the constructor arguments for 
classes
+     * which have more than two constructors.
+     *
+     * @param from The name of the class you wish to instantiate.
+     * @param initArgs The parameters to be passed to the constructor. May be 
<code>null</code>.
+     * @return An instantiated Object.
+     * @throws ReflectiveOperationException If the class cannot be found or 
instantiated.
+     * @since 2.11.1
+     */
+    @SuppressWarnings( "unchecked" )
+    public static < T > T buildInstance( final Class< T > from, final 
Object... initArgs ) throws ReflectiveOperationException {
+        final Constructor< ? >[] ctors = from.getConstructors();
+
+        //  Try to find the proper constructor by comparing the initargs array 
classes and the constructor types.
+        for( final Constructor< ? > ctor : ctors ) {
+            final Class< ? >[] params = ctor.getParameterTypes();
+            if( params.length == initArgs.length ) {
+                for( int arg = 0; arg < initArgs.length; arg++ ) {
+                    if( params[ arg ].isAssignableFrom( initArgs[ arg 
].getClass() ) ) {
+                        //  Ha, found it!  Instantiating and returning...
+                        return ( T )ctor.newInstance( initArgs );
+                    }
+                }
+            }
+        }
+        //  No arguments, so we can just call a default constructor and ignore 
the arguments.
+        return from.getDeclaredConstructor().newInstance();
+    }
     
 }
diff --git a/jspwiki-util/src/test/java/org/apache/wiki/util/ClassUtilTest.java 
b/jspwiki-util/src/test/java/org/apache/wiki/util/ClassUtilTest.java
index 6104b43..154a512 100644
--- a/jspwiki-util/src/test/java/org/apache/wiki/util/ClassUtilTest.java
+++ b/jspwiki-util/src/test/java/org/apache/wiki/util/ClassUtilTest.java
@@ -55,7 +55,7 @@ public class ClassUtilTest
      */
     @Test
     public void testFindClass() throws Exception {
-        final Class< ? > foo = ClassUtil.findClass( "java.util", "List" );
+        final Class< List< ? > > foo = ClassUtil.findClass( "java.util", 
"List" );
 
         Assertions.assertEquals( foo.getName(), "java.util.List" );
     }
@@ -83,4 +83,10 @@ public class ClassUtilTest
         Assertions.assertFalse( ClassUtil.exists( "org.apache.wiski.FrisFrus" 
) );
     }
 
+    @Test
+    public void testBuildInstance() throws Exception {
+        Assertions.assertTrue( ClassUtil.buildInstance( "java.util.ArrayList" 
) instanceof List );
+        Assertions.assertThrows( NoSuchMethodException.class, () -> 
ClassUtil.buildInstance( "java.util.List" ) );
+    }
+
 }

Reply via email to