Author: vmassol
Date: 2007-11-28 08:42:29 +0100 (Wed, 28 Nov 2007)
New Revision: 6103

Modified:
   xwiki-platform/core/trunk/xwiki-core/src/main/java/com/xpn/xwiki/XWiki.java
   
xwiki-platform/core/trunk/xwiki-core/src/main/java/com/xpn/xwiki/store/migration/AbstractXWikiMigrationManager.java
Log:
XWIKI-1900: Allow database migrations also for multiwikis
XWIKI-1902: Add new privileged API to list all virtual wikis


Modified: 
xwiki-platform/core/trunk/xwiki-core/src/main/java/com/xpn/xwiki/XWiki.java
===================================================================
--- xwiki-platform/core/trunk/xwiki-core/src/main/java/com/xpn/xwiki/XWiki.java 
2007-11-27 23:51:11 UTC (rev 6102)
+++ xwiki-platform/core/trunk/xwiki-core/src/main/java/com/xpn/xwiki/XWiki.java 
2007-11-28 07:42:29 UTC (rev 6103)
@@ -385,11 +385,36 @@
         }
     }
 
+    /**
+     * @return a cached list of all active virtual wikis (i.e. wikis who have 
been hit by a user request). To get a
+     *         full list of all virtual wikis database names use [EMAIL 
PROTECTED] #getVirtualWikisDatabaseNames(XWikiContext)}.
+     */
     public List getVirtualWikiList()
     {
         return virtualWikiList;
     }
 
+    /**
+     * @return the full list of all database names of all defined virtual 
wikis. The database names are computed from
+     *         the names of documents having a XWiki.XWikiServerClass object 
attached to them by removing the
+     *         "XWiki.XWikiServer" prefix and making it lower case. For 
example a page named
+     *         "XWiki.XWikiServerMyDatabase" would return "mydatabase" as the 
database name.
+     */
+    public List getVirtualWikisDatabaseNames(XWikiContext context) throws 
XWikiException
+    {
+        List databaseNames = new ArrayList();
+        String hql = ", BaseObject as obj, StringProperty as prop where 
obj.name=doc.fullName"
+            + " and obj.className='XWiki.XWikiServerClass' and prop.id.id = 
obj.id ";
+        List list = getStore().searchDocumentsNames(hql, context);
+        for (Iterator it = list.iterator(); it.hasNext();) {
+            String docname = (String) it.next();
+            if (docname.startsWith("XWiki.XWikiServer")) {
+                
databaseNames.add(docname.substring("XWiki.XWikiServer".length()).toLowerCase());
+            }
+        }
+        return databaseNames;
+    }
+
     public XWikiCache getVirtualWikiMap()
     {
         return virtualWikiMap;
@@ -458,6 +483,7 @@
                 context.setVirtual(true);
                 context.setDatabase(appname);
                 context.setOriginalDatabase(appname);
+
                 try {
                     // Let's make sure the virtaul wikis are upgraded to the 
latest database version
                     xwiki.updateDatabase(appname, false, context);
@@ -465,6 +491,23 @@
                     // Just to report it
                     e.printStackTrace();
                 }
+
+/*
+                // Run migrations
+                if ("1".equals(xwiki.Param("xwiki.store.migration", "0"))) {
+                    if (LOG.isInfoEnabled())
+                        LOG.info("Running storage migrations");
+                    AbstractXWikiMigrationManager manager = 
(AbstractXWikiMigrationManager)
+                        xwiki.createClassFromConfig( 
"xwiki.store.migration.manager.class",
+                            
"com.xpn.xwiki.store.migration.hibernate.XWikiHibernateMigrationManager", 
context);
+                    manager.startMigrations(context);
+                    if 
("1".equals(xwiki.Param("xwiki.store.migration.exitAfterEnd", "0"))) {
+                        if (LOG.isErrorEnabled())
+                            LOG.error("Exiting because 
xwiki.store.migration.exitAfterEnd is set");
+                        System.exit(0);
+                    }
+                }
+  */
             }
         }
         return xwiki;

Modified: 
xwiki-platform/core/trunk/xwiki-core/src/main/java/com/xpn/xwiki/store/migration/AbstractXWikiMigrationManager.java
===================================================================
--- 
xwiki-platform/core/trunk/xwiki-core/src/main/java/com/xpn/xwiki/store/migration/AbstractXWikiMigrationManager.java
 2007-11-27 23:51:11 UTC (rev 6102)
+++ 
xwiki-platform/core/trunk/xwiki-core/src/main/java/com/xpn/xwiki/store/migration/AbstractXWikiMigrationManager.java
 2007-11-28 07:42:29 UTC (rev 6103)
@@ -19,20 +19,14 @@
  */
 package com.xpn.xwiki.store.migration;
 
-import java.util.Arrays;
-import java.util.Collection;
-import java.util.HashSet;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Set;
-import java.util.SortedMap;
-import java.util.TreeMap;
-
+import com.xpn.xwiki.XWikiContext;
+import com.xpn.xwiki.XWikiException;
+import com.xpn.xwiki.doc.XWikiDocument;
+import org.apache.commons.collections.set.ListOrderedSet;
 import org.apache.commons.logging.Log;
 import org.apache.commons.logging.LogFactory;
 
