From 571f4b121d2f1fa9b598a3027a35518be4cb4a11 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?V=C3=ADtor=20Moreira?= Date: Thu, 27 Oct 2022 14:22:36 +0100 Subject: [PATCH] =?UTF-8?q?MNT-22790:=20exclude=20rules=20to=20be=20includ?= =?UTF-8?q?ed=20in=20ZIP=20file=20when=20downloading=20=E2=80=A6=20(#1452)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * MNT-22790: exclude rules to be included in ZIP file when downloading a folder --- .../download/CreateDownloadArchiveAction.java | 53 ++++++++++--------- .../DownloadServiceIntegrationTest.java | 47 +++++++++++++--- 2 files changed, 67 insertions(+), 33 deletions(-) diff --git a/repository/src/main/java/org/alfresco/repo/download/CreateDownloadArchiveAction.java b/repository/src/main/java/org/alfresco/repo/download/CreateDownloadArchiveAction.java index 48f88eeb7e..cbfe5bbd00 100644 --- a/repository/src/main/java/org/alfresco/repo/download/CreateDownloadArchiveAction.java +++ b/repository/src/main/java/org/alfresco/repo/download/CreateDownloadArchiveAction.java @@ -1,28 +1,28 @@ -/* - * #%L - * Alfresco Repository - * %% - * Copyright (C) 2005 - 2016 Alfresco Software Limited - * %% - * This file is part of the Alfresco software. - * If the software was purchased under a paid Alfresco license, the terms of - * the paid license agreement will prevail. Otherwise, the software is - * provided under the following open source license terms: - * - * 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 . - * #L% - */ +/* + * #%L + * Alfresco Repository + * %% + * Copyright (C) 2005 - 2016 Alfresco Software Limited + * %% + * This file is part of the Alfresco software. + * If the software was purchased under a paid Alfresco license, the terms of + * the paid license agreement will prevail. Otherwise, the software is + * provided under the following open source license terms: + * + * 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 . + * #L% + */ package org.alfresco.repo.download; import java.io.File; @@ -36,6 +36,7 @@ import org.alfresco.model.ForumModel; import org.alfresco.model.RenditionModel; import org.alfresco.repo.action.executer.ActionExecuter; import org.alfresco.repo.action.executer.ActionExecuterAbstractBase; +import org.alfresco.repo.rule.RuleModel; import org.alfresco.repo.security.authentication.AuthenticationUtil; import org.alfresco.repo.security.authentication.AuthenticationUtil.RunAsWork; import org.alfresco.repo.transaction.RetryingTransactionHelper; @@ -203,7 +204,7 @@ public class CreateDownloadArchiveAction extends ActionExecuterAbstractBase crawlerParameters.setExportFrom(exportFrom); crawlerParameters.setCrawlSelf(true); - crawlerParameters.setExcludeChildAssocs(new QName[] {RenditionModel.ASSOC_RENDITION, ForumModel.ASSOC_DISCUSSION}); + crawlerParameters.setExcludeChildAssocs(new QName[] {RenditionModel.ASSOC_RENDITION, ForumModel.ASSOC_DISCUSSION, RuleModel.ASSOC_RULE_FOLDER }); crawlerParameters.setExcludeAspects(new QName[] {ContentModel.ASPECT_WORKING_COPY}); // Get an estimate of the size for statuses diff --git a/repository/src/test/java/org/alfresco/repo/download/DownloadServiceIntegrationTest.java b/repository/src/test/java/org/alfresco/repo/download/DownloadServiceIntegrationTest.java index 3a6db742f6..ecd70f275a 100644 --- a/repository/src/test/java/org/alfresco/repo/download/DownloadServiceIntegrationTest.java +++ b/repository/src/test/java/org/alfresco/repo/download/DownloadServiceIntegrationTest.java @@ -27,6 +27,7 @@ package org.alfresco.repo.download; import net.sf.acegisecurity.Authentication; import org.alfresco.model.ContentModel; +import org.alfresco.repo.action.executer.AddFeaturesActionExecuter; import org.alfresco.repo.model.Repository; import org.alfresco.repo.node.SystemNodeUtils; import org.alfresco.repo.node.integrity.IntegrityChecker; @@ -34,6 +35,8 @@ import org.alfresco.repo.security.authentication.AuthenticationUtil; import org.alfresco.repo.security.permissions.AccessDeniedException; import org.alfresco.repo.transaction.RetryingTransactionHelper; import org.alfresco.repo.transaction.RetryingTransactionHelper.RetryingTransactionCallback; +import org.alfresco.service.cmr.action.Action; +import org.alfresco.service.cmr.action.ActionService; import org.alfresco.service.cmr.admin.RepoAdminService; import org.alfresco.service.cmr.coci.CheckOutCheckInService; import org.alfresco.service.cmr.download.DownloadService; @@ -47,6 +50,8 @@ import org.alfresco.service.cmr.repository.ContentReader; import org.alfresco.service.cmr.repository.ContentService; import org.alfresco.service.cmr.repository.NodeRef; import org.alfresco.service.cmr.repository.NodeService; +import org.alfresco.service.cmr.rule.RuleService; +import org.alfresco.service.cmr.rule.RuleType; import org.alfresco.service.cmr.security.MutableAuthenticationService; import org.alfresco.service.cmr.security.PermissionService; import org.alfresco.service.cmr.security.PersonService; @@ -75,6 +80,7 @@ import java.io.IOException; import java.io.InputStream; import java.io.Serializable; import java.io.UnsupportedEncodingException; +import java.util.Collections; import java.util.Date; import java.util.List; import java.util.Map; @@ -82,6 +88,7 @@ import java.util.Set; import java.util.TreeSet; import static org.junit.Assert.assertNotEquals; +import static org.junit.Assert.assertTrue; import static org.junit.Assert.fail; /** @@ -128,6 +135,8 @@ public class DownloadServiceIntegrationTest private static RetryingTransactionHelper TRANSACTION_HELPER; private static IntegrityChecker INTEGRITY_CHECKER; private static RepoAdminService REPO_ADMIN_SERVICE; + private static RuleService RULE_SERVICE; + private static ActionService ACTION_SERVICE; // Test Content private NodeRef rootFolder; @@ -192,6 +201,8 @@ public class DownloadServiceIntegrationTest INTEGRITY_CHECKER.setFailOnViolation(true); INTEGRITY_CHECKER.setTraceOn(true); REPO_ADMIN_SERVICE = APP_CONTEXT_INIT.getApplicationContext().getBean("RepoAdminService", RepoAdminService.class); + RULE_SERVICE = APP_CONTEXT_INIT.getApplicationContext().getBean("ruleService", RuleService.class); + ACTION_SERVICE = APP_CONTEXT_INIT.getApplicationContext().getBean("actionService", ActionService.class); } /** @@ -207,28 +218,49 @@ public class DownloadServiceIntegrationTest NodeRef COMPANY_HOME = repositoryHelper.getCompanyHome(); // Create some static test content - rootFolder = testNodes.createNode(COMPANY_HOME, "rootFolder", ContentModel.TYPE_FOLDER, AuthenticationUtil.getAdminUserName()); - allEntries.add("rootFolder/"); + rootFolder = testNodes.createNode(COMPANY_HOME, "rootFolder", ContentModel.TYPE_FOLDER, AuthenticationUtil.getAdminUserName()); + allEntries.add("rootFolder/"); + + TRANSACTION_HELPER.doInTransaction(() -> { + org.alfresco.service.cmr.rule.Rule parentRule = new org.alfresco.service.cmr.rule.Rule(); + parentRule.setRuleTypes(Collections.singletonList(RuleType.INBOUND)); + parentRule.setTitle("DownloadServiceIntegrationTest" + GUID.generate()); + parentRule.setDescription("Add Classifiable"); + Action action = ACTION_SERVICE.createAction(AddFeaturesActionExecuter.NAME); + action.setParameterValue(AddFeaturesActionExecuter.PARAM_ASPECT_NAME, ContentModel.ASPECT_CLASSIFIABLE); + parentRule.setAction(action); + parentRule.applyToChildren(true); + + RULE_SERVICE.saveRule(rootFolder, parentRule); + + return null; + }, false, true); rootFile = testNodes.createNodeWithTextContent(COMPANY_HOME, "rootFile.txt", ContentModel.TYPE_CONTENT, AuthenticationUtil.getAdminUserName(), "Root file content"); allEntries.add("rootFile.txt"); - - testNodes.createNodeWithTextContent(rootFolder, "level1File.txt", ContentModel.TYPE_CONTENT, AuthenticationUtil.getAdminUserName(), "Level 1 file content"); + + NodeRef createdNode = testNodes.createNodeWithTextContent(rootFolder, "level1File.txt", ContentModel.TYPE_CONTENT, AuthenticationUtil.getAdminUserName(), "Level 1 file content"); + assertTrue(NODE_SERVICE.hasAspect(createdNode, ContentModel.ASPECT_CLASSIFIABLE)); allEntries.add("rootFolder/level1File.txt"); level1Folder1 = testNodes.createNode(rootFolder, "level1Folder1", ContentModel.TYPE_FOLDER, AuthenticationUtil.getAdminUserName()); + assertTrue(NODE_SERVICE.hasAspect(level1Folder1, ContentModel.ASPECT_CLASSIFIABLE)); allEntries.add("rootFolder/level1Folder1/"); level1Folder2 = testNodes.createNode(rootFolder, "level1Folder2", ContentModel.TYPE_FOLDER, AuthenticationUtil.getAdminUserName()); + assertTrue(NODE_SERVICE.hasAspect(level1Folder2, ContentModel.ASPECT_CLASSIFIABLE)); allEntries.add("rootFolder/level1Folder2/"); - testNodes.createNode(rootFolder, "level1EmptyFolder", ContentModel.TYPE_FOLDER, AuthenticationUtil.getAdminUserName()); + createdNode = testNodes.createNode(rootFolder, "level1EmptyFolder", ContentModel.TYPE_FOLDER, AuthenticationUtil.getAdminUserName()); + assertTrue(NODE_SERVICE.hasAspect(createdNode, ContentModel.ASPECT_CLASSIFIABLE)); allEntries.add("rootFolder/level1EmptyFolder/"); - testNodes.createNodeWithTextContent(level1Folder1, "level2File.txt", ContentModel.TYPE_CONTENT, AuthenticationUtil.getAdminUserName(), "Level 2 file content"); + createdNode = testNodes.createNodeWithTextContent(level1Folder1, "level2File.txt", ContentModel.TYPE_CONTENT, AuthenticationUtil.getAdminUserName(), "Level 2 file content"); + assertTrue(NODE_SERVICE.hasAspect(createdNode, ContentModel.ASPECT_CLASSIFIABLE)); allEntries.add("rootFolder/level1Folder1/level2File.txt"); - testNodes.createNodeWithTextContent(level1Folder2, "level2File.txt", ContentModel.TYPE_CONTENT, AuthenticationUtil.getAdminUserName(), "Level 2 file content"); + createdNode = testNodes.createNodeWithTextContent(level1Folder2, "level2File.txt", ContentModel.TYPE_CONTENT, AuthenticationUtil.getAdminUserName(), "Level 2 file content"); + assertTrue(NODE_SERVICE.hasAspect(createdNode, ContentModel.ASPECT_CLASSIFIABLE)); allEntries.add("rootFolder/level1Folder2/level2File.txt"); secondaryNode = testNodes.createNodeWithTextContent(COMPANY_HOME, "secondaryNodeFile.txt", ContentModel.TYPE_CONTENT, AuthenticationUtil.getAdminUserName(), "Secondary node"); @@ -240,6 +272,7 @@ public class DownloadServiceIntegrationTest // Add the lock and version aspects to the created node NODE_SERVICE.addAspect(fileToCheckout, ContentModel.ASPECT_VERSIONABLE, null); NODE_SERVICE.addAspect(fileToCheckout, ContentModel.ASPECT_LOCKABLE, null); + assertTrue(NODE_SERVICE.hasAspect(fileToCheckout, ContentModel.ASPECT_CLASSIFIABLE)); allEntries.add("rootFolder/level1Folder2/fileToCheckout.txt"); PERMISSION_SERVICE.setPermission(level1Folder2, TEST_USER.getUsername(), PermissionService.ALL_PERMISSIONS, true);