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" ) ); + } + }
