diff --git a/rm-server/config/alfresco/module/org_alfresco_module_rm/log4j.properties b/rm-server/config/alfresco/module/org_alfresco_module_rm/log4j.properties index 232fb9847f..ee1920224c 100644 --- a/rm-server/config/alfresco/module/org_alfresco_module_rm/log4j.properties +++ b/rm-server/config/alfresco/module/org_alfresco_module_rm/log4j.properties @@ -24,5 +24,10 @@ log4j.logger.org.alfresco.module.org_alfresco_module_rm.patch=info # # Behaviour debug # -log4j.logger.org.alfresco.repo.policy.annotation.AnnotatedBehaviourPostProcessor=debug -log4j.logger.org.alfresco.module.org_alfresco_module_rm.behaviour.BaseBehaviourBean=debug \ No newline at end of file +log4j.logger.org.alfresco.repo.policy.annotation.AnnotatedBehaviourPostProcessor=info +log4j.logger.org.alfresco.module.org_alfresco_module_rm.behaviour.BaseBehaviourBean=info + +# +# Patch debug +# +log4j.logger.org.alfresco.module.org_alfresco_module_rm.patch=info \ No newline at end of file diff --git a/rm-server/config/alfresco/module/org_alfresco_module_rm/module-context.xml b/rm-server/config/alfresco/module/org_alfresco_module_rm/module-context.xml index ef3ba4d3ca..488d0d8a68 100644 --- a/rm-server/config/alfresco/module/org_alfresco_module_rm/module-context.xml +++ b/rm-server/config/alfresco/module/org_alfresco_module_rm/module-context.xml @@ -86,7 +86,7 @@ - + diff --git a/rm-server/config/alfresco/module/org_alfresco_module_rm/patch/rm-patch-context.xml b/rm-server/config/alfresco/module/org_alfresco_module_rm/patch/rm-patch-context.xml new file mode 100755 index 0000000000..ba47c77f86 --- /dev/null +++ b/rm-server/config/alfresco/module/org_alfresco_module_rm/patch/rm-patch-context.xml @@ -0,0 +1,44 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/rm-server/config/alfresco/module/org_alfresco_module_rm/patch/rm-patch-v20-context.xml b/rm-server/config/alfresco/module/org_alfresco_module_rm/patch/rm-patch-v20-context.xml new file mode 100755 index 0000000000..863cc68bac --- /dev/null +++ b/rm-server/config/alfresco/module/org_alfresco_module_rm/patch/rm-patch-v20-context.xml @@ -0,0 +1,66 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/rm-server/config/alfresco/module/org_alfresco_module_rm/patch/rm-patch-v21-context.xml b/rm-server/config/alfresco/module/org_alfresco_module_rm/patch/rm-patch-v21-context.xml new file mode 100755 index 0000000000..65930dcf9a --- /dev/null +++ b/rm-server/config/alfresco/module/org_alfresco_module_rm/patch/rm-patch-v21-context.xml @@ -0,0 +1,122 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/rm-server/config/alfresco/module/org_alfresco_module_rm/patch/rm-patch-v22-context.xml b/rm-server/config/alfresco/module/org_alfresco_module_rm/patch/rm-patch-v22-context.xml new file mode 100755 index 0000000000..9962527d11 --- /dev/null +++ b/rm-server/config/alfresco/module/org_alfresco_module_rm/patch/rm-patch-v22-context.xml @@ -0,0 +1,40 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/patch/AbstractModulePatch.java b/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/patch/AbstractModulePatch.java new file mode 100644 index 0000000000..097c3ebba2 --- /dev/null +++ b/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/patch/AbstractModulePatch.java @@ -0,0 +1,260 @@ +/* + * Copyright (C) 2005-2014 Alfresco Software Limited. + * + * This file is part of Alfresco + * + * Alfresco is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * Alfresco is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with Alfresco. If not, see . + */ +package org.alfresco.module.org_alfresco_module_rm.patch; + +import org.alfresco.repo.transaction.RetryingTransactionHelper.RetryingTransactionCallback; +import org.alfresco.service.transaction.TransactionService; +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.springframework.beans.factory.BeanNameAware; + +/** + * Abstract module patch implementation. + * + * @author Roy Wetherall + * @since 2.2 + */ +public abstract class AbstractModulePatch implements ModulePatch, BeanNameAware +{ + /** logger */ + protected static Log logger = LogFactory.getLog(ModulePatch.class); + + /** module patch service */ + private ModulePatchExecuter modulePatchExecuter; + + /** transaction service */ + protected TransactionService transactionService; + + /** module patch id */ + private String id; + + /** module patch description */ + private String description; + + /** module id */ + private String moduleId; + + /** module patch fixes from module schema number */ + private int fixesFromSchema; + + /** module patch fixes to module schema number */ + private int fixesToSchema; + + /** module patch target module schema number */ + private int targetSchema; + + /** + * Initiialisation method + */ + public void init() + { + modulePatchExecuter.register(this); + } + + /** + * @param modulePatchExecuter module patch executer + */ + public void setModulePatchExecuter(ModulePatchExecuter modulePatchExecuter) + { + this.modulePatchExecuter = modulePatchExecuter; + } + + /** + * @param transactionService transaction service + */ + public void setTransactionService(TransactionService transactionService) + { + this.transactionService = transactionService; + } + + /** + * @param id module patch id + */ + public void setId(String id) + { + this.id = id; + } + + /** + * @see org.alfresco.module.org_alfresco_module_rm.patch.ModulePatch#getId() + */ + @Override + public String getId() + { + return id; + } + + /** + * Convenience method to set the module patch id to the bean name (if not already specified) + */ + @Override + public void setBeanName(String beanName) + { + if (id == null) + { + id = beanName; + } + } + + /** + * @param description module patch description + */ + public void setDescription(String description) + { + this.description = description; + } + + /** + * @see org.alfresco.module.org_alfresco_module_rm.patch.ModulePatch#getDescription() + */ + @Override + public String getDescription() + { + return description; + } + + /** + * @param moduleId module id + */ + public void setModuleId(String moduleId) + { + this.moduleId = moduleId; + } + + /** + * @see org.alfresco.module.org_alfresco_module_rm.patch.ModulePatch#getModuleId() + */ + @Override + public String getModuleId() + { + return moduleId; + } + + public void setFixesFromSchema(int fixesFromSchema) + { + this.fixesFromSchema = fixesFromSchema; + } + + /** + * @see org.alfresco.module.org_alfresco_module_rm.patch.ModulePatch#getFixesFromSchema() + */ + @Override + public int getFixesFromSchema() + { + return fixesFromSchema; + } + + public void setFixesToSchema(int fixesToSchema) + { + this.fixesToSchema = fixesToSchema; + } + + /** + * @see org.alfresco.module.org_alfresco_module_rm.patch.ModulePatch#getFixesToSchema() + */ + @Override + public int getFixesToSchema() + { + return fixesToSchema; + } + + public void setTargetSchema(int targetSchema) + { + this.targetSchema = targetSchema; + } + + /** + * @see org.alfresco.module.org_alfresco_module_rm.patch.ModulePatch#getTargetSchema() + */ + @Override + public int getTargetSchema() + { + return targetSchema; + } + + /** + * @see org.alfresco.module.org_alfresco_module_rm.patch.ModulePatch#apply() + */ + @Override + public void apply() + { + if (logger.isInfoEnabled() == true) + { + logger.info("Executing module patch \"" + description + "\""); + } + if (logger.isDebugEnabled() == true) + { + logger.debug(" ... id=" + id + + ",moduleId=" + moduleId + + ",from=" + fixesFromSchema + + ",to=" + fixesToSchema + + ",target=" + targetSchema); + } + + transactionService.getRetryingTransactionHelper().doInTransaction( + new ApplyCallback(), + true, + false); + + if (logger.isDebugEnabled() == true) + { + logger.debug(" ... module patch applied"); + } + } + + /** + * Apply patch internal method. Implementations can assume a transaction has + * been started. + */ + public abstract void applyInternal(); + + /** + * Apply callback worker class implementation + */ + private class ApplyCallback implements RetryingTransactionCallback + { + /** + * @see org.alfresco.repo.transaction.RetryingTransactionHelper.RetryingTransactionCallback#execute() + */ + @Override + public Void execute() throws Throwable + { + applyInternal(); + return null; + } + } + + /** + * @see java.lang.Comparable#compareTo(java.lang.Object) + */ + @Override + public int compareTo(ModulePatch o) + { + int result = 0; + if (getTargetSchema() < o.getTargetSchema()) + { + result = -1; + } + else if (getTargetSchema() > o.getTargetSchema()) + { + result = 1; + } + return result; + } +} diff --git a/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/patch/ModulePatch.java b/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/patch/ModulePatch.java new file mode 100644 index 0000000000..4c0bc086d6 --- /dev/null +++ b/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/patch/ModulePatch.java @@ -0,0 +1,64 @@ +/* + * Copyright (C) 2005-2014 Alfresco Software Limited. + * + * This file is part of Alfresco + * + * Alfresco is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * Alfresco is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with Alfresco. If not, see . + */ +package org.alfresco.module.org_alfresco_module_rm.patch; + +/** + * Module Patch Interface + * + * @author Roy Wetherall + * @since 2.2 + */ +public interface ModulePatch extends Comparable +{ + /** + * @return module patch id + */ + String getId(); + + /** + * @return module patch description + */ + String getDescription(); + + /** + * @return module id this patch applies to + */ + String getModuleId(); + + /** + * @return smallest module schema number that this patch may be applied to + */ + int getFixesFromSchema(); + + /** + * @return largest module schema number that this patch may be applied to + */ + int getFixesToSchema(); + + /** + * @return module schema number that this patch attempts to bring the repo up to + */ + int getTargetSchema(); + + /** + * Apply the module patch + */ + void apply(); + +} diff --git a/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/patch/ModulePatchExecuter.java b/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/patch/ModulePatchExecuter.java new file mode 100644 index 0000000000..670c4df3fc --- /dev/null +++ b/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/patch/ModulePatchExecuter.java @@ -0,0 +1,40 @@ +/* + * Copyright (C) 2005-2015 Alfresco Software Limited. + * + * This file is part of Alfresco + * + * Alfresco is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * Alfresco is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with Alfresco. If not, see . + */ +package org.alfresco.module.org_alfresco_module_rm.patch; + +/** + * Module patch service interface + * + * @author Roy Wetherall + * @since 2.2 + */ +public interface ModulePatchExecuter +{ + /** + * Register module patch with the module patch executer + * + * @param modulePatch module patch + */ + void register(ModulePatch modulePatch); + + /** + * Init the schema version number + */ + void initSchemaVersion(); +} diff --git a/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/patch/ModulePatchExecuterImpl.java b/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/patch/ModulePatchExecuterImpl.java new file mode 100644 index 0000000000..0f9d048472 --- /dev/null +++ b/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/patch/ModulePatchExecuterImpl.java @@ -0,0 +1,168 @@ +/* + * Copyright (C) 2005-2014 Alfresco Software Limited. + * + * This file is part of Alfresco + * + * Alfresco is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * Alfresco is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with Alfresco. If not, see . + */ +package org.alfresco.module.org_alfresco_module_rm.patch; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import org.alfresco.error.AlfrescoRuntimeException; +import org.alfresco.repo.module.AbstractModuleComponent; +import org.alfresco.service.cmr.attributes.AttributeService; +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; + +/** + * Module patch executer base implementation + * + * @author Roy Wetherall + * @since 2.2 + */ +public class ModulePatchExecuterImpl extends AbstractModuleComponent + implements ModulePatchExecuter +{ + /** logger */ + protected static Log logger = LogFactory.getLog(ModulePatchExecuterImpl.class); + + /** default start schema */ + private static final int START_SCHEMA = 0; + + /** attribute key */ + private static final String KEY_MODULE_SCHEMA = "module-schema"; + + /** configured module schema version */ + protected int moduleSchema = START_SCHEMA; + + /** attribute service */ + protected AttributeService attributeService; + + /** module patches */ + protected Map modulePatches = new HashMap(21); + + /** + * @param attributeService attribute service + */ + public void setAttributeService(AttributeService attributeService) + { + this.attributeService = attributeService; + } + + /** + * @param moduleSchema configured module schema version + */ + public void setModuleSchema(int moduleSchema) + { + this.moduleSchema = moduleSchema; + } + + /** + * @see org.alfresco.module.org_alfresco_module_rm.patch.ModulePatchExecuter#register(org.alfresco.module.org_alfresco_module_rm.patch.ModulePatch) + */ + @Override + public void register(ModulePatch modulePatch) + { + // ensure that the module patch being registered relates to the module id + if (getModuleId().equals(modulePatch.getModuleId()) == false) + { + throw new AlfrescoRuntimeException("Unable to register module patch, becuase module id is invalid."); + } + + if (logger.isDebugEnabled() == true) + { + logger.debug("Registering module patch " + modulePatch.getId() + " for module " + getModuleId()); + } + + modulePatches.put(modulePatch.getId(), modulePatch); + } + + /** + * @see org.alfresco.repo.module.AbstractModuleComponent#executeInternal() + */ + @Override + protected void executeInternal() throws Throwable + { + // get current schema version + int currentSchema = getCurrentSchema(); + + if (logger.isDebugEnabled() == true) + { + logger.debug("Running module patch executer (currentSchema=" + currentSchema + ", configuredSchema=" + moduleSchema + ")"); + } + + if (moduleSchema > currentSchema) + { + // determine what patches should be applied + List patchesToApply = new ArrayList(13); + for (ModulePatch modulePatch : modulePatches.values()) + { + if (modulePatch.getFixesFromSchema() <= currentSchema && + modulePatch.getFixesToSchema() >= currentSchema) + { + patchesToApply.add(modulePatch); + } + } + + // apply the patches in the correct order + Collections.sort(patchesToApply); + for (ModulePatch patchToApply : patchesToApply) + { + patchToApply.apply(); + } + + // update the schema + updateSchema(moduleSchema); + } + } + + /** + * Get the currently recorded schema version for the module + * + * @return int currently recorded schema version + */ + protected int getCurrentSchema() + { + Integer result = START_SCHEMA; + if (attributeService.exists(KEY_MODULE_SCHEMA, getModuleId()) == true) + { + result = (Integer)attributeService.getAttribute(KEY_MODULE_SCHEMA, getModuleId()); + } + return result; + } + + /** + * Update the recorded schema version for the module. + * + * @param newSchema new schema version + */ + protected void updateSchema(int newSchema) + { + attributeService.setAttribute(new Integer(newSchema), KEY_MODULE_SCHEMA, getModuleId()); + } + + /** + * @see org.alfresco.module.org_alfresco_module_rm.patch.ModulePatchExecuter#initSchemaVersion() + */ + @Override + public void initSchemaVersion() + { + updateSchema(moduleSchema); + } +} diff --git a/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/patch/RMv22CapabilityPatch.java b/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/patch/RMv22CapabilityPatch.java deleted file mode 100644 index b3316e92c1..0000000000 --- a/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/patch/RMv22CapabilityPatch.java +++ /dev/null @@ -1,61 +0,0 @@ -/* - * Copyright (C) 2005-2013 Alfresco Software Limited. - * - * This file is part of Alfresco - * - * Alfresco is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * Alfresco is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with Alfresco. If not, see . - */ -package org.alfresco.module.org_alfresco_module_rm.patch; - -import java.util.Set; - -import org.alfresco.module.org_alfresco_module_rm.role.FilePlanRoleService; -import org.alfresco.service.cmr.repository.NodeRef; - -/** - * RM v2.2 patch to updated modified capabilities. - * - * @author Tuna Aksoy - * @since 2.2 - */ -public class RMv22CapabilityPatch extends BaseRMCapabilityPatch -{ - /** - * @see org.alfresco.repo.module.AbstractModuleComponent#executeInternal() - */ - @Override - protected void executePatch() throws Throwable - { - Set filePlans = getFilePlans(); - - if (logger.isDebugEnabled() == true) - { - logger.debug(" ... updating " + filePlans.size() + " file plans"); - } - - for (NodeRef filePlan : filePlans) - { - if (logger.isDebugEnabled() == true) - { - logger.debug(" ... updating file plan " + filePlan.toString()); - } - - // add new capability - addCapability(filePlan, - "FileDestructionReport", - FilePlanRoleService.ROLE_ADMIN, - FilePlanRoleService.ROLE_RECORDS_MANAGER); - } - } -} diff --git a/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/patch/ModulePatchComponent.java b/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/patch/compatibility/ModulePatchComponent.java similarity index 81% rename from rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/patch/ModulePatchComponent.java rename to rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/patch/compatibility/ModulePatchComponent.java index cdd04dc257..b9dffa8015 100644 --- a/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/patch/ModulePatchComponent.java +++ b/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/patch/compatibility/ModulePatchComponent.java @@ -16,8 +16,9 @@ * You should have received a copy of the GNU Lesser General Public License * along with Alfresco. If not, see . */ -package org.alfresco.module.org_alfresco_module_rm.patch; +package org.alfresco.module.org_alfresco_module_rm.patch.compatibility; +import org.alfresco.module.org_alfresco_module_rm.patch.ModulePatchExecuterImpl; import org.alfresco.repo.module.AbstractModuleComponent; import org.alfresco.repo.policy.BehaviourFilter; import org.alfresco.repo.transaction.RetryingTransactionHelper; @@ -31,6 +32,7 @@ import org.apache.commons.logging.LogFactory; * @author Roy Wetherall * @since 2.1 */ +@Deprecated public abstract class ModulePatchComponent extends AbstractModuleComponent { /** logger */ @@ -42,6 +44,9 @@ public abstract class ModulePatchComponent extends AbstractModuleComponent /** Behaviour filter */ protected BehaviourFilter behaviourFilter; + /** module patch executer */ + protected ModulePatchExecuterImpl modulePatchExecuter; + /** * @param retryingTransactionHelper retrying transaction helper */ @@ -58,6 +63,24 @@ public abstract class ModulePatchComponent extends AbstractModuleComponent this.behaviourFilter = behaviourFilter; } + /** + * @param modulePatchExecuter module patch executer + */ + public void setModulePatchExecuter(ModulePatchExecuterImpl modulePatchExecuter) + { + this.modulePatchExecuter = modulePatchExecuter; + } + + /** + * Init method + */ + @Override + public void init() + { + super.init(); + modulePatchExecuter.getDependsOn().add(this); + } + /** * @see org.alfresco.repo.module.AbstractModuleComponent#executeInternal() */ diff --git a/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/patch/NotificationTemplatePatch.java b/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/patch/v20/NotificationTemplatePatch.java similarity index 93% rename from rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/patch/NotificationTemplatePatch.java rename to rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/patch/v20/NotificationTemplatePatch.java index 82ee7714c0..74a09160a2 100644 --- a/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/patch/NotificationTemplatePatch.java +++ b/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/patch/v20/NotificationTemplatePatch.java @@ -1,5 +1,5 @@ /* - * Copyright (C) 2005-2011 Alfresco Software Limited. + * Copyright (C) 2005-2014 Alfresco Software Limited. * * This file is part of Alfresco * @@ -16,7 +16,7 @@ * You should have received a copy of the GNU Lesser General Public License * along with Alfresco. If not, see . */ -package org.alfresco.module.org_alfresco_module_rm.patch; +package org.alfresco.module.org_alfresco_module_rm.patch.v20; import java.io.InputStream; import java.io.Serializable; @@ -25,6 +25,7 @@ import java.util.Map; import org.alfresco.model.ContentModel; import org.alfresco.module.org_alfresco_module_rm.notification.RecordsManagementNotificationHelper; +import org.alfresco.module.org_alfresco_module_rm.patch.compatibility.ModulePatchComponent; import org.alfresco.repo.version.VersionModel; import org.alfresco.service.cmr.audit.AuditService; import org.alfresco.service.cmr.repository.ContentService; @@ -39,8 +40,12 @@ import org.alfresco.service.namespace.QName; import org.springframework.beans.factory.BeanNameAware; /** + * Notification template patch implementation + * * @author Roy Wetherall + * @since 2.0 */ +@SuppressWarnings("deprecation") public class NotificationTemplatePatch extends ModulePatchComponent implements BeanNameAware { diff --git a/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/patch/RMv2FilePlanNodeRefPatch.java b/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/patch/v20/RMv2FilePlanNodeRefPatch.java similarity index 94% rename from rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/patch/RMv2FilePlanNodeRefPatch.java rename to rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/patch/v20/RMv2FilePlanNodeRefPatch.java index e3d50124ac..212a2a0947 100644 --- a/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/patch/RMv2FilePlanNodeRefPatch.java +++ b/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/patch/v20/RMv2FilePlanNodeRefPatch.java @@ -16,7 +16,7 @@ * You should have received a copy of the GNU Lesser General Public License * along with Alfresco. If not, see . */ -package org.alfresco.module.org_alfresco_module_rm.patch; +package org.alfresco.module.org_alfresco_module_rm.patch.v20; import java.io.Serializable; import java.util.List; @@ -26,6 +26,7 @@ import org.alfresco.module.org_alfresco_module_rm.dod5015.DOD5015Model; import org.alfresco.module.org_alfresco_module_rm.fileplan.FilePlanComponentKind; import org.alfresco.module.org_alfresco_module_rm.fileplan.FilePlanService; import org.alfresco.module.org_alfresco_module_rm.model.RecordsManagementModel; +import org.alfresco.module.org_alfresco_module_rm.patch.compatibility.ModulePatchComponent; import org.alfresco.module.org_alfresco_module_rm.role.FilePlanRoleService; import org.alfresco.module.org_alfresco_module_rm.role.Role; import org.alfresco.repo.domain.node.NodeDAO; @@ -43,7 +44,9 @@ import org.springframework.beans.factory.BeanNameAware; * RM v2.0 File Plan Node Ref Patch * * @author Roy Wetherall + * @since 2.0 */ +@SuppressWarnings("deprecation") public class RMv2FilePlanNodeRefPatch extends ModulePatchComponent implements BeanNameAware, RecordsManagementModel, DOD5015Model { diff --git a/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/patch/RMv2ModelPatch.java b/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/patch/v20/RMv2ModelPatch.java similarity index 93% rename from rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/patch/RMv2ModelPatch.java rename to rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/patch/v20/RMv2ModelPatch.java index f142d9b972..65f22ed719 100644 --- a/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/patch/RMv2ModelPatch.java +++ b/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/patch/v20/RMv2ModelPatch.java @@ -16,12 +16,13 @@ * You should have received a copy of the GNU Lesser General Public License * along with Alfresco. If not, see . */ -package org.alfresco.module.org_alfresco_module_rm.patch; +package org.alfresco.module.org_alfresco_module_rm.patch.v20; import java.util.List; import org.alfresco.module.org_alfresco_module_rm.dod5015.DOD5015Model; import org.alfresco.module.org_alfresco_module_rm.model.RecordsManagementModel; +import org.alfresco.module.org_alfresco_module_rm.patch.compatibility.ModulePatchComponent; import org.alfresco.repo.domain.node.NodeDAO; import org.alfresco.repo.domain.patch.PatchDAO; import org.alfresco.repo.domain.qname.QNameDAO; @@ -33,9 +34,10 @@ import org.springframework.beans.factory.BeanNameAware; /** * RM v2.0 Model Updates Patch * - * * @author Roy Wetherall + * @since 2.0 */ +@SuppressWarnings("deprecation") public class RMv2ModelPatch extends ModulePatchComponent implements BeanNameAware, RecordsManagementModel, DOD5015Model { diff --git a/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/patch/RMv2SavedSearchPatch.java b/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/patch/v20/RMv2SavedSearchPatch.java similarity index 92% rename from rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/patch/RMv2SavedSearchPatch.java rename to rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/patch/v20/RMv2SavedSearchPatch.java index 1d6cb69455..e97256f02a 100644 --- a/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/patch/RMv2SavedSearchPatch.java +++ b/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/patch/v20/RMv2SavedSearchPatch.java @@ -16,13 +16,14 @@ * You should have received a copy of the GNU Lesser General Public License * along with Alfresco. If not, see . */ -package org.alfresco.module.org_alfresco_module_rm.patch; +package org.alfresco.module.org_alfresco_module_rm.patch.v20; import java.util.List; import org.alfresco.model.ContentModel; import org.alfresco.module.org_alfresco_module_rm.dod5015.DOD5015Model; import org.alfresco.module.org_alfresco_module_rm.model.RecordsManagementModel; +import org.alfresco.module.org_alfresco_module_rm.patch.compatibility.ModulePatchComponent; import org.alfresco.module.org_alfresco_module_rm.search.RecordsManagementSearchService; import org.alfresco.module.org_alfresco_module_rm.search.SavedSearchDetails; import org.alfresco.service.cmr.repository.ContentService; @@ -34,9 +35,10 @@ import org.springframework.beans.factory.BeanNameAware; /** * RM v2.0 Saved Search Patch * - * * @author Roy Wetherall + * @since 2.0 */ +@SuppressWarnings("deprecation") public class RMv2SavedSearchPatch extends ModulePatchComponent implements BeanNameAware, RecordsManagementModel, DOD5015Model { diff --git a/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/patch/NotificationTemplatePatch_v21.java b/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/patch/v21/NotificationTemplatePatch_v21.java similarity index 94% rename from rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/patch/NotificationTemplatePatch_v21.java rename to rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/patch/v21/NotificationTemplatePatch_v21.java index d646df8a52..2bd10940a3 100644 --- a/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/patch/NotificationTemplatePatch_v21.java +++ b/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/patch/v21/NotificationTemplatePatch_v21.java @@ -16,7 +16,7 @@ * You should have received a copy of the GNU Lesser General Public License * along with Alfresco. If not, see . */ -package org.alfresco.module.org_alfresco_module_rm.patch; +package org.alfresco.module.org_alfresco_module_rm.patch.v21; import java.io.InputStream; import java.io.Serializable; @@ -40,7 +40,7 @@ import org.alfresco.service.namespace.QName; * @author Tuna Aksoy * @since 2.1 */ -public class NotificationTemplatePatch_v21 extends ModulePatchComponent +public class NotificationTemplatePatch_v21 extends RMv21PatchComponent { /** Email template path */ private static final String PATH_REJECTED = "alfresco/module/org_alfresco_module_rm/bootstrap/content/record-rejected-email.ftl"; diff --git a/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/patch/RMv21BehaviorScriptsPatch.java b/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/patch/v21/RMv21BehaviorScriptsPatch.java similarity index 93% rename from rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/patch/RMv21BehaviorScriptsPatch.java rename to rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/patch/v21/RMv21BehaviorScriptsPatch.java index 77990a6850..ccc17d1444 100644 --- a/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/patch/RMv21BehaviorScriptsPatch.java +++ b/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/patch/v21/RMv21BehaviorScriptsPatch.java @@ -16,7 +16,7 @@ * You should have received a copy of the GNU Lesser General Public License * along with Alfresco. If not, see . */ -package org.alfresco.module.org_alfresco_module_rm.patch; +package org.alfresco.module.org_alfresco_module_rm.patch.v21; import java.io.Serializable; import java.util.HashMap; @@ -44,7 +44,8 @@ import org.springframework.beans.factory.BeanNameAware; * @author Craig Tan * @since 2.1 */ -public class RMv21BehaviorScriptsPatch extends ModulePatchComponent implements BeanNameAware +@SuppressWarnings("deprecation") +public class RMv21BehaviorScriptsPatch extends RMv21PatchComponent implements BeanNameAware { /** rm config folder root lookup */ protected static final NodeRef RM_CONFIG = new NodeRef(StoreRef.STORE_REF_WORKSPACE_SPACESSTORE, "rm_config_folder"); @@ -81,7 +82,7 @@ public class RMv21BehaviorScriptsPatch extends ModulePatchComponent implements B } /** - * @see org.alfresco.module.org_alfresco_module_rm.patch.ModulePatchComponent#executePatch() + * @see org.alfresco.module.org_alfresco_module_rm.patch.compatibility.ModulePatchComponent#executePatch() */ @Override protected void executePatch() throws Throwable diff --git a/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/patch/RMv21CapabilityPatch.java b/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/patch/v21/RMv21CapabilityPatch.java similarity index 53% rename from rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/patch/RMv21CapabilityPatch.java rename to rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/patch/v21/RMv21CapabilityPatch.java index 94d01534cf..159b2712aa 100644 --- a/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/patch/RMv21CapabilityPatch.java +++ b/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/patch/v21/RMv21CapabilityPatch.java @@ -16,11 +16,16 @@ * You should have received a copy of the GNU Lesser General Public License * along with Alfresco. If not, see . */ -package org.alfresco.module.org_alfresco_module_rm.patch; +package org.alfresco.module.org_alfresco_module_rm.patch.v21; import java.util.Set; +import org.alfresco.error.AlfrescoRuntimeException; +import org.alfresco.module.org_alfresco_module_rm.capability.Capability; +import org.alfresco.module.org_alfresco_module_rm.capability.CapabilityService; +import org.alfresco.module.org_alfresco_module_rm.fileplan.FilePlanService; import org.alfresco.module.org_alfresco_module_rm.role.FilePlanRoleService; +import org.alfresco.module.org_alfresco_module_rm.role.Role; import org.alfresco.service.cmr.repository.NodeRef; /** @@ -29,8 +34,91 @@ import org.alfresco.service.cmr.repository.NodeRef; * @author Roy Wetherall * @since 2.1 */ -public class RMv21CapabilityPatch extends BaseRMCapabilityPatch +@SuppressWarnings("deprecation") +public class RMv21CapabilityPatch extends RMv21PatchComponent { + /** File plan service */ + private FilePlanService filePlanService; + + /** File plan role service */ + private FilePlanRoleService filePlanRoleService; + + /** Capability service */ + private CapabilityService capabilityService; + + /** + * @param filePlanRoleService file plan role service + */ + public void setFilePlanRoleService(FilePlanRoleService filePlanRoleService) + { + this.filePlanRoleService = filePlanRoleService; + } + + /** + * @param capabilityService capability service + */ + public void setCapabilityService(CapabilityService capabilityService) + { + this.capabilityService = capabilityService; + } + + /** + * @param filePlanService file plan service + */ + public void setFilePlanService(FilePlanService filePlanService) + { + this.filePlanService = filePlanService; + } + + /** + * Helper method to get the file plans + * + * @return Set of file plan node references + */ + protected Set getFilePlans() + { + return filePlanService.getFilePlans(); + } + + /** + * Adds a new capability to the specified roles. + * + * @param filePlan file plan + * @param capabilityName capability name + * @param roles roles + */ + protected void addCapability(NodeRef filePlan, String capabilityName, String ... roles) + { + Capability capability = capabilityService.getCapability(capabilityName); + if (capability == null) + { + throw new AlfrescoRuntimeException("Unable to bootstrap RMv21 capabilities, because capability " + capabilityName + " does not exist."); + } + + for (String roleName : roles) + { + Role role = filePlanRoleService.getRole(filePlan, roleName); + + if (role != null) + { + // get the roles current capabilities + Set capabilities = role.getCapabilities(); + + // only update if the capability is missing + if (capabilities.contains(capability) == false) + { + if (logger.isDebugEnabled() == true) + { + logger.debug(" ... adding capability " + capabilityName + " to role " + role.getName()); + } + + capabilities.add(capability); + filePlanRoleService.updateRole(filePlan, role.getName(), role.getDisplayLabel(), capabilities); + } + } + } + } + /** * @see org.alfresco.repo.module.AbstractModuleComponent#executeInternal() */ diff --git a/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/patch/RMv21InPlacePatch.java b/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/patch/v21/RMv21InPlacePatch.java similarity index 95% rename from rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/patch/RMv21InPlacePatch.java rename to rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/patch/v21/RMv21InPlacePatch.java index 83d3e842c6..7a4ef261c5 100644 --- a/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/patch/RMv21InPlacePatch.java +++ b/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/patch/v21/RMv21InPlacePatch.java @@ -16,7 +16,7 @@ * You should have received a copy of the GNU Lesser General Public License * along with Alfresco. If not, see . */ -package org.alfresco.module.org_alfresco_module_rm.patch; +package org.alfresco.module.org_alfresco_module_rm.patch.v21; import java.util.HashSet; import java.util.List; @@ -47,7 +47,8 @@ import org.springframework.beans.factory.BeanNameAware; * @author Roy Wetherall * @since 2.1 */ -public class RMv21InPlacePatch extends ModulePatchComponent +@SuppressWarnings("deprecation") +public class RMv21InPlacePatch extends RMv21PatchComponent implements BeanNameAware, RecordsManagementModel, DOD5015Model { /** Extended reader and writer role details */ @@ -202,7 +203,6 @@ public class RMv21InPlacePatch extends ModulePatchComponent NodeRef container = filePlanService.getHoldContainer(filePlan); - @SuppressWarnings("deprecation") List assocs = nodeService.getChildAssocs(filePlan, ASSOC_HOLDS, RegexQNamePattern.MATCH_ALL); for (ChildAssociationRef assoc : assocs) { @@ -221,7 +221,6 @@ public class RMv21InPlacePatch extends ModulePatchComponent NodeRef container = filePlanService.getTransferContainer(filePlan); - @SuppressWarnings("deprecation") List assocs = nodeService.getChildAssocs(filePlan, ASSOC_TRANSFERS, RegexQNamePattern.MATCH_ALL); for (ChildAssociationRef assoc : assocs) { diff --git a/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/patch/v21/RMv21PatchComponent.java b/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/patch/v21/RMv21PatchComponent.java new file mode 100644 index 0000000000..a447417f66 --- /dev/null +++ b/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/patch/v21/RMv21PatchComponent.java @@ -0,0 +1,76 @@ +/* + * Copyright (C) 2005-2011 Alfresco Software Limited. + * + * This file is part of Alfresco + * + * Alfresco is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * Alfresco is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with Alfresco. If not, see . + */ +package org.alfresco.module.org_alfresco_module_rm.patch.v21; + +import java.util.List; + +import org.alfresco.module.org_alfresco_module_rm.patch.compatibility.ModulePatchComponent; +import org.alfresco.repo.module.ModuleComponent; +import org.springframework.beans.BeansException; +import org.springframework.context.ApplicationContext; +import org.springframework.context.ApplicationContextAware; + +/** + * Convenience class to ensure all V2.0 patches are executed before v2.1 + * + * @author Roy Wetherall + * @since 2.2 + */ +@SuppressWarnings("deprecation") +public abstract class RMv21PatchComponent extends ModulePatchComponent + implements ApplicationContextAware +{ + /** application context */ + private ApplicationContext applicationContext; + + /** + * @see org.springframework.context.ApplicationContextAware#setApplicationContext(org.springframework.context.ApplicationContext) + */ + @Override + public void setApplicationContext(ApplicationContext applicationContext) throws BeansException + { + this.applicationContext = applicationContext; + } + + /** + * init method + */ + @Override + public void init() + { + super.init(); + + // manual addition of V20 patch dependencies + List depends = getDependsOn(); + addDependency(depends, "org_alfresco_module_rm_notificationTemplatePatch"); + addDependency(depends, "org_alfresco_module_rm_RMv2ModelPatch"); + addDependency(depends, "org_alfresco_module_rm_RMv2FilePlanNodeRefPatch"); + addDependency(depends, "org_alfresco_module_rm_RMv2SavedSearchPatch"); + } + + /** + * @param depends list of module dependencies + * @param beanName bean name + */ + private void addDependency(List depends, String beanName) + { + ModuleComponent moduleComponent = (ModuleComponent)applicationContext.getBean(beanName); + depends.add(moduleComponent); + } +} diff --git a/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/patch/RMv2RMAdminUserPatch.java b/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/patch/v21/RMv21RMAdminUserPatch.java similarity index 94% rename from rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/patch/RMv2RMAdminUserPatch.java rename to rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/patch/v21/RMv21RMAdminUserPatch.java index b39867284c..5b4b42e391 100644 --- a/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/patch/RMv2RMAdminUserPatch.java +++ b/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/patch/v21/RMv21RMAdminUserPatch.java @@ -16,7 +16,7 @@ * You should have received a copy of the GNU Lesser General Public License * along with Alfresco. If not, see . */ -package org.alfresco.module.org_alfresco_module_rm.patch; +package org.alfresco.module.org_alfresco_module_rm.patch.v21; import java.io.Serializable; import java.util.HashMap; @@ -40,7 +40,8 @@ import org.springframework.extensions.surf.util.I18NUtil; * * @author Roy Wetherall */ -public class RMv2RMAdminUserPatch extends ModulePatchComponent implements BeanNameAware +@SuppressWarnings("deprecation") +public class RMv21RMAdminUserPatch extends RMv21PatchComponent implements BeanNameAware { /** I18N */ private static final String MSG_FIRST_NAME = "bootstrap.rmadmin.firstName"; diff --git a/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/patch/RMv21RecordInheritancePatch.java b/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/patch/v21/RMv21RecordInheritancePatch.java similarity index 93% rename from rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/patch/RMv21RecordInheritancePatch.java rename to rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/patch/v21/RMv21RecordInheritancePatch.java index 362780261b..86bf79d8a1 100644 --- a/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/patch/RMv21RecordInheritancePatch.java +++ b/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/patch/v21/RMv21RecordInheritancePatch.java @@ -16,7 +16,7 @@ * You should have received a copy of the GNU Lesser General Public License * along with Alfresco. If not, see . */ -package org.alfresco.module.org_alfresco_module_rm.patch; +package org.alfresco.module.org_alfresco_module_rm.patch.v21; import java.util.List; @@ -39,7 +39,8 @@ import org.springframework.beans.factory.BeanNameAware; * @author Roy Wetherall * @since 2.1 */ -public class RMv21RecordInheritancePatch extends ModulePatchComponent +@SuppressWarnings("deprecation") +public class RMv21RecordInheritancePatch extends RMv21PatchComponent implements BeanNameAware, RecordsManagementModel, DOD5015Model { /** file plan permission service */ diff --git a/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/patch/RMv21ReportServicePatch.java b/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/patch/v21/RMv21ReportServicePatch.java similarity index 94% rename from rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/patch/RMv21ReportServicePatch.java rename to rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/patch/v21/RMv21ReportServicePatch.java index 6c05d61354..f32688a230 100644 --- a/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/patch/RMv21ReportServicePatch.java +++ b/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/patch/v21/RMv21ReportServicePatch.java @@ -16,7 +16,7 @@ * You should have received a copy of the GNU Lesser General Public License * along with Alfresco. If not, see . */ -package org.alfresco.module.org_alfresco_module_rm.patch; +package org.alfresco.module.org_alfresco_module_rm.patch.v21; import java.io.InputStream; import java.io.Serializable; @@ -40,7 +40,8 @@ import org.springframework.beans.factory.BeanNameAware; * @author Roy Wetherall * @since 2.1 */ -public class RMv21ReportServicePatch extends ModulePatchComponent +@SuppressWarnings("deprecation") +public class RMv21ReportServicePatch extends RMv21PatchComponent implements BeanNameAware { private static final NodeRef TEMPLATE_ROOT = new NodeRef(StoreRef.STORE_REF_WORKSPACE_SPACESSTORE, "rm_report_templates"); diff --git a/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/patch/RMv21RolesPatch.java b/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/patch/v21/RMv21RolesPatch.java similarity index 90% rename from rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/patch/RMv21RolesPatch.java rename to rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/patch/v21/RMv21RolesPatch.java index aa45d143c2..8215e7f297 100644 --- a/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/patch/RMv21RolesPatch.java +++ b/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/patch/v21/RMv21RolesPatch.java @@ -16,7 +16,7 @@ * You should have received a copy of the GNU Lesser General Public License * along with Alfresco. If not, see . */ -package org.alfresco.module.org_alfresco_module_rm.patch; +package org.alfresco.module.org_alfresco_module_rm.patch.v21; import java.util.Arrays; import java.util.HashSet; @@ -36,7 +36,8 @@ import org.springframework.beans.factory.BeanNameAware; * @author Tuna Aksoy * @since 2.1 */ -public class RMv21RolesPatch extends ModulePatchComponent implements BeanNameAware +@SuppressWarnings("deprecation") +public class RMv21RolesPatch extends RMv21PatchComponent implements BeanNameAware { /** file plan service */ private FilePlanService filePlanService; @@ -63,7 +64,7 @@ public class RMv21RolesPatch extends ModulePatchComponent implements BeanNameAwa } /** - * @see org.alfresco.module.org_alfresco_module_rm.patch.ModulePatchComponent#executePatch() + * @see org.alfresco.module.org_alfresco_module_rm.patch.compatibility.ModulePatchComponent#executePatch() */ @Override protected void executePatch() throws Throwable diff --git a/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/patch/BaseRMCapabilityPatch.java b/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/patch/v22/RMv22CapabilityPatch.java similarity index 75% rename from rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/patch/BaseRMCapabilityPatch.java rename to rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/patch/v22/RMv22CapabilityPatch.java index 2f2263b7af..73199bcb9d 100644 --- a/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/patch/BaseRMCapabilityPatch.java +++ b/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/patch/v22/RMv22CapabilityPatch.java @@ -16,7 +16,7 @@ * You should have received a copy of the GNU Lesser General Public License * along with Alfresco. If not, see . */ -package org.alfresco.module.org_alfresco_module_rm.patch; +package org.alfresco.module.org_alfresco_module_rm.patch.v22; import java.util.Set; @@ -24,18 +24,20 @@ import org.alfresco.error.AlfrescoRuntimeException; import org.alfresco.module.org_alfresco_module_rm.capability.Capability; import org.alfresco.module.org_alfresco_module_rm.capability.CapabilityService; import org.alfresco.module.org_alfresco_module_rm.fileplan.FilePlanService; +import org.alfresco.module.org_alfresco_module_rm.patch.AbstractModulePatch; import org.alfresco.module.org_alfresco_module_rm.role.FilePlanRoleService; import org.alfresco.module.org_alfresco_module_rm.role.Role; import org.alfresco.service.cmr.repository.NodeRef; /** - * Base class for the capability patch classes + * RM v2.2 patch to updated modified capabilities. * * @author Tuna Aksoy * @since 2.2 */ -public abstract class BaseRMCapabilityPatch extends ModulePatchComponent +public class RMv22CapabilityPatch extends AbstractModulePatch { + /** File plan service */ private FilePlanService filePlanService; @@ -117,4 +119,32 @@ public abstract class BaseRMCapabilityPatch extends ModulePatchComponent } } } + + /** + * @see org.alfresco.module.org_alfresco_module_rm.patch.AbstractModulePatch#applyInternal() + */ + @Override + public void applyInternal() + { + Set filePlans = getFilePlans(); + + if (logger.isDebugEnabled() == true) + { + logger.debug(" ... updating " + filePlans.size() + " file plans"); + } + + for (NodeRef filePlan : filePlans) + { + if (logger.isDebugEnabled() == true) + { + logger.debug(" ... updating file plan " + filePlan.toString()); + } + + // add new capability + addCapability(filePlan, + "FileDestructionReport", + FilePlanRoleService.ROLE_ADMIN, + FilePlanRoleService.ROLE_RECORDS_MANAGER); + } + } } diff --git a/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/patch/v22/RMv22DODModelSeparationModulePatch.java b/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/patch/v22/RMv22DODModelSeparationModulePatch.java new file mode 100644 index 0000000000..f5794a8bca --- /dev/null +++ b/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/patch/v22/RMv22DODModelSeparationModulePatch.java @@ -0,0 +1,134 @@ +/* + * Copyright (C) 2005-2014 Alfresco Software Limited. + * + * This file is part of Alfresco + * + * Alfresco is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * Alfresco is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with Alfresco. If not, see . + */ +package org.alfresco.module.org_alfresco_module_rm.patch.v22; + +import java.util.Collections; +import java.util.List; + +import org.alfresco.module.org_alfresco_module_rm.dod5015.DOD5015Model; +import org.alfresco.module.org_alfresco_module_rm.model.RecordsManagementModel; +import org.alfresco.module.org_alfresco_module_rm.patch.AbstractModulePatch; +import org.alfresco.repo.domain.node.NodeDAO; +import org.alfresco.repo.domain.patch.PatchDAO; +import org.alfresco.repo.domain.qname.QNameDAO; +import org.alfresco.service.namespace.QName; +import org.alfresco.util.Pair; + +/** + * DOD model separation module patch implementation + * + * @author Roy Wetherall + * @since 2.2 + */ +public class RMv22DODModelSeparationModulePatch extends AbstractModulePatch + implements RecordsManagementModel +{ + /** query batch size */ + private static long BATCH_SIZE = 100000L; + + /** QName DAO */ + private QNameDAO qnameDAO; + + /** Patch DAO */ + private PatchDAO patchDAO; + + /** Node DAO */ + private NodeDAO nodeDAO; + + /** qnames to update (switch to dod namespace) */ + private QName[] qnames = + { + DOD5015Model.PROP_ORIGINATOR, + DOD5015Model.PROP_ORIGINATING_ORGANIZATION, + DOD5015Model.PROP_PUBLICATION_DATE, + DOD5015Model.PROP_MEDIA_TYPE, + DOD5015Model.PROP_FORMAT, + DOD5015Model.PROP_DATE_RECEIVED + }; + + /** + * @param qnameDAO QName DAO + */ + public void setQnameDAO(QNameDAO qnameDAO) + { + this.qnameDAO = qnameDAO; + } + + /** + * @param patchDAO patch DAO + */ + public void setPatchDAO(PatchDAO patchDAO) + { + this.patchDAO = patchDAO; + } + + /** + * @param nodeDAO node DAO + */ + public void setNodeDAO(NodeDAO nodeDAO) + { + this.nodeDAO = nodeDAO; + } + + /** + * @see org.alfresco.module.org_alfresco_module_rm.patch.AbstractModulePatch#applyInternal() + */ + @Override + public void applyInternal() + { + Long maxNodeId = patchDAO.getMaxAdmNodeID(); + + // switch each qname from the rma namespace to the dod namespace + for (QName qname : qnames) + { + QName origional = QName.createQName(RecordsManagementModel.RM_URI, qname.getLocalName()); + if (qnameDAO.getQName(origional) != null) + { + qnameDAO.updateQName(origional, qname); + } + } + + long recordCount = patchDAO.getCountNodesWithAspects(Collections.singleton(ASPECT_RECORD)); + if (logger.isDebugEnabled() == true) + { + logger.debug(" ... updating " + recordCount + " records"); + } + + // apply the DOD record aspect to all exiting records + int completed = 0; + Pair recordAspect = qnameDAO.getQName(ASPECT_RECORD); + if (recordAspect != null) + { + for (Long i = 0L; i < maxNodeId; i+=BATCH_SIZE) + { + List nodeIds = patchDAO.getNodesByAspectQNameId(recordAspect.getFirst(), i, i + BATCH_SIZE); + for (Long nodeId : nodeIds) + { + nodeDAO.addNodeAspects(nodeId, Collections.singleton(DOD5015Model.ASPECT_DOD_5015_RECORD)); + } + + completed += completed + nodeIds.size(); + if (logger.isDebugEnabled() == true) + { + logger.debug(" ... completed " + completed + " of " + recordCount); + } + } + } + } +} diff --git a/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/patch/RMv22ReportTemplatePatch.java b/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/patch/v22/RMv22ReportTemplatePatch.java similarity index 89% rename from rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/patch/RMv22ReportTemplatePatch.java rename to rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/patch/v22/RMv22ReportTemplatePatch.java index 0832522c96..2fa4a4eb54 100644 --- a/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/patch/RMv22ReportTemplatePatch.java +++ b/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/patch/v22/RMv22ReportTemplatePatch.java @@ -16,7 +16,7 @@ * You should have received a copy of the GNU Lesser General Public License * along with Alfresco. If not, see . */ -package org.alfresco.module.org_alfresco_module_rm.patch; +package org.alfresco.module.org_alfresco_module_rm.patch.v22; import java.io.InputStream; import java.io.Serializable; @@ -24,6 +24,7 @@ import java.util.HashMap; import java.util.Map; import org.alfresco.model.ContentModel; +import org.alfresco.module.org_alfresco_module_rm.patch.AbstractModulePatch; import org.alfresco.service.cmr.repository.ChildAssociationRef; import org.alfresco.service.cmr.repository.ContentService; import org.alfresco.service.cmr.repository.ContentWriter; @@ -39,7 +40,7 @@ import org.alfresco.service.namespace.QName; * @author Tuna Aksoy * @since 2.2 */ -public class RMv22ReportTemplatePatch extends ModulePatchComponent +public class RMv22ReportTemplatePatch extends AbstractModulePatch { /** Report template path */ private static final String REPORT_TEMPLATE_PATH = "alfresco/module/org_alfresco_module_rm/bootstrap/report/report_rmr_transferReport.html.ftl"; @@ -70,8 +71,11 @@ public class RMv22ReportTemplatePatch extends ModulePatchComponent this.contentService = contentService; } + /** + * @see org.alfresco.module.org_alfresco_module_rm.patch.AbstractModulePatch#applyInternal() + */ @Override - protected void executePatch() throws Throwable + public void applyInternal() { NodeRef transferReport = new NodeRef(StoreRef.STORE_REF_WORKSPACE_SPACESSTORE, TRANSFER_REPORT); NodeRef destructionReport = new NodeRef(StoreRef.STORE_REF_WORKSPACE_SPACESSTORE, DESTRUCTION_REPORT);