Merge HEAD to BRANCHES/V2.1.0.x:

74932: RM-1461: CLONE - RM slower then standard repo/sites when rendering document details when folder contains 15k documents



git-svn-id: https://svn.alfresco.com/repos/alfresco-enterprise/modules/recordsmanagement/BRANCHES/V2.1.0.x@76597 c4b6b30b-aa2e-2d43-bbcb-ca4b014f7261
This commit is contained in:
Roy Wetherall
2014-07-16 02:00:27 +00:00
parent 558399aa2b
commit ca26cf5715
7 changed files with 522 additions and 420 deletions

View File

@@ -272,6 +272,7 @@
<aspect>rma:recordComponentIdentifier</aspect> <aspect>rma:recordComponentIdentifier</aspect>
<aspect>rma:commonRecordDetails</aspect> <aspect>rma:commonRecordDetails</aspect>
<aspect>rma:filePlanComponent</aspect> <aspect>rma:filePlanComponent</aspect>
<aspect>rma:heldChildren</aspect>
</mandatory-aspects> </mandatory-aspects>
</type> </type>
@@ -1213,6 +1214,20 @@
</properties> </properties>
</aspect> </aspect>
<!-- Number of held children, used to improve evaluation performance -->
<!-- @since 2.2 -->
<aspect name="rma:heldChildren">
<title>Held children</title>
<properties>
<property name="rma:heldChildrenCount">
<type>d:int</type>
<protected>true</protected>
<mandatory>true</mandatory>
<default>0</default>
</property>
</properties>
</aspect>
<!-- Helper aspect that can be used to keep a count --> <!-- Helper aspect that can be used to keep a count -->
<aspect name="rma:countable"> <aspect name="rma:countable">
<title>Countable aspect</title> <title>Countable aspect</title>

View File

@@ -57,7 +57,6 @@ import org.alfresco.service.cmr.repository.Period;
import org.alfresco.service.cmr.security.OwnableService; import org.alfresco.service.cmr.security.OwnableService;
import org.alfresco.service.namespace.NamespaceService; import org.alfresco.service.namespace.NamespaceService;
import org.alfresco.service.namespace.QName; import org.alfresco.service.namespace.QName;
import org.alfresco.service.namespace.RegexQNamePattern;
import org.alfresco.service.transaction.TransactionService; import org.alfresco.service.transaction.TransactionService;
import org.alfresco.util.PropertyCheck; import org.alfresco.util.PropertyCheck;
import org.springframework.beans.factory.BeanNameAware; import org.springframework.beans.factory.BeanNameAware;

View File

