diff --git a/source/java/org/alfresco/rest/api/Favourites.java b/source/java/org/alfresco/rest/api/Favourites.java index af358f5bdd..24694236e4 100644 --- a/source/java/org/alfresco/rest/api/Favourites.java +++ b/source/java/org/alfresco/rest/api/Favourites.java @@ -1,28 +1,28 @@ -/* - * #%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% - */ +/* + * #%L + * Alfresco Remote API + * %% + * Copyright (C) 2005 - 2017 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; import org.alfresco.rest.api.model.Favourite; @@ -37,6 +37,8 @@ import org.alfresco.rest.framework.resource.parameters.Parameters; */ public interface Favourites { + String PARAM_INCLUDE_PATH = Nodes.PARAM_INCLUDE_PATH; + /** * Add a favourite for user personId * @@ -45,6 +47,15 @@ public interface Favourites */ Favourite addFavourite(String personId, Favourite favourite); + /** + * Add a favourite for user personId taking parameters into account + * + * @param personId the personId for which the favourite is to be added + * @param favourite the favourite to add + * @param parameters the parameters + */ + Favourite addFavourite(String personId, Favourite favourite, Parameters parameters); + /** * Add a favourite for user personId * @@ -70,4 +81,14 @@ public interface Favourites * @return the favourite */ Favourite getFavourite(String personId, String favouriteId); + + /** + * Get a specific favourite for user personId taking parameters into account + * + * @param personId the personId for which the favourite is to be removed + * @param favouriteId the favourite id + * @param parameters the parameters + * @return the favourite + */ + Favourite getFavourite(String personId, String favouriteId, Parameters parameters); } diff --git a/source/java/org/alfresco/rest/api/impl/FavouritesImpl.java b/source/java/org/alfresco/rest/api/impl/FavouritesImpl.java index 31681d45d0..331bfc93ec 100644 --- a/source/java/org/alfresco/rest/api/impl/FavouritesImpl.java +++ b/source/java/org/alfresco/rest/api/impl/FavouritesImpl.java @@ -1,24 +1,24 @@ /* - * #%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: - * + * #%L + * Alfresco Remote API + * %% + * Copyright (C) 2005 - 2017 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% @@ -46,6 +46,8 @@ 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; @@ -54,6 +56,7 @@ import org.alfresco.rest.framework.core.exceptions.RelationshipResourceNotFoundE 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.where.QueryHelper; import org.alfresco.rest.framework.resource.parameters.where.QueryHelper.WalkerCallbackAdapter; import org.alfresco.service.cmr.favourites.FavouritesService; @@ -107,7 +110,7 @@ public class FavouritesImpl implements Favourites this.siteService = siteService; } - private Target getTarget(PersonFavourite personFavourite) + private Target getTarget(PersonFavourite personFavourite, Parameters parameters) { Target target = null; NodeRef nodeRef = personFavourite.getNodeRef(); @@ -115,11 +118,13 @@ public class FavouritesImpl implements Favourites if(type.equals(Type.FILE)) { Document document = nodes.getDocument(nodeRef); - target = new DocumentTarget(document); + 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)) @@ -136,18 +141,18 @@ public class FavouritesImpl implements Favourites return target; } - - private Favourite getFavourite(PersonFavourite personFavourite) + + private Favourite getFavourite(PersonFavourite personFavourite, Parameters parameters) { Favourite fav = new Favourite(); fav.setTargetGuid(personFavourite.getNodeRef().getId()); fav.setCreatedAt(personFavourite.getCreatedAt()); - Target target = getTarget(personFavourite); + Target target = getTarget(personFavourite, parameters); fav.setTarget(target); return fav; } - private CollectionWithPagingInfo wrap(Paging paging, PagingResults personFavourites) + private CollectionWithPagingInfo wrap(Paging paging, PagingResults personFavourites, Parameters parameters) { final List page = personFavourites.getPage(); final List list = new AbstractList() @@ -156,7 +161,7 @@ public class FavouritesImpl implements Favourites public Favourite get(int index) { PersonFavourite personFavourite = page.get(index); - Favourite fav = getFavourite(personFavourite); + Favourite fav = getFavourite(personFavourite, parameters); return fav; } @@ -178,58 +183,65 @@ public class FavouritesImpl implements Favourites @Override public Favourite addFavourite(String personId, Favourite favourite) { - Favourite ret = null; + Parameters parameters = getDefaultParameters(personId, null); + return addFavourite(personId, favourite, parameters); + } - 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(); + @Override + public Favourite addFavourite(String personId, Favourite favourite, Parameters parameters) + { + Favourite ret = null; - try - { - PersonFavourite personFavourite = favouritesService.addFavourite(personId, siteNodeRef); - ret = getFavourite(personFavourite); - } - 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); - } - 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()); - } + 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(); - PersonFavourite personFavourite = favouritesService.addFavourite(personId, nodeRef); - ret = getFavourite(personFavourite); - } + 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()); + } - return ret; + 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 @@ -263,25 +275,33 @@ public class FavouritesImpl implements Favourites throw new RelationshipResourceNotFoundException(personId, id); } } - + + @Override public Favourite getFavourite(String personId, String favouriteId) { - NodeRef nodeRef = nodes.validateNode(favouriteId); - personId = people.validatePerson(personId, true); - - PersonFavourite personFavourite = favouritesService.getFavourite(personId, nodeRef); - if(personFavourite != null) - { - Favourite favourite = getFavourite(personFavourite); - return favourite; - } - else - { - throw new RelationshipResourceNotFoundException(personId, favouriteId); - } + Parameters parameters = getDefaultParameters(personId, favouriteId); + return getFavourite(personId, favouriteId, parameters); } - @Override + @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); @@ -327,6 +347,27 @@ public class FavouritesImpl implements Favourites final PagingResults favourites = favouritesService.getPagedFavourites(personId, filterTypes, FavouritesService.DEFAULT_SORT_PROPS, Util.getPagingRequest(paging)); - return wrap(paging, favourites); + 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; } } diff --git a/source/java/org/alfresco/rest/api/people/PersonFavouritesRelation.java b/source/java/org/alfresco/rest/api/people/PersonFavouritesRelation.java index 8fd2195548..ac47aafa5b 100644 --- a/source/java/org/alfresco/rest/api/people/PersonFavouritesRelation.java +++ b/source/java/org/alfresco/rest/api/people/PersonFavouritesRelation.java @@ -1,28 +1,28 @@ -/* - * #%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% - */ +/* + * #%L + * Alfresco Remote API + * %% + * Copyright (C) 2005 - 2017 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.people; import java.util.ArrayList; @@ -84,7 +84,7 @@ RelationshipResourceAction.Create, RelationshipResourceAction.Delete List ret = new ArrayList(entity.size()); for(Favourite favourite : entity) { - ret.add(favourites.addFavourite(personId, favourite)); + ret.add(favourites.addFavourite(personId, favourite, parameters)); } return ret; } @@ -100,6 +100,6 @@ RelationshipResourceAction.Create, RelationshipResourceAction.Delete public Favourite readById(String personId, String favouriteId, Parameters parameters) throws RelationshipResourceNotFoundException { - return favourites.getFavourite(personId, favouriteId); + return favourites.getFavourite(personId, favouriteId, parameters); } } diff --git a/source/test-java/org/alfresco/rest/api/tests/TestFavourites.java b/source/test-java/org/alfresco/rest/api/tests/TestFavourites.java index bf04a44cbb..664415cdaa 100644 --- a/source/test-java/org/alfresco/rest/api/tests/TestFavourites.java +++ b/source/test-java/org/alfresco/rest/api/tests/TestFavourites.java @@ -1,33 +1,34 @@ -/* - * #%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% - */ +/* + * #%L + * Alfresco Remote API + * %% + * Copyright (C) 2005 - 2017 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.tests; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertNotNull; +import static org.junit.Assert.assertNull; import static org.junit.Assert.assertTrue; import static org.junit.Assert.fail; @@ -42,6 +43,7 @@ import java.util.Iterator; import java.util.List; import java.util.Map; import java.util.Set; +import java.util.concurrent.atomic.AtomicInteger; import org.alfresco.repo.security.authentication.AuthenticationUtil; import org.alfresco.repo.tenant.TenantUtil; @@ -59,13 +61,15 @@ import org.alfresco.rest.api.tests.client.PublicApiException; import org.alfresco.rest.api.tests.client.RequestContext; import org.alfresco.rest.api.tests.client.data.Comment; import org.alfresco.rest.api.tests.client.data.Favourite; -import org.alfresco.rest.api.tests.client.data.FavouriteDocument; -import org.alfresco.rest.api.tests.client.data.FavouriteFolder; +import org.alfresco.rest.api.tests.client.data.FavouriteDocument; +import org.alfresco.rest.api.tests.client.data.FavouriteFolder; +import org.alfresco.rest.api.tests.client.data.FavouriteNode; import org.alfresco.rest.api.tests.client.data.FavouritesTarget; import org.alfresco.rest.api.tests.client.data.FileFavouriteTarget; import org.alfresco.rest.api.tests.client.data.FolderFavouriteTarget; import org.alfresco.rest.api.tests.client.data.InvalidFavouriteTarget; import org.alfresco.rest.api.tests.client.data.JSONAble; +import org.alfresco.rest.api.tests.client.data.PathInfo; import org.alfresco.rest.api.tests.client.data.Site; import org.alfresco.rest.api.tests.client.data.SiteFavouriteTarget; import org.alfresco.rest.api.tests.client.data.SiteImpl; @@ -91,7 +95,7 @@ import com.google.common.collect.Lists; * @author steveglover * @since publicapi1.0 */ -public class TestFavourites extends EnterpriseTestApi +public class TestFavourites extends AbstractBaseApiTest { private static enum TARGET_TYPE { @@ -291,7 +295,7 @@ public class TestFavourites extends EnterpriseTestApi this.siteMembershipRequestsProxy = publicApiClient.siteMembershipRequests(); } - private void sort(List favourites, final List> sortProps) + private void sort(List favourites, final List> sortProps) { Comparator comparator = new Comparator() { @@ -501,7 +505,7 @@ public class TestFavourites extends EnterpriseTestApi private Favourite makeFolderFavourite(String targetGuid) throws ParseException { - FavouriteFolder folder = new FavouriteFolder(targetGuid); + FavouriteFolder folder = new FavouriteFolder(targetGuid); FolderFavouriteTarget target = new FolderFavouriteTarget(folder); Date creationData = new Date(); Favourite favourite = new Favourite(creationData, null, target); @@ -510,7 +514,7 @@ public class TestFavourites extends EnterpriseTestApi private Favourite makeFileFavourite(String targetGuid) throws ParseException { - FavouriteDocument document = new FavouriteDocument(targetGuid); + FavouriteDocument document = new FavouriteDocument(targetGuid); FileFavouriteTarget target = new FileFavouriteTarget(document); Date creationData = new Date(); Favourite favourite = new Favourite(creationData, null, target); @@ -613,7 +617,7 @@ public class TestFavourites extends EnterpriseTestApi publicApiClient.setRequestContext(new RequestContext(network1.getId(), person10Id)); String siteGuid = person1PublicSites.get(0).getGuid(); - FavouriteDocument document = new FavouriteDocument(siteGuid); + FavouriteDocument document = new FavouriteDocument(siteGuid); Favourite favourite = makeFileFavourite(document.getGuid()); Favourite ret = favouritesProxy.createFavourite(person10Id, favourite); favourite.expected(ret); @@ -630,7 +634,7 @@ public class TestFavourites extends EnterpriseTestApi publicApiClient.setRequestContext(new RequestContext(network1.getId(), person10Id)); String siteGuid = person1PublicSites.get(0).getGuid(); - FavouriteFolder folder = new FavouriteFolder(siteGuid); + FavouriteFolder folder = new FavouriteFolder(siteGuid); Favourite favourite = makeFolderFavourite(folder.getGuid()); Favourite ret = favouritesProxy.createFavourite(person10Id, favourite); favourite.expected(ret); @@ -647,7 +651,7 @@ public class TestFavourites extends EnterpriseTestApi { publicApiClient.setRequestContext(new RequestContext(network1.getId(), person10Id)); - FavouriteFolder folder = new FavouriteFolder(person1PublicDocs.get(0).getId()); + FavouriteFolder folder = new FavouriteFolder(person1PublicDocs.get(0).getId()); Favourite favourite = makeFolderFavourite(folder.getGuid()); Favourite ret = favouritesProxy.createFavourite(person10Id, favourite); favourite.expected(ret); @@ -664,7 +668,7 @@ public class TestFavourites extends EnterpriseTestApi { publicApiClient.setRequestContext(new RequestContext(network1.getId(), person10Id)); - FavouriteDocument document = new FavouriteDocument(person1PublicFolders.get(0).getId()); + FavouriteDocument document = new FavouriteDocument(person1PublicFolders.get(0).getId()); Favourite favourite = makeFileFavourite(document.getGuid()); Favourite ret = favouritesProxy.createFavourite(person10Id, favourite); favourite.expected(ret); @@ -684,8 +688,8 @@ public class TestFavourites extends EnterpriseTestApi try { publicApiClient.setRequestContext(new RequestContext(network1.getId(), person10Id)); - - FavouriteDocument document = new FavouriteDocument(person1PublicDocs.get(0).getId()); + + FavouriteDocument document = new FavouriteDocument(person1PublicDocs.get(0).getId()); Favourite favourite = makeFileFavourite(document.getGuid()); favouritesProxy.createFavourite(person11Id, favourite); @@ -780,8 +784,8 @@ public class TestFavourites extends EnterpriseTestApi try { publicApiClient.setRequestContext(new RequestContext(network1.getId(), person10Id)); - - FavouriteDocument document = new FavouriteDocument(GUID.generate()); + + FavouriteDocument document = new FavouriteDocument(GUID.generate()); Favourite favourite = makeFileFavourite(document.getGuid()); favouritesProxy.createFavourite(person10Id, favourite); @@ -800,8 +804,8 @@ public class TestFavourites extends EnterpriseTestApi try { publicApiClient.setRequestContext(new RequestContext(network1.getId(), person10Id)); - - FavouriteFolder folder = new FavouriteFolder(GUID.generate()); + + FavouriteFolder folder = new FavouriteFolder(GUID.generate()); Favourite favourite = makeFolderFavourite(folder.getGuid()); favouritesProxy.createFavourite(person10Id, favourite); @@ -835,7 +839,7 @@ public class TestFavourites extends EnterpriseTestApi } catch(PublicApiException e) { - assertEquals(HttpStatus.SC_BAD_REQUEST, e.getHttpResponse().getStatusCode()); + assertEquals(HttpStatus.SC_BAD_REQUEST, e.getHttpResponse().getStatusCode()); } try @@ -852,10 +856,10 @@ public class TestFavourites extends EnterpriseTestApi } catch(PublicApiException e) { - assertEquals(HttpStatus.SC_BAD_REQUEST, e.getHttpResponse().getStatusCode()); + assertEquals(HttpStatus.SC_BAD_REQUEST, e.getHttpResponse().getStatusCode()); } - FavouriteDocument document = new FavouriteDocument(person1PublicDocs.get(0).getId()); + FavouriteDocument document = new FavouriteDocument(person1PublicDocs.get(0).getId()); try { @@ -889,8 +893,8 @@ public class TestFavourites extends EnterpriseTestApi assertEquals(HttpStatus.SC_NOT_FOUND, e.getHttpResponse().getStatusCode()); } - FavouriteFolder folder = new FavouriteFolder(person1PublicFolders.get(0).getId()); - + FavouriteFolder folder = new FavouriteFolder(person1PublicFolders.get(0).getId()); + try { publicApiClient.setRequestContext(new RequestContext(network1.getId(), person10Id)); @@ -958,11 +962,11 @@ public class TestFavourites extends EnterpriseTestApi log("cloud-2467"); Favourite siteFavourite1 = makeSiteFavourite(person1PublicSites.get(0)); - - FavouriteDocument document = repoService.getDocument(network1.getId(), person1PublicDocs.get(0)); + + FavouriteDocument document = repoService.getDocument(network1.getId(), person1PublicDocs.get(0)); Favourite fileFavourite1 = makeFileFavourite(document.getGuid()); - - FavouriteFolder folder = repoService.getFolder(network1.getId(), person1PublicFolders.get(0)); + + FavouriteFolder folder = repoService.getFolder(network1.getId(), person1PublicFolders.get(0)); Favourite folderFavourite1 = makeFolderFavourite(folder.getGuid()); Favourite siteFavourite2 = makeSiteFavourite(person1PublicSites.get(1)); @@ -1091,7 +1095,7 @@ public class TestFavourites extends EnterpriseTestApi { publicApiClient.setRequestContext(new RequestContext(network1.getId(), person21Id)); - FavouriteDocument document1 = new FavouriteDocument(person1PrivateDocs.get(0).getId()); + FavouriteDocument document1 = new FavouriteDocument(person1PrivateDocs.get(0).getId()); Favourite favourite = makeFileFavourite(document1.getGuid()); try { @@ -1123,7 +1127,7 @@ public class TestFavourites extends EnterpriseTestApi { publicApiClient.setRequestContext(new RequestContext(network1.getId(), person21Id)); - FavouriteFolder folder1 = new FavouriteFolder(person1PrivateFolders.get(0).getId()); + FavouriteFolder folder1 = new FavouriteFolder(person1PrivateFolders.get(0).getId()); Favourite favourite = makeFolderFavourite(folder1.getGuid()); try { @@ -1712,4 +1716,187 @@ public class TestFavourites extends EnterpriseTestApi } } } + + /** + * Tests get favourites with 'include' parameter. + *

GET:

+ * {@literal :/alfresco/api//public/alfresco/versions/1/people//favorites?include=path} + */ + @Test + public void testGetFavouritesWithPath() throws Exception + { + // As person12 user + setRequestContext(network1.getId(), person12Id, "password"); + + final NodeRef folderNodeRef = person1PublicFolders.get(0); // person1's folder (Test Folder1) + final NodeRef nodeRef = person1PublicDocs.get(1); // a file (Test Doc2) in the folder (Test Folder1) + final TestSite publicSite = person1PublicSites.get(0); // person1's public site + + // Favourite the doc (Test Doc2) + Favourite fileFavourite = makeFileFavourite(nodeRef.getId()); + favouritesProxy.createFavourite(person12Id, fileFavourite); + + //Favourite the folder (Test Folder1) + Favourite folderFavourite = makeFolderFavourite(folderNodeRef.getId()); + favouritesProxy.createFavourite(person12Id, folderFavourite); + + // Favourite the public site + final Favourite siteFavourite = makeSiteFavourite(publicSite); + favouritesProxy.createFavourite(person12Id, siteFavourite); + + Paging paging = getPaging(0, 100); + Map otherParams = Collections.singletonMap("include", "path"); + + ListResponse resp = favouritesProxy.getFavourites(person12Id, createParams(paging, otherParams)); + List actualFavouritesList = resp.getList(); + assertEquals("Incorrect number of entries returned", 3, actualFavouritesList.size()); + + actualFavouritesList.forEach(fav -> + { + FavouriteNode node; + switch (fav.getType()) + { + case FILE: + { + node = ((FileFavouriteTarget) fav.getTarget()).getDocument(); + assertNotNull("node is null.", node); + assertPathInfo(node.getPath(), "/Company Home/Sites/" + publicSite.getSiteId() + "/documentLibrary/Test Folder1", true); + break; + } + case FOLDER: + { + node = ((FolderFavouriteTarget) fav.getTarget()).getFolder(); + assertNotNull("node is null.", node); + assertPathInfo(node.getPath(), "/Company Home/Sites/" + publicSite.getSiteId() + "/documentLibrary", true); + break; + } + case SITE: + { + JSONObject siteJsonObject = fav.getTarget().toJSON(); + assertNotNull("There should be a site JSON object.", siteJsonObject); + assertNull("Path info should not be returned for sites.", siteJsonObject.get("path")); + break; + } + } + }); + + // Get favourites without 'include' option + resp = favouritesProxy.getFavourites(person12Id, createParams(paging, null)); + actualFavouritesList = resp.getList(); + assertEquals("Incorrect number of entries returned", 3, actualFavouritesList.size()); + + actualFavouritesList.forEach(fav -> + { + FavouriteNode node; + switch (fav.getType()) + { + case FILE: + { + node = ((FileFavouriteTarget) fav.getTarget()).getDocument(); + assertNotNull("node is null.", node); + assertNull("Path info should not be returned by default", node.getPath()); + break; + } + case FOLDER: + { + node = ((FolderFavouriteTarget) fav.getTarget()).getFolder(); + assertNotNull("node is null.", node); + assertNull("Path info should not be returned by default", node.getPath()); + break; + } + case SITE: + { + JSONObject siteJsonObject = fav.getTarget().toJSON(); + assertNotNull("There should be a site JSON object.", siteJsonObject); + assertNull("Path info should not be returned for sites.", siteJsonObject.get("path")); + break; + } + } + }); + } + + /** + * Tests create and get favourite with 'include' parameter. + * + *

POST:

+ * {@literal :/alfresco/api//public/alfresco/versions/1/people//favorites?include=path} + * + *

GET:

+ * {@literal :/alfresco/api//public/alfresco/versions/1/people//favorites/?include=path} + */ + @Test + public void testCreateAndGetFavouriteWithPath() throws Exception + { + Map includePath = Collections.singletonMap("include", "path"); + + // As person12 user + setRequestContext(network1.getId(), person12Id, "password"); + + final NodeRef folderNodeRef = person1PublicFolders.get(0); // person1's folder (Test Folder1) + final NodeRef nodeRef1= person1PublicDocs.get(0); // a file in the site's document library (Test Doc1) + final NodeRef nodeRef2 = person1PublicDocs.get(1); // a file (Test Doc2) in the folder (Test Folder1) + final TestSite publicSite = person1PublicSites.get(0); // person1's public site + + // Favourite the doc (Test Doc1) + Favourite file1Favourite = makeFileFavourite(nodeRef1.getId()); + file1Favourite = favouritesProxy.createFavourite(person12Id, file1Favourite, includePath); + FavouriteNode node = ((FileFavouriteTarget) file1Favourite.getTarget()).getDocument(); + assertPathInfo(node.getPath(), "/Company Home/Sites/" + publicSite.getSiteId() + "/documentLibrary", true); + + + // Favourite the doc (Test Doc2) + Favourite file2Favourite = makeFileFavourite(nodeRef2.getId()); + file2Favourite = favouritesProxy.createFavourite(person12Id, file2Favourite); + node = ((FileFavouriteTarget) file2Favourite.getTarget()).getDocument(); + assertNull("Path info should not be returned by default", node.getPath()); + + //Favourite the folder (Test Folder1) + Favourite folderFavourite = makeFolderFavourite(folderNodeRef.getId()); + folderFavourite = favouritesProxy.createFavourite(person12Id, folderFavourite, includePath); + node = ((FolderFavouriteTarget) folderFavourite.getTarget()).getFolder(); + assertPathInfo(node.getPath(), "/Company Home/Sites/" + publicSite.getSiteId() + "/documentLibrary", true); + + // Favourite the public site + Favourite siteFavourite = makeSiteFavourite(publicSite); + siteFavourite = favouritesProxy.createFavourite(person12Id, siteFavourite); + JSONObject siteJsonObject = siteFavourite.getTarget().toJSON(); + assertNotNull("There should be a site JSON object.", siteJsonObject); + assertNull("Path info should not be returned for sites.", siteJsonObject.get("path")); + + // Get single favourite (Test Doc2) with include path + Favourite favouriteResp = favouritesProxy.getFavourite(person12Id, file2Favourite.getTargetGuid(), includePath); + node = ((FileFavouriteTarget) favouriteResp.getTarget()).getDocument(); + assertPathInfo(node.getPath(), "/Company Home/Sites/" + publicSite.getSiteId() + "/documentLibrary/Test Folder1", true); + + favouriteResp = favouritesProxy.getFavourite(person12Id, folderFavourite.getTargetGuid(), includePath); + node = ((FolderFavouriteTarget) favouriteResp.getTarget()).getFolder(); + assertPathInfo(node.getPath(), "/Company Home/Sites/" + publicSite.getSiteId() + "/documentLibrary", true); + + favouriteResp = favouritesProxy.getFavourite(person12Id, siteFavourite.getTargetGuid(), includePath); + siteJsonObject = favouriteResp.getTarget().toJSON(); + assertNotNull("There should be a site JSON object.", siteJsonObject); + assertNull("Path info should not be returned for sites.", siteJsonObject.get("path")); + } + + private void assertPathInfo(PathInfo expectedPathInfo, String expectedPathName, boolean expectedIsComplete) + { + assertNotNull("Path info was requested.", expectedPathInfo); + assertEquals("IsComplete should have been true.", expectedIsComplete, expectedPathInfo.getIsComplete()); + assertEquals("Incorrect path name.", expectedPathName, expectedPathInfo.getName()); + + // substring(1) -> so we can ignore the first '/' + List expectedPathElements = Arrays.asList(expectedPathName.substring(1).split("/")); + assertEquals("Incorrect number of path elements.", expectedPathElements.size(), expectedPathInfo.getElements().size()); + + AtomicInteger i = new AtomicInteger(0); + expectedPathElements.forEach(path -> assertEquals("Incorrect path element.", path, + expectedPathInfo.getElements().get(i.getAndIncrement()).getName())); + } + + @Override + public String getScope() + { + return "public"; + } + } \ No newline at end of file diff --git a/source/test-java/org/alfresco/rest/api/tests/client/PublicApiClient.java b/source/test-java/org/alfresco/rest/api/tests/client/PublicApiClient.java index 319882c61e..8ad9af89d8 100644 --- a/source/test-java/org/alfresco/rest/api/tests/client/PublicApiClient.java +++ b/source/test-java/org/alfresco/rest/api/tests/client/PublicApiClient.java @@ -2,7 +2,7 @@ * #%L * Alfresco Remote API * %% - * Copyright (C) 2005 - 2016 Alfresco Software Limited + * Copyright (C) 2005 - 2017 Alfresco Software Limited * %% * This file is part of the Alfresco software. * If the software was purchased under a paid Alfresco license, the terms of @@ -1086,6 +1086,12 @@ public class PublicApiClient return Favourite.parseFavourite((JSONObject)response.getJsonResponse().get("entry")); } + public Favourite getFavourite(String personId, String favouriteId, Map params) throws PublicApiException, ParseException + { + HttpResponse response = getSingle("people", personId, "favorites", favouriteId, params, "Failed to get favourite " + favouriteId, 200); + return Favourite.parseFavourite((JSONObject) response.getJsonResponse().get("entry")); + } + public Favourite createFavourite(String personId, Favourite favourite) throws PublicApiException, ParseException { HttpResponse response = create("people", personId, "favorites", null, favourite.toJSON().toString(), "Failed to create favourite"); @@ -1093,6 +1099,13 @@ public class PublicApiClient return ret; } + public Favourite createFavourite(String personId, Favourite favourite, Map params) throws PublicApiException, ParseException + { + HttpResponse response = create("people", personId, "favorites", null, favourite.toJSON().toString(), "Failed to create favourite", 201, params); + Favourite ret = Favourite.parseFavourite((JSONObject)response.getJsonResponse().get("entry")); + return ret; + } + public void removeFavourite(String personId, String favouriteId) throws PublicApiException { remove("people", personId, "favorites", favouriteId, "Failed to remove favourite"); diff --git a/source/test-java/org/alfresco/rest/api/tests/client/data/FavouriteDocument.java b/source/test-java/org/alfresco/rest/api/tests/client/data/FavouriteDocument.java index 538f8d8eb1..72c935c84f 100644 --- a/source/test-java/org/alfresco/rest/api/tests/client/data/FavouriteDocument.java +++ b/source/test-java/org/alfresco/rest/api/tests/client/data/FavouriteDocument.java @@ -2,7 +2,7 @@ * #%L * Alfresco Remote API * %% - * Copyright (C) 2005 - 2016 Alfresco Software Limited + * Copyright (C) 2005 - 2017 Alfresco Software Limited * %% * This file is part of the Alfresco software. * If the software was purchased under a paid Alfresco license, the terms of @@ -170,17 +170,29 @@ public class FavouriteDocument extends FavouriteNode implements ExpectedComparis document.setMimeType(mimeType); document.setSizeInBytes(BigInteger.valueOf(sizeInBytes)); document.setVersionLabel(versionLabel); - return document; - } + // set path if available + document.parseAndSetPath(jsonObject); + return document; + } - @Override - public String toString() - { - return "FavouriteDocument [mimeType=" + mimeType + ", sizeInBytes=" - + sizeInBytes + ", versionLabel=" + versionLabel + ", nodeId=" - + nodeId + ", guid=" + guid + ", name=" + name + ", title=" - + title + ", description=" + description + ", createdAt=" - + createdAt + ", modifiedAt=" + modifiedAt + ", createdBy=" - + createdBy + ", modifiedBy=" + modifiedBy + "]"; - } + @Override + public String toString() + { + final StringBuilder sb = new StringBuilder(250); + sb.append("FavouriteDocument [nodeId=").append(nodeId) + .append(", guid=").append(guid) + .append(", name=").append(name) + .append(", title=").append(title) + .append(", description=").append(description) + .append(", createdAt=").append(createdAt) + .append(", modifiedAt=").append(modifiedAt) + .append(", createdBy=").append(createdBy) + .append(", modifiedBy=").append(modifiedBy) + .append(", mimeType=").append(mimeType) + .append(", sizeInBytes=").append(sizeInBytes) + .append(", versionLabel=").append(versionLabel) + .append(", path=").append(path) + .append(']'); + return sb.toString(); + } } diff --git a/source/test-java/org/alfresco/rest/api/tests/client/data/FavouriteFolder.java b/source/test-java/org/alfresco/rest/api/tests/client/data/FavouriteFolder.java index 0ac7f8bff5..2d2fdf5170 100644 --- a/source/test-java/org/alfresco/rest/api/tests/client/data/FavouriteFolder.java +++ b/source/test-java/org/alfresco/rest/api/tests/client/data/FavouriteFolder.java @@ -2,7 +2,7 @@ * #%L * Alfresco Remote API * %% - * Copyright (C) 2005 - 2016 Alfresco Software Limited + * Copyright (C) 2005 - 2017 Alfresco Software Limited * %% * This file is part of the Alfresco software. * If the software was purchased under a paid Alfresco license, the terms of @@ -110,8 +110,10 @@ public class FavouriteFolder extends FavouriteNode implements ExpectedComparison folder.setModifiedAt(modifiedAt); folder.setCreatedAt(createdAt); folder.setDescription(description); - return folder; - } + // set path if available + folder.parseAndSetPath(jsonObject); + return folder; + } @Override public void expected(Object o) @@ -119,13 +121,21 @@ public class FavouriteFolder extends FavouriteNode implements ExpectedComparison super.expected(o); } - @Override - public String toString() - { - return "Folder [nodeId=" + nodeId + ", guid=" + guid + ", name=" + name - + ", title=" + title + ", description=" + description - + ", createdAt=" + createdAt + ", modifiedAt=" + modifiedAt - + ", createdBy=" + createdBy + ", modifiedBy=" + modifiedBy - + "]"; - } + @Override + public String toString() + { + final StringBuilder sb = new StringBuilder(250); + sb.append("FavouriteFolder [nodeId=").append(nodeId) + .append(", guid=").append(guid) + .append(", name=").append(name) + .append(", title=").append(title) + .append(", description=").append(description) + .append(", createdAt=").append(createdAt) + .append(", modifiedAt=").append(modifiedAt) + .append(", createdBy=").append(createdBy) + .append(", modifiedBy=").append(modifiedBy) + .append(", path=").append(path) + .append(']'); + return sb.toString(); + } } diff --git a/source/test-java/org/alfresco/rest/api/tests/client/data/FavouriteNode.java b/source/test-java/org/alfresco/rest/api/tests/client/data/FavouriteNode.java index 3bf735ecfe..aa7b73744a 100644 --- a/source/test-java/org/alfresco/rest/api/tests/client/data/FavouriteNode.java +++ b/source/test-java/org/alfresco/rest/api/tests/client/data/FavouriteNode.java @@ -2,7 +2,7 @@ * #%L * Alfresco Remote API * %% - * Copyright (C) 2005 - 2016 Alfresco Software Limited + * Copyright (C) 2005 - 2017 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,8 +29,10 @@ package org.alfresco.rest.api.tests.client.data; import static org.junit.Assert.assertTrue; import java.io.Serializable; +import java.text.ParseException; import java.util.Date; +import org.alfresco.rest.api.tests.util.RestApiUtil; import org.json.simple.JSONObject; /** @@ -52,6 +54,7 @@ public class FavouriteNode implements Serializable, ExpectedComparison protected Date modifiedAt; protected String createdBy; protected String modifiedBy; + protected PathInfo path; public FavouriteNode() { @@ -173,7 +176,33 @@ public class FavouriteNode implements Serializable, ExpectedComparison this.nodeId = nodeId; } - @Override + public PathInfo getPath() + { + return path; + } + + public void setPath(PathInfo pathInfo) + { + this.path = pathInfo; + } + + protected void parseAndSetPath(JSONObject jsonObject) throws ParseException + { + if (jsonObject.get("path") != null) + { + try + { + PathInfo pathInfo = RestApiUtil.parsePojo("path", jsonObject, PathInfo.class); + this.setPath(pathInfo); + } + catch (Exception e) + { + throw new ParseException(e.getMessage(), -1); + } + } + } + + @Override public int hashCode() { final int prime = 31; @@ -229,15 +258,27 @@ public class FavouriteNode implements Serializable, ExpectedComparison } AssertUtil.assertEquals("createdBy", createdBy, other.getCreatedBy()); AssertUtil.assertEquals("modifiedBy", modifiedBy, other.getModifiedBy()); + if(path != null) + { + path.expected(other.path); + } } - @Override - public String toString() - { - return "Node [nodeId=" + nodeId + ", guid=" + guid + ", name=" + name - + ", title=" + title + ", description=" + description - + ", createdAt=" + createdAt + ", modifiedAt=" + modifiedAt - + ", createdBy=" + createdBy + ", modifiedBy=" + modifiedBy - + "]"; - } + @Override + public String toString() + { + final StringBuilder sb = new StringBuilder(250); + sb.append("FavouriteNode [nodeId=").append(nodeId) + .append(", guid=").append(guid) + .append(", name=").append(name) + .append(", title=").append(title) + .append(", description=").append(description) + .append(", createdAt=").append(createdAt) + .append(", modifiedAt=").append(modifiedAt) + .append(", createdBy=").append(createdBy) + .append(", modifiedBy=").append(modifiedBy) + .append(", path=").append(path) + .append(']'); + return sb.toString(); + } }