Enabled ACLs in Attributes. They are now readable and writable.

Added alternative calling convention versions of existing 
AttributeService methods.


git-svn-id: https://svn.alfresco.com/repos/alfresco-enterprise/alfresco/HEAD/root@5529 c4b6b30b-aa2e-2d43-bbcb-ca4b014f7261
This commit is contained in:
Britt Park
2007-04-23 20:56:40 +00:00
parent e9b75a288b
commit 95ff33e256
25 changed files with 227 additions and 79 deletions

View File

@@ -901,6 +901,7 @@
<list> <list>
<value>getAttributes</value> <value>getAttributes</value>
<value>query</value> <value>query</value>
<value>getKeys</value>
</list> </list>
</property> </property>
</bean> </bean>

View File

@@ -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) public void setId(long id)
{ {
fID = id; fID = id;

View File

@@ -77,29 +77,7 @@ public class AttributeServiceImpl implements AttributeService
throw new AVMBadArgumentException("Null path."); throw new AVMBadArgumentException("Null path.");
} }
List<String> keys = parsePath(path); List<String> keys = parsePath(path);
if (keys.size() < 1) return getAttribute(keys);
{
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);
} }
/** /**
@@ -153,42 +131,7 @@ public class AttributeServiceImpl implements AttributeService
throw new AVMBadArgumentException("Null Attribute Path."); throw new AVMBadArgumentException("Null Attribute Path.");
} }
List<String> keys = parsePath(path); List<String> keys = parsePath(path);
if (keys.size() == 0) return query(keys, query);
{
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<Pair<String, Attribute>> rawResult =
fAttributeDAO.find((MapAttribute)current, query);
List<Pair<String, Attribute>> result =
new ArrayList<Pair<String, Attribute>>();
for (Pair<String, Attribute> raw : rawResult)
{
result.add(new Pair<String, Attribute>(raw.getFirst(),
fAttributeConverter.toValue(raw.getSecond())));
}
return result;
} }
/* (non-Javadoc) /* (non-Javadoc)
@@ -201,10 +144,81 @@ public class AttributeServiceImpl implements AttributeService
throw new AVMBadArgumentException("Null Attribute Path."); throw new AVMBadArgumentException("Null Attribute Path.");
} }
List<String> keys = parsePath(path); List<String> 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<String> keys = parsePath(path);
setAttribute(keys, name, value);
}
/* (non-Javadoc)
* @see org.alfresco.service.cmr.attributes.AttributeService#getKeys(java.lang.String)
*/
public List<String> getKeys(String path)
{
if (path == null)
{
throw new AVMBadArgumentException("Null Attribute Path.");
}
List<String> keys = parsePath(path);
return getKeys(keys);
}
/* (non-Javadoc)
* @see org.alfresco.service.cmr.attributes.AttributeService#getAttribute(java.util.List)
*/
public Attribute getAttribute(List<String> 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<String> getKeys(List<String> keys)
{
if (keys == null)
{
throw new AVMBadArgumentException("Null Keys List.");
}
if (keys.size() == 0) if (keys.size() == 0)
{ {
fGlobalAttributeEntryDAO.delete(name); return fGlobalAttributeEntryDAO.getKeys();
return;
} }
GlobalAttributeEntry entry = fGlobalAttributeEntryDAO.get(keys.get(0)); GlobalAttributeEntry entry = fGlobalAttributeEntryDAO.get(keys.get(0));
if (entry == null) if (entry == null)
@@ -228,15 +242,18 @@ public class AttributeServiceImpl implements AttributeService
throw new AVMWrongTypeException("Attribute Not Map: " + keys.get(i)); throw new AVMWrongTypeException("Attribute Not Map: " + keys.get(i));
} }
} }
current.remove(name); return new ArrayList<String>(current.keySet());
} }
/* (non-Javadoc) /* (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<String> keys, String name, Attribute value)
{ {
List<String> keys = parsePath(path); if (keys == null || name == null || value == null)
{
throw new AVMBadArgumentException("Null argument.");
}
Attribute toSave = fAttributeConverter.toPersistent(value); Attribute toSave = fAttributeConverter.toPersistent(value);
if (keys.size() == 0) if (keys.size() == 0)
{ {
@@ -277,18 +294,17 @@ public class AttributeServiceImpl implements AttributeService
} }
/* (non-Javadoc) /* (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<String> getKeys(String path) public List<Pair<String, Attribute>> query(List<String> keys, AttrQuery query)
{ {
if (path == null) if (keys == null || query == null)
{ {
throw new AVMBadArgumentException("Null Attribute Path."); throw new AVMBadArgumentException("Null argument.");
} }
List<String> keys = parsePath(path);
if (keys.size() == 0) if (keys.size() == 0)
{ {
return fGlobalAttributeEntryDAO.getKeys(); throw new AVMBadArgumentException("Cannot query top level Attributes.");
} }
GlobalAttributeEntry entry = fGlobalAttributeEntryDAO.get(keys.get(0)); GlobalAttributeEntry entry = fGlobalAttributeEntryDAO.get(keys.get(0));
if (entry == null) if (entry == null)
@@ -312,7 +328,55 @@ public class AttributeServiceImpl implements AttributeService
throw new AVMWrongTypeException("Attribute Not Map: " + keys.get(i)); throw new AVMWrongTypeException("Attribute Not Map: " + keys.get(i));
} }
} }
return new ArrayList<String>(current.keySet()); List<Pair<String, Attribute>> rawResult =
fAttributeDAO.find((MapAttribute)current, query);
List<Pair<String, Attribute>> result =
new ArrayList<Pair<String, Attribute>>();
for (Pair<String, Attribute> raw : rawResult)
{
result.add(new Pair<String, Attribute>(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<String> 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);
} }
} }

View File

@@ -38,6 +38,23 @@ import org.alfresco.repo.domain.DbAccessControlList;
*/ */
public abstract class AttributeValue implements Attribute 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) /* (non-Javadoc)
* @see org.alfresco.repo.attributes.Attribute#clear() * @see org.alfresco.repo.attributes.Attribute#clear()
*/ */
@@ -254,14 +271,12 @@ public abstract class AttributeValue implements Attribute
throw new AttributeMethodNotImplemented("Not a map."); 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) /* (non-Javadoc)
* @see org.alfresco.repo.attributes.Attribute#getAcl() * @see org.alfresco.repo.attributes.Attribute#getAcl()
*/ */
public DbAccessControlList getAcl() public DbAccessControlList getAcl()
{ {
return null; return fACL;
} }
/* (non-Javadoc) /* (non-Javadoc)
@@ -269,6 +284,6 @@ public abstract class AttributeValue implements Attribute
*/ */
public void setAcl(DbAccessControlList acl) public void setAcl(DbAccessControlList acl)
{ {
// Do Nothing. fACL = acl;
} }
} }

