diff --git a/config/alfresco/public-services-context.xml b/config/alfresco/public-services-context.xml index 047d6caa06..6173a0285d 100644 --- a/config/alfresco/public-services-context.xml +++ b/config/alfresco/public-services-context.xml @@ -901,6 +901,7 @@ getAttributes query + getKeys diff --git a/source/java/org/alfresco/repo/attributes/AttributeImpl.java b/source/java/org/alfresco/repo/attributes/AttributeImpl.java index 8eb4a631ea..2f887071ec 100644 --- a/source/java/org/alfresco/repo/attributes/AttributeImpl.java +++ b/source/java/org/alfresco/repo/attributes/AttributeImpl.java @@ -60,6 +60,15 @@ public abstract class AttributeImpl implements Attribute { } + /** + * Helper constructor for copy constructors. + * @param acl The ACL. + */ + protected AttributeImpl(DbAccessControlList acl) + { + fACL = acl; + } + public void setId(long id) { fID = id; diff --git a/source/java/org/alfresco/repo/attributes/AttributeServiceImpl.java b/source/java/org/alfresco/repo/attributes/AttributeServiceImpl.java index 7f619d2ea8..487b3bc8fb 100644 --- a/source/java/org/alfresco/repo/attributes/AttributeServiceImpl.java +++ b/source/java/org/alfresco/repo/attributes/AttributeServiceImpl.java @@ -77,29 +77,7 @@ public class AttributeServiceImpl implements AttributeService throw new AVMBadArgumentException("Null path."); } List keys = parsePath(path); - if (keys.size() < 1) - { - throw new AVMBadArgumentException("Bad Attribute Path: " + path); - } - GlobalAttributeEntry entry = fGlobalAttributeEntryDAO.get(keys.get(0)); - if (entry == null) - { - return null; - } - Attribute current = entry.getAttribute(); - for (int i = 1; i < keys.size(); i++) - { - if (current.getType() != Type.MAP) - { - return null; - } - current = current.get(keys.get(i)); - if (current == null) - { - return null; - } - } - return fAttributeConverter.toValue(current); + return getAttribute(keys); } /** @@ -153,42 +131,7 @@ public class AttributeServiceImpl implements AttributeService throw new AVMBadArgumentException("Null Attribute Path."); } List keys = parsePath(path); - if (keys.size() == 0) - { - throw new AVMBadArgumentException("Cannot query top level Attributes."); - } - 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)); - } - } - List> rawResult = - fAttributeDAO.find((MapAttribute)current, query); - List> result = - new ArrayList>(); - for (Pair raw : rawResult) - { - result.add(new Pair(raw.getFirst(), - fAttributeConverter.toValue(raw.getSecond()))); - } - return result; + return query(keys, query); } /* (non-Javadoc) @@ -201,10 +144,81 @@ public class AttributeServiceImpl implements AttributeService throw new AVMBadArgumentException("Null Attribute Path."); } List keys = parsePath(path); + removeAttribute(keys, name); + } + + /* (non-Javadoc) + * @see org.alfresco.service.cmr.attributes.AttributeService#setAttribute(java.lang.String, org.alfresco.repo.attributes.Attribute) + */ + public void setAttribute(String path, String name, Attribute value) + { + if (path == null) + { + throw new AVMBadArgumentException("Null path."); + } + List keys = parsePath(path); + setAttribute(keys, name, value); + } + + /* (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); + return getKeys(keys); + } + + /* (non-Javadoc) + * @see org.alfresco.service.cmr.attributes.AttributeService#getAttribute(java.util.List) + */ + public Attribute getAttribute(List keys) + { + if (keys == null) + { + throw new AVMBadArgumentException("Null Attribute Path List."); + } + if (keys.size() < 1) + { + throw new AVMBadArgumentException("Bad Attribute Path List."); + } + GlobalAttributeEntry entry = fGlobalAttributeEntryDAO.get(keys.get(0)); + if (entry == null) + { + return null; + } + Attribute current = entry.getAttribute(); + for (int i = 1; i < keys.size(); i++) + { + if (current.getType() != Type.MAP) + { + return null; + } + current = current.get(keys.get(i)); + if (current == null) + { + return null; + } + } + return fAttributeConverter.toValue(current); + } + + /* (non-Javadoc) + * @see org.alfresco.service.cmr.attributes.AttributeService#getKeys(java.util.List) + */ + public List getKeys(List keys) + { + if (keys == null) + { + throw new AVMBadArgumentException("Null Keys List."); + } if (keys.size() == 0) { - fGlobalAttributeEntryDAO.delete(name); - return; + return fGlobalAttributeEntryDAO.getKeys(); } GlobalAttributeEntry entry = fGlobalAttributeEntryDAO.get(keys.get(0)); if (entry == null) @@ -228,15 +242,18 @@ public class AttributeServiceImpl implements AttributeService throw new AVMWrongTypeException("Attribute Not Map: " + keys.get(i)); } } - current.remove(name); + return new ArrayList(current.keySet()); } /* (non-Javadoc) - * @see org.alfresco.service.cmr.attributes.AttributeService#setAttribute(java.lang.String, org.alfresco.repo.attributes.Attribute) + * @see org.alfresco.service.cmr.attributes.AttributeService#setAttribute(java.util.List, java.lang.String, org.alfresco.repo.attributes.Attribute) */ - public void setAttribute(String path, String name, Attribute value) + public void setAttribute(List keys, String name, Attribute value) { - List keys = parsePath(path); + if (keys == null || name == null || value == null) + { + throw new AVMBadArgumentException("Null argument."); + } Attribute toSave = fAttributeConverter.toPersistent(value); if (keys.size() == 0) { @@ -277,18 +294,17 @@ public class AttributeServiceImpl implements AttributeService } /* (non-Javadoc) - * @see org.alfresco.service.cmr.attributes.AttributeService#getKeys(java.lang.String) + * @see org.alfresco.service.cmr.attributes.AttributeService#query(java.util.List, org.alfresco.service.cmr.attributes.AttrQuery) */ - public List getKeys(String path) + public List> query(List keys, AttrQuery query) { - if (path == null) + if (keys == null || query == null) { - throw new AVMBadArgumentException("Null Attribute Path."); + throw new AVMBadArgumentException("Null argument."); } - List keys = parsePath(path); if (keys.size() == 0) { - return fGlobalAttributeEntryDAO.getKeys(); + throw new AVMBadArgumentException("Cannot query top level Attributes."); } GlobalAttributeEntry entry = fGlobalAttributeEntryDAO.get(keys.get(0)); if (entry == null) @@ -312,7 +328,55 @@ public class AttributeServiceImpl implements AttributeService throw new AVMWrongTypeException("Attribute Not Map: " + keys.get(i)); } } - return new ArrayList(current.keySet()); + List> rawResult = + fAttributeDAO.find((MapAttribute)current, query); + List> result = + new ArrayList>(); + for (Pair raw : rawResult) + { + result.add(new Pair(raw.getFirst(), + fAttributeConverter.toValue(raw.getSecond()))); + } + return result; + } + + /* (non-Javadoc) + * @see org.alfresco.service.cmr.attributes.AttributeService#removeAttribute(java.util.List, java.lang.String) + */ + public void removeAttribute(List keys, String name) + { + if (keys == null || name == null) + { + throw new AVMBadArgumentException("Null argument."); + } + if (keys.size() == 0) + { + fGlobalAttributeEntryDAO.delete(name); + return; + } + 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)); + } + } + current.remove(name); } } diff --git a/source/java/org/alfresco/repo/attributes/AttributeValue.java b/source/java/org/alfresco/repo/attributes/AttributeValue.java index 1cada24e15..a7b4ffcc6c 100644 --- a/source/java/org/alfresco/repo/attributes/AttributeValue.java +++ b/source/java/org/alfresco/repo/attributes/AttributeValue.java @@ -38,6 +38,23 @@ import org.alfresco.repo.domain.DbAccessControlList; */ public abstract class AttributeValue implements Attribute { + /** + * ACL for this Attribute + */ + private DbAccessControlList fACL; + + public AttributeValue() + { + } + + /** + * Helper for copy constructors. + */ + public AttributeValue(DbAccessControlList acl) + { + fACL = acl; + } + /* (non-Javadoc) * @see org.alfresco.repo.attributes.Attribute#clear() */ @@ -254,14 +271,12 @@ public abstract class AttributeValue implements Attribute throw new AttributeMethodNotImplemented("Not a map."); } - // I'm not sure if ACLs are serializable. So for now the following two - // methods are noops. /* (non-Javadoc) * @see org.alfresco.repo.attributes.Attribute#getAcl() */ public DbAccessControlList getAcl() { - return null; + return fACL; } /* (non-Javadoc) @@ -269,6 +284,6 @@ public abstract class AttributeValue implements Attribute */ public void setAcl(DbAccessControlList acl) { - // Do Nothing. + fACL = acl; } } diff --git a/source/java/org/alfresco/repo/attributes/BooleanAttributeImpl.java b/source/java/org/alfresco/repo/attributes/BooleanAttributeImpl.java index d030d8f7bf..520859c580 100644 --- a/source/java/org/alfresco/repo/attributes/BooleanAttributeImpl.java +++ b/source/java/org/alfresco/repo/attributes/BooleanAttributeImpl.java @@ -50,6 +50,7 @@ public class BooleanAttributeImpl extends AttributeImpl implements public BooleanAttributeImpl(BooleanAttribute attr) { + super(attr.getAcl()); fValue = attr.getBooleanValue(); AVMDAOs.Instance().fAttributeDAO.save(this); } diff --git a/source/java/org/alfresco/repo/attributes/BooleanAttributeValue.java b/source/java/org/alfresco/repo/attributes/BooleanAttributeValue.java index 5f7f4eb6bb..8ea2f2ce67 100644 --- a/source/java/org/alfresco/repo/attributes/BooleanAttributeValue.java +++ b/source/java/org/alfresco/repo/attributes/BooleanAttributeValue.java @@ -43,6 +43,7 @@ public class BooleanAttributeValue extends AttributeValue implements public BooleanAttributeValue(BooleanAttribute attr) { + super(attr.getAcl()); fData = attr.getBooleanValue(); } diff --git a/source/java/org/alfresco/repo/attributes/ByteAttributeImpl.java b/source/java/org/alfresco/repo/attributes/ByteAttributeImpl.java index 83fa5e096d..40786892f2 100644 --- a/source/java/org/alfresco/repo/attributes/ByteAttributeImpl.java +++ b/source/java/org/alfresco/repo/attributes/ByteAttributeImpl.java @@ -49,6 +49,7 @@ public class ByteAttributeImpl extends AttributeImpl implements ByteAttribute public ByteAttributeImpl(ByteAttribute attr) { + super(attr.getAcl()); fValue = attr.getByteValue(); AVMDAOs.Instance().fAttributeDAO.save(this); } diff --git a/source/java/org/alfresco/repo/attributes/ByteAttributeValue.java b/source/java/org/alfresco/repo/attributes/ByteAttributeValue.java index ea1dce3fc5..305e6dabab 100644 --- a/source/java/org/alfresco/repo/attributes/ByteAttributeValue.java +++ b/source/java/org/alfresco/repo/attributes/ByteAttributeValue.java @@ -42,6 +42,7 @@ public class ByteAttributeValue extends AttributeValue implements ByteAttribute public ByteAttributeValue(ByteAttribute attr) { + super(attr.getAcl()); fData = attr.getByteValue(); } diff --git a/source/java/org/alfresco/repo/attributes/DoubleAttributeImpl.java b/source/java/org/alfresco/repo/attributes/DoubleAttributeImpl.java index 3c7cfea703..8313a64043 100644 --- a/source/java/org/alfresco/repo/attributes/DoubleAttributeImpl.java +++ b/source/java/org/alfresco/repo/attributes/DoubleAttributeImpl.java @@ -49,6 +49,7 @@ public class DoubleAttributeImpl extends AttributeImpl implements Attribute public DoubleAttributeImpl(DoubleAttribute attr) { + super(attr.getAcl()); fValue = attr.getDoubleValue(); AVMDAOs.Instance().fAttributeDAO.save(this); } diff --git a/source/java/org/alfresco/repo/attributes/DoubleAttributeValue.java b/source/java/org/alfresco/repo/attributes/DoubleAttributeValue.java index 76fd5106e8..6d1361e6f3 100644 --- a/source/java/org/alfresco/repo/attributes/DoubleAttributeValue.java +++ b/source/java/org/alfresco/repo/attributes/DoubleAttributeValue.java @@ -43,6 +43,7 @@ public class DoubleAttributeValue extends AttributeValue implements public DoubleAttributeValue(DoubleAttribute attr) { + super(attr.getAcl()); fData = attr.getDoubleValue(); } diff --git a/source/java/org/alfresco/repo/attributes/FloatAttributeImpl.java b/source/java/org/alfresco/repo/attributes/FloatAttributeImpl.java index 6e4da18e16..641ee3073d 100644 --- a/source/java/org/alfresco/repo/attributes/FloatAttributeImpl.java +++ b/source/java/org/alfresco/repo/attributes/FloatAttributeImpl.java @@ -49,6 +49,7 @@ public class FloatAttributeImpl extends AttributeImpl implements FloatAttribute public FloatAttributeImpl(FloatAttribute attr) { + super(attr.getAcl()); fValue = attr.getFloatValue(); AVMDAOs.Instance().fAttributeDAO.save(this); } diff --git a/source/java/org/alfresco/repo/attributes/FloatAttributeValue.java b/source/java/org/alfresco/repo/attributes/FloatAttributeValue.java index 7651405831..cbf3ef9b3c 100644 --- a/source/java/org/alfresco/repo/attributes/FloatAttributeValue.java +++ b/source/java/org/alfresco/repo/attributes/FloatAttributeValue.java @@ -43,6 +43,7 @@ public class FloatAttributeValue extends AttributeValue implements public FloatAttributeValue(FloatAttribute attr) { + super(attr.getAcl()); fData = attr.getFloatValue(); } diff --git a/source/java/org/alfresco/repo/attributes/IntAttributeImpl.java b/source/java/org/alfresco/repo/attributes/IntAttributeImpl.java index 75e97ddb68..6d0cd2f7de 100644 --- a/source/java/org/alfresco/repo/attributes/IntAttributeImpl.java +++ b/source/java/org/alfresco/repo/attributes/IntAttributeImpl.java @@ -49,6 +49,7 @@ public class IntAttributeImpl extends AttributeImpl implements IntAttribute public IntAttributeImpl(IntAttribute attr) { + super(attr.getAcl()); fValue = attr.getIntValue(); AVMDAOs.Instance().fAttributeDAO.save(this); } diff --git a/source/java/org/alfresco/repo/attributes/IntAttributeValue.java b/source/java/org/alfresco/repo/attributes/IntAttributeValue.java index a1f12475da..c36ec81b72 100644 --- a/source/java/org/alfresco/repo/attributes/IntAttributeValue.java +++ b/source/java/org/alfresco/repo/attributes/IntAttributeValue.java @@ -42,6 +42,7 @@ public class IntAttributeValue extends AttributeValue implements IntAttribute public IntAttributeValue(IntAttribute attr) { + super(attr.getAcl()); fData = attr.getIntValue(); } diff --git a/source/java/org/alfresco/repo/attributes/LongAttributeImpl.java b/source/java/org/alfresco/repo/attributes/LongAttributeImpl.java index 3037d60037..b4db42b864 100644 --- a/source/java/org/alfresco/repo/attributes/LongAttributeImpl.java +++ b/source/java/org/alfresco/repo/attributes/LongAttributeImpl.java @@ -49,6 +49,7 @@ public class LongAttributeImpl extends AttributeImpl implements LongAttribute public LongAttributeImpl(LongAttribute attr) { + super(attr.getAcl()); fValue = attr.getLongValue(); AVMDAOs.Instance().fAttributeDAO.save(this); } diff --git a/source/java/org/alfresco/repo/attributes/LongAttributeValue.java b/source/java/org/alfresco/repo/attributes/LongAttributeValue.java index 39e7448bb8..1470061662 100644 --- a/source/java/org/alfresco/repo/attributes/LongAttributeValue.java +++ b/source/java/org/alfresco/repo/attributes/LongAttributeValue.java @@ -42,6 +42,7 @@ public class LongAttributeValue extends AttributeValue implements LongAttribute public LongAttributeValue(LongAttribute attr) { + super(attr.getAcl()); fData = attr.getLongValue(); } diff --git a/source/java/org/alfresco/repo/attributes/MapAttributeImpl.java b/source/java/org/alfresco/repo/attributes/MapAttributeImpl.java index 3b8fbea6ca..63542ad5bb 100644 --- a/source/java/org/alfresco/repo/attributes/MapAttributeImpl.java +++ b/source/java/org/alfresco/repo/attributes/MapAttributeImpl.java @@ -52,6 +52,7 @@ public class MapAttributeImpl extends AttributeImpl implements MapAttribute public MapAttributeImpl(MapAttribute attr) { + super(attr.getAcl()); AVMDAOs.Instance().fAttributeDAO.save(this); for (Map.Entry entry : attr.entrySet()) { diff --git a/source/java/org/alfresco/repo/attributes/MapAttributeValue.java b/source/java/org/alfresco/repo/attributes/MapAttributeValue.java index c889d5c3b1..49267c0f91 100644 --- a/source/java/org/alfresco/repo/attributes/MapAttributeValue.java +++ b/source/java/org/alfresco/repo/attributes/MapAttributeValue.java @@ -50,6 +50,7 @@ public class MapAttributeValue extends AttributeValue implements MapAttribute public MapAttributeValue(MapAttribute attr) { + super(attr.getAcl()); fData = new HashMap(); for (Map.Entry entry : attr.entrySet()) { diff --git a/source/java/org/alfresco/repo/attributes/SerializableAttributeImpl.java b/source/java/org/alfresco/repo/attributes/SerializableAttributeImpl.java index b3279aa5f8..05f15f6051 100644 --- a/source/java/org/alfresco/repo/attributes/SerializableAttributeImpl.java +++ b/source/java/org/alfresco/repo/attributes/SerializableAttributeImpl.java @@ -52,6 +52,7 @@ public class SerializableAttributeImpl extends AttributeImpl implements public SerializableAttributeImpl(SerializableAttribute attr) { + super(attr.getAcl()); fValue = attr.getSerializableValue(); AVMDAOs.Instance().fAttributeDAO.save(this); } diff --git a/source/java/org/alfresco/repo/attributes/SerializableAttributeValue.java b/source/java/org/alfresco/repo/attributes/SerializableAttributeValue.java index bcc4b28e0e..65cf0eda2f 100644 --- a/source/java/org/alfresco/repo/attributes/SerializableAttributeValue.java +++ b/source/java/org/alfresco/repo/attributes/SerializableAttributeValue.java @@ -45,6 +45,7 @@ public class SerializableAttributeValue extends AttributeValue implements public SerializableAttributeValue(SerializableAttribute attr) { + super(attr.getAcl()); fData = attr.getSerializableValue(); } diff --git a/source/java/org/alfresco/repo/attributes/ShortAttributeImpl.java b/source/java/org/alfresco/repo/attributes/ShortAttributeImpl.java index 7ec3c61120..88c73d902b 100644 --- a/source/java/org/alfresco/repo/attributes/ShortAttributeImpl.java +++ b/source/java/org/alfresco/repo/attributes/ShortAttributeImpl.java @@ -49,6 +49,7 @@ public class ShortAttributeImpl extends AttributeImpl implements ShortAttribute public ShortAttributeImpl(ShortAttribute attr) { + super(attr.getAcl()); fValue = attr.getShortValue(); AVMDAOs.Instance().fAttributeDAO.save(this); } diff --git a/source/java/org/alfresco/repo/attributes/ShortAttributeValue.java b/source/java/org/alfresco/repo/attributes/ShortAttributeValue.java index a94655ca5b..165fbd42e2 100644 --- a/source/java/org/alfresco/repo/attributes/ShortAttributeValue.java +++ b/source/java/org/alfresco/repo/attributes/ShortAttributeValue.java @@ -43,6 +43,7 @@ public class ShortAttributeValue extends AttributeValue implements public ShortAttributeValue(ShortAttribute attr) { + super(attr.getAcl()); fData = attr.getShortValue(); } diff --git a/source/java/org/alfresco/repo/attributes/StringAttributeImpl.java b/source/java/org/alfresco/repo/attributes/StringAttributeImpl.java index 27b1fab901..cbe23fc459 100644 --- a/source/java/org/alfresco/repo/attributes/StringAttributeImpl.java +++ b/source/java/org/alfresco/repo/attributes/StringAttributeImpl.java @@ -50,6 +50,7 @@ public class StringAttributeImpl extends AttributeImpl implements public StringAttributeImpl(StringAttribute attr) { + super(attr.getAcl()); fValue = attr.getStringValue(); AVMDAOs.Instance().fAttributeDAO.save(this); } diff --git a/source/java/org/alfresco/repo/attributes/StringAttributeValue.java b/source/java/org/alfresco/repo/attributes/StringAttributeValue.java index c248b812a5..3d5fd9f550 100644 --- a/source/java/org/alfresco/repo/attributes/StringAttributeValue.java +++ b/source/java/org/alfresco/repo/attributes/StringAttributeValue.java @@ -43,6 +43,7 @@ public class StringAttributeValue extends AttributeValue implements public StringAttributeValue(StringAttribute attr) { + super(attr.getAcl()); fData = attr.getStringValue(); } diff --git a/source/java/org/alfresco/service/cmr/attributes/AttributeService.java b/source/java/org/alfresco/service/cmr/attributes/AttributeService.java index 0e6c760d24..5e9e9f949f 100644 --- a/source/java/org/alfresco/service/cmr/attributes/AttributeService.java +++ b/source/java/org/alfresco/service/cmr/attributes/AttributeService.java @@ -37,27 +37,50 @@ import org.alfresco.util.Pair; public interface AttributeService { /** - * Get a Global Attribute. + * Get an Attribute. * @param path The path of the Attribute. * @return The value of the attribute or null. */ public Attribute getAttribute(String path); /** - * Set a Global Attribute. Overwrites if it exists. + * Get an attribute. + * @param keys The keys in the attribute path. + * @return The value of the attribute or null. + */ + public Attribute getAttribute(List keys); + + + /** + * Set an attribute. Overwrites if it exists. * @param name The name of the Attribute. * @param value The value to set. */ public void setAttribute(String path, String name, Attribute value); + /** + * Set an attribute + * @param keys List of attribute path keys. + * @param name The name of the attribute to set. + * @param value The Attribute to set. + */ + public void setAttribute(List keys, String name, Attribute value); + /** * Remove an Attribute. * @param name The name of the Attribute. */ public void removeAttribute(String path, String name); + + /** + * Remove an Attribute. + * @param keys List of attribute path keys. + * @param name The name of the attribute to remove. + */ + public void removeAttribute(List keys, String name); /** - * Query for a list of attributes which are contained in the container + * Query for a list of attributes which are contained in the map * defined by the given path and meet the query criteria. * @param path * @param query @@ -65,10 +88,26 @@ public interface AttributeService */ public List> query(String path, AttrQuery query); + /** + * Query for a list of attributes which are contained in a map defined by the + * given path and meet the query criteria. + * @param keys The list of attribute path keys. + * @param query + * @return A list of matching attributes. + */ + public List> query(List keys, 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); + + /** + * Get all the keys for a give attribute path. + * @param keys The keys of the attribute path. + * @return A list of all keys. + */ + public List getKeys(List keys); }