diff --git a/packaging/tests/tas-restapi/src/test/java/org/alfresco/rest/favorites/GetFavoritesTests.java b/packaging/tests/tas-restapi/src/test/java/org/alfresco/rest/favorites/GetFavoritesTests.java index 93727c7f9a..8c1ff59d9d 100644 --- a/packaging/tests/tas-restapi/src/test/java/org/alfresco/rest/favorites/GetFavoritesTests.java +++ b/packaging/tests/tas-restapi/src/test/java/org/alfresco/rest/favorites/GetFavoritesTests.java @@ -2,6 +2,11 @@ package org.alfresco.rest.favorites; import java.util.List; +import org.hamcrest.Matchers; +import org.springframework.http.HttpStatus; +import org.testng.annotations.BeforeClass; +import org.testng.annotations.Test; + import org.alfresco.dataprep.CMISUtil.DocumentType; import org.alfresco.rest.RestTest; import org.alfresco.rest.model.RestErrorModel; @@ -20,10 +25,6 @@ import org.alfresco.utility.model.TestGroup; import org.alfresco.utility.model.UserModel; import org.alfresco.utility.testrail.ExecutionType; import org.alfresco.utility.testrail.annotation.TestRail; -import org.hamcrest.Matchers; -import org.springframework.http.HttpStatus; -import org.testng.annotations.BeforeClass; -import org.testng.annotations.Test; public class GetFavoritesTests extends RestTest { @@ -56,7 +57,7 @@ public class GetFavoritesTests extends RestTest firstSiteUsers = dataUser.addUsersWithRolesToSite(firstSiteModel, UserRole.SiteManager, UserRole.SiteCollaborator, UserRole.SiteConsumer, UserRole.SiteContributor); secondSiteUsers = dataUser.addUsersWithRolesToSite(secondSiteModel, UserRole.SiteManager, UserRole.SiteCollaborator, UserRole.SiteConsumer, - UserRole.SiteContributor); + UserRole.SiteContributor); restClient.authenticateUser(userModel); restClient.withCoreAPI().usingUser(userModel).addSiteToFavorites(firstSiteModel); @@ -64,9 +65,9 @@ public class GetFavoritesTests extends RestTest restClient.withCoreAPI().usingUser(userModel).addSiteToFavorites(thirdSiteModel); } - @TestRail(section = { TestGroup.REST_API, TestGroup.FAVORITES }, executionType = ExecutionType.SANITY, + @TestRail(section = {TestGroup.REST_API, TestGroup.FAVORITES}, executionType = ExecutionType.SANITY, description = "Verify Manager user gets favorites with Rest API and status code is 200") - @Test(groups = { TestGroup.REST_API, TestGroup.FAVORITES, TestGroup.SANITY }) + @Test(groups = {TestGroup.REST_API, TestGroup.FAVORITES, TestGroup.SANITY}) public void managerIsAbleToRetrieveFavorites() { restClient.authenticateUser(firstSiteUsers.getOneUserWithRole(UserRole.SiteManager)); @@ -79,10 +80,10 @@ public class GetFavoritesTests extends RestTest .assertThat().entriesListContains("targetGuid", secondSiteModel.getGuid()); } - @TestRail(section = { TestGroup.REST_API, TestGroup.FAVORITES }, executionType = ExecutionType.SANITY, + @TestRail(section = {TestGroup.REST_API, TestGroup.FAVORITES}, executionType = ExecutionType.SANITY, description = "Verify user gets status code 401 if authentication call fails") - @Test(groups = { TestGroup.REST_API, TestGroup.FAVORITES, TestGroup.SANITY }) -// @Bug(id = "MNT-16904", description = "It fails only on environment with tenants") + @Test(groups = {TestGroup.REST_API, TestGroup.FAVORITES, TestGroup.SANITY}) + // @Bug(id = "MNT-16904", description = "It fails only on environment with tenants") public void userIsNotAbleToRetrieveFavoritesIfAuthenticationFails() { UserModel siteManager = firstSiteUsers.getOneUserWithRole(UserRole.SiteManager); @@ -91,44 +92,44 @@ public class GetFavoritesTests extends RestTest restClient.assertStatusCodeIs(HttpStatus.UNAUTHORIZED); } - @TestRail(section = { TestGroup.REST_API, TestGroup.FAVORITES }, executionType = ExecutionType.REGRESSION, + @TestRail(section = {TestGroup.REST_API, TestGroup.FAVORITES}, executionType = ExecutionType.REGRESSION, description = "Verify Admin user gets favorites sites with Rest API and status code is 200") - @Test(groups = { TestGroup.REST_API, TestGroup.FAVORITES, TestGroup.REGRESSION }) + @Test(groups = {TestGroup.REST_API, TestGroup.FAVORITES, TestGroup.REGRESSION}) public void adminIsAbleToRetrieveFavoritesSites() { restClient.authenticateUser(adminUserModel).withCoreAPI().usingUser(adminUserModel).addSiteToFavorites(firstSiteModel); restClient.withCoreAPI().usingUser(adminUserModel).addSiteToFavorites(secondSiteModel); - + userFavorites = restClient.withCoreAPI() .usingAuthUser().where().targetSiteExist().getFavorites(); restClient.assertStatusCodeIs(HttpStatus.OK); userFavorites.assertThat().entriesListContains("targetGuid", firstSiteModel.getGuid()) - .and().entriesListContains("targetGuid", secondSiteModel.getGuid()); + .and().entriesListContains("targetGuid", secondSiteModel.getGuid()); } - @TestRail(section = { TestGroup.REST_API, TestGroup.FAVORITES }, executionType = ExecutionType.REGRESSION, + @TestRail(section = {TestGroup.REST_API, TestGroup.FAVORITES}, executionType = ExecutionType.REGRESSION, description = "Verify Admin user gets favorites folders with Rest API and status code is 200") - @Test(groups = { TestGroup.REST_API, TestGroup.FAVORITES, TestGroup.REGRESSION }) + @Test(groups = {TestGroup.REST_API, TestGroup.FAVORITES, TestGroup.REGRESSION}) public void adminIsAbleToRetrieveFavoritesFolders() { restClient.authenticateUser(adminUserModel).withCoreAPI().usingUser(adminUserModel).addFolderToFavorites(firstFolderModel); restClient.withCoreAPI().usingUser(adminUserModel).addFolderToFavorites(secondFolderModel); - + userFavorites = restClient.withCoreAPI() .usingAuthUser().where().targetFolderExist().getFavorites(); restClient.assertStatusCodeIs(HttpStatus.OK); userFavorites.assertThat().entriesListContains("targetGuid", firstFolderModel.getNodeRef()) - .and().entriesListContains("targetGuid", secondFolderModel.getNodeRef()); + .and().entriesListContains("targetGuid", secondFolderModel.getNodeRef()); } - @TestRail(section = { TestGroup.REST_API, TestGroup.FAVORITES }, executionType = ExecutionType.REGRESSION, + @TestRail(section = {TestGroup.REST_API, TestGroup.FAVORITES}, executionType = ExecutionType.REGRESSION, description = "Verify Admin user gets favorites files with Rest API and status code is 200") - @Test(groups = { TestGroup.REST_API, TestGroup.FAVORITES, TestGroup.REGRESSION }) + @Test(groups = {TestGroup.REST_API, TestGroup.FAVORITES, TestGroup.REGRESSION}) public void adminIsAbleToRetrieveFavoritesFiles() { restClient.authenticateUser(adminUserModel).withCoreAPI().usingUser(adminUserModel).addFileToFavorites(firstFileModel); restClient.withCoreAPI().usingUser(adminUserModel).addFileToFavorites(secondFileModel); - + userFavorites = restClient.withCoreAPI() .usingAuthUser().where().targetFileExist().getFavorites(); restClient.assertStatusCodeIs(HttpStatus.OK); @@ -136,87 +137,87 @@ public class GetFavoritesTests extends RestTest .and().entriesListContains("targetGuid", secondFileModel.getNodeRefWithoutVersion()); } - @TestRail(section = { TestGroup.REST_API, TestGroup.FAVORITES }, executionType = ExecutionType.REGRESSION, + @TestRail(section = {TestGroup.REST_API, TestGroup.FAVORITES}, executionType = ExecutionType.REGRESSION, description = "Verify Collaborator user gets favorites with Rest API and status code is 200") - @Test(groups = { TestGroup.REST_API, TestGroup.FAVORITES, TestGroup.REGRESSION }) + @Test(groups = {TestGroup.REST_API, TestGroup.FAVORITES, TestGroup.REGRESSION}) public void collaboratorIsAbleToRetrieveFavorites() { restClient.authenticateUser(firstSiteUsers.getOneUserWithRole(UserRole.SiteCollaborator)) - .withCoreAPI().usingAuthUser().addSiteToFavorites(firstSiteModel); + .withCoreAPI().usingAuthUser().addSiteToFavorites(firstSiteModel); restClient.withCoreAPI().usingAuthUser().addSiteToFavorites(secondSiteModel); - + userFavorites = restClient.withCoreAPI().usingAuthUser().getFavorites(); restClient.assertStatusCodeIs(HttpStatus.OK); userFavorites.assertThat().entriesListContains("targetGuid", firstSiteModel.getGuid()) - .and().entriesListContains("targetGuid", secondSiteModel.getGuid()); + .and().entriesListContains("targetGuid", secondSiteModel.getGuid()); } - @TestRail(section = { TestGroup.REST_API, TestGroup.FAVORITES }, executionType = ExecutionType.REGRESSION, + @TestRail(section = {TestGroup.REST_API, TestGroup.FAVORITES}, executionType = ExecutionType.REGRESSION, description = "Verify Contributor user gets favorites with Rest API and status code is 200") - @Test(groups = { TestGroup.REST_API, TestGroup.FAVORITES, TestGroup.REGRESSION }) + @Test(groups = {TestGroup.REST_API, TestGroup.FAVORITES, TestGroup.REGRESSION}) public void contributorIsAbleToRetrieveFavorites() { restClient.authenticateUser(firstSiteUsers.getOneUserWithRole(UserRole.SiteContributor)) - .withCoreAPI().usingAuthUser().addSiteToFavorites(firstSiteModel); + .withCoreAPI().usingAuthUser().addSiteToFavorites(firstSiteModel); restClient.withCoreAPI().usingAuthUser().addSiteToFavorites(secondSiteModel); - + userFavorites = restClient.withCoreAPI().usingAuthUser().getFavorites(); restClient.assertStatusCodeIs(HttpStatus.OK); userFavorites.assertThat().entriesListContains("targetGuid", firstSiteModel.getGuid()).and() - .entriesListContains("targetGuid", secondSiteModel.getGuid()); + .entriesListContains("targetGuid", secondSiteModel.getGuid()); } - @TestRail(section = { TestGroup.REST_API, TestGroup.FAVORITES }, executionType = ExecutionType.REGRESSION, + @TestRail(section = {TestGroup.REST_API, TestGroup.FAVORITES}, executionType = ExecutionType.REGRESSION, description = "Verify Consumer user gets favorites with Rest API and status code is 200") - @Test(groups = { TestGroup.REST_API, TestGroup.FAVORITES, TestGroup.REGRESSION }) + @Test(groups = {TestGroup.REST_API, TestGroup.FAVORITES, TestGroup.REGRESSION}) public void consumerIsAbleToRetrieveFavorites() { restClient.authenticateUser(firstSiteUsers.getOneUserWithRole(UserRole.SiteConsumer)) - .withCoreAPI().usingAuthUser().addSiteToFavorites(firstSiteModel); + .withCoreAPI().usingAuthUser().addSiteToFavorites(firstSiteModel); restClient.withCoreAPI().usingAuthUser().addSiteToFavorites(secondSiteModel); - + userFavorites = restClient.withCoreAPI().usingAuthUser().getFavorites(); restClient.assertStatusCodeIs(HttpStatus.OK); userFavorites.assertThat().entriesListContains("targetGuid", firstSiteModel.getGuid()) - .assertThat().entriesListContains("targetGuid", secondSiteModel.getGuid()); + .assertThat().entriesListContains("targetGuid", secondSiteModel.getGuid()); } - @TestRail(section = { TestGroup.REST_API, TestGroup.FAVORITES }, executionType = ExecutionType.REGRESSION, + @TestRail(section = {TestGroup.REST_API, TestGroup.FAVORITES}, executionType = ExecutionType.REGRESSION, description = "Verify user doesn't have permission to get favorites of another user with Rest API and status code is 404") - @Test(groups = { TestGroup.REST_API, TestGroup.FAVORITES, TestGroup.REGRESSION }) + @Test(groups = {TestGroup.REST_API, TestGroup.FAVORITES, TestGroup.REGRESSION}) public void userIsNotAbleToRetrieveFavoritesOfAnotherUser() { restClient.authenticateUser(firstSiteUsers.getOneUserWithRole(UserRole.SiteConsumer)) - .withCoreAPI().usingUser(firstSiteUsers.getOneUserWithRole(UserRole.SiteCollaborator)).getFavorites(); + .withCoreAPI().usingUser(firstSiteUsers.getOneUserWithRole(UserRole.SiteCollaborator)).getFavorites(); restClient.assertStatusCodeIs(HttpStatus.NOT_FOUND) .assertLastError().containsSummary(String.format(RestErrorModel.ENTITY_NOT_FOUND, firstSiteUsers.getOneUserWithRole(UserRole.SiteCollaborator).getUsername())); } - @TestRail(section = { TestGroup.REST_API, TestGroup.FAVORITES }, executionType = ExecutionType.REGRESSION, + @TestRail(section = {TestGroup.REST_API, TestGroup.FAVORITES}, executionType = ExecutionType.REGRESSION, description = "Verify user doesn't have permission to get favorites of admin user with Rest API and status code is 200") - @Test(groups = { TestGroup.REST_API, TestGroup.FAVORITES, TestGroup.REGRESSION }) + @Test(groups = {TestGroup.REST_API, TestGroup.FAVORITES, TestGroup.REGRESSION}) public void userIsNotAbleToRetrieveFavoritesOfAdminUser() { restClient.authenticateUser(firstSiteUsers.getOneUserWithRole(UserRole.SiteConsumer)).withCoreAPI() - .usingUser(adminUserModel).getFavorites(); + .usingUser(adminUserModel).getFavorites(); restClient.assertStatusCodeIs(HttpStatus.NOT_FOUND) - .assertLastError().containsSummary(String.format(RestErrorModel.ENTITY_NOT_FOUND, adminUserModel.getUsername())); + .assertLastError().containsSummary(String.format(RestErrorModel.ENTITY_NOT_FOUND, adminUserModel.getUsername())); } - @TestRail(section = { TestGroup.REST_API, TestGroup.FAVORITES }, executionType = ExecutionType.REGRESSION, + @TestRail(section = {TestGroup.REST_API, TestGroup.FAVORITES}, executionType = ExecutionType.REGRESSION, description = "Verify admin user doesn't have permission to get favorites of another user with Rest API and status code is 200") - @Test(groups = { TestGroup.REST_API, TestGroup.FAVORITES, TestGroup.REGRESSION }) + @Test(groups = {TestGroup.REST_API, TestGroup.FAVORITES, TestGroup.REGRESSION}) public void adminIsNotAbleToRetrieveFavoritesOfAnotherUser() { restClient.authenticateUser(adminUserModel).withCoreAPI().usingUser(firstSiteUsers.getOneUserWithRole(UserRole.SiteCollaborator)) - .getFavorites(); + .getFavorites(); restClient.assertStatusCodeIs(HttpStatus.NOT_FOUND) - .assertLastError().containsSummary(String.format(RestErrorModel.ENTITY_NOT_FOUND, firstSiteUsers.getOneUserWithRole(UserRole.SiteCollaborator).getUsername())); + .assertLastError().containsSummary(String.format(RestErrorModel.ENTITY_NOT_FOUND, firstSiteUsers.getOneUserWithRole(UserRole.SiteCollaborator).getUsername())); } - @TestRail(section = { TestGroup.REST_API, TestGroup.FAVORITES }, executionType = ExecutionType.REGRESSION, + @TestRail(section = {TestGroup.REST_API, TestGroup.FAVORITES}, executionType = ExecutionType.REGRESSION, description = "Verify User gets only favorites sites with Rest API and status code is 200") - @Test(groups = { TestGroup.REST_API, TestGroup.FAVORITES, TestGroup.REGRESSION }) + @Test(groups = {TestGroup.REST_API, TestGroup.FAVORITES, TestGroup.REGRESSION}) public void userIsAbleToRetrieveOnlyFavoritesSites() { restClient.authenticateUser(secondSiteUsers.getOneUserWithRole(UserRole.SiteManager)); @@ -232,9 +233,9 @@ public class GetFavoritesTests extends RestTest .and().entriesListDoesNotContain("targetGuid", firstFolderModel.getNodeRef()); } - @TestRail(section = { TestGroup.REST_API, TestGroup.FAVORITES }, executionType = ExecutionType.REGRESSION, + @TestRail(section = {TestGroup.REST_API, TestGroup.FAVORITES}, executionType = ExecutionType.REGRESSION, description = "Verify User gets only favorites files with Rest API and status code is 200") - @Test(groups = { TestGroup.REST_API, TestGroup.FAVORITES, TestGroup.REGRESSION }) + @Test(groups = {TestGroup.REST_API, TestGroup.FAVORITES, TestGroup.REGRESSION}) public void userIsAbleToRetrieveOnlyFavoritesFiles() { restClient.authenticateUser(firstSiteUsers.getOneUserWithRole(UserRole.SiteCollaborator)); @@ -250,9 +251,9 @@ public class GetFavoritesTests extends RestTest .and().entriesListDoesNotContain("targetGuid", firstFolderModel.getNodeRef()); } - @TestRail(section = { TestGroup.REST_API, TestGroup.FAVORITES }, executionType = ExecutionType.REGRESSION, + @TestRail(section = {TestGroup.REST_API, TestGroup.FAVORITES}, executionType = ExecutionType.REGRESSION, description = "Verify User gets only favorites folders with Rest API and status code is 200") - @Test(groups = { TestGroup.REST_API, TestGroup.FAVORITES, TestGroup.REGRESSION }) + @Test(groups = {TestGroup.REST_API, TestGroup.FAVORITES, TestGroup.REGRESSION}) public void userIsAbleToRetrieveOnlyFavoritesFolders() { restClient.authenticateUser(firstSiteUsers.getOneUserWithRole(UserRole.SiteCollaborator)); @@ -268,9 +269,9 @@ public class GetFavoritesTests extends RestTest .and().entriesListDoesNotContain("targetGuid", firstFileModel.getNodeRefWithoutVersion()); } - @TestRail(section = { TestGroup.REST_API, TestGroup.FAVORITES }, executionType = ExecutionType.REGRESSION, + @TestRail(section = {TestGroup.REST_API, TestGroup.FAVORITES}, executionType = ExecutionType.REGRESSION, description = "Verify User gets only favorites files or folders with Rest API and status code is 200") - @Test(groups = { TestGroup.REST_API, TestGroup.FAVORITES, TestGroup.REGRESSION }) + @Test(groups = {TestGroup.REST_API, TestGroup.FAVORITES, TestGroup.REGRESSION}) public void userIsAbleToRetrieveFavoritesFilesOrFolders() { restClient.authenticateUser(firstSiteUsers.getOneUserWithRole(UserRole.SiteConsumer)); @@ -289,9 +290,9 @@ public class GetFavoritesTests extends RestTest .and().entriesListDoesNotContain("targetGuid", firstSiteModel.getGuid()); } - @TestRail(section = { TestGroup.REST_API, TestGroup.FAVORITES }, executionType = ExecutionType.REGRESSION, + @TestRail(section = {TestGroup.REST_API, TestGroup.FAVORITES}, executionType = ExecutionType.REGRESSION, description = "Verify User gets only favorites files or sites with Rest API and status code is 200") - @Test(groups = { TestGroup.REST_API, TestGroup.FAVORITES, TestGroup.REGRESSION }) + @Test(groups = {TestGroup.REST_API, TestGroup.FAVORITES, TestGroup.REGRESSION}) public void userIsAbleToRetrieveFavoritesFilesOrSites() { restClient.authenticateUser(secondSiteUsers.getOneUserWithRole(UserRole.SiteManager)); @@ -310,9 +311,9 @@ public class GetFavoritesTests extends RestTest .and().entriesListDoesNotContain("targetGuid", firstFolderModel.getNodeRef()); } - @TestRail(section = { TestGroup.REST_API, TestGroup.FAVORITES }, executionType = ExecutionType.REGRESSION, + @TestRail(section = {TestGroup.REST_API, TestGroup.FAVORITES}, executionType = ExecutionType.REGRESSION, description = "Verify User gets only favorites folders or sites with Rest API and status code is 200") - @Test(groups = { TestGroup.REST_API, TestGroup.FAVORITES, TestGroup.REGRESSION }) + @Test(groups = {TestGroup.REST_API, TestGroup.FAVORITES, TestGroup.REGRESSION}) public void userIsAbleToRetrieveFavoritesFoldersOrSites() { restClient.authenticateUser(secondSiteUsers.getOneUserWithRole(UserRole.SiteManager)); @@ -331,9 +332,9 @@ public class GetFavoritesTests extends RestTest .and().entriesListDoesNotContain("targetGuid", firstFileModel.getNodeRefWithoutVersion()); } - @TestRail(section = { TestGroup.REST_API, TestGroup.FAVORITES }, executionType = ExecutionType.REGRESSION, + @TestRail(section = {TestGroup.REST_API, TestGroup.FAVORITES}, executionType = ExecutionType.REGRESSION, description = "Verify User gets all favorites with Rest API and status code is 200") - @Test(groups = { TestGroup.REST_API, TestGroup.FAVORITES, TestGroup.REGRESSION }) + @Test(groups = {TestGroup.REST_API, TestGroup.FAVORITES, TestGroup.REGRESSION}) public void userIsAbleToRetrieveAllFavorites() { restClient.authenticateUser(secondSiteUsers.getOneUserWithRole(UserRole.SiteCollaborator)); @@ -362,9 +363,9 @@ public class GetFavoritesTests extends RestTest .and().entriesListDoesNotContain("targetGuid", secondFileModel.getNodeRefWithoutVersion()); } - @TestRail(section = { TestGroup.REST_API, TestGroup.FAVORITES }, executionType = ExecutionType.REGRESSION, + @TestRail(section = {TestGroup.REST_API, TestGroup.FAVORITES}, executionType = ExecutionType.REGRESSION, description = "Verify request for a user with no favorites returns status 200") - @Test(groups = { TestGroup.REST_API, TestGroup.FAVORITES, TestGroup.REGRESSION }) + @Test(groups = {TestGroup.REST_API, TestGroup.FAVORITES, TestGroup.REGRESSION}) public void userHasNoFavorites() { restClient.authenticateUser(secondSiteUsers.getOneUserWithRole(UserRole.SiteContributor)); @@ -374,9 +375,9 @@ public class GetFavoritesTests extends RestTest userFavorites.assertThat().entriesListIsEmpty().and().paginationField("totalItems").is("0"); } - @TestRail(section = { TestGroup.REST_API, TestGroup.FAVORITES }, executionType = ExecutionType.REGRESSION, + @TestRail(section = {TestGroup.REST_API, TestGroup.FAVORITES}, executionType = ExecutionType.REGRESSION, description = "Verify request using invalid where parameter returns status 400") - @Test(groups = { TestGroup.REST_API, TestGroup.FAVORITES, TestGroup.REGRESSION }) + @Test(groups = {TestGroup.REST_API, TestGroup.FAVORITES, TestGroup.REGRESSION}) public void getFavoritesUsingInvalidWhereParameter() { restClient.authenticateUser(firstSiteUsers.getOneUserWithRole(UserRole.SiteConsumer)); @@ -390,9 +391,9 @@ public class GetFavoritesTests extends RestTest .assertLastError().containsSummary(String.format(RestErrorModel.INVALID_ARGUMENT, "WHERE query")); } - @TestRail(section = { TestGroup.REST_API, TestGroup.FAVORITES }, executionType = ExecutionType.REGRESSION, + @TestRail(section = {TestGroup.REST_API, TestGroup.FAVORITES}, executionType = ExecutionType.REGRESSION, description = "Verify User gets correct favorites after deleting a favorite") - @Test(groups = { TestGroup.REST_API, TestGroup.FAVORITES, TestGroup.REGRESSION }) + @Test(groups = {TestGroup.REST_API, TestGroup.FAVORITES, TestGroup.REGRESSION}) public void checkFavoriteFolderIsRemoved() { restClient.authenticateUser(firstSiteUsers.getOneUserWithRole(UserRole.SiteManager)); @@ -408,9 +409,9 @@ public class GetFavoritesTests extends RestTest .and().paginationField("totalItems").is("2"); } - @TestRail(section = { TestGroup.REST_API, TestGroup.FAVORITES }, executionType = ExecutionType.REGRESSION, + @TestRail(section = {TestGroup.REST_API, TestGroup.FAVORITES}, executionType = ExecutionType.REGRESSION, description = "Verify get favorites specifying -me- string in place of for request") - @Test(groups = { TestGroup.REST_API, TestGroup.FAVORITES, TestGroup.REGRESSION }) + @Test(groups = {TestGroup.REST_API, TestGroup.FAVORITES, TestGroup.REGRESSION}) public void userIsAbleToGetFavoritesWhenUsingMeAsUsername() { userFavorites = restClient.authenticateUser(userModel).withCoreAPI().usingMe().getFavorites(); @@ -418,9 +419,9 @@ public class GetFavoritesTests extends RestTest userFavorites.assertThat().entriesListContains("targetGuid", firstSiteModel.getGuid()).and().entriesListContains("targetGuid", secondSiteModel.getGuid()); } - @TestRail(section = { TestGroup.REST_API, TestGroup.FAVORITES }, executionType = ExecutionType.REGRESSION, + @TestRail(section = {TestGroup.REST_API, TestGroup.FAVORITES}, executionType = ExecutionType.REGRESSION, description = "Verify get favorites using empty for where parameter for request") - @Test(groups = { TestGroup.REST_API, TestGroup.FAVORITES, TestGroup.REGRESSION }) + @Test(groups = {TestGroup.REST_API, TestGroup.FAVORITES, TestGroup.REGRESSION}) public void userIsAbleToGetFavoritesWhenUsingEmptyWhereParameter() { userFavorites = restClient.authenticateUser(adminUserModel).withCoreAPI().usingAuthUser().where().getFavorites(); @@ -428,27 +429,27 @@ public class GetFavoritesTests extends RestTest .assertLastError().containsSummary(String.format(RestErrorModel.INVALID_ARGUMENT, "WHERE query")); } - @TestRail(section = { TestGroup.REST_API,TestGroup.FAVORITES }, executionType = ExecutionType.REGRESSION, + @TestRail(section = {TestGroup.REST_API, TestGroup.FAVORITES}, executionType = ExecutionType.REGRESSION, description = "Verify that for invalid maxItems parameter status code returned is 400.") - @Test(groups = { TestGroup.REST_API, TestGroup.FAVORITES, TestGroup.REGRESSION }) + @Test(groups = {TestGroup.REST_API, TestGroup.FAVORITES, TestGroup.REGRESSION}) public void checkInvalidMaxItemsStatusCode() { restClient.authenticateUser(adminUserModel).withParams("maxItems=AB").withCoreAPI().usingUser(adminUserModel).getFavorites(); restClient.assertStatusCodeIs(HttpStatus.BAD_REQUEST).assertLastError().containsSummary("Invalid paging parameter"); } - @TestRail(section = { TestGroup.REST_API,TestGroup.FAVORITES }, executionType = ExecutionType.REGRESSION, + @TestRail(section = {TestGroup.REST_API, TestGroup.FAVORITES}, executionType = ExecutionType.REGRESSION, description = "Verify that for invalid skipCount parameter status code returned is 400.") - @Test(groups = { TestGroup.REST_API, TestGroup.FAVORITES, TestGroup.REGRESSION }) + @Test(groups = {TestGroup.REST_API, TestGroup.FAVORITES, TestGroup.REGRESSION}) public void checkInvalidSkipCountStatusCode() { restClient.authenticateUser(adminUserModel).withParams("skipCount=AB").withCoreAPI().usingUser(adminUserModel).getFavorites(); restClient.assertStatusCodeIs(HttpStatus.BAD_REQUEST).assertLastError().containsSummary("Invalid paging parameter"); } - @TestRail(section = { TestGroup.REST_API, TestGroup.FAVORITES }, executionType = ExecutionType.REGRESSION, + @TestRail(section = {TestGroup.REST_API, TestGroup.FAVORITES}, executionType = ExecutionType.REGRESSION, description = "Verify get favorites when using invalid network id for non-tenant user") - @Test(groups = { TestGroup.REST_API, TestGroup.FAVORITES, TestGroup.REGRESSION }) + @Test(groups = {TestGroup.REST_API, TestGroup.FAVORITES, TestGroup.REGRESSION}) public void getFavoritesWhenNetworkIdIsInvalid() { UserModel networkUserModel = dataUser.createRandomTestUser(); @@ -457,9 +458,9 @@ public class GetFavoritesTests extends RestTest restClient.assertStatusCodeIs(HttpStatus.NOT_FOUND).assertLastError().containsSummary(String.format(RestErrorModel.ENTITY_NOT_FOUND, networkUserModel.getUsername())); } - @TestRail(section = { TestGroup.REST_API, TestGroup.FAVORITES }, executionType = ExecutionType.REGRESSION, + @TestRail(section = {TestGroup.REST_API, TestGroup.FAVORITES}, executionType = ExecutionType.REGRESSION, description = "Verify get favorites using AND instead of OR in where parameter for request") - @Test(groups = { TestGroup.REST_API, TestGroup.FAVORITES, TestGroup.REGRESSION }) + @Test(groups = {TestGroup.REST_API, TestGroup.FAVORITES, TestGroup.REGRESSION}) public void userIsNotAbleToGetFavoritesWhenUsingANDInWhereParameter() { userFavorites = restClient.withCoreAPI().usingAuthUser().where().targetFolderExist().invalidWhereParameter("AND").targetFileExist().getFavorites(); @@ -467,9 +468,9 @@ public class GetFavoritesTests extends RestTest .assertLastError().containsSummary(String.format(RestErrorModel.INVALID_ARGUMENT, "WHERE query")); } - @TestRail(section = { TestGroup.REST_API, TestGroup.FAVORITES }, executionType = ExecutionType.REGRESSION, + @TestRail(section = {TestGroup.REST_API, TestGroup.FAVORITES}, executionType = ExecutionType.REGRESSION, description = "Verify get favorites using wrong name instead of EXISTS in where parameter for request") - @Test(groups = { TestGroup.REST_API, TestGroup.FAVORITES, TestGroup.REGRESSION }) + @Test(groups = {TestGroup.REST_API, TestGroup.FAVORITES, TestGroup.REGRESSION}) public void userIsNotAbleToGetFavoritesWhenUsingWrongWhereParameter() { userFavorites = restClient.withCoreAPI().usingAuthUser().where().invalidWhereParameter("EXIST((target/site))").targetFileExist().getFavorites(); @@ -477,9 +478,9 @@ public class GetFavoritesTests extends RestTest .assertLastError().containsSummary(String.format(RestErrorModel.INVALID_ARGUMENT, "WHERE query")); } - @TestRail(section = { TestGroup.REST_API, TestGroup.FAVORITES }, executionType = ExecutionType.REGRESSION, + @TestRail(section = {TestGroup.REST_API, TestGroup.FAVORITES}, executionType = ExecutionType.REGRESSION, description = "Verify get favorites except the first one for request") - @Test(groups = { TestGroup.REST_API, TestGroup.FAVORITES, TestGroup.REGRESSION }) + @Test(groups = {TestGroup.REST_API, TestGroup.FAVORITES, TestGroup.REGRESSION}) public void userIsAbleToGetFavoritesExceptTheFirstOne() { userFavorites = restClient.authenticateUser(userModel).withParams("skipCount=1").withCoreAPI().usingUser(userModel).getFavorites(); @@ -490,9 +491,9 @@ public class GetFavoritesTests extends RestTest .and().entriesListDoesNotContain("targetGuid", thirdSiteModel.getGuid()); } - @TestRail(section = { TestGroup.REST_API, TestGroup.FAVORITES }, executionType = ExecutionType.REGRESSION, + @TestRail(section = {TestGroup.REST_API, TestGroup.FAVORITES}, executionType = ExecutionType.REGRESSION, description = "Verify get first two favorites sites") - @Test(groups = { TestGroup.REST_API, TestGroup.FAVORITES, TestGroup.REGRESSION }) + @Test(groups = {TestGroup.REST_API, TestGroup.FAVORITES, TestGroup.REGRESSION}) public void userIsAbleToGetFirstTwoFavorites() { userFavorites = restClient.authenticateUser(userModel).withParams("maxItems=2").withCoreAPI().usingUser(userModel).getFavorites(); @@ -506,9 +507,9 @@ public class GetFavoritesTests extends RestTest .and().field("count").is("2"); } - @TestRail(section = { TestGroup.REST_API, TestGroup.FAVORITES }, executionType = ExecutionType.REGRESSION, + @TestRail(section = {TestGroup.REST_API, TestGroup.FAVORITES}, executionType = ExecutionType.REGRESSION, description = "Verify get favorites sites when using empty values for skipCount and maxItems") - @Test(groups = { TestGroup.REST_API, TestGroup.FAVORITES, TestGroup.REGRESSION }) + @Test(groups = {TestGroup.REST_API, TestGroup.FAVORITES, TestGroup.REGRESSION}) public void userIsAbleToGetFavoritesWhenSkipCountAndMaxItemsAreEmpty() { restClient.authenticateUser(userModel).withParams("skipCount= ").withCoreAPI().usingUser(userModel).getFavorites(); @@ -518,9 +519,9 @@ public class GetFavoritesTests extends RestTest restClient.assertStatusCodeIs(HttpStatus.BAD_REQUEST).assertLastError().containsSummary(String.format(RestErrorModel.INVALID_MAXITEMS, " ")); } - @TestRail(section = { TestGroup.REST_API, TestGroup.FAVORITES }, executionType = ExecutionType.REGRESSION, + @TestRail(section = {TestGroup.REST_API, TestGroup.FAVORITES}, executionType = ExecutionType.REGRESSION, description = "Verify the get favorites request for a high value for skipCount parameter") - @Test(groups = { TestGroup.REST_API, TestGroup.FAVORITES, TestGroup.REGRESSION }) + @Test(groups = {TestGroup.REST_API, TestGroup.FAVORITES, TestGroup.REGRESSION}) public void userIsAbleToGetFavoritesWithHighSkipCount() { userFavorites = restClient.authenticateUser(userModel).withParams("skipCount=999999999").withCoreAPI().usingUser(userModel).getFavorites(); @@ -529,9 +530,9 @@ public class GetFavoritesTests extends RestTest userFavorites.assertThat().entriesListIsEmpty().assertThat().paginationField("skipCount").is("999999999"); } - @TestRail(section = { TestGroup.REST_API, TestGroup.FAVORITES }, executionType = ExecutionType.REGRESSION, + @TestRail(section = {TestGroup.REST_API, TestGroup.FAVORITES}, executionType = ExecutionType.REGRESSION, description = "Verify the get favorites request with properties parameter applied") - @Test(groups = { TestGroup.REST_API, TestGroup.FAVORITES, TestGroup.REGRESSION }) + @Test(groups = {TestGroup.REST_API, TestGroup.FAVORITES, TestGroup.REGRESSION}) public void userIsAbleToGetFavoritesWithPropertiesParamApplied() { userFavorites = restClient.authenticateUser(userModel).withParams("properties=targetGuid").withCoreAPI().usingUser(userModel).getFavorites(); @@ -541,8 +542,8 @@ public class GetFavoritesTests extends RestTest restPersonFavoritesModel.assertThat().field("targetGuid").is(thirdSiteModel.getGuid()).and().field("createdAt").isNull(); } - @Test(groups = { TestGroup.REST_API, TestGroup.FAVORITES, TestGroup.REGRESSION }) - @TestRail(section = { TestGroup.REST_API, TestGroup.FAVORITES }, executionType = ExecutionType.REGRESSION, description = "Verify entry details for get favorites response with Rest API") + @Test(groups = {TestGroup.REST_API, TestGroup.FAVORITES, TestGroup.REGRESSION}) + @TestRail(section = {TestGroup.REST_API, TestGroup.FAVORITES}, executionType = ExecutionType.REGRESSION, description = "Verify entry details for get favorites response with Rest API") public void checkResponseSchemaForGetFavorites() { userFavorites = restClient.authenticateUser(userModel).withCoreAPI().usingAuthUser().getFavorites(); @@ -564,8 +565,7 @@ public class GetFavoritesTests extends RestTest description = "Verify if get favorites response returns allowableOperations object when requested") public void checkResponsesForGetFavoritesWithAllowableOperations() { - final RestPersonFavoritesModelsCollection adminFavorites = - restClient.authenticateUser(adminUserModel).withCoreAPI().usingAuthUser().include(ALLOWABLE_OPERATIONS).getFavorites(); + final RestPersonFavoritesModelsCollection adminFavorites = restClient.authenticateUser(adminUserModel).withCoreAPI().usingAuthUser().include(ALLOWABLE_OPERATIONS).getFavorites(); restClient.assertStatusCodeIs(HttpStatus.OK); adminFavorites.getEntries().stream() @@ -576,18 +576,17 @@ public class GetFavoritesTests extends RestTest @TestRail(section = {TestGroup.REST_API, TestGroup.FAVORITES}, executionType = ExecutionType.REGRESSION, description = "Verify the get favorites request with properties parameter applied") @Test(groups = {TestGroup.REST_API, TestGroup.FAVORITES, TestGroup.REGRESSION}) - public void checkSearchResponseContainsIsFavoriteWhenRequested() throws InterruptedException { + public void checkSearchResponseContainsIsFavoriteWhenRequested() throws InterruptedException + { final SearchRequest query = new SearchRequest(); final RestRequestQueryModel queryReq = new RestRequestQueryModel(); queryReq.setQuery(firstFileModel.getName()); query.setQuery(queryReq); query.setInclude(List.of("isFavorite")); - Utility.sleep(500, 60000, () -> - { - restClient.authenticateUser(adminUserModel).withSearchAPI().search(query); - restClient.onResponse().assertThat().body("list.entries.entry[0].isFavorite", Matchers.notNullValue()); - } - ); + Utility.sleep(500, 60000, () -> { + restClient.authenticateUser(adminUserModel).withSearchAPI().search(query); + restClient.onResponse().assertThat().body("list.entries.entry[0].isFavorite", Matchers.notNullValue()); + }); } } diff --git a/remote-api/src/main/java/org/alfresco/rest/api/impl/FavouritesImpl.java b/remote-api/src/main/java/org/alfresco/rest/api/impl/FavouritesImpl.java index 5dd75b1591..8fa3a3e0ad 100644 --- a/remote-api/src/main/java/org/alfresco/rest/api/impl/FavouritesImpl.java +++ b/remote-api/src/main/java/org/alfresco/rest/api/impl/FavouritesImpl.java @@ -1,460 +1,459 @@ -/* - * #%L - * Alfresco Remote API - * %% - * Copyright (C) 2005 - 2019 Alfresco Software Limited - * %% - * This file is part of the Alfresco software. - * If the software was purchased under a paid Alfresco license, the terms of - * the paid license agreement will prevail. Otherwise, the software is - * provided under the following open source license terms: - * - * Alfresco is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * Alfresco is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with Alfresco. If not, see . - * #L% - */ -package org.alfresco.rest.api.impl; - -import static org.alfresco.rest.api.Nodes.PARAM_INCLUDE_ALLOWABLEOPERATIONS; - -import java.util.AbstractList; -import java.util.ArrayList; -import java.util.Arrays; -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.stream.Collectors; - -import org.alfresco.error.AlfrescoRuntimeException; -import org.alfresco.model.ContentModel; -import org.alfresco.query.PagingResults; -import org.alfresco.repo.favourites.PersonFavourite; -import org.alfresco.repo.site.SiteDoesNotExistException; -import org.alfresco.repo.site.SiteModel; -import org.alfresco.rest.api.Favourites; -import org.alfresco.rest.api.Nodes; -import org.alfresco.rest.api.People; -import org.alfresco.rest.api.Sites; -import org.alfresco.rest.api.model.Document; -import org.alfresco.rest.api.model.DocumentTarget; -import org.alfresco.rest.api.model.Favourite; -import org.alfresco.rest.api.model.Folder; -import org.alfresco.rest.api.model.FolderTarget; -import org.alfresco.rest.api.model.Node; -import org.alfresco.rest.api.model.PathInfo; -import org.alfresco.rest.api.model.Site; -import org.alfresco.rest.api.model.SiteTarget; -import org.alfresco.rest.api.model.Target; -import org.alfresco.rest.framework.core.exceptions.InvalidArgumentException; -import org.alfresco.rest.framework.core.exceptions.RelationshipResourceNotFoundException; -import org.alfresco.rest.framework.resource.parameters.CollectionWithPagingInfo; -import org.alfresco.rest.framework.resource.parameters.Paging; -import org.alfresco.rest.framework.resource.parameters.Parameters; -import org.alfresco.rest.framework.resource.parameters.Params; -import org.alfresco.rest.framework.resource.parameters.SortColumn; -import org.alfresco.rest.framework.resource.parameters.where.QueryHelper; -import org.alfresco.rest.framework.resource.parameters.where.QueryHelper.WalkerCallbackAdapter; -import org.alfresco.service.cmr.favourites.FavouritesService; -import org.alfresco.service.cmr.favourites.FavouritesService.SortFields; -import org.alfresco.service.cmr.favourites.FavouritesService.Type; -import org.alfresco.service.cmr.repository.NodeRef; -import org.alfresco.service.cmr.repository.StoreRef; -import org.alfresco.service.cmr.site.SiteInfo; -import org.alfresco.service.cmr.site.SiteService; -import org.alfresco.service.namespace.NamespaceService; -import org.alfresco.service.namespace.QName; -import org.alfresco.util.Pair; -import org.apache.commons.collections.CollectionUtils; -import org.apache.commons.logging.Log; -import org.apache.commons.logging.LogFactory; - -/** - * Public REST API: Centralises access to favourites functionality and maps between representations repository and api representations. - * - * @author steveglover - * @since publicapi1.0 - */ -public class FavouritesImpl implements Favourites -{ - private static final Log logger = LogFactory.getLog(FavouritesImpl.class); - - private static final List ALLOWED_INCLUDES = List.of(PARAM_INCLUDE_PROPERTIES, PARAM_INCLUDE_ALLOWABLEOPERATIONS); - - private People people; - private Sites sites; - private Nodes nodes; - private FavouritesService favouritesService; - private SiteService siteService; - private NamespaceService namespaceService; - - // additional exclude properties for favourites as these can be already top-level properties - private static final List EXCLUDED_PROPS = Arrays.asList( - ContentModel.PROP_TITLE, - ContentModel.PROP_DESCRIPTION, - SiteModel.PROP_SITE_VISIBILITY, - SiteModel.PROP_SITE_PRESET - ); - - public void setPeople(People people) - { - this.people = people; - } - - public void setSites(Sites sites) - { - this.sites = sites; - } - - public void setNodes(Nodes nodes) - { - this.nodes = nodes; - } - - public void setFavouritesService(FavouritesService favouritesService) - { - this.favouritesService = favouritesService; - } - - public void setSiteService(SiteService siteService) - { - this.siteService = siteService; - } - - public void setNamespaceService(NamespaceService namespaceService) - { - this.namespaceService = namespaceService; - } - - private Target getTarget(PersonFavourite personFavourite, Parameters parameters) - { - Target target = null; - NodeRef nodeRef = personFavourite.getNodeRef(); - Type type = personFavourite.getType(); - if(type.equals(Type.FILE)) - { - Document document = nodes.getDocument(nodeRef); - setPathInfo(document, parameters.getInclude()); - target = new DocumentTarget(document); - } - else if(type.equals(Type.FOLDER)) - { - Folder folder = nodes.getFolder(nodeRef); - setPathInfo(folder, parameters.getInclude()); - target = new FolderTarget(folder); - } - else if(type.equals(Type.SITE)) - { - SiteInfo siteInfo = siteService.getSite(nodeRef); - String role = sites.getSiteRole(siteInfo.getShortName()); - Site site = new Site(siteInfo, role); - target = new SiteTarget(site); - } - else - { - throw new AlfrescoRuntimeException("Unexpected favourite target type: " + type); - } - - return target; - } - - private Favourite getFavourite(PersonFavourite personFavourite, Parameters parameters) - { - Favourite fav = new Favourite(); - fav.setTargetGuid(personFavourite.getNodeRef().getId()); - fav.setCreatedAt(personFavourite.getCreatedAt()); - Target target = getTarget(personFavourite, parameters); - fav.setTarget(target); - - // REPO-1147 allow retrieving additional properties - final List paramsInclude = parameters.getInclude(); - if (!Collections.disjoint(paramsInclude, ALLOWED_INCLUDES)) - { - final List includes = ALLOWED_INCLUDES.stream().filter(a -> paramsInclude.contains(a)).collect(Collectors.toList()); - // get node representation with only properties included - Node node = nodes.getFolderOrDocument(personFavourite.getNodeRef(), null, null, includes, null); - // Create a map from node properties excluding properties already in this Favorite - Map filteredNodeProperties = filterProps(node.getProperties(), EXCLUDED_PROPS); - if(filteredNodeProperties.size() > 0 && paramsInclude.contains(PARAM_INCLUDE_PROPERTIES)) - { - fav.setProperties(filteredNodeProperties); - } - final List allowableOperations = node.getAllowableOperations(); - if (CollectionUtils.isNotEmpty(allowableOperations) && paramsInclude.contains(PARAM_INCLUDE_ALLOWABLEOPERATIONS)) - { - fav.setAllowableOperations(allowableOperations); - } - } - - return fav; - } - - private Map filterProps(Map properties, List toRemove) - { - Map filteredProps = properties == null ? new HashMap<>() : new HashMap<>(properties); - List propsToRemove = toRemove.stream().map(e -> e.toPrefixString(namespaceService)).collect(Collectors.toList()); - filteredProps.keySet().removeAll(propsToRemove); - return filteredProps; - } - - private CollectionWithPagingInfo wrap(Paging paging, PagingResults personFavourites, Parameters parameters) - { - final List page = personFavourites.getPage(); - final List list = new AbstractList() - { - @Override - public Favourite get(int index) - { - PersonFavourite personFavourite = page.get(index); - Favourite fav = getFavourite(personFavourite, parameters); - return fav; - } - - @Override - public int size() - { - return page.size(); - } - }; - Pair pair = personFavourites.getTotalResultCount(); - Integer total = null; - if(pair.getFirst().equals(pair.getSecond())) - { - total = pair.getFirst(); - } - return CollectionWithPagingInfo.asPaged(paging, list, personFavourites.hasMoreItems(), total); - } - - @Override - public Favourite addFavourite(String personId, Favourite favourite) - { - Parameters parameters = getDefaultParameters(personId, null); - return addFavourite(personId, favourite, parameters); - } - - @Override - public Favourite addFavourite(String personId, Favourite favourite, Parameters parameters) - { - Favourite ret = null; - - personId = people.validatePerson(personId, true); - Target target = favourite.getTarget(); - if(target == null) - { - throw new InvalidArgumentException("target is missing"); - } - else if(target instanceof SiteTarget) - { - SiteTarget siteTarget = (SiteTarget)target; - String guid = siteTarget.getSite().getGuid(); - SiteInfo siteInfo = sites.validateSite(new NodeRef(StoreRef.STORE_REF_WORKSPACE_SPACESSTORE, guid)); - NodeRef siteNodeRef = siteInfo.getNodeRef(); - String siteId = siteInfo.getShortName(); - - try - { - PersonFavourite personFavourite = favouritesService.addFavourite(personId, siteNodeRef); - ret = getFavourite(personFavourite, parameters); - } - catch(SiteDoesNotExistException e) - { - throw new RelationshipResourceNotFoundException(personId, siteId); - } - } - else if(target instanceof DocumentTarget) - { - DocumentTarget documentTarget = (DocumentTarget)target; - NodeRef nodeRef = documentTarget.getFile().getGuid(); - if(!nodes.nodeMatches(nodeRef, Collections.singleton(ContentModel.TYPE_CONTENT), null)) - { - throw new RelationshipResourceNotFoundException(personId, nodeRef.getId()); - } - - PersonFavourite personFavourite = favouritesService.addFavourite(personId, nodeRef); - ret = getFavourite(personFavourite, parameters); - } - else if(target instanceof FolderTarget) - { - FolderTarget folderTarget = (FolderTarget)target; - NodeRef nodeRef = folderTarget.getFolder().getGuid(); - if(!nodes.nodeMatches(nodeRef, Collections.singleton(ContentModel.TYPE_FOLDER), Collections.singleton(SiteModel.TYPE_SITE))) - { - throw new RelationshipResourceNotFoundException(personId, nodeRef.getId()); - } - - PersonFavourite personFavourite = favouritesService.addFavourite(personId, nodeRef); - ret = getFavourite(personFavourite, parameters); - } - - return ret; - } - - @Override - public void removeFavourite(String personId, String id) - { - personId = people.validatePerson(personId, true); - NodeRef nodeRef = nodes.validateNode(id); - boolean exists = false; - - Type type = favouritesService.getType(nodeRef); - if(type.equals(Type.SITE)) - { - SiteInfo siteInfo = siteService.getSite(nodeRef); - if(siteInfo == null) - { - // shouldn't happen because the type implies it's a site - throw new AlfrescoRuntimeException("Unable to find site with nodeRef " + nodeRef); - } - exists = favouritesService.removeFavourite(personId, siteInfo.getNodeRef()); - } - else if(type.equals(Type.FILE)) - { - exists = favouritesService.removeFavourite(personId, nodeRef); - } - else if(type.equals(Type.FOLDER)) - { - exists = favouritesService.removeFavourite(personId, nodeRef); - } - if(!exists) - { - throw new RelationshipResourceNotFoundException(personId, id); - } - } - - @Override - public Favourite getFavourite(String personId, String favouriteId) - { - Parameters parameters = getDefaultParameters(personId, favouriteId); - return getFavourite(personId, favouriteId, parameters); - } - - @Override - public Favourite getFavourite(String personId, String favouriteId, Parameters parameters) - { - NodeRef nodeRef = nodes.validateNode(favouriteId); - personId = people.validatePerson(personId, true); - - PersonFavourite personFavourite = favouritesService.getFavourite(personId, nodeRef); - if(personFavourite != null) - { - Favourite favourite = getFavourite(personFavourite, parameters); - return favourite; - } - else - { - throw new RelationshipResourceNotFoundException(personId, favouriteId); - } - } - - @Override - public CollectionWithPagingInfo getFavourites(String personId, final Parameters parameters) - { - personId = people.validatePerson(personId, true); - - Paging paging = parameters.getPaging(); - - List> sortProps = getSortProps(parameters); - - final Set filteredByClientQuery = new HashSet(); - Set filterTypes = FavouritesService.Type.ALL_FILTER_TYPES; //Default all - - // filterType is of the form 'target.' - QueryHelper.walk(parameters.getQuery(), new WalkerCallbackAdapter() - { - @Override - public void or() { - //OR is supported but exists() will be called for each EXISTS so we don't - //need to do anything here. If we don't override it then it will be assumed - //that OR in the grammar is not supported. - } - - @Override - public void exists(String filteredByClient, boolean negated) { - if(filteredByClient != null) - { - int idx = filteredByClient.lastIndexOf("/"); - if(idx == -1 || idx == filteredByClient.length()) - { - throw new InvalidArgumentException(); - } - else - { - String filtertype = filteredByClient.substring(idx + 1).toUpperCase(); - filteredByClientQuery.add(Type.valueOf(filtertype)); - } - } - - } - }); - - if (filteredByClientQuery.size() > 0) - { - filterTypes = filteredByClientQuery; - } - - final PagingResults favourites = favouritesService.getPagedFavourites(personId, filterTypes, sortProps, Util.getPagingRequest(paging)); - - return wrap(paging, favourites, parameters); - } - - private void setPathInfo(Node node, List includeParam) - { - if (includeParam.contains(PARAM_INCLUDE_PATH)) - { - PathInfo pathInfo = nodes.lookupPathInfo(node.getNodeRef(), null); - node.setPath(pathInfo); - } - } - - /** - * Returns a {@code {@link Parameters} object where almost all of its values are null. - * the non-null value is the {@literal include} and whatever value is passed for {@code personId} and {@code favouriteId} - */ - private Parameters getDefaultParameters(String personId, String favouriteId) - { - Params.RecognizedParams recognizedParams = new Params.RecognizedParams(null, null, null, null, Collections.emptyList(), null, null, null, - false); - Parameters parameters = Params.valueOf(recognizedParams, personId, favouriteId, null); - return parameters; - } - - private List> getSortProps(Parameters parameters) - { - List> sortProps = new ArrayList<>(); - List sortCols = parameters.getSorting(); - if ((sortCols != null) && (sortCols.size() > 0)) - { - for (SortColumn sortCol : sortCols) - { - SortFields sortField; - try - { - sortField = SortFields.valueOf(sortCol.column); - } - catch (Exception e) - { - throw new InvalidArgumentException("Invalid sort field: " + sortCol.column); - } - sortProps.add(new Pair<>(sortField, (sortCol.asc ? Boolean.TRUE : Boolean.FALSE))); - } - } - else - { - // default sort order - sortProps = FavouritesService.DEFAULT_SORT_PROPS; - } - return sortProps; - } -} +/* + * #%L + * Alfresco Remote API + * %% + * Copyright (C) 2005 - 2019 Alfresco Software Limited + * %% + * This file is part of the Alfresco software. + * If the software was purchased under a paid Alfresco license, the terms of + * the paid license agreement will prevail. Otherwise, the software is + * provided under the following open source license terms: + * + * Alfresco is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * Alfresco is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with Alfresco. If not, see . + * #L% + */ +package org.alfresco.rest.api.impl; + +import static org.alfresco.rest.api.Nodes.PARAM_INCLUDE_ALLOWABLEOPERATIONS; + +import java.util.AbstractList; +import java.util.ArrayList; +import java.util.Arrays; +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.stream.Collectors; + +import org.apache.commons.collections.CollectionUtils; +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; + +import org.alfresco.error.AlfrescoRuntimeException; +import org.alfresco.model.ContentModel; +import org.alfresco.query.PagingResults; +import org.alfresco.repo.favourites.PersonFavourite; +import org.alfresco.repo.site.SiteDoesNotExistException; +import org.alfresco.repo.site.SiteModel; +import org.alfresco.rest.api.Favourites; +import org.alfresco.rest.api.Nodes; +import org.alfresco.rest.api.People; +import org.alfresco.rest.api.Sites; +import org.alfresco.rest.api.model.Document; +import org.alfresco.rest.api.model.DocumentTarget; +import org.alfresco.rest.api.model.Favourite; +import org.alfresco.rest.api.model.Folder; +import org.alfresco.rest.api.model.FolderTarget; +import org.alfresco.rest.api.model.Node; +import org.alfresco.rest.api.model.PathInfo; +import org.alfresco.rest.api.model.Site; +import org.alfresco.rest.api.model.SiteTarget; +import org.alfresco.rest.api.model.Target; +import org.alfresco.rest.framework.core.exceptions.InvalidArgumentException; +import org.alfresco.rest.framework.core.exceptions.RelationshipResourceNotFoundException; +import org.alfresco.rest.framework.resource.parameters.CollectionWithPagingInfo; +import org.alfresco.rest.framework.resource.parameters.Paging; +import org.alfresco.rest.framework.resource.parameters.Parameters; +import org.alfresco.rest.framework.resource.parameters.Params; +import org.alfresco.rest.framework.resource.parameters.SortColumn; +import org.alfresco.rest.framework.resource.parameters.where.QueryHelper; +import org.alfresco.rest.framework.resource.parameters.where.QueryHelper.WalkerCallbackAdapter; +import org.alfresco.service.cmr.favourites.FavouritesService; +import org.alfresco.service.cmr.favourites.FavouritesService.SortFields; +import org.alfresco.service.cmr.favourites.FavouritesService.Type; +import org.alfresco.service.cmr.repository.NodeRef; +import org.alfresco.service.cmr.repository.StoreRef; +import org.alfresco.service.cmr.site.SiteInfo; +import org.alfresco.service.cmr.site.SiteService; +import org.alfresco.service.namespace.NamespaceService; +import org.alfresco.service.namespace.QName; +import org.alfresco.util.Pair; + +/** + * Public REST API: Centralises access to favourites functionality and maps between representations repository and api representations. + * + * @author steveglover + * @since publicapi1.0 + */ +public class FavouritesImpl implements Favourites +{ + private static final Log logger = LogFactory.getLog(FavouritesImpl.class); + + private static final List ALLOWED_INCLUDES = List.of(PARAM_INCLUDE_PROPERTIES, PARAM_INCLUDE_ALLOWABLEOPERATIONS); + + private People people; + private Sites sites; + private Nodes nodes; + private FavouritesService favouritesService; + private SiteService siteService; + private NamespaceService namespaceService; + + // additional exclude properties for favourites as these can be already top-level properties + private static final List EXCLUDED_PROPS = Arrays.asList( + ContentModel.PROP_TITLE, + ContentModel.PROP_DESCRIPTION, + SiteModel.PROP_SITE_VISIBILITY, + SiteModel.PROP_SITE_PRESET); + + public void setPeople(People people) + { + this.people = people; + } + + public void setSites(Sites sites) + { + this.sites = sites; + } + + public void setNodes(Nodes nodes) + { + this.nodes = nodes; + } + + public void setFavouritesService(FavouritesService favouritesService) + { + this.favouritesService = favouritesService; + } + + public void setSiteService(SiteService siteService) + { + this.siteService = siteService; + } + + public void setNamespaceService(NamespaceService namespaceService) + { + this.namespaceService = namespaceService; + } + + private Target getTarget(PersonFavourite personFavourite, Parameters parameters) + { + Target target = null; + NodeRef nodeRef = personFavourite.getNodeRef(); + Type type = personFavourite.getType(); + if (type.equals(Type.FILE)) + { + Document document = nodes.getDocument(nodeRef); + setPathInfo(document, parameters.getInclude()); + target = new DocumentTarget(document); + } + else if (type.equals(Type.FOLDER)) + { + Folder folder = nodes.getFolder(nodeRef); + setPathInfo(folder, parameters.getInclude()); + target = new FolderTarget(folder); + } + else if (type.equals(Type.SITE)) + { + SiteInfo siteInfo = siteService.getSite(nodeRef); + String role = sites.getSiteRole(siteInfo.getShortName()); + Site site = new Site(siteInfo, role); + target = new SiteTarget(site); + } + else + { + throw new AlfrescoRuntimeException("Unexpected favourite target type: " + type); + } + + return target; + } + + private Favourite getFavourite(PersonFavourite personFavourite, Parameters parameters) + { + Favourite fav = new Favourite(); + fav.setTargetGuid(personFavourite.getNodeRef().getId()); + fav.setCreatedAt(personFavourite.getCreatedAt()); + Target target = getTarget(personFavourite, parameters); + fav.setTarget(target); + + // REPO-1147 allow retrieving additional properties + final List paramsInclude = parameters.getInclude(); + if (!Collections.disjoint(paramsInclude, ALLOWED_INCLUDES)) + { + final List includes = ALLOWED_INCLUDES.stream().filter(a -> paramsInclude.contains(a)).collect(Collectors.toList()); + // get node representation with only properties included + Node node = nodes.getFolderOrDocument(personFavourite.getNodeRef(), null, null, includes, null); + // Create a map from node properties excluding properties already in this Favorite + Map filteredNodeProperties = filterProps(node.getProperties(), EXCLUDED_PROPS); + if (filteredNodeProperties.size() > 0 && paramsInclude.contains(PARAM_INCLUDE_PROPERTIES)) + { + fav.setProperties(filteredNodeProperties); + } + final List allowableOperations = node.getAllowableOperations(); + if (CollectionUtils.isNotEmpty(allowableOperations) && paramsInclude.contains(PARAM_INCLUDE_ALLOWABLEOPERATIONS)) + { + fav.setAllowableOperations(allowableOperations); + } + } + + return fav; + } + + private Map filterProps(Map properties, List toRemove) + { + Map filteredProps = properties == null ? new HashMap<>() : new HashMap<>(properties); + List propsToRemove = toRemove.stream().map(e -> e.toPrefixString(namespaceService)).collect(Collectors.toList()); + filteredProps.keySet().removeAll(propsToRemove); + return filteredProps; + } + + private CollectionWithPagingInfo wrap(Paging paging, PagingResults personFavourites, Parameters parameters) + { + final List page = personFavourites.getPage(); + final List list = new AbstractList() { + @Override + public Favourite get(int index) + { + PersonFavourite personFavourite = page.get(index); + Favourite fav = getFavourite(personFavourite, parameters); + return fav; + } + + @Override + public int size() + { + return page.size(); + } + }; + Pair pair = personFavourites.getTotalResultCount(); + Integer total = null; + if (pair.getFirst().equals(pair.getSecond())) + { + total = pair.getFirst(); + } + return CollectionWithPagingInfo.asPaged(paging, list, personFavourites.hasMoreItems(), total); + } + + @Override + public Favourite addFavourite(String personId, Favourite favourite) + { + Parameters parameters = getDefaultParameters(personId, null); + return addFavourite(personId, favourite, parameters); + } + + @Override + public Favourite addFavourite(String personId, Favourite favourite, Parameters parameters) + { + Favourite ret = null; + + personId = people.validatePerson(personId, true); + Target target = favourite.getTarget(); + if (target == null) + { + throw new InvalidArgumentException("target is missing"); + } + else if (target instanceof SiteTarget) + { + SiteTarget siteTarget = (SiteTarget) target; + String guid = siteTarget.getSite().getGuid(); + SiteInfo siteInfo = sites.validateSite(new NodeRef(StoreRef.STORE_REF_WORKSPACE_SPACESSTORE, guid)); + NodeRef siteNodeRef = siteInfo.getNodeRef(); + String siteId = siteInfo.getShortName(); + + try + { + PersonFavourite personFavourite = favouritesService.addFavourite(personId, siteNodeRef); + ret = getFavourite(personFavourite, parameters); + } + catch (SiteDoesNotExistException e) + { + throw new RelationshipResourceNotFoundException(personId, siteId); + } + } + else if (target instanceof DocumentTarget) + { + DocumentTarget documentTarget = (DocumentTarget) target; + NodeRef nodeRef = documentTarget.getFile().getGuid(); + if (!nodes.nodeMatches(nodeRef, Collections.singleton(ContentModel.TYPE_CONTENT), null)) + { + throw new RelationshipResourceNotFoundException(personId, nodeRef.getId()); + } + + PersonFavourite personFavourite = favouritesService.addFavourite(personId, nodeRef); + ret = getFavourite(personFavourite, parameters); + } + else if (target instanceof FolderTarget) + { + FolderTarget folderTarget = (FolderTarget) target; + NodeRef nodeRef = folderTarget.getFolder().getGuid(); + if (!nodes.nodeMatches(nodeRef, Collections.singleton(ContentModel.TYPE_FOLDER), Collections.singleton(SiteModel.TYPE_SITE))) + { + throw new RelationshipResourceNotFoundException(personId, nodeRef.getId()); + } + + PersonFavourite personFavourite = favouritesService.addFavourite(personId, nodeRef); + ret = getFavourite(personFavourite, parameters); + } + + return ret; + } + + @Override + public void removeFavourite(String personId, String id) + { + personId = people.validatePerson(personId, true); + NodeRef nodeRef = nodes.validateNode(id); + boolean exists = false; + + Type type = favouritesService.getType(nodeRef); + if (type.equals(Type.SITE)) + { + SiteInfo siteInfo = siteService.getSite(nodeRef); + if (siteInfo == null) + { + // shouldn't happen because the type implies it's a site + throw new AlfrescoRuntimeException("Unable to find site with nodeRef " + nodeRef); + } + exists = favouritesService.removeFavourite(personId, siteInfo.getNodeRef()); + } + else if (type.equals(Type.FILE)) + { + exists = favouritesService.removeFavourite(personId, nodeRef); + } + else if (type.equals(Type.FOLDER)) + { + exists = favouritesService.removeFavourite(personId, nodeRef); + } + if (!exists) + { + throw new RelationshipResourceNotFoundException(personId, id); + } + } + + @Override + public Favourite getFavourite(String personId, String favouriteId) + { + Parameters parameters = getDefaultParameters(personId, favouriteId); + return getFavourite(personId, favouriteId, parameters); + } + + @Override + public Favourite getFavourite(String personId, String favouriteId, Parameters parameters) + { + NodeRef nodeRef = nodes.validateNode(favouriteId); + personId = people.validatePerson(personId, true); + + PersonFavourite personFavourite = favouritesService.getFavourite(personId, nodeRef); + if (personFavourite != null) + { + Favourite favourite = getFavourite(personFavourite, parameters); + return favourite; + } + else + { + throw new RelationshipResourceNotFoundException(personId, favouriteId); + } + } + + @Override + public CollectionWithPagingInfo getFavourites(String personId, final Parameters parameters) + { + personId = people.validatePerson(personId, true); + + Paging paging = parameters.getPaging(); + + List> sortProps = getSortProps(parameters); + + final Set filteredByClientQuery = new HashSet(); + Set filterTypes = FavouritesService.Type.ALL_FILTER_TYPES; // Default all + + // filterType is of the form 'target.' + QueryHelper.walk(parameters.getQuery(), new WalkerCallbackAdapter() { + @Override + public void or() + { + // OR is supported but exists() will be called for each EXISTS so we don't + // need to do anything here. If we don't override it then it will be assumed + // that OR in the grammar is not supported. + } + + @Override + public void exists(String filteredByClient, boolean negated) + { + if (filteredByClient != null) + { + int idx = filteredByClient.lastIndexOf("/"); + if (idx == -1 || idx == filteredByClient.length()) + { + throw new InvalidArgumentException(); + } + else + { + String filtertype = filteredByClient.substring(idx + 1).toUpperCase(); + filteredByClientQuery.add(Type.valueOf(filtertype)); + } + } + + } + }); + + if (filteredByClientQuery.size() > 0) + { + filterTypes = filteredByClientQuery; + } + + final PagingResults favourites = favouritesService.getPagedFavourites(personId, filterTypes, sortProps, Util.getPagingRequest(paging)); + + return wrap(paging, favourites, parameters); + } + + private void setPathInfo(Node node, List includeParam) + { + if (includeParam.contains(PARAM_INCLUDE_PATH)) + { + PathInfo pathInfo = nodes.lookupPathInfo(node.getNodeRef(), null); + node.setPath(pathInfo); + } + } + + /** + * Returns a {@code {@link Parameters} object where almost all of its values are null. the non-null value is the {@literal include} and whatever value is passed for {@code personId} and {@code favouriteId} + */ + private Parameters getDefaultParameters(String personId, String favouriteId) + { + Params.RecognizedParams recognizedParams = new Params.RecognizedParams(null, null, null, null, Collections.emptyList(), null, null, null, + false); + Parameters parameters = Params.valueOf(recognizedParams, personId, favouriteId, null); + return parameters; + } + + private List> getSortProps(Parameters parameters) + { + List> sortProps = new ArrayList<>(); + List sortCols = parameters.getSorting(); + if ((sortCols != null) && (sortCols.size() > 0)) + { + for (SortColumn sortCol : sortCols) + { + SortFields sortField; + try + { + sortField = SortFields.valueOf(sortCol.column); + } + catch (Exception e) + { + throw new InvalidArgumentException("Invalid sort field: " + sortCol.column); + } + sortProps.add(new Pair<>(sortField, (sortCol.asc ? Boolean.TRUE : Boolean.FALSE))); + } + } + else + { + // default sort order + sortProps = FavouritesService.DEFAULT_SORT_PROPS; + } + return sortProps; + } +} diff --git a/remote-api/src/main/java/org/alfresco/rest/api/model/DocumentTarget.java b/remote-api/src/main/java/org/alfresco/rest/api/model/DocumentTarget.java index 261c5b8e41..bb9fc16c7d 100644 --- a/remote-api/src/main/java/org/alfresco/rest/api/model/DocumentTarget.java +++ b/remote-api/src/main/java/org/alfresco/rest/api/model/DocumentTarget.java @@ -23,43 +23,43 @@ * along with Alfresco. If not, see . * #L% */ -package org.alfresco.rest.api.model; - -/** - * A document target favourite. - * - * @author steveglover - * - */ -public class DocumentTarget extends Target -{ - private Document file; - - public DocumentTarget() - { - super(); - } - - public DocumentTarget(Document file) - { - super(); - this.file = file; - } - - public void setDocument(Document file) - { - this.file = file; - } - - public Document getFile() - { - return file; - } - - @Override - public String toString() - { - return "DocumentTarget [file=" + file + "]"; - } - -} +package org.alfresco.rest.api.model; + +/** + * A document target favourite. + * + * @author steveglover + * + */ +public class DocumentTarget extends Target +{ + private Document file; + + public DocumentTarget() + { + super(); + } + + public DocumentTarget(Document file) + { + super(); + this.file = file; + } + + public void setDocument(Document file) + { + this.file = file; + } + + public Document getFile() + { + return file; + } + + @Override + public String toString() + { + return "DocumentTarget [file=" + file + "]"; + } + +} diff --git a/remote-api/src/main/java/org/alfresco/rest/api/model/Favourite.java b/remote-api/src/main/java/org/alfresco/rest/api/model/Favourite.java index 79429a40ab..878043a6a5 100644 --- a/remote-api/src/main/java/org/alfresco/rest/api/model/Favourite.java +++ b/remote-api/src/main/java/org/alfresco/rest/api/model/Favourite.java @@ -1,103 +1,105 @@ -/* - * #%L - * Alfresco Remote API - * %% - * 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 . - * #L% - */ -package org.alfresco.rest.api.model; - -import java.util.Date; -import java.util.List; -import java.util.Map; - -import org.alfresco.rest.framework.resource.UniqueId; - -/** - * Representation of a favourite (document, folder, site, ...). - * - * @author steveglover - * - */ -public class Favourite -{ - private String targetGuid; - private Date createdAt; - private Target target; - private Map properties; - private List allowableOperations; - - public Date getCreatedAt() - { - return createdAt; - } - - public void setCreatedAt(Date createdAt) - { - this.createdAt = createdAt; - } - - @UniqueId(name="targetGuid") - public String getTargetGuid() - { - return targetGuid; - } - - public void setTargetGuid(String targetGuid) - { - this.targetGuid = targetGuid; - } - - public Target getTarget() - { - return target; - } - - public void setTarget(Target target) - { - this.target = target; - } - - public Map getProperties() - { - return properties; - } - - public void setProperties(Map properties) - { - this.properties = properties; - } - - public List getAllowableOperations() { - return allowableOperations; - } - - public void setAllowableOperations(List allowableOperations) { - this.allowableOperations = allowableOperations; - } - - @Override - public String toString() - { - return "Favourite [targetGuid=" + targetGuid - + ", createdAt=" + createdAt + ", target=" + target + ", properties=" + properties + "]"; - } -} +/* + * #%L + * Alfresco Remote API + * %% + * 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 . + * #L% + */ +package org.alfresco.rest.api.model; + +import java.util.Date; +import java.util.List; +import java.util.Map; + +import org.alfresco.rest.framework.resource.UniqueId; + +/** + * Representation of a favourite (document, folder, site, ...). + * + * @author steveglover + * + */ +public class Favourite +{ + private String targetGuid; + private Date createdAt; + private Target target; + private Map properties; + private List allowableOperations; + + public Date getCreatedAt() + { + return createdAt; + } + + public void setCreatedAt(Date createdAt) + { + this.createdAt = createdAt; + } + + @UniqueId(name = "targetGuid") + public String getTargetGuid() + { + return targetGuid; + } + + public void setTargetGuid(String targetGuid) + { + this.targetGuid = targetGuid; + } + + public Target getTarget() + { + return target; + } + + public void setTarget(Target target) + { + this.target = target; + } + + public Map getProperties() + { + return properties; + } + + public void setProperties(Map properties) + { + this.properties = properties; + } + + public List getAllowableOperations() + { + return allowableOperations; + } + + public void setAllowableOperations(List allowableOperations) + { + this.allowableOperations = allowableOperations; + } + + @Override + public String toString() + { + return "Favourite [targetGuid=" + targetGuid + + ", createdAt=" + createdAt + ", target=" + target + ", properties=" + properties + "]"; + } +} diff --git a/remote-api/src/test/java/org/alfresco/AppContext04TestSuite.java b/remote-api/src/test/java/org/alfresco/AppContext04TestSuite.java index 8f41edd452..2651b987e5 100644 --- a/remote-api/src/test/java/org/alfresco/AppContext04TestSuite.java +++ b/remote-api/src/test/java/org/alfresco/AppContext04TestSuite.java @@ -25,59 +25,60 @@ */ package org.alfresco; -import org.alfresco.repo.web.scripts.TestWebScriptRepoServer; -import org.alfresco.util.testing.category.DBTests; -import org.alfresco.util.testing.category.NonBuildTests; import org.junit.experimental.categories.Categories; import org.junit.runner.RunWith; import org.junit.runners.Suite; +import org.alfresco.repo.web.scripts.TestWebScriptRepoServer; +import org.alfresco.util.testing.category.DBTests; +import org.alfresco.util.testing.category.NonBuildTests; + @RunWith(Categories.class) @Categories.ExcludeCategory({DBTests.class, NonBuildTests.class}) @Suite.SuiteClasses({ - // [classpath:alfresco/application-context.xml, classpath:alfresco/web-scripts-application-context-test.xml, - // classpath:alfresco/web-scripts-application-context.xml] - org.alfresco.repo.web.scripts.quickshare.QuickShareRestApiTest.class, - org.alfresco.repo.web.scripts.admin.AdminWebScriptTest.class, - org.alfresco.repo.web.scripts.audit.AuditWebScriptTest.class, - org.alfresco.repo.web.scripts.blogs.BlogServiceTest.class, - org.alfresco.repo.web.scripts.dictionary.DictionaryRestApiTest.class, - org.alfresco.repo.web.scripts.discussion.DiscussionRestApiTest.class, - org.alfresco.repo.web.scripts.activities.feed.control.FeedControlTest.class, - org.alfresco.repo.web.scripts.forms.FormRestApiGet_Test.class, - org.alfresco.repo.web.scripts.forms.FormRestApiJsonPost_Test.class, - org.alfresco.repo.web.scripts.groups.GroupsTest.class, - org.alfresco.repo.web.scripts.invitation.InvitationWebScriptTest.class, - org.alfresco.repo.web.scripts.invite.InviteServiceTest.class, - org.alfresco.repo.web.scripts.LoginTest.class, - org.alfresco.repo.web.scripts.search.PersonSearchTest.class, - org.alfresco.repo.web.scripts.person.PersonServiceTest.class, - org.alfresco.repo.web.scripts.preference.PreferenceServiceTest.class, - org.alfresco.repo.web.scripts.rating.RatingRestApiTest.class, - org.alfresco.repo.web.scripts.replication.ReplicationRestApiTest.class, - org.alfresco.repo.web.scripts.RepositoryContainerTest.class, - org.alfresco.repo.web.scripts.rule.RuleServiceTest.class, - org.alfresco.repo.web.scripts.action.RunningActionRestApiTest.class, - org.alfresco.repo.web.scripts.site.SiteServiceTest.class, - org.alfresco.repo.web.scripts.tagging.TaggingServiceTest.class, - org.alfresco.repo.web.scripts.thumbnail.ThumbnailServiceTest.class, - org.alfresco.repo.web.scripts.transfer.TransferWebScriptTest.class, - org.alfresco.repo.web.scripts.workflow.ActivitiWorkflowRestApiTest.class, - org.alfresco.repo.web.scripts.solr.SOLRWebScriptTest.class, - org.alfresco.repo.web.scripts.subscriptions.SubscriptionServiceRestApiTest.class, - org.alfresco.repo.web.scripts.facet.FacetRestApiTest.class, - org.alfresco.repo.web.scripts.comment.CommentsApiTest.class, - org.alfresco.repo.web.scripts.content.ContentGetTest.class, - org.alfresco.repo.web.scripts.XssVulnerabilityTest.class, - org.alfresco.repo.web.scripts.links.LinksRestApiTest.class, - org.alfresco.repo.model.filefolder.RemoteFileFolderLoaderTest.class, - org.alfresco.repo.web.scripts.ReadOnlyTransactionInGetRestApiTest.class, - org.alfresco.repo.web.scripts.custommodel.CustomModelImportTest.class, - org.alfresco.repo.web.scripts.site.SurfConfigTest.class, - org.alfresco.repo.web.scripts.node.NodeWebScripTest.class, - org.alfresco.rest.api.impl.CommentsImplUnitTest.class, - org.alfresco.rest.api.impl.DownloadsImplCheckArchiveStatusUnitTest.class, - org.alfresco.rest.api.impl.RestApiDirectUrlConfigUnitTest.class + // [classpath:alfresco/application-context.xml, classpath:alfresco/web-scripts-application-context-test.xml, + // classpath:alfresco/web-scripts-application-context.xml] + org.alfresco.repo.web.scripts.quickshare.QuickShareRestApiTest.class, + org.alfresco.repo.web.scripts.admin.AdminWebScriptTest.class, + org.alfresco.repo.web.scripts.audit.AuditWebScriptTest.class, + org.alfresco.repo.web.scripts.blogs.BlogServiceTest.class, + org.alfresco.repo.web.scripts.dictionary.DictionaryRestApiTest.class, + org.alfresco.repo.web.scripts.discussion.DiscussionRestApiTest.class, + org.alfresco.repo.web.scripts.activities.feed.control.FeedControlTest.class, + org.alfresco.repo.web.scripts.forms.FormRestApiGet_Test.class, + org.alfresco.repo.web.scripts.forms.FormRestApiJsonPost_Test.class, + org.alfresco.repo.web.scripts.groups.GroupsTest.class, + org.alfresco.repo.web.scripts.invitation.InvitationWebScriptTest.class, + org.alfresco.repo.web.scripts.invite.InviteServiceTest.class, + org.alfresco.repo.web.scripts.LoginTest.class, + org.alfresco.repo.web.scripts.search.PersonSearchTest.class, + org.alfresco.repo.web.scripts.person.PersonServiceTest.class, + org.alfresco.repo.web.scripts.preference.PreferenceServiceTest.class, + org.alfresco.repo.web.scripts.rating.RatingRestApiTest.class, + org.alfresco.repo.web.scripts.replication.ReplicationRestApiTest.class, + org.alfresco.repo.web.scripts.RepositoryContainerTest.class, + org.alfresco.repo.web.scripts.rule.RuleServiceTest.class, + org.alfresco.repo.web.scripts.action.RunningActionRestApiTest.class, + org.alfresco.repo.web.scripts.site.SiteServiceTest.class, + org.alfresco.repo.web.scripts.tagging.TaggingServiceTest.class, + org.alfresco.repo.web.scripts.thumbnail.ThumbnailServiceTest.class, + org.alfresco.repo.web.scripts.transfer.TransferWebScriptTest.class, + org.alfresco.repo.web.scripts.workflow.ActivitiWorkflowRestApiTest.class, + org.alfresco.repo.web.scripts.solr.SOLRWebScriptTest.class, + org.alfresco.repo.web.scripts.subscriptions.SubscriptionServiceRestApiTest.class, + org.alfresco.repo.web.scripts.facet.FacetRestApiTest.class, + org.alfresco.repo.web.scripts.comment.CommentsApiTest.class, + org.alfresco.repo.web.scripts.content.ContentGetTest.class, + org.alfresco.repo.web.scripts.XssVulnerabilityTest.class, + org.alfresco.repo.web.scripts.links.LinksRestApiTest.class, + org.alfresco.repo.model.filefolder.RemoteFileFolderLoaderTest.class, + org.alfresco.repo.web.scripts.ReadOnlyTransactionInGetRestApiTest.class, + org.alfresco.repo.web.scripts.custommodel.CustomModelImportTest.class, + org.alfresco.repo.web.scripts.site.SurfConfigTest.class, + org.alfresco.repo.web.scripts.node.NodeWebScripTest.class, + org.alfresco.rest.api.impl.CommentsImplUnitTest.class, + org.alfresco.rest.api.impl.DownloadsImplCheckArchiveStatusUnitTest.class, + org.alfresco.rest.api.impl.RestApiDirectUrlConfigUnitTest.class }) public class AppContext04TestSuite {