From 2e3e8f4ad2c99953402ac6fba2e5651a1cbe4d15 Mon Sep 17 00:00:00 2001 From: Britt Park Date: Fri, 21 Jul 2006 08:37:05 +0000 Subject: [PATCH] Extended Properties to batch updates. This is really a salvage from an aborted attempt to make basic attributes (creator, modifier, owner, modtime etc.) plain Properties. This resulted in a 30% performance hit. git-svn-id: https://svn.alfresco.com/repos/alfresco-enterprise/alfresco/BRANCHES/WCM-DEV2/root@3362 c4b6b30b-aa2e-2d43-bbcb-ca4b014f7261 --- source/java/ehcache.xml | 11 +++++++-- .../java/org/alfresco/repo/avm/AVMNode.java | 6 +++++ .../org/alfresco/repo/avm/AVMNodeImpl.java | 12 ++++++++++ .../alfresco/repo/avm/AVMNodePropertyDAO.java | 6 +++++ .../org/alfresco/repo/avm/AVMRepository.java | 13 ++++++++++ .../org/alfresco/repo/avm/AVMService.java | 7 ++++++ .../org/alfresco/repo/avm/AVMServiceImpl.java | 24 ++++++++++++++++++- .../org/alfresco/repo/avm/AVMServiceTest.java | 17 +++++++++++++ .../java/org/alfresco/repo/avm/AVMStore.java | 7 ++++++ .../org/alfresco/repo/avm/AVMStoreImpl.java | 12 ++++++++++ .../org/alfresco/repo/avm/OrphanReaper.java | 4 ++-- .../AVMNodePropertyDAOHibernate.java | 16 +++++++++++++ 12 files changed, 130 insertions(+), 5 deletions(-) diff --git a/source/java/ehcache.xml b/source/java/ehcache.xml index c79e2828c5..56f0d64f1c 100644 --- a/source/java/ehcache.xml +++ b/source/java/ehcache.xml @@ -81,8 +81,15 @@ timeToIdleSeconds="300" timeToLiveSeconds="600" memoryStoreEvictionPolicy="LRU"/> - + properties); + /** * Get a property by name. * @param name The name of the property to get. diff --git a/source/java/org/alfresco/repo/avm/AVMNodeImpl.java b/source/java/org/alfresco/repo/avm/AVMNodeImpl.java index dae2223f24..32953245af 100644 --- a/source/java/org/alfresco/repo/avm/AVMNodeImpl.java +++ b/source/java/org/alfresco/repo/avm/AVMNodeImpl.java @@ -306,6 +306,18 @@ public abstract class AVMNodeImpl implements AVMNode, Serializable AVMContext.fgInstance.fAVMNodePropertyDAO.save(prop); } + /** + * Set a collection of properties on this node. + * @param properties The Map of QNames to PropertyValues. + */ + public void setProperties(Map properties) + { + for (QName name : properties.keySet()) + { + setProperty(name, properties.get(name)); + } + } + /** * Get a property by name. * @param name The name of the property. diff --git a/source/java/org/alfresco/repo/avm/AVMNodePropertyDAO.java b/source/java/org/alfresco/repo/avm/AVMNodePropertyDAO.java index 1b82a59fe4..eef52af250 100644 --- a/source/java/org/alfresco/repo/avm/AVMNodePropertyDAO.java +++ b/source/java/org/alfresco/repo/avm/AVMNodePropertyDAO.java @@ -53,4 +53,10 @@ public interface AVMNodePropertyDAO * @param prop The property. */ public void update(AVMNodeProperty prop); + + /** + * Delete all properties associated with a node. + * @param node The AVMNode whose properties should be deleted. + */ + public void deleteAll(AVMNode node); } diff --git a/source/java/org/alfresco/repo/avm/AVMRepository.java b/source/java/org/alfresco/repo/avm/AVMRepository.java index b00d1ed32e..e0e35aa713 100644 --- a/source/java/org/alfresco/repo/avm/AVMRepository.java +++ b/source/java/org/alfresco/repo/avm/AVMRepository.java @@ -879,6 +879,19 @@ class AVMRepository store.setProperty(pathParts[1], name, value); } + /** + * Set a collection of properties at once. + * @param path The path to the node. + * @param properties The Map of QNames to PropertyValues. + */ + public void setProperties(String path, Map properties) + { + fLookupCount.set(1); + String [] pathParts = SplitPath(path); + AVMStore store = getAVMStoreByName(pathParts[0], true); + store.setProperties(pathParts[1], properties); + } + /** * Get a property by name for a node. * @param version The version to look under. diff --git a/source/java/org/alfresco/repo/avm/AVMService.java b/source/java/org/alfresco/repo/avm/AVMService.java index 6cf1b76d53..5cc3dd70d7 100644 --- a/source/java/org/alfresco/repo/avm/AVMService.java +++ b/source/java/org/alfresco/repo/avm/AVMService.java @@ -319,6 +319,13 @@ public interface AVMService */ public void setProperty(String path, QName name, PropertyValue value); + /** + * Set a collection of properties on a node. + * @param path The path to the node. + * @param properties The Map of properties to set. + */ + public void setProperties(String path, Map properties); + /** * Get a property of a node by QName. * @param version The version to look under. diff --git a/source/java/org/alfresco/repo/avm/AVMServiceImpl.java b/source/java/org/alfresco/repo/avm/AVMServiceImpl.java index 6ddf426f04..bad0443c65 100644 --- a/source/java/org/alfresco/repo/avm/AVMServiceImpl.java +++ b/source/java/org/alfresco/repo/avm/AVMServiceImpl.java @@ -1053,7 +1053,29 @@ public class AVMServiceImpl implements AVMService TxnCallback doit = new TxnCallback(); fTransaction.perform(doit, true); } - + + /** + * Set a collection of properties on a node. + * @param path The path to the node. + * @param properties The Map of properties to set. + */ + public void setProperties(final String path, final Map properties) + { + if (path == null || properties == null) + { + throw new AVMBadArgumentException("Illegal null argument."); + } + class TxnCallback implements RetryingTransactionCallback + { + public void perform() + { + fAVMRepository.setProperties(path, properties); + } + } + TxnCallback doit = new TxnCallback(); + fTransaction.perform(doit, true); + } + /** * Get a property of a node by QName. * @param version The version to look under. diff --git a/source/java/org/alfresco/repo/avm/AVMServiceTest.java b/source/java/org/alfresco/repo/avm/AVMServiceTest.java index 1a064447de..e94384e4df 100644 --- a/source/java/org/alfresco/repo/avm/AVMServiceTest.java +++ b/source/java/org/alfresco/repo/avm/AVMServiceTest.java @@ -24,6 +24,7 @@ import java.io.PrintStream; import java.io.RandomAccessFile; import java.util.ArrayList; import java.util.Date; +import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.TreeMap; @@ -2038,6 +2039,22 @@ public class AVMServiceTest extends AVMServiceTestBase Map props = fService.getProperties(-1, "main:/a/b/c/foo"); assertEquals(1, props.size()); assertEquals(value.toString(), props.get(name).toString()); + props = new HashMap(); + QName n1 = QName.createQName("silly.uri", "Prop1"); + PropertyValue p1 = new PropertyValue(null, new Date(System.currentTimeMillis())); + props.put(n1, p1); + QName n2 = QName.createQName("silly.uri", "Prop2"); + PropertyValue p2 = new PropertyValue(null, "A String Property."); + props.put(n2, p2); + QName n3 = QName.createQName("silly.uri", "Prop3"); + PropertyValue p3 = new PropertyValue(null, 42); + props.put(n3, p3); + fService.setProperties("main:/a/b/c/bar", props); + fService.createSnapshot("main"); + props = fService.getProperties(-1, "main:/a/b/c/bar"); + assertEquals(p1.toString(), props.get(n1).toString()); + assertEquals(p2.toString(), props.get(n2).toString()); + assertEquals(p3.toString(), props.get(n3).toString()); } catch (Exception e) { diff --git a/source/java/org/alfresco/repo/avm/AVMStore.java b/source/java/org/alfresco/repo/avm/AVMStore.java index b19b3ff5ba..697a457987 100644 --- a/source/java/org/alfresco/repo/avm/AVMStore.java +++ b/source/java/org/alfresco/repo/avm/AVMStore.java @@ -276,6 +276,13 @@ public interface AVMStore */ public void setProperty(String path, QName name, PropertyValue value); + /** + * Set a collection of properties on a node. + * @param path The path to the node. + * @param properties The Map of QNames to PropertyValues. + */ + public void setProperties(String path, Map properties); + /** * Get a property by name. * @param version The version to look under. diff --git a/source/java/org/alfresco/repo/avm/AVMStoreImpl.java b/source/java/org/alfresco/repo/avm/AVMStoreImpl.java index 74b425d2ec..5915b842cc 100644 --- a/source/java/org/alfresco/repo/avm/AVMStoreImpl.java +++ b/source/java/org/alfresco/repo/avm/AVMStoreImpl.java @@ -840,6 +840,18 @@ public class AVMStoreImpl implements AVMStore, Serializable node.setProperty(name, value); } + /** + * Set a collection of properties on a node. + * @param path The path to the node. + * @param properties The Map of QNames to PropertyValues. + */ + public void setProperties(String path, Map properties) + { + Lookup lPath = lookup(-1, path, true); + AVMNode node = lPath.getCurrentNode(); + node.setProperties(properties); + } + /** * Get a property by name. * @param version The version to lookup. diff --git a/source/java/org/alfresco/repo/avm/OrphanReaper.java b/source/java/org/alfresco/repo/avm/OrphanReaper.java index 37a58b885c..2f085e9cca 100644 --- a/source/java/org/alfresco/repo/avm/OrphanReaper.java +++ b/source/java/org/alfresco/repo/avm/OrphanReaper.java @@ -238,8 +238,8 @@ public class OrphanReaper implements Runnable { AVMContext.fgInstance.fNewInAVMStoreDAO.delete(newInRep); } - // TODO What to do about such Hibernate wackiness: session.flush(); - // TODO More of the same: node = AVMNodeUnwrapper.Unwrap(node); + // Get rid of all properties belonging to this node. + AVMContext.fgInstance.fAVMNodePropertyDAO.deleteAll(node); // Extra work for directories. if (node.getType() == AVMNodeType.PLAIN_DIRECTORY || node.getType() == AVMNodeType.LAYERED_DIRECTORY) diff --git a/source/java/org/alfresco/repo/avm/hibernate/AVMNodePropertyDAOHibernate.java b/source/java/org/alfresco/repo/avm/hibernate/AVMNodePropertyDAOHibernate.java index 7599aa07a1..c2ef643577 100644 --- a/source/java/org/alfresco/repo/avm/hibernate/AVMNodePropertyDAOHibernate.java +++ b/source/java/org/alfresco/repo/avm/hibernate/AVMNodePropertyDAOHibernate.java @@ -29,6 +29,8 @@ public class AVMNodePropertyDAOHibernate extends HibernateDaoSupport "from AVMNodePropertyImpl anp where anp.node = :node and anp.name = :name"); query.setEntity("node", node); query.setParameter("name", name); + query.setCacheable(true); + query.setCacheRegion("Property.Lookup"); return (AVMNodeProperty)query.uniqueResult(); } @@ -44,6 +46,8 @@ public class AVMNodePropertyDAOHibernate extends HibernateDaoSupport getSession().createQuery( "from AVMNodePropertyImpl anp where anp.node = :node"); query.setEntity("node", node); + query.setCacheable(true); + query.setCacheRegion("Properties.Lookup"); return (List)query.list(); } @@ -64,4 +68,16 @@ public class AVMNodePropertyDAOHibernate extends HibernateDaoSupport { // Do nothing for Hibernate. } + + /** + * Delete all properties associated with a node. + * @param node The AVMNode whose properties should be deleted. + */ + public void deleteAll(AVMNode node) + { + Query delete = + getSession().createQuery("delete from AVMNodePropertyImpl anp where anp.node = :node"); + delete.setEntity("node", node); + delete.executeUpdate(); + } }