diff --git a/config/alfresco/attributes-service-context.xml b/config/alfresco/attributes-service-context.xml
index 51a894b0cd..47911ffda4 100644
--- a/config/alfresco/attributes-service-context.xml
+++ b/config/alfresco/attributes-service-context.xml
@@ -19,12 +19,18 @@
+
+
+
+
+
+
diff --git a/source/java/org/alfresco/repo/attributes/AttributeImpl.java b/source/java/org/alfresco/repo/attributes/AttributeImpl.java
index 91f01d38d0..ec3dd63d8f 100644
--- a/source/java/org/alfresco/repo/attributes/AttributeImpl.java
+++ b/source/java/org/alfresco/repo/attributes/AttributeImpl.java
@@ -288,4 +288,30 @@ public abstract class AttributeImpl implements Attribute
{
throw new AttributeMethodNotImplemented("Not ShortValue");
}
+
+ /* (non-Javadoc)
+ * @see java.lang.Object#equals(java.lang.Object)
+ */
+ @Override
+ public boolean equals(Object obj)
+ {
+ if (this == obj)
+ {
+ return true;
+ }
+ if (!(obj instanceof AttributeImpl))
+ {
+ return false;
+ }
+ return fID == ((AttributeImpl)obj).fID;
+ }
+
+ /* (non-Javadoc)
+ * @see java.lang.Object#hashCode()
+ */
+ @Override
+ public int hashCode()
+ {
+ return (int)fID;
+ }
}
diff --git a/source/java/org/alfresco/repo/attributes/AttributeServiceImpl.java b/source/java/org/alfresco/repo/attributes/AttributeServiceImpl.java
index f8516aef76..c30f790457 100644
--- a/source/java/org/alfresco/repo/attributes/AttributeServiceImpl.java
+++ b/source/java/org/alfresco/repo/attributes/AttributeServiceImpl.java
@@ -227,4 +227,43 @@ public class AttributeServiceImpl implements AttributeService
}
current.put(name, toSave);
}
+
+ /* (non-Javadoc)
+ * @see org.alfresco.service.cmr.attributes.AttributeService#getKeys(java.lang.String)
+ */
+ public List getKeys(String path)
+ {
+ if (path == null)
+ {
+ throw new AVMBadArgumentException("Null Attribute Path.");
+ }
+ List keys = parsePath(path);
+ if (keys.size() == 0)
+ {
+ return fGlobalAttributeEntryDAO.getKeys();
+ }
+ GlobalAttributeEntry entry = fGlobalAttributeEntryDAO.get(keys.get(0));
+ if (entry == null)
+ {
+ throw new AVMNotFoundException("Attribute Not Found: " + keys.get(0));
+ }
+ Attribute current = entry.getAttribute();
+ if (current.getType() != Type.MAP)
+ {
+ throw new AVMWrongTypeException("Attribute Not Map: " + keys.get(0));
+ }
+ for (int i = 1; i < keys.size(); i++)
+ {
+ current = current.get(keys.get(i));
+ if (current == null)
+ {
+ throw new AVMNotFoundException("Attribute Not Found: " + keys.get(i));
+ }
+ if (current.getType() != Type.MAP)
+ {
+ throw new AVMWrongTypeException("Attribute Not Map: " + keys.get(i));
+ }
+ }
+ return new ArrayList(current.keySet());
+ }
}
diff --git a/source/java/org/alfresco/repo/attributes/AttributeServiceTest.java b/source/java/org/alfresco/repo/attributes/AttributeServiceTest.java
index 06a3d425de..f314021cae 100644
--- a/source/java/org/alfresco/repo/attributes/AttributeServiceTest.java
+++ b/source/java/org/alfresco/repo/attributes/AttributeServiceTest.java
@@ -25,6 +25,8 @@
package org.alfresco.repo.attributes;
+import java.util.List;
+
import org.alfresco.service.cmr.attributes.AttributeService;
import org.springframework.context.support.FileSystemXmlApplicationContext;
@@ -59,6 +61,11 @@ public class AttributeServiceTest extends TestCase
@Override
protected void tearDown() throws Exception
{
+ List globalKeys = fService.getKeys("");
+ for (String key : globalKeys)
+ {
+ fService.removeAttribute("", key);
+ }
fContext.close();
fContext = null;
}
@@ -87,8 +94,13 @@ public class AttributeServiceTest extends TestCase
assertNotNull(fService.getAttribute("boolean"));
assertEquals(42, (int)fService.getAttribute("short").getShortValue());
assertEquals("I sneeze.", fService.getAttribute("map/funky").getStringValue());
- Attribute found = fService.getAttribute("map");
- System.out.println(found);
+ assertEquals(10, fService.getKeys("").size());
+ assertEquals(5, fService.getKeys("map").size());
+ List keys = fService.getKeys("");
+ for (String key : keys)
+ {
+ System.out.println(key + " => " + fService.getAttribute(key));
+ }
}
catch (Exception e)
{
diff --git a/source/java/org/alfresco/repo/attributes/BooleanAttributeImpl.java b/source/java/org/alfresco/repo/attributes/BooleanAttributeImpl.java
index a22f006dbd..d030d8f7bf 100644
--- a/source/java/org/alfresco/repo/attributes/BooleanAttributeImpl.java
+++ b/source/java/org/alfresco/repo/attributes/BooleanAttributeImpl.java
@@ -79,4 +79,13 @@ public class BooleanAttributeImpl extends AttributeImpl implements
{
return Type.BOOLEAN;
}
+
+ /* (non-Javadoc)
+ * @see java.lang.Object#toString()
+ */
+ @Override
+ public String toString()
+ {
+ return fValue ? "true" : "false";
+ }
}
diff --git a/source/java/org/alfresco/repo/attributes/BooleanAttributeValue.java b/source/java/org/alfresco/repo/attributes/BooleanAttributeValue.java
index 204a07611d..5f7f4eb6bb 100644
--- a/source/java/org/alfresco/repo/attributes/BooleanAttributeValue.java
+++ b/source/java/org/alfresco/repo/attributes/BooleanAttributeValue.java
@@ -71,4 +71,13 @@ public class BooleanAttributeValue extends AttributeValue implements
{
fData = value;
}
+
+ /* (non-Javadoc)
+ * @see java.lang.Object#toString()
+ */
+ @Override
+ public String toString()
+ {
+ return fData ? "true" : "false";
+ }
}
diff --git a/source/java/org/alfresco/repo/attributes/ByteAttributeImpl.java b/source/java/org/alfresco/repo/attributes/ByteAttributeImpl.java
index 1917cbc845..83fa5e096d 100644
--- a/source/java/org/alfresco/repo/attributes/ByteAttributeImpl.java
+++ b/source/java/org/alfresco/repo/attributes/ByteAttributeImpl.java
@@ -78,4 +78,13 @@ public class ByteAttributeImpl extends AttributeImpl implements ByteAttribute
{
fValue = value;
}
+
+ /* (non-Javadoc)
+ * @see java.lang.Object#toString()
+ */
+ @Override
+ public String toString()
+ {
+ return Byte.toString(fValue);
+ }
}
diff --git a/source/java/org/alfresco/repo/attributes/ByteAttributeValue.java b/source/java/org/alfresco/repo/attributes/ByteAttributeValue.java
index 9cfd4899b7..ea1dce3fc5 100644
--- a/source/java/org/alfresco/repo/attributes/ByteAttributeValue.java
+++ b/source/java/org/alfresco/repo/attributes/ByteAttributeValue.java
@@ -70,4 +70,13 @@ public class ByteAttributeValue extends AttributeValue implements ByteAttribute
{
fData = value;
}
+
+ /* (non-Javadoc)
+ * @see java.lang.Object#toString()
+ */
+ @Override
+ public String toString()
+ {
+ return Byte.toString(fData);
+ }
}
diff --git a/source/java/org/alfresco/repo/attributes/DoubleAttributeImpl.java b/source/java/org/alfresco/repo/attributes/DoubleAttributeImpl.java
index c1a265a91f..3c7cfea703 100644
--- a/source/java/org/alfresco/repo/attributes/DoubleAttributeImpl.java
+++ b/source/java/org/alfresco/repo/attributes/DoubleAttributeImpl.java
@@ -28,8 +28,8 @@ package org.alfresco.repo.attributes;
import org.alfresco.repo.avm.AVMDAOs;
/**
+ * Persistent double attribute implementation.
* @author britt
- *
*/
public class DoubleAttributeImpl extends AttributeImpl implements Attribute
{
@@ -78,4 +78,13 @@ public class DoubleAttributeImpl extends AttributeImpl implements Attribute
{
fValue = value;
}
+
+ /* (non-Javadoc)
+ * @see java.lang.Object#toString()
+ */
+ @Override
+ public String toString()
+ {
+ return Double.toString(fValue);
+ }
}
diff --git a/source/java/org/alfresco/repo/attributes/DoubleAttributeValue.java b/source/java/org/alfresco/repo/attributes/DoubleAttributeValue.java
index e7ea466577..76fd5106e8 100644
--- a/source/java/org/alfresco/repo/attributes/DoubleAttributeValue.java
+++ b/source/java/org/alfresco/repo/attributes/DoubleAttributeValue.java
@@ -71,4 +71,13 @@ public class DoubleAttributeValue extends AttributeValue implements
{
fData = value;
}
+
+ /* (non-Javadoc)
+ * @see java.lang.Object#toString()
+ */
+ @Override
+ public String toString()
+ {
+ return Double.toString(fData);
+ }
}
diff --git a/source/java/org/alfresco/repo/attributes/FloatAttributeImpl.java b/source/java/org/alfresco/repo/attributes/FloatAttributeImpl.java
index dabb2dc96f..6e4da18e16 100644
--- a/source/java/org/alfresco/repo/attributes/FloatAttributeImpl.java
+++ b/source/java/org/alfresco/repo/attributes/FloatAttributeImpl.java
@@ -78,4 +78,13 @@ public class FloatAttributeImpl extends AttributeImpl implements FloatAttribute
{
fValue = value;
}
+
+ /* (non-Javadoc)
+ * @see java.lang.Object#toString()
+ */
+ @Override
+ public String toString()
+ {
+ return Float.toString(fValue);
+ }
}
diff --git a/source/java/org/alfresco/repo/attributes/FloatAttributeValue.java b/source/java/org/alfresco/repo/attributes/FloatAttributeValue.java
index 0c2c2a42dc..7651405831 100644
--- a/source/java/org/alfresco/repo/attributes/FloatAttributeValue.java
+++ b/source/java/org/alfresco/repo/attributes/FloatAttributeValue.java
@@ -71,4 +71,13 @@ public class FloatAttributeValue extends AttributeValue implements
{
fData = value;
}
+
+ /* (non-Javadoc)
+ * @see java.lang.Object#toString()
+ */
+ @Override
+ public String toString()
+ {
+ return Float.toString(fData);
+ }
}
diff --git a/source/java/org/alfresco/repo/attributes/GlobalAttributeEntryDAO.java b/source/java/org/alfresco/repo/attributes/GlobalAttributeEntryDAO.java
index 7832079881..5919735691 100644
--- a/source/java/org/alfresco/repo/attributes/GlobalAttributeEntryDAO.java
+++ b/source/java/org/alfresco/repo/attributes/GlobalAttributeEntryDAO.java
@@ -1,5 +1,7 @@
package org.alfresco.repo.attributes;
+import java.util.List;
+
/**
* Interface for persistence of the top level attribute map.
* @author britt
@@ -30,4 +32,10 @@ public interface GlobalAttributeEntryDAO
* @return The entry or null.
*/
public GlobalAttributeEntry get(String name);
+
+ /**
+ * Get all keys for global attributes.
+ * @return A list of all top level keys.
+ */
+ public List getKeys();
}
diff --git a/source/java/org/alfresco/repo/attributes/IntAttributeImpl.java b/source/java/org/alfresco/repo/attributes/IntAttributeImpl.java
index 26cf6c3e19..75e97ddb68 100644
--- a/source/java/org/alfresco/repo/attributes/IntAttributeImpl.java
+++ b/source/java/org/alfresco/repo/attributes/IntAttributeImpl.java
@@ -78,4 +78,13 @@ public class IntAttributeImpl extends AttributeImpl implements IntAttribute
{
fValue = value;
}
+
+ /* (non-Javadoc)
+ * @see java.lang.Object#toString()
+ */
+ @Override
+ public String toString()
+ {
+ return Integer.toString(fValue);
+ }
}
diff --git a/source/java/org/alfresco/repo/attributes/IntAttributeValue.java b/source/java/org/alfresco/repo/attributes/IntAttributeValue.java
index efe4723f4e..a1f12475da 100644
--- a/source/java/org/alfresco/repo/attributes/IntAttributeValue.java
+++ b/source/java/org/alfresco/repo/attributes/IntAttributeValue.java
@@ -70,4 +70,13 @@ public class IntAttributeValue extends AttributeValue implements IntAttribute
{
fData = value;
}
+
+ /* (non-Javadoc)
+ * @see java.lang.Object#toString()
+ */
+ @Override
+ public String toString()
+ {
+ return Integer.toString(fData);
+ }
}
diff --git a/source/java/org/alfresco/repo/attributes/LongAttributeImpl.java b/source/java/org/alfresco/repo/attributes/LongAttributeImpl.java
index e162f25c58..3037d60037 100644
--- a/source/java/org/alfresco/repo/attributes/LongAttributeImpl.java
+++ b/source/java/org/alfresco/repo/attributes/LongAttributeImpl.java
@@ -78,4 +78,13 @@ public class LongAttributeImpl extends AttributeImpl implements LongAttribute
{
fValue = value;
}
+
+ /* (non-Javadoc)
+ * @see java.lang.Object#toString()
+ */
+ @Override
+ public String toString()
+ {
+ return Long.toString(fValue);
+ }
}
diff --git a/source/java/org/alfresco/repo/attributes/LongAttributeValue.java b/source/java/org/alfresco/repo/attributes/LongAttributeValue.java
index 30df53af0b..39e7448bb8 100644
--- a/source/java/org/alfresco/repo/attributes/LongAttributeValue.java
+++ b/source/java/org/alfresco/repo/attributes/LongAttributeValue.java
@@ -70,4 +70,13 @@ public class LongAttributeValue extends AttributeValue implements LongAttribute
{
fData = value;
}
+
+ /* (non-Javadoc)
+ * @see java.lang.Object#toString()
+ */
+ @Override
+ public String toString()
+ {
+ return Long.toString(fData);
+ }
}
diff --git a/source/java/org/alfresco/repo/attributes/MapAttributeImpl.java b/source/java/org/alfresco/repo/attributes/MapAttributeImpl.java
index feea296458..a3e0de2af9 100644
--- a/source/java/org/alfresco/repo/attributes/MapAttributeImpl.java
+++ b/source/java/org/alfresco/repo/attributes/MapAttributeImpl.java
@@ -223,4 +223,23 @@ public class MapAttributeImpl extends AttributeImpl implements MapAttribute
}
return attrs;
}
+
+ /* (non-Javadoc)
+ * @see java.lang.Object#toString()
+ */
+ @Override
+ public String toString()
+ {
+ StringBuilder builder = new StringBuilder();
+ builder.append('{');
+ for (Map.Entry entry : entrySet())
+ {
+ builder.append(entry.getKey());
+ builder.append('=');
+ builder.append(entry.getValue().toString());
+ builder.append(' ');
+ }
+ builder.append('}');
+ return builder.toString();
+ }
}
diff --git a/source/java/org/alfresco/repo/attributes/MapAttributeValue.java b/source/java/org/alfresco/repo/attributes/MapAttributeValue.java
index 19dd470c18..c889d5c3b1 100644
--- a/source/java/org/alfresco/repo/attributes/MapAttributeValue.java
+++ b/source/java/org/alfresco/repo/attributes/MapAttributeValue.java
@@ -186,4 +186,23 @@ public class MapAttributeValue extends AttributeValue implements MapAttribute
{
return fData.values();
}
+
+ /* (non-Javadoc)
+ * @see java.lang.Object#toString()
+ */
+ @Override
+ public String toString()
+ {
+ StringBuilder builder = new StringBuilder();
+ builder.append('{');
+ for (Map.Entry entry : fData.entrySet())
+ {
+ builder.append(entry.getKey());
+ builder.append('=');
+ builder.append(entry.getValue().toString());
+ builder.append(' ');
+ }
+ builder.append('}');
+ return builder.toString();
+ }
}
diff --git a/source/java/org/alfresco/repo/attributes/SerializableAttributeImpl.java b/source/java/org/alfresco/repo/attributes/SerializableAttributeImpl.java
index 10cb091dc8..b3279aa5f8 100644
--- a/source/java/org/alfresco/repo/attributes/SerializableAttributeImpl.java
+++ b/source/java/org/alfresco/repo/attributes/SerializableAttributeImpl.java
@@ -81,4 +81,13 @@ public class SerializableAttributeImpl extends AttributeImpl implements
{
fValue = value;
}
+
+ /* (non-Javadoc)
+ * @see java.lang.Object#toString()
+ */
+ @Override
+ public String toString()
+ {
+ return fValue.toString();
+ }
}
diff --git a/source/java/org/alfresco/repo/attributes/SerializableAttributeValue.java b/source/java/org/alfresco/repo/attributes/SerializableAttributeValue.java
index 16d25e0a96..bcc4b28e0e 100644
--- a/source/java/org/alfresco/repo/attributes/SerializableAttributeValue.java
+++ b/source/java/org/alfresco/repo/attributes/SerializableAttributeValue.java
@@ -73,4 +73,13 @@ public class SerializableAttributeValue extends AttributeValue implements
{
fData = value;
}
+
+ /* (non-Javadoc)
+ * @see java.lang.Object#toString()
+ */
+ @Override
+ public String toString()
+ {
+ return fData.toString();
+ }
}
diff --git a/source/java/org/alfresco/repo/attributes/ShortAttributeImpl.java b/source/java/org/alfresco/repo/attributes/ShortAttributeImpl.java
index 72b74bb920..7ec3c61120 100644
--- a/source/java/org/alfresco/repo/attributes/ShortAttributeImpl.java
+++ b/source/java/org/alfresco/repo/attributes/ShortAttributeImpl.java
@@ -78,4 +78,13 @@ public class ShortAttributeImpl extends AttributeImpl implements ShortAttribute
{
return Type.SHORT;
}
+
+ /* (non-Javadoc)
+ * @see java.lang.Object#toString()
+ */
+ @Override
+ public String toString()
+ {
+ return Short.toString(fValue);
+ }
}
diff --git a/source/java/org/alfresco/repo/attributes/ShortAttributeValue.java b/source/java/org/alfresco/repo/attributes/ShortAttributeValue.java
index ac0ca127cf..a94655ca5b 100644
--- a/source/java/org/alfresco/repo/attributes/ShortAttributeValue.java
+++ b/source/java/org/alfresco/repo/attributes/ShortAttributeValue.java
@@ -71,4 +71,13 @@ public class ShortAttributeValue extends AttributeValue implements
{
fData = value;
}
+
+ /* (non-Javadoc)
+ * @see java.lang.Object#toString()
+ */
+ @Override
+ public String toString()
+ {
+ return Short.toString(fData);
+ }
}
diff --git a/source/java/org/alfresco/repo/attributes/StringAttributeImpl.java b/source/java/org/alfresco/repo/attributes/StringAttributeImpl.java
index 0c7cca30c4..27b1fab901 100644
--- a/source/java/org/alfresco/repo/attributes/StringAttributeImpl.java
+++ b/source/java/org/alfresco/repo/attributes/StringAttributeImpl.java
@@ -79,4 +79,13 @@ public class StringAttributeImpl extends AttributeImpl implements
{
fValue = value;
}
+
+ /* (non-Javadoc)
+ * @see java.lang.Object#toString()
+ */
+ @Override
+ public String toString()
+ {
+ return fValue;
+ }
}
diff --git a/source/java/org/alfresco/repo/attributes/StringAttributeValue.java b/source/java/org/alfresco/repo/attributes/StringAttributeValue.java
index cc6d63abf7..c248b812a5 100644
--- a/source/java/org/alfresco/repo/attributes/StringAttributeValue.java
+++ b/source/java/org/alfresco/repo/attributes/StringAttributeValue.java
@@ -71,4 +71,13 @@ public class StringAttributeValue extends AttributeValue implements
{
fData = value;
}
+
+ /* (non-Javadoc)
+ * @see java.lang.Object#toString()
+ */
+ @Override
+ public String toString()
+ {
+ return fData;
+ }
}
diff --git a/source/java/org/alfresco/repo/attributes/hibernate/AttributeDAOHibernate.java b/source/java/org/alfresco/repo/attributes/hibernate/AttributeDAOHibernate.java
index fe48e6d3b4..e10f755eee 100644
--- a/source/java/org/alfresco/repo/attributes/hibernate/AttributeDAOHibernate.java
+++ b/source/java/org/alfresco/repo/attributes/hibernate/AttributeDAOHibernate.java
@@ -45,6 +45,15 @@ public class AttributeDAOHibernate extends HibernateDaoSupport implements
{
private MapEntryDAO fMapEntryDAO;
+ public AttributeDAOHibernate()
+ {
+ }
+
+ public void setMapEntryDao(MapEntryDAO dao)
+ {
+ fMapEntryDAO = dao;
+ }
+
/* (non-Javadoc)
* @see org.alfresco.repo.attributes.AttributeDAO#delete(org.alfresco.repo.attributes.Attribute)
*/
diff --git a/source/java/org/alfresco/repo/attributes/hibernate/GlobalAttributeEntryDAOHibernate.java b/source/java/org/alfresco/repo/attributes/hibernate/GlobalAttributeEntryDAOHibernate.java
index 30383544e9..6a8c2a30fa 100644
--- a/source/java/org/alfresco/repo/attributes/hibernate/GlobalAttributeEntryDAOHibernate.java
+++ b/source/java/org/alfresco/repo/attributes/hibernate/GlobalAttributeEntryDAOHibernate.java
@@ -25,10 +25,14 @@
package org.alfresco.repo.attributes.hibernate;
+import java.util.List;
+
import org.alfresco.repo.attributes.Attribute;
+import org.alfresco.repo.attributes.AttributeDAO;
import org.alfresco.repo.attributes.GlobalAttributeEntry;
import org.alfresco.repo.attributes.GlobalAttributeEntryDAO;
import org.alfresco.repo.attributes.GlobalAttributeEntryImpl;
+import org.hibernate.Query;
import org.springframework.orm.hibernate3.support.HibernateDaoSupport;
/**
@@ -38,12 +42,25 @@ import org.springframework.orm.hibernate3.support.HibernateDaoSupport;
public class GlobalAttributeEntryDAOHibernate extends HibernateDaoSupport
implements GlobalAttributeEntryDAO
{
+ private AttributeDAO fAttributeDAO;
+
+ public GlobalAttributeEntryDAOHibernate()
+ {
+ }
+
+ public void setAttributeDao(AttributeDAO dao)
+ {
+ fAttributeDAO = dao;
+ }
+
/* (non-Javadoc)
* @see org.alfresco.repo.attributes.GlobalAttributeEntryDAO#delete(org.alfresco.repo.attributes.GlobalAttributeEntry)
*/
public void delete(GlobalAttributeEntry entry)
{
+ Attribute attr = entry.getAttribute();
getSession().delete(entry);
+ fAttributeDAO.delete(attr);
}
/* (non-Javadoc)
@@ -69,4 +86,14 @@ public class GlobalAttributeEntryDAOHibernate extends HibernateDaoSupport
{
getSession().save(entry);
}
+
+ /* (non-Javadoc)
+ * @see org.alfresco.repo.attributes.GlobalAttributeEntryDAO#getKeys()
+ */
+ @SuppressWarnings("unchecked")
+ public List getKeys()
+ {
+ Query query = getSession().createQuery("select gae.name from GlobalAttributeEntryImpl gae");
+ return (List)query.list();
+ }
}
diff --git a/source/java/org/alfresco/service/cmr/attributes/AttributeService.java b/source/java/org/alfresco/service/cmr/attributes/AttributeService.java
index a1a6eef46b..5ee381b455 100644
--- a/source/java/org/alfresco/service/cmr/attributes/AttributeService.java
+++ b/source/java/org/alfresco/service/cmr/attributes/AttributeService.java
@@ -63,4 +63,11 @@ public interface AttributeService
* @return A List of matching attributes.
*/
public List query(String path, AttrQuery query);
+
+ /**
+ * Get all the keys for a given attribute path.
+ * @param path The attribute path.
+ * @return A list of all keys.
+ */
+ public List getKeys(String path);
}