You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@jspwiki.apache.org by ju...@apache.org on 2018/11/05 21:35:51 UTC

[jspwiki] 15/21: further refactors on ClassUtil

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 5e8f280423dfe97b7e480d1f87018b4336057216
Author: juanpablo <ju...@apache.org>
AuthorDate: Mon Nov 5 00:25:37 2018 +0100

    further refactors on ClassUtil
    
    * use ConcurrentHashMap to store c_classmappings, instead of a Hashtable
    * use try with resources in jarEntriesUnder
    * getMappedObject methods perform the cast to the wanted type allowing to remove the cast everywhere else in the code. Propagate this change.
---
 .../src/main/java/org/apache/wiki/WikiEngine.java  | 76 ++++++++--------------
 .../org/apache/wiki/render/RenderingManager.java   |  2 +-
 .../main/java/org/apache/wiki/util/ClassUtil.java  | 60 +++++------------
 3 files changed, 46 insertions(+), 92 deletions(-)

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 d0aa34d..888da22 100644
--- a/jspwiki-main/src/main/java/org/apache/wiki/WikiEngine.java
+++ b/jspwiki-main/src/main/java/org/apache/wiki/WikiEngine.java
@@ -23,6 +23,7 @@ import java.io.IOException;
 import java.io.UnsupportedEncodingException;
 import java.net.URLDecoder;
 import java.net.URLEncoder;
+import java.nio.charset.StandardCharsets;
 import java.security.Principal;
 import java.util.ArrayList;
 import java.util.Collection;
@@ -494,16 +495,14 @@ public class WikiEngine
         //
         //  Create and find the default working directory.
         //
-        m_workDir        = TextUtil.getStringProperty( props, PROP_WORKDIR, null );
+        m_workDir = TextUtil.getStringProperty( props, PROP_WORKDIR, null );
 