View File

@@ -50,6 +50,7 @@ public class BooleanAttributeImpl extends AttributeImpl implements
public BooleanAttributeImpl(BooleanAttribute attr) public BooleanAttributeImpl(BooleanAttribute attr)
{ {
super(attr.getAcl());
fValue = attr.getBooleanValue(); fValue = attr.getBooleanValue();
AVMDAOs.Instance().fAttributeDAO.save(this); AVMDAOs.Instance().fAttributeDAO.save(this);
} }

View File

@@ -43,6 +43,7 @@ public class BooleanAttributeValue extends AttributeValue implements
public BooleanAttributeValue(BooleanAttribute attr) public BooleanAttributeValue(BooleanAttribute attr)
{ {
super(attr.getAcl());
fData = attr.getBooleanValue(); fData = attr.getBooleanValue();
} }

View File

@@ -49,6 +49,7 @@ public class ByteAttributeImpl extends AttributeImpl implements ByteAttribute
public ByteAttributeImpl(ByteAttribute attr) public ByteAttributeImpl(ByteAttribute attr)
{ {
super(attr.getAcl());
fValue = attr.getByteValue(); fValue = attr.getByteValue();
AVMDAOs.Instance().fAttributeDAO.save(this); AVMDAOs.Instance().fAttributeDAO.save(this);
} }

View File

@@ -42,6 +42,7 @@ public class ByteAttributeValue extends AttributeValue implements ByteAttribute
public ByteAttributeValue(ByteAttribute attr) public ByteAttributeValue(ByteAttribute attr)
{ {
super(attr.getAcl());
fData = attr.getByteValue(); fData = attr.getByteValue();
} }

View File

