Merged FILE-FOLDER-API (5.2.0) to HEAD (5.2)

121851 jvonka: (Quick) Shared Links API - update resource name to "/shared-links"
   - also add REST impl layer
   - TODO review impl (+ add tests)
   RA-775, RA-773, RA-750, RA-708, RA-776


git-svn-id: https://svn.alfresco.com/repos/alfresco-enterprise/alfresco/HEAD/root@126428 c4b6b30b-aa2e-2d43-bbcb-ca4b014f7261
This commit is contained in:
Jamal Kaabi-Mofrad
2016-05-10 10:53:03 +00:00
parent 06f639f03d
commit c03accdbea
4 changed files with 373 additions and 168 deletions

View File

@@ -18,111 +18,62 @@
*/
package org.alfresco.rest.api.quicksharelinks;
import org.alfresco.model.QuickShareModel;
import org.alfresco.repo.tenant.TenantUtil;
import org.alfresco.rest.api.Nodes;
import org.alfresco.rest.api.model.ContentInfo;
import org.alfresco.rest.api.QuickShareLinks;
import org.alfresco.rest.api.model.QuickShareLink;
import org.alfresco.rest.api.model.UserInfo;
import org.alfresco.rest.framework.BinaryProperties;
import org.alfresco.rest.framework.WebApiDescription;
import org.alfresco.rest.framework.WebApiNoAuth;
import org.alfresco.rest.framework.core.exceptions.EntityNotFoundException;
import org.alfresco.rest.framework.core.exceptions.PermissionDeniedException;
import org.alfresco.rest.framework.resource.EntityResource;
import org.alfresco.rest.framework.resource.actions.interfaces.BinaryResourceAction;
import org.alfresco.rest.framework.resource.actions.interfaces.EntityResourceAction;
import org.alfresco.rest.framework.resource.content.BinaryResource;
import org.alfresco.rest.framework.resource.parameters.Parameters;
import org.alfresco.service.cmr.quickshare.InvalidSharedIdException;
import org.alfresco.service.cmr.quickshare.QuickShareDTO;
import org.alfresco.service.cmr.quickshare.QuickShareService;
import org.alfresco.service.cmr.repository.InvalidNodeRefException;
import org.alfresco.service.cmr.repository.NodeRef;
import org.alfresco.service.cmr.repository.NodeService;
import org.alfresco.service.cmr.repository.StoreRef;
import org.alfresco.util.Pair;
import org.alfresco.util.ParameterCheck;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.springframework.beans.factory.InitializingBean;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.Map;
/**
* An implementation of an Entity Resource for a QuickShareLink (name TBC !!)
* An implementation of an Entity Resource for Shared Links.
*
* @author janv
*/
@EntityResource(name="quicksharelinks", title = "QuickShareLinks")
@EntityResource(name="shared-links", title = "Shared Links")
public class QuickShareLinkEntityResource implements EntityResourceAction.ReadById<QuickShareLink>,
BinaryResourceAction.Read, EntityResourceAction.Delete,
EntityResourceAction.Create<QuickShareLink>, InitializingBean
{
// TODO move impl into QuickShare REST service (especially if & when we need to span more than one resource) ....
private QuickShareLinks quickShareLinks;
private static final Log logger = LogFactory.getLog(QuickShareLinkEntityResource.class);
private final static String DISABLED = "QuickShare is disabled system-wide";
private boolean enabled = true;
private QuickShareService quickShareService;
private Nodes nodes;
private NodeService nodeService;
public void setQuickShareService(QuickShareService quickShareService)
public void setQuickShareLinks(QuickShareLinks quickShareLinks)
{
this.quickShareService = quickShareService;
this.quickShareLinks = quickShareLinks;
}
public void setNodes(Nodes nodes)
{
this.nodes = nodes;
}
public void setNodeService(NodeService nodeService)
{
this.nodeService = nodeService;
}
public void setEnabled(boolean enabled)
{
this.enabled = enabled;
}
@Override
public void afterPropertiesSet()
{
ParameterCheck.mandatory("quickShareService", this.quickShareService);
ParameterCheck.mandatory("nodes", this.nodes);
ParameterCheck.mandatory("nodeService", this.nodeService);
ParameterCheck.mandatory("quickShareLinks", this.quickShareLinks);
}
/**
* Returns limited metadata regarding the sharedId.
* Returns limited metadata regarding the shared (content) link.
*
* Note: does not require authenticated access !
* Note: does *not* require authenticated access for (public) shared link.
*/
@Override
@WebApiDescription(title="Returns quick share information for given sharedId.")
@WebApiDescription(title="Get shared link info", description = "Return limited metadata for shared link")
@WebApiNoAuth
public QuickShareLink readById(String sharedId, Parameters parameters)
{
if (! enabled)
{
throw new PermissionDeniedException(DISABLED);
}
return getQuickShareInfo(sharedId);
return quickShareLinks.readById(sharedId, parameters);
}
/**
* Download content via sharedId.
* Download content via shared link.
*
* Note: does not require authenticated access !
* Note: does *not* require authenticated access for (public) shared link.
*
* @param sharedId
* @param parameters {@link Parameters}
@@ -130,77 +81,29 @@ public class QuickShareLinkEntityResource implements EntityResourceAction.ReadBy
* @throws EntityNotFoundException
*/
@Override
@WebApiDescription(title = "Download content", description = "Download content")
@WebApiDescription(title = "Download shared link content", description = "Download content for shared link")
@WebApiNoAuth
@BinaryProperties({"content"})
public BinaryResource readProperty(String sharedId, final Parameters parameters) throws EntityNotFoundException
{
if (! enabled)
{
throw new PermissionDeniedException(DISABLED);
}
try
{
Pair<String, NodeRef> pair = quickShareService.getTenantNodeRefFromSharedId(sharedId);
String networkTenantDomain = pair.getFirst();
final NodeRef nodeRef = pair.getSecond();
return TenantUtil.runAsSystemTenant(new TenantUtil.TenantRunAsWork<BinaryResource>()
{
public BinaryResource doWork() throws Exception
{
// belt-and-braces (similar to QuickSjareContentGet)
if (! nodeService.hasAspect(nodeRef, QuickShareModel.ASPECT_QSHARE))
{
throw new InvalidNodeRefException(nodeRef);
}
return nodes.getContent(nodeRef.getId(), parameters);
}
}, networkTenantDomain);
}
catch (InvalidSharedIdException ex)
{
logger.warn("Unable to find: "+sharedId);
throw new EntityNotFoundException("Unable to find: "+sharedId);
}
catch (InvalidNodeRefException inre){
logger.warn("Unable to find: "+sharedId+" ["+inre.getNodeRef()+"]");
throw new EntityNotFoundException("Unable to find: "+sharedId);
}
return quickShareLinks.readProperty(sharedId, parameters);
}
/**
* Delete the specified quick share.
* Delete the shared link.
*
* Once deleted, the shared link will no longer exist hence get/download will no longer work (ie. return 404).
* If the link is later re-created then a new unique shared id will be generated.
*
* Requires authenticated access.
*
* @param sharedId String id of the quick share
*/
@Override
@WebApiDescription(title = "Delete quick share", description="Delete the quick share reference")
@WebApiDescription(title = "Delete shared link", description="Delete the shared link")
public void delete(String sharedId, Parameters parameters)
{
if (! enabled)
{
throw new PermissionDeniedException(DISABLED);
}
try
{
quickShareService.unshareContent(sharedId);
}
catch (InvalidSharedIdException ex)
{
logger.warn("Unable to find: "+sharedId);
throw new EntityNotFoundException("Unable to find: "+sharedId);
}
catch (InvalidNodeRefException inre){
logger.warn("Unable to find: "+sharedId+" ["+inre.getNodeRef()+"]");
throw new EntityNotFoundException("Unable to find: "+sharedId);
}
quickShareLinks.delete(sharedId, parameters);
}
/**
@@ -213,54 +116,9 @@ public class QuickShareLinkEntityResource implements EntityResourceAction.ReadBy
* @return
*/
@Override
@WebApiDescription(title="Create quick share")
@WebApiDescription(title="Create shared link", description="Create a new unique system-generated shared (link) id")
public List<QuickShareLink> create(List<QuickShareLink> nodeIds, Parameters parameters)
{
List<QuickShareLink> result = new ArrayList<>(nodeIds.size());
for (QuickShareLink qs : nodeIds)
{
String nodeId = qs.getNodeId();
QuickShareDTO qsDto = quickShareService.shareContent(new NodeRef(StoreRef.STORE_REF_WORKSPACE_SPACESSTORE, nodeId));
// TODO should we skip errors (eg. broken share) ?
result.add(getQuickShareInfo(qsDto.getId()));
}
return result;
}
private QuickShareLink getQuickShareInfo(String sharedId)
{
try
{
Map<String, Object> map = (Map<String, Object>)quickShareService.getMetaData(sharedId).get("item");
String nodeId = new NodeRef((String)map.get("nodeRef")).getId();
ContentInfo contentInfo = new ContentInfo((String)map.get("mimetype"), null, (Long)map.get("size"), null);
// note: we do not return modifier user id (to be consistent with v0 internal - limited disclosure)
UserInfo modifier = new UserInfo(null,(String)map.get("modifierFirstName"), (String)map.get("modifierLastName"));
// TODO other "properties" (if needed) - eg. cm:title, cm:lastThumbnailModificationData, ... thumbnail info ...
QuickShareLink qs = new QuickShareLink(sharedId, nodeId);
qs.setName((String)map.get("name"));
qs.setContent(contentInfo);
qs.setModifiedAt((Date)map.get("modified"));
qs.setModifiedByUser(modifier);
return qs;
}
catch (InvalidSharedIdException ex)
{
logger.warn("Unable to find: "+sharedId);
throw new EntityNotFoundException("Unable to find: "+sharedId);
}
catch (InvalidNodeRefException inre){
logger.warn("Unable to find: "+sharedId+" ["+inre.getNodeRef()+"]");
throw new EntityNotFoundException("Unable to find: "+sharedId);
}
return quickShareLinks.create(nodeIds, parameters);
}
}