Author: tmortagne
Date: 2007-11-14 19:48:52 +0100 (Wed, 14 Nov 2007)
New Revision: 5872

Modified:
   
xwiki-platform/xwiki-plugins/trunk/application-manager/src/main/java/com/xpn/xwiki/plugin/applicationmanager/ApplicationManager.java
   
xwiki-platform/xwiki-plugins/trunk/application-manager/src/main/java/com/xpn/xwiki/plugin/applicationmanager/ApplicationManagerPlugin.java
   
xwiki-platform/xwiki-plugins/trunk/application-manager/src/main/java/com/xpn/xwiki/plugin/applicationmanager/core/doc/objects/classes/AbstractSuperClass.java
   
xwiki-platform/xwiki-plugins/trunk/application-manager/src/main/java/com/xpn/xwiki/plugin/applicationmanager/core/doc/objects/classes/SuperClass.java
   
xwiki-platform/xwiki-plugins/trunk/application-manager/src/main/java/com/xpn/xwiki/plugin/applicationmanager/doc/XWikiApplication.java
Log:
XAAM-26: Make sure application's translations pages are always registered
XAAM-27: Applications having itself as dependency generate infinite loop

Modified: 
xwiki-platform/xwiki-plugins/trunk/application-manager/src/main/java/com/xpn/xwiki/plugin/applicationmanager/ApplicationManager.java
===================================================================
--- 
xwiki-platform/xwiki-plugins/trunk/application-manager/src/main/java/com/xpn/xwiki/plugin/applicationmanager/ApplicationManager.java
        2007-11-14 18:35:09 UTC (rev 5871)
+++ 
xwiki-platform/xwiki-plugins/trunk/application-manager/src/main/java/com/xpn/xwiki/plugin/applicationmanager/ApplicationManager.java
        2007-11-14 18:48:52 UTC (rev 5872)
@@ -21,6 +21,7 @@
 package com.xpn.xwiki.plugin.applicationmanager;
 
 import java.io.IOException;
+import java.util.Collection;
 import java.util.Iterator;
 import java.util.List;
 import java.util.Set;
@@ -34,6 +35,8 @@
 import com.xpn.xwiki.XWikiException;
 import com.xpn.xwiki.doc.XWikiAttachment;
 import com.xpn.xwiki.doc.XWikiDocument;
+import com.xpn.xwiki.notify.XWikiDocChangeNotificationInterface;
+import com.xpn.xwiki.notify.XWikiNotificationRule;
 import com.xpn.xwiki.objects.BaseObject;
 import com.xpn.xwiki.objects.classes.ListClass;
 import com.xpn.xwiki.plugin.applicationmanager.doc.XWikiApplication;
@@ -47,7 +50,7 @@
  * 
  * @version $Id: $
  */
