mirror of
https://github.com/Alfresco/alfresco-community-repo.git
synced 2025-09-10 14:11:58 +00:00
Compare commits
146 Commits
Author | SHA1 | Date | |
---|---|---|---|
|
8d1aeece29 | ||
|
c177a5ffee | ||
|
d28d4873be | ||
|
44d7c2328c | ||
|
073338afa7 | ||
|
3e53467ac8 | ||
|
0d5ffdac2e | ||
|
ac03eb7642 | ||
|
2ff5b7dd0a | ||
|
b0d7e6dfba | ||
|
3304a62a35 | ||
|
763591c1a3 | ||
|
6de5a507fe | ||
|
3990bc9db4 | ||
|
f2207fe43e | ||
|
f48db84334 | ||
|
98d73b7200 | ||
|
acd4b1efcb | ||
|
4433dd009a | ||
|
d1a9794ec8 | ||
|
bf848ff882 | ||
|
69ebccfc20 | ||
|
600b50fce1 | ||
|
37e8586658 | ||
|
4b12ed5a51 | ||
|
e379b7704d | ||
|
297be122a6 | ||
|
ca28024ad8 | ||
|
cfd3255aa7 | ||
|
4e436160cc | ||
|
bf0ca4ca83 | ||
|
e23a97960f | ||
|
2d2371a792 | ||
|
0ea69dd4ef | ||
|
5ecd4c2593 | ||
|
b4a2e2d8cf | ||
|
bdf4fd7e16 | ||
|
e3b3e4b099 | ||
|
895ab9dbbf | ||
|
85054a7649 | ||
|
c60a182b89 | ||
|
94ba463db8 | ||
|
cf67b6791a | ||
|
506441a7ec | ||
|
9b01a3fa1f | ||
|
3dc00da2a5 | ||
|
c20bdd754f | ||
|
d3a52be71a | ||
|
07c3ca5bab | ||
|
e593a17e88 | ||
|
1975729174 | ||
|
1491a9a7dd | ||
|
3923560588 | ||
|
af1aa6528b | ||
|
8cf9cd3ed5 | ||
|
b2dd06eef8 | ||
|
8d46151e41 | ||
|
3d5166b5d2 | ||
|
847af44db0 | ||
|
66cd9d4194 | ||
|
a26eeef847 | ||
|
7ba414eff9 | ||
|
55abd66da6 | ||
|
6ed43a9a87 | ||
|
e657c2a1f7 | ||
|
31aa55366f | ||
|
c7f1f808a1 | ||
|
40b537b589 | ||
|
902b569b41 | ||
|
5c3bf1772a | ||
|
7ffea85c17 | ||
|
4ea51d7229 | ||
|
5f5f6a1577 | ||
|
74f27b68c2 | ||
|
592dabfbd0 | ||
|
275a19b634 | ||
|
ee95350a7a | ||
|
6d78c0eafc | ||
|
ba8ad595cc | ||
|
cd49f188ea | ||
|
5bcff826d2 | ||
|
d62cc18604 | ||
|
e23d356da7 | ||
|
4ac828acca | ||
|
0cad7c4c89 | ||
|
d6bb44343c | ||
|
4b46fd6e10 | ||
|
3cc3fb081f | ||
|
82add3f32f | ||
|
76b0d5ee5a | ||
|
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 |
22
.travis.yml
22
.travis.yml
@@ -60,7 +60,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.7-A1
|
||||
- docker run -d -p 8090:8090 -e JAVA_OPTS=" -Xms256m -Xmx256m" alfresco/alfresco-transform-core-aio:2.5.7
|
||||
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.7-A1
|
||||
- docker run -d -p 8090:8090 -e JAVA_OPTS=" -Xms256m -Xmx256m" alfresco/alfresco-transform-core-aio:2.5.7
|
||||
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.7-A1
|
||||
- docker run -d -p 8090:8090 -e JAVA_OPTS=" -Xms256m -Xmx256m" alfresco/alfresco-transform-core-aio:2.5.7
|
||||
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.7-A1
|
||||
- docker run -d -p 8090:8090 -e JAVA_OPTS=" -Xms256m -Xmx256m" alfresco/alfresco-transform-core-aio:2.5.7
|
||||
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.7-A1
|
||||
- docker run -d -p 8090:8090 -e JAVA_OPTS=" -Xms256m -Xmx256m" alfresco/alfresco-transform-core-aio:2.5.7
|
||||
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.7-A1
|
||||
- docker run -d -p 8090:8090 -e JAVA_OPTS=" -Xms256m -Xmx256m" alfresco/alfresco-transform-core-aio:2.5.7
|
||||
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"
|
||||
@@ -157,10 +157,10 @@ jobs:
|
||||
- docker run -d -p 61616:61616 -p 5672:5672 alfresco/alfresco-activemq:5.16.1
|
||||
script: travis_wait 20 mvn -B test -pl repository -Dtest=AllDBTestsTestSuite -Ddb.name=alfresco -Ddb.url=jdbc:mariadb://localhost:3307/alfresco?useUnicode=yes\&characterEncoding=UTF-8 -Ddb.username=alfresco -Ddb.password=alfresco -Ddb.driver=org.mariadb.jdbc.Driver
|
||||
|
||||
- name: "Repository - MySQL 5.7.23 tests"
|
||||
- name: "Repository - MySQL 5.7.28 tests"
|
||||
if: (branch =~ /(release\/.*$|master)/ AND commit_message !~ /\[skip db\]/ AND type != pull_request) OR commit_message =~ /\[db\]/
|
||||
before_script:
|
||||
- docker run -d -p 3307:3306 -e MYSQL_ROOT_PASSWORD=alfresco -e MYSQL_USER=alfresco -e MYSQL_DATABASE=alfresco -e MYSQL_PASSWORD=alfresco mysql:5.7.23 --transaction-isolation='READ-COMMITTED' --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci
|
||||
- docker run -d -p 3307:3306 -e MYSQL_ROOT_PASSWORD=alfresco -e MYSQL_USER=alfresco -e MYSQL_DATABASE=alfresco -e MYSQL_PASSWORD=alfresco mysql:5.7.28 --transaction-isolation='READ-COMMITTED' --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci
|
||||
- docker run -d -p 61616:61616 -p 5672:5672 alfresco/alfresco-activemq:5.16.1
|
||||
script: travis_wait 20 mvn -B test -pl repository -Dtest=AllDBTestsTestSuite -Ddb.driver=com.mysql.jdbc.Driver -Ddb.name=alfresco -Ddb.url=jdbc:mysql://localhost:3307/alfresco -Ddb.username=alfresco -Ddb.password=alfresco
|
||||
|
||||
@@ -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.7-A1
|
||||
- docker run -d -p 8090:8090 -e JAVA_OPTS=" -Xms256m -Xmx256m" alfresco/alfresco-transform-core-aio:2.5.7
|
||||
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.7-A1
|
||||
- docker run -d -p 8090:8090 -e JAVA_OPTS=" -Xms256m -Xmx256m" alfresco/alfresco-transform-core-aio:2.5.7
|
||||
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.7-A1
|
||||
- docker run -d -p 8090:8090 -e JAVA_OPTS=" -Xms256m -Xmx256m" alfresco/alfresco-transform-core-aio:2.5.7
|
||||
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.111</version>
|
||||
<version>15.10</version>
|
||||
</parent>
|
||||
|
||||
<modules>
|
||||
|
@@ -7,7 +7,7 @@
|
||||
<parent>
|
||||
<groupId>org.alfresco</groupId>
|
||||
<artifactId>alfresco-governance-services-community-parent</artifactId>
|
||||
<version>14.111</version>
|
||||
<version>15.10</version>
|
||||
</parent>
|
||||
|
||||
<modules>
|
||||
|
@@ -7,7 +7,7 @@
|
||||
<parent>
|
||||
<groupId>org.alfresco</groupId>
|
||||
<artifactId>alfresco-governance-services-automation-community-repo</artifactId>
|
||||
<version>14.111</version>
|
||||
<version>15.10</version>
|
||||
</parent>
|
||||
|
||||
<build>
|
||||
|
@@ -73,4 +73,5 @@ public class RecordFoldersAPI extends BaseAPI
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
}
|
||||
|
@@ -114,11 +114,11 @@ public class RecordsAPI extends BaseAPI
|
||||
/**
|
||||
* Reject the record given as parameter
|
||||
*
|
||||
* @param user the user declaring the document as record
|
||||
* @param password the user's password
|
||||
* @param user the user declaring the document as record
|
||||
* @param password the user's password
|
||||
* @param expectedStatusCode The expected return status code.
|
||||
* @param recordName the record name
|
||||
* @param reason reject reason
|
||||
* @param recordName the record name
|
||||
* @param reason reject reason
|
||||
* @return The HTTP Response.
|
||||
* @throws AssertionError If the expectedStatusCode was not returned.
|
||||
*/
|
||||
@@ -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())
|
||||
{
|
||||
@@ -328,9 +330,9 @@ public class RecordsAPI extends BaseAPI
|
||||
/**
|
||||
* Hide in place record
|
||||
*
|
||||
* @param user the user
|
||||
* @param password the user's password
|
||||
* @param nodeId the in place record node id
|
||||
* @param user the user
|
||||
* @param password the user's password
|
||||
* @param nodeId the in place record node id
|
||||
* @return The HTTP Response.
|
||||
*/
|
||||
public HttpResponse hideRecord(String user, String password, String nodeId)
|
||||
@@ -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.111</version>
|
||||
<version>15.10</version>
|
||||
</parent>
|
||||
|
||||
<modules>
|
||||
|
@@ -1,4 +1,4 @@
|
||||
TRANSFORMERS_TAG=2.5.7-A1
|
||||
SOLR6_TAG=2.0.2
|
||||
TRANSFORMERS_TAG=2.5.7
|
||||
SOLR6_TAG=2.0.3
|
||||
POSTGRES_TAG=13.3
|
||||
ACTIVEMQ_TAG=5.16.1
|
||||
|
@@ -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
|
||||
#HTTP by default
|
||||
- ALFRESCO_SECURE_COMMS=none
|
||||
SOLR_CREATE_ALFRESCO_DEFAULTS: "alfresco,archive"
|
||||
#HTTP by default
|
||||
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.111</version>
|
||||
<version>15.10</version>
|
||||
</parent>
|
||||
|
||||
<properties>
|
||||
|
@@ -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
|
||||
|
@@ -4,8 +4,8 @@
|
||||
|
||||
# Version label
|
||||
version.major=7
|
||||
version.minor=0
|
||||
version.revision=0
|
||||
version.minor=2
|
||||
version.revision=1
|
||||
version.label=
|
||||
|
||||
# Edition label
|
||||
@@ -15,4 +15,4 @@ version.edition=Community
|
||||
version.scmrevision=@scm-path@-r@scm-revision@
|
||||
|
||||
# Build number
|
||||
version.build=r@scm-revision@-b@build-number@
|
||||
version.build=r@scm-revision@-b@build-number@
|
||||
|
@@ -7,7 +7,7 @@
|
||||
<parent>
|
||||
<groupId>org.alfresco</groupId>
|
||||
<artifactId>alfresco-governance-services-community-repo-parent</artifactId>
|
||||
<version>14.111</version>
|
||||
<version>15.10</version>
|
||||
</parent>
|
||||
|
||||
<build>
|
||||
|
@@ -7,7 +7,7 @@
|
||||
<parent>
|
||||
<groupId>org.alfresco</groupId>
|
||||
<artifactId>alfresco-community-repo</artifactId>
|
||||
<version>14.111</version>
|
||||
<version>15.10</version>
|
||||
</parent>
|
||||
|
||||
<modules>
|
||||
|
@@ -8,7 +8,7 @@
|
||||
<parent>
|
||||
<groupId>org.alfresco</groupId>
|
||||
<artifactId>alfresco-community-repo-amps</artifactId>
|
||||
<version>14.111</version>
|
||||
<version>15.10</version>
|
||||
</parent>
|
||||
|
||||
<properties>
|
||||
|
@@ -176,7 +176,6 @@ public class NodeBrowserScript extends NodeBrowserPost implements Serializable
|
||||
{
|
||||
status.setCode(HttpServletResponse.SC_INTERNAL_SERVER_ERROR);
|
||||
status.setMessage(e.getMessage());
|
||||
status.setException(e);
|
||||
status.setRedirect(true);
|
||||
}
|
||||
return tmplMap;
|
||||
|
@@ -7,7 +7,7 @@
|
||||
<parent>
|
||||
<groupId>org.alfresco</groupId>
|
||||
<artifactId>alfresco-community-repo</artifactId>
|
||||
<version>14.111</version>
|
||||
<version>15.10</version>
|
||||
</parent>
|
||||
|
||||
<dependencies>
|
||||
@@ -56,7 +56,7 @@
|
||||
<dependency>
|
||||
<groupId>ch.qos.reload4j</groupId>
|
||||
<artifactId>reload4j</artifactId>
|
||||
<version>1.2.19</version>
|
||||
<version>1.2.18.3</version>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>org.json</groupId>
|
||||
@@ -128,8 +128,8 @@
|
||||
<scope>test</scope>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>commons-dbcp</groupId>
|
||||
<artifactId>commons-dbcp</artifactId>
|
||||
<groupId>org.apache.commons</groupId>
|
||||
<artifactId>commons-dbcp2</artifactId>
|
||||
<scope>test</scope>
|
||||
</dependency>
|
||||
</dependencies>
|
||||
|
@@ -21,7 +21,7 @@ package org.alfresco.util.transaction;
|
||||
import org.alfresco.error.AlfrescoRuntimeException;
|
||||
|
||||
/**
|
||||
* Exception wraps {@link java.util.NoSuchElementException} from {@link org.apache.commons.dbcp.BasicDataSource}
|
||||
* Exception wraps {@link java.util.NoSuchElementException} from {@link org.apache.commons.dbcp2.BasicDataSource}
|
||||
*
|
||||
* @author alex.mukha
|
||||
* @since 4.1.9
|
||||
|
@@ -7,7 +7,7 @@
|
||||
<parent>
|
||||
<groupId>org.alfresco</groupId>
|
||||
<artifactId>alfresco-community-repo</artifactId>
|
||||
<version>14.111</version>
|
||||
<version>15.10</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.111</version>
|
||||
<version>15.10</version>
|
||||
</parent>
|
||||
|
||||
<dependencies>
|
||||
|
@@ -9,6 +9,6 @@
|
||||
<parent>
|
||||
<groupId>org.alfresco</groupId>
|
||||
<artifactId>alfresco-community-repo-packaging</artifactId>
|
||||
<version>14.111</version>
|
||||
<version>15.10</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.54-java-11-centos-7
|
||||
FROM alfresco/alfresco-base-tomcat:tomcat9-jre11-centos7-202203091924
|
||||
|
||||
# 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.111</version>
|
||||
<version>15.10</version>
|
||||
</parent>
|
||||
|
||||
<properties>
|
||||
|
@@ -7,7 +7,7 @@
|
||||
<parent>
|
||||
<groupId>org.alfresco</groupId>
|
||||
<artifactId>alfresco-community-repo</artifactId>
|
||||
<version>14.111</version>
|
||||
<version>15.10</version>
|
||||
</parent>
|
||||
|
||||
<modules>
|
||||
|
@@ -1,4 +1,4 @@
|
||||
TRANSFORMERS_TAG=2.5.7-A1
|
||||
SOLR6_TAG=2.0.2
|
||||
TRANSFORMERS_TAG=2.5.7
|
||||
SOLR6_TAG=2.0.3
|
||||
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.111</version>
|
||||
<version>15.10</version>
|
||||
</parent>
|
||||
|
||||
<modules>
|
||||
|
@@ -9,7 +9,7 @@
|
||||
<parent>
|
||||
<groupId>org.alfresco</groupId>
|
||||
<artifactId>alfresco-community-repo-tests</artifactId>
|
||||
<version>14.111</version>
|
||||
<version>15.10</version>
|
||||
</parent>
|
||||
|
||||
<developers>
|
||||
|
@@ -9,7 +9,7 @@
|
||||
<parent>
|
||||
<groupId>org.alfresco</groupId>
|
||||
<artifactId>alfresco-community-repo-tests</artifactId>
|
||||
<version>14.111</version>
|
||||
<version>15.10</version>
|
||||
</parent>
|
||||
|
||||
<developers>
|
||||
|
@@ -9,7 +9,7 @@
|
||||
<parent>
|
||||
<groupId>org.alfresco</groupId>
|
||||
<artifactId>alfresco-community-repo-tests</artifactId>
|
||||
<version>14.111</version>
|
||||
<version>15.10</version>
|
||||
</parent>
|
||||
|
||||
<developers>
|
||||
|
@@ -9,7 +9,7 @@
|
||||
<parent>
|
||||
<groupId>org.alfresco</groupId>
|
||||
<artifactId>alfresco-community-repo-tests</artifactId>
|
||||
<version>14.111</version>
|
||||
<version>15.10</version>
|
||||
</parent>
|
||||
|
||||
<developers>
|
||||
|
@@ -16,7 +16,7 @@ import org.testng.annotations.Test;
|
||||
*/
|
||||
public class GetProcessSanityTests extends RestTest
|
||||
{
|
||||
private UserModel userWhoStartsProcess, assignee;
|
||||
private UserModel userWhoStartsProcess, assignee, user;
|
||||
private RestProcessModel addedProcess, process;
|
||||
|
||||
@BeforeClass(alwaysRun = true)
|
||||
@@ -24,6 +24,7 @@ public class GetProcessSanityTests extends RestTest
|
||||
{
|
||||
userWhoStartsProcess = dataUser.createRandomTestUser();
|
||||
assignee = dataUser.createRandomTestUser();
|
||||
user = dataUser.createRandomTestUser();
|
||||
addedProcess = restClient.authenticateUser(userWhoStartsProcess).withWorkflowAPI().addProcess("activitiAdhoc", assignee, false, CMISUtil.Priority.High);
|
||||
}
|
||||
|
||||
@@ -59,4 +60,13 @@ public class GetProcessSanityTests extends RestTest
|
||||
process.assertThat().field("id").is(addedProcess.getId())
|
||||
.and().field("startUserId").is(addedProcess.getStartUserId());
|
||||
}
|
||||
|
||||
@TestRail(section = { TestGroup.REST_API, TestGroup.PROCESSES }, executionType = ExecutionType.SANITY,
|
||||
description = "Verify User that is not involved in a process cannot get that process using REST API and status code is FORBIDDEN (403)")
|
||||
@Test(groups = { TestGroup.REST_API, TestGroup.WORKFLOW, TestGroup.PROCESSES, TestGroup.SANITY })
|
||||
public void shouldNotGetProcessesByNotInvolvedUser() throws Exception
|
||||
{
|
||||
process = restClient.authenticateUser(user).withWorkflowAPI().usingProcess(addedProcess).getProcess();
|
||||
restClient.assertStatusCodeIs(HttpStatus.FORBIDDEN);
|
||||
}
|
||||
}
|
||||
|
@@ -9,7 +9,7 @@
|
||||
<parent>
|
||||
<groupId>org.alfresco</groupId>
|
||||
<artifactId>alfresco-community-repo-tests</artifactId>
|
||||
<version>14.111</version>
|
||||
<version>15.10</version>
|
||||
</parent>
|
||||
|
||||
<developers>
|
||||
|
@@ -7,7 +7,7 @@
|
||||
<parent>
|
||||
<groupId>org.alfresco</groupId>
|
||||
<artifactId>alfresco-community-repo-packaging</artifactId>
|
||||
<version>14.111</version>
|
||||
<version>15.10</version>
|
||||
</parent>
|
||||
|
||||
<properties>
|
||||
|
54
pom.xml
54
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.111</version>
|
||||
<version>15.10</version>
|
||||
<packaging>pom</packaging>
|
||||
<name>Alfresco Community Repo Parent</name>
|
||||
|
||||
@@ -25,7 +25,7 @@
|
||||
<properties>
|
||||
<acs.version.major>7</acs.version.major>
|
||||
<acs.version.minor>2</acs.version.minor>
|
||||
<acs.version.revision>0</acs.version.revision>
|
||||
<acs.version.revision>1</acs.version.revision>
|
||||
<acs.version.label />
|
||||
<amp.min.version>${acs.version.major}.0.0</amp.min.version>
|
||||
|
||||
@@ -47,42 +47,42 @@
|
||||
<dependency.alfresco-trashcan-cleaner.version>2.4.1</dependency.alfresco-trashcan-cleaner.version>
|
||||
<dependency.alfresco-jlan.version>7.1</dependency.alfresco-jlan.version>
|
||||
<dependency.alfresco-server-root.version>6.0.1</dependency.alfresco-server-root.version>
|
||||
<dependency.alfresco-messaging-repo.version>1.2.15</dependency.alfresco-messaging-repo.version>
|
||||
<dependency.alfresco-messaging-repo.version>1.2.19</dependency.alfresco-messaging-repo.version>
|
||||
<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.9</dependency.alfresco-transform-model.version>
|
||||
<dependency.alfresco-transform-model.version>1.4.15</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.15</dependency.spring.version>
|
||||
<dependency.spring.version>5.3.18</dependency.spring.version>
|
||||
<dependency.antlr.version>3.5.2</dependency.antlr.version>
|
||||
<dependency.jackson.version>2.13.1</dependency.jackson.version>
|
||||
<dependency.jackson-databind.version>2.13.1</dependency.jackson-databind.version>
|
||||
<dependency.jackson.version>2.13.3</dependency.jackson.version>
|
||||
<dependency.jackson-databind.version>2.13.3</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.28</dependency.webscripts.version>
|
||||
<dependency.webscripts.version>8.31</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>20211205</dependency.org-json.version>
|
||||
<dependency.commons-dbcp.version>1.4-DBCP330</dependency.commons-dbcp.version>
|
||||
<dependency.commons-dbcp.version>2.9.0</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.gson.version>2.8.9</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.2</dependency.xercesImpl.version>
|
||||
<dependency.slf4j.version>1.7.35</dependency.slf4j.version>
|
||||
<dependency.gytheio.version>0.13</dependency.gytheio.version>
|
||||
<dependency.gytheio.version>0.16</dependency.gytheio.version>
|
||||
<dependency.groovy.version>3.0.9</dependency.groovy.version>
|
||||
<dependency.tika.version>2.2.1</dependency.tika.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.3.Final</dependency.jboss.logging.version>
|
||||
<dependency.camel.version>3.7.7</dependency.camel.version> <!-- when bumping this version, please keep track/sync with included netty.io dependencies (can cause dependency conflicts)-->
|
||||
<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>
|
||||
@@ -106,11 +106,11 @@
|
||||
<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.2.0-A3</alfresco.api-explorer.version> <!-- Also in alfresco-enterprise-share -->
|
||||
<alfresco.aos-module.version>1.4.1</alfresco.aos-module.version>
|
||||
<alfresco.api-explorer.version>7.2.1</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>
|
||||
<license-maven-plugin.version>2.0.1.alfresco-2</license-maven-plugin.version>
|
||||
|
||||
<dependency.postgresql.version>42.3.2</dependency.postgresql.version>
|
||||
<dependency.mysql.version>8.0.27</dependency.mysql.version>
|
||||
@@ -118,7 +118,7 @@
|
||||
<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.71</dependency.tas-restapi.version>
|
||||
<dependency.tas-restapi.version>1.79</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>
|
||||
@@ -146,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.111</tag>
|
||||
<tag>15.10</tag>
|
||||
</scm>
|
||||
|
||||
<distributionManagement>
|
||||
@@ -755,8 +755,8 @@
|
||||
<version>${dependency.mockito-core.version}</version>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>commons-dbcp</groupId>
|
||||
<artifactId>commons-dbcp</artifactId>
|
||||
<groupId>org.apache.commons</groupId>
|
||||
<artifactId>commons-dbcp2</artifactId>
|
||||
<version>${dependency.commons-dbcp.version}</version>
|
||||
</dependency>
|
||||
<dependency>
|
||||
@@ -766,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>
|
||||
@@ -795,11 +800,6 @@
|
||||
</exclusion>
|
||||
</exclusions>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>io.netty</groupId>
|
||||
<artifactId>netty-codec-http</artifactId>
|
||||
<version>4.1.72.Final</version>
|
||||
</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>
|
||||
@@ -945,7 +945,7 @@
|
||||
<failOnMissing>true</failOnMissing>
|
||||
<excludedScopes>provided,test</excludedScopes>
|
||||
<excludedGroups>^(org\.alfresco|com\.alfresco|org\.activiti|org\.gytheio).*</excludedGroups>
|
||||
<failIfWarning>false</failIfWarning>
|
||||
<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.111</version>
|
||||
<version>15.10</version>
|
||||
</parent>
|
||||
|
||||
<dependencies>
|
||||
|
@@ -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);
|
||||
}
|
||||
|
@@ -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,8 +213,7 @@ 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)
|
||||
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,8 +288,7 @@ public class DownloadsImpl implements Downloads
|
||||
}
|
||||
}
|
||||
|
||||
@Experimental
|
||||
protected boolean canCheckArchived()
|
||||
protected boolean canCheckArchived()
|
||||
{
|
||||
return Arrays.stream(CLOUD_CONNECTOR_MODULES).anyMatch(m-> moduleService.getModule(m) != null);
|
||||
}
|
||||
|
@@ -3132,26 +3132,18 @@ public class NodesImpl implements Nodes
|
||||
// Write content
|
||||
writeContent(nodeRef, fileName, content.getInputStream(), true);
|
||||
}
|
||||
|
||||
|
||||
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;
|
||||
if ((versionMajor != null) && (!versionMajor))
|
||||
{
|
||||
// by default, first version is major, unless specified otherwise
|
||||
VersionType versionType = VersionType.MAJOR;
|
||||
if ((versionMajor != null) && (!versionMajor))
|
||||
{
|
||||
versionType = VersionType.MINOR;
|
||||
}
|
||||
|
||||
createVersion(nodeRef, false, versionType, versionComment);
|
||||
|
||||
extractMetadata(nodeRef);
|
||||
} finally
|
||||
{
|
||||
behaviourFilter.enableBehaviour(nodeRef, ContentModel.ASPECT_VERSIONABLE);
|
||||
versionType = VersionType.MINOR;
|
||||
}
|
||||
|
||||
createVersion(nodeRef, false, versionType, versionComment);
|
||||
extractMetadata(nodeRef);
|
||||
}
|
||||
|
||||
return nodeRef;
|
||||
|
@@ -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
|
||||
{
|
||||
/**
|
||||
|
@@ -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)
|
||||
|
@@ -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;
|
||||
@@ -52,12 +51,9 @@ import javax.servlet.http.HttpServletResponse;
|
||||
* Node Versions storage information.
|
||||
*
|
||||
* - 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
|
||||
{
|
||||
@@ -91,7 +87,6 @@ public class NodeVersionsStorageInfoRelation implements RelationshipResourceActi
|
||||
return storageInformation.getStorageInfo(versionNodeRef, contentPropQNameId, parameters);
|
||||
}
|
||||
|
||||
@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)
|
||||
@@ -116,7 +111,6 @@ public class NodeVersionsStorageInfoRelation implements RelationshipResourceActi
|
||||
}
|
||||
}
|
||||
|
||||
@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)
|
||||
|
@@ -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";
|
||||
|
@@ -511,7 +511,9 @@ public class ProcessesImpl extends WorkflowRestImpl implements Processes
|
||||
{
|
||||
throw new InvalidArgumentException("processId is required to get the process info");
|
||||
}
|
||||
|
||||
|
||||
validateIfUserAllowedToWorkWithProcess(processId);
|
||||
|
||||
HistoricProcessInstance processInstance = activitiProcessEngine
|
||||
.getHistoryService()
|
||||
.createHistoricProcessInstanceQuery()
|
||||
|
@@ -85,8 +85,7 @@ public class AlfrescoX509ServletFilter extends X509ServletFilterBase
|
||||
throw new AlfrescoRuntimeException("Missing value for sharedSecretHeader");
|
||||
}
|
||||
}
|
||||
/*
|
||||
// TODO: Activate this part after OPSEXP-1163 got implemented
|
||||
|
||||
if(secureComms == SecureCommsType.NONE)
|
||||
{
|
||||
if(!"true".equalsIgnoreCase(config.getInitParameter("allow-unauthenticated-solr-endpoint")))
|
||||
@@ -94,7 +93,7 @@ public class AlfrescoX509ServletFilter extends X509ServletFilterBase
|
||||
throw new AlfrescoRuntimeException("solr.secureComms=none is no longer supported. Please use https or secret");
|
||||
}
|
||||
}
|
||||
*/
|
||||
|
||||
super.init(config);
|
||||
}
|
||||
|
||||
|
@@ -3,6 +3,7 @@ function main()
|
||||
|
||||
// Get the args
|
||||
var filter = args["filter"];
|
||||
if (filter!==null && !filter.includes(":")) {filter += " [hint:useCQ]";}
|
||||
var maxResults = args["maxResults"];
|
||||
var skipCountStr = args["skipCount"];
|
||||
var skipCount = skipCountStr != null ? parseInt(skipCountStr) : -1;
|
||||
|
@@ -3,7 +3,7 @@ function main()
|
||||
// Get the args
|
||||
var siteShortName = url.templateArgs.shortname,
|
||||
site = siteService.getSite(siteShortName),
|
||||
filter = (args.filter != null) ? args.filter : (args.shortNameFilter != null) ? args.shortNameFilter : "",
|
||||
filter = ((args.filter != null) ? args.filter : (args.shortNameFilter != null) ? args.shortNameFilter : "" )+ " [hint:useCQ]",
|
||||
maxResults = (args.maxResults == null) ? 10 : parseInt(args.maxResults, 10),
|
||||
authorityType = args.authorityType,
|
||||
zone = args.zone,
|
||||
|
@@ -357,12 +357,13 @@ function main()
|
||||
updateNode.properties.content.write(content, updateNameAndMimetype, true, newFilename);
|
||||
// check it in again, with supplied version history note
|
||||
|
||||
updateNode = updateNode.checkin(description, majorVersion);
|
||||
|
||||
// Extract the metadata
|
||||
// (The overwrite policy controls which if any parts of
|
||||
// the document's properties are updated from this)
|
||||
extractMetadata(updateNode);
|
||||
|
||||
updateNode = updateNode.checkin(description, majorVersion);
|
||||
|
||||
if (aspects.length != 0)
|
||||
{
|
||||
for (i = 0; i < aspects.length; i++)
|
||||
|
@@ -51,6 +51,8 @@ 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,
|
||||
|
@@ -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,
|
||||
|
File diff suppressed because it is too large
Load Diff
@@ -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));
|
||||
}
|
||||
}
|
||||
}
|
@@ -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);
|
||||
}
|
||||
|
||||
}
|
@@ -54,7 +54,20 @@
|
||||
</property>
|
||||
</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>
|
||||
|
||||
|
||||
|
@@ -7,7 +7,7 @@
|
||||
<parent>
|
||||
<groupId>org.alfresco</groupId>
|
||||
<artifactId>alfresco-community-repo</artifactId>
|
||||
<version>14.111</version>
|
||||
<version>15.10</version>
|
||||
</parent>
|
||||
|
||||
<dependencies>
|
||||
@@ -77,8 +77,8 @@
|
||||
</dependency>
|
||||
|
||||
<dependency>
|
||||
<groupId>commons-dbcp</groupId>
|
||||
<artifactId>commons-dbcp</artifactId>
|
||||
<groupId>org.apache.commons</groupId>
|
||||
<artifactId>commons-dbcp2</artifactId>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>commons-fileupload</groupId>
|
||||
@@ -236,7 +236,7 @@
|
||||
<dependency>
|
||||
<groupId>org.freemarker</groupId>
|
||||
<artifactId>freemarker</artifactId>
|
||||
<version>2.3.20-alfresco-patched-20200421</version>
|
||||
<version>2.3.20-alfresco-patched-20220413</version>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>org.apache.xmlbeans</groupId>
|
||||
@@ -418,7 +418,7 @@
|
||||
<dependency>
|
||||
<groupId>org.mybatis</groupId>
|
||||
<artifactId>mybatis-spring</artifactId>
|
||||
<version>2.0.6</version>
|
||||
<version>2.0.7</version>
|
||||
</dependency>
|
||||
|
||||
<!-- Activiti -->
|
||||
@@ -656,7 +656,11 @@
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>org.apache.camel</groupId>
|
||||
<artifactId>camel-spring</artifactId>
|
||||
<artifactId>camel-core</artifactId>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>org.apache.camel</groupId>
|
||||
<artifactId>camel-spring-xml</artifactId>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>org.apache.camel</groupId>
|
||||
|
@@ -51,7 +51,7 @@ import org.alfresco.service.cmr.workflow.WorkflowAdminService;
|
||||
import org.alfresco.service.transaction.TransactionService;
|
||||
import org.alfresco.traitextender.SpringExtensionBundle;
|
||||
import org.alfresco.util.PropertyCheck;
|
||||
import org.apache.commons.dbcp.BasicDataSource;
|
||||
import org.apache.commons.dbcp2.BasicDataSource;
|
||||
import org.apache.commons.logging.Log;
|
||||
import org.apache.commons.logging.LogFactory;
|
||||
import org.springframework.beans.factory.InitializingBean;
|
||||
@@ -89,7 +89,7 @@ import javax.sql.DataSource;
|
||||
* </li>
|
||||
* <li><b>db:</b> Database configuration
|
||||
* <ul>
|
||||
* <li>maxConnections: int - The maximum number of active connections. {@link BasicDataSource#getMaxActive()}</li>
|
||||
* <li>maxConnections: int - The maximum number of active connections. {@link BasicDataSource#getMaxTotal()}</li>
|
||||
* </ul>
|
||||
* </li>
|
||||
* <li><b>authentication</b>: Authentication configuration.
|
||||
@@ -326,7 +326,7 @@ public class ConfigurationDataCollector extends HBBaseDataCollector implements I
|
||||
if (dataSource instanceof BasicDataSource)
|
||||
{
|
||||
Map<String, Object> db = new HashMap<>();
|
||||
db.put("maxConnections", ((BasicDataSource) dataSource).getMaxActive());
|
||||
db.put("maxConnections", ((BasicDataSource) dataSource).getMaxTotal());
|
||||
configurationValues.put("db", db);
|
||||
}
|
||||
|
||||
|
@@ -31,7 +31,7 @@ import org.alfresco.heartbeat.datasender.HBData;
|
||||
import org.alfresco.heartbeat.jobs.HeartBeatJobScheduler;
|
||||
import org.alfresco.repo.descriptor.DescriptorDAO;
|
||||
import org.alfresco.util.PropertyCheck;
|
||||
import org.apache.commons.dbcp.BasicDataSource;
|
||||
import org.apache.commons.dbcp2.BasicDataSource;
|
||||
import org.apache.commons.logging.Log;
|
||||
import org.apache.commons.logging.LogFactory;
|
||||
import org.springframework.beans.factory.InitializingBean;
|
||||
|
@@ -35,7 +35,6 @@ import java.util.concurrent.locks.ReentrantReadWriteLock.WriteLock;
|
||||
|
||||
import org.alfresco.error.AlfrescoRuntimeException;
|
||||
import org.alfresco.repo.cache.SimpleCache;
|
||||
import org.alfresco.service.Experimental;
|
||||
import org.alfresco.service.cmr.repository.ContentIOException;
|
||||
import org.alfresco.service.cmr.repository.ContentReader;
|
||||
import org.alfresco.service.cmr.repository.ContentWriter;
|
||||
@@ -425,7 +424,6 @@ public abstract class AbstractRoutingContentStore implements ContentStore
|
||||
* {@inheritDoc}
|
||||
*/
|
||||
@Override
|
||||
@Experimental
|
||||
public Map<String, String> getStorageProperties(String contentUrl)
|
||||
{
|
||||
ContentStore contentStore = selectReadStore(contentUrl);
|
||||
@@ -445,7 +443,6 @@ public abstract class AbstractRoutingContentStore implements ContentStore
|
||||
* {@inheritDoc}
|
||||
*/
|
||||
@Override
|
||||
@Experimental
|
||||
public boolean requestSendContentToArchive(String contentUrl, Map<String, Serializable> archiveParams)
|
||||
{
|
||||
final ContentStore contentStore = selectReadStore(contentUrl);
|
||||
@@ -463,7 +460,6 @@ public abstract class AbstractRoutingContentStore implements ContentStore
|
||||
* {@inheritDoc}
|
||||
*/
|
||||
@Override
|
||||
@Experimental
|
||||
public boolean requestRestoreContentFromArchive(String contentUrl, Map<String, Serializable> restoreParams)
|
||||
{
|
||||
final ContentStore contentStore = selectReadStore(contentUrl);
|
||||
|
@@ -46,7 +46,6 @@ import org.alfresco.repo.policy.ClassPolicyDelegate;
|
||||
import org.alfresco.repo.policy.JavaBehaviour;
|
||||
import org.alfresco.repo.policy.PolicyComponent;
|
||||
import org.alfresco.repo.transaction.RetryingTransactionHelper;
|
||||
import org.alfresco.service.Experimental;
|
||||
import org.alfresco.service.cmr.dictionary.DataTypeDefinition;
|
||||
import org.alfresco.service.cmr.dictionary.DictionaryService;
|
||||
import org.alfresco.service.cmr.dictionary.InvalidTypeException;
|
||||
@@ -668,7 +667,6 @@ public class ContentServiceImpl implements ContentService, ApplicationContextAwa
|
||||
* {@inheritDoc}
|
||||
*/
|
||||
@Override
|
||||
@Experimental
|
||||
public Map<String, String> getStorageProperties(NodeRef nodeRef, QName propertyQName)
|
||||
{
|
||||
final ContentData contentData = getContentDataOrThrowError(nodeRef, propertyQName);
|
||||
|
@@ -37,7 +37,6 @@ import org.alfresco.repo.content.caching.quota.QuotaManagerStrategy;
|
||||
import org.alfresco.repo.content.caching.quota.UnlimitedQuotaStrategy;
|
||||
import org.alfresco.repo.content.filestore.FileContentStore;
|
||||
import org.alfresco.repo.content.filestore.SpoofedTextContentReader;
|
||||
import org.alfresco.service.Experimental;
|
||||
import org.alfresco.service.cmr.repository.ContentIOException;
|
||||
import org.alfresco.service.cmr.repository.ContentReader;
|
||||
import org.alfresco.service.cmr.repository.ContentStreamListener;
|
||||
@@ -387,7 +386,6 @@ public class CachingContentStore implements ContentStore, ApplicationEventPublis
|
||||
* {@inheritDoc}
|
||||
*/
|
||||
@Override
|
||||
@Experimental
|
||||
public Map<String, String> getStorageProperties(final String contentUrl)
|
||||
{
|
||||
return backingStore.getStorageProperties(contentUrl);
|
||||
@@ -397,7 +395,6 @@ public class CachingContentStore implements ContentStore, ApplicationEventPublis
|
||||
* {@inheritDoc}
|
||||
*/
|
||||
@Override
|
||||
@Experimental
|
||||
public boolean requestSendContentToArchive(String contentUrl, Map<String, Serializable> archiveParams)
|
||||
{
|
||||
return backingStore.requestSendContentToArchive(contentUrl, archiveParams);
|
||||
@@ -407,7 +404,6 @@ public class CachingContentStore implements ContentStore, ApplicationEventPublis
|
||||
* {@inheritDoc}
|
||||
*/
|
||||
@Override
|
||||
@Experimental
|
||||
public boolean requestRestoreContentFromArchive(String contentUrl, Map<String, Serializable> restoreParams)
|
||||
{
|
||||
return backingStore.requestRestoreContentFromArchive(contentUrl, restoreParams);
|
||||
|
@@ -40,7 +40,6 @@ import org.alfresco.repo.content.ContentContext;
|
||||
import org.alfresco.repo.content.ContentStore;
|
||||
import org.alfresco.repo.content.UnsupportedContentUrlException;
|
||||
import org.alfresco.repo.content.caching.CachingContentStore;
|
||||
import org.alfresco.service.Experimental;
|
||||
import org.alfresco.service.cmr.repository.ContentIOException;
|
||||
import org.alfresco.service.cmr.repository.ContentReader;
|
||||
import org.alfresco.service.cmr.repository.ContentWriter;
|
||||
@@ -403,7 +402,6 @@ public class AggregatingContentStore extends AbstractContentStore
|
||||
* {@inheritDoc}
|
||||
*/
|
||||
@Override
|
||||
@Experimental
|
||||
public Map<String, String> getStorageProperties(String contentUrl)
|
||||
{
|
||||
checkPrimaryStore();
|
||||
@@ -457,7 +455,6 @@ public class AggregatingContentStore extends AbstractContentStore
|
||||
/**
|
||||
* {@inheritDoc}
|
||||
*/
|
||||
@Experimental
|
||||
@Override
|
||||
public boolean requestSendContentToArchive(final String contentUrl, Map<String, Serializable> archiveParams)
|
||||
{
|
||||
@@ -467,7 +464,6 @@ public class AggregatingContentStore extends AbstractContentStore
|
||||
/**
|
||||
* {@inheritDoc}
|
||||
*/
|
||||
@Experimental
|
||||
@Override
|
||||
public boolean requestRestoreContentFromArchive(final String contentUrl, final Map<String, Serializable> restoreParams)
|
||||
{
|
||||
|
@@ -2,7 +2,7 @@
|
||||
* #%L
|
||||
* Alfresco Repository
|
||||
* %%
|
||||
* Copyright (C) 2019 Alfresco Software Limited
|
||||
* Copyright (C) 2019-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
|
||||
@@ -39,6 +39,8 @@ import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.Set;
|
||||
|
||||
import static org.alfresco.transform.client.util.RequestParamMap.DIRECT_ACCESS_URL;
|
||||
|
||||
/**
|
||||
* Transformer that passes a document through a pipeline of transformations to arrive at an target mimetype.
|
||||
*
|
||||
@@ -118,6 +120,8 @@ public class LocalPipelineTransform extends AbstractLocalTransform
|
||||
|
||||
transformer.intermediateTransformer.transform(currentReader, currentWriter, transformOptions, renditionName, sourceNodeRef);
|
||||
|
||||
removeDirectAccessUrlAfterFirstTransform(transformOptions);
|
||||
|
||||
// Clear the sourceNodeRef after the first transformation to avoid later transformers thinking the
|
||||
// intermediate file is the original node.
|
||||
if (i == 0)
|
||||
@@ -132,4 +136,9 @@ public class LocalPipelineTransform extends AbstractLocalTransform
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private void removeDirectAccessUrlAfterFirstTransform(Map<String, String> transformOptions)
|
||||
{
|
||||
transformOptions.remove(DIRECT_ACCESS_URL);
|
||||
}
|
||||
}
|
||||
|
@@ -483,7 +483,7 @@ public class LocalTransformServiceRegistry extends TransformServiceRegistryImpl
|
||||
* @param transform the local transform.
|
||||
* @return {@code true} is supported, {@code false} otherwise.
|
||||
*/
|
||||
boolean isSupported(CoreFunction function, LocalTransform transform)
|
||||
public boolean isSupported(CoreFunction function, LocalTransform transform)
|
||||
{
|
||||
return isSupported(function, transform.getName());
|
||||
}
|
||||
|
@@ -35,6 +35,7 @@ import java.util.Collections;
|
||||
import java.util.Date;
|
||||
import java.util.HashMap;
|
||||
import java.util.HashSet;
|
||||
import java.util.Iterator;
|
||||
import java.util.LinkedList;
|
||||
import java.util.List;
|
||||
import java.util.Locale;
|
||||
|
@@ -29,6 +29,7 @@ import java.io.Serializable;
|
||||
import java.util.Collection;
|
||||
import java.util.Date;
|
||||
import java.util.HashSet;
|
||||
import java.util.Iterator;
|
||||
import java.util.List;
|
||||
import java.util.Locale;
|
||||
import java.util.Map;
|
||||
@@ -944,4 +945,49 @@ public interface NodeDAO extends NodeBulkLoader
|
||||
*/
|
||||
public Long getNextTxCommitTime(Long fromCommitTime);
|
||||
|
||||
/**
|
||||
*
|
||||
* @param maxCommitTime
|
||||
* @return Iterator over node ids
|
||||
*/
|
||||
default public Iterator<Long> selectDeletedNodesByCommitTime(long maxCommitTime)
|
||||
{
|
||||
throw new UnsupportedOperationException("Not Implemented");
|
||||
}
|
||||
|
||||
/**
|
||||
* Purge the nodes marked as deleted
|
||||
* @param minAge
|
||||
* @param deleteBatchSize
|
||||
* @return the count of nodes deleted in each batch
|
||||
*/
|
||||
default public List<String> purgeDeletedNodes(long minAge, int deleteBatchSize)
|
||||
{
|
||||
throw new UnsupportedOperationException("This operation is not supported");
|
||||
}
|
||||
|
||||
/**
|
||||
*
|
||||
* @param maxCommitTime
|
||||
* @return Iterator over transaction ids
|
||||
*/
|
||||
default public Iterator<Long> selectUnusedTransactionsByCommitTime(long maxCommitTime)
|
||||
{
|
||||
throw new UnsupportedOperationException("Not Implemented");
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Purge the transactions of purged nodes
|
||||
* @param minAge
|
||||
* @param deleteBatchSize
|
||||
* @return the count of transactions deleted in each batch
|
||||
*/
|
||||
default public List<String> purgeEmptyTransactions(long minAge, int deleteBatchSize)
|
||||
{
|
||||
throw new UnsupportedOperationException("This operation is not supported");
|
||||
}
|
||||
|
||||
|
||||
|
||||
}
|
||||
|
@@ -25,16 +25,6 @@
|
||||
*/
|
||||
package org.alfresco.repo.domain.node.ibatis;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.Collection;
|
||||
import java.util.Collections;
|
||||
import java.util.HashMap;
|
||||
import java.util.HashSet;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.Set;
|
||||
import java.util.SortedSet;
|
||||
|
||||
import org.alfresco.error.AlfrescoRuntimeException;
|
||||
import org.alfresco.ibatis.IdsEntity;
|
||||
import org.alfresco.model.ContentModel;
|
||||
@@ -65,6 +55,7 @@ import org.alfresco.service.cmr.repository.NodeRef;
|
||||
import org.alfresco.service.cmr.repository.StoreRef;
|
||||
import org.alfresco.service.namespace.QName;
|
||||
import org.alfresco.util.Pair;
|
||||
import org.apache.ibatis.cursor.Cursor;
|
||||
import org.apache.ibatis.executor.result.DefaultResultContext;
|
||||
import org.apache.ibatis.session.ResultContext;
|
||||
import org.apache.ibatis.session.ResultHandler;
|
||||
@@ -72,6 +63,17 @@ import org.apache.ibatis.session.RowBounds;
|
||||
import org.mybatis.spring.SqlSessionTemplate;
|
||||
import org.springframework.util.Assert;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.Collection;
|
||||
import java.util.Collections;
|
||||
import java.util.HashMap;
|
||||
import java.util.HashSet;
|
||||
import java.util.Iterator;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.Set;
|
||||
import java.util.SortedSet;
|
||||
|
||||
|
||||
/**
|
||||
* iBatis-specific extension of the Node abstract DAO
|
||||
@@ -166,6 +168,12 @@ public class NodeDAOImpl extends AbstractNodeDAOImpl
|
||||
private static final String SELECT_TXN_MIN_TX_ID_IN_NODE_IDRANGE = "alfresco.node.select_TxnMinTxIdInNodeIdRange";
|
||||
private static final String SELECT_TXN_MAX_TX_ID_IN_NODE_IDRANGE = "alfresco.node.select_TxnMaxTxIdInNodeIdRange";
|
||||
private static final String SELECT_TXN_NEXT_TXN_COMMIT_TIME = "select_TxnNextTxnCommitTime";
|
||||
private static final String SELECT_NODES_DELETED_BY_TXN_COMMIT_TIME = "alfresco.node.select.select_Deleted_NodesByTxnCommitTime";
|
||||
private static final String DELETE_NODES_BY_ID = "alfresco.node.delete_NodesById";
|
||||
private static final String DELETE_NODE_PROPS_BY_NODE_ID = "alfresco.node.delete_NodePropsByNodeId";
|
||||
private static final String SELECT_TXNS_UNUSED_BY_TXN_COMMIT_TIME = "alfresco.node.select.select_Txns_UnusedByTxnCommitTime";
|
||||
private static final String DELETE_TXNS_UNUSED_BY_ID = "alfresco.node.delete_Txns_UnusedById";
|
||||
|
||||
|
||||
protected QNameDAO qnameDAO;
|
||||
protected DictionaryService dictionaryService;
|
||||
@@ -1794,8 +1802,138 @@ public class NodeDAOImpl extends AbstractNodeDAOImpl
|
||||
|
||||
return template.selectOne(SELECT_TXN_NEXT_TXN_COMMIT_TIME, fromCommitTimeEntity);
|
||||
}
|
||||
|
||||
|
||||
|
||||
public Iterator<Long> selectDeletedNodesByCommitTime(long maxCommitTime)
|
||||
{
|
||||
// Get the deleted nodes
|
||||
Pair<Long, QName> deletedTypePair = qnameDAO.getQName(ContentModel.TYPE_DELETED);
|
||||
if (deletedTypePair == null)
|
||||
{
|
||||
// Nothing to do
|
||||
return null;
|
||||
}
|
||||
|
||||
TransactionQueryEntity transactionQueryEntity = new TransactionQueryEntity();
|
||||
transactionQueryEntity.setMaxCommitTime(maxCommitTime);
|
||||
transactionQueryEntity.setTypeQNameId(deletedTypePair.getFirst());
|
||||
Cursor<Long> cursor = template.selectCursor(SELECT_NODES_DELETED_BY_TXN_COMMIT_TIME, transactionQueryEntity);
|
||||
|
||||
return cursor.iterator();
|
||||
}
|
||||
|
||||
public Iterator<Long> selectUnusedTransactionsByCommitTime(long maxCommitTime)
|
||||
{
|
||||
TransactionQueryEntity maxCommitTimeEntity = new TransactionQueryEntity();
|
||||
maxCommitTimeEntity.setMaxCommitTime(maxCommitTime);
|
||||
Cursor<Long> cursor = template.selectCursor(SELECT_TXNS_UNUSED_BY_TXN_COMMIT_TIME, maxCommitTimeEntity);
|
||||
|
||||
return cursor.iterator();
|
||||
}
|
||||
|
||||
@Override
|
||||
public List<String> purgeDeletedNodes(long minAge, int deleteBatchSize)
|
||||
{
|
||||
final long maxCommitTime = System.currentTimeMillis() - minAge;
|
||||
Iterator<Long> nodeIdIterator = this.selectDeletedNodesByCommitTime(maxCommitTime);
|
||||
ArrayList<Long> nodeIdList = new ArrayList<>();
|
||||
List<String> deleteResult = new ArrayList<>();
|
||||
if (isDebugEnabled)
|
||||
{
|
||||
logger.debug("nodes selected for deletion, deleteBatchSize:" + deleteBatchSize);
|
||||
}
|
||||
while (nodeIdIterator != null && nodeIdIterator.hasNext())
|
||||
{
|
||||
if (deleteBatchSize == nodeIdList.size())
|
||||
{
|
||||
int count = deleteSelectedNodesAndProperties(nodeIdList);
|
||||
if (isDebugEnabled)
|
||||
{
|
||||
logger.debug("nodes deleted:" + count);
|
||||
}
|
||||
deleteResult.add("Purged old nodes: " + count);
|
||||
nodeIdList.clear();
|
||||
}
|
||||
else
|
||||
{
|
||||
nodeIdList.add(nodeIdIterator.next());
|
||||
}
|
||||
}
|
||||
if (nodeIdList.size() > 0)
|
||||
{
|
||||
int count = deleteSelectedNodesAndProperties(nodeIdList);
|
||||
if (isDebugEnabled)
|
||||
{
|
||||
logger.debug("remaining nodes deleted:" + count);
|
||||
}
|
||||
deleteResult.add("Purged old nodes: " + count);
|
||||
nodeIdList.clear();
|
||||
}
|
||||
return deleteResult;
|
||||
}
|
||||
|
||||
public List<String> purgeEmptyTransactions(long minAge, int deleteBatchSize)
|
||||
{
|
||||
final long maxCommitTime = System.currentTimeMillis() - minAge;
|
||||
Iterator<Long> transactionIdIterator = this.selectUnusedTransactionsByCommitTime(maxCommitTime);
|
||||
ArrayList<Long> transactionIdList = new ArrayList<>();
|
||||
List<String> deleteResult = new ArrayList<>();
|
||||
if (isDebugEnabled)
|
||||
{
|
||||
logger.debug("transactions selected for deletion, deleteBatchSize:" + deleteBatchSize);
|
||||
}
|
||||
while (transactionIdIterator.hasNext())
|
||||
{
|
||||
if (deleteBatchSize == transactionIdList.size())
|
||||
{
|
||||
int count = deleteSelectedTransactions(transactionIdList);
|
||||
deleteResult.add("Purged old transactions: " + count);
|
||||
if (isDebugEnabled)
|
||||
{
|
||||
logger.debug("transactions deleted:" + count);
|
||||
}
|
||||
transactionIdList.clear();
|
||||
|
||||
}
|
||||
else
|
||||
{
|
||||
transactionIdList.add(transactionIdIterator.next());
|
||||
}
|
||||
}
|
||||
if (transactionIdList.size() > 0)
|
||||
{
|
||||
int count = deleteSelectedTransactions(transactionIdList);
|
||||
deleteResult.add("Purged old transactions: " + count);
|
||||
if (isDebugEnabled)
|
||||
{
|
||||
logger.debug("final batch of transactions deleted:" + count);
|
||||
}
|
||||
transactionIdList.clear();
|
||||
}
|
||||
return deleteResult;
|
||||
}
|
||||
|
||||
private int deleteSelectedNodesAndProperties(List<Long> nodeIdList)
|
||||
{
|
||||
int cnt = template.delete(DELETE_NODE_PROPS_BY_NODE_ID, nodeIdList);
|
||||
if (isDebugEnabled)
|
||||
{
|
||||
logger.debug("nodes props deleted:" + cnt);
|
||||
}
|
||||
// Finally, remove the nodes
|
||||
cnt = template.delete(DELETE_NODES_BY_ID, nodeIdList);
|
||||
if (isDebugEnabled)
|
||||
{
|
||||
logger.debug("nodes deleted:" + cnt);
|
||||
}
|
||||
return cnt;
|
||||
}
|
||||
|
||||
private int deleteSelectedTransactions(List<Long> transactionIdList)
|
||||
{
|
||||
return template.delete(DELETE_TXNS_UNUSED_BY_ID, transactionIdList);
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* DAO OVERRIDES
|
||||
*/
|
||||
@@ -1936,4 +2074,4 @@ public class NodeDAOImpl extends AbstractNodeDAOImpl
|
||||
assocQName);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@@ -50,6 +50,13 @@ public class DeletedNodeCleanupWorker extends AbstractNodeCleanupWorker
|
||||
// of the chunk (in ms). Default is a couple of hours.
|
||||
private int purgeSize = 7200000; // ms
|
||||
|
||||
//to determine if we need a time based window deletion of nodes or in fixed size batches.
|
||||
private String algorithm;
|
||||
|
||||
private int deleteBatchSize;
|
||||
|
||||
private static final String NODE_TABLE_CLEANER_ALG_V2 = "V2";
|
||||
|
||||
/**
|
||||
* Default constructor
|
||||
*/
|
||||
@@ -67,15 +74,57 @@ public class DeletedNodeCleanupWorker extends AbstractNodeCleanupWorker
|
||||
{
|
||||
return Collections.singletonList("Minimum purge age is negative; purge disabled");
|
||||
}
|
||||
|
||||
List<String> purgedNodes = purgeOldDeletedNodes(minPurgeAgeMs);
|
||||
List<String> purgedTxns = purgeOldEmptyTransactions(minPurgeAgeMs);
|
||||
|
||||
List<String> allResults = new ArrayList<String>(100);
|
||||
List<String> purgedNodes, purgedTxns;
|
||||
|
||||
if (NODE_TABLE_CLEANER_ALG_V2.equals(algorithm))
|
||||
{
|
||||
refreshLock();
|
||||
if (logger.isDebugEnabled())
|
||||
{
|
||||
logger.debug("DeletedNodeCleanupWorker using batch deletion: About to execute the clean up nodes ");
|
||||
|
||||
}
|
||||
purgedNodes = purgeOldDeletedNodesV2(minPurgeAgeMs);
|
||||
if (logger.isDebugEnabled())
|
||||
{
|
||||
logger.debug(purgedNodes);
|
||||
}
|
||||
refreshLock();
|
||||
if (logger.isDebugEnabled())
|
||||
{
|
||||
logger.debug("DeletedNodeCleanupWorker: About to execute the clean up txns ");
|
||||
}
|
||||
|
||||
purgedTxns = purgeOldEmptyTransactionsV2(minPurgeAgeMs);
|
||||
}
|
||||
else
|
||||
{
|
||||
|
||||
if (logger.isDebugEnabled())
|
||||
{
|
||||
logger.debug("DeletedNodeCleanupWorker: About to start purgeOldDeletedNodes ");
|
||||
}
|
||||
|
||||
purgedNodes = purgeOldDeletedNodes(minPurgeAgeMs);
|
||||
logger.debug(purgedNodes);
|
||||
|
||||
if (logger.isDebugEnabled())
|
||||
{
|
||||
logger.debug("DeletedNodeCleanupWorker: About to start purgeOldEmptyTransactions ");
|
||||
}
|
||||
|
||||
purgedTxns = purgeOldEmptyTransactions(minPurgeAgeMs);
|
||||
}
|
||||
|
||||
if (logger.isDebugEnabled())
|
||||
{
|
||||
logger.debug(purgedTxns);
|
||||
}
|
||||
|
||||
List<String> allResults = new ArrayList<>(100);
|
||||
allResults.addAll(purgedNodes);
|
||||
allResults.addAll(purgedTxns);
|
||||
|
||||
// Done
|
||||
|
||||
return allResults;
|
||||
}
|
||||
|
||||
@@ -110,7 +159,17 @@ public class DeletedNodeCleanupWorker extends AbstractNodeCleanupWorker
|
||||
this.purgeSize = purgeSize;
|
||||
}
|
||||
|
||||
/**
|
||||
public void setAlgorithm(String algorithm)
|
||||
{
|
||||
this.algorithm = algorithm;
|
||||
}
|
||||
|
||||
public void setDeleteBatchSize(int deleteBatchSize)
|
||||
{
|
||||
this.deleteBatchSize = deleteBatchSize;
|
||||
}
|
||||
|
||||
/**
|
||||
* Cleans up deleted nodes that are older than the given minimum age.
|
||||
*
|
||||
* @param minAge the minimum age of a transaction or deleted node
|
||||
@@ -122,10 +181,12 @@ public class DeletedNodeCleanupWorker extends AbstractNodeCleanupWorker
|
||||
|
||||
final long maxCommitTime = System.currentTimeMillis() - minAge;
|
||||
long fromCommitTime = fromCustomCommitTime;
|
||||
|
||||
if (fromCommitTime <= 0L)
|
||||
{
|
||||
fromCommitTime = nodeDAO.getMinTxnCommitTimeForDeletedNodes().longValue();
|
||||
}
|
||||
|
||||
if ( fromCommitTime == 0L )
|
||||
{
|
||||
String msg = "There are no old nodes to purge.";
|
||||
@@ -134,7 +195,10 @@ public class DeletedNodeCleanupWorker extends AbstractNodeCleanupWorker
|
||||
}
|
||||
|
||||
long loopPurgeSize = purgeSize;
|
||||
Long purgeCount = new Long(0);
|
||||
if(logger.isDebugEnabled())
|
||||
{
|
||||
logger.debug("DeletedNodeCleanupWorker: purgeOldDeletedNodes started ");
|
||||
}
|
||||
while (true)
|
||||
{
|
||||
// Ensure we keep the lock
|
||||
@@ -153,9 +217,9 @@ public class DeletedNodeCleanupWorker extends AbstractNodeCleanupWorker
|
||||
try
|
||||
{
|
||||
DeleteNodesByTransactionsCallback purgeNodesCallback = new DeleteNodesByTransactionsCallback(nodeDAO, fromCommitTime, toCommitTime);
|
||||
purgeCount = txnHelper.doInTransaction(purgeNodesCallback, false, true);
|
||||
Long purgeCount = txnHelper.doInTransaction(purgeNodesCallback, false, true);
|
||||
|
||||
if (purgeCount.longValue() > 0)
|
||||
if (purgeCount > 0)
|
||||
{
|
||||
String msg =
|
||||
"Purged old nodes: \n" +
|
||||
@@ -220,7 +284,8 @@ public class DeletedNodeCleanupWorker extends AbstractNodeCleanupWorker
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
logger.debug("DeletedNodeCleanupWorker: purgeOldDeletedNodes finished ");
|
||||
// Done
|
||||
return results;
|
||||
}
|
||||
@@ -245,6 +310,10 @@ public class DeletedNodeCleanupWorker extends AbstractNodeCleanupWorker
|
||||
{
|
||||
fromCommitTime = nodeDAO.getMinUnusedTxnCommitTime().longValue();
|
||||
}
|
||||
if(logger.isDebugEnabled())
|
||||
{
|
||||
logger.debug("DeletedNodeCleanupWorker: purgeOldEmptyTransactions started ");
|
||||
}
|
||||
// delete unused transactions in batches of size 'purgeTxnBlockSize'
|
||||
while (true)
|
||||
{
|
||||
@@ -298,14 +367,46 @@ public class DeletedNodeCleanupWorker extends AbstractNodeCleanupWorker
|
||||
}
|
||||
|
||||
fromCommitTime += purgeSize;
|
||||
if(fromCommitTime >= maxCommitTime)
|
||||
if (fromCommitTime >= maxCommitTime)
|
||||
{
|
||||
break;
|
||||
break;
|
||||
}
|
||||
}
|
||||
logger.debug("DeletedNodeCleanupWorker: purgeOldEmptyTransactions finished ");
|
||||
// Done
|
||||
return results;
|
||||
}
|
||||
|
||||
|
||||
private List<String> purgeOldDeletedNodesV2(long minAge)
|
||||
{
|
||||
refreshLock();
|
||||
final List<String> returnList = new ArrayList<>();
|
||||
RetryingTransactionHelper txnHelper = transactionService.getRetryingTransactionHelper();
|
||||
|
||||
RetryingTransactionCallback<Void> callback = () -> {
|
||||
returnList.addAll(nodeDAO.purgeDeletedNodes(minAge, deleteBatchSize));
|
||||
return null;
|
||||
};
|
||||
|
||||
txnHelper.doInTransaction(callback, false, true);
|
||||
return returnList;
|
||||
}
|
||||
|
||||
private List<String> purgeOldEmptyTransactionsV2(long minAge)
|
||||
{
|
||||
refreshLock();
|
||||
final List<String> returnList = new ArrayList<>();
|
||||
RetryingTransactionHelper txnHelper = transactionService.getRetryingTransactionHelper();
|
||||
|
||||
RetryingTransactionCallback<Void> callback = () -> {
|
||||
returnList.addAll(nodeDAO.purgeEmptyTransactions(minAge, deleteBatchSize));
|
||||
return null;
|
||||
};
|
||||
txnHelper.doInTransaction(callback, false, true);
|
||||
|
||||
return returnList;
|
||||
}
|
||||
|
||||
private static abstract class DeleteByTransactionsCallback implements RetryingTransactionCallback<Long>
|
||||
{
|
||||
@@ -356,4 +457,5 @@ public class DeletedNodeCleanupWorker extends AbstractNodeCleanupWorker
|
||||
return count;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
@@ -2,7 +2,7 @@
|
||||
* #%L
|
||||
* Alfresco Repository
|
||||
* %%
|
||||
* Copyright (C) 2021 Alfresco Software Limited
|
||||
* Copyright (C) 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
|
||||
@@ -29,15 +29,22 @@ import org.alfresco.repo.content.transform.LocalTransform;
|
||||
import org.alfresco.repo.content.transform.LocalTransformServiceRegistry;
|
||||
import org.alfresco.repo.content.transform.UnsupportedTransformationException;
|
||||
import org.alfresco.service.cmr.repository.ContentReader;
|
||||
import org.alfresco.service.cmr.repository.ContentService;
|
||||
import org.alfresco.service.cmr.repository.ContentWriter;
|
||||
import org.alfresco.service.cmr.repository.DirectAccessUrl;
|
||||
import org.alfresco.service.cmr.repository.NodeRef;
|
||||
import org.alfresco.transform.client.model.config.CoreFunction;
|
||||
import org.alfresco.util.PropertyCheck;
|
||||
import org.apache.commons.logging.Log;
|
||||
import org.apache.commons.logging.LogFactory;
|
||||
import org.springframework.beans.factory.InitializingBean;
|
||||
|
||||
import java.util.HashMap;
|
||||
import java.util.Map;
|
||||
|
||||
import static org.alfresco.model.ContentModel.PROP_CONTENT;
|
||||
import static org.alfresco.transform.client.util.RequestParamMap.DIRECT_ACCESS_URL;
|
||||
|
||||
/**
|
||||
* Request synchronous transforms.
|
||||
*
|
||||
@@ -51,16 +58,30 @@ public class LocalSynchronousTransformClient implements SynchronousTransformClie
|
||||
private static Log logger = LogFactory.getLog(LocalTransformClient.class);
|
||||
|
||||
private LocalTransformServiceRegistry localTransformServiceRegistry;
|
||||
private ContentService contentService;
|
||||
private boolean directAccessUrlEnabled;
|
||||
|
||||
public void setLocalTransformServiceRegistry(LocalTransformServiceRegistry localTransformServiceRegistry)
|
||||
{
|
||||
this.localTransformServiceRegistry = localTransformServiceRegistry;
|
||||
}
|
||||
|
||||
public void setContentService(ContentService contentService)
|
||||
{
|
||||
this.contentService = contentService;
|
||||
}
|
||||
|
||||
public void setDirectAccessUrlEnabled(boolean directAccessUrlEnabled)
|
||||
{
|
||||
this.directAccessUrlEnabled = directAccessUrlEnabled;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void afterPropertiesSet() throws Exception
|
||||
{
|
||||
PropertyCheck.mandatory(this, "localTransformServiceRegistry", localTransformServiceRegistry);
|
||||
PropertyCheck.mandatory(this, "contentService", contentService);
|
||||
PropertyCheck.mandatory(this, "transformDirectAccessUrlEnabled", directAccessUrlEnabled);
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -123,6 +144,7 @@ public class LocalSynchronousTransformClient implements SynchronousTransformClie
|
||||
logger.debug(TRANSFORM + "requested " + renditionName);
|
||||
}
|
||||
|
||||
actualOptions = addDirectAccessUrlToOptionsIfPossible(actualOptions, sourceNodeRef, transform);
|
||||
transform.transform(reader, writer, actualOptions, renditionName, sourceNodeRef);
|
||||
|
||||
if (logger.isDebugEnabled())
|
||||
@@ -140,6 +162,20 @@ public class LocalSynchronousTransformClient implements SynchronousTransformClie
|
||||
}
|
||||
}
|
||||
|
||||
private Map<String, String> addDirectAccessUrlToOptionsIfPossible(Map<String, String> actualOptions,
|
||||
NodeRef sourceNodeRef, LocalTransform transform)
|
||||
{
|
||||
if (directAccessUrlEnabled &&
|
||||
localTransformServiceRegistry.isSupported(CoreFunction.DIRECT_ACCESS_URL, transform) &&
|
||||
contentService.isContentDirectUrlEnabled(sourceNodeRef, PROP_CONTENT))
|
||||
{
|
||||
DirectAccessUrl directAccessUrl = contentService.requestContentDirectUrl(sourceNodeRef, PROP_CONTENT, true);
|
||||
actualOptions = new HashMap<>(actualOptions);
|
||||
actualOptions.put(DIRECT_ACCESS_URL, directAccessUrl.getContentUrl());
|
||||
}
|
||||
return actualOptions;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getName()
|
||||
{
|
||||
|
@@ -2,7 +2,7 @@
|
||||
* #%L
|
||||
* Alfresco Repository
|
||||
* %%
|
||||
* Copyright (C) 2019 Alfresco Software Limited
|
||||
* Copyright (C) 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
|
||||
@@ -32,18 +32,24 @@ import org.alfresco.repo.security.authentication.AuthenticationUtil;
|
||||
import org.alfresco.service.cmr.repository.ContentReader;
|
||||
import org.alfresco.service.cmr.repository.ContentService;
|
||||
import org.alfresco.service.cmr.repository.ContentWriter;
|
||||
import org.alfresco.service.cmr.repository.DirectAccessUrl;
|
||||
import org.alfresco.service.cmr.repository.NodeRef;
|
||||
import org.alfresco.service.transaction.TransactionService;
|
||||
import org.alfresco.transform.client.model.config.CoreFunction;
|
||||
import org.alfresco.util.PropertyCheck;
|
||||
import org.apache.commons.logging.Log;
|
||||
import org.apache.commons.logging.LogFactory;
|
||||
import org.springframework.beans.factory.InitializingBean;
|
||||
|
||||
import java.io.InputStream;
|
||||
import java.util.HashMap;
|
||||
import java.util.Map;
|
||||
import java.util.concurrent.ExecutorService;
|
||||
import java.util.concurrent.Executors;
|
||||
|
||||
import static org.alfresco.model.ContentModel.PROP_CONTENT;
|
||||
import static org.alfresco.transform.client.util.RequestParamMap.DIRECT_ACCESS_URL;
|
||||
|
||||
/**
|
||||
* Requests rendition transforms take place using transforms available on the local machine (based on
|
||||
* {@link LocalTransform}. The transform and consumption of the
|
||||
@@ -61,6 +67,7 @@ public class LocalTransformClient implements TransformClient, InitializingBean
|
||||
private TransactionService transactionService;
|
||||
private ContentService contentService;
|
||||
private RenditionService2Impl renditionService2;
|
||||
private boolean directAccessUrlEnabled;
|
||||
|
||||
private ExecutorService executorService;
|
||||
private ThreadLocal<LocalTransform> transform = new ThreadLocal<>();
|
||||
@@ -85,6 +92,11 @@ public class LocalTransformClient implements TransformClient, InitializingBean
|
||||
this.renditionService2 = renditionService2;
|
||||
}
|
||||
|
||||
public void setDirectAccessUrlEnabled(boolean directAccessUrlEnabled)
|
||||
{
|
||||
this.directAccessUrlEnabled = directAccessUrlEnabled;
|
||||
}
|
||||
|
||||
public void setExecutorService(ExecutorService executorService)
|
||||
{
|
||||
this.executorService = executorService;
|
||||
@@ -97,6 +109,7 @@ public class LocalTransformClient implements TransformClient, InitializingBean
|
||||
PropertyCheck.mandatory(this, "transactionService", transactionService);
|
||||
PropertyCheck.mandatory(this, "contentService", contentService);
|
||||
PropertyCheck.mandatory(this, "renditionService2", renditionService2);
|
||||
PropertyCheck.mandatory(this, "directAccessUrlEnabled", directAccessUrlEnabled);
|
||||
if (executorService == null)
|
||||
{
|
||||
executorService = Executors.newCachedThreadPool();
|
||||
@@ -130,8 +143,9 @@ public class LocalTransformClient implements TransformClient, InitializingBean
|
||||
{
|
||||
String renditionName = renditionDefinition.getRenditionName();
|
||||
String targetMimetype = renditionDefinition.getTargetMimetype();
|
||||
Map<String, String> actualOptions = renditionDefinition.getTransformOptions();
|
||||
Map<String, String> renditionOptions = renditionDefinition.getTransformOptions();
|
||||
LocalTransform localTransform = transform.get();
|
||||
Map<String, String> actualOptions = addDirectAccessUrlToOptionsIfPossible(renditionOptions, sourceNodeRef, localTransform);
|
||||
|
||||
executorService.submit(() ->
|
||||
{
|
||||
@@ -187,4 +201,18 @@ public class LocalTransformClient implements TransformClient, InitializingBean
|
||||
}), user);
|
||||
});
|
||||
}
|
||||
|
||||
private Map<String, String> addDirectAccessUrlToOptionsIfPossible(Map<String, String> actualOptions,
|
||||
NodeRef sourceNodeRef, LocalTransform transform)
|
||||
{
|
||||
if (directAccessUrlEnabled &&
|
||||
localTransformServiceRegistry.isSupported(CoreFunction.DIRECT_ACCESS_URL, transform) &&
|
||||
contentService.isContentDirectUrlEnabled(sourceNodeRef, PROP_CONTENT))
|
||||
{
|
||||
DirectAccessUrl directAccessUrl = contentService.requestContentDirectUrl(sourceNodeRef, PROP_CONTENT, true);
|
||||
actualOptions = new HashMap<>(actualOptions);
|
||||
actualOptions.put(DIRECT_ACCESS_URL, directAccessUrl.getContentUrl());
|
||||
}
|
||||
return actualOptions;
|
||||
}
|
||||
}
|
||||
|
@@ -43,7 +43,6 @@ import org.alfresco.repo.domain.tenant.TenantEntity;
|
||||
import org.alfresco.repo.security.authentication.AuthenticationUtil;
|
||||
import org.alfresco.repo.tenant.TenantUtil.TenantRunAsWork;
|
||||
import org.alfresco.repo.transaction.RetryingTransactionHelper.RetryingTransactionCallback;
|
||||
import org.alfresco.service.Experimental;
|
||||
import org.alfresco.service.transaction.TransactionService;
|
||||
import org.springframework.beans.BeansException;
|
||||
import org.springframework.context.ApplicationContext;
|
||||
@@ -276,7 +275,6 @@ public abstract class AbstractTenantRoutingContentStore extends AbstractRoutingC
|
||||
/**
|
||||
* {@inheritDoc}
|
||||
*/
|
||||
@Experimental
|
||||
@Override
|
||||
public Map<String, String> getStorageProperties(String contentUrl)
|
||||
{
|
||||
@@ -287,7 +285,6 @@ public abstract class AbstractTenantRoutingContentStore extends AbstractRoutingC
|
||||
* {@inheritDoc}
|
||||
*/
|
||||
@Override
|
||||
@Experimental
|
||||
public boolean requestSendContentToArchive(String contentUrl, Map<String, Serializable> archiveParams)
|
||||
{
|
||||
return getTenantContentStore().requestSendContentToArchive(contentUrl, archiveParams);
|
||||
@@ -297,7 +294,6 @@ public abstract class AbstractTenantRoutingContentStore extends AbstractRoutingC
|
||||
* {@inheritDoc}
|
||||
*/
|
||||
@Override
|
||||
@Experimental
|
||||
public boolean requestRestoreContentFromArchive(String contentUrl, Map<String, Serializable> restoreParams)
|
||||
{
|
||||
return getTenantContentStore().requestRestoreContentFromArchive(contentUrl, restoreParams);
|
||||
|
@@ -1,33 +1,33 @@
|
||||
/*
|
||||
* #%L
|
||||
* Alfresco Repository
|
||||
* %%
|
||||
* Copyright (C) 2005 - 2016 Alfresco Software Limited
|
||||
* %%
|
||||
* This file is part of the Alfresco software.
|
||||
* If the software was purchased under a paid Alfresco license, the terms of
|
||||
* the paid license agreement will prevail. Otherwise, the software is
|
||||
* provided under the following open source license terms:
|
||||
*
|
||||
* Alfresco is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU Lesser General Public License as published by
|
||||
* the Free Software Foundation, either version 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* Alfresco is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU Lesser General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Lesser General Public License
|
||||
* along with Alfresco. If not, see <http://www.gnu.org/licenses/>.
|
||||
* #L%
|
||||
*/
|
||||
/*
|
||||
* #%L
|
||||
* Alfresco Repository
|
||||
* %%
|
||||
* Copyright (C) 2005 - 2016 Alfresco Software Limited
|
||||
* %%
|
||||
* This file is part of the Alfresco software.
|
||||
* If the software was purchased under a paid Alfresco license, the terms of
|
||||
* the paid license agreement will prevail. Otherwise, the software is
|
||||
* provided under the following open source license terms:
|
||||
*
|
||||
* Alfresco is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU Lesser General Public License as published by
|
||||
* the Free Software Foundation, either version 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* Alfresco is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU Lesser General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Lesser General Public License
|
||||
* along with Alfresco. If not, see <http://www.gnu.org/licenses/>.
|
||||
* #L%
|
||||
*/
|
||||
package org.alfresco.repo.tenant;
|
||||
|
||||
import java.sql.SQLException;
|
||||
|
||||
import org.apache.commons.dbcp.BasicDataSource;
|
||||
import org.apache.commons.dbcp2.BasicDataSource;
|
||||
|
||||
/**
|
||||
* Experimental
|
||||
@@ -41,7 +41,7 @@ public class TenantBasicDataSource extends BasicDataSource
|
||||
{
|
||||
// tenant-specific
|
||||
this.setUrl(tenantUrl);
|
||||
this.setMaxActive(tenantMaxActive == -1 ? bds.getMaxActive() : tenantMaxActive);
|
||||
this.setMaxTotal(tenantMaxActive == -1 ? bds.getMaxTotal() : tenantMaxActive);
|
||||
|
||||
// defaults/overrides - see also 'baseDefaultDataSource' (core-services-context.xml + repository.properties)
|
||||
|
||||
@@ -54,7 +54,7 @@ public class TenantBasicDataSource extends BasicDataSource
|
||||
this.setMaxIdle(bds.getMaxIdle());
|
||||
this.setDefaultAutoCommit(bds.getDefaultAutoCommit());
|
||||
this.setDefaultTransactionIsolation(bds.getDefaultTransactionIsolation());
|
||||
this.setMaxWait(bds.getMaxWait());
|
||||
this.setMaxWaitMillis(bds.getMaxWaitMillis());
|
||||
this.setValidationQuery(bds.getValidationQuery());
|
||||
this.setTimeBetweenEvictionRunsMillis(bds.getTimeBetweenEvictionRunsMillis());
|
||||
this.setMinEvictableIdleTimeMillis(bds.getMinEvictableIdleTimeMillis());
|
||||
@@ -62,7 +62,7 @@ public class TenantBasicDataSource extends BasicDataSource
|
||||
this.setTestOnBorrow(bds.getTestOnBorrow());
|
||||
this.setTestOnReturn(bds.getTestOnReturn());
|
||||
this.setTestWhileIdle(bds.getTestWhileIdle());
|
||||
this.setRemoveAbandoned(bds.getRemoveAbandoned());
|
||||
this.setRemoveAbandonedOnBorrow(bds.getRemoveAbandonedOnBorrow());
|
||||
this.setRemoveAbandonedTimeout(bds.getRemoveAbandonedTimeout());
|
||||
this.setPoolPreparedStatements(bds.isPoolPreparedStatements());
|
||||
this.setMaxOpenPreparedStatements(bds.getMaxOpenPreparedStatements());
|
||||
|
@@ -1,28 +1,28 @@
|
||||
/*
|
||||
* #%L
|
||||
* Alfresco Repository
|
||||
* %%
|
||||
* Copyright (C) 2005 - 2016 Alfresco Software Limited
|
||||
* %%
|
||||
* This file is part of the Alfresco software.
|
||||
* If the software was purchased under a paid Alfresco license, the terms of
|
||||
* the paid license agreement will prevail. Otherwise, the software is
|
||||
* provided under the following open source license terms:
|
||||
*
|
||||
* Alfresco is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU Lesser General Public License as published by
|
||||
* the Free Software Foundation, either version 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* Alfresco is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU Lesser General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Lesser General Public License
|
||||
* along with Alfresco. If not, see <http://www.gnu.org/licenses/>.
|
||||
* #L%
|
||||
*/
|
||||
/*
|
||||
* #%L
|
||||
* Alfresco Repository
|
||||
* %%
|
||||
* Copyright (C) 2005 - 2016 Alfresco Software Limited
|
||||
* %%
|
||||
* This file is part of the Alfresco software.
|
||||
* If the software was purchased under a paid Alfresco license, the terms of
|
||||
* the paid license agreement will prevail. Otherwise, the software is
|
||||
* provided under the following open source license terms:
|
||||
*
|
||||
* Alfresco is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU Lesser General Public License as published by
|
||||
* the Free Software Foundation, either version 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* Alfresco is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU Lesser General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Lesser General Public License
|
||||
* along with Alfresco. If not, see <http://www.gnu.org/licenses/>.
|
||||
* #L%
|
||||
*/
|
||||
package org.alfresco.repo.tenant;
|
||||
|
||||
import java.sql.SQLException;
|
||||
@@ -32,7 +32,7 @@ import java.util.Map;
|
||||
import javax.sql.DataSource;
|
||||
|
||||
import org.alfresco.repo.security.authentication.AuthenticationUtil;
|
||||
import org.apache.commons.dbcp.BasicDataSource;
|
||||
import org.apache.commons.dbcp2.BasicDataSource;
|
||||
import org.springframework.extensions.surf.util.ParameterCheck;
|
||||
import org.springframework.jdbc.datasource.lookup.AbstractRoutingDataSource;
|
||||
|
||||
|
@@ -29,7 +29,6 @@ package org.alfresco.service.cmr.repository;
|
||||
import org.alfresco.api.AlfrescoPublicApi;
|
||||
import org.alfresco.model.ContentModel;
|
||||
import org.alfresco.service.Auditable;
|
||||
import org.alfresco.service.Experimental;
|
||||
import org.alfresco.service.cmr.dictionary.InvalidTypeException;
|
||||
import org.alfresco.service.namespace.QName;
|
||||
|
||||
@@ -260,7 +259,6 @@ public interface ContentService
|
||||
* @return Returns a key-value (String-String) collection of storage headers/properties with their respective values for a given {@link NodeRef}.
|
||||
*/
|
||||
@Auditable(parameters = {"nodeRef", "propertyQName"})
|
||||
@Experimental
|
||||
default Map<String, String> getStorageProperties(NodeRef nodeRef, QName propertyQName)
|
||||
{
|
||||
return Collections.emptyMap();
|
||||
@@ -270,7 +268,6 @@ public interface ContentService
|
||||
* 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 nodeRef a reference to a node having a content property
|
||||
* @param propertyQName the name of the property, which must be of type <b>content</b>
|
||||
@@ -279,7 +276,6 @@ public interface ContentService
|
||||
* @throws UnsupportedOperationException when method not implemented
|
||||
*/
|
||||
@Auditable(parameters = {"nodeRef", "propertyQName", "archiveParams"})
|
||||
@Experimental
|
||||
default boolean requestSendContentToArchive(NodeRef nodeRef, QName propertyQName,
|
||||
Map<String, Serializable> archiveParams)
|
||||
{
|
||||
@@ -293,7 +289,6 @@ public interface ContentService
|
||||
* 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 nodeRef a reference to a node having a content property
|
||||
* @param propertyQName the name of the property, which must be of type <b>content</b>
|
||||
@@ -302,7 +297,6 @@ public interface ContentService
|
||||
* @throws UnsupportedOperationException when method not implemented
|
||||
*/
|
||||
@Auditable(parameters = {"nodeRef", "propertyQName", "restoreParams"})
|
||||
@Experimental
|
||||
default boolean requestRestoreContentFromArchive(NodeRef nodeRef, QName propertyQName, Map<String, Serializable> restoreParams)
|
||||
{
|
||||
throw new UnsupportedOperationException("Request to restore content from archive is not supported by content service.");
|
||||
|
@@ -47,7 +47,7 @@ import java.io.StringReader;
|
||||
import java.util.Collections;
|
||||
import java.util.List;
|
||||
|
||||
import static org.alfresco.transform.client.util.RequestParamMap.INCLUDE_CORE_VERSION;
|
||||
import static org.alfresco.transform.client.util.RequestParamMap.ENDPOINT_TRANSFORM_CONFIG_LATEST;
|
||||
|
||||
/**
|
||||
* This class reads multiple T-Engine config and local files and registers as if they were all
|
||||
@@ -106,7 +106,7 @@ public class CombinedConfig extends CombinedTransformConfig
|
||||
|
||||
private boolean addRemoteConfig(String baseUrl, String remoteType)
|
||||
{
|
||||
String url = baseUrl + (baseUrl.endsWith("/") ? "" : "/") + "transform/config?" + INCLUDE_CORE_VERSION + "=" + true;
|
||||
String url = baseUrl + (baseUrl.endsWith("/") ? "" : "/") + ENDPOINT_TRANSFORM_CONFIG_LATEST;
|
||||
HttpGet httpGet = new HttpGet(url);
|
||||
boolean successReadingConfig = true;
|
||||
try
|
||||
|
@@ -30,7 +30,7 @@
|
||||
<property name="initialSize">
|
||||
<value>0</value>
|
||||
</property>
|
||||
<property name="maxActive">
|
||||
<property name="maxTotal">
|
||||
<value>1</value>
|
||||
</property>
|
||||
<property name="maxIdle">
|
||||
|
@@ -156,7 +156,7 @@
|
||||
<bean id="defaultDataSource" parent="baseDefaultDataSource" />
|
||||
|
||||
<!-- Datasource bean -->
|
||||
<bean id="baseDefaultDataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close" abstract="true">
|
||||
<bean id="baseDefaultDataSource" class="org.apache.commons.dbcp2.BasicDataSource" destroy-method="close" abstract="true">
|
||||
<property name="driverClassName">
|
||||
<value>${db.driver}</value>
|
||||
</property>
|
||||
@@ -172,7 +172,7 @@
|
||||
<property name="initialSize" >
|
||||
<value>${db.pool.initial}</value>
|
||||
</property>
|
||||
<property name="maxActive" >
|
||||
<property name="maxTotal" >
|
||||
<value>${db.pool.max}</value>
|
||||
</property>
|
||||
<property name="minIdle" >
|
||||
@@ -187,7 +187,7 @@
|
||||
<property name="defaultTransactionIsolation" >
|
||||
<value>${db.txn.isolation}</value>
|
||||
</property>
|
||||
<property name="maxWait" >
|
||||
<property name="maxWaitMillis" >
|
||||
<value>${db.pool.wait.max}</value>
|
||||
</property>
|
||||
<property name="validationQuery" >
|
||||
@@ -211,7 +211,7 @@
|
||||
<property name="testWhileIdle" >
|
||||
<value>${db.pool.evict.validate}</value>
|
||||
</property>
|
||||
<property name="removeAbandoned" >
|
||||
<property name="removeAbandonedOnBorrow" >
|
||||
<value>${db.pool.abandoned.detect}</value>
|
||||
</property>
|
||||
<property name="removeAbandonedTimeout" >
|
||||
|
@@ -203,6 +203,7 @@ Inbound settings from iBatis
|
||||
<mapper resource="alfresco/ibatis/#resource.dialect#/content-insert-SqlMap.xml"/>
|
||||
<mapper resource="alfresco/ibatis/#resource.dialect#/node-common-SqlMap.xml"/>
|
||||
<mapper resource="alfresco/ibatis/#resource.dialect#/node-select-children-SqlMap.xml"/>
|
||||
<mapper resource="alfresco/ibatis/#resource.dialect#/node-select-SqlMap.xml"/>
|
||||
<mapper resource="alfresco/ibatis/#resource.dialect#/node-update-SqlMap.xml"/>
|
||||
<mapper resource="alfresco/ibatis/#resource.dialect#/node-delete-SqlMap.xml"/>
|
||||
<mapper resource="alfresco/ibatis/#resource.dialect#/node-insert-SqlMap.xml"/>
|
||||
|
@@ -1505,5 +1505,32 @@
|
||||
where
|
||||
commit_time_ms > #{minCommitTime}
|
||||
</select>
|
||||
|
||||
<delete id="delete_NodesById" parameterType="list">
|
||||
delete from alf_node
|
||||
where
|
||||
id IN
|
||||
<foreach item="item" index="index" collection="list" open="(" separator="," close=")">
|
||||
#{item}
|
||||
</foreach>
|
||||
</delete>
|
||||
|
||||
<delete id="delete_NodePropsByNodeId" parameterType="list">
|
||||
delete from alf_node_properties
|
||||
where
|
||||
node_id IN
|
||||
<foreach item="item" index="index" collection="list" open="(" separator="," close=")">
|
||||
#{item}
|
||||
</foreach>
|
||||
</delete>
|
||||
|
||||
<delete id="delete_Txns_UnusedById" parameterType="list">
|
||||
delete from alf_transaction
|
||||
where
|
||||
id in
|
||||
<foreach item="item" index="index" collection="list" open="(" separator="," close=")">
|
||||
#{item}
|
||||
</foreach>
|
||||
</delete>
|
||||
|
||||
</mapper>
|
@@ -36,5 +36,5 @@
|
||||
)
|
||||
]]>
|
||||
</delete>
|
||||
|
||||
|
||||
</mapper>
|
@@ -0,0 +1,33 @@
|
||||
<?xml version="1.0" encoding="UTF-8" ?>
|
||||
|
||||
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
|
||||
|
||||
<mapper namespace="alfresco.node.select">
|
||||
|
||||
<select id="select_Deleted_NodesByTxnCommitTime" parameterType="TransactionQuery" fetchSize="100000" resultType="java.lang.Long">
|
||||
select
|
||||
node.id
|
||||
from
|
||||
alf_node node
|
||||
join alf_transaction txn on (node.transaction_id = txn.id)
|
||||
where
|
||||
node.type_qname_id = #{typeQNameId}
|
||||
<![CDATA[and commit_time_ms < #{maxCommitTime}]]>
|
||||
</select>
|
||||
|
||||
<select id="select_Txns_UnusedByTxnCommitTime" parameterType="TransactionQuery" fetchSize="100000" resultType="java.lang.Long">
|
||||
select
|
||||
id
|
||||
from alf_transaction
|
||||
where not exists
|
||||
(
|
||||
select 1
|
||||
from
|
||||
alf_node node
|
||||
where
|
||||
node.transaction_id = alf_transaction.id
|
||||
)
|
||||
<![CDATA[and commit_time_ms <= #{maxCommitTime}]]>
|
||||
</select>
|
||||
|
||||
</mapper>
|
@@ -27,5 +27,5 @@
|
||||
txn.commit_time_ms < #{maxCommitTime})
|
||||
]]>
|
||||
</delete>
|
||||
|
||||
|
||||
</mapper>
|
@@ -0,0 +1,33 @@
|
||||
<?xml version="1.0" encoding="UTF-8" ?>
|
||||
|
||||
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
|
||||
|
||||
<mapper namespace="alfresco.node.select">
|
||||
|
||||
<select id="select_Deleted_NodesByTxnCommitTime" parameterType="TransactionQuery" fetchSize="-2147483648" resultType="java.lang.Long">
|
||||
select
|
||||
node.id
|
||||
from
|
||||
alf_node node
|
||||
join alf_transaction txn on (node.transaction_id = txn.id)
|
||||
where
|
||||
node.type_qname_id = #{typeQNameId}
|
||||
<![CDATA[and commit_time_ms < #{maxCommitTime}]]>
|
||||
</select>
|
||||
|
||||
<select id="select_Txns_UnusedByTxnCommitTime" parameterType="TransactionQuery" fetchSize="-2147483648" resultType="java.lang.Long">
|
||||
select
|
||||
id
|
||||
from alf_transaction
|
||||
where not exists
|
||||
(
|
||||
select 1
|
||||
from
|
||||
alf_node node
|
||||
where
|
||||
node.transaction_id = alf_transaction.id
|
||||
)
|
||||
<![CDATA[and commit_time_ms <= #{maxCommitTime}]]>
|
||||
</select>
|
||||
|
||||
</mapper>
|
@@ -238,8 +238,14 @@
|
||||
<property name="purgeSize">
|
||||
<value>${index.tracking.purgeSize}</value>
|
||||
</property>
|
||||
<property name="algorithm">
|
||||
<value>${system.node_table_cleaner.algorithm}</value>
|
||||
</property>
|
||||
<property name="deleteBatchSize">
|
||||
<value>${system.node_cleanup.delete_batchSize}</value>
|
||||
</property>
|
||||
</bean>
|
||||
|
||||
|
||||
<!-- String length adjustment -->
|
||||
<bean id="nodeStringLengthWorker" class="org.alfresco.repo.node.db.NodeStringLengthWorker">
|
||||
<constructor-arg index="0" ref="nodeDAO" />
|
||||
|
@@ -81,12 +81,15 @@
|
||||
<property name="transactionService" ref="transactionService" />
|
||||
<property name="contentService" ref="contentService" />
|
||||
<property name="renditionService2" ref="renditionService2" />
|
||||
<property name="directAccessUrlEnabled" value="${local.transform.directAccessUrl.enabled}"/>
|
||||
</bean>
|
||||
|
||||
<bean id="synchronousTransformClient" parent="localSynchronousTransformClient" />
|
||||
|
||||
<bean id="localSynchronousTransformClient" class="org.alfresco.repo.rendition2.LocalSynchronousTransformClient">
|
||||
<property name="localTransformServiceRegistry" ref="localTransformServiceRegistry" />
|
||||
<property name="contentService" ref="contentService" />
|
||||
<property name="directAccessUrlEnabled" value="${local.transform.directAccessUrl.enabled}"/>
|
||||
</bean>
|
||||
|
||||
<!-- Deprecated bean that converts transform properties to the deprecated TransformationOptions format -->
|
||||
|
@@ -3,7 +3,7 @@
|
||||
repository.name=Main Repository
|
||||
|
||||
# Schema number
|
||||
version.schema=16000
|
||||
version.schema=16100
|
||||
|
||||
# Directory configuration
|
||||
|
||||
@@ -1246,6 +1246,11 @@ system.delete_not_exists.read_only=false
|
||||
system.delete_not_exists.timeout_seconds=-1
|
||||
system.prop_table_cleaner.algorithm=V2
|
||||
|
||||
# --Node cleanup batch - default settings
|
||||
system.node_cleanup.delete_batchSize=1000
|
||||
system.node_table_cleaner.algorithm=V1
|
||||
|
||||
|
||||
# Configure the system-wide (ACS) settings for direct access urls.
|
||||
#
|
||||
# For Direct Access URLs to be usable on the service-layer, the feature must be enabled both system-wide and on the
|
||||
@@ -1313,6 +1318,9 @@ restApi.directAccessUrl.enabled=false
|
||||
# Direct Access Url REST API calls cannot request an explicit expiry time.
|
||||
restApi.directAccessUrl.defaultExpiryTimeInSec=30
|
||||
|
||||
# Controls whether direct access url URLs may be used in transforms.
|
||||
local.transform.directAccessUrl.enabled=true
|
||||
|
||||
# Creates additional indexes on alf_node and alf_transaction. Recommended for large repositories.
|
||||
system.new-node-transaction-indexes.ignored=true
|
||||
|
||||
|
@@ -87,7 +87,8 @@ import org.junit.runners.Suite;
|
||||
org.alfresco.repo.node.cleanup.TransactionCleanupTest.class,
|
||||
org.alfresco.repo.security.person.GetPeopleCannedQueryTest.class,
|
||||
|
||||
org.alfresco.repo.domain.schema.script.DeleteNotExistsExecutorTest.class
|
||||
org.alfresco.repo.domain.schema.script.DeleteNotExistsExecutorTest.class,
|
||||
org.alfresco.repo.node.cleanup.DeletedNodeBatchCleanupTest.class
|
||||
})
|
||||
public class AllDBTestsTestSuite
|
||||
{
|
||||
|
@@ -63,6 +63,7 @@ import org.junit.runners.Suite;
|
||||
org.alfresco.repo.jscript.ScriptSearchTest.class,
|
||||
org.alfresco.repo.lock.LockUtilsTest.class,
|
||||
org.alfresco.repo.lock.mem.LockStoreImplTest.class,
|
||||
org.alfresco.repo.management.CheckRequiredClassesForLoggingConsoleUnitTest.class,
|
||||
org.alfresco.repo.management.subsystems.CryptodocSwitchableApplicationContextFactoryTest.class,
|
||||
org.alfresco.repo.module.ModuleDetailsImplTest.class,
|
||||
org.alfresco.repo.module.ModuleVersionNumberTest.class,
|
||||
|
@@ -84,6 +84,7 @@ import org.junit.runners.Suite;
|
||||
org.alfresco.repo.node.archive.ArchiveAndRestoreTest.class,
|
||||
org.alfresco.repo.node.db.DbNodeServiceImplTest.class,
|
||||
org.alfresco.repo.node.cleanup.TransactionCleanupTest.class,
|
||||
org.alfresco.repo.node.cleanup.DeletedNodeBatchCleanupTest.class,
|
||||
org.alfresco.repo.node.db.DbNodeServiceImplPropagationTest.class,
|
||||
})
|
||||
public class AppContext03TestSuite
|
||||
|
@@ -57,7 +57,7 @@ import org.alfresco.service.cmr.workflow.WorkflowAdminService;
|
||||
import org.alfresco.service.descriptor.Descriptor;
|
||||
import org.alfresco.service.transaction.TransactionService;
|
||||
import org.alfresco.traitextender.SpringExtensionBundle;
|
||||
import org.apache.commons.dbcp.BasicDataSource;
|
||||
import org.apache.commons.dbcp2.BasicDataSource;
|
||||
import org.junit.Before;
|
||||
import org.junit.Test;
|
||||
|
||||
|
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user