-        if( m_workDir == null )
-        {
+        if( m_workDir == null ) {
             m_workDir = System.getProperty("java.io.tmpdir", ".");
             m_workDir += File.separator+Release.APPNAME+"-"+m_appid;
         }
 
-        try
-        {
+        try {
             File f = new File( m_workDir );
             f.mkdirs();
 
@@ -514,25 +513,16 @@ public class WikiEngine
             if( !f.canRead() ) throw new WikiException("No permission to read work directory: "+m_workDir);
             if( !f.canWrite() ) throw new WikiException("No permission to write to work directory: "+m_workDir);
             if( !f.isDirectory() ) throw new WikiException("jspwiki.workDir does not point to a directory: "+m_workDir);
-        }
-        catch( SecurityException e )
-        {
+        } catch( SecurityException e ) {
             log.fatal( "Unable to find or create the working directory: "+m_workDir, e );
             throw new IllegalArgumentException( "Unable to find or create the working dir: " + m_workDir, e );
         }
 
         log.info("JSPWiki working directory is '"+m_workDir+"'");
 
-        m_saveUserInfo   = TextUtil.getBooleanProperty( props,
-                                                        PROP_STOREUSERNAME,
-                                                        m_saveUserInfo );
-
-        m_useUTF8        = "UTF-8".equals( TextUtil.getStringProperty( props, PROP_ENCODING, "ISO-8859-1" ) );
-
-        m_beautifyTitle  = TextUtil.getBooleanProperty( props,
-                                                        PROP_BEAUTIFYTITLE,
-                                                        m_beautifyTitle );
-
+        m_saveUserInfo   = TextUtil.getBooleanProperty( props, PROP_STOREUSERNAME, m_saveUserInfo );
+        m_useUTF8        = StandardCharsets.UTF_8.name().equals( TextUtil.getStringProperty( props, PROP_ENCODING, StandardCharsets.ISO_8859_1.name() ) );
+        m_beautifyTitle  = TextUtil.getBooleanProperty( props, PROP_BEAUTIFYTITLE, m_beautifyTitle );
         m_templateDir    = TextUtil.getStringProperty( props, PROP_TEMPLATEDIR, "default" );
         m_frontPage      = TextUtil.getStringProperty( props, PROP_FRONTPAGE,   "Main" );
 
@@ -550,26 +540,22 @@ public class WikiEngine
         try
         {
             Class< ? > urlclass = ClassUtil.findClass( "org.apache.wiki.url",
-                    TextUtil.getStringProperty( props, PROP_URLCONSTRUCTOR, "DefaultURLConstructor" ) );
+                                                       TextUtil.getStringProperty( props, PROP_URLCONSTRUCTOR, "DefaultURLConstructor" ) );
             m_urlConstructor = (URLConstructor) urlclass.newInstance();
             m_urlConstructor.initialize( this, props );
 
-            m_pageManager       = (PageManager)ClassUtil.getMappedObject(PageManager.class.getName(), this, props );
-            m_pluginManager     = (PluginManager)ClassUtil.getMappedObject(PluginManager.class.getName(), this, props );
-            m_differenceManager = (DifferenceManager)ClassUtil.getMappedObject(DifferenceManager.class.getName(), this, props );
-            m_attachmentManager = (AttachmentManager)ClassUtil.getMappedObject(AttachmentManager.class.getName(), this, props );
-            m_variableManager   = (VariableManager)ClassUtil.getMappedObject(VariableManager.class.getName(), props );
-            // m_filterManager     = (FilterManager)ClassUtil.getMappedObject(FilterManager.class.getName(), this, props );
-            m_renderingManager  = (RenderingManager) ClassUtil.getMappedObject(RenderingManager.class.getName());
-
-            m_searchManager     = (SearchManager)ClassUtil.getMappedObject(SearchManager.class.getName(), this, props );
-
-            m_authenticationManager = (AuthenticationManager) ClassUtil.getMappedObject(AuthenticationManager.class.getName());
-            m_authorizationManager  = (AuthorizationManager) ClassUtil.getMappedObject( AuthorizationManager.class.getName());
-            m_userManager           = (UserManager) ClassUtil.getMappedObject(UserManager.class.getName());
-            m_groupManager          = (GroupManager) ClassUtil.getMappedObject(GroupManager.class.getName());
-
-            m_editorManager     = (EditorManager)ClassUtil.getMappedObject(EditorManager.class.getName(), this );
+            m_pageManager           = ClassUtil.getMappedObject( PageManager.class.getName(), this, props );
+            m_pluginManager         = ClassUtil.getMappedObject( PluginManager.class.getName(), this, props );
+            m_differenceManager     = ClassUtil.getMappedObject( DifferenceManager.class.getName(), this, props );
+            m_attachmentManager     = ClassUtil.getMappedObject( AttachmentManager.class.getName(), this, props );
+            m_variableManager       = ClassUtil.getMappedObject( VariableManager.class.getName(), props );
+            m_renderingManager      = ClassUtil.getMappedObject( RenderingManager.class.getName() );
+            m_searchManager         = ClassUtil.getMappedObject( SearchManager.class.getName(), this, props );
+            m_authenticationManager = ClassUtil.getMappedObject( AuthenticationManager.class.getName() );
+            m_authorizationManager  = ClassUtil.getMappedObject( AuthorizationManager.class.getName() );
+            m_userManager           = ClassUtil.getMappedObject( UserManager.class.getName() );
+            m_groupManager          = ClassUtil.getMappedObject( GroupManager.class.getName() );
+            m_editorManager         = ClassUtil.getMappedObject( EditorManager.class.getName(), this );
             m_editorManager.initialize( props );
 
             m_progressManager   = new ProgressManager();
@@ -583,27 +569,21 @@ public class WikiEngine
             m_aclManager = getAclManager();
 
             // Start the Workflow manager
-            m_workflowMgr = (WorkflowManager)ClassUtil.getMappedObject(WorkflowManager.class.getName());
+            m_workflowMgr = ClassUtil.getMappedObject(WorkflowManager.class.getName());
             m_workflowMgr.initialize(this, props);
 
-            m_internationalizationManager = (InternationalizationManager)
-                ClassUtil.getMappedObject(InternationalizationManager.class.getName(),this);
-
-            m_templateManager   = (TemplateManager)
-                ClassUtil.getMappedObject(TemplateManager.class.getName(), this, props );
+            m_internationalizationManager = ClassUtil.getMappedObject(InternationalizationManager.class.getName(),this);
+            m_templateManager = ClassUtil.getMappedObject(TemplateManager.class.getName(), this, props );
 
             // Since we want to use a page filters initilize() method
             // as a engine startup listener where we can initialize global event listeners,
             // it must be called lastly, so that all object references in the engine
             // are availabe to the initialize() method
-            m_filterManager     = (FilterManager)
-                ClassUtil.getMappedObject(FilterManager.class.getName(), this, props );
+            m_filterManager = ClassUtil.getMappedObject(FilterManager.class.getName(), this, props );
 
-            m_adminBeanManager = (AdminBeanManager)
-                ClassUtil.getMappedObject(AdminBeanManager.class.getName(),this);
+            m_adminBeanManager = ClassUtil.getMappedObject(AdminBeanManager.class.getName(),this);
 
             // RenderingManager depends on FilterManager events.
-
             m_renderingManager.initialize( this, props );
 
             //
@@ -718,7 +698,7 @@ public class WikiEngine
             // Build a new manager with default key lists.
             if( m_referenceManager == null )
             {
-                m_referenceManager = (ReferenceManager) ClassUtil.getMappedObject(ReferenceManager.class.getName(), this );
+                m_referenceManager = ClassUtil.getMappedObject(ReferenceManager.class.getName(), this );
                 m_referenceManager.initialize( pages );
             }
 
@@ -2328,7 +2308,7 @@ public class WikiEngine
             try
             {
                 String s = m_properties.getProperty( PROP_ACL_MANAGER_IMPL, DefaultAclManager.class.getName() );
-                m_aclManager = (AclManager)ClassUtil.getMappedObject(s); // TODO: I am not sure whether this is the right call
+                m_aclManager = ClassUtil.getMappedObject(s); // TODO: I am not sure whether this is the right call
                 m_aclManager.initialize( this, m_properties );
             }
             catch ( ReflectiveOperationException | IllegalArgumentException e )
diff --git a/jspwiki-main/src/main/java/org/apache/wiki/render/RenderingManager.java b/jspwiki-main/src/main/java/org/apache/wiki/render/RenderingManager.java
index ef55fa3..862d629 100644
--- a/jspwiki-main/src/main/java/org/apache/wiki/render/RenderingManager.java
+++ b/jspwiki-main/src/main/java/org/apache/wiki/render/RenderingManager.java
@@ -179,7 +179,7 @@ public class RenderingManager implements WikiEventListener, InternalModule
      */
     public MarkupParser getParser( WikiContext context, String pagedata ) {
     	try {
-			return ( MarkupParser )ClassUtil.getMappedObject( m_markupParserClass, context, new StringReader( pagedata ) );
+			return ClassUtil.getMappedObject( m_markupParserClass, context, new StringReader( pagedata ) );
 		} catch( ReflectiveOperationException | IllegalArgumentException e ) {
 			log.error( "unable to get an instance of " + m_markupParserClass + " (" + e.getMessage() + "), returning default markup parser.", e );
 			return new JSPWikiMarkupParser( context, new StringReader( pagedata ) );
diff --git a/jspwiki-main/src/main/java/org/apache/wiki/util/ClassUtil.java b/jspwiki-main/src/main/java/org/apache/wiki/util/ClassUtil.java
index 58a628a..9931192 100644
--- a/jspwiki-main/src/main/java/org/apache/wiki/util/ClassUtil.java
+++ b/jspwiki-main/src/main/java/org/apache/wiki/util/ClassUtil.java
@@ -27,10 +27,10 @@ import java.net.URL;
 import java.net.URLClassLoader;
 import java.util.ArrayList;
 import java.util.Enumeration;
-import java.util.Hashtable;
 import java.util.Iterator;
 import java.util.List;
 import java.util.Map;
+import java.util.concurrent.ConcurrentHashMap;
 import java.util.jar.JarEntry;
 import java.util.jar.JarFile;
 
@@ -38,7 +38,6 @@ import org.apache.commons.io.FileUtils;
 import org.apache.commons.lang.StringUtils;
 import org.apache.log4j.Logger;
 import org.apache.wiki.api.engine.PluginManager;
-import org.apache.wiki.api.exceptions.WikiException;
 import org.jdom2.Element;
 
 /**
@@ -56,7 +55,7 @@ public final class ClassUtil {
      */
     public  static final String MAPPINGS = "ini/classmappings.xml";
     
-    private static Map<String, String> c_classMappings = new Hashtable<>();
+    private static Map<String, String> c_classMappings = new ConcurrentHashMap<>();
 
     private static boolean classLoaderSetup = false;
     private static ClassLoader loader = null;
@@ -251,41 +250,19 @@ public final class ClassUtil {
      * @param jurlcon given {@link JarURLConnection} to search in.
      * @param rootPackage base package.
      */
-    static void jarEntriesUnder( List< String > results, JarURLConnection jurlcon, String rootPackage )
-    {
-        JarFile jar = null;
-        try
-        {
-            jar = jurlcon.getJarFile();
+    static void jarEntriesUnder( List< String > results, JarURLConnection jurlcon, String rootPackage ) {
+        try( JarFile jar = jurlcon.getJarFile() ) {
             log.debug( "scanning [" + jar.getName() +"]" );
             Enumeration< JarEntry > entries = jar.entries();
-            while( entries.hasMoreElements() )
-            {
+            while( entries.hasMoreElements() ) {
                 JarEntry entry = entries.nextElement();
-                if( entry.getName().startsWith( rootPackage ) && !entry.isDirectory() ) 
-                {
+                if( entry.getName().startsWith( rootPackage ) && !entry.isDirectory() ) {
                     results.add( entry.getName() );
                 }
             }
-        }
-        catch( IOException ioe )
-        {
+        } catch( IOException ioe ) {
             log.error( ioe.getMessage(), ioe );
         }
-        finally 
-        {
-            if (jar != null)
-            {
-                try
-                {
-                    jar.close();
-                }
-                catch( IOException ioe )
-                {
-                    log.error( ioe.getMessage(), ioe );
-                }
-            }
-        }
     }
     
     /**
@@ -304,11 +281,12 @@ public final class ClassUtil {
      *  @throws ReflectiveOperationException If the class cannot be found or instantiated.
      *  @since 2.5.40
      */
-    public static Object getMappedObject( String requestedClass )
+    @SuppressWarnings("unchecked")
+    public static < T > T getMappedObject( String requestedClass )
         throws ReflectiveOperationException, IllegalArgumentException
     {
         Object[] initargs = {};
-        return getMappedObject(requestedClass, initargs );
+        return ( T )getMappedObject(requestedClass, initargs );
     }
 
     /**
@@ -331,7 +309,8 @@ public final class ClassUtil {
      *  @throws ReflectiveOperationException If the class cannot be found or instantiated.
      *  @since 2.5.40
      */
-    public static Object getMappedObject( String requestedClass, Object... initargs )
+    @SuppressWarnings( "unchecked" )
+    public static < T > T getMappedObject( String requestedClass, Object... initargs )
         throws ReflectiveOperationException, IllegalArgumentException
     {
         Class<?> cl = getMappedClass( requestedClass );
@@ -354,19 +333,16 @@ public final class ClassUtil {
                         //
                         //  Ha, found it!  Instantiating and returning...
                         //
-                        return ctors[c].newInstance(initargs);
+                        return ( T )ctors[c].newInstance(initargs);
                     }
                 }
             }
         }
         
         //
-        //  No arguments, so we can just call a default constructor and
-        //  ignore the arguments.
+        //  No arguments, so we can just call a default constructor and ignore the arguments.
         //
-        Object o = cl.newInstance();
-        
-        return o;
+        return ( T )cl.newInstance();
     }
 
     /**
@@ -375,11 +351,9 @@ public final class ClassUtil {
      *  
      *  @param requestedClass
      *  @return A Class object which you can then instantiate.
-     *  @throws WikiException
+     *  @throws ClassNotFoundException
      */
-    private static Class< ? > getMappedClass( String requestedClass )
-        throws ClassNotFoundException
-    {
+    private static Class< ? > getMappedClass( String requestedClass ) throws ClassNotFoundException {
         String mappedClass = c_classMappings.get( requestedClass );
         
         if( mappedClass == null )