Added support to limit module execution to a specific range of repository versions.

e.g. the PHP SDK module has the following:
   module.repo.version.min=2.0
   module.repo.version.max=2.1
This limits it to being installed on 2.0 or 2.1 versions of Alfresco.
Roy can change this, if required.


git-svn-id: https://svn.alfresco.com/repos/alfresco-enterprise/alfresco/HEAD/root@5532 c4b6b30b-aa2e-2d43-bbcb-ca4b014f7261
This commit is contained in:
Derek Hulley 2007-04-24 01:14:42 +00:00
parent 5fed27a6d9
commit c1a69f0f3f
10 changed files with 113 additions and 8 deletions

View File

@ -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}''.

View File

@ -9,6 +9,7 @@
<!-- The ModuleService implementation -->
<bean id="moduleService" class="org.alfresco.repo.module.ModuleServiceImpl">
<property name="serviceRegistry" ref="ServiceRegistry" />
<property name="descriptorService" ref="DescriptorService" />
<property name="authenticationComponent" ref="AuthenticationComponent" />
<property name="registryService" ref="RegistryService" />
</bean>

View File

@ -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());

View File

@ -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,

View File

@ -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

View File

@ -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;

View File

@ -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.
*/

View File

@ -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
*

View File

@ -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;
}

View File

@ -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
*