mirror of
https://github.com/Alfresco/alfresco-community-repo.git
synced 2025-08-07 17:49:17 +00:00
Merged DEV to HEAD
- ALF-8806 RINF 41: Lucene Removal: Fix CopyService - ALF-9028: RINF 41: Fix Aspect cm:copiedFrom - ALF-9029 RINF 49: Lucene Removal: CheckOutCheckInService API - ALF-9032: RINF 49: fixes to cm:workingcopy aspect 28996: Dev branch for De-Lucene work pending patches 29004: Evaluator runs in read-only txn 29006: Additional PermissionCheckedCollection.create method - Use an existing collection's permission check data (cut-off, etc) to wrap a new collection 29007: CopyService and CheckOutCheckInService refactors to remove Lucene CopyService: Removed cm:source property from cm:copiedfrom aspect and replaced with a cm:original association. Added CQ-based APIs to query for copies Added APIs to support bi-directional walking of copy association Fixed sundry uses of cm:copiedfrom esp. all uses related to cm:workingcopy CheckOutCheckInService: Check-out now creates a source aspect cm:checkedOut with 1:1 relationship to cm:workingcopy via cm:workingcopylink Removed explicit use of cm:workingcopy aspect and replaced it with calls to COCI API 29083: Audit tests fail when indexing is turned off. Also removed a getReader() call during rule evaluation, leading to a 'sub-action' read being recorded. 29113: NodeDAO.getNodesWithAspects supports paging 29135: Removed unused patch queries 29139: Basic patch (still terminates with error) to upgrade cm:copiedfrom and cm:workingcopy 29157: Tested patch for cm:copiedfrom and cm:workingcopy aspects git-svn-id: https://svn.alfresco.com/repos/alfresco-enterprise/alfresco/HEAD/root@29159 c4b6b30b-aa2e-2d43-bbcb-ca4b014f7261
This commit is contained in:
@@ -23,13 +23,16 @@ package org.alfresco.repo.action.executer;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
import org.alfresco.model.ContentModel;
|
||||
import org.alfresco.query.PagingRequest;
|
||||
import org.alfresco.query.PagingResults;
|
||||
import org.alfresco.repo.action.ParameterDefinitionImpl;
|
||||
import org.alfresco.service.cmr.action.Action;
|
||||
import org.alfresco.service.cmr.action.ParameterDefinition;
|
||||
import org.alfresco.service.cmr.coci.CheckOutCheckInService;
|
||||
import org.alfresco.service.cmr.dictionary.DataTypeDefinition;
|
||||
import org.alfresco.service.cmr.repository.ChildAssociationRef;
|
||||
import org.alfresco.service.cmr.repository.CopyService;
|
||||
import org.alfresco.service.cmr.repository.CopyService.CopyInfo;
|
||||
import org.alfresco.service.cmr.repository.NodeRef;
|
||||
import org.alfresco.service.cmr.repository.NodeService;
|
||||
import org.alfresco.service.cmr.rule.RuleServiceException;
|
||||
@@ -50,20 +53,12 @@ public class CopyActionExecuter extends ActionExecuterAbstractBase
|
||||
public static final String PARAM_DEEP_COPY = "deep-copy";
|
||||
public static final String PARAM_OVERWRITE_COPY = "overwrite-copy";
|
||||
|
||||
/**
|
||||
* Node operations service
|
||||
*/
|
||||
private CopyService copyService;
|
||||
|
||||
/**
|
||||
* The node service
|
||||
*/
|
||||
private NodeService nodeService;
|
||||
private CheckOutCheckInService checkOutCheckInService;
|
||||
|
||||
/**
|
||||
* Sets the node service
|
||||
*
|
||||
* @param nodeService the node service
|
||||
*/
|
||||
public void setNodeService(NodeService nodeService)
|
||||
{
|
||||
@@ -72,19 +67,21 @@ public class CopyActionExecuter extends ActionExecuterAbstractBase
|
||||
|
||||
/**
|
||||
* Sets the copy service
|
||||
*
|
||||
* @param copyService the copy service
|
||||
*/
|
||||
public void setCopyService(CopyService copyService)
|
||||
{
|
||||
this.copyService = copyService;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* @see org.alfresco.repo.action.ParameterizedItemAbstractBase#addParameterDefinitions(java.util.List)
|
||||
*/
|
||||
@Override
|
||||
/**
|
||||
* Service to determine check-in or check-out status
|
||||
*/
|
||||
public void setCheckOutCheckInService(CheckOutCheckInService checkOutCheckInService)
|
||||
{
|
||||
this.checkOutCheckInService = checkOutCheckInService;
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void addParameterDefinitions(List<ParameterDefinition> paramList)
|
||||
{
|
||||
paramList.add(new ParameterDefinitionImpl(PARAM_DESTINATION_FOLDER, DataTypeDefinition.NODE_REF, true, getParamDisplayLabel(PARAM_DESTINATION_FOLDER)));
|
||||
@@ -92,80 +89,76 @@ public class CopyActionExecuter extends ActionExecuterAbstractBase
|
||||
paramList.add(new ParameterDefinitionImpl(PARAM_OVERWRITE_COPY, DataTypeDefinition.BOOLEAN, false, getParamDisplayLabel(PARAM_OVERWRITE_COPY)));
|
||||
}
|
||||
|
||||
/**
|
||||
* @see org.alfresco.repo.action.executer.ActionExecuter#execute(org.alfresco.repo.ref.NodeRef, org.alfresco.repo.ref.NodeRef)
|
||||
*/
|
||||
@Override
|
||||
public void executeImpl(Action ruleAction, NodeRef actionedUponNodeRef)
|
||||
{
|
||||
if (this.nodeService.exists(actionedUponNodeRef) == true)
|
||||
{
|
||||
if (!nodeService.exists(actionedUponNodeRef))
|
||||
{
|
||||
return;
|
||||
}
|
||||
NodeRef destinationParent = (NodeRef)ruleAction.getParameterValue(PARAM_DESTINATION_FOLDER);
|
||||
|
||||
// Get the deep copy value
|
||||
boolean deepCopy = false;
|
||||
Boolean deepCopyValue = (Boolean)ruleAction.getParameterValue(PARAM_DEEP_COPY);
|
||||
if (deepCopyValue != null)
|
||||
Boolean deepCopyValue = (Boolean)ruleAction.getParameterValue(PARAM_DEEP_COPY);
|
||||
if (deepCopyValue != null)
|
||||
{
|
||||
deepCopy = deepCopyValue.booleanValue();
|
||||
}
|
||||
|
||||
// Get the overwirte value
|
||||
boolean overwrite = true;
|
||||
Boolean overwriteValue = (Boolean)ruleAction.getParameterValue(PARAM_OVERWRITE_COPY);
|
||||
if (overwriteValue != null)
|
||||
{
|
||||
overwrite = overwriteValue.booleanValue();
|
||||
}
|
||||
|
||||
// Since we are overwriting we need to figure out whether the destination node exists
|
||||
NodeRef copyNodeRef = null;
|
||||
if (overwrite == true)
|
||||
{
|
||||
// Try and find copies of the actioned upon node reference.
|
||||
// Include the parent folder because that's where the copy will be if this action
|
||||
// had done the first copy.
|
||||
PagingResults<CopyInfo> copies = copyService.getCopies(
|
||||
actionedUponNodeRef,
|
||||
destinationParent,
|
||||
new PagingRequest(1000));
|
||||
for (CopyInfo copyInfo : copies.getPage())
|
||||
{
|
||||
deepCopy = deepCopyValue.booleanValue();
|
||||
}
|
||||
|
||||
// Get the overwirte value
|
||||
boolean overwrite = true;
|
||||
Boolean overwriteValue = (Boolean)ruleAction.getParameterValue(PARAM_OVERWRITE_COPY);
|
||||
if (overwriteValue != null)
|
||||
{
|
||||
overwrite = overwriteValue.booleanValue();
|
||||
}
|
||||
|
||||
// Since we are overwriting we need to figure out whether the destination node exists
|
||||
NodeRef destinationNodeRef = null;
|
||||
if (overwrite == true)
|
||||
{
|
||||
// Try and find copies of the actioned upon node reference
|
||||
List<NodeRef> copies = this.copyService.getCopies(actionedUponNodeRef);
|
||||
if (copies != null && copies.isEmpty() == false)
|
||||
NodeRef copy = copyInfo.getNodeRef();
|
||||
// We know that it is in the destination parent, but avoid working copies
|
||||
if (checkOutCheckInService.isWorkingCopy(copy))
|
||||
{
|
||||
for (NodeRef copy : copies)
|
||||
{
|
||||
// Ignore if the copy is a working copy
|
||||
if (this.nodeService.hasAspect(copy, ContentModel.ASPECT_WORKING_COPY) == false)
|
||||
{
|
||||
// We can assume that we are looking for a node created by this action so the primary parent will
|
||||
// match the destination folder
|
||||
NodeRef parent = this.nodeService.getPrimaryParent(copy).getParentRef();
|
||||
if (parent.equals(destinationParent) == true)
|
||||
{
|
||||
if (destinationNodeRef == null)
|
||||
{
|
||||
destinationNodeRef = copy;
|
||||
}
|
||||
else
|
||||
{
|
||||
throw new RuleServiceException(ERR_OVERWRITE);
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
continue;
|
||||
}
|
||||
if (copyNodeRef == null)
|
||||
{
|
||||
copyNodeRef = copy;
|
||||
}
|
||||
else
|
||||
{
|
||||
throw new RuleServiceException(ERR_OVERWRITE);
|
||||
}
|
||||
}
|
||||
|
||||
if (destinationNodeRef != null)
|
||||
{
|
||||
// Overwrite the state of the destination node ref with the actioned upon node state
|
||||
this.copyService.copy(actionedUponNodeRef, destinationNodeRef);
|
||||
}
|
||||
else
|
||||
{
|
||||
ChildAssociationRef originalAssoc = nodeService.getPrimaryParent(actionedUponNodeRef);
|
||||
// Create a new copy of the node
|
||||
this.copyService.copyAndRename(
|
||||
actionedUponNodeRef,
|
||||
destinationParent,
|
||||
originalAssoc.getTypeQName(),
|
||||
originalAssoc.getQName(),
|
||||
deepCopy);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (copyNodeRef != null)
|
||||
{
|
||||
// Overwrite the state of the destination node ref with the actioned upon node state
|
||||
this.copyService.copy(actionedUponNodeRef, copyNodeRef);
|
||||
}
|
||||
else
|
||||
{
|
||||
ChildAssociationRef originalAssoc = nodeService.getPrimaryParent(actionedUponNodeRef);
|
||||
// Create a new copy of the node
|
||||
this.copyService.copyAndRename(
|
||||
actionedUponNodeRef,
|
||||
destinationParent,
|
||||
originalAssoc.getTypeQName(),
|
||||
originalAssoc.getQName(),
|
||||
deepCopy);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@@ -21,9 +21,12 @@ package org.alfresco.repo.action.executer;
|
||||
import java.util.List;
|
||||
|
||||
import org.alfresco.model.ContentModel;
|
||||
import org.alfresco.query.PagingRequest;
|
||||
import org.alfresco.query.PagingResults;
|
||||
import org.alfresco.repo.action.ParameterDefinitionImpl;
|
||||
import org.alfresco.service.cmr.action.Action;
|
||||
import org.alfresco.service.cmr.action.ParameterDefinition;
|
||||
import org.alfresco.service.cmr.coci.CheckOutCheckInService;
|
||||
import org.alfresco.service.cmr.dictionary.DataTypeDefinition;
|
||||
import org.alfresco.service.cmr.dictionary.DictionaryService;
|
||||
import org.alfresco.service.cmr.repository.ContentReader;
|
||||
@@ -35,6 +38,7 @@ import org.alfresco.service.cmr.repository.NoTransformerException;
|
||||
import org.alfresco.service.cmr.repository.NodeRef;
|
||||
import org.alfresco.service.cmr.repository.NodeService;
|
||||
import org.alfresco.service.cmr.repository.TransformationOptions;
|
||||
import org.alfresco.service.cmr.repository.CopyService.CopyInfo;
|
||||
import org.alfresco.service.cmr.rule.RuleServiceException;
|
||||
import org.alfresco.service.namespace.QName;
|
||||
import org.apache.commons.logging.Log;
|
||||
@@ -47,20 +51,16 @@ import org.apache.commons.logging.LogFactory;
|
||||
*/
|
||||
public class TransformActionExecuter extends ActionExecuterAbstractBase
|
||||
{
|
||||
|
||||
/** Error messages */
|
||||
/* Error messages */
|
||||
public static final String ERR_OVERWRITE = "Unable to overwrite copy because more than one have been found.";
|
||||
private static final String CONTENT_READER_NOT_FOUND_MESSAGE = "Can not find Content Reader for document. Operation can't be performed";
|
||||
private static final String TRANSFORMING_ERROR_MESSAGE = "Some error occurred during document transforming. Error message: ";
|
||||
|
||||
private static final String TRANSFORMER_NOT_EXISTS_MESSAGE_PATTERN = "Transformer for '%s' source mime type and '%s' target mime type was not found. Operation can't be performed";
|
||||
|
||||
/**
|
||||
* The logger
|
||||
*/
|
||||
private static Log logger = LogFactory.getLog(TransformActionExecuter.class);
|
||||
|
||||
/**
|
||||
/*
|
||||
* Action constants
|
||||
*/
|
||||
public static final String NAME = "transform";
|
||||
@@ -70,19 +70,18 @@ public class TransformActionExecuter extends ActionExecuterAbstractBase
|
||||
public static final String PARAM_ASSOC_QNAME = "assoc-name";
|
||||
public static final String PARAM_OVERWRITE_COPY = "overwrite-copy";
|
||||
|
||||
/**
|
||||
/*
|
||||
* Injected services
|
||||
*/
|
||||
private DictionaryService dictionaryService;
|
||||
private NodeService nodeService;
|
||||
private CheckOutCheckInService checkOutCheckInService;
|
||||
private ContentService contentService;
|
||||
private CopyService copyService;
|
||||
private MimetypeService mimetypeService;
|
||||
|
||||
/**
|
||||
* Set the mime type service
|
||||
*
|
||||
* @param mimetypeService the mime type service
|
||||
*/
|
||||
public void setMimetypeService(MimetypeService mimetypeService)
|
||||
{
|
||||
@@ -91,18 +90,22 @@ public class TransformActionExecuter extends ActionExecuterAbstractBase
|
||||
|
||||
/**
|
||||
* Set the node service
|
||||
*
|
||||
* @param nodeService set the node service
|
||||
*/
|
||||
public void setNodeService(NodeService nodeService)
|
||||
{
|
||||
this.nodeService = nodeService;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Set the service to determine check-in and check-out status
|
||||
*/
|
||||
public void setCheckOutCheckInService(CheckOutCheckInService checkOutCheckInService)
|
||||
{
|
||||
this.checkOutCheckInService = checkOutCheckInService;
|
||||
}
|
||||
|
||||
/**
|
||||
* Set the dictionary service
|
||||
*
|
||||
* @param dictionaryService the dictionary service
|
||||
*/
|
||||
public void setDictionaryService(DictionaryService dictionaryService)
|
||||
{
|
||||
@@ -111,8 +114,6 @@ public class TransformActionExecuter extends ActionExecuterAbstractBase
|
||||
|
||||
/**
|
||||
* Set the content service
|
||||
*
|
||||
* @param contentService the content service
|
||||
*/
|
||||
public void setContentService(ContentService contentService)
|
||||
{
|
||||
@@ -121,8 +122,6 @@ public class TransformActionExecuter extends ActionExecuterAbstractBase
|
||||
|
||||
/**
|
||||
* Set the copy service
|
||||
*
|
||||
* @param copyService the copy service
|
||||
*/
|
||||
public void setCopyService(CopyService copyService)
|
||||
{
|
||||
@@ -198,32 +197,35 @@ public class TransformActionExecuter extends ActionExecuterAbstractBase
|
||||
NodeRef copyNodeRef = null;
|
||||
if (overwrite == true)
|
||||
{
|
||||
// Try and find copies of the actioned upon node reference
|
||||
List<NodeRef> copies = this.copyService.getCopies(actionedUponNodeRef);
|
||||
if (copies != null && copies.isEmpty() == false)
|
||||
// Try and find copies of the actioned upon node reference.
|
||||
// Include the parent folder because that's where the copy will be if this action
|
||||
// had done the first copy.
|
||||
PagingResults<CopyInfo> copies = copyService.getCopies(
|
||||
actionedUponNodeRef,
|
||||
destinationParent,
|
||||
new PagingRequest(1000));
|
||||
for (CopyInfo copyInfo : copies.getPage())
|
||||
{
|
||||
for (NodeRef copy : copies)
|
||||
NodeRef copy = copyInfo.getNodeRef();
|
||||
String copyName = copyInfo.getName();
|
||||
// We know that it is in the destination parent, but avoid working copies
|
||||
if (checkOutCheckInService.isWorkingCopy(copy))
|
||||
{
|
||||
// Ignore if the copy is a working copy
|
||||
if (this.nodeService.hasAspect(copy, ContentModel.ASPECT_WORKING_COPY) == false)
|
||||
{
|
||||
// We can assume that we are looking for a node created by this action so the primary parent will
|
||||
// match the destination folder and the name will be the same
|
||||
NodeRef parent = this.nodeService.getPrimaryParent(copy).getParentRef();
|
||||
String copyName = (String)this.nodeService.getProperty(copy, ContentModel.PROP_NAME);
|
||||
if (parent.equals(destinationParent) == true && copyName.equals(newName) == true)
|
||||
{
|
||||
if (copyNodeRef == null)
|
||||
{
|
||||
copyNodeRef = copy;
|
||||
}
|
||||
else
|
||||
{
|
||||
throw new RuleServiceException(ERR_OVERWRITE);
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
// It is a working copy
|
||||
continue;
|
||||
}
|
||||
else if (!newName.equals(copyName))
|
||||
{
|
||||
// The copy's name is not what this action would have set it to
|
||||
continue;
|
||||
}
|
||||
if (copyNodeRef == null)
|
||||
{
|
||||
copyNodeRef = copy;
|
||||
}
|
||||
else
|
||||
{
|
||||
throw new RuleServiceException(ERR_OVERWRITE);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
Reference in New Issue
Block a user