mirror of
https://github.com/Alfresco/alfresco-community-repo.git
synced 2025-09-10 14:11:58 +00:00
Compare commits
198 Commits
Author | SHA1 | Date | |
---|---|---|---|
|
3b36d26609 | ||
|
76ce1db950 | ||
|
cd11c54422 | ||
|
bd4bdab0ff | ||
|
9ad7175237 | ||
|
15b5bf93af | ||
|
bb6d3b0716 | ||
|
ac68fbdf09 | ||
|
3dae151864 | ||
|
ae4d0f695e | ||
|
1b44b5825c | ||
|
a51a4e7cf2 | ||
|
d82b35a2c6 | ||
|
2b081589ea | ||
|
d6974d8504 | ||
|
f319377697 | ||
|
72801ae27f | ||
|
bc4bc6703f | ||
|
f501050285 | ||
|
a38c428a9e | ||
|
ee2b80ab13 | ||
|
bfda737651 | ||
|
280e29f326 | ||
|
d60d8e1f5b | ||
|
40679b3f59 | ||
|
c3adbcdf3f | ||
|
1487a8ecca | ||
|
0e0a7831be | ||
|
b7ed25a741 | ||
|
bec9cf86b1 | ||
|
ec2a8962a1 | ||
|
ea5ef05197 | ||
|
29df0e9bb2 | ||
|
dee9b51274 | ||
|
0f985d5ded | ||
|
bb1f5d18b6 | ||
|
5c05001256 | ||
|
67d03b6996 | ||
|
1d1563c1f6 | ||
|
ad965d49fb | ||
|
11e3d2d549 | ||
|
b68b565a4f | ||
|
5963ccffdd | ||
|
5265105149 | ||
|
abd9ec4eef | ||
|
397539bbbe | ||
|
1287eefd4f | ||
|
637415554c | ||
|
7231b20c41 | ||
|
fea6b0dc4f | ||
|
8c97443073 | ||
|
22d0f97ce3 | ||
|
50ee974ddf | ||
|
984bbbd8bf | ||
|
8b57af9cb5 | ||
|
b06924908d | ||
|
e2bba31603 | ||
|
3b65b30bd5 | ||
|
2177ffcea8 | ||
|
2ce43b09d8 | ||
|
05660a94ab | ||
|
3e4c191ff9 | ||
|
8a3817649b | ||
|
82b737062b | ||
|
e6b32e7e61 | ||
|
b9979caf40 | ||
|
e6367cdc70 | ||
|
eceba2679c | ||
|
cf4abfe101 | ||
|
2a5f03889e | ||
|
0e11091d19 | ||
|
3cb838865a | ||
|
f89d85b431 | ||
|
9d91ee4cae | ||
|
1e792eb625 | ||
|
3d881b9022 | ||
|
b890af95b4 | ||
|
706aac3ffa | ||
|
22230ea04b | ||
|
798a3faa5b | ||
|
105c83ca7e | ||
|
64b9564dc7 | ||
|
a3ccf20a74 | ||
|
fa7f74f2ee | ||
|
30e339db12 | ||
|
8f5aed72d2 | ||
|
dc0582b1ab | ||
|
92eb339237 | ||
|
3b6983170b | ||
|
338e2b93dd | ||
|
fea50a2206 | ||
|
85b5b2660e | ||
|
085e2acaac | ||
|
58b4d9f18f | ||
|
336e7cf817 | ||
|
13a2bea2ce | ||
|
9139500fa5 | ||
|
2a43657e2f | ||
|
8145e2ea39 | ||
|
db1bc1d9e2 | ||
|
2f0f3aa310 | ||
|
873508bfb7 | ||
|
e71f681e6e | ||
|
4cb4f6f023 | ||
|
98aebf77ad | ||
|
25b7d8c480 | ||
|
641ea57895 | ||
|
c0d2d444ca | ||
|
212c2cefec | ||
|
6bacd51841 | ||
|
2db4bf0a90 | ||
|
7381e578a8 | ||
|
44a8acddd0 | ||
|
9bcf7eed9a | ||
|
d540a25a88 | ||
|
f113724f9a | ||
|
ad04e79141 | ||
|
51ed184126 | ||
|
5d740eba37 | ||
|
5c9cc4dd04 | ||
|
430e92dbce | ||
|
f0aa9b6004 | ||
|
4471654e40 | ||
|
e1fa082b6e | ||
|
903672b82b | ||
|
611b89e544 | ||
|
9205486959 | ||
|
47e58e1303 | ||
|
398a03f3dd | ||
|
4338693f81 | ||
|
449fe34856 | ||
|
930fbe4cda | ||
|
e45d223124 | ||
|
4e0e797d9f | ||
|
5418c3936d | ||
|
f876016bb9 | ||
|
00186e5594 | ||
|
d6c39cc990 | ||
|
5a2bb6db5b | ||
|
351c3ac73a | ||
|
62f72f92be | ||
|
faa0ff0e40 | ||
|
7d6037a85f | ||
|
2aa5f162cc | ||
|
13bdfe6ac3 | ||
|
d0dbef04f4 | ||
|
d8f086640a | ||
|
452fa1d2d8 | ||
|
68e9d2bc7d | ||
|
0e083bbf6b | ||
|
3a17a30e8c | ||
|
c65a56b945 | ||
|
aa6c0fb2a9 | ||
|
235bef78a9 | ||
|
f80767359f | ||
|
8cd843df9d | ||
|
ce30495376 | ||
|
5b73d52753 | ||
|
7bb829d756 | ||
|
3bedfb2c33 | ||
|
9058b5923b | ||
|
07084b22f9 | ||
|
5c884c8552 | ||
|
becf46f58a | ||
|
839afbbc1c | ||
|
daacceebd2 | ||
|
cc11c13e54 | ||
|
9e1ece208f | ||
|
82ba856d2c | ||
|
8278c9ced2 | ||
|
4e9f362482 | ||
|
68bc3c5391 | ||
|
e484ede6c4 | ||
|
cecc517674 | ||
|
43224ade71 | ||
|
5ec2d430e0 | ||
|
b0ff60adba | ||
|
7a7a9f0964 | ||
|
720256159f | ||
|
cbc38c59c9 | ||
|
b061dd4095 | ||
|
75bf1bff01 | ||
|
d85eecddef | ||
|
96088f2643 | ||
|
b6c955f28d | ||
|
b796441f8f | ||
|
b3b6f72286 | ||
|
cec820bc88 | ||
|
49d7f5c2b1 | ||
|
1cc351b1d5 | ||
|
c6be5bc4da | ||
|
054e6fccce | ||
|
c31000d842 | ||
|
e613b268f7 | ||
|
d1d2cfb400 | ||
|
63770758ae | ||
|
44280f1aee | ||
|
50b9f67a32 |
21
.github/dependabot.yml
vendored
21
.github/dependabot.yml
vendored
@@ -38,27 +38,6 @@ updates:
|
||||
- dependency-name: org.activiti:activiti-spring
|
||||
versions:
|
||||
- ">= 7.1.a, < 7.2"
|
||||
- dependency-name: org.apache.camel:camel-activemq
|
||||
versions:
|
||||
- "> 3.7.1"
|
||||
- dependency-name: org.apache.camel:camel-amqp
|
||||
versions:
|
||||
- "> 3.7.1"
|
||||
- dependency-name: org.apache.camel:camel-direct
|
||||
versions:
|
||||
- "> 3.7.1"
|
||||
- dependency-name: org.apache.camel:camel-directvm
|
||||
versions:
|
||||
- "> 3.7.1"
|
||||
- dependency-name: org.apache.camel:camel-jackson
|
||||
versions:
|
||||
- "> 3.7.1"
|
||||
- dependency-name: org.apache.camel:camel-mock
|
||||
versions:
|
||||
- "> 3.7.1"
|
||||
- dependency-name: org.apache.camel:camel-spring
|
||||
versions:
|
||||
- "> 3.7.1"
|
||||
- dependency-name: org.apache.chemistry.opencmis:chemistry-opencmis-client-impl
|
||||
versions:
|
||||
- "> 1.0.0"
|
||||
|
20
.travis.yml
20
.travis.yml
@@ -53,14 +53,14 @@ jobs:
|
||||
if: commit_message !~ /\[skip repo\]/
|
||||
script:
|
||||
- travis_retry mvn -B test -pl core,data-model
|
||||
- travis_retry mvn -B test -pl repository -Dtest=AllUnitTestsSuite
|
||||
- travis_retry mvn -B test -pl "repository,mmt" "-Dtest=AllUnitTestsSuite,AllMmtUnitTestSuite"
|
||||
|
||||
- name: "Repository - AppContext01TestSuite"
|
||||
if: commit_message !~ /\[skip repo\]/
|
||||
before_script:
|
||||
- docker run -d -p 5433:5432 -e POSTGRES_PASSWORD=alfresco -e POSTGRES_USER=alfresco -e POSTGRES_DB=alfresco postgres:13.3 postgres -c 'max_connections=300'
|
||||
- docker run -d -p 61616:61616 -p 5672:5672 alfresco/alfresco-activemq:5.16.1
|
||||
- docker run -d -p 8090:8090 -e JAVA_OPTS=" -Xms256m -Xmx256m" alfresco/alfresco-transform-core-aio:2.5.5-A1
|
||||
- docker run -d -p 8090:8090 -e JAVA_OPTS=" -Xms256m -Xmx256m" alfresco/alfresco-transform-core-aio:2.5.7-A6
|
||||
script: travis_wait 20 mvn -B test -pl repository -Dtest=AppContext01TestSuite -Ddb.driver=org.postgresql.Driver -Ddb.name=alfresco -Ddb.url=jdbc:postgresql://localhost:5433/alfresco -Ddb.username=alfresco -Ddb.password=alfresco
|
||||
|
||||
- name: "Repository - AppContext02TestSuite"
|
||||
@@ -75,7 +75,7 @@ jobs:
|
||||
before_script:
|
||||
- docker run -d -p 5433:5432 -e POSTGRES_PASSWORD=alfresco -e POSTGRES_USER=alfresco -e POSTGRES_DB=alfresco postgres:13.3 postgres -c 'max_connections=300'
|
||||
- docker run -d -p 61616:61616 -p 5672:5672 alfresco/alfresco-activemq:5.16.1
|
||||
- docker run -d -p 8090:8090 -e JAVA_OPTS=" -Xms256m -Xmx256m" alfresco/alfresco-transform-core-aio:2.5.5-A1
|
||||
- docker run -d -p 8090:8090 -e JAVA_OPTS=" -Xms256m -Xmx256m" alfresco/alfresco-transform-core-aio:2.5.7-A6
|
||||
script: travis_wait 20 mvn -B test -pl repository -Dtest=AppContext03TestSuite -Ddb.driver=org.postgresql.Driver -Ddb.name=alfresco -Ddb.url=jdbc:postgresql://localhost:5433/alfresco -Ddb.username=alfresco -Ddb.password=alfresco
|
||||
|
||||
- name: "Repository - AppContext04TestSuite"
|
||||
@@ -83,7 +83,7 @@ jobs:
|
||||
before_script:
|
||||
- docker run -d -p 5433:5432 -e POSTGRES_PASSWORD=alfresco -e POSTGRES_USER=alfresco -e POSTGRES_DB=alfresco postgres:13.3 postgres -c 'max_connections=300'
|
||||
- docker run -d -p 61616:61616 -p 5672:5672 alfresco/alfresco-activemq:5.16.1
|
||||
- docker run -d -p 8090:8090 -e JAVA_OPTS=" -Xms256m -Xmx256m" alfresco/alfresco-transform-core-aio:2.5.5-A1
|
||||
- docker run -d -p 8090:8090 -e JAVA_OPTS=" -Xms256m -Xmx256m" alfresco/alfresco-transform-core-aio:2.5.7-A6
|
||||
script: travis_wait 20 mvn -B test -pl repository -Dtest=AppContext04TestSuite -Ddb.driver=org.postgresql.Driver -Ddb.name=alfresco -Ddb.url=jdbc:postgresql://localhost:5433/alfresco -Ddb.username=alfresco -Ddb.password=alfresco
|
||||
|
||||
- name: "Repository - AppContext05TestSuite"
|
||||
@@ -102,7 +102,7 @@ jobs:
|
||||
before_script:
|
||||
- docker run -d -p 5433:5432 -e POSTGRES_PASSWORD=alfresco -e POSTGRES_USER=alfresco -e POSTGRES_DB=alfresco postgres:13.3 postgres -c 'max_connections=300'
|
||||
- docker run -d -p 61616:61616 -p 5672:5672 alfresco/alfresco-activemq:5.16.1
|
||||
- docker run -d -p 8090:8090 -e JAVA_OPTS=" -Xms256m -Xmx256m" alfresco/alfresco-transform-core-aio:2.5.5-A1
|
||||
- docker run -d -p 8090:8090 -e JAVA_OPTS=" -Xms256m -Xmx256m" alfresco/alfresco-transform-core-aio:2.5.7-A6
|
||||
script: travis_wait 20 mvn -B test -pl repository -Dtest=AppContext06TestSuite -Ddb.driver=org.postgresql.Driver -Ddb.name=alfresco -Ddb.url=jdbc:postgresql://localhost:5433/alfresco -Ddb.username=alfresco -Ddb.password=alfresco
|
||||
|
||||
- name: "Repository - AppContextExtraTestSuite"
|
||||
@@ -110,7 +110,7 @@ jobs:
|
||||
before_script:
|
||||
- docker run -d -p 5433:5432 -e POSTGRES_PASSWORD=alfresco -e POSTGRES_USER=alfresco -e POSTGRES_DB=alfresco postgres:13.3 postgres -c 'max_connections=300'
|
||||
- docker run -d -p 61616:61616 -p 5672:5672 alfresco/alfresco-activemq:5.16.1
|
||||
- docker run -d -p 8090:8090 -e JAVA_OPTS=" -Xms256m -Xmx256m" alfresco/alfresco-transform-core-aio:2.5.5-A1
|
||||
- docker run -d -p 8090:8090 -e JAVA_OPTS=" -Xms256m -Xmx256m" alfresco/alfresco-transform-core-aio:2.5.7-A6
|
||||
script: travis_wait 20 mvn -B test -pl repository -Dtest=AppContextExtraTestSuite -Ddb.driver=org.postgresql.Driver -Ddb.name=alfresco -Ddb.url=jdbc:postgresql://localhost:5433/alfresco -Ddb.username=alfresco -Ddb.password=alfresco
|
||||
|
||||
- name: "Repository - MiscContextTestSuite"
|
||||
@@ -118,7 +118,7 @@ jobs:
|
||||
before_script:
|
||||
- docker run -d -p 5433:5432 -e POSTGRES_PASSWORD=alfresco -e POSTGRES_USER=alfresco -e POSTGRES_DB=alfresco postgres:13.3 postgres -c 'max_connections=300'
|
||||
- docker run -d -p 61616:61616 -p 5672:5672 alfresco/alfresco-activemq:5.16.1
|
||||
- docker run -d -p 8090:8090 -e JAVA_OPTS=" -Xms256m -Xmx256m" alfresco/alfresco-transform-core-aio:2.5.5-A1
|
||||
- docker run -d -p 8090:8090 -e JAVA_OPTS=" -Xms256m -Xmx256m" alfresco/alfresco-transform-core-aio:2.5.7-A6
|
||||
script: travis_wait 20 mvn -B test -pl repository -Dtest=MiscContextTestSuite -Ddb.driver=org.postgresql.Driver -Ddb.name=alfresco -Ddb.url=jdbc:postgresql://localhost:5433/alfresco -Ddb.username=alfresco -Ddb.password=alfresco
|
||||
|
||||
- name: "Repository - SearchTestSuite"
|
||||
@@ -241,7 +241,7 @@ jobs:
|
||||
before_script:
|
||||
- docker run -d -p 5433:5432 -e POSTGRES_PASSWORD=alfresco -e POSTGRES_USER=alfresco -e POSTGRES_DB=alfresco postgres:13.3 postgres -c 'max_connections=300'
|
||||
- docker run -d -p 61616:61616 -p 5672:5672 alfresco/alfresco-activemq:5.16.1
|
||||
- docker run -d -p 8090:8090 -e JAVA_OPTS=" -Xms256m -Xmx256m" alfresco/alfresco-transform-core-aio:2.5.5-A1
|
||||
- docker run -d -p 8090:8090 -e JAVA_OPTS=" -Xms256m -Xmx256m" alfresco/alfresco-transform-core-aio:2.5.7-A6
|
||||
script: travis_wait 20 mvn -B test -pl remote-api -Dtest=AppContext02TestSuite -Ddb.driver=org.postgresql.Driver -Ddb.name=alfresco -Ddb.url=jdbc:postgresql://localhost:5433/alfresco -Ddb.username=alfresco -Ddb.password=alfresco
|
||||
|
||||
- name: "Remote-api - AppContext03TestSuite"
|
||||
@@ -249,7 +249,7 @@ jobs:
|
||||
before_script:
|
||||
- docker run -d -p 5433:5432 -e POSTGRES_PASSWORD=alfresco -e POSTGRES_USER=alfresco -e POSTGRES_DB=alfresco postgres:13.3 postgres -c 'max_connections=300'
|
||||
- docker run -d -p 61616:61616 -p 5672:5672 alfresco/alfresco-activemq:5.16.1
|
||||
- docker run -d -p 8090:8090 -e JAVA_OPTS=" -Xms256m -Xmx256m" alfresco/alfresco-transform-core-aio:2.5.5-A1
|
||||
- docker run -d -p 8090:8090 -e JAVA_OPTS=" -Xms256m -Xmx256m" alfresco/alfresco-transform-core-aio:2.5.7-A6
|
||||
script: travis_wait 20 mvn -B test -pl remote-api -Dtest=AppContext03TestSuite -Ddb.driver=org.postgresql.Driver -Ddb.name=alfresco -Ddb.url=jdbc:postgresql://localhost:5433/alfresco -Ddb.username=alfresco -Ddb.password=alfresco
|
||||
|
||||
- name: "Remote-api - AppContext04TestSuite"
|
||||
@@ -257,7 +257,7 @@ jobs:
|
||||
before_script:
|
||||
- docker run -d -p 5433:5432 -e POSTGRES_PASSWORD=alfresco -e POSTGRES_USER=alfresco -e POSTGRES_DB=alfresco postgres:13.3 postgres -c 'max_connections=300'
|
||||
- docker run -d -p 61616:61616 -p 5672:5672 alfresco/alfresco-activemq:5.16.1
|
||||
- docker run -d -p 8090:8090 -e JAVA_OPTS=" -Xms256m -Xmx256m" alfresco/alfresco-transform-core-aio:2.5.5-A1
|
||||
- docker run -d -p 8090:8090 -e JAVA_OPTS=" -Xms256m -Xmx256m" alfresco/alfresco-transform-core-aio:2.5.7-A6
|
||||
script: travis_wait 20 mvn -B test -pl remote-api -Dtest=AppContext04TestSuite -Ddb.driver=org.postgresql.Driver -Ddb.name=alfresco -Ddb.url=jdbc:postgresql://localhost:5433/alfresco -Ddb.username=alfresco -Ddb.password=alfresco
|
||||
|
||||
- name: "Remote-api - AppContextExtraTestSuite"
|
||||
|
@@ -7,7 +7,7 @@
|
||||
<parent>
|
||||
<groupId>org.alfresco</groupId>
|
||||
<artifactId>alfresco-community-repo-amps</artifactId>
|
||||
<version>14.73</version>
|
||||
<version>14.128</version>
|
||||
</parent>
|
||||
|
||||
<modules>
|
||||
@@ -21,6 +21,7 @@
|
||||
|
||||
<license.update.dryrun>true</license.update.dryrun>
|
||||
<license.verbose>false</license.verbose>
|
||||
<license.failOnNotUptodateHeader>true</license.failOnNotUptodateHeader>
|
||||
</properties>
|
||||
|
||||
<build>
|
||||
@@ -70,7 +71,7 @@
|
||||
<!-- dry run options -->
|
||||
<dryRun>${license.update.dryrun}</dryRun>
|
||||
<failOnMissingHeader>true</failOnMissingHeader>
|
||||
<failOnNotUptodateHeader>true</failOnNotUptodateHeader>
|
||||
<failOnNotUptodateHeader>${license.failOnNotUptodateHeader}</failOnNotUptodateHeader>
|
||||
|
||||
<!-- default root -->
|
||||
<roots>
|
||||
|
@@ -7,7 +7,7 @@
|
||||
<parent>
|
||||
<groupId>org.alfresco</groupId>
|
||||
<artifactId>alfresco-governance-services-community-parent</artifactId>
|
||||
<version>14.73</version>
|
||||
<version>14.128</version>
|
||||
</parent>
|
||||
|
||||
<modules>
|
||||
|
@@ -7,7 +7,7 @@
|
||||
<parent>
|
||||
<groupId>org.alfresco</groupId>
|
||||
<artifactId>alfresco-governance-services-automation-community-repo</artifactId>
|
||||
<version>14.73</version>
|
||||
<version>14.128</version>
|
||||
</parent>
|
||||
|
||||
<build>
|
||||
@@ -44,8 +44,8 @@
|
||||
<dependencies>
|
||||
<dependency>
|
||||
<groupId>org.slf4j</groupId>
|
||||
<artifactId>slf4j-log4j12</artifactId>
|
||||
<version>1.7.32</version>
|
||||
<artifactId>slf4j-reload4j</artifactId>
|
||||
<version>1.7.35</version>
|
||||
<scope>test</scope>
|
||||
</dependency>
|
||||
<dependency>
|
||||
|
@@ -73,4 +73,5 @@ public class RecordFoldersAPI extends BaseAPI
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
}
|
||||
|
@@ -129,8 +129,8 @@ public class RecordsAPI extends BaseAPI
|
||||
JSONObject requestParams = new JSONObject();
|
||||
requestParams.put("name", "reject");
|
||||
requestParams.put("nodeRef", recNodeRef);
|
||||
requestParams.put("params",new JSONObject()
|
||||
.put("reason",reason));
|
||||
requestParams.put("params", new JSONObject()
|
||||
.put("reason", reason));
|
||||
|
||||
return doPostJsonRequest(user, password, expectedStatusCode, requestParams, RM_ACTIONS_API);
|
||||
}
|
||||
@@ -221,6 +221,7 @@ public class RecordsAPI extends BaseAPI
|
||||
* Uploads an electronic record
|
||||
* <p>
|
||||
* eg. of usage for creating record directly in Unfiled Records : uploadElectronicRecord(getAdminName(), getAdminPassword(), recordPropertiesStringMap, UNFILED_RECORDS_BREADCRUMB, DocumentType.HTML)
|
||||
*
|
||||
* @param username the username
|
||||
* @param password the password
|
||||
* @param properties a map of record properties and their values
|
||||
@@ -241,6 +242,7 @@ public class RecordsAPI extends BaseAPI
|
||||
* <li>eg. of usage in the case in which the record is inside a folder in Unfiled Records : deleteRecord(getAdminName(), getAdminPassword(), "f1 (2016-1472716888713)", UNFILED_RECORDS_BREADCRUMB, "unfiled records folder");
|
||||
* <li>eg. of usage in the case in which the record is created directly in Unfiled Records : deleteRecord(getAdminName(), getAdminPassword(), "f1 (2016-1472716888713)", UNFILED_RECORDS_BREADCRUMB, "");
|
||||
* </ul>
|
||||
*
|
||||
* @param username user's username
|
||||
* @param password its password
|
||||
* @param recordName the record name
|
||||
@@ -267,7 +269,7 @@ public class RecordsAPI extends BaseAPI
|
||||
* @param recordName the String with which the record name starts
|
||||
* @return the record object in case it exists, null otherwise
|
||||
*/
|
||||
private CmisObject getRecord(String username, String password, String folderName, String recordName)
|
||||
public CmisObject getRecord(String username, String password, String folderName, String recordName)
|
||||
{
|
||||
for (CmisObject record : contentService.getFolderObject(contentService.getCMISSession(username, password), RM_SITE_ID, folderName).getChildren())
|
||||
{
|
||||
@@ -344,6 +346,7 @@ public class RecordsAPI extends BaseAPI
|
||||
return doPostJsonRequest(user, password, SC_OK, requestParams, ACTIONS_API);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Retrieves the record's nodeRef
|
||||
*
|
||||
|
@@ -0,0 +1,139 @@
|
||||
/*
|
||||
* #%L
|
||||
* Alfresco Records Management Module
|
||||
* %%
|
||||
* Copyright (C) 2005 - 2022 Alfresco Software Limited
|
||||
* %%
|
||||
* This file is part of the Alfresco software.
|
||||
* -
|
||||
* If the software was purchased under a paid Alfresco license, the terms of
|
||||
* the paid license agreement will prevail. Otherwise, the software is
|
||||
* provided under the following open source license terms:
|
||||
* -
|
||||
* Alfresco is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU Lesser General Public License as published by
|
||||
* the Free Software Foundation, either version 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
* -
|
||||
* Alfresco is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU Lesser General Public License for more details.
|
||||
* -
|
||||
* You should have received a copy of the GNU Lesser General Public License
|
||||
* along with Alfresco. If not, see <http://www.gnu.org/licenses/>.
|
||||
* #L%
|
||||
*/
|
||||
package org.alfresco.rest.rm.community.records;
|
||||
|
||||
import static org.alfresco.rest.rm.community.util.CommonTestUtils.generateTestPrefix;
|
||||
import static org.alfresco.utility.data.RandomData.getRandomName;
|
||||
import static org.alfresco.utility.report.log.Step.STEP;
|
||||
import static org.springframework.http.HttpStatus.CREATED;
|
||||
import static org.testng.Assert.assertNotNull;
|
||||
|
||||
import java.util.HashMap;
|
||||
import java.util.Map;
|
||||
|
||||
import org.alfresco.rest.core.v0.BaseAPI.RMProperty;
|
||||
import org.alfresco.rest.rm.community.base.BaseRMRestTest;
|
||||
import org.alfresco.rest.rm.community.model.recordcategory.RecordCategory;
|
||||
import org.alfresco.rest.rm.community.model.recordcategory.RecordCategoryChild;
|
||||
import org.alfresco.rest.v0.RMRolesAndActionsAPI;
|
||||
import org.alfresco.rest.v0.RecordsAPI;
|
||||
import org.alfresco.test.AlfrescoTest;
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.testng.annotations.AfterClass;
|
||||
import org.testng.annotations.BeforeClass;
|
||||
import org.testng.annotations.Test;
|
||||
|
||||
/**
|
||||
* Contains CreateNonElectronicRecords test which checks creation and basic actions(view details, edit, move, copy, delete) on non-electronic records
|
||||
* <p/>
|
||||
* Precondition:
|
||||
* <p/>
|
||||
* RM site created, contains category 1 with folder 1 and folder 2 inside it
|
||||
* <p/>
|
||||
* RM user has RM admin role
|
||||
*
|
||||
* @author Shubham Jain
|
||||
* @Since 7.2.0 M2
|
||||
*/
|
||||
public class CreateNonElectronicRecordsTests extends BaseRMRestTest
|
||||
{
|
||||
private RecordCategory rootCategory;
|
||||
|
||||
private RecordCategoryChild recordFolder;
|
||||
|
||||
/**
|
||||
* data prep services
|
||||
*/
|
||||
@Autowired
|
||||
private RMRolesAndActionsAPI rmRolesAndActionsAPI;
|
||||
|
||||
@Autowired
|
||||
private RecordsAPI recordsAPI;
|
||||
|
||||
private final String TEST_PREFIX = generateTestPrefix(CreateNonElectronicRecordsTests.class);
|
||||
private final String RM_ADMIN = TEST_PREFIX + "rm_admin";
|
||||
private final String recordName = "RM-2777 record";
|
||||
private final String recordTitle = recordName + " title";
|
||||
private final String recordDescription = recordName + " description";
|
||||
|
||||
|
||||
@BeforeClass (alwaysRun = true)
|
||||
public void preConditions()
|
||||
{
|
||||
STEP("Create RM Site");
|
||||
createRMSiteIfNotExists();
|
||||
|
||||
STEP("Create RM Admin user");
|
||||
rmRolesAndActionsAPI.createUserAndAssignToRole(getAdminUser().getUsername(), getAdminUser().getPassword(), RM_ADMIN,
|
||||
getAdminUser().getPassword(),
|
||||
"Administrator");
|
||||
|
||||
STEP("Create root level category");
|
||||
rootCategory = createRootCategory(getRandomName("Category"));
|
||||
|
||||
STEP("Create the record folder inside the rootCategory");
|
||||
recordFolder = createRecordFolder(rootCategory.getId(), getRandomName("Folder"));
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* Test v0 methods to create and get non-electronic records.
|
||||
*/
|
||||
@Test
|
||||
@AlfrescoTest (jira = "RM-2777")
|
||||
public void createNonElectronicRecordTest()
|
||||
{
|
||||
STEP("Create a non-electronic record by completing some of the fields");
|
||||
Map<Enum<?>, String> properties = new HashMap<Enum<?>, String>();
|
||||
properties.put(RMProperty.TITLE, recordTitle);
|
||||
properties.put(RMProperty.DESCRIPTION, recordDescription);
|
||||
properties.put(RMProperty.NAME, recordName);
|
||||
properties.put(RMProperty.PHYSICAL_SIZE, "");
|
||||
properties.put(RMProperty.NUMBER_OF_COPIES, "");
|
||||
properties.put(RMProperty.SHELF, "");
|
||||
properties.put(RMProperty.STORAGE_LOCATION, "");
|
||||
properties.put(RMProperty.BOX, "");
|
||||
properties.put(RMProperty.FILE, "");
|
||||
|
||||
recordsAPI.createNonElectronicRecord(getAdminUser().getUsername(),
|
||||
getAdminUser().getPassword(), properties, rootCategory.getName(), recordFolder.getName());
|
||||
|
||||
STEP("Check the non-electronic record has been created");
|
||||
assertStatusCode(CREATED);
|
||||
assertNotNull(recordsAPI.getRecord(getAdminUser().getUsername(), getAdminUser().getPassword(),
|
||||
recordFolder.getName(), recordName));
|
||||
|
||||
}
|
||||
|
||||
@AfterClass (alwaysRun = true)
|
||||
public void deletePreConditions()
|
||||
{
|
||||
STEP("Delete the created rootCategory along with corresponding record folders/records present in it");
|
||||
getRestAPIFactory().getRecordCategoryAPI().deleteRecordCategory(rootCategory.getId());
|
||||
}
|
||||
|
||||
}
|
@@ -7,7 +7,7 @@
|
||||
<parent>
|
||||
<groupId>org.alfresco</groupId>
|
||||
<artifactId>alfresco-governance-services-community-parent</artifactId>
|
||||
<version>14.73</version>
|
||||
<version>14.128</version>
|
||||
</parent>
|
||||
|
||||
<modules>
|
||||
|
@@ -1,4 +1,4 @@
|
||||
TRANSFORMERS_TAG=2.5.5-A1
|
||||
SOLR6_TAG=2.0.2-RC1
|
||||
TRANSFORMERS_TAG=2.5.7-A6
|
||||
SOLR6_TAG=2.0.3-RC2
|
||||
POSTGRES_TAG=13.3
|
||||
ACTIVEMQ_TAG=5.16.1
|
||||
|
@@ -1,4 +1,17 @@
|
||||
### Apply AGS community repo AMP to ACS image
|
||||
# BUILD STAGE AGS
|
||||
FROM debian:11-slim AS AGSBUILDER
|
||||
|
||||
RUN export DEBIAN_FRONTEND=noninteractive; \
|
||||
apt-get update -qqy && apt-get -yqq install unzip && \
|
||||
mkdir -p /build/gs-api-explorer
|
||||
|
||||
### Copy the AGS war from the local context
|
||||
COPY target/gs-api-explorer-*.war /build
|
||||
|
||||
RUN unzip -q /build/gs-api-explorer-*.war -d /build/gs-api-explorer && \
|
||||
chmod -R g-w,o= /build
|
||||
|
||||
# ACTUAL IMAGE
|
||||
FROM alfresco/alfresco-community-repo-base:${image.tag}
|
||||
|
||||
# Alfresco user does not have permissions to modify webapps or configuration. Switch to root.
|
||||
@@ -13,18 +26,13 @@ RUN java -jar /usr/local/tomcat/alfresco-mmt/alfresco-mmt*.jar install \
|
||||
/usr/local/tomcat/amps \
|
||||
/usr/local/tomcat/webapps/alfresco -directory -nobackup
|
||||
|
||||
### Copy gs-api-explorer war into webapps folder
|
||||
COPY target/gs-api-explorer-*.war /usr/local/tomcat/webapps/
|
||||
|
||||
### Unpack gs-api-explorer.war
|
||||
RUN mkdir /usr/local/tomcat/webapps/gs-api-explorer && cd /usr/local/tomcat/webapps/gs-api-explorer && \
|
||||
jar -xvf /usr/local/tomcat/webapps/gs-api-explorer-*.war && rm -f /usr/local/tomcat/webapps/gs-api-explorer-*.war
|
||||
### Copy gs-api-explorer
|
||||
COPY --chown=root:Alfresco --from=AGSBUILDER /build/gs-api-explorer /usr/local/tomcat/webapps/gs-api-explorer
|
||||
|
||||
# All files in the tomcat folder must be owned by root user and Alfresco group as mentioned in the parent Dockerfile
|
||||
RUN chgrp -R Alfresco /usr/local/tomcat && \
|
||||
find /usr/local/tomcat/webapps -type d -exec chmod 0750 {} \; && \
|
||||
find /usr/local/tomcat/webapps -type f -exec chmod 0640 {} \; && \
|
||||
chmod -R g+r /usr/local/tomcat/webapps
|
||||
find /usr/local/tomcat/webapps -type f -exec chmod 0640 {} \;
|
||||
|
||||
# Switching back to alfresco user after having added amps files to run the container as non-root
|
||||
USER alfresco
|
||||
|
@@ -26,7 +26,8 @@ services:
|
||||
-Ddb.url=jdbc:postgresql://postgres:5432/alfresco
|
||||
-Dsolr.host=search
|
||||
-Dsolr.port=8983
|
||||
-Dsolr.secureComms=none
|
||||
-Dsolr.secureComms=secret
|
||||
-Dsolr.sharedSecret=secret
|
||||
-Dsolr.base.url=/solr
|
||||
-Dindex.subsystem.name=solr6
|
||||
-Dalfresco.restApi.basicAuthScheme=true
|
||||
@@ -61,15 +62,19 @@ services:
|
||||
image: alfresco/alfresco-search-services:${SOLR6_TAG}
|
||||
environment:
|
||||
#Solr needs to know how to register itself with Alfresco
|
||||
- SOLR_ALFRESCO_HOST=alfresco
|
||||
- SOLR_ALFRESCO_PORT=8080
|
||||
SOLR_ALFRESCO_HOST: "alfresco"
|
||||
SOLR_ALFRESCO_PORT: "8080"
|
||||
#Alfresco needs to know how to call solr
|
||||
- SOLR_SOLR_HOST=search
|
||||
- SOLR_SOLR_PORT=8983
|
||||
SOLR_SOLR_HOST: "search"
|
||||
SOLR_SOLR_PORT: "8983"
|
||||
#Create the default alfresco and archive cores
|
||||
- SOLR_CREATE_ALFRESCO_DEFAULTS=alfresco,archive
|
||||
SOLR_CREATE_ALFRESCO_DEFAULTS: "alfresco,archive"
|
||||
#HTTP by default
|
||||
- ALFRESCO_SECURE_COMMS=none
|
||||
ALFRESCO_SECURE_COMMS: "secret"
|
||||
JAVA_TOOL_OPTIONS:
|
||||
"
|
||||
-Dalfresco.secureComms.secret=secret
|
||||
"
|
||||
ports:
|
||||
- 8083:8983 #Browser port
|
||||
|
||||
|
@@ -8,7 +8,7 @@
|
||||
<parent>
|
||||
<groupId>org.alfresco</groupId>
|
||||
<artifactId>alfresco-governance-services-community-repo-parent</artifactId>
|
||||
<version>14.73</version>
|
||||
<version>14.128</version>
|
||||
</parent>
|
||||
|
||||
<properties>
|
||||
@@ -217,6 +217,7 @@
|
||||
<fileset dir="${project.build.outputDirectory}/alfresco" />
|
||||
</move>
|
||||
<copy file="${project.build.directory}/${project.build.finalName}/config/alfresco/module/org_alfresco_module_rm/module.properties" todir="${project.build.directory}/${project.build.finalName}" />
|
||||
<copy file="${project.build.directory}/generated-sources/license/THIRD-PARTY.txt" todir="${project.build.directory}/${project.build.finalName}/licenses/${artifactId}" />
|
||||
</target>
|
||||
</configuration>
|
||||
</execution>
|
||||
|
@@ -66,7 +66,8 @@ ftp.enabled=false
|
||||
|
||||
# Solr config
|
||||
index.subsystem.name=solr6
|
||||
solr.secureComms=none
|
||||
solr.secureComms=secret
|
||||
solr.sharedSecret=secret
|
||||
solr.port=8983
|
||||
|
||||
#By default the basic auth is on false - REPO-2575
|
||||
|
@@ -29,6 +29,7 @@ package org.alfresco.module.org_alfresco_module_rm.api;
|
||||
|
||||
import static org.junit.Assert.assertEquals;
|
||||
import static org.junit.Assert.assertTrue;
|
||||
import static org.reflections.scanners.Scanners.TypesAnnotated;
|
||||
|
||||
import java.lang.reflect.Constructor;
|
||||
import java.lang.reflect.Executable;
|
||||
@@ -77,7 +78,7 @@ public class PublicAPITestUtil
|
||||
*/
|
||||
public static void testPublicAPIConsistency(String basePackageName, SetMultimap<Class<?>, Class<?>> knownBadReferences)
|
||||
{
|
||||
Reflections reflections = new Reflections(basePackageName);
|
||||
Reflections reflections = new Reflections(basePackageName, TypesAnnotated);
|
||||
Set<Class<?>> publicAPIClasses = reflections.getTypesAnnotatedWith(AlfrescoPublicApi.class, true);
|
||||
|
||||
SetMultimap<Class<?>, Class<?>> referencedFrom = HashMultimap.create();
|
||||
|
@@ -7,7 +7,7 @@
|
||||
<parent>
|
||||
<groupId>org.alfresco</groupId>
|
||||
<artifactId>alfresco-governance-services-community-repo-parent</artifactId>
|
||||
<version>14.73</version>
|
||||
<version>14.128</version>
|
||||
</parent>
|
||||
|
||||
<build>
|
||||
|
@@ -7,7 +7,7 @@
|
||||
<parent>
|
||||
<groupId>org.alfresco</groupId>
|
||||
<artifactId>alfresco-community-repo</artifactId>
|
||||
<version>14.73</version>
|
||||
<version>14.128</version>
|
||||
</parent>
|
||||
|
||||
<modules>
|
||||
|
@@ -8,7 +8,7 @@
|
||||
<parent>
|
||||
<groupId>org.alfresco</groupId>
|
||||
<artifactId>alfresco-community-repo-amps</artifactId>
|
||||
<version>14.73</version>
|
||||
<version>14.128</version>
|
||||
</parent>
|
||||
|
||||
<properties>
|
||||
@@ -168,6 +168,10 @@
|
||||
<targetPath>../${project.build.finalName}</targetPath>
|
||||
<filtering>true</filtering>
|
||||
</resource>
|
||||
<resource>
|
||||
<directory>${project.build.directory}/generated-sources/license</directory>
|
||||
<targetPath>../${project.build.finalName}/licenses/${artifactId}</targetPath>
|
||||
</resource>
|
||||
</resources>
|
||||
<testResources>
|
||||
<testResource>
|
||||
|
10
core/pom.xml
10
core/pom.xml
@@ -7,7 +7,7 @@
|
||||
<parent>
|
||||
<groupId>org.alfresco</groupId>
|
||||
<artifactId>alfresco-community-repo</artifactId>
|
||||
<version>14.73</version>
|
||||
<version>14.128</version>
|
||||
</parent>
|
||||
|
||||
<dependencies>
|
||||
@@ -54,9 +54,9 @@
|
||||
<classifier>asl</classifier>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>log4j</groupId>
|
||||
<artifactId>log4j</artifactId>
|
||||
<version>1.2.17</version>
|
||||
<groupId>ch.qos.reload4j</groupId>
|
||||
<artifactId>reload4j</artifactId>
|
||||
<version>1.2.18.3</version>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>org.json</groupId>
|
||||
@@ -114,7 +114,7 @@
|
||||
<!-- Test only dependencies, as popped up while running mvn test -->
|
||||
<dependency>
|
||||
<groupId>org.slf4j</groupId>
|
||||
<artifactId>slf4j-log4j12</artifactId>
|
||||
<artifactId>slf4j-reload4j</artifactId>
|
||||
<scope>test</scope>
|
||||
</dependency>
|
||||
<dependency>
|
||||
|
@@ -7,7 +7,7 @@
|
||||
<parent>
|
||||
<groupId>org.alfresco</groupId>
|
||||
<artifactId>alfresco-community-repo</artifactId>
|
||||
<version>14.73</version>
|
||||
<version>14.128</version>
|
||||
</parent>
|
||||
|
||||
<properties>
|
||||
|
@@ -26,7 +26,6 @@
|
||||
|
||||
package org.alfresco.repo.content;
|
||||
|
||||
import org.alfresco.service.Experimental;
|
||||
|
||||
/**
|
||||
* Enumeration with values for archive-restore parameter keys.
|
||||
@@ -35,7 +34,6 @@ import org.alfresco.service.Experimental;
|
||||
*
|
||||
* @author mpichura
|
||||
*/
|
||||
@Experimental
|
||||
public enum ContentRestoreParams
|
||||
{
|
||||
/**
|
||||
|
@@ -26,7 +26,6 @@
|
||||
package org.alfresco.repo.content;
|
||||
|
||||
import org.alfresco.api.AlfrescoPublicApi;
|
||||
import org.alfresco.service.Experimental;
|
||||
import org.alfresco.service.cmr.repository.ContentAccessor;
|
||||
import org.alfresco.service.cmr.repository.ContentIOException;
|
||||
import org.alfresco.service.cmr.repository.ContentReader;
|
||||
@@ -340,7 +339,6 @@ public interface ContentStore
|
||||
* @param contentUrl the URL of the content for which the storage properties are to be retrieved.
|
||||
* @return Returns a key-value (String-String) collection of storage headers/properties with their respective values.
|
||||
*/
|
||||
@Experimental
|
||||
default Map<String, String> getStorageProperties(String contentUrl)
|
||||
{
|
||||
return Collections.emptyMap();
|
||||
@@ -350,14 +348,12 @@ public interface ContentStore
|
||||
* Submit a request to send content to archive (offline) state.
|
||||
* If no connector is present or connector is not supporting sending to archive, then {@link UnsupportedOperationException} will be returned.
|
||||
* Specific connector will decide which storage class/tier will be set for content.
|
||||
* This method is experimental and subject to changes.
|
||||
*
|
||||
* @param contentUrl the URL of the content which is to be archived.
|
||||
* @param archiveParams a map of String-Serializable parameters defining Storage Provider specific request parameters (can be empty).
|
||||
* @return true when request successful, false when unsuccessful.
|
||||
* @throws UnsupportedOperationException when store is unable to handle request.
|
||||
*/
|
||||
@Experimental
|
||||
default boolean requestSendContentToArchive(String contentUrl, Map<String, Serializable> archiveParams)
|
||||
{
|
||||
throw new UnsupportedOperationException("Request to archive content is not supported by this content store.");
|
||||
@@ -370,14 +366,12 @@ public interface ContentStore
|
||||
* Keys of this map should be restricted to {@code ContentRestoreParams} enumeration.
|
||||
* For AWS S3 map can indicating expiry days, Glacier restore tier.
|
||||
* For Azure Blob map can indicate rehydrate priority.
|
||||
* This method is experimental and subject to changes.
|
||||
*
|
||||
* @param contentUrl the URL of the content which is to be archived.
|
||||
* @param restoreParams a map of String-Serializable parameters defining Storage Provider specific request parameters (can be empty).
|
||||
* @return true when request successful, false when unsuccessful.
|
||||
* @throws UnsupportedOperationException when store is unable to handle request.
|
||||
*/
|
||||
@Experimental
|
||||
default boolean requestRestoreContentFromArchive(String contentUrl, Map<String, Serializable> restoreParams)
|
||||
{
|
||||
throw new UnsupportedOperationException("Request to restore content from archive is not supported by this content store.");
|
||||
|
@@ -26,8 +26,6 @@
|
||||
|
||||
package org.alfresco.repo.content;
|
||||
|
||||
import org.alfresco.service.Experimental;
|
||||
|
||||
/**
|
||||
* Enumeration with "header" values for Alfresco derived Storage Properties
|
||||
* Values of this enum should be used when adding Alfresco derived key-value pairs in Storage Properties map.
|
||||
@@ -35,7 +33,6 @@ import org.alfresco.service.Experimental;
|
||||
*
|
||||
* @author mpichura
|
||||
*/
|
||||
@Experimental
|
||||
public enum ObjectStorageProps {
|
||||
/**
|
||||
* Object's content is archived and not immediately accessible.
|
||||
|
@@ -26,7 +26,6 @@
|
||||
package org.alfresco.service.cmr.repository;
|
||||
|
||||
import org.alfresco.api.AlfrescoPublicApi;
|
||||
import org.alfresco.service.Experimental;
|
||||
|
||||
/**
|
||||
* Unable to access as content is in an Archived state.
|
||||
@@ -34,7 +33,6 @@ import org.alfresco.service.Experimental;
|
||||
*
|
||||
* @author David Edwards
|
||||
*/
|
||||
@Experimental
|
||||
@AlfrescoPublicApi
|
||||
public class ArchivedIOException extends ContentIOException
|
||||
{
|
||||
|
@@ -27,7 +27,6 @@ package org.alfresco.service.cmr.repository;
|
||||
|
||||
import org.alfresco.api.AlfrescoPublicApi;
|
||||
import org.alfresco.error.AlfrescoRuntimeException;
|
||||
import org.alfresco.service.Experimental;
|
||||
|
||||
/**
|
||||
* Content Restoration in progress
|
||||
@@ -35,7 +34,6 @@ import org.alfresco.service.Experimental;
|
||||
* @author David Edwards
|
||||
*/
|
||||
@AlfrescoPublicApi
|
||||
@Experimental
|
||||
public class RestoreInProgressException extends AlfrescoRuntimeException
|
||||
{
|
||||
private static final long serialVersionUID = 5483215922384016269L;
|
||||
|
@@ -7,7 +7,7 @@
|
||||
<parent>
|
||||
<groupId>org.alfresco</groupId>
|
||||
<artifactId>alfresco-community-repo</artifactId>
|
||||
<version>14.73</version>
|
||||
<version>14.128</version>
|
||||
</parent>
|
||||
|
||||
<dependencies>
|
||||
@@ -31,6 +31,11 @@
|
||||
<artifactId>maven-artifact</artifactId>
|
||||
<version>${dependency.maven-artifact.version}</version>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>org.mockito</groupId>
|
||||
<artifactId>mockito-core</artifactId>
|
||||
<scope>test</scope>
|
||||
</dependency>
|
||||
</dependencies>
|
||||
|
||||
<build>
|
||||
|
@@ -2,7 +2,7 @@
|
||||
* #%L
|
||||
* Alfresco Repository
|
||||
* %%
|
||||
* Copyright (C) 2005 - 2016 Alfresco Software Limited
|
||||
* Copyright (C) 2005 - 2022 Alfresco Software Limited
|
||||
* %%
|
||||
* This file is part of the Alfresco software.
|
||||
* If the software was purchased under a paid Alfresco license, the terms of
|
@@ -2,7 +2,7 @@
|
||||
* #%L
|
||||
* Alfresco Repository
|
||||
* %%
|
||||
* Copyright (C) 2005 - 2016 Alfresco Software Limited
|
||||
* Copyright (C) 2005 - 2022 Alfresco Software Limited
|
||||
* %%
|
||||
* This file is part of the Alfresco software.
|
||||
* If the software was purchased under a paid Alfresco license, the terms of
|
@@ -2,7 +2,7 @@
|
||||
* #%L
|
||||
* Alfresco Repository
|
||||
* %%
|
||||
* Copyright (C) 2005 - 2016 Alfresco Software Limited
|
||||
* Copyright (C) 2005 - 2022 Alfresco Software Limited
|
||||
* %%
|
||||
* This file is part of the Alfresco software.
|
||||
* If the software was purchased under a paid Alfresco license, the terms of
|
@@ -2,7 +2,7 @@
|
||||
* #%L
|
||||
* Alfresco Repository
|
||||
* %%
|
||||
* Copyright (C) 2005 - 2016 Alfresco Software Limited
|
||||
* Copyright (C) 2005 - 2022 Alfresco Software Limited
|
||||
* %%
|
||||
* This file is part of the Alfresco software.
|
||||
* If the software was purchased under a paid Alfresco license, the terms of
|
@@ -2,7 +2,7 @@
|
||||
* #%L
|
||||
* Alfresco Repository
|
||||
* %%
|
||||
* Copyright (C) 2005 - 2016 Alfresco Software Limited
|
||||
* Copyright (C) 2005 - 2022 Alfresco Software Limited
|
||||
* %%
|
||||
* This file is part of the Alfresco software.
|
||||
* If the software was purchased under a paid Alfresco license, the terms of
|
43
mmt/src/test/java/org/alfresco/AllMmtUnitTestSuite.java
Normal file
43
mmt/src/test/java/org/alfresco/AllMmtUnitTestSuite.java
Normal file
@@ -0,0 +1,43 @@
|
||||
/*
|
||||
* #%L
|
||||
* Alfresco Repository
|
||||
* %%
|
||||
* Copyright (C) 2005 - 2022 Alfresco Software Limited
|
||||
* %%
|
||||
* This file is part of the Alfresco software.
|
||||
* If the software was purchased under a paid Alfresco license, the terms of
|
||||
* the paid license agreement will prevail. Otherwise, the software is
|
||||
* provided under the following open source license terms:
|
||||
*
|
||||
* Alfresco is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU Lesser General Public License as published by
|
||||
* the Free Software Foundation, either version 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* Alfresco is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU Lesser General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Lesser General Public License
|
||||
* along with Alfresco. If not, see <http://www.gnu.org/licenses/>.
|
||||
* #L%
|
||||
*/
|
||||
package org.alfresco;
|
||||
|
||||
import org.junit.experimental.categories.Categories;
|
||||
import org.junit.runner.RunWith;
|
||||
import org.junit.runners.Suite;
|
||||
|
||||
/**
|
||||
* All MMT Tool project UNIT test classes (no application context) should be added to this test suite.
|
||||
*/
|
||||
@RunWith(Categories.class)
|
||||
@Suite.SuiteClasses({
|
||||
org.alfresco.repo.module.tool.ModuleManagementToolTest.class,
|
||||
org.alfresco.repo.module.tool.WarHelperImplTest.class,
|
||||
org.alfresco.repo.module.tool.ModuleServiceImplTest.class
|
||||
})
|
||||
public class AllMmtUnitTestSuite
|
||||
{
|
||||
}
|
@@ -2,7 +2,7 @@
|
||||
* #%L
|
||||
* Alfresco Repository
|
||||
* %%
|
||||
* Copyright (C) 2005 - 2016 Alfresco Software Limited
|
||||
* Copyright (C) 2005 - 2022 Alfresco Software Limited
|
||||
* %%
|
||||
* This file is part of the Alfresco software.
|
||||
* If the software was purchased under a paid Alfresco license, the terms of
|
@@ -2,7 +2,7 @@
|
||||
* #%L
|
||||
* Alfresco Repository
|
||||
* %%
|
||||
* Copyright (C) 2005 - 2016 Alfresco Software Limited
|
||||
* Copyright (C) 2005 - 2022 Alfresco Software Limited
|
||||
* %%
|
||||
* This file is part of the Alfresco software.
|
||||
* If the software was purchased under a paid Alfresco license, the terms of
|
@@ -2,7 +2,7 @@
|
||||
* #%L
|
||||
* Alfresco Repository
|
||||
* %%
|
||||
* Copyright (C) 2005 - 2016 Alfresco Software Limited
|
||||
* Copyright (C) 2005 - 2022 Alfresco Software Limited
|
||||
* %%
|
||||
* This file is part of the Alfresco software.
|
||||
* If the software was purchased under a paid Alfresco license, the terms of
|
@@ -9,6 +9,6 @@
|
||||
<parent>
|
||||
<groupId>org.alfresco</groupId>
|
||||
<artifactId>alfresco-community-repo-packaging</artifactId>
|
||||
<version>14.73</version>
|
||||
<version>14.128</version>
|
||||
</parent>
|
||||
</project>
|
||||
|
@@ -1,6 +1,6 @@
|
||||
# Fetch image based on Tomcat 9.0, Java 11 and Centos 8
|
||||
# Fetch image based on Tomcat 9.0, Java 11 and Centos 7
|
||||
# More infos about this image: https://github.com/Alfresco/alfresco-docker-base-tomcat
|
||||
FROM alfresco/alfresco-base-tomcat:9.0.52-java-11-centos-7
|
||||
FROM alfresco/alfresco-base-tomcat:tomcat9-jre11-centos7-202202091613
|
||||
|
||||
# Set default docker_context.
|
||||
ARG resource_path=target
|
||||
|
@@ -7,7 +7,7 @@
|
||||
<parent>
|
||||
<groupId>org.alfresco</groupId>
|
||||
<artifactId>alfresco-community-repo-packaging</artifactId>
|
||||
<version>14.73</version>
|
||||
<version>14.128</version>
|
||||
</parent>
|
||||
|
||||
<properties>
|
||||
|
@@ -7,7 +7,7 @@
|
||||
<parent>
|
||||
<groupId>org.alfresco</groupId>
|
||||
<artifactId>alfresco-community-repo</artifactId>
|
||||
<version>14.73</version>
|
||||
<version>14.128</version>
|
||||
</parent>
|
||||
|
||||
<modules>
|
||||
|
@@ -1,4 +1,4 @@
|
||||
TRANSFORMERS_TAG=2.5.5-A1
|
||||
SOLR6_TAG=2.0.2
|
||||
TRANSFORMERS_TAG=2.5.7-A6
|
||||
SOLR6_TAG=2.0.3-RC2
|
||||
POSTGRES_TAG=13.3
|
||||
ACTIVEMQ_TAG=5.16.1
|
||||
|
@@ -28,7 +28,8 @@ services:
|
||||
-Ddb.url=jdbc:postgresql://postgres:5432/alfresco
|
||||
-Dsolr.host=solr6
|
||||
-Dsolr.port=8983
|
||||
-Dsolr.secureComms=none
|
||||
-Dsolr.secureComms=secret
|
||||
-Dsolr.sharedSecret=secret
|
||||
-Dsolr.base.url=/solr
|
||||
-Dindex.subsystem.name=solr6
|
||||
-Dalfresco.restApi.basicAuthScheme=true
|
||||
@@ -63,15 +64,19 @@ services:
|
||||
image: alfresco/alfresco-search-services:${SOLR6_TAG}
|
||||
environment:
|
||||
#Solr needs to know how to register itself with Alfresco
|
||||
- SOLR_ALFRESCO_HOST=alfresco
|
||||
- SOLR_ALFRESCO_PORT=8080
|
||||
SOLR_ALFRESCO_HOST: "alfresco"
|
||||
SOLR_ALFRESCO_PORT: "8080"
|
||||
#Alfresco needs to know how to call solr
|
||||
- SOLR_SOLR_HOST=solr6
|
||||
- SOLR_SOLR_PORT=8983
|
||||
SOLR_SOLR_HOST: "solr6"
|
||||
SOLR_SOLR_PORT: "8983"
|
||||
#Create the default alfresco and archive cores
|
||||
- SOLR_CREATE_ALFRESCO_DEFAULTS=alfresco,archive
|
||||
SOLR_CREATE_ALFRESCO_DEFAULTS: "alfresco,archive"
|
||||
#HTTP by default
|
||||
- ALFRESCO_SECURE_COMMS=none
|
||||
ALFRESCO_SECURE_COMMS: "secret"
|
||||
JAVA_TOOL_OPTIONS:
|
||||
"
|
||||
-Dalfresco.secureComms.secret=secret
|
||||
"
|
||||
ports:
|
||||
- 8083:8983 #Browser port
|
||||
|
||||
|
@@ -28,7 +28,8 @@ services:
|
||||
-Ddb.url=jdbc:postgresql://postgres:5432/alfresco
|
||||
-Dsolr.host=solr6
|
||||
-Dsolr.port=8983
|
||||
-Dsolr.secureComms=none
|
||||
-Dsolr.secureComms=secret
|
||||
-Dsolr.sharedSecret=secret
|
||||
-Dsolr.base.url=/solr
|
||||
-Dindex.subsystem.name=solr6
|
||||
-Dalfresco.restApi.basicAuthScheme=true
|
||||
@@ -66,15 +67,19 @@ services:
|
||||
image: alfresco/alfresco-search-services:${SOLR6_TAG}
|
||||
environment:
|
||||
#Solr needs to know how to register itself with Alfresco
|
||||
- SOLR_ALFRESCO_HOST=alfresco
|
||||
- SOLR_ALFRESCO_PORT=8080
|
||||
SOLR_ALFRESCO_HOST: "alfresco"
|
||||
SOLR_ALFRESCO_PORT: "8080"
|
||||
#Alfresco needs to know how to call solr
|
||||
- SOLR_SOLR_HOST=solr6
|
||||
- SOLR_SOLR_PORT=8983
|
||||
SOLR_SOLR_HOST: "solr6"
|
||||
SOLR_SOLR_PORT: "8983"
|
||||
#Create the default alfresco and archive cores
|
||||
- SOLR_CREATE_ALFRESCO_DEFAULTS=alfresco,archive
|
||||
SOLR_CREATE_ALFRESCO_DEFAULTS: "alfresco,archive"
|
||||
#HTTP by default
|
||||
- ALFRESCO_SECURE_COMMS=none
|
||||
ALFRESCO_SECURE_COMMS: "secret"
|
||||
JAVA_TOOL_OPTIONS:
|
||||
"
|
||||
-Dalfresco.secureComms.secret=secret
|
||||
"
|
||||
ports:
|
||||
- 8083:8983 #Browser port
|
||||
|
||||
|
@@ -6,7 +6,7 @@
|
||||
<parent>
|
||||
<groupId>org.alfresco</groupId>
|
||||
<artifactId>alfresco-community-repo-packaging</artifactId>
|
||||
<version>14.73</version>
|
||||
<version>14.128</version>
|
||||
</parent>
|
||||
|
||||
<modules>
|
||||
|
@@ -9,7 +9,7 @@
|
||||
<parent>
|
||||
<groupId>org.alfresco</groupId>
|
||||
<artifactId>alfresco-community-repo-tests</artifactId>
|
||||
<version>14.73</version>
|
||||
<version>14.128</version>
|
||||
</parent>
|
||||
|
||||
<developers>
|
||||
|
@@ -9,7 +9,7 @@
|
||||
<parent>
|
||||
<groupId>org.alfresco</groupId>
|
||||
<artifactId>alfresco-community-repo-tests</artifactId>
|
||||
<version>14.73</version>
|
||||
<version>14.128</version>
|
||||
</parent>
|
||||
|
||||
<developers>
|
||||
|
@@ -9,7 +9,7 @@
|
||||
<parent>
|
||||
<groupId>org.alfresco</groupId>
|
||||
<artifactId>alfresco-community-repo-tests</artifactId>
|
||||
<version>14.73</version>
|
||||
<version>14.128</version>
|
||||
</parent>
|
||||
|
||||
<developers>
|
||||
|
@@ -9,7 +9,7 @@
|
||||
<parent>
|
||||
<groupId>org.alfresco</groupId>
|
||||
<artifactId>alfresco-community-repo-tests</artifactId>
|
||||
<version>14.73</version>
|
||||
<version>14.128</version>
|
||||
</parent>
|
||||
|
||||
<developers>
|
||||
|
@@ -347,13 +347,30 @@ public class GetSitesTests extends RestTest
|
||||
public void checkPaginationWithSkipCountAndMaxItems() throws Exception
|
||||
{
|
||||
sites = restClient.authenticateUser(regularUser).withParams("skipCount=10&maxItems=110").withCoreAPI().getSites();
|
||||
|
||||
int expectedCount;
|
||||
if (sites.getPagination().isHasMoreItems())
|
||||
{
|
||||
expectedCount = sites.getPagination().getMaxItems();
|
||||
}
|
||||
else
|
||||
{
|
||||
if (sites.getPagination().getTotalItems() < sites.getPagination().getSkipCount())
|
||||
{
|
||||
expectedCount = 0;
|
||||
}
|
||||
else
|
||||
{
|
||||
expectedCount = sites.getPagination().getTotalItems() - sites.getPagination().getSkipCount();
|
||||
}
|
||||
}
|
||||
|
||||
sites.getPagination().assertThat()
|
||||
.field("totalItems").isNotEmpty().and()
|
||||
.field("maxItems").is("110").and()
|
||||
.field("hasMoreItems").is((sites.getPagination().getTotalItems() - sites.getPagination().getSkipCount() > sites.getPagination().getMaxItems())?"true":"false").and()
|
||||
.field("skipCount").is("10").and()
|
||||
.field("count").is((sites.getPagination().isHasMoreItems()) ? sites.getPagination().getMaxItems()
|
||||
: sites.getPagination().getTotalItems() - sites.getPagination().getSkipCount());
|
||||
.field("count").is(expectedCount);
|
||||
}
|
||||
|
||||
@Test(groups = { TestGroup.REST_API, TestGroup.SITES, TestGroup.REGRESSION})
|
||||
|
@@ -9,7 +9,7 @@
|
||||
<parent>
|
||||
<groupId>org.alfresco</groupId>
|
||||
<artifactId>alfresco-community-repo-tests</artifactId>
|
||||
<version>14.73</version>
|
||||
<version>14.128</version>
|
||||
</parent>
|
||||
|
||||
<developers>
|
||||
|
@@ -7,7 +7,7 @@
|
||||
<parent>
|
||||
<groupId>org.alfresco</groupId>
|
||||
<artifactId>alfresco-community-repo-packaging</artifactId>
|
||||
<version>14.73</version>
|
||||
<version>14.128</version>
|
||||
</parent>
|
||||
|
||||
<properties>
|
||||
|
73
pom.xml
73
pom.xml
@@ -2,7 +2,7 @@
|
||||
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
|
||||
<modelVersion>4.0.0</modelVersion>
|
||||
<artifactId>alfresco-community-repo</artifactId>
|
||||
<version>14.73</version>
|
||||
<version>14.128</version>
|
||||
<packaging>pom</packaging>
|
||||
<name>Alfresco Community Repo Parent</name>
|
||||
|
||||
@@ -51,38 +51,38 @@
|
||||
<dependency.alfresco-log-sanitizer.version>0.2</dependency.alfresco-log-sanitizer.version>
|
||||
<dependency.activiti-engine.version>5.23.0</dependency.activiti-engine.version>
|
||||
<dependency.activiti.version>5.23.0</dependency.activiti.version>
|
||||
<dependency.alfresco-transform-model.version>1.4.5</dependency.alfresco-transform-model.version>
|
||||
<dependency.alfresco-transform-model.version>1.4.13</dependency.alfresco-transform-model.version>
|
||||
<dependency.alfresco-greenmail.version>6.2</dependency.alfresco-greenmail.version>
|
||||
<dependency.acs-event-model.version>0.0.13</dependency.acs-event-model.version>
|
||||
|
||||
<dependency.spring.version>5.3.13</dependency.spring.version>
|
||||
<dependency.spring.version>5.3.15</dependency.spring.version>
|
||||
<dependency.antlr.version>3.5.2</dependency.antlr.version>
|
||||
<dependency.jackson.version>2.13.0</dependency.jackson.version>
|
||||
<dependency.jackson-databind.version>2.13.0</dependency.jackson-databind.version>
|
||||
<dependency.cxf.version>3.4.5</dependency.cxf.version>
|
||||
<dependency.jackson.version>2.13.1</dependency.jackson.version>
|
||||
<dependency.jackson-databind.version>2.13.1</dependency.jackson-databind.version>
|
||||
<dependency.cxf.version>3.5.0</dependency.cxf.version>
|
||||
<dependency.opencmis.version>1.0.0</dependency.opencmis.version>
|
||||
<dependency.webscripts.version>8.27</dependency.webscripts.version>
|
||||
<dependency.webscripts.version>8.28</dependency.webscripts.version>
|
||||
<dependency.bouncycastle.version>1.70</dependency.bouncycastle.version>
|
||||
<dependency.mockito-core.version>3.11.2</dependency.mockito-core.version>
|
||||
<dependency.org-json.version>20210307</dependency.org-json.version>
|
||||
<dependency.org-json.version>20211205</dependency.org-json.version>
|
||||
<dependency.commons-dbcp.version>1.4-DBCP330</dependency.commons-dbcp.version>
|
||||
<dependency.commons-io.version>2.11.0</dependency.commons-io.version>
|
||||
<dependency.gson.version>2.8.5</dependency.gson.version>
|
||||
<dependency.httpclient.version>4.5.13</dependency.httpclient.version>
|
||||
<dependency.httpcore.version>4.4.15</dependency.httpcore.version>
|
||||
<dependency.commons-httpclient.version>3.1-HTTPCLIENT-1265</dependency.commons-httpclient.version>
|
||||
<dependency.xercesImpl.version>2.12.1</dependency.xercesImpl.version>
|
||||
<dependency.slf4j.version>1.7.32</dependency.slf4j.version>
|
||||
<dependency.gytheio.version>0.12</dependency.gytheio.version>
|
||||
<dependency.xercesImpl.version>2.12.2</dependency.xercesImpl.version>
|
||||
<dependency.slf4j.version>1.7.35</dependency.slf4j.version>
|
||||
<dependency.gytheio.version>0.16</dependency.gytheio.version>
|
||||
<dependency.groovy.version>3.0.9</dependency.groovy.version>
|
||||
<dependency.tika.version>2.1.0</dependency.tika.version>
|
||||
<dependency.spring-security.version>5.5.2</dependency.spring-security.version>
|
||||
<dependency.tika.version>2.2.1</dependency.tika.version>
|
||||
<dependency.spring-security.version>5.6.1</dependency.spring-security.version>
|
||||
<dependency.truezip.version>7.7.10</dependency.truezip.version>
|
||||
<dependency.poi.version>4.1.2</dependency.poi.version>
|
||||
<dependency.ooxml-schemas.version>1.4</dependency.ooxml-schemas.version>
|
||||
<dependency.keycloak.version>15.0.2</dependency.keycloak.version>
|
||||
<dependency.jboss.logging.version>3.4.2.Final</dependency.jboss.logging.version>
|
||||
<dependency.camel.version>3.7.4</dependency.camel.version>
|
||||
<dependency.jboss.logging.version>3.4.3.Final</dependency.jboss.logging.version>
|
||||
<dependency.camel.version>3.15.0</dependency.camel.version> <!-- when bumping this version, please keep track/sync with included netty.io dependencies (can cause dependency conflicts)-->
|
||||
<dependency.activemq.version>5.16.1</dependency.activemq.version>
|
||||
<dependency.apache-compress.version>1.21</dependency.apache-compress.version>
|
||||
<dependency.apache.taglibs.version>1.2.5</dependency.apache.taglibs.version>
|
||||
@@ -91,6 +91,7 @@
|
||||
<dependency.swagger-parser.version>1.0.56</dependency.swagger-parser.version>
|
||||
<dependency.maven-filtering.version>3.1.1</dependency.maven-filtering.version>
|
||||
<dependency.maven-artifact.version>3.8.4</dependency.maven-artifact.version>
|
||||
<dependency.jdom2.version>2.0.6.1</dependency.jdom2.version>
|
||||
|
||||
<dependency.jakarta-jaxb-api.version>2.3.3</dependency.jakarta-jaxb-api.version>
|
||||
<dependency.jakarta-ws-api.version>2.3.3</dependency.jakarta-ws-api.version>
|
||||
@@ -101,23 +102,23 @@
|
||||
<dependency.jakarta-jws-api.version>2.1.0</dependency.jakarta-jws-api.version>
|
||||
<dependency.jakarta-mail-api.version>1.6.5</dependency.jakarta-mail-api.version>
|
||||
<dependency.jakarta-json-api.version>1.1.6</dependency.jakarta-json-api.version>
|
||||
<dependency.jakarta-json-path.version>2.5.0</dependency.jakarta-json-path.version>
|
||||
<dependency.jakarta-json-path.version>2.7.0</dependency.jakarta-json-path.version>
|
||||
<dependency.jakarta-rpc-api.version>1.1.4</dependency.jakarta-rpc-api.version>
|
||||
|
||||
<alfresco.googledrive.version>3.2.1.3</alfresco.googledrive.version>
|
||||
<alfresco.aos-module.version>1.4.0.1</alfresco.aos-module.version>
|
||||
<alfresco.api-explorer.version>7.1.0.1</alfresco.api-explorer.version> <!-- Also in alfresco-enterprise-share -->
|
||||
<alfresco.api-explorer.version>7.2.0-A4</alfresco.api-explorer.version> <!-- Also in alfresco-enterprise-share -->
|
||||
|
||||
<alfresco.maven-plugin.version>2.2.0</alfresco.maven-plugin.version>
|
||||
<license-maven-plugin.version>2.0.1.alfresco-1</license-maven-plugin.version>
|
||||
|
||||
<dependency.postgresql.version>42.3.1</dependency.postgresql.version>
|
||||
<dependency.postgresql.version>42.3.2</dependency.postgresql.version>
|
||||
<dependency.mysql.version>8.0.27</dependency.mysql.version>
|
||||
<dependency.mysql-image.version>8</dependency.mysql-image.version>
|
||||
<dependency.mariadb.version>2.7.4</dependency.mariadb.version>
|
||||
<dependency.tas-utility.version>3.0.47</dependency.tas-utility.version>
|
||||
<dependency.rest-assured.version>3.3.0</dependency.rest-assured.version>
|
||||
<dependency.tas-restapi.version>1.67</dependency.tas-restapi.version>
|
||||
<dependency.tas-restapi.version>1.78</dependency.tas-restapi.version>
|
||||
<dependency.tas-cmis.version>1.31</dependency.tas-cmis.version>
|
||||
<dependency.tas-email.version>1.8</dependency.tas-email.version>
|
||||
<dependency.tas-webdav.version>1.6</dependency.tas-webdav.version>
|
||||
@@ -145,7 +146,7 @@
|
||||
<connection>scm:git:https://github.com/Alfresco/alfresco-community-repo.git</connection>
|
||||
<developerConnection>scm:git:https://github.com/Alfresco/alfresco-community-repo.git</developerConnection>
|
||||
<url>https://github.com/Alfresco/alfresco-community-repo</url>
|
||||
<tag>14.73</tag>
|
||||
<tag>14.128</tag>
|
||||
</scm>
|
||||
|
||||
<distributionManagement>
|
||||
@@ -562,6 +563,12 @@
|
||||
<groupId>org.alfresco</groupId>
|
||||
<artifactId>alfresco-log-sanitizer</artifactId>
|
||||
<version>${dependency.alfresco-log-sanitizer.version}</version>
|
||||
<exclusions>
|
||||
<exclusion>
|
||||
<groupId>log4j</groupId>
|
||||
<artifactId>log4j</artifactId>
|
||||
</exclusion>
|
||||
</exclusions>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>org.alfresco.aos-module</groupId>
|
||||
@@ -605,7 +612,7 @@
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>org.slf4j</groupId>
|
||||
<artifactId>slf4j-log4j12</artifactId>
|
||||
<artifactId>slf4j-reload4j</artifactId>
|
||||
<version>${dependency.slf4j.version}</version>
|
||||
</dependency>
|
||||
<dependency>
|
||||
@@ -630,7 +637,7 @@
|
||||
<dependency>
|
||||
<groupId>com.github.junrar</groupId>
|
||||
<artifactId>junrar</artifactId>
|
||||
<version>7.4.0</version>
|
||||
<version>7.4.1</version>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>com.github.fge</groupId>
|
||||
@@ -654,6 +661,12 @@
|
||||
<artifactId>commons-csv</artifactId>
|
||||
<version>1.9.0</version>
|
||||
</dependency>
|
||||
<!-- upgrade dependency from TIKA -->
|
||||
<dependency>
|
||||
<groupId>org.jdom</groupId>
|
||||
<artifactId>jdom2</artifactId>
|
||||
<version>${dependency.jdom2.version}</version>
|
||||
</dependency>
|
||||
|
||||
<dependency>
|
||||
<groupId>org.postgresql</groupId>
|
||||
@@ -753,7 +766,12 @@
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>org.apache.camel</groupId>
|
||||
<artifactId>camel-spring</artifactId>
|
||||
<artifactId>camel-core</artifactId>
|
||||
<version>${dependency.camel.version}</version>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>org.apache.camel</groupId>
|
||||
<artifactId>camel-spring-xml</artifactId>
|
||||
<version>${dependency.camel.version}</version>
|
||||
<exclusions>
|
||||
<exclusion>
|
||||
@@ -783,6 +801,7 @@
|
||||
</exclusions>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<!-- If you are going to bump dependency.camel.version, please check if the netty-codec-http has higher version that the one above.-->
|
||||
<groupId>org.apache.camel</groupId>
|
||||
<artifactId>camel-amqp</artifactId>
|
||||
<version>${dependency.camel.version}</version>
|
||||
@@ -837,7 +856,7 @@
|
||||
<dependency>
|
||||
<groupId>org.reflections</groupId>
|
||||
<artifactId>reflections</artifactId>
|
||||
<version>0.9.12</version>
|
||||
<version>0.10.2</version>
|
||||
</dependency>
|
||||
<!-- swagger parser -->
|
||||
<dependency>
|
||||
@@ -880,7 +899,7 @@
|
||||
</plugin>
|
||||
<plugin>
|
||||
<artifactId>maven-jar-plugin</artifactId>
|
||||
<version>3.2.0</version>
|
||||
<version>3.2.2</version>
|
||||
</plugin>
|
||||
<plugin>
|
||||
<artifactId>maven-war-plugin</artifactId>
|
||||
@@ -925,8 +944,8 @@
|
||||
<configuration>
|
||||
<failOnMissing>true</failOnMissing>
|
||||
<excludedScopes>provided,test</excludedScopes>
|
||||
<excludedGroups>^(org\.alfresco|com\.alfresco|org\.activiti).*</excludedGroups>
|
||||
<failIfWarning>false</failIfWarning>
|
||||
<excludedGroups>^(org\.alfresco|com\.alfresco|org\.activiti|org\.gytheio).*</excludedGroups>
|
||||
<failIfWarning>true</failIfWarning>
|
||||
<includedLicenses>
|
||||
https://raw.githubusercontent.com/Alfresco/third-party-license-overrides/master/includedLicenses.txt
|
||||
</includedLicenses>
|
||||
|
@@ -7,7 +7,7 @@
|
||||
<parent>
|
||||
<groupId>org.alfresco</groupId>
|
||||
<artifactId>alfresco-community-repo</artifactId>
|
||||
<version>14.73</version>
|
||||
<version>14.128</version>
|
||||
</parent>
|
||||
|
||||
<dependencies>
|
||||
|
@@ -47,6 +47,7 @@ import org.alfresco.repo.transaction.RetryingTransactionHelper;
|
||||
import org.alfresco.repo.transaction.RetryingTransactionHelper.RetryingTransactionCallback;
|
||||
import org.alfresco.repo.transaction.TooBusyException;
|
||||
import org.alfresco.repo.web.scripts.bean.LoginPost;
|
||||
import org.alfresco.service.cmr.repository.ArchivedIOException;
|
||||
import org.alfresco.service.cmr.repository.NodeRef;
|
||||
import org.alfresco.service.cmr.repository.TemplateService;
|
||||
import org.alfresco.service.cmr.security.AuthorityService;
|
||||
@@ -506,6 +507,10 @@ public class RepositoryContainer extends AbstractRuntimeContainer
|
||||
return;
|
||||
}
|
||||
}
|
||||
catch (ArchivedIOException e) // handle ArchivedIOException to lower log pollution
|
||||
{
|
||||
handleArchivedIOException(e);
|
||||
}
|
||||
catch (IOException e)
|
||||
{
|
||||
handleIOException(e);
|
||||
@@ -606,6 +611,10 @@ public class RepositoryContainer extends AbstractRuntimeContainer
|
||||
// Map TooBusyException to a 503 status code
|
||||
throw new WebScriptException(HttpServletResponse.SC_SERVICE_UNAVAILABLE, e.getMessage(), e);
|
||||
}
|
||||
catch (ArchivedIOException e) // handle ArchivedIOException to lower log pollution
|
||||
{
|
||||
handleArchivedIOException(e);
|
||||
}
|
||||
|
||||
// Ensure a response is always flushed after successful execution
|
||||
if (bufferedRes != null)
|
||||
@@ -615,6 +624,19 @@ public class RepositoryContainer extends AbstractRuntimeContainer
|
||||
}
|
||||
}
|
||||
|
||||
private void handleArchivedIOException(ArchivedIOException e)
|
||||
{
|
||||
if (logger.isDebugEnabled()) // log with stack trace at debug level
|
||||
{
|
||||
logger.debug("ArchivedIOException error ", e);
|
||||
}
|
||||
else if (logger.isInfoEnabled()) // log without stack trace at info level
|
||||
{
|
||||
logger.info("ArchivedIOException error. Message: " + e.getMessage());
|
||||
}
|
||||
throw new WebScriptException(HttpServletResponse.SC_PRECONDITION_FAILED, "Content is archived and not accessible.");
|
||||
}
|
||||
|
||||
private static void handleIOException(final IOException ioe) throws IOException
|
||||
{
|
||||
Throwable socketException = ExceptionStackUtil.getCause(ioe, SocketException.class);
|
||||
|
@@ -30,49 +30,37 @@ import org.alfresco.rest.api.model.ArchiveContentRequest;
|
||||
import org.alfresco.rest.api.model.ContentStorageInfo;
|
||||
import org.alfresco.rest.api.model.RestoreArchivedContentRequest;
|
||||
import org.alfresco.rest.framework.resource.parameters.Parameters;
|
||||
import org.alfresco.service.Experimental;
|
||||
import org.alfresco.service.cmr.repository.NodeRef;
|
||||
|
||||
/**
|
||||
* Storage information for content API.
|
||||
* Note: Currently marked as experimental and subject to change.
|
||||
*
|
||||
* @author mpichura
|
||||
*/
|
||||
@Experimental
|
||||
public interface ContentStorageInformation
|
||||
{
|
||||
/**
|
||||
* Note: Currently marked as experimental and subject to change.
|
||||
*
|
||||
* @param nodeRef Node reference
|
||||
* @param contentPropName Qualified name of content property (e.g. 'cm_content')
|
||||
* @param parameters {@link Parameters} object to get the parameters passed into the request
|
||||
* @return {@link ContentStorageInfo} object consisting of qualified name of content property and a map of storage properties
|
||||
*/
|
||||
@Experimental
|
||||
ContentStorageInfo getStorageInfo(NodeRef nodeRef, String contentPropName, Parameters parameters);
|
||||
|
||||
/**
|
||||
* Note: Currently marked as experimental and subject to change.
|
||||
*
|
||||
* @param nodeRef Node reference
|
||||
* @param contentPropName Qualified name of content property (e.g. 'cm_content')
|
||||
* @param archiveContentRequest {@link ArchiveContentRequest} object holding parameters for archive content request
|
||||
* @return true when request successful, false when unsuccessful
|
||||
*/
|
||||
@Experimental
|
||||
boolean requestArchiveContent(NodeRef nodeRef, String contentPropName, ArchiveContentRequest archiveContentRequest);
|
||||
|
||||
/**
|
||||
* Note: Currently marked as experimental and subject to change.
|
||||
*
|
||||
* @param nodeRef Node reference
|
||||
* @param contentPropName Qualified name of content property (e.g. 'cm_content')
|
||||
* @param restoreArchivedContentRequest {@link RestoreArchivedContentRequest} object holding parameters for restore from archive request
|
||||
* @return true when request successful, false when unsuccessful
|
||||
*/
|
||||
@Experimental
|
||||
boolean requestRestoreContentFromArchive(NodeRef nodeRef, String contentPropName,
|
||||
RestoreArchivedContentRequest restoreArchivedContentRequest);
|
||||
}
|
||||
|
@@ -2,7 +2,7 @@
|
||||
* #%L
|
||||
* Alfresco Remote API
|
||||
* %%
|
||||
* Copyright (C) 2005 - 2021 Alfresco Software Limited
|
||||
* Copyright (C) 2005 - 2022 Alfresco Software Limited
|
||||
* %%
|
||||
* This file is part of the Alfresco software.
|
||||
* If the software was purchased under a paid Alfresco license, the terms of
|
||||
@@ -147,6 +147,25 @@ public interface Renditions
|
||||
void createRenditions(NodeRef nodeRef, String versionId, List<Rendition> renditions, Parameters parameters)
|
||||
throws NotFoundException, ConstraintViolatedException;
|
||||
|
||||
/**
|
||||
* Delete the rendition node.
|
||||
*
|
||||
* @param nodeRef the source nodeRef, ie. live node
|
||||
* @param renditionId the rendition id
|
||||
* @param parameters the {@link Parameters} object to get the parameters passed into the request
|
||||
*/
|
||||
void deleteRendition(NodeRef nodeRef, String renditionId, Parameters parameters);
|
||||
|
||||
/**
|
||||
* Delete the rendition node.
|
||||
*
|
||||
* @param nodeRef the source nodeRef, ie. live node
|
||||
* @param versionId the version id (aka version label)
|
||||
* @param renditionId the rendition id
|
||||
* @param parameters the {@link Parameters} object to get the parameters passed into the request
|
||||
*/
|
||||
void deleteRendition(NodeRef nodeRef, String versionId, String renditionId, Parameters parameters);
|
||||
|
||||
/**
|
||||
* Downloads rendition.
|
||||
*
|
||||
|
@@ -33,7 +33,6 @@ import org.alfresco.rest.api.model.ContentStorageInfo;
|
||||
import org.alfresco.rest.api.model.RestoreArchivedContentRequest;
|
||||
import org.alfresco.rest.framework.core.exceptions.RestoreInProgressException;
|
||||
import org.alfresco.rest.framework.resource.parameters.Parameters;
|
||||
import org.alfresco.service.Experimental;
|
||||
import org.alfresco.service.cmr.repository.ContentService;
|
||||
import org.alfresco.service.cmr.repository.NodeRef;
|
||||
import org.alfresco.service.namespace.NamespaceService;
|
||||
@@ -45,11 +44,9 @@ import java.util.Map;
|
||||
|
||||
/**
|
||||
* Default implementation for {@link ContentStorageInformation}
|
||||
* Note: Currently marked as experimental and subject to change.
|
||||
*
|
||||
* @author mpichura
|
||||
*/
|
||||
@Experimental
|
||||
public class ContentStorageInformationImpl implements ContentStorageInformation
|
||||
{
|
||||
|
||||
@@ -68,7 +65,6 @@ public class ContentStorageInformationImpl implements ContentStorageInformation
|
||||
* {@inheritDoc}
|
||||
*/
|
||||
@Override
|
||||
@Experimental
|
||||
public ContentStorageInfo getStorageInfo(NodeRef nodeRef, String contentPropName, Parameters parameters)
|
||||
{
|
||||
final QName propQName = getQName(contentPropName);
|
||||
|
@@ -38,7 +38,6 @@ import org.alfresco.rest.api.Nodes;
|
||||
import org.alfresco.rest.api.model.Download;
|
||||
import org.alfresco.rest.framework.core.exceptions.InvalidArgumentException;
|
||||
import org.alfresco.rest.framework.core.exceptions.PermissionDeniedException;
|
||||
import org.alfresco.service.Experimental;
|
||||
import org.alfresco.service.cmr.download.DownloadService;
|
||||
import org.alfresco.service.cmr.download.DownloadStatus;
|
||||
import org.alfresco.service.cmr.module.ModuleService;
|
||||
@@ -214,7 +213,6 @@ public class DownloadsImpl implements Downloads
|
||||
* @param checkLimit The maximum number of nodes to check, set to -1 for no limit
|
||||
* @see #checkArchiveStatus(NodeRef[], int, Set)
|
||||
*/
|
||||
@Experimental
|
||||
protected void checkArchiveStatus(NodeRef[] nodeRefs, int checkLimit)
|
||||
{
|
||||
if (canCheckArchived())
|
||||
@@ -234,7 +232,6 @@ public class DownloadsImpl implements Downloads
|
||||
* @param checkLimit The maximum number of nodes to check, set to -1 for no limit
|
||||
* @param cache Tracks nodes that we have already checked, if null an empty cache will be created
|
||||
*/
|
||||
@Experimental
|
||||
private void checkArchiveStatus(NodeRef[] nodeRefs, int checkLimit, Set<NodeRef> cache)
|
||||
{
|
||||
// Create the cache for recursive calls.
|
||||
@@ -291,7 +288,6 @@ public class DownloadsImpl implements Downloads
|
||||
}
|
||||
}
|
||||
|
||||
@Experimental
|
||||
protected boolean canCheckArchived()
|
||||
{
|
||||
return Arrays.stream(CLOUD_CONNECTOR_MODULES).anyMatch(m-> moduleService.getModule(m) != null);
|
||||
|
@@ -3134,9 +3134,6 @@ public class NodesImpl implements Nodes
|
||||
}
|
||||
|
||||
if ((versionMajor != null) || (versionComment != null))
|
||||
{
|
||||
behaviourFilter.disableBehaviour(nodeRef, ContentModel.ASPECT_VERSIONABLE);
|
||||
try
|
||||
{
|
||||
// by default, first version is major, unless specified otherwise
|
||||
VersionType versionType = VersionType.MAJOR;
|
||||
@@ -3146,12 +3143,7 @@ public class NodesImpl implements Nodes
|
||||
}
|
||||
|
||||
createVersion(nodeRef, false, versionType, versionComment);
|
||||
|
||||
extractMetadata(nodeRef);
|
||||
} finally
|
||||
{
|
||||
behaviourFilter.enableBehaviour(nodeRef, ContentModel.ASPECT_VERSIONABLE);
|
||||
}
|
||||
}
|
||||
|
||||
return nodeRef;
|
||||
|
@@ -2,7 +2,7 @@
|
||||
* #%L
|
||||
* Alfresco Remote API
|
||||
* %%
|
||||
* Copyright (C) 2005 - 2021 Alfresco Software LimitedP
|
||||
* Copyright (C) 2005 - 2022 Alfresco Software LimitedP
|
||||
* %%
|
||||
* This file is part of the Alfresco software.
|
||||
* If the software was purchased under a paid Alfresco license, the terms of
|
||||
@@ -444,6 +444,31 @@ public class RenditionsImpl implements Renditions, ResourceLoaderAware
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
public void deleteRendition(NodeRef nodeRef, String renditionId, Parameters parameters)
|
||||
{
|
||||
deleteRendition(nodeRef, null, renditionId, parameters);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void deleteRendition(NodeRef nodeRef, String versionId, String renditionId, Parameters parameters)
|
||||
{
|
||||
if (!renditionService2.isEnabled())
|
||||
{
|
||||
throw new DisabledServiceException("Rendition generation has been disabled.");
|
||||
}
|
||||
|
||||
final NodeRef validatedNodeRef = validateNode(nodeRef.getStoreRef(), nodeRef.getId(), versionId, parameters);
|
||||
NodeRef renditionNodeRef = getRenditionByName(validatedNodeRef, renditionId, parameters);
|
||||
|
||||
if (renditionNodeRef == null)
|
||||
{
|
||||
throw new NotFoundException(renditionId + " is not registered.");
|
||||
}
|
||||
|
||||
renditionService2.clearRenditionContentDataInTransaction(renditionNodeRef);
|
||||
}
|
||||
|
||||
private String getName(Rendition rendition)
|
||||
{
|
||||
String renditionName = rendition.getId();
|
||||
|
@@ -26,19 +26,15 @@
|
||||
|
||||
package org.alfresco.rest.api.model;
|
||||
|
||||
import org.alfresco.service.Experimental;
|
||||
|
||||
import java.io.Serializable;
|
||||
import java.util.HashMap;
|
||||
import java.util.Map;
|
||||
|
||||
/**
|
||||
* Request for content archive.
|
||||
* Marked as experimental and subject to change.
|
||||
*
|
||||
* @author mpichura
|
||||
*/
|
||||
@Experimental
|
||||
public class ArchiveContentRequest
|
||||
{
|
||||
/**
|
||||
|
@@ -26,15 +26,11 @@
|
||||
|
||||
package org.alfresco.rest.api.model;
|
||||
|
||||
import org.alfresco.service.Experimental;
|
||||
|
||||
/**
|
||||
* Request for restore content from archive.
|
||||
* Marked as experimental and subject to change.
|
||||
*
|
||||
* @author mpichura
|
||||
*/
|
||||
@Experimental
|
||||
public class RestoreArchivedContentRequest
|
||||
{
|
||||
/**
|
||||
|
@@ -2,7 +2,7 @@
|
||||
* #%L
|
||||
* Alfresco Remote API
|
||||
* %%
|
||||
* Copyright (C) 2005 - 2021 Alfresco Software Limited
|
||||
* Copyright (C) 2005 - 2022 Alfresco Software Limited
|
||||
* %%
|
||||
* This file is part of the Alfresco software.
|
||||
* If the software was purchased under a paid Alfresco license, the terms of
|
||||
@@ -65,6 +65,7 @@ public class NodeRenditionsRelation implements RelationshipResourceAction.Read<R
|
||||
RelationshipResourceAction.ReadById<Rendition>,
|
||||
RelationshipResourceAction.Create<Rendition>,
|
||||
RelationshipResourceBinaryAction.Read,
|
||||
RelationshipResourceAction.Delete,
|
||||
InitializingBean
|
||||
{
|
||||
|
||||
@@ -110,6 +111,14 @@ public class NodeRenditionsRelation implements RelationshipResourceAction.Read<R
|
||||
return null;
|
||||
}
|
||||
|
||||
@WebApiDescription(title = "Delete rendition")
|
||||
@Override
|
||||
public void delete(String nodeId, String renditionId, Parameters parameters)
|
||||
{
|
||||
NodeRef nodeRef = new NodeRef(StoreRef.STORE_REF_WORKSPACE_SPACESSTORE, nodeId);
|
||||
renditions.deleteRendition(nodeRef, renditionId, parameters);
|
||||
}
|
||||
|
||||
@WebApiDescription(title = "Download rendition", description = "Download rendition")
|
||||
@BinaryProperties({ "content" })
|
||||
@Override
|
||||
|
@@ -39,7 +39,6 @@ import org.alfresco.rest.framework.resource.RelationshipResource;
|
||||
import org.alfresco.rest.framework.resource.actions.interfaces.RelationshipResourceAction;
|
||||
import org.alfresco.rest.framework.resource.parameters.Parameters;
|
||||
import org.alfresco.rest.framework.webscripts.WithResponse;
|
||||
import org.alfresco.service.Experimental;
|
||||
import org.alfresco.service.cmr.repository.NodeRef;
|
||||
import org.alfresco.service.cmr.repository.StoreRef;
|
||||
import org.alfresco.util.PropertyCheck;
|
||||
@@ -49,11 +48,9 @@ import javax.servlet.http.HttpServletResponse;
|
||||
|
||||
/**
|
||||
* Node storage information.
|
||||
* Note: Currently marked as experimental and subject to change.
|
||||
*
|
||||
* @author mpichura
|
||||
*/
|
||||
@Experimental
|
||||
@RelationshipResource(name = "storage-info", entityResource = NodesEntityResource.class, title = "Node's content storage information")
|
||||
public class NodeStorageInfoRelation implements RelationshipResourceAction.ReadById<ContentStorageInfo>, InitializingBean
|
||||
{
|
||||
@@ -82,7 +79,6 @@ public class NodeStorageInfoRelation implements RelationshipResourceAction.ReadB
|
||||
return storageInformation.getStorageInfo(nodeRef, contentPropName, parameters);
|
||||
}
|
||||
|
||||
@Experimental
|
||||
@Operation("archive")
|
||||
@WebApiParam(name = "archiveContentRequest", title = "Request for archive content",
|
||||
description = "Optional parameters for archive content", kind = ResourceParameter.KIND.HTTP_BODY_OBJECT)
|
||||
@@ -103,7 +99,6 @@ public class NodeStorageInfoRelation implements RelationshipResourceAction.ReadB
|
||||
}
|
||||
}
|
||||
|
||||
@Experimental
|
||||
@Operation("archive-restore")
|
||||
@WebApiParam(name = "restoreArchivedContentRequest", title = "Request for restore content from archive",
|
||||
description = "Optional parameters for restore content from archive", kind = ResourceParameter.KIND.HTTP_BODY_OBJECT)
|
||||
|
@@ -2,7 +2,7 @@
|
||||
* #%L
|
||||
* Alfresco Remote API
|
||||
* %%
|
||||
* Copyright (C) 2005 - 2021 Alfresco Software Limited
|
||||
* Copyright (C) 2005 - 2022 Alfresco Software Limited
|
||||
* %%
|
||||
* This file is part of the Alfresco software.
|
||||
* If the software was purchased under a paid Alfresco license, the terms of
|
||||
@@ -26,18 +26,28 @@
|
||||
|
||||
package org.alfresco.rest.api.nodes;
|
||||
|
||||
import javax.servlet.http.HttpServletResponse;
|
||||
import java.util.List;
|
||||
|
||||
import org.alfresco.repo.content.directurl.DirectAccessUrlDisabledException;
|
||||
import org.alfresco.rest.api.DirectAccessUrlHelper;
|
||||
import org.alfresco.rest.api.Renditions;
|
||||
import org.alfresco.rest.api.model.DirectAccessUrlRequest;
|
||||
import org.alfresco.rest.api.model.Rendition;
|
||||
import org.alfresco.rest.framework.BinaryProperties;
|
||||
import org.alfresco.rest.framework.Operation;
|
||||
import org.alfresco.rest.framework.WebApiDescription;
|
||||
import org.alfresco.rest.framework.WebApiParam;
|
||||
import org.alfresco.rest.framework.core.ResourceParameter;
|
||||
import org.alfresco.rest.framework.core.exceptions.DisabledServiceException;
|
||||
import org.alfresco.rest.framework.resource.RelationshipResource;
|
||||
import org.alfresco.rest.framework.resource.actions.interfaces.RelationshipResourceAction;
|
||||
import org.alfresco.rest.framework.resource.actions.interfaces.RelationshipResourceBinaryAction;
|
||||
import org.alfresco.rest.framework.resource.content.BinaryResource;
|
||||
import org.alfresco.rest.framework.resource.parameters.CollectionWithPagingInfo;
|
||||
import org.alfresco.rest.framework.resource.parameters.Parameters;
|
||||
import org.alfresco.rest.framework.webscripts.WithResponse;
|
||||
import org.alfresco.service.cmr.repository.DirectAccessUrl;
|
||||
import org.alfresco.service.cmr.repository.NodeRef;
|
||||
import org.alfresco.service.cmr.repository.StoreRef;
|
||||
import org.alfresco.util.PropertyCheck;
|
||||
@@ -51,7 +61,9 @@ import org.springframework.extensions.webscripts.Status;
|
||||
* - GET /nodes/{nodeId}/versions/{versionId}/renditions
|
||||
* - POST /nodes/{nodeId}/versions/{versionId}/renditions
|
||||
* - GET /nodes/{nodeId}/versions/{versionId}/renditions/{renditionId}
|
||||
* - DELETE /nodes/{nodeId}/versions/{versionId}/renditions/{renditionId}
|
||||
* - GET /nodes/{nodeId}/versions/{versionId}/renditions/{renditionId}/content
|
||||
* - POST /nodes/{nodeId}/versions/{versionId}/renditions/{renditionId}/request-direct-access-url
|
||||
*
|
||||
* @author janv
|
||||
*/
|
||||
@@ -59,16 +71,23 @@ import org.springframework.extensions.webscripts.Status;
|
||||
public class NodeVersionRenditionsRelation implements RelationshipResourceAction.Read<Rendition>,
|
||||
RelationshipResourceAction.ReadById<Rendition>,
|
||||
RelationshipResourceAction.Create<Rendition>,
|
||||
RelationshipResourceAction.Delete,
|
||||
RelationshipResourceBinaryAction.Read,
|
||||
InitializingBean
|
||||
{
|
||||
private Renditions renditions;
|
||||
private DirectAccessUrlHelper directAccessUrlHelper;
|
||||
|
||||
public void setRenditions(Renditions renditions)
|
||||
{
|
||||
this.renditions = renditions;
|
||||
}
|
||||
|
||||
public void setDirectAccessUrlHelper(DirectAccessUrlHelper directAccessUrlHelper)
|
||||
{
|
||||
this.directAccessUrlHelper = directAccessUrlHelper;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void afterPropertiesSet() throws Exception
|
||||
{
|
||||
@@ -115,4 +134,43 @@ public class NodeVersionRenditionsRelation implements RelationshipResourceAction
|
||||
return renditions.getContent(nodeRef, versionId, renditionId, parameters);
|
||||
}
|
||||
|
||||
@Operation ("request-direct-access-url")
|
||||
@WebApiParam (name = "directAccessUrlRequest",
|
||||
title = "Request direct access url",
|
||||
description = "Options for direct access url request",
|
||||
kind = ResourceParameter.KIND.HTTP_BODY_OBJECT)
|
||||
@WebApiDescription(title = "Request content url",
|
||||
description="Generates a direct access URL.",
|
||||
successStatus = HttpServletResponse.SC_OK)
|
||||
public DirectAccessUrl requestContentDirectUrl(String nodeId,
|
||||
String versionId,
|
||||
DirectAccessUrlRequest directAccessUrlRequest,
|
||||
Parameters parameters, WithResponse withResponse)
|
||||
{
|
||||
boolean attachment = directAccessUrlHelper.getAttachment(directAccessUrlRequest);
|
||||
Long validFor = directAccessUrlHelper.getDefaultExpiryTimeInSec();
|
||||
NodeRef nodeRef = new NodeRef(StoreRef.STORE_REF_WORKSPACE_SPACESSTORE, nodeId);
|
||||
String renditionId = parameters.getRelationship2Id();
|
||||
|
||||
DirectAccessUrl directAccessUrl;
|
||||
try
|
||||
{
|
||||
directAccessUrl = renditions.requestContentDirectUrl(nodeRef, versionId, renditionId, attachment, validFor);
|
||||
}
|
||||
catch (DirectAccessUrlDisabledException ex)
|
||||
{
|
||||
throw new DisabledServiceException(ex.getMessage());
|
||||
}
|
||||
return directAccessUrl;
|
||||
}
|
||||
|
||||
@WebApiDescription(title = "Delete rendition")
|
||||
@Override
|
||||
public void delete(String nodeId, String versionId, Parameters parameters)
|
||||
{
|
||||
String renditionId = parameters.getRelationship2Id();
|
||||
|
||||
NodeRef nodeRef = new NodeRef(StoreRef.STORE_REF_WORKSPACE_SPACESSTORE, nodeId);
|
||||
renditions.deleteRendition(nodeRef, versionId, renditionId, parameters);
|
||||
}
|
||||
}
|
||||
|
@@ -40,7 +40,6 @@ import org.alfresco.rest.framework.resource.RelationshipResource;
|
||||
import org.alfresco.rest.framework.resource.actions.interfaces.RelationshipResourceAction;
|
||||
import org.alfresco.rest.framework.resource.parameters.Parameters;
|
||||
import org.alfresco.rest.framework.webscripts.WithResponse;
|
||||
import org.alfresco.service.Experimental;
|
||||
import org.alfresco.service.cmr.repository.NodeRef;
|
||||
import org.alfresco.service.cmr.version.Version;
|
||||
import org.alfresco.util.PropertyCheck;
|
||||
@@ -53,11 +52,8 @@ import javax.servlet.http.HttpServletResponse;
|
||||
*
|
||||
* - GET /nodes/{nodeId}/versions/{versionId}/storage-info/{contentPropQNameId}
|
||||
*
|
||||
* Note: Currently marked as experimental and subject to change.
|
||||
*
|
||||
* @author janv
|
||||
*/
|
||||
@Experimental
|
||||
@RelationshipResource(name = "storage-info", entityResource = NodeVersionsRelation.class, title = "Node Version's content storage information")
|
||||
public class NodeVersionsStorageInfoRelation implements RelationshipResourceAction.ReadById<ContentStorageInfo>, InitializingBean
|
||||
{
|
||||
@@ -86,18 +82,11 @@ public class NodeVersionsStorageInfoRelation implements RelationshipResourceActi
|
||||
{
|
||||
String contentPropQNameId = parameters.getRelationship2Id();
|
||||
|
||||
Version version = nodeVersions.findVersion(nodeId, versionId);
|
||||
NodeRef versionNodeRef = findVersionNodeRef(nodeId, versionId);
|
||||
|
||||
if (version != null)
|
||||
{
|
||||
NodeRef versionNodeRef = version.getFrozenStateNodeRef();
|
||||
return storageInformation.getStorageInfo(versionNodeRef, contentPropQNameId, parameters);
|
||||
}
|
||||
|
||||
throw new EntityNotFoundException(nodeId+"-"+versionId);
|
||||
}
|
||||
|
||||
@Experimental
|
||||
@Operation("archive")
|
||||
@WebApiParam(name = "archiveContentRequest", title = "Request for archive version content",
|
||||
description = "Optional parameters for archive version content", kind = ResourceParameter.KIND.HTTP_BODY_OBJECT)
|
||||
@@ -109,11 +98,8 @@ public class NodeVersionsStorageInfoRelation implements RelationshipResourceActi
|
||||
{
|
||||
String contentPropQNameId = parameters.getRelationship2Id();
|
||||
|
||||
Version version = nodeVersions.findVersion(nodeId, versionId);
|
||||
NodeRef versionNodeRef = findVersionNodeRef(nodeId, versionId);
|
||||
|
||||
if (version != null)
|
||||
{
|
||||
NodeRef versionNodeRef = version.getFrozenStateNodeRef();
|
||||
final boolean result = storageInformation.requestArchiveContent(versionNodeRef, contentPropQNameId, archiveContentRequest);
|
||||
if (result)
|
||||
{
|
||||
@@ -125,10 +111,6 @@ public class NodeVersionsStorageInfoRelation implements RelationshipResourceActi
|
||||
}
|
||||
}
|
||||
|
||||
throw new EntityNotFoundException(nodeId+"-"+versionId);
|
||||
}
|
||||
|
||||
@Experimental
|
||||
@Operation("archive-restore")
|
||||
@WebApiParam(name = "restoreArchivedContentRequest", title = "Request for restore version content from archive",
|
||||
description = "Optional parameters for restore version content from archive", kind = ResourceParameter.KIND.HTTP_BODY_OBJECT)
|
||||
@@ -140,11 +122,8 @@ public class NodeVersionsStorageInfoRelation implements RelationshipResourceActi
|
||||
{
|
||||
String contentPropQNameId = parameters.getRelationship2Id();
|
||||
|
||||
Version version = nodeVersions.findVersion(nodeId, versionId);
|
||||
NodeRef versionNodeRef = findVersionNodeRef(nodeId, versionId);
|
||||
|
||||
if (version != null)
|
||||
{
|
||||
NodeRef versionNodeRef = version.getFrozenStateNodeRef();
|
||||
final boolean result = storageInformation.requestRestoreContentFromArchive(versionNodeRef, contentPropQNameId, restoreArchivedContentRequest);
|
||||
if (result)
|
||||
{
|
||||
@@ -156,6 +135,13 @@ public class NodeVersionsStorageInfoRelation implements RelationshipResourceActi
|
||||
}
|
||||
}
|
||||
|
||||
private NodeRef findVersionNodeRef(String nodeId, String versionId)
|
||||
{
|
||||
Version version = nodeVersions.findVersion(nodeId, versionId);
|
||||
if (version == null)
|
||||
{
|
||||
throw new EntityNotFoundException(nodeId+"-"+versionId);
|
||||
}
|
||||
return version.getFrozenStateNodeRef();
|
||||
}
|
||||
}
|
||||
|
@@ -25,15 +25,12 @@
|
||||
*/
|
||||
package org.alfresco.rest.framework.core.exceptions;
|
||||
|
||||
import org.alfresco.service.Experimental;
|
||||
|
||||
/**
|
||||
* Thrown when the content is archived and not readily accessible.
|
||||
* Status is <i>Precondition Failed</i> client error = 412.
|
||||
*
|
||||
* @author David Edwards
|
||||
*/
|
||||
@Experimental
|
||||
public class ArchivedContentException extends ApiException
|
||||
{
|
||||
|
||||
|
@@ -25,9 +25,6 @@
|
||||
*/
|
||||
package org.alfresco.rest.framework.core.exceptions;
|
||||
|
||||
import org.alfresco.service.Experimental;
|
||||
|
||||
@Experimental
|
||||
public class RestoreInProgressException extends ApiException
|
||||
{
|
||||
public static String DEFAULT_MESSAGE_ID = "framework.exception.RestoreInProgress";
|
||||
|
@@ -2,7 +2,7 @@
|
||||
* #%L
|
||||
* Alfresco Remote API
|
||||
* %%
|
||||
* Copyright (C) 2005 - 2020 Alfresco Software Limited
|
||||
* Copyright (C) 2005 - 2022 Alfresco Software Limited
|
||||
* %%
|
||||
* This file is part of the Alfresco software.
|
||||
* If the software was purchased under a paid Alfresco license, the terms of
|
||||
@@ -188,6 +188,8 @@ public class Params implements Parameters
|
||||
builder.append(this.entityId);
|
||||
builder.append(", relationshipId=");
|
||||
builder.append(this.relationshipId);
|
||||
builder.append(", relationship2Id=");
|
||||
builder.append(this.relationship2Id);
|
||||
builder.append(", passedIn=");
|
||||
builder.append(this.passedIn);
|
||||
builder.append(", paging=");
|
||||
|
@@ -2,7 +2,7 @@
|
||||
* #%L
|
||||
* Alfresco Remote API
|
||||
* %%
|
||||
* Copyright (C) 2005 - 2020 Alfresco Software Limited
|
||||
* Copyright (C) 2005 - 2022 Alfresco Software Limited
|
||||
* %%
|
||||
* This file is part of the Alfresco software.
|
||||
* If the software was purchased under a paid Alfresco license, the terms of
|
||||
@@ -68,6 +68,7 @@ public class ResourceWebScriptDelete extends AbstractResourceWebScript implement
|
||||
final Map<String, String> resourceVars = locator.parseTemplateVars(req.getServiceMatch().getTemplateVars());
|
||||
final String entityId = resourceVars.get(ResourceLocator.ENTITY_ID);
|
||||
final String relationshipId = resourceVars.get(ResourceLocator.RELATIONSHIP_ID);
|
||||
final String relationship2Id = resourceVars.get(ResourceLocator.RELATIONSHIP2_ID);
|
||||
|
||||
final Params.RecognizedParams params = getRecognizedParams(req);
|
||||
|
||||
@@ -78,7 +79,15 @@ public class ResourceWebScriptDelete extends AbstractResourceWebScript implement
|
||||
return Params.valueOf(params, entityId, relationshipId, req);
|
||||
case RELATIONSHIP:
|
||||
// note: relationshipId can be null - when deleting a related set/collection
|
||||
if (StringUtils.isNotBlank(relationship2Id))
|
||||
{
|
||||
return Params.valueOf(false, entityId, relationshipId, relationship2Id,
|
||||
null, null, null, params, null, req);
|
||||
}
|
||||
else
|
||||
{
|
||||
return Params.valueOf(params, entityId, relationshipId, req);
|
||||
}
|
||||
case PROPERTY:
|
||||
final String resourceName = resourceVars.get(ResourceLocator.RELATIONSHIP_RESOURCE);
|
||||
final String propertyName = resourceVars.get(ResourceLocator.PROPERTY);
|
||||
|
@@ -29,8 +29,12 @@ package org.alfresco.web.app.servlet;
|
||||
import java.io.IOException;
|
||||
import java.util.Properties;
|
||||
|
||||
import javax.servlet.ServletContext;
|
||||
import javax.servlet.*;
|
||||
import javax.servlet.http.HttpServletRequest;
|
||||
import javax.servlet.http.HttpServletResponse;
|
||||
|
||||
import org.alfresco.error.AlfrescoRuntimeException;
|
||||
import org.alfresco.httpclient.HttpClientFactory;
|
||||
import org.alfresco.httpclient.HttpClientFactory.SecureCommsType;
|
||||
import org.alfresco.web.scripts.servlet.X509ServletFilterBase;
|
||||
import org.apache.commons.logging.Log;
|
||||
@@ -46,40 +50,85 @@ import org.springframework.web.context.support.WebApplicationContextUtils;
|
||||
|
||||
public class AlfrescoX509ServletFilter extends X509ServletFilterBase
|
||||
{
|
||||
private static final String BEAN_GLOBAL_PROPERTIES = "global-properties";
|
||||
private static final String SECURE_COMMS = "solr.secureComms";
|
||||
|
||||
private SecureCommsType secureComms = SecureCommsType.HTTPS;
|
||||
|
||||
private String sharedSecret;
|
||||
|
||||
private String sharedSecretHeader = HttpClientFactory.DEFAULT_SHAREDSECRET_HEADER;
|
||||
|
||||
private static final String BEAN_GLOBAL_PROPERTIES = "global-properties";
|
||||
private static final String PROP_SECURE_COMMS = "solr.secureComms";
|
||||
private static final String PROP_SHARED_SECRET = "solr.sharedSecret";
|
||||
private static final String PROP_SHARED_SECRET_HEADER = "solr.sharedSecret.header";
|
||||
private static Log logger = LogFactory.getLog(AlfrescoX509ServletFilter.class);
|
||||
|
||||
public void init(FilterConfig config) throws ServletException
|
||||
{
|
||||
WebApplicationContext wc = WebApplicationContextUtils.getRequiredWebApplicationContext(config.getServletContext());
|
||||
Properties globalProperties = (Properties) wc.getBean(BEAN_GLOBAL_PROPERTIES);
|
||||
String secureCommsProp = globalProperties.getProperty(PROP_SECURE_COMMS);
|
||||
if(secureCommsProp != null && !secureCommsProp.isEmpty()) {
|
||||
secureComms = SecureCommsType.getType(secureCommsProp);
|
||||
}
|
||||
sharedSecret = globalProperties.getProperty(PROP_SHARED_SECRET);
|
||||
sharedSecretHeader = globalProperties.getProperty(PROP_SHARED_SECRET_HEADER);
|
||||
if(secureComms == SecureCommsType.SECRET)
|
||||
{
|
||||
if(sharedSecret == null || sharedSecret.length()==0)
|
||||
{
|
||||
logger.fatal("Missing value for solr.sharedSecret configuration property. If solr.secureComms is set to \"secret\", a value for solr.sharedSecret is required. See https://docs.alfresco.com/search-services/latest/install/options/");
|
||||
throw new AlfrescoRuntimeException("Missing value for solr.sharedSecret configuration property");
|
||||
}
|
||||
if(sharedSecretHeader == null || sharedSecretHeader.length()==0)
|
||||
{
|
||||
throw new AlfrescoRuntimeException("Missing value for sharedSecretHeader");
|
||||
}
|
||||
}
|
||||
|
||||
if(secureComms == SecureCommsType.NONE)
|
||||
{
|
||||
if(!"true".equalsIgnoreCase(config.getInitParameter("allow-unauthenticated-solr-endpoint")))
|
||||
{
|
||||
throw new AlfrescoRuntimeException("solr.secureComms=none is no longer supported. Please use https or secret");
|
||||
}
|
||||
}
|
||||
|
||||
super.init(config);
|
||||
}
|
||||
|
||||
public void doFilter(ServletRequest request,
|
||||
ServletResponse response,
|
||||
FilterChain chain) throws IOException, ServletException
|
||||
{
|
||||
HttpServletRequest httpRequest = (HttpServletRequest)request;
|
||||
HttpServletResponse httpResponse = (HttpServletResponse) response;
|
||||
switch(secureComms) {
|
||||
case HTTPS:
|
||||
super.doFilter(request,response,chain);
|
||||
return;
|
||||
case SECRET:
|
||||
if(sharedSecret.equals(httpRequest.getHeader(sharedSecretHeader)))
|
||||
{
|
||||
chain.doFilter(request, response);
|
||||
}
|
||||
else
|
||||
{
|
||||
httpResponse.sendError(HttpServletResponse.SC_FORBIDDEN, "Authentication failure");
|
||||
}
|
||||
return;
|
||||
case NONE:
|
||||
chain.doFilter(request,response);
|
||||
return;
|
||||
default:
|
||||
httpResponse.sendError(HttpServletResponse.SC_FORBIDDEN, "Authentication failure");
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
protected boolean checkEnforce(ServletContext servletContext) throws IOException
|
||||
{
|
||||
/*
|
||||
* Get the secureComms setting from the global properties bean.
|
||||
*/
|
||||
|
||||
WebApplicationContext wc = WebApplicationContextUtils.getRequiredWebApplicationContext(servletContext);
|
||||
Properties globalProperties = (Properties) wc.getBean(BEAN_GLOBAL_PROPERTIES);
|
||||
String prop = globalProperties.getProperty(SECURE_COMMS);
|
||||
|
||||
if(logger.isDebugEnabled())
|
||||
{
|
||||
logger.debug("secureComms:"+prop);
|
||||
return secureComms == SecureCommsType.HTTPS;
|
||||
}
|
||||
|
||||
/*
|
||||
* Return true or false based on the property. This will switch on/off X509 enforcement in the X509ServletFilterBase.
|
||||
*/
|
||||
|
||||
if (prop == null ||
|
||||
SecureCommsType.getType(prop) == SecureCommsType.NONE ||
|
||||
SecureCommsType.getType(prop) == SecureCommsType.SECRET)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
else
|
||||
{
|
||||
return true;
|
||||
}
|
||||
}
|
||||
}
|
@@ -1452,6 +1452,7 @@
|
||||
|
||||
<bean class="org.alfresco.rest.api.nodes.NodeVersionRenditionsRelation">
|
||||
<property name="renditions" ref="Renditions" />
|
||||
<property name="directAccessUrlHelper" ref="directAccessUrlHelper" />
|
||||
</bean>
|
||||
|
||||
<bean class="org.alfresco.rest.api.quicksharelinks.QuickShareLinkRenditionsRelation">
|
||||
|
@@ -51,8 +51,11 @@ import org.junit.runners.Suite;
|
||||
org.alfresco.rest.api.tests.GroupsTest.class,
|
||||
org.alfresco.rest.api.tests.ModulePackagesApiTest.class,
|
||||
org.alfresco.rest.api.tests.NodeApiTest.class,
|
||||
org.alfresco.rest.api.tests.NodeApiVersioningMultipartParameterizedTest.class,
|
||||
org.alfresco.rest.api.tests.NodeApiVersioningJsonParameterizedTest.class,
|
||||
org.alfresco.rest.api.tests.NodeAssociationsApiTest.class,
|
||||
org.alfresco.rest.api.tests.NodeVersionsApiTest.class,
|
||||
org.alfresco.rest.api.tests.NodeVersionRenditionsApiTest.class,
|
||||
org.alfresco.rest.api.tests.QueriesNodesApiTest.class,
|
||||
org.alfresco.rest.api.tests.QueriesPeopleApiTest.class,
|
||||
org.alfresco.rest.api.tests.QueriesSitesApiTest.class,
|
||||
|
@@ -40,6 +40,7 @@ import org.junit.runners.Suite;
|
||||
org.alfresco.repo.web.scripts.solr.StatsGetTest.class,
|
||||
org.alfresco.repo.web.scripts.solr.SOLRSerializerTest.class,
|
||||
org.alfresco.repo.web.scripts.solr.SOLRAuthenticationFilterTest.class,
|
||||
org.alfresco.web.app.servlet.AlfrescoX509ServletFilterTest.class,
|
||||
org.alfresco.repo.web.util.PagingCursorTest.class,
|
||||
org.alfresco.repo.web.util.paging.PagingTest.class,
|
||||
org.alfresco.repo.webdav.GetMethodTest.class,
|
||||
|
@@ -2,7 +2,7 @@
|
||||
* #%L
|
||||
* Alfresco Remote API
|
||||
* %%
|
||||
* Copyright (C) 2005 - 2021 Alfresco Software Limited
|
||||
* Copyright (C) 2005 - 2022 Alfresco Software Limited
|
||||
* %%
|
||||
* This file is part of the Alfresco software.
|
||||
* If the software was purchased under a paid Alfresco license, the terms of
|
||||
@@ -25,6 +25,8 @@
|
||||
*/
|
||||
package org.alfresco.rest.api.tests;
|
||||
|
||||
import org.alfresco.repo.content.directurl.SystemWideDirectUrlConfig;
|
||||
import org.alfresco.rest.api.impl.directurl.RestApiDirectUrlConfig;
|
||||
import org.alfresco.rest.api.tests.client.PublicApiHttpClient;
|
||||
import static org.alfresco.rest.api.tests.util.RestApiUtil.toJsonAsString;
|
||||
import static org.alfresco.rest.api.tests.util.RestApiUtil.toJsonAsStringNonNull;
|
||||
@@ -219,6 +221,11 @@ public abstract class AbstractBaseApiTest extends EnterpriseTestApi
|
||||
return URL_NODES + "/" + nodeId + "/" + REQUEST_DIRECT_ACCESS_URL;
|
||||
}
|
||||
|
||||
protected String getRequestVersionRenditionContentDirectUrl(String nodeId, String versionId, String renditionId)
|
||||
{
|
||||
return getNodeVersionRenditionIdUrl(nodeId, versionId, renditionId) + "/" + REQUEST_DIRECT_ACCESS_URL;
|
||||
}
|
||||
|
||||
protected String getRequestArchivedContentDirectUrl(String nodeId)
|
||||
{
|
||||
return URL_DELETED_NODES + "/" + nodeId + "/" + REQUEST_DIRECT_ACCESS_URL;
|
||||
@@ -229,6 +236,17 @@ public abstract class AbstractBaseApiTest extends EnterpriseTestApi
|
||||
return URL_DELETED_NODES + "/" + nodeId + "/" + URL_RENDITIONS + "/" + renditionID + "/" + REQUEST_DIRECT_ACCESS_URL;
|
||||
}
|
||||
|
||||
protected String getRequestRenditionDirectAccessUrl(String nodeId, String renditionID)
|
||||
{
|
||||
return URL_NODES + "/" + nodeId + "/" + URL_RENDITIONS + "/" + renditionID + "/" + REQUEST_DIRECT_ACCESS_URL;
|
||||
}
|
||||
|
||||
protected String getRequestVersionDirectAccessUrl(String nodeId, String versionId)
|
||||
{
|
||||
return URL_NODES + "/" + nodeId + "/" + URL_VERSIONS + "/" + versionId + "/" + REQUEST_DIRECT_ACCESS_URL;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* The api scope. either public or private
|
||||
*
|
||||
@@ -724,6 +742,18 @@ public abstract class AbstractBaseApiTest extends EnterpriseTestApi
|
||||
return createNode(parentId, folderName, TYPE_CM_FOLDER, props, Folder.class);
|
||||
}
|
||||
|
||||
protected String createUniqueFolder(String parentId) throws Exception
|
||||
{
|
||||
return createFolder(parentId, "folder-" + System.currentTimeMillis()).getId();
|
||||
}
|
||||
|
||||
protected String createUniqueContent(String folderId) throws Exception
|
||||
{
|
||||
Document documentResp = createTextFile(folderId, "file-" + System.currentTimeMillis(),
|
||||
"some text-" + System.currentTimeMillis(), "UTF-8", null);
|
||||
return documentResp.getId();
|
||||
}
|
||||
|
||||
protected Node createNode(String parentId, String nodeName, String nodeType, Map<String, Object> props) throws Exception
|
||||
{
|
||||
return createNode(parentId, nodeName, nodeType, props, Node.class);
|
||||
@@ -1035,6 +1065,16 @@ public abstract class AbstractBaseApiTest extends EnterpriseTestApi
|
||||
return URL_NODES + "/" + nodeId + "/" + URL_RENDITIONS;
|
||||
}
|
||||
|
||||
protected String getNodeRenditionIdUrl(String nodeId, String renditionID)
|
||||
{
|
||||
return URL_NODES + "/" + nodeId + "/" + URL_RENDITIONS + "/" + renditionID;
|
||||
}
|
||||
|
||||
protected String getNodeVersionRenditionIdUrl(String nodeId, String versionId, String renditionID)
|
||||
{
|
||||
return URL_NODES + "/" + nodeId + "/" + URL_VERSIONS + "/" + versionId + "/" + URL_RENDITIONS + "/" + renditionID;
|
||||
}
|
||||
|
||||
protected String getNodeVersionsUrl(String nodeId)
|
||||
{
|
||||
return URL_NODES + "/" + nodeId + "/" + URL_VERSIONS;
|
||||
@@ -1065,5 +1105,20 @@ public abstract class AbstractBaseApiTest extends EnterpriseTestApi
|
||||
return URL_NODES + "/" + nodeId;
|
||||
}
|
||||
|
||||
protected void enableRestDirectAccessUrls()
|
||||
{
|
||||
SystemWideDirectUrlConfig systemDauConfig = (SystemWideDirectUrlConfig) applicationContext.getBean("systemWideDirectUrlConfig");
|
||||
systemDauConfig.setEnabled(true);
|
||||
RestApiDirectUrlConfig restDauConfig = (RestApiDirectUrlConfig) applicationContext.getBean("restApiDirectUrlConfig");
|
||||
restDauConfig.setEnabled(true);
|
||||
}
|
||||
|
||||
protected void disableRestDirectAccessUrls()
|
||||
{
|
||||
SystemWideDirectUrlConfig systemDauConfig = (SystemWideDirectUrlConfig) applicationContext.getBean("systemWideDirectUrlConfig");
|
||||
systemDauConfig.setEnabled(false);
|
||||
RestApiDirectUrlConfig restDauConfig = (RestApiDirectUrlConfig) applicationContext.getBean("restApiDirectUrlConfig");
|
||||
restDauConfig.setEnabled(false);
|
||||
}
|
||||
}
|
||||
|
||||
|
@@ -2,7 +2,7 @@
|
||||
* #%L
|
||||
* Alfresco Remote API
|
||||
* %%
|
||||
* Copyright (C) 2005 - 2021 Alfresco Software Limited
|
||||
* Copyright (C) 2005 - 2022 Alfresco Software Limited
|
||||
* %%
|
||||
* This file is part of the Alfresco software.
|
||||
* If the software was purchased under a paid Alfresco license, the terms of
|
||||
@@ -6279,83 +6279,90 @@ public class NodeApiTest extends AbstractSingleNetworkSiteTest
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testRequestVersionsContentDirectUrl() throws Exception
|
||||
public void testRequestContentDirectUrlClientErrorResponseForNodes() throws Exception
|
||||
{
|
||||
enableRestDirectAccessUrls();
|
||||
|
||||
//Node does not exist
|
||||
setRequestContext(user1);
|
||||
|
||||
String myNodeId = getMyNodeId();
|
||||
HttpResponse nodeDoesNotExistResponse = post(getRequestContentDirectUrl("non-existing-node-id"), null, 404);
|
||||
|
||||
Document d1 = new Document();
|
||||
d1.setName("d1.txt");
|
||||
d1.setNodeType(TYPE_CM_CONTENT);
|
||||
//Node is not a file
|
||||
String folderId = createFolder(tDocLibNodeId, "some-folder-name").getId();
|
||||
HttpResponse nodeIsNotAFileReponse = post(getRequestContentDirectUrl(folderId), null, 400);
|
||||
|
||||
// create *empty* text file - as of now, versioning is not enabled by default
|
||||
HttpResponse response = post(getNodeChildrenUrl(myNodeId), toJsonAsStringNonNull(d1), 201);
|
||||
Document documentResp = RestApiUtil.parseRestApiEntry(response.getJsonResponse(), Document.class);
|
||||
|
||||
String docId = documentResp.getId();
|
||||
assertFalse(documentResp.getAspectNames().contains("cm:versionable"));
|
||||
assertNull(documentResp.getProperties()); // no properties (ie. no "cm:versionLabel")
|
||||
|
||||
int majorVersion = 1;
|
||||
int minorVersion = 0;
|
||||
|
||||
String content = "The quick brown fox jumps over the lazy dog ";
|
||||
|
||||
Map<String, String> params = new HashMap<>();
|
||||
params.put("comment", "my version ");
|
||||
|
||||
documentResp = updateTextFile(docId, content, params);
|
||||
assertTrue(documentResp.getAspectNames().contains("cm:versionable"));
|
||||
assertNotNull(documentResp.getProperties());
|
||||
assertEquals(majorVersion+"."+minorVersion, documentResp.getProperties().get("cm:versionLabel"));
|
||||
|
||||
final String contentNodeId = documentResp.getId();
|
||||
|
||||
// Check the upload response
|
||||
assertNotNull(documentResp.getProperties());
|
||||
assertTrue(documentResp.getAspectNames().contains("cm:versionable"));
|
||||
ContentInfo contentInfo = documentResp.getContent();
|
||||
assertNotNull(contentInfo);
|
||||
assertEquals(MimetypeMap.MIMETYPE_TEXT_PLAIN, contentInfo.getMimeType());
|
||||
|
||||
HttpResponse dauResponse = post(getRequestContentDirectUrl(contentNodeId), null, null, null, null, 501);
|
||||
disableRestDirectAccessUrls();
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testRequestRenditionContentDirectUrl() throws Exception
|
||||
public void testRequestContentDirectUrlClientErrorResponseForVersions() throws Exception
|
||||
{
|
||||
enableRestDirectAccessUrls();
|
||||
// Create a document
|
||||
setRequestContext(user1);
|
||||
|
||||
RepoService.TestNetwork networkN1;
|
||||
RepoService.TestPerson userOneN1;
|
||||
Site userOneN1Site;
|
||||
String folderNodeId = createUniqueFolder(getMyNodeId());
|
||||
String contentNodeId = createUniqueContent(folderNodeId);
|
||||
|
||||
networkN1 = repoService.createNetworkWithAlias("ping", true);
|
||||
networkN1.create();
|
||||
userOneN1 = networkN1.createUser();
|
||||
// Verify versions
|
||||
HttpResponse versionIdDoesNotExistReponse = post(getRequestVersionDirectAccessUrl(contentNodeId, "1.2"), null, null, null, null, 404);
|
||||
HttpResponse versionIdInvalidReponse = post(getRequestVersionDirectAccessUrl(contentNodeId, "invalid-version"), null, null, null, null, 404);
|
||||
|
||||
setRequestContext(networkN1.getId(), userOneN1.getId(), null);
|
||||
disableRestDirectAccessUrls();
|
||||
}
|
||||
|
||||
String siteTitle = "RandomSite" + System.currentTimeMillis();
|
||||
userOneN1Site = createSite(siteTitle, SiteVisibility.PRIVATE);
|
||||
@Test
|
||||
public void testRequestContentDirectUrlClientErrorResponseForRenditions() throws Exception
|
||||
{
|
||||
enableRestDirectAccessUrls();
|
||||
// Create a document
|
||||
setRequestContext(user1);
|
||||
|
||||
// Create a folder within the site document's library
|
||||
String folderName = "folder" + System.currentTimeMillis();
|
||||
String parentId = getSiteContainerNodeId(userOneN1Site.getId(), "documentLibrary");
|
||||
String folder_Id = createNode(parentId, folderName, TYPE_CM_FOLDER, null).getId();
|
||||
String folderNodeId = createUniqueFolder(getMyNodeId());
|
||||
String contentNodeId = createUniqueContent(folderNodeId);
|
||||
|
||||
// Create multipart request - pdf file
|
||||
String renditionName = "doclib";
|
||||
String fileName = "quick.pdf";
|
||||
// Verify renditions
|
||||
HttpResponse renditionIdDoesNotExistReponse = post(getRequestRenditionDirectAccessUrl(contentNodeId, "pdf"), null, null, null, null, 404);
|
||||
HttpResponse renditionIdInvalidReponse = post(getRequestRenditionDirectAccessUrl(contentNodeId, "invalid-rendition"), null, null, null, null, 404);
|
||||
|
||||
disableRestDirectAccessUrls();
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testRequestContentDirectUrlClientErrorResponseForDeletion() throws Exception
|
||||
{
|
||||
enableRestDirectAccessUrls();
|
||||
// Create a document
|
||||
setRequestContext(user1);
|
||||
|
||||
String folderNodeId = createUniqueFolder(getMyNodeId());
|
||||
String contentNodeId = createUniqueContent(folderNodeId);
|
||||
|
||||
// Verify deletion
|
||||
HttpResponse nodeNotDeletedReponse = post(getRequestArchivedContentDirectUrl(contentNodeId), null, null, null, null, 404);
|
||||
|
||||
disableRestDirectAccessUrls();
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testRequestDeleteRendition() throws Exception
|
||||
{
|
||||
setRequestContext(networkOne.getId(), user1, null);
|
||||
|
||||
String myNodeId = getMyNodeId();
|
||||
|
||||
// Create multipart request - txt file
|
||||
String renditionName = "pdf";
|
||||
String fileName = "quick-1.txt";
|
||||
File file = getResourceFile(fileName);
|
||||
MultiPartRequest reqBody = MultiPartBuilder.create()
|
||||
.setFileData(new FileData(fileName, file))
|
||||
.setRenditions(Collections.singletonList(renditionName))
|
||||
.build();
|
||||
|
||||
// Upload quick.pdf file into 'folder' - including request to create 'doclib' thumbnail
|
||||
HttpResponse response = post(getNodeChildrenUrl(folder_Id), reqBody.getBody(), null, reqBody.getContentType(), 201);
|
||||
//Upload file to user home node
|
||||
HttpResponse response = post(getNodeChildrenUrl(myNodeId), reqBody.getBody(), null, reqBody.getContentType(), 201);
|
||||
Document document = RestApiUtil.parseRestApiEntry(response.getJsonResponse(), Document.class);
|
||||
String contentNodeId = document.getId();
|
||||
|
||||
@@ -6364,7 +6371,65 @@ public class NodeApiTest extends AbstractSingleNetworkSiteTest
|
||||
assertNotNull(rendition);
|
||||
assertEquals(Rendition.RenditionStatus.CREATED, rendition.getStatus());
|
||||
|
||||
HttpResponse dauResponse = post(getRequestContentDirectUrl(contentNodeId), null, null, null, null, 501);
|
||||
//clean rendition
|
||||
delete(getNodeRenditionIdUrl(contentNodeId, renditionName), null, null, null, null, 204);
|
||||
//retry to double-check deletion
|
||||
delete(getNodeRenditionIdUrl(contentNodeId, renditionName), null, null, null, null, 404);
|
||||
|
||||
//check if rendition was cleaned
|
||||
HttpResponse getResponse = getSingle(getNodeRenditionIdUrl(contentNodeId, renditionName), null, 200);
|
||||
Rendition renditionDeleted = RestApiUtil.parseRestApiEntry(getResponse.getJsonResponse(), Rendition.class);
|
||||
assertNotNull(renditionDeleted);
|
||||
assertEquals(Rendition.RenditionStatus.NOT_CREATED, renditionDeleted.getStatus());
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testRequestVersionDeleteRendition() throws Exception
|
||||
{
|
||||
setRequestContext(networkOne.getId(), user1, null);
|
||||
|
||||
String myNodeId = getMyNodeId();
|
||||
|
||||
// Create multipart request - txt file
|
||||
String renditionName = "pdf";
|
||||
String fileName = "quick-1.txt";
|
||||
File file = getResourceFile(fileName);
|
||||
MultiPartRequest reqBody = MultiPartBuilder.create()
|
||||
.setFileData(new FileData(fileName, file))
|
||||
.setRenditions(Collections.singletonList(renditionName))
|
||||
.build();
|
||||
|
||||
//Upload file to user home node
|
||||
HttpResponse response = post(getNodeChildrenUrl(myNodeId), reqBody.getBody(), null, reqBody.getContentType(), 201);
|
||||
Document document = RestApiUtil.parseRestApiEntry(response.getJsonResponse(), Document.class);
|
||||
String contentNodeId = document.getId();
|
||||
|
||||
//Update file to newer version
|
||||
String content = "The quick brown fox jumps over the lazy dog\n the lazy dog jumps over the quick brown fox";
|
||||
Map<String, String> params = new HashMap<>();
|
||||
params.put("comment", "my version ");
|
||||
|
||||
document = updateTextFile(contentNodeId, content, params);
|
||||
assertTrue(document.getAspectNames().contains("cm:versionable"));
|
||||
assertNotNull(document.getProperties());
|
||||
assertEquals("1.1", document.getProperties().get("cm:versionLabel"));
|
||||
|
||||
// create rendition for old version and check that rendition is created ...
|
||||
Rendition renditionUpdated = createAndGetRendition(contentNodeId, "1.0", renditionName);
|
||||
assertNotNull(renditionUpdated);
|
||||
assertEquals(Rendition.RenditionStatus.CREATED, renditionUpdated.getStatus());
|
||||
|
||||
//clean rendition
|
||||
delete(getNodeVersionRenditionIdUrl(contentNodeId, "1.0", renditionName), null, null, null, null, 204);
|
||||
//retry to double-check deletion
|
||||
delete(getNodeVersionRenditionIdUrl(contentNodeId, "1.0", renditionName), null, null, null, null, 404);
|
||||
|
||||
//check if rendition was cleaned
|
||||
HttpResponse getResponse = getSingle(getNodeVersionRenditionIdUrl(contentNodeId, "1.0", renditionName), null, 200);
|
||||
Rendition renditionDeleted = RestApiUtil.parseRestApiEntry(getResponse.getJsonResponse(), Rendition.class);
|
||||
assertNotNull(renditionDeleted);
|
||||
assertEquals(Rendition.RenditionStatus.NOT_CREATED, renditionDeleted.getStatus());
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
@@ -0,0 +1,179 @@
|
||||
/*
|
||||
* #%L
|
||||
* Alfresco Remote API
|
||||
* %%
|
||||
* Copyright (C) 2005 - 2022 Alfresco Software Limited
|
||||
* %%
|
||||
* This file is part of the Alfresco software.
|
||||
* If the software was purchased under a paid Alfresco license, the terms of
|
||||
* the paid license agreement will prevail. Otherwise, the software is
|
||||
* provided under the following open source license terms:
|
||||
*
|
||||
* Alfresco is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU Lesser General Public License as published by
|
||||
* the Free Software Foundation, either version 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* Alfresco is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU Lesser General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Lesser General Public License
|
||||
* along with Alfresco. If not, see <http://www.gnu.org/licenses/>.
|
||||
* #L%
|
||||
*/
|
||||
package org.alfresco.rest.api.tests;
|
||||
|
||||
import org.alfresco.rest.AbstractSingleNetworkSiteTest;
|
||||
import org.alfresco.rest.api.tests.client.HttpResponse;
|
||||
import org.alfresco.rest.api.tests.client.data.Document;
|
||||
import org.alfresco.rest.api.tests.util.RestApiUtil;
|
||||
import org.alfresco.service.cmr.repository.NodeService;
|
||||
import org.alfresco.service.cmr.security.AuthorityService;
|
||||
import org.alfresco.service.cmr.security.PermissionService;
|
||||
import org.alfresco.service.namespace.NamespaceService;
|
||||
import org.junit.After;
|
||||
import org.junit.Before;
|
||||
import org.junit.Test;
|
||||
import org.junit.runner.RunWith;
|
||||
import org.junit.runners.Parameterized;
|
||||
|
||||
import java.util.*;
|
||||
|
||||
import static org.alfresco.rest.api.tests.util.RestApiUtil.toJsonAsStringNonNull;
|
||||
import static org.junit.Assert.assertEquals;
|
||||
import static org.junit.Assert.assertTrue;
|
||||
|
||||
@RunWith(Parameterized.class)
|
||||
public class NodeApiVersioningJsonParameterizedTest extends AbstractSingleNetworkSiteTest
|
||||
{
|
||||
private static final String TYPE_CM_CONTENT = "cm:content";
|
||||
private static final String TYPE_CUSTOM_DOCUMENT = "custom:document";
|
||||
|
||||
private static final String VERSIONING_ENABLED_TRUE = "true";
|
||||
private static final String VERSIONING_ENABLED_FALSE = "false";
|
||||
private static final String VERSIONING_ENABLED_UNSET = null;
|
||||
|
||||
private static final Boolean MAJOR_VERSION_ENABLED_TRUE = true;
|
||||
private static final Boolean MAJOR_VERSION_ENABLED_FALSE = false;
|
||||
private static final Boolean MAJOR_VERSION_ENABLED_UNSET = null;
|
||||
|
||||
private static final String VERSION_NOT_EXPECTED = null;
|
||||
private static final String EXPECTED_VERSION_0_1 = "0.1";
|
||||
private static final String EXPECTED_VERSION_1_0 = "1.0";
|
||||
|
||||
private static final String EXPECTED_ASPECT_VERSIONABLE = "cm:versionable";
|
||||
private static final String EXPECTED_ASPECT_NONE = null;
|
||||
|
||||
protected PermissionService permissionService;
|
||||
protected AuthorityService authorityService;
|
||||
private NodeService nodeService;
|
||||
private NamespaceService namespaceService;
|
||||
|
||||
|
||||
@Parameterized.Parameter(value = 0)
|
||||
public String type;
|
||||
|
||||
@Parameterized.Parameter(value = 1)
|
||||
public String versioningEnabled;
|
||||
|
||||
@Parameterized.Parameter(value = 2)
|
||||
public Boolean majorVersion;
|
||||
|
||||
@Parameterized.Parameter(value = 3)
|
||||
public String expectedVersion;
|
||||
|
||||
@Parameterized.Parameter(value = 4)
|
||||
public String expectedAspect;
|
||||
|
||||
@Parameterized.Parameters //parameters source - MMT-22462 comments
|
||||
public static Collection<Object[]> data()
|
||||
{
|
||||
Collection<Object[]> params = new ArrayList();
|
||||
params.add(new Object[]{TYPE_CM_CONTENT, VERSIONING_ENABLED_UNSET, MAJOR_VERSION_ENABLED_UNSET, VERSION_NOT_EXPECTED, EXPECTED_ASPECT_NONE});
|
||||
params.add(new Object[]{TYPE_CM_CONTENT, VERSIONING_ENABLED_UNSET, MAJOR_VERSION_ENABLED_TRUE, EXPECTED_VERSION_1_0, EXPECTED_ASPECT_NONE});
|
||||
params.add(new Object[]{TYPE_CM_CONTENT, VERSIONING_ENABLED_UNSET, MAJOR_VERSION_ENABLED_FALSE, EXPECTED_VERSION_0_1, EXPECTED_ASPECT_NONE});
|
||||
|
||||
params.add(new Object[]{TYPE_CM_CONTENT, VERSIONING_ENABLED_FALSE, MAJOR_VERSION_ENABLED_UNSET, VERSION_NOT_EXPECTED, EXPECTED_ASPECT_NONE});
|
||||
params.add(new Object[]{TYPE_CM_CONTENT, VERSIONING_ENABLED_FALSE, MAJOR_VERSION_ENABLED_TRUE, VERSION_NOT_EXPECTED, EXPECTED_ASPECT_NONE});
|
||||
params.add(new Object[]{TYPE_CM_CONTENT, VERSIONING_ENABLED_FALSE, MAJOR_VERSION_ENABLED_FALSE, VERSION_NOT_EXPECTED, EXPECTED_ASPECT_NONE});
|
||||
|
||||
params.add(new Object[]{TYPE_CM_CONTENT, VERSIONING_ENABLED_TRUE, MAJOR_VERSION_ENABLED_UNSET, EXPECTED_VERSION_1_0, EXPECTED_ASPECT_VERSIONABLE});
|
||||
params.add(new Object[]{TYPE_CM_CONTENT, VERSIONING_ENABLED_TRUE, MAJOR_VERSION_ENABLED_TRUE, EXPECTED_VERSION_1_0, EXPECTED_ASPECT_VERSIONABLE});
|
||||
params.add(new Object[]{TYPE_CM_CONTENT, VERSIONING_ENABLED_TRUE, MAJOR_VERSION_ENABLED_FALSE, EXPECTED_VERSION_0_1, EXPECTED_ASPECT_VERSIONABLE});
|
||||
|
||||
params.add(new Object[]{TYPE_CUSTOM_DOCUMENT, VERSIONING_ENABLED_UNSET, MAJOR_VERSION_ENABLED_UNSET, EXPECTED_VERSION_1_0, EXPECTED_ASPECT_VERSIONABLE});
|
||||
params.add(new Object[]{TYPE_CUSTOM_DOCUMENT, VERSIONING_ENABLED_UNSET, MAJOR_VERSION_ENABLED_TRUE, EXPECTED_VERSION_1_0, EXPECTED_ASPECT_VERSIONABLE});
|
||||
params.add(new Object[]{TYPE_CUSTOM_DOCUMENT, VERSIONING_ENABLED_UNSET, MAJOR_VERSION_ENABLED_FALSE, EXPECTED_VERSION_0_1, EXPECTED_ASPECT_VERSIONABLE});
|
||||
|
||||
params.add(new Object[]{TYPE_CUSTOM_DOCUMENT, VERSIONING_ENABLED_TRUE, MAJOR_VERSION_ENABLED_UNSET, EXPECTED_VERSION_1_0, EXPECTED_ASPECT_VERSIONABLE});
|
||||
params.add(new Object[]{TYPE_CUSTOM_DOCUMENT, VERSIONING_ENABLED_TRUE, MAJOR_VERSION_ENABLED_TRUE, EXPECTED_VERSION_1_0, EXPECTED_ASPECT_VERSIONABLE});
|
||||
params.add(new Object[]{TYPE_CUSTOM_DOCUMENT, VERSIONING_ENABLED_TRUE, MAJOR_VERSION_ENABLED_FALSE, EXPECTED_VERSION_0_1, EXPECTED_ASPECT_VERSIONABLE});
|
||||
|
||||
params.add(new Object[]{TYPE_CUSTOM_DOCUMENT, VERSIONING_ENABLED_FALSE, MAJOR_VERSION_ENABLED_UNSET, EXPECTED_VERSION_1_0, EXPECTED_ASPECT_VERSIONABLE});
|
||||
params.add(new Object[]{TYPE_CUSTOM_DOCUMENT, VERSIONING_ENABLED_FALSE, MAJOR_VERSION_ENABLED_TRUE, EXPECTED_VERSION_1_0, EXPECTED_ASPECT_VERSIONABLE});
|
||||
params.add(new Object[]{TYPE_CUSTOM_DOCUMENT, VERSIONING_ENABLED_FALSE, MAJOR_VERSION_ENABLED_FALSE, EXPECTED_VERSION_0_1, EXPECTED_ASPECT_VERSIONABLE});
|
||||
|
||||
return params;
|
||||
}
|
||||
|
||||
@Before
|
||||
public void setup() throws Exception
|
||||
{
|
||||
super.setup();
|
||||
|
||||
permissionService = applicationContext.getBean("permissionService", PermissionService.class);
|
||||
authorityService = (AuthorityService) applicationContext.getBean("AuthorityService");
|
||||
nodeService = applicationContext.getBean("NodeService", NodeService.class);
|
||||
namespaceService= (NamespaceService) applicationContext.getBean("NamespaceService");
|
||||
}
|
||||
|
||||
@After
|
||||
public void tearDown() throws Exception
|
||||
{
|
||||
super.tearDown();
|
||||
}
|
||||
|
||||
@Test
|
||||
public void versionableDocumentJsonNodeCreationTest() throws Exception
|
||||
{
|
||||
setRequestContext(user1);
|
||||
String myNodeId = getMyNodeId();
|
||||
|
||||
Document d1 = new Document();
|
||||
Map<String, String> params = new HashMap<>();
|
||||
d1.setName("testDoc" + UUID.randomUUID());
|
||||
d1.setNodeType(type);
|
||||
|
||||
if(versioningEnabled != null)
|
||||
{
|
||||
params.put("versioningEnabled", versioningEnabled);
|
||||
}
|
||||
if(majorVersion != null)
|
||||
{
|
||||
params.put("majorVersion", majorVersion.toString());
|
||||
}
|
||||
|
||||
HttpResponse response = post(getNodeChildrenUrl(myNodeId), toJsonAsStringNonNull(d1), params, null, null, 201);
|
||||
Document documentResponse = RestApiUtil.parseRestApiEntry(response.getJsonResponse(), Document.class);
|
||||
|
||||
assertExpectedVersion(expectedVersion, documentResponse.getProperties());
|
||||
assertContainsAspect(expectedAspect, documentResponse);
|
||||
}
|
||||
|
||||
private void assertExpectedVersion(String expectedVersion, Map<String, Object> documentProperties)
|
||||
{
|
||||
if(documentProperties != null) {
|
||||
assertEquals(expectedVersion, documentProperties.get("cm:versionLabel"));
|
||||
}
|
||||
}
|
||||
|
||||
private void assertContainsAspect(String expectedAspect, Document documentResponse)
|
||||
{
|
||||
if(expectedAspect != null) {
|
||||
assertTrue(!documentResponse.getAspectNames().isEmpty());
|
||||
assertTrue(documentResponse.getAspectNames().contains(expectedAspect));
|
||||
}
|
||||
}
|
||||
}
|
@@ -0,0 +1,183 @@
|
||||
/*
|
||||
* #%L
|
||||
* Alfresco Remote API
|
||||
* %%
|
||||
* Copyright (C) 2005 - 2022 Alfresco Software Limited
|
||||
* %%
|
||||
* This file is part of the Alfresco software.
|
||||
* If the software was purchased under a paid Alfresco license, the terms of
|
||||
* the paid license agreement will prevail. Otherwise, the software is
|
||||
* provided under the following open source license terms:
|
||||
*
|
||||
* Alfresco is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU Lesser General Public License as published by
|
||||
* the Free Software Foundation, either version 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* Alfresco is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU Lesser General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Lesser General Public License
|
||||
* along with Alfresco. If not, see <http://www.gnu.org/licenses/>.
|
||||
* #L%
|
||||
*/
|
||||
package org.alfresco.rest.api.tests;
|
||||
|
||||
import org.alfresco.rest.AbstractSingleNetworkSiteTest;
|
||||
import org.alfresco.rest.api.tests.client.HttpResponse;
|
||||
import org.alfresco.rest.api.tests.client.data.Document;
|
||||
import org.alfresco.rest.api.tests.util.MultiPartBuilder;
|
||||
import org.alfresco.rest.api.tests.util.RestApiUtil;
|
||||
import org.alfresco.service.cmr.repository.NodeService;
|
||||
import org.alfresco.service.cmr.security.AuthorityService;
|
||||
import org.alfresco.service.cmr.security.PermissionService;
|
||||
import org.alfresco.service.namespace.NamespaceService;
|
||||
import org.junit.After;
|
||||
import org.junit.Before;
|
||||
import org.junit.Test;
|
||||
import org.junit.runner.RunWith;
|
||||
import org.junit.runners.Parameterized;
|
||||
|
||||
import java.io.File;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Collection;
|
||||
import java.util.Map;
|
||||
import java.util.UUID;
|
||||
|
||||
import static org.junit.Assert.*;
|
||||
import static org.junit.Assert.assertEquals;
|
||||
|
||||
@RunWith(Parameterized.class)
|
||||
public class NodeApiVersioningMultipartParameterizedTest extends AbstractSingleNetworkSiteTest
|
||||
{
|
||||
private static final String TYPE_CM_CONTENT = "cm:content";
|
||||
private static final String TYPE_CUSTOM_DOCUMENT = "custom:document";
|
||||
|
||||
private static final String VERSIONING_ENABLED_TRUE = "true";
|
||||
private static final String VERSIONING_ENABLED_FALSE = "false";
|
||||
private static final String VERSIONING_ENABLED_UNSET = null;
|
||||
|
||||
private static final Boolean MAJOR_VERSION_ENABLED_TRUE = true;
|
||||
private static final Boolean MAJOR_VERSION_ENABLED_FALSE = false;
|
||||
private static final Boolean MAJOR_VERSION_ENABLED_UNSET = null;
|
||||
|
||||
private static final String VERSION_NOT_EXPECTED = null;
|
||||
private static final String EXPECTED_VERSION_0_1 = "0.1";
|
||||
private static final String EXPECTED_VERSION_1_0 = "1.0";
|
||||
|
||||
private static final String EXPECTED_ASPECT_VERSIONABLE = "cm:versionable";
|
||||
private static final String EXPECTED_ASPECT_NONE = null;
|
||||
|
||||
protected PermissionService permissionService;
|
||||
protected AuthorityService authorityService;
|
||||
private NodeService nodeService;
|
||||
private NamespaceService namespaceService;
|
||||
|
||||
|
||||
@Parameterized.Parameter(value = 0)
|
||||
public String type;
|
||||
|
||||
@Parameterized.Parameter(value = 1)
|
||||
public String versioningEnabled;
|
||||
|
||||
@Parameterized.Parameter(value = 2)
|
||||
public Boolean majorVersion;
|
||||
|
||||
@Parameterized.Parameter(value = 3)
|
||||
public String expectedVersion;
|
||||
|
||||
@Parameterized.Parameter(value = 4)
|
||||
public String expectedAspect;
|
||||
|
||||
@Parameterized.Parameters //parameters source - MMT-22462 comments
|
||||
public static Collection<Object[]> data()
|
||||
{
|
||||
Collection<Object[]> params = new ArrayList();
|
||||
params.add(new Object[]{TYPE_CM_CONTENT, VERSIONING_ENABLED_UNSET, MAJOR_VERSION_ENABLED_UNSET, EXPECTED_VERSION_1_0, EXPECTED_ASPECT_VERSIONABLE});
|
||||
params.add(new Object[]{TYPE_CM_CONTENT, VERSIONING_ENABLED_UNSET, MAJOR_VERSION_ENABLED_TRUE, EXPECTED_VERSION_1_0, EXPECTED_ASPECT_VERSIONABLE});
|
||||
params.add(new Object[]{TYPE_CM_CONTENT, VERSIONING_ENABLED_UNSET, MAJOR_VERSION_ENABLED_FALSE, EXPECTED_VERSION_0_1, EXPECTED_ASPECT_VERSIONABLE});
|
||||
|
||||
params.add(new Object[]{TYPE_CM_CONTENT, VERSIONING_ENABLED_TRUE, MAJOR_VERSION_ENABLED_UNSET, EXPECTED_VERSION_1_0, EXPECTED_ASPECT_VERSIONABLE});
|
||||
params.add(new Object[]{TYPE_CM_CONTENT, VERSIONING_ENABLED_TRUE, MAJOR_VERSION_ENABLED_TRUE, EXPECTED_VERSION_1_0, EXPECTED_ASPECT_VERSIONABLE});
|
||||
params.add(new Object[]{TYPE_CM_CONTENT, VERSIONING_ENABLED_TRUE, MAJOR_VERSION_ENABLED_FALSE, EXPECTED_VERSION_0_1, EXPECTED_ASPECT_VERSIONABLE});
|
||||
|
||||
params.add(new Object[]{TYPE_CM_CONTENT, VERSIONING_ENABLED_FALSE, MAJOR_VERSION_ENABLED_UNSET, VERSION_NOT_EXPECTED, EXPECTED_ASPECT_NONE});
|
||||
params.add(new Object[]{TYPE_CM_CONTENT, VERSIONING_ENABLED_FALSE, MAJOR_VERSION_ENABLED_TRUE, VERSION_NOT_EXPECTED, EXPECTED_ASPECT_NONE});
|
||||
params.add(new Object[]{TYPE_CM_CONTENT, VERSIONING_ENABLED_FALSE, MAJOR_VERSION_ENABLED_FALSE, VERSION_NOT_EXPECTED, EXPECTED_ASPECT_NONE});
|
||||
|
||||
params.add(new Object[]{TYPE_CUSTOM_DOCUMENT, VERSIONING_ENABLED_UNSET, MAJOR_VERSION_ENABLED_UNSET, EXPECTED_VERSION_1_0, EXPECTED_ASPECT_VERSIONABLE});
|
||||
params.add(new Object[]{TYPE_CUSTOM_DOCUMENT, VERSIONING_ENABLED_UNSET, MAJOR_VERSION_ENABLED_TRUE, EXPECTED_VERSION_1_0, EXPECTED_ASPECT_VERSIONABLE});
|
||||
params.add(new Object[]{TYPE_CUSTOM_DOCUMENT, VERSIONING_ENABLED_UNSET, MAJOR_VERSION_ENABLED_FALSE, EXPECTED_VERSION_0_1, EXPECTED_ASPECT_VERSIONABLE});
|
||||
|
||||
params.add(new Object[]{TYPE_CUSTOM_DOCUMENT, VERSIONING_ENABLED_TRUE, MAJOR_VERSION_ENABLED_UNSET, EXPECTED_VERSION_1_0, EXPECTED_ASPECT_VERSIONABLE});
|
||||
params.add(new Object[]{TYPE_CUSTOM_DOCUMENT, VERSIONING_ENABLED_TRUE, MAJOR_VERSION_ENABLED_TRUE, EXPECTED_VERSION_1_0, EXPECTED_ASPECT_VERSIONABLE});
|
||||
params.add(new Object[]{TYPE_CUSTOM_DOCUMENT, VERSIONING_ENABLED_TRUE, MAJOR_VERSION_ENABLED_FALSE, EXPECTED_VERSION_0_1, EXPECTED_ASPECT_VERSIONABLE});
|
||||
|
||||
params.add(new Object[]{TYPE_CUSTOM_DOCUMENT, VERSIONING_ENABLED_FALSE, MAJOR_VERSION_ENABLED_UNSET, EXPECTED_VERSION_1_0, EXPECTED_ASPECT_VERSIONABLE});
|
||||
params.add(new Object[]{TYPE_CUSTOM_DOCUMENT, VERSIONING_ENABLED_FALSE, MAJOR_VERSION_ENABLED_TRUE, EXPECTED_VERSION_1_0, EXPECTED_ASPECT_VERSIONABLE});
|
||||
params.add(new Object[]{TYPE_CUSTOM_DOCUMENT, VERSIONING_ENABLED_FALSE, MAJOR_VERSION_ENABLED_FALSE, EXPECTED_VERSION_0_1, EXPECTED_ASPECT_VERSIONABLE});
|
||||
|
||||
return params;
|
||||
}
|
||||
|
||||
@Before
|
||||
public void setup() throws Exception
|
||||
{
|
||||
super.setup();
|
||||
|
||||
permissionService = applicationContext.getBean("permissionService", PermissionService.class);
|
||||
authorityService = (AuthorityService) applicationContext.getBean("AuthorityService");
|
||||
nodeService = applicationContext.getBean("NodeService", NodeService.class);
|
||||
namespaceService= (NamespaceService) applicationContext.getBean("NamespaceService");
|
||||
}
|
||||
|
||||
@After
|
||||
public void tearDown() throws Exception
|
||||
{
|
||||
super.tearDown();
|
||||
}
|
||||
|
||||
@Test
|
||||
public void versionableDocumentMultipartNodeCreationTest() throws Exception
|
||||
{
|
||||
setRequestContext(user1);
|
||||
String myNodeId = getMyNodeId();
|
||||
|
||||
String fileName = "myfile" + UUID.randomUUID() + ".txt";
|
||||
File file = getResourceFile("quick-2.pdf");
|
||||
|
||||
MultiPartBuilder multiPartBuilder = MultiPartBuilder.create().setFileData(new MultiPartBuilder.FileData(fileName, file));
|
||||
multiPartBuilder.setNodeType(type);
|
||||
multiPartBuilder.setVersioningEnabled(versioningEnabled);
|
||||
if(majorVersion != null)
|
||||
{
|
||||
multiPartBuilder.setMajorVersion(majorVersion);
|
||||
}
|
||||
|
||||
MultiPartBuilder.MultiPartRequest reqBody = multiPartBuilder.build();
|
||||
HttpResponse response = post(getNodeChildrenUrl(myNodeId), reqBody.getBody(), null, reqBody.getContentType(), 201);
|
||||
Document documentResponse = RestApiUtil.parseRestApiEntry(response.getJsonResponse(), Document.class);
|
||||
|
||||
Map<String, Object> documentProperties = documentResponse.getProperties();
|
||||
|
||||
assertExpectedVersion(expectedVersion, documentProperties);
|
||||
assertContainsAspect(expectedAspect, documentResponse);
|
||||
}
|
||||
|
||||
private void assertExpectedVersion(String expectedVersion, Map<String, Object> documentProperties)
|
||||
{
|
||||
if(documentProperties != null) {
|
||||
assertEquals(expectedVersion, documentProperties.get("cm:versionLabel"));
|
||||
}
|
||||
}
|
||||
|
||||
private void assertContainsAspect(String expectedAspect, Document documentResponse)
|
||||
{
|
||||
if(expectedAspect != null) {
|
||||
assertTrue(!documentResponse.getAspectNames().isEmpty());
|
||||
assertTrue(documentResponse.getAspectNames().contains(expectedAspect));
|
||||
}
|
||||
}
|
||||
}
|
@@ -2,7 +2,7 @@
|
||||
* #%L
|
||||
* Alfresco Remote API
|
||||
* %%
|
||||
* Copyright (C) 2005 - 2020 Alfresco Software Limited
|
||||
* Copyright (C) 2005 - 2022 Alfresco Software Limited
|
||||
* %%
|
||||
* This file is part of the Alfresco software.
|
||||
* If the software was purchased under a paid Alfresco license, the terms of
|
||||
@@ -27,20 +27,32 @@ package org.alfresco.rest.api.tests;
|
||||
|
||||
import org.alfresco.repo.content.MimetypeMap;
|
||||
import org.alfresco.repo.security.authentication.AuthenticationUtil;
|
||||
import org.alfresco.repo.web.scripts.RepositoryContainer;
|
||||
import org.alfresco.rest.AbstractSingleNetworkSiteTest;
|
||||
import org.alfresco.rest.api.DirectAccessUrlHelper;
|
||||
import org.alfresco.rest.api.impl.directurl.RestApiDirectUrlConfig;
|
||||
import org.alfresco.rest.api.model.Site;
|
||||
import org.alfresco.rest.api.nodes.NodesEntityResource;
|
||||
import org.alfresco.rest.api.tests.client.HttpResponse;
|
||||
import org.alfresco.rest.api.tests.client.PublicApiClient.Paging;
|
||||
import org.alfresco.rest.api.tests.client.data.ContentInfo;
|
||||
import org.alfresco.rest.api.tests.client.data.Document;
|
||||
import org.alfresco.rest.api.tests.client.data.Node;
|
||||
import org.alfresco.rest.api.tests.client.data.Rendition;
|
||||
import org.alfresco.rest.api.tests.util.MultiPartBuilder;
|
||||
import org.alfresco.rest.api.tests.util.MultiPartBuilder.FileData;
|
||||
import org.alfresco.rest.api.tests.util.MultiPartBuilder.MultiPartRequest;
|
||||
import org.alfresco.rest.api.tests.util.RestApiUtil;
|
||||
import static org.alfresco.rest.api.tests.util.RestApiUtil.toJsonAsString;
|
||||
|
||||
import static org.junit.Assert.*;
|
||||
|
||||
import org.alfresco.service.cmr.site.SiteVisibility;
|
||||
import org.junit.After;
|
||||
import org.junit.Test;
|
||||
import org.mockito.Mockito;
|
||||
|
||||
import java.io.File;
|
||||
import java.util.*;
|
||||
|
||||
/**
|
||||
@@ -273,6 +285,138 @@ public class NodeVersionRenditionsApiTest extends AbstractSingleNetworkSiteTest
|
||||
}
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testRequestVersionRenditionContentDirectUrl() throws Exception
|
||||
{
|
||||
setRequestContext(user1);
|
||||
|
||||
RepoService.TestNetwork networkN1;
|
||||
RepoService.TestPerson userOneN1;
|
||||
Site userOneN1Site;
|
||||
|
||||
networkN1 = repoService.createNetworkWithAlias("ping", true);
|
||||
networkN1.create();
|
||||
userOneN1 = networkN1.createUser();
|
||||
|
||||
setRequestContext(networkN1.getId(), userOneN1.getId(), null);
|
||||
|
||||
String siteTitle = "RandomSite" + System.currentTimeMillis();
|
||||
userOneN1Site = createSite(siteTitle, SiteVisibility.PRIVATE);
|
||||
|
||||
String PROP_LTM = "cm:lastThumbnailModification";
|
||||
|
||||
String RENDITION_NAME = "imgpreview";
|
||||
|
||||
String userId = userOneN1.getId();
|
||||
setRequestContext(networkN1.getId(), userOneN1.getId(), null);
|
||||
|
||||
// Create a folder within the site document's library
|
||||
String folderName = "folder" + System.currentTimeMillis();
|
||||
String parentId = getSiteContainerNodeId(userOneN1Site.getId(), "documentLibrary");
|
||||
String folder_Id = createNode(parentId, folderName, TYPE_CM_FOLDER, null).getId();
|
||||
|
||||
// Create multipart request - pdf file
|
||||
String fileName = "quick.pdf";
|
||||
File file = getResourceFile(fileName);
|
||||
MultiPartRequest reqBody = MultiPartBuilder.create()
|
||||
.setFileData(new FileData(fileName, file))
|
||||
.build();
|
||||
Map<String, String> params = Collections.singletonMap("include", "properties");
|
||||
|
||||
// Upload quick.pdf file into 'folder' - do not include request to create 'doclib' thumbnail
|
||||
HttpResponse response = post(getNodeChildrenUrl(folder_Id), reqBody.getBody(), params, null, "alfresco", reqBody.getContentType(), 201);
|
||||
Document document1 = RestApiUtil.parseRestApiEntry(response.getJsonResponse(), Document.class);
|
||||
String contentNodeId = document1.getId();
|
||||
assertNotNull(document1.getProperties());
|
||||
|
||||
// pause briefly
|
||||
Thread.sleep(DELAY_IN_MS);
|
||||
|
||||
// Get rendition (not created yet) information for node
|
||||
response = getSingle(getNodeRenditionsUrl(contentNodeId), RENDITION_NAME, 200);
|
||||
Rendition rendition = RestApiUtil.parseRestApiEntry(response.getJsonResponse(), Rendition.class);
|
||||
assertNotNull(rendition);
|
||||
assertEquals(Rendition.RenditionStatus.NOT_CREATED, rendition.getStatus());
|
||||
|
||||
params = new HashMap<>();
|
||||
params.put("placeholder", "false");
|
||||
getSingle(getNodeRenditionsUrl(contentNodeId), (RENDITION_NAME + "/content"), params, 404);
|
||||
|
||||
// Create and get 'imgpreview' rendition
|
||||
rendition = createAndGetRendition(contentNodeId, RENDITION_NAME);
|
||||
assertNotNull(rendition);
|
||||
|
||||
params = new HashMap<>();
|
||||
params.put("placeholder", "false");
|
||||
response = getSingle(getNodeRenditionsUrl(contentNodeId), (RENDITION_NAME + "/content"), params, 200);
|
||||
|
||||
byte[] renditionBytes1 = response.getResponseAsBytes();
|
||||
assertNotNull(renditionBytes1);
|
||||
|
||||
// check node details ...
|
||||
params = Collections.singletonMap("include", "properties");
|
||||
response = getSingle(NodesEntityResource.class, contentNodeId, params, 200);
|
||||
Document document1b = RestApiUtil.parseRestApiEntry(response.getJsonResponse(), Document.class);
|
||||
assertEquals(document1b.getModifiedByUser().getId(), document1.getModifiedByUser().getId());
|
||||
|
||||
// upload another version of "quick.pdf" and check again
|
||||
fileName = "quick-2.pdf";
|
||||
file = getResourceFile(fileName);
|
||||
reqBody = MultiPartBuilder.create()
|
||||
.setFileData(new FileData("quick.pdf", file))
|
||||
.setOverwrite(true)
|
||||
.build();
|
||||
|
||||
response = post(getNodeChildrenUrl(folder_Id), reqBody.getBody(), null, null, "alfresco", reqBody.getContentType(), 201);
|
||||
Document document2 = RestApiUtil.parseRestApiEntry(response.getJsonResponse(), Document.class);
|
||||
assertEquals(contentNodeId, document2.getId());
|
||||
|
||||
// wait to allow new version of the rendition to be created ...
|
||||
Thread.sleep(DELAY_IN_MS * 4);
|
||||
|
||||
params = new HashMap<>();
|
||||
params.put("placeholder", "false");
|
||||
response = getSingle(getNodeRenditionsUrl(contentNodeId), (RENDITION_NAME + "/content"), params, 200);
|
||||
assertNotNull(response.getResponseAsBytes());
|
||||
|
||||
// check rendition binary has changed
|
||||
assertNotEquals(renditionBytes1, response.getResponseAsBytes());
|
||||
|
||||
params = Collections.singletonMap("include", "properties");
|
||||
response = getSingle(NodesEntityResource.class, contentNodeId, params, 200);
|
||||
Document document2b = RestApiUtil.parseRestApiEntry(response.getJsonResponse(), Document.class);
|
||||
|
||||
String contentNodeId2b = document2b.getId();
|
||||
HttpResponse dauResponse = post(getRequestVersionRenditionContentDirectUrl(contentNodeId2b, "1.0", RENDITION_NAME), null, null, null, null, 501);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testRequestVersionRenditionContentDirectUrlErrorResponses () throws Exception
|
||||
{
|
||||
setRequestContext(user1);
|
||||
|
||||
String folderNodeId = createUniqueFolder(getMyNodeId());
|
||||
String contentNodeId = createUniqueContent(folderNodeId);
|
||||
createVersionRendition(contentNodeId, "1.0", "doclib");
|
||||
|
||||
// REST direct access URLs must be enabled in order to test DAU error responses
|
||||
enableRestDirectAccessUrls();
|
||||
|
||||
// Test error response for node does not exist
|
||||
HttpResponse dauResponseForNoSuchNode = post(getRequestVersionRenditionContentDirectUrl("nosuchnode", "1.0", "doclib"), null, 404);
|
||||
|
||||
// Test error response for node is not a file
|
||||
HttpResponse dauResponseForNodeIsNotAFile = post(getRequestVersionRenditionContentDirectUrl(folderNodeId, "1.0", "doclib"), null, 400);
|
||||
|
||||
// Test error response for version does not exist
|
||||
HttpResponse dauResponseForNoSuchVersion = post(getRequestVersionRenditionContentDirectUrl(contentNodeId, "2.0", "doclib"), null, 404);
|
||||
|
||||
// Test error response for rendition does not exist
|
||||
HttpResponse dauResponseForNoSuchRendition = post(getRequestVersionRenditionContentDirectUrl(contentNodeId, "1.0", "avatar"), null, 404);
|
||||
|
||||
disableRestDirectAccessUrls();
|
||||
}
|
||||
|
||||
private void checkCreateAndGetVersionRendition(String docId, String versionId, String renditionId) throws Exception
|
||||
{
|
||||
String getRenditionsUrl;
|
||||
@@ -361,6 +505,12 @@ public class NodeVersionRenditionsApiTest extends AbstractSingleNetworkSiteTest
|
||||
assertTrue(contentInfo.getSizeInBytes() > 0);
|
||||
}
|
||||
|
||||
private void createVersionRendition(String contentNodeId, String versionId, String renditionId) throws Exception
|
||||
{
|
||||
getAll(getNodeVersionRenditionsUrl(contentNodeId, versionId), null, 200);
|
||||
checkCreateAndGetVersionRendition(contentNodeId, versionId, renditionId);
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getScope()
|
||||
{
|
||||
|
@@ -25,6 +25,7 @@
|
||||
*/
|
||||
package org.alfresco.rest.api.tests;
|
||||
|
||||
import org.alfresco.repo.content.MimetypeMap;
|
||||
import org.alfresco.rest.AbstractSingleNetworkSiteTest;
|
||||
import org.alfresco.rest.api.Nodes;
|
||||
import org.alfresco.rest.api.model.VersionOptions;
|
||||
@@ -33,6 +34,7 @@ import org.alfresco.rest.api.tests.client.HttpResponse;
|
||||
import org.alfresco.rest.api.tests.client.PublicApiClient;
|
||||
import org.alfresco.rest.api.tests.client.PublicApiClient.Paging;
|
||||
import org.alfresco.rest.api.tests.client.PublicApiHttpClient;
|
||||
import org.alfresco.rest.api.tests.client.data.ContentInfo;
|
||||
import org.alfresco.rest.api.tests.client.data.Document;
|
||||
import org.alfresco.rest.api.tests.client.data.Node;
|
||||
import org.alfresco.rest.api.tests.util.RestApiUtil;
|
||||
@@ -1083,6 +1085,50 @@ public class NodeVersionsApiTest extends AbstractSingleNetworkSiteTest
|
||||
}
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testRequestVersionsContentDirectUrl() throws Exception
|
||||
{
|
||||
setRequestContext(user1);
|
||||
|
||||
String myNodeId = getMyNodeId();
|
||||
|
||||
Document d1 = new Document();
|
||||
d1.setName("d1.txt");
|
||||
d1.setNodeType(TYPE_CM_CONTENT);
|
||||
|
||||
// create *empty* text file - as of now, versioning is not enabled by default
|
||||
HttpResponse response = post(getNodeChildrenUrl(myNodeId), toJsonAsStringNonNull(d1), 201);
|
||||
Document documentResp = RestApiUtil.parseRestApiEntry(response.getJsonResponse(), Document.class);
|
||||
|
||||
String docId = documentResp.getId();
|
||||
assertFalse(documentResp.getAspectNames().contains("cm:versionable"));
|
||||
assertNull(documentResp.getProperties()); // no properties (ie. no "cm:versionLabel")
|
||||
|
||||
int majorVersion = 1;
|
||||
int minorVersion = 0;
|
||||
|
||||
String content = "The quick brown fox jumps over the lazy dog ";
|
||||
|
||||
Map<String, String> params = new HashMap<>();
|
||||
params.put("comment", "my version ");
|
||||
|
||||
documentResp = updateTextFile(docId, content, params);
|
||||
assertTrue(documentResp.getAspectNames().contains("cm:versionable"));
|
||||
assertNotNull(documentResp.getProperties());
|
||||
assertEquals(majorVersion+"."+minorVersion, documentResp.getProperties().get("cm:versionLabel"));
|
||||
|
||||
final String contentNodeId = documentResp.getId();
|
||||
|
||||
// Check the upload response
|
||||
assertNotNull(documentResp.getProperties());
|
||||
assertTrue(documentResp.getAspectNames().contains("cm:versionable"));
|
||||
ContentInfo contentInfo = documentResp.getContent();
|
||||
assertNotNull(contentInfo);
|
||||
assertEquals(MimetypeMap.MIMETYPE_TEXT_PLAIN, contentInfo.getMimeType());
|
||||
|
||||
HttpResponse dauResponse = post(getRequestVersionDirectAccessUrl(contentNodeId, majorVersion+"."+minorVersion), null, null, null, null, 501);
|
||||
}
|
||||
|
||||
/**
|
||||
* Test version creation when updating file binary content.
|
||||
*
|
||||
|
@@ -515,6 +515,51 @@ public class RenditionsTest extends AbstractBaseApiTest
|
||||
}
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testRequestRenditionContentDirectUrl() throws Exception
|
||||
{
|
||||
setRequestContext(user1);
|
||||
|
||||
RepoService.TestNetwork networkN1;
|
||||
RepoService.TestPerson userOneN1;
|
||||
Site userOneN1Site;
|
||||
|
||||
networkN1 = repoService.createNetworkWithAlias("ping", true);
|
||||
networkN1.create();
|
||||
userOneN1 = networkN1.createUser();
|
||||
|
||||
setRequestContext(networkN1.getId(), userOneN1.getId(), null);
|
||||
|
||||
String siteTitle = "RandomSite" + System.currentTimeMillis();
|
||||
userOneN1Site = createSite(siteTitle, SiteVisibility.PRIVATE);
|
||||
|
||||
// Create a folder within the site document's library
|
||||
String folderName = "folder" + System.currentTimeMillis();
|
||||
String parentId = getSiteContainerNodeId(userOneN1Site.getId(), "documentLibrary");
|
||||
String folder_Id = createNode(parentId, folderName, TYPE_CM_FOLDER, null).getId();
|
||||
|
||||
// Create multipart request - pdf file
|
||||
String renditionName = "doclib";
|
||||
String fileName = "quick.pdf";
|
||||
File file = getResourceFile(fileName);
|
||||
MultiPartRequest reqBody = MultiPartBuilder.create()
|
||||
.setFileData(new FileData(fileName, file))
|
||||
.setRenditions(Collections.singletonList(renditionName))
|
||||
.build();
|
||||
|
||||
// Upload quick.pdf file into 'folder' - including request to create 'doclib' thumbnail
|
||||
HttpResponse response = post(getNodeChildrenUrl(folder_Id), reqBody.getBody(), null, reqBody.getContentType(), 201);
|
||||
Document document = RestApiUtil.parseRestApiEntry(response.getJsonResponse(), Document.class);
|
||||
String contentNodeId = document.getId();
|
||||
|
||||
// wait and check that rendition is created ...
|
||||
Rendition rendition = waitAndGetRendition(contentNodeId, null, renditionName);
|
||||
assertNotNull(rendition);
|
||||
assertEquals(Rendition.RenditionStatus.CREATED, rendition.getStatus());
|
||||
|
||||
HttpResponse dauResponse = post(getRequestRenditionDirectAccessUrl(contentNodeId, renditionName), null, null, null, null, 501);
|
||||
}
|
||||
|
||||
/**
|
||||
* Tests create rendition when on upload/create of a file
|
||||
*
|
||||
|
@@ -204,7 +204,7 @@ public class SharedLinkApiTest extends AbstractBaseApiTest
|
||||
assertEquals(d1Id, resp.getNodeId());
|
||||
assertEquals(fileName1, resp.getName());
|
||||
assertEquals("The quick brown fox jumps over the lazy dog", resp.getTitle());
|
||||
assertEquals("Gym class featuring a brown fox and lazy dog", resp.getDescription());
|
||||
assertEquals("Pangram, fox, dog, Gym class featuring a brown fox and lazy dog", resp.getDescription());
|
||||
|
||||
assertEquals(file1_MimeType, resp.getContent().getMimeType());
|
||||
assertEquals("Adobe PDF Document", resp.getContent().getMimeTypeName());
|
||||
@@ -245,7 +245,7 @@ public class SharedLinkApiTest extends AbstractBaseApiTest
|
||||
assertEquals(shared1Id, resp.getId());
|
||||
assertEquals(fileName1, resp.getName());
|
||||
assertEquals("The quick brown fox jumps over the lazy dog", resp.getTitle());
|
||||
assertEquals("Gym class featuring a brown fox and lazy dog", resp.getDescription());
|
||||
assertEquals("Pangram, fox, dog, Gym class featuring a brown fox and lazy dog", resp.getDescription());
|
||||
assertEquals(d1Id, resp.getNodeId());
|
||||
assertNull(resp.getAllowableOperations()); // include is ignored
|
||||
assertNull(resp.getAllowableOperationsOnTarget()); // include is ignored
|
||||
@@ -1319,7 +1319,7 @@ public class SharedLinkApiTest extends AbstractBaseApiTest
|
||||
|
||||
// Quick check that some extended info is present.
|
||||
assertEquals("The quick brown fox jumps over the lazy dog", sharedLink.getTitle());
|
||||
assertEquals("Gym class featuring a brown fox and lazy dog", sharedLink.getDescription());
|
||||
assertEquals("Pangram, fox, dog, Gym class featuring a brown fox and lazy dog", sharedLink.getDescription());
|
||||
});
|
||||
}
|
||||
|
||||
|
@@ -0,0 +1,190 @@
|
||||
/*
|
||||
* #%L
|
||||
* Alfresco Remote API
|
||||
* %%
|
||||
* Copyright (C) 2005 - 2022 Alfresco Software Limited
|
||||
* %%
|
||||
* This file is part of the Alfresco software.
|
||||
* If the software was purchased under a paid Alfresco license, the terms of
|
||||
* the paid license agreement will prevail. Otherwise, the software is
|
||||
* provided under the following open source license terms:
|
||||
* Alfresco is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU Lesser General Public License as published by
|
||||
* the Free Software Foundation, either version 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
* Alfresco is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU Lesser General Public License for more details.
|
||||
* You should have received a copy of the GNU Lesser General Public License
|
||||
* along with Alfresco. If not, see <http://www.gnu.org/licenses/>.
|
||||
* #L%
|
||||
*/
|
||||
|
||||
package org.alfresco.web.app.servlet;
|
||||
|
||||
import static junit.framework.TestCase.assertEquals;
|
||||
|
||||
import javax.servlet.FilterConfig;
|
||||
import javax.servlet.ServletContext;
|
||||
import javax.servlet.ServletException;
|
||||
|
||||
import java.util.Properties;
|
||||
|
||||
import org.alfresco.error.AlfrescoRuntimeException;
|
||||
import org.alfresco.httpclient.HttpClientFactory.SecureCommsType;
|
||||
import org.junit.Before;
|
||||
import org.junit.Test;
|
||||
import org.mockito.Mockito;
|
||||
import org.springframework.web.context.WebApplicationContext;
|
||||
import org.springframework.web.context.support.WebApplicationContextUtils;
|
||||
|
||||
/**
|
||||
* Unit tests for {@link AlfrescoX509ServletFilter}.
|
||||
*/
|
||||
public class AlfrescoX509ServletFilterTest
|
||||
{
|
||||
|
||||
private static final String BEAN_GLOBAL_PROPERTIES = "global-properties";
|
||||
private static final String PROP_SECURE_COMMS = "solr.secureComms";
|
||||
private static final String PROP_SHARED_SECRET = "solr.sharedSecret";
|
||||
private static final String PROP_SHARED_SECRET_HEADER = "solr.sharedSecret.header";
|
||||
private static final String SHARED_SECRET_HEADER = "X-Alfresco-Search-Secret";
|
||||
private static final String SECRET = "secret";
|
||||
private static final String ALLOW_UNAUTHORIZED_SOLR_ENDPOINT = "allow-unauthenticated-solr-endpoint";
|
||||
|
||||
private static final String MISSING_SHARED_SECRET_EXCEPTION_MSG = "Missing value for solr.sharedSecret configuration property";
|
||||
private static final String MISSING_SHARED_SECRET_HEADER_EXCEPTION_MSG = "Missing value for sharedSecretHeader";
|
||||
private static final String SECURE_COMMS_NONE_IS_NOT_SUPPORTED_EXCEPTION_MSG = "solr.secureComms=none is no longer supported. Please use https or secret";
|
||||
|
||||
private FilterConfig filterConfig;
|
||||
private Properties globalProperties;
|
||||
private AlfrescoX509ServletFilter filter;
|
||||
|
||||
@Before
|
||||
public void before()
|
||||
{
|
||||
FilterConfig filterConfig = Mockito.mock(FilterConfig.class);
|
||||
WebApplicationContext webApplicationContext = Mockito.mock(WebApplicationContext.class);
|
||||
ServletContext servletContext = Mockito.mock(ServletContext.class);
|
||||
Properties globalProperties = Mockito.mock(Properties.class);
|
||||
|
||||
Mockito.when(servletContext.getAttribute(WebApplicationContext.ROOT_WEB_APPLICATION_CONTEXT_ATTRIBUTE)).thenReturn(webApplicationContext);
|
||||
Mockito.when(filterConfig.getServletContext()).thenReturn(servletContext);
|
||||
Mockito.when(WebApplicationContextUtils.getRequiredWebApplicationContext(filterConfig.getServletContext())).thenReturn(webApplicationContext);
|
||||
Mockito.when(webApplicationContext.getBean(BEAN_GLOBAL_PROPERTIES)).thenReturn(globalProperties);
|
||||
|
||||
this.filterConfig = filterConfig;
|
||||
this.globalProperties = globalProperties;
|
||||
this.filter = new AlfrescoX509ServletFilter();
|
||||
}
|
||||
|
||||
@Test (expected = AlfrescoRuntimeException.class)
|
||||
public void testSharedSecretIsEmpty() throws ServletException
|
||||
{
|
||||
Mockito.when(globalProperties.getProperty(PROP_SECURE_COMMS)).thenReturn(SecureCommsType.SECRET.name());
|
||||
Mockito.when(globalProperties.getProperty(PROP_SHARED_SECRET)).thenReturn("");
|
||||
Mockito.when(globalProperties.getProperty(PROP_SHARED_SECRET_HEADER)).thenReturn(SHARED_SECRET_HEADER);
|
||||
|
||||
try
|
||||
{
|
||||
filter.init(filterConfig);
|
||||
}
|
||||
catch (AlfrescoRuntimeException ex)
|
||||
{
|
||||
assertEquals(MISSING_SHARED_SECRET_EXCEPTION_MSG, ex.getMsgId());
|
||||
throw ex;
|
||||
}
|
||||
}
|
||||
|
||||
@Test (expected = AlfrescoRuntimeException.class)
|
||||
public void testSharedSecretIsNull() throws ServletException
|
||||
{
|
||||
Mockito.when(globalProperties.getProperty(PROP_SECURE_COMMS)).thenReturn(SecureCommsType.SECRET.name());
|
||||
Mockito.when(globalProperties.getProperty(PROP_SHARED_SECRET)).thenReturn(null);
|
||||
Mockito.when(globalProperties.getProperty(PROP_SHARED_SECRET_HEADER)).thenReturn(SHARED_SECRET_HEADER);
|
||||
|
||||
try
|
||||
{
|
||||
filter.init(filterConfig);
|
||||
}
|
||||
catch (AlfrescoRuntimeException ex)
|
||||
{
|
||||
assertEquals(MISSING_SHARED_SECRET_EXCEPTION_MSG, ex.getMsgId());
|
||||
throw ex;
|
||||
}
|
||||
}
|
||||
|
||||
@Test (expected = AlfrescoRuntimeException.class)
|
||||
public void testSharedSecretHeaderIsEmpty() throws ServletException
|
||||
{
|
||||
Mockito.when(globalProperties.getProperty(PROP_SECURE_COMMS)).thenReturn(SecureCommsType.SECRET.name());
|
||||
Mockito.when(globalProperties.getProperty(PROP_SHARED_SECRET)).thenReturn(SECRET);
|
||||
Mockito.when(globalProperties.getProperty(PROP_SHARED_SECRET_HEADER)).thenReturn("");
|
||||
|
||||
try
|
||||
{
|
||||
filter.init(filterConfig);
|
||||
}
|
||||
catch (AlfrescoRuntimeException ex)
|
||||
{
|
||||
assertEquals(MISSING_SHARED_SECRET_HEADER_EXCEPTION_MSG, ex.getMsgId());
|
||||
throw ex;
|
||||
}
|
||||
}
|
||||
|
||||
@Test (expected = AlfrescoRuntimeException.class)
|
||||
public void testSharedSecretHeaderIsNull() throws ServletException
|
||||
{
|
||||
Mockito.when(globalProperties.getProperty(PROP_SECURE_COMMS)).thenReturn(SecureCommsType.SECRET.name());
|
||||
Mockito.when(globalProperties.getProperty(PROP_SHARED_SECRET)).thenReturn(SECRET);
|
||||
Mockito.when(globalProperties.getProperty(PROP_SHARED_SECRET_HEADER)).thenReturn("");
|
||||
|
||||
try
|
||||
{
|
||||
filter.init(filterConfig);
|
||||
}
|
||||
catch (AlfrescoRuntimeException ex)
|
||||
{
|
||||
assertEquals(MISSING_SHARED_SECRET_HEADER_EXCEPTION_MSG, ex.getMsgId());
|
||||
throw ex;
|
||||
}
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testSharedSecretProperlyConfigured() throws ServletException
|
||||
{
|
||||
Mockito.when(globalProperties.getProperty(PROP_SECURE_COMMS)).thenReturn(SecureCommsType.SECRET.name());
|
||||
Mockito.when(globalProperties.getProperty(PROP_SHARED_SECRET)).thenReturn(SECRET);
|
||||
Mockito.when(globalProperties.getProperty(PROP_SHARED_SECRET_HEADER)).thenReturn(SHARED_SECRET_HEADER);
|
||||
|
||||
filter.init(filterConfig);
|
||||
}
|
||||
|
||||
@Test (expected = AlfrescoRuntimeException.class)
|
||||
public void testSecureCommsNoneAndNotAllowUnauthenticatedSolrEndpoint() throws ServletException
|
||||
{
|
||||
Mockito.when(globalProperties.getProperty(PROP_SECURE_COMMS)).thenReturn(SecureCommsType.NONE.name());
|
||||
Mockito.when(filterConfig.getInitParameter(ALLOW_UNAUTHORIZED_SOLR_ENDPOINT)).thenReturn("false");
|
||||
|
||||
try
|
||||
{
|
||||
filter.init(filterConfig);
|
||||
}
|
||||
catch (AlfrescoRuntimeException ex)
|
||||
{
|
||||
assertEquals(SECURE_COMMS_NONE_IS_NOT_SUPPORTED_EXCEPTION_MSG, ex.getMsgId());
|
||||
throw ex;
|
||||
}
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testSecureCommsNoneAndAllowUnauthenticatedSolrEndpoint() throws ServletException
|
||||
{
|
||||
Mockito.when(globalProperties.getProperty(PROP_SECURE_COMMS)).thenReturn(SecureCommsType.NONE.name());
|
||||
Mockito.when(filterConfig.getInitParameter(ALLOW_UNAUTHORIZED_SOLR_ENDPOINT)).thenReturn("true");
|
||||
|
||||
filter.init(filterConfig);
|
||||
}
|
||||
|
||||
}
|
@@ -55,6 +55,19 @@
|
||||
</properties>
|
||||
</type>
|
||||
|
||||
<type name="custom:document">
|
||||
<title>Sample Document Type</title>
|
||||
<parent>cm:content</parent>
|
||||
<properties>
|
||||
<property name="custom:sample">
|
||||
<type>d:text</type>
|
||||
</property>
|
||||
</properties>
|
||||
<mandatory-aspects>
|
||||
<aspect>cm:versionable</aspect>
|
||||
</mandatory-aspects>
|
||||
</type>
|
||||
|
||||
</types>
|
||||
|
||||
|
||||
|
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user