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"
+}