diff --git a/source/java/org/alfresco/repo/avm/AVMInterpreter.java b/source/java/org/alfresco/repo/avm/AVMInterpreter.java index 149fb3cc21..3f9f6007be 100644 --- a/source/java/org/alfresco/repo/avm/AVMInterpreter.java +++ b/source/java/org/alfresco/repo/avm/AVMInterpreter.java @@ -24,24 +24,16 @@ import java.io.InputStreamReader; import java.io.PrintStream; import java.io.InputStream; import java.io.OutputStream; -import java.io.Serializable; import java.util.Date; -import java.util.HashMap; import java.util.List; import java.util.Map; -import org.alfresco.model.ContentModel; import org.alfresco.repo.avm.util.BulkLoader; import org.alfresco.service.cmr.avm.AVMNodeDescriptor; import org.alfresco.service.cmr.avm.AVMService; import org.alfresco.service.cmr.avm.AVMStoreDescriptor; import org.alfresco.service.cmr.avm.VersionDescriptor; -import org.alfresco.service.cmr.repository.ChildAssociationRef; -import org.alfresco.service.cmr.repository.NodeRef; import org.alfresco.service.cmr.repository.NodeService; -import org.alfresco.service.cmr.repository.StoreRef; -import org.alfresco.service.namespace.NamespaceService; -import org.alfresco.service.namespace.QName; import org.apache.log4j.Logger; import org.springframework.context.support.FileSystemXmlApplicationContext; diff --git a/source/java/org/alfresco/repo/avm/AVMRemote.java b/source/java/org/alfresco/repo/avm/AVMRemote.java index 11254e6ee1..6588916e50 100644 --- a/source/java/org/alfresco/repo/avm/AVMRemote.java +++ b/source/java/org/alfresco/repo/avm/AVMRemote.java @@ -393,6 +393,21 @@ public interface AVMRemote */ public PropertyValue getStoreProperty(String store, QName name); + /** + * Query a store for keys that match a pattern. + * @param store The store name. + * @param keyPattern The sql 'like' pattern. + * @return A Map of keys to values. + */ + public Map queryStorePropertyKey(String store, QName keyPattern); + + /** + * Query all stores for keys that match a pattern. + * @param keyPattern The sql 'like' pattern. + * @return A Map of store names to Maps of matching keys to values. + */ + public Map> queryStoresPropertyKey(QName keyPattern); + /** * Get all the properties on a store. * @param store The name of the store. diff --git a/source/java/org/alfresco/repo/avm/AVMRemoteImpl.java b/source/java/org/alfresco/repo/avm/AVMRemoteImpl.java index c2d99b1ae4..a6cfc691bf 100644 --- a/source/java/org/alfresco/repo/avm/AVMRemoteImpl.java +++ b/source/java/org/alfresco/repo/avm/AVMRemoteImpl.java @@ -847,6 +847,27 @@ public class AVMRemoteImpl implements AVMRemote, Runnable return fAVMService.getStoreProperty(store, name); } + /** + * Query a store for keys that match a pattern. + * @param store The store name. + * @param keyPattern The sql 'like' pattern. + * @return A Map of keys to values. + */ + public Map queryStorePropertyKey(String store, QName keyPattern) + { + return fAVMService.queryStorePropertyKey(store, keyPattern); + } + + /** + * Query all stores for keys that match a pattern. + * @param keyPattern The sql 'like' pattern. + * @return A Map of store names to Maps of matching keys to values. + */ + public Map> queryStoresPropertyKey(QName keyPattern) + { + return fAVMService.queryStoresPropertyKeys(keyPattern); + } + /** * Get all the properties on a store. * @param store The name of the store. diff --git a/source/java/org/alfresco/repo/avm/AVMRepository.java b/source/java/org/alfresco/repo/avm/AVMRepository.java index 3e829dc2af..ae3c55452b 100644 --- a/source/java/org/alfresco/repo/avm/AVMRepository.java +++ b/source/java/org/alfresco/repo/avm/AVMRepository.java @@ -22,6 +22,7 @@ import java.io.InputStream; import java.io.OutputStream; import java.util.ArrayList; import java.util.Date; +import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.SortedMap; @@ -965,6 +966,51 @@ public class AVMRepository return getAVMStoreByName(store).getProperty(name); } + /** + * Queries a given store for properties with keys that match a given pattern. + * @param store The name of the store. + * @param keyPattern The sql 'like' pattern, inserted into a QName. + * @return A Map of the matching key value pairs. + */ + public Map queryStorePropertyKey(String store, QName keyPattern) + { + List matches = + AVMContext.fgInstance.fAVMStorePropertyDAO.queryByKeyPattern(getAVMStoreByName(store), + keyPattern); + Map results = new HashMap(); + for (AVMStoreProperty prop : matches) + { + results.put(prop.getName(), prop.getValue()); + } + return results; + } + + /** + * Queries all AVM stores for properties with keys that matcha given pattern. + * @param keyPattern The sql 'like' pattern, inserted into a QName. + * @return A List of Pairs of Store name, Map.Entry. + */ + public Map> + queryStoresPropertyKeys(QName keyPattern) + { + List matches = + AVMContext.fgInstance.fAVMStorePropertyDAO.queryByKeyPattern(keyPattern); + Map> results = + new HashMap>(); + for (AVMStoreProperty prop : matches) + { + String storeName = prop.getStore().getName(); + Map pairs = null; + if ((pairs = results.get(storeName)) == null) + { + pairs = new HashMap(); + results.put(storeName, pairs); + } + pairs.put(prop.getName(), prop.getValue()); + } + return results; + } + /** * Get all the properties for a store. * @param store The name of the Store. diff --git a/source/java/org/alfresco/repo/avm/AVMServiceImpl.java b/source/java/org/alfresco/repo/avm/AVMServiceImpl.java index 812f178b0e..cc0add4c82 100644 --- a/source/java/org/alfresco/repo/avm/AVMServiceImpl.java +++ b/source/java/org/alfresco/repo/avm/AVMServiceImpl.java @@ -840,6 +840,36 @@ public class AVMServiceImpl implements AVMService return fAVMRepository.getStoreProperty(store, name); } + /** + * Queries a given store for properties with keys that match a given pattern. + * @param store The name of the store. + * @param keyPattern The sql 'like' pattern, inserted into a QName. + * @return A Map of the matching key value pairs. + */ + public Map queryStorePropertyKey(String store, QName keyPattern) + { + if (store == null || keyPattern == null) + { + throw new AVMBadArgumentException("Illegal null argument."); + } + return fAVMRepository.queryStorePropertyKey(store, keyPattern); + } + + /** + * Queries all AVM stores for properties with keys that matcha given pattern. + * @param keyPattern The sql 'like' pattern, inserted into a QName. + * @return A List of Pairs of Store name, Map.Entry. + */ + public Map> + queryStoresPropertyKeys(QName keyPattern) + { + if (keyPattern == null) + { + throw new AVMBadArgumentException("Illegal null argument."); + } + return fAVMRepository.queryStoresPropertyKeys(keyPattern); + } + /** * Get all the properties associated with a store. * @param store The name of the store. diff --git a/source/java/org/alfresco/repo/avm/AVMServiceTest.java b/source/java/org/alfresco/repo/avm/AVMServiceTest.java index e4ecdc2504..b8ccccee14 100644 --- a/source/java/org/alfresco/repo/avm/AVMServiceTest.java +++ b/source/java/org/alfresco/repo/avm/AVMServiceTest.java @@ -2477,4 +2477,38 @@ public class AVMServiceTest extends AVMServiceTestBase fail(); } } + + /** + * Test Store property querying. + */ + public void testStorePropertyQuerying() + { + try + { + fService.setStoreProperty("main", QName.createQName(null, ".dns.alice--preview"), + new PropertyValue(null, "alice-preview")); + fService.setStoreProperty("main", QName.createQName("", ".other.property"), + new PropertyValue(null, "other value")); + Map result = + fService.queryStorePropertyKey("main", QName.createQName("", ".dns.%")); + assertEquals(1, result.size()); + fService.createAVMStore("second"); + fService.setStoreProperty("second", QName.createQName("", ".dns.alice"), + new PropertyValue(null, "alice-space")); + Map> matches = + fService.queryStoresPropertyKeys(QName.createQName("", ".dns.%")); + assertEquals(2, matches.size()); + assertEquals(1, matches.get("main").size()); + assertEquals(1, matches.get("second").size()); + assertEquals("alice-preview", matches.get("main").get(QName.createQName(null, + ".dns.alice--preview")).getStringValue()); + assertEquals("alice-space", matches.get("second").get(QName.createQName(null, ".dns.alice")). + getStringValue()); + } + catch (Exception e) + { + e.printStackTrace(System.err); + fail(); + } + } } diff --git a/source/java/org/alfresco/repo/avm/AVMStorePropertyDAO.java b/source/java/org/alfresco/repo/avm/AVMStorePropertyDAO.java index 0b3acd9715..6ce8ba7902 100644 --- a/source/java/org/alfresco/repo/avm/AVMStorePropertyDAO.java +++ b/source/java/org/alfresco/repo/avm/AVMStorePropertyDAO.java @@ -47,6 +47,21 @@ public interface AVMStorePropertyDAO * @return A List of properties associated with the store. */ public List get(AVMStore store); + + /** + * Query store properties by key pattern. + * @param store The store. + * @param keyPattern An sql 'like' pattern wrapped up in a QName + * @return A List of matching AVMStoreProperties. + */ + public List queryByKeyPattern(AVMStore store, QName keyPattern); + + /** + * Query all stores' properties by key pattern. + * @param keyPattern The sql 'like' pattern wrapped up in a QName + * @return A List of match AVMStoreProperties. + */ + public List queryByKeyPattern(QName keyPattern); /** * Update a modified property. diff --git a/source/java/org/alfresco/repo/avm/hibernate/AVMStorePropertyDAOHibernate.java b/source/java/org/alfresco/repo/avm/hibernate/AVMStorePropertyDAOHibernate.java index 00e794dfac..6243d28a3b 100644 --- a/source/java/org/alfresco/repo/avm/hibernate/AVMStorePropertyDAOHibernate.java +++ b/source/java/org/alfresco/repo/avm/hibernate/AVMStorePropertyDAOHibernate.java @@ -69,7 +69,41 @@ class AVMStorePropertyDAOHibernate extends HibernateDaoSupport implements AVMSto query.setEntity("store", store); return (List)query.list(); } - + + /** + * Query store properties by key pattern. + * @param store The store. + * @param keyPattern An sql 'like' pattern wrapped up in a QName + * @return A List of matching AVMStoreProperties. + */ + @SuppressWarnings("unchecked") + public List queryByKeyPattern(AVMStore store, QName keyPattern) + { + Query query = + getSession().createQuery( + "from AVMStorePropertyImpl asp " + + "where asp.store = :store and asp.name like :name"); + query.setEntity("store", store); + query.setParameter("name", keyPattern); + return (List)query.list(); + } + + /** + * Query all stores' properties by key pattern. + * @param keyPattern The sql 'like' pattern wrapped up in a QName + * @return A List of match AVMStoreProperties. + */ + @SuppressWarnings("unchecked") + public List queryByKeyPattern(QName keyPattern) + { + Query query = + getSession().createQuery( + "from AVMStorePropertyImpl asp " + + "where asp.name like :name"); + query.setParameter("name", keyPattern); + return (List)query.list(); + } + /** * Update a modified property. * @param prop The AVMStoreProperty to update. diff --git a/source/java/org/alfresco/service/cmr/avm/AVMService.java b/source/java/org/alfresco/service/cmr/avm/AVMService.java index d8c6d12db7..3b5b1d5722 100644 --- a/source/java/org/alfresco/service/cmr/avm/AVMService.java +++ b/source/java/org/alfresco/service/cmr/avm/AVMService.java @@ -584,6 +584,23 @@ public interface AVMService * does not exist. */ public Map getStoreProperties(String store); + + /** + * Queries a given store for properties with keys that match a given pattern. + * @param store The name of the store. + * @param keyPattern The sql 'like' pattern, inserted into a QName. + * @return A Map of the matching key value pairs. + */ + public Map queryStorePropertyKey(String store, QName keyPattern); + + /** + * Queries all AVM stores for properties with keys that matcha given pattern. + * @param keyPattern The sql 'like' pattern, inserted into a QName. + * @return A Map of store names to Maps of property key value pairs that match + * the pattern. + */ + public Map> + queryStoresPropertyKeys(QName keyPattern); /** * Delete a property on a store by name.