-final class ApplicationManager
+final class ApplicationManager implements XWikiDocChangeNotificationInterface
 {
     /**
      * The logging tool.
@@ -102,6 +105,34 @@
         return instance;
     }
 
+    /**
+     * [EMAIL PROTECTED]
+     * 
+     * @see 
com.xpn.xwiki.notify.XWikiDocChangeNotificationInterface#notify(com.xpn.xwiki.notify.XWikiNotificationRule,
+     *      com.xpn.xwiki.doc.XWikiDocument, com.xpn.xwiki.doc.XWikiDocument, 
int,
+     *      com.xpn.xwiki.XWikiContext)
+     */
+    public void notify(XWikiNotificationRule rule, XWikiDocument newdoc, 
XWikiDocument olddoc,
+        int event, XWikiContext context)
+    {
+        try {
+            if (newdoc != null
+                && 
newdoc.getObjectNumbers(XWikiApplicationClass.getInstance(context)
+                    .getClassFullName()) > 0) {
+
+                List appList =
+                    
XWikiApplicationClass.getInstance(context).newSuperDocumentList(newdoc,
+                        context);
+                updateApplicationsTranslation(appList,
+                    "Auto update translations informations from applications 
in "
+                        + newdoc.getFullName(), context);
+            }
+        } catch (XWikiException e) {
+            LOG.error("Error when updating translations informations from 
applications in "
+                + newdoc.getFullName(), e);
+        }
+    }
+
     // 
////////////////////////////////////////////////////////////////////////////
     // Applications management
 
@@ -274,6 +305,7 @@
      * Insert in XWiki.XWikiPreferences "documentBundles" field the 
translation documents of all
      * applications in the context's wiki.
      * 
+     * @param applications the applications for which to update translations 
informations.
      * @param comment a comment used when saving XWiki.
      * @param context the XWiki context.
      * @throws XWikiException error when :
@@ -283,8 +315,8 @@
      *             <li>or saving wiki preferences document.</li>
      *             </ul>
      */
-    public void updateAllApplicationTranslation(String comment, XWikiContext 
context)
-        throws XWikiException
+    public void updateApplicationsTranslation(Collection applications, String 
comment,
+        XWikiContext context) throws XWikiException
     {
         XWiki xwiki = context.getWiki();
 
@@ -298,9 +330,7 @@
 
         boolean updateprefs = false;
 
-        List applist = getApplicationList(context);
-
-        for (Iterator it = applist.iterator(); it.hasNext();) {
+        for (Iterator it = applications.iterator(); it.hasNext();) {
             XWikiApplication app = (XWikiApplication) it.next();
 
             updateprefs |= updateApplicationTranslation(translationPrefs, app);
@@ -314,6 +344,25 @@
     }
 
     /**
+     * Insert in XWiki.XWikiPreferences "documentBundles" field the 
translation documents of all
+     * applications in the context's wiki.
+     * 
+     * @param comment a comment used when saving XWiki.
+     * @param context the XWiki context.
+     * @throws XWikiException error when :
+     *             <ul>
+     *             <li>getting wiki preferences document.</li>
+     *             <li>or searching for all applications in the wiki.</li>
+     *             <li>or saving wiki preferences document.</li>
+     *             </ul>
+     */
+    public void updateAllApplicationTranslation(String comment, XWikiContext 
context)
+        throws XWikiException
+    {
+        updateApplicationsTranslation(getApplicationList(context), comment, 
context);
+    }
+
+    /**
      * Insert in XWiki.XWikiPreferences "documentBundles" field the 
translation documents of the
      * provided application.
      * 

Modified: 
xwiki-platform/xwiki-plugins/trunk/application-manager/src/main/java/com/xpn/xwiki/plugin/applicationmanager/ApplicationManagerPlugin.java
===================================================================
--- 
xwiki-platform/xwiki-plugins/trunk/application-manager/src/main/java/com/xpn/xwiki/plugin/applicationmanager/ApplicationManagerPlugin.java
  2007-11-14 18:35:09 UTC (rev 5871)
+++ 
xwiki-platform/xwiki-plugins/trunk/application-manager/src/main/java/com/xpn/xwiki/plugin/applicationmanager/ApplicationManagerPlugin.java
  2007-11-14 18:48:52 UTC (rev 5872)
@@ -21,9 +21,11 @@
 package com.xpn.xwiki.plugin.applicationmanager;
 
 import com.xpn.xwiki.api.Api;
+import com.xpn.xwiki.notify.DocChangeRule;
 import com.xpn.xwiki.plugin.XWikiDefaultPlugin;
 import com.xpn.xwiki.plugin.XWikiPluginInterface;
 import com.xpn.xwiki.XWikiContext;
+import com.xpn.xwiki.XWikiException;
 
 import org.apache.commons.logging.Log;
 import org.apache.commons.logging.LogFactory;
@@ -46,7 +48,12 @@
      * The logging tool.
      */
     protected static final Log LOG = 
LogFactory.getLog(ApplicationManagerPlugin.class);
-    
+
+    /**
+     * Notification rule on document create or modify.
+     */
+    private DocChangeRule docChangeRule;
+
     // 
////////////////////////////////////////////////////////////////////////////
 
     /**
@@ -65,6 +72,45 @@
     /**
      * [EMAIL PROTECTED]
      * 
+     * @see 
com.xpn.xwiki.plugin.XWikiDefaultPlugin#init(com.xpn.xwiki.XWikiContext)
+     */
+    public void init(XWikiContext context)
+    {
+        if (docChangeRule == null) {
+            docChangeRule = new 
DocChangeRule(ApplicationManager.getInstance());
+        }
+
+        
context.getWiki().getNotificationManager().addGeneralRule(docChangeRule);
+
+        String database = context.getDatabase();
+        try {
+            // FIXME : XWiki Platform 1.1.2 bug fixed in 1.1.3 (see
+            // http://jira.xwiki.org/jira/browse/XWIKI-1853)
+            context.getWiki().setDatabase(context.getMainXWiki());
+
+            context.setDatabase(context.getMainXWiki());
+            ApplicationManager.getInstance().updateAllApplicationTranslation(
+                "Referesh applications translations informations", context);
+        } catch (XWikiException e) {
+            LOG.error("Error when updating all applications translations 
informations", e);
+        } finally {
+            context.setDatabase(database);
+        }
+    }
+
+    /**
+     * [EMAIL PROTECTED]
+     * 
+     * @see 
com.xpn.xwiki.plugin.XWikiDefaultPlugin#flushCache(com.xpn.xwiki.XWikiContext)
+     */
+    public void flushCache(XWikiContext context)
+    {
+        
context.getWiki().getNotificationManager().removeGeneralRule(docChangeRule);
+    }
+
+    /**
+     * [EMAIL PROTECTED]
+     * 
      * @see com.xpn.xwiki.plugin.XWikiDefaultPlugin#getName()
      */
     public String getName()
@@ -82,14 +128,4 @@
     {
         return new ApplicationManagerPluginApi((ApplicationManagerPlugin) 
plugin, context);
     }
-
-    /**
-     * [EMAIL PROTECTED]
-     * 
-     * @see 
com.xpn.xwiki.plugin.XWikiDefaultPlugin#init(com.xpn.xwiki.XWikiContext)
-     */
-    public void init(XWikiContext context)
-    {
-        super.init(context);
-    }
 }

Modified: 
xwiki-platform/xwiki-plugins/trunk/application-manager/src/main/java/com/xpn/xwiki/plugin/applicationmanager/core/doc/objects/classes/AbstractSuperClass.java
===================================================================
--- 
xwiki-platform/xwiki-plugins/trunk/application-manager/src/main/java/com/xpn/xwiki/plugin/applicationmanager/core/doc/objects/classes/AbstractSuperClass.java
       2007-11-14 18:35:09 UTC (rev 5871)
+++ 
xwiki-platform/xwiki-plugins/trunk/application-manager/src/main/java/com/xpn/xwiki/plugin/applicationmanager/core/doc/objects/classes/AbstractSuperClass.java
       2007-11-14 18:48:52 UTC (rev 5872)
@@ -670,8 +670,9 @@
 
     /**
      * [EMAIL PROTECTED]
-     *
-     * @see 
com.xpn.xwiki.plugin.applicationmanager.core.doc.objects.classes.SuperClass#getSuperDocument(java.lang.String,
 int, boolean, com.xpn.xwiki.XWikiContext)
+     * 
+     * @see 
com.xpn.xwiki.plugin.applicationmanager.core.doc.objects.classes.SuperClass#getSuperDocument(java.lang.String,
+     *      int, boolean, com.xpn.xwiki.XWikiContext)
      */
     public SuperDocument getSuperDocument(String itemName, int objectId, 
boolean validate,
         XWikiContext context) throws XWikiException
@@ -709,7 +710,7 @@
         parameterValues.add(getClassTemplateFullName());
 
         String andSymbol = " and ";
-        
+
         if (fieldDescriptors != null) {
             for (int i = 0; i < fieldDescriptors.length; ++i) {
                 String fieldName = fieldDescriptors[i][0];
@@ -829,6 +830,21 @@
     /**
      * [EMAIL PROTECTED]
      * 
+     * @see 
com.xpn.xwiki.plugin.applicationmanager.core.doc.objects.classes.SuperClass#newSuperDocumentList(com.xpn.xwiki.doc.XWikiDocument,
+     *      com.xpn.xwiki.XWikiContext)
+     */
+    public List newSuperDocumentList(XWikiDocument document, XWikiContext 
context)
+        throws XWikiException
+    {
+        List documents = new ArrayList(1);
+        documents.add(document);
+        
+        return newSuperDocumentList(documents, context);
+    }
+
+    /**
+     * [EMAIL PROTECTED]
+     * 
      * @see 
com.xpn.xwiki.plugin.applicationmanager.core.doc.objects.classes.SuperClass#newSuperDocumentList(java.util.List,
      *      com.xpn.xwiki.XWikiContext)
      */

Modified: 
xwiki-platform/xwiki-plugins/trunk/application-manager/src/main/java/com/xpn/xwiki/plugin/applicationmanager/core/doc/objects/classes/SuperClass.java
===================================================================
--- 
xwiki-platform/xwiki-plugins/trunk/application-manager/src/main/java/com/xpn/xwiki/plugin/applicationmanager/core/doc/objects/classes/SuperClass.java
       2007-11-14 18:35:09 UTC (rev 5871)
+++ 
xwiki-platform/xwiki-plugins/trunk/application-manager/src/main/java/com/xpn/xwiki/plugin/applicationmanager/core/doc/objects/classes/SuperClass.java
       2007-11-14 18:48:52 UTC (rev 5872)
@@ -335,7 +335,19 @@
         throws XWikiException;
 
     /**
-     * Create new super document containing object of class [EMAIL PROTECTED] 
#getClassFullName()} for each
+     * Create new super documents for each object of class [EMAIL PROTECTED] 
#getClassFullName()} for provided
+     * [EMAIL PROTECTED] XWikiDocument} and return it.
+     * 
+     * @param documents the list of [EMAIL PROTECTED] XWikiDocument}.
+     * @param context the XWiki context.
+     * @return the list of [EMAIL PROTECTED] SuperDocument}.
+     * @throws XWikiException error when calling SuperDocument implementation 
constructor.
+     */
+    List newSuperDocumentList(XWikiDocument documents, XWikiContext context)
+        throws XWikiException;
+
+    /**
+     * Create new super document for each object of class [EMAIL PROTECTED] 
#getClassFullName()} of each
      * [EMAIL PROTECTED] XWikiDocument} in the list and return it.
      * 
      * @param documents the list of [EMAIL PROTECTED] XWikiDocument}.

Modified: 
xwiki-platform/xwiki-plugins/trunk/application-manager/src/main/java/com/xpn/xwiki/plugin/applicationmanager/doc/XWikiApplication.java
===================================================================
--- 
xwiki-platform/xwiki-plugins/trunk/application-manager/src/main/java/com/xpn/xwiki/plugin/applicationmanager/doc/XWikiApplication.java
      2007-11-14 18:35:09 UTC (rev 5871)
+++ 
xwiki-platform/xwiki-plugins/trunk/application-manager/src/main/java/com/xpn/xwiki/plugin/applicationmanager/doc/XWikiApplication.java
      2007-11-14 18:48:52 UTC (rev 5872)
@@ -272,9 +272,76 @@
         return getAppName() + "-" + getAppVersion();
     }
 
+    /**
+     * [EMAIL PROTECTED]
+     * 
+     * @see java.lang.Object#hashCode()
+     */
+    public int hashCode()
+    {
+        return getAppName() != null ? getAppName().hashCode() : "".hashCode();
+    }
+
+    /**
+     * [EMAIL PROTECTED]
+     * 
+     * @see com.xpn.xwiki.api.Document#equals(java.lang.Object)
+     */
+    public boolean equals(Object object)
+    {
+        boolean equals = false;
+
+        if (object instanceof XWikiApplication) {
+            equals =
+                getAppName() == null ? ((XWikiApplication) 
object).getAppName() == null
+                    : getAppName().equalsIgnoreCase(((XWikiApplication) 
object).getAppName());
+        } else if (object instanceof String) {
+            equals =
+                getAppName() == null ? object == null : 
getAppName().equalsIgnoreCase(
+                    (String) object);
+        }
+
+        return equals;
+    }
+
     // ///
 
     /**
+     * Add all applications on which current application depend.
+     * 
+     * @param rootApplication the root application containing recursively all 
in
+     *            <code>applicationList</code>.
+     * @param applicationList the applications.
+     * @param recurse if true it add recursively all applications 
dependencies, if false return only
+     *            direct dependencies.
+     * @param context the XWiki context.
+     * @throws XWikiException error when getting application descriptor 
document from the database.
+     * @see #getApplications()
+     */
+    protected void addXWikiApplicationSet(XWikiApplication rootApplication,
+        Collection applicationList, boolean recurse, XWikiContext context) 
throws XWikiException
+    {
+        List applications = getApplications();
+        for (Iterator it = applications.iterator(); it.hasNext();) {
+            String appname = (String) it.next();
+
+            // Breaks infinite loop if application contains itself in its 
dependencies at any level.
+            if ((rootApplication == null || !rootApplication.equals(appname))
+                && !applicationList.contains(appname)) {
+                XWikiApplication app =
+                    ((XWikiApplicationClass) sclass).getApplication(appname, 
true, context);
+                applicationList.add(app);
+
+                if (recurse) {
+                    app
+                        .addXWikiApplicationSet(rootApplication, 
applicationList, recurse,
+                            context);
+                }
+            }
+        }
+    }
+
+    /**
      * Get set of XWikiApplication containing all applications on which 
current application depend.
      * 
      * @param recurse if true it add recursively all applications 
dependencies, if false return only
@@ -289,19 +356,8 @@
     {
         Set applicationSet = new HashSet();
 
-        List applications = getApplications();
-        for (Iterator it = applications.iterator(); it.hasNext();) {
-            XWikiApplication app =
-                ((XWikiApplicationClass) sclass)
-                    .getApplication((String) it.next(), true, context);
-            applicationSet.add(app);
+        addXWikiApplicationSet(this, applicationSet, recurse, context);
 
-            if (recurse) {
-                applicationSet.addAll(app.getXWikiApplicationSet(recurse, 
context));
-            }
-
-        }
-
         return applicationSet;
     }
 

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

Reply via email to