mirror of
https://github.com/Alfresco/alfresco-community-repo.git
synced 2025-08-07 17:49:17 +00:00
Merged DEV/RM-DEV to HEAD
14731: Branch for continued records managment development 14739: Records Management Action Service updates 14756: Declare/Undeclare record RM actions added 14791: RM dynamic modelling Stage One. 14878: Record mamagement events 14927: Importing the recordsCustomModel.xml 14993: RM. Handle changes to the Vital Record Definition 14996: Checking in comments that record the fact that this class is likely to be deleted soon. 15011: Typo in PublishVitalRecordDefinitionAction. 15027: Custom properties and associations for RM 15053: First cut of records management events 15057: Vital Records refactor, renaming and test fixing 15060: Form config for RM types and aspects updated to reflect current model 15071: - MOB-988: Completed type based form support, means that 'create' pages can now be implemented for RM - Updated form test page to include 'destination' field to allow instances to be created 15075: Refactored defineCustomProp,Assoc out into RM actions. Modified: svn:mergeinfo Merged /alfresco/BRANCHES/DEV/RM-DEV:r14731-15075 git-svn-id: https://svn.alfresco.com/repos/alfresco-enterprise/alfresco/HEAD/root@15076 c4b6b30b-aa2e-2d43-bbcb-ca4b014f7261
This commit is contained in:
@@ -37,6 +37,7 @@ import org.alfresco.model.ContentModel;
|
|||||||
import org.alfresco.repo.content.MimetypeMap;
|
import org.alfresco.repo.content.MimetypeMap;
|
||||||
import org.alfresco.repo.forms.AssociationFieldDefinition.Direction;
|
import org.alfresco.repo.forms.AssociationFieldDefinition.Direction;
|
||||||
import org.alfresco.repo.forms.PropertyFieldDefinition.FieldConstraint;
|
import org.alfresco.repo.forms.PropertyFieldDefinition.FieldConstraint;
|
||||||
|
import org.alfresco.repo.forms.processor.node.TypeFormProcessor;
|
||||||
import org.alfresco.repo.jscript.ClasspathScriptLocation;
|
import org.alfresco.repo.jscript.ClasspathScriptLocation;
|
||||||
import org.alfresco.repo.security.authentication.AuthenticationComponent;
|
import org.alfresco.repo.security.authentication.AuthenticationComponent;
|
||||||
import org.alfresco.service.cmr.repository.ContentData;
|
import org.alfresco.service.cmr.repository.ContentData;
|
||||||
@@ -921,7 +922,7 @@ public class FormServiceImplTest extends BaseAlfrescoSpringTest
|
|||||||
}
|
}
|
||||||
|
|
||||||
// supply the destination
|
// supply the destination
|
||||||
data.addFieldData("destination", this.folder.toString());
|
data.addFieldData(TypeFormProcessor.DESTINATION, this.folder.toString());
|
||||||
|
|
||||||
// persist the data
|
// persist the data
|
||||||
NodeRef newNode = (NodeRef)this.formService.saveForm(new Item(TYPE_FORM_ITEM_KIND, "cm:content"), data);
|
NodeRef newNode = (NodeRef)this.formService.saveForm(new Item(TYPE_FORM_ITEM_KIND, "cm:content"), data);
|
||||||
@@ -936,6 +937,13 @@ public class FormServiceImplTest extends BaseAlfrescoSpringTest
|
|||||||
// check the titled aspect was automatically applied
|
// check the titled aspect was automatically applied
|
||||||
assertTrue("Expecting the cm:titled to have been applied",
|
assertTrue("Expecting the cm:titled to have been applied",
|
||||||
this.nodeService.hasAspect(this.document, ContentModel.ASPECT_TITLED));
|
this.nodeService.hasAspect(this.document, ContentModel.ASPECT_TITLED));
|
||||||
|
|
||||||
|
// test different forms of itemId's
|
||||||
|
newNode = (NodeRef)this.formService.saveForm(new Item(TYPE_FORM_ITEM_KIND, "cm_content"), data);
|
||||||
|
assertNotNull("Expected new node to be created using itemId cm_content", newNode);
|
||||||
|
|
||||||
|
newNode = (NodeRef)this.formService.saveForm(new Item(TYPE_FORM_ITEM_KIND, ContentModel.TYPE_CONTENT.toString()), data);
|
||||||
|
assertNotNull("Expected new node to be created using itemId " + ContentModel.TYPE_CONTENT.toString(), newNode);
|
||||||
}
|
}
|
||||||
|
|
||||||
public void testNoForm() throws Exception
|
public void testNoForm() throws Exception
|
||||||
|
@@ -48,6 +48,7 @@ import org.alfresco.repo.forms.AssociationFieldDefinition.Direction;
|
|||||||
import org.alfresco.repo.forms.FormData.FieldData;
|
import org.alfresco.repo.forms.FormData.FieldData;
|
||||||
import org.alfresco.repo.forms.PropertyFieldDefinition.FieldConstraint;
|
import org.alfresco.repo.forms.PropertyFieldDefinition.FieldConstraint;
|
||||||
import org.alfresco.repo.forms.processor.FilteredFormProcessor;
|
import org.alfresco.repo.forms.processor.FilteredFormProcessor;
|
||||||
|
import org.alfresco.service.cmr.dictionary.AspectDefinition;
|
||||||
import org.alfresco.service.cmr.dictionary.AssociationDefinition;
|
import org.alfresco.service.cmr.dictionary.AssociationDefinition;
|
||||||
import org.alfresco.service.cmr.dictionary.ChildAssociationDefinition;
|
import org.alfresco.service.cmr.dictionary.ChildAssociationDefinition;
|
||||||
import org.alfresco.service.cmr.dictionary.Constraint;
|
import org.alfresco.service.cmr.dictionary.Constraint;
|
||||||
@@ -308,20 +309,39 @@ public class NodeFormProcessor extends FilteredFormProcessor
|
|||||||
// get data dictionary definition for node if it is provided
|
// get data dictionary definition for node if it is provided
|
||||||
QName type = null;
|
QName type = null;
|
||||||
Map<QName, Serializable> propValues = Collections.emptyMap();
|
Map<QName, Serializable> propValues = Collections.emptyMap();
|
||||||
|
Map<QName, PropertyDefinition> propDefs = null;
|
||||||
|
Map<QName, AssociationDefinition> assocDefs = null;
|
||||||
|
|
||||||
if (nodeRef != null)
|
if (nodeRef != null)
|
||||||
{
|
{
|
||||||
type = this.nodeService.getType(nodeRef);
|
type = this.nodeService.getType(nodeRef);
|
||||||
typeDef = this.dictionaryService.getAnonymousType(type, this.nodeService.getAspects(nodeRef));
|
typeDef = this.dictionaryService.getAnonymousType(type, this.nodeService.getAspects(nodeRef));
|
||||||
|
|
||||||
|
// NOTE: the anonymous type returns all property and association defs
|
||||||
|
// for all aspects applied as well as the type
|
||||||
|
propDefs = typeDef.getProperties();
|
||||||
|
assocDefs = typeDef.getAssociations();
|
||||||
propValues = this.nodeService.getProperties(nodeRef);
|
propValues = this.nodeService.getProperties(nodeRef);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
type = typeDef.getName();
|
type = typeDef.getName();
|
||||||
}
|
|
||||||
|
// we only get the properties and associations of the actual type so
|
||||||
Map<QName, PropertyDefinition> propDefs = typeDef.getProperties();
|
// we also need to manually get properties and associations from any
|
||||||
Map<QName, AssociationDefinition> assocDefs = typeDef.getAssociations();
|
// mandatory aspects
|
||||||
|
propDefs = new HashMap<QName, PropertyDefinition>(16);
|
||||||
|
assocDefs = new HashMap<QName, AssociationDefinition>(16);
|
||||||
|
propDefs.putAll(typeDef.getProperties());
|
||||||
|
assocDefs.putAll(typeDef.getAssociations());
|
||||||
|
|
||||||
|
List<AspectDefinition> aspects = typeDef.getDefaultAspects(true);
|
||||||
|
for (AspectDefinition aspect : aspects)
|
||||||
|
{
|
||||||
|
propDefs.putAll(aspect.getProperties());
|
||||||
|
assocDefs.putAll(aspect.getAssociations());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
for (String fieldName : fields)
|
for (String fieldName : fields)
|
||||||
{
|
{
|
||||||
|
@@ -59,9 +59,10 @@ public class TypeFormProcessor extends NodeFormProcessor
|
|||||||
/** Logger */
|
/** Logger */
|
||||||
private static Log logger = LogFactory.getLog(TypeFormProcessor.class);
|
private static Log logger = LogFactory.getLog(TypeFormProcessor.class);
|
||||||
|
|
||||||
protected static final String DESTINATION = "destination";
|
|
||||||
protected static final String NAME_PROP_DATA = PROP + DATA_KEY_SEPARATOR + "cm" + DATA_KEY_SEPARATOR + "name";
|
protected static final String NAME_PROP_DATA = PROP + DATA_KEY_SEPARATOR + "cm" + DATA_KEY_SEPARATOR + "name";
|
||||||
|
|
||||||
|
public static final String DESTINATION = "alf_destination";
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* @see org.alfresco.repo.forms.processor.node.NodeFormProcessor#getTypedItem(org.alfresco.repo.forms.Item)
|
* @see org.alfresco.repo.forms.processor.node.NodeFormProcessor#getTypedItem(org.alfresco.repo.forms.Item)
|
||||||
*/
|
*/
|
||||||
@@ -73,8 +74,29 @@ public class TypeFormProcessor extends NodeFormProcessor
|
|||||||
try
|
try
|
||||||
{
|
{
|
||||||
// convert the prefix type into full QName representation
|
// convert the prefix type into full QName representation
|
||||||
// TODO: Also look for and deal with full QName as itemId
|
// the type name may be provided in the prefix form i.e.
|
||||||
QName type = QName.createQName(item.getId(), this.namespaceService);
|
// prefix:type, the : may be replaced with _ if the item id
|
||||||
|
// was passed on a URL or the full qname may be provided.
|
||||||
|
QName type = null;
|
||||||
|
String itemId = item.getId();
|
||||||
|
if (itemId.startsWith("{"))
|
||||||
|
{
|
||||||
|
// item id looks like a full qname
|
||||||
|
type = QName.createQName(itemId);
|
||||||
|
}
|
||||||
|
else if (itemId.indexOf("_") != -1)
|
||||||
|
{
|
||||||
|
// if item id contains _ change the first occurrence to :
|
||||||
|
// as it's more than likely been converted for URL use
|
||||||
|
int idx = itemId.indexOf("_");
|
||||||
|
String parsedItemId = itemId.substring(0, idx) + ":" + itemId.substring(idx+1);
|
||||||
|
type = QName.createQName(parsedItemId, this.namespaceService);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
// try and create the QName using the item id as is
|
||||||
|
type = QName.createQName(itemId, this.namespaceService);
|
||||||
|
}
|
||||||
|
|
||||||
// retrieve the type from the dictionary
|
// retrieve the type from the dictionary
|
||||||
typeDef = this.dictionaryService.getType(type);
|
typeDef = this.dictionaryService.getType(type);
|
||||||
@@ -246,7 +268,7 @@ public class TypeFormProcessor extends NodeFormProcessor
|
|||||||
{
|
{
|
||||||
throw new FormException("Failed to persist form for '" +
|
throw new FormException("Failed to persist form for '" +
|
||||||
typeDef.getName().toPrefixString(this.namespaceService) +
|
typeDef.getName().toPrefixString(this.namespaceService) +
|
||||||
"' as destination data was not present.");
|
"' as '" + DESTINATION + "' data was not provided.");
|
||||||
}
|
}
|
||||||
|
|
||||||
// create the parent NodeRef
|
// create the parent NodeRef
|
||||||
|
Reference in New Issue
Block a user