@@ -49,6 +49,7 @@ public class DoubleAttributeImpl extends AttributeImpl implements Attribute
public DoubleAttributeImpl(DoubleAttribute attr) public DoubleAttributeImpl(DoubleAttribute attr)
{ {
super(attr.getAcl());
fValue = attr.getDoubleValue(); fValue = attr.getDoubleValue();
AVMDAOs.Instance().fAttributeDAO.save(this); AVMDAOs.Instance().fAttributeDAO.save(this);
} }

View File

@@ -43,6 +43,7 @@ public class DoubleAttributeValue extends AttributeValue implements
public DoubleAttributeValue(DoubleAttribute attr) public DoubleAttributeValue(DoubleAttribute attr)
{ {
super(attr.getAcl());
fData = attr.getDoubleValue(); fData = attr.getDoubleValue();
} }

View File

@@ -49,6 +49,7 @@ public class FloatAttributeImpl extends AttributeImpl implements FloatAttribute
public FloatAttributeImpl(FloatAttribute attr) public FloatAttributeImpl(FloatAttribute attr)
{ {
super(attr.getAcl());
fValue = attr.getFloatValue(); fValue = attr.getFloatValue();
AVMDAOs.Instance().fAttributeDAO.save(this); AVMDAOs.Instance().fAttributeDAO.save(this);
} }

View File

@@ -43,6 +43,7 @@ public class FloatAttributeValue extends AttributeValue implements
public FloatAttributeValue(FloatAttribute attr) public FloatAttributeValue(FloatAttribute attr)
{ {
super(attr.getAcl());
fData = attr.getFloatValue(); fData = attr.getFloatValue();
} }

View File

@@ -49,6 +49,7 @@ public class IntAttributeImpl extends AttributeImpl implements IntAttribute
public IntAttributeImpl(IntAttribute attr) public IntAttributeImpl(IntAttribute attr)
{ {
super(attr.getAcl());
fValue = attr.getIntValue(); fValue = attr.getIntValue();
AVMDAOs.Instance().fAttributeDAO.save(this); AVMDAOs.Instance().fAttributeDAO.save(this);
} }

View File

@@ -42,6 +42,7 @@ public class IntAttributeValue extends AttributeValue implements IntAttribute
public IntAttributeValue(IntAttribute attr) public IntAttributeValue(IntAttribute attr)
{ {
super(attr.getAcl());
fData = attr.getIntValue(); fData = attr.getIntValue();
} }

View File

@@ -49,6 +49,7 @@ public class LongAttributeImpl extends AttributeImpl implements LongAttribute
public LongAttributeImpl(LongAttribute attr) public LongAttributeImpl(LongAttribute attr)
{ {
super(attr.getAcl());
fValue = attr.getLongValue(); fValue = attr.getLongValue();
AVMDAOs.Instance().fAttributeDAO.save(this); AVMDAOs.Instance().fAttributeDAO.save(this);
} }

View File

@@ -42,6 +42,7 @@ public class LongAttributeValue extends AttributeValue implements LongAttribute
public LongAttributeValue(LongAttribute attr) public LongAttributeValue(LongAttribute attr)
{ {
super(attr.getAcl());
fData = attr.getLongValue(); fData = attr.getLongValue();
} }

View File

