RM: Transparent records management prototype WIP

* Create Record service and refactor
  * Add 'createRecord' method that preserves origional location(s) of the content
  * Add content readers information to record on extended security aspect
  * Experimental dynamic authority
  * DM action to 'create' record
  * Behaviour and methods to create and get new record container



git-svn-id: https://svn.alfresco.com/repos/alfresco-enterprise/modules/recordsmanagement/DEV/INPLACE@41707 c4b6b30b-aa2e-2d43-bbcb-ca4b014f7261
This commit is contained in:
Roy Wetherall
2012-09-18 02:15:16 +00:00
parent f288e47d8a
commit 7b9912626c
55 changed files with 1632 additions and 6292 deletions

View File

@@ -0,0 +1,28 @@
<?xml version='1.0' encoding='UTF-8'?>
<!DOCTYPE beans PUBLIC '-//SPRING//DTD BEAN//EN' 'http://www.springframework.org/dtd/spring-beans.dtd'>
<beans>
<!-- I18N -->
<bean id="rmActionResourceBundles" class="org.alfresco.i18n.ResourceBundleBootstrapComponent">
<property name="resourceBundles">
<list>
<value>alfresco.module.org_alfresco_module_rm.messages.actions</value>
</list>
</property>
</bean>
<!-- Create record action -->
<bean id="create-record" parent="action-executer" class="org.alfresco.module.org_alfresco_module_rm.action.dm.CreateRecordAction">
<property name="recordsManagementService" ref="RecordsManagementService"/>
<property name="recordService" ref="RecordService" />
<property name="permissionService" ref="PermissionService" />
<property name="nodeService" ref="NodeService" />
<property name="applicableTypes">
<list>
<value>{http://www.alfresco.org/model/content/1.0}content</value>
</list>
</property>
</bean>
</beans>

View File

@@ -8,6 +8,7 @@
<bean id="capabilityCondition.base"
abstract="true">
<property name="recordsManagementService" ref="recordsManagementService" />
<property name="recordService" ref="recordService" />
<property name="permissionService" ref="PermissionService" />
<property name="nodeService" ref="NodeService" />
</bean>

View File

@@ -0,0 +1,37 @@
rm.action.not-defined=The records management action {0} has not been defined.
rm.action.no-implicit-noderef=Unable to execute the records management action, because the action {0} implementation does not provide an implicit nodeRef.
rm.action.record-not-declared=Unable to execute disposition action {0}, because the record is not declared. (actionedUponNodeRef={1})
rm.action.expected-record-level=Unable to execute disposition action {0}, because disposition is expected at the record level and this node is not a record. (actionedUponNodeRef={1})
rm.action.not-all-records-declared=Unable to execute disposition action {0}, because not all the records in the record are declared. (actionedUponNodeRef={1})
rm.action.not-eligible=Unable to execute disposition action {0}, because the next disposition action on the record or record folder is not eligible. (actionedUponNodeRef={1})
rm.action.no-disposition-instructions=Unable to find disposition instructions for node. Can not execute disposition action {0}. (nodeRef={1})
rm.action.no-disposition-lisfecycle-set=Unable to execute disposition action {0}, because node does not have a disposition life-cycle set. (nodeRef={1})
rm.action.next-disp-not-set=Unable to execute disposition action {0}, because the next disposition action is not set. (nodeRef={1})
rm.action.not-next-disp=Unable to execute disposition action {0}, because this is not the next disposition action for this record or record folder. (nodeRef={1})
rm.action.not-record-folder=Unable to execute disposition action {0}, because disposition is expected at the record folder level and this node is not a record folder. (nodeRef={1})
rm.action.actioned-upon-not-record=Can not execute action {0}, because the actioned upon node is not a Record. (filePlanComponet={1})
rm.action.custom-aspect-not-recognised=The custom type can not be applied, because is it not recognised. (customAspect={0})
rm.action.close-record-folder-not-folder=Unable to close record folder, because the node is not a record folder. (nodeRef={0})
rm.action.event-no-disp-lc=The event {0} can not be completed, because it is not defined on the disposition lifecycle.
rm.action.undeclared-only-records=Only records can be undeclared. (nodeRef={0})
rm.action.no-declare-mand-prop=Can not declare record, because not all the records mandatory properties have been set.
rm.action.ghosted-prop-update=The content properties of a previously destroyed record can not be updated.
rm.action.valid-date-disp-asof=A valid date must be specified when setting the disposition action as of date.
rm.action.disp-asof-lifecycle-applied=It is invalid to edit the disposition as of date of a record or record folder which has a lifecycle applied.
rm.action.hold-edit-reason-none=Can not edit hold reason, because no reason has been given.
rm.action.hold-edit-type=Can not edit hold reason, because actioned upon node is not of type {0}. (nodeRef={1})
rm.action.specify-avlid-date=Must specify a valid date when setting the review as of date.
rm.action.review-details-only=Can only edit the review details of vital records.
rm.action.freeze-no-reason=Can not freeze a record without a reason.
rm.action.freeze-only-records-folders=Can only freeze records or record folders.
rm.action.no-open-record-folder=Unable to open record folder, because node is not a record folder. (actionedUponNodeRef={0})
rm.action.not-hold-type=Can not relinquish hold, because node is not of type {0}. (actionedUponNodeRef={1})
rm.action.no-read-mime-message=Unable to read mime message, because {0}.
rm.action.email-declared=Can not split email, because record has already been declared. (actionedUponNodeRef={0})
rm.action.email-not-record=Can no split email, because node is not a record. (actionedUponNodeRef={0})
rm.action.email-create-child-assoc=Unable to create custom child association.
rm.action.node-already-transfer=Node is already being transfered.
rm.action.node-not-transfer=Node is not a transfer object.
rm.action.undo-not-last=Can not undo cut off, because last disposition action was not cut off.
rm.action.records_only_undeclared=Only records can be undeclared.
rm.action.event-not-undone=The event {0} can not be undone, because it is not defined on the disposition lifecycle.

View File

@@ -90,6 +90,11 @@
</type>
<type name="rma:newRecordsContainer">
<title>New Records Container</title>
<parent>rma:recordsManagementContainer</parent>
</type>
<!-- Disposition Schedule -->
<type name="rma:dispositionSchedule">
@@ -619,6 +624,19 @@
</target>
</child-association>
<child-association name="rma:newRecords">
<title>New Records</title>
<source>
<mandatory>true</mandatory>
<many>false</many>
</source>
<target>
<class>rma:newRecordsContainer</class>
<mandatory>true</mandatory>
<many>true</many>
</target>
</child-association>
</associations>
<mandatory-aspects>
<aspect>rma:filePlanComponent</aspect>
@@ -826,6 +844,17 @@
</mandatory-aspects>
</aspect>
<!-- Details used for DM-RM security mapping -->
<!-- @since 2.1 -->
<aspect name="rma:extendedRecordSecurity">
<properties>
<property name="rma:readers">
<type>d:text</type>
<multiple>true</multiple>
</property>
</properties>
</aspect>
<!-- State management aspects -->
<aspect name="rma:vitalRecord">

View File

@@ -46,10 +46,13 @@
<list>
<ref bean="ownerDynamicAuthority" />
<ref bean="lockOwnerDynamicAuthority" />
<ref bean="recordReadersDynamicAuthority" />
</list>
</property>
</bean>
<bean id="recordReadersDynamicAuthority" class="org.alfresco.module.org_alfresco_module_rm.permission.RecordReadersDynamicAuthority" />
<!-- Bootstrap records management data -->
<bean id="org_alfresco_module_rm_bootstrapData"
class="org.alfresco.module.org_alfresco_module_rm.bootstrap.BootstrapImporterModuleComponent"
@@ -136,6 +139,7 @@
<!-- Import the RM action's -->
<import resource="classpath:alfresco/module/org_alfresco_module_rm/rm-action-context.xml"/>
<import resource="classpath:alfresco/module/org_alfresco_module_rm/action-context.xml"/>
<!-- Import the RM module patches -->
<import resource="classpath:alfresco/module/org_alfresco_module_rm/rm-patch-context.xml"/>
@@ -222,26 +226,28 @@
</bean>
<!-- Form Processor Filters to process RM nodes and types -->
<bean id="rmNodeFormFilter" parent="baseFormFilter"
class="org.alfresco.module.org_alfresco_module_rm.forms.RecordsManagementNodeFormFilter">
<property name="filterRegistry" ref="nodeFilterRegistry" />
<property name="namespaceService" ref="NamespaceService"/>
<property name="nodeService" ref="nodeService"/>
<property name="dictionaryService" ref="DictionaryService" />
<property name="recordsManagementServiceRegistry" ref="RecordsManagementServiceRegistry" />
<property name="recordsManagementService" ref="recordsManagementService"/>
<property name="dispositionService" ref="dispositionService"/>
<property name="recordsManagementAdminService" ref="recordsManagementAdminService"/>
</bean>
<bean id="rmTypeFormFilter" parent="baseFormFilter"
class="org.alfresco.module.org_alfresco_module_rm.forms.RecordsManagementTypeFormFilter">
<property name="filterRegistry" ref="typeFilterRegistry" />
<bean id="baseRMFormFilter" parent="baseFormFilter" abstract="true">
<property name="namespaceService" ref="NamespaceService"/>
<property name="nodeService" ref="NodeService"/>
<property name="recordsManagementServiceRegistry" ref="RecordsManagementServiceRegistry" />
<property name="recordsManagementService" ref="recordsManagementService"/>
<property name="recordService" ref="recordService"/>
<property name="recordsManagementAdminService" ref="recordsManagementAdminService"/>
</bean>
<bean id="rmNodeFormFilter"
parent="baseRMFormFilter"
class="org.alfresco.module.org_alfresco_module_rm.forms.RecordsManagementNodeFormFilter">
<property name="filterRegistry" ref="nodeFilterRegistry" />
<property name="dictionaryService" ref="DictionaryService" />
<property name="dispositionService" ref="dispositionService"/>
</bean>
<bean id="rmTypeFormFilter"
parent="baseRMFormFilter"
class="org.alfresco.module.org_alfresco_module_rm.forms.RecordsManagementTypeFormFilter">
<property name="filterRegistry" ref="typeFilterRegistry" />
<property name="identifierService" ref="recordsManagementIdentifierService"/>
</bean>

View File

@@ -24,6 +24,7 @@
<property name="recordsManagementAuditService" ref="recordsManagementAuditService"/>
<property name="recordsManagementAdminService" ref="recordsManagementAdminService"/>
<property name="recordsManagementActionService" ref="recordsManagementActionService"/>
<property name="recordService" ref="recordService"/>
<property name="recordsManagementService" ref="recordsManagementService"/>
<property name="dispositionService" ref="dispositionService"/>
<property name="vitalRecordService" ref="vitalRecordService"/>
@@ -765,4 +766,5 @@
class="org.alfresco.module.org_alfresco_module_rm.action.impl.CreateDispositionScheduleAction"
parent="rmAction" />
</beans>

View File

@@ -39,20 +39,20 @@
<!-- File plan component aspect behaviour bean -->
<bean id="org_alfresco_module_rm_FilePlanComponentAspect"
class="org.alfresco.module.org_alfresco_module_rm.model.FilePlanComponentAspect"
class="org.alfresco.module.org_alfresco_module_rm.model.behaviour.FilePlanComponentAspect"
parent="org_alfresco_module_rm_BaseBehaviour">
<property name="recordsManagementService" ref="recordsManagementService"/>
</bean>
<bean id="org_alfresco_module_rm_ScheduledAspect"
class="org.alfresco.module.org_alfresco_module_rm.model.ScheduledAspect"
class="org.alfresco.module.org_alfresco_module_rm.model.behaviour.ScheduledAspect"
parent="org_alfresco_module_rm_BaseBehaviour">
<property name="dispositionService" ref="dispositionService"/>
</bean>
<!-- RM container type behaviour bean -->
<bean id="org_alfresco_module_rm_RecordContainerType"
class="org.alfresco.module.org_alfresco_module_rm.model.RecordContainerType"
class="org.alfresco.module.org_alfresco_module_rm.model.behaviour.RecordContainerType"
parent="org_alfresco_module_rm_BaseBehaviour">
<property name="dictionaryService" ref="DictionaryService"/>
<property name="recordsManagementActionService" ref="RecordsManagementActionService"/>
@@ -60,7 +60,7 @@
</bean>
<bean id="org_alfresco_module_rm_RmSiteType"
class="org.alfresco.module.org_alfresco_module_rm.model.RmSiteType"
class="org.alfresco.module.org_alfresco_module_rm.model.behaviour.RmSiteType"
parent="org_alfresco_module_rm_BaseBehaviour">
<property name="siteService" ref="SiteService"/>
<property name="recordsManagementSearchService" ref="RecordsManagementSearchService" />
@@ -68,14 +68,14 @@
<!-- Record Component Identifier aspect behaviour bean -->
<bean id="recordComponentIdentifierAspect"
class="org.alfresco.module.org_alfresco_module_rm.model.RecordComponentIdentifierAspect"
class="org.alfresco.module.org_alfresco_module_rm.model.behaviour.RecordComponentIdentifierAspect"
parent="org_alfresco_module_rm_BaseBehaviour">
<property name="attributeService" ref="attributeService"/>
</bean>
<!-- Copy policy management for records -->
<bean id="recordCopyBehaviours"
class="org.alfresco.module.org_alfresco_module_rm.model.RecordCopyBehaviours"
class="org.alfresco.module.org_alfresco_module_rm.model.behaviour.RecordCopyBehaviours"
init-method="init">
<property name="policyComponent" ref="policyComponent"/>
<property name="recordsManagementServiceRegistry" ref="RecordsManagementServiceRegistry"/>
@@ -83,7 +83,7 @@
<!-- Search Behaviour -->
<bean id="recordsManagementSearchBehaviour"
class="org.alfresco.module.org_alfresco_module_rm.model.RecordsManagementSearchBehaviour"
class="org.alfresco.module.org_alfresco_module_rm.model.behaviour.RecordsManagementSearchBehaviour"
parent="org_alfresco_module_rm_BaseBehaviour">
<property name="recordsManagementService" ref="recordsManagementService"/>
<property name="dispositionService" ref="dispositionService"/>
@@ -101,4 +101,11 @@
<property name="namespaceService" ref="NamespaceService"/>
</bean>
<!-- File Plan Type Behaviour -->
<bean id="org_alfresco_module_rm_FilePlanType"
class="org.alfresco.module.org_alfresco_module_rm.model.behaviour.FilePlanType"
parent="org_alfresco_module_rm_BaseBehaviour">
<property name="permissionService" ref="PermissionService"/>
</bean>
</beans>

View File

@@ -89,8 +89,8 @@
org.alfresco.module.org_alfresco_module_rm.RecordsManagementService.isRecordFolderClosed=RM.Read.0
org.alfresco.module.org_alfresco_module_rm.RecordsManagementService.createRecordFolder=RM.Write.0
org.alfresco.module.org_alfresco_module_rm.RecordsManagementService.getRecords=RM.Read.0,AFTER_RM.FilterNode
org.alfresco.module.org_alfresco_module_rm.RecordsManagementService.getRecordMetaDataAspects=RM_ALLOW
org.alfresco.module.org_alfresco_module_rm.RecordsManagementService.getRecordFolders=RM.Read.0,AFTER_RM.FilterNode
org.alfresco.module.org_alfresco_module_rm.RecordsManagementService.getRecordMetaDataAspects=RM_ALLOW
org.alfresco.module.org_alfresco_module_rm.RecordsManagementService.isRecordDeclared=RM.Read.0
org.alfresco.module.org_alfresco_module_rm.RecordsManagementService.*=RM_DENY
]]>
@@ -787,6 +787,66 @@
</property>
</bean>
<!-- Record Service -->
<bean id="recordService" class="org.alfresco.module.org_alfresco_module_rm.record.RecordServiceImpl" init-method="init">
<property name="recordsManagementService" ref="RecordsManagementService"/>
<property name="nodeService" ref="NodeService"/>
<property name="policyComponent" ref="policyComponent"/>
<property name="dictionaryService" ref="DictionaryService"/>
<property name="identifierService" ref="recordsManagementIdentifierService"/>
</bean>
<bean id="RecordService" class="org.springframework.aop.framework.ProxyFactoryBean">
<property name="proxyInterfaces">
<value>org.alfresco.module.org_alfresco_module_rm.record.RecordService</value>
</property>
<property name="target">
<ref bean="recordService"/>
</property>
<property name="interceptorNames">
<list>
<idref local="RecordService_transaction"/>
<idref bean="exceptionTranslator"/>
<idref local="RecordService_security"/>
</list>
</property>
</bean>
<bean id="RecordService_transaction" class="org.springframework.transaction.interceptor.TransactionInterceptor">
<property name="transactionManager">
<ref bean="transactionManager"/>
</property>
<property name="transactionAttributes">
<props>
<prop key="*">${server.transaction.mode.default}</prop>
</props>
</property>
</bean>
<bean id="RecordService_security" class="org.alfresco.repo.security.permissions.impl.acegi.MethodSecurityInterceptor">
<property name="authenticationManager">
<ref bean="authenticationManager"/>
</property>
<property name="accessDecisionManager">
<ref bean="accessDecisionManager"/>
</property>
<property name="afterInvocationManager">
<ref bean="afterInvocationManager"/>
</property>
<property name="objectDefinitionSource">
<value>
<![CDATA[
org.alfresco.module.org_alfresco_module_rm.record.RecordService.getRecordMetaDataAspects=RM_ALLOW
org.alfresco.module.org_alfresco_module_rm.record.RecordService.isDeclared=RM.Read.0
org.alfresco.module.org_alfresco_module_rm.record.RecordService.getNewRecordContainer=RM.Read.0
org.alfresco.module.org_alfresco_module_rm.record.RecordService.createRecord=RM.Write.0.1
org.alfresco.module.org_alfresco_module_rm.record.RecordService.*=RM_DENY
]]>
</value>
</property>
</bean>
<!-- Custom EMail Mapping Service -->
<bean id="customEmailMappingService"

View File

