updated serialId in new RecordMissingMetadataException

This commit is contained in:
Sara Aspery
2017-06-27 12:48:59 +01:00
parent 1cbdc500d0
commit 10209ef6fa
5 changed files with 165 additions and 78 deletions

View File

@@ -139,6 +139,16 @@ public class RecordsAPI extends RMModelRequest
)); ));
} }
/**
* see {@link #completeRecord(String, String)
*/
public Record completeRecord(String recordId) throws Exception
{
mandatoryString("recordId", recordId);
return completeRecord(recordId, EMPTY);
}
/** /**
* Complete the record recordId * Complete the record recordId
* *

View File

@@ -27,10 +27,8 @@
package org.alfresco.module.org_alfresco_module_rm.action.impl; package org.alfresco.module.org_alfresco_module_rm.action.impl;
import java.util.HashMap;
import java.util.Map;
import org.alfresco.module.org_alfresco_module_rm.action.RMActionExecuterAbstractBase; import org.alfresco.module.org_alfresco_module_rm.action.RMActionExecuterAbstractBase;
import org.alfresco.module.org_alfresco_module_rm.record.RecordMissingMetadataException;
import org.alfresco.module.org_alfresco_module_rm.record.RecordService; import org.alfresco.module.org_alfresco_module_rm.record.RecordService;
import org.alfresco.repo.action.executer.ActionExecuterAbstractBase; import org.alfresco.repo.action.executer.ActionExecuterAbstractBase;
import org.alfresco.repo.node.integrity.IntegrityException; import org.alfresco.repo.node.integrity.IntegrityException;
@@ -74,27 +72,15 @@ public class DeclareRecordAction extends RMActionExecuterAbstractBase
{ {
recordService.complete(actionedUponNodeRef); recordService.complete(actionedUponNodeRef);
} }
catch (RecordMissingMetadataException e)
{
action.setParameterValue(ActionExecuterAbstractBase.PARAM_RESULT, MISSING_PROPERTIES);
}
catch (IntegrityException e) catch (IntegrityException e)
{ {
Map<String, String> errorMap = getErrorMessageMap(); // IntegrityException is deliberately ignored here, there should be no action taken
if (e.getMsgId().equals(errorMap.get(MISSING_PROPERTIES)))
{
action.setParameterValue(ActionExecuterAbstractBase.PARAM_RESULT, MISSING_PROPERTIES);
}
} }
} }
/**
* TODO: needs to be properties file
* Temporary Helper method to get the map of complete record error message keys with associated message text
* @return errorMap
*/
private Map<String, String> getErrorMessageMap() {
Map<String, String> errorMap = new HashMap<>();
errorMap.put("missingProperties", "The record has missing mandatory properties.");
errorMap.put("alreadyCompleted", "The record is already completed.");
errorMap.put("unsuitableNode", "The node is not a record or the record does not exist or is frozen.");
return errorMap;
}
} }

View File

@@ -0,0 +1,63 @@
/*
* #%L
* Alfresco Records Management Module
* %%
* Copyright (C) 2005 - 2017 Alfresco Software Limited
* %%
* This file is part of the Alfresco software.
* -
* If the software was purchased under a paid Alfresco license, the terms of
* the paid license agreement will prevail. Otherwise, the software is
* provided under the following open source license terms:
* -
* 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/>.
* #L%
*/
package org.alfresco.module.org_alfresco_module_rm.record;
import java.io.Serializable;
import org.alfresco.error.AlfrescoRuntimeException;
/**
* Record missing metadata exception class
*
* @author Sara Aspery
* @since 2.6
*/
public class RecordMissingMetadataException extends AlfrescoRuntimeException
{
private static final long serialVersionUID = 3437687270967611234L;
public RecordMissingMetadataException(String msgId, Throwable cause)
{
super(msgId, cause);
}
public RecordMissingMetadataException(String msgId, Object[] msgParams, Throwable cause)
{
super(msgId, msgParams, cause);
}
public RecordMissingMetadataException(String msgId, Object[] msgParams)
{
super(msgId, msgParams);
}
public RecordMissingMetadataException(String msgId)
{
super(msgId);
}
}

