Fix DS-3262. Check if a metadata field is in use before deleting

This commit is contained in:
Tim Donohue
2016-07-12 11:37:24 -05:00
parent 88cdf7a96e
commit 9495768ade

View File

@@ -20,6 +20,7 @@ import org.springframework.beans.factory.annotation.Autowired;
import java.io.IOException;
import java.sql.SQLException;
import java.util.List;
import org.apache.commons.collections.CollectionUtils;
/**
* Service implementation for the MetadataField object.
@@ -140,11 +141,29 @@ public class MetadataFieldServiceImpl implements MetadataFieldService {
"Only administrators may modify the metadata registry");
}
// Check for existing usages of this field
List<MetadataValue> values = null;
try
{
values = metadataValueService.findByField(context, metadataField);
}
catch(IOException io)
{
// ignore
}
// Only remove this field if it is NOT in use (as we don't want to bulk delete metadata values)
if(CollectionUtils.isEmpty(values))
{
metadataFieldDAO.delete(context, metadataField);
}
else
{
throw new IllegalStateException("Metadata field " + metadataField.toString() + " cannot be deleted as it is currently used by one or more objects.");
}
log.info(LogManager.getHeader(context, "delete_metadata_field",
"metadata_field_id=" + metadataField.getID()));
metadataValueService.deleteByMetadataField(context, metadataField);
metadataFieldDAO.delete(context, metadataField);
}
/**