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();
+ }
}