From 096b86fedc7da52b377358b83fed38d4a738fcf2 Mon Sep 17 00:00:00 2001 From: rwetherall Date: Wed, 4 Apr 2018 10:45:50 +1000 Subject: [PATCH 01/99] Role and Capability initial technical documentation. --- rm-community/documentation/README.md | 4 +- .../resource/image/CapabilitiesAndRoles.png | Bin 0 -> 27310 bytes .../extendedPermissionService.md | 0 .../security/rolesAndCapabilities.md | 41 ++++++++++++++++++ 4 files changed, 43 insertions(+), 2 deletions(-) create mode 100644 rm-community/documentation/resource/image/CapabilitiesAndRoles.png rename rm-community/documentation/{ => security}/extendedPermissionService.md (100%) create mode 100644 rm-community/documentation/security/rolesAndCapabilities.md diff --git a/rm-community/documentation/README.md b/rm-community/documentation/README.md index b4b7911330..fba3b1f15a 100644 --- a/rm-community/documentation/README.md +++ b/rm-community/documentation/README.md @@ -17,8 +17,8 @@ * Retention Schedules and Events * Transfer and Accession * Security - * [Extended permission service](extendedPermissionService.md) - * Roles, Capabilities and Permissions + * [Extended permission service](security/extendedPermissionService.md) + * [Roles and Capabilities](security/rolesAndCapabilities.md) * Discovery * Governance Search * Legal Holds diff --git a/rm-community/documentation/resource/image/CapabilitiesAndRoles.png b/rm-community/documentation/resource/image/CapabilitiesAndRoles.png new file mode 100644 index 0000000000000000000000000000000000000000..606a7d3a73284a873c18ac9a199fa168456a2bc3 GIT binary patch literal 27310 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 AH~;_u literal 0 HcmV?d00001 diff --git a/rm-community/documentation/extendedPermissionService.md b/rm-community/documentation/security/extendedPermissionService.md similarity index 100% rename from rm-community/documentation/extendedPermissionService.md rename to rm-community/documentation/security/extendedPermissionService.md diff --git a/rm-community/documentation/security/rolesAndCapabilities.md b/rm-community/documentation/security/rolesAndCapabilities.md new file mode 100644 index 0000000000..c3372d5b1c --- /dev/null +++ b/rm-community/documentation/security/rolesAndCapabilities.md @@ -0,0 +1,41 @@ +## Alfresco Governance Services' Roles and Capabilities + +![Completeness Badge](https://img.shields.io/badge/Document_Level-InProgress-yellow.svg?style=flat-square) + +![Version Badge](https://img.shields.io/badge/Version-Current-blue.svg?style=flat-square) + +### Purpose + +Roles and capabilities allow the GS system to provide a finer grain security evaluation, determining whether an authority has the capability to perform a perticular action on a node. + +### Overview + +Roles are defined as a collection of capabilities. A capability, generally, has a one to one relationship with an action within the system. + +Authorities are assigned roles. If an authority is assigned to a role then it that authority has the capabilities contained within that role, allowing them to perform the related actions. + +An authority can be assigned many roles, with the associated capabilities being additive. + +Capabilties are evaluated in addition to any ACLs attached to a node, but they are mutally exclusive. A authority may have the capability, but not the permissions on a node and vice versa. + +### Design + +Roles are implementented as groups. So for every role that is created, there is a corresponding group within the system. + +Capabilities are implemented as permissions. In order add a new capability to the system, the extended RM permission model needs to be extended. + +When a capability is added to a role, then the capability group is assigned the capability role on the root file plan node. + +In this way the permissions of the systems roles reflect their capabilities on the file plan via the capability permissions assigned. + +When an authority is assigned to a role, that authority is added as a member of the corresponding role group. In this way they inherit the capability permissions on the file plan that relate to that role group. + +If a user attempts to perform an action on a records management artifact which has a related capability. Assuming the user has permission to see the artifact in the first place, then the users capability to perform the action is evaluated. + +This is done by firstly determining whether the capability is relevant for this 'kind' of records management artifact. For example the addHold capability is not relevant for a record category. + +Then the capability permission is evaluated by traversing to the file plan node and checking whether the current user has the capabilty permission byt virtue of it's membership of the right role group. + +Finally any further conditions attached to the capability are evaluated. + +![](../resource/image/CapabilitiesAndRoles.png) \ No newline at end of file From 1ad6506d9b3d0aaf78d6373c3d2ca0e3b701c3dd Mon Sep 17 00:00:00 2001 From: Rodica Sutu Date: Mon, 14 May 2018 09:24:38 +0300 Subject: [PATCH 02/99] update some of dependencies for ACS 6.0 --- rm-community/rm-community-repo/pom.xml | 107 ++++++++++++++++++++++++- 1 file changed, 103 insertions(+), 4 deletions(-) diff --git a/rm-community/rm-community-repo/pom.xml b/rm-community/rm-community-repo/pom.xml index 0f2cb1c749..85a67eb9f1 100644 --- a/rm-community/rm-community-repo/pom.xml +++ b/rm-community/rm-community-repo/pom.xml @@ -26,6 +26,36 @@ true ${project.build.directory}/solr/home 1.4 + + + 7.2 + 8.5 + 6.48 + 6.31 + 1.0.8 + 6.0 + 1.1 + 2.3 + 7.0 + 6.0 + 1.2.8 + 5.0.4.RELEASE + 3.5.37 + + 6.0.a + 6.0.a + + 3.1.0-RC1 + + 1.2.0-RC2 + + 6.7 + ${project.version} + alfresco-community + ${alfresco.package.name}-distribution + 42.2.1 @@ -295,12 +325,81 @@ + + + org.springframework + spring-aop + ${dependency.spring.version} + + + org.springframework + spring-beans + ${dependency.spring.version} + + + org.springframework + spring-context + ${dependency.spring.version} + + + org.springframework + spring-context-support + ${dependency.spring.version} + + + org.springframework + spring-core + ${dependency.spring.version} + + + org.springframework + spring-expression + ${dependency.spring.version} + + + org.springframework + spring-jdbc + ${dependency.spring.version} + + + org.springframework + spring-jms + ${dependency.spring.version} + + + org.springframework + spring-orm + ${dependency.spring.version} + + + org.springframework + spring-tx + ${dependency.spring.version} + + + org.springframework + spring-web + ${dependency.spring.version} + + + org.springframework + spring-webmvc + ${dependency.spring.version} + ${alfresco.groupId} alfresco-remote-api - ${alfresco.version} + ${dependency.alfresco-remote-api.version} provided + javax.servlet javax.servlet-api @@ -331,20 +430,20 @@ org.springframework spring-test - 2.5 + 5.0.4.RELEASE test ${alfresco.groupId} alfresco-repository - ${alfresco.version} + ${dependency.alfresco-repository.version} tests test ${alfresco.groupId} alfresco-remote-api - ${alfresco.version} + ${dependency.alfresco-remote-api.version} tests test From fe444ad77cc2b612065b78d52663a2a0e7639ddc Mon Sep 17 00:00:00 2001 From: Rodica Sutu Date: Mon, 14 May 2018 09:27:43 +0300 Subject: [PATCH 03/99] replace spring social exception with InvalidArgumentException update the ElementInfo() according to REPO-2983 --- .../rm/rest/api/impl/FilePlanComponentsApiUtils.java | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/rm-community/rm-community-repo/source/java/org/alfresco/rm/rest/api/impl/FilePlanComponentsApiUtils.java b/rm-community/rm-community-repo/source/java/org/alfresco/rm/rest/api/impl/FilePlanComponentsApiUtils.java index f93e87ed2c..0c010b5020 100644 --- a/rm-community/rm-community-repo/source/java/org/alfresco/rm/rest/api/impl/FilePlanComponentsApiUtils.java +++ b/rm-community/rm-community-repo/source/java/org/alfresco/rm/rest/api/impl/FilePlanComponentsApiUtils.java @@ -39,12 +39,14 @@ import java.io.Serializable; import java.nio.charset.Charset; import java.util.ArrayList; import java.util.Arrays; +import java.util.Collections; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.Set; import java.util.StringTokenizer; +import net.sf.acegisecurity.vote.AccessDecisionVoter; import org.alfresco.model.ContentModel; import org.alfresco.module.org_alfresco_module_rm.capability.CapabilityService; import org.alfresco.module.org_alfresco_module_rm.fileplan.FilePlanService; @@ -108,9 +110,6 @@ import org.alfresco.util.ParameterCheck; import org.apache.commons.lang.StringUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import org.springframework.social.InternalServerErrorException; - -import net.sf.acegisecurity.vote.AccessDecisionVoter; /** * Utility class that handles common api endpoint tasks @@ -611,7 +610,7 @@ public class FilePlanComponentsApiUtils else { // Throw internal error as this method should not be called for other types - throw new InternalServerErrorException("Creating relative path of type '" + nodesType + "' not suported for this endpoint"); + throw new InvalidArgumentException("Creating relative path of type '" + nodesType + "' not suported for this endpoint"); } return lastNodeRef; @@ -968,7 +967,10 @@ public class FilePlanComponentsApiUtils if (permissionService.hasPermission(childNodeRef, PermissionService.READ) == AccessStatus.ALLOWED) { Serializable nameProp = nodeService.getProperty(childNodeRef, ContentModel.PROP_NAME); - pathElements.add(0, new ElementInfo(childNodeRef.getId(), nameProp.toString())); + String type = nodeService.getType(childNodeRef).toPrefixString(); + Set < QName > aspects = nodeService.getAspects(childNodeRef); + List < String > aspectNames = nodes.mapFromNodeAspects(aspects, Collections.emptyList(), Collections.emptyList()); + pathElements.add(0, new ElementInfo(childNodeRef.getId(), nameProp.toString(),type, aspectNames)); } else { From 5ba7d3328b92f3a84481dfdf0a219e2266e10e64 Mon Sep 17 00:00:00 2001 From: Rodica Sutu Date: Mon, 14 May 2018 09:35:42 +0300 Subject: [PATCH 04/99] Spring update - update of xsd declaration for the context files --- .../default/rm-imap-server-context.xml | 6 +- .../org_alfresco_module_rm/action-context.xml | 6 +- .../groups/rm-capability-groups-context.xml | 7 +- .../rm-capabilities-audit-context.xml | 7 +- .../rm-capabilities-condition-context.xml | 6 +- .../rm-capabilities-config-context.xml | 6 +- .../rm-capabilities-disposition-context.xml | 6 +- .../rm-capabilities-event-context.xml | 6 +- .../rm-capabilities-fileplan-context.xml | 6 +- .../rm-capabilities-freeze-context.xml | 6 +- .../rm-capabilities-group-context.xml | 6 +- .../rm-capabilities-record-context.xml | 6 +- .../rm-capabilities-recordfolder-context.xml | 6 +- .../rm-capabilities-reference-context.xml | 7 +- .../rm-capabilities-rule-context.xml | 6 +- .../rm-capabilities-security-context.xml | 6 +- .../content-context.xml | 6 +- ...15-capabilities-classification-context.xml | 6 +- .../dod5015/dod5015-context.xml | 6 +- .../extended-repository-context.xml | 7 +- .../model/rm-model-security-context.xml | 6 +- .../org_alfresco_module_rm/module-context.xml | 4 +- .../patch/rm-patch-context.xml | 6 +- .../patch/rm-patch-v20-context.xml | 6 +- .../patch/rm-patch-v21-context.xml | 6 +- .../patch/rm-patch-v22-context.xml | 6 +- .../patch/rm-patch-v23-context.xml | 9 +- .../patch/rm-patch-v24-context.xml | 6 +- .../query/rm-query-context.xml | 3 +- .../rm-action-context.xml | 6 +- .../rm-audit-context.xml | 6 +- .../rm-capabilities-context.xml | 8 +- .../rm-deprecated-context.xml | 15 ++- .../rm-disposition-properties-context.xml | 6 +- .../org_alfresco_module_rm/rm-id-context.xml | 6 +- .../rm-model-context.xml | 6 +- .../rm-public-rest-context.xml | 4 +- .../rm-public-services-security-context.xml | 10 +- .../rm-report-context.xml | 11 +- .../rm-service-context.xml | 108 +++++++++--------- .../rm-ui-evaluators-context.xml | 7 +- .../rm-version-context.xml | 13 ++- .../rm-webscript-context.xml | 7 +- .../rm-workflow-context.xml | 7 +- .../security/rm-method-security-context.xml | 7 +- .../test/resources/test-context.xml | 11 +- .../test/resources/test-job-context.xml | 7 +- .../test/resources/test-rm3314-context.xml | 8 +- 48 files changed, 252 insertions(+), 177 deletions(-) diff --git a/rm-community/rm-community-repo/config/alfresco/extension/subsystems/imap/default/default/rm-imap-server-context.xml b/rm-community/rm-community-repo/config/alfresco/extension/subsystems/imap/default/default/rm-imap-server-context.xml index 8c76027779..16728d43c7 100644 --- a/rm-community/rm-community-repo/config/alfresco/extension/subsystems/imap/default/default/rm-imap-server-context.xml +++ b/rm-community/rm-community-repo/config/alfresco/extension/subsystems/imap/default/default/rm-imap-server-context.xml @@ -1,7 +1,9 @@ - + - diff --git a/rm-community/rm-community-repo/config/alfresco/module/org_alfresco_module_rm/action-context.xml b/rm-community/rm-community-repo/config/alfresco/module/org_alfresco_module_rm/action-context.xml index d1dda0a2e9..45fa00a4f2 100644 --- a/rm-community/rm-community-repo/config/alfresco/module/org_alfresco_module_rm/action-context.xml +++ b/rm-community/rm-community-repo/config/alfresco/module/org_alfresco_module_rm/action-context.xml @@ -1,7 +1,9 @@ - + - diff --git a/rm-community/rm-community-repo/config/alfresco/module/org_alfresco_module_rm/capability/groups/rm-capability-groups-context.xml b/rm-community/rm-community-repo/config/alfresco/module/org_alfresco_module_rm/capability/groups/rm-capability-groups-context.xml index 0e940d34ef..cd2480e1f4 100644 --- a/rm-community/rm-community-repo/config/alfresco/module/org_alfresco_module_rm/capability/groups/rm-capability-groups-context.xml +++ b/rm-community/rm-community-repo/config/alfresco/module/org_alfresco_module_rm/capability/groups/rm-capability-groups-context.xml @@ -1,7 +1,8 @@ - - - + - - - + - + - diff --git a/rm-community/rm-community-repo/config/alfresco/module/org_alfresco_module_rm/capability/rm-capabilities-config-context.xml b/rm-community/rm-community-repo/config/alfresco/module/org_alfresco_module_rm/capability/rm-capabilities-config-context.xml index 5cc9dffd5b..62ab932604 100644 --- a/rm-community/rm-community-repo/config/alfresco/module/org_alfresco_module_rm/capability/rm-capabilities-config-context.xml +++ b/rm-community/rm-community-repo/config/alfresco/module/org_alfresco_module_rm/capability/rm-capabilities-config-context.xml @@ -1,7 +1,9 @@ - + - diff --git a/rm-community/rm-community-repo/config/alfresco/module/org_alfresco_module_rm/capability/rm-capabilities-disposition-context.xml b/rm-community/rm-community-repo/config/alfresco/module/org_alfresco_module_rm/capability/rm-capabilities-disposition-context.xml index 3dc524bfe4..fc8b3cd0e9 100644 --- a/rm-community/rm-community-repo/config/alfresco/module/org_alfresco_module_rm/capability/rm-capabilities-disposition-context.xml +++ b/rm-community/rm-community-repo/config/alfresco/module/org_alfresco_module_rm/capability/rm-capabilities-disposition-context.xml @@ -1,7 +1,9 @@ - + - diff --git a/rm-community/rm-community-repo/config/alfresco/module/org_alfresco_module_rm/capability/rm-capabilities-event-context.xml b/rm-community/rm-community-repo/config/alfresco/module/org_alfresco_module_rm/capability/rm-capabilities-event-context.xml index c9362ed9d6..4059dbb88a 100644 --- a/rm-community/rm-community-repo/config/alfresco/module/org_alfresco_module_rm/capability/rm-capabilities-event-context.xml +++ b/rm-community/rm-community-repo/config/alfresco/module/org_alfresco_module_rm/capability/rm-capabilities-event-context.xml @@ -1,7 +1,9 @@ - + - diff --git a/rm-community/rm-community-repo/config/alfresco/module/org_alfresco_module_rm/capability/rm-capabilities-fileplan-context.xml b/rm-community/rm-community-repo/config/alfresco/module/org_alfresco_module_rm/capability/rm-capabilities-fileplan-context.xml index c285a9fb16..a5dfa0f8fc 100644 --- a/rm-community/rm-community-repo/config/alfresco/module/org_alfresco_module_rm/capability/rm-capabilities-fileplan-context.xml +++ b/rm-community/rm-community-repo/config/alfresco/module/org_alfresco_module_rm/capability/rm-capabilities-fileplan-context.xml @@ -1,7 +1,9 @@ - + - diff --git a/rm-community/rm-community-repo/config/alfresco/module/org_alfresco_module_rm/capability/rm-capabilities-freeze-context.xml b/rm-community/rm-community-repo/config/alfresco/module/org_alfresco_module_rm/capability/rm-capabilities-freeze-context.xml index 3de1c78472..c07f8bf69f 100644 --- a/rm-community/rm-community-repo/config/alfresco/module/org_alfresco_module_rm/capability/rm-capabilities-freeze-context.xml +++ b/rm-community/rm-community-repo/config/alfresco/module/org_alfresco_module_rm/capability/rm-capabilities-freeze-context.xml @@ -1,7 +1,9 @@ - + - diff --git a/rm-community/rm-community-repo/config/alfresco/module/org_alfresco_module_rm/capability/rm-capabilities-group-context.xml b/rm-community/rm-community-repo/config/alfresco/module/org_alfresco_module_rm/capability/rm-capabilities-group-context.xml index 7560098bbc..955c4f6548 100644 --- a/rm-community/rm-community-repo/config/alfresco/module/org_alfresco_module_rm/capability/rm-capabilities-group-context.xml +++ b/rm-community/rm-community-repo/config/alfresco/module/org_alfresco_module_rm/capability/rm-capabilities-group-context.xml @@ -1,7 +1,9 @@ - + - - + - - + - diff --git a/rm-community/rm-community-repo/config/alfresco/module/org_alfresco_module_rm/capability/rm-capabilities-reference-context.xml b/rm-community/rm-community-repo/config/alfresco/module/org_alfresco_module_rm/capability/rm-capabilities-reference-context.xml index 2ddba0e1ea..3f2e5174c4 100644 --- a/rm-community/rm-community-repo/config/alfresco/module/org_alfresco_module_rm/capability/rm-capabilities-reference-context.xml +++ b/rm-community/rm-community-repo/config/alfresco/module/org_alfresco_module_rm/capability/rm-capabilities-reference-context.xml @@ -1,7 +1,8 @@ - - - + diff --git a/rm-community/rm-community-repo/config/alfresco/module/org_alfresco_module_rm/capability/rm-capabilities-rule-context.xml b/rm-community/rm-community-repo/config/alfresco/module/org_alfresco_module_rm/capability/rm-capabilities-rule-context.xml index 1ad04ef1d7..2a6e997bcf 100644 --- a/rm-community/rm-community-repo/config/alfresco/module/org_alfresco_module_rm/capability/rm-capabilities-rule-context.xml +++ b/rm-community/rm-community-repo/config/alfresco/module/org_alfresco_module_rm/capability/rm-capabilities-rule-context.xml @@ -1,7 +1,9 @@ - + - diff --git a/rm-community/rm-community-repo/config/alfresco/module/org_alfresco_module_rm/capability/rm-capabilities-security-context.xml b/rm-community/rm-community-repo/config/alfresco/module/org_alfresco_module_rm/capability/rm-capabilities-security-context.xml index 2d390542d8..8eb23e4180 100644 --- a/rm-community/rm-community-repo/config/alfresco/module/org_alfresco_module_rm/capability/rm-capabilities-security-context.xml +++ b/rm-community/rm-community-repo/config/alfresco/module/org_alfresco_module_rm/capability/rm-capabilities-security-context.xml @@ -1,7 +1,9 @@ - + - diff --git a/rm-community/rm-community-repo/config/alfresco/module/org_alfresco_module_rm/content-context.xml b/rm-community/rm-community-repo/config/alfresco/module/org_alfresco_module_rm/content-context.xml index d7d9999f20..7e9807e15b 100644 --- a/rm-community/rm-community-repo/config/alfresco/module/org_alfresco_module_rm/content-context.xml +++ b/rm-community/rm-community-repo/config/alfresco/module/org_alfresco_module_rm/content-context.xml @@ -5,11 +5,11 @@ xmlns:context="http://www.springframework.org/schema/context" xsi:schemaLocation=" http://www.springframework.org/schema/context - http://www.springframework.org/schema/context/spring-context-3.0.xsd + http://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/beans - http://www.springframework.org/schema/beans/spring-beans-3.0.xsd + http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/aop - http://www.springframework.org/schema/aop/spring-aop-3.0.xsd "> + http://www.springframework.org/schema/aop/spring-aop.xsd "> diff --git a/rm-community/rm-community-repo/config/alfresco/module/org_alfresco_module_rm/dod5015/dod5015-capabilities-classification-context.xml b/rm-community/rm-community-repo/config/alfresco/module/org_alfresco_module_rm/dod5015/dod5015-capabilities-classification-context.xml index 38866ec77a..2cafcf36a1 100644 --- a/rm-community/rm-community-repo/config/alfresco/module/org_alfresco_module_rm/dod5015/dod5015-capabilities-classification-context.xml +++ b/rm-community/rm-community-repo/config/alfresco/module/org_alfresco_module_rm/dod5015/dod5015-capabilities-classification-context.xml @@ -1,11 +1,13 @@ - + - diff --git a/rm-community/rm-community-repo/config/alfresco/module/org_alfresco_module_rm/dod5015/dod5015-context.xml b/rm-community/rm-community-repo/config/alfresco/module/org_alfresco_module_rm/dod5015/dod5015-context.xml index 5d1b5768c0..f5649b294d 100644 --- a/rm-community/rm-community-repo/config/alfresco/module/org_alfresco_module_rm/dod5015/dod5015-context.xml +++ b/rm-community/rm-community-repo/config/alfresco/module/org_alfresco_module_rm/dod5015/dod5015-context.xml @@ -1,7 +1,9 @@ - + - diff --git a/rm-community/rm-community-repo/config/alfresco/module/org_alfresco_module_rm/extended-repository-context.xml b/rm-community/rm-community-repo/config/alfresco/module/org_alfresco_module_rm/extended-repository-context.xml index 939392423c..482af53384 100644 --- a/rm-community/rm-community-repo/config/alfresco/module/org_alfresco_module_rm/extended-repository-context.xml +++ b/rm-community/rm-community-repo/config/alfresco/module/org_alfresco_module_rm/extended-repository-context.xml @@ -1,7 +1,8 @@ - - - + diff --git a/rm-community/rm-community-repo/config/alfresco/module/org_alfresco_module_rm/model/rm-model-security-context.xml b/rm-community/rm-community-repo/config/alfresco/module/org_alfresco_module_rm/model/rm-model-security-context.xml index d97f736648..4ad1f6d179 100644 --- a/rm-community/rm-community-repo/config/alfresco/module/org_alfresco_module_rm/model/rm-model-security-context.xml +++ b/rm-community/rm-community-repo/config/alfresco/module/org_alfresco_module_rm/model/rm-model-security-context.xml @@ -1,7 +1,9 @@ - + - diff --git a/rm-community/rm-community-repo/config/alfresco/module/org_alfresco_module_rm/module-context.xml b/rm-community/rm-community-repo/config/alfresco/module/org_alfresco_module_rm/module-context.xml index 63242f2ab1..a10096030a 100644 --- a/rm-community/rm-community-repo/config/alfresco/module/org_alfresco_module_rm/module-context.xml +++ b/rm-community/rm-community-repo/config/alfresco/module/org_alfresco_module_rm/module-context.xml @@ -4,9 +4,9 @@ xmlns:aop="http://www.springframework.org/schema/aop" xsi:schemaLocation=" http://www.springframework.org/schema/beans - http://www.springframework.org/schema/beans/spring-beans-3.0.xsd + http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/aop - http://www.springframework.org/schema/aop/spring-aop-3.0.xsd "> + http://www.springframework.org/schema/aop/spring-aop.xsd "> diff --git a/rm-community/rm-community-repo/config/alfresco/module/org_alfresco_module_rm/patch/rm-patch-context.xml b/rm-community/rm-community-repo/config/alfresco/module/org_alfresco_module_rm/patch/rm-patch-context.xml index 6d4c60152e..09b4a74ae5 100755 --- a/rm-community/rm-community-repo/config/alfresco/module/org_alfresco_module_rm/patch/rm-patch-context.xml +++ b/rm-community/rm-community-repo/config/alfresco/module/org_alfresco_module_rm/patch/rm-patch-context.xml @@ -1,7 +1,9 @@ - + - diff --git a/rm-community/rm-community-repo/config/alfresco/module/org_alfresco_module_rm/patch/rm-patch-v20-context.xml b/rm-community/rm-community-repo/config/alfresco/module/org_alfresco_module_rm/patch/rm-patch-v20-context.xml index 985a809082..03af26dfad 100755 --- a/rm-community/rm-community-repo/config/alfresco/module/org_alfresco_module_rm/patch/rm-patch-v20-context.xml +++ b/rm-community/rm-community-repo/config/alfresco/module/org_alfresco_module_rm/patch/rm-patch-v20-context.xml @@ -1,7 +1,9 @@ - + - diff --git a/rm-community/rm-community-repo/config/alfresco/module/org_alfresco_module_rm/patch/rm-patch-v21-context.xml b/rm-community/rm-community-repo/config/alfresco/module/org_alfresco_module_rm/patch/rm-patch-v21-context.xml index aa0a740c59..578fc799bf 100755 --- a/rm-community/rm-community-repo/config/alfresco/module/org_alfresco_module_rm/patch/rm-patch-v21-context.xml +++ b/rm-community/rm-community-repo/config/alfresco/module/org_alfresco_module_rm/patch/rm-patch-v21-context.xml @@ -1,7 +1,9 @@ - + - diff --git a/rm-community/rm-community-repo/config/alfresco/module/org_alfresco_module_rm/patch/rm-patch-v22-context.xml b/rm-community/rm-community-repo/config/alfresco/module/org_alfresco_module_rm/patch/rm-patch-v22-context.xml index 039ab39125..1cf1af9cde 100755 --- a/rm-community/rm-community-repo/config/alfresco/module/org_alfresco_module_rm/patch/rm-patch-v22-context.xml +++ b/rm-community/rm-community-repo/config/alfresco/module/org_alfresco_module_rm/patch/rm-patch-v22-context.xml @@ -1,7 +1,9 @@ - + - - + - - - + - + - diff --git a/rm-community/rm-community-repo/config/alfresco/module/org_alfresco_module_rm/query/rm-query-context.xml b/rm-community/rm-community-repo/config/alfresco/module/org_alfresco_module_rm/query/rm-query-context.xml index 5bb4a8b094..28b518d348 100644 --- a/rm-community/rm-community-repo/config/alfresco/module/org_alfresco_module_rm/query/rm-query-context.xml +++ b/rm-community/rm-community-repo/config/alfresco/module/org_alfresco_module_rm/query/rm-query-context.xml @@ -2,7 +2,8 @@ + xsi:schemaLocation="http://www.springframework.org/schema/beans + http://www.springframework.org/schema/beans/spring-beans.xsd"> diff --git a/rm-community/rm-community-repo/config/alfresco/module/org_alfresco_module_rm/rm-action-context.xml b/rm-community/rm-community-repo/config/alfresco/module/org_alfresco_module_rm/rm-action-context.xml index 9d658f65cc..57332900c7 100644 --- a/rm-community/rm-community-repo/config/alfresco/module/org_alfresco_module_rm/rm-action-context.xml +++ b/rm-community/rm-community-repo/config/alfresco/module/org_alfresco_module_rm/rm-action-context.xml @@ -1,7 +1,9 @@ - + - diff --git a/rm-community/rm-community-repo/config/alfresco/module/org_alfresco_module_rm/rm-audit-context.xml b/rm-community/rm-community-repo/config/alfresco/module/org_alfresco_module_rm/rm-audit-context.xml index b7c7ce514e..f7bb0bc2cc 100644 --- a/rm-community/rm-community-repo/config/alfresco/module/org_alfresco_module_rm/rm-audit-context.xml +++ b/rm-community/rm-community-repo/config/alfresco/module/org_alfresco_module_rm/rm-audit-context.xml @@ -1,7 +1,9 @@ - + - diff --git a/rm-community/rm-community-repo/config/alfresco/module/org_alfresco_module_rm/rm-capabilities-context.xml b/rm-community/rm-community-repo/config/alfresco/module/org_alfresco_module_rm/rm-capabilities-context.xml index b2491bc092..59c1e1b9a9 100644 --- a/rm-community/rm-community-repo/config/alfresco/module/org_alfresco_module_rm/rm-capabilities-context.xml +++ b/rm-community/rm-community-repo/config/alfresco/module/org_alfresco_module_rm/rm-capabilities-context.xml @@ -1,9 +1,11 @@ - + - + - diff --git a/rm-community/rm-community-repo/config/alfresco/module/org_alfresco_module_rm/rm-deprecated-context.xml b/rm-community/rm-community-repo/config/alfresco/module/org_alfresco_module_rm/rm-deprecated-context.xml index cc663d4f93..5e2b7d389d 100644 --- a/rm-community/rm-community-repo/config/alfresco/module/org_alfresco_module_rm/rm-deprecated-context.xml +++ b/rm-community/rm-community-repo/config/alfresco/module/org_alfresco_module_rm/rm-deprecated-context.xml @@ -1,7 +1,10 @@ - + + - @@ -22,9 +25,9 @@ - + - + @@ -76,9 +79,9 @@ - + - + diff --git a/rm-community/rm-community-repo/config/alfresco/module/org_alfresco_module_rm/rm-disposition-properties-context.xml b/rm-community/rm-community-repo/config/alfresco/module/org_alfresco_module_rm/rm-disposition-properties-context.xml index 6577e35e1f..a3056f1f0b 100644 --- a/rm-community/rm-community-repo/config/alfresco/module/org_alfresco_module_rm/rm-disposition-properties-context.xml +++ b/rm-community/rm-community-repo/config/alfresco/module/org_alfresco_module_rm/rm-disposition-properties-context.xml @@ -1,7 +1,9 @@ - + - - + - diff --git a/rm-community/rm-community-repo/config/alfresco/module/org_alfresco_module_rm/rm-model-context.xml b/rm-community/rm-community-repo/config/alfresco/module/org_alfresco_module_rm/rm-model-context.xml index ddd303c982..4a02699bf4 100644 --- a/rm-community/rm-community-repo/config/alfresco/module/org_alfresco_module_rm/rm-model-context.xml +++ b/rm-community/rm-community-repo/config/alfresco/module/org_alfresco_module_rm/rm-model-context.xml @@ -1,7 +1,9 @@ - + - diff --git a/rm-community/rm-community-repo/config/alfresco/module/org_alfresco_module_rm/rm-public-rest-context.xml b/rm-community/rm-community-repo/config/alfresco/module/org_alfresco_module_rm/rm-public-rest-context.xml index 8d16ade1a0..2cc827d11c 100644 --- a/rm-community/rm-community-repo/config/alfresco/module/org_alfresco_module_rm/rm-public-rest-context.xml +++ b/rm-community/rm-community-repo/config/alfresco/module/org_alfresco_module_rm/rm-public-rest-context.xml @@ -2,8 +2,8 @@ + xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd + http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd"> diff --git a/rm-community/rm-community-repo/config/alfresco/module/org_alfresco_module_rm/rm-public-services-security-context.xml b/rm-community/rm-community-repo/config/alfresco/module/org_alfresco_module_rm/rm-public-services-security-context.xml index 6d90759e2b..2c2f5b69f0 100644 --- a/rm-community/rm-community-repo/config/alfresco/module/org_alfresco_module_rm/rm-public-services-security-context.xml +++ b/rm-community/rm-community-repo/config/alfresco/module/org_alfresco_module_rm/rm-public-services-security-context.xml @@ -1,5 +1,8 @@ - + @@ -10,7 +13,6 @@ - @@ -63,7 +65,7 @@ - + @@ -126,7 +128,7 @@ - + diff --git a/rm-community/rm-community-repo/config/alfresco/module/org_alfresco_module_rm/rm-report-context.xml b/rm-community/rm-community-repo/config/alfresco/module/org_alfresco_module_rm/rm-report-context.xml index 5df936757b..a2486705dd 100644 --- a/rm-community/rm-community-repo/config/alfresco/module/org_alfresco_module_rm/rm-report-context.xml +++ b/rm-community/rm-community-repo/config/alfresco/module/org_alfresco_module_rm/rm-report-context.xml @@ -1,7 +1,8 @@ - - - + @@ -39,9 +40,9 @@ - + - + diff --git a/rm-community/rm-community-repo/config/alfresco/module/org_alfresco_module_rm/rm-service-context.xml b/rm-community/rm-community-repo/config/alfresco/module/org_alfresco_module_rm/rm-service-context.xml index 1d2f094680..ae1b30d344 100644 --- a/rm-community/rm-community-repo/config/alfresco/module/org_alfresco_module_rm/rm-service-context.xml +++ b/rm-community/rm-community-repo/config/alfresco/module/org_alfresco_module_rm/rm-service-context.xml @@ -6,13 +6,13 @@ xmlns:util="http://www.springframework.org/schema/util" xsi:schemaLocation=" http://www.springframework.org/schema/context - http://www.springframework.org/schema/context/spring-context-3.0.xsd + http://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/beans - http://www.springframework.org/schema/beans/spring-beans-3.0.xsd + http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/aop - http://www.springframework.org/schema/aop/spring-aop-3.0.xsd + http://www.springframework.org/schema/aop/spring-aop.xsd http://www.springframework.org/schema/util - http://www.springframework.org/schema/util/spring-util-3.0.xsd"> + http://www.springframework.org/schema/util/spring-util.xsd"> @@ -66,9 +66,9 @@ - + - + @@ -117,9 +117,9 @@ - + - + @@ -187,9 +187,9 @@ - + - + @@ -232,9 +232,9 @@ - + - + @@ -353,9 +353,9 @@ - + - + @@ -410,9 +410,9 @@ - + - + @@ -475,9 +475,9 @@ - + - + @@ -531,9 +531,9 @@ - + - + @@ -598,9 +598,9 @@ - + - + @@ -636,9 +636,9 @@ - + - + @@ -680,9 +680,9 @@ - + - + @@ -737,9 +737,9 @@ - + - + @@ -808,9 +808,9 @@ - + - + @@ -885,9 +885,9 @@ - + - + @@ -959,9 +959,9 @@ - + - + @@ -1019,9 +1019,9 @@ - + - + @@ -1113,9 +1113,9 @@ - + - + @@ -1185,9 +1185,9 @@ - + - + @@ -1228,9 +1228,9 @@ - + - + @@ -1306,8 +1306,8 @@ - - + + @@ -1439,8 +1439,8 @@ - - + + @@ -1484,9 +1484,9 @@ - + - + @@ -1546,9 +1546,9 @@ - + - + @@ -1594,9 +1594,9 @@ - + - + @@ -1647,9 +1647,9 @@ - + - + diff --git a/rm-community/rm-community-repo/config/alfresco/module/org_alfresco_module_rm/rm-ui-evaluators-context.xml b/rm-community/rm-community-repo/config/alfresco/module/org_alfresco_module_rm/rm-ui-evaluators-context.xml index 2cc9710263..6be1b778bb 100644 --- a/rm-community/rm-community-repo/config/alfresco/module/org_alfresco_module_rm/rm-ui-evaluators-context.xml +++ b/rm-community/rm-community-repo/config/alfresco/module/org_alfresco_module_rm/rm-ui-evaluators-context.xml @@ -1,7 +1,8 @@ - - - + diff --git a/rm-community/rm-community-repo/config/alfresco/module/org_alfresco_module_rm/rm-version-context.xml b/rm-community/rm-community-repo/config/alfresco/module/org_alfresco_module_rm/rm-version-context.xml index 91c2f622ea..7548a52afa 100644 --- a/rm-community/rm-community-repo/config/alfresco/module/org_alfresco_module_rm/rm-version-context.xml +++ b/rm-community/rm-community-repo/config/alfresco/module/org_alfresco_module_rm/rm-version-context.xml @@ -1,9 +1,10 @@ - + - - - + @@ -64,9 +65,9 @@ - + - + diff --git a/rm-community/rm-community-repo/config/alfresco/module/org_alfresco_module_rm/rm-webscript-context.xml b/rm-community/rm-community-repo/config/alfresco/module/org_alfresco_module_rm/rm-webscript-context.xml index 3c3d0ccf20..846f6518a7 100644 --- a/rm-community/rm-community-repo/config/alfresco/module/org_alfresco_module_rm/rm-webscript-context.xml +++ b/rm-community/rm-community-repo/config/alfresco/module/org_alfresco_module_rm/rm-webscript-context.xml @@ -1,7 +1,8 @@ - - - + diff --git a/rm-community/rm-community-repo/config/alfresco/module/org_alfresco_module_rm/rm-workflow-context.xml b/rm-community/rm-community-repo/config/alfresco/module/org_alfresco_module_rm/rm-workflow-context.xml index 5b6dab5093..defbe811fc 100644 --- a/rm-community/rm-community-repo/config/alfresco/module/org_alfresco_module_rm/rm-workflow-context.xml +++ b/rm-community/rm-community-repo/config/alfresco/module/org_alfresco_module_rm/rm-workflow-context.xml @@ -1,6 +1,9 @@ - - + + diff --git a/rm-community/rm-community-repo/config/alfresco/module/org_alfresco_module_rm/security/rm-method-security-context.xml b/rm-community/rm-community-repo/config/alfresco/module/org_alfresco_module_rm/security/rm-method-security-context.xml index 1d500571ab..5bd3b02433 100644 --- a/rm-community/rm-community-repo/config/alfresco/module/org_alfresco_module_rm/security/rm-method-security-context.xml +++ b/rm-community/rm-community-repo/config/alfresco/module/org_alfresco_module_rm/security/rm-method-security-context.xml @@ -1,7 +1,8 @@ - - - + diff --git a/rm-community/rm-community-repo/test/resources/test-context.xml b/rm-community/rm-community-repo/test/resources/test-context.xml index 58b4aa0fee..c78ea2e72d 100644 --- a/rm-community/rm-community-repo/test/resources/test-context.xml +++ b/rm-community/rm-community-repo/test/resources/test-context.xml @@ -1,7 +1,8 @@ - - - + @@ -188,9 +189,9 @@ - + - + diff --git a/rm-community/rm-community-repo/test/resources/test-job-context.xml b/rm-community/rm-community-repo/test/resources/test-job-context.xml index ea535d5f17..fdf8323a38 100644 --- a/rm-community/rm-community-repo/test/resources/test-job-context.xml +++ b/rm-community/rm-community-repo/test/resources/test-job-context.xml @@ -1,7 +1,8 @@ - - - + diff --git a/rm-community/rm-community-repo/test/resources/test-rm3314-context.xml b/rm-community/rm-community-repo/test/resources/test-rm3314-context.xml index a01ac698f5..f425ebb658 100644 --- a/rm-community/rm-community-repo/test/resources/test-rm3314-context.xml +++ b/rm-community/rm-community-repo/test/resources/test-rm3314-context.xml @@ -1,7 +1,7 @@ - - - - + From 758ccdca14f5ec78c6d690f5625c483627adbed3 Mon Sep 17 00:00:00 2001 From: Rodica Sutu Date: Mon, 14 May 2018 09:39:48 +0300 Subject: [PATCH 05/99] RM-6313 update of jobs and triggers according to Spring 5 and Quartz library 2.3.0 upgrade --- .../org_alfresco_module_rm/rm-job-context.xml | 124 ++++++++---------- 1 file changed, 57 insertions(+), 67 deletions(-) diff --git a/rm-community/rm-community-repo/config/alfresco/module/org_alfresco_module_rm/rm-job-context.xml b/rm-community/rm-community-repo/config/alfresco/module/org_alfresco_module_rm/rm-job-context.xml index c8cb9b668f..047aaa4a70 100644 --- a/rm-community/rm-community-repo/config/alfresco/module/org_alfresco_module_rm/rm-job-context.xml +++ b/rm-community/rm-community-repo/config/alfresco/module/org_alfresco_module_rm/rm-job-context.xml @@ -1,9 +1,15 @@ - + - - - + @@ -13,19 +19,26 @@ - - - org.alfresco.module.org_alfresco_module_rm.job.RecordsManagementJob + + + + + + + + + + + + + + - - - - - - + + @@ -38,35 +51,15 @@ - - - - - - - - - - ${rm.notifyOfRecordsDueForReview.cronExpression} - - - - - - - org.alfresco.module.org_alfresco_module_rm.job.RecordsManagementJob - + + - - - - - - + + @@ -89,45 +82,42 @@ - - - - - - - - - - - - - ${rm.dispositionlifecycletrigger.cronexpression} - + + + + + + + + + + + - - - org.alfresco.module.org_alfresco_module_rm.job.RecordsManagementJob - + + - - - - - - - + + + - - + - - - 0/30 * * * * ? + + + + + + + 0/30 * * * * ? + + + From ff1a8fa8ac726bd75f78332f42df913bfcf011c1 Mon Sep 17 00:00:00 2001 From: Rodica Sutu Date: Mon, 14 May 2018 17:42:17 +0300 Subject: [PATCH 06/99] update the RM schedulers from test context files --- .../test/resources/test-context.xml | 22 +++++++++++-------- .../test/resources/test-job-context.xml | 19 ++++++++-------- 2 files changed, 23 insertions(+), 18 deletions(-) diff --git a/rm-community/rm-community-repo/test/resources/test-context.xml b/rm-community/rm-community-repo/test/resources/test-context.xml index c78ea2e72d..7e0f0e1bd2 100644 --- a/rm-community/rm-community-repo/test/resources/test-context.xml +++ b/rm-community/rm-community-repo/test/resources/test-context.xml @@ -116,15 +116,19 @@ - - - - - - - - - 0 30 3 * * ? + + + + + + + + + 0 30 3 * * ? + + + diff --git a/rm-community/rm-community-repo/test/resources/test-job-context.xml b/rm-community/rm-community-repo/test/resources/test-job-context.xml index fdf8323a38..3760eb3741 100644 --- a/rm-community/rm-community-repo/test/resources/test-job-context.xml +++ b/rm-community/rm-community-repo/test/resources/test-job-context.xml @@ -4,15 +4,16 @@ xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd"> - - - - - - - - - 0/30 * * * * ? + + + + + + + + From 20f7fb942b5e95f0862c66d2857fa7e4d257e4c1 Mon Sep 17 00:00:00 2001 From: Rodica Sutu Date: Mon, 14 May 2018 17:48:28 +0300 Subject: [PATCH 07/99] more library upgrades --- rm-community/rm-community-repo/pom.xml | 4 ++-- rm-community/rm-community-rest-api-explorer/pom.xml | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/rm-community/rm-community-repo/pom.xml b/rm-community/rm-community-repo/pom.xml index 85a67eb9f1..a84cbbd75d 100644 --- a/rm-community/rm-community-repo/pom.xml +++ b/rm-community/rm-community-repo/pom.xml @@ -25,12 +25,12 @@ alfresco-rm-community-repo true ${project.build.directory}/solr/home - 1.4 + 6.0.4-ea 7.2 8.5 - 6.48 + 6.49 6.31 1.0.8 6.0 diff --git a/rm-community/rm-community-rest-api-explorer/pom.xml b/rm-community/rm-community-rest-api-explorer/pom.xml index cded13c0aa..13839c52c2 100644 --- a/rm-community/rm-community-rest-api-explorer/pom.xml +++ b/rm-community/rm-community-rest-api-explorer/pom.xml @@ -11,7 +11,7 @@ - 5.2.0.1 + 6.0.4-ea 1.8 1.8 UTF-8 From fcf1ff24a02de9bc84fe86b490d84ca190d376b2 Mon Sep 17 00:00:00 2001 From: Rodica Sutu Date: Tue, 15 May 2018 12:59:20 +0300 Subject: [PATCH 08/99] Spring upgrade remove dependency-check attribute --- .../rm-public-services-security-context.xml | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/rm-community/rm-community-repo/config/alfresco/module/org_alfresco_module_rm/rm-public-services-security-context.xml b/rm-community/rm-community-repo/config/alfresco/module/org_alfresco_module_rm/rm-public-services-security-context.xml index 2c2f5b69f0..afd9d8a728 100644 --- a/rm-community/rm-community-repo/config/alfresco/module/org_alfresco_module_rm/rm-public-services-security-context.xml +++ b/rm-community/rm-community-repo/config/alfresco/module/org_alfresco_module_rm/rm-public-services-security-context.xml @@ -65,7 +65,7 @@ - + @@ -128,7 +128,8 @@ - + From 4a0ff7e6e60e9c78a543e0459a8ab3515f497b12 Mon Sep 17 00:00:00 2001 From: Rodica Sutu Date: Tue, 15 May 2018 13:01:25 +0300 Subject: [PATCH 09/99] temporary comment out the test - the test needs to be refactored after the Spring 5 upgrade --- .../RMCaveatConfigServiceImplTest.java | 153 ++++++++---------- 1 file changed, 66 insertions(+), 87 deletions(-) diff --git a/rm-community/rm-community-repo/test/java/org/alfresco/module/org_alfresco_module_rm/test/legacy/service/RMCaveatConfigServiceImplTest.java b/rm-community/rm-community-repo/test/java/org/alfresco/module/org_alfresco_module_rm/test/legacy/service/RMCaveatConfigServiceImplTest.java index d4f7201bfc..ec0f45d39b 100644 --- a/rm-community/rm-community-repo/test/java/org/alfresco/module/org_alfresco_module_rm/test/legacy/service/RMCaveatConfigServiceImplTest.java +++ b/rm-community/rm-community-repo/test/java/org/alfresco/module/org_alfresco_module_rm/test/legacy/service/RMCaveatConfigServiceImplTest.java @@ -27,33 +27,12 @@ package org.alfresco.module.org_alfresco_module_rm.test.legacy.service; -import java.util.ArrayList; -import java.util.List; - -import javax.transaction.UserTransaction; - -import org.alfresco.model.ContentModel; -import org.alfresco.module.org_alfresco_module_rm.caveat.RMCaveatConfigService; -import org.alfresco.module.org_alfresco_module_rm.caveat.RMCaveatConfigServiceImpl; -import org.alfresco.module.org_alfresco_module_rm.dod5015.DOD5015Model; -import org.alfresco.repo.security.authentication.AuthenticationUtil; -import org.alfresco.repo.security.authentication.AuthenticationUtil.RunAsWork; -import org.alfresco.service.cmr.repository.NodeRef; -import org.alfresco.service.cmr.repository.NodeService; -import org.alfresco.service.cmr.repository.StoreRef; -import org.alfresco.service.cmr.security.AuthorityService; -import org.alfresco.service.cmr.security.AuthorityType; -import org.alfresco.service.cmr.security.MutableAuthenticationService; -import org.alfresco.service.cmr.security.PersonService; -import org.alfresco.service.transaction.TransactionService; -import org.alfresco.util.BaseSpringTest; -import org.alfresco.util.PropertyMap; - /** * Test of RM Caveat (Admin facing scripts) * * @author Mark Rogers - */ + *//* +@Transactional public class RMCaveatConfigServiceImplTest extends BaseSpringTest implements DOD5015Model { protected static StoreRef SPACES_STORE = new StoreRef(StoreRef.PROTOCOL_WORKSPACE, "SpacesStore"); @@ -78,10 +57,9 @@ public class RMCaveatConfigServiceImplTest extends BaseSpringTest implements DOD protected final static String RM_LIST = "rmc:smList"; // existing pre-defined list protected final static String RM_LIST_ALT = "rmc:anoList"; - @Override - protected void onSetUpInTransaction() throws Exception + @Before + public void before() throws Exception { - super.onSetUpInTransaction(); // Get the service required in the tests this.nodeService = (NodeService)this.applicationContext.getBean("NodeService"); // use upper 'N'odeService (to test access config interceptor) @@ -103,8 +81,8 @@ public class RMCaveatConfigServiceImplTest extends BaseSpringTest implements DOD { } - @Override - protected void onTearDownInTransaction() throws Exception + @After + public void after() throws Exception { try { @@ -120,11 +98,11 @@ public class RMCaveatConfigServiceImplTest extends BaseSpringTest implements DOD } } - @Override - protected void onTearDownAfterTransaction() throws Exception + @AfterTransaction + public void onTearDownAfterTransaction() throws Exception { // TODO Auto-generated method stub - super.onTearDownAfterTransaction(); + // super.onTearDownAfterTransaction(); } public void testSetup() @@ -133,11 +111,11 @@ public class RMCaveatConfigServiceImplTest extends BaseSpringTest implements DOD } - /** + *//** * Test of Caveat Config * * @throws Exception - */ + *//* public void testAddRMConstraintList() throws Exception { setComplete(); @@ -147,27 +125,27 @@ public class RMCaveatConfigServiceImplTest extends BaseSpringTest implements DOD startNewTransaction(); - /** + *//** * Now remove the entire list (rma:smList); - */ + *//* logger.debug("test remove entire list rmc:smList"); caveatConfigService.deleteRMConstraint(RM_LIST); - /** + *//** * Now add the list again - */ + *//* logger.debug("test add back rmc:smList"); caveatConfigService.addRMConstraint(RM_LIST, "my title", new String[0]); - /** + *//** * Negative test - add a list that already exists - */ + *//* logger.debug("try to create duplicate list rmc:smList"); caveatConfigService.addRMConstraint(RM_LIST, "my title", new String[0]); - /** + *//** * Negative test - remove a list that does not exist - */ + *//* logger.debug("test remove entire list rmc:smList"); caveatConfigService.deleteRMConstraint(RM_LIST); try @@ -181,9 +159,9 @@ public class RMCaveatConfigServiceImplTest extends BaseSpringTest implements DOD } - /** + *//** * Negative test - add a constraint to property that does not exist - */ + *//* logger.debug("test property does not exist"); try { @@ -199,11 +177,11 @@ public class RMCaveatConfigServiceImplTest extends BaseSpringTest implements DOD } - /** + *//** * Test of addRMConstraintListValue * * @throws Exception - */ + *//* public void testAddRMConstraintListValue() throws Exception { setComplete(); @@ -215,27 +193,27 @@ public class RMCaveatConfigServiceImplTest extends BaseSpringTest implements DOD startNewTransaction(); caveatConfigService.addRMConstraint(RM_LIST, "my title", new String[0]); - /** + *//** * Add a user to the list - */ + *//* List values = new ArrayList(); values.add(NOFORN); values.add(NOCONTRACT); caveatConfigService.updateRMConstraintListAuthority(RM_LIST, "jrogers", values); - /** + *//** * Add another value to that list - */ + *//* caveatConfigService.addRMConstraintListValue(RM_LIST, "jrogers", FGI); - /** + *//** * Negative test - attempt to add a duplicate value - */ + *//* caveatConfigService.addRMConstraintListValue(RM_LIST, "jrogers", FGI); - /** + *//** * Negative test - attempt to add to a list that does not exist - */ + *//* try { caveatConfigService.addRMConstraintListValue(RM_LIST_ALT, "mhouse", FGI); @@ -247,9 +225,9 @@ public class RMCaveatConfigServiceImplTest extends BaseSpringTest implements DOD } - /** + *//** * Negative test - attempt to add to a list that does exist and user that does not exist - */ + *//* try { caveatConfigService.addRMConstraintListValue(RM_LIST, "mhouse", FGI); @@ -263,11 +241,11 @@ public class RMCaveatConfigServiceImplTest extends BaseSpringTest implements DOD } - /** + *//** * Test of UpdateRMConstraintListAuthority * * @throws Exception - */ + *//* public void testUpdateRMConstraintListAuthority() throws Exception { setComplete(); @@ -280,50 +258,50 @@ public class RMCaveatConfigServiceImplTest extends BaseSpringTest implements DOD caveatConfigService.addRMConstraint(RM_LIST, "my title", new String[0]); - /** + *//** * Add a user to the list - */ + *//* List values = new ArrayList(); values.add(NOFORN); values.add(NOCONTRACT); caveatConfigService.updateRMConstraintListAuthority(RM_LIST, "jrogers", values); - /** + *//** * Add to a authority that already exists * Should replace existing authority - */ + *//* List updatedValues = new ArrayList(); values.add(FGI); caveatConfigService.updateRMConstraintListAuthority(RM_LIST, "jrogers", updatedValues); - /** + *//** * Add a group to the list - */ + *//* caveatConfigService.updateRMConstraintListAuthority(RM_LIST, "Engineering", values); - /** + *//** * Add to a list that does not exist * Should create a new list - */ + *//* caveatConfigService.deleteRMConstraint(RM_LIST); caveatConfigService.updateRMConstraintListAuthority(RM_LIST, "jrogers", values); - /** + *//** * Add to a authority that already exists * Should replace existing authority - */ + *//* endTransaction(); cleanCaveatConfigData(); } - /** + *//** * Test of RemoveRMConstraintListAuthority * * @throws Exception - */ + *//* public void testRemoveRMConstraintListAuthority() throws Exception { setComplete(); @@ -339,20 +317,20 @@ public class RMCaveatConfigServiceImplTest extends BaseSpringTest implements DOD values.add(FGI); caveatConfigService.updateRMConstraintListAuthority(RM_LIST, "jrogers", values); - /** + *//** * Remove a user from a list - */ + *//* caveatConfigService.removeRMConstraintListAuthority(RM_LIST, "jrogers"); - /** + *//** * Negative test - remove a user that does not exist - */ + *//* caveatConfigService.removeRMConstraintListAuthority(RM_LIST, "jrogers"); - /** + *//** * Negative test - remove a user from a list that does not exist. * Should create a new list - */ + *//* caveatConfigService.addRMConstraint(RM_LIST, "my title", new String[0]); caveatConfigService.updateRMConstraintListAuthority(RM_LIST, "jrogers", values); @@ -365,11 +343,11 @@ public class RMCaveatConfigServiceImplTest extends BaseSpringTest implements DOD - /** + *//** * Test of Caveat Config * * @throws Exception - */ + *//* public void testRMCaveatConfig() throws Exception { setComplete(); @@ -421,29 +399,29 @@ public class RMCaveatConfigServiceImplTest extends BaseSpringTest implements DOD assertTrue(allowedValues.contains(FOUO)); assertTrue(allowedValues.contains(FGI)); - /** + *//** // * Now remove the entire list (rma:smList); - */ + *//* logger.debug("test remove entire list rmc:smList"); caveatConfigService.deleteRMConstraint(RM_LIST); - /** + *//** * Now add the list again - */ + *//* logger.debug("test add back rmc:smList"); caveatConfigService.addRMConstraint(RM_LIST, "my title", new String[0]); - /** + *//** * Negative test - add a list that already exists - */ + *//* logger.debug("try to create duplicate list rmc:smList"); caveatConfigService.addRMConstraint(RM_LIST, "my title", new String[0]); - /** + *//** * Negative test - remove a list that does not exist - */ + *//* logger.debug("test remove entire list rmc:smList"); caveatConfigService.deleteRMConstraint(RM_LIST); try @@ -457,9 +435,9 @@ public class RMCaveatConfigServiceImplTest extends BaseSpringTest implements DOD } - /** + *//** * Negative test - add a constraint to property that does not exist - */ + *//* logger.debug("test property does not exist"); try { @@ -619,3 +597,4 @@ public class RMCaveatConfigServiceImplTest extends BaseSpringTest implements DOD } } +*/ \ No newline at end of file From a5d40f81edd0c4dcb77ec2276323dcaad43e6abf Mon Sep 17 00:00:00 2001 From: Rodica Sutu Date: Tue, 15 May 2018 14:15:49 +0300 Subject: [PATCH 10/99] library updates for 6.0 --- rm-community/pom.xml | 6 +++++- rm-community/rm-community-repo/pom.xml | 11 +++++++---- 2 files changed, 12 insertions(+), 5 deletions(-) diff --git a/rm-community/pom.xml b/rm-community/pom.xml index 9e3e1d0779..f7e9befc2a 100644 --- a/rm-community/pom.xml +++ b/rm-community/pom.xml @@ -44,6 +44,10 @@ 5.2.g - 5.2.f + + 6.0.a + + true + diff --git a/rm-community/rm-community-repo/pom.xml b/rm-community/rm-community-repo/pom.xml index a84cbbd75d..98359f013b 100644 --- a/rm-community/rm-community-repo/pom.xml +++ b/rm-community/rm-community-repo/pom.xml @@ -187,7 +187,7 @@ org.alfresco alfresco-share-services - ${share.version} + ${alfresco.alfresco-share-services.version} amp @@ -244,7 +244,7 @@ prepare-package true - ${project.build.directory}/alfresco-share-services-${share.version}.amp + ${project.build.directory}/alfresco-share-services-${alfresco.alfresco-share-services.version}.amp ${app.amp.client.war.folder} @@ -537,9 +537,12 @@ ${alfresco.groupId} - ${alfresco.repo.artifactId} + + content-services-community war - ${alfresco.version} + + + 6.0.5-ea From 69d8969e2eb3683f804c0cf67be8ace56a26ade5 Mon Sep 17 00:00:00 2001 From: Tom Page Date: Wed, 16 May 2018 10:55:25 +0100 Subject: [PATCH 11/99] Remove broken test of legacy feature: RMCaveatConfigServiceImplTest. --- .../RMCaveatConfigServiceImplTest.java | 600 ------------------ 1 file changed, 600 deletions(-) delete mode 100644 rm-community/rm-community-repo/test/java/org/alfresco/module/org_alfresco_module_rm/test/legacy/service/RMCaveatConfigServiceImplTest.java diff --git a/rm-community/rm-community-repo/test/java/org/alfresco/module/org_alfresco_module_rm/test/legacy/service/RMCaveatConfigServiceImplTest.java b/rm-community/rm-community-repo/test/java/org/alfresco/module/org_alfresco_module_rm/test/legacy/service/RMCaveatConfigServiceImplTest.java deleted file mode 100644 index ec0f45d39b..0000000000 --- a/rm-community/rm-community-repo/test/java/org/alfresco/module/org_alfresco_module_rm/test/legacy/service/RMCaveatConfigServiceImplTest.java +++ /dev/null @@ -1,600 +0,0 @@ -/* - * #%L - * Alfresco Records Management Module - * %% - * Copyright (C) 2005 - 2018 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.module.org_alfresco_module_rm.test.legacy.service; - -/** - * Test of RM Caveat (Admin facing scripts) - * - * @author Mark Rogers - *//* -@Transactional -public class RMCaveatConfigServiceImplTest extends BaseSpringTest implements DOD5015Model -{ - protected static StoreRef SPACES_STORE = new StoreRef(StoreRef.PROTOCOL_WORKSPACE, "SpacesStore"); - - private NodeRef filePlan; - - private NodeService nodeService; - private TransactionService transactionService; - private RMCaveatConfigService caveatConfigService; - - private MutableAuthenticationService authenticationService; - private PersonService personService; - private AuthorityService authorityService; - - - // example base test data for supplemental markings list - protected final static String NOFORN = "NOFORN"; // Not Releasable to Foreign Nationals/Governments/Non-US Citizens - protected final static String NOCONTRACT = "NOCONTRACT"; // Not Releasable to Contractors or Contractor/Consultants - protected final static String FOUO = "FOUO"; // For Official Use Only - protected final static String FGI = "FGI"; // Foreign Government Information - - protected final static String RM_LIST = "rmc:smList"; // existing pre-defined list - protected final static String RM_LIST_ALT = "rmc:anoList"; - - @Before - public void before() throws Exception - { - - // Get the service required in the tests - this.nodeService = (NodeService)this.applicationContext.getBean("NodeService"); // use upper 'N'odeService (to test access config interceptor) - this.authenticationService = (MutableAuthenticationService)this.applicationContext.getBean("AuthenticationService"); - this.personService = (PersonService)this.applicationContext.getBean("PersonService"); - this.authorityService = (AuthorityService)this.applicationContext.getBean("AuthorityService"); - this.caveatConfigService = (RMCaveatConfigServiceImpl)this.applicationContext.getBean("caveatConfigService"); - this.transactionService = (TransactionService)this.applicationContext.getBean("TransactionService"); - - - // Set the current security context as admin - AuthenticationUtil.setFullyAuthenticatedUser(AuthenticationUtil.getAdminUserName()); - - // Get the test data - setUpTestData(); - } - - private void setUpTestData() - { - } - - @After - public void after() throws Exception - { - try - { - UserTransaction txn = transactionService.getUserTransaction(false); - txn.begin(); - this.nodeService.deleteNode(filePlan); - txn.commit(); - } - catch (Exception e) - { - // Nothing - //System.out.println("DID NOT DELETE FILE PLAN!"); - } - } - - @AfterTransaction - public void onTearDownAfterTransaction() throws Exception - { - // TODO Auto-generated method stub - // super.onTearDownAfterTransaction(); - } - - public void testSetup() - { - // NOOP - } - - - *//** - * Test of Caveat Config - * - * @throws Exception - *//* - public void testAddRMConstraintList() throws Exception - { - setComplete(); - endTransaction(); - - cleanCaveatConfigData(); - - startNewTransaction(); - - *//** - * Now remove the entire list (rma:smList); - *//* - logger.debug("test remove entire list rmc:smList"); - caveatConfigService.deleteRMConstraint(RM_LIST); - - *//** - * Now add the list again - *//* - logger.debug("test add back rmc:smList"); - caveatConfigService.addRMConstraint(RM_LIST, "my title", new String[0]); - - *//** - * Negative test - add a list that already exists - *//* - logger.debug("try to create duplicate list rmc:smList"); - caveatConfigService.addRMConstraint(RM_LIST, "my title", new String[0]); - - *//** - * Negative test - remove a list that does not exist - *//* - logger.debug("test remove entire list rmc:smList"); - caveatConfigService.deleteRMConstraint(RM_LIST); - try - { - caveatConfigService.deleteRMConstraint(RM_LIST); - fail("unknown constraint should have thrown an exception"); - } - catch (Exception e) - { - // expect to go here - } - - - *//** - * Negative test - add a constraint to property that does not exist - *//* - logger.debug("test property does not exist"); - try - { - caveatConfigService.addRMConstraint("rma:mer", "", new String[0]); - fail("unknown property should have thrown an exception"); - } - catch (Exception e) - { - // expect to go here - } - endTransaction(); - cleanCaveatConfigData(); - - } - - *//** - * Test of addRMConstraintListValue - * - * @throws Exception - *//* - public void testAddRMConstraintListValue() throws Exception - { - setComplete(); - endTransaction(); - - cleanCaveatConfigData(); - setupCaveatConfigData(); - - startNewTransaction(); - caveatConfigService.addRMConstraint(RM_LIST, "my title", new String[0]); - - *//** - * Add a user to the list - *//* - List values = new ArrayList(); - values.add(NOFORN); - values.add(NOCONTRACT); - caveatConfigService.updateRMConstraintListAuthority(RM_LIST, "jrogers", values); - - *//** - * Add another value to that list - *//* - caveatConfigService.addRMConstraintListValue(RM_LIST, "jrogers", FGI); - - *//** - * Negative test - attempt to add a duplicate value - *//* - caveatConfigService.addRMConstraintListValue(RM_LIST, "jrogers", FGI); - - *//** - * Negative test - attempt to add to a list that does not exist - *//* - try - { - caveatConfigService.addRMConstraintListValue(RM_LIST_ALT, "mhouse", FGI); - fail("exception not thrown"); - } - catch (Exception re) - { - // should go here - - } - - *//** - * Negative test - attempt to add to a list that does exist and user that does not exist - *//* - try - { - caveatConfigService.addRMConstraintListValue(RM_LIST, "mhouse", FGI); - fail("exception not thrown"); - } - catch (Exception e) - { - // should go here - } - - } - - - *//** - * Test of UpdateRMConstraintListAuthority - * - * @throws Exception - *//* - public void testUpdateRMConstraintListAuthority() throws Exception - { - setComplete(); - endTransaction(); - - cleanCaveatConfigData(); - setupCaveatConfigData(); - - startNewTransaction(); - - caveatConfigService.addRMConstraint(RM_LIST, "my title", new String[0]); - - *//** - * Add a user to the list - *//* - List values = new ArrayList(); - values.add(NOFORN); - values.add(NOCONTRACT); - caveatConfigService.updateRMConstraintListAuthority(RM_LIST, "jrogers", values); - - *//** - * Add to a authority that already exists - * Should replace existing authority - *//* - List updatedValues = new ArrayList(); - values.add(FGI); - caveatConfigService.updateRMConstraintListAuthority(RM_LIST, "jrogers", updatedValues); - - *//** - * Add a group to the list - *//* - caveatConfigService.updateRMConstraintListAuthority(RM_LIST, "Engineering", values); - - *//** - * Add to a list that does not exist - * Should create a new list - *//* - caveatConfigService.deleteRMConstraint(RM_LIST); - caveatConfigService.updateRMConstraintListAuthority(RM_LIST, "jrogers", values); - - - *//** - * Add to a authority that already exists - * Should replace existing authority - *//* - - endTransaction(); - cleanCaveatConfigData(); - - } - - *//** - * Test of RemoveRMConstraintListAuthority - * - * @throws Exception - *//* - public void testRemoveRMConstraintListAuthority() throws Exception - { - setComplete(); - endTransaction(); - - cleanCaveatConfigData(); - setupCaveatConfigData(); - - startNewTransaction(); - caveatConfigService.addRMConstraint(RM_LIST, "my title", new String[0]); - - List values = new ArrayList(); - values.add(FGI); - caveatConfigService.updateRMConstraintListAuthority(RM_LIST, "jrogers", values); - - *//** - * Remove a user from a list - *//* - caveatConfigService.removeRMConstraintListAuthority(RM_LIST, "jrogers"); - - *//** - * Negative test - remove a user that does not exist - *//* - caveatConfigService.removeRMConstraintListAuthority(RM_LIST, "jrogers"); - - *//** - * Negative test - remove a user from a list that does not exist. - * Should create a new list - *//* - - caveatConfigService.addRMConstraint(RM_LIST, "my title", new String[0]); - caveatConfigService.updateRMConstraintListAuthority(RM_LIST, "jrogers", values); - - endTransaction(); - cleanCaveatConfigData(); - - } - - - - - *//** - * Test of Caveat Config - * - * @throws Exception - *//* - public void testRMCaveatConfig() throws Exception - { - setComplete(); - endTransaction(); - - cleanCaveatConfigData(); - - startNewTransaction(); - - caveatConfigService.addRMConstraint(RM_LIST, "my title", new String[0]); - - List values = new ArrayList(); - values.add(NOFORN); - values.add(FOUO); - caveatConfigService.updateRMConstraintListAuthority(RM_LIST, "dfranco", values); - - values.add(FGI); - values.add(NOCONTRACT); - caveatConfigService.updateRMConstraintListAuthority(RM_LIST, "dmartinz", values); - - // Test list of allowed values for caveats - - List allowedValues = AuthenticationUtil.runAs(new RunAsWork>() - { - public List doWork() - { - // get allowed values for given caveat (for current user) - return caveatConfigService.getRMAllowedValues(RM_LIST); - } - }, "dfranco"); - - assertEquals(2, allowedValues.size()); - assertTrue(allowedValues.contains(NOFORN)); - assertTrue(allowedValues.contains(FOUO)); - - - allowedValues = AuthenticationUtil.runAs(new RunAsWork>() - { - public List doWork() - { - // get allowed values for given caveat (for current user) - return caveatConfigService.getRMAllowedValues(RM_LIST); - } - }, "dmartinz"); - - assertEquals(4, allowedValues.size()); - assertTrue(allowedValues.contains(NOFORN)); - assertTrue(allowedValues.contains(NOCONTRACT)); - assertTrue(allowedValues.contains(FOUO)); - assertTrue(allowedValues.contains(FGI)); - - *//** - // - * Now remove the entire list (rma:smList); - *//* - logger.debug("test remove entire list rmc:smList"); - caveatConfigService.deleteRMConstraint(RM_LIST); - - - *//** - * Now add the list again - *//* - logger.debug("test add back rmc:smList"); - caveatConfigService.addRMConstraint(RM_LIST, "my title", new String[0]); - - *//** - * Negative test - add a list that already exists - *//* - logger.debug("try to create duplicate list rmc:smList"); - caveatConfigService.addRMConstraint(RM_LIST, "my title", new String[0]); - - *//** - * Negative test - remove a list that does not exist - *//* - logger.debug("test remove entire list rmc:smList"); - caveatConfigService.deleteRMConstraint(RM_LIST); - try - { - caveatConfigService.deleteRMConstraint(RM_LIST); - fail("unknown constraint should have thrown an exception"); - } - catch (Exception e) - { - // expect to go here - } - - - *//** - * Negative test - add a constraint to property that does not exist - *//* - logger.debug("test property does not exist"); - try - { - caveatConfigService.addRMConstraint("rma:mer", "", new String[0]); - fail("unknown property should have thrown an exception"); - } - catch (Exception e) - { - // expect to go here - } - endTransaction(); - cleanCaveatConfigData(); - } - - private void cleanCaveatConfigData() - { - startNewTransaction(); - - AuthenticationUtil.setFullyAuthenticatedUser(AuthenticationUtil.getAdminUserName()); - - deleteUser("jrangel"); - deleteUser("dmartinz"); - deleteUser("jrogers"); - deleteUser("hmcneil"); - deleteUser("dfranco"); - deleteUser("gsmith"); - deleteUser("eharris"); - deleteUser("bbayless"); - deleteUser("mhouse"); - deleteUser("aly"); - deleteUser("dsandy"); - deleteUser("driggs"); - deleteUser("test1"); - - deleteGroup("Engineering"); - deleteGroup("Finance"); - deleteGroup("test1"); - - caveatConfigService.updateOrCreateCaveatConfig("{}"); // empty config ! - - setComplete(); - endTransaction(); - } - - private void setupCaveatConfigData() - { - startNewTransaction(); - - // Switch to admin - AuthenticationUtil.setFullyAuthenticatedUser(AuthenticationUtil.getAdminUserName()); - - // Create test users/groups (if they do not already exist) - - createUser("jrangel"); - createUser("dmartinz"); - createUser("jrogers"); - createUser("hmcneil"); - createUser("dfranco"); - createUser("gsmith"); - createUser("eharris"); - createUser("bbayless"); - createUser("mhouse"); - createUser("aly"); - createUser("dsandy"); - createUser("driggs"); - createUser("test1"); - - createGroup("Engineering"); - createGroup("Finance"); - createGroup("test1"); - - addToGroup("jrogers", "Engineering"); - addToGroup("dfranco", "Finance"); - - // not in grouo to start with - added later - //addToGroup("gsmith", "Engineering"); - - - //URL url = AbstractContentTransformerTest.class.getClassLoader().getResource("testCaveatConfig2.json"); // from test-resources - //assertNotNull(url); - //File file = new File(url.getFile()); - //assertTrue(file.exists()); - - //caveatConfigService.updateOrCreateCaveatConfig(file); - - setComplete(); - endTransaction(); - } - - protected void createUser(String userName) - { - if (! authenticationService.authenticationExists(userName)) - { - authenticationService.createAuthentication(userName, "PWD".toCharArray()); - } - - if (! personService.personExists(userName)) - { - PropertyMap ppOne = new PropertyMap(4); - ppOne.put(ContentModel.PROP_USERNAME, userName); - ppOne.put(ContentModel.PROP_FIRSTNAME, "firstName"); - ppOne.put(ContentModel.PROP_LASTNAME, "lastName"); - ppOne.put(ContentModel.PROP_EMAIL, "email@email.com"); - ppOne.put(ContentModel.PROP_JOBTITLE, "jobTitle"); - - personService.createPerson(ppOne); - } - } - - protected void deleteUser(String userName) - { - if (personService.personExists(userName)) - { - personService.deletePerson(userName); - } - } - - protected void createGroup(String groupShortName) - { - createGroup(null, groupShortName); - } - - protected void createGroup(String parentGroupShortName, String groupShortName) - { - if (parentGroupShortName != null) - { - String parentGroupFullName = authorityService.getName(AuthorityType.GROUP, parentGroupShortName); - if (!authorityService.authorityExists(parentGroupFullName)) - { - authorityService.createAuthority(AuthorityType.GROUP, groupShortName, groupShortName, null); - authorityService.addAuthority(parentGroupFullName, groupShortName); - } - } - else - { - authorityService.createAuthority(AuthorityType.GROUP, groupShortName, groupShortName, null); - } - } - - protected void deleteGroup(String groupShortName) - { - String groupFullName = authorityService.getName(AuthorityType.GROUP, groupShortName); - if (authorityService.authorityExists(groupFullName)) - { - authorityService.deleteAuthority(groupFullName); - } - } - - protected void addToGroup(String authorityName, String groupShortName) - { - authorityService.addAuthority(authorityService.getName(AuthorityType.GROUP, groupShortName), authorityName); - } - - protected void removeFromGroup(String authorityName, String groupShortName) - { - authorityService.removeAuthority(authorityService.getName(AuthorityType.GROUP, groupShortName), authorityName); - } - -} -*/ \ No newline at end of file From 917dccc66f456e0d11876c2268c3b725161b6fa3 Mon Sep 17 00:00:00 2001 From: cagache Date: Tue, 22 May 2018 10:15:34 +0300 Subject: [PATCH 12/99] changed version from 2.7.1 to 3.0.0 --- pom.xml | 2 +- rm-automation/pom.xml | 2 +- rm-automation/rm-automation-community-rest-api/pom.xml | 2 +- rm-community/pom.xml | 2 +- rm-community/rm-community-repo/pom.xml | 2 +- rm-community/rm-community-rest-api-explorer/pom.xml | 2 +- 6 files changed, 6 insertions(+), 6 deletions(-) diff --git a/pom.xml b/pom.xml index 9c1f9499ae..e91a141ffe 100644 --- a/pom.xml +++ b/pom.xml @@ -4,7 +4,7 @@ org.alfresco alfresco-rm pom - 2.7.1-SNAPSHOT + 3.0.0-SNAPSHOT Alfresco Records Management diff --git a/rm-automation/pom.xml b/rm-automation/pom.xml index 9537d46a7d..1033c353a4 100644 --- a/rm-automation/pom.xml +++ b/rm-automation/pom.xml @@ -8,7 +8,7 @@ org.alfresco alfresco-rm - 2.7.1-SNAPSHOT + 3.0.0-SNAPSHOT diff --git a/rm-automation/rm-automation-community-rest-api/pom.xml b/rm-automation/rm-automation-community-rest-api/pom.xml index 630c15608d..36080c3d8e 100644 --- a/rm-automation/rm-automation-community-rest-api/pom.xml +++ b/rm-automation/rm-automation-community-rest-api/pom.xml @@ -8,7 +8,7 @@ org.alfresco alfresco-rm-automation - 2.7.1-SNAPSHOT + 3.0.0-SNAPSHOT diff --git a/rm-community/pom.xml b/rm-community/pom.xml index af2b7ee9ec..9e3e1d0779 100644 --- a/rm-community/pom.xml +++ b/rm-community/pom.xml @@ -8,7 +8,7 @@ org.alfresco alfresco-rm - 2.7.1-SNAPSHOT + 3.0.0-SNAPSHOT diff --git a/rm-community/rm-community-repo/pom.xml b/rm-community/rm-community-repo/pom.xml index 8de405183e..0f2cb1c749 100644 --- a/rm-community/rm-community-repo/pom.xml +++ b/rm-community/rm-community-repo/pom.xml @@ -9,7 +9,7 @@ org.alfresco alfresco-rm-community - 2.7.1-SNAPSHOT + 3.0.0-SNAPSHOT diff --git a/rm-community/rm-community-rest-api-explorer/pom.xml b/rm-community/rm-community-rest-api-explorer/pom.xml index bb55ff6dd1..cded13c0aa 100644 --- a/rm-community/rm-community-rest-api-explorer/pom.xml +++ b/rm-community/rm-community-rest-api-explorer/pom.xml @@ -7,7 +7,7 @@ org.alfresco alfresco-rm-community - 2.7.1-SNAPSHOT + 3.0.0-SNAPSHOT From 7ec45fc0d37908ce510693781ff13be1548a53f0 Mon Sep 17 00:00:00 2001 From: David Webster Date: Tue, 22 May 2018 12:01:28 +0100 Subject: [PATCH 13/99] Copy version records notes from old architectural map --- rm-community/documentation/README.md | 2 +- .../documentation/versionRecords/README.md | 20 ++++++++++++++++++ .../versionRecords/RecordedVersions.png | Bin 0 -> 66207 bytes 3 files changed, 21 insertions(+), 1 deletion(-) create mode 100644 rm-community/documentation/versionRecords/README.md create mode 100644 rm-community/documentation/versionRecords/RecordedVersions.png diff --git a/rm-community/documentation/README.md b/rm-community/documentation/README.md index b4b7911330..8d2a411bec 100644 --- a/rm-community/documentation/README.md +++ b/rm-community/documentation/README.md @@ -11,7 +11,7 @@ * Easy Access Records * Physical Records * Record Import and Export - * Version Records + * [Version Records](./versionRecords) * Retention * [Destruction](./destruction) * Retention Schedules and Events diff --git a/rm-community/documentation/versionRecords/README.md b/rm-community/documentation/versionRecords/README.md new file mode 100644 index 0000000000..405827ed13 --- /dev/null +++ b/rm-community/documentation/versionRecords/README.md @@ -0,0 +1,20 @@ +## Version Records ![](https://img.shields.io/badge/Document_Level-In_Progress-yellow.svg?style=flat-square) + +### Notes: + +NodesService varies depending on store. Version Service has a different service that hydrates effectively fake nodes (which contain url, version details, associations, aspects, as denormalised meta data) back into a full node + +Recorded Versions take content out of version store and create a record by version store implementation extension. + +Declaring record as version - standard use case is auto declaring or via records. Head version is extracted to a record, rather than a new version being created + +Records are linked by association + +Disposition events can be triggered automatically from versioning events. + +### Diagram: + +![Version Records Primer](./RecordedVersions.png) + + + diff --git a/rm-community/documentation/versionRecords/RecordedVersions.png b/rm-community/documentation/versionRecords/RecordedVersions.png new file mode 100644 index 0000000000000000000000000000000000000000..7ac208b9e243e29f3f87c06643cf46990c9372df GIT binary patch literal 66207 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

V=QH|GV@P>Ps#mJo!&Ipr zo|Eb-RisvK{MTYZ!9<_d2#x*M?j#V9u4NJ(6XU45wY4=@v?ntZBhtO63|Jl?BLZuL zV(k2TjhhBZ!qEso*Ccg_Pe5Q?%GfAlrqvrk&%;ABAavj0J`30&>?{GsGyu$h?|cU{ z=rSc(LLKt=00R5#A&{}0olrpn@y zda$hslQa+IyWKHU4uUvJwPsI`d?^{3Jv(5#sG@(l>uOyT-H`8Ly?Z4Cdp~SW*&`qL zyg*C7cll)$$TNgsiCdx1n;eq%IP>o|BwqD>DkvOn<1wLhAuu~6)Zb$#cV~#X}`2{c;aOMM77TX#c+tgIH#* zY4>{e=+Vo4=+W6(m8!P3HpIg}AV9sKq@)DHV(9x@vhki61`y->^L<);a`Jh-mozj^ zsx&gmC8{v3-8fL?gRkK0R~#ZVgaELX)DFGv&2mVU=#KZt;1hqbZHDyFbJ!Su{AcD+M-L zz#s`Ir_YVZ3eD-!>18Hom2tRQ^d)iD{|`Xi&a%T3ccc4_EpMkbkuUahPUO zus(tlFvqY-%RLvV_x64Sjt%bK%iQXhPU8er6@At073I6@>2v}l(`F=}Ol$xVgjgo& z!)yZ^Q*Q$Ml-et*`l#00?14m}-O9lK@2KwkfzkG0-H7)4%RjQ_PU|=lj+46&iI8c^&;} zqlcd~=I7@Rj*iMyhdJg-N>~}yE07peilXo5wfzGFf5#*zhvCx5P_nb*suXFydG`(( z4FP_^l*-@y*>pG=sA>!f3}trmU(J=b2I`ML_$KdK)G6v6iLF#vnl7khQu%*zCrj!9 zT}~+z0sR@~#?OGL6BhT73A)#4{F&c9Bv4)^wmopPw=}pMC*E8BNEZ#%2j-;<^#F_gB!qMhhx)0_xSk!m$2t8TEFH?)TRJIqC!Eh@8mhuX!! zTVe4G3Has!okrn+_X;TaS^Ci9@r-n>K1?3+W?Ybyx>~7Qq?#&Xq&2Jvd!!by&h7N) z(4p!PhKjC~Kz%UDsSR4u`uhR^zji8J`uynmLNw|2>a@(OX)BU{G86ZpjY1P6uYh?alccy>!3}oSy0PPe0)|f&U zEXli(Tka3WBiHuYMe7CWSsJRK@A0C??Ajk}OXTmC7R;3_ z%TsNKG>P1l1rsf<`(u}LEq>GsPdJ5$ebnX)IzVnZpkRNBD)^!Ed~MwEc^{LVtXR+B z>ty?YL7C!-mC%CXgZ177=Our_)s6d366?jC;^wMLgDHUu3wipOAE+;X(p>SQ-LTOB zb5ceEY>hBTBc)PjBG&o-eZd*wH?o^oIl1Hb{_aaC`(DV^&Rik_;gIA22AGu5ysuUyDOc3ho6s0Q-H^B8J@#e4P|=s@EX zV2Vwd0w)m=bqG$*n+zB9;Ofl1L9H3C^W7Xb+EiyhC3hkNNXh0isLp>ox;U%K5AVa<<<9j9`wZdgiR<1%QD z#g|n7T;_Yf4)>U9TLADi`YPSdKLH{?&a@2Z+}_q!@JNoVhLXIzylSbwzn0WA)6Bxc zf@R~$@cV<~W8b*AxSIwqKzp zi@I_kxCr;)lL*T2@UW$V1a7r%c5zR3y4Kc^%b>Y2RaQ+$PMs)EIC_ zPxxg27Te0?O)!4WK`aalttLls2w<4x)fB#WT=+iUn!#F;5drvCl_*~L}q zd>q@9yDXMOW?Ek7R1uxckb}4HOI~r|yS!x@7s0oXkH!yuiF>=abWKl%b7WI&D_m82 zgo4p1AVOZ7b4niglENfIj77`GuEcDa$B#J$a@h3AhNKdiS842GON>Js)8?~OmT$GJ z7ZSZ!yC#eX`EdAje+IDG<|3_56wRPC49pl}Q5BPKH7R#rRKakll|ZU_3QCYZ2bsjD z{b_VMwLauD?gy4i(~nC^vZy|wWn&vEdi=Gql{#-)hQ+WH*m9XGMgp>zQ>Eh!MyNM@ z@3_#RJ+h2G%1A$VPiIO!W|S>82|o|o!heHOQ&LjFJ4q8h5(d5vvN&0;;7# zgDG_0N)MShOB=Wr`LJX+lK5T>*x3qLpu;_3LKp~Xm!R%pmp-U-;up0ZZ?M z#}C~3di4{!Pg0&D=W@zOjh1z`MBaeJ2k%D%oErz<%v>!U36yK|+4$}dLsQ<+Rahkc zIO}03cDUqu*AmB37Mup=@>BTTVF!La>}Yh{7Hg-E(2aP55^{ZA9TZwhleUl+5|n=pCGotZR(^i%;f18VV^eg%YHT_hkL6Uk6erxN|6*WN zgnf+?g(R)!u0H$#zX97L^})Ph-9-cf26^QaOeh*H-)qcNda_ROl$adag#F)Rlr%k< zJ{uyL_}m{L^!NHN-A6@BIGg8}so$liR9F<8-1zwT)VU|~XnpA@)2bwWx3#hYAM-=c zqvHMoa&PMBHd4zFF1TaLR2%!U5M)x!3C%n`;!~HEMLCyE;d`l~pzzgw1~^ws+%J!m zi*?j@it=C;8-9C96+2Cq=&=$NUC#!a3tu>{snYTD6SK|gTex3TK zL6KuUvQ)a($WA<)fp{DQH^-E3zx$P&47741+R&`0yfItxy<(+XNUiQ1wiCoEud0dw zpvNEWmGGrtG+)o{uYQHA%a*3gY`*{9eDnTzz`)$xJcqn3L8QJX%xEx=W<^&oloJ}( zA(@cn@4EX*v$#H_CKAr?O=!u=;+q${Gob=*;NK*%FGw4MhRe_x?d1(x_jU%k@9Z|a zv<%XbCqqy>x>#jRu9_iUrmEayay~28E+PW2$W`_wGY&Z7V-$w5&YoE>58|P7jNp(I zvr(Dbjkl?+MV#CJiB9;k>hkd`*W7evRJnTRR+Gg?&ZkbF$7#^I_BQ1& zE;Yk6Y=77uIw%J2b*)VD*t1^MUsJC(%Gw?_Ip+VEp|6O7!*N4&8a5Sl^OqPN)pkRW zJe%!(GtKCe90&Lj!xeq8cee}ojbq()*(rt^0gejqlCB(L+5N#vCb6Ou4NL89Gy7Qq zBKa7dEonP)(RGjJeP~`4hP0VgX|o|y^-sYPba3Lid9DuWTETi zG2HA%*7r%dh~jzn+q5k=coP=!O~1!-`3Q@JxE-vsppaU1^!b|xGrv^qjxK_qqH8{p zs2Qam20X7^P_rkNL%J;ii-Dbqe|v1xte*zIy*ZjdfA(6e^t15DPLhz9;DQa+)3gjG zUq_8XiK&sq?CSCHanVBM-vc@*+nGX1*{yN?8>BNrqSZB=Pbt#EqhHO4 zmhwJJ%~AOJsw^L1jvb9Em!7>UTUMboECFfWzS5IFF{x1j6bzBy9l` z_$TZ<_smQ}Ou#LI&)jt41)r;dz3MptcPf)>(fEUnnw8;Z#v+0MU7m0uZT+O(%w9nKV{6?f_tg3sMuMy};6ZLlp>KTU(p+M9a_Vy6Wwq z(OF+w?g-_|+wXt5k|GZW7(VcM3KVL22#UsK+#LM|`y-vcy|4rK^9gX#(Y>3u6hVRB z9Rvz>7fYwEo3-(#^p|5lg+)n@Kp_|^nls>t@dEa{wGG;*k6&x%+yb>v#73JK3ap?_8kv6LP0WovZXbQ=KuEm$c zho48n0WkKT#H_@i!1ZqV(S#WXu^$kFReIjKzM!G0{xLhNSu6Gaec_MfbOx&i=+jj0ILSApl*a!cBi znAW7Cr~fgBf{Ge-ucL0l@)rtr)0mf+2MYiJKyAX78U=a7Mw2?{d?;k9JSuX4Yn^YLU^AMTC z0HS|eMUk1Fvl%-g6_s0LYb`L>m&fZ6uN#B>nP=0EFmMO>0I!5iYCQ}`Ym&|w;@F3q z8B=feZ0vvmX{S9vWt0+NPSv<_laop7Rm8+b30*@I!UTZ!7x{1Bb*-+&=@y9J$7TFb_ZM^p>+uz?1~3*dPau>(*XU%|=A$tM-3oK30chEDl9&7Ncg@I+m7 z@AtEqJhe0X@cDk^=F)bksH(@^><1ztZn%I4`-j#5PZu{A(<~&!Ykv5lf)n73>d@M!UcM8`dV9+8qp==zn8v zZb$zOYm1_>(+8IJKj6Pq{{IU9ovr>G{%fQb5Fooh)wzF3ao*l8MvevRzQ4gg-ZcTz zcHPQaw-8xq@^BG`nG{}xfXlzIL9GD>1_p~J@`E~Iz2rVvXDSwO4ow(AipCptu7o5gNZL@M@lRVmzH5K*Ed5GqlF%&tmWO6DlPjMlP?w z^Uofisc2|0+|&8neWzW%+(@&=pMGaCtE8f`(&CHw@Eq2?RA*G}AA%6eqS35j^bQ{_ z-kPojok*Wj8rju$VDZ2}(jAxPtFdBr$B&tFhUMkuYhUkDye`Ye&a;}U5JzYLMvqZp z7flfU0;TIRp1WOTKNmG&m=Lwm-IIoMql6R*ksxOqCVY)^_fUm455p#QjB>$7438a^ zaFVpXj+&TfH8j)fYz+2X2E!*FHQD>=6mX@)3sz|nQ;1$-Gl3lQf&m?({6h;$h=uRH zF3`v!Q~CO~N9s?*_&tIo-;_~nt?k4v@;>=&(4}vgV~&P!s#1x(UqM8c;E#jglqvU5 zWxTBNqxOBBwmoH5qyb=!`cU0iQIwn9|o5e8(O z?IH6P*xAqIllgJgPkDB)hQtLZO5s#SAj>nLQvlCtx65pXBIvctXb!1R8q|XPTG(n- zCzjuvA7PPE{xs-#_HmN7BELQ*JR_$#y)0+l_?h){+aCzi9W?Uu>ul&ko<72FejYp} zDe<^gwp1<0T4{WmJF6|K|Jv}UUYnR36e<@oHNgygVny_zQ2W40l7MZh7xK!zhTZN zDq30*=B!B1tC`_I`)vb{95p)F5bHp#V|wi_{K|C`z4~ys+WNae=GyF*0BzBXCS-L2`E-^8w z=YZ>zJ_Hb8oP{lgiH)jlSHv&l1us{lj?%oYM$%S=?x72Jg=4vO3-@>D7sqM$VP3Zr zUNP|X*)y`K{K$>-iM5FcHy6KDb1Tcg0M7WvrdLoGQ6VvZiy#t45-n?`|8AYokyCLyDkGP#Kn(K%(hKVK8o}t?E zIFQDsF$N4dq*XW1`q9C2Y*N?gAMET?pQ>|;jd&1vl83O_8z&*LDX|*?`tx91s z+wI+wKk8!^`+)47R4=5h)$r78f?flH^&#PDAs-SlH?el8sx89O9vmE3szl+5zdrBl z*jiB{V&5CS5vPxH!s9JW&L+R83W5Z^do7HP41!~LCpm0MMdJFqoOQTs!l(U`e@JP* z5ASSX)3!M!4}P}4Ckig*u#*!rIzwn6#tC#E@eMkyK3vPDBl@-l-{Q!s?Inai@#F0! zkvlmbg1rIQV8loGqQ+I+mdu_!Y+y-z%(4oi>2DxkA->dFi8JDU6acN>qK#hn782rMGOj+b~I_PHeq$ zQ8wg!tcc($Hd<~;JpGFTK+gYiRDn|nmTK8uff?!{P&Mccvzg%>P&G$`_nSq1>O~J6|=T{mCyCL;A|6NPVvGU@fyTY-*rmY4R8S}8HP#>NL%*m znfPtB>c%VG$q0sAy2-#_>YQ*Q86_(jn5@<{1oUY(hS6MeIa`i3VLuyA*;GLukDd(R z^C&WNJ+UD-M@z&FPnnr`?oh+67Sl7Yh$Qdc2)3e^E8;{k`36(3Eh+(1i@;OgccB%zH4G>|)c`g{X+rQL>F)PCYI3 zlpK9O@^_GnDn&WLi1hhV?J`=A^uFR)mgh4 zSEm+&Rn3=u)~ka>P*<=*{CPXBZ1)(4w9D8JrHiYb;zBRo6)V!zbbmfmp-&$-o=@v| zZ}hMnzIS;=#jkXL_P#~h>`8*Du$m0otL;%DvZQ}gG^Nw0$VP5WzddV&yOv27^?dWV zp917P`WqkXbV0W;)Ehf{|M$!);^`uKx7#2V_OnkfmmLcc6mhKq9LFJT&)(+1wUU%_ zi^Vb^ZIB{z$}ya}n}euPpF$@2x5S$k7gErdkl*2`BhOGVb<5O46Ml6tiH8N}{<_7w z^C6rU&CSB|E#(PB41DUiOI{qnXTyHfLjp!FYK-*hXo8!K%UqH9 z#Nqx_r{K2E)-b*FiG*=d#A&Y~UNt&28Bc{x-oPwgjYS0)I1#M>VrAR-@$C$AYi zTjCf5o}-0`Yok*GnLsr#GISMkH{PP9+v}9OEI~^5=xnCl-U0!WVT8Wd3Rg?NEd2;4FA!C+=V}HR1ss*xdQXa zLSM~+jWhg@Vv4SSskTLC4nHw+-0|hrKE5Ewje}JFRwfb&LeumVx09v*!T|U7CrAeo z{cnmK(mXY6N)H9Ys|7nghGV=RW}plitMPP)H^#INq!hqxfyW(BZSUjTia?{C1Yw)c z@snEBzqGu4>CW-N`}(`pB)=MZU$m^PqK;3rS|V6SBTaBmH7V9ljhIP9Q6o%{efI5M zD$)nyT&oK{tw$n4wcd6^L9Osn(vU{9Eq^oBZ(~){lWh-FG?F3S+MqM+#p*SEgN@-J zjWij5@#-fzMOpFW#kU4?T>>~=LYV%_?6|+AkyD&0%(7Q(Q4SAa%%E?++|B!_Y+; zvLLcJ3*N+dS6G40zZ2Xk9z6Q#EJCl zT}J@;qnKlCSH0n#A2ns$SKVsE_@Nru3P18qK5%hRI-}w7yBi|TC*cS_uB2d{jafFT zZI>z(DF3`n`(-GhZK+j?5Ks^3$)yE?c$$O&ChzI%e{P-EX6g`TDyr7rpc28Oipkg{ zMF4fp4#iXsPd>eqJH=+@JCkb5We~+yAaoWzNcK~*OEJnf{h;&^ghN_b9NcA zg@M>bTA;8q#Z;>+(BQfVf?ZDk1b&R~3A7%=Lz+N&o0v-^mr3#`9wEMiZ#Jdnk^`DO z`>n?f#;TC>i6Du1o(mPdtaaTr1Unbpad7~hJheqr_DAzmC-n1}kiI_`36TNt8smBz>sFilWF4A?2-cqS z9AnC2E}eEKgg3xVL*(`P86~>WBu|>1z9@Y%#aL*{EfRgxidU2CK*aG94K)YTH)(5s z#c6fr^Bq;y1@b{izr}7c@fQkQUA`vy?h%z`_Yag6)6bFS;=QSJUPnfPA8CwRiLP70 zwM0DJ-#;=EH{*5fPuhZT4h3H?JPTAy)3#1{@@f9GjZ)yG6!85ME8LMiKYJ&T{#BdtP+5Ds2 zIYroFOyHqt<>Ts+`PRwWUl&ssB^fur*JMlS+bN2ORW2gXJFYTOX=C{M0xTwlJV=#I zVny&yX$9+X^$hrz^y`|pA_F6J=p84*AhS7mtbPd0ZxT5WKi)iz6Vmd>@=`I?^kCz1 z5ctX*omgi@WzPJm&F?2>%rE)ht@_UOL#)TPZk+?JalmMi5gm18lQA?+&1JED2iS4qEIg+|9?ks?Ey&#HZV)bzJSXjj1`Ds7?@z^hb)xRNE1&`Q zMZ%qSPDs86Hl;-!eVi^q7+8y?%V_kLc++EZ{hdQ2;q@v}`i?9W?2QA!S;0AvOAIhR zo&sEl+=&Oc=`UDeDy{;4HwEOh+U(}+91jgUfzA*<1FrAf+Ygm#Apc@ICQ~nP?vS}L za(B!zI?+O@?#2!AOjp(NKAB^4b`pQ&(DXafbD|p;3bcH;oyv4=03F{wE+=CP%I#i_ z4PQq#{mf=7;|&)7IJL^c-HOWJA>JtGg7WDY=-{=$*_AcL7)Zd>!Ew{kE2CvAh)2PJ-@i=s=L4RAxLX3)^1e4Bc^(f_7o9odF%7@5o+7j zK>7e82tM{&4uNRCCw~5fjBnDSZ`PL6T4Wk}dWw+#5&F@@*g|7a#^FA-`w&h+u=HDP z`S6=^s#ufdxuKTHWUWtE)#TN(h2px4uU5y1x-Co96YJ&ujUpiZNF?^U3_ZLSS)OocsB!=&pl*j4`r0YTdH&K*rBmY(9Yd3gp z^kC7Ztv6vYDmI%?Y#YVAZ-1wViSacqnYcd02RW?>b#CYR4lVRyzRAa2QRf^8N!8CE z?B}OOA)1c#dBBJNhK!Q$FVpVL@TWPYLu0mqYR~+_VuqiCdcv{>^F(b*77@N0*S#Ss zLEAbHV@-wxRAW&BcVI3ns_x~8P^3_F%BJ|We4@{t^~H88#p$fuk&HLK5=>(y{V)?j zNr;cYDAQ&IuUix6+ZV+lcZ%6^owraeG^X^A00dj#jF_Ms^j^omX&Xo1S94I}zeXT3 z+WGR+oYRCO^Wkr9Ok8N2u8`rz_Tq_3(Myw5C{4W|oet8vYnTbkFLRhygxZ!BpsD2} zirAzD1;vw1mc1sLr)PTQ>5k9&HvD`_!dv!0%5wUGK>WRh_1+b>=6b0~JOH2|)*Mao zi2c~!BEJgF!*!5S|A$7z>T zB(bojG%96za{iL%^j5ETFqiH59(^Lh!C1mxm&8F!Sl_Si-ue&{mGUpnn+&r**caE+ zv2q==_pjxrk<~-heuXFX1SxfUE>QSP@Fg=u?4HY3=xw`Z$W!^s+j7xAYwVmW8HXxVZXt;Wp9_P|8o(~Aa_%1=*Uqd@diWx|mu z?!EcwO4yU>dsOggjo+-J~>K#(DNJ&ssD`85zYVEKKL68B8FT>VX3NJC?#zEt&O%SgZNn1{kw zxR5|pgqv!qo6gWUa|uw%Ovbv9T)9cGspPjLrE$yH$8e2xt47@U2pPZaFi^3?BM7te zT|CDq>p=%1sK@47PnvS;AjR{j-ny;=pUVlU9aHElt;feUnNh4E1pObk%G2*l6U2vG2xJ&y~ zVL5V;`fGG*eonc(YXh4DDbl-i;(!?mRFEsOG+OQ3_)WoET{2g^vxOSN}{wbTP zy_^f~kXp4u78yL-Kd>oRhVN+-3W4T}u(b@}`+V~q*pzEeX8N4I4p)UJ-JYEs2qF)4 ze0!n4qZxKKEV99ir`T#>n|<)P!EN`pppuB&5wobLzFoUx!yqP-KO;}HXral+l*MDRAUo7^D14M4o_f!%fT@3hBiuUL>4 zGN0HG0_3+}$5g^X(DJ7Vk@`b4=zn5nK(Zm1fiIEV;$IpaTUSOpl7F1busn<7Q||BI zx?ne5{T&EC{MG-G6S{4~&hYrq);4HI49e?*u2ks58vxE^M1zw0sd{0$yi3Ajqaj*> zgU6n<;3SV)&Lgc2EJp*mY0^?mPi)*@THnL$*RJw~1s{E7U zSuubC-|v||cRV1pu&qu?Lh_qC3K(G^Hwy$-A*trtB(@B;<~v;z0nfLVd3QDVRqt30 zY&M*MWMC>lYwXf5jn?{`(K}d#YtCZXBG;n5|855mdtabX?DGWT2tYuvtY^7|Y0k(N zc`Z464R8?vfX?DgH~K4PcM(q6+{~PrF%2 zpTbl+RSho?5D}}dRe}3C*Gb+Rmv-$1p#uev!FC4CzKfq|ee1Q2m@ATa?Oy>#S5_ap zlw2WW?gnF*A5AY%r;|Ojm`h$K&Niq6@$_U(cBPMNBbWLfvub$05 z82h#~8r0GmxiTYQ3z?d)09eAZhJmLdisT+`4-Zxb8J1h;YB)QW`a?kPPVIf_#L{?z z1Eh+by#ahrlxr5BeEJuecZ5&9QjTq4_&vEEbHz-vSF;jO7ANaH6Zr1#th!l1;eVv3 zb6T~e{?F|6ei%D_4oJkSxj^?T|L$Z0>K;EoKR}un1qE8xfP_tHoZxy9oS2cOJn%V5 zZA_d1-gc&Lp)ABQZ@$s>u!GR{X!YG6x_E!U#GN+!AHw|7Pk$g<@m;pXR`-lQ9Ks3l@J#VQ*M8iZ{48ZF~T|!h;KGr;uJ_AES zz?Cr2`3H+=77(pZq_E-lqyg_$lN_yCmnDRN(sdGNzvxq&Kh1E?)WFm_1J z?X0>$&u`Ps9fdNm?%{K~rxgK_XDszpG&vHm$10rh_6!y!O?W2761O0FAt3$+&LO&} z+C`Z<=_?^uch(B~_5e4`K=9jl#Z!4Jiy`MtMQbFM5p=0}adO}c!~9Vbe-Cu7pJHX?|( zLyiyo)^J8omr-{=0dESxhc@3??rL!2i}GtO@fttoBD*AC>pW|&IvRfCCwt(3A5W)x zp!d3orMd{!>{Fy0l>)*RX-vPg2?~^)-Q0aE?~_RwmBypKPaqaUSh z9xqZ60>|6g%R&R1LX)n=y+hzEczgmjrD0Rn7M;$18qZN9G^%Aj%ROpF%E;7&mhbaeF@{fd5(aT0L&J@P{%`@3# zAto+v1>h!_*qjpqi{TNhSVg9uW(nfT805XFia+~r$8g0jR|Y*1{ImQ1fF2R(7Ok|# zqZC&Teddqc4b7b*yJ-ahJ3`H3m6KOIMulg7i;Zy4jvnJ2z8|M|&X>^Lz;9IgEbOMZ z4^tf2X3j-sbR|winN68$SDNDk$~>F(-e=dE*JNB3xVHP7nx;>^8frg*^jE<877j0B z2Z#{3V^GM`>1xJ8+fGlWB5m*k^t$jPp1q)=GTNc70eM_;V19|xXPI~m*oH8ZXnp4d z->cWS)jMuyV`t-%AdjKA$v9_nba=v(8aHO*6%IIrj@1k$Jd=O({P{Wbjb16&{9x0w z{@mdh+xrwwEE5eVvhprtH#4skxI?Fqz~|GHDR6toeHbA2{r$4gTIJ(M!+MM6TDuf) zCtQUuv9ZQce2Fzr**%m1ZnzYr-xo+G&~-2gj&-=sen>`6`Coj!XF!wN(l(48MZg9~ zSJ{Ywf=cfQ0&bMv0|60%(3^w~7K&1pUZjLxLkl$o1XQGV0-;2tm(U>+1l|?g`<#8w zdA=_{_(AThdzG2BW@cU2jQ9n#FG}I*P2s|Ou^)|2HJ7&1%JSr3o zs6sJ4QK{R$n}O%!bE) z2Q&PBfW9!4YURP6ynCm*0+DP1Kc{Rf9%)F%w2ca)(5aOakk0cg_5Jrz1z)!@{RoXS zrhcZ)kCsSi1}DJ-AAf$xYoXG-Z@kvMiWmNe1h8Hu`?ZZ%bZdvwV>)HXizU|kW7s9k z*5fo5+eA?s#N#=$x?<)rMLRiF9U))wi(%LkMroQ0-wFNfuiMz~F_8J3AIzRQ65UPz zk_ti~oI07MSj6pmL%QW`+ix`#m%IW%>Lz#3tz>sa6C>^5z!lD=-P8h9xHdRaMAI?l+$A0YCMaB)+Ms@FV?fcr z#-d2FVpu))P5e9YT&0#D%FydHPjuy(>(0n1H*{XKS=$^D^w!a*mT$e-(QAE=x2AeB zP9}TFVQ25)Lfz1$(d1ttBkN}VR{(sTk{4jn_TY-Jw9~#D^CYi32kEHDy|ZLvW8?W1 z;0?`bRM7*MBB*>j zNN1t>w12m!>+NgIRLtd>GmS3S`+}LXm16u# zFG(+6A5JuJSpNX3@#2JZJ$)ZMcmS1F)m-BYvwfEP=~?Nrj;8E>rwD#n66N9_cFR|6 zU--r1ySMGdvSAZ1Yx6G|iPbVSpSqLHR(m#MQd0Q*-SY4h5M)YGYqSkJEs*qDY}f6< z%q{NXHwS%6S2K5-V`mqN`Yax8&IoPM%=v{M-Kwq%8QD-Xl#J-Xw(F?-h*WI)sRfpA zq5!g!Z0#-P^{lXI%2!AYxvw5Rpt&vN<^@QQbF-q!qJy7mL>;r*>>HEGxf$*vZ4k)| zn1fxdCxdz4#h=kkgdAKb$UYPA8#s6svn!eZ@Psly%a>9r;!Iau=^w1^r_VVuR-7FD zA@fO){TQ1|(Wpv~E`l|Os!YGKAeMvM$J=|_6`v?<1@rLg#~#l49ask0v{u}<8W-~_ zvf?U=!}fZ5YF7I#4sh2*MjoVs3)1lX4y;TUro0=K(Xy+CUrb!g)6TjdrR>C?UH$EQ zR`uO0(dTO}AzmJ5y>=x{^uE6eeay?W;}>6*n4f%pQJwzSMaqJE767^YfU@nz`Mn$0 z-(4tkC2p?vU%z*DA@gjqqxi0GzVE3&lKaOURNYdElThK^`kjNlRhu85-^HXf)C@rl z_CcX$;=YwM9$=xr%{UM4m&^FeqnWMvc{?Udmb!KI*&BTn41>hXS8J4Wg2Qb_E(eB& zn^ipD_bl>Qg%%lO+NyRY6A4Pu$x+#H&4k7B#Q}m1bzD7kL@S);uxFB2Lhyda9)^xf z`?+s?Ez%nM6E=e8$F8@}-jWOow8KD{c51qp_FvJ6opz|(XPnY_@bz{@g@TpEX#^`p z+WINCSs@xqf-KB3uZQoRBuc!xa@NU{cdB;L>{%Bk5Z)X_OC0}t{_BeBJES=hi?T%X z;25)Y#{;>Ynh|{p%~B#;Gj;V$CBK&XXkteYd+@kfDg2+E88}{h+-cStw&6s-M%=4N z?!+*+=UP6hgraWl*4gMeQlhGz>Y)9tgV)>YV^WprO-*vi(muE<30r__C6^N0Z96~T zCY*Km@Ss2S0QJiwJ2P`^)Y6YK2reR%kXy1r&E@-(R1xhiMmT{wF#5ok9jeRA0hl?^ zY+860x0Gv0Y&zr zh6pY1RN=Bw9PHN$uQPNMc~Ld!V8;}s3$H>hUoE1qbd*|`i=^*<+|yrle%0lj`j2CB z5)`si=T|z4-}KPLQW4I@RAlDdu%&jKv`6*5wPVmR?2v=$$p^?}(DI%1b2;aSfTo!m zwS==4?0XdC4zIHdS!*Xpn4SJ(n{_N9V|S5P@_x?FkmXD5)FiR^B!#r~4Ti1&YnUY{ z$JguNyP2fSvD5~SEV??BV7~I%r#p53;9x3e(D9C%OfFcVGg&k~^#)q0cVAz{{mIES zG@no}P{Cj2yjN4a+*hsY1o6Vn81hXv)e9v`nU*|DXDu5^D(HX7jq|>NcT4`xEm@3d z=i)|cMc=?l6_x(UKL1E{0pn%Qf(;TloiG2q8nVrjlXWP$WXLtB<)|OBw>|hP^c)9n zTui)fmUBC_vLHbUBK1Sb>M3y&=l!*lik?E&@r;~=pgL@BO4GNiBJGYUp%^)Hs*;Zx zk$f1g7ShPO?drS6)jDAVvXRUcu~AZ#?AQouo1o464XLO?%&X#%hSsNDXH(6!Oxv?h z9DJ(-KbTKW^_?glB=YI3T%wD)FmQ~5 ziQPr{b|ZA^0gU1JA{)+t3IW|tPH9m@V%L+lH}|#}YEOy3M%qG>YUrZ|PrULn=%zpi zYHMpRVAin>2NnEz2@o2I^L z8d6akdp@e6E{Rsvq9l-+EW2!G?Xh>r1OLfn7m64M)e5|mRN@iiWcDlGWv!@_{&T=E zC4quM_U=!r6*iCQi?7iaWXTIw>1A8L!&UjA=mFmt>tZPC+4fpWW|Q>8cF#{wX($TXCtWt7rnCnCU8k^FuQE6zCw$+a+vE86?6v5J6SlvoS^ftUpJ zbPYXw8|xFpOZ0KSN@T(fZhySHS_R78)r+{5-&FlLUr^?kq-D@a0(Hl~6R*xfG+xDe z?2)tZ))`RH_g|4ilSu4yvhorw_^L%~b(yEiTQkfWN1f0-c#S5P$lM647TB|yZSVsp zKui!E6ivj=rTQ7;irvswpHDvoGqYmO5xm(_=Izq6R9-gxHl0a9ye=(+h0p?q58TR4bsjId>L(#7(1)Z+-S=&y-$i8?tMnqF=+~MO z!kkO11lyyIJUe(Tv1tRUT@&~BL3zx812Ve#mlvoCoi({~LJqB7=SX`ORi2m)F#K$K z_4f1=_``r|Y!4C;iCD6-vq|~3wS|n!F*>dezh1@emYcWS6N!rl9L5U3Gr5WEJuHS8HJI(-t3p z6)?Ga9jQZm_^$Aeoh4jIdm03%a1`lqTu}oT{Hzj^mq8+~-%@_^L;Fl$oQbai;Zq2x z(b-ZjQlNB~ZXIHGlYnU&~xzm!Wv@6xm{^ zudjcw%Bxqu*=d|F{sU>73H@SKHk<7a)AxrX+$Y%_VRM=X+Xc0r6~0U8x~7-H2B7eu zJD9>1E`g5%Ipvper~dAbfo7j%h4nrco@vrNV=4c%+iWUXCfbWf7i}){X-6E5=>(uw zsT(}@yj6FdZ!Aogsg!U7-2%CQV12pwu7~e!>OOgOuDzw_Gt%dd=Vdm~gF0HOMhG3+ zuiQif7Cuw)v5UBX9|2ynh;gB;&l1ebKQOyVj68WW9v5&zlHl|mX2T!Z zEiV%yv8cd)5^J*B~Odr;5n6Iu9z z8CLw^lOzuG@WJ$b67+4r$b;r?e#ic1;D>YvE?=Evq zxQs8E-OZ65(k2%twl4bWC>_rrJ3wn*`Od@X5saalm;In~0|5=1z75P53b`JT8N@qv zj!Y}bCt%~zUt?9?6+tfFe3EwTEWxoGksQanYC^hiR|O~Fbc!qX`kQNw)c2;Yqsmob z*m|Em#mnL9SIo!DMhW!+VVz9EwpYP)IzopF=Q!+!_V;n<1$HI-bw(NrSxRxIAN~hq zZYZtP*84yj)_jmhfcxgnY{^^!rODl7b8MX$^&?o&Q-8RwJb8>O_Mn95fIc9k5sirA z3fS}4S1USb3loDWZobH`#GBvkVsLQ@NVMKr9*Hf!XZCdfQX!@00_{k&{`B&g=ky09 zZ$e6Bq#Vr6tu)!WOqkc|SGi}co5ObHlkLGzANo<&cm=wRW1we`Bs{lrSJhmUhQTRl z{QDHHx2Yx+sT`}9hd)hnK@92=HaaDkw`4mh(A1PkqfP7QPNes{d`Qg1m)>8`W z-zUXC+NQ{5ML;R9q2!?#amPw-kQbRE4gObSzOV51OJHM2_)77Vkxm{Bwt>jg$G{W$ zOa1*PhuoB4ma7FK(!+UBG(13?;BHxmWA=wrla7O3;pqdi{-tqyEM&#;Y`s}326jcS zSH5l$L?<5{K@(NM5fR1Yv|rrCrDiR<`P^FB+WEm%)Nsx}{?N|9V_2!34@6Zj9}wG= zU6+STmBI0-gIC4)?rqh17p^vaeGns$R@5?0REFslg8}PbB&!Kbx#L2$X-3A86k7vp5?h*+QOrAw>*$s*}71hoQIHCXK+;J=l3@;JbZje z%>-4MtEB%m%{|c|ZxZ4c?o95tk0e95 zJz#9kc1cUATsbGnQ&+7QG9|&=G(>q^!VBezDSKcb7Ft%|@Gp@NQXu3)sWkncD3I0u6%A{8>2-aoUW;yqnf{p=dm zZC&W|((Ckwg?5t)1LPg8z~tiv@+SH@ zg*FWO?AbHwnh>Q^K@0_!(ehnu!c1EePITB8ce|<0Z@WX}CnWMBt;1b8%wDCiZKS9U zl`UlK^{HZpE$iS$FYr#GOAEz$*b-`SotdkgmeM_MjkTiTotLBG>to+~UgreOW1<>y zh`u5hLy+qNr4}=FHq0gChihrg&LpdkC;dbJ7}dVTNb}#lZdg6q`oAJ)dsLlGWD3o@ z6J&Bj8QtVNa{kLS0@c1*$B30C5B zieHv~0M(fo$>Bo1iBZ**Lw_f$%Qn%6yhHR1pSpze!Q@7T&N}d9eEuj*%9`C-D8R-Q z_Y}Ml&+~XLvF+trt~%@G-ET(Q;iK%-UZ(BNA@5@Lv3?47!_#V^_xKEJd_m5SSnh%~ z_{L0|#!z-b@ao_LyV~=;TVYBuOFO>1OA3p&4;MN^t(&CPQl$TU8`*1`LbDq_rD2b2 z55CW)=dAl-x;{_93u`lJb6F6s899`dsvR!&wEJVNL_@LXmxfFY%qY+OvZPtdv4OBC zZe^ws=p7Eo!aGFq66S=SH^-!;2n}pS%Lx(-5?Sm8hGP!XpWU!46En=i`qPO!4q~s8 zobB1SeSB(k>%<==Co1Jb8}ur6pZf}NTpAZgiy32XuJp!4mXq$*qZR)s?)%j%H6VTi zqV}1;ufBk<-Iy%XgThZP!@fnKYA4fv3$-8q$YKhE0<+^s*Zp)0lAHuFi*_rtxekLE zI*|=Ks9O)FE-%2gIm|el418^*5o;l6*tZJdNpKoNmoJ@9dPO|=pkpAhz?>+db^B*i z)f*Qx3_e0L)!!pgpb~u}v{Je4wsvbN=i;-6x7KA{IkqHgYgSz=HYRpDLyvn%j^M<^ zjTD#fv+~#EWjx;F9@`sEH#-eej~H?mEH5x?vWMQT&7@6n`pM=t+E~o%v3sVi&e>>n ztAsay_4yr0t!xyj;)AK5QF%k%b?lcgre#O#u@sh>WgndgMvX-YF@wkSs=Y6Dg~j%e zJ?pPSsv<_7C@vjKyziItwIvX^?^*R24nN-BIEROA^JNcP&e2-yhV%*3Mlj|XvvRJkF)C@WLhLOMwCq!W4($!MZ2Q#7RIsP2Mew%#R4k5{7dPn@eC9GX-W3$p8_!`EMB8<)JRMF@-aG&?lF-wU&M zur{$Wn};aZeGGqqb3`oOWa1<}Q>+e+&zjil9$1DYr3V&cxn2CziC#ersHk2^jWfZ8 z9?)O&84>?~ipy%)Hxtye(xxl5>c}HKgClUKaf-jcs==g4mpWK`01v=?oE^1IhaCzA zFss2v2t6yywFhNEm_iiuE{^Ew!WhA|^uB)C~K7lIW(Qa9@X!LzU%td zPbtVn$~hI9bFgz4^Q-sRentkAK+mQz@?A`AM>Wh@eCyZjZJ(dsGiI?YkF+0ps2gZ} z*ijQuI?0E9moBetZKo}oZO9;eKC+ns2C>YA79pU7W*`mf(ws~~J?g2Gb)x$m$}L!o^F@qm%*Wou zoaJ*#(R?lx2}|mc5XR(+`K7*|m5#)m=d?+gTS+y_$=~-Aj@h^l=_CqWF`3Bj{UBT+ zBoZ&WQ(4QTk+_?6_`T89xyJKqR)oazs-f!_g2qG(KTn-OJc$cAxVJPkk8#tp0R%fp zg=faj!BU;W=Z|K?x=@T1WtY#654CNtUP1jGP16+xR(zGVJO?XN$-zhEuEJieox3W^ z5(NYfOhiTZx#U|LKXFrw$o1e#H|)k#Tt!jeJt>}H2?f&~V~A^h+an1zgtV8Ckz#iY zsdBz#R>mTCdrW=?F}~oo=RRstc97uE*|YNM3|n=%nnOiTm#cGtr@NmON2N)@g&Q@l z=Ixu#o_^fC4b*+BIYbwGRHex>6w6{zwMYC@%PW$IL!Iu;}y8lA05+3T@cJDt*EK6PwQcZBiX5V~IR;#1Vz*Xx`_$F>nM1~Xd4?(6Ch9hP7web_uOvdo$>{o?%KY`cy;`rM>N@5MW|mbvDd zvxJ_mtioxU`{|av<)6XP{0(54k_Up>;P{@F)ixa7RnaD;vVFbdCbY2odF$oOq5vuC z1_dW*l?NZQv-pcmb2+pk@FQLV_zAGLvNLCUx-yveE)O<}q<11{qWWJDW=-#`V6j!3 z`TUSILK;qQKbA%J)n4sR*L>E4f{1qP9`VY&iPtQ*bas}w3cf%fwM)JDL4oU7)vr;N zULN7b%$G7gjCK`F|DXvAW6diP3cNkh5?iCbPr5UtN2i!m<6Pgn z^F@mepObv!yu4|V8C`0fnjZ9&cwKcWsjIuEvn!2@!Z9Gn23e;n#ECvcQg#z)W$~Q zHSo8dm_(#4mXpAO*W#%Bh)#BmUb#JL)}#t`Hk=#F6+#vG*t^QRER4E&wym&a7ge=r z#eURBuI$_m8*@@&Q!A~PD1)|J-h?gtFF+C_^Fr!Pq7CONL$!$yrnY~4=L@EB$e1+j z&YNFkfQWgdi9b}#+t->xInEI-+OCx2Sn!W86OBHMdUZTb?ZSQ%rV$djF|aU_puBF! zzPz91d$o9lBeKH!0JaTdMa*;ksDR;hbR;JDZ?&wayfily#EWY+(|@6>yx&z&+v$QZ zvJ~O1$37%*M^sV0klwdbVHwbgs8}jupwC&7L*(?yMe9-$@{^jwYB|WR&Fo(NuCGJA z%>Hh-U-knKE6UK_+tQC1$DUeSi1Mc|b7MhfRxvDv{X_h4}^E*$c~h!lN{MQPYlM%O9;*^{a}(ue@~XIV%WB^xMk6LZ@j!80I(f?4Qc&*)tJg_}rGhk;oF@9t5k?_f4I@)t zGrd8(6in5xXNtQG;|wA;xx^ZHeD&kGP6bw|iH(M(LsESLBE3#qWv$X=jIOdHIMZyH}@Ghb!NaP$)CG>}v%3KLfTb;E=+ zXf{8rh*T6nIDxg&)3jlB*;LrLLcpRN9k1a-9)kFvq=!}FRUJ~bE$iHZIzkCK)xPC#nmaYj32CT*VKX^6JJeJ# z1l#*i(Dv~#K6J>%bsm0qwx-79o!zLlvS)a(gYn=(apgh<5?=AK)MWQm>cXI-yp$eW zzg}zd^M`8MkZ=e7D>LlS%#@u+n2)hV@;c!QeE9J{8kC213k!d*l}FGo2MzD??|%(v zCwHw}kIsH;pv@uVg|}7ca&NH>o)Ey%Ic`kSr;8|I`uI6epY`u+6IfW^wW!ZF*IKdrrWqC0AF50t5JgceSM)2-fc1idNq1k}zi22`pZko!~xKPVD1Z6$w#8YP07chW3qn ze@%-B-ncnN+=GWd>UA5D5W+3=;HB%FO~BP#;G6Un@~OW6!=D`85(LpE%IR8Bl$=C@ zO_Nd^9lLeo)StNgRTj=XrUle;5(iMXr%UErg zNXv5~&`rKoA5B?LtXL>1>-^Z^s%aCn)mN}Evf-}$!W=)!)Gq~@oS35ibF8p%xsMf6 zz}9cK(uOm84cDzwa#RnW>fOdvRl)f3t&Vn-z0*57W3#&g=BfGx*D=OAwYw^-QzSl@ z$qCrOGqvgLvt^DA_(nC zVYhedG!j!h-(6efLxwP$z=Cc%MgFy3K1X+Ag7A0m-U$)i9QX+{hHmw@XPlFPsY`H{ zEdP^XNnm%QdWJ@{ar2fXk;)l2g*xyKVEiC*U+D0xyy=v*Ceq_JRs%EGs~%!-Mn`jI zZrnc5c)Zi~9)k6@Yos&VY2fO;RId{SF-F)EYih!DU)AbX^tjj)!{XRLko`Qi04?=| z!_6qFMXPW%+!ni$aF$8Jv^F;T`Qo!zjJ`Fl_U(^c*#(XHX;#wbL7b?5`(rTD7ZDS6 z2HZ(U<79+XsoYWqsPUcM)-K-sDq}7R_N({!eZ);pjEW9)yj9P!wB(t|tg($Xw3G?e zBVGgmsBrbI%j*!-YQ95}54P29pxu7HbPlh%SZc$wbqA|cD1e@|nN*t7UarXt zt-0r%*o~z}7(b5ibePgu&r%ced&(>Z6n1{A&?5U|bd6s2-WYw@vh<@V6P7~0-brf# z?}DzH@mddy;vs%-mCIjMHT!B`BzHIowYdPO!1e!~7+ONdD_5Jr?v);aB)+zy8|Iin z1;yzQnza`e!UF*4VJwZ-*HKE!WYcp9AJu zoT&GhDMwBWM&IGHn~wh-_k>=&3;2V;~>1(?-+hLW0@B~thc>b>S@~b z470b+4Q+?y`%ZS&5g9X%z46Sg$VedW{sAL?iB$A}j+L1|Ht~`HS%uto7S0l$W_2;o znK~ZrnS0W|gOtZXii`TpPWj|AqG5r+Zi2G4!!6IY9FnvMG%CX`n5|rAj!J67-Keeg zkuLr&`dOUC!l#e05lCI;z>+!I*m#Gn<+{@HADAkyhBDREAq4AE^oDDSB&P{Xu^Mr8 zwcEVQfy*nWrmap#96IP~nvvovE(n`qH1F796R@rxO63_ZDVtt9ULlakyDr;HODl4i ze&6kOzl}V*o_|q-?VU3`9*07Bm?YgQ_62^Qg}9IYS+Hwuxtdv%P^FBmbAk4JwM=$C zkINNcbh%<@gNOrm1=4R$JWB^dC?o2pbr{7FcRjV;EegI?2wf4nu7hPBS%%0-_-oIF zZQea{oc8}#*<;}3xaBo>HDDBN)%Anh+76}hgJG9POi<6xwzJKz{@KVGWIr-<=su3G z#}rH3(kfH&*yV6SK|@gh538p4v4C~&-tY+Cv4K=0hRx5Qd{A0l7e`%-Zl829=dO8! z(EXE99L82YF2`Eq^Mn{c%`{Ef?>`_J^ATUf$j_%WOPrC(Www;*|6vLF1`~p&Cb<|p z;JYukcK}~xNkXZ8fdxU38A~XOlyG-Q%?y3>=foUNm&#t|7;&(OX*Ty@S2#p@fI%T_ zwYK_e4_`@C&ZPg4ZVPpXkAXysOcu7USSTOrvQRh34y=K?RS-2EGXX^dj?M6;)CsDD z@?esSrX*Q;w!XP~C#2jx@5+LH2$D|rdaWXd7Ig|x)`LuTGR`^)o9t1&o=BQ;nqf&1 zB5$dkp~|1#8ta_};`@Wbn4v*rtiTR$!*>A;lYQ=7n;D6xCMtCPo${tRKihv90@C|P z(r~ljZYr2!vOE7F@n;iwwK&2Qzxtu&|7w{W8anU3ktNU=Ts@Hd5b&bQUk4+AcCEBr5IeO3;b$} zA2hDC2z(aD#yjpY=&He;Vc7cC7orvClLoa~P#!NcDz|hP=w;>y+7=V_`6}+hDcLX&)3>z`Jr5_m z-j&&pdpywtBfQ$1n7rWgkh2AaO1kb9G$&-U>*eV-B8k~}!WA&uv^`K(JdRSW+=<9}sJDYDx;LIdw<0z1{&Qzro3K0uk+tPT>UiN#w#%r^$WganhL(M(=`T5h z*W36w$}ptxc*LMr_b&X+9k27J4sjVC>-VfjtZJp(T??k$q%l(2==5fQ(R%;TuB&Z_ zTG81Am$xpZ1Z%H3XBxq)gts**%v<*v;A?t+aR^en-imV@9G~x^-mI-I#7l##D2cr- zfJ&2t6--H-ToRpaZr_6>;jiW+?-=GU;pc3K3rQP46>%e1Mv59p()7q&zI901A^Kd4 zBR7{#l!a%iUXU9@rq7LagqIE$HX?|C+=iea&)Ha0vBD!c{CuqVt-5yh$8P-*RJN6VNP=w1hokmhX*{{@~Cu``Qe0pdAlv+=^w~V=0NM=w_pV zGNN@de0-ocYyXP9{S1qM>>E$ij&CFOz9Fy!w0qZwk#z4Rt-jF(hNSI zSoLarP6U?5pG6PYq4u+WnJSwj%%ssoz9|NRYA+^Co_rt7E%G? z<*pxbAUgTpQ|i`PKRcId4Y&VrrNdbzNJuYnx0NSm-@})Fl=<%EYGi=R&@=p~P3Q5R z-6+c#w{9&id9#8k zrT`z7(gij=#7n-$5E5b2+n8(`ZQ<>G_4yHFGQ-l+Q2;o1yosZ#S-XnQ_Ua!>!zZ&m z{S4xy-4(+vCKKx$a(~@p@hQj%ofoOF+`Nm=MK9tcdDf}uPA&Ywi7H_KJ%SB@t!O14 zJP${m2G(Z>xPk8{uS>E{kX2xlZc9vaDRfdH}cb>l&LSu7a76|E< z(q_Z$Dk=neta9LsUh`iX?6bHfyvsYj6^2412N*a8Z+q8DPi&?)B?aX9{eWN^kf=_* z1iN|=?M=BuiF@>KPip%wPm0bTp1V*h`iDIF{qSOS@Q-V(Iny1U)EjI$9?Mrdjq8;| zZhmgF`h07*#|cA>hMJyTsCVr288X`Af5M+L{(g_dl{oNK-5q-|F+ox-YOm^p>FJc& z`TBGY$Z(f>duGQdBKfgFD{CD=)Npp(>s*9QfP;!e4n(F`&!;vTX@xD^O=|llmO0I) zDkjllGm&UVx+SF|fxR=p9MboHN&k#n75SBWEU=(ns-NE4Ut zBnqSlK?17OJMhMX8(ZZ(j&s&{W{i;Ij7Ysz-inP?VxQ03p%mxcl%>voc5aV{A{F7m zLsL%tHeELIR|K4sy5fw0uP7z-ti5KG*}vKq?o#LZWH_%6P0am1W?baC&nU$zA)Zy9B6 z7S#AKCmm}1+|%~|=;kwE6L$Qm3}Y}NOFF4ujU4uxk9)QBgMH&Yz;tYMxdipl=!*Y& zmhjV&qDOFo2(Xb96#Mrbp+=8kEq7J)7yc-+7rjOP^5;Lk{8e;>72RE*lR4b|-G=C2 zZJ_?~*b`XLh5zgSYO~yPD8s zf=;~5-v0OS!MyZ%Of|p4iu`35g_J$uSzlilJiSuQ7akI_naoZrxhCuC<0-zKwmGD~ zPCET*Pnv?_)BZN7MbzsyKIJGH{rX$?xFxNI)?S;m(kBWl_F!1n=(cYCnJw3!Up$vcx=^)>kK!4~pzaph=|@rOmY?4iWTrz+b$^0YenUoUy< z_!w7IyzyX#lv;GBu%eg*ES_ZLdz#GF2GZI5jg^X!;N+YEa22W>P3MxU66ya!h%EkI zLJIZAsR#D-4-4%zK6^p0-iu~XK0hlLOmxxs5@__il#h!42b=MCAdR<=08SK?xoUXP zK=~om(`RW^T&K(20b=CV>Du={_T&5Q15VMe!Y38R`l&vGTZ|bpYJ`H~*w%u|B|4CU6-&X+TQF4tOC8fCb5`c0XMI>uo*Wc3Y^Q!SNoj|Pp8{tGD zOX1_0cuk#+&Kqs)=U}B(zE-c?)v@h+s^sTUhfk5OU5+|z^;*_l+u5n=Cj4%j`~|~J z%L9)!<>Yh(;;#gST)&BtT?7hk>)e%UG7Uur;xE~7BB_|hB+@k&+o6!z%GE< zPh;|jS9v&VZ9jW{_c(gg+@>J2;|3EwaS-5LmGHasM~dv&O|EMSu>lD5*xWZ~Xonzx z!Kp3vZ(L?RfMg2iL#phdS=~=Ss}%n5gPMA+*;zWzJwnxL?w2Ui&ynb+Y+ZQ^*q=f& zE z7~l0Fh}}1SL(5{1tmKoOOyEV=Pz6bmZ^{SLab59HjBavd(#_Wj6%P3N-c#4EC~6i*A*-x!#nMCNIR-uZmtaK0GU6JfP#@6JzNsF-`|YccS-`5Qzp85BpBs~ zBc!U0&utOp@lc=Bimi%4R|S6o~ro6kC7P>;PZ*;H4`qu z^)%)V>172W$_M5KLtkP|9968e-uvkm>(apowajH*xh#j4HSYU+I86X+$3~Yto|lKon4$aw#f*vS zp&?TLb9TI_2)^If-G4H#9VrwjVNU=?XRIEc<&+U3mu z*nSb$$V5pvE=#skz~L_RGnLItg?qgVZQS2AVOgQ7w>W(HzaIffcF=&0fdR3=|5$75 zM7E{c7#BS)v(C2q)-8Sg%m3_+aJuY2d$TeQlDTb@t=8w+B>Y3jP`Tz&#&%boZ(G8%B z{qg|4##gC2;gtcjB%3wy+`qrSP(4y^xyK5{rYlgfO1hVHwcPyAdA5#ANXS!S^Y~*v zV~OX+e|;xx)%Qn(X|kBg4uHKrr~yGVLEuXKtuJYwWEx6SQ&T?mQU`b0toF!L9%@2j zYwwH!#yc)a^`!1)p*kg(k&Yhw4nBZE7Xd$YG}+IYl{}301l-&jQbb>{yvXMz2J&k5 z3{20?@<>Zhtj^aC59{MCt~A1Zr=AAv)^vZ5MR3KkXq|1a9y`LJf~UVDZE>i)uf49b z#HEm&KMW1f*o9>Cc2wbnbWX&AUpvr18_O$;@bm({LII`m1dea&=tad_m&Op{ ze<|K4eix{?3sKK6W2wWHa23iR>W5xVOnORj1f~G*cxjy=(LiE`TB>e#baZ5XSp4)+ z(FmHfvx-ms`atY29an$H_*Dn$RrD+&CnGj>SfEYqb^puv^LM zVDK;?TcCCD)d{FEC^a}k22F3&dT!?%@i7zw8yPsYKRUwx$RGWq@wQ8Fp_mSRqouvv z1IM7n0YjK&pnf9_A(vF}H)z^jf&2^E%VzdBOlhRou_mEmVdgKOQXJLtuD37a_5oa) zw;0W;p;yWi{ya(A$I~N>MXXG7a0|1zxZc9fU);jxRam#ed26p5z@;}xpbU(OF`dIE z03gTe85tRQNP*D(3|--O`~GZ|x*Oz|rJcRE_ev-XnUOl|`0JD#P{P9kK#^g}J)2+E zgOm@Vnc=!xSn%U88z7|vk6`F8Z+>EdT85`>isUwrjStjOGsOZ9nnDQuNjDXB45#%G zMjA@_b7$0{-A@f5^~o>@@S+cfpqRbG6{zdvd$GkXqfr_nZ6j;jfML3>(@BQHzhoov z^uL$hS2AO%@Vb!DVAT`)Mrgkx4Ey=FRVO=Tx$1a9SKGuBjuR%O?1)8fc^pPi| zM^nqOWnlJeNDuNIK!AW3zWmxa_AvbiX+wusSU9%V^?HYiqvh$+lWt*JV0w~79Bu-h z9su@(dVtZtXY>Nfsy~}a37dddnis&93Si4YAHin)cONOCv-9FECzBg`T~C}ozczk4 zY{|`deD(%tQVldoMSq)2Zv;)AVRL`^SCgfn^puIZ7F6FdyjB2PDL4HUc50=6T$V@ne0#h z@AV|BGWO>#)k??x6HtHY5P!HmbY!EBMe)r3oqGl$6Oc3mEu~y9s-#4*l%7xw-oxSI zH&Z^F_RYzORI7{z2hpr_alrfo05GlaxvIrrqN)^D23x1mALE%vQu;1lBPX?N%2c`! z30N!I+7%^WP#cDEspt_hOE?AZ$yqX|tJZNuIbhAWK{l zB_bQvaktAv)NF_>nwdA-&aeCmtNWvx$_~U~or$3_{rB{ld9#ez=*;)!p`njdlp7|Q zTW9M%6uq$g12&hxT5I-+XQg&#ZZcQDOP9@U zwk84Te;1tsaZyAjDOI3MsuLM|gBkBWl7dJKbWCWRMf2x>jw+5?jnHOJf|l|Z59L@o za1*~9eG#_}UW`ifaQT|=<&UWRGlAzt@^5@@batP2d)8%8PJ=Qvdq1ECC(y;+l15#t z?ybT|l@i-LWaK2EwWVUbZ5qGS0og8>*y^|`aO<|_kRkN>!}{ETB?a*+^Gt{*yH<;- zfRG>VLWRIb(r8fJOxt*d69AytRi{OkFAd_nN<}(!`xlN)}-;4A`3<@n~A^e_cYUw zqE2!l^mqEIou)v2Se+$8C-tcgYR-JBXGd0rLE4Si02c`&ZN`fy14hWuftVgXuOJ7e zg-t`g#p(QsvQaPC0}G@PTZCkQCCb&vkWu4uwC6YnF+s=^$CmBCmE=5U2~*{gzqlVa zU&2`F!4sOs%SZj?2L7jJR+KSRydpnm*;K27sEgF(@^59UGM<&^o{)h~Du%|g6`M+& zCvw`cEkziQP^naNpPb87l6;S29O}got}J5G?|OH#CK=cOa{` z=XAWE)zmV6@SJKN)pCU9pz?E|rdl$CgIle^l?pZ;Lz_H;spY&%jIBNxJGz3bmf#m2 zo9bdLrHNY;_JnTnqJH2VK-;iwRE{M_R6hWT2_+wXo7-q#P%lS!(NBl?`Bt>3W*vYKkQ-bYPjGj&0s}nx|;@d7@ z5OniG{klPMag%JWP)e0i6ZbuMPDOqd)U-I$#!r)ZB;ThCPVIeIXSADxvRT0oa<;Ac zjKg}B1a>~sx?iUGy&>hA*jE`UMX+s$h3^d(`(^>Jco=&KsdhBowQI}nvH#mJe1!u{ z@Qz}R7XyaMQStHadI;!F_y;g0)|)fHl-1ku?Od>rbNR%S%-0156Si?L&hDC0Lp2|6f^W9TwHr{`~_2(%l`BN~g4RNOyxM-Q6Wa zH`3A~-Q6iegM@T<42?9r8$F(Lp5MFvo$K0r?NxKfx<6k?SlO+_APo?)#pWyjSdtrwe1I<+X{7cbt%yeG`)FK(2miXI`w!nNGSiVnqAA zws^}lCh2RaQr_tF5Bm&MoWz~0as1g_gXy-rahPGp^_X9`zSN&?eJz1`-PXk$fpmhy zr|jhVD%Bf1!3oP!YeZk`@~T7uite3)O4%Qltw*oRe+q1?S=Q}Kxnuyp<8{+b14|A;KbH|-)fVH=Jze|U!g>00`RmQri5rL0j-o;P{xVRWd=AJA&S`A5 z$H#45+r+1*Lx|o0CP_L$T{6|NpD@M(=+_^jcfEDPX9>w~qgpxCw!AdZlgh?G2n??KgR-K9*@Ayk+f5whaxL7Q9ao5n@$Jw$YDm>(S02$%7qkGx1{Y*1u zBGFYnNi&mEe!0Wt-g;?JDR5E1-d)wsExU3PP`lAQCs6j@wIKy6TPCa>mP z)mlqXr<$8|3ME>WR^vQIAg3M^w|p{eqcF^KsI0>0XjfI*u$}hL(p>g^Y?X*4+}wA4 zqP0vb_?%)bFYDAk#3Lewd+$dQ1Swf}y!&PDJlpG9rlEmx&F*BQf*@8U7MNZ^VlAS! z_Qr1A>Z`)Px_m6@m(#tycimHh%U0n*E=trjjZR;v2zudM?rSrdFF1-@zUwTEYMTW^U<0dKG2`rK_V%LUG`$tIN3zxsY%AcU)E{FBz6#Wqj~Z5!0hFMP&ZAbwW2_nKd+ zy4P9b2$a&4@|b{o0V#z|xn^iho0wzGZJ!gXQO``;GMihG_vo$nEUC9@R|@zGA}FP!sGgOroV2AUm5Y(V^ks%^m4m?e9_S~G*)&XZgFVx%dUry3WEx5 z?-%Xye?S6GloXwqUjekk#c<}f0)zWK zjj14K6DbY#4-+QC9zft@(6-w87S(_SdJ@mE8q2qHadR-qyPh7Pl`!xLWdb$lrxUTn<`KH z@H4;tdW(n<6UC)X9hg1?c2{;Lq~w=ngFMcAs)S`wz{PO;-^&Nx3yW61#N|u+Ywbb+ z)85wp2==`T2I^3~ph8|d^b=3LFT;c5sHs{h+Y6%SN|Sp++zsU0B}F1~j?TBV@DrA0 zOzD_u{0u)B&qFG;G6J-3&ptluc(grQGS1;W{pL?v2`(imjM<&F*7xFl# z`%$JB?zlZdKpGwq(eo`FuNj8y^b80XxD8Thr7jd+?M)R6j5Nga5fgFC$C?HY_*Z+~ z$GHPoVFv(m{;Lg@*Vf_y$m0fpq!1lFm>n8H^1456W4{zYnx1Wkg@J=4uoq1ioQG=I z+vL3MuiF?rwoT@rziZa#40BCezDGKcAPqSKUr&9#cujLzqo#;QrlwM5P*bD zh!<@}6TIp;ZU)i;(QYEYI~!8c2k=h#*groZo&n6kgCCHu9Mu!ySD`MSklN}7kh)JS z>|d=)9|(4_K3su?)=KM_*aDp#3~8510V&SWqJ74Oc%qV+YXIiq;9z#S8cas$qaiOZ z&rk6r017nq7hGIFVi4|tNS!yur}(sp0X<_rn^1^81qB7azX<^R{O@~Q4;MOt8gko~ z>#Z~Z_rV2#D&TExk4CcOGeD*mUl(I2MBSi=0a)+TN2Rcvvi;M=cR;9%?T+3x(EH|` z9w?}XeS;1(zenJYNB}?wvm>&R1-Yn4{Z?rOh=vyyR#pdh&GPx|fi5Hf0vOqMfI{ER zjc3w=bIJ2a;BHsJx69z+6c6Ah9K)o>&WbcgZNUK;JO06s$;5MVnS!ln`p&;b$HV(c z@OD~0=9${*W#_W;$jFGEOorick<5d`=pD%NnNU*AS`0)arzg+Ts+ z$@y@hktrb|VJZ*M5N=le@PWEUoAG%lPTWUc6##hwbZJ_`+?*Z&VJImo8aCvqKg{y1 z}a_?Y)gBXqXc%GJ zcHISVF^(1Jts~isAsAF}94+rs^2L;T=55=p3$n7vqu`%jmjm!Mn)!~ZvPt{vA6#^a z`uqEVrS{S9n^2*pg$3_RDym#Cn=@Z2G0aa@2c5Mj!UKwwleSb|(neM>NpW%U`_T_A zOa3QZk<-R8%^fX|54S=0(h3UOA>>a__lO)$VGqtGxscL7YFVF)X%52tUJO>Sc>0Z! z@}&`fT38>zYtQKn&Yb*vc?V>Zq;!pqILv&zzSvz`XpKJ;cD3K4<$M}yjMxNVvjMW* z0&J*|jroFpubFQtQ_D;vcVB)FUKOS{$fao<&0A50@#2OFFbb2k1jlB?d^L75Qp8dUStGq?uHxmUYnP_q=nT7D49kpbD z)PapiJ0wf*-v8HF6R`h@UF>O8nt+eT5&1PX@2P>P-;AZ1hNBIFY7iI)pET7U48hv3 z;eNL|$5<2Z#JlsB#)8*On{zBNvx8O!2RG9jTK28e#L^O~LMO(mMk?>J!Z^Rk95f%i zKA%#-CZ}PTy&1Pr7fc2^`#U_-y-}V|(}^4ZyzK@NV!`|hB=b3YSR=ZN%AjLj9||-;;6vdVqcY1HEEm4l;tiymF>)gR^2DQ^VNlhyE1E;k zkuHsn^|j#U0x`bn3ljUXoseCa&!JExDL?f7?XsGmDfKd?+nv{o7vGFx%aIOAFAc~>Fi zA8|S(;M8)$^0d+8`y7_x3s^pjS}YO=M|L(f%}dSl5b4XyAEy!pJ6>ii%amBsb>?;J zR4~0qP?sPRQMX6obx~2d#`;;73gzngJR-RTTW172*9U#EYVc`2q6giuqdvh~pPE)| z8-R@(+Efgmu)oqrh#IX7UTK0RP~$Z#m+aQElN9lXt4;dxE_uaIx)`&3;k4xUJka2(Io=t|4%#Ll=#noN);ubdJeG4P_&E` z!{hB%G#ELkC67Z({V)tna(P|ZiD4D22ARSA?hFM1%1YUmzH%cp5$K;QShwlR#LMdS2 zYX4Zf>!$~2)MVEyCc@2O3meKMxsI3+;+kY0`N9i?Fkc>^(EY&<;{sev8o5c|zLN4q zd{v$qz6ivlmS?>Tc6wETwVLFF$6JWem?l6mBiB8W=6sVIZ%gn%%&_^2n0X@S1dL*b zyHG*1FFlXkLtAgRsw-GjtGytX3a@l7?xoLIb9%y=L~dR9;KdV2o?AprU!9+=N0&Muj! z16=rdw0G+1U+%1Bisv)bN<9%&XiXzL6A5c$92k2zDFwsfhjTEZm*|qu5`u)w%XHR& zsBQ=M;Pm?W{Ya~*tQwT^<36m?Ym{JF9i;|G4w!lP4X2I3rsq7oqULVpH@#LRWR!-g zU2+`twmR`xP@dN_w)HC#B`;y7%{FRX4(SMsipH`E#k6C_#qgw_i``8|^fsGfu)Eeg z@DDuF7#8^Qj0l+-nVEuKEq=SslTwJO9YK2|dE{cbkn^TL^!ivQJ+ug_(TsX>yVrQ2 zw%ooPK<4@L2@_w8GeLP4aLBvzF> zP6%vm6`)8DLP}K9PKxdmYJw=+5?YnuJCUoy9$ zCq9S|9ajM=04}J}Yd_MRz_>N3)z0K-=20vGGq^3EXM<={=51-l^A~UcleN z@PFCMEiTH5#a! z_zV9Sp}wzu-b)xA=Aq?JeluzlD-2}KIgE7QKM_l0l|qYp;Zj++V%7y;2~)dKt(stE z=qvb@%Yb4#E2RY8p|ny=?aT%xtVS7v)pa5S+9(fb0Pg#efRrXXNw*m1SJDQgVe&>U z{5h==VHbNJckP9_Ehr)=UUUfye!v`@F0;U?nYjAg$FbRvW&tT6yeFE{r!^#Ow;%=cyR<>)z6_+c*GBJ-K0}7$Y zfYMBN*ai_eI=H#eFQEC~hK(uvzzxz2N$%YPW1K)qJ%dMKI^b!wmQ~v3Z;au{(yN8? zW;2krI+1F1gOUGx%`kFH?bNdXhZlFW&Bg_}&uM%~KgNTc)92#|4_8IHyds?K{niV1 zH7ngoOx&3}`k$Y&I~BC1hYg>3uUhe8FFn@dHdo8c^Q~AYot@DiXksDza`V9l5HbmN zO7)cm5{vS;dShFDjrL0)NA0GCp*p>iQ?-N}tpy|<9N@l$S3kIyMxWVRT+#$GB6J4z zIBg`)yb?c(!ail5xwS2wx@IpkBY7Ekg|&y zrU9&P+bpMBB)*0C96lFQaqL}_Y?W$ec!RVLynY)xR`7hcj}@^4(Vo(0(n#3#bi-|a zxaw&#VR`Z5)w3)?TDbW9BN6`xIj0K{&nbxe00*()^F4YM?Q;hei^2zncXzZ#_lE+S zL_47rKW&nmxM06U3W#|Ijlu~9W|aGVt$EbTe~$HpJ%4KIMdf2Q9a7pgb!MLFtW?rl z846UZ-|ELGeZz@hw#{^>Q*T>+4bDIt6)WkkOGY1IkggzlpKHg|b%hJkpt&r#-y(m8 zR`7(yMun0ZDi1E(WQsH0GuW=e4<0?}P}PCeP0D!F_>elSzDem5h8adNQAvNlonh;o zKp4}yM9_6y9y9-f;76(M`V6lN$x0niV#(b9RWX!W`;% zAyN?rp@n78JxWRq+U4T2l_`oviECbRC`_d!aGge&>eL54iBnK^>IE$33K*#abM@v_ z9n^-LYwwaeB^kSH%TE}OAsiZ&-}O6o(m`fzKiPnhnC5x^$G8T)!kt6W=KVyRhEkq| zMK^Wgu|tXr7{(FH3*Q=75USK)i>x-_o1>+oKvmY!;333MqI+Xfa2x*^U{}?{3A#iF z+w@M2)ShVDfB47rz2IHYQ zjF+gfW~Y9gvcb^Bi=pZ?Oi|eh0UV{<+l|XeN}PhKRO-9PY@VF2OhH$hW8GUk>GxTV zik!!~Cqdag4Z7DSA(Fw}q(~Ly)VM0QqQrk77{n<=q3c@)C{!I~UY-J9ILO0c1K%Ah z^=rQ0Qv(!tdIwEIcmy}^%l9R~@?q!D?&PDgtFo%;3NkUb2&8oYeDhhUoAE&lY+(ymWN zMRnVSix_vqa+5N=pGZ^Tlv<(j9O}A6IrNJaL@rW5iuBv$c`G_YyH#>14wMHTs3baN zE3)nqD~Eh$jZ2SZ6CbVrwcZtK!-Pg$kp5`HpwW~!s52vbqt~?rD?b4u~q`>AylR4?(q{<)a9f7Uw zS(_%0&GKk<_GT@0FC-~{8}r@JRY1%MZj|SsIouIxU>vVg%dY1WXS3a!6-^bJawQ)F zBG_h1bUG#&pBZY;{8n+{_%Cy$baG^bu2ALc2W1k5@qjE`NlG3j99Yh;M_AMS`~CfL zFAqdxl&ESUlFWK>oNDki>B6= ze0)Rp)UMiA5tw{;QQ!FTw>c(J&Mf2Pbm0t+s0q)v4ZlvWA5mXF7s2^dt#Vx837CZl z#hVw0afdn7kJL@_XjS%oV^O~YQbtfpw7;jRJlqkB)P$Cb;XO?YNrGaC=n6pvA-yYM zHlt7|NZ&C=cfqP5PgNs5lJ2o`=E~Sx$949rfxRFX{*rvgj9p_Aps6izTKD$bBnfwf zNq)*vF0g0rMgeE0Zq9D6dw6_C2v5)_);`<#; zoj}`e(~iX@+!3rq%9C5=KDolY!}-ahiK%4i&$RE6r!Ju0l9S zz0cpx;<2;Nea9_38@Dr<4+CH4S9q%6Ck9#xzw;m+NX7q&^0mS*I~|Ct<~~FKY7xH< z9WnJU@uU0hNp_4hu6@=-hdk6RrFPDS#Ee9u3F(gi1b}BQ%5H1XV6@H^~ z#SRK`jOz>JLw#q>m5q(}4P3y*M=;hq2|&iU{-1@~hj>9SS3AL(NO5$|RFWou=z>T@ z_t}JeRR#z7yWT#IRRzvUy5{?<#tRAJ1u=!54FOA?Gx=L|u%Ox-0ykvp#| z1?2r@X=g3X%>uvmH4c8WM7+xB92#z@_(@7HOr+*T8`(ruU~0AC0I7)o9%tT5q_-=? zUF|cVmVA=xrJ4ff)(DbJWY9_rl+eIsOPy|KQXO>fL7XTbg2KqF02xlQ{GyEZuYmda zcxSeuA08CW0$AwtCVS@P;0`sTvpb|hrBL>$6(~NPmhq>t|8R~oXC8KGl=!I8SGLQ0 zt6Fr6@IBsSB`pURxvxca(fbSIIXFpZ@-7HcxqdDj{qHOR=+=_Uv9e=JH-w+?tykyQ zNp6K0?yR{KGmm&e98wOaL1v~=bK*yS!eV8NoM!_hD~U4WheQ zI$>F-=S7=y^zf*(p+x_<$VsO6%@v!0B7s3{pw*_wy)F~DS zuo$0gCv(o}KVF8;XdNS`-Z9!?eMV28CS@}ljA`p52w2B1nRSLXWv`BjZ6Z=q0^5aK z&b6NY9$)vgraF92FY$taiIWDZ&GAHX_b~WPTCkGI$cF5A_M=?Zto!4S^3JyP2szlG3miHR%2kH4521xt z&tH+JYHw-Z0}cbJR3QGY5JGU#TK5IF-HRP6hXLL^!P;2T(UiM4+~O6F9;`Iml)qN+ zZ6OkipdCS5@@s7&Qax5?h@duuZ`YC<`-;txA4YuAyTO!q_-qb(^vVJE=pJp*y!Tv# zz9HSn8q`)Wd~QBX2)o}R9ZG`6Z9lU5_&~?4;dV}cLya;Hs1#@(XX#}ex7W@W744@c zUaCT+kX5I=QN#_itSN{5$L_j8g+xd>ejPJ3#mfr*`=CHotuB1BBqsUH%L8B6f+=b-R$315CA9*wW=jNt5(xwt=>qmmw3 zkjr~DpwIH{O+5Ppv1~f9_IqzWacog|1pWn{5?V30wk1hMim9H(2+JOfJ^AA8QhXTe z!zV-Mt-jXL_>!){6>VC9OymZ_E0vmwZnFcU=hwo+9g@M?=lKIS*OH91JD-6XIy!-z zTc%wu*qz6#{yTb=rA=?Q9DYE^=fv%1%db%rV@u-WVi-BL{HGSRH|q&wx^Y2y-LO1? z?^i<4ZzBKQ=Y8GX-Nzs7Hu_@u2_`}IWufRwoW0=2Pz$w-fJC zh#Whg^S?$Pk!TjiCyh><+nzUX@x*0yll*NLHsPa6xT@l? z5NKO23n^xWspB;--t>lbll2>)TP|m`XiCLG2`LE@4wFNk(&D$GF;&~^we}$$3XJ8; z|5*)B1}YHD%O4G5fqZFt8^~KDpsAs}S6yOOsU zt`sGq!FBz`5BE?z#P)#RuY;PFFAckvL>8ou16T0Fh6uZJoXlEkNwCB`OZrNBFKp%~ z7w6G@l_J%axkZe(q9&9VU9Y-+!0nl1@VITD$DtkA3N3l_xD;Z`m9M_#TMuISXQly# zc{V^2bMu_LCce9Tp$|iG2L4$3mDPUBoaJ*9l+*f#H+EqX`rC01*6C)D|IbU8o1iXH z4?mV|3g7bVPc|y{n=^*P^%X?QgMwk)BZoQ+pvpPr*gE22oLct?U{)=P zg^!Z!?MKq;<9CGD;j)obZ~R$H9Q;qO#(?CXLXgWORhhZzYv$^@FF#kMy$+kP^9OGx z{I$YQ*#}vSd>AsgtrCyVe=3!v2tvEa@F8cSNA#_8D>2gg{bLTryg*^7YVTb;iK>{g zwN)2GL@YuP$TFDuTE+p}*+#*mQudLWS6)=-W2OS6Bh}EiVHN>>lIa*hUf3n?u$JuK z9{m|7WHZs^&Po4SWs-dAeS&{~7Xw>s+4C83O;#%rw-! z0IZn-OWA({yO_USg2e8zsQ-zPM=^hVsa~@3>yZKW>%Av|$r#g#Ux0@$k;?vdf5iV@ zUH>;!{Pe`vuK?;b8uBz4xH;VO|C|0Cix?r;OxNhV!uzP=@%CS5#d5+#1kD`PmFe12bxyo12>y z16S9bgQOi|fy^e#w|3409glI~q?&(|RbwVK@FH`TIv!<=;W@cvPQ`7sK%mcj_ zhs{SW^p2#LI<~DB1F}oe0EayJ<2UH_m~0Yf@Za7{Jlv2PPB*UWBi>N z`;&$P^7Rx4YeP&U_mH)rKOG6_6VVT58u4~^Fu~jQ-~FE-{!SbI*{&fWa8NGxCU~an cOe2qI#WX62?!!}KPnSHT#pT7yL<|G|9|>&n2><{9 literal 0 HcmV?d00001 From 360c6a45b4b0774bdf14ce31845dd68a14175a9a Mon Sep 17 00:00:00 2001 From: David Webster Date: Tue, 22 May 2018 12:08:18 +0100 Subject: [PATCH 14/99] Add build flow from old architectural map --- rm-community/documentation/README.md | 2 + rm-community/documentation/build/README.md | 6 ++ .../documentation/build/resource/build.png | Bin 0 -> 53910 bytes .../documentation/build/resource/build.puml | 66 ++++++++++++++++++ 4 files changed, 74 insertions(+) create mode 100644 rm-community/documentation/build/README.md create mode 100644 rm-community/documentation/build/resource/build.png create mode 100644 rm-community/documentation/build/resource/build.puml diff --git a/rm-community/documentation/README.md b/rm-community/documentation/README.md index 8d2a411bec..634c4b4900 100644 --- a/rm-community/documentation/README.md +++ b/rm-community/documentation/README.md @@ -27,3 +27,5 @@ * Governance Rules * Core Module Services * [RM Patch Service](./PatchService.md) +* Build and Release + * [Build](./build) diff --git a/rm-community/documentation/build/README.md b/rm-community/documentation/build/README.md new file mode 100644 index 0000000000..8a50c3219a --- /dev/null +++ b/rm-community/documentation/build/README.md @@ -0,0 +1,6 @@ +## GS Build ![](https://img.shields.io/badge/Document_Level-In_Progress-yellow.svg?style=flat-square) + +Build location: https://bamboo.alfresco.com/bamboo/browse/RM (not externally accessible.) + +Build Flow: +![build](./resource/build.png) \ No newline at end of file diff --git a/rm-community/documentation/build/resource/build.png b/rm-community/documentation/build/resource/build.png new file mode 100644 index 0000000000000000000000000000000000000000..902e37424b19d7b82cddeaadb7185229246cbbf2 GIT binary patch literal 53910 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

AtwRxk(x|S8^Z5SCnwS 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 CaW1d` literal 0 HcmV?d00001 diff --git a/rm-community/documentation/build/resource/build.puml b/rm-community/documentation/build/resource/build.puml new file mode 100644 index 0000000000..7c56bef154 --- /dev/null +++ b/rm-community/documentation/build/resource/build.puml @@ -0,0 +1,66 @@ +@startuml + +Title: Governance Services Build Pipeline (RM HEAD) + +'build plans: +'Ent UI: Automated UI Tests Enterprise +'Com API: Automation Community REST API +'Ent API: Automation Enterprise REST API +'Community +'Com UI: Community Automated UI Tests +'Enterprise +'Ent L1: Enterprise Level 1 Automated UI Tests +'Ent L2: Level 2 Automated UI Tests Enterprise +'RM Benchmark Driver + + +start + +if(Trigger) then (commit to path) + if (rm-community/*) + :Community; + fork + :Ent L1; + fork again + :Enterprise; + fork + :Ent L2; + fork again + :Ent UI; + end fork + end fork + elseif (rm-enterprise/*) + :Enterprise; + fork + :Ent L2; + fork again + :Ent UI; + end fork + elseif (rm-automation/*) + fork + :Ent L1; + fork again + :Ent L2; + fork again + :Ent UI; + end fork + stop + elseif (rm-community-rest-api/*) + :Com API; + stop + elseif (rm-enterprise-rest-api/*) + :Ent API; + stop + elseif (rm-benchmark-driver/*) + :Benchmark; + stop + else + end + endif +else (Time: 1am) + :Community UI; + stop +endif +:Release Step; +end +@enduml \ No newline at end of file From 28fc5c7085830d33ba70dfe77fd8e25d78fc5486 Mon Sep 17 00:00:00 2001 From: Rodica Sutu Date: Tue, 22 May 2018 17:20:31 +0300 Subject: [PATCH 15/99] library updates --- rm-community/pom.xml | 4 +- rm-community/rm-community-repo/pom.xml | 68 +++++++++++++++++++++++--- 2 files changed, 62 insertions(+), 10 deletions(-) diff --git a/rm-community/pom.xml b/rm-community/pom.xml index f7e9befc2a..81e55d50d6 100644 --- a/rm-community/pom.xml +++ b/rm-community/pom.xml @@ -27,7 +27,7 @@ ${alfresco.groupId} - alfresco-parent + acs-community-packaging ${alfresco.version} pom import @@ -43,7 +43,7 @@ - 5.2.g + 6.0.5-ea 6.0.a diff --git a/rm-community/rm-community-repo/pom.xml b/rm-community/rm-community-repo/pom.xml index 98359f013b..505ae7ade1 100644 --- a/rm-community/rm-community-repo/pom.xml +++ b/rm-community/rm-community-repo/pom.xml @@ -14,7 +14,7 @@ ${basedir}/target/alf_test_data - org.hibernate.dialect.H2Dialect + org.alfresco.repo.domain.dialect.MySQLInnoDBDialect alfresco alfresco alfresco @@ -56,6 +56,7 @@ alfresco-community ${alfresco.package.name}-distribution 42.2.1 + 5.1.40 @@ -205,7 +206,8 @@ ${alfresco.groupId} - ${app.amp.client.war.artifactId} + + content-services-community war ${alfresco.version} @@ -333,6 +335,30 @@ provided !--> + + org.alfresco + alfresco-data-model + ${dependency.alfresco-data-model.version} + + + com.fasterxml.jackson.core + jackson-databind + 2.9.5 + provided + + + com.fasterxml.jackson.core + jackson-annotations + 2.9.5 + provided + + + com.fasterxml.jackson.datatype + jackson-datatype-joda + 2.9.5 + test + + org.springframework spring-aop @@ -419,12 +445,14 @@ org.alfresco.surf spring-webscripts + 6.13 tests test org.mockito mockito-all + 1.10.19 test @@ -433,6 +461,19 @@ 5.0.4.RELEASE test + + ${alfresco.groupId} + alfresco-core + ${dependency.alfresco-core.version} + tests + test + + + ${alfresco.groupId} + alfresco-core + ${dependency.alfresco-core.version} + provided + ${alfresco.groupId} alfresco-repository @@ -456,8 +497,10 @@ mysql mysql-connector-java + ${dependency.mysql.version} test + org.reflections reflections @@ -481,16 +525,22 @@ io.swagger swagger-parser - 1.0.23 + 1.0.35 test - + com.github.fge json-schema-validator 2.2.6 test + + com.fasterxml.jackson.dataformat + jackson-dataformat-yaml + 2.9.5 + + @@ -499,7 +549,7 @@ ${my.db.name} ${my.db.port} - org.hibernate.dialect.MySQLInnoDBDialect + org.alfresco.repo.domain.dialect.MySQLInnoDBDialect jdbc:mysql://${alfresco.db.host}:${alfresco.db.port}/${alfresco.db.name} jdbc:mysql://${alfresco.db.host}:${alfresco.db.port}/${alfresco.db.name} @@ -511,7 +561,7 @@ ${my.db.name} ${my.db.port} - org.hibernate.dialect.PostgreSQLDialect + org.repo.alfresco..dialect.PostgreSQLDialect jdbc:postgresql:template1 jdbc:postgresql:${alfresco.db.name} @@ -560,7 +610,7 @@ alfresco-solr4 ${alfresco.groupId} config - ${alfresco.version} + ${alfresco.solr4.version} zip @@ -675,7 +725,7 @@ ${alfresco.groupId} alfresco-solr4 - ${alfresco.version} + ${alfresco.solr4.version} war true /solr4 @@ -712,6 +762,7 @@ mysql-connector-java ${alfresco.mysql.version} + From 9f44f7b4676de359120dadc85b77a24eb3bea75d Mon Sep 17 00:00:00 2001 From: Rodica Sutu Date: Wed, 23 May 2018 11:51:27 +0300 Subject: [PATCH 16/99] comment the check from BaseYamlUnitTest.java until we fix RM-6353 --- .../test/util/BaseYamlUnitTest.java | 9 +++------ 1 file changed, 3 insertions(+), 6 deletions(-) diff --git a/rm-community/rm-community-repo/unit-test/java/org/alfresco/module/org_alfresco_module_rm/test/util/BaseYamlUnitTest.java b/rm-community/rm-community-repo/unit-test/java/org/alfresco/module/org_alfresco_module_rm/test/util/BaseYamlUnitTest.java index c964765352..eb0135c97b 100644 --- a/rm-community/rm-community-repo/unit-test/java/org/alfresco/module/org_alfresco_module_rm/test/util/BaseYamlUnitTest.java +++ b/rm-community/rm-community-repo/unit-test/java/org/alfresco/module/org_alfresco_module_rm/test/util/BaseYamlUnitTest.java @@ -28,7 +28,6 @@ package org.alfresco.module.org_alfresco_module_rm.test.util; import static org.junit.Assert.assertFalse; -import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertNotNull; import static org.junit.Assert.assertTrue; @@ -44,18 +43,16 @@ import java.util.Set; import com.fasterxml.jackson.databind.JsonNode; import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.dataformat.yaml.YAMLFactory; -import com.fasterxml.jackson.dataformat.yaml.snakeyaml.parser.ParserException; import com.github.fge.jackson.JsonLoader; import com.github.fge.jsonschema.core.exceptions.ProcessingException; import com.github.fge.jsonschema.core.report.ProcessingReport; import com.github.fge.jsonschema.main.JsonSchema; import com.github.fge.jsonschema.main.JsonSchemaFactory; -import io.swagger.models.Swagger; -import io.swagger.parser.SwaggerParser; import org.apache.commons.io.FileUtils; import org.apache.commons.io.IOUtils; import org.apache.commons.io.filefilter.WildcardFileFilter; +import org.yaml.snakeyaml.parser.ParserException; /** * Base class for unit tests for Yaml files. @@ -100,10 +97,10 @@ public class BaseYamlUnitTest assertTrue("Yaml file is not valid Swagger " + OPEN_API_SPECIFICATION + ": " + yamlFilePath, validateYamlFile(yamlFilePath, swaggerSchema)); - // check can read the swagger object to obtain the swagger version + /* // check can read the swagger object to obtain the swagger version Swagger swagger = new SwaggerParser().read(yamlFilePath); assertEquals("Failed to obtain Swagger version from yaml file " + yamlFilePath, - swagger.getSwagger(), OPEN_API_SPECIFICATION); + swagger.getSwagger(), OPEN_API_SPECIFICATION);*/ } catch (ParserException ex) { From 345b3e63328b44084f1645ccf056817364e2620a Mon Sep 17 00:00:00 2001 From: Rodica Sutu Date: Wed, 23 May 2018 12:36:24 +0300 Subject: [PATCH 17/99] fix integration tests --- pom.xml | 3 ++- .../alfresco/module/org_alfresco_module_rm/module.properties | 2 +- .../rm-public-services-security-context.xml | 2 +- rm-community/rm-community-repo/test/resources/test-context.xml | 2 +- 4 files changed, 5 insertions(+), 4 deletions(-) diff --git a/pom.xml b/pom.xml index e91a141ffe..960cf6f3bb 100644 --- a/pom.xml +++ b/pom.xml @@ -171,6 +171,7 @@ -Xmx1024m -XX:MaxPermSize=256m -Duser.language=en -Dcom.sun.management.jmxremote true false + 6.0.0 @@ -227,7 +228,7 @@ rm.module.repo.version.min - ${alfresco.version} + ${alfresco.min.version} (\d+)\.(\d+).* $1.$2 false diff --git a/rm-community/rm-community-repo/config/alfresco/module/org_alfresco_module_rm/module.properties b/rm-community/rm-community-repo/config/alfresco/module/org_alfresco_module_rm/module.properties index 011b9d2820..272ed18d91 100644 --- a/rm-community/rm-community-repo/config/alfresco/module/org_alfresco_module_rm/module.properties +++ b/rm-community/rm-community-repo/config/alfresco/module/org_alfresco_module_rm/module.properties @@ -8,4 +8,4 @@ module.title=Records Management module.description=Alfresco Record Management Extension module.version=${rm.module.version} -module.repo.version.min=${rm.module.repo.version.min} \ No newline at end of file +module.repo.version.min=1.1.0 \ No newline at end of file diff --git a/rm-community/rm-community-repo/config/alfresco/module/org_alfresco_module_rm/rm-public-services-security-context.xml b/rm-community/rm-community-repo/config/alfresco/module/org_alfresco_module_rm/rm-public-services-security-context.xml index afd9d8a728..ce4d04e6f8 100644 --- a/rm-community/rm-community-repo/config/alfresco/module/org_alfresco_module_rm/rm-public-services-security-context.xml +++ b/rm-community/rm-community-repo/config/alfresco/module/org_alfresco_module_rm/rm-public-services-security-context.xml @@ -2,7 +2,7 @@ + http://www.springframework.org/schema/beans/spring-beans.xsd" > diff --git a/rm-community/rm-community-repo/test/resources/test-context.xml b/rm-community/rm-community-repo/test/resources/test-context.xml index 7e0f0e1bd2..3ed57e4507 100644 --- a/rm-community/rm-community-repo/test/resources/test-context.xml +++ b/rm-community/rm-community-repo/test/resources/test-context.xml @@ -238,7 +238,7 @@ Search - buildonly + noindex From 899beeb1f231c5783983b8a2fd5d3de669bc9cf2 Mon Sep 17 00:00:00 2001 From: Rodica Sutu Date: Thu, 24 May 2018 09:31:29 +0300 Subject: [PATCH 18/99] minor updates --- pom.xml | 26 +++++++++++++++++++++++++- rm-community/rm-community-repo/pom.xml | 20 +------------------- 2 files changed, 26 insertions(+), 20 deletions(-) diff --git a/pom.xml b/pom.xml index 960cf6f3bb..a97b4f3d73 100644 --- a/pom.xml +++ b/pom.xml @@ -171,7 +171,8 @@ -Xmx1024m -XX:MaxPermSize=256m -Duser.language=en -Dcom.sun.management.jmxremote true false - 6.0.0 + 1.1.0 + 2.9.5 @@ -191,6 +192,29 @@ 4.12 test + + + com.fasterxml.jackson.core + jackson-core + ${dependency.jackson.version} + + + com.fasterxml.jackson.core + jackson-annotations + ${dependency.jackson.version} + + + com.fasterxml.jackson.core + jackson-databind + ${dependency.jackson.version} + + + + com.fasterxml.jackson.datatype + jackson-datatype-joda + ${dependency.jackson.version} + test + diff --git a/rm-community/rm-community-repo/pom.xml b/rm-community/rm-community-repo/pom.xml index 505ae7ade1..5ab5870216 100644 --- a/rm-community/rm-community-repo/pom.xml +++ b/rm-community/rm-community-repo/pom.xml @@ -30,7 +30,7 @@ 7.2 8.5 - 6.49 + 6.50 6.31 1.0.8 6.0 @@ -340,24 +340,6 @@ alfresco-data-model ${dependency.alfresco-data-model.version} - - com.fasterxml.jackson.core - jackson-databind - 2.9.5 - provided - - - com.fasterxml.jackson.core - jackson-annotations - 2.9.5 - provided - - - com.fasterxml.jackson.datatype - jackson-datatype-joda - 2.9.5 - test - org.springframework From 3fb155405ec687c4235666b18811f293d8bf124e Mon Sep 17 00:00:00 2001 From: Rodica Sutu Date: Thu, 24 May 2018 17:42:31 +0300 Subject: [PATCH 19/99] attempt to fix integration tests --- rm-community/rm-community-repo/test/resources/test-context.xml | 2 +- .../rm-community-repo/test/resources/test-job-context.xml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/rm-community/rm-community-repo/test/resources/test-context.xml b/rm-community/rm-community-repo/test/resources/test-context.xml index 3ed57e4507..633dc913a4 100644 --- a/rm-community/rm-community-repo/test/resources/test-context.xml +++ b/rm-community/rm-community-repo/test/resources/test-context.xml @@ -238,7 +238,7 @@ Search - noindex + ${index.subsystem.name} diff --git a/rm-community/rm-community-repo/test/resources/test-job-context.xml b/rm-community/rm-community-repo/test/resources/test-job-context.xml index 3760eb3741..57c1851176 100644 --- a/rm-community/rm-community-repo/test/resources/test-job-context.xml +++ b/rm-community/rm-community-repo/test/resources/test-job-context.xml @@ -12,7 +12,7 @@ class="org.springframework.scheduling.quartz.CronTriggerFactoryBean"> - + From 8749a21ea875c603277349fc32a9478e469407bd Mon Sep 17 00:00:00 2001 From: Rodica Sutu Date: Fri, 25 May 2018 16:30:21 +0300 Subject: [PATCH 20/99] use the core implementation for creating the path element --- .../rest/api/impl/ApiNodesModelFactory.java | 2 +- .../api/impl/FilePlanComponentsApiUtils.java | 53 ------------------- 2 files changed, 1 insertion(+), 54 deletions(-) diff --git a/rm-community/rm-community-repo/source/java/org/alfresco/rm/rest/api/impl/ApiNodesModelFactory.java b/rm-community/rm-community-repo/source/java/org/alfresco/rm/rest/api/impl/ApiNodesModelFactory.java index 7e81647f8c..1a35c42c69 100644 --- a/rm-community/rm-community-repo/source/java/org/alfresco/rm/rest/api/impl/ApiNodesModelFactory.java +++ b/rm-community/rm-community-repo/source/java/org/alfresco/rm/rest/api/impl/ApiNodesModelFactory.java @@ -237,7 +237,7 @@ public class ApiNodesModelFactory } if (includeParam.contains(RMNode.PARAM_PATH)) { - rmNode.setPath(apiUtils.lookupPathInfo(info.getNodeRef())); + rmNode.setPath(nodes.lookupPathInfo(info.getNodeRef(), null)); } if (isMinimalInfo && includeParam.contains(RMNode.PARAM_ASPECT_NAMES)) { diff --git a/rm-community/rm-community-repo/source/java/org/alfresco/rm/rest/api/impl/FilePlanComponentsApiUtils.java b/rm-community/rm-community-repo/source/java/org/alfresco/rm/rest/api/impl/FilePlanComponentsApiUtils.java index 0c010b5020..506128ea3b 100644 --- a/rm-community/rm-community-repo/source/java/org/alfresco/rm/rest/api/impl/FilePlanComponentsApiUtils.java +++ b/rm-community/rm-community-repo/source/java/org/alfresco/rm/rest/api/impl/FilePlanComponentsApiUtils.java @@ -948,59 +948,6 @@ public class FilePlanComponentsApiUtils return allowableOperations; } - protected PathInfo lookupPathInfo(NodeRef nodeRefIn) - { - List pathElements = new ArrayList<>(); - Boolean isComplete = Boolean.TRUE; - final Path nodePath = nodeService.getPath(nodeRefIn);; - final int pathIndex = 2; - - for (int i = nodePath.size() - pathIndex; i >= 0; i--) - { - Element element = nodePath.get(i); - if (element instanceof Path.ChildAssocElement) - { - ChildAssociationRef elementRef = ((Path.ChildAssocElement) element).getRef(); - if (elementRef.getParentRef() != null) - { - NodeRef childNodeRef = elementRef.getChildRef(); - if (permissionService.hasPermission(childNodeRef, PermissionService.READ) == AccessStatus.ALLOWED) - { - Serializable nameProp = nodeService.getProperty(childNodeRef, ContentModel.PROP_NAME); - String type = nodeService.getType(childNodeRef).toPrefixString(); - Set < QName > aspects = nodeService.getAspects(childNodeRef); - List < String > aspectNames = nodes.mapFromNodeAspects(aspects, Collections.emptyList(), Collections.emptyList()); - pathElements.add(0, new ElementInfo(childNodeRef.getId(), nameProp.toString(),type, aspectNames)); - } - else - { - // Just return the pathInfo up to the location where the user has access - isComplete = Boolean.FALSE; - break; - } - } - } - } - - String pathStr = null; - if (!pathElements.isEmpty()) - { - StringBuilder sb = new StringBuilder(120); - for (PathInfo.ElementInfo e : pathElements) - { - sb.append("/").append(e.getName()); - } - pathStr = sb.toString(); - } - else - { - // There is no path element, so set it to null in order to be - // ignored by Jackson during serialisation - isComplete = null; - } - return new PathInfo(pathStr, isComplete, pathElements); - } - /** * Helper method to obtain file plan type or null if the rm site does not exist. * From 2a275f3984bc11881d6dbb19039a21c270914765 Mon Sep 17 00:00:00 2001 From: Sara Aspery Date: Mon, 28 May 2018 19:32:24 +0100 Subject: [PATCH 21/99] RM-6353 Fix Yaml Unit Test --- .../test/util/BaseYamlUnitTest.java | 27 ++++++++++++++----- 1 file changed, 20 insertions(+), 7 deletions(-) diff --git a/rm-community/rm-community-repo/unit-test/java/org/alfresco/module/org_alfresco_module_rm/test/util/BaseYamlUnitTest.java b/rm-community/rm-community-repo/unit-test/java/org/alfresco/module/org_alfresco_module_rm/test/util/BaseYamlUnitTest.java index eb0135c97b..59f4c1a7b7 100644 --- a/rm-community/rm-community-repo/unit-test/java/org/alfresco/module/org_alfresco_module_rm/test/util/BaseYamlUnitTest.java +++ b/rm-community/rm-community-repo/unit-test/java/org/alfresco/module/org_alfresco_module_rm/test/util/BaseYamlUnitTest.java @@ -27,6 +27,7 @@ package org.alfresco.module.org_alfresco_module_rm.test.util; +import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertNotNull; import static org.junit.Assert.assertTrue; @@ -38,6 +39,7 @@ import java.nio.file.Files; import java.nio.file.Paths; import java.util.Collection; import java.util.HashSet; +import java.util.Iterator; import java.util.Set; import com.fasterxml.jackson.databind.JsonNode; @@ -45,14 +47,16 @@ import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.dataformat.yaml.YAMLFactory; import com.github.fge.jackson.JsonLoader; import com.github.fge.jsonschema.core.exceptions.ProcessingException; +import com.github.fge.jsonschema.core.report.ProcessingMessage; import com.github.fge.jsonschema.core.report.ProcessingReport; import com.github.fge.jsonschema.main.JsonSchema; import com.github.fge.jsonschema.main.JsonSchemaFactory; +import io.swagger.models.Swagger; +import io.swagger.parser.SwaggerParser; import org.apache.commons.io.FileUtils; import org.apache.commons.io.IOUtils; import org.apache.commons.io.filefilter.WildcardFileFilter; -import org.yaml.snakeyaml.parser.ParserException; /** * Base class for unit tests for Yaml files. @@ -97,16 +101,16 @@ public class BaseYamlUnitTest assertTrue("Yaml file is not valid Swagger " + OPEN_API_SPECIFICATION + ": " + yamlFilePath, validateYamlFile(yamlFilePath, swaggerSchema)); - /* // check can read the swagger object to obtain the swagger version + // check can read the swagger object to obtain the swagger version Swagger swagger = new SwaggerParser().read(yamlFilePath); assertEquals("Failed to obtain Swagger version from yaml file " + yamlFilePath, - swagger.getSwagger(), OPEN_API_SPECIFICATION);*/ + swagger.getSwagger(), OPEN_API_SPECIFICATION); } - catch (ParserException ex) + catch (ProcessingException ex) { // ensure the yaml filename is included in the message - String context = String.format(yamlFilePath + ": %n" + ex.getContext()); - throw new ParserException(context, ex.getContextMark(), ex.getProblem(), ex.getProblemMark()) ; + String context = String.format(yamlFilePath + ": %n" + ex.getMessage()); + throw new ProcessingException(context) ; } } } @@ -152,6 +156,15 @@ public class BaseYamlUnitTest { final JsonNode dataNode = JsonLoader.fromString(jsonData); final ProcessingReport report = schema.validate(dataNode); - return report.isSuccess(); + boolean isOk = report.isSuccess(); + if (!isOk) + { + Iterator messages = report.iterator(); + if (messages.hasNext()) + { + throw new ProcessingException(messages.next().toString()); + } + } + return isOk; } } From 4f3aef35bf892d993571c1d1715db5c7ee8a4a50 Mon Sep 17 00:00:00 2001 From: Roxana Lucanu-Ghetu Date: Mon, 28 May 2018 22:48:57 +0300 Subject: [PATCH 22/99] RM-6337 Fix visibility conditions for accession step. --- .../disposition/DispositionServiceImpl.java | 25 +++++++++++++++---- .../jscript/app/JSONConversionComponent.java | 3 ++- 2 files changed, 22 insertions(+), 6 deletions(-) diff --git a/rm-community/rm-community-repo/source/java/org/alfresco/module/org_alfresco_module_rm/disposition/DispositionServiceImpl.java b/rm-community/rm-community-repo/source/java/org/alfresco/module/org_alfresco_module_rm/disposition/DispositionServiceImpl.java index 0da309a7c8..52fd93cf04 100644 --- a/rm-community/rm-community-repo/source/java/org/alfresco/module/org_alfresco_module_rm/disposition/DispositionServiceImpl.java +++ b/rm-community/rm-community-repo/source/java/org/alfresco/module/org_alfresco_module_rm/disposition/DispositionServiceImpl.java @@ -814,28 +814,43 @@ public class DispositionServiceImpl extends ServiceBaseImpl // Get the disposition instructions DispositionSchedule di = getDispositionSchedule(nodeRef); - NodeRef nextDa = getNextDispositionActionNodeRef(nodeRef); + NodeRef accessionNodeRef = di.getDispositionActionDefinitionByName("accession").getNodeRef(); + DispositionAction nextDa = getNextDispositionAction(nodeRef); if (di != null && this.nodeService.hasAspect(nodeRef, ASPECT_DISPOSITION_LIFECYCLE) && nextDa != null) { + Boolean combineSteps = null; + if (nextDa.getName().equals("accession")) + { + combineSteps = (Boolean)nodeService.getProperty(accessionNodeRef, PROP_COMBINE_DISPOSITION_STEP_CONDITIONS); + } + // If it has an asOf date and it is greater than now the action is eligible - Date asOf = (Date)this.nodeService.getProperty(nextDa, PROP_DISPOSITION_AS_OF); + Date asOf = (Date)this.nodeService.getProperty(nextDa.getNodeRef(), PROP_DISPOSITION_AS_OF); if (asOf != null && asOf.before(new Date())) { result = true; + if (combineSteps == null || !combineSteps) + { + return true; + } + } + else if(combineSteps != null && combineSteps) + { + return false; } - if (!result) + if (!result || (result && combineSteps)) { - DispositionAction da = new DispositionActionImpl(serviceRegistry, nextDa); + DispositionAction da = new DispositionActionImpl(serviceRegistry, nextDa.getNodeRef()); DispositionActionDefinition dad = da.getDispositionActionDefinition(); if (dad != null) { boolean firstComplete = dad.eligibleOnFirstCompleteEvent(); - List assocs = this.nodeService.getChildAssocs(nextDa, ASSOC_EVENT_EXECUTIONS, RegexQNamePattern.MATCH_ALL); + List assocs = this.nodeService.getChildAssocs(nextDa.getNodeRef(), ASSOC_EVENT_EXECUTIONS, RegexQNamePattern.MATCH_ALL); for (ChildAssociationRef assoc : assocs) { NodeRef eventExecution = assoc.getChildRef(); diff --git a/rm-community/rm-community-repo/source/java/org/alfresco/module/org_alfresco_module_rm/jscript/app/JSONConversionComponent.java b/rm-community/rm-community-repo/source/java/org/alfresco/module/org_alfresco_module_rm/jscript/app/JSONConversionComponent.java index da2a7234a3..4a9c6c633a 100644 --- a/rm-community/rm-community-repo/source/java/org/alfresco/module/org_alfresco_module_rm/jscript/app/JSONConversionComponent.java +++ b/rm-community/rm-community-repo/source/java/org/alfresco/module/org_alfresco_module_rm/jscript/app/JSONConversionComponent.java @@ -29,7 +29,7 @@ package org.alfresco.module.org_alfresco_module_rm.jscript.app; import static org.alfresco.module.org_alfresco_module_rm.capability.RMPermissionModel.READ_RECORDS; import static org.alfresco.module.org_alfresco_module_rm.model.RecordsManagementModel.PROP_COMBINE_DISPOSITION_STEP_CONDITIONS; -import static org.alfresco.module.org_alfresco_module_rm.model.RecordsManagementModel.PROP_RS_DISPOSITION_EVENTS; +import static org.alfresco.module.org_alfresco_module_rm.model.RecordsManagementModel.PROP_DISPOSITION_EVENT_COMBINATION; import static org.alfresco.service.cmr.security.AccessStatus.ALLOWED; import java.util.ArrayList; @@ -485,6 +485,7 @@ public class JSONConversionComponent extends org.alfresco.repo.jscript.app.JS HashMap properties = ((HashMap) rmNodeValues.get("properties")); properties.put("combineDispositionStepConditions", nodeService.getProperty(dispositionService.getNextDispositionAction(nodeRef).getDispositionActionDefinition().getNodeRef(), PROP_COMBINE_DISPOSITION_STEP_CONDITIONS)); properties.put("incompleteDispositionEvent", details.getEventName()); + properties.put("dispositionEventCombination", nodeService.getProperty(dispositionService.getNextDispositionAction(nodeRef).getDispositionActionDefinition().getNodeRef(), PROP_DISPOSITION_EVENT_COMBINATION)); break; } } From 125614fe180593d52e3071f51890cceabc82474d Mon Sep 17 00:00:00 2001 From: Roxana Lucanu-Ghetu Date: Mon, 28 May 2018 23:53:59 +0300 Subject: [PATCH 23/99] RM-6337 Fix failing tests --- .../disposition/DispositionServiceImpl.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/rm-community/rm-community-repo/source/java/org/alfresco/module/org_alfresco_module_rm/disposition/DispositionServiceImpl.java b/rm-community/rm-community-repo/source/java/org/alfresco/module/org_alfresco_module_rm/disposition/DispositionServiceImpl.java index 52fd93cf04..86a67b2fb8 100644 --- a/rm-community/rm-community-repo/source/java/org/alfresco/module/org_alfresco_module_rm/disposition/DispositionServiceImpl.java +++ b/rm-community/rm-community-repo/source/java/org/alfresco/module/org_alfresco_module_rm/disposition/DispositionServiceImpl.java @@ -814,7 +814,6 @@ public class DispositionServiceImpl extends ServiceBaseImpl // Get the disposition instructions DispositionSchedule di = getDispositionSchedule(nodeRef); - NodeRef accessionNodeRef = di.getDispositionActionDefinitionByName("accession").getNodeRef(); DispositionAction nextDa = getNextDispositionAction(nodeRef); if (di != null && this.nodeService.hasAspect(nodeRef, ASPECT_DISPOSITION_LIFECYCLE) && @@ -823,6 +822,7 @@ public class DispositionServiceImpl extends ServiceBaseImpl Boolean combineSteps = null; if (nextDa.getName().equals("accession")) { + NodeRef accessionNodeRef = di.getDispositionActionDefinitionByName("accession").getNodeRef(); combineSteps = (Boolean)nodeService.getProperty(accessionNodeRef, PROP_COMBINE_DISPOSITION_STEP_CONDITIONS); } From cee5c4cea942460fbfb490322633b7d6ae62282b Mon Sep 17 00:00:00 2001 From: Rodica Sutu Date: Tue, 29 May 2018 10:46:38 +0300 Subject: [PATCH 24/99] tidy up the community pom files --- pom.xml | 76 ++++++++++++- rm-community/pom.xml | 2 - rm-community/rm-community-repo/pom.xml | 141 +++---------------------- 3 files changed, 88 insertions(+), 131 deletions(-) diff --git a/pom.xml b/pom.xml index a97b4f3d73..78ac1e1d1e 100644 --- a/pom.xml +++ b/pom.xml @@ -171,8 +171,9 @@ -Xmx1024m -XX:MaxPermSize=256m -Duser.language=en -Dcom.sun.management.jmxremote true false - 1.1.0 + 6.0.0 2.9.5 + 5.0.4.RELEASE @@ -192,7 +193,6 @@ 4.12 test - com.fasterxml.jackson.core jackson-core @@ -208,11 +208,81 @@ jackson-databind ${dependency.jackson.version} - com.fasterxml.jackson.datatype jackson-datatype-joda ${dependency.jackson.version} + + + org.springframework + spring-aop + ${dependency.spring.version} + + + org.springframework + spring-beans + ${dependency.spring.version} + + + org.springframework + spring-context + ${dependency.spring.version} + + + org.springframework + spring-context-support + ${dependency.spring.version} + + + org.springframework + spring-core + ${dependency.spring.version} + + + org.springframework + spring-expression + ${dependency.spring.version} + + + org.springframework + spring-jdbc + ${dependency.spring.version} + + + org.springframework + spring-jms + ${dependency.spring.version} + + + org.springframework + spring-orm + ${dependency.spring.version} + + + org.springframework + spring-tx + ${dependency.spring.version} + + + org.springframework + spring-web + ${dependency.spring.version} + + + org.springframework + spring-webmvc + ${dependency.spring.version} + + + org.springframework + spring-test + ${dependency.spring.version} + test + + + org.mockito + mockito-all + 1.10.19 test diff --git a/rm-community/pom.xml b/rm-community/pom.xml index 81e55d50d6..a4e51ab7f5 100644 --- a/rm-community/pom.xml +++ b/rm-community/pom.xml @@ -44,10 +44,8 @@ 6.0.5-ea - 6.0.a true - diff --git a/rm-community/rm-community-repo/pom.xml b/rm-community/rm-community-repo/pom.xml index 5ab5870216..84b7011675 100644 --- a/rm-community/rm-community-repo/pom.xml +++ b/rm-community/rm-community-repo/pom.xml @@ -13,6 +13,7 @@ + ${basedir}/target/alf_test_data org.alfresco.repo.domain.dialect.MySQLInnoDBDialect alfresco @@ -21,7 +22,7 @@ localhost alfresco-platform 9.1-901.jdbc4 - 5.1.31 + 5.1.40 alfresco-rm-community-repo true ${project.build.directory}/solr/home @@ -32,29 +33,14 @@ 8.5 6.50 6.31 - 1.0.8 - 6.0 - 1.1 - 2.3 - 7.0 - 6.0 - 1.2.8 - 5.0.4.RELEASE - 3.5.37 + 6.17 6.0.a 6.0.a - - 3.1.0-RC1 - - 1.2.0-RC2 6.7 - ${project.version} - alfresco-community - ${alfresco.package.name}-distribution 42.2.1 5.1.40 @@ -327,92 +313,29 @@ - - - org.alfresco - alfresco-data-model - ${dependency.alfresco-data-model.version} - - - - org.springframework - spring-aop - ${dependency.spring.version} - - - org.springframework - spring-beans - ${dependency.spring.version} - - - org.springframework - spring-context - ${dependency.spring.version} - - - org.springframework - spring-context-support - ${dependency.spring.version} - - - org.springframework - spring-core - ${dependency.spring.version} - - - org.springframework - spring-expression - ${dependency.spring.version} - - - org.springframework - spring-jdbc - ${dependency.spring.version} - - - org.springframework - spring-jms - ${dependency.spring.version} - - - org.springframework - spring-orm - ${dependency.spring.version} - - - org.springframework - spring-tx - ${dependency.spring.version} - - - org.springframework - spring-web - ${dependency.spring.version} - - - org.springframework - spring-webmvc - ${dependency.spring.version} - ${alfresco.groupId} alfresco-remote-api ${dependency.alfresco-remote-api.version} provided - + + org.alfresco + alfresco-data-model + ${dependency.alfresco-data-model.version} + javax.servlet javax.servlet-api provided + + org.alfresco.surf + spring-webscripts + ${dependency.alfresco-spring-webscripts.version} + tests + test + io.takari.junit takari-cpsuite @@ -424,25 +347,6 @@ junit test - - org.alfresco.surf - spring-webscripts - 6.13 - tests - test - - - org.mockito - mockito-all - 1.10.19 - test - - - org.springframework - spring-test - 5.0.4.RELEASE - test - ${alfresco.groupId} alfresco-core @@ -482,21 +386,6 @@ ${dependency.mysql.version} test - org.reflections reflections From 07ed0a55ec7716044aaa008eb0f836c92858843b Mon Sep 17 00:00:00 2001 From: Rodica Sutu Date: Tue, 29 May 2018 11:30:56 +0300 Subject: [PATCH 25/99] tidy up enterprise pom files --- rm-community/rm-community-repo/pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/rm-community/rm-community-repo/pom.xml b/rm-community/rm-community-repo/pom.xml index 84b7011675..34e525d83c 100644 --- a/rm-community/rm-community-repo/pom.xml +++ b/rm-community/rm-community-repo/pom.xml @@ -30,7 +30,7 @@ 7.2 - 8.5 + 8.7 6.50 6.31 6.17 From 758ae020bd557c0cb0d3992ccbd03639d7148d07 Mon Sep 17 00:00:00 2001 From: Roxana Lucanu-Ghetu Date: Tue, 29 May 2018 15:21:59 +0300 Subject: [PATCH 26/99] RM-6337 Code review changes --- .../disposition/DispositionServiceImpl.java | 86 +++++++++---------- 1 file changed, 42 insertions(+), 44 deletions(-) diff --git a/rm-community/rm-community-repo/source/java/org/alfresco/module/org_alfresco_module_rm/disposition/DispositionServiceImpl.java b/rm-community/rm-community-repo/source/java/org/alfresco/module/org_alfresco_module_rm/disposition/DispositionServiceImpl.java index 86a67b2fb8..c9d33dd7f9 100644 --- a/rm-community/rm-community-repo/source/java/org/alfresco/module/org_alfresco_module_rm/disposition/DispositionServiceImpl.java +++ b/rm-community/rm-community-repo/source/java/org/alfresco/module/org_alfresco_module_rm/disposition/DispositionServiceImpl.java @@ -811,7 +811,6 @@ public class DispositionServiceImpl extends ServiceBaseImpl public boolean isNextDispositionActionEligible(NodeRef nodeRef) { boolean result = false; - // Get the disposition instructions DispositionSchedule di = getDispositionSchedule(nodeRef); DispositionAction nextDa = getNextDispositionAction(nodeRef); @@ -819,70 +818,69 @@ public class DispositionServiceImpl extends ServiceBaseImpl this.nodeService.hasAspect(nodeRef, ASPECT_DISPOSITION_LIFECYCLE) && nextDa != null) { - Boolean combineSteps = null; + // for accession step we can have also AND between step conditions + Boolean combineSteps = false; if (nextDa.getName().equals("accession")) { NodeRef accessionNodeRef = di.getDispositionActionDefinitionByName("accession").getNodeRef(); - combineSteps = (Boolean)nodeService.getProperty(accessionNodeRef, PROP_COMBINE_DISPOSITION_STEP_CONDITIONS); - } - - // If it has an asOf date and it is greater than now the action is eligible - Date asOf = (Date)this.nodeService.getProperty(nextDa.getNodeRef(), PROP_DISPOSITION_AS_OF); - if (asOf != null && - asOf.before(new Date())) - { - result = true; - if (combineSteps == null || !combineSteps) - { - return true; + if (accessionNodeRef != null) { + if (this.nodeService.getProperty(accessionNodeRef, PROP_COMBINE_DISPOSITION_STEP_CONDITIONS) != null) + { + combineSteps = (Boolean)this.nodeService.getProperty(accessionNodeRef, PROP_COMBINE_DISPOSITION_STEP_CONDITIONS); + } } } - else if(combineSteps != null && combineSteps) + Date asOf = (Date)this.nodeService.getProperty(nextDa.getNodeRef(), PROP_DISPOSITION_AS_OF); + Boolean asOfDateInPast = false; + if (asOf != null) + { + asOfDateInPast = ((Date) this.nodeService.getProperty(nextDa.getNodeRef(), PROP_DISPOSITION_AS_OF)).before(new Date()); + } + if (asOfDateInPast && !combineSteps) + { + return true; + } + else if(!asOfDateInPast && combineSteps) { return false; } - - if (!result || (result && combineSteps)) + DispositionAction da = new DispositionActionImpl(serviceRegistry, nextDa.getNodeRef()); + DispositionActionDefinition dad = da.getDispositionActionDefinition(); + if (dad != null) { - DispositionAction da = new DispositionActionImpl(serviceRegistry, nextDa.getNodeRef()); - DispositionActionDefinition dad = da.getDispositionActionDefinition(); - if (dad != null) + boolean firstComplete = dad.eligibleOnFirstCompleteEvent(); + + List assocs = this.nodeService.getChildAssocs(nextDa.getNodeRef(), ASSOC_EVENT_EXECUTIONS, RegexQNamePattern.MATCH_ALL); + for (ChildAssociationRef assoc : assocs) { - boolean firstComplete = dad.eligibleOnFirstCompleteEvent(); - - List assocs = this.nodeService.getChildAssocs(nextDa.getNodeRef(), ASSOC_EVENT_EXECUTIONS, RegexQNamePattern.MATCH_ALL); - for (ChildAssociationRef assoc : assocs) + NodeRef eventExecution = assoc.getChildRef(); + Boolean isCompleteValue = (Boolean)this.nodeService.getProperty(eventExecution, PROP_EVENT_EXECUTION_COMPLETE); + boolean isComplete = false; + if (isCompleteValue != null) { - NodeRef eventExecution = assoc.getChildRef(); - Boolean isCompleteValue = (Boolean)this.nodeService.getProperty(eventExecution, PROP_EVENT_EXECUTION_COMPLETE); - boolean isComplete = false; - if (isCompleteValue != null) - { - isComplete = isCompleteValue.booleanValue(); + isComplete = isCompleteValue.booleanValue(); - // implement AND and OR combination of event completions - if (isComplete) + // implement AND and OR combination of event completions + if (isComplete) + { + result = true; + if (firstComplete) { - result = true; - if (firstComplete) - { - break; - } + break; } - else + } + else + { + result = false; + if (!firstComplete) { - result = false; - if (!firstComplete) - { - break; - } + break; } } } } } } - return result; } From e6551ca10c0804a5fe9c7d130c4dcb76ead2540e Mon Sep 17 00:00:00 2001 From: Rodica Sutu Date: Tue, 29 May 2018 15:00:53 +0300 Subject: [PATCH 27/99] reshuffle dependencies --- pom.xml | 93 +------------------------ rm-community/rm-community-repo/pom.xml | 95 +++++++++++++++++++++++++- 2 files changed, 94 insertions(+), 94 deletions(-) diff --git a/pom.xml b/pom.xml index 78ac1e1d1e..07e360b47c 100644 --- a/pom.xml +++ b/pom.xml @@ -174,6 +174,7 @@ 6.0.0 2.9.5 5.0.4.RELEASE + 1.10.19 @@ -193,98 +194,6 @@ 4.12 test - - com.fasterxml.jackson.core - jackson-core - ${dependency.jackson.version} - - - com.fasterxml.jackson.core - jackson-annotations - ${dependency.jackson.version} - - - com.fasterxml.jackson.core - jackson-databind - ${dependency.jackson.version} - - - com.fasterxml.jackson.datatype - jackson-datatype-joda - ${dependency.jackson.version} - - - org.springframework - spring-aop - ${dependency.spring.version} - - - org.springframework - spring-beans - ${dependency.spring.version} - - - org.springframework - spring-context - ${dependency.spring.version} - - - org.springframework - spring-context-support - ${dependency.spring.version} - - - org.springframework - spring-core - ${dependency.spring.version} - - - org.springframework - spring-expression - ${dependency.spring.version} - - - org.springframework - spring-jdbc - ${dependency.spring.version} - - - org.springframework - spring-jms - ${dependency.spring.version} - - - org.springframework - spring-orm - ${dependency.spring.version} - - - org.springframework - spring-tx - ${dependency.spring.version} - - - org.springframework - spring-web - ${dependency.spring.version} - - - org.springframework - spring-webmvc - ${dependency.spring.version} - - - org.springframework - spring-test - ${dependency.spring.version} - test - - - org.mockito - mockito-all - 1.10.19 - test - diff --git a/rm-community/rm-community-repo/pom.xml b/rm-community/rm-community-repo/pom.xml index 34e525d83c..b7f8853f51 100644 --- a/rm-community/rm-community-repo/pom.xml +++ b/rm-community/rm-community-repo/pom.xml @@ -406,12 +406,103 @@ 2.2.6 test + + org.mockito + mockito-all + ${dependency.mockito.version} + test + + + com.fasterxml.jackson.core + jackson-core + ${dependency.jackson.version} + + + com.fasterxml.jackson.core + jackson-annotations + ${dependency.jackson.version} + + + com.fasterxml.jackson.core + jackson-databind + ${dependency.jackson.version} + + + com.fasterxml.jackson.datatype + jackson-datatype-joda + ${dependency.jackson.version} + com.fasterxml.jackson.dataformat jackson-dataformat-yaml - 2.9.5 + ${dependency.jackson.version} + + + org.springframework + spring-aop + ${dependency.spring.version} + + + org.springframework + spring-beans + ${dependency.spring.version} + + + org.springframework + spring-context + ${dependency.spring.version} + + + org.springframework + spring-context-support + ${dependency.spring.version} + + + org.springframework + spring-core + ${dependency.spring.version} + + + org.springframework + spring-expression + ${dependency.spring.version} + + + org.springframework + spring-jdbc + ${dependency.spring.version} + + + org.springframework + spring-jms + ${dependency.spring.version} + + + org.springframework + spring-orm + ${dependency.spring.version} + + + org.springframework + spring-tx + ${dependency.spring.version} + + + org.springframework + spring-web + ${dependency.spring.version} + + + org.springframework + spring-webmvc + ${dependency.spring.version} + + + org.springframework + spring-test + ${dependency.spring.version} + test - From 1ece45f8344b79ca2da3f9eadd321024f711b664 Mon Sep 17 00:00:00 2001 From: Roxana Lucanu-Ghetu Date: Wed, 30 May 2018 09:38:25 +0300 Subject: [PATCH 28/99] RM-6337 Code review changes --- .../disposition/DispositionServiceImpl.java | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/rm-community/rm-community-repo/source/java/org/alfresco/module/org_alfresco_module_rm/disposition/DispositionServiceImpl.java b/rm-community/rm-community-repo/source/java/org/alfresco/module/org_alfresco_module_rm/disposition/DispositionServiceImpl.java index c9d33dd7f9..abe1efba5f 100644 --- a/rm-community/rm-community-repo/source/java/org/alfresco/module/org_alfresco_module_rm/disposition/DispositionServiceImpl.java +++ b/rm-community/rm-community-repo/source/java/org/alfresco/module/org_alfresco_module_rm/disposition/DispositionServiceImpl.java @@ -824,9 +824,10 @@ public class DispositionServiceImpl extends ServiceBaseImpl { NodeRef accessionNodeRef = di.getDispositionActionDefinitionByName("accession").getNodeRef(); if (accessionNodeRef != null) { - if (this.nodeService.getProperty(accessionNodeRef, PROP_COMBINE_DISPOSITION_STEP_CONDITIONS) != null) + Boolean combineStepsProp = (Boolean)this.nodeService.getProperty(accessionNodeRef, PROP_COMBINE_DISPOSITION_STEP_CONDITIONS); + if (combineStepsProp != null) { - combineSteps = (Boolean)this.nodeService.getProperty(accessionNodeRef, PROP_COMBINE_DISPOSITION_STEP_CONDITIONS); + combineSteps = combineStepsProp; } } } @@ -834,7 +835,7 @@ public class DispositionServiceImpl extends ServiceBaseImpl Boolean asOfDateInPast = false; if (asOf != null) { - asOfDateInPast = ((Date) this.nodeService.getProperty(nextDa.getNodeRef(), PROP_DISPOSITION_AS_OF)).before(new Date()); + asOfDateInPast = asOf.before(new Date()); } if (asOfDateInPast && !combineSteps) { From 3ce7d7ffb8d9320ddb1c8f1fc9713fd6c940454f Mon Sep 17 00:00:00 2001 From: Rodica Sutu Date: Thu, 31 May 2018 09:48:30 +0300 Subject: [PATCH 29/99] review changes --- pom.xml | 5 ++- rm-community/rm-community-repo/pom.xml | 39 ++----------------- .../test/resources/test-context.xml | 3 +- .../test/resources/test-job-context.xml | 1 - 4 files changed, 8 insertions(+), 40 deletions(-) diff --git a/pom.xml b/pom.xml index 07e360b47c..a7d6c1df38 100644 --- a/pom.xml +++ b/pom.xml @@ -171,10 +171,11 @@ -Xmx1024m -XX:MaxPermSize=256m -Duser.language=en -Dcom.sun.management.jmxremote true false - 6.0.0 2.9.5 5.0.4.RELEASE 1.10.19 + 42.2.1 + 5.1.40 @@ -231,7 +232,7 @@ rm.module.repo.version.min - ${alfresco.min.version} + ${alfresco.version} (\d+)\.(\d+).* $1.$2 false diff --git a/rm-community/rm-community-repo/pom.xml b/rm-community/rm-community-repo/pom.xml index b7f8853f51..329c0970bf 100644 --- a/rm-community/rm-community-repo/pom.xml +++ b/rm-community/rm-community-repo/pom.xml @@ -22,13 +22,12 @@ localhost alfresco-platform 9.1-901.jdbc4 - 5.1.40 alfresco-rm-community-repo true ${project.build.directory}/solr/home - 6.0.4-ea + 6.0.4-ea 7.2 8.7 6.50 @@ -41,8 +40,6 @@ Deprecated SOLR4 app, still packaged for downward compatibility --> 6.7 - 42.2.1 - 5.1.40 @@ -192,7 +189,6 @@ ${alfresco.groupId} - content-services-community war ${alfresco.version} @@ -487,16 +483,6 @@ spring-tx ${dependency.spring.version} - - org.springframework - spring-web - ${dependency.spring.version} - - - org.springframework - spring-webmvc - ${dependency.spring.version} - org.springframework spring-test @@ -549,12 +535,9 @@ ${alfresco.groupId} - content-services-community war - - - 6.0.5-ea + ${alfresco.version} @@ -722,22 +705,8 @@ mysql mysql-connector-java - ${alfresco.mysql.version} + ${dependency.mysql.version} - @@ -767,7 +736,7 @@ mysql mysql-connector-java - ${alfresco.mysql.version} + ${dependency.mysql.version} diff --git a/rm-community/rm-community-repo/test/resources/test-context.xml b/rm-community/rm-community-repo/test/resources/test-context.xml index 633dc913a4..02fa268020 100644 --- a/rm-community/rm-community-repo/test/resources/test-context.xml +++ b/rm-community/rm-community-repo/test/resources/test-context.xml @@ -124,7 +124,6 @@ class="org.springframework.scheduling.quartz.CronTriggerFactoryBean"> - 0 30 3 * * ? @@ -232,7 +231,7 @@ - false + start Search diff --git a/rm-community/rm-community-repo/test/resources/test-job-context.xml b/rm-community/rm-community-repo/test/resources/test-job-context.xml index 57c1851176..2e93fcc1fb 100644 --- a/rm-community/rm-community-repo/test/resources/test-job-context.xml +++ b/rm-community/rm-community-repo/test/resources/test-job-context.xml @@ -11,7 +11,6 @@ - From d33720fa159b25e4c84abdd291715d2782e3f0af Mon Sep 17 00:00:00 2001 From: Rodica Sutu Date: Thu, 31 May 2018 10:13:31 +0300 Subject: [PATCH 30/99] fix the wrong value for Search bean --- rm-community/rm-community-repo/test/resources/test-context.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/rm-community/rm-community-repo/test/resources/test-context.xml b/rm-community/rm-community-repo/test/resources/test-context.xml index 02fa268020..0e6459074d 100644 --- a/rm-community/rm-community-repo/test/resources/test-context.xml +++ b/rm-community/rm-community-repo/test/resources/test-context.xml @@ -231,7 +231,7 @@ - start + false Search From 917f250137e2a75690fa91ad6368454f03a7af9b Mon Sep 17 00:00:00 2001 From: Rodica Sutu Date: Fri, 1 Jun 2018 10:28:20 +0300 Subject: [PATCH 31/99] remove dependencies not needed --- rm-community/rm-community-repo/pom.xml | 107 ++++++------------------- 1 file changed, 24 insertions(+), 83 deletions(-) diff --git a/rm-community/rm-community-repo/pom.xml b/rm-community/rm-community-repo/pom.xml index 329c0970bf..88a212e572 100644 --- a/rm-community/rm-community-repo/pom.xml +++ b/rm-community/rm-community-repo/pom.xml @@ -28,10 +28,8 @@ 6.0.4-ea - 7.2 - 8.7 6.50 - 6.31 + 6.35 6.17 6.0.a @@ -316,9 +314,24 @@ provided - org.alfresco - alfresco-data-model - ${dependency.alfresco-data-model.version} + ${alfresco.groupId} + alfresco-repository + ${dependency.alfresco-repository.version} + provided + + + ${alfresco.groupId} + alfresco-repository + ${dependency.alfresco-repository.version} + tests + test + + + ${alfresco.groupId} + alfresco-remote-api + ${dependency.alfresco-remote-api.version} + tests + test javax.servlet @@ -343,33 +356,6 @@ junit test - - ${alfresco.groupId} - alfresco-core - ${dependency.alfresco-core.version} - tests - test - - - ${alfresco.groupId} - alfresco-core - ${dependency.alfresco-core.version} - provided - - - ${alfresco.groupId} - alfresco-repository - ${dependency.alfresco-repository.version} - tests - test - - - ${alfresco.groupId} - alfresco-remote-api - ${dependency.alfresco-remote-api.version} - tests - test - postgresql postgresql @@ -412,76 +398,31 @@ com.fasterxml.jackson.core jackson-core ${dependency.jackson.version} + provided com.fasterxml.jackson.core jackson-annotations ${dependency.jackson.version} + provided com.fasterxml.jackson.core jackson-databind ${dependency.jackson.version} + provided com.fasterxml.jackson.datatype jackson-datatype-joda ${dependency.jackson.version} + provided com.fasterxml.jackson.dataformat jackson-dataformat-yaml ${dependency.jackson.version} - - - org.springframework - spring-aop - ${dependency.spring.version} - - - org.springframework - spring-beans - ${dependency.spring.version} - - - org.springframework - spring-context - ${dependency.spring.version} - - - org.springframework - spring-context-support - ${dependency.spring.version} - - - org.springframework - spring-core - ${dependency.spring.version} - - - org.springframework - spring-expression - ${dependency.spring.version} - - - org.springframework - spring-jdbc - ${dependency.spring.version} - - - org.springframework - spring-jms - ${dependency.spring.version} - - - org.springframework - spring-orm - ${dependency.spring.version} - - - org.springframework - spring-tx - ${dependency.spring.version} + provided org.springframework From 335a6d4e0d7da49102759c9007c647d690b4af17 Mon Sep 17 00:00:00 2001 From: Rodica Sutu Date: Fri, 1 Jun 2018 10:29:58 +0300 Subject: [PATCH 32/99] enable the basic authentication for the dev environment --- .../src/test/properties/local/alfresco-global.properties | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/rm-community/rm-community-repo/src/test/properties/local/alfresco-global.properties b/rm-community/rm-community-repo/src/test/properties/local/alfresco-global.properties index 06249c5121..565870a814 100644 --- a/rm-community/rm-community-repo/src/test/properties/local/alfresco-global.properties +++ b/rm-community/rm-community-repo/src/test/properties/local/alfresco-global.properties @@ -66,4 +66,7 @@ ftp.enabled=false # Solr config index.subsystem.name=solr4 -solr.secureComms=none \ No newline at end of file +solr.secureComms=none + +#By default the basic auth is on false - REPO-2575 +alfresco.restApi.basicAuthScheme=true \ No newline at end of file From 733a85f3ec26deacb9ee04d19ac3910b02de2908 Mon Sep 17 00:00:00 2001 From: Rodica Sutu Date: Fri, 1 Jun 2018 12:33:25 +0300 Subject: [PATCH 33/99] add alfresco-core for tests --- rm-community/rm-community-repo/pom.xml | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/rm-community/rm-community-repo/pom.xml b/rm-community/rm-community-repo/pom.xml index 88a212e572..2b8beb8201 100644 --- a/rm-community/rm-community-repo/pom.xml +++ b/rm-community/rm-community-repo/pom.xml @@ -28,6 +28,7 @@ 6.0.4-ea + 7.2 6.50 6.35 6.17 @@ -333,6 +334,13 @@ tests test + + ${alfresco.groupId} + alfresco-core + ${dependency.alfresco-core.version} + tests + test + javax.servlet javax.servlet-api From 586553dba31aaa8b59bbca6c32bc134b93513597 Mon Sep 17 00:00:00 2001 From: Tom Page Date: Fri, 1 Jun 2018 14:46:23 +0100 Subject: [PATCH 34/99] Remove 'dependency.' from properties. --- pom.xml | 14 +++++++++----- rm-community/rm-community-repo/pom.xml | 16 ++++++++-------- 2 files changed, 17 insertions(+), 13 deletions(-) diff --git a/pom.xml b/pom.xml index a7d6c1df38..6499478f75 100644 --- a/pom.xml +++ b/pom.xml @@ -163,19 +163,23 @@ AUTO_SERVER=TRUE;DB_CLOSE_ON_EXIT=FALSE;LOCK_TIMEOUT=10000;MVCC=FALSE;LOCK_MODE=0;IGNORECASE=TRUE + false 1.8 1.8 + + 2.9.5 + 5.0.4.RELEASE + 1.10.19 + 42.2.1 + 5.1.40 + UTF-8 UTF-8 -Xmx1024m -XX:MaxPermSize=256m -Duser.language=en -Dcom.sun.management.jmxremote + true false - 2.9.5 - 5.0.4.RELEASE - 1.10.19 - 42.2.1 - 5.1.40 diff --git a/rm-community/rm-community-repo/pom.xml b/rm-community/rm-community-repo/pom.xml index 2b8beb8201..7fa10262f5 100644 --- a/rm-community/rm-community-repo/pom.xml +++ b/rm-community/rm-community-repo/pom.xml @@ -373,7 +373,7 @@ mysql mysql-connector-java - ${dependency.mysql.version} + ${mysql.version} test @@ -399,43 +399,43 @@ org.mockito mockito-all - ${dependency.mockito.version} + ${mockito.version} test com.fasterxml.jackson.core jackson-core - ${dependency.jackson.version} + ${jackson.version} provided com.fasterxml.jackson.core jackson-annotations - ${dependency.jackson.version} + ${jackson.version} provided com.fasterxml.jackson.core jackson-databind - ${dependency.jackson.version} + ${jackson.version} provided com.fasterxml.jackson.datatype jackson-datatype-joda - ${dependency.jackson.version} + ${jackson.version} provided com.fasterxml.jackson.dataformat jackson-dataformat-yaml - ${dependency.jackson.version} + ${jackson.version} provided org.springframework spring-test - ${dependency.spring.version} + ${spring.version} test From 83c91d86b5d458cc22adbc5b26a827ebf3a200bd Mon Sep 17 00:00:00 2001 From: Tom Page Date: Fri, 1 Jun 2018 15:15:23 +0100 Subject: [PATCH 35/99] Use dependency management in the root pom to avoid duplicating version declaration. --- pom.xml | 52 ++++++++++++++++++++++++++ rm-community/rm-community-repo/pom.xml | 11 ------ 2 files changed, 52 insertions(+), 11 deletions(-) diff --git a/pom.xml b/pom.xml index 6499478f75..422d515fff 100644 --- a/pom.xml +++ b/pom.xml @@ -163,6 +163,7 @@ AUTO_SERVER=TRUE;DB_CLOSE_ON_EXIT=FALSE;LOCK_TIMEOUT=10000;MVCC=FALSE;LOCK_MODE=0;IGNORECASE=TRUE + 6.17 false 1.8 @@ -189,6 +190,57 @@ guava 18.0 + + org.mockito + mockito-all + ${mockito.version} + + + org.alfresco.surf + spring-webscripts + ${alfresco-spring-webscripts.version} + tests + + + org.springframework + spring-test + ${spring.version} + + + com.fasterxml.jackson.core + jackson-core + ${jackson.version} + + + com.fasterxml.jackson.core + jackson-annotations + ${jackson.version} + + + com.fasterxml.jackson.core + jackson-databind + ${jackson.version} + + + com.fasterxml.jackson.datatype + jackson-datatype-joda + ${jackson.version} + + + com.fasterxml.jackson.dataformat + jackson-dataformat-yaml + ${jackson.version} + + + postgresql + postgresql + ${alfresco.postgres.version} + + + mysql + mysql-connector-java + ${mysql.version} + diff --git a/rm-community/rm-community-repo/pom.xml b/rm-community/rm-community-repo/pom.xml index 7fa10262f5..f87811f262 100644 --- a/rm-community/rm-community-repo/pom.xml +++ b/rm-community/rm-community-repo/pom.xml @@ -31,7 +31,6 @@ 7.2 6.50 6.35 - 6.17 6.0.a 6.0.a @@ -349,7 +348,6 @@ org.alfresco.surf spring-webscripts - ${dependency.alfresco-spring-webscripts.version} tests test @@ -367,13 +365,11 @@ postgresql postgresql - ${alfresco.postgres.version} test mysql mysql-connector-java - ${mysql.version} test @@ -399,43 +395,36 @@ org.mockito mockito-all - ${mockito.version} test com.fasterxml.jackson.core jackson-core - ${jackson.version} provided com.fasterxml.jackson.core jackson-annotations - ${jackson.version} provided com.fasterxml.jackson.core jackson-databind - ${jackson.version} provided com.fasterxml.jackson.datatype jackson-datatype-joda - ${jackson.version} provided com.fasterxml.jackson.dataformat jackson-dataformat-yaml - ${jackson.version} provided org.springframework spring-test - ${spring.version} test From 932034019a94d982c4e89be2c4eb110e9ebe62b9 Mon Sep 17 00:00:00 2001 From: Tom Page Date: Fri, 1 Jun 2018 15:40:39 +0100 Subject: [PATCH 36/99] RM-6135 Remove dependency on solr. --- rm-community/rm-community-repo/pom.xml | 103 +------------------------ 1 file changed, 1 insertion(+), 102 deletions(-) diff --git a/rm-community/rm-community-repo/pom.xml b/rm-community/rm-community-repo/pom.xml index 2b8beb8201..aac041bb60 100644 --- a/rm-community/rm-community-repo/pom.xml +++ b/rm-community/rm-community-repo/pom.xml @@ -24,9 +24,8 @@ 9.1-901.jdbc4 alfresco-rm-community-repo true - ${project.build.directory}/solr/home - + 6.0.4-ea 7.2 6.50 @@ -35,10 +34,6 @@ 6.0.a 6.0.a - - 6.7 @@ -491,25 +486,6 @@ - - unpack-alfresco-config - - unpack - - generate-resources - - ${alfresco.solr.home} - - - alfresco-solr4 - ${alfresco.groupId} - config - ${alfresco.solr4.version} - zip - - - - @@ -528,74 +504,6 @@ false - - org.codehaus.mojo - build-helper-maven-plugin - - - regex-property - generate-resources - - regex-property - - - solrHomePath - ${alfresco.solr.home} - \\ - \\\\ - false - - - - - - com.google.code.maven-replacer-plugin - replacer - - - setup-solr-config - generate-resources - - replace - - - - - false - - ${alfresco.solr.home}/context.xml - ${alfresco.solr.home}/archive-SpacesStore/conf/solrcore.properties - ${alfresco.solr.home}/workspace-SpacesStore/conf/solrcore.properties - ${app.amp.client.war.folder}/WEB-INF/web.xml - - - - @@ALFRESCO_SOLR4_DIR@@ - ${solrHomePath}/ - - - @@ALFRESCO_SOLR4_MODEL_DIR@@ - ${solrHomePath}/alfrescoModels/ - - - @@ALFRESCO_SOLR4_CONTENT_DIR@@ - ${solrHomePath}/data/content/ - - - @@ALFRESCO_SOLR4_DATA_DIR@@ - ${solrHomePath}/data/index/ - - - ]]> - - - - ]]> - ]]> - - - - org.apache.tomcat.maven tomcat7-maven-plugin @@ -616,15 +524,6 @@ false ${project.basedir}/tomcat/context.xml - - ${alfresco.groupId} - alfresco-solr4 - ${alfresco.solr4.version} - war - true - /solr4 - ${alfresco.solr.home}/context.xml - org.alfresco api-explorer From f9a4b5c9dbdf4009523cfd263178d9d7553b2b08 Mon Sep 17 00:00:00 2001 From: Rodica Sutu Date: Fri, 1 Jun 2018 17:55:13 +0300 Subject: [PATCH 37/99] fix the regressions spotted by community rest api after Jackson upgrade --- .../rest/rm/community/model/common/IdNamePair.java | 8 ++++++++ .../java/org/alfresco/rm/rest/api/model/RMNode.java | 3 +++ .../java/org/alfresco/rm/rest/api/model/Transfer.java | 3 +++ .../org/alfresco/rm/rest/api/model/TransferContainer.java | 3 +++ .../java/org/alfresco/rm/rest/api/model/UnfiledChild.java | 3 +++ 5 files changed, 20 insertions(+) diff --git a/rm-automation/rm-automation-community-rest-api/src/main/java/org/alfresco/rest/rm/community/model/common/IdNamePair.java b/rm-automation/rm-automation-community-rest-api/src/main/java/org/alfresco/rest/rm/community/model/common/IdNamePair.java index 6110395dc3..c8f1bdedda 100644 --- a/rm-automation/rm-automation-community-rest-api/src/main/java/org/alfresco/rest/rm/community/model/common/IdNamePair.java +++ b/rm-automation/rm-automation-community-rest-api/src/main/java/org/alfresco/rest/rm/community/model/common/IdNamePair.java @@ -26,6 +26,8 @@ */ package org.alfresco.rest.rm.community.model.common; +import java.util.List; + import com.fasterxml.jackson.annotation.JsonProperty; import lombok.AllArgsConstructor; @@ -50,4 +52,10 @@ public class IdNamePair @JsonProperty (required = true) private String name; + + @JsonProperty (required = true) + private List aspectNames; + + @JsonProperty (required = true) + private String nodeType; } diff --git a/rm-community/rm-community-repo/source/java/org/alfresco/rm/rest/api/model/RMNode.java b/rm-community/rm-community-repo/source/java/org/alfresco/rm/rest/api/model/RMNode.java index a18818e85e..b9d583476d 100644 --- a/rm-community/rm-community-repo/source/java/org/alfresco/rm/rest/api/model/RMNode.java +++ b/rm-community/rm-community-repo/source/java/org/alfresco/rm/rest/api/model/RMNode.java @@ -31,6 +31,8 @@ import java.util.Date; import java.util.List; import java.util.Map; +import com.fasterxml.jackson.annotation.JsonProperty; + import org.alfresco.rest.api.model.Assoc; import org.alfresco.rest.api.model.PathInfo; import org.alfresco.rest.api.model.UserInfo; @@ -103,6 +105,7 @@ public abstract class RMNode } + @JsonProperty ("id") @UniqueId public NodeRef getNodeRef() { diff --git a/rm-community/rm-community-repo/source/java/org/alfresco/rm/rest/api/model/Transfer.java b/rm-community/rm-community-repo/source/java/org/alfresco/rm/rest/api/model/Transfer.java index f50df50d16..be6da6966f 100644 --- a/rm-community/rm-community-repo/source/java/org/alfresco/rm/rest/api/model/Transfer.java +++ b/rm-community/rm-community-repo/source/java/org/alfresco/rm/rest/api/model/Transfer.java @@ -31,6 +31,8 @@ import java.util.Date; import java.util.List; import java.util.Map; +import com.fasterxml.jackson.annotation.JsonProperty; + import org.alfresco.rest.api.model.UserInfo; import org.alfresco.rest.framework.resource.UniqueId; import org.alfresco.service.cmr.repository.NodeRef; @@ -67,6 +69,7 @@ public class Transfer { } + @JsonProperty ("id") @UniqueId public NodeRef getNodeRef() { diff --git a/rm-community/rm-community-repo/source/java/org/alfresco/rm/rest/api/model/TransferContainer.java b/rm-community/rm-community-repo/source/java/org/alfresco/rm/rest/api/model/TransferContainer.java index 58441d34fc..dcc9192603 100644 --- a/rm-community/rm-community-repo/source/java/org/alfresco/rm/rest/api/model/TransferContainer.java +++ b/rm-community/rm-community-repo/source/java/org/alfresco/rm/rest/api/model/TransferContainer.java @@ -31,6 +31,8 @@ import java.util.Date; import java.util.List; import java.util.Map; +import com.fasterxml.jackson.annotation.JsonProperty; + import org.alfresco.rest.api.model.UserInfo; import org.alfresco.rest.framework.resource.UniqueId; import org.alfresco.service.cmr.repository.NodeRef; @@ -60,6 +62,7 @@ public class TransferContainer { } + @JsonProperty ("id") @UniqueId public NodeRef getNodeRef() { diff --git a/rm-community/rm-community-repo/source/java/org/alfresco/rm/rest/api/model/UnfiledChild.java b/rm-community/rm-community-repo/source/java/org/alfresco/rm/rest/api/model/UnfiledChild.java index 5329439aaf..5ab14d5417 100644 --- a/rm-community/rm-community-repo/source/java/org/alfresco/rm/rest/api/model/UnfiledChild.java +++ b/rm-community/rm-community-repo/source/java/org/alfresco/rm/rest/api/model/UnfiledChild.java @@ -28,6 +28,7 @@ package org.alfresco.rm.rest.api.model; import com.fasterxml.jackson.annotation.JsonIgnore; +import com.fasterxml.jackson.annotation.JsonProperty; /** * Abstract class carrying information for an unfiled container or unfiled record folder child @@ -43,6 +44,7 @@ public abstract class UnfiledChild extends RMNode protected Boolean isUnfiledRecordFolder; protected Boolean isRecord; + @JsonProperty (PARAM_IS_UNFILED_RECORD_FOLDER) public Boolean getIsUnfiledRecordFolder() { return isUnfiledRecordFolder; @@ -54,6 +56,7 @@ public abstract class UnfiledChild extends RMNode this.isUnfiledRecordFolder = isUnfiledRecordFolder; } + @JsonProperty (PARAM_IS_RECORD) public Boolean getIsRecord() { return isRecord; From ead61904ce03a8b8c61005805cbd3b5eddca5b6c Mon Sep 17 00:00:00 2001 From: Tom Page Date: Mon, 4 Jun 2018 16:57:55 +0100 Subject: [PATCH 38/99] RM-6295 Remove dependency on Alfresco Maven SDK. --- pom.xml | 486 +++++++++++++++++++++++++++++++++++++++++++++++--------- 1 file changed, 414 insertions(+), 72 deletions(-) diff --git a/pom.xml b/pom.xml index 422d515fff..39068d690a 100644 --- a/pom.xml +++ b/pom.xml @@ -7,12 +7,6 @@ 3.0.0-SNAPSHOT Alfresco Records Management - - org.alfresco.maven - alfresco-sdk-parent - 2.1.1 - - http://www.alfresco.org/ 2005 @@ -24,8 +18,7 @@ scm:git:https://git.alfresco.com/records-management/records-management.git scm:git:https://git.alfresco.com/records-management/records-management.git https://git.alfresco.com/records-management/records-management - HEAD - + JIRA @@ -41,17 +34,39 @@ + + alfresco-internal + Alfresco Internal Repository + https://artifacts.alfresco.com/nexus/content/groups/internal/ + alfresco-public https://artifacts.alfresco.com/nexus/content/groups/public + + alfresco-public-snapshots + https://artifacts.alfresco.com/nexus/content/groups/public-snapshots + + + alfresco-private + Alfresco Internal Repository + https://artifacts.alfresco.com/nexus/content/groups/private + alfresco-public https://artifacts.alfresco.com/nexus/content/groups/public + + alfresco-plugin-public + https://artifacts.alfresco.com/nexus/content/groups/public + + + alfresco-plugin-public-snapshots + https://artifacts.alfresco.com/nexus/content/groups/public-snapshots + @@ -181,6 +196,68 @@ true false + + ${project.build.directory}/${project.build.finalName}-war + 2.2 + alfresco + + 1.4 + /alfresco + alfresco + 2.5 + true + 2.1.1 + 1.9.1 + jdbc:h2:${session.executionRootDirectory}/alf_data_dev/h2_data/alf_dev;AUTO_SERVER=TRUE;DB_CLOSE_ON_EXIT=FALSE;LOCK_TIMEOUT=10000;MVCC=FALSE;LOCK_MODE=0;IGNORECASE=TRUE + 2.5 + 1.10.19 + org.alfresco + */*-enterprise/* + true + src/main/amp + 1.4.185 + ${session.executionRootDirectory}/alf_data_dev + 5.0.d + 2.2 + ** + local + /share + ** + 1.7 + 2.5.2 + 2.9 + 42.2.1 + 5.0.1 + ${project.build.directory}/ + 2.5.1 + 5.1.40 + src/test/properties/local + https://github.com/Alfresco/alfresco-sdk + ../../target/staging/poms/alfresco-sdk-parent + + 1.7 + 3.0.0-SNAPSHOT + 2.3 + org.h2.jdbcx.JdbcDataSource + ../${project.build.finalName} + runtime + 1.5.3 + true + 2.7 + 2.18 + 1.7 + alfresco + 5.0.d + 1.2.3.RELEASE + src/main/properties/local + share + 1.5.11 + 3.2 + alf_dev + 8080 + WARN + alfresco + 2.6.1 @@ -257,9 +334,29 @@ ${project.artifactId}-${project.version} - org.apache.maven.plugins maven-enforcer-plugin + 1.4 + + enforce-sdk-requirements + + enforce + + + + + alfresco.version + The SDK 2.1.x is supported only for Alfresco 5.0.d Community and above or + Alfresco Enterprise 5.0.1 and above + ^(5\.(0\.[d-z1-9]|[1-9])|6\.).*$ + + + 3.2.2 + + + true + + enforce-java @@ -278,6 +375,7 @@ org.codehaus.mojo build-helper-maven-plugin + 1.9.1 regex-properties @@ -289,8 +387,8 @@ rm.module.repo.version.min ${alfresco.version} - (\d+)\.(\d+).* - $1.$2 + (\d+)\.(\d+).* + $1.$2 false @@ -317,8 +415,8 @@ - org.apache.maven.plugins maven-surefire-plugin + 2.18 **/*UnitTest.java @@ -326,7 +424,6 @@ - org.apache.maven.plugins maven-source-plugin 3.0.1 @@ -339,7 +436,6 @@ - org.apache.maven.plugins maven-javadoc-plugin 2.10.4 @@ -348,12 +444,155 @@ jar + + -Xdoclint:none + + + + + -Xdoclint:none + + + + maven-clean-plugin + 2.6.1 + + + default-clean + clean + + clean + + + maven-install-plugin + 2.5.2 + + + default-install + install + + install + + + + + + maven-deploy-plugin + 2.7 + + + default-deploy + deploy + + deploy + + + + + + maven-site-plugin + 3.3 + + + default-site + site + + site + + + + + org.apache.maven.plugins + maven-project-info-reports-plugin + + + + + + default-deploy + site-deploy + + deploy + + + + + org.apache.maven.plugins + maven-project-info-reports-plugin + + + + + + + + + org.apache.maven.plugins + maven-project-info-reports-plugin + + + + + + + org.apache.maven.archetype + archetype-packaging + 2.2 + + + org.apache.maven.wagon + wagon-webdav-jackrabbit + 2.2 + + + + + src/main/resources + ${app.filtering.enabled} + + + ${app.amp.folder} + ${app.amp.output.folder} + ${app.filtering.enabled} + + + + + src/test/resources + ${app.filtering.enabled} + + + + maven-surefire-plugin + 2.18 + + + maven-install-plugin + 2.5.2 + + + maven-jar-plugin + 2.5 + + + maven-assembly-plugin + 2.2-beta-5 + + + org.alfresco.maven.plugin + alfresco-maven-plugin + 2.1.1 + true + + true + + maven-compiler-plugin ${maven.compiler.version} @@ -396,7 +635,7 @@ - + org.codehaus.mojo @@ -406,20 +645,19 @@ [1.9.1,) - - regex-properties - - - - - + + regex-properties + + + + + - org.apache.maven.plugins maven-enforcer-plugin ${maven.enforcer.plugin} @@ -429,12 +667,10 @@ 1.0-alpha-2 - org.apache.maven.plugins maven-failsafe-plugin 2.19 - org.apache.maven.plugins maven-antrun-plugin 1.8 @@ -451,76 +687,73 @@ - org.apache.maven.plugins - maven-release-plugin - 2.5.3 - - V@{project.version} - + maven-release-plugin + 2.5.3 + + V@{project.version} + - org.apache.maven.plugins - maven-javadoc-plugin - - -Xdoclint:none - + maven-javadoc-plugin + + -Xdoclint:none + - org.codehaus.mojo - license-maven-plugin - 1.8 - + org.codehaus.mojo + license-maven-plugin + 1.8 + ${license.verbose} - false - false + false + false - Alfresco Software Limited - ${project.parent.parent.basedir}/license/description.ftl - true - true + Alfresco Software Limited + ${project.parent.parent.basedir}/license/description.ftl + true + true - file:${project.parent.parent.basedir}/license + file:${project.parent.parent.basedir}/license ${license.update.dryrun} - true - true + true + true - - src - + + src + - - **/package-info.java - **/*.properties - **/*.css - **/*.xml - **/*.json - **/*.txt - **/*.html - + + **/package-info.java + **/*.properties + **/*.css + **/*.xml + **/*.json + **/*.txt + **/*.html + - - - - first - - update-file-header - - process-sources - - + + + + first + + update-file-header + + process-sources + + - org.apache.maven.plugins maven-resources-plugin ${maven.resources.version} @@ -530,6 +763,115 @@ 3.1.1 + + UTF-8 + + ftl + acp + jpg + png + gif + svg + pdf + doc + docx + xls + xlsx + ppt + pptx + bin + lic + swf + zip + msg + jar + ttf + eot + woff + woff2 + css + ico + psd + + + + + maven-war-plugin + 2.5 + + + org.alfresco.maven.plugin + alfresco-maven-plugin + 2.1.1 + + + + false + + + true + + + + + + maven-clean-plugin + 2.6.1 + + + maven-dependency-plugin + 2.9 + + + maven-archetype-plugin + 2.2 + + ${skipTests} + + + + com.google.code.maven-replacer-plugin + replacer + 1.5.3 + + + org.apache.tomcat.maven + tomcat7-maven-plugin + 2.2 + + + com.h2database + h2 + 1.4.185 + + + + true + + + + net.alchim31.maven + yuicompressor-maven-plugin + 1.5.1 + + + compress-js + process-resources + + compress + + + + **/webscripts/** + **/site-webscripts/** + **/*.lib.js + **/*.css + + src/main/resources/META-INF + false + + + From 6110fe2689636941888b61627915fc0002fce3fa Mon Sep 17 00:00:00 2001 From: Tom Page Date: Wed, 6 Jun 2018 11:37:09 +0100 Subject: [PATCH 39/99] RM-6295 Get enterprise integration tests working. --- pom.xml | 153 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 153 insertions(+) diff --git a/pom.xml b/pom.xml index 39068d690a..f18d2dbca4 100644 --- a/pom.xml +++ b/pom.xml @@ -174,6 +174,159 @@ + + + + enable-amp + + + src/main/amp/module.properties + + + + + + org.alfresco.maven.plugin + alfresco-maven-plugin + true + + + + maven-resources-plugin + + + add-module-properties-to-test-classpath + process-test-resources + + copy-resources + + + ${project.build.testOutputDirectory} + + + ${app.amp.folder} + + module.properties + + ${app.filtering.enabled} + alfresco/module/${project.artifactId} + + + + + + add-module-config-to-test-classpath + process-test-resources + + copy-resources + + + ${project.build.testOutputDirectory} + + + ${app.amp.folder}/config + + **/* + + ${app.filtering.enabled} + + + + + + + + + + + + + enable-properties-filtering + + + + src/main/properties + + + + + + org.codehaus.mojo + build-helper-maven-plugin + ${maven.buildhelper.version} + + + add-env-properties + generate-resources + + add-resource + + + + + ${app.properties.folder} + + ${app.properties.include} + + ${app.filtering.enabled} + + + + + + + + + + + enable-test-properties-filtering + + + + src/test/properties + + + + + + org.codehaus.mojo + build-helper-maven-plugin + ${maven.buildhelper.version} + + + add-env-test-properties + generate-resources + + add-test-resource + + + + + ${app.properties.test.folder} + + ${app.properties.test.include} + + ${app.filtering.enabled} + + + + + + + + + From 1493e63f81d5954c58455e9e5f4c8521054aab53 Mon Sep 17 00:00:00 2001 From: Tom Page Date: Wed, 6 Jun 2018 14:33:27 +0100 Subject: [PATCH 40/99] RM-6295 Remove unneeded properties from root pom. --- pom.xml | 111 +++++++++++++------------------------------------------- 1 file changed, 25 insertions(+), 86 deletions(-) diff --git a/pom.xml b/pom.xml index f18d2dbca4..00dcfd2f57 100644 --- a/pom.xml +++ b/pom.xml @@ -330,12 +330,28 @@ + /alfresco + ${session.executionRootDirectory}/alf_data_dev + org.gjt.mm.mysql.Driver + alf_dev AUTO_SERVER=TRUE;DB_CLOSE_ON_EXIT=FALSE;LOCK_TIMEOUT=10000;MVCC=FALSE;LOCK_MODE=0;IGNORECASE=TRUE + alfresco + jdbc:mysql://${alfresco.db.host}:${alfresco.db.port}/${alfresco.db.name} + alfresco + org.alfresco + share 6.17 + /share + false 1.8 1.8 + 1.9.1 + 3.2 + 1.4 + 2.7 + 8080 2.9.5 5.0.4.RELEASE @@ -350,67 +366,17 @@ true false - ${project.build.directory}/${project.build.finalName}-war - 2.2 - alfresco - - 1.4 - /alfresco - alfresco - 2.5 - true - 2.1.1 - 1.9.1 - jdbc:h2:${session.executionRootDirectory}/alf_data_dev/h2_data/alf_dev;AUTO_SERVER=TRUE;DB_CLOSE_ON_EXIT=FALSE;LOCK_TIMEOUT=10000;MVCC=FALSE;LOCK_MODE=0;IGNORECASE=TRUE - 2.5 - 1.10.19 - org.alfresco - */*-enterprise/* - true - src/main/amp - 1.4.185 - ${session.executionRootDirectory}/alf_data_dev - 5.0.d - 2.2 - ** - local - /share - ** - 1.7 - 2.5.2 - 2.9 - 42.2.1 - 5.0.1 - ${project.build.directory}/ - 2.5.1 - 5.1.40 - src/test/properties/local - https://github.com/Alfresco/alfresco-sdk - ../../target/staging/poms/alfresco-sdk-parent - - 1.7 - 3.0.0-SNAPSHOT - 2.3 - org.h2.jdbcx.JdbcDataSource - ../${project.build.finalName} - runtime - 1.5.3 - true - 2.7 - 2.18 - 1.7 alfresco - 5.0.d - 1.2.3.RELEASE - src/main/properties/local - share - 1.5.11 - 3.2 - alf_dev - 8080 + ${project.build.directory}/${project.build.finalName}-war + src/main/amp + ../${project.build.finalName} + true + ${project.build.directory}/ WARN - alfresco - 2.6.1 + ** + src/main/properties/local + ** + src/test/properties/local @@ -490,26 +456,6 @@ maven-enforcer-plugin 1.4 - - enforce-sdk-requirements - - enforce - - - - - alfresco.version - The SDK 2.1.x is supported only for Alfresco 5.0.d Community and above or - Alfresco Enterprise 5.0.1 and above - ^(5\.(0\.[d-z1-9]|[1-9])|6\.).*$ - - - 3.2.2 - - - true - - enforce-java @@ -537,13 +483,6 @@ - - rm.module.repo.version.min - ${alfresco.version} - (\d+)\.(\d+).* - $1.$2 - false - rm.module.version ${project.version} From 8110e689306faeba9ef95b8064f6bb4bb9b96087 Mon Sep 17 00:00:00 2001 From: Tom Page Date: Wed, 6 Jun 2018 14:47:18 +0100 Subject: [PATCH 41/99] RM-6295 Remove dependency on h2. --- pom.xml | 7 ------- 1 file changed, 7 deletions(-) diff --git a/pom.xml b/pom.xml index 00dcfd2f57..8944f23bf7 100644 --- a/pom.xml +++ b/pom.xml @@ -930,13 +930,6 @@ org.apache.tomcat.maven tomcat7-maven-plugin 2.2 - - - com.h2database - h2 - 1.4.185 - - true From a9bf1b91a5dbe0d8d807e21c3b8138cee4b571c3 Mon Sep 17 00:00:00 2001 From: cagache Date: Thu, 7 Jun 2018 10:43:37 +0300 Subject: [PATCH 42/99] RM-6364 Convert search integration tests to end to end tests done through api --- .../AutomaticDispositionTest.java | 97 +++++++++++++ .../job/AutomaticDispositionTest.java | 137 ------------------ ...ecordsManagementSearchServiceImplTest.java | 24 --- 3 files changed, 97 insertions(+), 161 deletions(-) create mode 100644 rm-automation/rm-automation-community-rest-api/src/test/java/org/alfresco/rest/rm/community/recordcategories/AutomaticDispositionTest.java delete mode 100644 rm-community/rm-community-repo/test/java/org/alfresco/module/org_alfresco_module_rm/test/integration/job/AutomaticDispositionTest.java diff --git a/rm-automation/rm-automation-community-rest-api/src/test/java/org/alfresco/rest/rm/community/recordcategories/AutomaticDispositionTest.java b/rm-automation/rm-automation-community-rest-api/src/test/java/org/alfresco/rest/rm/community/recordcategories/AutomaticDispositionTest.java new file mode 100644 index 0000000000..e148f783f7 --- /dev/null +++ b/rm-automation/rm-automation-community-rest-api/src/test/java/org/alfresco/rest/rm/community/recordcategories/AutomaticDispositionTest.java @@ -0,0 +1,97 @@ +/* + * #%L + * Alfresco Records Management Module + * %% + * Copyright (C) 2005 - 2018 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.rest.rm.community.recordcategories; + +import static org.alfresco.utility.data.RandomData.getRandomName; +import static org.alfresco.utility.report.log.Step.STEP; +import static org.testng.Assert.assertTrue; + +import java.util.List; + +import org.alfresco.rest.rm.community.base.BaseRMRestTest; +import org.alfresco.rest.rm.community.model.record.Record; +import org.alfresco.rest.rm.community.model.recordcategory.RecordCategory; +import org.alfresco.rest.rm.community.model.recordcategory.RecordCategoryChild; + +import org.alfresco.rest.rm.community.requests.gscore.api.RecordsAPI; +import org.alfresco.rest.v0.service.DispositionScheduleService; +import org.springframework.beans.factory.annotation.Autowired; +import org.testng.annotations.AfterClass; +import org.testng.annotations.Test; + +public class AutomaticDispositionTest extends BaseRMRestTest +{ + private static final String CUT_OFF_ASPECT = "rma:cutOff"; + + @Autowired + private DispositionScheduleService dispositionScheduleService; + + private RecordCategory categoryWithRSOnRecords; + + /** + * Given there is a complete record eligible for cut off + * When the correct frequency of time passes + * Then the record will be automatically cut off + */ + @Test + public void testAutomaticCutOff() throws Exception + { + STEP("Create record category with retention schedule and apply it to records."); + categoryWithRSOnRecords = createRootCategory(getRandomName("categoryWithRSOnRecords")); + dispositionScheduleService.createCategoryRetentionSchedule(categoryWithRSOnRecords.getName(), true); + + STEP("Add retention schedule cut off step with immediate period."); + dispositionScheduleService.addCutOffAfterPeriodStep(categoryWithRSOnRecords.getName(), "immediately"); + + STEP("Create a record folder with a record"); + RecordCategoryChild recordFolder = createRecordFolder(categoryWithRSOnRecords.getId(), getRandomName + ("recordFolder")); + + STEP("Complete the record and wait upon to 5 minutes for automatic job to execute"); + Record record = createElectronicRecord(recordFolder.getId(), getRandomName("elRecord")); + completeRecord(record.getId()); + + RecordsAPI recordsAPI = getRestAPIFactory().getRecordsAPI(); + List aspects = recordsAPI.getRecord(record.getId()).getAspectNames(); + int count = 0; + while (!aspects.contains(CUT_OFF_ASPECT) && count < 30) + { + // sleep .. allowing the job time to execute + Thread.sleep(10000); + count++; + aspects = recordsAPI.getRecord(record.getId()).getAspectNames(); + } + aspects = recordsAPI.getRecord(record.getId()).getAspectNames(); + assertTrue(aspects.contains(CUT_OFF_ASPECT), "Record should now be cut off"); + } + + @AfterClass (alwaysRun = true) + public void deleteCategory() + { + deleteRecordCategory(categoryWithRSOnRecords.getId()); + } +} diff --git a/rm-community/rm-community-repo/test/java/org/alfresco/module/org_alfresco_module_rm/test/integration/job/AutomaticDispositionTest.java b/rm-community/rm-community-repo/test/java/org/alfresco/module/org_alfresco_module_rm/test/integration/job/AutomaticDispositionTest.java deleted file mode 100644 index 6230fc6a4b..0000000000 --- a/rm-community/rm-community-repo/test/java/org/alfresco/module/org_alfresco_module_rm/test/integration/job/AutomaticDispositionTest.java +++ /dev/null @@ -1,137 +0,0 @@ -/* - * #%L - * Alfresco Records Management Module - * %% - * Copyright (C) 2005 - 2018 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.module.org_alfresco_module_rm.test.integration.job; - -import java.io.Serializable; -import java.util.HashMap; -import java.util.Map; - -import org.alfresco.module.org_alfresco_module_rm.action.impl.CutOffAction; -import org.alfresco.module.org_alfresco_module_rm.audit.RecordsManagementAuditService; -import org.alfresco.module.org_alfresco_module_rm.disposition.DispositionAction; -import org.alfresco.module.org_alfresco_module_rm.disposition.DispositionSchedule; -import org.alfresco.module.org_alfresco_module_rm.test.util.BaseRMTestCase; -import org.alfresco.module.org_alfresco_module_rm.test.util.CommonRMTestUtils; -import org.alfresco.service.cmr.repository.NodeRef; -import org.alfresco.service.namespace.QName; -import org.alfresco.util.GUID; -import org.apache.commons.lang3.ArrayUtils; - -/** - * Test automatic disposition via scheduled job. - * - * @author Roy Wetherall - * @since 2.2 - */ -public class AutomaticDispositionTest extends BaseRMTestCase -{ - @SuppressWarnings("unused") - private RecordsManagementAuditService auditService; - - /** additional job context to override job frequency */ - protected String[] getConfigLocations() - { - return ArrayUtils.add(super.getConfigLocations(), "classpath:test-job-context.xml"); - } - - /** - * @see org.alfresco.module.org_alfresco_module_rm.test.util.BaseRMTestCase#initServices() - */ - @Override - protected void initServices() - { - super.initServices(); - auditService = (RecordsManagementAuditService)applicationContext.getBean("recordsManagementAuditService"); - } - - /** - * Given there is a complete record eligible for cut off, when the correct frequency of time passes, then - * the record will be automatically cut off - */ - public void testAutomaticCutOff() - { - doBehaviourDrivenTest(new BehaviourDrivenTest() - { - NodeRef sourceCategory; - NodeRef sourceRecordFolder; - NodeRef record; - - public void given() - { - // create test data - sourceCategory = filePlanService.createRecordCategory(filePlan, GUID.generate()); - DispositionSchedule dis = utils.createBasicDispositionSchedule(sourceCategory, GUID.generate(), GUID.generate(), true, false); - Map adParams = new HashMap(3); - adParams.put(PROP_DISPOSITION_ACTION_NAME, CutOffAction.NAME); - adParams.put(PROP_DISPOSITION_DESCRIPTION, GUID.generate()); - adParams.put(PROP_DISPOSITION_PERIOD, CommonRMTestUtils.PERIOD_IMMEDIATELY); - dispositionService.addDispositionActionDefinition(dis, adParams); - sourceRecordFolder = recordFolderService.createRecordFolder(sourceCategory, GUID.generate()); - - // create and complete record - record = utils.createRecord(sourceRecordFolder, GUID.generate()); - utils.completeRecord(record); - - // check the disposition action details - DispositionAction dispositionAction = dispositionService.getNextDispositionAction(record); - assertNotNull(dispositionAction); - assertNotNull(CutOffAction.NAME, dispositionAction.getName()); - assertTrue(dispositionService.isNextDispositionActionEligible(record)); - } - - public void when() throws Exception - { - // sleep .. allowing the job time to execute - Thread.sleep(30000); - } - - public void then() - { - // record should now be cut off - assertTrue(dispositionService.isDisposableItemCutoff(record)); - - // TODO .. automatic dispoistion does not log entry in audit - // .. the following test checks for this, but is currently commented out - // .. because it doesn't work! -// RecordsManagementAuditQueryParameters params = new RecordsManagementAuditQueryParameters(); -// params.setEvent(CutOffAction.NAME); -// params.setMaxEntries(1); -// List entries = auditService.getAuditTrail(params); -// assertNotNull(entries); -// assertEquals(1, entries.size()); -// -// RecordsManagementAuditEntry entry = entries.get(0); -// assertEquals(record, entry.getNodeRef()); - } - }); - } - - // TODO automatic retain - - // TODO automatic destroy -} diff --git a/rm-community/rm-community-repo/test/java/org/alfresco/module/org_alfresco_module_rm/test/legacy/service/RecordsManagementSearchServiceImplTest.java b/rm-community/rm-community-repo/test/java/org/alfresco/module/org_alfresco_module_rm/test/legacy/service/RecordsManagementSearchServiceImplTest.java index 42e2005b0b..e78181a982 100644 --- a/rm-community/rm-community-repo/test/java/org/alfresco/module/org_alfresco_module_rm/test/legacy/service/RecordsManagementSearchServiceImplTest.java +++ b/rm-community/rm-community-repo/test/java/org/alfresco/module/org_alfresco_module_rm/test/legacy/service/RecordsManagementSearchServiceImplTest.java @@ -117,30 +117,6 @@ public class RecordsManagementSearchServiceImplTest extends BaseRMTestCase }, AuthenticationUtil.getSystemUserName()); } - public void testSearch() - { - // Full text search - doTestInTransaction(new Test() - { - @Override - public Void run() - { - String query = "keywords:\"elephant\""; - RecordsManagementSearchParameters params = new RecordsManagementSearchParameters(); - params.setIncludeUndeclaredRecords(true); - List> results = rmSearchService.search(siteId, query, params); - assertNotNull(results); - assertEquals(2, results.size()); - - return null; - } - }, AuthenticationUtil.getSystemUserName()); - - // Property search - - // - } - public void testSaveSearch() { // Add some saved searches (as admin user) From 8b035560a10d116b9cccfffdcf5d57f21f472005 Mon Sep 17 00:00:00 2001 From: Tom Page Date: Thu, 7 Jun 2018 11:55:14 +0100 Subject: [PATCH 43/99] Set rm.module.repo.version.min using regex-properties. --- pom.xml | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 8944f23bf7..5260cb6941 100644 --- a/pom.xml +++ b/pom.xml @@ -341,6 +341,8 @@ org.alfresco share 6.17 + + 0.0 /share @@ -474,7 +476,6 @@ org.codehaus.mojo build-helper-maven-plugin - 1.9.1 regex-properties @@ -483,6 +484,13 @@ + + rm.module.repo.version.min + ${alfresco.version} + (\d+)\.(\d+).* + $1.$2 + false + rm.module.version ${project.version} From 6e323107ec4b75c92cca113093222baf1d63935d Mon Sep 17 00:00:00 2001 From: Tom Page Date: Thu, 7 Jun 2018 14:33:07 +0100 Subject: [PATCH 44/99] RM-6295 Remove unused definition of app.amp.client.war.artifactId. --- pom.xml | 1 - 1 file changed, 1 deletion(-) diff --git a/pom.xml b/pom.xml index 5260cb6941..8d900944de 100644 --- a/pom.xml +++ b/pom.xml @@ -368,7 +368,6 @@ true false - alfresco ${project.build.directory}/${project.build.finalName}-war src/main/amp ../${project.build.finalName} From 82345db29ad5cc763ef775ee9881f69bdc857e75 Mon Sep 17 00:00:00 2001 From: cagache Date: Thu, 7 Jun 2018 16:35:42 +0300 Subject: [PATCH 45/99] code review changes --- .../AutomaticDispositionTest.java | 4 +- ...ecordsManagementSearchServiceImplTest.java | 40 ------------------- 2 files changed, 2 insertions(+), 42 deletions(-) diff --git a/rm-automation/rm-automation-community-rest-api/src/test/java/org/alfresco/rest/rm/community/recordcategories/AutomaticDispositionTest.java b/rm-automation/rm-automation-community-rest-api/src/test/java/org/alfresco/rest/rm/community/recordcategories/AutomaticDispositionTest.java index e148f783f7..7d35b5e166 100644 --- a/rm-automation/rm-automation-community-rest-api/src/test/java/org/alfresco/rest/rm/community/recordcategories/AutomaticDispositionTest.java +++ b/rm-automation/rm-automation-community-rest-api/src/test/java/org/alfresco/rest/rm/community/recordcategories/AutomaticDispositionTest.java @@ -54,7 +54,7 @@ public class AutomaticDispositionTest extends BaseRMRestTest /** * Given there is a complete record eligible for cut off - * When the correct frequency of time passes + * When the correct duration of time passes * Then the record will be automatically cut off */ @Test @@ -71,8 +71,8 @@ public class AutomaticDispositionTest extends BaseRMRestTest RecordCategoryChild recordFolder = createRecordFolder(categoryWithRSOnRecords.getId(), getRandomName ("recordFolder")); - STEP("Complete the record and wait upon to 5 minutes for automatic job to execute"); Record record = createElectronicRecord(recordFolder.getId(), getRandomName("elRecord")); + STEP("Complete the record and wait upon to 5 minutes for automatic job to execute"); completeRecord(record.getId()); RecordsAPI recordsAPI = getRestAPIFactory().getRecordsAPI(); diff --git a/rm-community/rm-community-repo/test/java/org/alfresco/module/org_alfresco_module_rm/test/legacy/service/RecordsManagementSearchServiceImplTest.java b/rm-community/rm-community-repo/test/java/org/alfresco/module/org_alfresco_module_rm/test/legacy/service/RecordsManagementSearchServiceImplTest.java index e78181a982..a0c68e2a7a 100644 --- a/rm-community/rm-community-repo/test/java/org/alfresco/module/org_alfresco_module_rm/test/legacy/service/RecordsManagementSearchServiceImplTest.java +++ b/rm-community/rm-community-repo/test/java/org/alfresco/module/org_alfresco_module_rm/test/legacy/service/RecordsManagementSearchServiceImplTest.java @@ -35,8 +35,6 @@ import org.alfresco.module.org_alfresco_module_rm.search.RecordsManagementSearch import org.alfresco.module.org_alfresco_module_rm.search.SavedSearchDetails; import org.alfresco.module.org_alfresco_module_rm.test.util.BaseRMTestCase; import org.alfresco.repo.security.authentication.AuthenticationUtil; -import org.alfresco.service.cmr.repository.NodeRef; -import org.alfresco.util.Pair; /** * Search service implementation unit test. @@ -45,22 +43,12 @@ import org.alfresco.util.Pair; */ public class RecordsManagementSearchServiceImplTest extends BaseRMTestCase { - @Override - protected boolean isMultiHierarchyTest() - { - return true; - } - private static final String SEARCH1 = "search1"; private static final String SEARCH2 = "search2"; private static final String SEARCH3 = "search3"; private static final String SEARCH4 = "search4"; private String user; - - private NodeRef folderLevelRecordFolder; - private NodeRef recordLevelRecordFolder; - private int numberOfReports; /** @@ -89,34 +77,6 @@ public class RecordsManagementSearchServiceImplTest extends BaseRMTestCase }, AuthenticationUtil.getSystemUserName()); } - /** - * @see org.alfresco.module.org_alfresco_module_rm.test.util.BaseRMTestCase#setupMultiHierarchyTestData() - */ - @Override - protected void setupMultiHierarchyTestData() - { - super.setupMultiHierarchyTestData(); - - doTestInTransaction(new Test() - { - @Override - public Void run() - { - folderLevelRecordFolder = mhRecordFolder42; - recordLevelRecordFolder = mhRecordFolder43; - - utils.createRecord(folderLevelRecordFolder, "recordOne.txt", null, "record one - folder level - elephant"); - utils.createRecord(folderLevelRecordFolder, "recordTwo.txt", null, "record two - folder level - snake"); - utils.createRecord(folderLevelRecordFolder, "recordThree.txt", null, "record three - folder level - monkey"); - utils.createRecord(recordLevelRecordFolder, "recordFour.txt", null, "record four - record level - elephant"); - utils.createRecord(recordLevelRecordFolder, "recordFive.txt", null, "record five - record level - snake"); - utils.createRecord(recordLevelRecordFolder, "recordSix.txt", null, "record six - record level - monkey"); - - return null; - } - }, AuthenticationUtil.getSystemUserName()); - } - public void testSaveSearch() { // Add some saved searches (as admin user) From 7938eb9ecbe275c1dd4d31a843591d9427141118 Mon Sep 17 00:00:00 2001 From: Rodica Sutu Date: Thu, 7 Jun 2018 16:43:37 +0300 Subject: [PATCH 46/99] Update the repo dependencies to 6.0 RC6 versions remove the workaround added for ACE-5852 Add properties for solr6. Move the Spring and Jackson dependencies from root pom to lower level --- pom.xml | 30 ----------------- rm-community/pom.xml | 32 ++++++++++++++++++- rm-community/rm-community-repo/pom.xml | 12 +++---- .../local/alfresco-global.properties | 3 +- 4 files changed, 39 insertions(+), 38 deletions(-) diff --git a/pom.xml b/pom.xml index 422d515fff..8f129d27a5 100644 --- a/pom.xml +++ b/pom.xml @@ -201,36 +201,6 @@ ${alfresco-spring-webscripts.version} tests - - org.springframework - spring-test - ${spring.version} - - - com.fasterxml.jackson.core - jackson-core - ${jackson.version} - - - com.fasterxml.jackson.core - jackson-annotations - ${jackson.version} - - - com.fasterxml.jackson.core - jackson-databind - ${jackson.version} - - - com.fasterxml.jackson.datatype - jackson-datatype-joda - ${jackson.version} - - - com.fasterxml.jackson.dataformat - jackson-dataformat-yaml - ${jackson.version} - postgresql postgresql diff --git a/rm-community/pom.xml b/rm-community/pom.xml index a4e51ab7f5..a9d1583fcf 100644 --- a/rm-community/pom.xml +++ b/rm-community/pom.xml @@ -39,12 +39,42 @@ pom import + + org.springframework + spring-test + ${spring.version} + + + com.fasterxml.jackson.core + jackson-core + ${jackson.version} + + + com.fasterxml.jackson.core + jackson-annotations + ${jackson.version} + + + com.fasterxml.jackson.core + jackson-databind + ${jackson.version} + + + com.fasterxml.jackson.datatype + jackson-datatype-joda + ${jackson.version} + + + com.fasterxml.jackson.dataformat + jackson-dataformat-yaml + ${jackson.version} + 6.0.5-ea - 6.0.a + 6.0.0-rc5 true diff --git a/rm-community/rm-community-repo/pom.xml b/rm-community/rm-community-repo/pom.xml index 9f49ed2a4a..9126a84161 100644 --- a/rm-community/rm-community-repo/pom.xml +++ b/rm-community/rm-community-repo/pom.xml @@ -27,12 +27,12 @@ 6.0.4-ea - 7.2 - 6.50 + 7.3 + 6.51 6.35 - 6.0.a - 6.0.a + 6.0.0-rc5 + 6.0.0-rc5 @@ -542,7 +542,7 @@ mysql mysql-connector-java - ${dependency.mysql.version} + ${mysql.version} @@ -573,7 +573,7 @@ mysql mysql-connector-java - ${dependency.mysql.version} + ${mysql.version} diff --git a/rm-community/rm-community-repo/src/test/properties/local/alfresco-global.properties b/rm-community/rm-community-repo/src/test/properties/local/alfresco-global.properties index 565870a814..956533c7fe 100644 --- a/rm-community/rm-community-repo/src/test/properties/local/alfresco-global.properties +++ b/rm-community/rm-community-repo/src/test/properties/local/alfresco-global.properties @@ -65,8 +65,9 @@ cifs.enabled=false ftp.enabled=false # Solr config -index.subsystem.name=solr4 +index.subsystem.name=solr6 solr.secureComms=none +solr.port=8983 #By default the basic auth is on false - REPO-2575 alfresco.restApi.basicAuthScheme=true \ No newline at end of file From 5073a5ba77200203e95f9d5ca73529b47081c9da Mon Sep 17 00:00:00 2001 From: Elena Hardon Date: Thu, 7 Jun 2018 17:03:44 +0300 Subject: [PATCH 47/99] RM-6349 Added docker maven plugin for the integration tests --- pom.xml | 3 ++ rm-community/rm-community-repo/pom.xml | 64 ++++++++++++++++++++++++-- 2 files changed, 64 insertions(+), 3 deletions(-) diff --git a/pom.xml b/pom.xml index 422d515fff..cce91c630e 100644 --- a/pom.xml +++ b/pom.xml @@ -170,10 +170,13 @@ 1.8 2.9.5 + 0.25.0 5.0.4.RELEASE 1.10.19 42.2.1 + 5432 5.1.40 + 3306 UTF-8 UTF-8 diff --git a/rm-community/rm-community-repo/pom.xml b/rm-community/rm-community-repo/pom.xml index 9f49ed2a4a..719a26c2d5 100644 --- a/rm-community/rm-community-repo/pom.xml +++ b/rm-community/rm-community-repo/pom.xml @@ -20,9 +20,12 @@ alfresco alfresco localhost + alfresco-test alfresco-platform 9.1-901.jdbc4 alfresco-rm-community-repo + 9.1-901.jdbc4 + 5.1.31 true @@ -127,9 +130,64 @@ + + + io.fabric8 + docker-maven-plugin + ${fabric8.version} + + + + test-database + postgres:9.4.12 + + + ${postgres.port}:${postgres.port} + + + ${alfresco.db.password} + ${alfresco.db.username} + ${alfresco.test.db.name} + + + -c max_connections=300 + + + database system is ready to accept connections + + + + + + + + + start + pre-integration-test + + start + + + + stop + post-integration-test + + stop + + + + org.apache.maven.plugins maven-failsafe-plugin + + + ${alfresco.test.db.name} + org.postgresql.Driver + jdbc:postgresql://localhost:${postgres.port}/${alfresco.test.db.name} + ${project.build.directory}/alf-data-test + + integration-tests @@ -442,7 +500,7 @@ ${my.db.name} ${my.db.port} - org.repo.alfresco..dialect.PostgreSQLDialect + org.repo.alfresco.domain.dialect.PostgreSQLDialect jdbc:postgresql:template1 jdbc:postgresql:${alfresco.db.name} @@ -542,7 +600,7 @@ mysql mysql-connector-java - ${dependency.mysql.version} + ${alfresco.mysql.version} @@ -573,7 +631,7 @@ mysql mysql-connector-java - ${dependency.mysql.version} + ${alfresco.mysql.version} From 7530206ae24d9548d07a4f5735095a0c45594f28 Mon Sep 17 00:00:00 2001 From: Rodica Sutu Date: Fri, 8 Jun 2018 10:11:31 +0300 Subject: [PATCH 48/99] review changes --- pom.xml | 2 -- rm-community/pom.xml | 3 +++ rm-community/rm-community-repo/pom.xml | 2 -- 3 files changed, 3 insertions(+), 4 deletions(-) diff --git a/pom.xml b/pom.xml index 8f129d27a5..079ba8440d 100644 --- a/pom.xml +++ b/pom.xml @@ -169,8 +169,6 @@ 1.8 1.8 - 2.9.5 - 5.0.4.RELEASE 1.10.19 42.2.1 5.1.40 diff --git a/rm-community/pom.xml b/rm-community/pom.xml index a9d1583fcf..e2f32d72f3 100644 --- a/rm-community/pom.xml +++ b/rm-community/pom.xml @@ -73,6 +73,9 @@ + 2.9.5 + 5.0.4.RELEASE + 6.0.5-ea 6.0.0-rc5 diff --git a/rm-community/rm-community-repo/pom.xml b/rm-community/rm-community-repo/pom.xml index 9126a84161..2c8b04c2c3 100644 --- a/rm-community/rm-community-repo/pom.xml +++ b/rm-community/rm-community-repo/pom.xml @@ -30,8 +30,6 @@ 7.3 6.51 6.35 - - 6.0.0-rc5 6.0.0-rc5 From 53a6887d7170a94ee48ff8259e59cf864a147c59 Mon Sep 17 00:00:00 2001 From: cagache Date: Mon, 11 Jun 2018 10:15:14 +0300 Subject: [PATCH 49/99] code review changes --- .../community/recordcategories/AutomaticDispositionTest.java | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/rm-automation/rm-automation-community-rest-api/src/test/java/org/alfresco/rest/rm/community/recordcategories/AutomaticDispositionTest.java b/rm-automation/rm-automation-community-rest-api/src/test/java/org/alfresco/rest/rm/community/recordcategories/AutomaticDispositionTest.java index 7d35b5e166..deb51e284d 100644 --- a/rm-automation/rm-automation-community-rest-api/src/test/java/org/alfresco/rest/rm/community/recordcategories/AutomaticDispositionTest.java +++ b/rm-automation/rm-automation-community-rest-api/src/test/java/org/alfresco/rest/rm/community/recordcategories/AutomaticDispositionTest.java @@ -57,7 +57,7 @@ public class AutomaticDispositionTest extends BaseRMRestTest * When the correct duration of time passes * Then the record will be automatically cut off */ - @Test + @Test(enabled = false) public void testAutomaticCutOff() throws Exception { STEP("Create record category with retention schedule and apply it to records."); @@ -70,8 +70,8 @@ public class AutomaticDispositionTest extends BaseRMRestTest STEP("Create a record folder with a record"); RecordCategoryChild recordFolder = createRecordFolder(categoryWithRSOnRecords.getId(), getRandomName ("recordFolder")); - Record record = createElectronicRecord(recordFolder.getId(), getRandomName("elRecord")); + STEP("Complete the record and wait upon to 5 minutes for automatic job to execute"); completeRecord(record.getId()); @@ -85,7 +85,6 @@ public class AutomaticDispositionTest extends BaseRMRestTest count++; aspects = recordsAPI.getRecord(record.getId()).getAspectNames(); } - aspects = recordsAPI.getRecord(record.getId()).getAspectNames(); assertTrue(aspects.contains(CUT_OFF_ASPECT), "Record should now be cut off"); } From 49f1f758846798beeb90bf62d93a65431b8f277b Mon Sep 17 00:00:00 2001 From: Elena Hardon Date: Mon, 11 Jun 2018 13:40:58 +0300 Subject: [PATCH 50/99] RM-6349 Removed jackson and spring version properties from parent pom --- pom.xml | 2 -- 1 file changed, 2 deletions(-) diff --git a/pom.xml b/pom.xml index 4f9ebd965f..7a235f167b 100644 --- a/pom.xml +++ b/pom.xml @@ -355,9 +355,7 @@ 2.7 8080 - 2.9.5 0.25.0 - 5.0.4.RELEASE 1.10.19 42.2.1 5432 From 8e93a8ff81a045481a66b69b8c69752f0a32e1e7 Mon Sep 17 00:00:00 2001 From: Elena Hardon Date: Mon, 11 Jun 2018 14:28:21 +0300 Subject: [PATCH 51/99] RM-6349 Minor changes over properties in parent pom and in community pom --- pom.xml | 2 +- rm-community/rm-community-repo/pom.xml | 5 ++--- 2 files changed, 3 insertions(+), 4 deletions(-) diff --git a/pom.xml b/pom.xml index 7a235f167b..fa3fe05155 100644 --- a/pom.xml +++ b/pom.xml @@ -358,7 +358,7 @@ 0.25.0 1.10.19 42.2.1 - 5432 + 5432 5.1.40 3306 diff --git a/rm-community/rm-community-repo/pom.xml b/rm-community/rm-community-repo/pom.xml index 63cbb1d387..8f7cfde8b2 100644 --- a/rm-community/rm-community-repo/pom.xml +++ b/rm-community/rm-community-repo/pom.xml @@ -25,7 +25,6 @@ 9.1-901.jdbc4 alfresco-rm-community-repo 9.1-901.jdbc4 - 5.1.31 true @@ -140,7 +139,7 @@ postgres:9.4.12 - ${postgres.port}:${postgres.port} + ${postgresql.port}:${postgresql.port} ${alfresco.db.password} @@ -182,7 +181,7 @@ ${alfresco.test.db.name} org.postgresql.Driver - jdbc:postgresql://localhost:${postgres.port}/${alfresco.test.db.name} + jdbc:postgresql://localhost:${postgresql.port}/${alfresco.test.db.name} ${project.build.directory}/alf-data-test From 88107a9fb33b8bec14434b5a9effe15db2a167d2 Mon Sep 17 00:00:00 2001 From: Elena Hardon Date: Mon, 11 Jun 2018 15:14:32 +0300 Subject: [PATCH 52/99] RM-6349 Updates on postgres port --- rm-community/rm-community-repo/pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/rm-community/rm-community-repo/pom.xml b/rm-community/rm-community-repo/pom.xml index 8f7cfde8b2..40f05dbdd6 100644 --- a/rm-community/rm-community-repo/pom.xml +++ b/rm-community/rm-community-repo/pom.xml @@ -139,7 +139,7 @@ postgres:9.4.12 - ${postgresql.port}:${postgresql.port} + database.port:${postgresql.port} ${alfresco.db.password} From 5f5a7531f1ce26c32c3cd7caf31b2b15e9e0a3a3 Mon Sep 17 00:00:00 2001 From: Elena Hardon Date: Mon, 11 Jun 2018 17:11:22 +0300 Subject: [PATCH 53/99] RM-6349 Changed postgres port --- pom.xml | 3 ++- rm-community/rm-community-repo/pom.xml | 2 +- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/pom.xml b/pom.xml index fa3fe05155..ba7c90b4f4 100644 --- a/pom.xml +++ b/pom.xml @@ -131,6 +131,7 @@ maven-dependency-plugin 2.10 + 2.10 @@ -358,7 +359,7 @@ 0.25.0 1.10.19 42.2.1 - 5432 + 5433 5.1.40 3306 diff --git a/rm-community/rm-community-repo/pom.xml b/rm-community/rm-community-repo/pom.xml index 40f05dbdd6..9001ca0786 100644 --- a/rm-community/rm-community-repo/pom.xml +++ b/rm-community/rm-community-repo/pom.xml @@ -139,7 +139,7 @@ postgres:9.4.12 - database.port:${postgresql.port} + database.port:$5433 ${alfresco.db.password} From 6555306f87d6bb1f131e061558fa90cf501ad165 Mon Sep 17 00:00:00 2001 From: Elena Hardon Date: Mon, 11 Jun 2018 17:16:10 +0300 Subject: [PATCH 54/99] RM-6349 Removed duplicate version --- pom.xml | 1 - 1 file changed, 1 deletion(-) diff --git a/pom.xml b/pom.xml index ba7c90b4f4..5939521697 100644 --- a/pom.xml +++ b/pom.xml @@ -131,7 +131,6 @@ maven-dependency-plugin 2.10 - 2.10 From 9b5da1611d46df909f75c05ab8d5cea27eeb9266 Mon Sep 17 00:00:00 2001 From: Elena Hardon Date: Mon, 11 Jun 2018 17:22:02 +0300 Subject: [PATCH 55/99] Corrected exposed port for postgtres --- rm-community/rm-community-repo/pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/rm-community/rm-community-repo/pom.xml b/rm-community/rm-community-repo/pom.xml index 9001ca0786..6dd45ff5e5 100644 --- a/rm-community/rm-community-repo/pom.xml +++ b/rm-community/rm-community-repo/pom.xml @@ -139,7 +139,7 @@ postgres:9.4.12 - database.port:$5433 + database.port:5433 ${alfresco.db.password} From 6a8d174a2467c6422e5f4b6c32068e7e3da94553 Mon Sep 17 00:00:00 2001 From: Elena Hardon Date: Mon, 11 Jun 2018 17:29:10 +0300 Subject: [PATCH 56/99] Changed postgres port --- rm-community/rm-community-repo/pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/rm-community/rm-community-repo/pom.xml b/rm-community/rm-community-repo/pom.xml index 6dd45ff5e5..8f7cfde8b2 100644 --- a/rm-community/rm-community-repo/pom.xml +++ b/rm-community/rm-community-repo/pom.xml @@ -139,7 +139,7 @@ postgres:9.4.12 - database.port:5433 + ${postgresql.port}:${postgresql.port} ${alfresco.db.password} From f42326205c95eb6d6d81a4bf8209340783069acd Mon Sep 17 00:00:00 2001 From: Elena Hardon Date: Mon, 11 Jun 2018 18:18:58 +0300 Subject: [PATCH 57/99] RM-6349 Updated postgres port --- pom.xml | 2 +- rm-community/rm-community-repo/pom.xml | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/pom.xml b/pom.xml index 5939521697..71809d2079 100644 --- a/pom.xml +++ b/pom.xml @@ -358,7 +358,7 @@ 0.25.0 1.10.19 42.2.1 - 5433 + 32000 5.1.40 3306 diff --git a/rm-community/rm-community-repo/pom.xml b/rm-community/rm-community-repo/pom.xml index 8f7cfde8b2..74c462cc15 100644 --- a/rm-community/rm-community-repo/pom.xml +++ b/rm-community/rm-community-repo/pom.xml @@ -139,7 +139,7 @@ postgres:9.4.12 - ${postgresql.port}:${postgresql.port} + ${postgresql.port}:5432 ${alfresco.db.password} @@ -497,7 +497,7 @@ ${my.db.name} ${my.db.port} - org.repo.alfresco.domain.dialect.PostgreSQLDialect + org.repo.alfresco.domain. jdbc:postgresql:template1 jdbc:postgresql:${alfresco.db.name} From 885c7ff08690b6cead736c92486ad006bf7dbb4f Mon Sep 17 00:00:00 2001 From: Elena Hardon Date: Tue, 12 Jun 2018 11:09:47 +0300 Subject: [PATCH 58/99] RM-6349 Small fixes over the fabric8 plugin --- pom.xml | 3 ++- rm-community/rm-community-repo/pom.xml | 4 ++-- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/pom.xml b/pom.xml index 71809d2079..49e2e65366 100644 --- a/pom.xml +++ b/pom.xml @@ -358,9 +358,10 @@ 0.25.0 1.10.19 42.2.1 - 32000 + 5432 5.1.40 3306 + 5431 UTF-8 UTF-8 diff --git a/rm-community/rm-community-repo/pom.xml b/rm-community/rm-community-repo/pom.xml index 74c462cc15..7e6814cbb0 100644 --- a/rm-community/rm-community-repo/pom.xml +++ b/rm-community/rm-community-repo/pom.xml @@ -139,7 +139,7 @@ postgres:9.4.12 - ${postgresql.port}:5432 + ${database.port}:${postgresql.port} ${alfresco.db.password} @@ -181,7 +181,7 @@ ${alfresco.test.db.name} org.postgresql.Driver - jdbc:postgresql://localhost:${postgresql.port}/${alfresco.test.db.name} + jdbc:postgresql://localhost:${database.port}/${alfresco.test.db.name} ${project.build.directory}/alf-data-test From 77fdae740d465bc50bcab60c24fba31044246593 Mon Sep 17 00:00:00 2001 From: Elena Hardon Date: Tue, 12 Jun 2018 12:48:49 +0300 Subject: [PATCH 59/99] RM-6349 Set up the correct PostgreSql dialect in community repo --- rm-community/rm-community-repo/pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/rm-community/rm-community-repo/pom.xml b/rm-community/rm-community-repo/pom.xml index 7e6814cbb0..ab55efd0d9 100644 --- a/rm-community/rm-community-repo/pom.xml +++ b/rm-community/rm-community-repo/pom.xml @@ -497,7 +497,7 @@ ${my.db.name} ${my.db.port} - org.repo.alfresco.domain. + org.repo.alfresco.domain.dialect.PostgreSQLDialect jdbc:postgresql:template1 jdbc:postgresql:${alfresco.db.name} From 0e62fdc9f89ae3326c20cb8464fe70339ad14328 Mon Sep 17 00:00:00 2001 From: Elena Hardon Date: Wed, 13 Jun 2018 11:05:18 +0300 Subject: [PATCH 60/99] RM-6349 Review changes --- pom.xml | 1 + rm-community/rm-community-repo/pom.xml | 18 ++++++++---------- 2 files changed, 9 insertions(+), 10 deletions(-) diff --git a/pom.xml b/pom.xml index 49e2e65366..2a45b46f49 100644 --- a/pom.xml +++ b/pom.xml @@ -361,6 +361,7 @@ 5432 5.1.40 3306 + 5431 UTF-8 diff --git a/rm-community/rm-community-repo/pom.xml b/rm-community/rm-community-repo/pom.xml index ab55efd0d9..a95c4e05fc 100644 --- a/rm-community/rm-community-repo/pom.xml +++ b/rm-community/rm-community-repo/pom.xml @@ -177,22 +177,20 @@ org.apache.maven.plugins maven-failsafe-plugin - - - ${alfresco.test.db.name} - org.postgresql.Driver - jdbc:postgresql://localhost:${database.port}/${alfresco.test.db.name} - ${project.build.directory}/alf-data-test - - integration-tests + integration-test integration-test - verify + + ${alfresco.test.db.name} + org.postgresql.Driver + jdbc:postgresql://localhost:${database.port}/${alfresco.test.db.name} + ${project.build.directory}/alf-data-test + ${skip.integrationtests} **/AllTestSuite.class @@ -497,7 +495,7 @@ ${my.db.name} ${my.db.port} - org.repo.alfresco.domain.dialect.PostgreSQLDialect + org.alfresco.repo.domain.dialect.PostgreSQLDialect jdbc:postgresql:template1 jdbc:postgresql:${alfresco.db.name} From 1c1e24165fae2e1b58202819993f1399969a2628 Mon Sep 17 00:00:00 2001 From: Brian Remmington Date: Wed, 13 Jun 2018 09:29:16 +0100 Subject: [PATCH 61/99] Added class diagram that illustrates the concepts exposed by Governance Services and the relationships between them. --- .../resource/class/governance-services.puml | 196 ++++++++++++++++++ 1 file changed, 196 insertions(+) create mode 100644 rm-community/documentation/resource/class/governance-services.puml diff --git a/rm-community/documentation/resource/class/governance-services.puml b/rm-community/documentation/resource/class/governance-services.puml new file mode 100644 index 0000000000..82089ab649 --- /dev/null +++ b/rm-community/documentation/resource/class/governance-services.puml @@ -0,0 +1,196 @@ +@startuml + +class RecordCategory { +} + +class Record { +} + +class NonElectronicRecord { +} + +class FilePlanComponent { +} + +class Transfer { + location : String + pdfIndicator : boolean +} + +note bottom of Transfer { + A holding pen for records + that are being transferred + out of the system +} + +class Hold { +} + +class EasyAccessRecord { +} + +class RetentionSchedule { +} + +class SecurityGroup { + enum groupType + {HIERARCHICAL, + USER_REQUIRES_ANY, + USER_REQUIRES_ALL} + unmarkedMark: SecurityMark +} + +class SecurityMark { +} + +class SecurityClassification { +} + +class Event { +} + +class Role { +} + +class Capability { + name:String +} + +class RmSite { +} + +class FilePlan { +} + +class UnfiledRecordContainer { +} + +class UnfiledRecordFolder { +} + +class HoldContainer { +} + +class TransferContainer { +} + +class RecordsManagementContainer { +} + +class RecordFolder { +} + +class ClassificationReason { +} + +class ClassificationExemption { +} + +class Content { +} + +class Folder { +} + +class File { +} + +class User { +} + +class Group { +} + +class ClassificationInfo { + classification: SecurityClassification + reason:ClassificationReason[] + classifiedBy: String + agency:String +} + +class SourceReference { + name:String + originatingOrg:String + publicationDate:Date +} + +class DowngradeSchedule { + date:Date + event:String + instructions:String +} + +class DeclassificationSchedule { + date:Date + event:String + exemption:Exemption[] +} + +class ClassificationGuide <> { +} + +class DeclassificationTimeframe { +} + + +ClassificationInfo *-- "*" SourceReference +ClassificationInfo *-- "0..1" DowngradeSchedule + +Folder <|-- RecordFolder + +FilePlanComponent <|-- RecordsManagementContainer +FilePlanComponent <|-- RecordFolder +FilePlanComponent <|-- NonElectronicRecord +FilePlanComponent <|-- Record +RecordsManagementContainer <|-- Hold +RecordsManagementContainer <|-- UnfiledRecordContainer +RecordsManagementContainer <|-- HoldContainer +RecordsManagementContainer <|-- TransferContainer +RecordsManagementContainer <|-- FilePlan +RecordsManagementContainer <|-- RecordCategory + +Hold "*" o- "*" FilePlanComponent : contains + +SecurityGroup "1" *- "*" SecurityMark + +Content o-- "*" SecurityMark : securityControls +User o-- "*" SecurityMark : clearance +Group o-- "*" SecurityMark : clearance + +RecordCategory "1" *- "*" RecordFolder +RecordCategory *- "*" RecordCategory + +note bottom of RecordCategory { + A RecordCategory may contain either RecordFolders or + RecordCategories but not both. A RecordCategory may only exist + as the child of either another RecordCategory or the FilePlan +} + +FilePlan *- "*" RecordsManagementContainer +HoldContainer *- "*" Hold +UnfiledRecordContainer *-- "*" UnfiledRecordFolder +UnfiledRecordFolder *-- "*" Record +RecordFolder *- "*" Record : contains +RecordFolder *-- "*" NonElectronicRecord : contains + +File <|-- Record + +TransferContainer *- "*" Transfer +Transfer *- "*" Record + +Role o- "*" Capability +User o- "*" Role +Group o- "*" Role + +SecurityMark <|-- SecurityClassification +Content o- "0..1" SecurityClassification + +Record <|- EasyAccessRecord +Folder "1" o-- "*" EasyAccessRecord + +Content <|-- Folder +Content <|-- File + +(Content, SecurityClassification) .. ClassificationInfo + +@enduml \ No newline at end of file From 9f383157077d888fbb9a06e97920a9537a33c3e8 Mon Sep 17 00:00:00 2001 From: Brian Remmington Date: Wed, 13 Jun 2018 09:35:24 +0100 Subject: [PATCH 62/99] Added PNG format of PUML class file describing Governance Services concepts. --- .../resource/class/governance-services.png | Bin 0 -> 137921 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 rm-community/documentation/resource/class/governance-services.png diff --git a/rm-community/documentation/resource/class/governance-services.png b/rm-community/documentation/resource/class/governance-services.png new file mode 100644 index 0000000000000000000000000000000000000000..823741042933fbf61ca8caeb97bfaca0c7bbae1e GIT binary patch literal 137921 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 PcIu{By*jJO}KL*HX%yJ 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

  • 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 B{ht5; literal 0 HcmV?d00001 From f9e4abf387d6a058cb7696991ca68dae2c1d486c Mon Sep 17 00:00:00 2001 From: Elena Hardon Date: Wed, 13 Jun 2018 12:13:54 +0300 Subject: [PATCH 63/99] RM-6349 Removed duplicated property --- rm-community/rm-community-repo/pom.xml | 1 - 1 file changed, 1 deletion(-) diff --git a/rm-community/rm-community-repo/pom.xml b/rm-community/rm-community-repo/pom.xml index a95c4e05fc..87d41dd0bb 100644 --- a/rm-community/rm-community-repo/pom.xml +++ b/rm-community/rm-community-repo/pom.xml @@ -24,7 +24,6 @@ alfresco-platform 9.1-901.jdbc4 alfresco-rm-community-repo - 9.1-901.jdbc4 true From fd61966f06b588091766a19aab4b9317571c6c2e Mon Sep 17 00:00:00 2001 From: Sara Aspery Date: Wed, 13 Jun 2018 10:28:36 +0100 Subject: [PATCH 64/99] RM-6354 Module repo version error --- .../org_alfresco_module_rm/module.properties | 2 +- .../test/resources/alfresco/version.properties | 18 ++++++++++++++++++ 2 files changed, 19 insertions(+), 1 deletion(-) create mode 100644 rm-community/rm-community-repo/test/resources/alfresco/version.properties diff --git a/rm-community/rm-community-repo/config/alfresco/module/org_alfresco_module_rm/module.properties b/rm-community/rm-community-repo/config/alfresco/module/org_alfresco_module_rm/module.properties index 272ed18d91..22d0426b4b 100644 --- a/rm-community/rm-community-repo/config/alfresco/module/org_alfresco_module_rm/module.properties +++ b/rm-community/rm-community-repo/config/alfresco/module/org_alfresco_module_rm/module.properties @@ -8,4 +8,4 @@ module.title=Records Management module.description=Alfresco Record Management Extension module.version=${rm.module.version} -module.repo.version.min=1.1.0 \ No newline at end of file +module.repo.version.min=6.0 \ No newline at end of file diff --git a/rm-community/rm-community-repo/test/resources/alfresco/version.properties b/rm-community/rm-community-repo/test/resources/alfresco/version.properties new file mode 100644 index 0000000000..06128c2e04 --- /dev/null +++ b/rm-community/rm-community-repo/test/resources/alfresco/version.properties @@ -0,0 +1,18 @@ +# +# Alfresco version information +# + +# Version label +version.major=6 +version.minor=0 +version.revision=0 +version.label= + +# Edition label +version.edition=Community + +# SCM Revision number +version.scmrevision=@scm-path@-r@scm-revision@ + +# Build number +version.build=r@scm-revision@-b@build-number@ \ No newline at end of file From 2f3211c979ab423a6cf074d93283b3a47fac354f Mon Sep 17 00:00:00 2001 From: Rodica Sutu Date: Thu, 14 Jun 2018 08:27:55 +0300 Subject: [PATCH 65/99] rename the extended bean simpleMappingExceptionResolverParent (core change) --- .../module/org_alfresco_module_rm/rm-public-rest-context.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/rm-community/rm-community-repo/config/alfresco/module/org_alfresco_module_rm/rm-public-rest-context.xml b/rm-community/rm-community-repo/config/alfresco/module/org_alfresco_module_rm/rm-public-rest-context.xml index 2cc827d11c..31ae1964ff 100644 --- a/rm-community/rm-community-repo/config/alfresco/module/org_alfresco_module_rm/rm-public-rest-context.xml +++ b/rm-community/rm-community-repo/config/alfresco/module/org_alfresco_module_rm/rm-public-rest-context.xml @@ -202,7 +202,7 @@ - + @@ -212,7 +212,7 @@ - + \ No newline at end of file From 6320a0fe8c5be89bd81f2e3f2b251ac0db056241 Mon Sep 17 00:00:00 2001 From: Rodica Sutu Date: Fri, 15 Jun 2018 13:09:53 +0300 Subject: [PATCH 66/99] -fix de/serialization of joda type by: using of jackson joda date type to deserialize local date using a custom serializer for joda date types --- .../rm-public-rest-context.xml | 16 ++++ .../api/util/CustomDateTimeSerializer.java | 73 +++++++++++++++++++ .../api/util/CustomLocalDateSerializer.java | 73 +++++++++++++++++++ 3 files changed, 162 insertions(+) create mode 100644 rm-community/rm-community-repo/source/java/org/alfresco/rm/rest/api/util/CustomDateTimeSerializer.java create mode 100644 rm-community/rm-community-repo/source/java/org/alfresco/rm/rest/api/util/CustomLocalDateSerializer.java diff --git a/rm-community/rm-community-repo/config/alfresco/module/org_alfresco_module_rm/rm-public-rest-context.xml b/rm-community/rm-community-repo/config/alfresco/module/org_alfresco_module_rm/rm-public-rest-context.xml index 31ae1964ff..4d147941b0 100644 --- a/rm-community/rm-community-repo/config/alfresco/module/org_alfresco_module_rm/rm-public-rest-context.xml +++ b/rm-community/rm-community-repo/config/alfresco/module/org_alfresco_module_rm/rm-public-rest-context.xml @@ -215,4 +215,20 @@ + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/rm-community/rm-community-repo/source/java/org/alfresco/rm/rest/api/util/CustomDateTimeSerializer.java b/rm-community/rm-community-repo/source/java/org/alfresco/rm/rest/api/util/CustomDateTimeSerializer.java new file mode 100644 index 0000000000..162426bad7 --- /dev/null +++ b/rm-community/rm-community-repo/source/java/org/alfresco/rm/rest/api/util/CustomDateTimeSerializer.java @@ -0,0 +1,73 @@ +/* + * #%L + * Alfresco Records Management Module + * %% + * Copyright (C) 2005 - 2018 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.rm.rest.api.util; + +import java.io.IOException; + +import com.fasterxml.jackson.core.JsonGenerator; +import com.fasterxml.jackson.databind.SerializerProvider; +import com.fasterxml.jackson.databind.ser.std.StdScalarSerializer; + +import org.joda.time.DateTime; +import org.joda.time.format.DateTimeFormat; +import org.joda.time.format.DateTimeFormatter; + +/** + * Custom Date Time serializer for formatting org.joda.time.DateTime + * + * @author Rodica Sutu + * @since 3.0 + */ +public class CustomDateTimeSerializer extends StdScalarSerializer +{ + /** Date time format */ + private final static DateTimeFormatter DATE_TIME_FORMAT = DateTimeFormat.forPattern("yyyy-MM-dd'T'HH:mm:ss.SSSZ"); + + public CustomDateTimeSerializer() + { + super(DateTime.class); + } + + protected CustomDateTimeSerializer(Class t) + { + super(t); + } + + /** + * Custom serialize to convert the org.joda.time.DateTime into string value using the DATE_TIME_FORMAT + * + * @param value datetime value + * @param jgen + * @param provider + * @throws IOException + */ + @Override + public void serialize(DateTime value, JsonGenerator jgen, SerializerProvider provider) throws IOException + { + jgen.writeString(DATE_TIME_FORMAT.print(value)); + } +} diff --git a/rm-community/rm-community-repo/source/java/org/alfresco/rm/rest/api/util/CustomLocalDateSerializer.java b/rm-community/rm-community-repo/source/java/org/alfresco/rm/rest/api/util/CustomLocalDateSerializer.java new file mode 100644 index 0000000000..dfdc5f7afe --- /dev/null +++ b/rm-community/rm-community-repo/source/java/org/alfresco/rm/rest/api/util/CustomLocalDateSerializer.java @@ -0,0 +1,73 @@ +/* + * #%L + * Alfresco Records Management Module + * %% + * Copyright (C) 2005 - 2018 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.rm.rest.api.util; + +import java.io.IOException; + +import com.fasterxml.jackson.core.JsonGenerator; +import com.fasterxml.jackson.databind.SerializerProvider; +import com.fasterxml.jackson.databind.ser.std.StdScalarSerializer; + +import org.joda.time.LocalDate; +import org.joda.time.format.DateTimeFormat; +import org.joda.time.format.DateTimeFormatter; + +/** + * Custom Local Date serializer for formatting org.joda.time.LocalDate + * + * @author Rodica Sutu + * @since 3.0 + */ +public class CustomLocalDateSerializer extends StdScalarSerializer +{ + /** Local date format */ + private final static DateTimeFormatter DATE_FORMAT = DateTimeFormat.forPattern("yyyy-MM-dd"); + + public CustomLocalDateSerializer() + { + super(LocalDate.class); + } + + protected CustomLocalDateSerializer(Class t) + { + super(t); + } + + /** + * Custom serialize method to convert the org.joda.time.LocalDate into string value using the DATE_FORMAT + * + * @param value local date value + * @param jgen + * @param provider + * @throws IOException + */ + @Override + public void serialize(LocalDate value, JsonGenerator jgen, SerializerProvider provider) throws IOException + { + jgen.writeString(DATE_FORMAT.print(value)); + } +} \ No newline at end of file From f3cea9dffdbafc9afc05df7ae877556a69e07f27 Mon Sep 17 00:00:00 2001 From: Rodica Sutu Date: Fri, 15 Jun 2018 13:11:19 +0300 Subject: [PATCH 67/99] additional changes for RM-6354 --- .../alfresco/module/org_alfresco_module_rm/module.properties | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/rm-community/rm-community-repo/config/alfresco/module/org_alfresco_module_rm/module.properties b/rm-community/rm-community-repo/config/alfresco/module/org_alfresco_module_rm/module.properties index 22d0426b4b..d315370d7b 100644 --- a/rm-community/rm-community-repo/config/alfresco/module/org_alfresco_module_rm/module.properties +++ b/rm-community/rm-community-repo/config/alfresco/module/org_alfresco_module_rm/module.properties @@ -7,5 +7,4 @@ module.aliases=org_alfresco_module_dod5015 module.title=Records Management module.description=Alfresco Record Management Extension module.version=${rm.module.version} - -module.repo.version.min=6.0 \ No newline at end of file +module.repo.version.min=${rm.module.repo.version.min} \ No newline at end of file From 365badd32e0003e960a1101fa4e7cbaac1beb8d2 Mon Sep 17 00:00:00 2001 From: Rodica Sutu Date: Fri, 15 Jun 2018 14:30:33 +0300 Subject: [PATCH 68/99] java docs updates and fix the deserialisation for the LocalDate from topics --- .../module/org_alfresco_module_rm/rm-public-rest-context.xml | 2 +- .../org/alfresco/rm/rest/api/util/CustomDateTimeSerializer.java | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/rm-community/rm-community-repo/config/alfresco/module/org_alfresco_module_rm/rm-public-rest-context.xml b/rm-community/rm-community-repo/config/alfresco/module/org_alfresco_module_rm/rm-public-rest-context.xml index 4d147941b0..900c93fba3 100644 --- a/rm-community/rm-community-repo/config/alfresco/module/org_alfresco_module_rm/rm-public-rest-context.xml +++ b/rm-community/rm-community-repo/config/alfresco/module/org_alfresco_module_rm/rm-public-rest-context.xml @@ -216,7 +216,7 @@ - diff --git a/rm-community/rm-community-repo/source/java/org/alfresco/rm/rest/api/util/CustomDateTimeSerializer.java b/rm-community/rm-community-repo/source/java/org/alfresco/rm/rest/api/util/CustomDateTimeSerializer.java index 162426bad7..0df22205ab 100644 --- a/rm-community/rm-community-repo/source/java/org/alfresco/rm/rest/api/util/CustomDateTimeSerializer.java +++ b/rm-community/rm-community-repo/source/java/org/alfresco/rm/rest/api/util/CustomDateTimeSerializer.java @@ -58,7 +58,7 @@ public class CustomDateTimeSerializer extends StdScalarSerializer } /** - * Custom serialize to convert the org.joda.time.DateTime into string value using the DATE_TIME_FORMAT + * Custom serialize method to convert the org.joda.time.DateTime into string value using the DATE_TIME_FORMAT * * @param value datetime value * @param jgen From c87aff832abf4e72a94a27cec92fc79d39a5be04 Mon Sep 17 00:00:00 2001 From: Rodica Sutu Date: Mon, 18 Jun 2018 10:58:48 +0300 Subject: [PATCH 69/99] review changes and fix for converting string with time to date using a LocalDateDeserializer --- .../api/util/CustomDateTimeSerializer.java | 4 +- .../api/util/CustomLocalDateDeserializer.java | 86 +++++++++++++++++++ .../api/util/CustomLocalDateSerializer.java | 4 +- 3 files changed, 90 insertions(+), 4 deletions(-) create mode 100644 rm-community/rm-community-repo/source/java/org/alfresco/rm/rest/api/util/CustomLocalDateDeserializer.java diff --git a/rm-community/rm-community-repo/source/java/org/alfresco/rm/rest/api/util/CustomDateTimeSerializer.java b/rm-community/rm-community-repo/source/java/org/alfresco/rm/rest/api/util/CustomDateTimeSerializer.java index 0df22205ab..2d75f5ec5d 100644 --- a/rm-community/rm-community-repo/source/java/org/alfresco/rm/rest/api/util/CustomDateTimeSerializer.java +++ b/rm-community/rm-community-repo/source/java/org/alfresco/rm/rest/api/util/CustomDateTimeSerializer.java @@ -30,7 +30,7 @@ import java.io.IOException; import com.fasterxml.jackson.core.JsonGenerator; import com.fasterxml.jackson.databind.SerializerProvider; -import com.fasterxml.jackson.databind.ser.std.StdScalarSerializer; +import com.fasterxml.jackson.databind.ser.std.StdSerializer; import org.joda.time.DateTime; import org.joda.time.format.DateTimeFormat; @@ -42,7 +42,7 @@ import org.joda.time.format.DateTimeFormatter; * @author Rodica Sutu * @since 3.0 */ -public class CustomDateTimeSerializer extends StdScalarSerializer +public class CustomDateTimeSerializer extends StdSerializer { /** Date time format */ private final static DateTimeFormatter DATE_TIME_FORMAT = DateTimeFormat.forPattern("yyyy-MM-dd'T'HH:mm:ss.SSSZ"); diff --git a/rm-community/rm-community-repo/source/java/org/alfresco/rm/rest/api/util/CustomLocalDateDeserializer.java b/rm-community/rm-community-repo/source/java/org/alfresco/rm/rest/api/util/CustomLocalDateDeserializer.java new file mode 100644 index 0000000000..06980287d4 --- /dev/null +++ b/rm-community/rm-community-repo/source/java/org/alfresco/rm/rest/api/util/CustomLocalDateDeserializer.java @@ -0,0 +1,86 @@ +/* + * #%L + * Alfresco Records Management Module + * %% + * Copyright (C) 2005 - 2018 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.rm.rest.api.util; + + +import java.io.IOException; +import java.text.DateFormat; +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.util.Date; + +import com.fasterxml.jackson.core.JsonParser; +import com.fasterxml.jackson.databind.DeserializationContext; +import com.fasterxml.jackson.databind.deser.std.StdDeserializer; + +import org.joda.time.LocalDate; + +/** + * Custom Local Date deserializer for converting a string value with time into a org.joda.time.LocalDate value + * + * @author Rodica Sutu + * @since 3.0 + */ +public class CustomLocalDateDeserializer extends StdDeserializer +{ + /** Local date format */ + private final static DateFormat DATE_FORMAT = new SimpleDateFormat("yyyy-MM-dd"); + + + public CustomLocalDateDeserializer() + { + super(LocalDate.class); + } + protected CustomLocalDateDeserializer(Class vc) + { + super(vc); + } + + /** + * Custom deserialize method to convert a string value into a org.joda.time.LocalDate value using the DATE_FORMAT + * + * @param p local date value + * @param ctx + * @throws IOException + */ + @Override + public LocalDate deserialize(JsonParser p, DeserializationContext ctx) throws IOException + { + Date date = null; + try + { + // convert the string with time into a date value using the format DATE_FORMAT + date = DATE_FORMAT.parse(p.getText()); + } + catch (ParseException e) + { + e.printStackTrace(); + } + // convert the date into a LocalDate + return LocalDate.fromDateFields(date); + } +} diff --git a/rm-community/rm-community-repo/source/java/org/alfresco/rm/rest/api/util/CustomLocalDateSerializer.java b/rm-community/rm-community-repo/source/java/org/alfresco/rm/rest/api/util/CustomLocalDateSerializer.java index dfdc5f7afe..f10fd69cd4 100644 --- a/rm-community/rm-community-repo/source/java/org/alfresco/rm/rest/api/util/CustomLocalDateSerializer.java +++ b/rm-community/rm-community-repo/source/java/org/alfresco/rm/rest/api/util/CustomLocalDateSerializer.java @@ -30,7 +30,7 @@ import java.io.IOException; import com.fasterxml.jackson.core.JsonGenerator; import com.fasterxml.jackson.databind.SerializerProvider; -import com.fasterxml.jackson.databind.ser.std.StdScalarSerializer; +import com.fasterxml.jackson.databind.ser.std.StdSerializer; import org.joda.time.LocalDate; import org.joda.time.format.DateTimeFormat; @@ -42,7 +42,7 @@ import org.joda.time.format.DateTimeFormatter; * @author Rodica Sutu * @since 3.0 */ -public class CustomLocalDateSerializer extends StdScalarSerializer +public class CustomLocalDateSerializer extends StdSerializer { /** Local date format */ private final static DateTimeFormatter DATE_FORMAT = DateTimeFormat.forPattern("yyyy-MM-dd"); From 95f6f7174e2f13907de8aa97446fbaffd6999c0d Mon Sep 17 00:00:00 2001 From: Rodica Sutu Date: Tue, 19 Jun 2018 08:44:10 +0300 Subject: [PATCH 70/99] revert the change for truncating the date with time --- .../api/util/CustomLocalDateDeserializer.java | 86 ------------------- 1 file changed, 86 deletions(-) delete mode 100644 rm-community/rm-community-repo/source/java/org/alfresco/rm/rest/api/util/CustomLocalDateDeserializer.java diff --git a/rm-community/rm-community-repo/source/java/org/alfresco/rm/rest/api/util/CustomLocalDateDeserializer.java b/rm-community/rm-community-repo/source/java/org/alfresco/rm/rest/api/util/CustomLocalDateDeserializer.java deleted file mode 100644 index 06980287d4..0000000000 --- a/rm-community/rm-community-repo/source/java/org/alfresco/rm/rest/api/util/CustomLocalDateDeserializer.java +++ /dev/null @@ -1,86 +0,0 @@ -/* - * #%L - * Alfresco Records Management Module - * %% - * Copyright (C) 2005 - 2018 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.rm.rest.api.util; - - -import java.io.IOException; -import java.text.DateFormat; -import java.text.ParseException; -import java.text.SimpleDateFormat; -import java.util.Date; - -import com.fasterxml.jackson.core.JsonParser; -import com.fasterxml.jackson.databind.DeserializationContext; -import com.fasterxml.jackson.databind.deser.std.StdDeserializer; - -import org.joda.time.LocalDate; - -/** - * Custom Local Date deserializer for converting a string value with time into a org.joda.time.LocalDate value - * - * @author Rodica Sutu - * @since 3.0 - */ -public class CustomLocalDateDeserializer extends StdDeserializer -{ - /** Local date format */ - private final static DateFormat DATE_FORMAT = new SimpleDateFormat("yyyy-MM-dd"); - - - public CustomLocalDateDeserializer() - { - super(LocalDate.class); - } - protected CustomLocalDateDeserializer(Class vc) - { - super(vc); - } - - /** - * Custom deserialize method to convert a string value into a org.joda.time.LocalDate value using the DATE_FORMAT - * - * @param p local date value - * @param ctx - * @throws IOException - */ - @Override - public LocalDate deserialize(JsonParser p, DeserializationContext ctx) throws IOException - { - Date date = null; - try - { - // convert the string with time into a date value using the format DATE_FORMAT - date = DATE_FORMAT.parse(p.getText()); - } - catch (ParseException e) - { - e.printStackTrace(); - } - // convert the date into a LocalDate - return LocalDate.fromDateFields(date); - } -} From c19f3c88a96c50942dd2b05cb6a4f17ba5839a6d Mon Sep 17 00:00:00 2001 From: Tom Page Date: Tue, 19 Jun 2018 09:03:07 +0100 Subject: [PATCH 71/99] RM-6391 Skip the docker steps if skipping the integration tests. --- rm-community/rm-community-repo/pom.xml | 1 + 1 file changed, 1 insertion(+) diff --git a/rm-community/rm-community-repo/pom.xml b/rm-community/rm-community-repo/pom.xml index 87d41dd0bb..923cef481e 100644 --- a/rm-community/rm-community-repo/pom.xml +++ b/rm-community/rm-community-repo/pom.xml @@ -155,6 +155,7 @@ + ${skip.integrationtests} From 042eced70b734349b5501e51c3914bb4c9edf30f Mon Sep 17 00:00:00 2001 From: Roxana Lucanu-Ghetu Date: Tue, 19 Jun 2018 16:37:52 +0300 Subject: [PATCH 72/99] RM-6372 Intermediate stuff --- .../rm-community-repo/.maven-dockerignore | 1 + rm-community/rm-community-repo/Dockerfile | 6 + .../rm-community-repo/docker-compose.yml | 69 ++++++++ rm-community/rm-community-repo/pom.xml | 163 ++++++++++++++++++ 4 files changed, 239 insertions(+) create mode 100644 rm-community/rm-community-repo/.maven-dockerignore create mode 100644 rm-community/rm-community-repo/Dockerfile create mode 100644 rm-community/rm-community-repo/docker-compose.yml diff --git a/rm-community/rm-community-repo/.maven-dockerignore b/rm-community/rm-community-repo/.maven-dockerignore new file mode 100644 index 0000000000..18bb2a12d0 --- /dev/null +++ b/rm-community/rm-community-repo/.maven-dockerignore @@ -0,0 +1 @@ +target/docker/** \ No newline at end of file diff --git a/rm-community/rm-community-repo/Dockerfile b/rm-community/rm-community-repo/Dockerfile new file mode 100644 index 0000000000..16ad3116ba --- /dev/null +++ b/rm-community/rm-community-repo/Dockerfile @@ -0,0 +1,6 @@ +FROM alfresco/alfresco-content-repository-community:latest + +COPY target/alfresco-rm-community-repo-*.amp /usr/local/tomcat/amps + +RUN java -jar /usr/local/tomcat/alfresco-mmt/alfresco-mmt*.jar install \ + /usr/local/tomcat/amps/alfresco-rm-community-repo-*.amp /usr/local/tomcat/webapps/alfresco -nobackup -force diff --git a/rm-community/rm-community-repo/docker-compose.yml b/rm-community/rm-community-repo/docker-compose.yml new file mode 100644 index 0000000000..24d5867a77 --- /dev/null +++ b/rm-community/rm-community-repo/docker-compose.yml @@ -0,0 +1,69 @@ +version: "3" + +# The acs-community-deployment project contains the product version of docker-compose. +# +# This version is for testing and development use. For testing and debug we need to have a more open version. +# For remote debug we need the CATALINA_OPTS and to expose port 8000. + +services: + alfresco: + image: acs-rm:latest + environment: + CATALINA_OPTS : " + -agentlib:jdwp=transport=dt_socket,address=8000,server=y,suspend=n + " + JAVA_OPTS : " + -Ddb.driver=org.postgresql.Driver + -Ddb.username=alfresco + -Ddb.password=alfresco + -Ddb.url=jdbc:postgresql://postgres:5432/alfresco + -Dsolr.host=solr6 + -Dsolr.port=8983 + -Dsolr.secureComms=none + -Dsolr.base.url=/solr + -Dindex.subsystem.name=solr6 + -Dalfresco.restApi.basicAuthScheme=true + -Dimap.server.enabled=true + -Dftp.enabled=true + -Dftp.dataPortFrom=30000 + -Dftp.dataPortTo=30099 + -Dcifs.enabled=true + " + ports: + - 8082:8080 + - 8000:8000 + - 445:445 + - 143:143 + - "21:21" + - "30000-30099:30000-30099" + + share: + image: alfresco/alfresco-share:6.0.a + environment: + - REPO_HOST=alfresco + - REPO_PORT=8080 + ports: + - 8080:8080 + + postgres: + image: library/postgres:10.1 + environment: + - POSTGRES_PASSWORD=alfresco + - POSTGRES_USER=alfresco + - POSTGRES_DB=alfresco + ports: + - 5432:5432 + + solr6: + image: alfresco/alfresco-search-services:1.1.1 + environment: + #Solr needs to know how to register itself with Alfresco + - SOLR_ALFRESCO_HOST=alfresco + - SOLR_ALFRESCO_PORT=8080 + #Alfresco needs to know how to call solr + - SOLR_SOLR_HOST=solr6 + - SOLR_SOLR_PORT=8983 + #Create the default alfresco and archive cores + - SOLR_CREATE_ALFRESCO_DEFAULTS=alfresco,archive + ports: + - 8083:8983 #Browser port diff --git a/rm-community/rm-community-repo/pom.xml b/rm-community/rm-community-repo/pom.xml index 87d41dd0bb..a4ec3bc0ad 100644 --- a/rm-community/rm-community-repo/pom.xml +++ b/rm-community/rm-community-repo/pom.xml @@ -32,6 +32,11 @@ 6.51 6.35 6.0.0-rc5 + alfresco/ags-repo-community + quay.io + latest + 3.5.37 + @@ -154,6 +159,13 @@ + + ${image.name} + + ${project.basedir}/ + + + @@ -349,6 +361,22 @@ + + io.fabric8 + fabric8-maven-plugin + ${dependency.fabric8.version} + + + + ${image.name} + + ${project.basedir}/ + + + + + + @@ -654,5 +682,140 @@ + + communityDocker + + + + io.fabric8 + fabric8-maven-plugin + ${dependency.fabric8.version} + + + build-image + install + + build + + + + + + + + + internal + + + + io.fabric8 + fabric8-maven-plugin + ${dependency.fabric8.version} + + + + ${image.name}:${image.tag} + ${image.registry} + + ${project.basedir}/ + + + + + + + build-push-image + install + + build + push + + + + + + + + + + master + + + + io.fabric8 + fabric8-maven-plugin + ${dependency.fabric8.version} + + + + ${image.name} + ${image.registry} + + ${project.basedir}/ + + + + ${image.name} + + ${project.basedir}/ + + + + + + + build-push-image + install + + build + push + + + + + + + + + + release + + + + io.fabric8 + fabric8-maven-plugin + ${dependency.fabric8.version} + + + + ${image.name}:${project.version} + ${image.registry} + + ${project.basedir}/ + + + + ${image.name}:${project.version} + + ${project.basedir}/ + + + + + + + build-push-image + deploy + + build + push + + + + + + + + \ No newline at end of file From 2985debac3173a7edb6276b34fc3a2257338dd9d Mon Sep 17 00:00:00 2001 From: cagache Date: Wed, 20 Jun 2018 12:03:22 +0300 Subject: [PATCH 73/99] RM-6138 Create docker images for rm-enterprise-share and rm-enterprise-repo --- pom.xml | 159 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 159 insertions(+) diff --git a/pom.xml b/pom.xml index 2a45b46f49..e554aed1d1 100644 --- a/pom.xml +++ b/pom.xml @@ -327,6 +327,160 @@ + + + buildDockerImage + + + + + io.fabric8 + fabric8-maven-plugin + ${dependency.fabric8.version} + + + + ${image.name} + + ${project.basedir}/ + + + + + + + build-image + install + + build + + + + + + + + + + + internal + + + + + io.fabric8 + fabric8-maven-plugin + ${dependency.fabric8.version} + + + + ${image.name}:${image.tag} + ${image.registry} + + ${project.basedir}/ + + + + + + + build-push-image + install + + build + push + + + + + + + + + + + master + + + + + io.fabric8 + fabric8-maven-plugin + ${dependency.fabric8.version} + + + + ${image.name} + ${image.registry} + + ${project.basedir}/ + + + + ${image.name} + + ${project.basedir}/ + + + + + + + build-push-image + install + + build + push + + + + + + + + + + + release + + + + + io.fabric8 + fabric8-maven-plugin + ${dependency.fabric8.version} + + + + ${image.name}:${project.version} + ${image.registry} + + ${project.basedir}/ + + + + ${image.name}:${project.version} + + ${project.basedir}/ + + + + + + + build-push-image + deploy + + build + push + + + + + + + + @@ -381,6 +535,11 @@ src/main/properties/local ** src/test/properties/local + + 3.5.37 + imageNameNotSet + latest + quay.io From 19ca1373edaeed52349186c1302bbd171832198e Mon Sep 17 00:00:00 2001 From: cagache Date: Wed, 20 Jun 2018 15:32:17 +0300 Subject: [PATCH 74/99] Applied code review changes --- pom.xml | 18 ++++++++++++------ rm-community/rm-community-repo/pom.xml | 2 +- 2 files changed, 13 insertions(+), 7 deletions(-) diff --git a/pom.xml b/pom.xml index e554aed1d1..960c830995 100644 --- a/pom.xml +++ b/pom.xml @@ -328,6 +328,7 @@ + buildDockerImage @@ -336,7 +337,7 @@ io.fabric8 fabric8-maven-plugin - ${dependency.fabric8.version} + ${fabric8.maven.version} @@ -362,6 +363,7 @@ + internal @@ -370,7 +372,7 @@ io.fabric8 fabric8-maven-plugin - ${dependency.fabric8.version} + ${fabric8.maven.version} @@ -398,6 +400,8 @@ + master @@ -406,7 +410,7 @@ io.fabric8 fabric8-maven-plugin - ${dependency.fabric8.version} + ${fabric8.maven.version} @@ -440,6 +444,8 @@ + release @@ -448,7 +454,7 @@ io.fabric8 fabric8-maven-plugin - ${dependency.fabric8.version} + ${fabric8.maven.version} @@ -509,7 +515,7 @@ 2.7 8080 - 0.25.0 + 0.25.0 1.10.19 42.2.1 5432 @@ -536,7 +542,7 @@ ** src/test/properties/local - 3.5.37 + 3.5.37 imageNameNotSet latest quay.io diff --git a/rm-community/rm-community-repo/pom.xml b/rm-community/rm-community-repo/pom.xml index 87d41dd0bb..a8e2d02bef 100644 --- a/rm-community/rm-community-repo/pom.xml +++ b/rm-community/rm-community-repo/pom.xml @@ -130,7 +130,7 @@ io.fabric8 docker-maven-plugin - ${fabric8.version} + ${fabric8.docker.version} From 04e23768e8e1ac9057640a3b41198d7a3f82d5b9 Mon Sep 17 00:00:00 2001 From: Roxana Lucanu-Ghetu Date: Wed, 20 Jun 2018 17:14:01 +0300 Subject: [PATCH 75/99] RM-6372 Profile changes --- .../rm-community-repo/docker-compose.yml | 2 +- rm-community/rm-community-repo/pom.xml | 110 +----------------- 2 files changed, 2 insertions(+), 110 deletions(-) diff --git a/rm-community/rm-community-repo/docker-compose.yml b/rm-community/rm-community-repo/docker-compose.yml index 24d5867a77..a30accc666 100644 --- a/rm-community/rm-community-repo/docker-compose.yml +++ b/rm-community/rm-community-repo/docker-compose.yml @@ -7,7 +7,7 @@ version: "3" services: alfresco: - image: acs-rm:latest + image: alfresco/ags-repo-community:latest environment: CATALINA_OPTS : " -agentlib:jdwp=transport=dt_socket,address=8000,server=y,suspend=n diff --git a/rm-community/rm-community-repo/pom.xml b/rm-community/rm-community-repo/pom.xml index 22a5fcc01a..decb12fed7 100644 --- a/rm-community/rm-community-repo/pom.xml +++ b/rm-community/rm-community-repo/pom.xml @@ -362,22 +362,6 @@ - - io.fabric8 - fabric8-maven-plugin - ${dependency.fabric8.version} - - - - ${image.name} - - ${project.basedir}/ - - - - - - @@ -630,7 +614,6 @@ - wipeDB @@ -684,22 +667,12 @@ - communityDocker + buildDockerImage io.fabric8 fabric8-maven-plugin - ${dependency.fabric8.version} - - - build-image - install - - build - - - @@ -711,33 +684,10 @@ io.fabric8 fabric8-maven-plugin - ${dependency.fabric8.version} - - - - ${image.name}:${image.tag} - ${image.registry} - - ${project.basedir}/ - - - - - - - build-push-image - install - - build - push - - - - master @@ -745,39 +695,10 @@ io.fabric8 fabric8-maven-plugin - ${dependency.fabric8.version} - - - - ${image.name} - ${image.registry} - - ${project.basedir}/ - - - - ${image.name} - - ${project.basedir}/ - - - - - - - build-push-image - install - - build - push - - - - release @@ -785,38 +706,9 @@ io.fabric8 fabric8-maven-plugin - ${dependency.fabric8.version} - - - - ${image.name}:${project.version} - ${image.registry} - - ${project.basedir}/ - - - - ${image.name}:${project.version} - - ${project.basedir}/ - - - - - - - build-push-image - deploy - - build - push - - - - \ No newline at end of file From 7392bdf72684168a39a8507e0c22325fcf976b42 Mon Sep 17 00:00:00 2001 From: Roxana Lucanu-Ghetu Date: Wed, 20 Jun 2018 17:36:52 +0300 Subject: [PATCH 76/99] RM-6372 Removed unwanted properties and image from pom. --- rm-community/rm-community-repo/pom.xml | 10 ---------- 1 file changed, 10 deletions(-) diff --git a/rm-community/rm-community-repo/pom.xml b/rm-community/rm-community-repo/pom.xml index decb12fed7..e5bc2ec355 100644 --- a/rm-community/rm-community-repo/pom.xml +++ b/rm-community/rm-community-repo/pom.xml @@ -33,9 +33,6 @@ 6.35 6.0.0-rc5 alfresco/ags-repo-community - quay.io - latest - 3.5.37 @@ -159,13 +156,6 @@ - - ${image.name} - - ${project.basedir}/ - - - ${skip.integrationtests} From 8061d5a354107468885636baf07b798239b42b79 Mon Sep 17 00:00:00 2001 From: Rodica Sutu Date: Wed, 20 Jun 2018 17:52:28 +0300 Subject: [PATCH 77/99] fix the date-time string not changed to a simple date --- .../api/util/CustomDateTimeSerializer.java | 4 +- .../api/util/CustomLocalDateDeserializer.java | 74 +++++++++++++++++++ .../api/util/CustomLocalDateSerializer.java | 6 +- 3 files changed, 79 insertions(+), 5 deletions(-) create mode 100644 rm-community/rm-community-repo/source/java/org/alfresco/rm/rest/api/util/CustomLocalDateDeserializer.java diff --git a/rm-community/rm-community-repo/source/java/org/alfresco/rm/rest/api/util/CustomDateTimeSerializer.java b/rm-community/rm-community-repo/source/java/org/alfresco/rm/rest/api/util/CustomDateTimeSerializer.java index 2d75f5ec5d..631ccee679 100644 --- a/rm-community/rm-community-repo/source/java/org/alfresco/rm/rest/api/util/CustomDateTimeSerializer.java +++ b/rm-community/rm-community-repo/source/java/org/alfresco/rm/rest/api/util/CustomDateTimeSerializer.java @@ -33,8 +33,8 @@ import com.fasterxml.jackson.databind.SerializerProvider; import com.fasterxml.jackson.databind.ser.std.StdSerializer; import org.joda.time.DateTime; -import org.joda.time.format.DateTimeFormat; import org.joda.time.format.DateTimeFormatter; +import org.joda.time.format.ISODateTimeFormat; /** * Custom Date Time serializer for formatting org.joda.time.DateTime @@ -45,7 +45,7 @@ import org.joda.time.format.DateTimeFormatter; public class CustomDateTimeSerializer extends StdSerializer { /** Date time format */ - private final static DateTimeFormatter DATE_TIME_FORMAT = DateTimeFormat.forPattern("yyyy-MM-dd'T'HH:mm:ss.SSSZ"); + private final static DateTimeFormatter DATE_TIME_FORMAT = ISODateTimeFormat.dateTime(); public CustomDateTimeSerializer() { diff --git a/rm-community/rm-community-repo/source/java/org/alfresco/rm/rest/api/util/CustomLocalDateDeserializer.java b/rm-community/rm-community-repo/source/java/org/alfresco/rm/rest/api/util/CustomLocalDateDeserializer.java new file mode 100644 index 0000000000..ef8133a114 --- /dev/null +++ b/rm-community/rm-community-repo/source/java/org/alfresco/rm/rest/api/util/CustomLocalDateDeserializer.java @@ -0,0 +1,74 @@ +/* + * #%L + * Alfresco Records Management Module + * %% + * Copyright (C) 2005 - 2018 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.rm.rest.api.util; + +import java.io.IOException; + +import com.fasterxml.jackson.core.JsonParser; +import com.fasterxml.jackson.databind.DeserializationContext; +import com.fasterxml.jackson.databind.deser.std.StdDeserializer; + +import org.joda.time.LocalDate; +import org.joda.time.format.DateTimeFormatter; +import org.joda.time.format.ISODateTimeFormat; + + +/** + * Custom Local Date deserializer converting a string to org.joda.time.LocalDate when the time is optional; + * + * @author Rodica Sutu + * @since 3.0 + */ +public class CustomLocalDateDeserializer extends StdDeserializer +{ + /** Date time format with time optional */ + private final static DateTimeFormatter LOCAL_DATE_OPTIONAL_TIME_PARSER = ISODateTimeFormat.localDateOptionalTimeParser(); + + public CustomLocalDateDeserializer() + { + super(LocalDate.class); + } + + /** + * Custom deserialize method to convert string to the org.joda.time.LocalDate type with LOCAL_DATE_OPTIONAL_TIME_PARSER + * + * @param jp local date value + * @param ctxt + * @throws IOException + */ + @Override + public LocalDate deserialize(JsonParser jp, DeserializationContext ctxt) throws IOException + { + String str = jp.getText().trim(); + if (str.length() == 0) + { + return null; + } + return LOCAL_DATE_OPTIONAL_TIME_PARSER.parseLocalDate(str); + } +} + diff --git a/rm-community/rm-community-repo/source/java/org/alfresco/rm/rest/api/util/CustomLocalDateSerializer.java b/rm-community/rm-community-repo/source/java/org/alfresco/rm/rest/api/util/CustomLocalDateSerializer.java index f10fd69cd4..b3aa93c66a 100644 --- a/rm-community/rm-community-repo/source/java/org/alfresco/rm/rest/api/util/CustomLocalDateSerializer.java +++ b/rm-community/rm-community-repo/source/java/org/alfresco/rm/rest/api/util/CustomLocalDateSerializer.java @@ -33,8 +33,8 @@ import com.fasterxml.jackson.databind.SerializerProvider; import com.fasterxml.jackson.databind.ser.std.StdSerializer; import org.joda.time.LocalDate; -import org.joda.time.format.DateTimeFormat; import org.joda.time.format.DateTimeFormatter; +import org.joda.time.format.ISODateTimeFormat; /** * Custom Local Date serializer for formatting org.joda.time.LocalDate @@ -44,8 +44,8 @@ import org.joda.time.format.DateTimeFormatter; */ public class CustomLocalDateSerializer extends StdSerializer { - /** Local date format */ - private final static DateTimeFormatter DATE_FORMAT = DateTimeFormat.forPattern("yyyy-MM-dd"); + /** Local date format yyyy-MM-dd*/ + private final static DateTimeFormatter DATE_FORMAT = ISODateTimeFormat.date(); public CustomLocalDateSerializer() { From 5cc4f19633e088ada327d3524067ba23545d6917 Mon Sep 17 00:00:00 2001 From: Roxana Lucanu-Ghetu Date: Thu, 21 Jun 2018 10:55:31 +0300 Subject: [PATCH 78/99] RM-6372 Removed share from Dockerfile and force option --- rm-community/rm-community-repo/Dockerfile | 4 ++-- rm-community/rm-community-repo/docker-compose.yml | 8 -------- 2 files changed, 2 insertions(+), 10 deletions(-) diff --git a/rm-community/rm-community-repo/Dockerfile b/rm-community/rm-community-repo/Dockerfile index 16ad3116ba..0b60061ad4 100644 --- a/rm-community/rm-community-repo/Dockerfile +++ b/rm-community/rm-community-repo/Dockerfile @@ -1,6 +1,6 @@ FROM alfresco/alfresco-content-repository-community:latest -COPY target/alfresco-rm-community-repo-*.amp /usr/local/tomcat/amps +COPY target/alfresco-rm-community-repo-*.amp /usr/local/tomcat/amps/ RUN java -jar /usr/local/tomcat/alfresco-mmt/alfresco-mmt*.jar install \ - /usr/local/tomcat/amps/alfresco-rm-community-repo-*.amp /usr/local/tomcat/webapps/alfresco -nobackup -force + /usr/local/tomcat/amps/alfresco-rm-community-repo-*.amp /usr/local/tomcat/webapps/alfresco -nobackup diff --git a/rm-community/rm-community-repo/docker-compose.yml b/rm-community/rm-community-repo/docker-compose.yml index a30accc666..dd25d6719d 100644 --- a/rm-community/rm-community-repo/docker-compose.yml +++ b/rm-community/rm-community-repo/docker-compose.yml @@ -37,14 +37,6 @@ services: - "21:21" - "30000-30099:30000-30099" - share: - image: alfresco/alfresco-share:6.0.a - environment: - - REPO_HOST=alfresco - - REPO_PORT=8080 - ports: - - 8080:8080 - postgres: image: library/postgres:10.1 environment: From 43b904f0ea4f1966fe5f96bd6b176388a7335c75 Mon Sep 17 00:00:00 2001 From: Roxana Lucanu-Ghetu Date: Thu, 21 Jun 2018 13:38:28 +0300 Subject: [PATCH 79/99] RM-6372 Code review changes --- rm-community/rm-community-repo/Dockerfile | 10 +++++++--- rm-community/rm-community-repo/docker-compose.yml | 6 ++---- rm-community/rm-community-repo/pom.xml | 1 + 3 files changed, 10 insertions(+), 7 deletions(-) diff --git a/rm-community/rm-community-repo/Dockerfile b/rm-community/rm-community-repo/Dockerfile index 0b60061ad4..18d450fa30 100644 --- a/rm-community/rm-community-repo/Dockerfile +++ b/rm-community/rm-community-repo/Dockerfile @@ -1,6 +1,10 @@ + + FROM alfresco/alfresco-content-repository-community:latest -COPY target/alfresco-rm-community-repo-*.amp /usr/local/tomcat/amps/ +ARG TOMCAT_DIR=/usr/local/tomcat -RUN java -jar /usr/local/tomcat/alfresco-mmt/alfresco-mmt*.jar install \ - /usr/local/tomcat/amps/alfresco-rm-community-repo-*.amp /usr/local/tomcat/webapps/alfresco -nobackup +COPY target/alfresco-rm-community-repo-*.amp $TOMCAT_DIR/amps/ + +RUN java -jar $TOMCAT_DIR/alfresco-mmt/alfresco-mmt*.jar install \ + $TOMCAT_DIR/amps/alfresco-rm-community-repo-*.amp $TOMCAT_DIR/webapps/alfresco -nobackup diff --git a/rm-community/rm-community-repo/docker-compose.yml b/rm-community/rm-community-repo/docker-compose.yml index dd25d6719d..05ab6bd24a 100644 --- a/rm-community/rm-community-repo/docker-compose.yml +++ b/rm-community/rm-community-repo/docker-compose.yml @@ -1,12 +1,10 @@ version: "3" -# The acs-community-deployment project contains the product version of docker-compose. -# -# This version is for testing and development use. For testing and debug we need to have a more open version. # For remote debug we need the CATALINA_OPTS and to expose port 8000. services: alfresco: + # acs repo community image with ags repo community amp applied image: alfresco/ags-repo-community:latest environment: CATALINA_OPTS : " @@ -30,7 +28,7 @@ services: -Dcifs.enabled=true " ports: - - 8082:8080 + - 8080:8080 - 8000:8000 - 445:445 - 143:143 diff --git a/rm-community/rm-community-repo/pom.xml b/rm-community/rm-community-repo/pom.xml index e5bc2ec355..72a24a28a9 100644 --- a/rm-community/rm-community-repo/pom.xml +++ b/rm-community/rm-community-repo/pom.xml @@ -656,6 +656,7 @@ + buildDockerImage From fd7a805930470f31564b79107109c1eea038d948 Mon Sep 17 00:00:00 2001 From: cagache Date: Thu, 21 Jun 2018 16:27:21 +0300 Subject: [PATCH 80/99] added verify execution phase to buildDockerImage profile and changed execution phase for master profile --- pom.xml | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 960c830995..aa548ce830 100644 --- a/pom.xml +++ b/pom.xml @@ -356,6 +356,13 @@ build + + build-image-verify + verify + + build + + @@ -431,7 +438,7 @@ build-push-image - install + deploy build push From 934710d77e837ffea37fddf8d4aad2418bf0ca3c Mon Sep 17 00:00:00 2001 From: cagache Date: Thu, 21 Jun 2018 17:04:25 +0300 Subject: [PATCH 81/99] changed execution phase to deploy for internal profile --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index aa548ce830..d104a7a8ea 100644 --- a/pom.xml +++ b/pom.xml @@ -394,7 +394,7 @@ build-push-image - install + deploy build push From 64c925421cbbe5953c3a553c8b98fc3a882451d6 Mon Sep 17 00:00:00 2001 From: Roxana Lucanu-Ghetu Date: Fri, 22 Jun 2018 12:36:01 +0300 Subject: [PATCH 82/99] RM-6372 removed ARG and updated tag for acs --- rm-community/rm-community-repo/Dockerfile | 12 ++++-------- 1 file changed, 4 insertions(+), 8 deletions(-) diff --git a/rm-community/rm-community-repo/Dockerfile b/rm-community/rm-community-repo/Dockerfile index 18d450fa30..1ffc5a1ecb 100644 --- a/rm-community/rm-community-repo/Dockerfile +++ b/rm-community/rm-community-repo/Dockerfile @@ -1,10 +1,6 @@ +FROM alfresco/alfresco-content-repository-community:6.0.7-ga +COPY target/alfresco-rm-community-repo-*.amp /usr/local/tomcat/amps/ -FROM alfresco/alfresco-content-repository-community:latest - -ARG TOMCAT_DIR=/usr/local/tomcat - -COPY target/alfresco-rm-community-repo-*.amp $TOMCAT_DIR/amps/ - -RUN java -jar $TOMCAT_DIR/alfresco-mmt/alfresco-mmt*.jar install \ - $TOMCAT_DIR/amps/alfresco-rm-community-repo-*.amp $TOMCAT_DIR/webapps/alfresco -nobackup +RUN java -jar /usr/local/tomcat/alfresco-mmt/alfresco-mmt*.jar install \ + /usr/local/tomcat/amps/alfresco-rm-community-repo-*.amp /usr/local/tomcat/webapps/alfresco -nobackup From 87cb73f1b464f042faa74a42bad8cd5858338374 Mon Sep 17 00:00:00 2001 From: Rodica Sutu Date: Fri, 22 Jun 2018 14:27:32 +0300 Subject: [PATCH 83/99] temporary fix for module.properties issue --- pom.xml | 152 ------------------------ rm-community/rm-community-repo/pom.xml | 153 +++++++++++++++++++++++++ 2 files changed, 153 insertions(+), 152 deletions(-) diff --git a/pom.xml b/pom.xml index 960c830995..5620947738 100644 --- a/pom.xml +++ b/pom.xml @@ -175,158 +175,6 @@ - - - enable-amp - - - src/main/amp/module.properties - - - - - - org.alfresco.maven.plugin - alfresco-maven-plugin - true - - - - maven-resources-plugin - - - add-module-properties-to-test-classpath - process-test-resources - - copy-resources - - - ${project.build.testOutputDirectory} - - - ${app.amp.folder} - - module.properties - - ${app.filtering.enabled} - alfresco/module/${project.artifactId} - - - - - - add-module-config-to-test-classpath - process-test-resources - - copy-resources - - - ${project.build.testOutputDirectory} - - - ${app.amp.folder}/config - - **/* - - ${app.filtering.enabled} - - - - - - - - - - - - - enable-properties-filtering - - - - src/main/properties - - - - - - org.codehaus.mojo - build-helper-maven-plugin - ${maven.buildhelper.version} - - - add-env-properties - generate-resources - - add-resource - - - - - ${app.properties.folder} - - ${app.properties.include} - - ${app.filtering.enabled} - - - - - - - - - - - enable-test-properties-filtering - - - - src/test/properties - - - - - - org.codehaus.mojo - build-helper-maven-plugin - ${maven.buildhelper.version} - - - add-env-test-properties - generate-resources - - add-test-resource - - - - - ${app.properties.test.folder} - - ${app.properties.test.include} - - ${app.filtering.enabled} - - - - - - - - - diff --git a/rm-community/rm-community-repo/pom.xml b/rm-community/rm-community-repo/pom.xml index 789d50bbcf..7ac23a239f 100644 --- a/rm-community/rm-community-repo/pom.xml +++ b/rm-community/rm-community-repo/pom.xml @@ -478,6 +478,159 @@ + + + + enable-amp + + + src/main/amp/module.properties + + + + + + org.alfresco.maven.plugin + alfresco-maven-plugin + true + + + + maven-resources-plugin + + + add-module-properties-to-test-classpath + process-test-resources + + copy-resources + + + ${project.build.testOutputDirectory} + + + ${app.amp.folder} + + module.properties + + ${app.filtering.enabled} + alfresco/module/${project.artifactId} + + + + + + add-module-config-to-test-classpath + process-test-resources + + copy-resources + + + ${project.build.testOutputDirectory} + + + ${app.amp.folder}/config + + **/* + + ${app.filtering.enabled} + + + + + + + + + + + + + enable-properties-filtering + + + + src/main/properties + + + + + + org.codehaus.mojo + build-helper-maven-plugin + ${maven.buildhelper.version} + + + add-env-properties + generate-resources + + add-resource + + + + + ${app.properties.folder} + + ${app.properties.include} + + ${app.filtering.enabled} + + + + + + + + + + + enable-test-properties-filtering + + + + src/test/properties + + + + + + org.codehaus.mojo + build-helper-maven-plugin + ${maven.buildhelper.version} + + + add-env-test-properties + generate-resources + + add-test-resource + + + + + ${app.properties.test.folder} + + ${app.properties.test.include} + + ${app.filtering.enabled} + + + + + + + + + use-mysql From c8cf33b2125999c0e636e9cc6ed57d5f37265cf1 Mon Sep 17 00:00:00 2001 From: Rodica Sutu Date: Mon, 25 Jun 2018 13:50:58 +0300 Subject: [PATCH 84/99] temporary solution --- pom.xml | 43 ++++ rm-community/rm-community-repo/pom.xml | 260 ++++++++++--------------- 2 files changed, 151 insertions(+), 152 deletions(-) diff --git a/pom.xml b/pom.xml index 44ea26ebbd..929abe753b 100644 --- a/pom.xml +++ b/pom.xml @@ -175,6 +175,49 @@ + + + enable-test-properties-filtering + + + + src/test/properties + + + + + + org.codehaus.mojo + build-helper-maven-plugin + ${maven.buildhelper.version} + + + add-env-test-properties + generate-resources + + add-test-resource + + + + + ${app.properties.test.folder} + + ${app.properties.test.include} + + ${app.filtering.enabled} + + + + + + + + + diff --git a/rm-community/rm-community-repo/pom.xml b/rm-community/rm-community-repo/pom.xml index 6cfcc3391c..86e755123f 100644 --- a/rm-community/rm-community-repo/pom.xml +++ b/rm-community/rm-community-repo/pom.xml @@ -481,158 +481,6 @@ - - - enable-amp - - - src/main/amp/module.properties - - - - - - org.alfresco.maven.plugin - alfresco-maven-plugin - true - - - - maven-resources-plugin - - - add-module-properties-to-test-classpath - process-test-resources - - copy-resources - - - ${project.build.testOutputDirectory} - - - ${app.amp.folder} - - module.properties - - ${app.filtering.enabled} - alfresco/module/${project.artifactId} - - - - - - add-module-config-to-test-classpath - process-test-resources - - copy-resources - - - ${project.build.testOutputDirectory} - - - ${app.amp.folder}/config - - **/* - - ${app.filtering.enabled} - - - - - - - - - - - - - enable-properties-filtering - - - - src/main/properties - - - - - - org.codehaus.mojo - build-helper-maven-plugin - ${maven.buildhelper.version} - - - add-env-properties - generate-resources - - add-resource - - - - - ${app.properties.folder} - - ${app.properties.include} - - ${app.filtering.enabled} - - - - - - - - - - - enable-test-properties-filtering - - - - src/test/properties - - - - - - org.codehaus.mojo - build-helper-maven-plugin - ${maven.buildhelper.version} - - - add-env-test-properties - generate-resources - - add-test-resource - - - - - ${app.properties.test.folder} - - ${app.properties.test.include} - - ${app.filtering.enabled} - - - - - - - - - use-mysql @@ -808,6 +656,114 @@ + + + + enable-amp + + + src/main/amp/module.properties + + + + + + org.alfresco.maven.plugin + alfresco-maven-plugin + true + + + + maven-resources-plugin + + + add-module-properties-to-test-classpath + process-test-resources + + copy-resources + + + ${project.build.testOutputDirectory} + + + ${app.amp.folder} + + module.properties + + ${app.filtering.enabled} + alfresco/module/${project.artifactId} + + + + + + add-module-config-to-test-classpath + process-test-resources + + copy-resources + + + ${project.build.testOutputDirectory} + + + ${app.amp.folder}/config + + **/* + + ${app.filtering.enabled} + + + + + + + + + + + enable-properties-filtering + + + + src/main/properties + + + + + + org.codehaus.mojo + build-helper-maven-plugin + ${maven.buildhelper.version} + + + add-env-properties + generate-resources + + add-resource + + + + + ${app.properties.folder} + + ${app.properties.include} + + ${app.filtering.enabled} + + + + + + + + From 10e2ed8f47d00a362453f2cf3c4e862452659209 Mon Sep 17 00:00:00 2001 From: Rodica Sutu Date: Mon, 25 Jun 2018 16:04:16 +0300 Subject: [PATCH 85/99] fix the values set into module properties --- pom.xml | 2 +- rm-community/rm-community-repo/pom.xml | 108 ------------------------- 2 files changed, 1 insertion(+), 109 deletions(-) diff --git a/pom.xml b/pom.xml index 929abe753b..b63e5cdbec 100644 --- a/pom.xml +++ b/pom.xml @@ -176,7 +176,7 @@ diff --git a/rm-community/rm-community-repo/pom.xml b/rm-community/rm-community-repo/pom.xml index 86e755123f..5623289ec5 100644 --- a/rm-community/rm-community-repo/pom.xml +++ b/rm-community/rm-community-repo/pom.xml @@ -656,114 +656,6 @@ - - - - enable-amp - - - src/main/amp/module.properties - - - - - - org.alfresco.maven.plugin - alfresco-maven-plugin - true - - - - maven-resources-plugin - - - add-module-properties-to-test-classpath - process-test-resources - - copy-resources - - - ${project.build.testOutputDirectory} - - - ${app.amp.folder} - - module.properties - - ${app.filtering.enabled} - alfresco/module/${project.artifactId} - - - - - - add-module-config-to-test-classpath - process-test-resources - - copy-resources - - - ${project.build.testOutputDirectory} - - - ${app.amp.folder}/config - - **/* - - ${app.filtering.enabled} - - - - - - - - - - - enable-properties-filtering - - - - src/main/properties - - - - - - org.codehaus.mojo - build-helper-maven-plugin - ${maven.buildhelper.version} - - - add-env-properties - generate-resources - - add-resource - - - - - ${app.properties.folder} - - ${app.properties.include} - - ${app.filtering.enabled} - - - - - - - - From 2c01205d075aa290c305651bfe311320d668880b Mon Sep 17 00:00:00 2001 From: Rodica Sutu Date: Thu, 28 Jun 2018 09:44:19 +0300 Subject: [PATCH 86/99] Update ACS dependencies with the versions from 6.0 GA release --- pom.xml | 3 ++- rm-community/pom.xml | 4 ++-- rm-community/rm-community-repo/pom.xml | 7 +++---- rm-community/rm-community-rest-api-explorer/pom.xml | 3 +-- 4 files changed, 8 insertions(+), 9 deletions(-) diff --git a/pom.xml b/pom.xml index b63e5cdbec..dee94f9c8f 100644 --- a/pom.xml +++ b/pom.xml @@ -398,7 +398,8 @@ alfresco org.alfresco share - 6.17 + 6.19 + 6.0.7-ga 0.0 diff --git a/rm-community/pom.xml b/rm-community/pom.xml index e2f32d72f3..d20b147c15 100644 --- a/rm-community/pom.xml +++ b/rm-community/pom.xml @@ -76,8 +76,8 @@ 2.9.5 5.0.4.RELEASE - 6.0.5-ea - 6.0.0-rc5 + 6.0.7-ga + 6.0.b true diff --git a/rm-community/rm-community-repo/pom.xml b/rm-community/rm-community-repo/pom.xml index 5623289ec5..7c7b7ddfb5 100644 --- a/rm-community/rm-community-repo/pom.xml +++ b/rm-community/rm-community-repo/pom.xml @@ -27,11 +27,10 @@ true - 6.0.4-ea 7.3 - 6.51 - 6.35 - 6.0.0-rc5 + 6.55 + 6.38 + 6.0.b alfresco/ags-repo-community diff --git a/rm-community/rm-community-rest-api-explorer/pom.xml b/rm-community/rm-community-rest-api-explorer/pom.xml index 13839c52c2..3dad123d3c 100644 --- a/rm-community/rm-community-rest-api-explorer/pom.xml +++ b/rm-community/rm-community-rest-api-explorer/pom.xml @@ -11,7 +11,6 @@ - 6.0.4-ea 1.8 1.8 UTF-8 @@ -70,7 +69,7 @@ org.alfresco api-explorer - ${alfresco.api.explorer.version} + ${api.explorer.version} war From 34ddaf0b3b58fbdce9dbf112da58b5ad456a1f23 Mon Sep 17 00:00:00 2001 From: cagache Date: Thu, 28 Jun 2018 14:21:22 +0300 Subject: [PATCH 87/99] created scripts used to start/stop alfresco --- scripts/cleanImages.sh | 14 ++++++++++++++ scripts/startAlfresco.sh | 31 +++++++++++++++++++++++++++++++ scripts/stopDockerContainers.sh | 7 +++++++ 3 files changed, 52 insertions(+) create mode 100644 scripts/cleanImages.sh create mode 100644 scripts/startAlfresco.sh create mode 100644 scripts/stopDockerContainers.sh diff --git a/scripts/cleanImages.sh b/scripts/cleanImages.sh new file mode 100644 index 0000000000..0445fa2de6 --- /dev/null +++ b/scripts/cleanImages.sh @@ -0,0 +1,14 @@ +#!/bin/bash + +imagesToBeDeleted=$1 +echo $imagesToBeDeleted +echo "List all images:" +docker images -a + +docker_images_list=$(docker images | grep $imagesToBeDeleted | awk '{print $3}' | uniq) +if [ "$docker_images_list" == "" ]; then + echo "No docker images on the agent" +else + echo "Clearing images: $docker_images_list" + docker rmi -f $docker_images_list +fi \ No newline at end of file diff --git a/scripts/startAlfresco.sh b/scripts/startAlfresco.sh new file mode 100644 index 0000000000..f3ed3d2008 --- /dev/null +++ b/scripts/startAlfresco.sh @@ -0,0 +1,31 @@ +#!/bin/bash +set -e # exit if commands fails +set -x # trace what gets exe + +docker info +docker-compose --version +echo "Starting Alfresco with AGS amps applied in Docker container" +docker-compose ps +docker-compose up -d + +WAIT_INTERVAL=1 +COUNTER=0 +TIMEOUT=300 +t0=`date +%s` + +echo "Waiting for alfresco to start" +until $(curl --output /dev/null --silent --head --fail http://localhost:8080/alfresco) || [ "$COUNTER" -eq "$TIMEOUT" ]; do + printf '.' + sleep $WAIT_INTERVAL + COUNTER=$(($COUNTER+$WAIT_INTERVAL)) +done + +if (("$COUNTER" < "$TIMEOUT")) ; then + t1=`date +%s` + delta=$((($t1 - $t0)/60)) + echo "Alfresco Started in $delta minutes" +else + echo "Waited $COUNTER seconds" + echo "Alfresco Could not start in time." + exit 1 +fi \ No newline at end of file diff --git a/scripts/stopDockerContainers.sh b/scripts/stopDockerContainers.sh new file mode 100644 index 0000000000..bbdaacc341 --- /dev/null +++ b/scripts/stopDockerContainers.sh @@ -0,0 +1,7 @@ +#!/bin/bash +set -e # exit if commands fails +set -x # trace what gets exe + +docker-compose ps +docker-compose kill +docker-compose rm -fv \ No newline at end of file From 4196c899c55d302c08b2c296a05e395d69773ad7 Mon Sep 17 00:00:00 2001 From: cagache Date: Thu, 28 Jun 2018 14:44:19 +0300 Subject: [PATCH 88/99] updated variable --- scripts/cleanImages.sh | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/scripts/cleanImages.sh b/scripts/cleanImages.sh index 0445fa2de6..ecda5a8f29 100644 --- a/scripts/cleanImages.sh +++ b/scripts/cleanImages.sh @@ -1,11 +1,10 @@ #!/bin/bash -imagesToBeDeleted=$1 -echo $imagesToBeDeleted +echo $IMAGES_TO_BE_DELETED echo "List all images:" docker images -a -docker_images_list=$(docker images | grep $imagesToBeDeleted | awk '{print $3}' | uniq) +docker_images_list=$(docker images | grep $IMAGES_TO_BE_DELETED | awk '{print $3}' | uniq) if [ "$docker_images_list" == "" ]; then echo "No docker images on the agent" else From 85d1c7480707d6053d6dd96c799d8a6e1018d38c Mon Sep 17 00:00:00 2001 From: cagache Date: Thu, 28 Jun 2018 15:10:11 +0300 Subject: [PATCH 89/99] moved sh files to root --- scripts/cleanImages.sh => cleanImages.sh | 0 scripts/startAlfresco.sh => startAlfresco.sh | 0 scripts/stopDockerContainers.sh => stopDockerContainers.sh | 0 3 files changed, 0 insertions(+), 0 deletions(-) rename scripts/cleanImages.sh => cleanImages.sh (100%) rename scripts/startAlfresco.sh => startAlfresco.sh (100%) rename scripts/stopDockerContainers.sh => stopDockerContainers.sh (100%) diff --git a/scripts/cleanImages.sh b/cleanImages.sh similarity index 100% rename from scripts/cleanImages.sh rename to cleanImages.sh diff --git a/scripts/startAlfresco.sh b/startAlfresco.sh similarity index 100% rename from scripts/startAlfresco.sh rename to startAlfresco.sh diff --git a/scripts/stopDockerContainers.sh b/stopDockerContainers.sh similarity index 100% rename from scripts/stopDockerContainers.sh rename to stopDockerContainers.sh From 1de7f363857d7fa74b7244c83c4c216c150e9f8f Mon Sep 17 00:00:00 2001 From: cagache Date: Thu, 28 Jun 2018 15:15:11 +0300 Subject: [PATCH 90/99] created scripts used to start/stop alfresco --- cleanImages.sh | 2 +- startAlfresco.sh | 2 +- stopDockerContainers.sh | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/cleanImages.sh b/cleanImages.sh index ecda5a8f29..32121dada9 100644 --- a/cleanImages.sh +++ b/cleanImages.sh @@ -1,4 +1,4 @@ -#!/bin/bash +#!/usr/bin/env bash echo $IMAGES_TO_BE_DELETED echo "List all images:" diff --git a/startAlfresco.sh b/startAlfresco.sh index f3ed3d2008..85dc63a9ff 100644 --- a/startAlfresco.sh +++ b/startAlfresco.sh @@ -1,4 +1,4 @@ -#!/bin/bash +#!/usr/bin/env bash set -e # exit if commands fails set -x # trace what gets exe diff --git a/stopDockerContainers.sh b/stopDockerContainers.sh index bbdaacc341..bc5b56b2ff 100644 --- a/stopDockerContainers.sh +++ b/stopDockerContainers.sh @@ -1,4 +1,4 @@ -#!/bin/bash +#!/usr/bin/env bash set -e # exit if commands fails set -x # trace what gets exe From 96687efe003744e7686f7e8b22227273adfab135 Mon Sep 17 00:00:00 2001 From: cagache Date: Thu, 28 Jun 2018 15:53:00 +0300 Subject: [PATCH 91/99] try to fix script to clean given docker images --- cleanImages.sh | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/cleanImages.sh b/cleanImages.sh index 32121dada9..6b814fefdd 100644 --- a/cleanImages.sh +++ b/cleanImages.sh @@ -1,10 +1,11 @@ -#!/usr/bin/env bash +#!/bin/bash +set -x echo $IMAGES_TO_BE_DELETED echo "List all images:" docker images -a -docker_images_list=$(docker images | grep $IMAGES_TO_BE_DELETED | awk '{print $3}' | uniq) +docker_images_list=$(docker images | grep '$IMAGES_TO_BE_DELETED' | awk '{print $3}' | uniq) if [ "$docker_images_list" == "" ]; then echo "No docker images on the agent" else From be7801767f8f97cd31b482ae562574f8c0b43f5b Mon Sep 17 00:00:00 2001 From: cagache Date: Thu, 28 Jun 2018 16:05:46 +0300 Subject: [PATCH 92/99] try to fix script to clean given docker images --- cleanImages.sh | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/cleanImages.sh b/cleanImages.sh index 6b814fefdd..a5d6ae663b 100644 --- a/cleanImages.sh +++ b/cleanImages.sh @@ -1,11 +1,12 @@ #!/bin/bash set -x -echo $IMAGES_TO_BE_DELETED +imagesToBeDeleted=$1 +echo $imagesToBeDeleted echo "List all images:" docker images -a -docker_images_list=$(docker images | grep '$IMAGES_TO_BE_DELETED' | awk '{print $3}' | uniq) +docker_images_list=$(docker images | grep '$imagesToBeDeleted' | awk '{print $3}' | uniq) if [ "$docker_images_list" == "" ]; then echo "No docker images on the agent" else From 1da97ca0663dd91be8b3cf2f9635e598f71c9bc4 Mon Sep 17 00:00:00 2001 From: cagache Date: Thu, 28 Jun 2018 16:12:06 +0300 Subject: [PATCH 93/99] try to fix script to clean given docker images --- cleanImages.sh | 1 - 1 file changed, 1 deletion(-) diff --git a/cleanImages.sh b/cleanImages.sh index a5d6ae663b..248caa2054 100644 --- a/cleanImages.sh +++ b/cleanImages.sh @@ -1,7 +1,6 @@ #!/bin/bash set -x -imagesToBeDeleted=$1 echo $imagesToBeDeleted echo "List all images:" docker images -a From f787cba51a1944d6af28a9860a9718cfe14820f2 Mon Sep 17 00:00:00 2001 From: cagache Date: Thu, 28 Jun 2018 16:22:22 +0300 Subject: [PATCH 94/99] try to fix script to clean given docker images --- cleanImages.sh | 10 ---------- 1 file changed, 10 deletions(-) diff --git a/cleanImages.sh b/cleanImages.sh index 248caa2054..9775170cc9 100644 --- a/cleanImages.sh +++ b/cleanImages.sh @@ -2,13 +2,3 @@ set -x echo $imagesToBeDeleted -echo "List all images:" -docker images -a - -docker_images_list=$(docker images | grep '$imagesToBeDeleted' | awk '{print $3}' | uniq) -if [ "$docker_images_list" == "" ]; then - echo "No docker images on the agent" -else - echo "Clearing images: $docker_images_list" - docker rmi -f $docker_images_list -fi \ No newline at end of file From 4efbeb5b9fc261ba95c3a407684bec2beb6e9336 Mon Sep 17 00:00:00 2001 From: cagache Date: Thu, 28 Jun 2018 16:24:46 +0300 Subject: [PATCH 95/99] try to fix script to clean given docker images --- cleanImages.sh | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/cleanImages.sh b/cleanImages.sh index 9775170cc9..d759434a49 100644 --- a/cleanImages.sh +++ b/cleanImages.sh @@ -1,4 +1,14 @@ #!/bin/bash set -x -echo $imagesToBeDeleted +imagesToBeDeleted="alfresco-content-repository\|ags-repo-enterprise\|ags-share-enterprise\|alfresco-share" +echo "List all images:" +docker images -a + +docker_images_list=$(docker images | grep '$imagesToBeDeleted' | awk '{print $3}' | uniq) +if [ "$docker_images_list" == "" ]; then + echo "No docker images on the agent" +else + echo "Clearing images: $docker_images_list" + docker rmi -f $docker_images_list +fi From 20b48ef61b38d6ba6e87a25809363b162eedf942 Mon Sep 17 00:00:00 2001 From: cagache Date: Thu, 28 Jun 2018 16:39:53 +0300 Subject: [PATCH 96/99] try to fix script to clean given docker images --- cleanImages.sh | 1 - 1 file changed, 1 deletion(-) diff --git a/cleanImages.sh b/cleanImages.sh index d759434a49..7d05ccbdd4 100644 --- a/cleanImages.sh +++ b/cleanImages.sh @@ -1,7 +1,6 @@ #!/bin/bash set -x -imagesToBeDeleted="alfresco-content-repository\|ags-repo-enterprise\|ags-share-enterprise\|alfresco-share" echo "List all images:" docker images -a From 4d9a51daca8800d8c38cee44f35f0a5c07ab758e Mon Sep 17 00:00:00 2001 From: cagache Date: Thu, 28 Jun 2018 16:42:13 +0300 Subject: [PATCH 97/99] try to fix script to clean given docker images --- cleanImages.sh | 1 + 1 file changed, 1 insertion(+) diff --git a/cleanImages.sh b/cleanImages.sh index 7d05ccbdd4..e1d627b518 100644 --- a/cleanImages.sh +++ b/cleanImages.sh @@ -1,6 +1,7 @@ #!/bin/bash set -x +echo $imagesToBeDeleted echo "List all images:" docker images -a From 5de20477ee70cd0281c75e44028742ff93ff3b61 Mon Sep 17 00:00:00 2001 From: cagache Date: Thu, 28 Jun 2018 16:47:02 +0300 Subject: [PATCH 98/99] moved scripts to specific directory --- cleanImages.sh => scripts/cleanImages.sh | 0 startAlfresco.sh => scripts/startAlfresco.sh | 0 stopDockerContainers.sh => scripts/stopDockerContainers.sh | 0 3 files changed, 0 insertions(+), 0 deletions(-) rename cleanImages.sh => scripts/cleanImages.sh (100%) rename startAlfresco.sh => scripts/startAlfresco.sh (100%) rename stopDockerContainers.sh => scripts/stopDockerContainers.sh (100%) diff --git a/cleanImages.sh b/scripts/cleanImages.sh similarity index 100% rename from cleanImages.sh rename to scripts/cleanImages.sh diff --git a/startAlfresco.sh b/scripts/startAlfresco.sh similarity index 100% rename from startAlfresco.sh rename to scripts/startAlfresco.sh diff --git a/stopDockerContainers.sh b/scripts/stopDockerContainers.sh similarity index 100% rename from stopDockerContainers.sh rename to scripts/stopDockerContainers.sh From 309a91edeaca8e370670766ee4bb015fe0693402 Mon Sep 17 00:00:00 2001 From: cagache Date: Thu, 28 Jun 2018 17:22:45 +0300 Subject: [PATCH 99/99] try to fix script to clean given docker images --- scripts/cleanImages.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scripts/cleanImages.sh b/scripts/cleanImages.sh index e1d627b518..874723aa6f 100644 --- a/scripts/cleanImages.sh +++ b/scripts/cleanImages.sh @@ -5,7 +5,7 @@ echo $imagesToBeDeleted echo "List all images:" docker images -a -docker_images_list=$(docker images | grep '$imagesToBeDeleted' | awk '{print $3}' | uniq) +docker_images_list=$(docker images | grep $imagesToBeDeleted | awk '{print $3}' | uniq) if [ "$docker_images_list" == "" ]; then echo "No docker images on the agent" else