result, int position)
{
if (pattern == null)
{
@@ -1848,7 +1850,8 @@ public class AclDaoComponentImpl extends HibernateDaoSupport implements AclDaoCo
{
DbPermission permission = (DbPermission) result.get("permission");
final QName patternQName = pattern.getPermission().getQName();
- if ((patternQName != null) && (!patternQName.equals(permission.getTypeQName().getQName())))
+ final QName permTypeQName = qnameDAO.getQName(permission.getTypeQNameId()).getSecond(); // Has an ID so must exist
+ if ((patternQName != null) && (!patternQName.equals(permTypeQName)))
{
return false;
}
diff --git a/source/java/org/alfresco/repo/domain/hibernate/ChildAssocImpl.java b/source/java/org/alfresco/repo/domain/hibernate/ChildAssocImpl.java
index 098bfb0781..2cb47a848c 100644
--- a/source/java/org/alfresco/repo/domain/hibernate/ChildAssocImpl.java
+++ b/source/java/org/alfresco/repo/domain/hibernate/ChildAssocImpl.java
@@ -30,9 +30,8 @@ import java.util.concurrent.locks.ReentrantReadWriteLock.ReadLock;
import java.util.concurrent.locks.ReentrantReadWriteLock.WriteLock;
import org.alfresco.repo.domain.ChildAssoc;
-import org.alfresco.repo.domain.NamespaceEntity;
import org.alfresco.repo.domain.Node;
-import org.alfresco.repo.domain.QNameEntity;
+import org.alfresco.repo.domain.QNameDAO;
import org.alfresco.service.cmr.repository.ChildAssociationRef;
import org.alfresco.service.namespace.QName;
import org.alfresco.util.EqualsHelper;
@@ -48,8 +47,8 @@ public class ChildAssocImpl implements ChildAssoc, Serializable
private Long version;
private Node parent;
private Node child;
- private QNameEntity typeQName;
- private NamespaceEntity qnameNamespace;
+ private Long typeQNameId;
+ private Long qnameNamespaceId;
private String qnameLocalName;
private String childNodeName;
private long childNodeNameCrc;
@@ -59,6 +58,7 @@ public class ChildAssocImpl implements ChildAssoc, Serializable
private transient ReadLock refReadLock;
private transient WriteLock refWriteLock;
private transient ChildAssociationRef childAssocRef;
+ private transient QName typeQName;
private transient QName qname;
public ChildAssocImpl()
@@ -86,7 +86,7 @@ public class ChildAssocImpl implements ChildAssoc, Serializable
*
* This method is thread-safe and lazily creates the required references, if required.
*/
- public ChildAssociationRef getChildAssocRef()
+ public ChildAssociationRef getChildAssocRef(QNameDAO qnameDAO)
{
boolean trashReference = false;
// first check if it is available
@@ -119,10 +119,19 @@ public class ChildAssocImpl implements ChildAssoc, Serializable
// double check
if (childAssocRef == null || trashReference)
{
+ if (typeQName == null)
+ {
+ typeQName = qnameDAO.getQName(this.typeQNameId).getSecond();
+ }
+ if (qname == null )
+ {
+ String qnameNamespace = qnameDAO.getNamespace(qnameNamespaceId).getSecond();
+ qname = QName.createQName(qnameNamespace, qnameLocalName);
+ }
childAssocRef = new ChildAssociationRef(
- this.typeQName.getQName(),
+ typeQName,
parent.getNodeRef(),
- this.getQname(),
+ qname,
child.getNodeRef(),
this.isPrimary,
index);
@@ -135,12 +144,55 @@ public class ChildAssocImpl implements ChildAssoc, Serializable
}
}
+ /**
+ * {@inheritDoc}
+ */
+ public QName getTypeQName(QNameDAO qnameDAO)
+ {
+ refReadLock.lock();
+ try
+ {
+ if (typeQName != null)
+ {
+ return typeQName;
+ }
+ }
+ finally
+ {
+ refReadLock.unlock();
+ }
+ refWriteLock.lock();
+ try
+ {
+ typeQName = qnameDAO.getQName(typeQNameId).getSecond();
+ return typeQName;
+ }
+ finally
+ {
+ refWriteLock.unlock();
+ }
+ }
+
+ public void setTypeQName(QNameDAO qnameDAO, QName typeQName)
+ {
+ Long typeQNameId = qnameDAO.getOrCreateQName(typeQName).getFirst();
+ refWriteLock.lock();
+ try
+ {
+ setTypeQNameId(typeQNameId);
+ }
+ finally
+ {
+ refWriteLock.unlock();
+ }
+ }
+
/**
* {@inheritDoc}
*
* This method is thread-safe and lazily creates the required references, if required.
*/
- public QName getQname()
+ public QName getQName(QNameDAO qnameDAO)
{
// first check if it is available
refReadLock.lock();
@@ -162,7 +214,8 @@ public class ChildAssocImpl implements ChildAssoc, Serializable
// double check
if (qname == null )
{
- qname = QName.createQName(qnameNamespace.getUri(), qnameLocalName);
+ String qnameNamespace = qnameDAO.getNamespace(qnameNamespaceId).getSecond();
+ qname = QName.createQName(qnameNamespace, qnameLocalName);
}
return qname;
}
@@ -172,6 +225,24 @@ public class ChildAssocImpl implements ChildAssoc, Serializable
}
}
+ public void setQName(QNameDAO qnameDAO, QName qname)
+ {
+ String assocQNameNamespace = qname.getNamespaceURI();
+ String assocQNameLocalName = qname.getLocalName();
+ Long assocQNameNamespaceId = qnameDAO.getOrCreateNamespace(assocQNameNamespace).getFirst();
+ // get write lock
+ refWriteLock.lock();
+ try
+ {
+ setQnameNamespaceId(assocQNameNamespaceId);
+ setQnameLocalName(assocQNameLocalName);
+ }
+ finally
+ {
+ refWriteLock.unlock();
+ }
+ }
+
public boolean equals(Object obj)
{
if (obj == null)
@@ -187,10 +258,19 @@ public class ChildAssocImpl implements ChildAssoc, Serializable
return false;
}
ChildAssoc that = (ChildAssoc) obj;
- return (EqualsHelper.nullSafeEquals(this.getTypeQName(), that.getTypeQName())
- && EqualsHelper.nullSafeEquals(this.getQname(), that.getQname())
- && EqualsHelper.nullSafeEquals(this.getChild(), that.getChild())
- && EqualsHelper.nullSafeEquals(this.getParent(), that.getParent()));
+ if (EqualsHelper.nullSafeEquals(id, that.getId()))
+ {
+ return true;
+ }
+ else
+ {
+ return (EqualsHelper.nullSafeEquals(this.getParent(), that.getParent())
+ && EqualsHelper.nullSafeEquals(this.typeQNameId, that.getTypeQNameId())
+ && EqualsHelper.nullSafeEquals(this.getChild(), that.getChild())
+ && EqualsHelper.nullSafeEquals(this.qnameLocalName, that.getQnameLocalName())
+ && EqualsHelper.nullSafeEquals(this.qnameNamespaceId, that.getQnameNamespaceId())
+ );
+ }
}
public int hashCode()
@@ -207,8 +287,9 @@ public class ChildAssocImpl implements ChildAssoc, Serializable
.append(", child=").append(child.getId())
.append(", child name=").append(childNodeName)
.append(", child name crc=").append(childNodeNameCrc)
- .append(", assoc type=").append(getTypeQName().getQName())
- .append(", assoc name=").append(getQname())
+ .append(", assoc type=").append(typeQNameId)
+ .append(", assoc qname ns=").append(qnameNamespaceId)
+ .append(", assoc qname localname=").append(qnameLocalName)
.append(", isPrimary=").append(isPrimary)
.append("]");
return sb.toString();
@@ -321,18 +402,19 @@ public class ChildAssocImpl implements ChildAssoc, Serializable
}
}
- public QNameEntity getTypeQName()
+ public Long getTypeQNameId()
{
- return typeQName;
+ return typeQNameId;
}
- public void setTypeQName(QNameEntity typeQName)
+ public void setTypeQNameId(Long typeQNameId)
{
refWriteLock.lock();
try
{
- this.typeQName = typeQName;
+ this.typeQNameId = typeQNameId;
this.childAssocRef = null;
+ this.typeQName = null;
}
finally
{
@@ -340,17 +422,17 @@ public class ChildAssocImpl implements ChildAssoc, Serializable
}
}
- public NamespaceEntity getQnameNamespace()
+ public Long getQnameNamespaceId()
{
- return qnameNamespace;
+ return qnameNamespaceId;
}
- public void setQnameNamespace(NamespaceEntity qnameNamespace)
+ public void setQnameNamespaceId(Long qnameNamespaceId)
{
refWriteLock.lock();
try
{
- this.qnameNamespace = qnameNamespace;
+ this.qnameNamespaceId = qnameNamespaceId;
this.childAssocRef = null;
this.qname = null;
}
diff --git a/source/java/org/alfresco/repo/domain/hibernate/DbPermissionImpl.java b/source/java/org/alfresco/repo/domain/hibernate/DbPermissionImpl.java
index d5bd81f381..05c804706f 100644
--- a/source/java/org/alfresco/repo/domain/hibernate/DbPermissionImpl.java
+++ b/source/java/org/alfresco/repo/domain/hibernate/DbPermissionImpl.java
@@ -25,10 +25,13 @@
package org.alfresco.repo.domain.hibernate;
import java.io.Serializable;
+import java.util.concurrent.locks.ReentrantReadWriteLock;
+import java.util.concurrent.locks.ReentrantReadWriteLock.ReadLock;
+import java.util.concurrent.locks.ReentrantReadWriteLock.WriteLock;
import org.alfresco.repo.domain.DbPermission;
import org.alfresco.repo.domain.DbPermissionKey;
-import org.alfresco.repo.domain.QNameEntity;
+import org.alfresco.repo.domain.QNameDAO;
import org.alfresco.service.namespace.QName;
import org.alfresco.util.EqualsHelper;
import org.hibernate.Session;
@@ -44,12 +47,19 @@ public class DbPermissionImpl implements DbPermission, Serializable
private Long id;
private Long version;
- private QNameEntity typeQName;
+ private Long typeQNameId;
private String name;
+ private transient ReadLock refReadLock;
+ private transient WriteLock refWriteLock;
+ private transient QName typeQName;
+
public DbPermissionImpl()
{
super();
+ ReentrantReadWriteLock lock = new ReentrantReadWriteLock();
+ refReadLock = lock.readLock();
+ refWriteLock = lock.writeLock();
}
@Override
@@ -59,7 +69,7 @@ public class DbPermissionImpl implements DbPermission, Serializable
sb.append("DbPermissionImpl")
.append("[ id=").append(id)
.append(", version=").append(version)
- .append(", typeQName=").append(typeQName.getQName())
+ .append(", typeQName=").append(typeQNameId)
.append(", name=").append(getName())
.append("]");
return sb.toString();
@@ -77,13 +87,41 @@ public class DbPermissionImpl implements DbPermission, Serializable
return false;
}
DbPermission other = (DbPermission) o;
- return (EqualsHelper.nullSafeEquals(typeQName, other.getTypeQName())) && (EqualsHelper.nullSafeEquals(name, other.getName()));
+ return (EqualsHelper.nullSafeEquals(typeQNameId, other.getTypeQNameId()))
+ && (EqualsHelper.nullSafeEquals(name, other.getName())
+ );
}
@Override
public int hashCode()
{
- return typeQName.hashCode() + (37 * name.hashCode());
+ return typeQNameId.hashCode() + (37 * name.hashCode());
+ }
+
+ public QName getTypeQName(QNameDAO qnameDAO)
+ {
+ refReadLock.lock();
+ try
+ {
+ if (typeQName != null)
+ {
+ return typeQName;
+ }
+ }
+ finally
+ {
+ refReadLock.unlock();
+ }
+ refWriteLock.lock();
+ try
+ {
+ typeQName = qnameDAO.getQName(typeQNameId).getSecond();
+ return typeQName;
+ }
+ finally
+ {
+ refWriteLock.unlock();
+ }
}
public Long getId()
@@ -114,14 +152,23 @@ public class DbPermissionImpl implements DbPermission, Serializable
this.version = version;
}
- public QNameEntity getTypeQName()
+ public Long getTypeQNameId()
{
- return typeQName;
+ return typeQNameId;
}
- public void setTypeQName(QNameEntity typeQName)
+ public void setTypeQNameId(Long typeQNameId)
{
- this.typeQName = typeQName;
+ refWriteLock.lock();
+ try
+ {
+ this.typeQNameId = typeQNameId;
+ this.typeQName = null;
+ }
+ finally
+ {
+ refWriteLock.unlock();
+ }
}
public String getName()
@@ -136,7 +183,7 @@ public class DbPermissionImpl implements DbPermission, Serializable
public DbPermissionKey getKey()
{
- return new DbPermissionKey(typeQName.getQName(), name);
+ return new DbPermissionKey(typeQNameId, name);
}
/**
diff --git a/source/java/org/alfresco/repo/domain/hibernate/HibernateQNameDAOImpl.java b/source/java/org/alfresco/repo/domain/hibernate/HibernateQNameDAOImpl.java
index 617cd36b3f..026413c9fd 100644
--- a/source/java/org/alfresco/repo/domain/hibernate/HibernateQNameDAOImpl.java
+++ b/source/java/org/alfresco/repo/domain/hibernate/HibernateQNameDAOImpl.java
@@ -24,6 +24,7 @@
*/
package org.alfresco.repo.domain.hibernate;
+import java.io.Serializable;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Map;
@@ -56,26 +57,68 @@ public class HibernateQNameDAOImpl extends HibernateDaoSupport implements QNameD
private static final String QUERY_GET_NS_BY_URI = "qname.GetNamespaceByUri";
private static final String QUERY_GET_QNAME_BY_URI_AND_LOCALNAME = "qname.GetQNameByUriAndLocalName";
- private SimpleCache qnameEntityCache;
-
- public void setQnameEntityCache(SimpleCache qnameEntityCache)
+ private static final Long CACHE_NULL_LONG = Long.MIN_VALUE;
+ private SimpleCache namespaceEntityCache;
+ private SimpleCache qnameEntityCache;
+
+ /**
+ * Set the cache that maintains the ID-Namespace mappings and vice-versa.
+ *
+ * @param namespaceEntityCache the cache
+ */
+ public void setNamespaceEntityCache(SimpleCache namespaceEntityCache)
+ {
+ this.namespaceEntityCache = namespaceEntityCache;
+ }
+
+ /**
+ * Set the cache that maintains the ID-QName mappings and vice-versa.
+ *
+ * @param qnameEntityCache the cache
+ */
+ public void setQnameEntityCache(SimpleCache qnameEntityCache)
{
this.qnameEntityCache = qnameEntityCache;
}
- public NamespaceEntity getNamespaceEntity(Long id)
+ public Pair getNamespace(Long id)
{
+ // Check the cache
+ String uri = (String) namespaceEntityCache.get(id);
+ if (uri != null)
+ {
+ return new Pair(id, uri);
+ }
+ // Get it from the DB
NamespaceEntity namespaceEntity = (NamespaceEntity) getSession().get(NamespaceEntityImpl.class, id);
if (namespaceEntity == null)
{
throw new AlfrescoRuntimeException("The NamespaceEntity ID " + id + " doesn't exist.");
}
- return namespaceEntity;
+ uri = namespaceEntity.getUri();
+ // Cache it
+ namespaceEntityCache.put(uri, id);
+ namespaceEntityCache.put(id, uri);
+ // Done
+ return new Pair(id, uri);
}
- public NamespaceEntity getNamespaceEntity(final String namespaceUri)
+ public Pair getNamespace(final String namespaceUri)
{
- // TODO: Use a cache if external use becomes common
+ // Check the cache
+ Long id = (Long) namespaceEntityCache.get(namespaceUri);
+ if (id != null)
+ {
+ if (id.equals(CACHE_NULL_LONG))
+ {
+ return null;
+ }
+ else
+ {
+ return new Pair(id, namespaceUri);
+ }
+ }
+ // Get it from the DB
HibernateCallback callback = new HibernateCallback()
{
public Object doInHibernate(Session session)
@@ -89,21 +132,35 @@ public class HibernateQNameDAOImpl extends HibernateDaoSupport implements QNameD
}
};
NamespaceEntity result = (NamespaceEntity) getHibernateTemplate().execute(callback);
- // Done
- return result;
- }
-
- public NamespaceEntity getOrCreateNamespaceEntity(String namespaceUri)
- {
- NamespaceEntity result = getNamespaceEntity(namespaceUri);
if (result == null)
{
- result = newNamespaceEntity(namespaceUri);
+ // Cache it
+ namespaceEntityCache.put(namespaceUri, CACHE_NULL_LONG);
+ // Done
+ return null;
+ }
+ else
+ {
+ id = result.getId();
+ // Cache it
+ namespaceEntityCache.put(id, namespaceUri);
+ namespaceEntityCache.put(namespaceUri, id);
+ // Done
+ return new Pair(id, namespaceUri);
+ }
+ }
+
+ public Pair getOrCreateNamespace(String namespaceUri)
+ {
+ Pair result = getNamespace(namespaceUri);
+ if (result == null)
+ {
+ result = newNamespace(namespaceUri);
}
return result;
}
- public NamespaceEntity newNamespaceEntity(String namespaceUri)
+ public Pair newNamespace(String namespaceUri)
{
if (logger.isDebugEnabled())
{
@@ -112,25 +169,29 @@ public class HibernateQNameDAOImpl extends HibernateDaoSupport implements QNameD
NamespaceEntity namespace = new NamespaceEntityImpl();
namespace.setUri(namespaceUri);
// Persist
- getSession().save(namespace);
+ Long id = (Long) getSession().save(namespace);
+ // Cache it
+ namespaceEntityCache.put(id, namespaceUri);
+ namespaceEntityCache.put(namespaceUri, id);
// Done
- return namespace;
+ return new Pair(id, namespaceUri);
}
- public void updateNamespaceEntity(String oldNamespaceUri, String newNamespaceUri)
+ public void updateNamespace(String oldNamespaceUri, String newNamespaceUri)
{
// First check for clashes
- if (getNamespaceEntity(newNamespaceUri) != null)
+ if (getNamespace(newNamespaceUri) != null)
{
throw new AlfrescoRuntimeException("Namespace URI '" + newNamespaceUri + "' already exists.");
}
// Get the old one
- NamespaceEntity oldNamespaceEntity = getNamespaceEntity(oldNamespaceUri);
- if (oldNamespaceEntity == null)
+ Pair oldNamespacePair = getNamespace(oldNamespaceUri);
+ if (oldNamespacePair == null)
{
// Nothing to rename
return;
}
+ NamespaceEntity oldNamespaceEntity = (NamespaceEntity) getSession().load(NamespaceEntityImpl.class, oldNamespacePair.getFirst());
oldNamespaceEntity.setUri(newNamespaceUri);
// Flush to force early failure
getSession().flush();
@@ -139,111 +200,88 @@ public class HibernateQNameDAOImpl extends HibernateDaoSupport implements QNameD
// Done
}
- public QNameEntity getQNameEntity(Long id)
+ public Pair getQName(Long id)
{
+ // Check the cache
+ QName qname = (QName) qnameEntityCache.get(id);
+ if (qname != null)
+ {
+ return new Pair(id, qname);
+ }
QNameEntity qnameEntity = (QNameEntity) getSession().get(QNameEntityImpl.class, id);
if (qnameEntity == null)
{
throw new AlfrescoRuntimeException("The QNameEntity ID " + id + " doesn't exist.");
}
- return qnameEntity;
+ qname = qnameEntity.getQName();
+ // Cache it
+ qnameEntityCache.put(id, qname);
+ qnameEntityCache.put(qname, id);
+ // Done
+ return new Pair(id, qname);
}
- public QName getQName(Long id)
+ public Pair getQName(final QName qname)
{
- // TODO: Explore caching options here
- QNameEntity qnameEntity = getQNameEntity(id);
- if (qnameEntity == null)
+ // Check the cache
+ Long id = (Long) qnameEntityCache.get(qname);
+ if (id != null)
{
- return null;
- }
- else
- {
- return qnameEntity.getQName();
- }
- }
-
- public QNameEntity getQNameEntity(final QName qname)
- {
- QNameEntity result;
- // First check the cache
- Long id = qnameEntityCache.get(qname);
- if (id == null)
- {
- // It's not in the cache, so query
- HibernateCallback callback = new HibernateCallback()
+ if (id.equals(CACHE_NULL_LONG))
{
- public Object doInHibernate(Session session)
- {
- String namespaceUri = qname.getNamespaceURI();
- String oracleSafeUri = (namespaceUri.length() == 0) ? NamespaceEntityImpl.EMPTY_URI_SUBSTITUTE : namespaceUri;
-
- Query query = session
- .getNamedQuery(HibernateQNameDAOImpl.QUERY_GET_QNAME_BY_URI_AND_LOCALNAME)
- .setString("namespaceUri", oracleSafeUri)
- .setString("localName", qname.getLocalName());
- return query.uniqueResult();
- }
- };
- result = (QNameEntity) getHibernateTemplate().execute(callback);
- if (result != null)
- {
- id = result.getId();
- // We found something, so we can add it to the cache
- qnameEntityCache.put(qname, id);
+ return null;
}
else
{
- qnameEntityCache.put(qname, -1L);
+ return new Pair(id, qname);
}
}
- else if (id == -1L)
+ QNameEntity result;
+ // It's not in the cache, so query
+ HibernateCallback callback = new HibernateCallback()
{
+ public Object doInHibernate(Session session)
+ {
+ String namespaceUri = qname.getNamespaceURI();
+ String oracleSafeUri = (namespaceUri.length() == 0) ? NamespaceEntityImpl.EMPTY_URI_SUBSTITUTE : namespaceUri;
+
+ Query query = session
+ .getNamedQuery(HibernateQNameDAOImpl.QUERY_GET_QNAME_BY_URI_AND_LOCALNAME)
+ .setString("namespaceUri", oracleSafeUri)
+ .setString("localName", qname.getLocalName());
+ return query.uniqueResult();
+ }
+ };
+ result = (QNameEntity) getHibernateTemplate().execute(callback);
+ if (result == null)
+ {
+ // Cache it
+ qnameEntityCache.put(qname, CACHE_NULL_LONG);
+ // Done
return null;
}
else
{
- // Found in the cache. Load using the ID.
- // Don't use the method that throws an exception as the cache might be invalid.
- result = (QNameEntity) getSession().get(QNameEntityImpl.class, id);
- if (result == null)
- {
- // It is not available, so we need to go the query route.
- // But first remove the cache entry
- qnameEntityCache.remove(qname);
- // Recurse, but this time there is no cache entry
- return getQNameEntity(qname);
- }
+ id = result.getId();
+ // Cache it
+ qnameEntityCache.put(id, qname);
+ qnameEntityCache.put(qname, id);
+ // Done
+ return new Pair(id, qname);
}
- // Done
- return result;
}
- public QNameEntity getOrCreateQNameEntity(QName qname)
+ public Pair getOrCreateQName(QName qname)
{
- QNameEntity result = getQNameEntity(qname);
+ Pair result = getQName(qname);
if (result == null)
{
- result = newQNameEntity(qname);
+ result = newQName(qname);
}
return result;
}
- public Pair getOrCreateQNamePair(QName qname)
- {
- Long id = qnameEntityCache.get(qname);
- if (id == null)
- {
- // It is not cached
- QNameEntity qnameEntity = getOrCreateQNameEntity(qname);
- id = qnameEntity.getId();
- }
- Pair qnamePair = new Pair(id, qname);
- // Done
- return qnamePair;
- }
-
- public QNameEntity newQNameEntity(QName qname)
+ public Pair newQName(QName qname)
{
if (logger.isDebugEnabled())
{
@@ -251,11 +289,10 @@ public class HibernateQNameDAOImpl extends HibernateDaoSupport implements QNameD
}
final String namespaceUri = qname.getNamespaceURI();
final String localName = qname.getLocalName();
- NamespaceEntity namespace = getNamespaceEntity(namespaceUri);
- if (namespace == null)
- {
- namespace = newNamespaceEntity(namespaceUri);
- }
+ // Get the namespace
+ Pair namespacePair = getOrCreateNamespace(namespaceUri);
+ NamespaceEntity namespace = (NamespaceEntity) getSession().load(NamespaceEntityImpl.class, namespacePair.getFirst());
+ // Create the QNameEntity
QNameEntity qnameEntity = new QNameEntityImpl();
qnameEntity.setNamespace(namespace);
qnameEntity.setLocalName(localName);
@@ -263,8 +300,9 @@ public class HibernateQNameDAOImpl extends HibernateDaoSupport implements QNameD
Long id = (Long) getSession().save(qnameEntity);
// Update the cache
qnameEntityCache.put(qname, id);
+ qnameEntityCache.put(id, qname);
// Done
- return qnameEntity;
+ return new Pair(id, qname);
}
public Set convertIdsToQNames(Set ids)
@@ -272,7 +310,7 @@ public class HibernateQNameDAOImpl extends HibernateDaoSupport implements QNameD
Set qnames = new HashSet(ids.size() * 2 + 1);
for (Long id : ids)
{
- QName qname = getQName(id); // Never null
+ QName qname = getQName(id).getSecond(); // getQName(id) is never null
qnames.add(qname);
}
return qnames;
@@ -283,7 +321,7 @@ public class HibernateQNameDAOImpl extends HibernateDaoSupport implements QNameD
Map qnameMap = new HashMap(idMap.size() + 3);
for (Map.Entry entry : idMap.entrySet())
{
- QName qname = getQName(entry.getKey());
+ QName qname = getQName(entry.getKey()).getSecond(); // getQName(id) is never null
qnameMap.put(qname, entry.getValue());
}
return qnameMap;
@@ -303,19 +341,19 @@ public class HibernateQNameDAOImpl extends HibernateDaoSupport implements QNameD
Long qnameEntityId = null;
if (create)
{
- qnameEntityId = getOrCreateQNameEntity(qname).getId();
+ qnameEntityId = getOrCreateQName(qname).getFirst(); // getOrCreateQName(qname) is never null
}
else
{
- QNameEntity qnameEntity = getQNameEntity(qname);
- if (qnameEntity == null)
+ Pair qnamePair = getQName(qname);
+ if (qnamePair == null)
{
// No such qname and we are not creating one
continue;
}
else
{
- qnameEntityId = qnameEntity.getId();
+ qnameEntityId = qnamePair.getFirst();
}
}
if (qnameEntityId != null)
diff --git a/source/java/org/alfresco/repo/domain/hibernate/HibernateSessionHelperTest.java b/source/java/org/alfresco/repo/domain/hibernate/HibernateSessionHelperTest.java
index 8979ed51b4..99cd47df51 100644
--- a/source/java/org/alfresco/repo/domain/hibernate/HibernateSessionHelperTest.java
+++ b/source/java/org/alfresco/repo/domain/hibernate/HibernateSessionHelperTest.java
@@ -7,7 +7,6 @@ import java.util.Set;
import org.alfresco.model.ContentModel;
import org.alfresco.repo.domain.Node;
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.transaction.AlfrescoTransactionSupport;
@@ -93,7 +92,7 @@ public class HibernateSessionHelperTest extends BaseSpringTest
assertFalse(SessionSizeResourceManager.isDisableInTransaction());
QNameDAO qnameDAO = (QNameDAO) getApplicationContext().getBean("qnameDAO");
- QNameEntity baseQNameEntity = qnameDAO.getOrCreateQNameEntity(ContentModel.TYPE_BASE);
+ Long baseQNameId = qnameDAO.getOrCreateQName(ContentModel.TYPE_BASE).getFirst();
StoreImpl store = new StoreImpl();
store.setProtocol(StoreRef.PROTOCOL_WORKSPACE);
@@ -124,35 +123,35 @@ public class HibernateSessionHelperTest extends BaseSpringTest
assertTrue(SessionSizeResourceManager.isDisableInTransaction());
assertEquals(1, helper.getMarks().size());
- Node n1 = createNode(transaction, store, "1", baseQNameEntity);
+ Node n1 = createNode(transaction, store, "1", baseQNameId);
assertEquals(5, getSession().getStatistics().getEntityCount());
helper.mark();
assertTrue(SessionSizeResourceManager.isDisableInTransaction());
assertEquals(2, helper.getMarks().size());
- Node n2 = createNode(transaction, store, "2", baseQNameEntity);
+ Node n2 = createNode(transaction, store, "2", baseQNameId);
assertEquals(6, getSession().getStatistics().getEntityCount());
helper.mark();
assertTrue(SessionSizeResourceManager.isDisableInTransaction());
assertEquals(3, helper.getMarks().size());
- Node n3 = createNode(transaction, store, "3", baseQNameEntity);
+ Node n3 = createNode(transaction, store, "3", baseQNameId);
assertEquals(7, getSession().getStatistics().getEntityCount());
helper.mark();
assertTrue(SessionSizeResourceManager.isDisableInTransaction());
assertEquals(4, helper.getMarks().size());
- Node n4 = createNode(transaction, store, "4", baseQNameEntity);
+ Node n4 = createNode(transaction, store, "4", baseQNameId);
assertEquals(8, getSession().getStatistics().getEntityCount());
helper.mark();
assertTrue(SessionSizeResourceManager.isDisableInTransaction());
assertEquals(5, helper.getMarks().size());
- Node n5 = createNode(transaction, store, "5", baseQNameEntity);
+ Node n5 = createNode(transaction, store, "5", baseQNameId);
assertEquals(9, getSession().getStatistics().getEntityCount());
@@ -321,7 +320,7 @@ public class HibernateSessionHelperTest extends BaseSpringTest
assertFalse(SessionSizeResourceManager.isDisableInTransaction());
QNameDAO qnameDAO = (QNameDAO) getApplicationContext().getBean("qnameDAO");
- QNameEntity baseQNameEntity = qnameDAO.getOrCreateQNameEntity(ContentModel.TYPE_BASE);
+ Long baseQNameId = qnameDAO.getOrCreateQName(ContentModel.TYPE_BASE).getFirst();
StoreImpl store = new StoreImpl();
store.setProtocol(StoreRef.PROTOCOL_WORKSPACE);
@@ -354,7 +353,7 @@ public class HibernateSessionHelperTest extends BaseSpringTest
assertTrue(SessionSizeResourceManager.isDisableInTransaction());
assertEquals(1, helper.getMarks().size());
- Node n1 = createNode(transaction, store, "1", baseQNameEntity);
+ Node n1 = createNode(transaction, store, "1", baseQNameId);
assertEquals(5, getSession().getStatistics().getEntityCount());
helper.mark("Two");
@@ -362,7 +361,7 @@ public class HibernateSessionHelperTest extends BaseSpringTest
assertTrue(SessionSizeResourceManager.isDisableInTransaction());
assertEquals(2, helper.getMarks().size());
- Node n2 = createNode(transaction, store, "2", baseQNameEntity);
+ Node n2 = createNode(transaction, store, "2", baseQNameId);
assertEquals(6, getSession().getStatistics().getEntityCount());
helper.mark("Three");
@@ -370,7 +369,7 @@ public class HibernateSessionHelperTest extends BaseSpringTest
assertTrue(SessionSizeResourceManager.isDisableInTransaction());
assertEquals(3, helper.getMarks().size());
- Node n3 = createNode(transaction, store, "3", baseQNameEntity);
+ Node n3 = createNode(transaction, store, "3", baseQNameId);
assertEquals(7, getSession().getStatistics().getEntityCount());
helper.mark("Four");
@@ -378,7 +377,7 @@ public class HibernateSessionHelperTest extends BaseSpringTest
assertTrue(SessionSizeResourceManager.isDisableInTransaction());
assertEquals(4, helper.getMarks().size());
- Node n4 = createNode(transaction, store, "4", baseQNameEntity);
+ Node n4 = createNode(transaction, store, "4", baseQNameId);
assertEquals(8, getSession().getStatistics().getEntityCount());
helper.mark("Five");
@@ -386,7 +385,7 @@ public class HibernateSessionHelperTest extends BaseSpringTest
assertTrue(SessionSizeResourceManager.isDisableInTransaction());
assertEquals(5, helper.getMarks().size());
- Node n5 = createNode(transaction, store, "5", baseQNameEntity);
+ Node n5 = createNode(transaction, store, "5", baseQNameId);
assertEquals(9, getSession().getStatistics().getEntityCount());
@@ -541,13 +540,13 @@ public class HibernateSessionHelperTest extends BaseSpringTest
assertNull(helper.getCurrentMark());
}
- private Node createNode(TransactionImpl transaction, Store store, String uuid, QNameEntity typeQNameEntity)
+ private Node createNode(TransactionImpl transaction, Store store, String uuid, Long typeQNameId)
{
// Create the Node
Node node = new NodeImpl();
node.setStore(store);
node.setUuid(uuid);
- node.setTypeQName(typeQNameEntity);
+ node.setTypeQNameId(typeQNameId);
node.setTransaction(transaction);
node.setDeleted(false);
node.getAuditableProperties().setAuditValues("system", new Date(), false);
diff --git a/source/java/org/alfresco/repo/domain/hibernate/Node.hbm.xml b/source/java/org/alfresco/repo/domain/hibernate/Node.hbm.xml
index 363649c94e..f440230d19 100644
--- a/source/java/org/alfresco/repo/domain/hibernate/Node.hbm.xml
+++ b/source/java/org/alfresco/repo/domain/hibernate/Node.hbm.xml
@@ -80,17 +80,8 @@
cascade="none" />
-
-
+
+
-
+
@@ -178,17 +169,7 @@
not-null="true" >
-
-
+
@@ -205,17 +186,7 @@
not-null="true" >
-
-
+
@@ -252,17 +223,7 @@
not-null="true" >
-
-
+
@@ -308,11 +269,15 @@
select
- assoc
+ assoc,
+ parent,
+ child
from
org.alfresco.repo.domain.hibernate.ChildAssocImpl as assoc
+ join assoc.parent as parent
+ join assoc.child as child
where
- assoc.child.id = :childId
+ child.id = :childId
order by
assoc.index,
assoc.id
@@ -363,8 +328,8 @@
where
assoc.parent.id = :parentId and
assoc.child.id = :childId and
- assoc.typeQName = :typeQName and
- assoc.qnameNamespace = :qnameNamespace and
+ assoc.typeQNameId = :typeQNameId and
+ assoc.qnameNamespaceId = :qnameNamespaceId and
assoc.qnameLocalName = :qnameLocalName
order by
assoc.index,
@@ -390,7 +355,7 @@
org.alfresco.repo.domain.hibernate.ChildAssocImpl as assoc
where
assoc.parent.id = :parentId and
- assoc.typeQName = :typeQName and
+ assoc.typeQNameId = :typeQNameId and
assoc.childNodeName = :childNodeName and
assoc.childNodeNameCrc = :childNodeNameCrc
order by
@@ -401,8 +366,8 @@
select
assoc.id,
- assoc.typeQName,
- assoc.qnameNamespace,
+ assoc.typeQNameId,
+ assoc.qnameNamespaceId,
assoc.qnameLocalName,
assoc.isPrimary,
assoc.index,
@@ -425,8 +390,8 @@
select
assoc.id,
- assoc.typeQName,
- assoc.qnameNamespace,
+ assoc.typeQNameId,
+ assoc.qnameNamespaceId,
assoc.qnameLocalName,
assoc.isPrimary,
assoc.index,
@@ -441,7 +406,7 @@
join child.store as store
where
parent.id = :parentId and
- assoc.qnameNamespace = :qnameNamespace and
+ assoc.qnameNamespaceId = :qnameNamespaceId and
assoc.qnameLocalName = :qnameLocalName
order by
assoc.index,
@@ -451,8 +416,8 @@
select
assoc.id,
- assoc.typeQName,
- assoc.qnameNamespace,
+ assoc.typeQNameId,
+ assoc.qnameNamespaceId,
assoc.qnameLocalName,
assoc.isPrimary,
assoc.index,
@@ -467,7 +432,7 @@
join child.store as store
where
parent.id = :parentId and
- assoc.typeQName.id in (:childAssocTypeQNameIds)
+ assoc.typeQNameId in (:childAssocTypeQNameIds)
order by
assoc.index,
assoc.id
@@ -476,8 +441,8 @@
select
assoc.id,
- assoc.typeQName,
- assoc.qnameNamespace,
+ assoc.typeQNameId,
+ assoc.qnameNamespaceId,
assoc.qnameLocalName,
assoc.isPrimary,
assoc.index,
@@ -492,8 +457,8 @@
join child.store as store
where
parent.id = :parentId and
- assoc.typeQName = :typeQName and
- assoc.qnameNamespace = :qnameNamespace and
+ assoc.typeQNameId = :typeQNameId and
+ assoc.qnameNamespaceId = :qnameNamespaceId and
assoc.qnameLocalName = :qnameLocalName
order by
assoc.index,
@@ -503,8 +468,8 @@
select
assoc.id,
- assoc.typeQName,
- assoc.qnameNamespace,
+ assoc.typeQNameId,
+ assoc.qnameNamespaceId,
assoc.qnameLocalName,
assoc.isPrimary,
assoc.index,
@@ -519,7 +484,7 @@
join child.store as store
where
parent.id = :parentId and
- child.typeQName in (:childTypeQNameEntities)
+ child.typeQNameId in (:childTypeQNameIds)
order by
assoc.index,
assoc.id
@@ -528,8 +493,8 @@
select
assoc.id,
- assoc.typeQName,
- assoc.qnameNamespace,
+ assoc.typeQNameId,
+ assoc.qnameNamespaceId,
assoc.qnameLocalName,
assoc.isPrimary,
assoc.index,
@@ -553,8 +518,8 @@
select
assoc.id,
- assoc.typeQName,
- assoc.qnameNamespace,
+ assoc.typeQNameId,
+ assoc.qnameNamespaceId,
assoc.qnameLocalName,
assoc.isPrimary,
assoc.index,
@@ -606,7 +571,7 @@
join node.aspects as aspects
where
node.id > :minNodeId and
- aspects.id = :aspectQName
+ aspects.id = :aspectQNameId
order by
node.id
@@ -619,7 +584,7 @@
where
assoc.source.id = :sourceId and
assoc.target.id = :targetId and
- assoc.typeQName = :assocTypeQName
+ assoc.typeQNameId = :assocTypeQNameId
@@ -669,19 +634,60 @@
p.string_value = :propStringValue
-
- select
- node.id,
- node.store.protocol,
- node.store.identifier,
- node.uuid
- from
- org.alfresco.repo.domain.hibernate.NodeImpl as node
- where
- node.store.protocol = :storeProtocol and
- node.store.identifier = :storeIdentifier and
- node.auditableProperties.auditCreator = :userName
-
+
+
+
+
+ SELECT
+ p1.string_value AS owner,
+ n.audit_creator AS creator,
+ p2.string_value AS contenturl
+ FROM
+ alf_node n
+ JOIN alf_store s ON (s.id = n.store_id AND n.type_qname_id = :contentTypeQNameID)
+ LEFT JOIN alf_node_properties p1 ON (p1.node_id = n.id AND p1.qname_id = :ownerPropQNameID)
+ JOIN alf_node_properties p2 ON (p2.node_id = n.id AND p2.qname_id = :contentPropQNameID)
+ WHERE
+ s.protocol = :storeProtocol AND
+ s.identifier = :storeIdentifier AND
+ (p1.string_value != 'System' OR (p1.string_value IS NULL AND n.audit_creator != 'System'))
+
+
+
+
+
+ SELECT
+ p1.string_value AS username,
+ n.uuid AS uuid
+ FROM
+ alf_node n
+ JOIN alf_store s ON (s.id = n.store_id AND n.type_qname_id = :personTypeQNameID)
+ JOIN alf_node_properties p1 ON (p1.node_id = n.id AND p1.qname_id = :usernamePropQNameID)
+ LEFT JOIN alf_node_properties p2 ON (p2.node_id = n.id AND p2.qname_id = :sizeCurrentPropQNameID)
+ WHERE
+ s.protocol = :storeProtocol AND
+ s.identifier = :storeIdentifier AND
+ (p2.persisted_type_n IS NULL OR p2.persisted_type_n = 0) AND
+ p1.string_value != 'System'
+
+
+
+
+
+ SELECT
+ p1.string_value AS username,
+ n.uuid AS uuid
+ FROM
+ alf_node n
+ JOIN alf_store s ON (s.id = n.store_id AND n.type_qname_id = :personTypeQNameID)
+ JOIN alf_node_properties p1 ON (p1.node_id = n.id AND p1.qname_id = :usernamePropQNameID)
+ LEFT JOIN alf_node_properties p2 ON (p2.node_id = n.id AND p2.qname_id = :sizeCurrentPropQNameID)
+ WHERE
+ s.protocol = :storeProtocol AND
+ s.identifier = :storeIdentifier AND
+ (p2.persisted_type_n != 0 AND p2.persisted_type_n IS NOT NULL) AND
+ p1.string_value != 'System'
+
select
@@ -708,20 +714,4 @@
props.serializableValue is not null
-
- :lastAssocId and
- assoc.typeQName = :assocTypeQName
- order by
- assoc.id
- ]]>
-
-
diff --git a/source/java/org/alfresco/repo/domain/hibernate/NodeAssocImpl.java b/source/java/org/alfresco/repo/domain/hibernate/NodeAssocImpl.java
index c21a7ecad2..e08835ee26 100644
--- a/source/java/org/alfresco/repo/domain/hibernate/NodeAssocImpl.java
+++ b/source/java/org/alfresco/repo/domain/hibernate/NodeAssocImpl.java
@@ -31,8 +31,9 @@ import java.util.concurrent.locks.ReentrantReadWriteLock.WriteLock;
import org.alfresco.repo.domain.Node;
import org.alfresco.repo.domain.NodeAssoc;
-import org.alfresco.repo.domain.QNameEntity;
+import org.alfresco.repo.domain.QNameDAO;
import org.alfresco.service.cmr.repository.AssociationRef;
+import org.alfresco.service.namespace.QName;
import org.alfresco.util.EqualsHelper;
/**
@@ -48,11 +49,12 @@ public class NodeAssocImpl implements NodeAssoc, Serializable
private Long version;
private Node source;
private Node target;
- private QNameEntity typeQName;
+ private Long typeQNameId;
private transient ReadLock refReadLock;
private transient WriteLock refWriteLock;
private transient AssociationRef nodeAssocRef;
+ private transient QName typeQName;
public NodeAssocImpl()
{
@@ -68,7 +70,7 @@ public class NodeAssocImpl implements NodeAssoc, Serializable
this.setSource(sourceNode);
}
- public AssociationRef getNodeAssocRef()
+ public AssociationRef getNodeAssocRef(QNameDAO qnameDAO)
{
boolean trashReference = false;
// first check if it is available
@@ -98,12 +100,16 @@ public class NodeAssocImpl implements NodeAssoc, Serializable
refWriteLock.lock();
try
{
+ if (typeQName == null)
+ {
+ typeQName = qnameDAO.getQName(typeQNameId).getSecond();
+ }
// double check
if (nodeAssocRef == null || trashReference)
{
nodeAssocRef = new AssociationRef(
getSource().getNodeRef(),
- this.typeQName.getQName(),
+ this.typeQName,
getTarget().getNodeRef());
}
return nodeAssocRef;
@@ -114,13 +120,54 @@ public class NodeAssocImpl implements NodeAssoc, Serializable
}
}
+ public QName getTypeQName(QNameDAO qnameDAO)
+ {
+ refReadLock.lock();
+ try
+ {
+ if (typeQName != null)
+ {
+ return typeQName;
+ }
+ }
+ finally
+ {
+ refReadLock.unlock();
+ }
+ // get write lock
+ refWriteLock.lock();
+ try
+ {
+ typeQName = qnameDAO.getQName(typeQNameId).getSecond();
+ return typeQName;
+ }
+ finally
+ {
+ refWriteLock.unlock();
+ }
+ }
+
+ public void setTypeQName(QNameDAO qnameDAO, QName typeQName)
+ {
+ Long typeQNameId = qnameDAO.getOrCreateQName(typeQName).getFirst();
+ refWriteLock.lock();
+ try
+ {
+ setTypeQNameId(typeQNameId);
+ }
+ finally
+ {
+ refWriteLock.unlock();
+ }
+ }
+
public String toString()
{
StringBuffer sb = new StringBuffer(32);
sb.append("NodeAssoc")
.append("[ source=").append(source)
.append(", target=").append(target)
- .append(", name=").append(getTypeQName())
+ .append(", type=").append(typeQNameId)
.append("]");
return sb.toString();
}
@@ -140,14 +187,22 @@ public class NodeAssocImpl implements NodeAssoc, Serializable
return false;
}
NodeAssoc that = (NodeAssoc) obj;
- return (EqualsHelper.nullSafeEquals(this.getTypeQName(), that.getTypeQName())
- && EqualsHelper.nullSafeEquals(this.getTarget(), that.getTarget())
- && EqualsHelper.nullSafeEquals(this.getSource(), that.getSource()));
+ if (EqualsHelper.nullSafeEquals(this.typeQNameId, that.getId()))
+ {
+ return true;
+ }
+ else
+ {
+ return (EqualsHelper.nullSafeEquals(this.typeQNameId, that.getTypeQNameId())
+ && EqualsHelper.nullSafeEquals(this.getTarget(), that.getTarget())
+ && EqualsHelper.nullSafeEquals(this.getSource(), that.getSource())
+ );
+ }
}
public int hashCode()
{
- return (typeQName == null ? 0 : typeQName.hashCode());
+ return (typeQNameId == null ? 0 : typeQNameId.hashCode());
}
public Long getId()
@@ -222,18 +277,19 @@ public class NodeAssocImpl implements NodeAssoc, Serializable
}
}
- public QNameEntity getTypeQName()
+ public Long getTypeQNameId()
{
- return typeQName;
+ return typeQNameId;
}
- public void setTypeQName(QNameEntity typeQName)
+ public void setTypeQNameId(Long typeQNameId)
{
refWriteLock.lock();
try
{
- this.typeQName = typeQName;
+ this.typeQNameId = typeQNameId;
this.nodeAssocRef = null;
+ this.typeQName = null;
}
finally
{
diff --git a/source/java/org/alfresco/repo/domain/hibernate/NodeImpl.java b/source/java/org/alfresco/repo/domain/hibernate/NodeImpl.java
index 8ee5e30a71..2ec723b4fd 100644
--- a/source/java/org/alfresco/repo/domain/hibernate/NodeImpl.java
+++ b/source/java/org/alfresco/repo/domain/hibernate/NodeImpl.java
@@ -38,10 +38,11 @@ import org.alfresco.repo.domain.DbAccessControlList;
import org.alfresco.repo.domain.Node;
import org.alfresco.repo.domain.NodePropertyValue;
import org.alfresco.repo.domain.PropertyMapKey;
-import org.alfresco.repo.domain.QNameEntity;
+import org.alfresco.repo.domain.QNameDAO;
import org.alfresco.repo.domain.Store;
import org.alfresco.repo.domain.Transaction;
import org.alfresco.service.cmr.repository.NodeRef;
+import org.alfresco.service.namespace.QName;
import org.alfresco.util.EqualsHelper;
/**
@@ -60,7 +61,7 @@ public class NodeImpl extends LifecycleAdapter implements Node, Serializable
private Long version;
private Store store;
private String uuid;
- private QNameEntity typeQName;
+ private Long typeQNameId;
private Transaction transaction;
private boolean deleted;
private DbAccessControlList accessControlList;
@@ -71,6 +72,7 @@ public class NodeImpl extends LifecycleAdapter implements Node, Serializable
private transient ReadLock refReadLock;
private transient WriteLock refWriteLock;
private transient NodeRef nodeRef;
+ private transient QName typeQName;
public NodeImpl()
{
@@ -118,6 +120,46 @@ public class NodeImpl extends LifecycleAdapter implements Node, Serializable
}
}
+ public QName getTypeQName(QNameDAO qnameDAO)
+ {
+ refReadLock.lock();
+ try
+ {
+ if (typeQName != null)
+ {
+ return typeQName;
+ }
+ }
+ finally
+ {
+ refReadLock.unlock();
+ }
+ refWriteLock.lock();
+ try
+ {
+ typeQName = qnameDAO.getQName(typeQNameId).getSecond();
+ return typeQName;
+ }
+ finally
+ {
+ refWriteLock.unlock();
+ }
+ }
+
+ public void setTypeQName(QNameDAO qnameDAO, QName qname)
+ {
+ refWriteLock.lock();
+ try
+ {
+ Long typeQNameId = qnameDAO.getOrCreateQName(qname).getFirst();
+ setTypeQNameId(typeQNameId);
+ }
+ finally
+ {
+ refWriteLock.unlock();
+ }
+ }
+
/**
* @see #getNodeRef()
*/
@@ -249,14 +291,23 @@ public class NodeImpl extends LifecycleAdapter implements Node, Serializable
this.deleted = deleted;
}
- public QNameEntity getTypeQName()
+ public Long getTypeQNameId()
{
- return typeQName;
+ return typeQNameId;
}
- public void setTypeQName(QNameEntity typeQName)
+ public void setTypeQNameId(Long typeQNameId)
{
- this.typeQName = typeQName;
+ refWriteLock.lock();
+ try
+ {
+ this.typeQNameId = typeQNameId;
+ this.typeQName = null;
+ }
+ finally
+ {
+ refWriteLock.unlock();
+ }
}
public DbAccessControlList getAccessControlList()
diff --git a/source/java/org/alfresco/repo/domain/hibernate/Permission.hbm.xml b/source/java/org/alfresco/repo/domain/hibernate/Permission.hbm.xml
index aa362af817..916c504cbe 100644
--- a/source/java/org/alfresco/repo/domain/hibernate/Permission.hbm.xml
+++ b/source/java/org/alfresco/repo/domain/hibernate/Permission.hbm.xml
@@ -173,17 +173,8 @@
-
-
+
+
@@ -275,7 +266,7 @@
from
org.alfresco.repo.domain.hibernate.DbPermissionImpl as permission
where
- permission.typeQName = :permissionTypeQName and
+ permission.typeQNameId = :permissionTypeQNameId and
permission.name = :permissionName
diff --git a/source/java/org/alfresco/repo/model/filefolder/FileFolderServiceImpl.java b/source/java/org/alfresco/repo/model/filefolder/FileFolderServiceImpl.java
index 8d0482915a..785ccde60b 100644
--- a/source/java/org/alfresco/repo/model/filefolder/FileFolderServiceImpl.java
+++ b/source/java/org/alfresco/repo/model/filefolder/FileFolderServiceImpl.java
@@ -105,7 +105,7 @@ public class FileFolderServiceImpl implements FileFolderService
private MimetypeService mimetypeService;
// TODO: Replace this with a more formal means of identifying "system" folders (i.e. aspect or UUID)
- private List systemPaths;
+ private List systemPaths;
/**
* Default constructor
diff --git a/source/java/org/alfresco/repo/model/filefolder/FileFolderServiceImplTest.java b/source/java/org/alfresco/repo/model/filefolder/FileFolderServiceImplTest.java
index 36e53e97e4..dbda9fba3c 100644
--- a/source/java/org/alfresco/repo/model/filefolder/FileFolderServiceImplTest.java
+++ b/source/java/org/alfresco/repo/model/filefolder/FileFolderServiceImplTest.java
@@ -36,6 +36,9 @@ import junit.framework.TestCase;
import org.alfresco.error.AlfrescoRuntimeException;
import org.alfresco.model.ContentModel;
+import org.alfresco.repo.dictionary.DictionaryDAO;
+import org.alfresco.repo.dictionary.M2Model;
+import org.alfresco.repo.dictionary.M2Type;
import org.alfresco.repo.node.integrity.IntegrityChecker;
import org.alfresco.repo.security.authentication.AuthenticationComponent;
import org.alfresco.service.ServiceRegistry;
@@ -83,6 +86,7 @@ public class FileFolderServiceImplTest extends TestCase
private TransactionService transactionService;
private NodeService nodeService;
private FileFolderService fileFolderService;
+ private DictionaryDAO dictionaryDAO;
private UserTransaction txn;
private NodeRef rootNodeRef;
private NodeRef workingRootNodeRef;
@@ -94,6 +98,7 @@ public class FileFolderServiceImplTest extends TestCase
transactionService = serviceRegistry.getTransactionService();
nodeService = serviceRegistry.getNodeService();
fileFolderService = serviceRegistry.getFileFolderService();
+ dictionaryDAO = (DictionaryDAO) ctx.getBean("dictionaryDAO");
AuthenticationComponent authenticationComponent = (AuthenticationComponent) ctx.getBean("authenticationComponent");
// start the transaction
@@ -408,6 +413,32 @@ public class FileFolderServiceImplTest extends TestCase
{
rollbackTxn.rollback();
}
+ // Create a cm:folder derived type
+ try
+ {
+ rollbackTxn = transactionService.getNonPropagatingUserTransaction();
+ rollbackTxn.begin();
+ // Create a new model
+ String testNs = "http://www.alfresco.org/model/test111/1.0";
+ M2Model testModel = M2Model.createModel("t111:filefolderserviceimpltest");
+ testModel.createNamespace(testNs, "t111");
+ testModel.createImport(NamespaceService.DICTIONARY_MODEL_1_0_URI, NamespaceService.DICTIONARY_MODEL_PREFIX);
+ testModel.createImport(NamespaceService.SYSTEM_MODEL_1_0_URI, NamespaceService.SYSTEM_MODEL_PREFIX);
+ testModel.createImport(NamespaceService.CONTENT_MODEL_1_0_URI, NamespaceService.CONTENT_MODEL_PREFIX);
+
+ M2Type testType = testModel.createType("t111:subfolder");
+ testType.setParentName("cm:" + ContentModel.TYPE_FOLDER.getLocalName());
+ dictionaryDAO.putModel(testModel);
+ fileFolderService.create(parentFolderRef, "Legal subtype of folder", QName.createQName(testNs, "subfolder"));
+ }
+ catch (Throwable e)
+ {
+ throw new Exception("Legal subtype of cm:folder not allowed.", e);
+ }
+ finally
+ {
+ rollbackTxn.rollback();
+ }
// create a file
FileInfo fileInfo = fileFolderService.create(parentFolderRef, "newFile", ContentModel.TYPE_CONTENT);
diff --git a/source/java/org/alfresco/repo/node/AbstractNodeServiceImpl.java b/source/java/org/alfresco/repo/node/AbstractNodeServiceImpl.java
index eb631a8992..b4188cc8a5 100644
--- a/source/java/org/alfresco/repo/node/AbstractNodeServiceImpl.java
+++ b/source/java/org/alfresco/repo/node/AbstractNodeServiceImpl.java
@@ -556,25 +556,17 @@ public abstract class AbstractNodeServiceImpl implements NodeService
}
/**
- * Generates a GUID for the node using either the creation properties or just by
- * generating a value randomly.
+ * Fetches any pre-defined node uuid from the properties, but does not generate a new uuid.
*
* @param preCreationProperties the properties that will be applied to the node
- * @return Returns the ID to create the node with
+ * @return Returns the ID to create the node with, or null if a standard GUID should be used
*/
protected String generateGuid(Map preCreationProperties)
{
String uuid = (String) preCreationProperties.get(ContentModel.PROP_NODE_UUID);
- if (uuid == null)
+ if (uuid != null && uuid.length() > 50)
{
- uuid = GUID.generate();
- }
- else
- {
- if (uuid.length() > 50)
- {
- throw new IllegalArgumentException("Explicit UUID may not be greater than 50 characters: " + uuid);
- }
+ throw new IllegalArgumentException("Explicit UUID may not be greater than 50 characters: " + uuid);
}
// done
return uuid;
diff --git a/source/java/org/alfresco/repo/node/db/NodeDaoService.java b/source/java/org/alfresco/repo/node/db/NodeDaoService.java
index 534a26f62c..7fe5b41339 100644
--- a/source/java/org/alfresco/repo/node/db/NodeDaoService.java
+++ b/source/java/org/alfresco/repo/node/db/NodeDaoService.java
@@ -87,8 +87,11 @@ public interface NodeDaoService
public NodeRef.Status getNodeRefStatus(NodeRef nodeRef);
/**
+ * Create a new node. Note that allowing the uuid to be assigned by passing in a null
+ * is more efficient.
+ *
* @param storeRef the store to which the node must belong
- * @param uuid the node store-unique identifier
+ * @param uuid the node store-unique identifier, or null to assign a GUID
* @param nodeTypeQName the type of the node
* @return Returns a new node Id of the given type and attached to the store
* @throws InvalidTypeException if the node type is invalid or if the node type
@@ -394,19 +397,49 @@ public interface NodeDaoService
NodePropertyHandler handler);
/**
- * Iterate over all nodes that have a given creator
+ * Interface used to iterate over object array results
+ */
+ public interface ObjectArrayQueryCallback
+ {
+ boolean handle(Object[] array);
+ }
+
+ /**
+ * Iterate over all content nodes to get owner/creator and content url (in order to extract content size)
*
* @param storeRef the store to search in
- * @param userName the user to match
* @param handler the callback to use while iterating over the URLs
- * @return Returns the values for the given owner
+ * @return Returns the values for the given owner, creator and content url
*/
@DirtySessionAnnotation(markDirty=true)
- public void getNodesWithCreatorAndStore(
+ public void getContentUrlsForStore(
StoreRef storeRef,
- String userName,
- NodeRefQueryCallback resultsCallback);
-
+ ObjectArrayQueryCallback resultsCallback);
+
+ /**
+ * Iterate over all person nodes to get users without a calculated usage
+ *
+ * @param storeRef the store to search in
+ * @param handler the callback to use while iterating over the people
+ * @return Returns the values for username and person node uuid (excluding System)
+ */
+ @DirtySessionAnnotation(markDirty=true)
+ public void getUsersWithoutUsage(
+ StoreRef storeRef,
+ ObjectArrayQueryCallback resultsCallback);
+
+ /**
+ * Iterate over all person nodes to get users with a calculated usage
+ *
+ * @param storeRef the store to search in
+ * @param handler the callback to use while iterating over the people
+ * @return Returns the values for the username and person node uuid (excluding System)
+ */
+ @DirtySessionAnnotation(markDirty=true)
+ public void getUsersWithUsage(
+ StoreRef storeRef,
+ ObjectArrayQueryCallback resultsCallback);
+
/**
* Iterate over all property values for the given type definition. This will also dig out values that
* were persisted as type d:any.
diff --git a/source/java/org/alfresco/repo/node/db/hibernate/HibernateNodeDaoServiceImpl.java b/source/java/org/alfresco/repo/node/db/hibernate/HibernateNodeDaoServiceImpl.java
index 93dbccc5b0..162feb9e96 100644
--- a/source/java/org/alfresco/repo/node/db/hibernate/HibernateNodeDaoServiceImpl.java
+++ b/source/java/org/alfresco/repo/node/db/hibernate/HibernateNodeDaoServiceImpl.java
@@ -50,14 +50,12 @@ import org.alfresco.repo.domain.AuditableProperties;
import org.alfresco.repo.domain.ChildAssoc;
import org.alfresco.repo.domain.DbAccessControlList;
import org.alfresco.repo.domain.LocaleDAO;
-import org.alfresco.repo.domain.NamespaceEntity;
import org.alfresco.repo.domain.Node;
import org.alfresco.repo.domain.NodeAssoc;
import org.alfresco.repo.domain.NodePropertyValue;
import org.alfresco.repo.domain.PropertyMapKey;
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.Transaction;
@@ -72,12 +70,12 @@ import org.alfresco.repo.domain.hibernate.ServerImpl;
import org.alfresco.repo.domain.hibernate.StoreImpl;
import org.alfresco.repo.domain.hibernate.TransactionImpl;
import org.alfresco.repo.node.db.NodeDaoService;
+import org.alfresco.repo.security.authentication.AuthenticationUtil;
import org.alfresco.repo.security.permissions.ACLType;
import org.alfresco.repo.security.permissions.AccessControlListProperties;
import org.alfresco.repo.security.permissions.SimpleAccessControlListProperties;
import org.alfresco.repo.security.permissions.impl.AclChange;
import org.alfresco.repo.security.permissions.impl.AclDaoComponent;
-import org.alfresco.repo.security.authentication.AuthenticationUtil;
import org.alfresco.repo.transaction.AlfrescoTransactionSupport;
import org.alfresco.repo.transaction.TransactionAwareSingleton;
import org.alfresco.repo.transaction.TransactionalDao;
@@ -111,7 +109,6 @@ import org.hibernate.Query;
import org.hibernate.ScrollMode;
import org.hibernate.ScrollableResults;
import org.hibernate.Session;
-import org.hibernate.criterion.Criterion;
import org.hibernate.criterion.Projections;
import org.hibernate.criterion.Restrictions;
import org.springframework.dao.DataIntegrityViolationException;
@@ -146,7 +143,9 @@ public class HibernateNodeDaoServiceImpl extends HibernateDaoSupport implements
private static final String QUERY_GET_TARGET_ASSOCS = "node.GetTargetAssocs";
private static final String QUERY_GET_SOURCE_ASSOCS = "node.GetSourceAssocs";
private static final String QUERY_GET_NODES_WITH_PROPERTY_VALUES_BY_STRING_AND_STORE = "node.GetNodesWithPropertyValuesByStringAndStore";
- private static final String QUERY_GET_NODES_WITH_CREATOR_AND_STORE = "node.GetNodesWithCreatorAndStore";
+ private static final String QUERY_GET_CONTENT_URLS_FOR_STORE = "node.GetContentUrlsForStore";
+ private static final String QUERY_GET_USERS_WITHOUT_USAGE = "node.GetUsersWithoutUsage";
+ private static final String QUERY_GET_USERS_WITH_USAGE = "node.GetUsersWithUsage";
private static final String QUERY_GET_NODES_WITH_PROPERTY_VALUES_BY_ACTUAL_TYPE = "node.GetNodesWithPropertyValuesByActualType";
private static final String QUERY_GET_SERVER_BY_IPADDRESS = "server.getServerByIpAddress";
@@ -629,12 +628,12 @@ public class HibernateNodeDaoServiceImpl extends HibernateDaoSupport implements
// create and assign a root node
Node rootNode = newNode(
store,
- GUID.generate(),
+ null,
ContentModel.TYPE_STOREROOT);
store.setRootNode(rootNode);
// Add the root aspect
- QNameEntity rootAspectQNameEntity = qnameDAO.getOrCreateQNameEntity(ContentModel.ASPECT_ROOT);
- rootNode.getAspects().add(rootAspectQNameEntity.getId());
+ Pair rootAspectQNamePair = qnameDAO.getOrCreateQName(ContentModel.ASPECT_ROOT);
+ rootNode.getAspects().add(rootAspectQNamePair.getFirst());
// Assign permissions to the root node
SimpleAccessControlListProperties properties = DMPermissionsDaoComponentImpl.getDefaultProperties();
@@ -801,21 +800,26 @@ public class HibernateNodeDaoServiceImpl extends HibernateDaoSupport implements
private Node newNode(Store store, String uuid, QName nodeTypeQName) throws InvalidTypeException
{
- // Get the qname for the node type
- QNameEntity nodeTypeQNameEntity = qnameDAO.getOrCreateQNameEntity(nodeTypeQName);
-
- // Get any existing Node. A node with this UUID may have existed before, but must be marked
- // deleted; otherwise it will be considered live and valid
- Node node = getNodeOrNull(store, uuid);
- // If there is already a node attached, then there is a clash
+ Node node = null;
+ if (uuid != null)
+ {
+ // Get any existing Node. A node with this UUID may have existed before, but must be marked
+ // deleted; otherwise it will be considered live and valid
+ node = getNodeOrNull(store, uuid);
+ }
+ else
+ {
+ uuid = GUID.generate();
+ }
if (node != null)
{
if (!node.getDeleted())
{
+ // If there is already an undeleted node, then there is a clash
throw new InvalidNodeRefException("Live Node exists: " + node.getNodeRef(), node.getNodeRef());
}
// Set clean values
- node.setTypeQName(nodeTypeQNameEntity);
+ node.setTypeQName(qnameDAO, nodeTypeQName);
node.setDeleted(false);
node.setAccessControlList(null);
// Record node change
@@ -827,7 +831,7 @@ public class HibernateNodeDaoServiceImpl extends HibernateDaoSupport implements
node = new NodeImpl();
node.setStore(store);
node.setUuid(uuid);
- node.setTypeQName(nodeTypeQNameEntity);
+ node.setTypeQName(qnameDAO, nodeTypeQName);
node.setDeleted(false);
node.setAccessControlList(null);
// Record node change
@@ -905,8 +909,8 @@ public class HibernateNodeDaoServiceImpl extends HibernateDaoSupport implements
public QName getNodeType(Long nodeId)
{
Node node = getNodeNotNull(nodeId);
- QNameEntity nodeTypeQNameEntity = node.getTypeQName();
- return nodeTypeQNameEntity.getQName();
+ QName nodeTypeQName = node.getTypeQName(qnameDAO);
+ return nodeTypeQName;
}
public void setNodeStatus(Long nodeId)
@@ -998,7 +1002,7 @@ public class HibernateNodeDaoServiceImpl extends HibernateDaoSupport implements
Node oldNodeDummy = new NodeImpl();
oldNodeDummy.setStore(storeBefore);
oldNodeDummy.setUuid(uuidBefore);
- oldNodeDummy.setTypeQName(node.getTypeQName());
+ oldNodeDummy.setTypeQNameId(node.getTypeQNameId());
recordNodeDelete(oldNodeDummy);
// Persist
getHibernateTemplate().save(oldNodeDummy);
@@ -1009,12 +1013,16 @@ public class HibernateNodeDaoServiceImpl extends HibernateDaoSupport implements
storeAndNodeIdCache.put(nodeRefBefore, oldNodeDummy.getId());
}
- if (nodeTypeQName != null && !nodeTypeQName.equals(node.getTypeQName().getQName()))
+ // Only update the node type if it is changing
+ if (nodeTypeQName != null)
{
- QNameEntity nodeTypeQNameEntity = qnameDAO.getOrCreateQNameEntity(nodeTypeQName);
- node.setTypeQName(nodeTypeQNameEntity);
- // We will need to record the change
- recordNodeUpdate(node);
+ Long nodeTypeQNameId = qnameDAO.getOrCreateQName(nodeTypeQName).getFirst();
+ if (!nodeTypeQNameId.equals(node.getTypeQNameId()))
+ {
+ node.setTypeQNameId(nodeTypeQNameId);
+ // We will need to record the change
+ recordNodeUpdate(node);
+ }
}
}
@@ -1037,8 +1045,8 @@ public class HibernateNodeDaoServiceImpl extends HibernateDaoSupport implements
}
}
- QNameEntity propertyQNameEntity = qnameDAO.getQNameEntity(propertyQName);
- if (propertyQNameEntity == null)
+ Pair propertyQNamePair = qnameDAO.getQName(propertyQName);
+ if (propertyQNamePair == null)
{
return null;
}
@@ -1084,7 +1092,7 @@ public class HibernateNodeDaoServiceImpl extends HibernateDaoSupport implements
}
PropertyDefinition propertyDef = dictionaryService.getProperty(qname);
- Long qnameId = qnameDAO.getOrCreateQNameEntity(qname).getId();
+ Long qnameId = qnameDAO.getOrCreateQName(qname).getFirst();
Map persistableProperties = new HashMap(3);
@@ -1241,12 +1249,7 @@ public class HibernateNodeDaoServiceImpl extends HibernateDaoSupport implements
Set nodeAspects = node.getAspects();
// Convert
- Set nodeAspectQNames = new HashSet(nodeAspects.size(), 1.0F);
- for (Long qnameEntityId : nodeAspects)
- {
- QName nodeAspectQName = qnameDAO.getQName(qnameEntityId);
- nodeAspectQNames.add(nodeAspectQName);
- }
+ Set nodeAspectQNames = qnameDAO.convertIdsToQNames(nodeAspects);
// Add sys:referenceable
nodeAspectQNames.add(ContentModel.ASPECT_REFERENCEABLE);
@@ -1262,14 +1265,13 @@ public class HibernateNodeDaoServiceImpl extends HibernateDaoSupport implements
aspectQNames = new HashSet(aspectQNames);
// Remove sys:referenceable
aspectQNames.remove(ContentModel.ASPECT_REFERENCEABLE);
+
+ // Convert
+ Set aspectQNameIds = qnameDAO.convertQNamesToIds(aspectQNames, true);
+ // Add them
Set nodeAspects = node.getAspects();
-
- for (QName aspectQName : aspectQNames)
- {
- QNameEntity aspectQNameEntity = qnameDAO.getOrCreateQNameEntity(aspectQName);
- nodeAspects.add(aspectQNameEntity.getId());
- }
+ nodeAspects.addAll(aspectQNameIds);
// Record change ID
recordNodeUpdate(node);
@@ -1285,13 +1287,12 @@ public class HibernateNodeDaoServiceImpl extends HibernateDaoSupport implements
// Handle cm:auditable
aspectQNames.remove(ContentModel.ASPECT_AUDITABLE);
+ // Convert
+ Set aspectQNameIds = qnameDAO.convertQNamesToIds(aspectQNames, false);
+
+ // Remove them
Set nodeAspects = node.getAspects();
-
- for (QName aspectQName : aspectQNames)
- {
- QNameEntity aspectQNameEntity = qnameDAO.getOrCreateQNameEntity(aspectQName);
- nodeAspects.remove(aspectQNameEntity.getId());
- }
+ nodeAspects.removeAll(aspectQNameIds);
// Record change ID
recordNodeUpdate(node);
@@ -1310,14 +1311,14 @@ public class HibernateNodeDaoServiceImpl extends HibernateDaoSupport implements
private boolean hasNodeAspect(Node node, QName aspectQName)
{
- QNameEntity aspectQNameEntity = qnameDAO.getQNameEntity(aspectQName);
- if (aspectQNameEntity == null)
+ Pair aspectQNamePair = qnameDAO.getQName(aspectQName);
+ if (aspectQNamePair == null)
{
return false;
}
Set nodeAspects = node.getAspects();
- return nodeAspects.contains(aspectQNameEntity.getId());
+ return nodeAspects.contains(aspectQNamePair.getFirst());
}
/**
@@ -1533,20 +1534,15 @@ public class HibernateNodeDaoServiceImpl extends HibernateDaoSupport implements
{
Node parentNode = (Node) getSession().get(NodeImpl.class, parentNodeId);
Node childNode = (Node) getSession().get(NodeImpl.class, childNodeId);
- QNameEntity assocTypeQNameEntity = qnameDAO.getOrCreateQNameEntity(assocTypeQName);
- String assocQNameNamespace = assocQName.getNamespaceURI();
- String assocQNameLocalName = assocQName.getLocalName();
- NamespaceEntity assocQNameNamespaceEntity = qnameDAO.getOrCreateNamespaceEntity(assocQNameNamespace);
// assign a random name to the node
String name = GUID.generate();
ChildAssoc assoc = new ChildAssocImpl();
- assoc.setTypeQName(assocTypeQNameEntity);
+ assoc.setTypeQName(qnameDAO, assocTypeQName);
assoc.setChildNodeName(name);
assoc.setChildNodeNameCrc(-1L); // random names compete only with each other
- assoc.setQnameNamespace(assocQNameNamespaceEntity);
- assoc.setQnameLocalName(assocQNameLocalName);
+ assoc.setQName(qnameDAO, assocQName);
assoc.setIsPrimary(isPrimary);
assoc.setIndex(-1);
// maintain inverse sets
@@ -1591,7 +1587,7 @@ public class HibernateNodeDaoServiceImpl extends HibernateDaoSupport implements
recordNodeUpdate(childNode);
// done
- return new Pair(assocId, assoc.getChildAssocRef());
+ return new Pair(assocId, assoc.getChildAssocRef(qnameDAO));
}
public void setChildNameUnique(final Long childAssocId, String childName)
@@ -1672,7 +1668,7 @@ public class HibernateNodeDaoServiceImpl extends HibernateDaoSupport implements
}
throw new DuplicateChildNodeNameException(
parentNode.getNodeRef(),
- childAssoc.getTypeQName().getQName(),
+ childAssoc.getTypeQName(qnameDAO),
childName);
}
@@ -1702,10 +1698,6 @@ public class HibernateNodeDaoServiceImpl extends HibernateDaoSupport implements
final Node newParentNode = getNodeNotNull(parentNodeId);
final Node newChildNode = getNodeNotNull(childNodeId);
final NodeRef newChildNodeRef = newChildNode.getNodeRef();
- QNameEntity assocTypeQNameEntity = qnameDAO.getOrCreateQNameEntity(assocTypeQName);
- String assocQNameNamespace = assocQName.getNamespaceURI();
- String assocQNameLocalName = assocQName.getLocalName();
- NamespaceEntity assocQNameNamespaceEntity = qnameDAO.getOrCreateNamespaceEntity(assocQNameNamespace);
// Reset the cm:name duplicate handling. This has to be redone, if required.
String name = GUID.generate();
@@ -1713,9 +1705,8 @@ public class HibernateNodeDaoServiceImpl extends HibernateDaoSupport implements
childAssoc.setChildNodeNameCrc(-1L);
childAssoc.buildAssociation(newParentNode, newChildNode);
- childAssoc.setTypeQName(assocTypeQNameEntity);
- childAssoc.setQnameNamespace(assocQNameNamespaceEntity);
- childAssoc.setQnameLocalName(assocQNameLocalName);
+ childAssoc.setTypeQName(qnameDAO, assocTypeQName);
+ childAssoc.setQName(qnameDAO, assocQName);
if (index >= 0)
{
childAssoc.setIndex(index);
@@ -1787,7 +1778,7 @@ public class HibernateNodeDaoServiceImpl extends HibernateDaoSupport implements
}
// Done
- return new Pair(childAssocId, childAssoc.getChildAssocRef());
+ return new Pair(childAssocId, childAssoc.getChildAssocRef(qnameDAO));
}
/**
@@ -1927,9 +1918,9 @@ public class HibernateNodeDaoServiceImpl extends HibernateDaoSupport implements
@SuppressWarnings("unchecked")
public void getChildAssocs(final Long parentNodeId, final QName assocQName, ChildAssocRefQueryCallback resultsCallback)
{
- final NamespaceEntity assocQNameNamespaceEntity = qnameDAO.getNamespaceEntity(assocQName.getNamespaceURI());
+ final Pair assocQNameNamespacePair = qnameDAO.getNamespace(assocQName.getNamespaceURI());
final String assocQNameLocalName = assocQName.getLocalName();
- if (assocQNameNamespaceEntity == null)
+ if (assocQNameNamespacePair == null)
{
// There can't be any matches
return;
@@ -1943,7 +1934,7 @@ public class HibernateNodeDaoServiceImpl extends HibernateDaoSupport implements
Query query = session
.getNamedQuery(HibernateNodeDaoServiceImpl.QUERY_GET_CHILD_ASSOC_REFS_BY_QNAME)
.setLong("parentId", parentNodeId)
- .setParameter("qnameNamespace", assocQNameNamespaceEntity)
+ .setLong("qnameNamespaceId", assocQNameNamespacePair.getFirst())
.setString("qnameLocalName", assocQNameLocalName);
DirtySessionMethodInterceptor.setQueryFlushMode(session, query);
return query.scroll(ScrollMode.FORWARD_ONLY);
@@ -1971,16 +1962,9 @@ public class HibernateNodeDaoServiceImpl extends HibernateDaoSupport implements
ChildAssocRefQueryCallback resultsCallback)
{
// Convert the type QNames to entities
- final List assocTypeQNameIds = new ArrayList(assocTypeQNames.size());
- for (QName assocTypeQName : assocTypeQNames)
- {
- QNameEntity assocTypeQNameEntity = qnameDAO.getQNameEntity(assocTypeQName);
- if (assocTypeQNameEntity == null)
- {
- continue;
- }
- assocTypeQNameIds.add(assocTypeQNameEntity.getId());
- }
+
+ final Set assocTypeQNameSet = new HashSet(assocTypeQNames);
+ final Set assocTypeQNameIds = qnameDAO.convertQNamesToIds(assocTypeQNameSet, false);
// Shortcut if there are no assoc types
if (assocTypeQNameIds.size() == 0)
{
@@ -2024,11 +2008,11 @@ public class HibernateNodeDaoServiceImpl extends HibernateDaoSupport implements
{
Node parentNode = getNodeNotNull(parentNodeId);
- final QNameEntity assocTypeQNameEntity = qnameDAO.getQNameEntity(assocTypeQName);
- final NamespaceEntity assocQNameNamespaceEntity = qnameDAO.getNamespaceEntity(assocQName.getNamespaceURI());
+ final Pair assocTypeQNamePair = qnameDAO.getQName(assocTypeQName);
+ final Pair assocQNameNamespacePair = qnameDAO.getNamespace(assocQName.getNamespaceURI());
final String assocQNameLocalName = assocQName.getLocalName();
// Shortcut if possible
- if (assocTypeQNameEntity == null || assocQNameNamespaceEntity == null)
+ if (assocTypeQNamePair == null || assocQNameNamespacePair == null)
{
return;
}
@@ -2040,8 +2024,8 @@ public class HibernateNodeDaoServiceImpl extends HibernateDaoSupport implements
Query query = session
.getNamedQuery(HibernateNodeDaoServiceImpl.QUERY_GET_CHILD_ASSOC_REFS_BY_TYPEQNAME_AND_QNAME)
.setLong("parentId", parentNodeId)
- .setParameter("typeQName", assocTypeQNameEntity)
- .setParameter("qnameNamespace", assocQNameNamespaceEntity)
+ .setLong("typeQNameId", assocTypeQNamePair.getFirst())
+ .setLong("qnameNamespaceId", assocQNameNamespacePair.getFirst())
.setString("qnameLocalName", assocQNameLocalName);
DirtySessionMethodInterceptor.setQueryFlushMode(session, query);
return query.scroll(ScrollMode.FORWARD_ONLY);
@@ -2071,19 +2055,9 @@ public class HibernateNodeDaoServiceImpl extends HibernateDaoSupport implements
Node parentNode = getNodeNotNull(parentNodeId);
// Get the IDs for all the QNames we are after
- final List childNodeTypeQNameEntities = new ArrayList(childNodeTypeQNames.size());
- for (QName childNodeTypeQName : childNodeTypeQNames)
- {
- QNameEntity qnameEntity = qnameDAO.getQNameEntity(childNodeTypeQName);
- if (qnameEntity == null)
- {
- // No such QName persisted so ignore it
- continue;
- }
- childNodeTypeQNameEntities.add(qnameEntity);
- }
+ final Set childNodeTypeQNameIds = qnameDAO.convertQNamesToIds(childNodeTypeQNames, false);
// Shortcut if there are no QNames available
- if (childNodeTypeQNameEntities.size() == 0)
+ if (childNodeTypeQNameIds.size() == 0)
{
return;
}
@@ -2095,7 +2069,7 @@ public class HibernateNodeDaoServiceImpl extends HibernateDaoSupport implements
Query query = session
.getNamedQuery(HibernateNodeDaoServiceImpl.QUERY_GET_CHILD_ASSOC_REFS_BY_CHILD_TYPEQNAME)
.setLong("parentId", parentNodeId)
- .setParameterList("childTypeQNameEntities", childNodeTypeQNameEntities);
+ .setParameterList("childTypeQNameIds", childNodeTypeQNameIds);
DirtySessionMethodInterceptor.setQueryFlushMode(session, query);
return query.scroll(ScrollMode.FORWARD_ONLY);
}
@@ -2178,9 +2152,9 @@ public class HibernateNodeDaoServiceImpl extends HibernateDaoSupport implements
public Pair getChildAssoc(final Long parentNodeId, final QName assocTypeQName, final String childName)
{
- final QNameEntity assocTypeQNameEntity = qnameDAO.getQNameEntity(assocTypeQName);
+ final Pair assocTypeQNamePair = qnameDAO.getQName(assocTypeQName);
// Shortcut
- if (assocTypeQNameEntity == null)
+ if (assocTypeQNamePair == null)
{
return null;
}
@@ -2195,8 +2169,8 @@ public class HibernateNodeDaoServiceImpl extends HibernateDaoSupport implements
Query query = session
.getNamedQuery(HibernateNodeDaoServiceImpl.QUERY_GET_CHILD_ASSOC_BY_TYPE_AND_NAME)
.setLong("parentId", parentNodeId)
- .setParameter("typeQName", assocTypeQNameEntity)
- .setParameter("childNodeName", childNameShort)
+ .setLong("typeQNameId", assocTypeQNamePair.getFirst())
+ .setString("childNodeName", childNameShort)
.setLong("childNodeNameCrc", childNameLowerCrc);
DirtySessionMethodInterceptor.setQueryFlushMode(session, query);
return query.uniqueResult();
@@ -2209,7 +2183,7 @@ public class HibernateNodeDaoServiceImpl extends HibernateDaoSupport implements
}
else
{
- return new Pair(childAssoc.getId(), childAssoc.getChildAssocRef());
+ return new Pair(childAssoc.getId(), childAssoc.getChildAssocRef(qnameDAO));
}
}
@@ -2220,11 +2194,11 @@ public class HibernateNodeDaoServiceImpl extends HibernateDaoSupport implements
final QName assocQName)
{
- final QNameEntity assocTypeQNameEntity = qnameDAO.getQNameEntity(assocTypeQName);
- final NamespaceEntity assocQNameNamespaceEntity = qnameDAO.getNamespaceEntity(assocQName.getNamespaceURI());
+ final Pair assocTypeQNamePair = qnameDAO.getQName(assocTypeQName);
+ final Pair assocQNameNamespacePair = qnameDAO.getNamespace(assocQName.getNamespaceURI());
final String assocQNameLocalName = assocQName.getLocalName();
// Shortcut if possible
- if (assocTypeQNameEntity == null || assocQNameNamespaceEntity == null)
+ if (assocTypeQNamePair == null || assocQNameNamespacePair == null)
{
return null;
}
@@ -2237,8 +2211,8 @@ public class HibernateNodeDaoServiceImpl extends HibernateDaoSupport implements
.getNamedQuery(HibernateNodeDaoServiceImpl.QUERY_GET_CHILD_ASSOCS_BY_ALL)
.setLong("parentId", parentNodeId)
.setLong("childId", childNodeId)
- .setParameter("typeQName", assocTypeQNameEntity)
- .setParameter("qnameNamespace", assocQNameNamespaceEntity)
+ .setLong("typeQNameId", assocTypeQNamePair.getFirst())
+ .setParameter("qnameNamespaceId", assocQNameNamespacePair.getFirst())
.setParameter("qnameLocalName", assocQNameLocalName);
DirtySessionMethodInterceptor.setQueryFlushMode(session, query);
return query.uniqueResult();
@@ -2251,7 +2225,7 @@ public class HibernateNodeDaoServiceImpl extends HibernateDaoSupport implements
}
else
{
- return new Pair(childAssoc.getId(), childAssoc.getChildAssocRef());
+ return new Pair(childAssoc.getId(), childAssoc.getChildAssocRef(qnameDAO));
}
}
@@ -2279,11 +2253,10 @@ public class HibernateNodeDaoServiceImpl extends HibernateDaoSupport implements
{
Object[] row = results.get();
Long assocId = (Long) row[0];
- QNameEntity assocTypeQNameEntity = (QNameEntity) row[1];
- QName assocTypeQName = assocTypeQNameEntity.getQName();
- NamespaceEntity assocQNameNamespaceEntity = (NamespaceEntity) row[2];
+ QName assocTypeQName = qnameDAO.getQName((Long) row[1]).getSecond();
+ String assocQNameNamespace = qnameDAO.getNamespace((Long) row[2]).getSecond();
String assocQNameLocalName = (String) row[3];
- QName assocQName = QName.createQName(assocQNameNamespaceEntity.getUri(), assocQNameLocalName);
+ QName assocQName = QName.createQName(assocQNameNamespace, assocQNameLocalName);
Boolean assocIsPrimary = (Boolean) row[4];
Integer assocIndex = (Integer) row[5];
Long childNodeId = (Long) row[6];
@@ -2311,7 +2284,7 @@ public class HibernateNodeDaoServiceImpl extends HibernateDaoSupport implements
for (NodeAssoc nodeAssoc : queryResults)
{
Long nodeAssocId = nodeAssoc.getId();
- AssociationRef assocRef = nodeAssoc.getNodeAssocRef();
+ AssociationRef assocRef = nodeAssoc.getNodeAssocRef(qnameDAO);
refs.add(new Pair(nodeAssocId, assocRef));
}
return refs;
@@ -2323,9 +2296,9 @@ public class HibernateNodeDaoServiceImpl extends HibernateDaoSupport implements
final int count,
NodeRefQueryCallback resultsCallback)
{
- final QNameEntity aspectQNameEntity = qnameDAO.getQNameEntity(aspectQName);
+ final Pair aspectQNamePair = qnameDAO.getQName(aspectQName);
// Shortcut
- if (aspectQNameEntity == null)
+ if (aspectQNamePair == null)
{
return;
}
@@ -2336,7 +2309,7 @@ public class HibernateNodeDaoServiceImpl extends HibernateDaoSupport implements
{
Query query = session
.getNamedQuery(HibernateNodeDaoServiceImpl.QUERY_GET_NODES_WITH_ASPECT)
- .setParameter("aspectQName", aspectQNameEntity)
+ .setLong("aspectQNameId", aspectQNamePair.getFirst())
.setLong("minNodeId", minNodeId)
.setMaxResults(count);
DirtySessionMethodInterceptor.setQueryFlushMode(session, query);
@@ -2433,12 +2406,12 @@ public class HibernateNodeDaoServiceImpl extends HibernateDaoSupport implements
final QName assocTypeQName,
final QName assocQName)
{
- final QNameEntity assocTypeQNameEntity = qnameDAO.getQNameEntity(assocTypeQName);
- final NamespaceEntity assocQNameNamespaceEntity = qnameDAO.getNamespaceEntity(assocQName.getNamespaceURI());
+ final Pair assocTypeQNamePair = qnameDAO.getQName(assocTypeQName);
+ final Pair assocQNameNamespacePair = qnameDAO.getNamespace(assocQName.getNamespaceURI());
final String assocQNameLocalName = assocQName.getLocalName();
// Shortcut
- if (assocTypeQNameEntity == null || assocQNameNamespaceEntity == null)
+ if (assocTypeQNamePair == null || assocQNameNamespacePair == null)
{
return false;
}
@@ -2451,8 +2424,8 @@ public class HibernateNodeDaoServiceImpl extends HibernateDaoSupport implements
.getNamedQuery(HibernateNodeDaoServiceImpl.QUERY_GET_CHILD_ASSOCS_BY_ALL)
.setLong("parentId", parentNodeId)
.setLong("childId", childNodeId)
- .setParameter("typeQName", assocTypeQNameEntity)
- .setParameter("qnameNamespace", assocQNameNamespaceEntity)
+ .setLong("typeQNameId", assocTypeQNamePair.getFirst())
+ .setParameter("qnameNamespaceId", assocQNameNamespacePair.getFirst())
.setParameter("qnameLocalName", assocQNameLocalName);
DirtySessionMethodInterceptor.setQueryFlushMode(session, query);
return query.list();
@@ -2587,13 +2560,17 @@ public class HibernateNodeDaoServiceImpl extends HibernateDaoSupport implements
return query.list();
}
};
- parentAssocs = (List) getHibernateTemplate().execute(callback);
- // Populate the cache
+ List