diff --git a/config/alfresco/public-services-context.xml b/config/alfresco/public-services-context.xml index 58734d5a27..379545fc92 100644 --- a/config/alfresco/public-services-context.xml +++ b/config/alfresco/public-services-context.xml @@ -994,7 +994,8 @@ setAttributes removeAttribute addAttribute - addAttributes + addAttributes + removeEntries diff --git a/source/java/org/alfresco/repo/attributes/AttributeDAO.java b/source/java/org/alfresco/repo/attributes/AttributeDAO.java index ca78b06a73..b7992e53c4 100644 --- a/source/java/org/alfresco/repo/attributes/AttributeDAO.java +++ b/source/java/org/alfresco/repo/attributes/AttributeDAO.java @@ -54,5 +54,12 @@ public interface AttributeDAO * @param query The AttrQuery. * @return A List of key, attribute value pairs. */ - List> find(MapAttribute map, AttrQuery query); + public List> find(MapAttribute map, AttrQuery query); + + /** + * Delete entries from a map that match the given query. + * @param map + * @param query + */ + public void delete(MapAttribute map, AttrQuery query); } diff --git a/source/java/org/alfresco/repo/attributes/AttributeServiceImpl.java b/source/java/org/alfresco/repo/attributes/AttributeServiceImpl.java index 47fee585be..9269a1d18e 100644 --- a/source/java/org/alfresco/repo/attributes/AttributeServiceImpl.java +++ b/source/java/org/alfresco/repo/attributes/AttributeServiceImpl.java @@ -420,6 +420,44 @@ public class AttributeServiceImpl implements AttributeService removeAttribute(keys, index); } + /* (non-Javadoc) + * @see org.alfresco.service.cmr.attributes.AttributeService#removeEntries(java.util.List, org.alfresco.service.cmr.attributes.AttrQuery) + */ + public void removeEntries(List keys, AttrQuery query) + { + if (keys == null || query == null) + { + throw new AVMBadArgumentException("Illegal null argument."); + } + if (keys.size() == 0) + { + throw new AVMBadArgumentException("Illegal zero length key path."); + } + Attribute map = getAttributeFromPath(keys); + if (map == null) + { + throw new AVMNotFoundException("Could not find attribute: " + keys); + } + if (map.getType() != Attribute.Type.MAP) + { + throw new AVMWrongTypeException("Not a map: " + keys); + } + fAttributeDAO.delete((MapAttribute)map, query); + } + + /* (non-Javadoc) + * @see org.alfresco.service.cmr.attributes.AttributeService#removeEntries(java.lang.String, org.alfresco.service.cmr.attributes.AttrQuery) + */ + public void removeEntries(String path, AttrQuery query) + { + if (path == null || query == null) + { + throw new AVMBadArgumentException("Illegal null argument."); + } + List keys = parsePath(path); + removeEntries(keys, query); + } + /* (non-Javadoc) * @see org.alfresco.service.cmr.attributes.AttributeService#setAttribute(java.util.List, int, org.alfresco.repo.attributes.Attribute) */ diff --git a/source/java/org/alfresco/repo/attributes/AttributeServiceTest.java b/source/java/org/alfresco/repo/attributes/AttributeServiceTest.java index 8691ad5c5f..38be9eef84 100644 --- a/source/java/org/alfresco/repo/attributes/AttributeServiceTest.java +++ b/source/java/org/alfresco/repo/attributes/AttributeServiceTest.java @@ -282,6 +282,9 @@ public class AttributeServiceTest extends TestCase assertEquals(25, fService.getKeys("map/submap/subsubmap").size()); fService.removeAttribute("map/submap", "subsubmap"); assertEquals(26, fService.getKeys("map/submap").size()); + fService.removeEntries("map/submap", new AttrAndQuery(new AttrQueryGTE("a"), + new AttrQueryLTE("d"))); + assertEquals(22, fService.getCount("map/submap")); } catch (Exception e) { diff --git a/source/java/org/alfresco/repo/attributes/AttributeServiceTransportService.java b/source/java/org/alfresco/repo/attributes/AttributeServiceTransportService.java index 6d72a934cd..2efbdfceef 100644 --- a/source/java/org/alfresco/repo/attributes/AttributeServiceTransportService.java +++ b/source/java/org/alfresco/repo/attributes/AttributeServiceTransportService.java @@ -280,4 +280,22 @@ public class AttributeServiceTransportService implements fAuthService.validate(ticket); fService.setAttributes(path, entries); } + + /* (non-Javadoc) + * @see org.alfresco.service.cmr.remote.AttributeServiceTransport#removeEntries(java.lang.String, java.util.List, org.alfresco.service.cmr.attributes.AttrQuery) + */ + public void removeEntries(String ticket, List keys, AttrQuery query) + { + fAuthService.validate(ticket); + fService.removeEntries(keys, query); + } + + /* (non-Javadoc) + * @see org.alfresco.service.cmr.remote.AttributeServiceTransport#removeEntries(java.lang.String, java.lang.String, org.alfresco.service.cmr.attributes.AttrQuery) + */ + public void removeEntries(String ticket, String path, AttrQuery query) + { + fAuthService.validate(ticket); + fService.removeEntries(path, query); + } } diff --git a/source/java/org/alfresco/repo/attributes/hibernate/AttributeDAOHibernate.java b/source/java/org/alfresco/repo/attributes/hibernate/AttributeDAOHibernate.java index be71de69d2..f9f2f40133 100644 --- a/source/java/org/alfresco/repo/attributes/hibernate/AttributeDAOHibernate.java +++ b/source/java/org/alfresco/repo/attributes/hibernate/AttributeDAOHibernate.java @@ -125,6 +125,18 @@ public class AttributeDAOHibernate extends HibernateDaoSupport implements return result; } + /* (non-Javadoc) + * @see org.alfresco.repo.attributes.AttributeDAO#delete(org.alfresco.repo.attributes.MapAttribute, org.alfresco.service.cmr.attributes.AttrQuery) + */ + public void delete(MapAttribute map, AttrQuery query) + { + List> result = find(map, query); + for (Pair entry : result) + { + map.remove(entry.getFirst()); + } + } + /* (non-Javadoc) * @see org.alfresco.repo.attributes.AttributeDAO#save(org.alfresco.repo.attributes.Attribute) */ diff --git a/source/java/org/alfresco/repo/remote/AttributeServiceRemote.java b/source/java/org/alfresco/repo/remote/AttributeServiceRemote.java index 2039170eb0..ec6dea7090 100644 --- a/source/java/org/alfresco/repo/remote/AttributeServiceRemote.java +++ b/source/java/org/alfresco/repo/remote/AttributeServiceRemote.java @@ -250,4 +250,20 @@ public class AttributeServiceRemote implements AttributeService { fTransport.setAttributes(fTicketHolder.getTicket(), path, entries); } + + /* (non-Javadoc) + * @see org.alfresco.service.cmr.attributes.AttributeService#removeEntries(java.util.List, org.alfresco.service.cmr.attributes.AttrQuery) + */ + public void removeEntries(List keys, AttrQuery query) + { + fTransport.removeEntries(fTicketHolder.getTicket(), keys, query); + } + + /* (non-Javadoc) + * @see org.alfresco.service.cmr.attributes.AttributeService#removeEntries(java.lang.String, org.alfresco.service.cmr.attributes.AttrQuery) + */ + public void removeEntries(String path, AttrQuery query) + { + fTransport.removeEntries(fTicketHolder.getTicket(), path, query); + } } diff --git a/source/java/org/alfresco/service/cmr/attributes/AttributeService.java b/source/java/org/alfresco/service/cmr/attributes/AttributeService.java index af8c79ed27..31333121ee 100644 --- a/source/java/org/alfresco/service/cmr/attributes/AttributeService.java +++ b/source/java/org/alfresco/service/cmr/attributes/AttributeService.java @@ -191,6 +191,20 @@ public interface AttributeService */ public void removeAttribute(List keys, int index); + /** + * Remove entries from the designated map which match the given query. + * @param keys The list of attribute path entries. + * @param query The attribute query. + */ + public void removeEntries(List keys, AttrQuery query); + + /** + * Remove entries from the designated map which match the given query. + * @param path The path to the map. + * @param query The attribute query. + */ + public void removeEntries(String path, AttrQuery query); + /** * Query for the list of attributes that is contained in the map * defined by the given path and meet the query criteria. diff --git a/source/java/org/alfresco/service/cmr/remote/AttributeServiceTransport.java b/source/java/org/alfresco/service/cmr/remote/AttributeServiceTransport.java index 7f74f2eaef..e6d709d387 100644 --- a/source/java/org/alfresco/service/cmr/remote/AttributeServiceTransport.java +++ b/source/java/org/alfresco/service/cmr/remote/AttributeServiceTransport.java @@ -231,4 +231,20 @@ public interface AttributeServiceTransport * @param entries */ public void setAttributes(String ticket, String path, Map entries); + + /** + * Remove entries from a map that match a query. + * @param ticket + * @param keys + * @param query + */ + public void removeEntries(String ticket, List keys, AttrQuery query); + + /** + * Remove entries from a map that match a query. + * @param ticket + * @param path + * @param query + */ + public void removeEntries(String ticket, String path, AttrQuery query); }