diff --git a/.gitignore b/.gitignore index db2278ab66..b9745c75ff 100644 --- a/.gitignore +++ b/.gitignore @@ -39,3 +39,6 @@ test-output /rm-enterprise/rm-automation-enterprise/root rm-automation/src/test/resources/webdriver.properties + +/rm-community/rm-community-rest-api-explorer/overlays +/rm-enterprise/rm-enterprise-rest-api-explorer/overlays \ No newline at end of file diff --git a/rm-community/rm-community-repo/config/alfresco/module/org_alfresco_module_rm/rm-model-context.xml b/rm-community/rm-community-repo/config/alfresco/module/org_alfresco_module_rm/rm-model-context.xml index 2f4a58ab78..5165a872f7 100644 --- a/rm-community/rm-community-repo/config/alfresco/module/org_alfresco_module_rm/rm-model-context.xml +++ b/rm-community/rm-community-repo/config/alfresco/module/org_alfresco_module_rm/rm-model-context.xml @@ -76,7 +76,7 @@ - + diff --git a/rm-community/rm-community-repo/config/alfresco/module/org_alfresco_module_rm/rm-service-context.xml b/rm-community/rm-community-repo/config/alfresco/module/org_alfresco_module_rm/rm-service-context.xml index 6682d0a617..c2fd343d4b 100644 --- a/rm-community/rm-community-repo/config/alfresco/module/org_alfresco_module_rm/rm-service-context.xml +++ b/rm-community/rm-community-repo/config/alfresco/module/org_alfresco_module_rm/rm-service-context.xml @@ -1075,6 +1075,7 @@ + diff --git a/rm-community/rm-community-repo/source/java/org/alfresco/module/org_alfresco_module_rm/action/impl/DeclareRecordAction.java b/rm-community/rm-community-repo/source/java/org/alfresco/module/org_alfresco_module_rm/action/impl/DeclareRecordAction.java index 062929f92f..180ef6b895 100644 --- a/rm-community/rm-community-repo/source/java/org/alfresco/module/org_alfresco_module_rm/action/impl/DeclareRecordAction.java +++ b/rm-community/rm-community-repo/source/java/org/alfresco/module/org_alfresco_module_rm/action/impl/DeclareRecordAction.java @@ -27,7 +27,10 @@ package org.alfresco.module.org_alfresco_module_rm.action.impl; +import static org.alfresco.module.org_alfresco_module_rm.record.RecordUtils.generateRecordIdentifier; + import java.io.Serializable; +import java.text.MessageFormat; import java.util.ArrayList; import java.util.Date; import java.util.HashMap; @@ -35,8 +38,6 @@ import java.util.List; import java.util.Map; import java.util.Set; -import static org.alfresco.module.org_alfresco_module_rm.record.RecordUtils.generateRecordIdentifier; - import org.alfresco.module.org_alfresco_module_rm.action.RMActionExecuterAbstractBase; import org.alfresco.module.org_alfresco_module_rm.record.RecordServiceImpl; import org.alfresco.module.org_alfresco_module_rm.util.TransactionalResourceHelper; @@ -63,24 +64,24 @@ public class DeclareRecordAction extends RMActionExecuterAbstractBase { /** action name */ public static final String NAME = "declareRecord"; - + /** I18N */ private static final String MSG_UNDECLARED_ONLY_RECORDS = "rm.action.undeclared-only-records"; private static final String MSG_NO_DECLARE_MAND_PROP = "rm.action.no-declare-mand-prop"; /** Logger */ private static Log logger = LogFactory.getLog(DeclareRecordAction.class); - + /** check mandatory properties */ private boolean checkMandatoryPropertiesEnabled = true; - + /** transactional resource helper */ private TransactionalResourceHelper transactionalResourceHelper; /** * @param checkMandatoryPropertiesEnabled true if check mandatory properties is enabled, false otherwise */ - public void setCheckMandatoryPropertiesEnabled(boolean checkMandatoryPropertiesEnabled) + public void setCheckMandatoryPropertiesEnabled(boolean checkMandatoryPropertiesEnabled) { this.checkMandatoryPropertiesEnabled = checkMandatoryPropertiesEnabled; } @@ -112,16 +113,16 @@ public class DeclareRecordAction extends RMActionExecuterAbstractBase generateRecordIdentifier(getNodeService(), getIdentifierService(), actionedUponNodeRef); } - List missingProperties = new ArrayList(5); + List missingProperties = new ArrayList<>(5); // Aspect not already defined - check mandatory properties then add - if (!checkMandatoryPropertiesEnabled || + if (!checkMandatoryPropertiesEnabled || mandatoryPropertiesSet(actionedUponNodeRef, missingProperties)) { getRecordService().disablePropertyEditableCheck(); try { // Add the declared aspect - Map declaredProps = new HashMap(2); + Map declaredProps = new HashMap<>(2); declaredProps.put(PROP_DECLARED_AT, new Date()); declaredProps.put(PROP_DECLARED_BY, AuthenticationUtil.getRunAsUser()); this.getNodeService().addAspect(actionedUponNodeRef, ASPECT_DECLARED_RECORD, declaredProps); @@ -215,6 +216,34 @@ public class DeclareRecordAction extends RMActionExecuterAbstractBase } } + // check for missing mandatory metadata from custom aspect definitions + if (result) + { + QName aspect = ASPECT_RECORD; + if (nodeRefType.equals(TYPE_NON_ELECTRONIC_DOCUMENT)) + { + aspect = TYPE_NON_ELECTRONIC_DOCUMENT; + } + + // get customAspectImpl + String localName = aspect.toPrefixString(getNamespaceService()).replace(":", ""); + localName = MessageFormat.format("{0}CustomProperties", localName); + QName customAspect = QName.createQName(RM_CUSTOM_URI, localName); + + AspectDefinition aspectDef = this.getDictionaryService().getAspect(customAspect); + + for (PropertyDefinition propDef : aspectDef.getProperties().values()) + { + if (propDef.isMandatory() && nodeRefProps.get(propDef.getName()) == null) + { + logMissingProperty(propDef, missingProperties); + + result = false; + break; + } + } + } + return result; } diff --git a/rm-community/rm-community-repo/source/java/org/alfresco/module/org_alfresco_module_rm/model/rma/type/FilePlanType.java b/rm-community/rm-community-repo/source/java/org/alfresco/module/org_alfresco_module_rm/model/rma/type/FilePlanType.java index 1cef0b44e0..6ac9220c9d 100644 --- a/rm-community/rm-community-repo/source/java/org/alfresco/module/org_alfresco_module_rm/model/rma/type/FilePlanType.java +++ b/rm-community/rm-community-repo/source/java/org/alfresco/module/org_alfresco_module_rm/model/rma/type/FilePlanType.java @@ -85,7 +85,7 @@ public class FilePlanType extends BaseBehaviourBean /** * Unfiled Record Container Type behaviour bean */ - private UnfiledRecordContainerType unfilerRecordContainerType; + private UnfiledRecordContainerType unfiledRecordContainerType; /** * Transfer Container Type behaviour bean @@ -162,11 +162,11 @@ public class FilePlanType extends BaseBehaviourBean } /** - * @param unfilerRecordContainerType - unfiled record container type behaviour bean + * @param unfiledRecordContainerType - unfiled record container type behaviour bean */ - public void setUnfilerRecordContainerType(UnfiledRecordContainerType unfilerRecordContainerType) + public void setUnfiledRecordContainerType(UnfiledRecordContainerType unfiledRecordContainerType) { - this.unfilerRecordContainerType = unfilerRecordContainerType; + this.unfiledRecordContainerType = unfiledRecordContainerType; } /** @@ -273,7 +273,7 @@ public class FilePlanType extends BaseBehaviourBean ) public void onDeleteNode(ChildAssociationRef childAssocRef, boolean archived) { - unfilerRecordContainerType.enable(); + unfiledRecordContainerType.enable(); transferContainerType.enable(); holdContainerType.enable(); throw new IntegrityException("Operation failed. Deletion of File Plan is not allowed.", null); @@ -290,7 +290,7 @@ public class FilePlanType extends BaseBehaviourBean ) public void beforeDeleteNode(NodeRef nodeRef) { - unfilerRecordContainerType.disable(); + unfiledRecordContainerType.disable(); transferContainerType.disable(); holdContainerType.disable(); } @@ -305,7 +305,7 @@ public class FilePlanType extends BaseBehaviourBean { // tear down the file plan roles getFilePlanRoleService().tearDownFilePlanRoles(childAssocRef.getChildRef()); - unfilerRecordContainerType.enable(); + unfiledRecordContainerType.enable(); transferContainerType.enable(); holdContainerType.enable(); } diff --git a/rm-community/rm-community-repo/source/java/org/alfresco/module/org_alfresco_module_rm/record/RecordServiceImpl.java b/rm-community/rm-community-repo/source/java/org/alfresco/module/org_alfresco_module_rm/record/RecordServiceImpl.java index c286ae45ca..040768700e 100644 --- a/rm-community/rm-community-repo/source/java/org/alfresco/module/org_alfresco_module_rm/record/RecordServiceImpl.java +++ b/rm-community/rm-community-repo/source/java/org/alfresco/module/org_alfresco_module_rm/record/RecordServiceImpl.java @@ -80,6 +80,7 @@ import org.alfresco.module.org_alfresco_module_rm.version.RecordableVersionModel import org.alfresco.module.org_alfresco_module_rm.version.RecordableVersionService; import org.alfresco.repo.content.ContentServicePolicies; import org.alfresco.repo.node.NodeServicePolicies; +import org.alfresco.repo.node.integrity.IncompleteNodeTagger; import org.alfresco.repo.node.integrity.IntegrityException; import org.alfresco.repo.policy.ClassPolicyDelegate; import org.alfresco.repo.policy.PolicyComponent; @@ -272,6 +273,8 @@ public class RecordServiceImpl extends BaseBehaviourBean private ClassPolicyDelegate beforeRecordRejectionDelegate; private ClassPolicyDelegate onRecordRejectionDelegate; + private IncompleteNodeTagger incompleteNodeTagger; + /** * @param identifierService identifier service */ @@ -416,6 +419,11 @@ public class RecordServiceImpl extends BaseBehaviourBean this.recordableVersionService = recordableVersionService; } + public void setIncompleteNodeTagger(IncompleteNodeTagger incompleteNodeTagger) + { + this.incompleteNodeTagger = incompleteNodeTagger; + } + /** * Init method */ @@ -450,6 +458,7 @@ public class RecordServiceImpl extends BaseBehaviourBean if (nodeService.exists(nodeRef) && nodeService.hasAspect(nodeRef, ASPECT_RECORD)) { generateRecordIdentifier(nodeService, identifierService, nodeRef); + reevaluateIncompleteTag(nodeRef); } return null; } @@ -473,6 +482,7 @@ public class RecordServiceImpl extends BaseBehaviourBean if (ContentData.hasContent(contentData) && contentData.getSize() > 0) { appendIdentifierToName(nodeService, nodeRef); + reevaluateIncompleteTag(nodeRef); } } } @@ -1925,6 +1935,7 @@ public class RecordServiceImpl extends BaseBehaviourBean if (nodeService.exists(nodeRef) && !nodeService.hasAspect(nodeRef, ContentModel.ASPECT_HIDDEN) && !nodeService.hasAspect(nodeRef, ContentModel.ASPECT_LOCKABLE)) { generateRecordIdentifier(nodeService, identifierService, nodeRef); + reevaluateIncompleteTag(nodeRef); } } @@ -1983,4 +1994,22 @@ public class RecordServiceImpl extends BaseBehaviourBean OnRecordRejection policy = onRecordRejectionDelegate.get(qnames); policy.onRecordRejection(nodeRef); } + + /** + * RM-5244 - workaround to make sure the incomplete aspect is removed + * + * @param nodeRef the node to reevaluate for + */ + private void reevaluateIncompleteTag(NodeRef nodeRef) + { + /* + * Check if the node has the aspect because the reevaluation is expensive. + * If the node doesn't have the aspect it means IncompleteNodeTagger didn't load before TransactionBehaviourQueue + * and we don't need to reevaluate. + */ + if(nodeService.hasAspect(nodeRef, ContentModel.ASPECT_INCOMPLETE)) + { + incompleteNodeTagger.beforeCommit(false); + } + } } diff --git a/rm-community/rm-community-repo/test/java/org/alfresco/module/org_alfresco_module_rm/test/integration/record/CompleteRecordTest.java b/rm-community/rm-community-repo/test/java/org/alfresco/module/org_alfresco_module_rm/test/integration/record/CompleteRecordTest.java index dc31c9ba14..b73ecc6f78 100644 --- a/rm-community/rm-community-repo/test/java/org/alfresco/module/org_alfresco_module_rm/test/integration/record/CompleteRecordTest.java +++ b/rm-community/rm-community-repo/test/java/org/alfresco/module/org_alfresco_module_rm/test/integration/record/CompleteRecordTest.java @@ -33,210 +33,591 @@ import java.util.Map; import org.alfresco.module.org_alfresco_module_rm.action.RecordsManagementActionResult; import org.alfresco.module.org_alfresco_module_rm.action.impl.DeclareRecordAction; +import org.alfresco.module.org_alfresco_module_rm.model.RecordsManagementCustomModel; import org.alfresco.module.org_alfresco_module_rm.test.util.BaseRMTestCase; +import org.alfresco.service.cmr.dictionary.DataTypeDefinition; import org.alfresco.service.cmr.repository.NodeRef; import org.alfresco.service.namespace.QName; /** * Complete record tests. - * + * * @author Roy Wetherall * @since 2.2.1 */ public class CompleteRecordTest extends BaseRMTestCase -{ - private static final QName ASPECT_TEST = QName.createQName("http://www.alfresco.org/model/rmtest/1.0", "recordMetaDataWithProperty"); - private static final QName PROP_TEST = QName.createQName("http://www.alfresco.org/model/rmtest/1.0", "customMandatoryProperty"); - - /** complete record action */ - private DeclareRecordAction action; - - /** - * @see org.alfresco.module.org_alfresco_module_rm.test.util.BaseRMTestCase#initServices() - */ - @Override - protected void initServices() - { - super.initServices(); - - // get the action - action = (DeclareRecordAction)applicationContext.getBean("declareRecord"); - } - - /** - * @see org.alfresco.module.org_alfresco_module_rm.test.util.BaseRMTestCase#tearDownImpl() - */ - @Override - protected void tearDownImpl() - { - super.tearDownImpl(); - - // ensure action is returned to original state - action.setCheckMandatoryPropertiesEnabled(true); - } - - /** - * Given the the application is configured to check for mandatory values before complete - * And a filed record is missing mandatory values - * When I try to complete the record - * Then the missing properties parameter of the action will be populated - * And the record will not be complete - */ +{ + private static final QName ASPECT_TEST = QName.createQName("http://www.alfresco.org/model/rmtest/1.0", "recordMetaDataWithProperty"); + private static final QName PROP_TEST = QName.createQName("http://www.alfresco.org/model/rmtest/1.0", "customMandatoryProperty"); + private static final QName CUSTOM_ELECTRONIC_TEST = QName.createQName(RecordsManagementCustomModel.RM_CUSTOM_URI, "rmarecordCustomProperties"); + private static final QName CUSTOM_NON_ELECTRONIC_TEST = QName.createQName(RecordsManagementCustomModel.RM_CUSTOM_URI, "rmanonElectronicDocumentCustomProperties"); + private static final boolean MANDATORY_METADATA = true; + private static final boolean OPTIONAL_METADATA = false; + + /** + * complete record action + */ + private DeclareRecordAction action; + + /** + * @see org.alfresco.module.org_alfresco_module_rm.test.util.BaseRMTestCase#initServices() + */ + @Override + protected void initServices() + { + super.initServices(); + + // get the action + action = (DeclareRecordAction) applicationContext.getBean("declareRecord"); + } + + /** + * @see org.alfresco.module.org_alfresco_module_rm.test.util.BaseRMTestCase#tearDownImpl() + */ + @Override + protected void tearDownImpl() + { + super.tearDownImpl(); + + // ensure action is returned to original state + action.setCheckMandatoryPropertiesEnabled(true); + } + + /** + * Given the the application is configured to check for mandatory values before complete + * And a filed record is missing mandatory values + * When I try to complete the record + * Then the missing properties parameter of the action will be populated + * And the record will not be complete + */ public void testCheckForMandatoryValuesMissing() throws Exception { doBehaviourDrivenTest(new BehaviourDrivenTest() - { - private NodeRef record; - private RecordsManagementActionResult result; - + { + private NodeRef record; + private RecordsManagementActionResult result; + public void given() { - // enable mandatory parameter check - action.setCheckMandatoryPropertiesEnabled(true); - - // create a record - record = utils.createRecord(rmFolder, "record.txt", "title"); - - // add the record aspect (that has a mandatory property) - nodeService.addAspect(record, ASPECT_TEST, null); + // enable mandatory parameter check + action.setCheckMandatoryPropertiesEnabled(true); + + // create a record + record = utils.createRecord(rmFolder, "record.txt", "title"); + + // add the record aspect (that has a mandatory property) + nodeService.addAspect(record, ASPECT_TEST, null); } - + public void when() { - // complete record - result = rmActionService.executeRecordsManagementAction(record, "declareRecord"); + // complete record + result = rmActionService.executeRecordsManagementAction(record, "declareRecord"); } - - public void then() + + public void then() { - assertNotNull(result); - assertNotNull(result.getValue()); - assertFalse(nodeService.hasAspect(record, ASPECT_DECLARED_RECORD)); + assertNotNull(result); + assertNotNull(result.getValue()); + assertFalse(nodeService.hasAspect(record, ASPECT_DECLARED_RECORD)); } - }); + }); } - + /** - * Given the the application is configured to check for mandatory values before complete - * And a filed record has all mandatory values - * When I try to complete the record - * Then the record is completed - */ + * Given the the application is configured to check for mandatory values before complete + * And a filed record has all mandatory values + * When I try to complete the record + * Then the record is completed + */ public void testCheckForMandatoryValuePresent() throws Exception { doBehaviourDrivenTest(new BehaviourDrivenTest() - { - private NodeRef record; - private RecordsManagementActionResult result; - + { + private NodeRef record; + private RecordsManagementActionResult result; + public void given() { - // enable mandatory parameter check - action.setCheckMandatoryPropertiesEnabled(true); - - // create a record - record = utils.createRecord(rmFolder, "record.txt", "title"); - - // add the record aspect (that has a mandatory property) - Map properties = new HashMap(1); - properties.put(PROP_TEST, "something"); - nodeService.addAspect(record, ASPECT_TEST, properties); + // enable mandatory parameter check + action.setCheckMandatoryPropertiesEnabled(true); + + // create a record + record = utils.createRecord(rmFolder, "record.txt", "title"); + + // add the record aspect (that has a mandatory property) + Map properties = new HashMap<>(1); + properties.put(PROP_TEST, "something"); + nodeService.addAspect(record, ASPECT_TEST, properties); } - + public void when() { - // complete record - result = rmActionService.executeRecordsManagementAction(record, "declareRecord"); + // complete record + result = rmActionService.executeRecordsManagementAction(record, "declareRecord"); } - - public void then() + + public void then() { - assertNotNull(result); - assertNull(result.getValue()); - assertTrue(nodeService.hasAspect(record, ASPECT_DECLARED_RECORD)); + assertNotNull(result); + assertNull(result.getValue()); + assertTrue(nodeService.hasAspect(record, ASPECT_DECLARED_RECORD)); } - }); + }); } - + /** - * Given the the application is configured not to check for mandatory values before complete - * And a filed record is missing mandatory values - * When I try to complete the record - * Then the record is completed - */ + * Given the the application is configured to check for mandatory values before complete + * And a filed record is missing custom mandatory values + * When I try to complete the record + * Then the missing properties parameter of the action will be populated + * And the record will not be complete + */ + public void testCheckForCustomMandatoryValuesMissing() throws Exception + { + doBehaviourDrivenTest(new BehaviourDrivenTest() + { + private NodeRef record; + private RecordsManagementActionResult result; + + public void given() throws Exception + { + // enable mandatory parameter check + action.setCheckMandatoryPropertiesEnabled(true); + + // create the custom metadata definition (that has a mandatory property) for electronic records + defineCustomMetadata(CUSTOM_ELECTRONIC_TEST, ASPECT_RECORD, MANDATORY_METADATA); + + // create an electronic record + record = utils.createRecord(rmFolder, "electronicRecord.txt", "title"); + } + + public void when() + { + // complete record + result = rmActionService.executeRecordsManagementAction(record, "declareRecord"); + } + + public void then() + { + assertNotNull(result); + assertNotNull(result.getValue()); + assertFalse(nodeService.hasAspect(record, ASPECT_DECLARED_RECORD)); + } + + public void after() + { + // remove the custom metadata definition + removeCustomMetadata(CUSTOM_ELECTRONIC_TEST); + } + }); + } + + /** + * Given the the application is configured to check for mandatory values before complete + * And a filed record has all custom mandatory values + * When I try to complete the record + * Then the record is completed + */ + public void testCheckForCustomMandatoryValuePresent() throws Exception + { + doBehaviourDrivenTest(new BehaviourDrivenTest() + { + private NodeRef record; + private RecordsManagementActionResult result; + + public void given() throws Exception + { + // enable mandatory parameter check + action.setCheckMandatoryPropertiesEnabled(true); + + // define the custom metadata definition (that has a mandatory property) + defineCustomMetadata(CUSTOM_ELECTRONIC_TEST, ASPECT_RECORD, MANDATORY_METADATA); + + // create a record + record = utils.createRecord(rmFolder, "customrecord.txt", "title"); + + // populate the custom metadata mandatory property for the record + populateCustomMetadata(record, CUSTOM_ELECTRONIC_TEST); + } + + public void when() + { + // complete record + result = rmActionService.executeRecordsManagementAction(record, "declareRecord"); + } + + public void then() + { + assertNotNull(result); + assertNull(result.getValue()); + assertTrue(nodeService.hasAspect(record, ASPECT_DECLARED_RECORD)); + } + + public void after() + { + // remove the custom metadata definition + removeCustomMetadata(CUSTOM_ELECTRONIC_TEST); + } + }); + } + + /** + * Given the the application is configured to check for mandatory values before complete + * And a non-electronic record is missing custom mandatory values + * When I try to complete the record + * Then the missing properties parameter of the action will be populated + * And the record will not be complete + */ + public void testCheckForCustomMandatoryValuesMissingInNonElectronicRecord() throws Exception + { + doBehaviourDrivenTest(new BehaviourDrivenTest() + { + private NodeRef nonElectronicRecord; + private RecordsManagementActionResult result; + + public void given() throws Exception + { + // enable mandatory parameter check + action.setCheckMandatoryPropertiesEnabled(true); + + // create the custom metadata definition (that has a mandatory property) for non-electronic records + defineCustomMetadata(CUSTOM_NON_ELECTRONIC_TEST, TYPE_NON_ELECTRONIC_DOCUMENT, MANDATORY_METADATA); + + // create a non-electronic record + nonElectronicRecord = utils.createNonElectronicRecord(rmFolder, "non-electronicRecord.txt", "title"); + } + + public void when() + { + // complete non-electronic record + result = rmActionService.executeRecordsManagementAction(nonElectronicRecord, + "declareRecord"); + } + + public void then() + { + assertNotNull(result); + assertNotNull(result.getValue()); + assertFalse(nodeService.hasAspect(nonElectronicRecord, ASPECT_DECLARED_RECORD)); + } + + public void after() + { + // remove the custom metadata definition + removeCustomMetadata(CUSTOM_NON_ELECTRONIC_TEST); + } + }); + } + + /** + * Given the the application is configured to check for mandatory values before complete + * And a non-electronic record has all custom mandatory values + * When I try to complete the record + * Then the record is completed + */ + public void testCheckForCustomMandatoryValuePresentInNonElectronicRecord() throws Exception + { + doBehaviourDrivenTest(new BehaviourDrivenTest() + { + private NodeRef nonElectronicRecord; + private RecordsManagementActionResult result; + + public void given() throws Exception + { + // enable mandatory parameter check + action.setCheckMandatoryPropertiesEnabled(true); + + // create the custom metadata definition (that has a mandatory property) + defineCustomMetadata(CUSTOM_NON_ELECTRONIC_TEST, TYPE_NON_ELECTRONIC_DOCUMENT, MANDATORY_METADATA); + + // create a non-electronic record + nonElectronicRecord = utils.createNonElectronicRecord(rmFolder, "non-electronicRecord.txt", "title"); + + // populate the custom metadata mandatory property for the record + populateCustomMetadata(nonElectronicRecord, CUSTOM_NON_ELECTRONIC_TEST); + } + + public void when() + { + // complete record + result = rmActionService.executeRecordsManagementAction(nonElectronicRecord, "declareRecord"); + } + + public void then() + { + assertNotNull(result); + assertNull(result.getValue()); + assertTrue(nodeService.hasAspect(nonElectronicRecord, ASPECT_DECLARED_RECORD)); + } + + public void after() + { + // remove the custom metadata definition + removeCustomMetadata(CUSTOM_NON_ELECTRONIC_TEST); + } + }); + } + + /** + * Given the the application is configured to check for mandatory values before complete + * And a filed record is missing custom non-mandatory values + * When I try to complete the record + * Then the record is completed + */ + public void testCheckForCustomOptionalValuesMissing() throws Exception + { + doBehaviourDrivenTest(new BehaviourDrivenTest() + { + private NodeRef record; + private RecordsManagementActionResult result; + + public void given() throws Exception + { + // enable mandatory parameter check + action.setCheckMandatoryPropertiesEnabled(true); + + // create the custom metadata definition (that does not have a mandatory property) + defineCustomMetadata(CUSTOM_ELECTRONIC_TEST, ASPECT_RECORD, OPTIONAL_METADATA); + + // create a record + record = utils.createRecord(rmFolder, "customrecord.txt", "title"); + } + + public void when() + { + // complete record + result = rmActionService.executeRecordsManagementAction(record, "declareRecord"); + } + + public void then() + { + assertNotNull(result); + assertNull(result.getValue()); + assertTrue(nodeService.hasAspect(record, ASPECT_DECLARED_RECORD)); + } + + public void after() + { + // remove the custom metadata definition + removeCustomMetadata(CUSTOM_ELECTRONIC_TEST); + } + }); + } + + /** + * Given the the application is configured to check for mandatory values before complete + * And custom mandatory metadata is required for electronic records + * And a non-electronic record has no custom mandatory values + * When I try to complete the non-electronic record + * Then the record is completed + */ + public void testElectronicRecordCustomMandatoryNotAppliedToNonElectronicRecord() throws Exception + { + doBehaviourDrivenTest(new BehaviourDrivenTest() + { + private NodeRef nonElectronicRecord; + private RecordsManagementActionResult result; + + public void given() throws Exception + { + // enable mandatory parameter check + action.setCheckMandatoryPropertiesEnabled(true); + + // create the record custom metadata definition (that has a mandatory property) + defineCustomMetadata(CUSTOM_ELECTRONIC_TEST, ASPECT_RECORD, MANDATORY_METADATA); + + // create a non-electronic record + nonElectronicRecord = utils.createNonElectronicRecord(rmFolder, "non-electronicRecord.txt", "title"); + } + + public void when() + { + // complete record + result = rmActionService.executeRecordsManagementAction(nonElectronicRecord, "declareRecord"); + } + + public void then() + { + assertNotNull(result); + assertNull(result.getValue()); + assertTrue(nodeService.hasAspect(nonElectronicRecord, ASPECT_DECLARED_RECORD)); + } + + public void after() + { + // remove the custom metadata definition + removeCustomMetadata(CUSTOM_ELECTRONIC_TEST); + } + }); + } + + /** + * Given the the application is configured to check for mandatory values before complete + * And custom mandatory metadata is required for non-electronic records + * And an electronic record has no custom mandatory values + * When I try to complete the electronic record + * Then the record is completed + */ + public void testNonElectronicRecordCustomMandatoryNotAppliedToElectronicRecord() throws Exception + { + doBehaviourDrivenTest(new BehaviourDrivenTest() + { + private NodeRef record; + private RecordsManagementActionResult result; + + public void given() throws Exception + { + // enable mandatory parameter check + action.setCheckMandatoryPropertiesEnabled(true); + + // create the non-electronic record custom metadata definition (that has a mandatory property) + defineCustomMetadata(CUSTOM_NON_ELECTRONIC_TEST, TYPE_NON_ELECTRONIC_DOCUMENT, MANDATORY_METADATA); + + // create a electronic record + record = utils.createRecord(rmFolder, "electronicRecord.txt", "title"); + } + + public void when() + { + // complete record + result = rmActionService.executeRecordsManagementAction(record, "declareRecord"); + } + + public void then() + { + assertNotNull(result); + assertNull(result.getValue()); + assertTrue(nodeService.hasAspect(record, ASPECT_DECLARED_RECORD)); + } + + public void after() + { + // remove the custom metadata definition + removeCustomMetadata(CUSTOM_NON_ELECTRONIC_TEST); + } + }); + } + + /** + * Given the the application is configured not to check for mandatory values before complete + * And a filed record is missing mandatory values + * When I try to complete the record + * Then the record is completed + */ public void testDontCheckForMandatoryValuesMissing() throws Exception { doBehaviourDrivenTest(new BehaviourDrivenTest() - { - private NodeRef record; - private RecordsManagementActionResult result; - + { + private NodeRef record; + private RecordsManagementActionResult result; + public void given() { - // disable mandatory parameter check - action.setCheckMandatoryPropertiesEnabled(false); - - // create a record - record = utils.createRecord(rmFolder, "record.txt", "title"); - - // add the record aspect (that has a mandatory property) - nodeService.addAspect(record, ASPECT_TEST, null); + // disable mandatory parameter check + action.setCheckMandatoryPropertiesEnabled(false); + + // create a record + record = utils.createRecord(rmFolder, "record.txt", "title"); + + // add the record aspect (that has a mandatory property) + nodeService.addAspect(record, ASPECT_TEST, null); } - + public void when() { - // complete record - result = rmActionService.executeRecordsManagementAction(record, "declareRecord"); + // complete record + result = rmActionService.executeRecordsManagementAction(record, "declareRecord"); } - - public void then() + + public void then() { - assertNotNull(result); - assertNull(result.getValue()); - assertTrue(nodeService.hasAspect(record, ASPECT_DECLARED_RECORD)); + assertNotNull(result); + assertNull(result.getValue()); + assertTrue(nodeService.hasAspect(record, ASPECT_DECLARED_RECORD)); } - }); + }); } - + /** - * Given the the application is configured to not to check for mandatory values before complete - * And a filed record has all mandatory values - * When I try to complete the record - * Then the record is completed - */ + * Given the the application is configured to not to check for mandatory values before complete + * And a filed record has all mandatory values + * When I try to complete the record + * Then the record is completed + */ public void testDontCheckForMandatoryValuePresent() throws Exception { doBehaviourDrivenTest(new BehaviourDrivenTest() - { - private NodeRef record; - private RecordsManagementActionResult result; - + { + private NodeRef record; + private RecordsManagementActionResult result; + public void given() { - // enable mandatory parameter check - action.setCheckMandatoryPropertiesEnabled(false); - - // create a record - record = utils.createRecord(rmFolder, "record.txt", "title"); - - // add the record aspect (that has a mandatory property) - Map properties = new HashMap(1); - properties.put(PROP_TEST, "something"); - nodeService.addAspect(record, ASPECT_TEST, properties); + // enable mandatory parameter check + action.setCheckMandatoryPropertiesEnabled(false); + + // create a record + record = utils.createRecord(rmFolder, "record.txt", "title"); + + // add the record aspect (that has a mandatory property) + Map properties = new HashMap<>(1); + properties.put(PROP_TEST, "something"); + nodeService.addAspect(record, ASPECT_TEST, properties); } - + public void when() { - // complete record - result = rmActionService.executeRecordsManagementAction(record, "declareRecord"); + // complete record + result = rmActionService.executeRecordsManagementAction(record, "declareRecord"); } - - public void then() + + public void then() { - assertNotNull(result); - assertNull(result.getValue()); - assertTrue(nodeService.hasAspect(record, ASPECT_DECLARED_RECORD)); + assertNotNull(result); + assertNull(result.getValue()); + assertTrue(nodeService.hasAspect(record, ASPECT_DECLARED_RECORD)); } - }); + }); + } + + /** + * Helper method to create a Custom Metadata definition in the RM custom model + * + * @param mandatory specifies if metadata is mandatory + */ + private void defineCustomMetadata(QName propId, QName typeName, boolean mandatory) throws Exception + { + rmAdminService.addCustomPropertyDefinition( + propId, + typeName, + "SomeCustomDefLabel", + DataTypeDefinition.TEXT, + null, + null, + null, + false, + mandatory, + false, + null + ); + } + + /** + * Helper method to populate the Custom Metadata for the record + */ + private void populateCustomMetadata(NodeRef record, QName propId) + { + Map properties = new HashMap<>(1); + properties.put(propId, "SomeCustomValue"); + nodeService.addAspect(record, propId, properties); + } + + /** + * Helper method to remove the Custom Metadata definition in the RM custom model + */ + private void removeCustomMetadata(QName propId) + { + rmAdminService.removeCustomPropertyDefinition(propId); } } diff --git a/rm-community/rm-community-repo/test/java/org/alfresco/module/org_alfresco_module_rm/test/util/CommonRMTestUtils.java b/rm-community/rm-community-repo/test/java/org/alfresco/module/org_alfresco_module_rm/test/util/CommonRMTestUtils.java index 456a4637fe..59fe3d7f06 100644 --- a/rm-community/rm-community-repo/test/java/org/alfresco/module/org_alfresco_module_rm/test/util/CommonRMTestUtils.java +++ b/rm-community/rm-community-repo/test/java/org/alfresco/module/org_alfresco_module_rm/test/util/CommonRMTestUtils.java @@ -301,6 +301,29 @@ public class CommonRMTestUtils implements RecordsManagementModel return record; } + /** + * Helper method to create a non-electronic record in a record folder. + * + * @param recordFolder record folder + * @param name name of the non-electronic record + * @param title title of the non-electronic record + * @return {@link NodeRef} non-electronic record node reference + */ + public NodeRef createNonElectronicRecord(NodeRef recordFolder, String name, String title) + { + Map props = new HashMap(1); + props.put(ContentModel.PROP_TITLE, title); + props.put(ContentModel.PROP_NAME, name); + + // Create the document + NodeRef record = nodeService.createNode(recordFolder, + ContentModel.ASSOC_CONTAINS, + QName.createQName(NamespaceService.CONTENT_MODEL_1_0_URI, name), + RecordsManagementModel.TYPE_NON_ELECTRONIC_DOCUMENT, + props).getChildRef(); + return record; + } + /** * Helper method to complete record. */ diff --git a/rm-community/rm-community-rest-api-explorer/src/main/webapp/definitions/gs-core-api.yaml b/rm-community/rm-community-rest-api-explorer/src/main/webapp/definitions/gs-core-api.yaml index d4fc3b5d81..a9a7e3f9a7 100644 --- a/rm-community/rm-community-rest-api-explorer/src/main/webapp/definitions/gs-core-api.yaml +++ b/rm-community/rm-community-rest-api-explorer/src/main/webapp/definitions/gs-core-api.yaml @@ -25,7 +25,7 @@ tags: - name: record-folders description: Retrieve and manage record folders - name: gs-sites - description: Retrieve and manage the RM site + description: Retrieve and manage the Records Management site - name: records description: Perform record specific operations - name: files @@ -44,18 +44,18 @@ paths: post: tags: - gs-sites - summary: Create the RM site + summary: Create the Records Management (RM) site description: | - **Note:** this endpoint is available in RM 2.6 and newer versions. + **Note:** this endpoint is available in Records Management 2.6 and newer versions. Creates the RM site with the given details. **Note:** the id of a site cannot be updated once the site has been created. - For example, to create the RM site named "Records Management Title" with "Records Management Description" as description, the following body could be used: + For example, to create an RM site named "Records Management" with "Records Management Description" as description, the following body could be used: ```JSON { - "title": "Records Management Title", + "title": "Records Management", "description": "Records Management Description" } ``` @@ -100,9 +100,9 @@ paths: get: tags: - gs-sites - summary: Get the RM site + summary: Get the Records Management (RM) site description: | - **Note:** this endpoint is available in RM 2.6 and newer versions. + **Note:** this endpoint is available in Records Management 2.6 and newer versions. Gets information for RM site. @@ -118,7 +118,7 @@ paths: $ref: '#/definitions/RMSiteEntry' '400': description: | - Invalid parameter: GET request is suported only for the RM site + Invalid parameter: GET request is only supported for the RM site '401': description: Authentication failed '404': @@ -131,9 +131,9 @@ paths: delete: tags: - gs-sites - summary: Delete the RM site + summary: Delete the Records Management (RM) site description: | - **Note:** this endpoint is available in RM 2.6 and newer versions. + **Note:** this endpoint is available in Records Management 2.6 and newer versions. Deletes the RM site. operationId: deleteRMSite @@ -144,7 +144,7 @@ paths: description: Successful response '400': description: | - Invalid parameter: DELETE request is suported only for the RM site + Invalid parameter: DELETE request is only supported for the RM site '401': description: Authentication failed '403': @@ -159,14 +159,13 @@ paths: put: tags: - gs-sites - summary: Update the RM site + summary: Update the Records Management (RM) site description: | - **Note:** this endpoint is available in RM 2.6 and newer versions. + **Note:** this endpoint is available in Records Management 2.6 and newer versions. - Update the details for the RM site. Site Manager or otherwise a - (site) admin can update title or description. + Update the details for the RM site. Site Manager or other (site) admin can update title or description. - **Note**: the id, site visibility or compliance of the RM site cannot be updated once the RM site has been created. + **Note**: the id, site visibility, or compliance of the RM site cannot be updated once the site has been created. operationId: updateRMSite produces: @@ -205,9 +204,9 @@ paths: - file-plans summary: Get a file plan description: | - Get information for file plan **filePlanId** + Gets information for file plan **filePlanId** - Besides mandatory fields the file plan's aspects and properties are returned by default. + Mandatory fields and the file plan's aspects and properties are returned by default. You can use the **include** parameter (include=allowableOperations) to return additional information. operationId: getFilePlan @@ -226,11 +225,11 @@ paths: description: | Invalid parameter: **filePlanId** is not a valid format '401': - description: If authentication fails + description: Authentication failed '403': - description: If current user does not have permission to read **filePlanId** + description: Current user does not have permission to read **filePlanId** '404': - description: If **filePlanId** does not exist + description: "**filePlanId** does not exist" default: description: Unexpected error schema: @@ -275,13 +274,13 @@ paths: description: | Invalid parameter: The update request is invalid or **filePlanId** is not a valid format or **filePlanBodyUpdate** is invalid '401': - description: If authentication fails + description: Authentication failed '403': description: If current user does not have permission to update **filePlanId** '404': - description: If **filePlanId** does not exist + description: "**filePlanId** does not exist" '409': - description: If the updated name clashes with an existing fileplan + description: Updated name clashes with an existing fileplan '422': description: Model integrity exception, including file name with invalid characters default: @@ -316,11 +315,11 @@ paths: schema: $ref: '#/definitions/RecordCategoryPaging' '401': - description: If authentication fails + description: Authentication failed '403': - description: If current user does not have permission to read **filePlanId** + description: Current user does not have permission to read **filePlanId** '404': - description: If **filePlanId** does not exist + description: "**filePlanId** does not exist" default: description: Unexpected error schema: @@ -328,9 +327,9 @@ paths: post: tags: - file-plans - summary: Create record categories for given file plan + summary: Create record categories for a file plan description: | - Create a record category as a primary child of **filePlanId**. + Creates a record category as a primary child of **filePlanId**. You can set the **autoRename** boolean field to automatically resolve name clashes. If there is a name clash, then the API method tries to create @@ -413,13 +412,13 @@ paths: description: | Invalid parameter: **filePlanId** is not a valid format or **filePlanId** is invalid '401': - description: If authentication fails + description: Authentication failed '403': - description: If current user does not have permission to add children to **filePlanId** + description: Current user does not have permission to add children to **filePlanId** '404': - description: If **filePlanId** does not exist + description: "**filePlanId** does not exist" '409': - description: If new name clashes with an existing node in the current parent container + description: New name clashes with an existing node in the current parent container '422': description: Model integrity exception, including node name with invalid characters ## Unfiled records containers @@ -429,9 +428,9 @@ paths: - unfiled-containers summary: Get the unfiled records container description: | - Get information for unfiled records contianer **unfiledContainerId** + Gets information for unfiled records container **unfiledContainerId** - Besides mandatory fields the unfiled records container's aspects and properties are returned by default. + Mandatory fields and the unfiled records container's aspects and properties are returned by default. You can use the **include** parameter (include=allowableOperations) to return additional information. operationId: getUnfiledContainer @@ -450,11 +449,11 @@ paths: description: | Invalid parameter: **unfiledContainerId** is not a valid format '401': - description: If authentication fails + description: Authentication failed '403': - description: If current user does not have permission to read **unfiledContainerId** + description: Current user does not have permission to read **unfiledContainerId** '404': - description: If **unfiledContainerId** does not exist + description: "**unfiledContainerId** does not exist" default: description: Unexpected error schema: @@ -504,13 +503,13 @@ paths: description: | Invalid parameter: The update request is invalid or **unfiledContainerId** is not a valid format or **unfiledContainerBodyUpdate** is invalid '401': - description: If authentication fails + description: Authentication failed '403': - description: If current user does not have permission to update **unfiledContainerId** + description: Current user does not have permission to update **unfiledContainerId** '404': - description: If **unfiledContainerId** does not exist + description: "**unfiledContainerId** does not exist" '409': - description: If the updated name clashes with an existing root category of special container in the current fileplan + description: Updated name clashes with an existing root category of special container in the current fileplan '422': description: Model integrity exception, including file name with invalid characters default: @@ -545,11 +544,11 @@ paths: schema: $ref: '#/definitions/UnfiledContainerAssociationPaging' '401': - description: If authentication fails + description: Authentication failed '403': - description: If current user does not have permission to read **unfiledContainerId** + description: Current user does not have permission to read **unfiledContainerId** '404': - description: If **unfiledContainerId** does not exist + description: "**unfiledContainerId** does not exist" default: description: Unexpected error schema: @@ -559,7 +558,7 @@ paths: - unfiled-containers summary: Create a record or an unfiled record folder description: | - Create a record or an unfiled record folder as a primary child of **unfiledContainerId**. + Creates a record or an unfiled record folder as a primary child of **unfiledContainerId**. You can set the **autoRename** boolean field to automatically resolve name clashes. If there is a name clash, then the API method tries to create a unique name using an integer suffix. @@ -702,7 +701,7 @@ paths: - unfiled-record-folders summary: Get the unfiled record folder description: | - Get information for unfiled record folder id **unfiledRecordFolderId** + Gets information for unfiled record folder id **unfiledRecordFolderId** Mandatory fields and the unfiled record folder's aspects and properties are returned by default. @@ -798,7 +797,7 @@ paths: - unfiled-record-folders summary : Delete an unfiled record folder description: | - Deletes unfiled record folder **unfiledRecordFolderId**. + Deletes the unfiled record folder **unfiledRecordFolderId**. operationId: deleteUnfiledRecordFolder parameters: - $ref: '#/parameters/unfiledRecordFolderIdParam' @@ -851,11 +850,11 @@ paths: schema: $ref: '#/definitions/UnfiledRecordFolderAssociationPaging' '401': - description: If authentication fails + description: Authentication failed '403': - description: If current user does not have permission to read **unfiledRecordFolderId** + description: Current user does not have permission to read **unfiledRecordFolderId** '404': - description: If **unfiledRecordFolderId** does not exist + description: "**unfiledRecordFolderId** does not exist" default: description: Unexpected error schema: @@ -902,7 +901,7 @@ paths: } ``` - You can create an empty electronic record: + You can create an empty electronic record like this: ```JSON { "name":"My Electronic Record", @@ -992,13 +991,13 @@ paths: description: | Invalid parameter: **unfiledRecordFolderId** is not a valid format or **unfiledRecordFolderId** is invalid '401': - description: If authentication fails + description: Authentication failed '403': - description: If current user does not have permission to add children to **unfiledRecordFolderId** + description: Current user does not have permission to add children to **unfiledRecordFolderId** '404': - description: If **unfiledRecordFolderId** does not exist + description: "**unfiledRecordFolderId** does not exist" '409': - description: If new name clashes with an existing node in the current parent container + description: New name clashes with an existing node in the current parent container '422': description: Model integrity exception, including node name with invalid characters ## Record categories @@ -1008,9 +1007,9 @@ paths: - record-categories summary: Get a record category description: | - Get information for record category **recordCategoryId** + Gets information for record category **recordCategoryId** - Besides mandatory fields the record category's aspects and properties are returned by default. + Mandatory fields and the record category's aspects and properties are returned by default. You can use the **include** parameter (include=allowableOperations) to return additional information. operationId: getRecordCategory @@ -1030,11 +1029,11 @@ paths: description: | Invalid parameter: **recordCategoryId** is not a valid format '401': - description: If authentication fails + description: Authentication failed '403': - description: If current user does not have permission to read **recordCategoryId** + description: Current user does not have permission to read **recordCategoryId** '404': - description: If **recordCategoryId** does not exist + description: "**recordCategoryId** does not exist" default: description: Unexpected error schema: @@ -1158,7 +1157,7 @@ paths: schema: $ref: '#/definitions/RecordCategoryChildPaging' '401': - description: Authentication fails + description: Authentication failed '403': description: Current user does not have permission to read **recordCategoryId** '404': @@ -1294,7 +1293,7 @@ paths: description: | Invalid parameter: **recordCategoryId** is not a valid format or **nodeBodyCreate** is invalid '401': - description: Authentication fails + description: Authentication failed '403': description: Current user does not have permission to add children to **recordCategoryId** '404': @@ -1310,9 +1309,9 @@ paths: - record-folders summary: Get a record folder description: | - Get information for record folder **recordFolderId** + Gets information for record folder **recordFolderId** - Besides mandatory fields the record folder's aspects and properties are returned by default. + Mandatory fields and the record folder's aspects and properties are returned by default. You can use the **include** parameter (include=allowableOperations) to return additional information. operationId: getRecordFolder @@ -1434,7 +1433,7 @@ paths: - record-folders summary: List records description: | - Returns a list of records. + Gets a list of records. Minimal information for each record is returned by default. @@ -1601,7 +1600,7 @@ paths: - records summary: Get a record description: | - Get information for record **recordId** + Gets information for record **recordId** Mandatory fields and the record's aspects and properties are returned by default. @@ -1622,7 +1621,7 @@ paths: description: | Invalid parameter: **recordId** is not a valid format '401': - description: Authentication fails + description: Authentication failed '403': description: Current user does not have permission to read **recordId** '404': @@ -1708,7 +1707,7 @@ paths: description: | Invalid parameter: **recordId** is not a valid format '401': - description: Authentication fails + description: Authentication failed '403': description: Current user does not have permission to delete **recordId** '404': @@ -1806,7 +1805,7 @@ paths: tags: - files summary: Declare as record - description: Declares the file **fileId** in the unfiled record container. + description: Declares the file **fileId** in the unfiled records container. operationId: declareRecord parameters: - name: fileId @@ -1854,7 +1853,7 @@ paths: - transfer-containers summary: Get a transfer container description: | - Get information for transfer container **transferContainerId** + Gets information for transfer container **transferContainerId** Mandatory fields and the transfer container's aspects and properties are returned by default. @@ -1875,11 +1874,11 @@ paths: description: | Invalid parameter: **transferContainerId** is not a valid format '401': - description: If authentication fails + description: Authentication failed '403': - description: If current user does not have permission to read **transferContainerId** + description: Current user does not have permission to read **transferContainerId** '404': - description: If **transferContainerId** does not exist + description: "**transferContainerId** does not exist" default: description: Unexpected error schema: @@ -1928,13 +1927,13 @@ paths: description: | Invalid parameter: the update request is invalid or **transferContainerId** is not a valid format or **nodeBody** is invalid '401': - description: If authentication fails + description: Authentication failed '403': - description: If current user does not have permission to update **transferContainerId** + description: Current user does not have permission to update **transferContainerId** '404': - description: If **transferContainerId** does not exist + description: "**transferContainerId** does not exist" '409': - description: If the updated name clashes with an existing node in the current parent folder + description: Updated name clashes with an existing node in the current parent folder '422': description: Model integrity exception, including transfer container name with invalid characters default: @@ -1968,11 +1967,11 @@ paths: schema: $ref: '#/definitions/TransferContainerAssociationPaging' '401': - description: If authentication fails + description: Authentication failed '403': - description: If current user does not have permission to read **transferContainerId** + description: Current user does not have permission to read **transferContainerId** '404': - description: If **transferContainerId** does not exist + description: "**transferContainerId** does not exist" default: description: Unexpected error schema: @@ -1984,9 +1983,9 @@ paths: - transfers summary: Get a transfer description: | - Get information for transfer **transferId** + Gets information for transfer **transferId** - Besides mandatory fields the transfer's aspects and properties are returned by default. + Mandatory fields and the transfer's aspects and properties are returned by default. You can use the **include** parameter (include=allowableOperations) to return additional information. operationId: getTransfer @@ -2005,11 +2004,11 @@ paths: description: | Invalid parameter: **transferId** is not a valid format '401': - description: If authentication fails + description: Authentication failed '403': - description: If current user does not have permission to read **transferId** + description: Current user does not have permission to read **transferId** '404': - description: If **transferId** does not exist + description: "**transferId** does not exist" default: description: Unexpected error schema: @@ -2020,7 +2019,7 @@ paths: - transfers summary: List transfer's children description: | - Returns a list of transfer's children. + Gets a list of transfer's children. Minimal information for each child is returned by default. @@ -2041,11 +2040,11 @@ paths: schema: $ref: '#/definitions/TransferAssociationPaging' '401': - description: If authentication fails + description: Authentication failed '403': - description: If current user does not have permission to read **transferId** + description: Current user does not have permission to read **transferId** '404': - description: If **transferId** does not exist + description: "**transferId** does not exist" default: description: Unexpected error schema: @@ -2088,7 +2087,7 @@ parameters: filePlanIncludeSourceParam: name: includeSource in: query - description: Also include **source** in addition to **entries** with folder information on the parent node – the specified parent **filePlanId** + description: Also include **source** (in addition to **entries**) with folder information on the parent node – the specified parent **filePlanId** required: false type: boolean ## Unfiled records containers @@ -2096,14 +2095,14 @@ parameters: name: unfiledContainerId in: path description: - The identifier of a unfiled records container. You can use the **-unfiled-** alias. + The identifier of an unfiled records container. You can use the **-unfiled-** alias. required: true type: string unfiledContainerEntryIncludeParam: name: include in: query description: | - Returns additional information about the unfiled records container children. Any optional field from the response model can be requested. For example: + Returns additional information about the unfiled records container's children. Any optional field from the response model can be requested. For example: * allowableOperations * path required: false @@ -2115,7 +2114,7 @@ parameters: name: include in: query description: | - Returns additional information about the unfiled records container children. Any optional field from the response model can be requested. For example: + Returns additional information about the unfiled records container's children. Any optional field from the response model can be requested. For example: * allowableOperations * aspectNames * association @@ -2129,7 +2128,7 @@ parameters: unfiledContainerIncludeSourceParam: name: includeSource in: query - description: Also include **source** in addition to **entries** with folder information on the parent node – the specified parent **unfiledContainerId** + description: Also include **source** (in addition to **entries**) with folder information on the parent node – the specified parent **unfiledContainerId** required: false type: boolean ## Unfiled record folders @@ -2137,14 +2136,14 @@ parameters: name: unfiledRecordFolderId in: path description: - The identifier of a unfiled record folder. + The identifier of an unfiled record folder. required: true type: string unfiledRecordFolderEntryIncludeParam: name: include in: query description: | - Returns additional information about the unfiled records container children. Any optional field from the response model can be requested. For example: + Returns additional information about the unfiled records container's children. Any optional field from the response model can be requested. For example: * allowableOperations * path required: false @@ -2156,7 +2155,7 @@ parameters: name: include in: query description: | - Returns additional information about the unfiled records container children. Any optional field from the response model can be requested. For example: + Returns additional information about the unfiled records container's children. Any optional field from the response model can be requested. For example: * allowableOperations * aspectNames * association @@ -2177,7 +2176,7 @@ parameters: unfiledRecordFolderIncludeSourceParam: name: includeSource in: query - description: Also include **source** in addition to **entries** with folder information on the parent node – either the specified parent **unfiledRecordFolderId**, or as resolved by **relativePath**. + description: Also include **source** (in addition to **entries**) with folder information on the parent node – either the specified parent **unfiledRecordFolderId**, or as resolved by **relativePath**. required: false type: boolean unfiledRecordFolderAndContainerWhereParam: @@ -2225,7 +2224,7 @@ parameters: recordCategoryIncludeSourceParam: name: includeSource in: query - description: Also include **source** in addition to **entries** with folder information on the parent node – either the specified parent **recordCategoryId**, or as resolved by **relativePath**. + description: Also include **source** (in addition to **entries**) with folder information on the parent node – either the specified parent **recordCategoryId**, or as resolved by **relativePath**. required: false type: boolean recordCategoryChildEntryIncludeParam: @@ -2284,7 +2283,7 @@ parameters: recordFolderIncludeSourceParam: name: includeSource in: query - description: Also include **source** in addition to **entries** with record information on the parent folder – the specified parent **recordFolderId** + description: Also include **source** (in addition to **entries**) with record information on the parent folder – the specified parent **recordFolderId** required: false type: boolean recordFolderChildEntryIncludeParam: @@ -2356,7 +2355,7 @@ parameters: transferContainerIncludeSourceParam: name: includeSource in: query - description: Also include **source** in addition to **entries** with folder information on the specified parent **transferContainerId**. + description: Also include **source** (in addition to **entries**) with folder information on the specified parent **transferContainerId**. required: false type: boolean ## Transfers @@ -2383,7 +2382,7 @@ parameters: transferIncludeSourceParam: name: includeSource in: query - description: Also include **source** in addition to **entries** with folder information on the specified parent **transferId**. + description: Also include **source** (in addition to **entries**) with folder information on the specified parent **transferId**. required: false type: boolean transferChildEntryIncludeParam: @@ -3718,4 +3717,4 @@ definitions: - SiteConsumer - SiteCollaborator - SiteContributor - - SiteManager \ No newline at end of file + - SiteManager