diff --git a/.gitignore b/.gitignore index 742552f864..c74856f017 100644 --- a/.gitignore +++ b/.gitignore @@ -34,4 +34,7 @@ target # virtual machine crash logs, see http://www.java.com/en/download/help/error_hotspot.xml -hs_err_pid* \ No newline at end of file +hs_err_pid* + +# Alfresco runtime +alf_data diff --git a/README.md b/README.md index 948bd85c85..f8fc5a83a7 100644 --- a/README.md +++ b/README.md @@ -128,7 +128,7 @@ cd acs-community-packaging mvn clean install -PcommunityDocker -Dmaven.javadoc.skip=true cd .. ~~~ -In Itellij IDEA, create a new project using the `work` directory as the source. +In Intellij IDEA, create a new project using the `work` directory as the source. * File > New Project from Existing Sources > .../work > Maven ## Docker diff --git a/core/pom.xml b/core/pom.xml index ffaf951568..fa562c9145 100644 --- a/core/pom.xml +++ b/core/pom.xml @@ -7,7 +7,7 @@ org.alfresco alfresco-community-repo - 8.319-SNAPSHOT + 8.328-SNAPSHOT diff --git a/data-model/pom.xml b/data-model/pom.xml index 49f2cf21a2..7b0d4eee46 100644 --- a/data-model/pom.xml +++ b/data-model/pom.xml @@ -7,7 +7,7 @@ org.alfresco alfresco-community-repo - 8.319-SNAPSHOT + 8.328-SNAPSHOT @@ -188,7 +188,12 @@ org.codehaus.woodstox woodstox-core-asl - + + + org.apache.geronimo.specs + geronimo-jta_1.1_spec + + org.apache.chemistry.opencmis diff --git a/packaging/distribution/pom.xml b/packaging/distribution/pom.xml index 23154f10c4..bade496ac5 100644 --- a/packaging/distribution/pom.xml +++ b/packaging/distribution/pom.xml @@ -9,6 +9,6 @@ org.alfresco alfresco-community-repo-packaging - 8.319-SNAPSHOT + 8.328-SNAPSHOT diff --git a/packaging/docker-alfresco/pom.xml b/packaging/docker-alfresco/pom.xml index ce069b88d4..88bf0c8951 100644 --- a/packaging/docker-alfresco/pom.xml +++ b/packaging/docker-alfresco/pom.xml @@ -7,7 +7,7 @@ org.alfresco alfresco-community-repo-packaging - 8.319-SNAPSHOT + 8.328-SNAPSHOT diff --git a/packaging/pom.xml b/packaging/pom.xml index 081ccf21ef..84080f3db7 100644 --- a/packaging/pom.xml +++ b/packaging/pom.xml @@ -7,7 +7,7 @@ org.alfresco alfresco-community-repo - 8.319-SNAPSHOT + 8.328-SNAPSHOT diff --git a/packaging/tests/pom.xml b/packaging/tests/pom.xml index d74d9074c3..57d6bbf3d2 100644 --- a/packaging/tests/pom.xml +++ b/packaging/tests/pom.xml @@ -6,7 +6,7 @@ org.alfresco alfresco-community-repo-packaging - 8.319-SNAPSHOT + 8.328-SNAPSHOT diff --git a/packaging/tests/tas-cmis/pom.xml b/packaging/tests/tas-cmis/pom.xml index c2455135e6..a254828fff 100644 --- a/packaging/tests/tas-cmis/pom.xml +++ b/packaging/tests/tas-cmis/pom.xml @@ -9,7 +9,7 @@ org.alfresco alfresco-community-repo-tests - 8.319-SNAPSHOT + 8.328-SNAPSHOT diff --git a/packaging/tests/tas-email/pom.xml b/packaging/tests/tas-email/pom.xml index cdb81ad06c..eaf122bed2 100644 --- a/packaging/tests/tas-email/pom.xml +++ b/packaging/tests/tas-email/pom.xml @@ -9,7 +9,7 @@ org.alfresco alfresco-community-repo-tests - 8.319-SNAPSHOT + 8.328-SNAPSHOT diff --git a/packaging/tests/tas-integration/pom.xml b/packaging/tests/tas-integration/pom.xml index d89db7b01e..8c2b357c58 100644 --- a/packaging/tests/tas-integration/pom.xml +++ b/packaging/tests/tas-integration/pom.xml @@ -9,7 +9,7 @@ org.alfresco alfresco-community-repo-tests - 8.319-SNAPSHOT + 8.328-SNAPSHOT diff --git a/packaging/tests/tas-restapi/pom.xml b/packaging/tests/tas-restapi/pom.xml index 6d753d6ade..2bb209306c 100644 --- a/packaging/tests/tas-restapi/pom.xml +++ b/packaging/tests/tas-restapi/pom.xml @@ -9,7 +9,7 @@ org.alfresco alfresco-community-repo-tests - 8.319-SNAPSHOT + 8.328-SNAPSHOT diff --git a/packaging/tests/tas-webdav/pom.xml b/packaging/tests/tas-webdav/pom.xml index 9573aafc4f..efe2b0248c 100644 --- a/packaging/tests/tas-webdav/pom.xml +++ b/packaging/tests/tas-webdav/pom.xml @@ -9,7 +9,7 @@ org.alfresco alfresco-community-repo-tests - 8.319-SNAPSHOT + 8.328-SNAPSHOT diff --git a/packaging/war/pom.xml b/packaging/war/pom.xml index 8486a91198..fb60089450 100644 --- a/packaging/war/pom.xml +++ b/packaging/war/pom.xml @@ -7,7 +7,7 @@ org.alfresco alfresco-community-repo-packaging - 8.319-SNAPSHOT + 8.328-SNAPSHOT @@ -60,7 +60,7 @@ org.glassfish.jaxb jaxb-runtime - 2.3.2 + 2.3.3 javax.xml.soap diff --git a/pom.xml b/pom.xml index 273c3d97db..60ffccef4e 100644 --- a/pom.xml +++ b/pom.xml @@ -2,7 +2,7 @@ 4.0.0 alfresco-community-repo - 8.319-SNAPSHOT + 8.328-SNAPSHOT pom Alfresco Community Repo Parent @@ -53,13 +53,13 @@ 5.23.0 1.0.2.11 6.2 - 0.0.8 + 0.0.10 5.2.9.RELEASE 3.5.2 2.11.3 2.11.2 - 3.4.0 + 3.4.1 1.0.0 2.0.21 8.14 @@ -70,7 +70,7 @@ 28.2-jre 2.8.0 2.8.6 - 4.5.12 + 4.5.13 4.4.13 3.1-HTTPCLIENT-1265 2.12.0-alfresco-patched-20191004 @@ -98,11 +98,11 @@ 8.0.22 2.7.0 - 3.0.35 + 3.0.37 3.3.0 1.1.4 1.48 - 1.19 + 1.21 1.8 1.6 1.5 @@ -148,6 +148,13 @@ xalan xalan 2.7.2-alfresco + + + + xml-apis + xml-apis + + org.alfresco.services @@ -490,6 +497,13 @@ xerces xercesImpl ${dependency.xercesImpl.version} + + + + xml-apis + xml-apis + + @@ -697,4 +711,3 @@ - diff --git a/remote-api/pom.xml b/remote-api/pom.xml index 25646bc41b..a18460c3af 100644 --- a/remote-api/pom.xml +++ b/remote-api/pom.xml @@ -7,7 +7,7 @@ org.alfresco alfresco-community-repo - 8.319-SNAPSHOT + 8.328-SNAPSHOT diff --git a/remote-api/src/main/java/org/alfresco/rest/api/impl/NodesImpl.java b/remote-api/src/main/java/org/alfresco/rest/api/impl/NodesImpl.java index 6604b6cc73..58e7d593bf 100644 --- a/remote-api/src/main/java/org/alfresco/rest/api/impl/NodesImpl.java +++ b/remote-api/src/main/java/org/alfresco/rest/api/impl/NodesImpl.java @@ -2348,6 +2348,11 @@ public class NodesImpl implements Nodes private void handleNodeRename(Map props, NodeRef nodeRef) { Serializable nameProp = props.get(ContentModel.PROP_NAME); + handleNodeRename(nameProp, nodeRef); + } + + private void handleNodeRename(Serializable nameProp, NodeRef nodeRef) + { if ((nameProp != null)) { String currentName = (String) nodeService.getProperty(nodeRef, ContentModel.PROP_NAME); @@ -2722,6 +2727,7 @@ public class NodesImpl implements Nodes String fileName = parameters.getParameter(PARAM_NAME); if (fileName != null) { + handleNodeRename(fileName, nodeRef); // optionally rename, before updating the content nodeService.setProperty(nodeRef, ContentModel.PROP_NAME, fileName); } diff --git a/remote-api/src/main/resources/alfresco/messages/custommodel-restapi-messages_ja.properties b/remote-api/src/main/resources/alfresco/messages/custommodel-restapi-messages_ja.properties index 2c16716f2b..aa470fefee 100644 --- a/remote-api/src/main/resources/alfresco/messages/custommodel-restapi-messages_ja.properties +++ b/remote-api/src/main/resources/alfresco/messages/custommodel-restapi-messages_ja.properties @@ -54,9 +54,9 @@ cmm.rest_api.property_change_mandatory_enforced_opt_err=\u6709\u52b9\u5316\u3055 cmm.rest_api.property_change_multi_valued_opt_err=\u6709\u52b9\u5316\u3055\u308c\u3066\u3044\u308b\u30e2\u30c7\u30eb\u306e\u30d7\u30ed\u30d1\u30c6\u30a3\u306e\u8907\u6570\u5024\u30aa\u30d7\u30b7\u30e7\u30f3\u306f\u5909\u66f4\u3067\u304d\u307e\u305b\u3093\u3002 # validation cmm.rest_api.input_validation_err=''{0}'' \u306f\u6709\u52b9\u306a\u5024\u3067\u306f\u3042\u308a\u307e\u305b\u3093\u3002 \u6570\u5b57\u3001\u82f1\u5b57\u3001\u30cf\u30a4\u30d5\u30f3 (-)\u3001\u30a2\u30f3\u30c0\u30fc\u30b9\u30b3\u30a2 (_) \u3060\u3051\u3092\u4f7f\u7528\u3057\u3066\u304f\u3060\u3055\u3044\u3002 -cmm.rest_api.prefix_not_registered=URI ''{0}'' \u7528\u306b\u767b\u9332\u3055\u308c\u3066\u3044\u308b\u540d\u524d\u7a7a\u9593\u30d7\u30ec\u30d5\u30a3\u30c3\u30af\u30b9\u304c\u3042\u308a\u307e\u305b\u3093\u3002 \u30e2\u30c7\u30eb\u304c\u6709\u52b9\u5316\u3055\u308c\u3066\u3044\u308b\u3053\u3068\u3092\u78ba\u8a8d\u3057\u3066\u304f\u3060\u3055\u3044. +cmm.rest_api.prefix_not_registered=URI ''{0}'' \u7528\u306b\u767b\u9332\u3055\u308c\u3066\u3044\u308b\u540d\u524d\u7a7a\u9593\u30d7\u30ec\u30d5\u30a3\u30c3\u30af\u30b9\u304c\u3042\u308a\u307e\u305b\u3093\u3002 \u30e2\u30c7\u30eb\u304c\u6709\u52b9\u5316\u3055\u308c\u3066\u3044\u308b\u3053\u3068\u3092\u78ba\u8a8d\u3057\u3066\u304f\u3060\u3055\u3044\u3002 cmm.rest_api.prefixed_qname_invalid=''{0}'' \u306f\u6709\u52b9\u306a\u30d7\u30ec\u30d5\u30a3\u30c3\u30af\u30b9\u4ed8\u304d QName \u5024\u3067\u306f\u3042\u308a\u307e\u305b\u3093\u3002 {1} -cmm.rest_api.circular_dependency_err=\u5faa\u74b0\u4f9d\u5b58\u304c\u691c\u51fa\u3055\u308c\u307e\u3057\u305f\u3002 ''{0}'' \u306f\u3059\u3067\u306b ''{1}'' \u306b\u4f9d\u5b58\u3059\u308b\u30e2\u30c7\u30eb\u3067\u3042\u308b\u305f\u3081\u3001\u89aa\u3092\u8a2d\u5b9a\u3067\u304d\u307e\u305b\u3093. +cmm.rest_api.circular_dependency_err=\u5faa\u74b0\u4f9d\u5b58\u304c\u691c\u51fa\u3055\u308c\u307e\u3057\u305f\u3002 ''{0}'' \u306f\u3059\u3067\u306b ''{1}'' \u306b\u4f9d\u5b58\u3059\u308b\u30e2\u30c7\u30eb\u3067\u3042\u308b\u305f\u3081\u3001\u89aa\u3092\u8a2d\u5b9a\u3067\u304d\u307e\u305b\u3093\u3002 cmm.rest_api.prefixed_qname_invalid_format=''{0}'' \u306f\u6709\u52b9\u306a\u30d7\u30ec\u30d5\u30a3\u30c3\u30af\u30b9\u4ed8\u304d QName \u5f62\u5f0f\u3067\u306f\u3042\u308a\u307e\u305b\u3093\u3002 \u6709\u52b9\u306a\u5f62\u5f0f\u306f\u3001\u540d\u524d\u7a7a\u9593\u30d7\u30ec\u30d5\u30a3\u30c3\u30af\u30b9\u3001\u30b3\u30ed\u30f3 (:)\u3001\u540d\u524d\u306e\u7d44\u307f\u5408\u308f\u305b\u3067\u3059\u3002\u4f8b: cm:content\u3002 # model import cmm.rest_api.model.import_namespace_multiple_found=\u30ab\u30b9\u30bf\u30e0\u30e2\u30c7\u30eb\u306b\u5b9a\u7fa9\u3067\u304d\u308b\u540d\u524d\u7a7a\u9593\u306f 1 \u3064\u3060\u3051\u3067\u3059\u304c\u3001 ''{0}'' \u500b\u898b\u3064\u304b\u308a\u307e\u3057\u305f\u3002 diff --git a/remote-api/src/main/resources/alfresco/templates/webscripts/org/alfresco/repository/admin/support-tools/admin-nodebrowser.get_zh_CN.properties b/remote-api/src/main/resources/alfresco/templates/webscripts/org/alfresco/repository/admin/support-tools/admin-nodebrowser.get_zh_CN.properties index db1bf60533..9b7d01196d 100644 --- a/remote-api/src/main/resources/alfresco/templates/webscripts/org/alfresco/repository/admin/support-tools/admin-nodebrowser.get_zh_CN.properties +++ b/remote-api/src/main/resources/alfresco/templates/webscripts/org/alfresco/repository/admin/support-tools/admin-nodebrowser.get_zh_CN.properties @@ -55,7 +55,7 @@ nodebrowser.delete-permissions=\u6062\u590d\u6743\u9650 nodebrowser.delete-permissions.tip=\u5220\u9664\u6240\u6709\u5feb\u901f\u6307\u6d3e\u5f97\u5230\u6b64\u8282\u70b9\u7684\u6743\u9650\u5e76\u8fd8\u539f\u6743\u9650\u7ee7\u627f\u3002 nodebrowser.unlock=\u89e3\u9501 nodebrowser.unlock.tip=\u5220\u9664\u6b64\u8282\u70b9\u4fdd\u7559\u7684\u4efb\u4f55\u9501\u3002\u53d6\u6d88\u4efb\u4f55\u76f8\u5173\u8054\u5de5\u4f5c\u526f\u672c\u7684\u68c0\u51fa\uff0c\u5de5\u4f5c\u526f\u672c\u88ab\u5220\u9664\u3002\u8bf7\u6ce8\u610f\uff0c\u5bf9\u5de5\u4f5c\u526f\u672c\u6240\u505a\u7684\u5168\u90e8\u4fee\u6539\u5c06\u4e22\u5931\u3002 -nodebrowser.confirm=\u786e\u5b9a\u5417\uff1f? +nodebrowser.confirm=\u786e\u5b9a\u5417\uff1f nodebrowser.message.delete=\u5df2\u6210\u529f\u5220\u9664\u8282\u70b9\u3002 nodebrowser.message.restore=\u5df2\u6210\u529f\u8fd8\u539f\u8282\u70b9\u3002 nodebrowser.message.take-ownership=\u5df2\u6210\u529f\u83b7\u53d6\u6240\u6709\u6743\u3002 diff --git a/remote-api/src/test/java/org/alfresco/rest/api/tests/NodeApiTest.java b/remote-api/src/test/java/org/alfresco/rest/api/tests/NodeApiTest.java index 74d70932cb..b7d46a9047 100644 --- a/remote-api/src/test/java/org/alfresco/rest/api/tests/NodeApiTest.java +++ b/remote-api/src/test/java/org/alfresco/rest/api/tests/NodeApiTest.java @@ -5714,6 +5714,55 @@ public class NodeApiTest extends AbstractSingleNetworkSiteTest assertTrue(currentPath.equals(expectedPath)); } + @Test + public void testPrimaryPathVersion() throws Exception + { + setRequestContext(user1); + AuthenticationUtil.setFullyAuthenticatedUser(user1); + String myNodeId = getMyNodeId(); + + // /Company Home/User Homes/user/folder_A + String folderName = "folder_A"; + Folder folder = createFolder(myNodeId, folderName); + NodeRef folderNodeRef = new NodeRef(StoreRef.STORE_REF_WORKSPACE_SPACESSTORE, folder.getId()); + + // /Company Home/User Homes/user/folder_A/testDoc + String docName = "testDoc" + GUID.generate(); + Document doc = new Document(); + doc.setName(docName); + doc.setNodeType(TYPE_CM_CONTENT); + HttpResponse response = post(getNodeChildrenUrl(folderNodeRef.getId()), toJsonAsStringNonNull(doc), 201); + Document docResp = RestApiUtil.parseRestApiEntry(response.getJsonResponse(), Document.class); + NodeRef docNodeRef = new NodeRef(StoreRef.STORE_REF_WORKSPACE_SPACESSTORE, docResp.getId()); + + // Checks that current path and name match + String expectedPath1 = "/Company Home/User Homes/" + user1 + "/" + folderName + "/" + docName; + Path docPath1 = nodeService.getPath(docNodeRef); + Path.ChildAssocElement docPathLast1 = (Path.ChildAssocElement) docPath1.last(); + String docLocalName1 = docPathLast1.getRef().getQName().getLocalName(); + String currentPath1 = docPath1.toDisplayPath(nodeService, permissionService) + "/" + docLocalName1; + assertTrue(docName.equals(docLocalName1)); + assertTrue(expectedPath1.equals(currentPath1)); + + // Upload document new content supplying a different name + String docName2 = "testDoc2" + GUID.generate(); + Map params = new HashMap<>(); + params.put("name", docName2); + Document docResp2 = updateTextFileWithRandomContent(docNodeRef.getId(), 1024L, params); + NodeRef docNodeRef2 = new NodeRef(StoreRef.STORE_REF_WORKSPACE_SPACESSTORE, docResp2.getId()); + + // Checks new path and name after new version upload + String expectedPath2 = "/Company Home/User Homes/" + user1 + "/" + folderName + "/" + docName2; + Path docPath2 = nodeService.getPath(docNodeRef2); + Path.ChildAssocElement docPathLast2 = (Path.ChildAssocElement) docPath2.last(); + String docLocalName2 = docPathLast2.getRef().getQName().getLocalName(); + String currentPath2 = docPath2.toDisplayPath(nodeService, permissionService) + "/" + docLocalName2; + assertFalse(docLocalName1.equals(docLocalName2)); + assertTrue(docName2.equals(docLocalName2)); + assertFalse(expectedPath1.equals(currentPath2)); + assertTrue(expectedPath2.equals(currentPath2)); + } + private String getDataDictionaryNodeId() throws Exception { Map params = new HashMap<>(); diff --git a/repository/pom.xml b/repository/pom.xml index a7b04eaf7f..f151559ffa 100644 --- a/repository/pom.xml +++ b/repository/pom.xml @@ -7,7 +7,7 @@ org.alfresco alfresco-community-repo - 8.319-SNAPSHOT + 8.328-SNAPSHOT @@ -249,11 +249,7 @@ xalan xalan - - xml-apis - xml-apis - 1.4.01 - + jakarta.annotation jakarta.annotation-api @@ -425,6 +421,11 @@ org.codehaus.woodstox woodstox-core-asl + + + org.apache.geronimo.specs + geronimo-jta_1.1_spec + @@ -1005,6 +1006,11 @@ javax.annotation javax.annotation-api + + + org.apache.geronimo.specs + geronimo-jta_1.1_spec + diff --git a/repository/src/main/java/org/alfresco/opencmis/search/CMISResultSetRow.java b/repository/src/main/java/org/alfresco/opencmis/search/CMISResultSetRow.java index a833c5acfa..8f003ebb5e 100644 --- a/repository/src/main/java/org/alfresco/opencmis/search/CMISResultSetRow.java +++ b/repository/src/main/java/org/alfresco/opencmis/search/CMISResultSetRow.java @@ -177,13 +177,13 @@ public class CMISResultSetRow implements ResultSetRow context.setScore(getScore()); for (Column column : query.getColumns()) { - // When an SCORE selector is included, score must be adapted to range 0..1 due to CMIS specification - if (column.getFunction()!= null && column.getFunction().getName().equals(Score.NAME)) - { - return getNormalisedScore(); - } - else if (column.getAlias().equals(columnName)) + if (column.getAlias().equals(columnName)) { + //When an SCORE selector is included, score must be adapted to range 0..1 due to CMIS specification + if (column.getFunction()!= null && column.getFunction().getName().equals(Score.NAME)) + { + return getNormalisedScore(); + } return column.getFunction().getValue(column.getFunctionArguments(), context); } // Special case for one selector - ignore any table aliases diff --git a/repository/src/main/java/org/alfresco/repo/deployment/DeploymentMethod.java b/repository/src/main/java/org/alfresco/repo/deployment/DeploymentMethod.java index f1c50c0723..ea502af0dd 100644 --- a/repository/src/main/java/org/alfresco/repo/deployment/DeploymentMethod.java +++ b/repository/src/main/java/org/alfresco/repo/deployment/DeploymentMethod.java @@ -35,6 +35,7 @@ public enum DeploymentMethod INSTALLER, DOCKER_COMPOSE, HELM_CHART, + ANSIBLE, /** * The distribution zip was used to lay down the ACS artifacts */ diff --git a/repository/src/main/java/org/alfresco/repo/event2/EventConsolidator.java b/repository/src/main/java/org/alfresco/repo/event2/EventConsolidator.java index 01027f93f0..f2bada96e5 100644 --- a/repository/src/main/java/org/alfresco/repo/event2/EventConsolidator.java +++ b/repository/src/main/java/org/alfresco/repo/event2/EventConsolidator.java @@ -58,7 +58,7 @@ import org.alfresco.service.namespace.QName; public class EventConsolidator implements EventSupportedPolicies { private final NodeResourceHelper helper; - private final Deque eventTypes; + protected final Deque eventTypes; private final List aspectsAdded; private final List aspectsRemoved; @@ -125,7 +125,7 @@ public class EventConsolidator implements EventSupportedPolicies * @param forceUpdate if {@code true}, will get the latest node info and ignores * the existing builder object. */ - private void createBuilderIfAbsent(NodeRef nodeRef, boolean forceUpdate) + protected void createBuilderIfAbsent(NodeRef nodeRef, boolean forceUpdate) { if (resourceBuilder == null || forceUpdate) { @@ -140,7 +140,7 @@ public class EventConsolidator implements EventSupportedPolicies * * @param nodeRef the nodeRef in the txn */ - private void createBuilderIfAbsent(NodeRef nodeRef) + protected void createBuilderIfAbsent(NodeRef nodeRef) { createBuilderIfAbsent(nodeRef, false); } @@ -292,6 +292,7 @@ public class EventConsolidator implements EventSupportedPolicies Builder builder = NodeResource.builder(); + ZonedDateTime modifiedAt = null; Map changedPropsBefore = getBeforeMapChanges(propertiesBefore, propertiesAfter); if (!changedPropsBefore.isEmpty()) { @@ -321,13 +322,8 @@ public class EventConsolidator implements EventSupportedPolicies builder.setModifiedByUser(modifier); resourceBeforeAllFieldsNull = false; } - ZonedDateTime modifiedAt = + modifiedAt = helper.getZonedDateTime((Date) changedPropsBefore.get(ContentModel.PROP_MODIFIED)); - if (modifiedAt != null) - { - builder.setModifiedAt(modifiedAt); - resourceBeforeAllFieldsNull = false; - } } // Handle case where the content does not exist on the propertiesBefore @@ -357,6 +353,12 @@ public class EventConsolidator implements EventSupportedPolicies resourceBeforeAllFieldsNull = false; } + // Only set modifiedAt if one of the other fields is also not null + if (modifiedAt != null && !resourceBeforeAllFieldsNull) + { + builder.setModifiedAt(modifiedAt); + } + return builder.build(); } @@ -489,4 +491,9 @@ public class EventConsolidator implements EventSupportedPolicies { return resourceBeforeAllFieldsNull; } + + protected void setResourceBeforeAllFieldsNull(boolean resourceBeforeAllFieldsNull){ + this.resourceBeforeAllFieldsNull = resourceBeforeAllFieldsNull; + } + } diff --git a/repository/src/main/java/org/alfresco/repo/event2/EventGenerator.java b/repository/src/main/java/org/alfresco/repo/event2/EventGenerator.java index c514bede6c..693f0f6239 100644 --- a/repository/src/main/java/org/alfresco/repo/event2/EventGenerator.java +++ b/repository/src/main/java/org/alfresco/repo/event2/EventGenerator.java @@ -83,21 +83,21 @@ public class EventGenerator extends AbstractLifecycleBean implements Initializin { private static final Log LOGGER = LogFactory.getLog(EventGenerator.class); - private PolicyComponent policyComponent; - private NodeService nodeService; + protected PolicyComponent policyComponent; + protected NodeService nodeService; private NamespaceService namespaceService; - private DictionaryService dictionaryService; + protected DictionaryService dictionaryService; private DescriptorService descriptorService; private EventFilterRegistry eventFilterRegistry; private Event2MessageProducer event2MessageProducer; private TransactionService transactionService; private PersonService personService; - private NodeResourceHelper nodeResourceHelper; + protected NodeResourceHelper nodeResourceHelper; private NodeTypeFilter nodeTypeFilter; private ChildAssociationTypeFilter childAssociationTypeFilter; private EventUserFilter userFilter; - private final EventTransactionListener transactionListener = new EventTransactionListener(); + protected final EventTransactionListener transactionListener = new EventTransactionListener(); @Override public void afterPropertiesSet() @@ -283,7 +283,7 @@ public class EventGenerator extends AbstractLifecycleBean implements Initializin * @return the {@link EventConsolidator} for the supplied {@code nodeRef} from * the current transaction context. */ - private EventConsolidator getEventConsolidator(NodeRef nodeRef) + protected EventConsolidator getEventConsolidator(NodeRef nodeRef) { Consolidators consolidators = getTxnConsolidators(transactionListener); Map nodeEvents = consolidators.getNodes(); @@ -302,7 +302,7 @@ public class EventGenerator extends AbstractLifecycleBean implements Initializin } - private Consolidators getTxnConsolidators(Object resourceKey) + protected Consolidators getTxnConsolidators(Object resourceKey) { Consolidators consolidators = AlfrescoTransactionSupport.getResource(resourceKey); if (consolidators == null) @@ -388,7 +388,7 @@ public class EventGenerator extends AbstractLifecycleBean implements Initializin //NOOP } - private class EventTransactionListener extends TransactionListenerAdapter + protected class EventTransactionListener extends TransactionListenerAdapter { @Override public void afterCommit() @@ -425,7 +425,7 @@ public class EventGenerator extends AbstractLifecycleBean implements Initializin } } - private void sendEvent(NodeRef nodeRef, EventConsolidator consolidator) + protected void sendEvent(NodeRef nodeRef, EventConsolidator consolidator) { if (consolidator.isTemporaryNode()) { @@ -466,7 +466,7 @@ public class EventGenerator extends AbstractLifecycleBean implements Initializin logAndSendEvent(event, consolidator.getEventTypes()); } - private void sendEvent(ChildAssociationRef childAssociationRef, ChildAssociationEventConsolidator consolidator) + protected void sendEvent(ChildAssociationRef childAssociationRef, ChildAssociationEventConsolidator consolidator) { if (consolidator.isTemporaryChildAssociation()) { @@ -506,7 +506,7 @@ public class EventGenerator extends AbstractLifecycleBean implements Initializin logAndSendEvent(event, consolidator.getEventTypes()); } - private void sendEvent(AssociationRef peerAssociationRef, PeerAssociationEventConsolidator consolidator) + protected void sendEvent(AssociationRef peerAssociationRef, PeerAssociationEventConsolidator consolidator) { if (consolidator.isTemporaryPeerAssociation()) { @@ -525,7 +525,7 @@ public class EventGenerator extends AbstractLifecycleBean implements Initializin logAndSendEvent(event, consolidator.getEventTypes()); } - private void logAndSendEvent(RepoEvent event, Deque listOfEvents) + protected void logAndSendEvent(RepoEvent event, Deque listOfEvents) { if (LOGGER.isTraceEnabled()) { @@ -542,7 +542,7 @@ public class EventGenerator extends AbstractLifecycleBean implements Initializin } - private static class Consolidators + protected static class Consolidators { private Map nodes; private Map childAssocs; diff --git a/repository/src/main/java/org/alfresco/repo/event2/EventJSONSchema.java b/repository/src/main/java/org/alfresco/repo/event2/EventJSONSchema.java index 2d34ef8f40..56a4e900b6 100644 --- a/repository/src/main/java/org/alfresco/repo/event2/EventJSONSchema.java +++ b/repository/src/main/java/org/alfresco/repo/event2/EventJSONSchema.java @@ -43,7 +43,8 @@ public enum EventJSONSchema CHILD_ASSOC_CREATED_V1("childAssocCreated", 1, EventType.CHILD_ASSOC_CREATED), CHILD_ASSOC_DELETED_V1("childAssocDeleted", 1, EventType.CHILD_ASSOC_DELETED), PEER_ASSOC_CREATED_V1("peerAssocCreated", 1 , EventType.PEER_ASSOC_CREATED), - PEER_ASSOC_DELETED_V1("peerAssocDeleted", 1 , EventType.PEER_ASSOC_DELETED); + PEER_ASSOC_DELETED_V1("peerAssocDeleted", 1 , EventType.PEER_ASSOC_DELETED), + PERMISSION_UPDATED_V1("permissionUpdated", 1, EventType.PERMISSION_UPDATED); private static final String PREFIX = "https://api.alfresco.com/schema/event/repo/v"; diff --git a/repository/src/main/java/org/alfresco/repo/event2/EventType.java b/repository/src/main/java/org/alfresco/repo/event2/EventType.java index ddeb5d3d34..9846c5b1e4 100644 --- a/repository/src/main/java/org/alfresco/repo/event2/EventType.java +++ b/repository/src/main/java/org/alfresco/repo/event2/EventType.java @@ -34,7 +34,8 @@ public enum EventType { NODE_CREATED(EventTypeConst.CREATED, ContextType.NODE), NODE_UPDATED(EventTypeConst.UPDATED, ContextType.NODE), NODE_DELETED(EventTypeConst.DELETED, ContextType.NODE), CHILD_ASSOC_CREATED(EventTypeConst.CREATED, ContextType.CHILD_ASSOC), CHILD_ASSOC_DELETED(EventTypeConst.DELETED, ContextType.CHILD_ASSOC), - PEER_ASSOC_CREATED(EventTypeConst.CREATED, ContextType.PEER_ASSOC), PEER_ASSOC_DELETED(EventTypeConst.DELETED, ContextType.PEER_ASSOC); + PEER_ASSOC_CREATED(EventTypeConst.CREATED, ContextType.PEER_ASSOC), PEER_ASSOC_DELETED(EventTypeConst.DELETED, ContextType.PEER_ASSOC), + PERMISSION_UPDATED(EventTypeConst.UPDATED, ContextType.NODE); private static final String PREFIX = "org.alfresco.event."; private final String type; diff --git a/repository/src/main/java/org/alfresco/repo/event2/NodeResourceHelper.java b/repository/src/main/java/org/alfresco/repo/event2/NodeResourceHelper.java index 8177541523..7ce7e40d21 100644 --- a/repository/src/main/java/org/alfresco/repo/event2/NodeResourceHelper.java +++ b/repository/src/main/java/org/alfresco/repo/event2/NodeResourceHelper.java @@ -52,6 +52,7 @@ import org.alfresco.service.cmr.repository.NodeRef; import org.alfresco.service.cmr.repository.NodeService; import org.alfresco.service.cmr.repository.Path; import org.alfresco.service.cmr.security.NoSuchPersonException; +import org.alfresco.service.cmr.security.PermissionService; import org.alfresco.service.cmr.security.PersonService; import org.alfresco.service.namespace.NamespaceException; import org.alfresco.service.namespace.NamespaceService; @@ -76,6 +77,7 @@ public class NodeResourceHelper implements InitializingBean protected PersonService personService; protected EventFilterRegistry eventFilterRegistry; protected NamespaceService namespaceService; + protected PermissionService permissionService; private NodeAspectFilter nodeAspectFilter; private NodePropertyFilter nodePropertyFilter; @@ -88,6 +90,7 @@ public class NodeResourceHelper implements InitializingBean PropertyCheck.mandatory(this, "personService", personService); PropertyCheck.mandatory(this, "eventFilterRegistry", eventFilterRegistry); PropertyCheck.mandatory(this, "namespaceService", namespaceService); + PropertyCheck.mandatory(this, "permissionService", permissionService); this.nodeAspectFilter = eventFilterRegistry.getNodeAspectFilter(); this.nodePropertyFilter = eventFilterRegistry.getNodePropertyFilter(); @@ -108,6 +111,11 @@ public class NodeResourceHelper implements InitializingBean this.personService = personService; } + public void setPermissionService(PermissionService permissionService) + { + this.permissionService = permissionService; + } + // To make IntelliJ stop complaining about unused method! @SuppressWarnings("unused") public void setEventFilterRegistry(EventFilterRegistry eventFilterRegistry) @@ -316,4 +324,9 @@ public class NodeResourceHelper implements InitializingBean final Path path = nodeService.getPath(nodeRef); return PathUtil.getNodeIdsInReverse(path, showLeaf); } + + public PermissionService getPermissionService() + { + return permissionService; + } } diff --git a/repository/src/main/java/org/alfresco/repo/search/impl/AbstractCategoryServiceImpl.java b/repository/src/main/java/org/alfresco/repo/search/impl/AbstractCategoryServiceImpl.java index 5657437ef4..858040df54 100644 --- a/repository/src/main/java/org/alfresco/repo/search/impl/AbstractCategoryServiceImpl.java +++ b/repository/src/main/java/org/alfresco/repo/search/impl/AbstractCategoryServiceImpl.java @@ -2,7 +2,7 @@ * #%L * Alfresco Repository * %% - * Copyright (C) 2005 - 2016 Alfresco Software Limited + * Copyright (C) 2005 - 2020 Alfresco Software Limited * %% * This file is part of the Alfresco software. * If the software was purchased under a paid Alfresco license, the terms of @@ -326,7 +326,7 @@ public abstract class AbstractCategoryServiceImpl implements CategoryService return assocs; } - private Set getClassificationNodes(StoreRef storeRef, QName qname) + protected Set getClassificationNodes(StoreRef storeRef, QName qname) { ResultSet resultSet = null; try diff --git a/repository/src/main/resources/alfresco/events2-context.xml b/repository/src/main/resources/alfresco/events2-context.xml index ec63518770..c5d899023f 100644 --- a/repository/src/main/resources/alfresco/events2-context.xml +++ b/repository/src/main/resources/alfresco/events2-context.xml @@ -49,6 +49,7 @@ + diff --git a/repository/src/main/resources/alfresco/messages/activiti-engine-messages_ja.properties b/repository/src/main/resources/alfresco/messages/activiti-engine-messages_ja.properties index ea761ab648..97a11cd1ef 100755 --- a/repository/src/main/resources/alfresco/messages/activiti-engine-messages_ja.properties +++ b/repository/src/main/resources/alfresco/messages/activiti-engine-messages_ja.properties @@ -8,7 +8,7 @@ activiti.engine.get.workflow.definition.by.id.error=ID {0}\u306e\u30ef\u30fc\u30 activiti.engine.get.workflow.definition.by.name.error=\u540d\u524d {0} \u306e\u30ef\u30fc\u30af\u30d5\u30ed\u30fc\u5b9a\u7fa9\u3092\u53d6\u5f97\u3067\u304d\u307e\u305b\u3093\u3067\u3057\u305f\u3002 activiti.engine.get.all.workflow.definitions.by.name.error=\u30ef\u30fc\u30af\u30d5\u30ed\u30fc {0} \u306e\u5168\u5b9a\u7fa9\u3092\u53d6\u5f97\u3067\u304d\u307e\u305b\u3093\u3067\u3057\u305f\u3002 activiti.engine.get.workflow.definition.image.error={0}\u306e\u30ef\u30fc\u30af\u30d5\u30ed\u30fc\u5b9a\u7fa9\u753b\u50cf\u3092\u53d6\u5f97\u3067\u304d\u307e\u305b\u3093\u3067\u3057\u305f\u3002 -activiti.engine.get.workflow.definition.unexisting.image.error={0}\u306e\u30ef\u30fc\u30af\u30d5\u30ed\u30fc\u5b9a\u7fa9\u753b\u50cf\u3092\u53d6\u5f97\u3067\u304d\u307e\u305b\u3093\u3067\u3057\u305f\u3002\u3053\u306e\u5b9a\u7fa9\u306f\u5b58\u5728\u3057\u307e\u305b\u3093. +activiti.engine.get.workflow.definition.unexisting.image.error={0}\u306e\u30ef\u30fc\u30af\u30d5\u30ed\u30fc\u5b9a\u7fa9\u753b\u50cf\u3092\u53d6\u5f97\u3067\u304d\u307e\u305b\u3093\u3067\u3057\u305f\u3002\u3053\u306e\u5b9a\u7fa9\u306f\u5b58\u5728\u3057\u307e\u305b\u3093\u3002 activiti.engine.get.task.definitions.error=\u30ef\u30fc\u30af\u30d5\u30ed\u30fc\u5b9a\u7fa9 {0} \u306e\u30ef\u30fc\u30af\u30d5\u30ed\u30fc\u30bf\u30b9\u30af\u5b9a\u7fa9\u3092\u53d6\u5f97\u3067\u304d\u307e\u305b\u3093\u3067\u3057\u305f\u3002 activiti.engine.get.process.definition.error=\u30ef\u30fc\u30af\u30d5\u30ed\u30fc\u5b9a\u7fa9 {0} \u306f\u5b58\u5728\u3057\u307e\u305b\u3093\u3002 activiti.engine.start.workflow.error=\u30ef\u30fc\u30af\u30d5\u30ed\u30fc {0} \u3092\u958b\u59cb\u3067\u304d\u307e\u305b\u3093\u3067\u3057\u305f\u3002 @@ -24,7 +24,7 @@ activiti.engine.cancel.workflow.error=\u30ef\u30fc\u30af\u30d5\u30ed\u30fc\u30a4 activiti.engine.cancel.unexisting.workflow.error=\u30ef\u30fc\u30af\u30d5\u30ed\u30fc\u30a4\u30f3\u30b9\u30bf\u30f3\u30b9 {0} \u306f\u5b58\u5728\u3057\u306a\u3044\u305f\u3081\u3001\u30ad\u30e3\u30f3\u30bb\u30eb\u3067\u304d\u307e\u305b\u3093\u3067\u3057\u305f\u3002 activiti.engine.delete.workflow.error=\u30ef\u30fc\u30af\u30d5\u30ed\u30fc\u30a4\u30f3\u30b9\u30bf\u30f3\u30b9 {0} \u3092\u524a\u9664\u3067\u304d\u307e\u305b\u3093\u3067\u3057\u305f\u3002 activiti.engine.delete.unexisting.workflow.error=\u30ef\u30fc\u30af\u30d5\u30ed\u30fc\u30a4\u30f3\u30b9\u30bf\u30f3\u30b9 {0} \u306f\u5b58\u5728\u3057\u306a\u3044\u305f\u3081\u3001\u524a\u9664\u3067\u304d\u307e\u305b\u3093\u3067\u3057\u305f\u3002 -activiti.engine.signal.transition.error=\u30ef\u30fc\u30af\u30d5\u30ed\u30fc\u30d1\u30b9 {1} \u304b\u3089\u79fb\u884c{0} \u3092\u767a\u4fe1\u3067\u304d\u307e\u305b\u3093\u3067\u3057\u305f\u3002\u3002 +activiti.engine.signal.transition.error=\u30ef\u30fc\u30af\u30d5\u30ed\u30fc\u30d1\u30b9 {1} \u304b\u3089\u79fb\u884c{0} \u3092\u767a\u4fe1\u3067\u304d\u307e\u305b\u3093\u3067\u3057\u305f\u3002 activiti.engine.event.unsupported=Activiti\u30a8\u30f3\u30b8\u30f3\u3067\u7a3c\u52d5\u3057\u3066\u3044\u308bWorkflowPath\u3067\u306f\u3001\u30a4\u30d9\u30f3\u30c8\u306e\u767a\u884c\u304c\u30b5\u30dd\u30fc\u30c8\u3055\u308c\u3066\u3044\u307e\u305b\u3093\u3002 activiti.engine.fire.event.error=\u30ef\u30fc\u30af\u30d5\u30ed\u30fc\u30d1\u30b9 {1} \u304b\u3089\u30a4\u30d9\u30f3\u30c8 {0} \u3092\u767a\u884c\u3067\u304d\u307e\u305b\u3093\u3067\u3057\u305f\u3002 activiti.engine.get.tasks.for.path.error=\u30ef\u30fc\u30af\u30d5\u30ed\u30fc\u30d1\u30b9 {0} \u306b\u5272\u308a\u5f53\u3066\u3089\u308c\u305f\u30bf\u30b9\u30af\u3092\u53d6\u5f97\u3067\u304d\u307e\u305b\u3093\u3067\u3057\u305f\u3002 @@ -32,10 +32,10 @@ activiti.engine.get.timers.error=\u30ef\u30fc\u30af\u30d5\u30ed\u30fc {0} \u306e activiti.engine.find.completed.task.instances.error=\u52d5\u4f5c\u4e3b {0} \u306e\u5b8c\u4e86\u6e08\u307f\u30bf\u30b9\u30af\u30a4\u30f3\u30b9\u30bf\u30f3\u30b9\u30ea\u30b9\u30c8\u3092\u53d6\u5f97\u3067\u304d\u307e\u305b\u3093\u3067\u3057\u305f\u3002 activiti.engine.get.assigned.tasks.error=\u30b9\u30c6\u30fc\u30bf\u30b9 {1} \u306e\u6a29\u9650 {0} \u306b\u5272\u308a\u5f53\u3066\u3089\u308c\u305f\u30bf\u30b9\u30af\u3092\u53d6\u5f97\u3067\u304d\u307e\u305b\u3093\u3067\u3057\u305f\u3002 activiti.engine.get.pooled.tasks.error=\u6a29\u9650 {0} \u306e\u30d7\u30fc\u30eb\u6e08\u307f\u30bf\u30b9\u30af\u3092\u53d6\u5f97\u3067\u304d\u307e\u305b\u3093\u3067\u3057\u305f\u3002 -activiti.engine.query.tasks.error=\u30bf\u30b9\u30af\u3092\u7167\u4f1a\u3067\u304d\u307e\u305b\u3093\u3067\u3057\u305f\u3002 \u7167\u4f1a: {0}. +activiti.engine.query.tasks.error=\u30bf\u30b9\u30af\u3092\u7167\u4f1a\u3067\u304d\u307e\u305b\u3093\u3067\u3057\u305f\u3002 \u7167\u4f1a: {0}\u3002 activiti.engine.get.task.instance.error=\u30bf\u30b9\u30af\u30a4\u30f3\u30b9\u30bf\u30f3\u30b9 {0} \u306f\u5b58\u5728\u3057\u307e\u305b\u3093\u3002 activiti.engine.update.task.error=\u30ef\u30fc\u30af\u30d5\u30ed\u30fc\u30bf\u30b9\u30af {0} \u3092\u66f4\u65b0\u3067\u304d\u307e\u305b\u3093\u3067\u3057\u305f\u3002 -activiti.engine.update.task.unexisting.error=\u30ef\u30fc\u30af\u30d5\u30ed\u30fc\u30bf\u30b9\u30af {0} \u3092\u66f4\u65b0\u3067\u304d\u307e\u305b\u3093\u3067\u3057\u305f\u3002\u3053\u306e\u30bf\u30b9\u30af\u306f\u5b58\u5728\u3057\u307e\u305b\u3093. +activiti.engine.update.task.unexisting.error=\u30ef\u30fc\u30af\u30d5\u30ed\u30fc\u30bf\u30b9\u30af {0} \u3092\u66f4\u65b0\u3067\u304d\u307e\u305b\u3093\u3067\u3057\u305f\u3002\u3053\u306e\u30bf\u30b9\u30af\u306f\u5b58\u5728\u3057\u307e\u305b\u3093\u3002 activiti.engine.update.starttask.illegal.error=\u30ef\u30fc\u30af\u30d5\u30ed\u30fc\u30bf\u30b9\u30af {0} \u3092\u66f4\u65b0\u3067\u304d\u307e\u305b\u3093\u3067\u3057\u305f\u3002activiti\u3067\u306f\u958b\u59cb\u30bf\u30b9\u30af\u3092\u66f4\u65b0\u3067\u304d\u307e\u305b\u3093\u3002 activiti.engine.end.task.invalid.transition=\u30ef\u30fc\u30af\u30d5\u30ed\u30fc\u30bf\u30b9\u30af {1} \u306e\u79fb\u884c {0} \u306f\u7121\u52b9\u3067\u3059\u3002\u79fb\u884c {2} \u306e\u307f\u304c\u8a31\u53ef\u3055\u308c\u3066\u3044\u307e\u3059\u3002 activiti.engine.end.task.unexisting.error=\u30bf\u30b9\u30af {0} \u306e\u79fb\u884c\u3092\u767a\u4fe1\u3067\u304d\u307e\u305b\u3093\u3067\u3057\u305f\u3002\u3053\u306e\u30bf\u30b9\u30af\u306f\u5b58\u5728\u3057\u307e\u305b\u3093\u3002 diff --git a/repository/src/main/resources/alfresco/messages/activiti-engine-messages_zh_CN.properties b/repository/src/main/resources/alfresco/messages/activiti-engine-messages_zh_CN.properties index 64f97c8428..b6509657a6 100755 --- a/repository/src/main/resources/alfresco/messages/activiti-engine-messages_zh_CN.properties +++ b/repository/src/main/resources/alfresco/messages/activiti-engine-messages_zh_CN.properties @@ -32,7 +32,7 @@ activiti.engine.get.timers.error=\u65e0\u6cd5\u68c0\u7d22\u5de5\u4f5c\u6d41\u7a0 activiti.engine.find.completed.task.instances.error=\u68c0\u7d22\u64cd\u4f5c\u4eba\u5458 {0} \u7684\u5df2\u5b8c\u6210\u4efb\u52a1\u5b9e\u4f8b\u5217\u8868\u5931\u8d25\u3002 activiti.engine.get.assigned.tasks.error=\u68c0\u7d22\u6307\u6d3e\u7ed9\u72b6\u6001\u4e3a {1} \u7684\u6388\u6743 {0} \u7684\u4efb\u52a1\u5931\u8d25\u3002 activiti.engine.get.pooled.tasks.error=\u68c0\u7d22\u6388\u6743 {0} \u7684\u5165\u6c60\u4efb\u52a1\u5931\u8d25\u3002 -activiti.engine.query.tasks.error=\u67e5\u8be2\u4efb\u52a1\u5931\u8d25\u3002 \u67e5\u8be2\uff1a{0}. +activiti.engine.query.tasks.error=\u67e5\u8be2\u4efb\u52a1\u5931\u8d25\u3002 \u67e5\u8be2\uff1a{0}\u3002 activiti.engine.get.task.instance.error=\u4efb\u52a1\u5b9e\u4f8b {0} \u4e0d\u5b58\u5728\u3002 activiti.engine.update.task.error=\u66f4\u65b0\u5de5\u4f5c\u6d41\u7a0b\u4efb\u52a1 {0} \u5931\u8d25\u3002 activiti.engine.update.task.unexisting.error=\u66f4\u65b0\u5de5\u4f5c\u6d41\u7a0b\u4efb\u52a1 {0} \u5931\u8d25\uff0c\u6b64\u4efb\u52a1\u4e0d\u5b58\u5728\u3002 @@ -51,4 +51,4 @@ activiti.engine.set.task.properties.invalid.value=\u503c {0} \u5bf9\u4efb\u52a1\ activiti.engine.package.already.associated.error=\u65e0\u6cd5\u5c06\u5de5\u4f5c\u6d41\u7a0b\u5305 {0} \u4e0e\u5de5\u4f5c\u6d41\u7a0b\u5b9e\u4f8b {1} \u5173\u8054\uff0c\u56e0\u4e3a\u6b64\u5305\u5df2\u4e0e\u5de5\u4f5c\u6d41\u7a0b\u5b9e\u4f8b {2} \u5173\u8054\u3002 activiti.engine.convert.value.error=\u65e0\u6cd5\u5c06\u503c {0} \u8f6c\u6362\u4e3a Alfresco Content Services \u503c\uff0c\u56e0\u4e3a\u6b64\u503c\u4e0d\u53ef\u4e13\u95e8\u5316\u3002 activiti.engine.get.company.home.invalid=\u516c\u53f8\u4e3b\u8def\u5f84 {0} \u65e0\u6548\u3002 -activiti.engine.get.company.home.multiple=\u516c\u53f8\u4e3b\u8def\u5f84 {0} \u65e0\u6548\u3002 \u5e94\u8be5\u6709 1 \u4e2a\u5339\u914d\u9879\uff0c\u7ed3\u679c\u627e\u5230\u4e86 {1} \u4e2a\u5339\u914d\u9879. +activiti.engine.get.company.home.multiple=\u516c\u53f8\u4e3b\u8def\u5f84 {0} \u65e0\u6548\u3002 \u5e94\u8be5\u6709 1 \u4e2a\u5339\u914d\u9879\uff0c\u7ed3\u679c\u627e\u5230\u4e86 {1} \u4e2a\u5339\u914d\u9879\u3002 diff --git a/repository/src/main/resources/alfresco/messages/bootstrap-content-template-examples_ja.properties b/repository/src/main/resources/alfresco/messages/bootstrap-content-template-examples_ja.properties index 85ed0e5ec3..46b95b9c8c 100755 --- a/repository/src/main/resources/alfresco/messages/bootstrap-content-template-examples_ja.properties +++ b/repository/src/main/resources/alfresco/messages/bootstrap-content-template-examples_ja.properties @@ -6,7 +6,7 @@ content.template.shows_a_simple_summary_page=\u73fe\u5728\u306e\u30e6\u30fc\u30b content.template.calculates_if_the_document_has=\u6587\u66f8\u304c\u7ffb\u8a33\u53ef\u80fd\u30a2\u30b9\u30da\u30af\u30c8\u3092\u9069\u7528\u3057\u305f\u5834\u5408\u306b\u8a08\u7b97\u3057\u307e\u3059 content.template.displays_a_list_of_the_documents_in_the_current_space=\u904e\u53bb7\u65e5\u4ee5\u5185\u306b\u4f5c\u6210\u307e\u305f\u306f\u4fee\u6b63\u3055\u308c\u305f\u73fe\u5728\u306e\u30b9\u30da\u30fc\u30b9\u306b\u3042\u308b\u6587\u66f8\u306e\u30ea\u30b9\u30c8\u3092\u8868\u793a\u3057\u307e\u3059 content.template.example_of_various_lists=\u73fe\u5728\u306e\u30e6\u30fc\u30b6\u30fc\u306b\u95a2\u3059\u308b\u6587\u66f8\u3001\u30b9\u30da\u30fc\u30b9\u3001\u8981\u7d04\u60c5\u5831\u306e\u3055\u307e\u3056\u307e\u306a\u30ea\u30b9\u30c8\u306e\u30b5\u30f3\u30d7\u30eb -content.template.displays_a_list_of_the_documents_in_the_current_user_Home_Space=\u73fe\u5728\u306e\u30e6\u30fc\u30b6\u30fc\u306e\u30db\u30fc\u30e0\u30b9\u30da\u30fc\u30b9\u306b\u6587\u66f8\u306e\u30ea\u30b9\u30c8\u3092\u8868\u793a\u3057\u307e\u3059\u3002 JPEG\u30b3\u30f3\u30c6\u30f3\u30c4\u306f\u5c0f\u3055\u306a\u30b5\u30e0\u30cd\u30a4\u30eb\u753b\u50cf\u306b\u306a\u308b\u305f\u3081\u3001\u30c6\u30ad\u30b9\u30c8\u6587\u66f8\u30b3\u30f3\u30c6\u30f3\u30c4\u304c\u30a4\u30f3\u30e9\u30a4\u30f3\u8868\u793a\u3055\u308c\u307e\u3059. +content.template.displays_a_list_of_the_documents_in_the_current_user_Home_Space=\u73fe\u5728\u306e\u30e6\u30fc\u30b6\u30fc\u306e\u30db\u30fc\u30e0\u30b9\u30da\u30fc\u30b9\u306b\u6587\u66f8\u306e\u30ea\u30b9\u30c8\u3092\u8868\u793a\u3057\u307e\u3059\u3002 JPEG\u30b3\u30f3\u30c6\u30f3\u30c4\u306f\u5c0f\u3055\u306a\u30b5\u30e0\u30cd\u30a4\u30eb\u753b\u50cf\u306b\u306a\u308b\u305f\u3081\u3001\u30c6\u30ad\u30b9\u30c8\u6587\u66f8\u30b3\u30f3\u30c6\u30f3\u30c4\u304c\u30a4\u30f3\u30e9\u30a4\u30f3\u8868\u793a\u3055\u308c\u307e\u3059\u3002 content.template.displays_the_audit_trail=\u30aa\u30d6\u30b8\u30a7\u30af\u30c8\u306e\u30aa\u30fc\u30c7\u30a3\u30c3\u30c8\u30c8\u30ec\u30fc\u30eb\u3092\u8868\u793a\u3057\u307e\u3059\u3002 email.template.email_template_for_notifying_users=\u30eb\u30fc\u30eb\u307e\u305f\u306f\u51e6\u7406\u3092\u901a\u3058\u3066\u30e6\u30fc\u30b6\u30fc\u306b\u901a\u77e5\u3059\u308b\u305f\u3081\u306e E \u30e1\u30fc\u30eb\u30c6\u30f3\u30d7\u30ec\u30fc\u30c8 email.template.email_template_for_notifying_users_of_an_Invite=\u30b9\u30da\u30fc\u30b9\u307e\u305f\u306f\u6587\u66f8\u3078\u306e\u62db\u5f85\u3092\u30e6\u30fc\u30b6\u30fc\u306b\u901a\u77e5\u3059\u308b\u305f\u3081\u306e E \u30e1\u30fc\u30eb\u30c6\u30f3\u30d7\u30ec\u30fc\u30c8 diff --git a/repository/src/main/resources/alfresco/messages/bootstrap-content-template-examples_zh_CN.properties b/repository/src/main/resources/alfresco/messages/bootstrap-content-template-examples_zh_CN.properties index 89938fed60..1ed469fc9d 100755 --- a/repository/src/main/resources/alfresco/messages/bootstrap-content-template-examples_zh_CN.properties +++ b/repository/src/main/resources/alfresco/messages/bootstrap-content-template-examples_zh_CN.properties @@ -6,7 +6,7 @@ content.template.shows_a_simple_summary_page=\u663e\u793a\u6709\u5173\u5f53\u524 content.template.calculates_if_the_document_has=\u8ba1\u7b97\u662f\u5426\u5df2\u4e3a\u6587\u6863\u5e94\u7528\u4e86\u53ef\u7ffb\u8bd1\u5207\u9762 content.template.displays_a_list_of_the_documents_in_the_current_space=\u663e\u793a\u5f53\u524d\u7a7a\u95f4\u4e2d\u8fc7\u53bb 7 \u5929\u5185\u521b\u5efa\u6216\u4fee\u6539\u7684\u6587\u6863\u5217\u8868 content.template.example_of_various_lists=\u6587\u6863\u3001\u7a7a\u95f4\u548c\u5f53\u524d\u7528\u6237\u76f8\u5173\u6458\u8981\u4fe1\u606f\u7684\u5404\u79cd\u5217\u8868\u793a\u4f8b -content.template.displays_a_list_of_the_documents_in_the_current_user_Home_Space=\u663e\u793a\u5f53\u524d\u7528\u6237\u4e3b\u7a7a\u95f4\u5185\u7684\u6587\u6863\u5217\u8868\u3002 \u6587\u672c\u6587\u6863\u7684\u5185\u5bb9\u76f4\u63a5\u663e\u793a\uff0c\u800c JPG \u5185\u5bb9\u5219\u663e\u793a\u4e3a\u5c0f\u578b\u7f29\u7565\u56fe. +content.template.displays_a_list_of_the_documents_in_the_current_user_Home_Space=\u663e\u793a\u5f53\u524d\u7528\u6237\u4e3b\u7a7a\u95f4\u5185\u7684\u6587\u6863\u5217\u8868\u3002 \u6587\u672c\u6587\u6863\u7684\u5185\u5bb9\u76f4\u63a5\u663e\u793a\uff0c\u800c JPG \u5185\u5bb9\u5219\u663e\u793a\u4e3a\u5c0f\u578b\u7f29\u7565\u56fe\u3002 content.template.displays_the_audit_trail=\u663e\u793a\u67d0\u4e2a\u5bf9\u8c61\u7684\u5ba1\u6838\u8bb0\u5f55\u3002 email.template.email_template_for_notifying_users=\u89c4\u5219\u6216\u64cd\u4f5c\u4e2d\u7528\u4e8e\u901a\u77e5\u7528\u6237\u7684\u7535\u5b50\u90ae\u4ef6\u6a21\u677f email.template.email_template_for_notifying_users_of_an_Invite=\u7528\u4e8e\u901a\u77e5\u7528\u6237\u83b7\u9080\u8bbf\u95ee\u67d0\u4e2a\u7a7a\u95f4\u6216\u6587\u6863\u7684\u7535\u5b50\u90ae\u4ef6\u6a21\u677f diff --git a/repository/src/main/resources/alfresco/messages/bootstrap-messages_zh_CN.properties b/repository/src/main/resources/alfresco/messages/bootstrap-messages_zh_CN.properties index b65bd80c87..9038fc1930 100644 --- a/repository/src/main/resources/alfresco/messages/bootstrap-messages_zh_CN.properties +++ b/repository/src/main/resources/alfresco/messages/bootstrap-messages_zh_CN.properties @@ -361,7 +361,7 @@ bootstrap.categories.cm_generalclassifiable.regions.oceania.micronesia.guam.name bootstrap.categories.cm_generalclassifiable.regions.oceania.micronesia.johnston_island.name=\u7ea6\u7ff0\u65af\u987f\u5c9b bootstrap.categories.cm_generalclassifiable.regions.oceania.micronesia.kiribati.name=\u57fa\u91cc\u5df4\u65af bootstrap.categories.cm_generalclassifiable.regions.oceania.micronesia.marshall_islands.name=\u9a6c\u7ecd\u5c14\u7fa4\u5c9b -bootstrap.categories.cm_generalclassifiable.regions.oceania.micronesia.nauru.name=\u7459\u9c81 +bootstrap.categories.cm_generalclassifiable.regions.oceania.micronesia.nauru.name=\u7459\u9c81\u8bed bootstrap.categories.cm_generalclassifiable.regions.oceania.micronesia.northern_mariana_islands.name=\u5317\u9a6c\u91cc\u4e9a\u7eb3\u7fa4\u5c9b bootstrap.categories.cm_generalclassifiable.regions.oceania.micronesia.palau.name=\u5e15\u52b3 diff --git a/repository/src/main/resources/alfresco/messages/content-model_zh_CN.properties b/repository/src/main/resources/alfresco/messages/content-model_zh_CN.properties index 3a64c1fc63..674de82a2c 100755 --- a/repository/src/main/resources/alfresco/messages/content-model_zh_CN.properties +++ b/repository/src/main/resources/alfresco/messages/content-model_zh_CN.properties @@ -282,8 +282,8 @@ cm_contentmodel.association.cm_attachments.description=\u9644\u52a0\u7684\u5b58\ cm_contentmodel.aspect.cm_emailed.title=\u7535\u5b50\u90ae\u4ef6\u65b9\u5f0f cm_contentmodel.aspect.cm_emailed.description=\u7535\u5b50\u90ae\u4ef6\u65b9\u5f0f -cm_contentmodel.property.cm_originator.title=\u4ece -cm_contentmodel.property.cm_originator.description=\u4ece +cm_contentmodel.property.cm_originator.title=\u53d1\u4ef6\u4eba +cm_contentmodel.property.cm_originator.description=\u53d1\u4ef6\u4eba cm_contentmodel.property.cm_addressee.title=\u6536\u4ef6\u4eba cm_contentmodel.property.cm_addressee.description=\u6536\u4ef6\u4eba cm_contentmodel.property.cm_addressees.title=\u6240\u6709\u6536\u4ef6\u4eba diff --git a/repository/src/main/resources/alfresco/messages/custommodel-service_ja.properties b/repository/src/main/resources/alfresco/messages/custommodel-service_ja.properties index f82e1010b1..66ec41d66b 100644 --- a/repository/src/main/resources/alfresco/messages/custommodel-service_ja.properties +++ b/repository/src/main/resources/alfresco/messages/custommodel-service_ja.properties @@ -32,6 +32,6 @@ cmm.service.model_in_use=\u30e2\u30c7\u30eb ''{0}'' \u306f\u4f7f\u7528\u4e2d\u30 # ValueDataTypeValidator messages cmm.value_datatype_validator.unknown_datatype=\u30d7\u30ed\u30d1\u30c6\u30a3\u306e\u30c7\u30fc\u30bf\u578b ''{0}'' \u304c\u4e0d\u660e\u3067\u3059\u3002 cmm.value_datatype_validator.invalid_value=''{0}'' \u306f ''{1}'' \u306e\u6709\u52b9\u306a\u30aa\u30d7\u30b7\u30e7\u30f3\u3067\u306f\u3042\u308a\u307e\u305b\u3093\u3002 \u3082\u3046\u4e00\u5ea6\u3084\u308a\u76f4\u3057\u3066\u304f\u3060\u3055\u3044\u3002 -cmm.value_datatype_validator.invalid_date=''{0}'' \u306f\u6709\u52b9\u306a\u65e5\u4ed8\u5f62\u5f0f\u3067\u306f\u3042\u308a\u307e\u305b\u3093\u3002 yyyy-mm-dd \u5f62\u5f0f\u3092\u4f7f\u3063\u3066\u3001\u3082\u3046\u4e00\u5ea6\u3084\u308a\u76f4\u3057\u3066\u304f\u3060\u3055\u3044. +cmm.value_datatype_validator.invalid_date=''{0}'' \u306f\u6709\u52b9\u306a\u65e5\u4ed8\u5f62\u5f0f\u3067\u306f\u3042\u308a\u307e\u305b\u3093\u3002 yyyy-mm-dd \u5f62\u5f0f\u3092\u4f7f\u3063\u3066\u3001\u3082\u3046\u4e00\u5ea6\u3084\u308a\u76f4\u3057\u3066\u304f\u3060\u3055\u3044\u3002 cmm.value_datatype_validator.invalid_datetime=''{0}'' \u306f\u6709\u52b9\u306a\u65e5\u6642\u5f62\u5f0f\u3067\u306f\u3042\u308a\u307e\u305b\u3093\u3002 yyyy-mm-dd HH:mm:ss.sss \u5f62\u5f0f\u3092\u4f7f\u3063\u3066\u3001\u3082\u3046\u4e00\u5ea6\u3084\u308a\u76f4\u3057\u3066\u304f\u3060\u3055\u3044\u3002 cmm.value_datatype_validator.invalid_boolean_value=''{0}'' \u306f\u6709\u52b9\u306a\u5024\u3067\u306f\u3042\u308a\u307e\u305b\u3093\u3002 \u5024\u3092\u9078\u629e\u3059\u308b\u304b\u3001True \u307e\u305f\u306f False \u3092\u5165\u529b\u3057\u3066\u304f\u3060\u3055\u3044\u3002 diff --git a/repository/src/main/resources/alfresco/messages/custommodel-service_zh_CN.properties b/repository/src/main/resources/alfresco/messages/custommodel-service_zh_CN.properties index 00faae11f9..3a0390a743 100644 --- a/repository/src/main/resources/alfresco/messages/custommodel-service_zh_CN.properties +++ b/repository/src/main/resources/alfresco/messages/custommodel-service_zh_CN.properties @@ -3,8 +3,8 @@ cmm.service.name_already_in_use=\u6211\u4eec\u65e0\u6cd5\u521b\u5efa\u6a21\u578b cmm.service.create_model_err=\u6b64\u65f6\u6211\u4eec\u65e0\u6cd5\u521b\u5efa\u6a21\u578b\u3002\u8bf7\u5c1d\u8bd5\u4e0e\u60a8\u7684 IT \u56e2\u961f\u5206\u4eab\u4ee5\u4e0b\u8be6\u7ec6\u4fe1\u606f\u3002{0} cmm.service.update_model_err=\u6b64\u65f6\u6211\u4eec\u65e0\u6cd5\u66f4\u65b0\u6a21\u578b\u3002\u8bf7\u5c1d\u8bd5\u4e0e\u60a8\u7684 IT \u56e2\u961f\u5206\u4eab\u4ee5\u4e0b\u8be6\u7ec6\u4fe1\u606f\u3002{0} cmm.service.multiple_models=\u5df2\u627e\u5230\u591a\u4e2a\u540d\u79f0\u4e3a ''{0}'' \u7684\u6a21\u578b\u3002 \u8bf7\u5c1d\u8bd5\u53d6\u6d88\u6fc0\u6d3b\u5176\u4e2d\u4e00\u4e2a\u6a21\u578b\uff0c\u7136\u540e\u5c06\u5176\u5220\u9664\u3002 -cmm.service.retrieve_model=\u6211\u4eec\u65e0\u6cd5\u8bbf\u95ee\u6a21\u578b ''{0}''\u3002 \u8bf7\u91cd\u8bd5. -cmm.service.model_not_exists=\u6a21\u578b ''{0}'' \u4e0d\u5b58\u5728\u3002 \u5176\u4ed6\u7528\u6237\u53ef\u80fd\u5df2\u5c06\u5176\u53d6\u6d88\u6fc0\u6d3b. +cmm.service.retrieve_model=\u6211\u4eec\u65e0\u6cd5\u8bbf\u95ee\u6a21\u578b ''{0}''\u3002 \u8bf7\u91cd\u8bd5\u3002 +cmm.service.model_not_exists=\u6a21\u578b ''{0}'' \u4e0d\u5b58\u5728\u3002 \u5176\u4ed6\u7528\u6237\u53ef\u80fd\u5df2\u5c06\u5176\u53d6\u6d88\u6fc0\u6d3b\u3002 cmm.service.namespace_not_exists=\u6a21\u578b ''{0}'' \u6ca1\u6709\u5b9a\u4e49\u7684\u547d\u540d\u7a7a\u95f4\u3002 \u60a8\u9700\u8981\u6dfb\u52a0\u4e00\u4e2a\u547d\u540d\u7a7a\u95f4\u4ee5\u4f7f\u6a21\u578b\u751f\u6548\u3002 cmm.service.namespace_many_exist=\u6a21\u578b ''{0}'' \u53ea\u80fd\u5177\u6709\u4e00\u4e2a\u547d\u540d\u7a7a\u95f4\u3002 cmm.service.namespace_uri_already_in_use=\u547d\u540d\u7a7a\u95f4 URI ''{0}'' \u5df2\u5728\u4f7f\u7528\u3002 \u8bf7\u5c1d\u8bd5\u4f7f\u7528\u5176\u4ed6\u547d\u540d\u7a7a\u95f4 URI\u3002 @@ -33,5 +33,5 @@ cmm.service.model_in_use=\u6a21\u578b ''{0}'' \u6b63\u5728\u4f7f\u7528\u4e2d\uff cmm.value_datatype_validator.unknown_datatype=\u5c5e\u6027\u6570\u636e\u7c7b\u578b ''{0}'' \u672a\u77e5\u3002 cmm.value_datatype_validator.invalid_value=''{0}'' \u4e0d\u662f ''{1}'' \u7684\u6709\u6548\u9009\u9879\u3002 \u8bf7\u91cd\u8bd5\u3002 cmm.value_datatype_validator.invalid_date=''{0}'' \u4e0d\u662f\u6709\u6548\u7684\u65e5\u671f\u683c\u5f0f\u3002 \u8bf7\u91cd\u65b0\u5c1d\u8bd5\u4f7f\u7528\u683c\u5f0f \u5e74-\u6708-\u65e5\u3002 -cmm.value_datatype_validator.invalid_datetime=''{0}'' \u4e0d\u662f\u6709\u6548\u7684\u65e5\u671f\u65f6\u95f4\u683c\u5f0f\u3002 \u8bf7\u91cd\u65b0\u5c1d\u8bd5\u4f7f\u7528\u683c\u5f0f \u5e74-\u6708-\u65e5 HH:mm:ss.sss\u3002 +cmm.value_datatype_validator.invalid_datetime=''{0}'' \u4e0d\u662f\u6709\u6548\u7684\u65e5\u671f\u65f6\u95f4\u683c\u5f0f\u3002 \u8bf7\u91cd\u65b0\u5c1d\u8bd5\u4f7f\u7528\u683c\u5f0f \u5e74-\u6708-\u65e5 HH:mm:ss.sss. cmm.value_datatype_validator.invalid_boolean_value=''{0}'' \u4e0d\u662f\u6709\u6548\u503c\u3002 \u8fdb\u884c\u9009\u62e9\u6216\u8f93\u5165\u6b63\u786e\u6216\u9519\u8bef\u3002 diff --git a/repository/src/main/resources/alfresco/messages/repoadmin-service_zh_CN.properties b/repository/src/main/resources/alfresco/messages/repoadmin-service_zh_CN.properties index 480ea55834..05315bf3d5 100644 --- a/repository/src/main/resources/alfresco/messages/repoadmin-service_zh_CN.properties +++ b/repository/src/main/resources/alfresco/messages/repoadmin-service_zh_CN.properties @@ -19,4 +19,4 @@ repoadmin_service.msg_resource_undeployment_failed=\u6d88\u606f\u8d44\u6e90\u7ec repoadmin_service.msg_resource_reload_failed=\u6d88\u606f\u8d44\u6e90\u91cd\u65b0\u52a0\u8f7d\u5931\u8d25 repoadmin_service.msg_missing_bundle_base_name=\u6d88\u606f\u90e8\u7f72\u5931\u8d25\u3002 \u7f3a\u5c11\u7ec4\u57fa\u51c6\u540d\u79f0 repoadmin_service.msg_base_name_contain_underscore=\u6d88\u606f\u90e8\u7f72\u5931\u8d25\u3002 \u7ec4\u57fa\u51c6\u540d\u79f0 ''{0}'' \u4e0d\u5e94\u5305\u542b ''_'' (\u4e0b\u5212\u7ebf) -repoadmin_service.msg_base_name_contain_period=\u6d88\u606f\u90e8\u7f72\u5931\u8d25\u3002 \u7ec4\u57fa\u51c6\u540d\u79f0 ''{0}'' \u4e0d\u5e94\u5305\u542b ''.'' (\u53e5\u53f7) +repoadmin_service.msg_base_name_contain_period=\u6d88\u606f\u90e8\u7f72\u5931\u8d25\u3002 \u7ec4\u57fa\u51c6\u540d\u79f0 ''{0}'' \u4e0d\u5e94\u5305\u542b ''\u3002'' (\u53e5\u53f7) diff --git a/repository/src/main/resources/alfresco/messages/system-messages_ja.properties b/repository/src/main/resources/alfresco/messages/system-messages_ja.properties index 389368a4c4..a4014e382e 100755 --- a/repository/src/main/resources/alfresco/messages/system-messages_ja.properties +++ b/repository/src/main/resources/alfresco/messages/system-messages_ja.properties @@ -113,5 +113,5 @@ system.license.err.reloadFailed=\u30e9\u30a4\u30bb\u30f3\u30b9 {0} \u3092\u518d\ # Startup message system.info.startup=Alfresco Content Services \u304c\u8d77\u52d5\u3057\u307e\u3057\u305f ({0}{1}{2})\u3002\u73fe\u5728\u306e\u30d0\u30fc\u30b8\u30e7\u30f3: {3} \u30b9\u30ad\u30fc\u30de {4}\u3002\u30a4\u30f3\u30b9\u30c8\u30fc\u30eb\u3055\u308c\u3066\u3044\u308b\u5143\u306e\u30d0\u30fc\u30b8\u30e7\u30f3: {5} \u30b9\u30ad\u30fc\u30de {6}\u3002 system.warn.readonly=Alfresco Content Services \u306f\u73fe\u5728\u8aad\u307f\u53d6\u308a\u5c02\u7528\u30e2\u30fc\u30c9\u3067\u3059\u3002\u30e9\u30a4\u30bb\u30f3\u30b9\u3092\u78ba\u8a8d\u3057\u3066\u304f\u3060\u3055\u3044\u3002 -system.info.limited_trial=\u30e1\u30e2: \u3053\u308c\u306f Alfresco Content Services \u306e Enterprise \u30d0\u30fc\u30b8\u30e7\u30f3\u306e\u4f53\u9a13\u7248\u3067\u3042\u308b\u305f\u3081\u3001\u4f7f\u7528\u671f\u9593\u304c\u9650\u3089\u308c\u3066\u3044\u307e\u3059\u3002\u3042\u3068 2 \u65e5\u3067\u8aad\u307f\u53d6\u308a\u5c02\u7528\u30e2\u30fc\u30c9\u306b\u306a\u308a\u307e\u3059\u3002\u4f53\u9a13\u7248\u306e\u4f7f\u7528\u671f\u9593\u3092\u3055\u3089\u306b30\u65e5\u9593\u5ef6\u9577\u3059\u308b\u5834\u5408\u306f\u3001https://www.alfresco.com/platform/content-services-ecm/trial/docker \u304b\u3089\u304a\u7533\u3057\u8fbc\u307f\u304f\u3060\u3055\u3044\u3002 +system.info.limited_trial=\u30e1\u30e2: \u3053\u308c\u306f Alfresco Content Services \u306e Enterprise \u30d0\u30fc\u30b8\u30e7\u30f3\u306e\u4f53\u9a13\u7248\u3067\u3042\u308b\u305f\u3081\u3001\u4f7f\u7528\u671f\u9593\u304c\u9650\u3089\u308c\u3066\u3044\u307e\u3059\u3002\u3042\u3068 2 \u65e5\u3067\u8aad\u307f\u53d6\u308a\u5c02\u7528\u30e2\u30fc\u30c9\u306b\u306a\u308a\u307e\u3059\u3002\u4f53\u9a13\u7248\u306e\u4f7f\u7528\u671f\u9593\u3092\u3055\u3089\u306b30\u65e5\u9593\u5ef6\u9577\u3059\u308b\u5834\u5408\u306f\u3001https://www.alfresco.com/platform/content-services-ecm/trial/docker \u304b\u3089\u304a\u7533\u3057\u8fbc\u307f\u304f\u3060\u3055\u3044 # END TRANSLATION diff --git a/repository/src/main/resources/alfresco/messages/transfer-service_zh_CN.properties b/repository/src/main/resources/alfresco/messages/transfer-service_zh_CN.properties index 3a4c6e0349..59a2a7578f 100755 --- a/repository/src/main/resources/alfresco/messages/transfer-service_zh_CN.properties +++ b/repository/src/main/resources/alfresco/messages/transfer-service_zh_CN.properties @@ -21,7 +21,7 @@ transfer_service.receiver.content_file_missing=\u65e0\u6cd5\u4f20\u8f93\uff0c\u5 transfer_service.receiver.failed_to_create_staging_folder=\u65e0\u6cd5\u4e3a\u4f20\u8f93 {0} \u521b\u5efa\u9884\u53d1\u5e03\u76ee\u5f55 transfer_service.receiver.lock_folder_not_found=\u65e0\u6cd5\u627e\u5230\u6307\u5b9a\u7684\u9501\u5b9a\u6587\u4ef6\u5939\uff1a{0} transfer_service.receiver.temp_folder_not_found=\u65e0\u6cd5\u627e\u5230\u4f20\u8f93 {0} \u7684\u6307\u5b9a\u4e34\u65f6\u6587\u4ef6\u5939\uff1a{1} -transfer_service.receiver.lock_unavailable=\u5df2\u7ecf\u4e3a\u53e6\u4e00\u4e2a\u5165\u7ad9\u4f20\u8f93\u8981\u6c42\u4e86\u4f20\u8f93\u9501\u5b9a\u3002 \u65e0\u6cd5\u542f\u52a8\u65b0\u4f20\u8f93. +transfer_service.receiver.lock_unavailable=\u5df2\u7ecf\u4e3a\u53e6\u4e00\u4e2a\u5165\u7ad9\u4f20\u8f93\u8981\u6c42\u4e86\u4f20\u8f93\u9501\u5b9a\u3002 \u65e0\u6cd5\u542f\u52a8\u65b0\u4f20\u8f93\u3002 transfer_service.receiver.record_folder_not_found=\u65e0\u6cd5\u627e\u5230\u6307\u5b9a\u7528\u4e8e\u5b58\u50a8\u5165\u7ad9\u4f20\u8f93\u8bb0\u5f55\u7684\u6587\u4ef6\u5939\uff1a{0} transfer_service.receiver.not_lock_owner=\u5c1d\u8bd5\u6267\u884c\u4f20\u8f93\u64cd\u4f5c\u5931\u8d25\u3002 \u6307\u5b9a\u4f20\u8f93\u672a\u4fdd\u6301\u9501\u5b9a\uff1a{0} transfer_service.receiver.error_ending_transfer=\u8bf7\u6c42\u7ed3\u675f\u4f20\u8f93 ({0}) \u5bfc\u81f4\u4e86\u9519\u8bef\u3002 diff --git a/repository/src/main/resources/alfresco/repository.properties b/repository/src/main/resources/alfresco/repository.properties index d3679580ed..28bf1a0a3f 100644 --- a/repository/src/main/resources/alfresco/repository.properties +++ b/repository/src/main/resources/alfresco/repository.properties @@ -675,7 +675,7 @@ deployment.service.targetLockRefreshTime=60000 # How long to wait in mS from the last communication before deciding that deployment has failed, possibly # the destination is no longer available? deployment.service.targetLockTimeout=3600000 -# Deployment method used to deploy this Alfresco instance (DEFAULT, INSTALLER, DOCKER_COMPOSE, HELM_CHART, ZIP, QUICK_START) +# Deployment method used to deploy this Alfresco instance (DEFAULT, INSTALLER, DOCKER_COMPOSE, HELM_CHART, ANSIBLE, ZIP, QUICK_START) deployment.method=DEFAULT #Invitation Service diff --git a/repository/src/test/java/org/alfresco/repo/content/metadata/AsynchronousExtractorTest.java b/repository/src/test/java/org/alfresco/repo/action/executer/AsynchronousExtractorTest.java similarity index 63% rename from repository/src/test/java/org/alfresco/repo/content/metadata/AsynchronousExtractorTest.java rename to repository/src/test/java/org/alfresco/repo/action/executer/AsynchronousExtractorTest.java index 862e0430cd..9bf0e490b2 100644 --- a/repository/src/test/java/org/alfresco/repo/content/metadata/AsynchronousExtractorTest.java +++ b/repository/src/test/java/org/alfresco/repo/action/executer/AsynchronousExtractorTest.java @@ -30,6 +30,7 @@ import org.alfresco.repo.action.ActionImpl; import org.alfresco.repo.content.MimetypeMap; import org.alfresco.repo.content.metadata.AbstractMappingMetadataExtracter; import org.alfresco.repo.content.metadata.AsynchronousExtractor; +import org.alfresco.repo.content.metadata.MetadataExtracter.OverwritePolicy; import org.alfresco.repo.content.metadata.MetadataExtracterRegistry; import org.alfresco.repo.content.transform.AbstractContentTransformerTest; import org.alfresco.repo.content.transform.TransformerDebug; @@ -37,7 +38,9 @@ import org.alfresco.repo.content.transform.UnsupportedTransformationException; import org.alfresco.repo.rendition2.RenditionDefinition2; import org.alfresco.repo.rendition2.RenditionService2Impl; import org.alfresco.repo.rendition2.TransformClient; +import org.alfresco.repo.search.impl.noindex.NoIndexCategoryServiceImpl; import org.alfresco.repo.security.authentication.AuthenticationComponent; +import org.alfresco.repo.tagging.TaggingServiceImpl; import org.alfresco.repo.transaction.RetryingTransactionHelper; import org.alfresco.service.cmr.dictionary.DictionaryService; import org.alfresco.service.cmr.repository.ContentIOException; @@ -48,8 +51,9 @@ import org.alfresco.service.cmr.repository.MimetypeService; 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.tagging.TaggingService; +import org.alfresco.service.cmr.search.CategoryService; import org.alfresco.service.namespace.NamespacePrefixResolver; +import org.alfresco.service.namespace.NamespaceService; import org.alfresco.service.namespace.QName; import org.alfresco.service.transaction.TransactionService; import org.alfresco.test_category.BaseSpringTestsCategory; @@ -67,15 +71,20 @@ import javax.transaction.NotSupportedException; import javax.transaction.RollbackException; import javax.transaction.SystemException; import javax.transaction.UserTransaction; +import java.io.File; import java.io.IOException; import java.io.InputStream; import java.io.Serializable; +import java.net.URL; import java.text.SimpleDateFormat; 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.Random; +import java.util.Set; import java.util.StringJoiner; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; @@ -108,6 +117,7 @@ public class AsynchronousExtractorTest extends BaseSpringTest private static final ExecutorService executorService = Executors.newCachedThreadPool(); private NodeService nodeService; + private NodeService publicNodeService; private ContentService contentService; private DictionaryService dictionaryService; private MimetypeService mimetypeService; @@ -120,11 +130,13 @@ public class AsynchronousExtractorTest extends BaseSpringTest private TransformerDebug transformerDebug; private TransactionService transactionService; private TransformServiceRegistry transformServiceRegistry; - private TaggingService taggingService; + private TaggingServiceImpl taggingService; private ContentMetadataExtracter contentMetadataExtracter; private ContentMetadataEmbedder contentMetadataEmbedder; private RenditionService2Impl renditionService2; private TransformClient transformClient; + private CategoryService categoryService; + private MockCategoryService mockCategoryService; private long origSize; private Map origProperties; @@ -162,7 +174,7 @@ public class AsynchronousExtractorTest extends BaseSpringTest * @param changedHashcode if specified indicates that the source node content changed or was deleted between * the request to extract or embed and the response. */ - TestAsynchronousExtractor(String mockResult, Integer changedHashcode) + TestAsynchronousExtractor(String mockResult, Integer changedHashcode, OverwritePolicy policy) { this.mockResult = mockResult; this.changedHashcode = changedHashcode; @@ -174,14 +186,17 @@ public class AsynchronousExtractorTest extends BaseSpringTest setContentService(contentService); setTransactionService(transactionService); setTransformServiceRegistry(transformServiceRegistry); + setEnableStringTagging(true); setTaggingService(taggingService); setRegistry(metadataExtracterRegistry); setMimetypeService(mimetypeService); - setDictionaryService(dictionaryService); + setDictionaryService(AsynchronousExtractorTest.this.dictionaryService); setExecutorService(executorService); + setOverwritePolicy(policy); register(); renditionService2.setTransformClient(mockTransformClient); + renditionService2.setAsynchronousExtractor(this); } @Override @@ -261,10 +276,52 @@ public class AsynchronousExtractorTest extends BaseSpringTest } } + /** + * Mock CategoryService that only knows about taggable. Unlike the real implementation it does not call Solr to + * find tag nodes. + */ + private class MockCategoryService extends NoIndexCategoryServiceImpl + { + private NodeRef taggableCat; + + MockCategoryService(NodeService nodeService, NodeService publicNodeService) + { + setNodeService(nodeService); + setPublicNodeService(publicNodeService); + + // Create the required tagging category + NodeRef catContainer = nodeService.createNode(rootNodeRef, + ContentModel.ASSOC_CHILDREN, QName.createQName(NamespaceService.CONTENT_MODEL_1_0_URI, + "categoryContainer"), ContentModel.TYPE_CONTAINER).getChildRef(); + NodeRef catRoot = nodeService.createNode( + catContainer, + ContentModel.ASSOC_CHILDREN, + QName.createQName(NamespaceService.CONTENT_MODEL_1_0_URI, "categoryRoot"), + ContentModel.TYPE_CATEGORYROOT).getChildRef(); + taggableCat = nodeService.createNode( + catRoot, + ContentModel.ASSOC_CATEGORIES, + ContentModel.ASPECT_TAGGABLE, + ContentModel.TYPE_CATEGORY).getChildRef(); + } + + public void setTaggableCat(NodeRef taggableCat) + { + this.taggableCat = taggableCat; + } + + @Override + protected Set getClassificationNodes(StoreRef storeRef, QName qname) + { + return Collections.singleton(taggableCat); + } + } + @Before public void before() throws Exception { nodeService = (NodeService) applicationContext.getBean("nodeService"); + publicNodeService = (NodeService) applicationContext.getBean("NodeService"); contentService = (ContentService) applicationContext.getBean("contentService"); dictionaryService = (DictionaryService) applicationContext.getBean("dictionaryService"); mimetypeService = (MimetypeService) applicationContext.getBean("mimetypeService"); @@ -273,8 +330,10 @@ public class AsynchronousExtractorTest extends BaseSpringTest renditionService2 = (RenditionService2Impl) applicationContext.getBean("renditionService2"); transactionService = (TransactionService) applicationContext.getBean("transactionService"); transformServiceRegistry = (TransformServiceRegistry) applicationContext.getBean("transformServiceRegistry"); - taggingService = (TaggingService) applicationContext.getBean("taggingService"); + taggingService = (TaggingServiceImpl) applicationContext.getBean("taggingService"); transformClient = (TransformClient) applicationContext.getBean("transformClient"); + asynchronousExtractor = (AsynchronousExtractor) applicationContext.getBean("extractor.Asynchronous"); + categoryService = (CategoryService) applicationContext.getBean("CategoryService"); // Create an empty metadata extractor registry, so that if we add one it will be used metadataExtracterRegistry = new MetadataExtracterRegistry(); @@ -284,8 +343,10 @@ public class AsynchronousExtractorTest extends BaseSpringTest contentMetadataExtracter.setContentService(contentService); contentMetadataExtracter.setDictionaryService(dictionaryService); contentMetadataExtracter.setMetadataExtracterRegistry(metadataExtracterRegistry); + contentMetadataExtracter.setTaggingService(taggingService); contentMetadataExtracter.setApplicableTypes(new String[]{ContentModel.TYPE_CONTENT.toString()}); contentMetadataExtracter.setCarryAspectProperties(true); + contentMetadataExtracter.setEnableStringTagging(true); contentMetadataEmbedder = new ContentMetadataEmbedder(); contentMetadataEmbedder.setNodeService(nodeService); @@ -327,6 +388,9 @@ public class AsynchronousExtractorTest extends BaseSpringTest origSize = getSize(nodeRef); + mockCategoryService = new MockCategoryService(nodeService, publicNodeService); + taggingService.setCategoryService(mockCategoryService); + return null; } }); @@ -336,15 +400,18 @@ public class AsynchronousExtractorTest extends BaseSpringTest public void after() throws Exception { renditionService2.setTransformClient(transformClient); + renditionService2.setAsynchronousExtractor(asynchronousExtractor); + taggingService.setCategoryService(categoryService); } private void assertAsyncMetadataExecute(ActionExecuterAbstractBase executor, String mockResult, Integer changedHashcode, long expectedSize, Map expectedProperties, + OverwritePolicy policy, QName... ignoreProperties) throws Exception { - TestAsynchronousExtractor extractor = new TestAsynchronousExtractor(mockResult, changedHashcode); - + TestAsynchronousExtractor extractor = new TestAsynchronousExtractor(mockResult, changedHashcode, policy); + extractor.setEnableStringTagging(true); executeAction(executor, extractor); assertContentSize(nodeRef, origSize, AFTER_CALLING_EXECUTE); assertProperties(nodeRef, origProperties, AFTER_CALLING_EXECUTE, ignoreProperties); @@ -433,35 +500,35 @@ public class AsynchronousExtractorTest extends BaseSpringTest expectedProperties.put(QName.createQName("cm:title", namespacePrefixResolver), "The quick brown fox jumps over the lazy dog"); assertAsyncMetadataExecute(contentMetadataExtracter, "quick/quick.html_metadata.json", - UNCHANGED_HASHCODE, origSize, expectedProperties); + UNCHANGED_HASHCODE, origSize, expectedProperties, OverwritePolicy.PRAGMATIC); } @Test public void testExtractNodeDeleted() throws Exception { assertAsyncMetadataExecute(contentMetadataExtracter, "quick/quick.html_metadata.json", - SOURCE_HAS_NO_CONTENT, origSize, origProperties); + SOURCE_HAS_NO_CONTENT, origSize, origProperties, OverwritePolicy.PRAGMATIC); } @Test public void testExtractContentChanged() throws Exception { assertAsyncMetadataExecute(contentMetadataExtracter, "quick/quick.html_metadata.json", - 1234, origSize, origProperties); + CHANGED_HASHCODE, origSize, origProperties, OverwritePolicy.PRAGMATIC); } @Test public void testExtractTransformFailure() throws Exception { assertAsyncMetadataExecute(contentMetadataExtracter, null, - UNCHANGED_HASHCODE, origSize, origProperties); + UNCHANGED_HASHCODE, origSize, origProperties, OverwritePolicy.PRAGMATIC); } @Test public void testExtractTransformCorrupt() throws Exception { assertAsyncMetadataExecute(contentMetadataExtracter, "quick.html", // not json - UNCHANGED_HASHCODE, origSize, origProperties); + UNCHANGED_HASHCODE, origSize, origProperties, OverwritePolicy.PRAGMATIC); } @Test @@ -471,7 +538,7 @@ public class AsynchronousExtractorTest extends BaseSpringTest // "{http://www.unknown}name": "ignored" - is reported in an ERROR log expectedProperties.put(QName.createQName("cm:author", namespacePrefixResolver), "Used"); assertAsyncMetadataExecute(contentMetadataExtracter, "quick/unknown_namespace_metadata.json", - UNCHANGED_HASHCODE, origSize, expectedProperties); + UNCHANGED_HASHCODE, origSize, expectedProperties, OverwritePolicy.PRAGMATIC); } @Test @@ -488,7 +555,7 @@ public class AsynchronousExtractorTest extends BaseSpringTest expectedProperties.put(QName.createQName("cm:originator", namespacePrefixResolver), "Mark Rogers"); assertAsyncMetadataExecute(contentMetadataExtracter, "quick/quick.msg_metadata.json", - UNCHANGED_HASHCODE, origSize, expectedProperties); + UNCHANGED_HASHCODE, origSize, expectedProperties, OverwritePolicy.PRAGMATIC); Serializable sentDate = properties.get(QName.createQName("cm:sentdate", namespacePrefixResolver)); } @@ -514,7 +581,7 @@ public class AsynchronousExtractorTest extends BaseSpringTest // Note: As the metadata is for eml, an aspect gets added resulting in a second extract because of // ImapContentPolicy.onAddAspect. I cannot see a good way to avoid this. assertAsyncMetadataExecute(contentMetadataExtracter, "quick/quick.eml_metadata.json", - UNCHANGED_HASHCODE, origSize, expectedProperties, + UNCHANGED_HASHCODE, origSize, expectedProperties, OverwritePolicy.PRAGMATIC, // cm:author is not in the quick.eml_metadata.json but is being added by the second extract which thinks // the source mimetype is MimetypeMap.MIMETYPE_PDF, because that is what the before() method sets the // content to. As a result the PdfBox metadata extractor is called, which extracts cm:author. Given that @@ -523,37 +590,253 @@ public class AsynchronousExtractorTest extends BaseSpringTest QName.createQName("cm:author", namespacePrefixResolver)); } - @Test public void testEmbed() throws Exception { + URL resource = getClass().getClassLoader().getResource("quick/quick.html"); + assertNotNull("File not found", resource); + + File file = new File(resource.toURI()); + long fileSize = file.length(); + assertAsyncMetadataExecute(contentMetadataEmbedder, "quick/quick.html", // just replace the pdf with html! - UNCHANGED_HASHCODE, 428, expectedProperties); + UNCHANGED_HASHCODE, fileSize, expectedProperties, OverwritePolicy.PRAGMATIC); } + @Test public void testEmbedNodeDeleted() throws Exception { assertAsyncMetadataExecute(contentMetadataEmbedder, "quick/quick.html", - SOURCE_HAS_NO_CONTENT, origSize, origProperties); + SOURCE_HAS_NO_CONTENT, origSize, origProperties, OverwritePolicy.PRAGMATIC); } @Test public void testEmbedContentChanged() throws Exception { assertAsyncMetadataExecute(contentMetadataEmbedder, "quick/quick.html", - 1234, origSize, origProperties); + CHANGED_HASHCODE, origSize, origProperties, OverwritePolicy.PRAGMATIC); } @Test public void testEmbedTransformFailure() throws Exception { assertAsyncMetadataExecute(contentMetadataEmbedder, null, - UNCHANGED_HASHCODE, origSize, origProperties); + UNCHANGED_HASHCODE, origSize, origProperties, OverwritePolicy.PRAGMATIC); } - // TODO Write tests for: overwritePolicy, enableStringTagging and carryAspectProperties. - // Values are set in AsynchronousExtractor.setMetadata(...) but make use of original code within - // MetadataExtracter and AbstractMappingMetadataExtracter. - // As the tests for exiting extractors are to be removed in ACS 7.0, it is possible that they were being used - // to test these values. + @Test + public void testOverwritePolicyEager() throws Exception + { + QName author = QName.createQName("cm:author", namespacePrefixResolver); + + transactionService.getRetryingTransactionHelper().doInTransaction(() -> { + Map properties = nodeService.getProperties(nodeRef); + properties.put(author, "Original author"); + nodeService.addProperties(nodeRef, properties); + + return null; + }); + + origProperties.put(author, "Original author"); + + expectedProperties.put(author, "Nevin Nollop"); + + assertAsyncMetadataExecute(contentMetadataExtracter, "quick/quick.eager_policy_metadata.json", + UNCHANGED_HASHCODE, origSize, expectedProperties, OverwritePolicy.EAGER); + } + + @Test + public void testOverwritePolicyCautious() throws Exception + { + QName author = QName.createQName("cm:author", namespacePrefixResolver); + QName title = QName.createQName("cm:title", namespacePrefixResolver); + + transactionService.getRetryingTransactionHelper().doInTransaction(() -> { + Map properties = nodeService.getProperties(nodeRef); + properties.put(author, "Original author"); + nodeService.addProperties(nodeRef, properties); + + return null; + }); + + origProperties.put(author, "Original author"); + + expectedProperties.put(author, "Original author"); + expectedProperties.put(title, "The quick brown fox jumps over the lazy dog"); + + assertAsyncMetadataExecute(contentMetadataExtracter, "quick/quick.cautious_policy_metadata.json", + UNCHANGED_HASHCODE, origSize, expectedProperties, OverwritePolicy.CAUTIOUS); + } + + @Test + public void testOverwritePolicyPrudent() throws Exception + { + QName author = QName.createQName("cm:author", namespacePrefixResolver); + QName title = QName.createQName("cm:title", namespacePrefixResolver); + QName description = QName.createQName("cm:description", namespacePrefixResolver); + QName audio = QName.createQName("audio:audio", namespacePrefixResolver); + + transactionService.getRetryingTransactionHelper().doInTransaction(() -> { + Map properties = nodeService.getProperties(nodeRef); + properties.put(author, "Original author"); + properties.put(title, ""); // will be changed + properties.put(audio, "Default audio"); // will not be changed because it's a media property + nodeService.addProperties(nodeRef, properties); + + return null; + }); + + origProperties.put(author, "Original author"); + origProperties.put(title, ""); + origProperties.put(audio, "Default audio"); + + expectedProperties.put(author, "Original author"); + expectedProperties.put(title, "The quick brown fox jumps over the lazy dog"); + expectedProperties.put(description, "Gym class featuring a brown fox and lazy dog"); + expectedProperties.put(audio, "Default audio"); + + assertAsyncMetadataExecute(contentMetadataExtracter, "quick/quick.prudent_policy_metadata.json", + UNCHANGED_HASHCODE, origSize, expectedProperties, OverwritePolicy.PRUDENT); + } + + @Test + public void testOverwritePolicyPragmatic() throws Exception + { + QName author = QName.createQName("cm:author", namespacePrefixResolver); + QName title = QName.createQName("cm:title", namespacePrefixResolver); + QName description = QName.createQName("cm:description", namespacePrefixResolver); + QName audio = QName.createQName("audio:audio", namespacePrefixResolver); + + transactionService.getRetryingTransactionHelper().doInTransaction(() -> { + Map properties = nodeService.getProperties(nodeRef); + properties.put(author, "Original author"); + properties.put(title, ""); // will be changed + properties.put(audio, "Default audio"); // will be changed using PRAGMATIC policy + nodeService.addProperties(nodeRef, properties); + + return null; + }); + + origProperties.put(author, "Original author"); + origProperties.put(title, ""); + origProperties.put(audio, "Default audio"); + + expectedProperties.put(author, "Original author"); + expectedProperties.put(title, "The quick brown fox jumps over the lazy dog"); + expectedProperties.put(description, "Gym class featuring a brown fox and lazy dog"); + expectedProperties.put(audio, "New audio"); + + assertAsyncMetadataExecute(contentMetadataExtracter, "quick/quick.pragmatic_policy_metadata.json", + UNCHANGED_HASHCODE, origSize, expectedProperties, OverwritePolicy.PRAGMATIC); + } + + @Test + public void testCarryAspectFalse() throws Exception + { + QName title = QName.createQName("cm:title", namespacePrefixResolver); + QName author = QName.createQName("cm:author", namespacePrefixResolver); + QName description = QName.createQName("cm:description", namespacePrefixResolver); + + transactionService.getRetryingTransactionHelper().doInTransaction(() -> { + Map properties = nodeService.getProperties(nodeRef); + properties.put(title, "Default title"); + nodeService.addProperties(nodeRef, properties); + return null; + }); + + origProperties.put(title, "Default title"); + + expectedProperties.put(author, "Nevin Nollop"); + expectedProperties.put(description, "Gym class featuring a brown fox and lazy dog"); + + assertAsyncMetadataExecute(contentMetadataExtracter, "quick/quick.carryAspectFalse_metadata.json", + UNCHANGED_HASHCODE, origSize, expectedProperties, OverwritePolicy.PRAGMATIC); + + transactionService.getRetryingTransactionHelper().doInTransaction(() -> { + Map properties = nodeService.getProperties(nodeRef); + assertFalse("Title should be removed from properties because the extracted value is null", + properties.containsKey(title)); + return null; + }); + } + + @Test + public void testCarryAspectTrue() throws Exception + { + QName title = QName.createQName("cm:title", namespacePrefixResolver); + QName author = QName.createQName("cm:author", namespacePrefixResolver); + QName description = QName.createQName("cm:description", namespacePrefixResolver); + + transactionService.getRetryingTransactionHelper().doInTransaction(() -> { + Map properties = nodeService.getProperties(nodeRef); + properties.put(title, "Default title"); + nodeService.addProperties(nodeRef, properties); + return null; + }); + + origProperties.put(title, "Default title"); + + expectedProperties.put(author, "Nevin Nollop"); + expectedProperties.put(title, "Default title"); + expectedProperties.put(description, "Gym class featuring a brown fox and lazy dog"); + + assertAsyncMetadataExecute(contentMetadataExtracter, "quick/quick.carryAspectTrue_metadata.json", + UNCHANGED_HASHCODE, origSize, expectedProperties, OverwritePolicy.PRAGMATIC); + + transactionService.getRetryingTransactionHelper().doInTransaction(() -> { + Map properties = nodeService.getProperties(nodeRef); + assertTrue("Title should NOT be removed from properties because carryAspectProperties is true", + properties.containsKey(title)); + return null; + }); + } + + @Test + public void testExtractTagging() throws Exception + { + QName taggable = QName.createQName("cm:taggable", namespacePrefixResolver); + + contentMetadataExtracter.setEnableStringTagging(true); + transactionService.getRetryingTransactionHelper().doInTransaction(() -> { + Map properties = nodeService.getProperties(nodeRef); + assertFalse(properties.containsKey(ContentModel.PROP_TAGS)); + return null;}); + + List expectedTags = Arrays.asList("tag1", "tag2", "tag3"); + assertAsyncMetadataExecute(contentMetadataExtracter, "quick/quick.tagging_metadata.json", + UNCHANGED_HASHCODE, origSize, expectedProperties, OverwritePolicy.PRAGMATIC, taggable); + + List actualTags = transactionService.getRetryingTransactionHelper().doInTransaction(() -> { + Map properties = nodeService.getProperties(nodeRef); + assertTrue(properties.containsKey(ContentModel.PROP_TAGS)); + return taggingService.getTags(nodeRef); + }); + + for (String expectedTag : expectedTags) + { + assertTrue("Expected tag " + expectedTag + " not in " + actualTags, actualTags.contains(expectedTag)); + } + } + + @Test + public void testExtractTaggingWhenDisabled() throws Exception + { + contentMetadataExtracter.setEnableStringTagging(false); + transactionService.getRetryingTransactionHelper().doInTransaction(() -> { + Map properties = nodeService.getProperties(nodeRef); + assertFalse(properties.containsKey(ContentModel.PROP_TAGS)); + return null; + }); + + assertAsyncMetadataExecute(contentMetadataExtracter, "quick/quick.tagging_metadata_enable_false.json", + UNCHANGED_HASHCODE, origSize, expectedProperties, OverwritePolicy.PRAGMATIC); + + List tags = transactionService.getRetryingTransactionHelper().doInTransaction(() -> { + Map properties = nodeService.getProperties(nodeRef); + assertFalse(properties.containsKey(ContentModel.PROP_TAGS)); + return taggingService.getTags(nodeRef); + }); + + assertEquals("Unexpected tags", 0, tags.size()); + } } \ No newline at end of file diff --git a/repository/src/test/java/org/alfresco/repo/event2/UpdateRepoEventIT.java b/repository/src/test/java/org/alfresco/repo/event2/UpdateRepoEventIT.java index a9ab2e5b50..f1802e165b 100644 --- a/repository/src/test/java/org/alfresco/repo/event2/UpdateRepoEventIT.java +++ b/repository/src/test/java/org/alfresco/repo/event2/UpdateRepoEventIT.java @@ -30,6 +30,7 @@ import java.io.Serializable; import java.util.Collection; import java.util.HashMap; import java.util.HashSet; +import java.util.List; import java.util.Map; import java.util.Set; @@ -978,4 +979,32 @@ public class UpdateRepoEventIT extends AbstractContextAwareRepoEvent assertEquals(1, aspectsBefore.size()); assertTrue(aspectsBefore.contains("cm:auditable")); } + + @Test + public void testAddAndRemovePropertyInTheSameTransaction() + { + final NodeRef nodeRef = createNode(ContentModel.TYPE_CONTENT); + + checkNumOfEvents(1); + + NodeResource resource = getNodeResource(1); + // Check properties + assertTrue(resource.getProperties().isEmpty()); + + // Add and remove cm:userName property + retryingTransactionHelper.doInTransaction(() -> { + Map properties = Map.of(ContentModel.PROP_USERNAME, "user1"); + nodeService.addProperties(nodeRef, properties); + nodeService.removeProperty(nodeRef, ContentModel.PROP_USERNAME); + return null; + }); + + // There should only be a create event + resource = getNodeResource(1); + assertTrue(resource.getProperties().isEmpty()); + + // Check there isn't a node update event + List>> nodeUpdatedEvents = getFilteredEvents(EventType.NODE_UPDATED); + assertEquals(0, nodeUpdatedEvents.size()); + } } diff --git a/repository/src/test/resources/quick/quick.carryAspectFalse_metadata.json b/repository/src/test/resources/quick/quick.carryAspectFalse_metadata.json new file mode 100644 index 0000000000..979499b152 --- /dev/null +++ b/repository/src/test/resources/quick/quick.carryAspectFalse_metadata.json @@ -0,0 +1,6 @@ +{ + "{http://www.alfresco.org/model/content/1.0}author": "Nevin Nollop", + "{http://www.alfresco.org/model/content/1.0}description": "Gym class featuring a brown fox and lazy dog", + "{http://www.alfresco.org/model/content/1.0}title": null, + "sys:carryAspectProperties": "false" +} diff --git a/repository/src/test/resources/quick/quick.carryAspectTrue_metadata.json b/repository/src/test/resources/quick/quick.carryAspectTrue_metadata.json new file mode 100644 index 0000000000..2e55988675 --- /dev/null +++ b/repository/src/test/resources/quick/quick.carryAspectTrue_metadata.json @@ -0,0 +1,6 @@ +{ + "{http://www.alfresco.org/model/content/1.0}author": "Nevin Nollop", + "{http://www.alfresco.org/model/content/1.0}description": "Gym class featuring a brown fox and lazy dog", + "{http://www.alfresco.org/model/content/1.0}title": null, + "sys:carryAspectProperties": "true" +} diff --git a/repository/src/test/resources/quick/quick.cautious_policy_metadata.json b/repository/src/test/resources/quick/quick.cautious_policy_metadata.json new file mode 100644 index 0000000000..032b0015eb --- /dev/null +++ b/repository/src/test/resources/quick/quick.cautious_policy_metadata.json @@ -0,0 +1,5 @@ +{ + "sys:overwritePolicy": "CAUTIOUS", + "{http://www.alfresco.org/model/content/1.0}author": "Nevin Nollop", + "{http://www.alfresco.org/model/content/1.0}title": "The quick brown fox jumps over the lazy dog" +} diff --git a/repository/src/test/resources/quick/quick.eager_policy_metadata.json b/repository/src/test/resources/quick/quick.eager_policy_metadata.json new file mode 100644 index 0000000000..0f19de6a17 --- /dev/null +++ b/repository/src/test/resources/quick/quick.eager_policy_metadata.json @@ -0,0 +1,4 @@ +{ + "sys:overwritePolicy": "EAGER", + "{http://www.alfresco.org/model/content/1.0}author": "Nevin Nollop" +} diff --git a/repository/src/test/resources/quick/quick.pragmatic_policy_metadata.json b/repository/src/test/resources/quick/quick.pragmatic_policy_metadata.json new file mode 100644 index 0000000000..787a748ba7 --- /dev/null +++ b/repository/src/test/resources/quick/quick.pragmatic_policy_metadata.json @@ -0,0 +1,7 @@ +{ + "sys:overwritePolicy": "PRAGMATIC", + "{http://www.alfresco.org/model/content/1.0}author": "Nevin Nollop", + "{http://www.alfresco.org/model/content/1.0}title": "The quick brown fox jumps over the lazy dog", + "{http://www.alfresco.org/model/content/1.0}description": "Gym class featuring a brown fox and lazy dog", + "{http://www.alfresco.org/model/audio/1.0}audio": "New audio" +} diff --git a/repository/src/test/resources/quick/quick.prudent_policy_metadata.json b/repository/src/test/resources/quick/quick.prudent_policy_metadata.json new file mode 100644 index 0000000000..d79c9d2047 --- /dev/null +++ b/repository/src/test/resources/quick/quick.prudent_policy_metadata.json @@ -0,0 +1,7 @@ +{ + "sys:overwritePolicy": "PRUDENT", + "{http://www.alfresco.org/model/content/1.0}author": "Nevin Nollop", + "{http://www.alfresco.org/model/content/1.0}title": "The quick brown fox jumps over the lazy dog", + "{http://www.alfresco.org/model/content/1.0}description": "Gym class featuring a brown fox and lazy dog", + "{http://www.alfresco.org/model/audio/1.0}audio": "New audio" +} diff --git a/repository/src/test/resources/quick/quick.tagging_metadata.json b/repository/src/test/resources/quick/quick.tagging_metadata.json new file mode 100644 index 0000000000..35e8ebcecb --- /dev/null +++ b/repository/src/test/resources/quick/quick.tagging_metadata.json @@ -0,0 +1,5 @@ +{ + "sys:enableStringTagging": "true", + "sys:stringTaggingSeparators": ";,\",\",\\|", + "{http://www.alfresco.org/model/content/1.0}taggable": "tag1;tag2;tag3" +} diff --git a/repository/src/test/resources/quick/quick.tagging_metadata_enable_false.json b/repository/src/test/resources/quick/quick.tagging_metadata_enable_false.json new file mode 100644 index 0000000000..febdf92029 --- /dev/null +++ b/repository/src/test/resources/quick/quick.tagging_metadata_enable_false.json @@ -0,0 +1,5 @@ +{ + "sys:enableStringTagging": "false", + "sys:stringTaggingSeparators": ";,\",\",\\|", + "{http://www.alfresco.org/model/content/1.0}taggable": "tag1;tag2;tag3" +}