diff --git a/rm-community/rm-community-repo/config/alfresco/module/org_alfresco_module_rm/patch/rm-patch-context.xml b/rm-community/rm-community-repo/config/alfresco/module/org_alfresco_module_rm/patch/rm-patch-context.xml
index 7ca1fc7bab..6d4c60152e 100755
--- a/rm-community/rm-community-repo/config/alfresco/module/org_alfresco_module_rm/patch/rm-patch-context.xml
+++ b/rm-community/rm-community-repo/config/alfresco/module/org_alfresco_module_rm/patch/rm-patch-context.xml
@@ -46,6 +46,7 @@
+
\ No newline at end of file
diff --git a/rm-community/rm-community-repo/source/java/org/alfresco/module/org_alfresco_module_rm/patch/compatibility/ModulePatchComponent.java b/rm-community/rm-community-repo/source/java/org/alfresco/module/org_alfresco_module_rm/patch/compatibility/ModulePatchComponent.java
index 7b4a54abf4..92524b0bf2 100644
--- a/rm-community/rm-community-repo/source/java/org/alfresco/module/org_alfresco_module_rm/patch/compatibility/ModulePatchComponent.java
+++ b/rm-community/rm-community-repo/source/java/org/alfresco/module/org_alfresco_module_rm/patch/compatibility/ModulePatchComponent.java
@@ -27,12 +27,18 @@
package org.alfresco.module.org_alfresco_module_rm.patch.compatibility;
+import java.io.Serializable;
+
import org.alfresco.module.org_alfresco_module_rm.patch.ModulePatchExecuterImpl;
+import org.alfresco.repo.admin.registry.RegistryKey;
+import org.alfresco.repo.admin.registry.RegistryService;
import org.alfresco.repo.module.AbstractModuleComponent;
+import org.alfresco.repo.module.ModuleComponentHelper;
+import org.alfresco.repo.module.ModuleVersionNumber;
import org.alfresco.repo.policy.BehaviourFilter;
import org.alfresco.repo.transaction.RetryingTransactionHelper;
-import org.apache.commons.logging.Log;
-import org.apache.commons.logging.LogFactory;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
/**
@@ -44,8 +50,12 @@ import org.apache.commons.logging.LogFactory;
@Deprecated
public abstract class ModulePatchComponent extends AbstractModuleComponent
{
+ private static final String REGISTRY_PATH_MODULES = "modules";
+ private static final String REGISTRY_PROPERTY_INSTALLED_VERSION = "installedVersion";
+ private static final String REGISTRY_PROPERTY_CURRENT_VERSION = "currentVersion";
+
/** logger */
- protected static final Log LOGGER = LogFactory.getLog(ModulePatchComponent.class);
+ protected static final Logger LOGGER = LoggerFactory.getLogger(ModulePatchComponent.class);
/** Retrying transaction helper */
protected RetryingTransactionHelper retryingTransactionHelper;
@@ -56,6 +66,9 @@ public abstract class ModulePatchComponent extends AbstractModuleComponent
/** module patch executer */
protected ModulePatchExecuterImpl modulePatchExecuter;
+ /** Registry service */
+ protected RegistryService registryService;
+
/**
* @param retryingTransactionHelper retrying transaction helper
*/
@@ -80,6 +93,14 @@ public abstract class ModulePatchComponent extends AbstractModuleComponent
this.modulePatchExecuter = modulePatchExecuter;
}
+ /**
+ * @param registryService Registry service
+ */
+ public void setRegistryService(RegistryService registryService)
+ {
+ this.registryService = registryService;
+ }
+
/**
* Init method
*/
@@ -96,47 +117,89 @@ public abstract class ModulePatchComponent extends AbstractModuleComponent
@Override
protected void executeInternal()
{
- try
+ ModuleVersionNumber moduleInstalledVersionNumber = getModuleVersionNumber(REGISTRY_PROPERTY_INSTALLED_VERSION);
+ ModuleVersionNumber moduleCurrentVersionNumber = getModuleVersionNumber(REGISTRY_PROPERTY_CURRENT_VERSION);
+
+ String moduleName = getName();
+
+ if (isVersionLaterThan(moduleInstalledVersionNumber, moduleCurrentVersionNumber))
{
- if (LOGGER.isInfoEnabled())
+ LOGGER.info("Module patch component '{}' is skipped for upgrade from version {} to version {}",
+ moduleName, moduleInstalledVersionNumber, moduleCurrentVersionNumber);
+ }
+ else
+ {
+ try
{
- LOGGER.info("Module patch component '" + getName() + "' is executing ...");
- }
-
- // execute path within an isolated transaction
- retryingTransactionHelper.doInTransaction(new RetryingTransactionHelper.RetryingTransactionCallback()
- {
- @Override
- public Void execute()
+ LOGGER.info("Module patch component '{}' is executing ...", moduleName);
+
+ // execute path within an isolated transaction
+ retryingTransactionHelper.doInTransaction(new RetryingTransactionHelper.RetryingTransactionCallback()
{
- behaviourFilter.disableBehaviour();
- try
+ @Override
+ public Void execute()
{
- executePatch();
+ behaviourFilter.disableBehaviour();
+ try
+ {
+ executePatch();
+ }
+ finally
+ {
+ behaviourFilter.enableBehaviour();
+ }
+ return null;
}
- finally
- {
- behaviourFilter.enableBehaviour();
- }
- return null;
- }
- }, false, true);
+ }, false, true);
- if (LOGGER.isInfoEnabled())
+ LOGGER.info(" ... completed module patch '{}'", moduleName);
+
+ } catch (Exception exception)
{
- LOGGER.info(" ... completed module patch '" + getName() + "'");
+ // record the exception otherwise it gets swallowed
+ LOGGER.info(" ... error encountered. {}", exception.getMessage(), exception);
+ throw exception;
}
}
- catch (Exception exception)
+ }
+
+ /**
+ * Helper method to get the ModuleVersionNumber.
+ */
+ private ModuleVersionNumber getModuleVersionNumber(String registryProperty)
+ {
+ String moduleId = modulePatchExecuter.getModuleId();
+ RegistryKey moduleKeyVersion = new RegistryKey(ModuleComponentHelper.URI_MODULES_1_0,
+ new String[]{REGISTRY_PATH_MODULES, moduleId, registryProperty});
+ Serializable moduleVersion = this.registryService.getProperty(moduleKeyVersion);
+
+ return new ModuleVersionNumber(moduleVersion.toString());
+ }
+
+ /**
+ * Helper method to determine if this is an upgrade from a version that already includes the early (v2.0, v2.1)
+ * patches.
+ *
+ */
+ private boolean isVersionLaterThan(ModuleVersionNumber installedModuleVersionNumber,
+ ModuleVersionNumber currentModuleVersionNumber)
+ {
+ // assume that the v2.0 and v2.1 patches should be run
+ boolean versionLaterThan = false;
+
+ // if this is an upgrade as opposed to a fresh install
+ if (installedModuleVersionNumber.compareTo(currentModuleVersionNumber) != 0)
{
- // record the exception otherwise it gets swallowed
- if (LOGGER.isInfoEnabled())
+ // if the installed version is later than the minimum version number of this patch
+ ModuleVersionNumber minVersion = this.getAppliesFromVersionNumber();
+ if (installedModuleVersionNumber.compareTo(minVersion) >= 0)
{
- LOGGER.info(" ... error encountered. " + exception.getMessage(), exception);
+ versionLaterThan = true;
}
- throw exception;
}
+
+ return versionLaterThan;
}
/**