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