diff --git a/config/alfresco/messages/module-messages.properties b/config/alfresco/messages/module-messages.properties index 75cde6c791..9b74d67d3a 100644 --- a/config/alfresco/messages/module-messages.properties +++ b/config/alfresco/messages/module-messages.properties @@ -6,7 +6,8 @@ module.msg.installing= Installing module ''{0}'' version {1}. module.msg.upgrading= Upgrading module ''{0}'' version {1} (was {2}). module.msg.missing= A previously-installed module ''{0}'' (version {1}) is not present in your distribution. -module.err.downgrading_not_supported=\nDowngrading of modules is not supported.\nModule ''{0}'' version {1} is currently installed and must be uninstalled before version {2} can be installed. +module.err.downgrading_not_supported=\nDowngrading of modules is not supported.\nModule ''{0}'' version {1} is currently installed and must be uninstalled before version {2} can be installed. +module.err.unsupported_repo_version=\nModule ''{0}'' version {1} is incompatible with the current repository version {2}.\n The repository version required must be in range [{3} : {4}]. module.err.already_executed=The module component has already been executed: {0}.{1} module.err.execution_failed=A module component ''{0}'' failed to execute: {1} module.err.component_already_registered=A component named ''{0}'' has already been registered for module ''{1}''. diff --git a/config/alfresco/module-context.xml b/config/alfresco/module-context.xml index db670a0ebb..e9832be446 100644 --- a/config/alfresco/module-context.xml +++ b/config/alfresco/module-context.xml @@ -9,6 +9,7 @@ + diff --git a/source/java/org/alfresco/repo/descriptor/DescriptorServiceImpl.java b/source/java/org/alfresco/repo/descriptor/DescriptorServiceImpl.java index bea020b458..ccc76b9980 100644 --- a/source/java/org/alfresco/repo/descriptor/DescriptorServiceImpl.java +++ b/source/java/org/alfresco/repo/descriptor/DescriptorServiceImpl.java @@ -50,6 +50,7 @@ import org.alfresco.service.namespace.NamespaceService; import org.alfresco.service.namespace.QName; import org.alfresco.service.transaction.TransactionService; import org.alfresco.util.AbstractLifecycleBean; +import org.alfresco.util.VersionNumber; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.springframework.beans.factory.InitializingBean; @@ -453,6 +454,11 @@ public class DescriptorServiceImpl extends AbstractLifecycleBean implements Desc return "Unknown"; } + public VersionNumber getVersionNumber() + { + return new VersionNumber("1.0.0"); + } + /* (non-Javadoc) * @see org.alfresco.service.descriptor.Descriptor#getVersion() */ @@ -503,9 +509,17 @@ public class DescriptorServiceImpl extends AbstractLifecycleBean implements Desc */ public abstract class BaseDescriptor implements Descriptor { - /* (non-Javadoc) - * @see org.alfresco.service.descriptor.Descriptor#getVersion() - */ + public VersionNumber getVersionNumber() + { + StringBuilder version = new StringBuilder(); + version.append(getVersionMajor()); + version.append("."); + version.append(getVersionMinor()); + version.append("."); + version.append(getVersionRevision()); + return new VersionNumber(version.toString()); + } + public String getVersion() { StringBuilder version = new StringBuilder(getVersionMajor()); diff --git a/source/java/org/alfresco/repo/module/ModuleComponentHelper.java b/source/java/org/alfresco/repo/module/ModuleComponentHelper.java index ffad4e565e..d7c9aa3ede 100644 --- a/source/java/org/alfresco/repo/module/ModuleComponentHelper.java +++ b/source/java/org/alfresco/repo/module/ModuleComponentHelper.java @@ -45,6 +45,7 @@ import org.alfresco.repo.transaction.TransactionUtil.TransactionWork; import org.alfresco.service.ServiceRegistry; import org.alfresco.service.cmr.module.ModuleDetails; import org.alfresco.service.cmr.module.ModuleService; +import org.alfresco.service.descriptor.DescriptorService; import org.alfresco.service.transaction.TransactionService; import org.alfresco.util.PropertyCheck; import org.alfresco.util.VersionNumber; @@ -71,6 +72,7 @@ public class ModuleComponentHelper private static final String MSG_STARTING = "module.msg.starting"; private static final String MSG_INSTALLING = "module.msg.installing"; private static final String MSG_UPGRADING = "module.msg.upgrading"; + private static final String ERR_UNSUPPORTED_REPO_VERSION = "module.err.unsupported_repo_version"; private static final String ERR_NO_DOWNGRADE = "module.err.downgrading_not_supported"; private static final String ERR_COMPONENT_ALREADY_REGISTERED = "module.err.component_already_registered"; private static final String MSG_MISSING = "module.msg.missing"; @@ -79,6 +81,7 @@ public class ModuleComponentHelper private static Log loggerService = LogFactory.getLog(ModuleServiceImpl.class); private ServiceRegistry serviceRegistry; + private DescriptorService descriptorService; private AuthenticationComponent authenticationComponent; private RegistryService registryService; private ModuleService moduleService; @@ -98,6 +101,14 @@ public class ModuleComponentHelper this.serviceRegistry = serviceRegistry; } + /** + * @param descriptorService gives access to the current repository version + */ + public void setDescriptorService(DescriptorService descriptorService) + { + this.descriptorService = descriptorService; + } + /** * @param authenticationComponent allows execution as system user. */ @@ -271,6 +282,20 @@ public class ModuleComponentHelper { String moduleId = module.getId(); VersionNumber moduleVersion = module.getVersion(); + + // First check that the module version is fundamentall compatible with the repository + VersionNumber repoVersionNumber = descriptorService.getServerDescriptor().getVersionNumber(); + VersionNumber minRepoVersionNumber = module.getRepoVersionMin(); + VersionNumber maxRepoVersionNumber = module.getRepoVersionMax(); + if ((minRepoVersionNumber != null && repoVersionNumber.compareTo(minRepoVersionNumber) < 0) || + (maxRepoVersionNumber != null && repoVersionNumber.compareTo(maxRepoVersionNumber) > 0)) + { + // The current repo version is not supported + throw AlfrescoRuntimeException.create( + ERR_UNSUPPORTED_REPO_VERSION, + moduleId, moduleVersion, repoVersionNumber, minRepoVersionNumber, maxRepoVersionNumber); + } + // Get the module details from the registry RegistryKey moduleKeyInstalledVersion = new RegistryKey( ModuleComponentHelper.URI_MODULES_1_0, diff --git a/source/java/org/alfresco/repo/module/ModuleComponentHelperTest.java b/source/java/org/alfresco/repo/module/ModuleComponentHelperTest.java index 389e8e0808..e2c166bbc2 100644 --- a/source/java/org/alfresco/repo/module/ModuleComponentHelperTest.java +++ b/source/java/org/alfresco/repo/module/ModuleComponentHelperTest.java @@ -33,6 +33,7 @@ import java.util.Map; import org.alfresco.repo.admin.registry.RegistryService; import org.alfresco.service.cmr.module.ModuleDetails; import org.alfresco.service.cmr.module.ModuleService; +import org.alfresco.service.descriptor.DescriptorService; import org.alfresco.util.BaseAlfrescoTestCase; import org.alfresco.util.VersionNumber; @@ -83,6 +84,7 @@ public class ModuleComponentHelperTest extends BaseAlfrescoTestCase }; private RegistryService registryService; + private DescriptorService descriptorService; private DummyModuleService moduleService; private ModuleComponentHelper helper; @@ -93,6 +95,7 @@ public class ModuleComponentHelperTest extends BaseAlfrescoTestCase super.setUp(); registryService = (RegistryService) ctx.getBean("RegistryService"); + descriptorService = serviceRegistry.getDescriptorService(); moduleService = new DummyModuleService(); helper = new ModuleComponentHelper(); @@ -100,6 +103,7 @@ public class ModuleComponentHelperTest extends BaseAlfrescoTestCase helper.setModuleService(moduleService); helper.setRegistryService(registryService); helper.setServiceRegistry(serviceRegistry); + helper.setDescriptorService(descriptorService); // Register the components components = new DummyModuleComponent[3][3]; // i,j diff --git a/source/java/org/alfresco/repo/module/ModuleDetailsImpl.java b/source/java/org/alfresco/repo/module/ModuleDetailsImpl.java index 3aaa053ada..037ae0a0a3 100644 --- a/source/java/org/alfresco/repo/module/ModuleDetailsImpl.java +++ b/source/java/org/alfresco/repo/module/ModuleDetailsImpl.java @@ -42,6 +42,9 @@ import org.alfresco.util.VersionNumber; * * @author Roy Wetherall */ +/** + * @author Derek Hulley + */ public class ModuleDetailsImpl implements ModuleDetails { private String id; @@ -114,6 +117,13 @@ public class ModuleDetailsImpl implements ModuleDetails { throw new AlfrescoRuntimeException("The following module properties need to be defined: " + missingProperties); } + if (repoVersionMax.compareTo(repoVersionMin) < 0) + { + throw new AlfrescoRuntimeException("The max repo version must be greater than the min repo version:\n" + + " ID: " + id + "\n" + + " Min repo version: " + repoVersionMin + "\n" + + " Max repo version: " + repoVersionMax); + } // Set other defaults installState = ModuleInstallState.INSTALLED; @@ -195,11 +205,21 @@ public class ModuleDetailsImpl implements ModuleDetails return repoVersionMin; } + public void setRepoVersionMin(VersionNumber repoVersionMin) + { + this.repoVersionMin = repoVersionMin; + } + public VersionNumber getRepoVersionMax() { return repoVersionMax; } + public void setRepoVersionMax(VersionNumber repoVersionMax) + { + this.repoVersionMax = repoVersionMax; + } + public Date getInstallDate() { return installDate; diff --git a/source/java/org/alfresco/repo/module/ModuleServiceImpl.java b/source/java/org/alfresco/repo/module/ModuleServiceImpl.java index de26ee50d5..e14229e402 100644 --- a/source/java/org/alfresco/repo/module/ModuleServiceImpl.java +++ b/source/java/org/alfresco/repo/module/ModuleServiceImpl.java @@ -40,6 +40,7 @@ import org.alfresco.repo.security.authentication.AuthenticationComponent; import org.alfresco.service.ServiceRegistry; import org.alfresco.service.cmr.module.ModuleDetails; import org.alfresco.service.cmr.module.ModuleService; +import org.alfresco.service.descriptor.DescriptorService; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.springframework.core.io.Resource; @@ -73,6 +74,7 @@ public class ModuleServiceImpl implements ModuleService private static Log logger = LogFactory.getLog(ModuleServiceImpl.class); private ServiceRegistry serviceRegistry; + private DescriptorService descriptorService; private AuthenticationComponent authenticationComponent; private ModuleComponentHelper moduleComponentHelper; /** A cache of module details by module ID */ @@ -91,6 +93,12 @@ public class ModuleServiceImpl implements ModuleService this.moduleComponentHelper.setServiceRegistry(this.serviceRegistry); } + public void setDescriptorService(DescriptorService descriptorService) + { + this.descriptorService = descriptorService; + this.moduleComponentHelper.setDescriptorService(descriptorService); + } + /** * @param authenticationComponent allows execution as system user. */ diff --git a/source/java/org/alfresco/service/cmr/module/ModuleDetails.java b/source/java/org/alfresco/service/cmr/module/ModuleDetails.java index 6c085e9272..86b5f64c12 100644 --- a/source/java/org/alfresco/service/cmr/module/ModuleDetails.java +++ b/source/java/org/alfresco/service/cmr/module/ModuleDetails.java @@ -81,6 +81,26 @@ public interface ModuleDetails */ String getDescription(); + /** + * @return Returns the minimum version of the repository in which the module may be active + */ + VersionNumber getRepoVersionMin(); + + /** + * @param repoVersionMin the minimum version of the repository in which the module may be acitve + */ + void setRepoVersionMin(VersionNumber repoVersionMin); + + /** + * @return Returns the maximum version of the repository in which the module may be active + */ + VersionNumber getRepoVersionMax(); + + /** + * @param repoVersionMax the maximum version of the repository in which the module may be acitve + */ + void setRepoVersionMax(VersionNumber repoVersionMax); + /** * Get the modules install date * diff --git a/source/java/org/alfresco/service/cmr/module/ModuleInstallState.java b/source/java/org/alfresco/service/cmr/module/ModuleInstallState.java index 27551dc627..0913d16170 100644 --- a/source/java/org/alfresco/service/cmr/module/ModuleInstallState.java +++ b/source/java/org/alfresco/service/cmr/module/ModuleInstallState.java @@ -25,13 +25,18 @@ package org.alfresco.service.cmr.module; /** - * Enum used to indicate the install state of a module + * Enum used to indicate the install state of a module. * * @author Roy Wetherall */ public enum ModuleInstallState { - INSTALLED, // indicates that a module is installed - DISABLED, // indicates that a module is installed but it functionality is disabled - UNINSTALLED // indicates that a module is uninstalled + /** The state of the module is unknown */ + UKNOWN, + /** The module is installed */ + INSTALLED, + /** The module is disabled */ + DISABLED, + /** The module has been uninstalled */ + UNINSTALLED; } diff --git a/source/java/org/alfresco/service/descriptor/Descriptor.java b/source/java/org/alfresco/service/descriptor/Descriptor.java index 741ca9ad94..8fcaabeca4 100644 --- a/source/java/org/alfresco/service/descriptor/Descriptor.java +++ b/source/java/org/alfresco/service/descriptor/Descriptor.java @@ -24,6 +24,8 @@ */ package org.alfresco.service.descriptor; +import org.alfresco.util.VersionNumber; + /** * Provides meta-data for the Alfresco stack. @@ -67,6 +69,11 @@ public interface Descriptor */ public String getVersionBuild(); + /** + * @return Returns the object representing the major-minor-revision numbers + */ + public VersionNumber getVersionNumber(); + /** * Gets the full version number *