Merged V2.2 to HEAD (QNames)

7624: QName Refactor Merge 1 of 9
   7625: QName Refactor Merge 2 of 9
   7626: QName Refactor Merge 3 of 9
   7627: QName Refactor Merge 4 of 9
   7628: QName Refactor Merge 5 of 9


git-svn-id: https://svn.alfresco.com/repos/alfresco-enterprise/alfresco/HEAD/root@8436 c4b6b30b-aa2e-2d43-bbcb-ca4b014f7261
This commit is contained in:
Derek Hulley
2008-03-06 18:12:25 +00:00
parent a49bfd311d
commit 00e81c0d66
52 changed files with 2851 additions and 698 deletions

View File

@@ -44,6 +44,8 @@ import org.alfresco.repo.domain.Node;
import org.alfresco.repo.domain.NodeAssoc;
import org.alfresco.repo.domain.NodeStatus;
import org.alfresco.repo.domain.PropertyValue;
import org.alfresco.repo.domain.QNameDAO;
import org.alfresco.repo.domain.QNameEntity;
import org.alfresco.repo.domain.Store;
import org.alfresco.repo.node.AbstractNodeServiceImpl;
import org.alfresco.repo.node.StoreArchiveMap;
@@ -91,6 +93,7 @@ public class DbNodeServiceImpl extends AbstractNodeServiceImpl
private static Log logger = LogFactory.getLog(DbNodeServiceImpl.class);
private static Log loggerPaths = LogFactory.getLog(DbNodeServiceImpl.class.getName() + ".paths");
private QNameDAO qnameDAO;
private NodeDaoService nodeDaoService;
private StoreArchiveMap storeArchiveMap;
private NodeService avmNodeService;
@@ -101,6 +104,14 @@ public class DbNodeServiceImpl extends AbstractNodeServiceImpl
storeArchiveMap = new StoreArchiveMap(); // in case it is not set
}
/**
* Set the component for creating QName entities.
*/
public void setQnameDAO(QNameDAO qnameDAO)
{
this.qnameDAO = qnameDAO;
}
public void setNodeDaoService(NodeDaoService nodeDaoService)
{
this.nodeDaoService = nodeDaoService;
@@ -426,14 +437,15 @@ public class DbNodeServiceImpl extends AbstractNodeServiceImpl
List<AspectDefinition> defaultAspectDefs = classDefinition.getDefaultAspects();
// add all the aspects to the node
Set<QName> nodeAspects = node.getAspects();
Set<Long> nodeAspects = node.getAspects();
for (AspectDefinition defaultAspectDef : defaultAspectDefs)
{
QName aspectTypeQName = defaultAspectDef.getName();
invokeBeforeAddAspect(nodeRef, aspectTypeQName);
nodeAspects.add(aspectTypeQName);
QName defaultAspectQName = defaultAspectDef.getName();
QNameEntity defaultAspectQNameEntity = qnameDAO.getOrCreateQNameEntity(defaultAspectDef.getName());
invokeBeforeAddAspect(nodeRef, defaultAspectQName);
nodeAspects.add(defaultAspectQNameEntity.getId());
addDefaultPropertyValues(defaultAspectDef, properties);
invokeOnAddAspect(nodeRef, aspectTypeQName);
invokeOnAddAspect(nodeRef, defaultAspectQName);
// Now add any default aspects for this aspect
addDefaultAspects(defaultAspectDef, node, properties);
@@ -465,8 +477,8 @@ public class DbNodeServiceImpl extends AbstractNodeServiceImpl
boolean movingStore = !nodeToMoveRef.getStoreRef().equals(newParentRef.getStoreRef());
// data needed for policy invocation
QName nodeToMoveTypeQName = nodeToMove.getTypeQName();
Set<QName> nodeToMoveAspects = nodeToMove.getAspects();
QName nodeToMoveTypeQName = nodeToMove.getTypeQName().getQName();
Set<Long> nodeToMoveAspects = nodeToMove.getAspects();
// Invoke policy behaviour
if (movingStore)
@@ -510,9 +522,15 @@ public class DbNodeServiceImpl extends AbstractNodeServiceImpl
// invoke policy behaviour
if (movingStore)
{
Set<QName> nodeToMoveAspectQNames = new HashSet<QName>(17);
for (Long qnameEntityId : nodeToMoveAspects)
{
QName nodeToMoveAspectQName = qnameDAO.getQNameEntity(qnameEntityId).getQName();
nodeToMoveAspectQNames.add(nodeToMoveAspectQName);
}
// 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);
invokeOnDeleteNode(oldAssocRef, nodeToMoveTypeQName, nodeToMoveAspectQNames, true);
invokeOnCreateNode(newAssoc.getChildAssocRef());
}
else
@@ -556,7 +574,7 @@ public class DbNodeServiceImpl extends AbstractNodeServiceImpl
public QName getType(NodeRef nodeRef) throws InvalidNodeRefException
{
Node node = getNodeNotNull(nodeRef);
return node.getTypeQName();
return node.getTypeQName().getQName();
}
/**
@@ -575,8 +593,10 @@ public class DbNodeServiceImpl extends AbstractNodeServiceImpl
// Invoke policies
invokeBeforeUpdateNode(nodeRef);
// Ensure that we have a QName entity to represent the type
QNameEntity typeQNameEntity = qnameDAO.getOrCreateQNameEntity(typeQName);
// Get the node and set the new type
node.setTypeQName(typeQName);
node.setTypeQName(typeQNameEntity);
// Add the default aspects to the node (update the properties with any new default values)
Map<QName, Serializable> properties = this.getPropertiesImpl(node);
@@ -626,8 +646,10 @@ public class DbNodeServiceImpl extends AbstractNodeServiceImpl
// Set the property values back on the node
setProperties(nodeRef, nodeProperties);
// Get the persistale QNameEntity for the aspect
QNameEntity aspectTypeQNameEntity = qnameDAO.getOrCreateQNameEntity(aspectTypeQName);
// physically attach the aspect to the node
if (node.getAspects().add(aspectTypeQName) == true)
if (node.getAspects().add(aspectTypeQNameEntity.getId()) == true)
{
// Invoke policy behaviours
invokeOnUpdateNode(nodeRef);
@@ -652,9 +674,11 @@ public class DbNodeServiceImpl extends AbstractNodeServiceImpl
}
// get the node
Node node = getNodeNotNull(nodeRef);
Set<QName> nodeAspects = node.getAspects();
Set<Long> nodeAspects = node.getAspects();
if (!nodeAspects.contains(aspectTypeQName))
// Get the persistale QNameEntity for the aspect
QNameEntity aspectTypeQNameEntity = qnameDAO.getOrCreateQNameEntity(aspectTypeQName);
if (!nodeAspects.contains(aspectTypeQNameEntity.getId()))
{
// The aspect isn't present so just leave it
return;
@@ -665,13 +689,14 @@ public class DbNodeServiceImpl extends AbstractNodeServiceImpl
invokeBeforeRemoveAspect(nodeRef, aspectTypeQName);
// remove the aspect, if present
node.getAspects().remove(aspectTypeQName);
nodeAspects.remove(aspectTypeQNameEntity.getId());
Map<QName, PropertyValue> nodeProperties = node.getProperties();
Map<Long, PropertyValue> nodeProperties = node.getProperties();
Map<QName,PropertyDefinition> propertyDefs = aspectDef.getProperties();
for (QName propertyName : propertyDefs.keySet())
for (QName propertyQName : propertyDefs.keySet())
{
nodeProperties.remove(propertyName);
QNameEntity propertyQNameEntity = qnameDAO.getOrCreateQNameEntity(propertyQName);
nodeProperties.remove(propertyQNameEntity.getId());
}
// Remove child associations
@@ -680,7 +705,7 @@ public class DbNodeServiceImpl extends AbstractNodeServiceImpl
for (ChildAssoc childAssoc : childAssocs)
{
// Ignore if the association type is not defined by the aspect
QName childAssocQName = childAssoc.getTypeQName();
QName childAssocQName = childAssoc.getTypeQName().getQName();
if (!childAssocDefs.containsKey(childAssocQName))
{
continue;
@@ -695,7 +720,7 @@ public class DbNodeServiceImpl extends AbstractNodeServiceImpl
for (NodeAssoc nodeAssoc : nodeAssocs)
{
// Ignore if the association type is not defined by the aspect
QName nodeAssocQName = nodeAssoc.getTypeQName();
QName nodeAssocQName = nodeAssoc.getTypeQName().getQName();
if (!assocDefs.containsKey(nodeAssocQName))
{
continue;
@@ -717,11 +742,17 @@ public class DbNodeServiceImpl extends AbstractNodeServiceImpl
*
* @see Node#getAspects()
*/
public boolean hasAspect(NodeRef nodeRef, QName aspectRef) throws InvalidNodeRefException, InvalidAspectException
public boolean hasAspect(NodeRef nodeRef, QName aspectQName) throws InvalidNodeRefException, InvalidAspectException
{
QNameEntity aspectQNameEntity = qnameDAO.getQNameEntity(aspectQName);
if (aspectQNameEntity == null)
{
// There is no persisted, fixed QName like this
return false;
}
Node node = getNodeNotNull(nodeRef);
Set<QName> aspectQNames = node.getAspects();
boolean hasAspect = aspectQNames.contains(aspectRef);
Set<Long> aspectQNames = node.getAspects();
boolean hasAspect = aspectQNames.contains(aspectQNameEntity.getId());
// done
return hasAspect;
}
@@ -729,10 +760,14 @@ public class DbNodeServiceImpl extends AbstractNodeServiceImpl
public Set<QName> getAspects(NodeRef nodeRef) throws InvalidNodeRefException
{
Node node = getNodeNotNull(nodeRef);
Set<QName> aspectQNames = node.getAspects();
Set<Long> aspectQNameEntities = node.getAspects();
// copy the set to ensure initialization
Set<QName> ret = new HashSet<QName>(aspectQNames.size());
ret.addAll(aspectQNames);
Set<QName> ret = new HashSet<QName>(aspectQNameEntities.size());
for (Long aspectQNameEntityId : aspectQNameEntities)
{
QNameEntity aspectQNameEntity = qnameDAO.getQNameEntity(aspectQNameEntityId);
ret.add(aspectQNameEntity.getQName());
}
// done
return ret;
}
@@ -751,13 +786,17 @@ public class DbNodeServiceImpl extends AbstractNodeServiceImpl
ChildAssociationRef childAssocRef = getPrimaryParent(nodeRef);
// get type and aspect QNames as they will be unavailable after the delete
QName nodeTypeQName = node.getTypeQName();
Set<QName> nodeAspectQNames = node.getAspects();
QName nodeTypeQName = node.getTypeQName().getQName();
Set<Long> nodeAspectQNameEntityIds = node.getAspects();
// Get QNameEntity for subsequent checks
QNameEntity aspectTempQNameEntity = qnameDAO.getOrCreateQNameEntity(ContentModel.ASPECT_TEMPORARY);
QNameEntity aspectWorkingCopyQNameEntity = qnameDAO.getOrCreateQNameEntity(ContentModel.ASPECT_WORKING_COPY);
// check if we need to archive the node
StoreRef archiveStoreRef = null;
if (nodeAspectQNames.contains(ContentModel.ASPECT_TEMPORARY) ||
nodeAspectQNames.contains(ContentModel.ASPECT_WORKING_COPY))
if (nodeAspectQNameEntityIds.contains(aspectTempQNameEntity.getId()) ||
nodeAspectQNameEntityIds.contains(aspectWorkingCopyQNameEntity.getId()))
{
// The node is either temporary or a working copy.
// It can not be archived.
@@ -770,7 +809,7 @@ public class DbNodeServiceImpl extends AbstractNodeServiceImpl
// remove tenant domain - to retrieve archive store from map
archiveStoreRef = storeArchiveMap.getArchiveMap().get(storeRef);
// get the type and check if we need archiving
TypeDefinition typeDef = dictionaryService.getType(node.getTypeQName());
TypeDefinition typeDef = dictionaryService.getType(nodeTypeQName);
if (typeDef == null || !typeDef.isArchive() || archiveStoreRef == null)
{
requiresDelete = true;
@@ -782,7 +821,13 @@ public class DbNodeServiceImpl extends AbstractNodeServiceImpl
// perform a normal deletion
nodeDaoService.deleteNode(node, true);
// Invoke policy behaviours
invokeOnDeleteNode(childAssocRef, nodeTypeQName, nodeAspectQNames, false);
Set<QName> nodeToDeleteAspectQNames = new HashSet<QName>(17);
for (Long qnameEntityId : nodeAspectQNameEntityIds)
{
QName nodeToDeleteAspectQName = qnameDAO.getQNameEntity(qnameEntityId).getQName();
nodeToDeleteAspectQNames.add(nodeToDeleteAspectQName);
}
invokeOnDeleteNode(childAssocRef, nodeTypeQName, nodeToDeleteAspectQNames, false);
}
else
{
@@ -971,14 +1016,14 @@ public class DbNodeServiceImpl extends AbstractNodeServiceImpl
private Map<QName, Serializable> getPropertiesImpl(Node node) throws InvalidNodeRefException
{
Map<QName,PropertyDefinition> propDefs = dictionaryService.getPropertyDefs(node.getTypeQName());
Map<QName, PropertyValue> nodeProperties = node.getProperties();
Map<QName,PropertyDefinition> propDefs = dictionaryService.getPropertyDefs(node.getTypeQName().getQName());
Map<Long, PropertyValue> nodeProperties = node.getProperties();
Map<QName, Serializable> ret = new HashMap<QName, Serializable>(nodeProperties.size());
// copy values
for (Map.Entry<QName, PropertyValue> entry: nodeProperties.entrySet())
for (Map.Entry<Long, PropertyValue> entry: nodeProperties.entrySet())
{
QName propertyQName = entry.getKey();
Long propertyQNameId = entry.getKey();
QName propertyQName = qnameDAO.getQNameEntity(propertyQNameId).getQName();
PropertyValue propertyValue = entry.getValue();
// get the property definition
PropertyDefinition propertyDef = propDefs.get(propertyQName);
@@ -1024,28 +1069,37 @@ public class DbNodeServiceImpl extends AbstractNodeServiceImpl
return node.getId();
}
Map<QName, PropertyValue> properties = node.getProperties();
PropertyValue propertyValue = properties.get(qname);
// check if we need to provide a spoofed name
if (propertyValue == null && qname.equals(ContentModel.PROP_NAME))
// Get the QName entity
QNameEntity qnameEntity = qnameDAO.getQNameEntity(qname);
if (qnameEntity == null)
{
return nodeRef.getId();
// There is no persisted, fixed QName like this
return null;
}
// get the property definition
PropertyDefinition propertyDef = dictionaryService.getProperty(qname);
if ((propertyDef != null) && (propertyDef.getDataType().getName().equals(DataTypeDefinition.NODE_REF)) &&
(propertyValue != null) && (propertyValue.getStringValue() != null))
else
{
propertyValue.setStringValue(tenantService.getBaseName(new NodeRef(propertyValue.getStringValue())).toString());
Map<Long, PropertyValue> properties = node.getProperties();
PropertyValue propertyValue = properties.get(qnameEntity.getId());
// check if we need to provide a spoofed name
if (propertyValue == null && qname.equals(ContentModel.PROP_NAME))
{
return nodeRef.getId();
}
// Convert any NodeRefs using multi-tenant translation
PropertyDefinition propertyDef = dictionaryService.getProperty(qname);
if ((propertyDef != null) && (propertyDef.getDataType().getName().equals(DataTypeDefinition.NODE_REF)) &&
(propertyValue != null) && (propertyValue.getStringValue() != null))
{
propertyValue.setStringValue(tenantService.getBaseName(new NodeRef(propertyValue.getStringValue())).toString());
}
// convert to the correct type
Serializable value = makeSerializableValue(propertyDef, propertyValue);
// done
return value;
}
// convert to the correct type
Serializable value = makeSerializableValue(propertyDef, propertyValue);
// done
return value;
}
/**
@@ -1095,17 +1149,19 @@ public class DbNodeServiceImpl extends AbstractNodeServiceImpl
extractIntrinsicProperties(node, properties);
// copy properties onto node
Map<QName, PropertyValue> nodeProperties = node.getProperties();
Map<Long, PropertyValue> nodeProperties = node.getProperties();
nodeProperties.clear();
// check the property type and copy the values across
for (QName propertyQName : properties.keySet())
{
QNameEntity propertyQNameEntity = qnameDAO.getOrCreateQNameEntity(propertyQName);
PropertyDefinition propertyDef = dictionaryService.getProperty(propertyQName);
// Get the value to persist
Serializable value = properties.get(propertyQName);
// get a persistable value
PropertyValue propertyValue = makePropertyValue(propertyDef, value);
nodeProperties.put(propertyQName, propertyValue);
nodeProperties.put(propertyQNameEntity.getId(), propertyValue);
}
// update the node status
@@ -1160,11 +1216,13 @@ public class DbNodeServiceImpl extends AbstractNodeServiceImpl
{
NodeRef nodeRef = node.getNodeRef();
Map<QName, PropertyValue> properties = node.getProperties();
Map<Long, PropertyValue> properties = node.getProperties();
PropertyDefinition propertyDef = dictionaryService.getProperty(qname);
// Get the persistable key
QNameEntity qnameEntity = qnameDAO.getOrCreateQNameEntity(qname);
// get a persistable value
PropertyValue propertyValue = makePropertyValue(propertyDef, value);
properties.put(qname, propertyValue);
properties.put(qnameEntity.getId(), propertyValue);
// update the node status
nodeDaoService.recordChangeId(nodeRef);
@@ -1185,11 +1243,13 @@ public class DbNodeServiceImpl extends AbstractNodeServiceImpl
// Invoke policy behaviours
invokeBeforeUpdateNode(nodeRef);
// Get the persistable QNameEntity
QNameEntity qnameEntity = qnameDAO.getOrCreateQNameEntity(qname);
// Get the values before
Map<QName, Serializable> propertiesBefore = getPropertiesImpl(node);
// Remove the property
Map<QName, PropertyValue> properties = node.getProperties();
properties.remove(qname);
Map<Long, PropertyValue> properties = node.getProperties();
properties.remove(qnameEntity.getId());
// Get the values afterwards
Map<QName, Serializable> propertiesAfter = getPropertiesImpl(node);
@@ -1234,8 +1294,10 @@ public class DbNodeServiceImpl extends AbstractNodeServiceImpl
List<ChildAssociationRef> results = new ArrayList<ChildAssociationRef>(parentAssocs.size());
for (ChildAssoc assoc : parentAssocs)
{
QName assocTypeQName = assoc.getTypeQName().getQName();
QName assocQName = assoc.getQname();
// does the qname match the pattern?
if (!qnamePattern.isMatch(assoc.getQname()) || !typeQNamePattern.isMatch(assoc.getTypeQName()))
if (!qnamePattern.isMatch(assocQName) || !typeQNamePattern.isMatch(assocTypeQName))
{
// no match - ignore
continue;
@@ -1391,8 +1453,9 @@ public class DbNodeServiceImpl extends AbstractNodeServiceImpl
List<AssociationRef> nodeAssocRefs = new ArrayList<AssociationRef>(assocs.size());
for (NodeAssoc assoc : assocs)
{
QName assocTypeQName = assoc.getTypeQName().getQName();
// check qname pattern
if (!qnamePattern.isMatch(assoc.getTypeQName()))
if (!qnamePattern.isMatch(assocTypeQName))
{
continue; // the assoc name doesn't match the pattern given
}
@@ -1410,8 +1473,9 @@ public class DbNodeServiceImpl extends AbstractNodeServiceImpl
List<AssociationRef> nodeAssocRefs = new ArrayList<AssociationRef>(assocs.size());
for (NodeAssoc assoc : assocs)
{
QName assocTypeQName = assoc.getTypeQName().getQName();
// check qname pattern
if (!qnamePattern.isMatch(assoc.getTypeQName()))
if (!qnamePattern.isMatch(assocTypeQName))
{
continue; // the assoc name doesn't match the pattern given
}
@@ -1452,7 +1516,7 @@ public class DbNodeServiceImpl extends AbstractNodeServiceImpl
boolean hasParents = parentAssocs.size() > 0;
// does the current node have a root aspect?
boolean isRoot = hasAspect(currentNodeRef, ContentModel.ASPECT_ROOT);
boolean isStoreRoot = currentNode.getTypeQName().equals(ContentModel.TYPE_STOREROOT);
boolean isStoreRoot = currentNode.getTypeQName().getQName().equals(ContentModel.TYPE_STOREROOT);
// look for a root. If we only want the primary root, then ignore all but the top-level root.
if (isRoot && !(primaryOnly && hasParents)) // exclude primary search with parents present
@@ -1482,8 +1546,7 @@ public class DbNodeServiceImpl extends AbstractNodeServiceImpl
}
if (first != null)
{
// mimic an association that would appear if the current node was below
// the root node
// mimic an association that would appear if the current node was below the root node
// or if first beneath the root node it will make the real thing
ChildAssociationRef updateAssocRef = new ChildAssociationRef(
isStoreRoot ? ContentModel.ASSOC_CHILDREN : first.getRef().getTypeQName(),
@@ -1531,7 +1594,13 @@ public class DbNodeServiceImpl extends AbstractNodeServiceImpl
NodeRef childRef = tenantService.getBaseName(assoc.getChild().getNodeRef());
boolean isPrimary = assoc.getIsPrimary();
// build a real association reference
ChildAssociationRef assocRef = new ChildAssociationRef(assoc.getTypeQName(), parentRef, qname, childRef, isPrimary, -1);
ChildAssociationRef assocRef = new ChildAssociationRef(
assoc.getTypeQName().getQName(),
parentRef,
qname,
childRef,
isPrimary,
-1);
// Ordering is not important here: We are building distinct paths upwards
Path.Element element = new Path.ChildAssocElement(assocRef);
// create a new path that builds on the current path
@@ -1612,41 +1681,51 @@ public class DbNodeServiceImpl extends AbstractNodeServiceImpl
private void archiveNode(NodeRef nodeRef, StoreRef archiveStoreRef)
{
QNameEntity aspectQNameEntityArchived = qnameDAO.getOrCreateQNameEntity(ContentModel.ASPECT_ARCHIVED);
QNameEntity propQNameEntityOwner = qnameDAO.getOrCreateQNameEntity(ContentModel.PROP_OWNER);
QNameEntity propQNameEntityCreator = qnameDAO.getOrCreateQNameEntity(ContentModel.PROP_CREATOR);
QNameEntity propQNameArchivedBy = qnameDAO.getOrCreateQNameEntity(ContentModel.PROP_ARCHIVED_BY);
QNameEntity propQNameArchivedDate = qnameDAO.getOrCreateQNameEntity(ContentModel.PROP_ARCHIVED_DATE);
QNameEntity propQNameArchivedOriginalParentAssoc = qnameDAO.getOrCreateQNameEntity(ContentModel.PROP_ARCHIVED_ORIGINAL_PARENT_ASSOC);
NodeStatus nodeStatus = nodeDaoService.getNodeStatus(nodeRef, false);
Node node = nodeStatus.getNode();
ChildAssoc primaryParentAssoc = nodeDaoService.getPrimaryParentAssoc(node);
// add the aspect
Set<QName> aspects = node.getAspects();
aspects.add(ContentModel.ASPECT_ARCHIVED);
Map<QName, PropertyValue> properties = node.getProperties();
Set<Long> aspects = node.getAspects();
aspects.add(aspectQNameEntityArchived.getId());
Map<Long, PropertyValue> properties = node.getProperties();
PropertyValue archivedByProperty = makePropertyValue(
dictionaryService.getProperty(ContentModel.PROP_ARCHIVED_BY),
AuthenticationUtil.getCurrentUserName());
properties.put(ContentModel.PROP_ARCHIVED_BY, archivedByProperty);
properties.put(propQNameArchivedBy.getId(), archivedByProperty);
PropertyValue archivedDateProperty = makePropertyValue(
dictionaryService.getProperty(ContentModel.PROP_ARCHIVED_DATE),
new Date());
properties.put(ContentModel.PROP_ARCHIVED_DATE, archivedDateProperty);
properties.put(propQNameArchivedDate.getId(), archivedDateProperty);
PropertyValue archivedPrimaryParentNodeRefProperty = makePropertyValue(
dictionaryService.getProperty(ContentModel.PROP_ARCHIVED_ORIGINAL_PARENT_ASSOC),
primaryParentAssoc.getChildAssocRef());
properties.put(ContentModel.PROP_ARCHIVED_ORIGINAL_PARENT_ASSOC, archivedPrimaryParentNodeRefProperty);
PropertyValue originalOwnerProperty = properties.get(ContentModel.PROP_OWNER);
PropertyValue originalCreatorProperty = properties.get(ContentModel.PROP_CREATOR);
properties.put(propQNameArchivedOriginalParentAssoc.getId(), archivedPrimaryParentNodeRefProperty);
PropertyValue originalOwnerProperty = properties.get(propQNameEntityOwner.getId());
PropertyValue originalCreatorProperty = properties.get(propQNameEntityCreator.getId());
if (originalOwnerProperty != null || originalCreatorProperty != null)
{
QNameEntity propQNameArchivedOriginalOwner = qnameDAO.getOrCreateQNameEntity(ContentModel.PROP_ARCHIVED_ORIGINAL_OWNER);
properties.put(
ContentModel.PROP_ARCHIVED_ORIGINAL_OWNER,
propQNameArchivedOriginalOwner.getId(),
originalOwnerProperty != null ? originalOwnerProperty : originalCreatorProperty);
}
// change the node ownership
aspects.add(ContentModel.ASPECT_OWNABLE);
QNameEntity ownableAspectQNameEntity = qnameDAO.getOrCreateQNameEntity(ContentModel.ASPECT_OWNABLE);
aspects.add(ownableAspectQNameEntity.getId());
PropertyValue newOwnerProperty = makePropertyValue(
dictionaryService.getProperty(ContentModel.PROP_ARCHIVED_ORIGINAL_OWNER),
AuthenticationUtil.getCurrentUserName());
properties.put(ContentModel.PROP_OWNER, newOwnerProperty);
QNameEntity propQNameOwner = qnameDAO.getOrCreateQNameEntity(ContentModel.PROP_OWNER);
properties.put(propQNameOwner.getId(), newOwnerProperty);
// move the node
NodeRef archiveStoreRootNodeRef = getRootNode(archiveStoreRef);
@@ -1853,33 +1932,38 @@ public class DbNodeServiceImpl extends AbstractNodeServiceImpl
}
// add archived aspect
node.getAspects().add(ContentModel.ASPECT_ARCHIVED_ASSOCS);
QNameEntity archivedAssocsAspectQNameEntity = qnameDAO.getOrCreateQNameEntity(ContentModel.ASPECT_ARCHIVED_ASSOCS);
node.getAspects().add(archivedAssocsAspectQNameEntity.getId());
// set properties
Map<QName, PropertyValue> properties = node.getProperties();
Map<Long, PropertyValue> properties = node.getProperties();
if (archivedParentAssocRefs.size() > 0)
{
QNameEntity propQNameEntity = qnameDAO.getOrCreateQNameEntity(ContentModel.PROP_ARCHIVED_PARENT_ASSOCS);
PropertyDefinition propertyDef = dictionaryService.getProperty(ContentModel.PROP_ARCHIVED_PARENT_ASSOCS);
PropertyValue propertyValue = makePropertyValue(propertyDef, archivedParentAssocRefs);
properties.put(ContentModel.PROP_ARCHIVED_PARENT_ASSOCS, propertyValue);
properties.put(propQNameEntity.getId(), propertyValue);
}
if (archivedChildAssocRefs.size() > 0)
{
QNameEntity propQNameEntity = qnameDAO.getOrCreateQNameEntity(ContentModel.PROP_ARCHIVED_CHILD_ASSOCS);
PropertyDefinition propertyDef = dictionaryService.getProperty(ContentModel.PROP_ARCHIVED_CHILD_ASSOCS);
PropertyValue propertyValue = makePropertyValue(propertyDef, archivedChildAssocRefs);
properties.put(ContentModel.PROP_ARCHIVED_CHILD_ASSOCS, propertyValue);
properties.put(propQNameEntity.getId(), propertyValue);
}
if (archivedSourceAssocRefs.size() > 0)
{
QNameEntity propQNameEntity = qnameDAO.getOrCreateQNameEntity(ContentModel.PROP_ARCHIVED_SOURCE_ASSOCS);
PropertyDefinition propertyDef = dictionaryService.getProperty(ContentModel.PROP_ARCHIVED_SOURCE_ASSOCS);
PropertyValue propertyValue = makePropertyValue(propertyDef, archivedSourceAssocRefs);
properties.put(ContentModel.PROP_ARCHIVED_SOURCE_ASSOCS, propertyValue);
properties.put(propQNameEntity.getId(), propertyValue);
}
if (archivedTargetAssocRefs.size() > 0)
{
QNameEntity propQNameEntity = qnameDAO.getOrCreateQNameEntity(ContentModel.PROP_ARCHIVED_TARGET_ASSOCS);
PropertyDefinition propertyDef = dictionaryService.getProperty(ContentModel.PROP_ARCHIVED_TARGET_ASSOCS);
PropertyValue propertyValue = makePropertyValue(propertyDef, archivedTargetAssocRefs);
properties.put(ContentModel.PROP_ARCHIVED_TARGET_ASSOCS, propertyValue);
properties.put(propQNameEntity.getId(), propertyValue);
}
}
@@ -1899,33 +1983,41 @@ public class DbNodeServiceImpl extends AbstractNodeServiceImpl
public NodeRef restoreNode(NodeRef archivedNodeRef, NodeRef destinationParentNodeRef, QName assocTypeQName, QName assocQName)
{
QNameEntity aspectQNameEntityArchived = qnameDAO.getOrCreateQNameEntity(ContentModel.ASPECT_ARCHIVED);
QNameEntity propQNameEntityOwner = qnameDAO.getOrCreateQNameEntity(ContentModel.PROP_OWNER);
QNameEntity propQNameEntityOrigParentAssoc = qnameDAO.getOrCreateQNameEntity(ContentModel.PROP_ARCHIVED_ORIGINAL_PARENT_ASSOC);
QNameEntity propQNameEntityArchivedBy = qnameDAO.getOrCreateQNameEntity(ContentModel.PROP_ARCHIVED_BY);
QNameEntity propQNameEntityArchivedDate = qnameDAO.getOrCreateQNameEntity(ContentModel.PROP_ARCHIVED_DATE);
QNameEntity propQNameEntityOrigOwner = qnameDAO.getOrCreateQNameEntity(ContentModel.PROP_ARCHIVED_ORIGINAL_OWNER);
NodeStatus archivedNodeStatus = getNodeStatusNotNull(archivedNodeRef);
Node archivedNode = archivedNodeStatus.getNode();
Set<QName> aspects = archivedNode.getAspects();
Map<QName, PropertyValue> properties = archivedNode.getProperties();
Set<Long> aspects = archivedNode.getAspects();
Map<Long, PropertyValue> properties = archivedNode.getProperties();
// the node must be a top-level archive node
if (!aspects.contains(ContentModel.ASPECT_ARCHIVED))
if (!aspects.contains(aspectQNameEntityArchived.getId()))
{
throw new AlfrescoRuntimeException("The node to archive is not an archive node");
}
ChildAssociationRef originalPrimaryParentAssocRef = (ChildAssociationRef) makeSerializableValue(
dictionaryService.getProperty(ContentModel.PROP_ARCHIVED_ORIGINAL_PARENT_ASSOC),
properties.get(ContentModel.PROP_ARCHIVED_ORIGINAL_PARENT_ASSOC));
PropertyValue originalOwnerProperty = properties.get(ContentModel.PROP_ARCHIVED_ORIGINAL_OWNER);
properties.get(propQNameEntityOrigParentAssoc.getId()));
PropertyValue originalOwnerProperty = properties.get(propQNameEntityOrigOwner.getId());
// remove the archived aspect
removeAspect(archivedNodeRef, ContentModel.ASPECT_ARCHIVED); // allow policy to fire, e.g. for DictionaryModelType
properties.remove(ContentModel.PROP_ARCHIVED_ORIGINAL_PARENT_ASSOC);
properties.remove(ContentModel.PROP_ARCHIVED_BY);
properties.remove(ContentModel.PROP_ARCHIVED_DATE);
properties.remove(ContentModel.PROP_ARCHIVED_ORIGINAL_OWNER);
properties.remove(propQNameEntityOrigParentAssoc.getId());
properties.remove(propQNameEntityArchivedBy.getId());
properties.remove(propQNameEntityArchivedDate.getId());
properties.remove(propQNameEntityOrigOwner.getId());
// restore the original ownership
if (originalOwnerProperty != null)
{
aspects.add(ContentModel.ASPECT_OWNABLE);
properties.put(ContentModel.PROP_OWNER, originalOwnerProperty);
QNameEntity ownableAspectQNameEntity = qnameDAO.getOrCreateQNameEntity(ContentModel.ASPECT_OWNABLE);
aspects.add(ownableAspectQNameEntity.getId());
properties.put(propQNameEntityOwner.getId(), originalOwnerProperty);
}
if (destinationParentNodeRef == null)
@@ -1958,7 +2050,7 @@ public class DbNodeServiceImpl extends AbstractNodeServiceImpl
for (NodeStatus restoreNodeStatus : restoreNodeStatusesById.values())
{
Node restoreNode = restoreNodeStatus.getNode();
restoreAssocs(restoreNode);
restoreAssocs(restoreNode, propQNameEntityOrigParentAssoc);
}
// the node reference has changed due to the store move
@@ -1975,11 +2067,11 @@ public class DbNodeServiceImpl extends AbstractNodeServiceImpl
return restoredNodeRef;
}
private void restoreAssocs(Node node)
private void restoreAssocs(Node node, QNameEntity propQNameEntityOrigParentAssoc)
{
NodeRef nodeRef = node.getNodeRef();
// set properties
Map<QName, PropertyValue> properties = node.getProperties();
Map<Long, PropertyValue> properties = node.getProperties();
// restore parent associations
Collection<ChildAssociationRef> parentAssocRefs = (Collection<ChildAssociationRef>) getProperty(
@@ -2004,7 +2096,7 @@ public class DbNodeServiceImpl extends AbstractNodeServiceImpl
assocTypeQName,
assocRef.getQName());
}
properties.remove(ContentModel.PROP_ARCHIVED_PARENT_ASSOCS);
properties.remove(propQNameEntityOrigParentAssoc.getId());
}
// make sure that the node name uniqueness is enforced
@@ -2087,8 +2179,9 @@ public class DbNodeServiceImpl extends AbstractNodeServiceImpl
private void setChildUniqueName(Node childNode)
{
// get the name property
Map<QName, PropertyValue> properties = childNode.getProperties();
PropertyValue nameValue = properties.get(ContentModel.PROP_NAME);
Map<Long, PropertyValue> properties = childNode.getProperties();
QNameEntity nameQNameEntity = qnameDAO.getOrCreateQNameEntity(ContentModel.PROP_NAME);
PropertyValue nameValue = properties.get(nameQNameEntity.getId());
String useName = null;
if (nameValue == null)
{
@@ -2103,7 +2196,7 @@ public class DbNodeServiceImpl extends AbstractNodeServiceImpl
Collection<ChildAssoc> parentAssocs = nodeDaoService.getParentAssocs(childNode);
for (ChildAssoc assoc : parentAssocs)
{
QName assocTypeQName = assoc.getTypeQName();
QName assocTypeQName = assoc.getTypeQName().getQName();
AssociationDefinition assocDef = dictionaryService.getAssociation(assocTypeQName);
if (!assocDef.isChild())
{

View File

@@ -29,6 +29,7 @@ import java.net.InetAddress;
import java.net.UnknownHostException;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
@@ -39,11 +40,14 @@ import org.alfresco.error.AlfrescoRuntimeException;
import org.alfresco.model.ContentModel;
import org.alfresco.repo.cache.SimpleCache;
import org.alfresco.repo.domain.ChildAssoc;
import org.alfresco.repo.domain.NamespaceEntity;
import org.alfresco.repo.domain.Node;
import org.alfresco.repo.domain.NodeAssoc;
import org.alfresco.repo.domain.NodeKey;
import org.alfresco.repo.domain.NodeStatus;
import org.alfresco.repo.domain.PropertyValue;
import org.alfresco.repo.domain.QNameDAO;
import org.alfresco.repo.domain.QNameEntity;
import org.alfresco.repo.domain.Server;
import org.alfresco.repo.domain.Store;
import org.alfresco.repo.domain.StoreKey;
@@ -120,6 +124,7 @@ public class HibernateNodeDaoServiceImpl extends HibernateDaoSupport implements
/** Log to trace parent association caching: <b>classname + .ParentAssocsCache</b> */
private static Log loggerParentAssocsCache = LogFactory.getLog(HibernateNodeDaoServiceImpl.class.getName() + ".ParentAssocsCache");
private QNameDAO qnameDAO;
/** A cache for more performant lookups of the parent associations */
private SimpleCache<Long, Set<Long>> parentAssocsCache;
private boolean isDebugEnabled = logger.isDebugEnabled();
@@ -192,6 +197,14 @@ public class HibernateNodeDaoServiceImpl extends HibernateDaoSupport implements
return uuid.hashCode();
}
/**
* Set the component for creating QName entities.
*/
public void setQnameDAO(QNameDAO qnameDAO)
{
this.qnameDAO = qnameDAO;
}
/**
* Set the transaction-aware cache to store parent associations by child node id
*
@@ -536,12 +549,15 @@ public class HibernateNodeDaoServiceImpl extends HibernateDaoSupport implements
}
}
// Get the node's qname
QNameEntity nodeTypeQNameEntity = qnameDAO.getOrCreateQNameEntity(nodeTypeQName);
// build a concrete node based on a bootstrap type
Node node = new NodeImpl();
// set other required properties
node.setStore(store);
node.setUuid(uuid);
node.setTypeQName(nodeTypeQName);
node.setTypeQName(nodeTypeQNameEntity);
// persist the node
getHibernateTemplate().save(node);
@@ -684,12 +700,18 @@ public class HibernateNodeDaoServiceImpl extends HibernateDaoSupport implements
{
// assign a random name to the node
String randomName = GUID.generate();
// Get the association type's qname
QNameEntity assocTypeQNameEntity = qnameDAO.getOrCreateQNameEntity(assocTypeQName);
// Get the qname components
NamespaceEntity assocNamespaceEntity = qnameDAO.getOrCreateNamespaceEntity(qname.getNamespaceURI());
ChildAssoc assoc = new ChildAssocImpl();
assoc.setTypeQName(assocTypeQName);
assoc.setTypeQName(assocTypeQNameEntity);
assoc.setChildNodeName(randomName);
assoc.setChildNodeNameCrc(-1L); // random names compete only with each other
assoc.setQname(qname);
assoc.setQnameNamespace(assocNamespaceEntity);
assoc.setQnameLocalName(qname.getLocalName());
assoc.setIsPrimary(isPrimary);
// maintain inverse sets
assoc.buildAssociation(parentNode, childNode);
@@ -785,7 +807,7 @@ public class HibernateNodeDaoServiceImpl extends HibernateDaoSupport implements
{
Query query = session
.getNamedQuery(HibernateNodeDaoServiceImpl.QUERY_GET_CHILD_ASSOC_ID_BY_NAME)
.setLong("parentId", parentNode.getId())
.setParameter("parent", parentNode)
.setParameter("childNodeName", childNameNewShort)
.setLong("childNodeNameCrc", childNameNewCrc);
return query.uniqueResult();
@@ -804,7 +826,7 @@ public class HibernateNodeDaoServiceImpl extends HibernateDaoSupport implements
}
throw new DuplicateChildNodeNameException(
parentNode.getNodeRef(),
childAssoc.getTypeQName(),
childAssoc.getTypeQName().getQName(),
childName);
}
// We got past that, so we can just update the entity and know that no other transaction
@@ -831,7 +853,7 @@ public class HibernateNodeDaoServiceImpl extends HibernateDaoSupport implements
{
Query query = session
.getNamedQuery(HibernateNodeDaoServiceImpl.QUERY_GET_PRIMARY_CHILD_NODE_STATUSES)
.setLong("parentId", parentNode.getId());
.setParameter("parent", parentNode);
return query.list();
}
};
@@ -848,7 +870,7 @@ public class HibernateNodeDaoServiceImpl extends HibernateDaoSupport implements
{
Query query = session
.getNamedQuery(HibernateNodeDaoServiceImpl.QUERY_GET_CHILD_ASSOCS)
.setLong("parentId", parentNode.getId());
.setParameter("parent", parentNode);
return query.list();
}
};
@@ -865,7 +887,7 @@ public class HibernateNodeDaoServiceImpl extends HibernateDaoSupport implements
{
Query query = session
.getNamedQuery(HibernateNodeDaoServiceImpl.QUERY_GET_CHILD_ASSOC_REFS)
.setLong("parentId", parentNode.getId());
.setParameter("parent", parentNode);
return query.list();
}
};
@@ -882,10 +904,18 @@ public class HibernateNodeDaoServiceImpl extends HibernateDaoSupport implements
{
public Object doInHibernate(Session session)
{
NamespaceEntity qnameNamespaceEntity = qnameDAO.getNamespaceEntity(assocQName.getNamespaceURI());
String qnameLocalName = assocQName.getLocalName();
if (qnameNamespaceEntity == null)
{
// There can be no match;
return Collections.emptyList();
}
Query query = session
.getNamedQuery(HibernateNodeDaoServiceImpl.QUERY_GET_CHILD_ASSOC_REFS_BY_QNAME)
.setLong("parentId", parentNode.getId())
.setParameter("childAssocQName", assocQName);
.setParameter("parent", parentNode)
.setParameter("qnameNamespace", qnameNamespaceEntity)
.setParameter("qnameLocalName", qnameLocalName);
return query.list();
}
};
@@ -906,18 +936,19 @@ public class HibernateNodeDaoServiceImpl extends HibernateDaoSupport implements
NodeRef parentNodeRef = tenantService.getBaseName(parentNode.getNodeRef());
for (Object[] row : queryResults)
{
String childProtocol = (String) row[5];
String childIdentifier = (String) row[6];
String childUuid = (String) row[7];
String childProtocol = (String) row[6];
String childIdentifier = (String) row[7];
String childUuid = (String) row[8];
NodeRef childNodeRef = tenantService.getBaseName(new NodeRef(new StoreRef(childProtocol, childIdentifier), childUuid));
QName assocTypeQName = (QName) row[0];
QName assocQName = (QName) row[1];
Boolean assocIsPrimary = (Boolean) row[2];
Integer assocIndex = (Integer) row[3];
QNameEntity assocTypeQNameEntity = (QNameEntity) row[0];
NamespaceEntity assocQNameNamespace = (NamespaceEntity) row[1];
String assocQNameLocalName = (String) row[2];
Boolean assocIsPrimary = (Boolean) row[3];
Integer assocIndex = (Integer) row[4];
ChildAssociationRef assocRef = new ChildAssociationRef(
assocTypeQName,
assocTypeQNameEntity.getQName(),
parentNodeRef,
assocQName,
QName.createQName(assocQNameNamespace.getUri(), assocQNameLocalName),
childNodeRef,
assocIsPrimary.booleanValue(),
assocIndex.intValue());
@@ -936,12 +967,21 @@ public class HibernateNodeDaoServiceImpl extends HibernateDaoSupport implements
{
public Object doInHibernate(Session session)
{
QNameEntity typeQNameEntity = qnameDAO.getQNameEntity(assocTypeQName);
NamespaceEntity qnameNamespaceEntity = qnameDAO.getNamespaceEntity(qname.getNamespaceURI());
String qnameLocalName = qname.getLocalName();
if (typeQNameEntity == null || qnameNamespaceEntity == null)
{
// There can be no match;
return null;
}
Query query = session
.getNamedQuery(HibernateNodeDaoServiceImpl.QUERY_GET_CHILD_ASSOCS_BY_ALL)
.setLong("parentId", parentNode.getId())
.setLong("childId", childNode.getId())
.setParameter("typeQName", assocTypeQName)
.setParameter("qname", qname);
.setParameter("parent", parentNode)
.setParameter("child", childNode)
.setParameter("typeQName", typeQNameEntity)
.setParameter("qnameNamespace", qnameNamespaceEntity)
.setParameter("qnameLocalName", qnameLocalName);
return query.uniqueResult();
}
};
@@ -960,12 +1000,21 @@ public class HibernateNodeDaoServiceImpl extends HibernateDaoSupport implements
{
public Object doInHibernate(Session session)
{
QNameEntity typeQNameEntity = qnameDAO.getQNameEntity(assocTypeQName);
NamespaceEntity qnameNamespaceEntity = qnameDAO.getNamespaceEntity(qname.getNamespaceURI());
String qnameLocalName = qname.getLocalName();
if (typeQNameEntity == null || qnameNamespaceEntity == null)
{
// There can be no match;
return Collections.emptyList();
}
Query query = session
.getNamedQuery(HibernateNodeDaoServiceImpl.QUERY_GET_CHILD_ASSOCS_BY_ALL)
.setLong("parentId", parentNode.getId())
.setLong("childId", childNode.getId())
.setParameter("typeQName", assocTypeQName)
.setParameter("qname", qname);
.setParameter("parent", parentNode)
.setParameter("child", childNode)
.setParameter("typeQName", typeQNameEntity)
.setParameter("qnameNamespace", qnameNamespaceEntity)
.setParameter("qnameLocalName", qnameLocalName);
return query.list();
}
};
@@ -984,13 +1033,19 @@ public class HibernateNodeDaoServiceImpl extends HibernateDaoSupport implements
{
public Object doInHibernate(Session session)
{
QNameEntity typeQNameEntity = qnameDAO.getQNameEntity(assocTypeQName);
if (typeQNameEntity == null)
{
// There can be no match;
return null;
}
String childNameLower = childName.toLowerCase();
String childNameShort = getShortName(childNameLower);
long childNameLowerCrc = getCrc(childNameLower);
Query query = session
.getNamedQuery(HibernateNodeDaoServiceImpl.QUERY_GET_CHILD_ASSOC_BY_TYPE_AND_NAME)
.setLong("parentId", parentNode.getId())
.setParameter("typeQName", assocTypeQName)
.setParameter("parent", parentNode)
.setParameter("typeQName", typeQNameEntity)
.setParameter("childNodeName", childNameShort)
.setLong("childNodeNameCrc", childNameLowerCrc);
return query.uniqueResult();
@@ -1078,7 +1133,7 @@ public class HibernateNodeDaoServiceImpl extends HibernateDaoSupport implements
* @return Returns the parent associations without any interpretation
*/
@SuppressWarnings("unchecked")
private Collection<ChildAssoc> getParentAssocsInternal(Node childNode)
private Collection<ChildAssoc> getParentAssocsInternal(final Node childNode)
{
final Long childNodeId = childNode.getId();
List<ChildAssoc> parentAssocs = null;
@@ -1125,7 +1180,7 @@ public class HibernateNodeDaoServiceImpl extends HibernateDaoSupport implements
{
Query query = session
.getNamedQuery(HibernateNodeDaoServiceImpl.QUERY_GET_PARENT_ASSOCS)
.setLong("childId", childNodeId);
.setParameter("child", childNode);
return query.list();
}
};
@@ -1240,8 +1295,11 @@ public class HibernateNodeDaoServiceImpl extends HibernateDaoSupport implements
public NodeAssoc newNodeAssoc(Node sourceNode, Node targetNode, QName assocTypeQName)
{
// Get the assoc type QNameEntity
QNameEntity assocTypeQNameEntity = qnameDAO.getOrCreateQNameEntity(assocTypeQName);
NodeAssoc assoc = new NodeAssocImpl();
assoc.setTypeQName(assocTypeQName);
assoc.setTypeQName(assocTypeQNameEntity);
assoc.buildAssociation(sourceNode, targetNode);
// persist
try
@@ -1269,7 +1327,7 @@ public class HibernateNodeDaoServiceImpl extends HibernateDaoSupport implements
{
Query query = session
.getNamedQuery(HibernateNodeDaoServiceImpl.QUERY_GET_NODE_ASSOCS_TO_AND_FROM)
.setLong("nodeId", node.getId());
.setParameter("node", node);
return query.list();
}
};
@@ -1286,11 +1344,17 @@ public class HibernateNodeDaoServiceImpl extends HibernateDaoSupport implements
{
public Object doInHibernate(Session session)
{
QNameEntity assocTypeQNameEntity = qnameDAO.getQNameEntity(assocTypeQName);
if (assocTypeQNameEntity == null)
{
// There can be no match;
return null;
}
Query query = session
.getNamedQuery(HibernateNodeDaoServiceImpl.QUERY_GET_NODE_ASSOC)
.setLong("sourceId", sourceNode.getId())
.setLong("targetId", targetNode.getId())
.setParameter("assocTypeQName", assocTypeQName);
.setParameter("source", sourceNode)
.setParameter("target", targetNode)
.setParameter("assocTypeQName", assocTypeQNameEntity);
return query.uniqueResult();
}
};
@@ -1307,7 +1371,7 @@ public class HibernateNodeDaoServiceImpl extends HibernateDaoSupport implements
{
Query query = session
.getNamedQuery(HibernateNodeDaoServiceImpl.QUERY_GET_TARGET_ASSOCS)
.setLong("sourceId", sourceNode.getId());
.setParameter("source", sourceNode);
return query.list();
}
};
@@ -1324,7 +1388,7 @@ public class HibernateNodeDaoServiceImpl extends HibernateDaoSupport implements
{
Query query = session
.getNamedQuery(HibernateNodeDaoServiceImpl.QUERY_GET_SOURCE_ASSOCS)
.setLong("targetId", targetNode.getId());
.setParameter("target", targetNode);
return query.list();
}
};
@@ -1362,7 +1426,7 @@ public class HibernateNodeDaoServiceImpl extends HibernateDaoSupport implements
{
Node node = (Node) results.get()[0];
// loop through all the node properties
Map<QName, PropertyValue> properties = node.getProperties();
Map<Long, PropertyValue> properties = node.getProperties();
for (PropertyValue propertyValue : properties.values())
{
// ignore nulls