-import com.xpn.xwiki.XWikiContext;
-import com.xpn.xwiki.XWikiException;
+import java.util.*;
 
 /**
  * Template for [EMAIL PROTECTED] XWikiMigrationManagerInterface}.
@@ -72,20 +66,101 @@
      */
     protected abstract void setDBVersion(XWikiDBVersion version, XWikiContext 
context)
         throws XWikiException;
+
     /**
      * [EMAIL PROTECTED]
      */
     public void startMigrations(XWikiContext context) throws XWikiException
     {
+        // Save context values so that we can restore them as they were before 
the migration.
+        String currentWikiOwner = context.getWikiOwner();
+        XWikiDocument currentWikiServer = context.getWikiServer();
+        boolean currentIsVirtual = context.isVirtual();
+        String currentDatabase = context.getDatabase();
+        String currentOriginalDatabase = context.getOriginalDatabase();
+
+        try {
+            for (Iterator it = getDatabasesToMigrate(context).iterator(); 
it.hasNext();) {
+                String database = (String) it.next();
+                LOG.info("Starting migration for database [" + database + 
"]...");
+
+                // Set up the context so that it points to the virtual wiki 
corresponding to the database.
+
+                // Get the document describing the virtual wiki
+                String serverwikipage = 
context.getWiki().getServerWikiPage(database);
+                XWikiDocument doc = 
context.getWiki().getDocument(serverwikipage, context);
+                if (doc.isNew()) {
+                    throw new XWikiException(XWikiException.MODULE_XWIKI,
+                        XWikiException.ERROR_XWIKI_DOES_NOT_EXIST,
+                        "The wiki [" + database + "] does not exist");
+                }
+
+                // Set the wiki owner
+                String wikiOwner = 
doc.getStringValue("XWiki.XWikiServerClass", "owner");
+                if (wikiOwner.indexOf(":") == -1)
+                    wikiOwner = context.getWiki().getDatabase() + ":" + 
wikiOwner;
+                context.setWikiOwner(wikiOwner);
+
+                context.setWikiServer(doc);
+                context.setVirtual(true);
+                context.setDatabase(database);
+                context.setOriginalDatabase(database);
+
+                startMigrationsForDatabase(context);
+            }
+        } finally {
+            context.setWikiOwner(currentWikiOwner);
+            context.setWikiServer(currentWikiServer);
+            context.setVirtual(currentIsVirtual);
+            context.setDatabase(currentDatabase);
+            context.setOriginalDatabase(currentOriginalDatabase);
+        }
+    }
+
+    /**
+     * @return the names of all databases to migrate. This is controlled 
through the "xwiki.store.migration.databases"
+     *         configuration property in xwiki.cfg. A value of "all" will add 
all databases. Note that the main database
+     *         is automatically added even if not specified.
+     */
+    private Set getDatabasesToMigrate(XWikiContext context) throws 
XWikiException
+    {
+        Set databasesToMigrate = new ListOrderedSet();
+
+        // Always migrate the main database. We also want this to be the first 
database migrated so it has to be the
+        // first returned in the list.
+        databasesToMigrate.add(context.getMainXWiki());
+
+        // Add the databases listed by the user (if any). If there's a single 
database named and if it's "all" or "ALL"
+        // then automatically add all the registered databases.
+        if (context.getWiki().isVirtual()) {
+            String[] databases = 
context.getWiki().getConfig().getPropertyAsList("xwiki.store.migration.databases");
+            if ((databases.length == 1) && 
databases[0].equalsIgnoreCase("all")) {
+                
databasesToMigrate.addAll(context.getWiki().getVirtualWikisDatabaseNames(context));
+            } else {
+                for (int i = 0; i < databases.length; i++) {
+                    databasesToMigrate.add(databases[i]);
+                }
+            }
+        }
+        
+        return databasesToMigrate;
+    }
+
+    /**
+     * It is assumed that before calling this method the XWiki context has 
been set with the database to migrate.
+     */
+    private void startMigrationsForDatabase(XWikiContext context) throws 
XWikiException
+    {
         XWikiDBVersion curversion = getDBVersion(context);
         try {
             Collection neededMigrations = getNeededMigrations(context);
             startMigrations(neededMigrations, context);
         } catch (Exception e) {
-            throw new XWikiException(XWikiException.MODULE_XWIKI_STORE, 
+            throw new XWikiException(XWikiException.MODULE_XWIKI_STORE,
                 XWikiException.ERROR_XWIKI_STORE_MIGRATION, "Migration 
failed", e);
         }
     }
+
     /**
      * @return collection of [EMAIL PROTECTED] XWikiMigratorInterface} in 
ascending order,
      *   which need be executed.

_______________________________________________
notifications mailing list
[email protected]
http://lists.xwiki.org/mailman/listinfo/notifications

Reply via email to