FELIX-3777:

- let the RoleRepositoryStore use a filter string instead of a Filter implementation.



git-svn-id: https://svn.apache.org/repos/asf/felix/trunk@1412590 13f79535-47bb-0310-9956-ffa450edef68
diff --git a/useradmin/filestore/src/main/java/org/apache/felix/useradmin/filestore/RoleRepositoryMemoryStore.java b/useradmin/filestore/src/main/java/org/apache/felix/useradmin/filestore/RoleRepositoryMemoryStore.java
index c89ecdb..291b15a 100644
--- a/useradmin/filestore/src/main/java/org/apache/felix/useradmin/filestore/RoleRepositoryMemoryStore.java
+++ b/useradmin/filestore/src/main/java/org/apache/felix/useradmin/filestore/RoleRepositoryMemoryStore.java
@@ -26,6 +26,8 @@
 import org.apache.felix.useradmin.RoleFactory;
 import org.apache.felix.useradmin.RoleRepositoryStore;
 import org.osgi.framework.Filter;
+import org.osgi.framework.FrameworkUtil;
+import org.osgi.framework.InvalidSyntaxException;
 import org.osgi.service.useradmin.Role;
 
 
@@ -45,9 +47,14 @@
         return (result == null) ? role : null;
     }
 
-    public Role[] getRoles(Filter filter) {
+    public Role[] getRoles(String filterValue) throws InvalidSyntaxException {
         Collection roles = m_entries.values();
-        
+
+        Filter filter = null;
+        if (filterValue != null) {
+            filter = FrameworkUtil.createFilter(filterValue);
+        }
+
         List matchingRoles = new ArrayList();
         Iterator rolesIter = roles.iterator();
         while (rolesIter.hasNext()) {
diff --git a/useradmin/mongodb/src/main/java/org/apache/felix/useradmin/mongodb/MongoDBStore.java b/useradmin/mongodb/src/main/java/org/apache/felix/useradmin/mongodb/MongoDBStore.java
index 8761ea6..1e66bff 100644
--- a/useradmin/mongodb/src/main/java/org/apache/felix/useradmin/mongodb/MongoDBStore.java
+++ b/useradmin/mongodb/src/main/java/org/apache/felix/useradmin/mongodb/MongoDBStore.java
@@ -26,6 +26,8 @@
 
 import org.apache.felix.useradmin.RoleRepositoryStore;
 import org.osgi.framework.Filter;
+import org.osgi.framework.FrameworkUtil;
+import org.osgi.framework.InvalidSyntaxException;
 import org.osgi.service.cm.ConfigurationException;
 import org.osgi.service.cm.ManagedService;
 import org.osgi.service.log.LogService;
@@ -160,15 +162,24 @@
     }
 
     @Override
-    public Role[] getRoles(Filter filter) throws MongoException {
+    public Role[] getRoles(String filterValue) throws InvalidSyntaxException, MongoException {
         List<Role> roles = new ArrayList<Role>();
-        
+
+        Filter filter = null;
+        if (filterValue != null) {
+            filter = FrameworkUtil.createFilter(filterValue);
+        }
+
         DBCollection coll = getCollection();
 
         DBCursor cursor = coll.find();
         try {
             while (cursor.hasNext()) {
-                roles.add(m_helper.deserialize(cursor.next()));
+                // Hmm, there might be a more clever way of doing this...
+                Role role = m_helper.deserialize(cursor.next());
+                if ((filter == null) || filter.match(role.getProperties())) {
+                    roles.add(role);
+                }
             }
         } finally {
             cursor.close();
diff --git a/useradmin/useradmin/src/main/java/org/apache/felix/useradmin/RoleRepositoryStore.java b/useradmin/useradmin/src/main/java/org/apache/felix/useradmin/RoleRepositoryStore.java
index 365e273..f32e5de 100644
--- a/useradmin/useradmin/src/main/java/org/apache/felix/useradmin/RoleRepositoryStore.java
+++ b/useradmin/useradmin/src/main/java/org/apache/felix/useradmin/RoleRepositoryStore.java
@@ -16,7 +16,6 @@
  */
 package org.apache.felix.useradmin;
 
-import org.osgi.framework.Filter;
 import org.osgi.service.useradmin.Role;
 
 /**
@@ -49,11 +48,11 @@
     /**
      * Returns all roles in this backend matching the given filter criteria.
      * 
-     * @param filter the optional filter to apply, can be <code>null</code> in which case all roles are to be returned.
+     * @param filter the (optional) filter to apply, can be <code>null</code> in which case all roles will be returned.
      * @return an array with all roles, never <code>null</code>, but can be empty.
      * @throws Exception in case of problems retrieving the set of roles.
      */
-    Role[] getRoles(Filter filter) throws Exception;
+    Role[] getRoles(String filter) throws Exception;
 
     /**
      * Returns a {@link Role} by its name.
diff --git a/useradmin/useradmin/src/main/java/org/apache/felix/useradmin/impl/RoleRepository.java b/useradmin/useradmin/src/main/java/org/apache/felix/useradmin/impl/RoleRepository.java
index 54c8f80..cf49c04 100644
--- a/useradmin/useradmin/src/main/java/org/apache/felix/useradmin/impl/RoleRepository.java
+++ b/useradmin/useradmin/src/main/java/org/apache/felix/useradmin/impl/RoleRepository.java
@@ -25,8 +25,6 @@
 import org.apache.felix.useradmin.RoleFactory;
 import org.apache.felix.useradmin.RoleRepositoryStore;
 import org.apache.felix.useradmin.impl.role.ObservableRole;
-import org.osgi.framework.Filter;
-import org.osgi.framework.FrameworkUtil;
 import org.osgi.service.useradmin.Group;
 import org.osgi.service.useradmin.Role;
 import org.osgi.service.useradmin.UserAdminPermission;
@@ -181,11 +179,11 @@
      * @param filter the filter to match the individual roles against, can be <code>null</code> if all roles should be returned.
      * @return a list with all matching roles, can be empty, but never <code>null</code>.
      */
-    public List getRoles(Filter filter) {
+    public List getRoles(String filter) {
         List matchingRoles = new ArrayList();
 
         try {
-            Role[] roles = m_store.getRoles(filter);
+            Role[] roles = m_store.getRoles(sanitizeFilter(filter));
             for (int i = 0; i < roles.length; i++) {
                 Role role = roles[i];
                 if (!isPredefinedRole(role.getName())) {
@@ -219,9 +217,8 @@
 
         try {
             String criteria = "(".concat(key).concat("=").concat(value).concat(")");
-            Filter filter = FrameworkUtil.createFilter(criteria);
 
-            Role[] roles = m_store.getRoles(filter);
+            Role[] roles = m_store.getRoles(criteria);
             for (int i = 0; i < roles.length; i++) {
                 Role role = roles[i];
                 if (!isPredefinedRole(role.getName())) {
@@ -354,6 +351,19 @@
             throw new BackendException("Failed to get all roles!", e);
         }
 	}
+	
+	/**
+	 * Sanitizes the given filter string.
+	 * 
+	 * @param filter the filter string to sanitize, can be <code>null</code>.
+	 * @return the sanitized filter, or <code>null</code> if the given filter was <code>null</code> or empty.
+	 */
+	private String sanitizeFilter(String filter) {
+	    if (filter == null || "".equals(filter.trim())) {
+	        return null;
+	    }
+	    return filter.trim();
+	}
 
     /**
      * Unwires the given role to this repository so it no longer listens for its changes.
diff --git a/useradmin/useradmin/src/main/java/org/apache/felix/useradmin/impl/UserAdminImpl.java b/useradmin/useradmin/src/main/java/org/apache/felix/useradmin/impl/UserAdminImpl.java
index dce1081..4f105ee 100644
--- a/useradmin/useradmin/src/main/java/org/apache/felix/useradmin/impl/UserAdminImpl.java
+++ b/useradmin/useradmin/src/main/java/org/apache/felix/useradmin/impl/UserAdminImpl.java
@@ -20,7 +20,6 @@
 import java.util.List;
 
 import org.osgi.framework.Bundle;
-import org.osgi.framework.Filter;
 import org.osgi.framework.FrameworkUtil;
 import org.osgi.framework.InvalidSyntaxException;
 import org.osgi.framework.ServiceFactory;
@@ -89,7 +88,12 @@
      * {@inheritDoc}
      */
     public Role[] getRoles(String filter) throws InvalidSyntaxException {
-        List roles = m_roleRepository.getRoles(createFilter(filter));
+        // Do a sanity check on the given filter...
+        if (filter != null && !"".equals(filter.trim())) {
+            FrameworkUtil.createFilter(filter);
+        }
+
+        List roles = m_roleRepository.getRoles(filter);
         if (roles.isEmpty()) {
             return null;
         }
@@ -169,20 +173,6 @@
     public void ungetService(Bundle bundle, ServiceRegistration registration, Object service) {
         // Nop; we leave the service as-is...
     }
-    
-    /**
-     * Creates a {@link Filter} instance for the given OSGi/LDAP filter.
-     * 
-     * @param filter the filter to convert to a {@link Filter} instance.
-     * @return a {@link Filter} instance corresponding to the given filter string, never <code>null</code>.
-     * @throws InvalidSyntaxException in case the given filter was invalid.
-     */
-    protected Filter createFilter(String filter) throws InvalidSyntaxException {
-        if (filter == null || "".equals(filter.trim())) {
-            return null;
-        }
-        return FrameworkUtil.createFilter(filter);
-    }
 
     /**
      * Creates a new {@link UserAdminEvent} instance for the given type and role.
diff --git a/useradmin/useradmin/src/main/java/org/apache/felix/useradmin/osgi/RoleRepositoryStoreHelper.java b/useradmin/useradmin/src/main/java/org/apache/felix/useradmin/osgi/RoleRepositoryStoreHelper.java
index 26cde1a..e7af265 100644
--- a/useradmin/useradmin/src/main/java/org/apache/felix/useradmin/osgi/RoleRepositoryStoreHelper.java
+++ b/useradmin/useradmin/src/main/java/org/apache/felix/useradmin/osgi/RoleRepositoryStoreHelper.java
@@ -18,7 +18,6 @@
 
 import org.apache.felix.useradmin.RoleRepositoryStore;
 import org.osgi.framework.BundleContext;
-import org.osgi.framework.Filter;
 import org.osgi.service.useradmin.Role;
 import org.osgi.util.tracker.ServiceTracker;
 
@@ -49,7 +48,7 @@
         return null;
     }
 
-    public Role[] getRoles(Filter filter) throws Exception {
+    public Role[] getRoles(String filter) throws Exception {
         RoleRepositoryStore store = getStore();
         if (store != null) {
             return store.getRoles(filter);
diff --git a/useradmin/useradmin/src/test/java/org/apache/felix/useradmin/impl/CustomRoleImplTest.java b/useradmin/useradmin/src/test/java/org/apache/felix/useradmin/impl/CustomRoleImplTest.java
index ef4ae15..155084e 100644
--- a/useradmin/useradmin/src/test/java/org/apache/felix/useradmin/impl/CustomRoleImplTest.java
+++ b/useradmin/useradmin/src/test/java/org/apache/felix/useradmin/impl/CustomRoleImplTest.java
@@ -34,6 +34,7 @@
 
 import org.apache.felix.useradmin.RoleRepositoryStore;
 import org.osgi.framework.Filter;
+import org.osgi.framework.FrameworkUtil;
 import org.osgi.service.useradmin.Group;
 import org.osgi.service.useradmin.Role;
 import org.osgi.service.useradmin.User;
@@ -130,19 +131,20 @@
             return (result == null) ? role : null;
         }
 
-        public void close() throws IOException {
-            // Nop
-        }
-
-        public Role getRoleByName(String roleName) throws IOException {
+        public Role getRoleByName(String roleName) throws Exception {
             if (roleName == null) {
                 throw new IllegalArgumentException("Role name cannot be null!");
             }
             return (Role) m_entries.get(roleName);
         }
 
-        public Role[] getRoles(Filter filter) throws IOException {
+        public Role[] getRoles(String filterValue) throws Exception {
             Collection roles = m_entries.values();
+
+            Filter filter = null;
+            if (filterValue != null) {
+                filter = FrameworkUtil.createFilter(filterValue);
+            }
             
             List matchingRoles = new ArrayList();
             Iterator rolesIter = roles.iterator();
@@ -156,12 +158,8 @@
             Role[] result = new Role[matchingRoles.size()];
             return (Role[]) matchingRoles.toArray(result);
         }
-        
-        public void initialize() throws IOException {
-            // Nop
-        }
 
-        public Role removeRole(String roleName) throws IOException {
+        public Role removeRole(String roleName) throws Exception {
             if (roleName == null) {
                 throw new IllegalArgumentException("Name cannot be null!");
             }
diff --git a/useradmin/useradmin/src/test/java/org/apache/felix/useradmin/impl/MemoryRoleRepositoryStore.java b/useradmin/useradmin/src/test/java/org/apache/felix/useradmin/impl/MemoryRoleRepositoryStore.java
index 80a4f50..cbdd6f4 100644
--- a/useradmin/useradmin/src/test/java/org/apache/felix/useradmin/impl/MemoryRoleRepositoryStore.java
+++ b/useradmin/useradmin/src/test/java/org/apache/felix/useradmin/impl/MemoryRoleRepositoryStore.java
@@ -16,7 +16,6 @@
  */
 package org.apache.felix.useradmin.impl;
 
-import java.io.IOException;
 import java.util.ArrayList;
 import java.util.Collection;
 import java.util.Iterator;
@@ -27,6 +26,7 @@
 import org.apache.felix.useradmin.RoleFactory;
 import org.apache.felix.useradmin.RoleRepositoryStore;
 import org.osgi.framework.Filter;
+import org.osgi.framework.FrameworkUtil;
 import org.osgi.service.useradmin.Role;
 
 
@@ -37,7 +37,7 @@
     
     private final ConcurrentMap m_entries = new ConcurrentHashMap();
 
-    public Role addRole(String roleName, int type) throws IOException {
+    public Role addRole(String roleName, int type) throws Exception {
         if (roleName == null) {
             throw new IllegalArgumentException("Name cannot be null!");
         }
@@ -46,13 +46,14 @@
         return (result == null) ? role : null;
     }
 
-    public void close() throws IOException {
-        // Nop
-    }
-
-    public Role[] getRoles(Filter filter) throws IOException {
+    public Role[] getRoles(String filterValue) throws Exception {
         Collection roles = m_entries.values();
-        
+
+        Filter filter = null;
+        if (filterValue != null) {
+            filter = FrameworkUtil.createFilter(filterValue);
+        }
+
         List matchingRoles = new ArrayList();
         Iterator rolesIter = roles.iterator();
         while (rolesIter.hasNext()) {
@@ -66,18 +67,14 @@
         return (Role[]) matchingRoles.toArray(result);
     }
 
-    public Role getRoleByName(String roleName) throws IOException {
+    public Role getRoleByName(String roleName) throws Exception {
         if (roleName == null) {
             throw new IllegalArgumentException("Role name cannot be null!");
         }
         return (Role) m_entries.get(roleName);
     }
-    
-    public void initialize() throws IOException {
-        // Nop
-    }
 
-    public Role removeRole(String roleName) throws IOException {
+    public Role removeRole(String roleName) throws Exception {
         if (roleName == null) {
             throw new IllegalArgumentException("Name cannot be null!");
         }
diff --git a/useradmin/useradmin/src/test/java/org/apache/felix/useradmin/impl/RoleRepositorySecurityTest.java b/useradmin/useradmin/src/test/java/org/apache/felix/useradmin/impl/RoleRepositorySecurityTest.java
index 6ab743b..8fe1bbe 100644
--- a/useradmin/useradmin/src/test/java/org/apache/felix/useradmin/impl/RoleRepositorySecurityTest.java
+++ b/useradmin/useradmin/src/test/java/org/apache/felix/useradmin/impl/RoleRepositorySecurityTest.java
@@ -21,7 +21,6 @@
 
 import junit.framework.TestCase;
 
-import org.apache.felix.framework.FilterImpl;
 import org.osgi.service.useradmin.Role;
 
 /**
@@ -74,7 +73,7 @@
      * Tests that getting roles with filters works without any permissions.
      */
     public void testGetRolesWithFilterOk() throws Exception {
-        m_roleManager.getRoles(new FilterImpl("(key=value)"));
+        m_roleManager.getRoles("(key=value)");
     }
 
     /**
diff --git a/useradmin/useradmin/src/test/java/org/apache/felix/useradmin/impl/RoleRepositoryTest.java b/useradmin/useradmin/src/test/java/org/apache/felix/useradmin/impl/RoleRepositoryTest.java
index 6edd1c8..78a0079 100644
--- a/useradmin/useradmin/src/test/java/org/apache/felix/useradmin/impl/RoleRepositoryTest.java
+++ b/useradmin/useradmin/src/test/java/org/apache/felix/useradmin/impl/RoleRepositoryTest.java
@@ -26,8 +26,6 @@
 
 import junit.framework.TestCase;
 
-import org.apache.felix.framework.FilterImpl;
-import org.osgi.framework.Filter;
 import org.osgi.service.useradmin.Group;
 import org.osgi.service.useradmin.Role;
 import org.osgi.service.useradmin.User;
@@ -274,18 +272,18 @@
         role2.getProperties().put("key", "value2");
         role2.getProperties().put("keyB", "value1");
         
-        Filter filter;
+        String filter;
 
-        filter = new FilterImpl("(key=value1)");
+        filter = "(key=value1)";
         assertSameRoles(new Role[]{ role1 }, m_roleRepository.getRoles(filter));
 
-        filter = new FilterImpl("(key=value2)");
+        filter = "(key=value2)";
         assertSameRoles(new Role[]{ role2 }, m_roleRepository.getRoles(filter));
 
-        filter = new FilterImpl("(key=value*)");
+        filter = "(key=value*)";
         assertSameRoles(new Role[]{ role1, role2 }, m_roleRepository.getRoles(filter));
 
-        filter = new FilterImpl("(|(key=value1)(keyB=value1))");
+        filter = "(|(key=value1)(keyB=value1))";
         assertSameRoles(new Role[]{ role1, role2 }, m_roleRepository.getRoles(filter));
     }
 
diff --git a/useradmin/useradmin/src/test/java/org/apache/felix/useradmin/impl/UserAdminImplTest.java b/useradmin/useradmin/src/test/java/org/apache/felix/useradmin/impl/UserAdminImplTest.java
index 610e7dd..59ac996 100644
--- a/useradmin/useradmin/src/test/java/org/apache/felix/useradmin/impl/UserAdminImplTest.java
+++ b/useradmin/useradmin/src/test/java/org/apache/felix/useradmin/impl/UserAdminImplTest.java
@@ -21,9 +21,7 @@
 
 import junit.framework.TestCase;
 
-import org.apache.felix.framework.FilterImpl;
 import org.apache.felix.useradmin.RoleFactory;
-import org.osgi.framework.Filter;
 import org.osgi.framework.InvalidSyntaxException;
 import org.osgi.service.event.Event;
 import org.osgi.service.event.EventAdmin;
@@ -858,14 +856,7 @@
         m_roleRepository = new RoleRepository(new MemoryRoleRepositoryStore());
         m_dispatcher = new EventDispatcher(new StubEventAdmin(), new StubUserAdminListenerList());
 
-        m_userAdmin = new UserAdminImpl(m_roleRepository, m_dispatcher) {
-            protected Filter createFilter(String filter) throws InvalidSyntaxException {
-                if (filter == null || "".equals(filter.trim())) {
-                    return null;
-                }
-                return new FilterImpl(filter);
-            }
-        };
+        m_userAdmin = new UserAdminImpl(m_roleRepository, m_dispatcher);
         m_dispatcher.start();
     }