@@ -3,7 +3,9 @@
<beans>
<!-- REST impl for RM Action Service -->
<bean id="webscript.org.alfresco.rma.rmaction.post" class="org.alfresco.module.org_alfresco_module_rm.script.RmActionPost" parent="webscript">
<bean id="webscript.org.alfresco.rma.rmaction.post"
class="org.alfresco.module.org_alfresco_module_rm.script.RmActionPost"
parent="webscript">
<property name="recordsManagementActionService" ref="RecordsManagementActionService" />
<property name="nodeService" ref="NodeService" />
</bean>
@@ -17,91 +19,127 @@
</bean>
<!-- REST impl for GET DOD Custom Types -->
<bean id="webscript.org.alfresco.rma.dodcustomtypes.get" class="org.alfresco.module.org_alfresco_module_rm.script.DodCustomTypesGet" parent="webscript">
<bean id="webscript.org.alfresco.rma.dodcustomtypes.get"
class="org.alfresco.module.org_alfresco_module_rm.script.DodCustomTypesGet"
parent="webscript">
<property name="dictionaryService" ref="DictionaryService" />
</bean>
<bean id="webscript.org.alfresco.rma.customisable.get" class="org.alfresco.module.org_alfresco_module_rm.script.CustomisableGet" parent="webscript">
<bean id="webscript.org.alfresco.rma.customisable.get"
class="org.alfresco.module.org_alfresco_module_rm.script.CustomisableGet"
parent="webscript">
<property name="recordsManagementAdminService" ref="RecordsManagementAdminService" />
<property name="namespaceService" ref="NamespaceService" />
<property name="dictionaryService" ref="DictionaryService" />
</bean>
<!-- REST impl for GET Custom Property Definitions -->
<bean id="webscript.org.alfresco.rma.custompropdefinitions.get" class="org.alfresco.module.org_alfresco_module_rm.script.CustomPropertyDefinitionsGet" parent="rmBaseWebscript">
<bean id="webscript.org.alfresco.rma.custompropdefinitions.get"
class="org.alfresco.module.org_alfresco_module_rm.script.CustomPropertyDefinitionsGet"
parent="rmBaseWebscript">
<property name="recordsManagementAdminService" ref="RecordsManagementAdminService" />
</bean>
<!-- REST impl for PUT Custom Property Definitions -->
<bean id="webscript.org.alfresco.rma.custompropdefinition.put" class="org.alfresco.module.org_alfresco_module_rm.script.CustomPropertyDefinitionPut" parent="rmBaseWebscript">
<bean id="webscript.org.alfresco.rma.custompropdefinition.put"
class="org.alfresco.module.org_alfresco_module_rm.script.CustomPropertyDefinitionPut"
parent="rmBaseWebscript">
<property name="recordsManagementAdminService" ref="RecordsManagementAdminService" />
</bean>
<!-- REST impl for POST Custom Property Definitions -->
<bean id="webscript.org.alfresco.rma.custompropdefinition.post" class="org.alfresco.module.org_alfresco_module_rm.script.CustomPropertyDefinitionPost" parent="rmBaseWebscript">
<bean id="webscript.org.alfresco.rma.custompropdefinition.post"
class="org.alfresco.module.org_alfresco_module_rm.script.CustomPropertyDefinitionPost"
parent="rmBaseWebscript">
<property name="recordsManagementAdminService" ref="RecordsManagementAdminService" />
</bean>
<!-- TODO Delete this -->
<!-- REST impl for DELETE Custom Property Definitions -->
<bean id="webscript.org.alfresco.rma.custompropdefinition.delete" class="org.alfresco.module.org_alfresco_module_rm.script.CustomPropertyDefinitionDelete" parent="rmBaseWebscript">
<bean id="webscript.org.alfresco.rma.custompropdefinition.delete"
class="org.alfresco.module.org_alfresco_module_rm.script.CustomPropertyDefinitionDelete"
parent="rmBaseWebscript">
<property name="recordsManagementAdminService" ref="RecordsManagementAdminService" />
</bean>
<!-- REST impl for GET Custom Reference Definitions -->
<bean id="webscript.org.alfresco.rma.customrefdefinitions.get" class="org.alfresco.module.org_alfresco_module_rm.script.CustomReferenceDefinitionsGet" parent="webscript">
<bean id="webscript.org.alfresco.rma.customrefdefinitions.get"
class="org.alfresco.module.org_alfresco_module_rm.script.CustomReferenceDefinitionsGet"
parent="webscript">
<property name="recordsManagementAdminService" ref="RecordsManagementAdminService" />
<property name="namespaceService" ref="NamespaceService" />
</bean>
<!-- REST impl for PUT Custom Reference Definitions -->
<bean id="webscript.org.alfresco.rma.customrefdefinition.put" class="org.alfresco.module.org_alfresco_module_rm.script.CustomReferenceDefinitionPut" parent="rmBaseWebscript">
<bean id="webscript.org.alfresco.rma.customrefdefinition.put"
class="org.alfresco.module.org_alfresco_module_rm.script.CustomReferenceDefinitionPut"
parent="rmBaseWebscript">
<property name="recordsManagementAdminService" ref="RecordsManagementAdminService" />
</bean>
<!-- REST impl for POST Custom Reference Definitions -->
<bean id="webscript.org.alfresco.rma.customrefdefinition.post" class="org.alfresco.module.org_alfresco_module_rm.script.CustomReferenceDefinitionPost" parent="rmBaseWebscript">
<bean id="webscript.org.alfresco.rma.customrefdefinition.post"
class="org.alfresco.module.org_alfresco_module_rm.script.CustomReferenceDefinitionPost"
parent="rmBaseWebscript">
<property name="recordsManagementAdminService" ref="RecordsManagementAdminService" />
</bean>
<!-- REST impl for GET Custom Reference Instances -->
<bean id="webscript.org.alfresco.rma.customrefs.get" class="org.alfresco.module.org_alfresco_module_rm.script.CustomRefsGet" parent="rmBaseWebscript">
<bean id="webscript.org.alfresco.rma.customrefs.get"
class="org.alfresco.module.org_alfresco_module_rm.script.CustomRefsGet"
parent="rmBaseWebscript">
<property name="recordsManagementAdminService" ref="RecordsManagementAdminService" />
</bean>
<!-- REST impl for POST Custom Reference Instance -->
<bean id="webscript.org.alfresco.rma.customref.post" class="org.alfresco.module.org_alfresco_module_rm.script.CustomRefPost" parent="rmBaseWebscript">
<bean id="webscript.org.alfresco.rma.customref.post"
class="org.alfresco.module.org_alfresco_module_rm.script.CustomRefPost"
parent="rmBaseWebscript">
<property name="recordsManagementAdminService" ref="RecordsManagementAdminService" />
</bean>
<!-- REST impl for DELETE Custom Reference Instance -->
<bean id="webscript.org.alfresco.rma.customref.delete" class="org.alfresco.module.org_alfresco_module_rm.script.CustomRefDelete" parent="rmBaseWebscript">
<bean id="webscript.org.alfresco.rma.customref.delete"
class="org.alfresco.module.org_alfresco_module_rm.script.CustomRefDelete"
parent="rmBaseWebscript">
<property name="recordsManagementAdminService" ref="RecordsManagementAdminService" />
</bean>
<!-- REST impl for GET Disposition Schedule -->
<bean id="webscript.org.alfresco.rma.dispositionschedule.get" class="org.alfresco.module.org_alfresco_module_rm.script.DispositionScheduleGet" parent="rmBaseWebscript">
<bean id="webscript.org.alfresco.rma.dispositionschedule.get"
class="org.alfresco.module.org_alfresco_module_rm.script.DispositionScheduleGet"
parent="rmBaseWebscript">
</bean>
<!-- REST impl for POST Disposition Action Definition -->
<bean id="webscript.org.alfresco.rma.dispositionactiondefinitions.post" class="org.alfresco.module.org_alfresco_module_rm.script.DispositionActionDefinitionPost" parent="rmBaseWebscript">
<bean id="webscript.org.alfresco.rma.dispositionactiondefinitions.post"
class="org.alfresco.module.org_alfresco_module_rm.script.DispositionActionDefinitionPost"
parent="rmBaseWebscript">
</bean>
<!-- REST impl for PUT Disposition Action Definition -->
<bean id="webscript.org.alfresco.rma.dispositionactiondefinition.put" class="org.alfresco.module.org_alfresco_module_rm.script.DispositionActionDefinitionPut" parent="rmBaseWebscript">
<bean id="webscript.org.alfresco.rma.dispositionactiondefinition.put"
class="org.alfresco.module.org_alfresco_module_rm.script.DispositionActionDefinitionPut"
parent="rmBaseWebscript">
</bean>
<!-- REST impl for DELETE Disposition Action Definition -->
<bean id="webscript.org.alfresco.rma.dispositionactiondefinition.delete" class="org.alfresco.module.org_alfresco_module_rm.script.DispositionActionDefinitionDelete" parent="rmBaseWebscript">
<bean id="webscript.org.alfresco.rma.dispositionactiondefinition.delete"
class="org.alfresco.module.org_alfresco_module_rm.script.DispositionActionDefinitionDelete"
parent="rmBaseWebscript">
</bean>
<!-- REST impl for GET Disposition Lifecycle -->
<bean id="webscript.org.alfresco.rma.dispositionlifecycle.get" class="org.alfresco.module.org_alfresco_module_rm.script.DispositionLifecycleGet" parent="rmBaseWebscript">
<bean id="webscript.org.alfresco.rma.dispositionlifecycle.get"
class="org.alfresco.module.org_alfresco_module_rm.script.DispositionLifecycleGet"
parent="rmBaseWebscript">
<property name="personService" ref="PersonService" />
</bean>
<!-- REST impl for GET List Of Values -->
<bean id="webscript.org.alfresco.rma.listofvalues.get" class="org.alfresco.module.org_alfresco_module_rm.script.ListOfValuesGet" parent="webscript">
<bean id="webscript.org.alfresco.rma.listofvalues.get"
class="org.alfresco.module.org_alfresco_module_rm.script.ListOfValuesGet"
parent="webscript">
<property name="recordsManagementService" ref="RecordsManagementService" />
<property name="recordsManagementActionService" ref="RecordsManagementActionService" />
<property name="recordsManagementAuditService" ref="RecordsManagementAuditService" />
@@ -112,20 +150,26 @@
</bean>
<!-- REST impl for GET disposition properties -->
<bean id="webscript.org.alfresco.rma.dispositionproperties.get" class="org.alfresco.module.org_alfresco_module_rm.script.DispositionPropertiesGet" parent="webscript">
<bean id="webscript.org.alfresco.rma.dispositionproperties.get"
class="org.alfresco.module.org_alfresco_module_rm.script.DispositionPropertiesGet"
parent="webscript">
<property name="dispositionService" ref="DispositionService" />
<property name="namespaceService" ref="NamespaceService" />
</bean>
<!-- REST impl for GET Records MetaData aspects -->
<bean id="webscript.org.alfresco.rma.recordmetadataaspects.get" class="org.alfresco.module.org_alfresco_module_rm.script.RecordMetaDataAspectsGet" parent="webscript">
<property name="recordsManagementService" ref="RecordsManagementService"/>
<bean id="webscript.org.alfresco.rma.recordmetadataaspects.get"
class="org.alfresco.module.org_alfresco_module_rm.script.RecordMetaDataAspectsGet"
parent="webscript">
<property name="recordService" ref="RecordService" />
<property name="dictionaryService" ref="DictionaryService" />
<property name="namespaceService" ref="NamespaceService" />
</bean>
<!-- REST impl for GET Audit Log -->
<bean id="webscript.org.alfresco.rma.rmauditlog.get" class="org.alfresco.module.org_alfresco_module_rm.script.AuditLogGet" parent="webscript">
<bean id="webscript.org.alfresco.rma.rmauditlog.get"
class="org.alfresco.module.org_alfresco_module_rm.script.AuditLogGet"
parent="webscript">
<property name="nodeService" ref="nodeService" />
<property name="contentService" ref="ContentService" />
<property name="permissionService" ref="PermissionService" />
@@ -133,12 +177,16 @@
<property name="recordsManagementAuditService" ref="RecordsManagementAuditService" />
</bean>
<bean id="webscript.org.alfresco.rma.rmauditlogstatus.get" class="org.alfresco.module.org_alfresco_module_rm.script.AuditLogStatusGet" parent="webscript">
<bean id="webscript.org.alfresco.rma.rmauditlogstatus.get"
class="org.alfresco.module.org_alfresco_module_rm.script.AuditLogStatusGet"
parent="webscript">
<property name="recordsManagementAuditService" ref="RecordsManagementAuditService" />
</bean>
<!-- REST impl for POST Audit Log -->
<bean id="webscript.org.alfresco.rma.rmauditlog.post" class="org.alfresco.module.org_alfresco_module_rm.script.AuditLogPost" parent="webscript">
<bean id="webscript.org.alfresco.rma.rmauditlog.post"
class="org.alfresco.module.org_alfresco_module_rm.script.AuditLogPost"
parent="webscript">
<property name="nodeService" ref="nodeService" />
<property name="contentService" ref="ContentService" />
<property name="permissionService" ref="PermissionService" />
@@ -147,17 +195,23 @@
</bean>
<!-- REST impl for PUT Audit Log (starting and stopping auditing) -->
<bean id="webscript.org.alfresco.rma.rmauditlog.put" class="org.alfresco.module.org_alfresco_module_rm.script.AuditLogPut" parent="webscript">
<bean id="webscript.org.alfresco.rma.rmauditlog.put"
class="org.alfresco.module.org_alfresco_module_rm.script.AuditLogPut"
parent="webscript">
<property name="recordsManagementAuditService" ref="RecordsManagementAuditService" />
</bean>
<!-- REST impl for DELETE Audit Log (clears audit log) -->
<bean id="webscript.org.alfresco.rma.rmauditlog.delete" class="org.alfresco.module.org_alfresco_module_rm.script.AuditLogDelete" parent="webscript">
<bean id="webscript.org.alfresco.rma.rmauditlog.delete"
class="org.alfresco.module.org_alfresco_module_rm.script.AuditLogDelete"
parent="webscript">
<property name="recordsManagementAuditService" ref="RecordsManagementAuditService" />
</bean>
<!-- REST impl for POST export -->
<bean id="webscript.org.alfresco.rma.export.post" class="org.alfresco.module.org_alfresco_module_rm.script.ExportPost" parent="webscript">
<bean id="webscript.org.alfresco.rma.export.post"
class="org.alfresco.module.org_alfresco_module_rm.script.ExportPost"
parent="webscript">
<property name="nodeService" ref="nodeService" />
<property name="contentService" ref="ContentService" />
<property name="permissionService" ref="PermissionService" />
@@ -166,7 +220,9 @@
</bean>
<!-- REST impl for POST import -->
<bean id="webscript.org.alfresco.rma.import.post" class="org.alfresco.module.org_alfresco_module_rm.script.ImportPost" parent="webscript">
<bean id="webscript.org.alfresco.rma.import.post"
class="org.alfresco.module.org_alfresco_module_rm.script.ImportPost"
parent="webscript">
<property name="nodeService" ref="NodeService" />
<property name="dictionaryService" ref="DictionaryService" />
<property name="importerService" ref="ImporterService" />
@@ -184,18 +240,24 @@
</bean>
<!-- REST impl for GET transfer -->
<bean id="webscript.org.alfresco.rma.transfer.get" class="org.alfresco.module.org_alfresco_module_rm.script.TransferGet" parent="rmBaseTransferWebscript">
<bean id="webscript.org.alfresco.rma.transfer.get"
class="org.alfresco.module.org_alfresco_module_rm.script.TransferGet"
parent="rmBaseTransferWebscript">
</bean>
<!-- REST impl for GET transfer report -->
<bean id="webscript.org.alfresco.rma.transferreport.get" class="org.alfresco.module.org_alfresco_module_rm.script.TransferReportGet" parent="rmBaseTransferWebscript">
<bean id="webscript.org.alfresco.rma.transferreport.get"
class="org.alfresco.module.org_alfresco_module_rm.script.TransferReportGet"
parent="rmBaseTransferWebscript">
<property name="dictionaryService" ref="DictionaryService" />
<property name="recordsManagementService" ref="RecordsManagementService" />
<property name="dispositionService" ref="DispositionService" />
</bean>
<!-- REST impl for POST transfer report -->
<bean id="webscript.org.alfresco.rma.transferreport.post" class="org.alfresco.module.org_alfresco_module_rm.script.TransferReportPost" parent="rmBaseTransferWebscript">
<bean id="webscript.org.alfresco.rma.transferreport.post"
class="org.alfresco.module.org_alfresco_module_rm.script.TransferReportPost"
parent="rmBaseTransferWebscript">
<property name="dictionaryService" ref="DictionaryService" />
<property name="recordsManagementService" ref="RecordsManagementService" />
<property name="recordsManagementActionService" ref="RecordsManagementActionService" />
@@ -204,29 +266,39 @@
<!-- RM Role API-->
<bean id="webscript.org.alfresco.rma.admin.rmrole.rmroles.get" class="org.alfresco.module.org_alfresco_module_rm.script.admin.RmRolesGet" parent="webscript">
<bean id="webscript.org.alfresco.rma.admin.rmrole.rmroles.get"
class="org.alfresco.module.org_alfresco_module_rm.script.admin.RmRolesGet"
parent="webscript">
<property name="recordsManagementService" ref="RecordsManagementService" />
<property name="recordsManagementSecurityService" ref="RecordsManagementSecurityService" />
</bean>
<bean id="webscript.org.alfresco.rma.admin.rmrole.rmroles.post" class="org.alfresco.module.org_alfresco_module_rm.script.admin.RmRolesPost" parent="webscript">
<bean id="webscript.org.alfresco.rma.admin.rmrole.rmroles.post"
class="org.alfresco.module.org_alfresco_module_rm.script.admin.RmRolesPost"
parent="webscript">
<property name="recordsManagementService" ref="RecordsManagementService" />
<property name="recordsManagementSecurityService" ref="RecordsManagementSecurityService" />
<property name="capabilityService" ref="CapabilityService" />
</bean>
<bean id="webscript.org.alfresco.rma.admin.rmrole.rmrole.get" class="org.alfresco.module.org_alfresco_module_rm.script.admin.RmRoleGet" parent="webscript">
<bean id="webscript.org.alfresco.rma.admin.rmrole.rmrole.get"
class="org.alfresco.module.org_alfresco_module_rm.script.admin.RmRoleGet"
parent="webscript">
<property name="recordsManagementService" ref="RecordsManagementService" />
<property name="recordsManagementSecurityService" ref="RecordsManagementSecurityService" />
</bean>
<bean id="webscript.org.alfresco.rma.admin.rmrole.rmrole.put" class="org.alfresco.module.org_alfresco_module_rm.script.admin.RmRolePut" parent="webscript">
<bean id="webscript.org.alfresco.rma.admin.rmrole.rmrole.put"
class="org.alfresco.module.org_alfresco_module_rm.script.admin.RmRolePut"
parent="webscript">
<property name="recordsManagementService" ref="RecordsManagementService" />
<property name="recordsManagementSecurityService" ref="RecordsManagementSecurityService" />
<property name="capabilityService" ref="CapabilityService" />
</bean>
<bean id="webscript.org.alfresco.rma.admin.rmrole.rmrole.delete" class="org.alfresco.module.org_alfresco_module_rm.script.admin.RmRoleDelete" parent="webscript">
<bean id="webscript.org.alfresco.rma.admin.rmrole.rmrole.delete"
class="org.alfresco.module.org_alfresco_module_rm.script.admin.RmRoleDelete"
parent="webscript">
<property name="recordsManagementService" ref="RecordsManagementService" />
<property name="recordsManagementSecurityService" ref="RecordsManagementSecurityService" />
</bean>
@@ -242,52 +314,74 @@
<!-- RM Event API-->
<bean id="webscript.org.alfresco.rma.admin.rmevent.rmeventtypes.get" class="org.alfresco.module.org_alfresco_module_rm.script.admin.RmEventTypesGet" parent="webscript">
<bean id="webscript.org.alfresco.rma.admin.rmevent.rmeventtypes.get"
class="org.alfresco.module.org_alfresco_module_rm.script.admin.RmEventTypesGet"
parent="webscript">
<property name="recordsManagementEventService" ref="RecordsManagementEventService" />
</bean>
<bean id="webscript.org.alfresco.rma.admin.rmevent.rmevents.get" class="org.alfresco.module.org_alfresco_module_rm.script.admin.RmEventsGet" parent="webscript">
<bean id="webscript.org.alfresco.rma.admin.rmevent.rmevents.get"
class="org.alfresco.module.org_alfresco_module_rm.script.admin.RmEventsGet"
parent="webscript">
<property name="recordsManagementEventService" ref="RecordsManagementEventService" />
</bean>
<bean id="webscript.org.alfresco.rma.admin.rmevent.rmevents.post" class="org.alfresco.module.org_alfresco_module_rm.script.admin.RmEventsPost" parent="webscript">
<bean id="webscript.org.alfresco.rma.admin.rmevent.rmevents.post"
class="org.alfresco.module.org_alfresco_module_rm.script.admin.RmEventsPost"
parent="webscript">
<property name="recordsManagementEventService" ref="RecordsManagementEventService" />
</bean>
<bean id="webscript.org.alfresco.rma.admin.rmevent.rmevent.get" class="org.alfresco.module.org_alfresco_module_rm.script.admin.RmEventGet" parent="webscript">
<bean id="webscript.org.alfresco.rma.admin.rmevent.rmevent.get"
class="org.alfresco.module.org_alfresco_module_rm.script.admin.RmEventGet"
parent="webscript">
<property name="recordsManagementEventService" ref="RecordsManagementEventService" />
</bean>
<bean id="webscript.org.alfresco.rma.admin.rmevent.rmevent.put" class="org.alfresco.module.org_alfresco_module_rm.script.admin.RmEventPut" parent="webscript">
<bean id="webscript.org.alfresco.rma.admin.rmevent.rmevent.put"
class="org.alfresco.module.org_alfresco_module_rm.script.admin.RmEventPut"
parent="webscript">
<property name="recordsManagementEventService" ref="RecordsManagementEventService" />
</bean>
<bean id="webscript.org.alfresco.rma.admin.rmevent.rmevent.delete" class="org.alfresco.module.org_alfresco_module_rm.script.admin.RmEventDelete" parent="webscript">
<bean id="webscript.org.alfresco.rma.admin.rmevent.rmevent.delete"
class="org.alfresco.module.org_alfresco_module_rm.script.admin.RmEventDelete"
parent="webscript">
<property name="recordsManagementEventService" ref="RecordsManagementEventService" />
</bean>
<!-- REST impl for GET Email Map -->
<bean id="webscript.org.alfresco.rma.admin.emailmap.get" class="org.alfresco.module.org_alfresco_module_rm.script.EmailMapGet" parent="webscript">
<bean id="webscript.org.alfresco.rma.admin.emailmap.get"
class="org.alfresco.module.org_alfresco_module_rm.script.EmailMapGet"
parent="webscript">
<property name="customEmailMappingService" ref="CustomEmailMappingService" />
</bean>
<!-- REST impl for POST Email Map -->
<bean id="webscript.org.alfresco.rma.admin.emailmap.post" class="org.alfresco.module.org_alfresco_module_rm.script.EmailMapPost" parent="webscript">
<bean id="webscript.org.alfresco.rma.admin.emailmap.post"
class="org.alfresco.module.org_alfresco_module_rm.script.EmailMapPost"
parent="webscript">
<property name="customEmailMappingService" ref="CustomEmailMappingService" />
</bean>
<!-- REST impl for PUT Email Map -->
<bean id="webscript.org.alfresco.rma.admin.emailmap.put" class="org.alfresco.module.org_alfresco_module_rm.script.EmailMapPut" parent="webscript">
<bean id="webscript.org.alfresco.rma.admin.emailmap.put"
class="org.alfresco.module.org_alfresco_module_rm.script.EmailMapPut"
parent="webscript">
<property name="customEmailMappingService" ref="CustomEmailMappingService" />
</bean>
<!-- REST impl for GET RM Constraint -->
<bean id="webscript.org.alfresco.rma.rmconstraints.get" class="org.alfresco.module.org_alfresco_module_rm.script.RMConstraintGet" parent="webscript">
<bean id="webscript.org.alfresco.rma.rmconstraints.get"
class="org.alfresco.module.org_alfresco_module_rm.script.RMConstraintGet"
parent="webscript">
<property name="caveatConfigService" ref="CaveatConfigService" />
</bean>
<!-- REST impl for GET User Rights Report -->
<bean id="webscript.org.alfresco.rma.userrightsreport.get" class="org.alfresco.module.org_alfresco_module_rm.script.UserRightsReportGet" parent="webscript">
<bean id="webscript.org.alfresco.rma.userrightsreport.get"
class="org.alfresco.module.org_alfresco_module_rm.script.UserRightsReportGet"
parent="webscript">
<property name="authorityService" ref="AuthorityService" />
<property name="personService" ref="PersonService" />
<property name="nodeService" ref="NodeService" />
@@ -296,7 +390,9 @@
</bean>
<!-- REST impl for GET Bootstrap Test Data -->
<bean id="webscript.org.alfresco.rma.bootstraptestdata.get" class="org.alfresco.module.org_alfresco_module_rm.script.BootstrapTestDataGet" parent="webscript">
<bean id="webscript.org.alfresco.rma.bootstraptestdata.get"
class="org.alfresco.module.org_alfresco_module_rm.script.BootstrapTestDataGet"
parent="webscript">
<property name="nodeService" ref="NodeService" />
<property name="searchService" ref="SearchService" />
<property name="importerService" ref="ImporterService" />
@@ -311,15 +407,22 @@
</bean>
<!-- REST impl for GET applydodcertmodelfixes -->
<!-- This webscript is intended for patching the RM custom model during the DoD certification process. -->
<!--
This webscript is intended for patching the RM custom model during the
DoD certification process.
-->
<!-- TODO Delete this webscript after the certification process -->
<bean id="webscript.org.alfresco.rma.applydodcertmodelfixes.get" class="org.alfresco.module.org_alfresco_module_rm.script.ApplyDodCertModelFixesGet" parent="webscript">
<bean id="webscript.org.alfresco.rma.applydodcertmodelfixes.get"
class="org.alfresco.module.org_alfresco_module_rm.script.ApplyDodCertModelFixesGet"
parent="webscript">
<property name="contentService" ref="ContentService" />
</bean>
<!-- REST impl for GET applyfixmob1573 -->
<!-- TODO Delete this webscript after the certification process -->
<bean id="webscript.org.alfresco.rma.applyfixmob1573.get" class="org.alfresco.module.org_alfresco_module_rm.script.ApplyFixMob1573Get" parent="webscript">
<bean id="webscript.org.alfresco.rma.applyfixmob1573.get"
class="org.alfresco.module.org_alfresco_module_rm.script.ApplyFixMob1573Get"
parent="webscript">
<property name="contentService" ref="ContentService" />
</bean>
@@ -339,7 +442,8 @@
<property name="namespaceService" ref="namespaceService" />
</bean>
<bean id="webscript.org.alfresco.slingshot.rmsearch.rmsavedsearches.delete"
<bean
id="webscript.org.alfresco.slingshot.rmsearch.rmsavedsearches.delete"
class="org.alfresco.module.org_alfresco_module_rm.script.slingshot.RMSavedSearchesDelete"
parent="webscript">
<property name="siteService" ref="SiteService" />
@@ -359,13 +463,14 @@
<property name="contentService" ref="ContentService" />
</bean>
<bean id="webscript.org.alfresco.slingshot.rmsearch.rmsearchproperties.get"
<bean
id="webscript.org.alfresco.slingshot.rmsearch.rmsearchproperties.get"
class="org.alfresco.module.org_alfresco_module_rm.script.slingshot.RMSearchPropertiesGet"
parent="webscript">
<property name="namespaceService" ref="namespaceService" />
<property name="dictionaryService" ref="DictionaryService" />
<property name="adminService" ref="RecordsManagementAdminService" />
<property name="recordsManagementService" ref="RecordsManagementService" />
<property name="recordService" ref="RecordService" />
</bean>
<bean id="webscript.org.alfresco.slingshot.forms.metadata.get"