@@ -42,11 +42,13 @@ import org.alfresco.repo.security.authentication.AuthenticationUtil;
import org.alfresco.repo.security.authentication.AuthenticationUtil.RunAsWork; import org.alfresco.repo.security.authentication.AuthenticationUtil.RunAsWork;
import org.alfresco.repo.security.permissions.AccessDeniedException; import org.alfresco.repo.security.permissions.AccessDeniedException;
import org.alfresco.repo.transaction.AlfrescoTransactionSupport; import org.alfresco.repo.transaction.AlfrescoTransactionSupport;
import org.alfresco.repo.transaction.RetryingTransactionHelper.RetryingTransactionCallback;
import org.alfresco.service.cmr.repository.ChildAssociationRef; import org.alfresco.service.cmr.repository.ChildAssociationRef;
import org.alfresco.service.cmr.repository.NodeRef; import org.alfresco.service.cmr.repository.NodeRef;
import org.alfresco.service.cmr.security.PermissionService; import org.alfresco.service.cmr.security.PermissionService;
import org.alfresco.service.namespace.QName; import org.alfresco.service.namespace.QName;
import org.alfresco.service.namespace.RegexQNamePattern; import org.alfresco.service.namespace.RegexQNamePattern;
import org.alfresco.service.transaction.TransactionService;
import org.alfresco.util.ParameterCheck; import org.alfresco.util.ParameterCheck;
import org.apache.commons.lang.StringUtils; import org.apache.commons.lang.StringUtils;
import org.apache.commons.logging.Log; import org.apache.commons.logging.Log;
@@ -191,10 +193,10 @@ public class FreezeServiceImpl extends ServiceBaseImpl
for (ChildAssociationRef assoc : assocs) for (ChildAssociationRef assoc : assocs)
{ {
// we only care about primary children // we only care about primary children
if (assoc.isPrimary() == true) if (assoc.isPrimary())
{ {
NodeRef nodeRef = assoc.getChildRef(); NodeRef nodeRef = assoc.getChildRef();
if (isFrozen(nodeRef) == true) if (isFrozen(nodeRef))
{ {
// never allowed to delete a node with a frozen child // never allowed to delete a node with a frozen child
throw new AccessDeniedException("Can not delete node, because it contains a frozen child node."); throw new AccessDeniedException("Can not delete node, because it contains a frozen child node.");
@@ -531,21 +533,68 @@ public class FreezeServiceImpl extends ServiceBaseImpl
* @see org.alfresco.module.org_alfresco_module_rm.freeze.FreezeService#hasFrozenChildren(org.alfresco.service.cmr.repository.NodeRef) * @see org.alfresco.module.org_alfresco_module_rm.freeze.FreezeService#hasFrozenChildren(org.alfresco.service.cmr.repository.NodeRef)
*/ */
@Override @Override
public boolean hasFrozenChildren(NodeRef nodeRef) public boolean hasFrozenChildren(final NodeRef nodeRef)
{ {
ParameterCheck.mandatory("nodeRef", nodeRef); ParameterCheck.mandatory("nodeRef", nodeRef);
List<ChildAssociationRef> childAssocs = nodeService.getChildAssocs(nodeRef, ContentModel.ASSOC_CONTAINS, boolean result = false;
RegexQNamePattern.MATCH_ALL);
if (childAssocs != null && !childAssocs.isEmpty()) // check that we are dealing with a record folder
{ if (isRecordFolder(nodeRef))
for (ChildAssociationRef childAssociationRef : childAssocs) {
int heldCount = 0;
if (nodeService.hasAspect(nodeRef, ASPECT_HELD_CHILDREN))
{ {
if (isFrozen(childAssociationRef.getChildRef())) { return true; } heldCount = (Integer)getInternalNodeService().getProperty(nodeRef, PROP_HELD_CHILDREN_COUNT);
} }
else
{
final TransactionService transactionService = (TransactionService)applicationContext.getBean("transactionService");
heldCount = AuthenticationUtil.runAsSystem(new RunAsWork<Integer>()
{
@Override
public Integer doWork()
{
return transactionService.getRetryingTransactionHelper().doInTransaction(new RetryingTransactionCallback<Integer>()
{
public Integer execute() throws Throwable
{
int heldCount = 0;
// NOTE: this process remains to 'patch' older systems to improve performance next time around
List<ChildAssociationRef> childAssocs = getInternalNodeService().getChildAssocs(nodeRef, ContentModel.ASSOC_CONTAINS, null);
if (childAssocs != null && !childAssocs.isEmpty())
{
for (ChildAssociationRef childAssociationRef : childAssocs)
{
NodeRef record = childAssociationRef.getChildRef();
if (childAssociationRef.isPrimary() && isRecord(record) && isFrozen(record))
{
heldCount ++;
}
}
}
// add aspect and set count
Map<QName, Serializable> props = new HashMap<QName, Serializable>(1);
props.put(PROP_HELD_CHILDREN_COUNT, heldCount);
getInternalNodeService().addAspect(nodeRef, ASPECT_HELD_CHILDREN, props);
return heldCount;
}
},
false, true);
}
});
}
// true if more than one child held
result = (heldCount > 0);
} }
return false; return result;
} }
/** /**

View File

@@ -213,6 +213,23 @@ public class JSONConversionComponent extends org.alfresco.repo.jscript.app.JSONC
rmNodeValues.put("actions", jsonActions); rmNodeValues.put("actions", jsonActions);
} }
} }
/**
* @see org.alfresco.repo.jscript.app.JSONConversionComponent#permissionsToJSON(org.alfresco.service.cmr.repository.NodeRef)
*/
protected JSONObject permissionsToJSON(final NodeRef nodeRef)
{
JSONObject permissionsJSON = null;
if (!filePlanService.isFilePlanComponent(nodeRef))
{
permissionsJSON = super.permissionsToJSON(nodeRef);
}
else
{
permissionsJSON = new JSONObject();
}
return permissionsJSON;
}
/** /**
* Gets the rm 'type' used as a UI convenience and compatibility flag. * Gets the rm 'type' used as a UI convenience and compatibility flag.

View File

@@ -253,6 +253,11 @@ public interface RecordsManagementModel extends RecordsManagementCustomModel
public static final QName PROP_RECORD_REJECTION_DATE = QName.createQName(RM_URI, "recordRejectionDate"); public static final QName PROP_RECORD_REJECTION_DATE = QName.createQName(RM_URI, "recordRejectionDate");
public static final QName PROP_RECORD_REJECTION_REASON = QName.createQName(RM_URI, "recordRejectionReason"); public static final QName PROP_RECORD_REJECTION_REASON = QName.createQName(RM_URI, "recordRejectionReason");
// Held children aspect
// @since 2.2
QName ASPECT_HELD_CHILDREN = QName.createQName(RM_URI, "heldChildren");
QName PROP_HELD_CHILDREN_COUNT = QName.createQName(RM_URI, "heldChildrenCount");
// Countable aspect // Countable aspect
public static final QName ASPECT_COUNTABLE = QName.createQName(RM_URI, "countable"); public static final QName ASPECT_COUNTABLE = QName.createQName(RM_URI, "countable");
public static final QName PROP_COUNT = QName.createQName(RM_URI, "count"); public static final QName PROP_COUNT = QName.createQName(RM_URI, "count");

View File

@@ -18,6 +18,8 @@
*/ */
package org.alfresco.module.org_alfresco_module_rm.util; package org.alfresco.module.org_alfresco_module_rm.util;
import java.util.HashMap;
import java.util.Map;
import java.util.Set; import java.util.Set;
import org.alfresco.module.org_alfresco_module_rm.fileplan.FilePlanComponentKind; import org.alfresco.module.org_alfresco_module_rm.fileplan.FilePlanComponentKind;
@@ -43,409 +45,428 @@ import org.springframework.context.ApplicationContextAware;
*/ */
public class ServiceBaseImpl implements RecordsManagementModel, ApplicationContextAware public class ServiceBaseImpl implements RecordsManagementModel, ApplicationContextAware
{ {
/** Node service */ /** Node service */
protected NodeService nodeService; protected NodeService nodeService;
/** Dictionary service */ /** Dictionary service */
protected DictionaryService dictionaryService; protected DictionaryService dictionaryService;
/** Application context */ /** Application context */
protected ApplicationContext applicationContext; protected ApplicationContext applicationContext;
/** internal node service */ /** internal node service */
private NodeService internalNodeService; private NodeService internalNodeService;
/** /**
* @see org.springframework.context.ApplicationContextAware#setApplicationContext(org.springframework.context.ApplicationContext) * @see org.springframework.context.ApplicationContextAware#setApplicationContext(org.springframework.context.ApplicationContext)
*/ */
@Override @Override
public void setApplicationContext(ApplicationContext applicationContext) public void setApplicationContext(ApplicationContext applicationContext)
{ {
this.applicationContext = applicationContext; this.applicationContext = applicationContext;
} }
/** /**
* @param nodeService node service * @param nodeService node service
*/ */
public void setNodeService(NodeService nodeService) public void setNodeService(NodeService nodeService)
{ {
this.nodeService = nodeService; this.nodeService = nodeService;
} }
/** /**
* @param dictionaryService dictionary service * @param dictionaryService dictionary service
*/ */
public void setDictionaryService(DictionaryService dictionaryService) public void setDictionaryService(DictionaryService dictionaryService)
{ {
this.dictionaryService = dictionaryService; this.dictionaryService = dictionaryService;
} }
/** /**
* Helper to get internal node service. * Helper to get internal node service.
* <p> * <p>
* Used for performance reasons. * Used for performance reasons.
*/ */
private NodeService getInternalNodeService() protected NodeService getInternalNodeService()
{ {
if (internalNodeService == null) if (internalNodeService == null)
{ {
internalNodeService = (NodeService)applicationContext.getBean("dbNodeService"); internalNodeService = (NodeService)applicationContext.getBean("dbNodeService");
} }
return internalNodeService; return internalNodeService;
} }
/** /**
* Gets the file plan component kind from the given node reference * Gets the file plan component kind from the given node reference
* *
* @see FilePlanService#getFilePlanComponentKind(org.alfresco.service.cmr.repository.NodeRef) * @see FilePlanService#getFilePlanComponentKind(org.alfresco.service.cmr.repository.NodeRef)
*/ */
public FilePlanComponentKind getFilePlanComponentKind(NodeRef nodeRef) public FilePlanComponentKind getFilePlanComponentKind(NodeRef nodeRef)
{ {
FilePlanComponentKind result = null; FilePlanComponentKind result = null;
if (isFilePlanComponent(nodeRef)) if (isFilePlanComponent(nodeRef))
{ {
result = FilePlanComponentKind.FILE_PLAN_COMPONENT; result = FilePlanComponentKind.FILE_PLAN_COMPONENT;
if (isFilePlan(nodeRef)) if (isFilePlan(nodeRef))
{ {
result = FilePlanComponentKind.FILE_PLAN; result = FilePlanComponentKind.FILE_PLAN;
} }
else if (isRecordCategory(nodeRef)) else if (isRecordCategory(nodeRef))
{ {
result = FilePlanComponentKind.RECORD_CATEGORY; result = FilePlanComponentKind.RECORD_CATEGORY;
} }
else if (isRecordFolder(nodeRef)) else if (isRecordFolder(nodeRef))
{ {
result = FilePlanComponentKind.RECORD_FOLDER; result = FilePlanComponentKind.RECORD_FOLDER;
} }
else if (isRecord(nodeRef)) else if (isRecord(nodeRef))
{ {
result = FilePlanComponentKind.RECORD; result = FilePlanComponentKind.RECORD;
} }
else if (isHold(nodeRef)) else if (isHold(nodeRef))
{ {
result = FilePlanComponentKind.HOLD; result = FilePlanComponentKind.HOLD;
} }
else if (isTransfer(nodeRef)) else if (isTransfer(nodeRef))
{ {
result = FilePlanComponentKind.TRANSFER; result = FilePlanComponentKind.TRANSFER;
} }
else if (instanceOf(nodeRef, TYPE_DISPOSITION_SCHEDULE) || instanceOf(nodeRef, TYPE_DISPOSITION_ACTION_DEFINITION)) else if (instanceOf(nodeRef, TYPE_DISPOSITION_SCHEDULE) || instanceOf(nodeRef, TYPE_DISPOSITION_ACTION_DEFINITION))
{ {
result = FilePlanComponentKind.DISPOSITION_SCHEDULE; result = FilePlanComponentKind.DISPOSITION_SCHEDULE;
} }
else if (instanceOf(nodeRef, TYPE_UNFILED_RECORD_CONTAINER)) else if (instanceOf(nodeRef, TYPE_UNFILED_RECORD_CONTAINER))
{ {
result = FilePlanComponentKind.UNFILED_RECORD_CONTAINER; result = FilePlanComponentKind.UNFILED_RECORD_CONTAINER;
} }
} }
return result; return result;
} }
/** /**
* Gets the file plan component kind from the given type. * Gets the file plan component kind from the given type.
* *
* @see FilePlanService#getFilePlanComponentKindFromType(QName) * @see FilePlanService#getFilePlanComponentKindFromType(QName)
*/ */
public FilePlanComponentKind getFilePlanComponentKindFromType(QName type) public FilePlanComponentKind getFilePlanComponentKindFromType(QName type)
{ {
FilePlanComponentKind result = null; FilePlanComponentKind result = null;
if (ASPECT_FILE_PLAN_COMPONENT.equals(type)) if (ASPECT_FILE_PLAN_COMPONENT.equals(type))
{ {
result = FilePlanComponentKind.FILE_PLAN_COMPONENT; result = FilePlanComponentKind.FILE_PLAN_COMPONENT;
} }
else if (instanceOf(type, ASPECT_RECORD)) else if (instanceOf(type, ASPECT_RECORD))
{ {
result = FilePlanComponentKind.RECORD; result = FilePlanComponentKind.RECORD;
} }
else if (instanceOf(type, TYPE_FILE_PLAN)) else if (instanceOf(type, TYPE_FILE_PLAN))
{ {
result = FilePlanComponentKind.FILE_PLAN; result = FilePlanComponentKind.FILE_PLAN;
} }
else if (instanceOf(type, TYPE_RECORD_CATEGORY)) else if (instanceOf(type, TYPE_RECORD_CATEGORY))
{ {
result = FilePlanComponentKind.RECORD_CATEGORY; result = FilePlanComponentKind.RECORD_CATEGORY;
} }
else if (instanceOf(type, TYPE_RECORD_FOLDER)) else if (instanceOf(type, TYPE_RECORD_FOLDER))
{ {
result = FilePlanComponentKind.RECORD_FOLDER; result = FilePlanComponentKind.RECORD_FOLDER;
} }
else if (instanceOf(type, TYPE_HOLD)) else if (instanceOf(type, TYPE_HOLD))
{ {
result = FilePlanComponentKind.HOLD; result = FilePlanComponentKind.HOLD;
} }
else if (instanceOf(type, TYPE_TRANSFER)) else if (instanceOf(type, TYPE_TRANSFER))
{ {
result = FilePlanComponentKind.TRANSFER; result = FilePlanComponentKind.TRANSFER;
} }
else if (instanceOf(type, TYPE_DISPOSITION_SCHEDULE) || else if (instanceOf(type, TYPE_DISPOSITION_SCHEDULE) ||
instanceOf(type, TYPE_DISPOSITION_ACTION_DEFINITION)) instanceOf(type, TYPE_DISPOSITION_ACTION_DEFINITION))
{ {
result = FilePlanComponentKind.DISPOSITION_SCHEDULE; result = FilePlanComponentKind.DISPOSITION_SCHEDULE;
} }
return result; return result;
} }
/** /**
* Indicates whether the given node is a file plan component or not. * Indicates whether the given node is a file plan component or not.
* <p> * <p>
* Exposed in the FilePlan service. * Exposed in the FilePlan service.
* *
* @see FilePlanService#isFilePlanComponent(org.alfresco.service.cmr.repository.NodeRef) * @see FilePlanService#isFilePlanComponent(org.alfresco.service.cmr.repository.NodeRef)
*/ */
public boolean isFilePlanComponent(NodeRef nodeRef) public boolean isFilePlanComponent(NodeRef nodeRef)
{ {
boolean result = false; boolean result = false;
if (getInternalNodeService().exists(nodeRef) && if (getInternalNodeService().exists(nodeRef) &&
getInternalNodeService().hasAspect(nodeRef, ASPECT_FILE_PLAN_COMPONENT)) getInternalNodeService().hasAspect(nodeRef, ASPECT_FILE_PLAN_COMPONENT))
{ {
result = true; result = true;
} }
return result; return result;
} }
/** /**
* Indicates whether the given node is a file plan or not. * Indicates whether the given node is a file plan or not.
* <p> * <p>
* Exposed in the FilePlan service. * Exposed in the FilePlan service.
* *
* @see FilePlanService#isFilePlan(org.alfresco.service.cmr.repository.NodeRef) * @see FilePlanService#isFilePlan(org.alfresco.service.cmr.repository.NodeRef)
*/ */
public boolean isFilePlan(NodeRef nodeRef) public boolean isFilePlan(NodeRef nodeRef)
{ {
return instanceOf(nodeRef, TYPE_FILE_PLAN); return instanceOf(nodeRef, TYPE_FILE_PLAN);
} }
/** /**
* Indicates whether the given node is a file plan container or not. * Indicates whether the given node is a file plan container or not.
* *
* @see FilePlanService#isFilePlanContainer(org.alfresco.service.cmr.repository.NodeRef) * @see FilePlanService#isFilePlanContainer(org.alfresco.service.cmr.repository.NodeRef)
*/ */
public boolean isFilePlanContainer(NodeRef nodeRef) public boolean isFilePlanContainer(NodeRef nodeRef)
{ {
return instanceOf(nodeRef, TYPE_RECORDS_MANAGEMENT_CONTAINER); return instanceOf(nodeRef, TYPE_RECORDS_MANAGEMENT_CONTAINER);
} }
/** /**
* Indicates whether the given node is a record category or not. * Indicates whether the given node is a record category or not.
* *
* @see FilePlanService#isRecordCategory(org.alfresco.service.cmr.repository.NodeRef) * @see FilePlanService#isRecordCategory(org.alfresco.service.cmr.repository.NodeRef)
*/ */
public boolean isRecordCategory(NodeRef nodeRef) public boolean isRecordCategory(NodeRef nodeRef)
{ {
return instanceOf(nodeRef, TYPE_RECORD_CATEGORY); return instanceOf(nodeRef, TYPE_RECORD_CATEGORY);
} }
/** /**
* Indicates whether the given node is a record folder or not. * Indicates whether the given node is a record folder or not.
* <p> * <p>
* Exposed in the RecordFolder service. * Exposed in the RecordFolder service.
* *
* @param nodeRef node reference * @param nodeRef node reference
* @return boolean true if record folder, false otherwise * @return boolean true if record folder, false otherwise
*/ */
public boolean isRecordFolder(NodeRef nodeRef) public boolean isRecordFolder(NodeRef nodeRef)
{ {
ParameterCheck.mandatory("nodeRef", nodeRef); ParameterCheck.mandatory("nodeRef", nodeRef);
return instanceOf(nodeRef, TYPE_RECORD_FOLDER); return instanceOf(nodeRef, TYPE_RECORD_FOLDER);
} }
/** /**
* Indicates whether the given node reference is a record or not. * Indicates whether the given node reference is a record or not.
* *
* @param nodeRef node reference * @param nodeRef node reference
* @return boolean true if node reference is a record, false otherwise * @return boolean true if node reference is a record, false otherwise
*/ */
public boolean isRecord(NodeRef nodeRef) public boolean isRecord(NodeRef nodeRef)
{ {
ParameterCheck.mandatory("nodeRef", nodeRef); ParameterCheck.mandatory("nodeRef", nodeRef);
return getInternalNodeService().hasAspect(nodeRef, ASPECT_RECORD); return getInternalNodeService().hasAspect(nodeRef, ASPECT_RECORD);
} }
/** /**
* Indicates whether the given node reference is a hold or not. * Indicates whether the given node reference is a hold or not.
* * <p>
* @param nodeRef node reference * Exposed publicly in the {@link HoldService}
* @return boolean true if rma:hold or sub-type, false otherwise *
*/ * @param nodeRef node reference
public boolean isHold(NodeRef nodeRef) * @return boolean true if rma:hold or sub-type, false otherwise
{ */
ParameterCheck.mandatory("nodeRef", nodeRef); public boolean isHold(NodeRef nodeRef)
{
boolean isHold = false; ParameterCheck.mandatory("nodeRef", nodeRef);
if (getInternalNodeService().exists(nodeRef) &&
instanceOf(nodeRef, TYPE_HOLD)) boolean isHold = false;
{ if (getInternalNodeService().exists(nodeRef) &&
isHold = true; instanceOf(nodeRef, TYPE_HOLD))
} {
return isHold; isHold = true;
} }
return isHold;
/** }
* Indicates whether the given node reference is a transfer or not.
*/ /**
public boolean isTransfer(NodeRef nodeRef) * Indicates whether the given node reference is a transfer or not.
{ *
ParameterCheck.mandatory("nodeRef", nodeRef); * @see org.alfresco.module.org_alfresco_module_rm.transfer.TransferService#isTransfer(NodeRef)
*/
return instanceOf(nodeRef, TYPE_TRANSFER); public boolean isTransfer(NodeRef nodeRef)
} {
ParameterCheck.mandatory("nodeRef", nodeRef);
/**
* Indicates whether a record is complete or not. return instanceOf(nodeRef, TYPE_TRANSFER);
* }
* @see org.alfresco.module.org_alfresco_module_rm.record.RecordService#isDeclared(org.alfresco.service.cmr.repository.NodeRef)
*/ /**
public boolean isDeclared(NodeRef record) * Indicates whether a record is complete or not.
{ *
ParameterCheck.mandatory("record", record); * @see org.alfresco.module.org_alfresco_module_rm.record.RecordService#isDeclared(org.alfresco.service.cmr.repository.NodeRef)
*/
return getInternalNodeService().hasAspect(record, ASPECT_DECLARED_RECORD); public boolean isDeclared(NodeRef record)
} {
ParameterCheck.mandatory("record", record);
/**
* Gets the file plan that a given file plan component resides within. return getInternalNodeService().hasAspect(record, ASPECT_DECLARED_RECORD);
* }
* @param nodeRef node reference
* @return {@link NodeRef} file plan, null if none /**
*/ * Gets the file plan that a given file plan component resides within.
public NodeRef getFilePlan(final NodeRef nodeRef) *
{ * @param nodeRef node reference
NodeRef result = null; * @return {@link NodeRef} file plan, null if none
if (nodeRef != null) */
{ public NodeRef getFilePlan(final NodeRef nodeRef)
result = (NodeRef)getInternalNodeService().getProperty(nodeRef, PROP_ROOT_NODEREF); {
if (result == null) NodeRef result = null;
{ if (nodeRef != null)
if (instanceOf(nodeRef, TYPE_FILE_PLAN)) {
{ result = (NodeRef)getInternalNodeService().getProperty(nodeRef, PROP_ROOT_NODEREF);
result = nodeRef; if (result == null || !instanceOf(result, TYPE_FILE_PLAN))
} {
else if (instanceOf(nodeRef, TYPE_FILE_PLAN))
{ {
ChildAssociationRef parentAssocRef = getInternalNodeService().getPrimaryParent(nodeRef); result = nodeRef;
if (parentAssocRef != null) }
{ else
result = getFilePlan(parentAssocRef.getParentRef()); {
} ChildAssociationRef parentAssocRef = getInternalNodeService().getPrimaryParent(nodeRef);
} if (parentAssocRef != null)
} {
} result = getFilePlan(parentAssocRef.getParentRef());
}
return result; }
} }
}
/**
* Utility method to safely and quickly determine if a node is a type (or sub-type) of the one specified. return result;
* }
* @param nodeRef node reference
* @param ofClassName class name to check /**
*/ * Utility method to safely and quickly determine if a node is a type (or sub-type) of the one specified.
protected boolean instanceOf(NodeRef nodeRef, QName ofClassName) *
{ * @param nodeRef node reference
ParameterCheck.mandatory("nodeRef", nodeRef); * @param ofClassName class name to check
ParameterCheck.mandatory("ofClassName", ofClassName); */
QName className = getInternalNodeService().getType(nodeRef); protected boolean instanceOf(NodeRef nodeRef, QName ofClassName)
return instanceOf(className, ofClassName); {
} ParameterCheck.mandatory("nodeRef", nodeRef);
ParameterCheck.mandatory("ofClassName", ofClassName);
/** QName className = getInternalNodeService().getType(nodeRef);
* Utility method to quickly determine whether one class is equal to or sub of another. return instanceOf(className, ofClassName);
* }
* @param className class name
* @param ofClassName class name to check against private static Map<String, Boolean> instanceOfCache = new HashMap<String, Boolean>();
* @return boolean true if equal to or sub, false otherwise
*/ /**
protected boolean instanceOf(QName className, QName ofClassName) * Utility method to quickly determine whether one class is equal to or sub of another.
{ *
ParameterCheck.mandatory("className", className); * @param className class name
ParameterCheck.mandatory("ofClassName", ofClassName); * @param ofClassName class name to check against
boolean result = false; * @return boolean true if equal to or sub, false otherwise
if (ofClassName.equals(className) || */
dictionaryService.isSubClass(className, ofClassName)) protected boolean instanceOf(QName className, QName ofClassName)
{ {
result = true; ParameterCheck.mandatory("className", className);
} ParameterCheck.mandatory("ofClassName", ofClassName);
return result;
} boolean result = false;
/** String key = className.toString() + "|" + ofClassName.toString();
* Utility method to get the next counter for a node. if (instanceOfCache.containsKey(key))
* <p> {
* If the node is not already countable, then rma:countable is added and 0 returned. result = instanceOfCache.get(key);
* }
* @param nodeRef node reference else
* @return int next counter value {
*/ if (ofClassName.equals(className) ||
protected int getNextCount(NodeRef nodeRef) dictionaryService.isSubClass(className, ofClassName))
{ {
int counter = 0; result = true;
if (!nodeService.hasAspect(nodeRef, ASPECT_COUNTABLE)) }
{
PropertyMap props = new PropertyMap(1); instanceOfCache.put(key, result);
props.put(PROP_COUNT, 1); }
nodeService.addAspect(nodeRef, ASPECT_COUNTABLE, props);
counter = 1; return result;
} }
else
{ /**
Integer value = (Integer)this.nodeService.getProperty(nodeRef, PROP_COUNT); * Utility method to get the next counter for a node.
if (value != null) * <p>
{ * If the node is not already countable, then rma:countable is added and 0 returned.
counter = value.intValue() + 1; *
} * @param nodeRef node reference
else * @return int next counter value
{ */
counter = 1; protected int getNextCount(NodeRef nodeRef)
} {
nodeService.setProperty(nodeRef, PROP_COUNT, counter); int counter = 0;
if (!nodeService.hasAspect(nodeRef, ASPECT_COUNTABLE))
} {
return counter; PropertyMap props = new PropertyMap(1);
} props.put(PROP_COUNT, 1);
nodeService.addAspect(nodeRef, ASPECT_COUNTABLE, props);
/** counter = 1;
* Helper method to get a set containing the node's type and all it's aspects }
* else
* @param nodeRef nodeRef {
* @return Set<QName> set of qname's Integer value = (Integer)this.nodeService.getProperty(nodeRef, PROP_COUNT);
*/ if (value != null)
protected Set<QName> getTypeAndApsects(NodeRef nodeRef) {
{ counter = value.intValue() + 1;
Set<QName> result = nodeService.getAspects(nodeRef); }
result.add(nodeService.getType(nodeRef)); else
return result; {
} counter = 1;
}
/** nodeService.setProperty(nodeRef, PROP_COUNT, counter);
* Helper method that executed work as system user.
* <p> }
* Useful when testing using mocks. return counter;
* }
* @param runAsWork work to execute as system user
* @return /**
*/ * Helper method to get a set containing the node's type and all it's aspects
public <R> R runAsSystem(RunAsWork<R> runAsWork) *
{ * @param nodeRef nodeRef
return AuthenticationUtil.runAsSystem(runAsWork); * @return Set<QName> set of qname's
} */
protected Set<QName> getTypeAndApsects(NodeRef nodeRef)
/** {
* Helper method that executed work as given user. Set<QName> result = nodeService.getAspects(nodeRef);
* <p> result.add(nodeService.getType(nodeRef));
* Useful when testing using mocks. return result;
* }
* @param runAsWork work to execute as given user
* @return /**
*/ * Helper method that executed work as system user.
public <R> R runAs(RunAsWork<R> runAsWork, String uid) * <p>
{ * Useful when testing using mocks.
return AuthenticationUtil.runAs(runAsWork, uid); *
} * @param runAsWork work to execute as system user
* @return
*/
public <R> R runAsSystem(RunAsWork<R> runAsWork)
{
return AuthenticationUtil.runAsSystem(runAsWork);
}
/**
* Helper method that executed work as given user.
* <p>
* Useful when testing using mocks.
*
* @param runAsWork work to execute as given user
* @return
*/
public <R> R runAs(RunAsWork<R> runAsWork, String uid)
{
return AuthenticationUtil.runAs(runAsWork, uid);
}
} }

View File

@@ -62,7 +62,6 @@ public class FreezeServiceImplTest extends BaseRMTestCase
// Freeze a record // Freeze a record
freezeService.freeze("FreezeReason", recordOne); freezeService.freeze("FreezeReason", recordOne);
assertTrue(freezeService.hasFrozenChildren(rmFolder));
// Check the hold exists // Check the hold exists
Set<NodeRef> holdAssocs = freezeService.getHolds(filePlan); Set<NodeRef> holdAssocs = freezeService.getHolds(filePlan);
@@ -192,7 +191,6 @@ public class FreezeServiceImplTest extends BaseRMTestCase
assertFalse(freezeService.isFrozen(recordTwo)); assertFalse(freezeService.isFrozen(recordTwo));
assertFalse(freezeService.isFrozen(recordThree)); assertFalse(freezeService.isFrozen(recordThree));
assertFalse(freezeService.isFrozen(recordFour)); assertFalse(freezeService.isFrozen(recordFour));
assertFalse(freezeService.hasFrozenChildren(rmFolder));
// Test freezing nodes, adding them to an existing hold // Test freezing nodes, adding them to an existing hold
NodeRef hold = freezeService.freeze("AnotherFreezeReason", recordFour); NodeRef hold = freezeService.freeze("AnotherFreezeReason", recordFour);
@@ -201,7 +199,6 @@ public class FreezeServiceImplTest extends BaseRMTestCase
nodes.add(recordTwo); nodes.add(recordTwo);
nodes.add(recordThree); nodes.add(recordThree);
freezeService.freeze(hold, nodes); freezeService.freeze(hold, nodes);
assertTrue(freezeService.hasFrozenChildren(rmFolder));
// Check the hold // Check the hold
holdAssocs = freezeService.getHolds(filePlan); holdAssocs = freezeService.getHolds(filePlan);
@@ -216,7 +213,6 @@ public class FreezeServiceImplTest extends BaseRMTestCase
assertFalse(freezeService.isFrozen(recordTwo)); assertFalse(freezeService.isFrozen(recordTwo));
assertFalse(freezeService.isFrozen(recordThree)); assertFalse(freezeService.isFrozen(recordThree));
assertFalse(freezeService.isFrozen(recordFour)); assertFalse(freezeService.isFrozen(recordFour));
assertFalse(freezeService.hasFrozenChildren(rmFolder));
return null; return null;
} }