View File

@@ -1992,7 +1992,8 @@ public class RecordServiceImpl extends BaseBehaviourBean
return null; return null;
} }
}); });
} finally }
finally
{ {
enablePropertyEditableCheck(); enablePropertyEditableCheck();
} }
@@ -2005,37 +2006,87 @@ public class RecordServiceImpl extends BaseBehaviourBean
* @throws Exception if node not valid for completion * @throws Exception if node not valid for completion
*/ */
private void validateForCompletion(NodeRef nodeRef) { private void validateForCompletion(NodeRef nodeRef) {
if (nodeService.exists(nodeRef) && isRecord(nodeRef) && !freezeService.isFrozen(nodeRef)) if (!nodeService.exists(nodeRef))
{ {
if (!isDeclared(nodeRef)) logError(nodeRef);
{ throw new IntegrityException("The record does not exist.", null);
// if the record is newly created make sure the record identifier is set before completing the record }
Set<NodeRef> newRecords = transactionalResourceHelper.getSet(RecordServiceImpl.KEY_NEW_RECORDS);
if (newRecords.contains(nodeRef)) if (!isRecord(nodeRef))
{ {
generateRecordIdentifier(nodeService, identifierService, nodeRef); logError(nodeRef);
} throw new IntegrityException("The node is not a record.", null);
}
if (freezeService.isFrozen(nodeRef))
{
logError(nodeRef);
throw new IntegrityException("The record is frozen.", null);
}
List<String> missingProperties = new ArrayList<>(5); if (isDeclared(nodeRef))
// Aspect not already defined - check mandatory properties then add
if (checkMandatoryPropertiesEnabled && !mandatoryPropertiesSet(nodeRef, missingProperties))
{
LOGGER.debug(buildMissingPropertiesErrorString(missingProperties));
throw new IntegrityException("The record has missing mandatory properties.", null);
}
} else
{
throw new IntegrityException("The record is already completed.", null);
}
} else
{ {
if (LOGGER.isWarnEnabled()) throw new IntegrityException("The record is already completed.", null);
}
// if the record is newly created make sure the record identifier is set before completing the record
Set<NodeRef> newRecords = transactionalResourceHelper.getSet(RecordServiceImpl.KEY_NEW_RECORDS);
if (newRecords.contains(nodeRef))
{
generateRecordIdentifier(nodeService, identifierService, nodeRef);
}
// Validate that all mandatory properties, if any, are present
List<String> missingProperties = new ArrayList<>(5);
// Aspect not already defined - check mandatory properties then add
if (checkMandatoryPropertiesEnabled)
{
Map<QName, Serializable> nodeRefProps = nodeService.getProperties(nodeRef);
QName nodeRefType = nodeService.getType(nodeRef);
// check for missing mandatory metadata from type definitions
TypeDefinition typeDef = dictionaryService.getType(nodeRefType);
checkDefinitionMandatoryPropsSet(typeDef, nodeRefProps, missingProperties);
// check for missing mandatory metadata from aspect definitions
Set<QName> aspects = nodeService.getAspects(nodeRef);
for (QName aspect : aspects)
{ {
LOGGER.warn(I18NUtil.getMessage(MSG_UNDECLARED_ONLY_RECORDS, nodeRef.toString())); AspectDefinition aspectDef = dictionaryService.getAspect(aspect);
checkDefinitionMandatoryPropsSet(aspectDef, nodeRefProps, missingProperties);
}
// check for missing mandatory metadata from custom aspect definitions
QName customAspect = getCustomAspectImpl(nodeRefType);
AspectDefinition aspectDef = dictionaryService.getAspect(customAspect);
checkDefinitionMandatoryPropsSet(aspectDef, nodeRefProps, missingProperties);
if (!missingProperties.isEmpty())
{
LOGGER.debug(buildMissingPropertiesErrorString(missingProperties));
throw new RecordMissingMetadataException("The record has missing mandatory properties.");
} }
throw new IntegrityException("The node is not a record or the record does not exist or is frozen.", null);
} }
} }
/**
* Helper method to log a warning to the log file
*
* @param nodeRef node for which error occurred
*/
private void logError(NodeRef nodeRef) {
if (LOGGER.isWarnEnabled())
{
LOGGER.warn(I18NUtil.getMessage(MSG_UNDECLARED_ONLY_RECORDS, nodeRef.toString()));
}
}
/**
* Helper method to build single string containing list of missing properties
*
* @param missingProperties list of missing properties
* @return String of missing properties
*/
private String buildMissingPropertiesErrorString(List<String> missingProperties) private String buildMissingPropertiesErrorString(List<String> missingProperties)
{ {
StringBuilder builder = new StringBuilder(255); StringBuilder builder = new StringBuilder(255);
@@ -2048,37 +2099,6 @@ public class RecordServiceImpl extends BaseBehaviourBean
return builder.toString(); return builder.toString();
} }
/**
* Helper method to check whether all the mandatory properties of the node have been set
*
* @param nodeRef node reference
* @return boolean true if all mandatory properties are set, false otherwise
*/
private boolean mandatoryPropertiesSet(final NodeRef nodeRef, final List<String> missingProperties)
{
Map<QName, Serializable> nodeRefProps = nodeService.getProperties(nodeRef);
QName nodeRefType = nodeService.getType(nodeRef);
// check for missing mandatory metadata from type definitions
TypeDefinition typeDef = dictionaryService.getType(nodeRefType);
checkDefinitionMandatoryPropsSet(typeDef, nodeRefProps, missingProperties);
// check for missing mandatory metadata from aspect definitions
Set<QName> aspects = nodeService.getAspects(nodeRef);
for (QName aspect : aspects)
{
AspectDefinition aspectDef = dictionaryService.getAspect(aspect);
checkDefinitionMandatoryPropsSet(aspectDef, nodeRefProps, missingProperties);
}
// check for missing mandatory metadata from custom aspect definitions
QName customAspect = getCustomAspectImpl(nodeRefType);
AspectDefinition aspectDef = dictionaryService.getAspect(customAspect);
checkDefinitionMandatoryPropsSet(aspectDef, nodeRefProps, missingProperties);
return missingProperties.isEmpty();
}
/** /**
* Helper method to check whether all the definition mandatory properties of the node have been set * Helper method to check whether all the definition mandatory properties of the node have been set
* *

View File

@@ -31,6 +31,7 @@ import static org.alfresco.module.org_alfresco_module_rm.util.RMParameterCheck.c
import static org.alfresco.util.ParameterCheck.mandatory; import static org.alfresco.util.ParameterCheck.mandatory;
import org.alfresco.module.org_alfresco_module_rm.model.RecordsManagementModel; import org.alfresco.module.org_alfresco_module_rm.model.RecordsManagementModel;
import org.alfresco.module.org_alfresco_module_rm.record.RecordMissingMetadataException;
import org.alfresco.module.org_alfresco_module_rm.record.RecordService; import org.alfresco.module.org_alfresco_module_rm.record.RecordService;
import org.alfresco.repo.activities.ActivityType; import org.alfresco.repo.activities.ActivityType;
import org.alfresco.repo.node.integrity.IntegrityException; import org.alfresco.repo.node.integrity.IntegrityException;
@@ -241,7 +242,14 @@ public class RecordsEntityResource implements BinaryResourceAction.Read,
NodeRef record = apiUtils.validateRecord(recordId); NodeRef record = apiUtils.validateRecord(recordId);
// Complete the record // Complete the record
recordService.complete(record); try
{
recordService.complete(record);
}
catch (RecordMissingMetadataException e)
{
throw new IntegrityException("The record has missing mandatory properties.", null);
}
// return record state // return record state
FileInfo info = fileFolderService.getFileInfo(record); FileInfo info = fileFolderService.getFileInfo(record);