View File

@@ -23,6 +23,7 @@ import java.util.List;
import java.util.Map;
import java.util.Set;
import org.alfresco.module.org_alfresco_module_rm.record.RecordService;
import org.alfresco.service.cmr.repository.NodeRef;
import org.alfresco.service.namespace.QName;
@@ -446,15 +447,6 @@ public interface RecordsManagementService
// TODO move? copy? link?
/********** Record methods **********/
/**
* Get a list of all the record meta-data aspects
*
* @return {@link Set}<{@link QName}> list of record meta-data aspects
*/
Set<QName> getRecordMetaDataAspects();
/**
* Get all the record folders that a record is filed into.
*
@@ -464,11 +456,26 @@ public interface RecordsManagementService
// TODO rename to List<NodeRef> getParentRecordFolders(NodeRef record);
List<NodeRef> getRecordFolders(NodeRef record);
/********** Deprecated **********/
/**
* Get a list of all the record meta-data aspects
*
* @return {@link Set}<{@link QName}> list of record meta-data aspects
*
* @deprecated As of 2.1, replaced by {@link RecordService#getRecordMetaDataAspects()}
*/
@Deprecated
Set<QName> getRecordMetaDataAspects();
/**
* Indicates whether the record is declared
*
* @param nodeRef node reference (record)
* @return boolean true if record is declared, false otherwise
*
* @deprecated As of 2.1, replaced by {@link RecordsService#isDeclared()}
*/
@Deprecated
boolean isRecordDeclared(NodeRef nodeRef);
}

View File

@@ -20,7 +20,6 @@ package org.alfresco.module.org_alfresco_module_rm;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.Collection;
import java.util.HashMap;
import java.util.HashSet;
import java.util.LinkedList;
@@ -38,7 +37,6 @@ import org.alfresco.repo.domain.node.NodeDAO;
import org.alfresco.repo.policy.JavaBehaviour;
import org.alfresco.repo.policy.PolicyComponent;
import org.alfresco.repo.policy.Behaviour.NotificationFrequency;
import org.alfresco.service.cmr.dictionary.AspectDefinition;
import org.alfresco.service.cmr.dictionary.DictionaryService;
import org.alfresco.service.cmr.repository.ChildAssociationRef;
import org.alfresco.service.cmr.repository.NodeRef;
@@ -77,7 +75,6 @@ public class RecordsManagementServiceImpl implements RecordsManagementService,
private final static String MSG_PARENT_RECORD_FOLDER_ROOT = "rm.service.parent-record-folder-root";
private final static String MSG_PARENT_RECORD_FOLDER_TYPE = "rm.service.parent-record-folder-type";
private final static String MSG_RECORD_FOLDER_TYPE = "rm.service.record-folder-type";
private final static String MSG_NOT_RECORD = "rm.service.not-record";
/** Store that the RM roots are contained within */
@SuppressWarnings("unused")
@@ -105,9 +102,6 @@ public class RecordsManagementServiceImpl implements RecordsManagementService,
/** Well-known location of the scripts folder. */
private NodeRef scriptsFolderNodeRef = new NodeRef("workspace", "SpacesStore", "rm_scripts");
/** List of available record meta-data aspects */
private Set<QName> recordMetaDataAspects;
/** Java behaviour */
private JavaBehaviour onChangeToDispositionActionDefinition;
@@ -1001,7 +995,7 @@ public class RecordsManagementServiceImpl implements RecordsManagementService,
List<NodeRef> records = getRecords(recordFolder);
for (NodeRef record : records)
{
if (isRecordDeclared(record) == false)
if (serviceRegistry.getRecordService().isDeclared(record) == false)
{
result = false;
break;
@@ -1120,31 +1114,6 @@ public class RecordsManagementServiceImpl implements RecordsManagementService,
return createRecordFolder(parent, name, type, null);
}
/**
* @see org.alfresco.module.org_alfresco_module_rm.RecordsManagementService#getRecordMetaDataAspects()
*/
public Set<QName> getRecordMetaDataAspects()
{
if (recordMetaDataAspects == null)
{
recordMetaDataAspects = new HashSet<QName>(7);
Collection<QName> aspects = dictionaryService.getAllAspects();
for (QName aspect : aspects)
{
AspectDefinition def = dictionaryService.getAspect(aspect);
if (def != null)
{
QName parent = def.getParentName();
if (parent != null && ASPECT_RECORD_META_DATA.equals(parent) == true)
{
recordMetaDataAspects.add(aspect);
}
}
}
}
return recordMetaDataAspects;
}
/**
* @see org.alfresco.module.org_alfresco_module_rm.RecordsManagementService#getRecords(org.alfresco.service.cmr.repository.NodeRef)
*/
@@ -1166,20 +1135,6 @@ public class RecordsManagementServiceImpl implements RecordsManagementService,
return result;
}
/**
* @see org.alfresco.module.org_alfresco_module_rm.RecordsManagementService#isRecord(org.alfresco.service.cmr.repository.NodeRef, boolean)
*/
public boolean isRecordDeclared(NodeRef record)
{
if (isRecord(record) == false)
{
throw new AlfrescoRuntimeException(I18NUtil.getMessage(MSG_NOT_RECORD, record.toString()));
}
return (this.nodeService.hasAspect(record, ASPECT_DECLARED_RECORD));
}
/**
* This method examines the old and new property sets and for those properties which
* have changed, looks for script resources corresponding to those properties.
@@ -1271,4 +1226,24 @@ public class RecordsManagementServiceImpl implements RecordsManagementService,
return result;
}
/**
* @see org.alfresco.module.org_alfresco_module_rm.RecordsManagementService#getRecordMetaDataAspects()
*/
@Override
@Deprecated
public Set<QName> getRecordMetaDataAspects()
{
return serviceRegistry.getRecordService().getRecordMetaDataAspects();
}
/**
* @see org.alfresco.module.org_alfresco_module_rm.RecordsManagementService#isRecordDeclared(org.alfresco.service.cmr.repository.NodeRef)
*/
@Override
@Deprecated
public boolean isRecordDeclared(NodeRef nodeRef)
{
return serviceRegistry.getRecordService().isDeclared(nodeRef);
}
}

View File

@@ -23,6 +23,7 @@ import org.alfresco.module.org_alfresco_module_rm.audit.RecordsManagementAuditSe
import org.alfresco.module.org_alfresco_module_rm.capability.CapabilityService;
import org.alfresco.module.org_alfresco_module_rm.disposition.DispositionService;
import org.alfresco.module.org_alfresco_module_rm.event.RecordsManagementEventService;
import org.alfresco.module.org_alfresco_module_rm.record.RecordService;
import org.alfresco.module.org_alfresco_module_rm.security.RecordsManagementSecurityService;
import org.alfresco.service.NotAuditable;
import org.alfresco.service.ServiceRegistry;
@@ -45,6 +46,7 @@ public interface RecordsManagementServiceRegistry extends ServiceRegistry
static final QName RECORDS_MANAGEMENT_SECURITY_SERVICE = QName.createQName(NamespaceService.ALFRESCO_URI, "RecordsManagementSecurityService");
static final QName RECORDS_MANAGEMENT_AUDIT_SERVICE = QName.createQName(NamespaceService.ALFRESCO_URI, "RecordsManagementAuditService");
static final QName CAPABILITY_SERVICE = QName.createQName(NamespaceService.ALFRESCO_URI, "CapabilityService");
static final QName RECORD_SERVICE = QName.createQName(NamespaceService.ALFRESCO_URI, "RecordService");
/**
* @return records management service
@@ -52,6 +54,12 @@ public interface RecordsManagementServiceRegistry extends ServiceRegistry
@NotAuditable
RecordsManagementService getRecordsManagementService();
/**
* @return record service
*/
@NotAuditable
RecordService getRecordService();
/**
* @return disposition service
*/

View File

@@ -23,6 +23,7 @@ import org.alfresco.module.org_alfresco_module_rm.audit.RecordsManagementAuditSe
import org.alfresco.module.org_alfresco_module_rm.capability.CapabilityService;
import org.alfresco.module.org_alfresco_module_rm.disposition.DispositionService;
import org.alfresco.module.org_alfresco_module_rm.event.RecordsManagementEventService;
import org.alfresco.module.org_alfresco_module_rm.record.RecordService;
import org.alfresco.module.org_alfresco_module_rm.security.RecordsManagementSecurityService;
import org.alfresco.repo.service.ServiceDescriptorRegistry;
@@ -66,6 +67,14 @@ public class RecordsManagementServiceRegistryImpl extends ServiceDescriptorRegis
return (RecordsManagementService)getService(RECORDS_MANAGEMENT_SERVICE);
}
/**
* @see org.alfresco.module.org_alfresco_module_rm.RecordsManagementServiceRegistry#getRecordService()
*/
public RecordService getRecordService()
{
return (RecordService)getService(RECORD_SERVICE);
}
/**
* @see org.alfresco.module.org_alfresco_module_rm.RecordsManagementServiceRegistry#getRecordsManagementSecurityService()
*/
@@ -74,7 +83,7 @@ public class RecordsManagementServiceRegistryImpl extends ServiceDescriptorRegis
return (RecordsManagementSecurityService)getService(RECORDS_MANAGEMENT_SECURITY_SERVICE);
}
/*
/**
* @see org.alfresco.module.org_alfresco_module_rm.RecordsManagementServiceRegistry#getRecordsManagementAuditService()
*/
public RecordsManagementAuditService getRecordsManagementAuditService()

View File

@@ -41,6 +41,7 @@ import org.alfresco.module.org_alfresco_module_rm.event.RecordsManagementEvent;
import org.alfresco.module.org_alfresco_module_rm.event.RecordsManagementEventService;
import org.alfresco.module.org_alfresco_module_rm.event.RecordsManagementEventType;
import org.alfresco.module.org_alfresco_module_rm.model.RecordsManagementModel;
import org.alfresco.module.org_alfresco_module_rm.record.RecordService;
import org.alfresco.module.org_alfresco_module_rm.vital.VitalRecordService;
import org.alfresco.repo.action.executer.ActionExecuterAbstractBase;
import org.alfresco.service.cmr.action.Action;
@@ -99,6 +100,9 @@ public abstract class RMActionExecuterAbstractBase extends ActionExecuterAbstra
/** Records management service */
protected RecordsManagementService recordsManagementService;
/** Record service */
protected RecordService recordService;
/** Disposition service */
protected DispositionService dispositionService;
@@ -193,6 +197,11 @@ public abstract class RMActionExecuterAbstractBase extends ActionExecuterAbstra
this.recordsManagementService = recordsManagementService;
}
public void setRecordService(RecordService recordService)
{
this.recordService = recordService;
}
/**
* Set the disposition service
*/

View File

