mirror of
https://github.com/Alfresco/alfresco-community-repo.git
synced 2025-07-24 17:32:48 +00:00
Big honkin' merge from head. Sheesh!
git-svn-id: https://svn.alfresco.com/repos/alfresco-enterprise/alfresco/BRANCHES/WCM-DEV2/root@3617 c4b6b30b-aa2e-2d43-bbcb-ca4b014f7261
This commit is contained in:
@@ -23,6 +23,7 @@ import java.util.Collections;
|
||||
import java.util.Date;
|
||||
import java.util.HashMap;
|
||||
import java.util.HashSet;
|
||||
import java.util.Iterator;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.Set;
|
||||
@@ -41,7 +42,10 @@ import org.alfresco.repo.node.StoreArchiveMap;
|
||||
import org.alfresco.repo.security.authentication.AuthenticationUtil;
|
||||
import org.alfresco.repo.transaction.AlfrescoTransactionSupport;
|
||||
import org.alfresco.service.cmr.dictionary.AspectDefinition;
|
||||
import org.alfresco.service.cmr.dictionary.AssociationDefinition;
|
||||
import org.alfresco.service.cmr.dictionary.ChildAssociationDefinition;
|
||||
import org.alfresco.service.cmr.dictionary.ClassDefinition;
|
||||
import org.alfresco.service.cmr.dictionary.DataTypeDefinition;
|
||||
import org.alfresco.service.cmr.dictionary.InvalidAspectException;
|
||||
import org.alfresco.service.cmr.dictionary.InvalidTypeException;
|
||||
import org.alfresco.service.cmr.dictionary.PropertyDefinition;
|
||||
@@ -62,8 +66,10 @@ import org.alfresco.service.cmr.repository.NodeRef.Status;
|
||||
import org.alfresco.service.namespace.NamespaceService;
|
||||
import org.alfresco.service.namespace.QName;
|
||||
import org.alfresco.service.namespace.QNamePattern;
|
||||
import org.alfresco.util.ParameterCheck;
|
||||
import org.apache.commons.logging.Log;
|
||||
import org.apache.commons.logging.LogFactory;
|
||||
import org.springframework.dao.DataIntegrityViolationException;
|
||||
import org.springframework.util.Assert;
|
||||
|
||||
/**
|
||||
@@ -280,29 +286,35 @@ public class DbNodeServiceImpl extends AbstractNodeServiceImpl
|
||||
String newId = generateGuid(properties);
|
||||
|
||||
// create the node instance
|
||||
Node node = nodeDaoService.newNode(store, newId, nodeTypeQName);
|
||||
Node childNode = nodeDaoService.newNode(store, newId, nodeTypeQName);
|
||||
|
||||
// get the parent node
|
||||
Node parentNode = getNodeNotNull(parentRef);
|
||||
|
||||
// create the association - invoke policy behaviour
|
||||
ChildAssoc childAssoc = nodeDaoService.newChildAssoc(parentNode, node, true, assocTypeQName, assocQName);
|
||||
ChildAssociationRef childAssocRef = childAssoc.getChildAssocRef();
|
||||
|
||||
// Set the default property values
|
||||
addDefaultPropertyValues(nodeTypeDef, properties);
|
||||
|
||||
// Add the default aspects to the node
|
||||
addDefaultAspects(nodeTypeDef, node, childAssocRef.getChildRef(), properties);
|
||||
addDefaultAspects(nodeTypeDef, childNode, properties);
|
||||
|
||||
// set the properties - it is a new node so only set properties if there are any
|
||||
Map<QName, Serializable> propertiesBefore = getProperties(childAssocRef.getChildRef());
|
||||
Map<QName, Serializable> propertiesBefore = getPropertiesImpl(childNode);
|
||||
Map<QName, Serializable> propertiesAfter = null;
|
||||
if (properties.size() > 0)
|
||||
{
|
||||
propertiesAfter = setPropertiesImpl(childAssocRef.getChildRef(), properties);
|
||||
propertiesAfter = setPropertiesImpl(childNode, properties);
|
||||
}
|
||||
|
||||
// create the association
|
||||
ChildAssoc childAssoc = nodeDaoService.newChildAssoc(
|
||||
parentNode,
|
||||
childNode,
|
||||
true,
|
||||
assocTypeQName,
|
||||
assocQName);
|
||||
setChildUniqueName(childNode); // ensure uniqueness
|
||||
ChildAssociationRef childAssocRef = childAssoc.getChildAssocRef();
|
||||
|
||||
// Invoke policy behaviour
|
||||
invokeOnCreateNode(childAssocRef);
|
||||
invokeOnUpdateNode(parentRef);
|
||||
@@ -320,8 +332,10 @@ public class DbNodeServiceImpl extends AbstractNodeServiceImpl
|
||||
*
|
||||
* @param nodeTypeDef
|
||||
*/
|
||||
private void addDefaultAspects(ClassDefinition classDefinition, Node node, NodeRef nodeRef, Map<QName, Serializable> properties)
|
||||
private void addDefaultAspects(ClassDefinition classDefinition, Node node, Map<QName, Serializable> properties)
|
||||
{
|
||||
NodeRef nodeRef = node.getNodeRef();
|
||||
|
||||
// get the mandatory aspects for the node type
|
||||
List<AspectDefinition> defaultAspectDefs = classDefinition.getDefaultAspects();
|
||||
|
||||
@@ -335,7 +349,7 @@ public class DbNodeServiceImpl extends AbstractNodeServiceImpl
|
||||
invokeOnAddAspect(nodeRef, defaultAspectDef.getName());
|
||||
|
||||
// Now add any default aspects for this aspect
|
||||
addDefaultAspects(defaultAspectDef, node, nodeRef, properties);
|
||||
addDefaultAspects(defaultAspectDef, node, properties);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -387,8 +401,16 @@ public class DbNodeServiceImpl extends AbstractNodeServiceImpl
|
||||
// remove the child assoc from the old parent
|
||||
// don't cascade as we will still need the node afterwards
|
||||
nodeDaoService.deleteChildAssoc(oldAssoc, false);
|
||||
|
||||
// create a new assoc
|
||||
ChildAssoc newAssoc = nodeDaoService.newChildAssoc(newParentNode, nodeToMove, true, assocTypeQName, assocQName);
|
||||
ChildAssoc newAssoc = nodeDaoService.newChildAssoc(
|
||||
newParentNode,
|
||||
nodeToMove,
|
||||
true,
|
||||
assocTypeQName,
|
||||
assocQName);
|
||||
setChildUniqueName(nodeToMove); // ensure uniqueness
|
||||
ChildAssociationRef newAssocRef = newAssoc.getChildAssocRef();
|
||||
|
||||
// If the node is moving stores, then drag the node hierarchy with it
|
||||
if (movingStore)
|
||||
@@ -406,7 +428,9 @@ public class DbNodeServiceImpl extends AbstractNodeServiceImpl
|
||||
// invoke policy behaviour
|
||||
if (movingStore)
|
||||
{
|
||||
invokeOnDeleteNode(oldAssocRef, nodeToMoveTypeQName, nodeToMoveAspects);
|
||||
// TODO for now indicate that the node has been archived to prevent the version history from being removed
|
||||
// in the future a onMove policy could be added and remove the need for onDelete and onCreate to be fired here
|
||||
invokeOnDeleteNode(oldAssocRef, nodeToMoveTypeQName, nodeToMoveAspects, true);
|
||||
invokeOnCreateNode(newAssoc.getChildAssocRef());
|
||||
}
|
||||
else
|
||||
@@ -416,6 +440,7 @@ public class DbNodeServiceImpl extends AbstractNodeServiceImpl
|
||||
invokeOnUpdateNode(oldParentNode.getNodeRef());
|
||||
invokeOnUpdateNode(newParentRef);
|
||||
}
|
||||
invokeOnMoveNode(oldAssocRef, newAssocRef);
|
||||
|
||||
// update the node status
|
||||
nodeDaoService.recordChangeId(nodeToMoveRef);
|
||||
@@ -472,8 +497,8 @@ public class DbNodeServiceImpl extends AbstractNodeServiceImpl
|
||||
node.setTypeQName(typeQName);
|
||||
|
||||
// Add the default aspects to the node (update the properties with any new default values)
|
||||
Map<QName, Serializable> properties = this.getProperties(nodeRef);
|
||||
addDefaultAspects(nodeTypeDef, node, nodeRef, properties);
|
||||
Map<QName, Serializable> properties = this.getPropertiesImpl(node);
|
||||
addDefaultAspects(nodeTypeDef, node, properties);
|
||||
this.setProperties(nodeRef, properties);
|
||||
|
||||
// Invoke policies
|
||||
@@ -503,7 +528,7 @@ public class DbNodeServiceImpl extends AbstractNodeServiceImpl
|
||||
Node node = getNodeNotNull(nodeRef);
|
||||
|
||||
// attach the properties to the current node properties
|
||||
Map<QName, Serializable> nodeProperties = getProperties(nodeRef);
|
||||
Map<QName, Serializable> nodeProperties = getPropertiesImpl(node);
|
||||
|
||||
if (aspectProperties != null)
|
||||
{
|
||||
@@ -514,7 +539,7 @@ public class DbNodeServiceImpl extends AbstractNodeServiceImpl
|
||||
addDefaultPropertyValues(aspectDef, nodeProperties);
|
||||
|
||||
// Add any dependant aspect
|
||||
addDefaultAspects(aspectDef, node, nodeRef, nodeProperties);
|
||||
addDefaultAspects(aspectDef, node, nodeProperties);
|
||||
|
||||
// Set the property values back on the node
|
||||
setProperties(nodeRef, nodeProperties);
|
||||
@@ -598,8 +623,11 @@ public class DbNodeServiceImpl extends AbstractNodeServiceImpl
|
||||
|
||||
public void deleteNode(NodeRef nodeRef)
|
||||
{
|
||||
// Invoke policy behaviours
|
||||
invokeBeforeDeleteNode(nodeRef);
|
||||
boolean isArchivedNode = false;
|
||||
boolean requiresDelete = false;
|
||||
|
||||
// Invoke policy behaviours
|
||||
invokeBeforeDeleteNode(nodeRef);
|
||||
|
||||
// get the node
|
||||
Node node = getNodeNotNull(nodeRef);
|
||||
@@ -610,23 +638,41 @@ public class DbNodeServiceImpl extends AbstractNodeServiceImpl
|
||||
Set<QName> nodeAspectQNames = node.getAspects();
|
||||
|
||||
// check if we need to archive the node
|
||||
StoreRef storeRef = nodeRef.getStoreRef();
|
||||
StoreRef archiveStoreRef = storeArchiveMap.getArchiveMap().get(storeRef);
|
||||
// get the type and check if we need archiving
|
||||
TypeDefinition typeDef = dictionaryService.getType(node.getTypeQName());
|
||||
if (typeDef == null || !typeDef.isArchive() || archiveStoreRef == null)
|
||||
StoreRef archiveStoreRef = null;
|
||||
if (nodeAspectQNames.contains(ContentModel.ASPECT_TEMPORARY))
|
||||
{
|
||||
// the node has the temporary aspect meaning
|
||||
// it can not be archived
|
||||
requiresDelete = true;
|
||||
isArchivedNode = false;
|
||||
}
|
||||
else
|
||||
{
|
||||
StoreRef storeRef = nodeRef.getStoreRef();
|
||||
archiveStoreRef = storeArchiveMap.getArchiveMap().get(storeRef);
|
||||
// get the type and check if we need archiving
|
||||
TypeDefinition typeDef = dictionaryService.getType(node.getTypeQName());
|
||||
if (typeDef == null || !typeDef.isArchive() || archiveStoreRef == null)
|
||||
{
|
||||
requiresDelete = true;
|
||||
}
|
||||
}
|
||||
|
||||
if (requiresDelete)
|
||||
{
|
||||
// perform a normal deletion
|
||||
nodeDaoService.deleteNode(node, true);
|
||||
isArchivedNode = false;
|
||||
}
|
||||
else
|
||||
{
|
||||
// archive it
|
||||
archiveNode(nodeRef, archiveStoreRef);
|
||||
isArchivedNode = true;
|
||||
}
|
||||
|
||||
// Invoke policy behaviours
|
||||
invokeOnDeleteNode(childAssocRef, nodeTypeQName, nodeAspectQNames);
|
||||
invokeOnDeleteNode(childAssocRef, nodeTypeQName, nodeAspectQNames, isArchivedNode);
|
||||
}
|
||||
|
||||
public ChildAssociationRef addChild(NodeRef parentRef, NodeRef childRef, QName assocTypeQName, QName assocQName)
|
||||
@@ -635,21 +681,19 @@ public class DbNodeServiceImpl extends AbstractNodeServiceImpl
|
||||
invokeBeforeUpdateNode(parentRef);
|
||||
invokeBeforeCreateChildAssociation(parentRef, childRef, assocTypeQName, assocQName);
|
||||
|
||||
// check that both nodes belong to the same store
|
||||
if (!parentRef.getStoreRef().equals(childRef.getStoreRef()))
|
||||
{
|
||||
throw new InvalidNodeRefException("Parent and child nodes must belong to the same store: \n" +
|
||||
" parent: " + parentRef + "\n" +
|
||||
" child: " + childRef,
|
||||
childRef);
|
||||
}
|
||||
|
||||
// get the parent node and ensure that it is a container node
|
||||
Node parentNode = getNodeNotNull(parentRef);
|
||||
// get the child node
|
||||
Node childNode = getNodeNotNull(childRef);
|
||||
// make the association
|
||||
ChildAssoc assoc = nodeDaoService.newChildAssoc(parentNode, childNode, false, assocTypeQName, assocQName);
|
||||
ChildAssoc assoc = nodeDaoService.newChildAssoc(
|
||||
parentNode,
|
||||
childNode,
|
||||
false,
|
||||
assocTypeQName,
|
||||
assocQName);
|
||||
// ensure name uniqueness
|
||||
setChildUniqueName(childNode);
|
||||
ChildAssociationRef assocRef = assoc.getChildAssocRef();
|
||||
NodeRef childNodeRef = assocRef.getChildRef();
|
||||
|
||||
@@ -672,7 +716,7 @@ public class DbNodeServiceImpl extends AbstractNodeServiceImpl
|
||||
|
||||
// get all the child assocs
|
||||
ChildAssociationRef primaryAssocRef = null;
|
||||
Collection<ChildAssoc> assocs = parentNode.getChildAssocs();
|
||||
Collection<ChildAssoc> assocs = nodeDaoService.getChildAssocs(parentNode);
|
||||
assocs = new HashSet<ChildAssoc>(assocs); // copy set as we will be modifying it
|
||||
for (ChildAssoc assoc : assocs)
|
||||
{
|
||||
@@ -710,6 +754,13 @@ public class DbNodeServiceImpl extends AbstractNodeServiceImpl
|
||||
public Map<QName, Serializable> getProperties(NodeRef nodeRef) throws InvalidNodeRefException
|
||||
{
|
||||
Node node = getNodeNotNull(nodeRef);
|
||||
return getPropertiesImpl(node);
|
||||
}
|
||||
|
||||
private Map<QName, Serializable> getPropertiesImpl(Node node) throws InvalidNodeRefException
|
||||
{
|
||||
NodeRef nodeRef = node.getNodeRef();
|
||||
|
||||
Map<QName, PropertyValue> nodeProperties = node.getProperties();
|
||||
Map<QName, Serializable> ret = new HashMap<QName, Serializable>(nodeProperties.size());
|
||||
// copy values
|
||||
@@ -779,12 +830,16 @@ public class DbNodeServiceImpl extends AbstractNodeServiceImpl
|
||||
*/
|
||||
public void setProperties(NodeRef nodeRef, Map<QName, Serializable> properties) throws InvalidNodeRefException
|
||||
{
|
||||
// Invoke policy behaviours
|
||||
Node node = getNodeNotNull(nodeRef);
|
||||
|
||||
// Invoke policy behaviours
|
||||
invokeBeforeUpdateNode(nodeRef);
|
||||
|
||||
// Do the set properties
|
||||
Map<QName, Serializable> propertiesBefore = getProperties(nodeRef);
|
||||
Map<QName, Serializable> propertiesAfter = setPropertiesImpl(nodeRef, properties);
|
||||
Map<QName, Serializable> propertiesBefore = getPropertiesImpl(node);
|
||||
Map<QName, Serializable> propertiesAfter = setPropertiesImpl(node, properties);
|
||||
|
||||
setChildUniqueName(node); // ensure uniqueness
|
||||
|
||||
// Invoke policy behaviours
|
||||
invokeOnUpdateNode(nodeRef);
|
||||
@@ -795,24 +850,18 @@ public class DbNodeServiceImpl extends AbstractNodeServiceImpl
|
||||
* Does the work of setting the property values. Returns a map containing the state of the properties after the set
|
||||
* operation is complete.
|
||||
*
|
||||
* @param nodeRef the node reference
|
||||
* @param node the node
|
||||
* @param properties the map of property values
|
||||
* @return the map of property values after the set operation is complete
|
||||
* @throws InvalidNodeRefException
|
||||
*/
|
||||
private Map<QName, Serializable> setPropertiesImpl(NodeRef nodeRef, Map<QName, Serializable> properties) throws InvalidNodeRefException
|
||||
private Map<QName, Serializable> setPropertiesImpl(Node node, Map<QName, Serializable> properties) throws InvalidNodeRefException
|
||||
{
|
||||
if (properties == null)
|
||||
{
|
||||
throw new IllegalArgumentException("Properties may not be null");
|
||||
}
|
||||
ParameterCheck.mandatory("properties", properties);
|
||||
|
||||
// remove referencable properties
|
||||
removeReferencableProperties(properties);
|
||||
|
||||
// find the node
|
||||
Node node = getNodeNotNull(nodeRef);
|
||||
|
||||
// copy properties onto node
|
||||
Map<QName, PropertyValue> nodeProperties = node.getProperties();
|
||||
nodeProperties.clear();
|
||||
@@ -828,6 +877,7 @@ public class DbNodeServiceImpl extends AbstractNodeServiceImpl
|
||||
}
|
||||
|
||||
// update the node status
|
||||
NodeRef nodeRef = node.getNodeRef();
|
||||
nodeDaoService.recordChangeId(nodeRef);
|
||||
|
||||
// Return the properties after
|
||||
@@ -847,10 +897,18 @@ public class DbNodeServiceImpl extends AbstractNodeServiceImpl
|
||||
// Invoke policy behaviours
|
||||
invokeBeforeUpdateNode(nodeRef);
|
||||
|
||||
// Do the set operation
|
||||
Map<QName, Serializable> propertiesBefore = getProperties(nodeRef);
|
||||
Map<QName, Serializable> propertiesAfter = setPropertyImpl(nodeRef, qname, value);
|
||||
// get the node
|
||||
Node node = getNodeNotNull(nodeRef);
|
||||
|
||||
// Do the set operation
|
||||
Map<QName, Serializable> propertiesBefore = getPropertiesImpl(node);
|
||||
Map<QName, Serializable> propertiesAfter = setPropertyImpl(node, qname, value);
|
||||
|
||||
if (qname.equals(ContentModel.PROP_NAME))
|
||||
{
|
||||
setChildUniqueName(node); // ensure uniqueness
|
||||
}
|
||||
|
||||
// Invoke policy behaviours
|
||||
invokeOnUpdateNode(nodeRef);
|
||||
invokeOnUpdateProperties(nodeRef, propertiesBefore, propertiesAfter);
|
||||
@@ -860,16 +918,15 @@ public class DbNodeServiceImpl extends AbstractNodeServiceImpl
|
||||
* Does the work of setting a property value. Returns the values of the properties after the set operation is
|
||||
* complete.
|
||||
*
|
||||
* @param nodeRef the node reference
|
||||
* @param node the node
|
||||
* @param qname the qname of the property
|
||||
* @param value the value of the property
|
||||
* @return the values of the properties after the set operation is complete
|
||||
* @throws InvalidNodeRefException
|
||||
*/
|
||||
public Map<QName, Serializable> setPropertyImpl(NodeRef nodeRef, QName qname, Serializable value) throws InvalidNodeRefException
|
||||
public Map<QName, Serializable> setPropertyImpl(Node node, QName qname, Serializable value) throws InvalidNodeRefException
|
||||
{
|
||||
// get the node
|
||||
Node node = getNodeNotNull(nodeRef);
|
||||
NodeRef nodeRef = node.getNodeRef();
|
||||
|
||||
Map<QName, PropertyValue> properties = node.getProperties();
|
||||
PropertyDefinition propertyDef = dictionaryService.getProperty(qname);
|
||||
@@ -880,7 +937,7 @@ public class DbNodeServiceImpl extends AbstractNodeServiceImpl
|
||||
// update the node status
|
||||
nodeDaoService.recordChangeId(nodeRef);
|
||||
|
||||
return getProperties(nodeRef);
|
||||
return getPropertiesImpl(node);
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -939,36 +996,50 @@ public class DbNodeServiceImpl extends AbstractNodeServiceImpl
|
||||
{
|
||||
Node node = getNodeNotNull(nodeRef);
|
||||
// get the assocs pointing from it
|
||||
Collection<ChildAssoc> childAssocs = node.getChildAssocs();
|
||||
Collection<ChildAssociationRef> childAssocRefs = nodeDaoService.getChildAssocRefs(node);
|
||||
// shortcut if there are no assocs
|
||||
if (childAssocs.size() == 0)
|
||||
if (childAssocRefs.size() == 0)
|
||||
{
|
||||
return Collections.emptyList();
|
||||
}
|
||||
// sort results
|
||||
ArrayList<ChildAssoc> orderedList = new ArrayList<ChildAssoc>(childAssocs);
|
||||
ArrayList<ChildAssociationRef> orderedList = new ArrayList<ChildAssociationRef>(childAssocRefs);
|
||||
Collections.sort(orderedList);
|
||||
|
||||
// list of results
|
||||
List<ChildAssociationRef> results = new ArrayList<ChildAssociationRef>(childAssocs.size());
|
||||
int nthSibling = 0;
|
||||
for (ChildAssoc assoc : orderedList)
|
||||
Iterator<ChildAssociationRef> iterator = orderedList.iterator();
|
||||
while(iterator.hasNext())
|
||||
{
|
||||
ChildAssociationRef childAssocRef = iterator.next();
|
||||
// does the qname match the pattern?
|
||||
if (!qnamePattern.isMatch(assoc.getQname()) || !typeQNamePattern.isMatch(assoc.getTypeQName()))
|
||||
if (!qnamePattern.isMatch(childAssocRef.getQName()) || !typeQNamePattern.isMatch(childAssocRef.getTypeQName()))
|
||||
{
|
||||
// no match - ignore
|
||||
continue;
|
||||
// no match - remove
|
||||
iterator.remove();
|
||||
}
|
||||
else
|
||||
{
|
||||
childAssocRef.setNthSibling(nthSibling);
|
||||
nthSibling++;
|
||||
}
|
||||
ChildAssociationRef assocRef = assoc.getChildAssocRef();
|
||||
// slot the value in the right spot
|
||||
assocRef.setNthSibling(nthSibling);
|
||||
nthSibling++;
|
||||
// get the child
|
||||
results.add(assoc.getChildAssocRef());
|
||||
}
|
||||
// done
|
||||
return results;
|
||||
return orderedList;
|
||||
}
|
||||
|
||||
public NodeRef getChildByName(NodeRef nodeRef, QName assocTypeQName, String childName)
|
||||
{
|
||||
Node node = getNodeNotNull(nodeRef);
|
||||
ChildAssoc childAssoc = nodeDaoService.getChildAssoc(node, assocTypeQName, childName);
|
||||
if (childAssoc != null)
|
||||
{
|
||||
return childAssoc.getChild().getNodeRef();
|
||||
}
|
||||
else
|
||||
{
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
public ChildAssociationRef getPrimaryParent(NodeRef nodeRef) throws InvalidNodeRefException
|
||||
@@ -1041,11 +1112,10 @@ public class DbNodeServiceImpl extends AbstractNodeServiceImpl
|
||||
}
|
||||
|
||||
public List<AssociationRef> getTargetAssocs(NodeRef sourceRef, QNamePattern qnamePattern)
|
||||
throws InvalidNodeRefException
|
||||
{
|
||||
Node sourceNode = getNodeNotNull(sourceRef);
|
||||
// get all assocs to target
|
||||
Collection<NodeAssoc> assocs = sourceNode.getTargetNodeAssocs();
|
||||
Collection<NodeAssoc> assocs = nodeDaoService.getTargetNodeAssocs(sourceNode);
|
||||
List<AssociationRef> nodeAssocRefs = new ArrayList<AssociationRef>(assocs.size());
|
||||
for (NodeAssoc assoc : assocs)
|
||||
{
|
||||
@@ -1061,11 +1131,10 @@ public class DbNodeServiceImpl extends AbstractNodeServiceImpl
|
||||
}
|
||||
|
||||
public List<AssociationRef> getSourceAssocs(NodeRef targetRef, QNamePattern qnamePattern)
|
||||
throws InvalidNodeRefException
|
||||
{
|
||||
Node sourceNode = getNodeNotNull(targetRef);
|
||||
Node targetNode = getNodeNotNull(targetRef);
|
||||
// get all assocs to source
|
||||
Collection<NodeAssoc> assocs = sourceNode.getSourceNodeAssocs();
|
||||
Collection<NodeAssoc> assocs = nodeDaoService.getSourceNodeAssocs(targetNode);
|
||||
List<AssociationRef> nodeAssocRefs = new ArrayList<AssociationRef>(assocs.size());
|
||||
for (NodeAssoc assoc : assocs)
|
||||
{
|
||||
@@ -1367,7 +1436,7 @@ public class DbNodeServiceImpl extends AbstractNodeServiceImpl
|
||||
// add the node to the map
|
||||
nodesById.put(id, node);
|
||||
// recurse into the primary children
|
||||
Collection<ChildAssoc> childAssocs = node.getChildAssocs();
|
||||
Collection<ChildAssoc> childAssocs = nodeDaoService.getChildAssocs(node);
|
||||
for (ChildAssoc childAssoc : childAssocs)
|
||||
{
|
||||
// cascade into primary associations
|
||||
@@ -1394,7 +1463,8 @@ public class DbNodeServiceImpl extends AbstractNodeServiceImpl
|
||||
List<ChildAssoc> childAssocsToDelete = new ArrayList<ChildAssoc>(5);
|
||||
// child associations
|
||||
ArrayList<ChildAssociationRef> archivedChildAssocRefs = new ArrayList<ChildAssociationRef>(5);
|
||||
for (ChildAssoc assoc : node.getChildAssocs())
|
||||
Collection<ChildAssoc> childAssocs = nodeDaoService.getChildAssocs(node);
|
||||
for (ChildAssoc assoc : childAssocs)
|
||||
{
|
||||
Long relatedNodeId = assoc.getChild().getId();
|
||||
if (nodesById.containsKey(relatedNodeId))
|
||||
@@ -1427,7 +1497,7 @@ public class DbNodeServiceImpl extends AbstractNodeServiceImpl
|
||||
List<NodeAssoc> nodeAssocsToDelete = new ArrayList<NodeAssoc>(5);
|
||||
// source associations
|
||||
ArrayList<AssociationRef> archivedSourceAssocRefs = new ArrayList<AssociationRef>(5);
|
||||
for (NodeAssoc assoc : node.getSourceNodeAssocs())
|
||||
for (NodeAssoc assoc : nodeDaoService.getSourceNodeAssocs(node))
|
||||
{
|
||||
Long relatedNodeId = assoc.getSource().getId();
|
||||
if (nodesById.containsKey(relatedNodeId))
|
||||
@@ -1440,7 +1510,7 @@ public class DbNodeServiceImpl extends AbstractNodeServiceImpl
|
||||
}
|
||||
// target associations
|
||||
ArrayList<AssociationRef> archivedTargetAssocRefs = new ArrayList<AssociationRef>(5);
|
||||
for (NodeAssoc assoc : node.getTargetNodeAssocs())
|
||||
for (NodeAssoc assoc : nodeDaoService.getTargetNodeAssocs(node))
|
||||
{
|
||||
Long relatedNodeId = assoc.getTarget().getId();
|
||||
if (nodesById.containsKey(relatedNodeId))
|
||||
@@ -1599,10 +1669,21 @@ public class DbNodeServiceImpl extends AbstractNodeServiceImpl
|
||||
continue;
|
||||
}
|
||||
Node parentNode = getNodeNotNull(parentNodeRef);
|
||||
nodeDaoService.newChildAssoc(parentNode, node, assocRef.isPrimary(), assocRef.getTypeQName(), assocRef.getQName());
|
||||
// get the name to use for the unique child check
|
||||
QName assocTypeQName = assocRef.getTypeQName();
|
||||
nodeDaoService.newChildAssoc(
|
||||
parentNode,
|
||||
node,
|
||||
assocRef.isPrimary(),
|
||||
assocTypeQName,
|
||||
assocRef.getQName());
|
||||
}
|
||||
properties.remove(ContentModel.PROP_ARCHIVED_PARENT_ASSOCS);
|
||||
}
|
||||
|
||||
// make sure that the node name uniqueness is enforced
|
||||
setChildUniqueName(node);
|
||||
|
||||
// restore child associations
|
||||
Collection<ChildAssociationRef> childAssocRefs = (Collection<ChildAssociationRef>) getProperty(
|
||||
nodeRef,
|
||||
@@ -1617,7 +1698,16 @@ public class DbNodeServiceImpl extends AbstractNodeServiceImpl
|
||||
continue;
|
||||
}
|
||||
Node childNode = getNodeNotNull(childNodeRef);
|
||||
nodeDaoService.newChildAssoc(node, childNode, assocRef.isPrimary(), assocRef.getTypeQName(), assocRef.getQName());
|
||||
QName assocTypeQName = assocRef.getTypeQName();
|
||||
// get the name to use for the unique child check
|
||||
nodeDaoService.newChildAssoc(
|
||||
node,
|
||||
childNode,
|
||||
assocRef.isPrimary(),
|
||||
assocTypeQName,
|
||||
assocRef.getQName());
|
||||
// ensure that the name uniqueness is enforced for the child node
|
||||
setChildUniqueName(childNode);
|
||||
}
|
||||
properties.remove(ContentModel.PROP_ARCHIVED_CHILD_ASSOCS);
|
||||
}
|
||||
@@ -1660,4 +1750,56 @@ public class DbNodeServiceImpl extends AbstractNodeServiceImpl
|
||||
// remove the aspect
|
||||
node.getAspects().remove(ContentModel.ASPECT_ARCHIVED_ASSOCS);
|
||||
}
|
||||
|
||||
/**
|
||||
* Checks the dictionary's definition of the association to assign a unique name to the child node.
|
||||
*
|
||||
* @param assocTypeQName the type of the child association
|
||||
* @param childNode the child node being added. The name will be extracted from it, if necessary.
|
||||
* @return Returns the value to be put on the child association for uniqueness, or null if
|
||||
*/
|
||||
private void setChildUniqueName(Node childNode)
|
||||
{
|
||||
// get the name property
|
||||
Map<QName, PropertyValue> properties = childNode.getProperties();
|
||||
PropertyValue nameValue = properties.get(ContentModel.PROP_NAME);
|
||||
String useName = null;
|
||||
if (nameValue == null)
|
||||
{
|
||||
// no name has been assigned, so assign the ID of the child node
|
||||
useName = childNode.getUuid();
|
||||
}
|
||||
else
|
||||
{
|
||||
useName = (String) nameValue.getValue(DataTypeDefinition.TEXT);
|
||||
}
|
||||
// get all the parent assocs
|
||||
Collection<ChildAssoc> parentAssocs = childNode.getParentAssocs();
|
||||
for (ChildAssoc assoc : parentAssocs)
|
||||
{
|
||||
QName assocTypeQName = assoc.getTypeQName();
|
||||
AssociationDefinition assocDef = dictionaryService.getAssociation(assocTypeQName);
|
||||
if (!assocDef.isChild())
|
||||
{
|
||||
throw new DataIntegrityViolationException("Child association has non-child type: " + assoc.getId());
|
||||
}
|
||||
ChildAssociationDefinition childAssocDef = (ChildAssociationDefinition) assocDef;
|
||||
if (childAssocDef.getDuplicateChildNamesAllowed())
|
||||
{
|
||||
// the name is irrelevant, so it doesn't need to be put into the unique key
|
||||
nodeDaoService.setChildNameUnique(assoc, null);
|
||||
}
|
||||
else
|
||||
{
|
||||
nodeDaoService.setChildNameUnique(assoc, useName);
|
||||
}
|
||||
}
|
||||
// done
|
||||
if (logger.isDebugEnabled())
|
||||
{
|
||||
logger.debug(
|
||||
"Unique name set for all " + parentAssocs.size() + " parent associations: \n" +
|
||||
" name: " + useName);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
Reference in New Issue
Block a user