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 2020/03/24 22:10:29 UTC

[jspwiki] 13/15: Refactor WikiEngine initialization (somewhat related to JSPWIKI-806)

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 3b8bb073fbc93d2bae83cb11acd1fdfd8f548484
Author: juanpablo <ju...@apache.org>
AuthorDate: Tue Mar 24 21:49:56 2020 +0100

    Refactor WikiEngine initialization (somewhat related to JSPWIKI-806)
---
 .../src/main/java/org/apache/wiki/WikiEngine.java  | 242 ++++++---------------
 1 file changed, 63 insertions(+), 179 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 54441db..eaf46a0 100644
--- a/jspwiki-main/src/main/java/org/apache/wiki/WikiEngine.java
+++ b/jspwiki-main/src/main/java/org/apache/wiki/WikiEngine.java
@@ -24,6 +24,7 @@ import org.apache.log4j.PropertyConfigurator;
 import org.apache.wiki.api.Release;
 import org.apache.wiki.api.core.Engine;
 import org.apache.wiki.api.core.Page;
+import org.apache.wiki.api.engine.Initializable;
 import org.apache.wiki.api.exceptions.ProviderException;
 import org.apache.wiki.api.exceptions.WikiException;
 import org.apache.wiki.attachment.AttachmentManager;
@@ -104,9 +105,6 @@ public class WikiEngine implements Engine {
     /** Stores properties. */
     private Properties m_properties;
 
-    /** Does the work in renaming pages. */
-    private PageRenamer m_pageRenamer = null;
-
     /** Should the user info be saved with the page data as well? */
     private boolean m_saveUserInfo = true;
 
@@ -116,66 +114,6 @@ public class WikiEngine implements Engine {
     /** Store the file path to the basic URL.  When we're not running as a servlet, it defaults to the user's current directory. */
     private String m_rootPath = System.getProperty( "user.dir" );
 
-    /** Stores references between wikipages. */
-    private ReferenceManager  m_referenceManager = null;
-
-    /** Stores the Plugin manager */
-    private PluginManager     m_pluginManager;
-
-    /** Stores the Variable manager */
-    private VariableManager   m_variableManager;
-
-    /** Stores the Attachment manager */
-    private AttachmentManager m_attachmentManager = null;
-
-    /** Stores the Page manager */
-    private PageManager       m_pageManager = null;
-
-    /** Stores the authorization manager */
-    private AuthorizationManager m_authorizationManager = null;
-
-    /** Stores the authentication manager.*/
-    private AuthenticationManager m_authenticationManager = null;
-
-    /** Stores the ACL manager. */
-    private AclManager       m_aclManager = null;
-
-    /** Resolves wiki actions, JSPs and special pages. */
-    private CommandResolver  m_commandResolver = null;
-
-    private TemplateManager  m_templateManager = null;
-
-    /** Does all our diffs for us. */
-    private DifferenceManager m_differenceManager;
-
-    /** Handlers page filters. */
-    private FilterManager    m_filterManager;
-
-    /** Stores the Search manager */
-    private SearchManager    m_searchManager = null;
-
-    /** Facade for managing users */
-    private UserManager      m_userManager = null;
-
-    /** Facade for managing users */
-    private GroupManager     m_groupManager = null;
-
-    private RenderingManager m_renderingManager;
-
-    private EditorManager    m_editorManager;
-
-    private InternationalizationManager m_internationalizationManager;
-
-    private ProgressManager  m_progressManager;
-
-    private TasksManager m_tasksManager;
-
-    /** Constructs URLs */
-    private URLConstructor   m_urlConstructor;
-
-    /** Generates RSS feed when requested. */
-    private RSSGenerator     m_rssGenerator;
-
     /** Store the ServletContext that we're in.  This may be null if WikiEngine is not running inside a servlet container (i.e. when testing). */
     private ServletContext   m_servletContext = null;
 
@@ -194,12 +132,8 @@ public class WikiEngine implements Engine {
     /** Each engine has their own application id. */
     private String           m_appid = "";
 
-    private boolean          m_isConfigured = false; // Flag.
-
-    /** Each engine has its own workflow manager. */
-    private WorkflowManager m_workflowMgr = null;
-
-    private AdminBeanManager m_adminBeanManager;
+    /** engine is up and running or not */
+    private boolean          m_isConfigured = false;
 
     /** Stores wikiengine attributes. */
     private Map< String, Object > m_attributes = new ConcurrentHashMap<>();
@@ -212,7 +146,6 @@ public class WikiEngine implements Engine {
      *  we throw a RuntimeException if things don't work.
      *
      *  @param config The ServletConfig object for this servlet.
-     *
      *  @return A WikiEngine instance.
      *  @throws InternalWikiException in case something fails. This is a RuntimeException, so be prepared for it.
      */
@@ -243,13 +176,8 @@ public class WikiEngine implements Engine {
      *  @return One fully functional, properly behaving WikiEngine.
      *  @throws InternalWikiException If the WikiEngine instantiation fails.
      */
-
-    // FIXME: Potential make-things-easier thingy here: no need to fetch the wikiengine anymore
-    //        Wiki.jsp.jspInit() [really old code]; it's probably even faster to fetch it
-    //        using this method every time than go to pageContext.getAttribute().
     public static synchronized WikiEngine getInstance( final ServletContext context, Properties props ) throws InternalWikiException {
         WikiEngine engine = ( WikiEngine )context.getAttribute( ATTR_WIKIENGINE );
-
         if( engine == null ) {
             final String appid = Integer.toString(context.hashCode()); //FIXME: Kludge, use real type.
             context.log(" Assigning new engine to "+appid);
@@ -355,8 +283,8 @@ public class WikiEngine implements Engine {
         m_workDir = TextUtil.getStringProperty( props, PROP_WORKDIR, null );
 
         if( m_workDir == null ) {
-            m_workDir = System.getProperty("java.io.tmpdir", ".");
-            m_workDir += File.separator+Release.APPNAME+"-"+m_appid;
+            m_workDir = System.getProperty( "java.io.tmpdir", "." );
+            m_workDir += File.separator + Release.APPNAME + "-" + m_appid;
         }
 
         try {
@@ -367,16 +295,16 @@ public class WikiEngine implements Engine {
             //  A bunch of sanity checks
             //
             if( !f.exists() ) {
-                throw new WikiException("Work directory does not exist: "+m_workDir);
+                throw new WikiException( "Work directory does not exist: " + m_workDir );
             }
             if( !f.canRead() ) {
-                throw new WikiException("No permission to read work directory: "+m_workDir);
+                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);
+                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);
+                throw new WikiException( "jspwiki.workDir does not point to a directory: " + m_workDir );
             }
         } catch( final SecurityException e ) {
             log.fatal( "Unable to find or create the working directory: "+m_workDir, e );
@@ -394,101 +322,44 @@ public class WikiEngine implements Engine {
         //
         //  Initialize the important modules.  Any exception thrown by the managers means that we will not start up.
         //
-        // FIXME: This part of the code is getting unwieldy.  We must think of a better way to do the startup-sequence.
         try {
             final String aclClassName = m_properties.getProperty( PROP_ACL_MANAGER_IMPL, ClassUtil.getMappedClass( AclManager.class.getName() ).getName() );
-            final String urlConstructorClassnName = TextUtil.getStringProperty( props, PROP_URLCONSTRUCTOR, "DefaultURLConstructor" );
-            final Class< ? > urlclass = ClassUtil.findClass( "org.apache.wiki.url", urlConstructorClassnName );
-
-            m_commandResolver = ClassUtil.getMappedObject( CommandResolver.class.getName(), this, props );
-            managers.put( CommandResolver.class, m_commandResolver );
-
-            m_urlConstructor = ClassUtil.getMappedObject( urlclass.getName() );
-            m_urlConstructor.initialize( this, props );
-            managers.put( URLConstructor.class, m_urlConstructor );
-
-            m_pageManager           = ClassUtil.getMappedObject( PageManager.class.getName(), this, props );
-            managers.put( PageManager.class, m_pageManager );
-
-            m_pluginManager         = ClassUtil.getMappedObject( PluginManager.class.getName(), this, props );
-            managers.put( PluginManager.class, m_pluginManager );
-
-            m_differenceManager     = ClassUtil.getMappedObject( DifferenceManager.class.getName(), this, props );
-            managers.put( DifferenceManager.class, m_differenceManager );
-
-            m_attachmentManager     = ClassUtil.getMappedObject( AttachmentManager.class.getName(), this, props );
-            managers.put( AttachmentManager.class, m_attachmentManager );
-
-            m_variableManager       = ClassUtil.getMappedObject( VariableManager.class.getName(), props );
-            managers.put( VariableManager.class, m_variableManager );
-
-            m_searchManager         = ClassUtil.getMappedObject( SearchManager.class.getName(), this, props );
-            managers.put( SearchManager.class, m_searchManager );
-
-            m_authenticationManager = ClassUtil.getMappedObject( AuthenticationManager.class.getName() );
-            m_authenticationManager.initialize( this, props );
-            managers.put( AuthenticationManager.class, m_authenticationManager );
-
-            m_authorizationManager  = ClassUtil.getMappedObject( AuthorizationManager.class.getName() );
-            m_authorizationManager.initialize( this, props );
-            managers.put( AuthorizationManager.class, m_authorizationManager );
-
-            m_userManager           = ClassUtil.getMappedObject( UserManager.class.getName() );
-            m_userManager.initialize( this, props );
-            managers.put( UserManager.class, m_userManager );
-
-            m_groupManager          = ClassUtil.getMappedObject( GroupManager.class.getName() );
-            m_groupManager.initialize( this, props );
-            managers.put( GroupManager.class, m_groupManager );
-
-            m_editorManager         = ClassUtil.getMappedObject( EditorManager.class.getName(), this );
-            m_editorManager.initialize( this, props );
-            managers.put( EditorManager.class, m_editorManager );
-
-            m_progressManager       = ClassUtil.getMappedObject( ProgressManager.class.getName(), this );
-            managers.put( ProgressManager.class, m_progressManager );
-
-            m_aclManager = ClassUtil.getMappedObject( aclClassName );
-            m_aclManager.initialize( this, props );
-            managers.put( AclManager.class, m_aclManager );
-
-            // Start the Workflow manager
-            m_workflowMgr = ClassUtil.getMappedObject(WorkflowManager.class.getName());
-            m_workflowMgr.initialize(this, props);
-            managers.put( WorkflowManager.class, m_workflowMgr );
-
-            m_tasksManager = ClassUtil.getMappedObject(TasksManager.class.getName());
-            managers.put( TasksManager.class, m_tasksManager );
-
-            m_internationalizationManager = ClassUtil.getMappedObject(InternationalizationManager.class.getName(),this);
-            managers.put( InternationalizationManager.class, m_internationalizationManager );
-
-            m_templateManager = ClassUtil.getMappedObject(TemplateManager.class.getName(), this, props );
-            managers.put( TemplateManager.class, m_templateManager );
-
-            // 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 = ClassUtil.getMappedObject(FilterManager.class.getName(), this, props );
-            managers.put( FilterManager.class, m_filterManager );
-
-            m_adminBeanManager = ClassUtil.getMappedObject(AdminBeanManager.class.getName(),this);
-            managers.put( AdminBeanManager.class, m_adminBeanManager );
-
-            m_pageRenamer = ClassUtil.getMappedObject( PageRenamer.class.getName(), this, props );
-            managers.put( PageRenamer.class, m_pageRenamer );
+            final String urlConstructorClassName = TextUtil.getStringProperty( props, PROP_URLCONSTRUCTOR, "DefaultURLConstructor" );
+            final Class< ? > urlclass = ClassUtil.findClass( "org.apache.wiki.url", urlConstructorClassName );
+
+            initComponent( CommandResolver.class, this, props );
+            initComponent( urlclass.getName(), URLConstructor.class, ( Object )null );
+            initComponent( PageManager.class, this, props );
+            initComponent( PluginManager.class, this, props );
+            initComponent( DifferenceManager.class, this, props );
+            initComponent( AttachmentManager.class, this, props );
+            initComponent( VariableManager.class, props );
+            initComponent( SearchManager.class, this, props );
+            initComponent( AuthenticationManager.class, ( Object )null );
+            initComponent( AuthorizationManager.class, ( Object )null );
+            initComponent( UserManager.class, ( Object )null );
+            initComponent( GroupManager.class, ( Object )null );
+            initComponent( EditorManager.class, this );
+            initComponent( ProgressManager.class, this );
+            initComponent( aclClassName, AclManager.class, ( Object )null );
+            initComponent( WorkflowManager.class, ( Object )null );
+            initComponent( TasksManager.class, ( Object )null );
+            initComponent( InternationalizationManager.class, this );
+            initComponent( TemplateManager.class, this, props );
+            initComponent( FilterManager.class, this, props );
+            initComponent( AdminBeanManager.class, this );
+            initComponent( PageRenamer.class, this, props );
 
             // RenderingManager depends on FilterManager events.
-            m_renderingManager = ClassUtil.getMappedObject( RenderingManager.class.getName() );
-            m_renderingManager.initialize( this, props );
-            managers.put( RenderingManager.class, m_renderingManager );
+            initComponent( RenderingManager.class );
 
             //  ReferenceManager has the side effect of loading all pages.  Therefore after this point, all page attributes are available.
             //  initReferenceManager is indirectly using m_filterManager, therefore it has to be called after it was initialized.
             initReferenceManager();
 
             //  Hook the different manager routines into the system.
-            m_filterManager.addPageFilter( getManager( ReferenceManager.class ), -1001 );
-            m_filterManager.addPageFilter( getManager( SearchManager.class ), -1002 );
+            getManager( FilterManager.class ).addPageFilter( getManager( ReferenceManager.class ), -1001 );
+            getManager( FilterManager.class ).addPageFilter( getManager( SearchManager.class ), -1002 );
         } catch( final RuntimeException e ) {
             // RuntimeExceptions may occur here, even if they shouldn't.
             log.fatal( "Failed to start managers.", e );
@@ -511,9 +382,7 @@ public class WikiEngine implements Engine {
         //  Initialize the good-to-have-but-not-fatal modules.
         try {
             if( TextUtil.getBooleanProperty( props, RSSGenerator.PROP_GENERATE_RSS,false ) ) {
-                m_rssGenerator = ClassUtil.getMappedObject( RSSGenerator.class.getName(), this, props );
-                m_rssGenerator.initialize( this, props );
-                managers.put( RSSGenerator.class, m_rssGenerator );
+                initComponent( RSSGenerator.class, this, props );
             }
         } catch( final Exception e ) {
             log.error( "Unable to start RSS generator - JSPWiki will still work, but there will be no RSS feed.", e );
@@ -521,10 +390,27 @@ public class WikiEngine implements Engine {
 
         fireEvent( WikiEngineEvent.INITIALIZED ); // initialization complete
 
-        log.info("WikiEngine configured.");
+        log.info( "WikiEngine configured." );
         m_isConfigured = true;
     }
 
+    < T > void initComponent( final Class< T > componentClass, final Object... initArgs ) throws Exception {
+        initComponent( componentClass.getName(), componentClass, initArgs );
+    }
+
+    < T > void initComponent( final String componentInitClass, final Class< T > componentClass, final Object... initArgs ) throws Exception {
+        final T component;
+        if( initArgs == null || initArgs.length == 0 ) {
+            component = ClassUtil.getMappedObject( componentInitClass );
+        } else {
+            component = ClassUtil.getMappedObject( componentInitClass, initArgs );
+        }
+        if( Initializable.class.isAssignableFrom( componentClass ) ) {
+            ( ( Initializable )component ).initialize( this, m_properties );
+        }
+        managers.put( componentClass, component );
+    }
+
     /** {@inheritDoc} */
     @Override
     @SuppressWarnings( "unchecked" )
@@ -537,9 +423,9 @@ public class WikiEngine implements Engine {
     @SuppressWarnings( "unchecked" )
     public < T > List< T > getManagers( final Class< T > manager ) {
         return ( List< T > )managers.entrySet().stream()
-                                    .filter( e -> manager.isAssignableFrom( e.getKey() ) )
-                                    .map( Map.Entry::getValue )
-                                    .collect( Collectors.toList() );
+                .filter( e -> manager.isAssignableFrom( e.getKey() ) )
+                .map( Map.Entry::getValue )
+                .collect( Collectors.toList() );
     }
 
     /** {@inheritDoc} */
@@ -589,16 +475,14 @@ public class WikiEngine implements Engine {
                 final ArrayList< Page > pages = new ArrayList<>();
                 pages.addAll( getManager( PageManager.class ).getAllPages() );
                 pages.addAll( getManager( AttachmentManager.class ).getAllAttachments() );
+                initComponent( ReferenceManager.class, this );
 
-                m_referenceManager = ClassUtil.getMappedObject( ReferenceManager.class.getName(), this );
-                managers.put( ReferenceManager.class, m_referenceManager );
-
-                m_referenceManager.initialize( pages );
+                getManager( ReferenceManager.class ).initialize( pages );
             }
 
         } catch( final ProviderException e ) {
             log.fatal("PageProvider is unable to list pages: ", e);
-        } catch( final ReflectiveOperationException | IllegalArgumentException e ) {
+        } catch( final Exception e ) {
             throw new WikiException( "Could not instantiate ReferenceManager: " + e.getMessage(), e );
         }
     }
@@ -712,7 +596,6 @@ public class WikiEngine implements Engine {
 
     /** {@inheritDoc} */
     @Override
-    // FIXME: Should use servlet context as a default instead of a constant.
     public String getApplicationName() {
         final String appName = TextUtil.getStringProperty( m_properties, PROP_APPNAME, Release.APPNAME );
         return TextUtil.cleanString( appName, TextUtil.PUNCTUATION_CHARS_ALLOWED );
@@ -1087,6 +970,7 @@ public class WikiEngine implements Engine {
 
     /**
      * Fires a WikiPageEvent to all registered listeners.
+     *
      * @param type  the event type
      */
     protected final void firePageEvent( final int type, final String pageName ) {