@@ -100,7 +100,7 @@ public abstract class RMDispositionActionExecuterAbstractBase extends RMActionEx
if (this.recordsManagementService.isRecord(actionedUponNodeRef) == true)
{
// Can only execute disposition action on record if declared
if (this.recordsManagementService.isRecordDeclared(actionedUponNodeRef) == true)
if (recordService.isDeclared(actionedUponNodeRef) == true)
{
// Indicate that the disposition action is underway
this.nodeService.setProperty(nextDispositionActionNodeRef, PROP_DISPOSITION_ACTION_STARTED_AT, new Date());
@@ -315,7 +315,7 @@ public abstract class RMDispositionActionExecuterAbstractBase extends RMActionEx
if (this.recordsManagementService.isRecord(filePlanComponent) == true)
{
// Can only execute disposition action on record if declared
if (this.recordsManagementService.isRecordDeclared(filePlanComponent) == true)
if (recordService.isDeclared(filePlanComponent) == true)
{
return true;
}

View File

@@ -0,0 +1,148 @@
/*
* Copyright (C) 2005-2011 Alfresco Software Limited.
*
* This file is part of Alfresco
*
* Alfresco is free software: you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* Alfresco is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public License
* along with Alfresco. If not, see <http://www.gnu.org/licenses/>.
*/
package org.alfresco.module.org_alfresco_module_rm.action.dm;
import java.io.Serializable;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Set;
import org.alfresco.error.AlfrescoRuntimeException;
import org.alfresco.model.ContentModel;
import org.alfresco.module.org_alfresco_module_rm.RecordsManagementService;
import org.alfresco.module.org_alfresco_module_rm.capability.RMPermissionModel;
import org.alfresco.module.org_alfresco_module_rm.model.RecordsManagementModel;
import org.alfresco.module.org_alfresco_module_rm.permission.RecordReadersDynamicAuthority;
import org.alfresco.module.org_alfresco_module_rm.record.RecordService;
import org.alfresco.repo.action.executer.ActionExecuterAbstractBase;
import org.alfresco.repo.security.authentication.AuthenticationUtil;
import org.alfresco.repo.security.authentication.AuthenticationUtil.RunAsWork;
import org.alfresco.service.cmr.action.Action;
import org.alfresco.service.cmr.action.ParameterDefinition;
import org.alfresco.service.cmr.repository.ChildAssociationRef;
import org.alfresco.service.cmr.repository.NodeRef;
import org.alfresco.service.cmr.repository.NodeService;
import org.alfresco.service.cmr.security.PermissionService;
import org.alfresco.service.namespace.QName;
/**
* Creates a new record from an existing content object.
*
* Note: This is a 'normal' dm action, rather than a records management action.
*
* @author Roy Wetherall
*/
public class CreateRecordAction extends ActionExecuterAbstractBase
implements RecordsManagementModel
{
private RecordsManagementService recordsManagementService;
private RecordService recordService;
private PermissionService permissionService;
private NodeService nodeService;
public void setRecordsManagementService(RecordsManagementService recordsManagementService)
{
this.recordsManagementService = recordsManagementService;
}
public void setRecordService(RecordService recordService)
{
this.recordService = recordService;
}
public void setPermissionService(PermissionService permissionService)
{
this.permissionService = permissionService;
}
public void setNodeService(NodeService nodeService)
{
this.nodeService = nodeService;
}
@Override
protected void executeImpl(Action action, final NodeRef actionedUponNodeRef)
{
// TODO we should use the file plan passed as a parameter
// grab the file plan
List<NodeRef> filePlans = recordsManagementService.getFilePlans();
if (filePlans.size() == 1)
{
final NodeRef filePlan = filePlans.get(0);
AuthenticationUtil.runAsSystem(new RunAsWork<Void>()
{
@Override
public Void doWork() throws Exception
{
// get the documents readers
Long aclId = nodeService.getNodeAclId(actionedUponNodeRef);
Set<String> readers = permissionService.getReaders(aclId);
// get the documents primary parent assoc
ChildAssociationRef parentAssoc = nodeService.getPrimaryParent(actionedUponNodeRef);
/// get the new record container for the file plan
NodeRef newRecordContainer = recordService.getNewRecordContainer(filePlan);
if (newRecordContainer == null)
{
throw new AlfrescoRuntimeException("Unable to create record, because new record container could not be found.");
}
// move the document into the file plan
nodeService.moveNode(actionedUponNodeRef, newRecordContainer, ContentModel.ASSOC_CONTAINS, parentAssoc.getQName());
// maintain the original primary location
nodeService.addChild(parentAssoc.getParentRef(), actionedUponNodeRef, parentAssoc.getTypeQName(), parentAssoc.getQName());
// add extended security information to the record
Map<QName, Serializable> props = new HashMap<QName, Serializable>(1);
props.put(PROP_READERS, (Serializable)readers);
nodeService.addAspect(actionedUponNodeRef, ASPECT_EXTENDED_RECORD_SECURITY, props);
// add permission so readers can still 'see' the new record
// Note: using the regular permission service as we don't want to reflect this permission up (and down) the
// hierarchy
permissionService.setPermission(actionedUponNodeRef,
RecordReadersDynamicAuthority.RECORD_READERS,
RMPermissionModel.READ_RECORDS,
true);
return null;
}
});
}
else
{
throw new AlfrescoRuntimeException("Unable to file file plan.");
}
}
@Override
protected void addParameterDefinitions(List<ParameterDefinition> params)
{
// TODO eventually we will need to pass in the file plan as a parameter
// TODO .. or the RM site
}
}

View File

@@ -64,7 +64,7 @@ public class DeclareRecordAction extends RMActionExecuterAbstractBase
{
if (recordsManagementService.isRecord(actionedUponNodeRef) == true)
{
if (recordsManagementService.isRecordDeclared(actionedUponNodeRef) == false)
if (recordService.isDeclared(actionedUponNodeRef) == false)
{
List<String> missingProperties = new ArrayList<String>(5);
// Aspect not already defined - check mandatory properties then add
@@ -195,7 +195,7 @@ public class DeclareRecordAction extends RMActionExecuterAbstractBase
{
if (recordsManagementService.isRecord(filePlanComponent) == true)
{
if (recordsManagementService.isRecordDeclared(filePlanComponent) == false)
if (recordService.isDeclared(filePlanComponent) == false)
{
// Aspect not already defined - check mandatory properties then add
List<String> missingProperties = new ArrayList<String>(10);

View File

@@ -114,7 +114,7 @@ public class SplitEmailAction extends RMActionExecuterAbstractBase
if (recordsManagementService.isRecord(actionedUponNodeRef) == true)
{
if (recordsManagementService.isRecordDeclared(actionedUponNodeRef) == false)
if (recordService.isDeclared(actionedUponNodeRef) == false)
{
ChildAssociationRef parent = nodeService.getPrimaryParent(actionedUponNodeRef);
@@ -175,7 +175,7 @@ public class SplitEmailAction extends RMActionExecuterAbstractBase
{
if (recordsManagementService.isRecord(filePlanComponent) == true)
{
if (recordsManagementService.isRecordDeclared(filePlanComponent))
if (recordService.isDeclared(filePlanComponent))
{
if (throwException)
{

View File

@@ -48,7 +48,7 @@ public class UndeclareRecordAction extends RMActionExecuterAbstractBase
{
if (recordsManagementService.isRecord(actionedUponNodeRef) == true)
{
if (recordsManagementService.isRecordDeclared(actionedUponNodeRef) == true)
if (recordService.isDeclared(actionedUponNodeRef) == true)
{
// Remove the declared aspect
this.nodeService.removeAspect(actionedUponNodeRef, ASPECT_DECLARED_RECORD);
@@ -73,7 +73,7 @@ public class UndeclareRecordAction extends RMActionExecuterAbstractBase
{
if (recordsManagementService.isRecord(filePlanComponent) == true)
{
if (recordsManagementService.isRecordDeclared(filePlanComponent) == true)
if (recordService.isDeclared(filePlanComponent) == true)
{
return true;
}

View File

@@ -22,7 +22,7 @@ import net.sf.acegisecurity.vote.AccessDecisionVoter;
import org.alfresco.module.org_alfresco_module_rm.RecordsManagementService;
import org.alfresco.module.org_alfresco_module_rm.caveat.RMCaveatConfigComponent;
import org.alfresco.module.org_alfresco_module_rm.model.RecordsManagementModel;
import org.alfresco.module.org_alfresco_module_rm.record.RecordService;
import org.alfresco.repo.security.authentication.AuthenticationUtil;
import org.alfresco.repo.transaction.AlfrescoTransactionSupport;
import org.alfresco.service.cmr.repository.NodeRef;
@@ -45,6 +45,7 @@ public class RMSecurityCommon
protected NodeService nodeService;
protected PermissionService permissionService;
protected RecordsManagementService rmService;
protected RecordService recordService;
protected RMCaveatConfigComponent caveatConfigComponent;
public void setNodeService(NodeService nodeService)
@@ -62,6 +63,11 @@ public class RMSecurityCommon
this.rmService = rmService;
}
public void setRecordService(RecordService recordService)
{
this.recordService = recordService;
}
public void setCaveatConfigComponent(RMCaveatConfigComponent caveatConfigComponent)
{
this.caveatConfigComponent = caveatConfigComponent;

View File

@@ -20,6 +20,7 @@ package org.alfresco.module.org_alfresco_module_rm.capability.declarative;
import org.alfresco.module.org_alfresco_module_rm.RecordsManagementService;
import org.alfresco.module.org_alfresco_module_rm.model.RecordsManagementModel;
import org.alfresco.module.org_alfresco_module_rm.record.RecordService;
import org.alfresco.service.cmr.repository.NodeService;
import org.alfresco.service.cmr.security.PermissionService;
import org.springframework.beans.factory.BeanNameAware;
@@ -38,6 +39,7 @@ public abstract class AbstractCapabilityCondition implements CapabilityCondition
/** Services */
protected RecordsManagementService rmService;
protected RecordService recordService;
protected PermissionService permissionService;
protected NodeService nodeService;
@@ -49,6 +51,14 @@ public abstract class AbstractCapabilityCondition implements CapabilityCondition
this.rmService = rmService;
}
/**
* @param recordService record service
*/
public void setRecordService(RecordService recordService)
{
this.recordService = recordService;
}
/**
* @param permissionService permission service
*/

View File

@@ -128,6 +128,9 @@ public class DeclarativeCapability extends AbstractCapability
this.isUndetermined = isUndetermined;
}
/**
* @return
*/
public boolean isUndetermined()
{
return isUndetermined;

View File

@@ -33,7 +33,7 @@ public class DeclaredCapabilityCondition extends AbstractCapabilityCondition
boolean result = false;
if (FilePlanComponentKind.RECORD.equals(rmService.getFilePlanComponentKind(nodeRef)) == true)
{
result = rmService.isRecordDeclared(nodeRef);
result = recordService.isDeclared(nodeRef);
}
return result;
}

View File

@@ -70,7 +70,7 @@ public class CreateCapability extends DeclarativeCapability
{
if(linkee == null)
{
if(rmService.isRecord(destination) && rmService.isRecordDeclared(destination) == false)
if(rmService.isRecord(destination) && recordService.isDeclared(destination) == false)
{
if (permissionService.hasPermission(destination, RMPermissionModel.FILE_RECORDS) == AccessStatus.ALLOWED)
{
@@ -80,7 +80,7 @@ public class CreateCapability extends DeclarativeCapability
}
else
{
if(rmService.isRecord(linkee) && rmService.isRecord(destination) && rmService.isRecordDeclared(destination) == false)
if(rmService.isRecord(linkee) && rmService.isRecord(destination) && recordService.isDeclared(destination) == false)
{
if (permissionService.hasPermission(destination, RMPermissionModel.FILE_RECORDS) == AccessStatus.ALLOWED)
{

View File

@@ -25,6 +25,7 @@ import java.util.Map;
import org.alfresco.module.org_alfresco_module_rm.RecordsManagementAdminService;
import org.alfresco.module.org_alfresco_module_rm.RecordsManagementService;
import org.alfresco.module.org_alfresco_module_rm.RecordsManagementServiceRegistry;
import org.alfresco.module.org_alfresco_module_rm.record.RecordService;
import org.alfresco.repo.forms.Field;
import org.alfresco.repo.forms.FieldGroup;
import org.alfresco.repo.forms.Form;
@@ -58,6 +59,7 @@ public abstract class RecordsManagementFormFilter<ItemType> extends AbstractFilt
protected RecordsManagementServiceRegistry rmServiceRegistry;
protected RecordsManagementService rmService;
protected RecordsManagementAdminService rmAdminService;
protected RecordService recordService;
/**
* Sets the NamespaceService instance
@@ -109,6 +111,14 @@ public abstract class RecordsManagementFormFilter<ItemType> extends AbstractFilt
this.rmAdminService = rmAdminService;
}
/**
* @param recordService record service
*/
public void setRecordService(RecordService recordService)
{
this.recordService = recordService;
}
/**
* Add property fields to group
*

View File

@@ -166,7 +166,7 @@ public class RecordsManagementNodeFormFilter extends RecordsManagementFormFilter
protected void addRecordMetadataPropertyFieldsToGroup(Form form, NodeRef nodeRef)
{
Set<QName> aspects = rmService.getRecordMetaDataAspects();
Set<QName> aspects = recordService.getRecordMetaDataAspects();
for (QName aspect : aspects)
{
@@ -214,7 +214,7 @@ public class RecordsManagementNodeFormFilter extends RecordsManagementFormFilter
{
if (rmService.isRecord(nodeRef) == true)
{
addTransientPropertyField(form, TRANSIENT_DECLARED, DataTypeDefinition.BOOLEAN, rmService.isRecordDeclared(nodeRef));
addTransientPropertyField(form, TRANSIENT_DECLARED, DataTypeDefinition.BOOLEAN, recordService.isDeclared(nodeRef));
}
DispositionSchedule ds = dispositionService.getDispositionSchedule(nodeRef);

View File

@@ -120,7 +120,7 @@ public class IdentifierServiceImpl implements IdentifierService
}
/**
* Generate an identifier for a given type of object with the acompanying context.
* Generate an identifier for a given type of object with the accompanying context.
*
* @param type content type
* @param context context

View File

@@ -28,6 +28,7 @@ import org.alfresco.module.org_alfresco_module_rm.RecordsManagementService;
import org.alfresco.module.org_alfresco_module_rm.capability.Capability;
import org.alfresco.module.org_alfresco_module_rm.capability.CapabilityService;
import org.alfresco.module.org_alfresco_module_rm.model.RecordsManagementModel;
import org.alfresco.module.org_alfresco_module_rm.record.RecordService;
import org.alfresco.service.cmr.repository.NodeRef;
import org.alfresco.service.cmr.repository.NodeService;
import org.alfresco.service.cmr.security.AccessStatus;
@@ -49,6 +50,9 @@ public abstract class BaseEvaluator implements RecordsManagementModel
/** Records management service */
protected RecordsManagementService recordsManagementService;
/** Record service */
protected RecordService recordService;
/** Node service */
protected NodeService nodeService;
@@ -80,6 +84,14 @@ public abstract class BaseEvaluator implements RecordsManagementModel
this.recordsManagementService = recordsManagementService;
}
/**
* @param recordService record service
*/
public void setRecordService(RecordService recordService)
{
this.recordService = recordService;
}
/**
* @param nodeService node service
*/

View File

@@ -25,6 +25,7 @@ import org.alfresco.module.org_alfresco_module_rm.FilePlanComponentKind;
import org.alfresco.module.org_alfresco_module_rm.RecordsManagementService;
import org.alfresco.module.org_alfresco_module_rm.capability.CapabilityService;
import org.alfresco.module.org_alfresco_module_rm.capability.RMPermissionModel;
import org.alfresco.module.org_alfresco_module_rm.record.RecordService;
import org.alfresco.service.cmr.model.FileInfo;
import org.alfresco.service.cmr.repository.NodeRef;
import org.alfresco.service.cmr.security.AccessStatus;
@@ -41,6 +42,9 @@ public class JSONConversionComponent extends org.alfresco.repo.jscript.app.JSONC
/** Records management service */
private RecordsManagementService recordsManagementService;
/** Record service */
private RecordService recordService;
/** Capability service */
private CapabilityService capabilityService;
@@ -58,6 +62,14 @@ public class JSONConversionComponent extends org.alfresco.repo.jscript.app.JSONC
this.recordsManagementService = recordsManagementService;
}
/**
* @param recordService record service
*/
public void setRecordService(RecordService recordService)
{
this.recordService = recordService;
}
/**
* @param capabilityService capability service
*/
@@ -219,7 +231,7 @@ public class JSONConversionComponent extends org.alfresco.repo.jscript.app.JSONC
}
else
{
if (recordsManagementService.isRecordDeclared(nodeRef) == true)
if (recordService.isDeclared(nodeRef) == true)
{
result = "record";
}

View File

@@ -35,7 +35,7 @@ public class SplitEmailActionEvaluator extends BaseEvaluator
protected boolean evaluateImpl(NodeRef nodeRef)
{
boolean result = false;
if (recordsManagementService.isRecordDeclared(nodeRef) == false)
if (recordService.isDeclared(nodeRef) == false)
{
ContentData contentData = (ContentData)nodeService.getProperty(nodeRef, ContentModel.PROP_CONTENT);
if (contentData != null)

View File

@@ -57,6 +57,9 @@ public interface RecordsManagementModel extends RecordsManagementCustomModel
// Records management root container
public static final QName TYPE_FILE_PLAN = QName.createQName(RM_URI, "filePlan");
// New records container
public static final QName TYPE_NEW_RECORDS_CONTAINER = QName.createQName(RM_URI, "newRecordsContainer");
// Disposition instructions aspect
public static final QName ASPECT_SCHEDULED = QName.createQName(RM_URI, "scheduled");
public static final QName ASSOC_DISPOSITION_SCHEDULE = QName.createQName(RM_URI, "dispositionSchedule");
@@ -167,6 +170,7 @@ public interface RecordsManagementModel extends RecordsManagementCustomModel
public static final QName ASPECT_RECORDS_MANAGEMENT_ROOT = QName.createQName(RM_URI, "recordsManagementRoot");
public static final QName ASSOC_HOLDS = QName.createQName(RM_URI, "holds");
public static final QName ASSOC_TRANSFERS = QName.createQName(RM_URI, "transfers");
public static final QName ASSOC_NEW_RECORDS = QName.createQName(RM_URI, "newRecords");
// Hold type
public static final QName TYPE_HOLD = QName.createQName(RM_URI, "hold");
@@ -219,4 +223,8 @@ public interface RecordsManagementModel extends RecordsManagementCustomModel
public static final QName PROP_RS_DISPOITION_INSTRUCTIONS = QName.createQName(RM_URI, "recordSearchDispositionInstructions");
public static final QName PROP_RS_DISPOITION_AUTHORITY = QName.createQName(RM_URI, "recordSearchDispositionAuthority");
public static final QName PROP_RS_HOLD_REASON = QName.createQName(RM_URI, "recordSearchHoldReason");
// Extended record security aspect
public static final QName ASPECT_EXTENDED_RECORD_SECURITY = QName.createQName(RM_URI, "extendedRecordSecurity");
public static final QName PROP_READERS = QName.createQName(RM_URI, "readers");
}

View File

@@ -16,12 +16,13 @@
* You should have received a copy of the GNU Lesser General Public License
* along with Alfresco. If not, see <http://www.gnu.org/licenses/>.
*/
package org.alfresco.module.org_alfresco_module_rm.model;
package org.alfresco.module.org_alfresco_module_rm.model.behaviour;
import java.io.Serializable;
import java.util.Map;
import org.alfresco.module.org_alfresco_module_rm.RecordsManagementService;
import org.alfresco.module.org_alfresco_module_rm.model.RecordsManagementModel;
import org.alfresco.repo.copy.AbstractCopyBehaviourCallback;
import org.alfresco.repo.copy.CopyBehaviourCallback;
import org.alfresco.repo.copy.CopyDetails;

View File

@@ -0,0 +1,115 @@
/*
* Copyright (C) 2005-2011 Alfresco Software Limited.
*
* This file is part of Alfresco
*
* Alfresco is free software: you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* Alfresco is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public License
* along with Alfresco. If not, see <http://www.gnu.org/licenses/>.
*/
package org.alfresco.module.org_alfresco_module_rm.model.behaviour;
import java.io.Serializable;
import java.util.HashMap;
import java.util.Map;
import org.alfresco.model.ContentModel;
import org.alfresco.module.org_alfresco_module_rm.model.RecordsManagementModel;
import org.alfresco.repo.node.NodeServicePolicies;
import org.alfresco.repo.policy.JavaBehaviour;
import org.alfresco.repo.policy.PolicyComponent;
import org.alfresco.repo.policy.Behaviour.NotificationFrequency;
import org.alfresco.service.cmr.repository.ChildAssociationRef;
import org.alfresco.service.cmr.repository.NodeRef;
import org.alfresco.service.cmr.repository.NodeService;
import org.alfresco.service.cmr.security.PermissionService;
import org.alfresco.service.namespace.QName;
/**
* Behaviour associated with the file plan type
*
* @author Roy Wetherall
*/
public class FilePlanType implements RecordsManagementModel,
NodeServicePolicies.OnCreateNodePolicy
{
/** Policy component */
private PolicyComponent policyComponent;
/** Node service */
private NodeService nodeService;
/** Permission service */
private PermissionService permissionService;
/** New record container name */
private static final String NAME_NR_CONTAINER = "New Records";
/**
* Set the policy component
* @param policyComponent policy component
*/
public void setPolicyComponent(PolicyComponent policyComponent)
{
this.policyComponent = policyComponent;
}
/**
* Set node service
* @param nodeService node service
*/
public void setNodeService(NodeService nodeService)
{
this.nodeService = nodeService;
}
public void setPermissionService(PermissionService permissionService)
{
this.permissionService = permissionService;
}
/**
* Bean initialisation method
*/
public void init()
{
policyComponent.bindClassBehaviour(
NodeServicePolicies.OnCreateNodePolicy.QNAME,
TYPE_FILE_PLAN,
new JavaBehaviour(this, "onCreateNode", NotificationFrequency.TRANSACTION_COMMIT));
}
/**
* @see org.alfresco.repo.node.NodeServicePolicies.OnCreateNodePolicy#onCreateNode(org.alfresco.service.cmr.repository.ChildAssociationRef)
*/
@Override
public void onCreateNode(ChildAssociationRef assoc)
{
// grab the newly created file plan
NodeRef filePlan = assoc.getChildRef();
// create the properties map
Map<QName, Serializable> properties = new HashMap<QName, Serializable>(1);
properties.put(ContentModel.PROP_NAME, NAME_NR_CONTAINER);
// create the 'new records' folder
NodeRef container = nodeService.createNode(
filePlan,
ASSOC_NEW_RECORDS,
QName.createQName(RM_URI, NAME_NR_CONTAINER),
TYPE_NEW_RECORDS_CONTAINER,
properties).getChildRef();
// set inheritance to false
permissionService.setInheritParentPermissions(container, false);
}
}

View File

@@ -16,11 +16,12 @@
* You should have received a copy of the GNU Lesser General Public License
* along with Alfresco. If not, see <http://www.gnu.org/licenses/>.
*/
package org.alfresco.module.org_alfresco_module_rm.model;
package org.alfresco.module.org_alfresco_module_rm.model.behaviour;
import java.io.Serializable;
import java.util.Map;
import org.alfresco.module.org_alfresco_module_rm.model.RecordsManagementModel;
import org.alfresco.repo.node.NodeServicePolicies;
import org.alfresco.repo.node.NodeServicePolicies.BeforeDeleteNodePolicy;
import org.alfresco.repo.node.NodeServicePolicies.OnUpdatePropertiesPolicy;

View File

@@ -16,11 +16,12 @@
* You should have received a copy of the GNU Lesser General Public License
* along with Alfresco. If not, see <http://www.gnu.org/licenses/>.
*/
package org.alfresco.module.org_alfresco_module_rm.model;
package org.alfresco.module.org_alfresco_module_rm.model.behaviour;
import org.alfresco.model.ContentModel;
import org.alfresco.module.org_alfresco_module_rm.action.RecordsManagementActionService;
import org.alfresco.module.org_alfresco_module_rm.identifier.IdentifierService;
import org.alfresco.module.org_alfresco_module_rm.model.RecordsManagementModel;
import org.alfresco.repo.node.NodeServicePolicies;
import org.alfresco.repo.policy.JavaBehaviour;
import org.alfresco.repo.policy.PolicyComponent;

View File

@@ -16,7 +16,7 @@
* You should have received a copy of the GNU Lesser General Public License
* along with Alfresco. If not, see <http://www.gnu.org/licenses/>.
*/
package org.alfresco.module.org_alfresco_module_rm.model;
package org.alfresco.module.org_alfresco_module_rm.model.behaviour;
import java.io.Serializable;
import java.util.ArrayList;
@@ -26,6 +26,7 @@ import java.util.Map;
import org.alfresco.module.org_alfresco_module_rm.RecordsManagementService;
import org.alfresco.module.org_alfresco_module_rm.RecordsManagementServiceRegistry;
import org.alfresco.module.org_alfresco_module_rm.action.RecordsManagementActionService;
import org.alfresco.module.org_alfresco_module_rm.model.RecordsManagementModel;
import org.alfresco.repo.copy.AbstractCopyBehaviourCallback;
import org.alfresco.repo.copy.CopyBehaviourCallback;
import org.alfresco.repo.copy.CopyDetails;

View File

@@ -16,7 +16,7 @@
* You should have received a copy of the GNU Lesser General Public License
* along with Alfresco. If not, see <http://www.gnu.org/licenses/>.
*/
package org.alfresco.module.org_alfresco_module_rm.model;
package org.alfresco.module.org_alfresco_module_rm.model.behaviour;
import java.io.Serializable;
import java.util.ArrayList;
@@ -36,6 +36,7 @@ import org.alfresco.module.org_alfresco_module_rm.disposition.DispositionSchedul
import org.alfresco.module.org_alfresco_module_rm.disposition.DispositionScheduleImpl;
import org.alfresco.module.org_alfresco_module_rm.disposition.DispositionService;
import org.alfresco.module.org_alfresco_module_rm.event.EventCompletionDetails;
import org.alfresco.module.org_alfresco_module_rm.model.RecordsManagementModel;
import org.alfresco.module.org_alfresco_module_rm.vital.VitalRecordDefinition;
import org.alfresco.module.org_alfresco_module_rm.vital.VitalRecordService;
import org.alfresco.repo.policy.JavaBehaviour;
@@ -315,13 +316,22 @@ public class RecordsManagementSearchBehaviour implements RecordsManagementModel
}
}
public void onAddRecordAspect(NodeRef nodeRef, QName aspectTypeQName)
public void onAddRecordAspect(final NodeRef nodeRef, final QName aspectTypeQName)
{
AuthenticationUtil.runAsSystem(new AuthenticationUtil.RunAsWork<Void>()
{
@Override
public Void doWork() throws Exception
{
if (nodeService.exists(nodeRef) == true)
{
applySearchAspect(nodeRef);
setupDispositionScheduleProperties(nodeRef);
}
return null;
}
});
}
public void recordFolderCreate(ChildAssociationRef childAssocRef)
@@ -494,13 +504,22 @@ public class RecordsManagementSearchBehaviour implements RecordsManagementModel
}
}
public void rmSearchAspectAdd(NodeRef nodeRef, QName aspectTypeQName)
public void rmSearchAspectAdd(final NodeRef nodeRef, final QName aspectTypeQName)
{
AuthenticationUtil.runAsSystem(new AuthenticationUtil.RunAsWork<Void>()
{
@Override
public Void doWork() throws Exception
{
if (nodeService.exists(nodeRef) == true)
{
// Initialise the search parameteres as required
setVitalRecordDefintionDetails(nodeRef);
}
return null;
}
});
}
public void vitalRecordDefintionAddAspect(NodeRef nodeRef, QName aspectTypeQName)

View File

@@ -16,8 +16,9 @@
* You should have received a copy of the GNU Lesser General Public License
* along with Alfresco. If not, see <http://www.gnu.org/licenses/>.
*/
package org.alfresco.module.org_alfresco_module_rm.model;
package org.alfresco.module.org_alfresco_module_rm.model.behaviour;
import org.alfresco.module.org_alfresco_module_rm.model.RecordsManagementModel;
import org.alfresco.module.org_alfresco_module_rm.search.RecordsManagementSearchService;
import org.alfresco.repo.node.NodeServicePolicies;
import org.alfresco.repo.policy.JavaBehaviour;

View File

@@ -16,9 +16,10 @@
* You should have received a copy of the GNU Lesser General Public License
* along with Alfresco. If not, see <http://www.gnu.org/licenses/>.
*/
package org.alfresco.module.org_alfresco_module_rm.model;
package org.alfresco.module.org_alfresco_module_rm.model.behaviour;
import org.alfresco.module.org_alfresco_module_rm.disposition.DispositionService;
import org.alfresco.module.org_alfresco_module_rm.model.RecordsManagementModel;
import org.alfresco.repo.node.NodeServicePolicies;
import org.alfresco.repo.policy.JavaBehaviour;
import org.alfresco.repo.policy.PolicyComponent;

View File

@@ -1,370 +0,0 @@
package org.alfresco.module.org_alfresco_module_rm.permission;
import java.io.Serializable;
import java.util.Collections;
import java.util.HashSet;
import java.util.LinkedHashSet;
import java.util.Set;
import org.alfresco.module.org_alfresco_module_rm.capability.RMPermissionModel;
import org.alfresco.repo.cache.SimpleCache;
import org.alfresco.repo.domain.permissions.AclDAO;
import org.alfresco.repo.security.permissions.AccessControlEntry;
import org.alfresco.repo.security.permissions.AccessControlList;
import org.alfresco.repo.security.permissions.PermissionEntry;
import org.alfresco.repo.security.permissions.PermissionReference;
import org.alfresco.repo.security.permissions.impl.ModelDAO;
import org.alfresco.repo.security.permissions.impl.PermissionServiceImpl;
import org.alfresco.repo.security.permissions.impl.RequiredPermission;
import org.alfresco.repo.security.permissions.impl.SimplePermissionReference;
import org.alfresco.service.cmr.security.AccessStatus;
import org.alfresco.service.cmr.security.PermissionService;
import org.alfresco.service.namespace.QName;
import org.alfresco.util.Pair;
public class OtherImpl extends PermissionServiceImpl
{
static SimplePermissionReference RM_OLD_ALL_PERMISSIONS_REFERENCE = SimplePermissionReference.getPermissionReference(
QName.createQName("", PermissionService.ALL_PERMISSIONS),
PermissionService.ALL_PERMISSIONS);
private SimpleCache<Serializable, Set<String>> rmReadersCache;
private AclDAO rmAclDaoComponent;
private ModelDAO rmModelDao;
public void setRmReadersCache(SimpleCache<Serializable, Set<String>> rmReadersCache)
{
this.rmReadersCache = rmReadersCache;
}
public void setRmAclDAO(AclDAO rmAclDaoComponent)
{
this.rmAclDaoComponent = rmAclDaoComponent;
}
public void setRmModelDAO(ModelDAO rmModelDao)
{
this.rmModelDao = rmModelDao;
}
@Override
public void setAnyDenyDenies(boolean anyDenyDenies)
{
super.setAnyDenyDenies(anyDenyDenies);
rmReadersCache.clear();
}
@Override
public Set<String> getReaders(Long aclId)
{
Set<String> dmReaders = super.getReaders(aclId);
Set<String> rmReaders = rmReadersCache.get(aclId);
if (rmReaders == null)
{
rmReaders = buildRMReaders(aclId);
rmReadersCache.put(aclId, rmReaders);
}
Set<String> result = new HashSet<String>();
result.addAll(dmReaders);
result.addAll(rmReaders);
return result;
}
private Set<String> buildRMReaders(Long aclId)
{
AccessControlList acl = rmAclDaoComponent.getAccessControlList(aclId);
if (acl == null)
{
return Collections.emptySet();
}
HashSet<String> assigned = new HashSet<String>();
HashSet<String> readers = new HashSet<String>();
for (AccessControlEntry ace : acl.getEntries())
{
assigned.add(ace.getAuthority());
}
PermissionReference permissionRef = getPermissionReference(RMPermissionModel.READ_RECORDS);
for (String authority : assigned)
{
RMUnconditionalAclTest rmTest = new RMUnconditionalAclTest(permissionRef);
if (rmTest.evaluate(authority, aclId))
{
readers.add(authority);
}
}
return Collections.unmodifiableSet(readers);
}
/**
* Ignores type and aspect requirements on the node
*
*/
private class RMUnconditionalAclTest
{
/*
* The required permission.
*/
PermissionReference required;
/*
* Granters of the permission
*/
Set<PermissionReference> granters;
/*
* The additional permissions required at the node level.
*/
Set<PermissionReference> nodeRequirements = new HashSet<PermissionReference>();
/*
* Constructor just gets the additional requirements
*/
RMUnconditionalAclTest(PermissionReference required)
{
this.required = required;
// Set the required node permissions
if (required.equals(getPermissionReference(ALL_PERMISSIONS)))
{
nodeRequirements = rmModelDao.getUnconditionalRequiredPermissions(getPermissionReference(PermissionService.FULL_CONTROL), RequiredPermission.On.NODE);
}
else
{
nodeRequirements = rmModelDao.getUnconditionalRequiredPermissions(required, RequiredPermission.On.NODE);
}
if (rmModelDao.getUnconditionalRequiredPermissions(required, RequiredPermission.On.PARENT).size() > 0)
{
throw new IllegalStateException("Parent permissions can not be checked for an acl");
}
if (rmModelDao.getUnconditionalRequiredPermissions(required, RequiredPermission.On.CHILDREN).size() > 0)
{
throw new IllegalStateException("Child permissions can not be checked for an acl");
}
// Find all the permissions that grant the allowed permission
// All permissions are treated specially.
granters = new LinkedHashSet<PermissionReference>(128, 1.0f);
granters.addAll(rmModelDao.getGrantingPermissions(required));
granters.add(getAllPermissionReference());
granters.add(RM_OLD_ALL_PERMISSIONS_REFERENCE);
}
/**
* Internal hook point for recursion
*
* @param authorisations
* @param nodeRef
* @param denied
* @param recursiveIn
* @return true if granted
*/
boolean evaluate(String authority, Long aclId)
{
// Start out true and "and" all other results
boolean success = true;
// Check the required permissions but not for sets they rely on
// their underlying permissions
//if (modelDAO.checkPermission(required))
//{
// We have to do the test as no parent will help us out
success &= hasSinglePermission(authority, aclId);
if (!success)
{
return false;
}
//}
// Check the other permissions required on the node
for (PermissionReference pr : nodeRequirements)
{
// Build a new test
RMUnconditionalAclTest nt = new RMUnconditionalAclTest(pr);
success &= nt.evaluate(authority, aclId);
if (!success)
{
return false;
}
}
return success;
}
boolean hasSinglePermission(String authority, Long aclId)
{
// Check global permission
if (checkGlobalPermissions(authority))
{
return true;
}
if(aclId == null)
{
return false;
}
else
{
return checkRequired(authority, aclId);
}
}
/**
* Check if we have a global permission
*
* @param authorisations
* @return true if granted
*/
private boolean checkGlobalPermissions(String authority)
{
for (PermissionEntry pe : rmModelDao.getGlobalPermissionEntries())
{
if (isGranted(pe, authority))
{
return true;
}
}
return false;
}
/**
* Check that a given authentication is available on a node
*
* @param authorisations
* @param nodeRef
* @param denied
* @return true if a check is required
*/
boolean checkRequired(String authority, Long aclId)
{
AccessControlList acl = rmAclDaoComponent.getAccessControlList(aclId);
if (acl == null)
{
return false;
}
Set<Pair<String, PermissionReference>> denied = new HashSet<Pair<String, PermissionReference>>();
// Check if each permission allows - the first wins.
// We could have other voting style mechanisms here
for (AccessControlEntry ace : acl.getEntries())
{
if (isGranted(ace, authority, denied))
{
return true;
}
}
return false;
}
/**
* Is a permission granted
*
* @param pe -
* the permissions entry to consider
* @param granters -
* the set of granters
* @param authorisations -
* the set of authorities
* @param denied -
* the set of denied permissions/authority pais
* @return true if granted
*/
private boolean isGranted(AccessControlEntry ace, String authority, Set<Pair<String, PermissionReference>> denied)
{
// If the permission entry denies then we just deny
if (ace.getAccessStatus() == AccessStatus.DENIED)
{
denied.add(new Pair<String, PermissionReference>(ace.getAuthority(), ace.getPermission()));
Set<PermissionReference> granters = rmModelDao.getGrantingPermissions(ace.getPermission());
for (PermissionReference granter : granters)
{
denied.add(new Pair<String, PermissionReference>(ace.getAuthority(), granter));
}
// All the things granted by this permission must be
// denied
Set<PermissionReference> grantees = rmModelDao.getGranteePermissions(ace.getPermission());
for (PermissionReference grantee : grantees)
{
denied.add(new Pair<String, PermissionReference>(ace.getAuthority(), grantee));
}
// All permission excludes all permissions available for
// the node.
if (ace.getPermission().equals(getAllPermissionReference()) || ace.getPermission().equals(RM_OLD_ALL_PERMISSIONS_REFERENCE))
{
for (PermissionReference deny : rmModelDao.getAllPermissions())
{
denied.add(new Pair<String, PermissionReference>(ace.getAuthority(), deny));
}
}
return false;
}
// The permission is allowed but we deny it as it is in the denied
// set
if (denied != null)
{
Pair<String, PermissionReference> specific = new Pair<String, PermissionReference>(ace.getAuthority(), required);
if (denied.contains(specific))
{
return false;
}
}
// If the permission has a match in both the authorities and
// granters list it is allowed
// It applies to the current user and it is granted
if (authority.equals(ace.getAuthority()) && granters.contains(ace.getPermission()))
{
{
return true;
}
}
// Default deny
return false;
}
private boolean isGranted(PermissionEntry pe, String authority)
{
// If the permission entry denies then we just deny
if (pe.isDenied())
{
return false;
}
// If the permission has a match in both the authorities and
// granters list it is allowed
// It applies to the current user and it is granted
if (granters.contains(pe.getPermissionReference()) && authority.equals(pe.getAuthority()))
{
{
return true;
}
}
// Default deny
return false;
}
}
}

View File

@@ -0,0 +1,130 @@
/*
* Copyright (C) 2005-2012 Alfresco Software Limited.
*
* This file is part of Alfresco
*
* Alfresco is free software: you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* Alfresco is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public License
* along with Alfresco. If not, see <http://www.gnu.org/licenses/>.
*/
package org.alfresco.module.org_alfresco_module_rm.permission;
import java.util.Set;
import org.alfresco.module.org_alfresco_module_rm.FilePlanComponentKind;
import org.alfresco.module.org_alfresco_module_rm.RecordsManagementService;
import org.alfresco.module.org_alfresco_module_rm.model.RecordsManagementModel;
import org.alfresco.repo.security.permissions.DynamicAuthority;
import org.alfresco.repo.security.permissions.PermissionReference;
import org.alfresco.service.cmr.repository.NodeRef;
import org.alfresco.service.cmr.repository.NodeService;
import org.alfresco.service.cmr.security.AuthorityService;
import org.springframework.beans.BeansException;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;
/**
* @author Roy Wetherall
* @since 2.1
*/
public class RecordReadersDynamicAuthority implements DynamicAuthority, RecordsManagementModel, ApplicationContextAware
{
public static final String RECORD_READERS = "ROLE_RECORD_READERS";
private RecordsManagementService recordsManagementService;
private NodeService nodeService;
private AuthorityService authorityService;
private ApplicationContext applicationContext;
private RecordsManagementService getRecordsManagementService()
{
if (recordsManagementService == null)
{
recordsManagementService = (RecordsManagementService)applicationContext.getBean("recordsManagementService");
}
return recordsManagementService;
}
private NodeService getNodeService()
{
if (nodeService == null)
{
nodeService = (NodeService)applicationContext.getBean("nodeService");
}
return nodeService;
}
private AuthorityService getAuthorityService()
{
if (authorityService == null)
{
authorityService = (AuthorityService)applicationContext.getBean("authorityService");
}
return authorityService;
}
@Override
public void setApplicationContext(ApplicationContext applicationContext) throws BeansException
{
this.applicationContext = applicationContext;
}
/**
* @see org.alfresco.repo.security.permissions.DynamicAuthority#getAuthority()
*/
@Override
public String getAuthority()
{
return RECORD_READERS;
}
/**
* @see org.alfresco.repo.security.permissions.DynamicAuthority#hasAuthority(org.alfresco.service.cmr.repository.NodeRef, java.lang.String)
*/
@SuppressWarnings("unchecked")
@Override
public boolean hasAuthority(NodeRef nodeRef, String userName)
{
boolean result = false;
FilePlanComponentKind kind = getRecordsManagementService().getFilePlanComponentKind(nodeRef);
if (FilePlanComponentKind.RECORD.equals(kind) == true)
{
if (getNodeService().hasAspect(nodeRef, ASPECT_EXTENDED_RECORD_SECURITY) == true)
{
result = true;
System.out.println("Setting hasAuthority to true! - " + userName + " - " + nodeRef.toString());
// Set<String> readers = (Set<String>)nodeService.getProperty(nodeRef, PROP_READERS);
// for (String reader : readers)
// {
// // check to see if the user is one of the readers or is contained there within
// }
}
}
return result;
}
/**
* @see org.alfresco.repo.security.permissions.DynamicAuthority#requiredFor()
*/
@Override
public Set<PermissionReference> requiredFor()
{
return null;
}
}

View File

@@ -0,0 +1,59 @@
/*
* Copyright (C) 2005-2012 Alfresco Software Limited.
*
* This file is part of Alfresco
*
* Alfresco is free software: you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* Alfresco is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public License
* along with Alfresco. If not, see <http://www.gnu.org/licenses/>.
*/
package org.alfresco.module.org_alfresco_module_rm.record;
import java.util.Set;
import org.alfresco.service.cmr.repository.NodeRef;
import org.alfresco.service.namespace.QName;
/**
*
* @author Roy Wetherall
* @since 2.1
*/
public interface RecordService
{
/**
* Get a list of all the record meta-data aspects
*
* @return {@link Set}<{@link QName}> list of record meta-data aspects
*/
Set<QName> getRecordMetaDataAspects();
/**
* Indicates whether the record is declared
*
* @param nodeRef node reference (record)
* @return boolean true if record is declared, false otherwise
*/
boolean isDeclared(NodeRef nodeRef);
// TODO boolean isRecordFiled(NodeRef record);
// TODO boolean isRecordClassified(NodeRef record);
NodeRef getNewRecordContainer(NodeRef filePlan);
NodeRef createRecord(NodeRef filePlan, NodeRef document);
// TODO NodeRef createAndFileRecord(NodeRef recordFolder, NodeRef document);
// TODO void fileRecord(NodeRef recordFolder, NodeRef record);
}

View File

@@ -0,0 +1,201 @@
/*
* Copyright (C) 2005-2012 Alfresco Software Limited.
*
* This file is part of Alfresco
*
* Alfresco is free software: you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* Alfresco is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public License
* along with Alfresco. If not, see <http://www.gnu.org/licenses/>.
*/
package org.alfresco.module.org_alfresco_module_rm.record;
import java.util.Collection;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import org.alfresco.error.AlfrescoRuntimeException;
import org.alfresco.model.ContentModel;
import org.alfresco.module.org_alfresco_module_rm.RecordsManagementService;
import org.alfresco.module.org_alfresco_module_rm.identifier.IdentifierService;
import org.alfresco.module.org_alfresco_module_rm.model.RecordsManagementModel;
import org.alfresco.repo.policy.JavaBehaviour;
import org.alfresco.repo.policy.PolicyComponent;
import org.alfresco.repo.policy.Behaviour.NotificationFrequency;
import org.alfresco.service.cmr.dictionary.AspectDefinition;
import org.alfresco.service.cmr.dictionary.DictionaryService;
import org.alfresco.service.cmr.repository.ChildAssociationRef;
import org.alfresco.service.cmr.repository.NodeRef;
import org.alfresco.service.cmr.repository.NodeService;
import org.alfresco.service.namespace.NamespaceService;
import org.alfresco.service.namespace.QName;
import org.alfresco.service.namespace.RegexQNamePattern;
/**
* @author Roy Wetherall
* @since 2.1
*/
public class RecordServiceImpl implements RecordService, RecordsManagementModel
{
private NodeService nodeService;
private IdentifierService identifierService;
private RecordsManagementService recordsManagementService;
private DictionaryService dictionaryService;
private PolicyComponent policyComponent;
/** List of available record meta-data aspects */
private Set<QName> recordMetaDataAspects;
public void setNodeService(NodeService nodeService)
{
this.nodeService = nodeService;
}
public void setIdentifierService(IdentifierService identifierService)
{
this.identifierService = identifierService;
}
public void setRecordsManagementService(RecordsManagementService recordsManagementService)
{
this.recordsManagementService = recordsManagementService;
}
public void setDictionaryService(DictionaryService dictionaryService)
{
this.dictionaryService = dictionaryService;
}
public void setPolicyComponent(PolicyComponent policyComponent)
{
this.policyComponent = policyComponent;
}
public void init()
{
policyComponent.bindAssociationBehaviour(
QName.createQName(NamespaceService.ALFRESCO_URI, "onCreateChildAssociation"),
TYPE_NEW_RECORDS_CONTAINER,
ContentModel.ASSOC_CONTAINS,
new JavaBehaviour(this, "onCreateNewRecord", NotificationFrequency.TRANSACTION_COMMIT));
}
public void onCreateNewRecord(ChildAssociationRef childAssocRef, boolean bNew)
{
NodeRef nodeRef = childAssocRef.getChildRef();
if (nodeService.exists(nodeRef) == true)
{
QName type = nodeService.getType(nodeRef);
if (ContentModel.TYPE_CONTENT.equals(type) == true ||
dictionaryService.isSubClass(type, ContentModel.TYPE_CONTENT) == true)
{
makeRecord(nodeRef);
}
else
{
throw new AlfrescoRuntimeException("Only content can be created as a record.");
}
}
}
/**
* @see org.alfresco.module.org_alfresco_module_rm.record.RecordService#getRecordMetaDataAspects()
*/
public Set<QName> getRecordMetaDataAspects()
{
if (recordMetaDataAspects == null)
{
recordMetaDataAspects = new HashSet<QName>(7);
Collection<QName> aspects = dictionaryService.getAllAspects();
for (QName aspect : aspects)
{
AspectDefinition def = dictionaryService.getAspect(aspect);
if (def != null)
{
QName parent = def.getParentName();
if (parent != null && ASPECT_RECORD_META_DATA.equals(parent) == true)
{
recordMetaDataAspects.add(aspect);
}
}
}
}
return recordMetaDataAspects;
}
/**
* @see org.alfresco.module.org_alfresco_module_rm.record.RecordService#isDeclared(org.alfresco.service.cmr.repository.NodeRef)
*/
public boolean isDeclared(NodeRef record)
{
return (nodeService.hasAspect(record, ASPECT_DECLARED_RECORD));
}
/**
* @see org.alfresco.module.org_alfresco_module_rm.record.RecordService#getNewRecordContainer(org.alfresco.service.cmr.repository.NodeRef)
*/
public NodeRef getNewRecordContainer(NodeRef filePlan)
{
NodeRef result = null;
if (recordsManagementService.isFilePlan(filePlan) == true)
{
List<ChildAssociationRef> assocs = nodeService.getChildAssocs(filePlan, ASSOC_NEW_RECORDS, RegexQNamePattern.MATCH_ALL);
if (assocs.size() != 1)
{
throw new AlfrescoRuntimeException("Error getting the new record container, because the container cannot be indentified.");
}
result = assocs.get(0).getChildRef();
}
return result;
}
@Override
public NodeRef createRecord(NodeRef filePlan, NodeRef document)
{
// get the documents primary parent assoc
ChildAssociationRef parentAssoc = nodeService.getPrimaryParent(document);
/// get the new record container for the file plan
NodeRef newRecordContainer = getNewRecordContainer(filePlan);
if (newRecordContainer == null)
{
throw new AlfrescoRuntimeException("Unable to create record, because new record container could not be found.");
}
// move the document into the file plan
nodeService.moveNode(document, newRecordContainer, ContentModel.ASSOC_CONTAINS, parentAssoc.getQName());
// maintain the original primary location
nodeService.addChild(parentAssoc.getParentRef(), document, parentAssoc.getTypeQName(), parentAssoc.getQName());
return document;
}
/**
*
* @param document
*/
private void makeRecord(NodeRef document)
{
nodeService.addAspect(document, RecordsManagementModel.ASPECT_RECORD, null);
String recordId = identifierService.generateIdentifier(ASPECT_RECORD, nodeService.getPrimaryParent(document).getParentRef());
nodeService.setProperty(document, PROP_IDENTIFIER, recordId);
}
}

View File

@@ -33,8 +33,8 @@ import org.alfresco.module.org_alfresco_module_rm.capability.RMPermissionModel;
import org.alfresco.module.org_alfresco_module_rm.disposition.DispositionSchedule;
import org.alfresco.module.org_alfresco_module_rm.disposition.DispositionService;
import org.alfresco.module.org_alfresco_module_rm.model.RecordsManagementModel;
import org.alfresco.module.org_alfresco_module_rm.model.RecordsManagementSearchBehaviour;
import org.alfresco.module.org_alfresco_module_rm.model.RmSiteType;
import org.alfresco.module.org_alfresco_module_rm.model.behaviour.RecordsManagementSearchBehaviour;
import org.alfresco.module.org_alfresco_module_rm.model.behaviour.RmSiteType;
import org.alfresco.module.org_alfresco_module_rm.security.RecordsManagementSecurityService;
import org.alfresco.module.org_alfresco_module_rm.security.Role;
import org.alfresco.repo.security.authentication.AuthenticationUtil;

View File

@@ -20,28 +20,28 @@ package org.alfresco.module.org_alfresco_module_rm.script;
import java.io.File;
import java.io.IOException;
import java.io.StringWriter;
import java.io.PrintWriter;
import java.io.StringWriter;
import org.alfresco.model.ContentModel;
import org.alfresco.model.RenditionModel;
import org.alfresco.module.org_alfresco_module_rm.model.RecordsManagementModel;
import org.alfresco.module.org_alfresco_module_rm.model.RecordsManagementSearchBehaviour;
import org.alfresco.module.org_alfresco_module_rm.model.behaviour.RecordsManagementSearchBehaviour;
import org.alfresco.repo.exporter.ACPExportPackageHandler;
import org.alfresco.repo.web.scripts.content.StreamACP;
import org.alfresco.service.cmr.repository.NodeRef;
import org.alfresco.service.cmr.view.ExporterCrawlerParameters;
import org.alfresco.service.cmr.view.Location;
import org.alfresco.service.namespace.QName;
import org.springframework.extensions.webscripts.Status;
import org.springframework.extensions.webscripts.WebScriptException;
import org.springframework.extensions.webscripts.WebScriptRequest;
import org.springframework.extensions.webscripts.WebScriptResponse;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.json.JSONException;
import org.json.JSONObject;
import org.json.JSONTokener;
import org.springframework.extensions.webscripts.Status;
import org.springframework.extensions.webscripts.WebScriptException;
import org.springframework.extensions.webscripts.WebScriptRequest;
import org.springframework.extensions.webscripts.WebScriptResponse;
/**
* Creates an RM specific ACP file of nodes to export then streams it back

View File

@@ -24,7 +24,7 @@ import java.util.List;
import java.util.Map;
import java.util.Set;
import org.alfresco.module.org_alfresco_module_rm.RecordsManagementService;
import org.alfresco.module.org_alfresco_module_rm.record.RecordService;
import org.alfresco.service.cmr.dictionary.AspectDefinition;
import org.alfresco.service.cmr.dictionary.DictionaryService;
import org.alfresco.service.namespace.NamespaceService;
@@ -41,7 +41,7 @@ public class RecordMetaDataAspectsGet extends DeclarativeWebScript
{
protected DictionaryService dictionaryService;
protected NamespaceService namespaceService;
protected RecordsManagementService recordsManagementService;
protected RecordService recordService;
/**
* Set the dictionary service instance
@@ -63,9 +63,12 @@ public class RecordMetaDataAspectsGet extends DeclarativeWebScript
this.namespaceService = namespaceService;
}
public void setRecordsManagementService(RecordsManagementService recordsManagementService)
/**
* @param recordService record service
*/
public void setRecordService(RecordService recordService)
{
this.recordsManagementService = recordsManagementService;
this.recordService = recordService;
}
/*
@@ -75,7 +78,7 @@ public class RecordMetaDataAspectsGet extends DeclarativeWebScript
protected Map<String, Object> executeImpl(WebScriptRequest req, Status status, Cache cache)
{
// Get the details of all the aspects
Set<QName> aspectQNames = recordsManagementService.getRecordMetaDataAspects();
Set<QName> aspectQNames = recordService.getRecordMetaDataAspects();
List<Map<String, Object>> aspects = new ArrayList<Map<String,Object>>(aspectQNames.size()+1);
for (QName aspectQName : aspectQNames)
{

View File

@@ -24,17 +24,17 @@ import java.io.IOException;
import org.alfresco.model.ContentModel;
import org.alfresco.model.RenditionModel;
import org.alfresco.module.org_alfresco_module_rm.model.RecordsManagementModel;
import org.alfresco.module.org_alfresco_module_rm.model.RecordsManagementSearchBehaviour;
import org.alfresco.module.org_alfresco_module_rm.model.behaviour.RecordsManagementSearchBehaviour;
import org.alfresco.service.cmr.repository.NodeRef;
import org.alfresco.service.cmr.view.ExporterCrawlerParameters;
import org.alfresco.service.cmr.view.Location;
import org.alfresco.service.namespace.QName;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.springframework.extensions.webscripts.Cache;
import org.springframework.extensions.webscripts.Status;
import org.springframework.extensions.webscripts.WebScriptRequest;
import org.springframework.extensions.webscripts.WebScriptResponse;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
/**
* Streams the nodes of a transfer object to the client in the form of an

View File

@@ -25,7 +25,7 @@ import java.util.Map;
import java.util.Set;
import org.alfresco.module.org_alfresco_module_rm.RecordsManagementAdminService;
import org.alfresco.module.org_alfresco_module_rm.RecordsManagementService;
import org.alfresco.module.org_alfresco_module_rm.record.RecordService;
import org.alfresco.service.cmr.dictionary.AspectDefinition;
import org.alfresco.service.cmr.dictionary.DictionaryService;
import org.alfresco.service.cmr.dictionary.PropertyDefinition;
@@ -43,35 +43,45 @@ import org.springframework.extensions.webscripts.WebScriptRequest;
*/
public class RMSearchPropertiesGet extends DeclarativeWebScript
{
/** Services */
private RecordsManagementAdminService adminService;
private RecordsManagementService recordsManagementService;
private RecordService recordService;
private DictionaryService dictionaryService;
private NamespaceService namespaceService;
/**
* @param adminService records management admin service
*/
public void setAdminService(RecordsManagementAdminService adminService)
{
this.adminService = adminService;
}
public void setRecordsManagementService(RecordsManagementService recordsManagementService)
/**
* @param recordService record service
*/
public void setRecordService(RecordService recordService)
{
this.recordsManagementService = recordsManagementService;
this.recordService = recordService;
}
/**
* @param dictionaryService dictionary service
*/
public void setDictionaryService(DictionaryService dictionaryService)
{
this.dictionaryService = dictionaryService;
}
/**
* @param namespaceService namespace service
*/
public void setNamespaceService(NamespaceService namespaceService)
{
this.namespaceService = namespaceService;
}
/*
/**
* @see org.alfresco.web.scripts.DeclarativeWebScript#executeImpl(org.alfresco.web.scripts.WebScriptRequest, org.alfresco.web.scripts.Status, org.alfresco.web.scripts.Cache)
*/
@Override
@@ -81,7 +91,7 @@ public class RMSearchPropertiesGet extends DeclarativeWebScript
List<Group> groups = new ArrayList<Group>(5);
Set<QName> aspects = recordsManagementService.getRecordMetaDataAspects();
Set<QName> aspects = recordService.getRecordMetaDataAspects();
for (QName aspect : aspects)
{
Map<QName, PropertyDefinition> properties = dictionaryService.getPropertyDefs(aspect);

View File

@@ -21,6 +21,7 @@ package org.alfresco.module.org_alfresco_module_rm.test.service;
import java.util.List;
import java.util.Set;
import org.alfresco.error.AlfrescoRuntimeException;
import org.alfresco.module.org_alfresco_module_rm.FilePlanComponentKind;
import org.alfresco.module.org_alfresco_module_rm.RecordsManagementService;
import org.alfresco.module.org_alfresco_module_rm.dod5015.DOD5015Model;
@@ -591,7 +592,7 @@ public class RecordsManagementServiceImplTest extends BaseRMTestCase
@Override
public Void run()
{
Set<QName> aspects = rmService.getRecordMetaDataAspects();
Set<QName> aspects = recordService.getRecordMetaDataAspects();
assertNotNull(aspects);
assertEquals(5, aspects.size());
assertTrue(aspects.containsAll(
@@ -613,6 +614,45 @@ public class RecordsManagementServiceImplTest extends BaseRMTestCase
// TODO void testIsRecordDeclared(NodeRef nodeRef);
public void testGetNewRecordsContainer()
{
doTestInTransaction(new Test<Void>()
{
@Override
public Void run()
{
NodeRef result1 = recordService.getNewRecordContainer(filePlan);
assertNotNull(result1);
assertEquals(TYPE_NEW_RECORDS_CONTAINER, nodeService.getType(result1));
assertNull(recordService.getNewRecordContainer(rmContainer));
assertNull(recordService.getNewRecordContainer(rmFolder));
return null;
}
});
// Failure: File plan with no new record container
doTestInTransaction(new FailureTest
(
"The newly created file plan shouldn't yet have a new record container.",
AlfrescoRuntimeException.class
)
{
@Override
public void run()
{
NodeRef newFilePlan = rmService.createFilePlan(folder, GUID.generate());
recordService.getNewRecordContainer(newFilePlan);
}
});
}
public void testCreateRecord()
{
}
/********** RM2 - Multi-hierarchy record taxonomy's **********/
/**

View File

@@ -20,7 +20,7 @@ package org.alfresco.module.org_alfresco_module_rm.test.service;
import java.util.Date;
import org.alfresco.module.org_alfresco_module_rm.model.RecordsManagementSearchBehaviour;
import org.alfresco.module.org_alfresco_module_rm.model.behaviour.RecordsManagementSearchBehaviour;
import org.alfresco.module.org_alfresco_module_rm.test.util.BaseRMTestCase;
import org.alfresco.module.org_alfresco_module_rm.vital.VitalRecordDefinition;
import org.alfresco.repo.security.authentication.AuthenticationUtil;

View File

@@ -1,812 +0,0 @@
/*
* Copyright (C) 2005-2011 Alfresco Software Limited.
*
* This file is part of Alfresco
*
* Alfresco is free software: you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* Alfresco is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public License
* along with Alfresco. If not, see <http://www.gnu.org/licenses/>.
*/
package org.alfresco.module.org_alfresco_module_rm.test.system;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import javax.transaction.UserTransaction;
import org.alfresco.model.ContentModel;
import org.alfresco.module.org_alfresco_module_rm.RecordsManagementService;
import org.alfresco.module.org_alfresco_module_rm.action.RecordsManagementActionService;
import org.alfresco.module.org_alfresco_module_rm.action.impl.BroadcastDispositionActionDefinitionUpdateAction;
import org.alfresco.module.org_alfresco_module_rm.action.impl.FileAction;
import org.alfresco.module.org_alfresco_module_rm.disposition.DispositionAction;
import org.alfresco.module.org_alfresco_module_rm.disposition.DispositionActionDefinition;
import org.alfresco.module.org_alfresco_module_rm.disposition.DispositionSchedule;
import org.alfresco.module.org_alfresco_module_rm.disposition.DispositionService;
import org.alfresco.module.org_alfresco_module_rm.event.RecordsManagementEvent;
import org.alfresco.module.org_alfresco_module_rm.model.RecordsManagementModel;
import org.alfresco.module.org_alfresco_module_rm.test.util.TestUtilities;
import org.alfresco.module.org_alfresco_module_rm.vital.VitalRecordDefinition;
import org.alfresco.module.org_alfresco_module_rm.vital.VitalRecordService;
import org.alfresco.repo.security.authentication.AuthenticationUtil;
import org.alfresco.repo.transaction.RetryingTransactionHelper;
import org.alfresco.service.cmr.model.FileFolderService;
import org.alfresco.service.cmr.model.FileInfo;
import org.alfresco.service.cmr.repository.ChildAssociationRef;
import org.alfresco.service.cmr.repository.NodeRef;
import org.alfresco.service.cmr.repository.NodeService;
import org.alfresco.service.cmr.repository.Period;
import org.alfresco.service.cmr.repository.StoreRef;
import org.alfresco.service.cmr.search.SearchService;
import org.alfresco.service.namespace.NamespaceService;
import org.alfresco.service.namespace.QName;
import org.alfresco.service.namespace.RegexQNamePattern;
import org.alfresco.service.transaction.TransactionService;
import org.alfresco.util.BaseSpringTest;
/**
* System test for records management service.
*
* Awaiting refactoring into records management test.
*
* @author Roy Wetherall
*/
public class RecordsManagementServiceImplSystemTest extends BaseSpringTest implements RecordsManagementModel
{
protected static StoreRef SPACES_STORE = new StoreRef(StoreRef.PROTOCOL_WORKSPACE, "SpacesStore");
private NodeRef filePlan;
private FileFolderService fileFolderService;
private NodeService nodeService;
private NodeService unprotectedNodeService;
private RecordsManagementActionService rmActionService;
private RecordsManagementService rmService;
private SearchService searchService;
private TransactionService transactionService;
private RetryingTransactionHelper transactionHelper;
private DispositionService dispositionService;
private VitalRecordService vitalRecordService;
@Override
protected void onSetUpInTransaction() throws Exception
{
super.onSetUpInTransaction();
// Get the service required in the tests
this.fileFolderService = (FileFolderService)this.applicationContext.getBean("FileFolderService");
this.nodeService = (NodeService)this.applicationContext.getBean("NodeService");
this.unprotectedNodeService = (NodeService)this.applicationContext.getBean("nodeService");
this.transactionService = (TransactionService)this.applicationContext.getBean("TransactionService");
this.searchService = (SearchService)this.applicationContext.getBean("searchService");
this.rmActionService = (RecordsManagementActionService)this.applicationContext.getBean("recordsManagementActionService");
this.rmService = (RecordsManagementService)this.applicationContext.getBean("recordsManagementService");
this.transactionHelper = (RetryingTransactionHelper)this.applicationContext.getBean("retryingTransactionHelper");
this.dispositionService = (DispositionService)this.applicationContext.getBean("dispositionService");
vitalRecordService = (VitalRecordService)applicationContext.getBean("VitalRecordService");
// Set the current security context as admin
AuthenticationUtil.setFullyAuthenticatedUser(AuthenticationUtil.getAdminUserName());
// Get the test data
setUpTestData();
}
private void setUpTestData()
{
filePlan = TestUtilities.loadFilePlanData(applicationContext);
}
@Override
protected void onTearDownInTransaction() throws Exception
{
try
{
UserTransaction txn = transactionService.getUserTransaction(false);
txn.begin();
this.nodeService.deleteNode(filePlan);
txn.commit();
}
catch (Exception e)
{
// Nothing
//System.out.println("DID NOT DELETE FILE PLAN!");
}
}
public void testDispositionPresence() throws Exception
{
setComplete();
endTransaction();
// create a record category node in
final NodeRef nodeRef = transactionHelper.doInTransaction(new RetryingTransactionHelper.RetryingTransactionCallback<NodeRef>()
{
public NodeRef execute() throws Throwable
{
NodeRef rootNode = nodeService.getRootNode(SPACES_STORE);
Map<QName, Serializable> props = new HashMap<QName, Serializable>(1);
String recordCategoryName = "Test Record Category";
props.put(ContentModel.PROP_NAME, recordCategoryName);
NodeRef result = nodeService.createNode(rootNode, ContentModel.ASSOC_CHILDREN,
QName.createQName(NamespaceService.CONTENT_MODEL_1_0_URI, QName.createValidLocalName(recordCategoryName)),
TYPE_RECORD_CATEGORY, props).getChildRef();
return result;
}
});
// ensure the record category node has the scheduled aspect and the disposition schedule association
transactionHelper.doInTransaction(new RetryingTransactionHelper.RetryingTransactionCallback<Void>()
{
public Void execute() throws Throwable
{
assertTrue(nodeService.hasAspect(nodeRef, RecordsManagementModel.ASPECT_SCHEDULED));
List<ChildAssociationRef> scheduleAssocs = nodeService.getChildAssocs(nodeRef, ASSOC_DISPOSITION_SCHEDULE, RegexQNamePattern.MATCH_ALL);
assertNotNull(scheduleAssocs);
assertEquals(1, scheduleAssocs.size());
// test retrieval of the disposition schedule via RM service
DispositionSchedule schedule = dispositionService.getDispositionSchedule(nodeRef);
assertNotNull(schedule);
return null;
}
});
}
/**
* This test method contains a subset of the tests in TC 7-2 of the DoD doc.
* @throws Exception
*/
public void testRescheduleRecord_IsNotCutOff() throws Exception
{
final NodeRef recCat = TestUtilities.getRecordCategory(rmService, nodeService, "Reports", "AIS Audit Records");
// This RC has disposition instructions "Cut off monthly, hold 1 month, then destroy."
setComplete();
endTransaction();
// Create a suitable folder for this test.
final NodeRef testFolder = transactionHelper.doInTransaction(new RetryingTransactionHelper.RetryingTransactionCallback<NodeRef>()
{
public NodeRef execute() throws Throwable
{
Map<QName, Serializable> folderProps = new HashMap<QName, Serializable>(1);
String folderName = "testFolder" + System.currentTimeMillis();
folderProps.put(ContentModel.PROP_NAME, folderName);
NodeRef recordFolder = nodeService.createNode(recCat,
ContentModel.ASSOC_CONTAINS,
QName.createQName(NamespaceService.CONTENT_MODEL_1_0_URI, folderName),
TYPE_RECORD_FOLDER).getChildRef();
return recordFolder;
}
});
// Create a record in the test folder. File it and declare it.
final NodeRef testRecord = transactionHelper.doInTransaction(new RetryingTransactionHelper.RetryingTransactionCallback<NodeRef>()
{
public NodeRef execute() throws Throwable
{
final NodeRef result = nodeService.createNode(testFolder, ContentModel.ASSOC_CONTAINS,
QName.createQName(NamespaceService.CONTENT_MODEL_1_0_URI,
"Record" + System.currentTimeMillis() + ".txt"),
ContentModel.TYPE_CONTENT).getChildRef();
rmActionService.executeRecordsManagementAction(result, "file");
TestUtilities.declareRecord(result, unprotectedNodeService, rmActionService);
return result;
}
});
assertTrue("recCat missing scheduled aspect", nodeService.hasAspect(recCat, RecordsManagementModel.ASPECT_SCHEDULED));
assertFalse("folder should not have scheduled aspect", nodeService.hasAspect(testFolder, RecordsManagementModel.ASPECT_SCHEDULED));
assertFalse("record should not have scheduled aspect", nodeService.hasAspect(testRecord, RecordsManagementModel.ASPECT_SCHEDULED));
assertFalse("recCat should not have dispositionLifecycle aspect", nodeService.hasAspect(recCat, RecordsManagementModel.ASPECT_DISPOSITION_LIFECYCLE));
assertTrue("testFolder missing dispositionLifecycle aspect", nodeService.hasAspect(testFolder, RecordsManagementModel.ASPECT_DISPOSITION_LIFECYCLE));
assertFalse("testRecord should not have dispositionLifecycle aspect", nodeService.hasAspect(testRecord, RecordsManagementModel.ASPECT_DISPOSITION_LIFECYCLE));
// Change the cutoff conditions for the associated record category
final Date dateBeforeChange = transactionHelper.doInTransaction(new RetryingTransactionHelper.RetryingTransactionCallback<Date>()
{
public Date execute() throws Throwable
{
Date asOfDate = dispositionService.getNextDispositionAction(testFolder).getAsOfDate();
System.out.println("Going to change the disposition asOf Date.");
System.out.println(" - Original value: " + asOfDate);
// Now change "Cut off monthly, hold 1 month, then destroy."
// to "Cut off yearly, hold 1 month, then destroy."
List<DispositionActionDefinition> dads = dispositionService.getDispositionSchedule(testFolder).getDispositionActionDefinitions();
DispositionActionDefinition firstDAD = dads.get(0);
assertEquals("cutoff", firstDAD.getName());
NodeRef dadNode = firstDAD.getNodeRef();
nodeService.setProperty(dadNode, PROP_DISPOSITION_PERIOD, new Period("year|1"));
List<QName> updatedProps = new ArrayList<QName>(1);
updatedProps.add(PROP_DISPOSITION_PERIOD);
refreshDispositionActionDefinition(dadNode, updatedProps);
return asOfDate;
}
});
// view the record metadata to verify that the record has been rescheduled.
transactionHelper.doInTransaction(new RetryingTransactionHelper.RetryingTransactionCallback<Void>()
{
public Void execute() throws Throwable
{
DispositionAction nextDispositionAction = dispositionService.getNextDispositionAction(testFolder);
assertEquals("cutoff", nextDispositionAction.getName());
Date asOfDateAfterChange = nextDispositionAction.getAsOfDate();
System.out.println(" - Updated value: " + asOfDateAfterChange);
assertFalse("Expected disposition asOf date to change.", asOfDateAfterChange.equals(dateBeforeChange));
return null;
}
});
// Change the disposition type (e.g. time-based to event-based)
transactionHelper.doInTransaction(new RetryingTransactionHelper.RetryingTransactionCallback<Void>()
{
public Void execute() throws Throwable
{
List<RecordsManagementEvent> rmes = dispositionService.getNextDispositionAction(testFolder).getDispositionActionDefinition().getEvents();
System.out.println("Going to change the RMEs.");
System.out.println(" - Original value: " + rmes);
List<DispositionActionDefinition> dads = dispositionService.getDispositionSchedule(testFolder).getDispositionActionDefinitions();
DispositionActionDefinition firstDAD = dads.get(0);
assertEquals("cutoff", firstDAD.getName());
NodeRef dadNode = firstDAD.getNodeRef();
// nodeService.setProperty(dadNode, PROP_DISPOSITION_PERIOD, null);
List<String> eventNames= new ArrayList<String>();
eventNames.add("study_complete");
nodeService.setProperty(dadNode, PROP_DISPOSITION_EVENT, (Serializable)eventNames);
return null;
}
});
// Now add a second event to the same
transactionHelper.doInTransaction(new RetryingTransactionHelper.RetryingTransactionCallback<Void>()
{
public Void execute() throws Throwable
{
DispositionAction nextDispositionAction = dispositionService.getNextDispositionAction(testFolder);
StringBuilder buf = new StringBuilder();
for (RecordsManagementEvent e : nextDispositionAction.getDispositionActionDefinition().getEvents()) {
buf.append(e.getName()).append(',');
}
System.out.println("Going to change the RMEs again.");
System.out.println(" - Original value: " + buf.toString());
List<DispositionActionDefinition> dads = dispositionService.getDispositionSchedule(testFolder).getDispositionActionDefinitions();
DispositionActionDefinition firstDAD = dads.get(0);
assertEquals("cutoff", firstDAD.getName());
NodeRef dadNode = firstDAD.getNodeRef();
List<String> eventNames= new ArrayList<String>();
eventNames.add("study_complete");
eventNames.add("case_complete");
nodeService.setProperty(dadNode, PROP_DISPOSITION_EVENT, (Serializable)eventNames);
return null;
}
});
// View the record metadata to verify that the record has been rescheduled.
transactionHelper.doInTransaction(new RetryingTransactionHelper.RetryingTransactionCallback<Void>()
{
public Void execute() throws Throwable
{
DispositionAction nextDispositionAction = dispositionService.getNextDispositionAction(testFolder);
assertEquals("cutoff", nextDispositionAction.getName());
StringBuilder buf = new StringBuilder();
for (RecordsManagementEvent e : nextDispositionAction.getDispositionActionDefinition().getEvents()) {
buf.append(e.getName()).append(',');
}
System.out.println(" - Updated value: " + buf.toString());
assertFalse("Disposition should not be eligible.", nextDispositionAction.isEventsEligible());
return null;
}
});
// Tidy up test nodes.
transactionHelper.doInTransaction(new RetryingTransactionHelper.RetryingTransactionCallback<Void>()
{
public Void execute() throws Throwable
{
nodeService.deleteNode(testRecord);
// Change the disposition Period back to what it was.
List<DispositionActionDefinition> dads = dispositionService.getDispositionSchedule(testFolder).getDispositionActionDefinitions();
DispositionActionDefinition firstDAD = dads.get(0);
assertEquals("cutoff", firstDAD.getName());
NodeRef dadNode = firstDAD.getNodeRef();
nodeService.setProperty(dadNode, PROP_DISPOSITION_PERIOD, new Period("month|1"));
nodeService.deleteNode(testFolder);
return null;
}
});
}
private void refreshDispositionActionDefinition(NodeRef nodeRef, List<QName> updatedProps)
{
if (updatedProps != null)
{
Map<String, Serializable> params = new HashMap<String, Serializable>();
params.put(BroadcastDispositionActionDefinitionUpdateAction.CHANGED_PROPERTIES, (Serializable)updatedProps);
rmActionService.executeRecordsManagementAction(nodeRef, BroadcastDispositionActionDefinitionUpdateAction.NAME, params);
}
// Remove the unpublished update aspect
nodeService.removeAspect(nodeRef, ASPECT_UNPUBLISHED_UPDATE);
}
public void testGetDispositionInstructions() throws Exception
{
setComplete();
endTransaction();
// Get a record
// TODO
// Get a record folder
transactionHelper.doInTransaction(new RetryingTransactionHelper.RetryingTransactionCallback<Void>()
{
public Void execute() throws Throwable
{
NodeRef folderRecord = TestUtilities.getRecordFolder(rmService, nodeService, "Reports", "AIS Audit Records", "January AIS Audit Records");
assertNotNull(folderRecord);
assertEquals("January AIS Audit Records", nodeService.getProperty(folderRecord, ContentModel.PROP_NAME));
assertFalse(rmService.isRecord(folderRecord));
assertTrue(rmService.isRecordFolder(folderRecord));
assertFalse(rmService.isRecordCategory(folderRecord));
DispositionSchedule di = dispositionService.getDispositionSchedule(folderRecord);
assertNotNull(di);
assertEquals("N1-218-00-4 item 023", di.getDispositionAuthority());
assertEquals("Cut off monthly, hold 1 month, then destroy.", di.getDispositionInstructions());
assertFalse(di.isRecordLevelDisposition());
// Get a record category
NodeRef recordCategory = TestUtilities.getRecordCategory(rmService, nodeService, "Reports", "AIS Audit Records");
assertNotNull(recordCategory);
assertEquals("AIS Audit Records", nodeService.getProperty(recordCategory, ContentModel.PROP_NAME));
assertFalse(rmService.isRecord(recordCategory));
assertFalse(rmService.isRecordFolder(recordCategory));
assertTrue(rmService.isRecordCategory(recordCategory));
di = dispositionService.getDispositionSchedule(recordCategory);
assertNotNull(di);
assertEquals("N1-218-00-4 item 023", di.getDispositionAuthority());
assertEquals("Cut off monthly, hold 1 month, then destroy.", di.getDispositionInstructions());
assertFalse(di.isRecordLevelDisposition());
List<DispositionActionDefinition> das = di.getDispositionActionDefinitions();
assertNotNull(das);
assertEquals(2, das.size());
assertEquals("cutoff", das.get(0).getName());
assertEquals("destroy", das.get(1).getName());
return null;
}
});
}
public void testMoveRecordWithinFileplan()
{
setComplete();
endTransaction();
// We need record folders for test-filing as follows:
// 1. A 'clean' record folder with no disposition schedult and no review period.
// 2. A 'vital' record folder which has a review period defined.
// 3. A 'dispositionable' record folder which has an applicable disposition schedule.
//
// The example fileplan includes a folder which covers [2] and [3] together.
final NodeRef cleanRecordFolder = transactionHelper.doInTransaction(new RetryingTransactionHelper.RetryingTransactionCallback<NodeRef>()
{
public NodeRef execute() throws Throwable
{
NodeRef result = TestUtilities.getRecordFolder(rmService, nodeService, "Civilian Files", "Case Files and Papers", "Gilbert Competency Hearing");
assertNotNull("cleanRecordFolder was null", result);
final DispositionSchedule dispositionSchedule = dispositionService.getDispositionSchedule(result);
assertNull("cleanRecordFolder had non-null disposition instructions.", dispositionSchedule.getDispositionInstructions());
assertTrue("cleanRecordFolder had non-empty disposition instruction definitions.", dispositionSchedule.getDispositionActionDefinitions().isEmpty());
final VitalRecordDefinition vitalRecordDefinition = vitalRecordService.getVitalRecordDefinition(result);
assertEquals("cleanRecordFolder had wrong review period.", "0", vitalRecordDefinition.getReviewPeriod().getExpression());
assertNull("cleanRecordFolder had non-null review date.", vitalRecordDefinition.getNextReviewDate());
return result;
}
});
final NodeRef dispAndVitalRecordFolder = transactionHelper.doInTransaction(new RetryingTransactionHelper.RetryingTransactionCallback<NodeRef>()
{
public NodeRef execute() throws Throwable
{
NodeRef result = TestUtilities.getRecordFolder(rmService, nodeService, "Reports", "AIS Audit Records", "January AIS Audit Records");
assertNotNull("dispositionAndVitalRecordFolder was null", result);
final DispositionSchedule dispositionSchedule = dispositionService.getDispositionSchedule(result);
assertNotNull("dispositionAndVitalRecordFolder had null disposition instructions.", dispositionSchedule.getDispositionInstructions());
assertFalse("dispositionAndVitalRecordFolder had empty disposition instruction definitions.", dispositionSchedule.getDispositionActionDefinitions().isEmpty());
final VitalRecordDefinition vitalRecordDefinition = vitalRecordService.getVitalRecordDefinition(result);
assertFalse("dispositionAndVitalRecordFolder had wrong review period.", "none|0".equals(vitalRecordDefinition.getReviewPeriod().getExpression()));
assertNotNull("dispositionAndVitalRecordFolder had null review date.", vitalRecordDefinition.getNextReviewDate());
return result;
}
});
// Create a record in the 'clean' folder.
final NodeRef testRecord = transactionHelper.doInTransaction(new RetryingTransactionHelper.RetryingTransactionCallback<NodeRef>()
{
public NodeRef execute() throws Throwable
{
final NodeRef result = nodeService.createNode(cleanRecordFolder, ContentModel.ASSOC_CONTAINS,
QName.createQName(NamespaceService.CONTENT_MODEL_1_0_URI,
"Record" + System.currentTimeMillis() + ".txt"),
ContentModel.TYPE_CONTENT).getChildRef();
rmActionService.executeRecordsManagementAction(result, "file");
TestUtilities.declareRecord(result, unprotectedNodeService, rmActionService);
return result;
}
});
// Ensure it's devoid of all disposition and review-related state.
transactionHelper.doInTransaction(new RetryingTransactionHelper.RetryingTransactionCallback<Void>()
{
public Void execute() throws Throwable
{
final DispositionSchedule dispositionSchedule = dispositionService.getDispositionSchedule(testRecord);
assertNull("testRecord had non-null disposition instructions.", dispositionSchedule.getDispositionInstructions());
assertTrue("testRecord had non-empty disposition instruction definitions.", dispositionSchedule.getDispositionActionDefinitions().isEmpty());
final VitalRecordDefinition vitalRecordDefinition = vitalRecordService.getVitalRecordDefinition(testRecord);
assertEquals("testRecord had wrong review period.", "0", vitalRecordDefinition.getReviewPeriod().getExpression());
assertNull("testRecord had non-null review date.", vitalRecordDefinition.getNextReviewDate());
return null;
}
});
// Move from non-vital to vital - also non-dispositionable to dispositionable at the same time.
transactionHelper.doInTransaction(new RetryingTransactionHelper.RetryingTransactionCallback<Void>()
{
public Void execute() throws Throwable
{
nodeService.moveNode(testRecord, dispAndVitalRecordFolder, ContentModel.ASSOC_CONTAINS, ContentModel.ASSOC_CONTAINS);
return null;
}
});
// Assert that the disposition and review-related data are correct after the move.
transactionHelper.doInTransaction(new RetryingTransactionHelper.RetryingTransactionCallback<Void>()
{
public Void execute() throws Throwable
{
final DispositionSchedule dispositionSchedule = dispositionService.getDispositionSchedule(testRecord);
assertNotNull("testRecord had null disposition instructions.", dispositionSchedule.getDispositionInstructions());
assertFalse("testRecord had empty disposition instruction definitions.", dispositionSchedule.getDispositionActionDefinitions().isEmpty());
final VitalRecordDefinition vitalRecordDefinition = vitalRecordService.getVitalRecordDefinition(testRecord);
assertFalse("testRecord had wrong review period.", "0".equals(vitalRecordDefinition.getReviewPeriod().getExpression()));
assertNotNull("testRecord had null review date.", vitalRecordDefinition.getNextReviewDate());
return null;
}
});
// Move the test record back from vital to non-vital - also dispositionable to non-dispositionable at the same time.
transactionHelper.doInTransaction(new RetryingTransactionHelper.RetryingTransactionCallback<Void>()
{
public Void execute() throws Throwable
{
nodeService.moveNode(testRecord, cleanRecordFolder, ContentModel.ASSOC_CONTAINS, ContentModel.ASSOC_CONTAINS);
return null;
}
});
// Assert that the disposition and review-related data are correct after the move.
transactionHelper.doInTransaction(new RetryingTransactionHelper.RetryingTransactionCallback<Void>()
{
public Void execute() throws Throwable
{
final DispositionSchedule dispositionSchedule = dispositionService.getDispositionSchedule(testRecord);
assertNull("testRecord had non-null disposition instructions.", dispositionSchedule.getDispositionInstructions());
assertTrue("testRecord had non-empty disposition instruction definitions.", dispositionSchedule.getDispositionActionDefinitions().isEmpty());
final VitalRecordDefinition vitalRecordDefinition = vitalRecordService.getVitalRecordDefinition(testRecord);
assertEquals("testRecord had wrong review period.", "0", vitalRecordDefinition.getReviewPeriod().getExpression());
assertNull("testRecord had non-null review date.", vitalRecordDefinition.getNextReviewDate());
return null;
}
});
//TODO check the search aspect
// Tidy up.
transactionHelper.doInTransaction(new RetryingTransactionHelper.RetryingTransactionCallback<Void>()
{
public Void execute() throws Throwable
{
nodeService.deleteNode(testRecord);
return null;
}
});
}
public void testCopyRecordWithinFileplan()
{
setComplete();
endTransaction();
// We need record folders for test-filing as follows:
// 1. A 'clean' record folder with no disposition schedule and no review period.
// 2. A 'vital' record folder which has a review period defined.
// 3. A 'dispositionable' record folder which has an applicable disposition schedule.
//
// The example fileplan includes a folder which covers [2] and [3] together.
final NodeRef cleanRecordFolder = transactionHelper.doInTransaction(new RetryingTransactionHelper.RetryingTransactionCallback<NodeRef>()
{
public NodeRef execute() throws Throwable
{
NodeRef result = TestUtilities.getRecordFolder(rmService, nodeService, "Civilian Files", "Case Files and Papers", "Gilbert Competency Hearing");
assertNotNull("cleanRecordFolder was null", result);
final DispositionSchedule dispositionSchedule = dispositionService.getDispositionSchedule(result);
assertNull("cleanRecordFolder had non-null disposition instructions.", dispositionSchedule.getDispositionInstructions());
assertTrue("cleanRecordFolder had non-empty disposition instruction definitions.", dispositionSchedule.getDispositionActionDefinitions().isEmpty());
final VitalRecordDefinition vitalRecordDefinition = vitalRecordService.getVitalRecordDefinition(result);
assertEquals("cleanRecordFolder had wrong review period.", "0", vitalRecordDefinition.getReviewPeriod().getExpression());
assertNull("cleanRecordFolder had non-null review date.", vitalRecordDefinition.getNextReviewDate());
return result;
}
});
final NodeRef dispAndVitalRecordFolder = transactionHelper.doInTransaction(new RetryingTransactionHelper.RetryingTransactionCallback<NodeRef>()
{
public NodeRef execute() throws Throwable
{
NodeRef result = TestUtilities.getRecordFolder(rmService, nodeService, "Reports", "AIS Audit Records", "January AIS Audit Records");
assertNotNull("dispositionAndVitalRecordFolder was null", result);
final DispositionSchedule dispositionSchedule = dispositionService.getDispositionSchedule(result);
assertNotNull("dispositionAndVitalRecordFolder had null disposition instructions.", dispositionSchedule.getDispositionInstructions());
assertFalse("dispositionAndVitalRecordFolder had empty disposition instruction definitions.", dispositionSchedule.getDispositionActionDefinitions().isEmpty());
final VitalRecordDefinition vitalRecordDefinition = vitalRecordService.getVitalRecordDefinition(result);
assertFalse("dispositionAndVitalRecordFolder had wrong review period.", "none|0".equals(vitalRecordDefinition.getReviewPeriod().getExpression()));
assertNotNull("dispositionAndVitalRecordFolder had null review date.", vitalRecordDefinition.getNextReviewDate());
return result;
}
});
// Create a record in the 'clean' folder.
final NodeRef testRecord = transactionHelper.doInTransaction(new RetryingTransactionHelper.RetryingTransactionCallback<NodeRef>()
{
public NodeRef execute() throws Throwable
{
final NodeRef result = nodeService.createNode(cleanRecordFolder, ContentModel.ASSOC_CONTAINS,
QName.createQName(NamespaceService.CONTENT_MODEL_1_0_URI,
"Record" + System.currentTimeMillis() + ".txt"),
ContentModel.TYPE_CONTENT).getChildRef();
rmActionService.executeRecordsManagementAction(result, "file");
TestUtilities.declareRecord(result, unprotectedNodeService, rmActionService);
return result;
}
});
// Ensure it's devoid of all disposition and review-related state.
transactionHelper.doInTransaction(new RetryingTransactionHelper.RetryingTransactionCallback<Void>()
{
public Void execute() throws Throwable
{
final DispositionSchedule dispositionSchedule = dispositionService.getDispositionSchedule(testRecord);
assertNull("testRecord had non-null disposition instructions.", dispositionSchedule.getDispositionInstructions());
assertTrue("testRecord had non-empty disposition instruction definitions.", dispositionSchedule.getDispositionActionDefinitions().isEmpty());
final VitalRecordDefinition vitalRecordDefinition = vitalRecordService.getVitalRecordDefinition(testRecord);
assertEquals("testRecord had wrong review period.", "0", vitalRecordDefinition.getReviewPeriod().getExpression());
assertNull("testRecord had non-null review date.", vitalRecordDefinition.getNextReviewDate());
return null;
}
});
// Copy from non-vital to vital - also non-dispositionable to dispositionable at the same time.
final NodeRef copiedNode = transactionHelper.doInTransaction(new RetryingTransactionHelper.RetryingTransactionCallback<NodeRef>()
{
public NodeRef execute() throws Throwable
{
FileInfo fileInfo = fileFolderService.copy(testRecord, dispAndVitalRecordFolder, null);
NodeRef n = fileInfo.getNodeRef();
return n;
}
});
// Assert that the disposition and review-related data are correct after the copy.
transactionHelper.doInTransaction(new RetryingTransactionHelper.RetryingTransactionCallback<Void>()
{
public Void execute() throws Throwable
{
final DispositionSchedule dispositionSchedule = dispositionService.getDispositionSchedule(copiedNode);
assertNotNull("copiedNode had null disposition instructions.", dispositionSchedule.getDispositionInstructions());
assertFalse("copiedNode had empty disposition instruction definitions.", dispositionSchedule.getDispositionActionDefinitions().isEmpty());
final VitalRecordDefinition vitalRecordDefinition = vitalRecordService.getVitalRecordDefinition(copiedNode);
assertFalse("copiedNode had wrong review period.", "0".equals(vitalRecordDefinition.getReviewPeriod().getExpression()));
assertNotNull("copiedNode had null review date.", vitalRecordDefinition.getNextReviewDate());
return null;
}
});
// Create a record in the 'vital and disposition' folder.
final NodeRef testRecord2 = transactionHelper.doInTransaction(new RetryingTransactionHelper.RetryingTransactionCallback<NodeRef>()
{
public NodeRef execute() throws Throwable
{
final NodeRef result = nodeService.createNode(dispAndVitalRecordFolder, ContentModel.ASSOC_CONTAINS,
QName.createQName(NamespaceService.CONTENT_MODEL_1_0_URI,
"Record2" + System.currentTimeMillis() + ".txt"),
ContentModel.TYPE_CONTENT).getChildRef();
rmActionService.executeRecordsManagementAction(result, "file");
TestUtilities.declareRecord(result, unprotectedNodeService, rmActionService);
return result;
}
});
// Check the vital and disposition status.
transactionHelper.doInTransaction(new RetryingTransactionHelper.RetryingTransactionCallback<Void>()
{
public Void execute() throws Throwable
{
final DispositionSchedule dispositionSchedule = dispositionService.getDispositionSchedule(testRecord2);
assertNotNull("testRecord2 had null disposition instructions.", dispositionSchedule.getDispositionInstructions());
assertFalse("testRecord2 had empty disposition instruction definitions.", dispositionSchedule.getDispositionActionDefinitions().isEmpty());
final VitalRecordDefinition vitalRecordDefinition = vitalRecordService.getVitalRecordDefinition(testRecord2);
assertFalse("testRecord2 had wrong review period.", "0".equals(vitalRecordDefinition.getReviewPeriod().getExpression()));
assertNotNull("testRecord2 had null review date.", vitalRecordDefinition.getNextReviewDate());
return null;
}
});
// copy the record back from vital to non-vital - also dispositionable to non-dispositionable at the same time.
final NodeRef copiedBackNode = transactionHelper.doInTransaction(new RetryingTransactionHelper.RetryingTransactionCallback<NodeRef>()
{
public NodeRef execute() throws Throwable
{
FileInfo fileInfo = fileFolderService.copy(testRecord2, cleanRecordFolder, null); // TODO Something wrong here.
NodeRef n = fileInfo.getNodeRef();
return n;
}
});
// Assert that the disposition and review-related data are correct after the copy-back.
transactionHelper.doInTransaction(new RetryingTransactionHelper.RetryingTransactionCallback<Void>()
{
public Void execute() throws Throwable
{
final DispositionSchedule dispositionSchedule = dispositionService.getDispositionSchedule(copiedBackNode);
assertNull("copiedBackNode had non-null disposition instructions.", dispositionSchedule.getDispositionInstructions());
assertTrue("copiedBackNode had non-empty disposition instruction definitions.", dispositionSchedule.getDispositionActionDefinitions().isEmpty());
final VitalRecordDefinition vitalRecordDefinition = vitalRecordService.getVitalRecordDefinition(copiedBackNode);
assertEquals("copiedBackNode had wrong review period.", "0", vitalRecordDefinition.getReviewPeriod().getExpression());
assertNull("copiedBackNode had non-null review date.", vitalRecordDefinition.getNextReviewDate());
return null;
}
});
//TODO check the search aspect
// Tidy up.
transactionHelper.doInTransaction(new RetryingTransactionHelper.RetryingTransactionCallback<Void>()
{
public Void execute() throws Throwable
{
nodeService.deleteNode(copiedBackNode);
nodeService.deleteNode(testRecord2);
nodeService.deleteNode(copiedNode);
nodeService.deleteNode(testRecord);
return null;
}
});
}
public void xxxtestUpdateNextDispositionAction()
{
setComplete();
endTransaction();
final FileAction fileAction = (FileAction)applicationContext.getBean("file");
transactionHelper.doInTransaction(new RetryingTransactionHelper.RetryingTransactionCallback<Void>()
{
public Void execute() throws Throwable
{
// Get a record folder
NodeRef folderRecord = TestUtilities.getRecordFolder(rmService, nodeService, "Reports", "AIS Audit Records", "January AIS Audit Records");
assertNotNull(folderRecord);
assertEquals("January AIS Audit Records", nodeService.getProperty(folderRecord, ContentModel.PROP_NAME));
DispositionSchedule di = dispositionService.getDispositionSchedule(folderRecord);
assertNotNull(di);
assertEquals("N1-218-00-4 item 023", di.getDispositionAuthority());
assertEquals("Cut off monthly, hold 1 month, then destroy.", di.getDispositionInstructions());
assertFalse(di.isRecordLevelDisposition());
assertFalse(nodeService.hasAspect(folderRecord, ASPECT_DISPOSITION_LIFECYCLE));
fileAction.updateNextDispositionAction(folderRecord);
// Check the next disposition action
assertTrue(nodeService.hasAspect(folderRecord, ASPECT_DISPOSITION_LIFECYCLE));
NodeRef ndNodeRef = nodeService.getChildAssocs(folderRecord, ASSOC_NEXT_DISPOSITION_ACTION, RegexQNamePattern.MATCH_ALL).get(0).getChildRef();
assertNotNull(ndNodeRef);
assertEquals("cutoff", nodeService.getProperty(ndNodeRef, PROP_DISPOSITION_ACTION));
assertEquals(di.getDispositionActionDefinitions().get(0).getId(), nodeService.getProperty(ndNodeRef, PROP_DISPOSITION_ACTION_ID));
assertNotNull(nodeService.getProperty(ndNodeRef, PROP_DISPOSITION_AS_OF));
// Check the history is empty
// TODO
Map<QName, Serializable> props = new HashMap<QName, Serializable>(1);
props.put(PROP_CUT_OFF_DATE, new Date());
unprotectedNodeService.addAspect(folderRecord, ASPECT_CUT_OFF, props);
fileAction.updateNextDispositionAction(folderRecord);
assertTrue(nodeService.hasAspect(folderRecord, ASPECT_DISPOSITION_LIFECYCLE));
ndNodeRef = nodeService.getChildAssocs(folderRecord, ASSOC_NEXT_DISPOSITION_ACTION, RegexQNamePattern.MATCH_ALL).get(0).getChildRef();
assertNotNull(ndNodeRef);
assertEquals("destroy", nodeService.getProperty(ndNodeRef, PROP_DISPOSITION_ACTION));
assertEquals(di.getDispositionActionDefinitions().get(1).getId(), nodeService.getProperty(ndNodeRef, PROP_DISPOSITION_ACTION_ID));
assertNotNull(nodeService.getProperty(ndNodeRef, PROP_DISPOSITION_AS_OF));
// Check the history has an action
// TODO
fileAction.updateNextDispositionAction(folderRecord);
assertTrue(nodeService.hasAspect(folderRecord, ASPECT_DISPOSITION_LIFECYCLE));
assertTrue(nodeService.getChildAssocs(folderRecord, ASSOC_NEXT_DISPOSITION_ACTION, RegexQNamePattern.MATCH_ALL).isEmpty());
// Check the history has both actions
// TODO
return null;
}
});
}
}

View File

@@ -31,7 +31,8 @@ import org.alfresco.module.org_alfresco_module_rm.disposition.DispositionSchedul
import org.alfresco.module.org_alfresco_module_rm.disposition.DispositionService;
import org.alfresco.module.org_alfresco_module_rm.event.RecordsManagementEventService;
import org.alfresco.module.org_alfresco_module_rm.model.RecordsManagementModel;
import org.alfresco.module.org_alfresco_module_rm.model.RmSiteType;
import org.alfresco.module.org_alfresco_module_rm.model.behaviour.RmSiteType;
import org.alfresco.module.org_alfresco_module_rm.record.RecordService;
import org.alfresco.module.org_alfresco_module_rm.search.RecordsManagementSearchService;
import org.alfresco.module.org_alfresco_module_rm.security.RecordsManagementSecurityService;
import org.alfresco.module.org_alfresco_module_rm.vital.VitalRecordService;
@@ -40,6 +41,7 @@ import org.alfresco.repo.security.authentication.AuthenticationUtil;
import org.alfresco.repo.transaction.RetryingTransactionHelper;
import org.alfresco.repo.transaction.RetryingTransactionHelper.RetryingTransactionCallback;
import org.alfresco.service.cmr.dictionary.DictionaryService;
import org.alfresco.service.cmr.model.FileFolderService;
import org.alfresco.service.cmr.repository.ContentService;
import org.alfresco.service.cmr.repository.NodeRef;
import org.alfresco.service.cmr.repository.NodeService;
@@ -101,6 +103,7 @@ public abstract class BaseRMTestCase extends RetryingTransactionHelperTestCase
protected AuthorityService authorityService;
protected PersonService personService;
protected TransactionService transactionService;
protected FileFolderService fileFolderService;
/** RM Services */
protected RecordsManagementService rmService;
@@ -112,6 +115,7 @@ public abstract class BaseRMTestCase extends RetryingTransactionHelperTestCase
protected RecordsManagementSecurityService securityService;
protected CapabilityService capabilityService;
protected VitalRecordService vitalRecordService;
protected RecordService recordService;
/** test data */
protected StoreRef storeRef;
@@ -255,6 +259,7 @@ public abstract class BaseRMTestCase extends RetryingTransactionHelperTestCase
authenticationService = (MutableAuthenticationService)this.applicationContext.getBean("AuthenticationService");
personService = (PersonService)this.applicationContext.getBean("PersonService");
transactionService = (TransactionService)applicationContext.getBean("TransactionService");
fileFolderService = (FileFolderService)applicationContext.getBean("FileFolderService");
// Get RM services
rmService = (RecordsManagementService)applicationContext.getBean("RecordsManagementService");
@@ -266,6 +271,7 @@ public abstract class BaseRMTestCase extends RetryingTransactionHelperTestCase
securityService = (RecordsManagementSecurityService)this.applicationContext.getBean("RecordsManagementSecurityService");
capabilityService = (CapabilityService)this.applicationContext.getBean("CapabilityService");
vitalRecordService = (VitalRecordService)this.applicationContext.getBean("VitalRecordService");
recordService = (RecordService)this.applicationContext.getBean("RecordService");
}
/**
@@ -316,16 +322,24 @@ public abstract class BaseRMTestCase extends RetryingTransactionHelperTestCase
*/
protected void setupTestData()
{
retryingTransactionHelper.doInTransaction(new RetryingTransactionCallback<Object>()
doTestInTransaction(new Test<Void>()
{
@Override
public Object execute() throws Throwable
public Void run()
{
AuthenticationUtil.setFullyAuthenticatedUser(AuthenticationUtil.getAdminUserName());
setupTestDataImpl();
return null;
}
});
// check that the new records container has been created for the file plan
public void test(Void arg0) throws Exception
{
NodeRef newRecordsContainer = recordService.getNewRecordContainer(filePlan);
assertNotNull(newRecordsContainer);
assertEquals(TYPE_NEW_RECORDS_CONTAINER, nodeService.getType(newRecordsContainer));
};
},
AuthenticationUtil.getSystemUserName());
}
/**

View File

@@ -1,5 +1,20 @@
/**
/*
* Copyright (C) 2005-2012 Alfresco Software Limited.
*
* This file is part of Alfresco
*
* Alfresco is free software: you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* Alfresco is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public License
* along with Alfresco. If not, see <http://www.gnu.org/licenses/>.
*/
package org.alfresco.module.org_alfresco_module_rm.test.util;
@@ -17,7 +32,7 @@ import org.alfresco.module.org_alfresco_module_rm.disposition.DispositionSchedul
import org.alfresco.module.org_alfresco_module_rm.disposition.DispositionService;
import org.alfresco.module.org_alfresco_module_rm.event.RecordsManagementEventService;
import org.alfresco.module.org_alfresco_module_rm.model.RecordsManagementModel;
import org.alfresco.module.org_alfresco_module_rm.model.RmSiteType;
import org.alfresco.module.org_alfresco_module_rm.model.behaviour.RmSiteType;
import org.alfresco.module.org_alfresco_module_rm.search.RecordsManagementSearchService;
import org.alfresco.module.org_alfresco_module_rm.security.RecordsManagementSecurityService;
import org.alfresco.module.org_alfresco_module_rm.vital.VitalRecordService;

View File

@@ -35,7 +35,7 @@ import org.alfresco.module.org_alfresco_module_rm.RecordsManagementService;
import org.alfresco.module.org_alfresco_module_rm.action.RecordsManagementActionService;
import org.alfresco.module.org_alfresco_module_rm.disposition.DispositionService;
import org.alfresco.module.org_alfresco_module_rm.model.RecordsManagementModel;
import org.alfresco.module.org_alfresco_module_rm.model.RecordsManagementSearchBehaviour;
import org.alfresco.module.org_alfresco_module_rm.model.behaviour.RecordsManagementSearchBehaviour;
import org.alfresco.module.org_alfresco_module_rm.script.BootstrapTestDataGet;
import org.alfresco.module.org_alfresco_module_rm.security.RecordsManagementSecurityService;
import org.alfresco.service.cmr.repository.ChildAssociationRef;