diff --git a/rm-server/.classpath b/rm-server/.classpath index e2ff39fa0f..a600d64633 100644 --- a/rm-server/.classpath +++ b/rm-server/.classpath @@ -19,17 +19,8 @@ - - - - - - - - - @@ -279,5 +270,16 @@ + + + + + + + + + + + diff --git a/rm-server/config/alfresco/module/org_alfresco_module_rm/model/recordsModel.xml b/rm-server/config/alfresco/module/org_alfresco_module_rm/model/recordsModel.xml index 139e1dbe3d..0be4c0dee8 100644 --- a/rm-server/config/alfresco/module/org_alfresco_module_rm/model/recordsModel.xml +++ b/rm-server/config/alfresco/module/org_alfresco_module_rm/model/recordsModel.xml @@ -922,7 +922,7 @@ - TransferringS + Transferring diff --git a/rm-server/config/alfresco/module/org_alfresco_module_rm/module.properties b/rm-server/config/alfresco/module/org_alfresco_module_rm/module.properties index c5dde346e8..57dcc7aa7b 100644 --- a/rm-server/config/alfresco/module/org_alfresco_module_rm/module.properties +++ b/rm-server/config/alfresco/module/org_alfresco_module_rm/module.properties @@ -8,4 +8,4 @@ module.title=Records Management module.description=Alfresco Record Management Extension module.version=2.0 -module.repo.version.min=4.0 \ No newline at end of file +module.repo.version.min=4.0.1 \ No newline at end of file diff --git a/rm-server/config/alfresco/module/org_alfresco_module_rm/rm-service-context.xml b/rm-server/config/alfresco/module/org_alfresco_module_rm/rm-service-context.xml index f52e7a188d..b79e0f3e54 100644 --- a/rm-server/config/alfresco/module/org_alfresco_module_rm/rm-service-context.xml +++ b/rm-server/config/alfresco/module/org_alfresco_module_rm/rm-service-context.xml @@ -66,6 +66,7 @@ + + + + + + \ No newline at end of file diff --git a/rm-server/config/alfresco/templates/webscripts/org/alfresco/slingshot/forms/metadata.get.desc.xml b/rm-server/config/alfresco/templates/webscripts/org/alfresco/slingshot/forms/metadata.get.desc.xml new file mode 100644 index 0000000000..7a6af06ac1 --- /dev/null +++ b/rm-server/config/alfresco/templates/webscripts/org/alfresco/slingshot/forms/metadata.get.desc.xml @@ -0,0 +1,8 @@ + + RM node metadata retrieval service + Used by the extended RM forms service to retrieve RM node metadata. + /api/rmmetadata?noderef={noderef?}&type={type?} + + user + required + \ No newline at end of file diff --git a/rm-server/config/alfresco/templates/webscripts/org/alfresco/slingshot/forms/metadata.get.json.ftl b/rm-server/config/alfresco/templates/webscripts/org/alfresco/slingshot/forms/metadata.get.json.ftl new file mode 100644 index 0000000000..644dea3b4d --- /dev/null +++ b/rm-server/config/alfresco/templates/webscripts/org/alfresco/slingshot/forms/metadata.get.json.ftl @@ -0,0 +1,3 @@ +{ + "kind" : ${kind} +} \ No newline at end of file diff --git a/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/RecordsManagementService.java b/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/RecordsManagementService.java index 76a0f62af9..7776375050 100644 --- a/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/RecordsManagementService.java +++ b/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/RecordsManagementService.java @@ -23,7 +23,6 @@ import java.util.List; import java.util.Map; import java.util.Set; -import org.alfresco.module.org_alfresco_module_rm.vital.VitalRecordDefinition; import org.alfresco.service.cmr.repository.NodeRef; import org.alfresco.service.namespace.QName; @@ -48,18 +47,31 @@ public interface RecordsManagementService /** * Returns the 'kind' of file plan component the node reference is. + *

* Returns null if the given node reference is not a * file plan component. * * @param nodeRef node reference * @return FilePlanComponentKind the kind of file plan component the * node is - * kind * * @since 2.0 */ FilePlanComponentKind getFilePlanComponentKind(NodeRef nodeRef); + /** + * Returns the file plan component 'kind' that relates to the passed + * content type. + *

+ * Returns null if the type does not relate to a file plan component. + * + * @param type qualified name of content type + * @return FilePlanComponentKind the kind relating to the passed type + * + * @since 2.0 + */ + FilePlanComponentKind getFilePlanComponentKindFromType(QName type); + /** * Indicates whether the given node is file plan node or not. * diff --git a/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/RecordsManagementServiceImpl.java b/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/RecordsManagementServiceImpl.java index 520cebc015..27c93456c8 100644 --- a/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/RecordsManagementServiceImpl.java +++ b/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/RecordsManagementServiceImpl.java @@ -472,6 +472,51 @@ public class RecordsManagementServiceImpl implements RecordsManagementService, return result; } + /** + * @see org.alfresco.module.org_alfresco_module_rm.RecordsManagementService#getFilePlanComponentKindFromType(org.alfresco.service.namespace.QName) + */ + @Override + public FilePlanComponentKind getFilePlanComponentKindFromType(QName type) + { + FilePlanComponentKind result = null; + + if (ASPECT_FILE_PLAN_COMPONENT.equals(type) == true) + { + result = FilePlanComponentKind.FILE_PLAN_COMPONENT; + } + else if (dictionaryService.isSubClass(type, ASPECT_RECORD) == true) + { + result = FilePlanComponentKind.RECORD; + } + else if (dictionaryService.isSubClass(type, TYPE_FILE_PLAN) == true) + { + result = FilePlanComponentKind.FILE_PLAN; + } + else if (dictionaryService.isSubClass(type, TYPE_RECORD_CATEGORY) == true) + { + result = FilePlanComponentKind.RECORD_CATEGORY; + } + else if (dictionaryService.isSubClass(type, TYPE_RECORD_FOLDER) == true) + { + result = FilePlanComponentKind.RECORD_FOLDER; + } + else if (dictionaryService.isSubClass(type, TYPE_HOLD) == true) + { + result = FilePlanComponentKind.HOLD; + } + else if (dictionaryService.isSubClass(type, TYPE_TRANSFER) == true) + { + result = FilePlanComponentKind.TRANSFER; + } + else if (dictionaryService.isSubClass(type, TYPE_DISPOSITION_SCHEDULE) == true || + dictionaryService.isSubClass(type, TYPE_DISPOSITION_ACTION_DEFINITION) == true) + { + result = FilePlanComponentKind.DISPOSITION_SCHEDULE; + } + + return result; + } + /** * @see org.alfresco.module.org_alfresco_module_rm.RecordsManagementService#isRecordCategory(org.alfresco.service.cmr.repository.NodeRef) */ diff --git a/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/forms/RecordsManagementFormFilter.java b/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/forms/RecordsManagementFormFilter.java index 9dddf5557d..7b6579f5d8 100644 --- a/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/forms/RecordsManagementFormFilter.java +++ b/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/forms/RecordsManagementFormFilter.java @@ -18,20 +18,24 @@ */ package org.alfresco.module.org_alfresco_module_rm.forms; +import java.io.Serializable; import java.util.List; 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.dod5015.DOD5015Model; +import org.alfresco.repo.forms.Field; import org.alfresco.repo.forms.FieldGroup; import org.alfresco.repo.forms.Form; import org.alfresco.repo.forms.FormData; import org.alfresco.repo.forms.processor.AbstractFilter; +import org.alfresco.repo.forms.processor.node.FieldUtils; +import org.alfresco.service.cmr.dictionary.PropertyDefinition; 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.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; @@ -44,13 +48,10 @@ import org.apache.commons.logging.LogFactory; public abstract class RecordsManagementFormFilter extends AbstractFilter { /** Logger */ - @SuppressWarnings("unused") private static Log logger = LogFactory.getLog(RecordsManagementFormFilter.class); public static final String CUSTOM_RM_FIELD_GROUP_ID = "rm-custom"; - - protected static final FieldGroup CUSTOM_RM_FIELD_GROUP = new FieldGroup(CUSTOM_RM_FIELD_GROUP_ID, null, false, - false, null); + public static final String RM_METADATA_PREFIX = "rm-metadata-"; protected NamespaceService namespaceService; protected NodeService nodeService; @@ -97,7 +98,7 @@ public abstract class RecordsManagementFormFilter extends AbstractFilt { this.rmService = rmService; } - + /** * Sets the RecordsManagementAdminService instance * @@ -107,6 +108,39 @@ public abstract class RecordsManagementFormFilter extends AbstractFilt { this.rmAdminService = rmAdminService; } + + /** + * Add property fields to group + * + * @param form + * @param props + * @param setId + */ + protected void addPropertyFieldsToGroup(Form form, Map props, String setId) + { + if (props != null) + { + for (Map.Entry entry : props.entrySet()) + { + PropertyDefinition prop = entry.getValue(); + + String id = form.getItem().getId(); + id = id.replaceFirst("/", "://"); + NodeRef nodeRef = new NodeRef(id); + Serializable value = nodeService.getProperty(nodeRef, entry.getKey()); + + FieldGroup group = new FieldGroup(setId, null, false, false, null); + Field field = FieldUtils.makePropertyField(prop, value, group, namespaceService); + + form.addField(field); + + if (logger.isDebugEnabled() == true) + { + logger.debug("Adding custom property .. " + prop.getName().toString() + " .. with value " + value + ".. to group .. " + setId); + } + } + } + } /** * @see diff --git a/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/forms/RecordsManagementNodeFormFilter.java b/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/forms/RecordsManagementNodeFormFilter.java index b0a73bffda..a2a78c185e 100644 --- a/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/forms/RecordsManagementNodeFormFilter.java +++ b/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/forms/RecordsManagementNodeFormFilter.java @@ -23,6 +23,7 @@ import java.util.Map; import java.util.Set; import org.alfresco.model.ImapModel; +import org.alfresco.module.org_alfresco_module_rm.FilePlanComponentKind; import org.alfresco.module.org_alfresco_module_rm.disposition.DispositionSchedule; import org.alfresco.module.org_alfresco_module_rm.disposition.DispositionScheduleImpl; import org.alfresco.module.org_alfresco_module_rm.disposition.DispositionService; @@ -59,7 +60,6 @@ public class RecordsManagementNodeFormFilter extends RecordsManagementFormFilter private static Log logger = LogFactory.getLog(RecordsManagementNodeFormFilter.class); protected static final String TRANSIENT_DECLARED = "rmDeclared"; - protected static final String TRANSIENT_RECORD_TYPE = "rmRecordType"; protected static final String TRANSIENT_CATEGORY_ID = "rmCategoryIdentifier"; protected static final String TRANSIENT_DISPOSITION_INSTRUCTIONS = "rmDispositionInstructions"; @@ -92,29 +92,29 @@ public class RecordsManagementNodeFormFilter extends RecordsManagementFormFilter /* * @see org.alfresco.repo.forms.processor.Filter#afterGenerate(java.lang.Object, java.util.List, java.util.List, org.alfresco.repo.forms.Form, java.util.Map) */ - public void afterGenerate(NodeRef nodeRef, List fields, List forcedFields, Form form, - Map context) + public void afterGenerate( + NodeRef nodeRef, + List fields, + List forcedFields, + Form form, + Map context) { - // TODO this needs a massive refactor inorder to support any custom type or aspect .... - - // if the node has the RM marker aspect look for the custom properties - // for the type - if (this.nodeService.hasAspect(nodeRef, ASPECT_FILE_PLAN_COMPONENT)) - { - // Make sure any customisable types or aspects present of the node have their properties included - // in the custom group - showCustomProperties(nodeRef, form); + if (rmService.isFilePlanComponent(nodeRef) == true) + { + // add all the custom properties + addCustomPropertyFieldsToGroup(form, nodeRef); - if (this.nodeService.hasAspect(nodeRef, ASPECT_RECORD)) + FilePlanComponentKind kind = rmService.getFilePlanComponentKind(nodeRef); + if (FilePlanComponentKind.RECORD.equals(kind) == true) { - // force the "supplementalMarkingList" property to be present - forceSupplementalMarkingListProperty(form, nodeRef); + // add all the record meta-data aspect properties + addRecordMetadataPropertyFieldsToGroup(form, nodeRef); - // generate property definitions for the 'transient' properties - generateDeclaredPropertyField(form, nodeRef); - generateRecordTypePropertyField(form, nodeRef); - generateCategoryIdentifierPropertyField(form, nodeRef); - generateDispositionInstructionsPropertyField(form, nodeRef); + // add required transient properties + addTransientProperties(form, nodeRef); + + // add the supplemental marking list property + forceSupplementalMarkingListProperty(form, nodeRef); // if the record is the result of an email we need to 'protect' some fields if (this.nodeService.hasAspect(nodeRef, ImapModel.ASPECT_IMAP_CONTENT)) @@ -122,69 +122,48 @@ public class RecordsManagementNodeFormFilter extends RecordsManagementFormFilter protectEmailExtractedFields(form, nodeRef); } } - else + else if (FilePlanComponentKind.RECORD_FOLDER.equals(kind) == true) { - QName type = this.nodeService.getType(nodeRef); - if (TYPE_RECORD_FOLDER.equals(type)) - { - // force the "supplementalMarkingList" property to be present - forceSupplementalMarkingListProperty(form, nodeRef); - } - else if (TYPE_DISPOSITION_SCHEDULE.equals(type)) - { - // use the same mechanism used to determine whether steps can be removed from the - // schedule to determine whether the disposition level can be changed i.e. record - // level or folder level. - DispositionSchedule schedule = new DispositionScheduleImpl(this.rmServiceRegistry, this.nodeService, nodeRef); - if (dispositionService.hasDisposableItems(schedule) == true) - { - protectRecordLevelDispositionPropertyField(form); - } - } + // add the supplemental marking list property + forceSupplementalMarkingListProperty(form, nodeRef); + + // add required transient properties + addTransientProperties(form, nodeRef); } + else if (FilePlanComponentKind.DISPOSITION_SCHEDULE.equals(kind) == true) + { + // use the same mechanism used to determine whether steps can be removed from the + // schedule to determine whether the disposition level can be changed i.e. record + // level or folder level. + DispositionSchedule schedule = new DispositionScheduleImpl(this.rmServiceRegistry, this.nodeService, nodeRef); + if (dispositionService.hasDisposableItems(schedule) == true) + { + protectRecordLevelDispositionPropertyField(form); + } + } + } } - /** - * Show the custom properties if any are present. - * - * @param nodeRef node reference - * @param form form - */ - protected void showCustomProperties(NodeRef nodeRef, Form form) + protected void addCustomPropertyFieldsToGroup(Form form, NodeRef nodeRef) { - Set customClasses = rmAdminService.getCustomisable(nodeRef); - if (customClasses.isEmpty() == false) + Set customisables = rmAdminService.getCustomisable(nodeRef); + for (QName customisable : customisables) { - // add the 'rm-custom' field group - addCustomRMGroup(form); - } + addPropertyFieldsToGroup(form, rmAdminService.getCustomPropertyDefinitions(customisable), CUSTOM_RM_FIELD_GROUP_ID); + } } - - /** - * Adds the Custom RM field group (id 'rm-custom') to all the field - * definitions representing RM custom properties. - * - * @param form The form holding the field definitions - */ - protected void addCustomRMGroup(Form form) + + protected void addRecordMetadataPropertyFieldsToGroup(Form form, NodeRef nodeRef) { - // iterate round existing fields and set group on each custom - // RM field - List fieldDefs = form.getFieldDefinitions(); - for (FieldDefinition fieldDef : fieldDefs) + Set aspects = rmService.getRecordMetaDataAspects(); + for (QName aspect : aspects) { - if (fieldDef.getName().startsWith(RM_CUSTOM_PREFIX) && - !fieldDef.getName().equals(PROP_SUPPLEMENTAL_MARKING_LIST.toPrefixString(this.namespaceService))) + if (nodeService.hasAspect(nodeRef, aspect) == true) { - // only add custom RM properties, not associations/references - if (fieldDef instanceof PropertyFieldDefinition) - { - fieldDef.setGroup(CUSTOM_RM_FIELD_GROUP); - - if (logger.isDebugEnabled()) - logger.debug("Added \"" + fieldDef.getName() + "\" to RM custom field group"); - } + String aspectName = aspect.getPrefixedQName(namespaceService).toPrefixString().replace(":", "-"); + String setId = RM_METADATA_PREFIX + aspectName; + addPropertyFieldsToGroup(form, dictionaryService.getPropertyDefs(aspect), setId); } } } @@ -218,142 +197,46 @@ public class RecordsManagementNodeFormFilter extends RecordsManagementFormFilter } } } + - /** - * Generates the field definition for the transient rmDeclared - * property. - * - * @param form The Form instance to add the property to - * @param nodeRef The node the form is being generated for - */ - protected void generateDeclaredPropertyField(Form form, NodeRef nodeRef) + protected void addTransientProperties(Form form, NodeRef nodeRef) { - // TODO should this be done using a new FieldProcessor? - String dataKeyName = FormFieldConstants.PROP_DATA_PREFIX + TRANSIENT_DECLARED; - PropertyFieldDefinition declaredField = new PropertyFieldDefinition(TRANSIENT_DECLARED, - DataTypeDefinition.BOOLEAN.getLocalName()); - declaredField.setLabel(TRANSIENT_DECLARED); - declaredField.setDescription(TRANSIENT_DECLARED); - declaredField.setProtectedField(true); - declaredField.setDataKeyName(dataKeyName); - form.addFieldDefinition(declaredField); - form.addData(dataKeyName, this.nodeService.hasAspect(nodeRef, ASPECT_DECLARED_RECORD)); - } - - /** - * Generates the field definition for the transient - * rmRecordType property - * - * @param form The Form instance to add the property to - * @param nodeRef The node the form is being generated for - */ - protected void generateRecordTypePropertyField(Form form, NodeRef nodeRef) - { - String dataKeyName = FormFieldConstants.PROP_DATA_PREFIX + TRANSIENT_RECORD_TYPE; - PropertyFieldDefinition recordTypeField = new PropertyFieldDefinition(TRANSIENT_RECORD_TYPE, - DataTypeDefinition.TEXT.getLocalName()); - recordTypeField.setLabel(TRANSIENT_RECORD_TYPE); - recordTypeField.setDescription(TRANSIENT_RECORD_TYPE); - recordTypeField.setProtectedField(true); - recordTypeField.setDataKeyName(dataKeyName); - form.addFieldDefinition(recordTypeField); - - // determine what record type value to return, use aspect/type title - // from model - String recordType = null; - QName type = this.nodeService.getType(nodeRef); - if (TYPE_NON_ELECTRONIC_DOCUMENT.equals(type)) + if (rmService.isRecord(nodeRef) == true) { - // get the non-electronic type title - recordType = dictionaryService.getType(TYPE_NON_ELECTRONIC_DOCUMENT).getTitle(); + addTransientPropertyField(form, TRANSIENT_DECLARED, DataTypeDefinition.BOOLEAN, rmService.isRecordDeclared(nodeRef)); } - else - { - // the aspect applied to record determines it's type - if (nodeService.hasAspect(nodeRef, ASPECT_PDF_RECORD)) - { - recordType = dictionaryService.getAspect(ASPECT_PDF_RECORD).getTitle(); - } - else if (nodeService.hasAspect(nodeRef, ASPECT_WEB_RECORD)) - { - recordType = dictionaryService.getAspect(ASPECT_WEB_RECORD).getTitle(); - } - else if (nodeService.hasAspect(nodeRef, ASPECT_SCANNED_RECORD)) - { - recordType = dictionaryService.getAspect(ASPECT_SCANNED_RECORD).getTitle(); - } - else if (nodeService.hasAspect(nodeRef, ASPECT_DIGITAL_PHOTOGRAPH_RECORD)) - { - recordType = dictionaryService.getAspect(ASPECT_DIGITAL_PHOTOGRAPH_RECORD).getTitle(); - } - else - { - // no specific aspect applied so default to just "Record" - recordType = dictionaryService.getAspect(ASPECT_RECORD).getTitle(); - } - } - - form.addData(dataKeyName, recordType); - } - - /** - * Generates the field definition for the transient rmCategoryIdentifier - * property - * - * @param form The Form instance to add the property to - * @param nodeRef The node the form is being generated for - */ - protected void generateDispositionInstructionsPropertyField(Form form, NodeRef nodeRef) - { - String dataKeyName = FormFieldConstants.PROP_DATA_PREFIX + TRANSIENT_DISPOSITION_INSTRUCTIONS; - PropertyFieldDefinition dispInstructionsField = new PropertyFieldDefinition(TRANSIENT_DISPOSITION_INSTRUCTIONS, - DataTypeDefinition.TEXT.getLocalName()); - dispInstructionsField.setLabel(TRANSIENT_DISPOSITION_INSTRUCTIONS); - dispInstructionsField.setDescription(TRANSIENT_DISPOSITION_INSTRUCTIONS); - dispInstructionsField.setProtectedField(true); - dispInstructionsField.setDataKeyName(dataKeyName); - form.addFieldDefinition(dispInstructionsField); - // use RMService to get disposition instructions DispositionSchedule ds = dispositionService.getDispositionSchedule(nodeRef); if (ds != null) { String instructions = ds.getDispositionInstructions(); if (instructions != null) { - form.addData(dataKeyName, instructions); + addTransientPropertyField(form, TRANSIENT_DISPOSITION_INSTRUCTIONS, DataTypeDefinition.TEXT, instructions); } - } + + NodeRef recordCategory = dispositionService.getAssociatedRecordsManagementContainer(ds); + if (recordCategory != null) + { + String categoryId = (String)nodeService.getProperty(recordCategory, PROP_IDENTIFIER); + if (categoryId != null) + { + addTransientPropertyField(form, TRANSIENT_CATEGORY_ID, DataTypeDefinition.TEXT, categoryId); + } + } + } } - /** - * Generates the field definition for the transient rmCategoryIdentifier - * property - * - * @param form The Form instance to add the property to - * @param nodeRef The node the form is being generated for - */ - protected void generateCategoryIdentifierPropertyField(Form form, NodeRef nodeRef) + protected void addTransientPropertyField(Form form, String name, QName type, Object value) { - String dataKeyName = FormFieldConstants.PROP_DATA_PREFIX + TRANSIENT_CATEGORY_ID; - PropertyFieldDefinition categoryIdField = new PropertyFieldDefinition(TRANSIENT_CATEGORY_ID, - DataTypeDefinition.TEXT.getLocalName()); - categoryIdField.setLabel(TRANSIENT_CATEGORY_ID); - categoryIdField.setDescription(TRANSIENT_CATEGORY_ID); - categoryIdField.setProtectedField(true); - categoryIdField.setDataKeyName(dataKeyName); - form.addFieldDefinition(categoryIdField); - - // get the category id from the appropriate parent node - NodeRef category = getRecordCategory(nodeRef); - if (category != null) - { - String categoryId = (String)nodeService.getProperty(category, PROP_IDENTIFIER); - if (categoryId != null) - { - form.addData(dataKeyName, categoryId); - } - } + String dataKeyName = FormFieldConstants.PROP_DATA_PREFIX + name; + PropertyFieldDefinition declaredField = new PropertyFieldDefinition(name, type.getLocalName()); + declaredField.setLabel(name); + declaredField.setDescription(name); + declaredField.setProtectedField(true); + declaredField.setDataKeyName(dataKeyName); + form.addFieldDefinition(declaredField); + form.addData(dataKeyName, value); } /** @@ -392,7 +275,6 @@ public class RecordsManagementNodeFormFilter extends RecordsManagementFormFilter */ protected void protectRecordLevelDispositionPropertyField(Form form) { - // iterate round existing fields and set email fields as protected List fieldDefs = form.getFieldDefinitions(); for (FieldDefinition fieldDef : fieldDefs) { @@ -407,32 +289,4 @@ public class RecordsManagementNodeFormFilter extends RecordsManagementFormFilter if (logger.isDebugEnabled()) logger.debug("Set 'rma:recordLevelDisposition' field to be protected as record folders or records are present"); } - - /** - * Retrieves the record category the given record belongs to or - * null if the record category can not be found - * - * @param record NodeRef representing the record - * @return NodeRef of the record's category - */ - protected NodeRef getRecordCategory(NodeRef record) - { - NodeRef result = null; - - NodeRef parent = this.nodeService.getPrimaryParent(record).getParentRef(); - if (parent != null) - { - QName nodeType = this.nodeService.getType(parent); - if (this.dictionaryService.isSubClass(nodeType, TYPE_RECORD_CATEGORY)) - { - result = parent; - } - else - { - result = getRecordCategory(parent); - } - } - - return result; - } } diff --git a/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/forms/RecordsManagementTypeFormFilter.java b/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/forms/RecordsManagementTypeFormFilter.java index b586652f4a..28aa892093 100644 --- a/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/forms/RecordsManagementTypeFormFilter.java +++ b/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/forms/RecordsManagementTypeFormFilter.java @@ -23,17 +23,13 @@ import java.util.List; import java.util.Map; import java.util.Set; -import org.alfresco.model.ContentModel; import org.alfresco.module.org_alfresco_module_rm.identifier.IdentifierService; import org.alfresco.module.org_alfresco_module_rm.model.RecordsManagementModel; import org.alfresco.repo.forms.Field; -import org.alfresco.repo.forms.FieldDefinition; import org.alfresco.repo.forms.FieldGroup; import org.alfresco.repo.forms.Form; import org.alfresco.repo.forms.FormData; import org.alfresco.repo.forms.processor.node.FieldUtils; -import org.alfresco.repo.security.authentication.AuthenticationUtil; -import org.alfresco.repo.security.authentication.AuthenticationUtil.RunAsWork; import org.alfresco.service.cmr.dictionary.PropertyDefinition; import org.alfresco.service.cmr.dictionary.TypeDefinition; import org.alfresco.service.cmr.repository.NodeRef; @@ -108,7 +104,7 @@ public class RecordsManagementTypeFormFilter extends RecordsManagementFormFilter } // Group fields - groupFields(form); + // groupFields(form); } /** @@ -135,7 +131,8 @@ public class RecordsManagementTypeFormFilter extends RecordsManagementFormFilter // setup field definition for each custom property Collection properties = customProps.values(); - List fields = FieldUtils.makePropertyFields(properties, CUSTOM_RM_FIELD_GROUP, namespaceService); + FieldGroup group = new FieldGroup(CUSTOM_RM_FIELD_GROUP_ID, null, false, false, null); + List fields = FieldUtils.makePropertyFields(properties, group, namespaceService); form.addFields(fields); } } @@ -146,77 +143,42 @@ public class RecordsManagementTypeFormFilter extends RecordsManagementFormFilter public void afterPersist(TypeDefinition item, FormData data, final NodeRef nodeRef) { } - - /** - * Generates a unique identifier for the given node (based on the dbid). - * - * @param nodeRef The NodeRef to generate a unique id for - * @return The identifier - */ - protected String generateIdentifier(NodeRef nodeRef) - { - String identifier = identifierService.generateIdentifier(nodeRef); - if (logger.isDebugEnabled() == true) - { - logger.debug("Generated '" + identifier + "' for unique identifier"); - } - return identifier; - } - - /** - * Function to pad a string with zero '0' characters to the required length - * - * @param s String to pad with leading zero '0' characters - * @param len Length to pad to - * @return padded string or the original if already at >=len characters - */ - protected String padString(String s, int len) - { - String result = s; - - for (int i = 0; i < (len - s.length()); i++) - { - result = "0" + result; - } - - return result; - } /** * Puts all fields in a group to workaround ALF-6089. * * @param form The form being generated */ - protected void groupFields(Form form) - { - // to control the order of the fields add the name, title and description fields to - // a field group containing just that field, all other fields that are not already - // in a group go into an "other" field group. The client config can then declare a - // client side set with the same id and order them correctly. - - List fieldDefs = form.getFieldDefinitions(); - for (FieldDefinition fieldDef : fieldDefs) - { - FieldGroup group = fieldDef.getGroup(); - if (group == null) - { - if (fieldDef.getName().equals(ContentModel.PROP_NAME.toPrefixString(this.namespaceService))) - { - fieldDef.setGroup(NAME_FIELD_GROUP); - } - else if (fieldDef.getName().equals(ContentModel.PROP_TITLE.toPrefixString(this.namespaceService))) - { - fieldDef.setGroup(TITLE_FIELD_GROUP); - } - else if (fieldDef.getName().equals(ContentModel.PROP_DESCRIPTION.toPrefixString(this.namespaceService))) - { - fieldDef.setGroup(DESC_FIELD_GROUP); - } - else - { - fieldDef.setGroup(OTHER_FIELD_GROUP); - } - } - } - } +// protected void groupFields(Form form) +// { +// // to control the order of the fields add the name, title and description fields to +// // a field group containing just that field, all other fields that are not already +// // in a group go into an "other" field group. The client config can then declare a +// // client side set with the same id and order them correctly. +// +// List fieldDefs = form.getFieldDefinitions(); +// for (FieldDefinition fieldDef : fieldDefs) +// { +// FieldGroup group = fieldDef.getGroup(); +// if (group == null) +// { +// if (fieldDef.getName().equals(ContentModel.PROP_NAME.toPrefixString(this.namespaceService))) +// { +// fieldDef.setGroup(NAME_FIELD_GROUP); +// } +// else if (fieldDef.getName().equals(ContentModel.PROP_TITLE.toPrefixString(this.namespaceService))) +// { +// fieldDef.setGroup(TITLE_FIELD_GROUP); +// } +// else if (fieldDef.getName().equals(ContentModel.PROP_DESCRIPTION.toPrefixString(this.namespaceService))) +// { +// fieldDef.setGroup(DESC_FIELD_GROUP); +// } +// else +// { +// fieldDef.setGroup(OTHER_FIELD_GROUP); +// } +// } +// } +// } } diff --git a/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/script/slingshot/forms/RMMetaDataGet.java b/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/script/slingshot/forms/RMMetaDataGet.java new file mode 100644 index 0000000000..579ca58592 --- /dev/null +++ b/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/script/slingshot/forms/RMMetaDataGet.java @@ -0,0 +1,118 @@ +/* + * 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 . + */ +package org.alfresco.module.org_alfresco_module_rm.script.slingshot.forms; + +import java.util.HashMap; +import java.util.Map; +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +import org.alfresco.module.org_alfresco_module_rm.FilePlanComponentKind; +import org.alfresco.module.org_alfresco_module_rm.RecordsManagementService; +import org.alfresco.service.cmr.repository.NodeRef; +import org.alfresco.service.namespace.NamespaceService; +import org.alfresco.service.namespace.QName; +import org.springframework.extensions.webscripts.Cache; +import org.springframework.extensions.webscripts.DeclarativeWebScript; +import org.springframework.extensions.webscripts.Status; +import org.springframework.extensions.webscripts.WebScriptRequest; + +/** + * RM metadata used by form extension + * + * @author Roy Wetherall + */ +public class RMMetaDataGet extends DeclarativeWebScript +{ + /** Query parameters */ + private static final String PARAM_NODEREF = "noderef"; + private static final String PARAM_TYPE = "type"; + + /** NodeRef pattern */ + private static final Pattern nodeRefPattern = Pattern.compile(".+://.+/.+"); + + /** Records management service */ + private RecordsManagementService rmService; + + /** Namespace service */ + private NamespaceService namespaceService; + + /** + * @param rmService records management service + */ + public void setRecordsManagementService(RecordsManagementService rmService) + { + this.rmService = rmService; + } + + /** + * @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 + protected Map executeImpl(WebScriptRequest req, Status status, Cache cache) + { + // create model object with the lists model + Map model = new HashMap(1); + + String result = "NONE"; + + // Get the nodeRef and confirm it is valid + String nodeRef = req.getParameter(PARAM_NODEREF); + if (nodeRef == null || nodeRef.length() == 0) + { + String type = req.getParameter(PARAM_TYPE); + if (type != null && type.length() != 0) + { + QName qname = QName.createQName(type, namespaceService); + FilePlanComponentKind kind = rmService.getFilePlanComponentKindFromType(qname); + if (kind != null) + { + result = kind.toString(); + } + } + } + else + { + // quick test before running slow match for full NodeRef pattern + if (nodeRef.indexOf(':') != -1) + { + Matcher m = nodeRefPattern.matcher(nodeRef); + if (m.matches()) + { + FilePlanComponentKind kind = rmService.getFilePlanComponentKind(new NodeRef(nodeRef)); + if (kind != null) + { + result = kind.toString(); + } + } + } + } + + model.put("kind", result); + return model; + } +} \ No newline at end of file