@@ -52,6 +52,7 @@ public class MapAttributeImpl extends AttributeImpl implements MapAttribute
public MapAttributeImpl(MapAttribute attr) public MapAttributeImpl(MapAttribute attr)
{ {
super(attr.getAcl());
AVMDAOs.Instance().fAttributeDAO.save(this); AVMDAOs.Instance().fAttributeDAO.save(this);
for (Map.Entry<String, Attribute> entry : attr.entrySet()) for (Map.Entry<String, Attribute> entry : attr.entrySet())
{ {

View File

@@ -50,6 +50,7 @@ public class MapAttributeValue extends AttributeValue implements MapAttribute
public MapAttributeValue(MapAttribute attr) public MapAttributeValue(MapAttribute attr)
{ {
super(attr.getAcl());
fData = new HashMap<String, Attribute>(); fData = new HashMap<String, Attribute>();
for (Map.Entry<String, Attribute> entry : attr.entrySet()) for (Map.Entry<String, Attribute> entry : attr.entrySet())
{ {

View File

@@ -52,6 +52,7 @@ public class SerializableAttributeImpl extends AttributeImpl implements
public SerializableAttributeImpl(SerializableAttribute attr) public SerializableAttributeImpl(SerializableAttribute attr)
{ {
super(attr.getAcl());
fValue = attr.getSerializableValue(); fValue = attr.getSerializableValue();
AVMDAOs.Instance().fAttributeDAO.save(this); AVMDAOs.Instance().fAttributeDAO.save(this);
} }

View File

@@ -45,6 +45,7 @@ public class SerializableAttributeValue extends AttributeValue implements
public SerializableAttributeValue(SerializableAttribute attr) public SerializableAttributeValue(SerializableAttribute attr)
{ {
super(attr.getAcl());
fData = attr.getSerializableValue(); fData = attr.getSerializableValue();
} }

View File

@@ -49,6 +49,7 @@ public class ShortAttributeImpl extends AttributeImpl implements ShortAttribute
public ShortAttributeImpl(ShortAttribute attr) public ShortAttributeImpl(ShortAttribute attr)
{ {
super(attr.getAcl());
fValue = attr.getShortValue(); fValue = attr.getShortValue();
AVMDAOs.Instance().fAttributeDAO.save(this); AVMDAOs.Instance().fAttributeDAO.save(this);
} }

View File

@@ -43,6 +43,7 @@ public class ShortAttributeValue extends AttributeValue implements
public ShortAttributeValue(ShortAttribute attr) public ShortAttributeValue(ShortAttribute attr)
{ {
super(attr.getAcl());
fData = attr.getShortValue(); fData = attr.getShortValue();
} }

View File

@@ -50,6 +50,7 @@ public class StringAttributeImpl extends AttributeImpl implements
public StringAttributeImpl(StringAttribute attr) public StringAttributeImpl(StringAttribute attr)
{ {
super(attr.getAcl());
fValue = attr.getStringValue(); fValue = attr.getStringValue();
AVMDAOs.Instance().fAttributeDAO.save(this); AVMDAOs.Instance().fAttributeDAO.save(this);
} }

View File

@@ -43,6 +43,7 @@ public class StringAttributeValue extends AttributeValue implements
public StringAttributeValue(StringAttribute attr) public StringAttributeValue(StringAttribute attr)
{ {
super(attr.getAcl());
fData = attr.getStringValue(); fData = attr.getStringValue();
} }

View File

@@ -37,19 +37,35 @@ import org.alfresco.util.Pair;
public interface AttributeService public interface AttributeService
{ {
/** /**
* Get a Global Attribute. * Get an Attribute.
* @param path The path of the Attribute. * @param path The path of the Attribute.
* @return The value of the attribute or null. * @return The value of the attribute or null.
*/ */
public Attribute getAttribute(String path); 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<String> keys);
/**
* Set an attribute. Overwrites if it exists.
* @param name The name of the Attribute. * @param name The name of the Attribute.
* @param value The value to set. * @param value The value to set.
*/ */
public void setAttribute(String path, String name, Attribute value); 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<String> keys, String name, Attribute value);
/** /**
* Remove an Attribute. * Remove an Attribute.
* @param name The name of the Attribute. * @param name The name of the Attribute.
@@ -57,7 +73,14 @@ public interface AttributeService
public void removeAttribute(String path, String name); public void removeAttribute(String path, String name);
/** /**
* Query for a list of attributes which are contained in the container * Remove an Attribute.
* @param keys List of attribute path keys.
* @param name The name of the attribute to remove.
*/
public void removeAttribute(List<String> keys, String name);
/**
* Query for a list of attributes which are contained in the map
* defined by the given path and meet the query criteria. * defined by the given path and meet the query criteria.
* @param path * @param path
* @param query * @param query
@@ -65,10 +88,26 @@ public interface AttributeService
*/ */
public List<Pair<String, Attribute>> query(String path, AttrQuery query); public List<Pair<String, Attribute>> 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<Pair<String, Attribute>> query(List<String> keys, AttrQuery query);
/** /**
* Get all the keys for a given attribute path. * Get all the keys for a given attribute path.
* @param path The attribute path. * @param path The attribute path.
* @return A list of all keys. * @return A list of all keys.
*/ */
public List<String> getKeys(String path); public List<String> 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<String> getKeys(List<String> keys);
} }