| 
					
				 | 
			
			
				@@ -0,0 +1,181 @@ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+package org.springframework.security.acls.jdbc;
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+import java.io.Serializable;
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+import junit.framework.Assert;
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+import junit.framework.TestCase;
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+import net.sf.ehcache.Cache;
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+import net.sf.ehcache.Ehcache;
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+import org.springframework.context.ApplicationContext;
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+import org.springframework.security.Authentication;
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+import org.springframework.security.GrantedAuthority;
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+import org.springframework.security.GrantedAuthorityImpl;
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+import org.springframework.security.MockApplicationContext;
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+import org.springframework.security.acls.MutableAcl;
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+import org.springframework.security.acls.domain.AclAuthorizationStrategy;
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+import org.springframework.security.acls.domain.AclAuthorizationStrategyImpl;
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+import org.springframework.security.acls.domain.AclImpl;
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+import org.springframework.security.acls.domain.ConsoleAuditLogger;
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+import org.springframework.security.acls.objectidentity.ObjectIdentity;
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+import org.springframework.security.acls.objectidentity.ObjectIdentityImpl;
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+import org.springframework.security.context.SecurityContextHolder;
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+import org.springframework.security.providers.TestingAuthenticationToken;
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+/**
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ * Tests {@link EhCacheBasedAclCache}
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ *
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ * @author Andrei Stefan
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ */
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+public class EhCacheBasedAclCacheTests extends TestCase {
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    //~ Methods ========================================================================================================
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    private Ehcache getCache() {
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        ApplicationContext ctx = MockApplicationContext.getContext();
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        return (Ehcache) ctx.getBean("eHCacheBackend");
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    }
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    protected void tearDown() throws Exception {
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        super.tearDown();
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        SecurityContextHolder.clearContext();
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    }
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    public void testConstructorRejectsNullParameters() throws Exception {
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        try {
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            AclCache aclCache = new EhCacheBasedAclCache(null);
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            Assert.fail("It should have thrown IllegalArgumentException");
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        }
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        catch (IllegalArgumentException expected) {
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            Assert.assertTrue(true);
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        }
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    }
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    public void testMethodsRejectNullParameters() throws Exception {
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        Ehcache cache = new MockEhcache();
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        EhCacheBasedAclCache myCache = new EhCacheBasedAclCache(cache);
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        try {
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            Serializable id = null;
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            myCache.evictFromCache(id);
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            Assert.fail("It should have thrown IllegalArgumentException");
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        }
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        catch (IllegalArgumentException expected) {
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            Assert.assertTrue(true);
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        }
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        try {
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            ObjectIdentity obj = null;
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            myCache.evictFromCache(obj);
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            Assert.fail("It should have thrown IllegalArgumentException");
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        }
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        catch (IllegalArgumentException expected) {
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            Assert.assertTrue(true);
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        }
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        try {
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            Serializable id = null;
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            myCache.getFromCache(id);
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            Assert.fail("It should have thrown IllegalArgumentException");
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        }
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        catch (IllegalArgumentException expected) {
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            Assert.assertTrue(true);
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        }
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        try {
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            ObjectIdentity obj = null;
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            myCache.getFromCache(obj);
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            Assert.fail("It should have thrown IllegalArgumentException");
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        }
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        catch (IllegalArgumentException expected) {
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            Assert.assertTrue(true);
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        }
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        try {
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            MutableAcl acl = null;
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            myCache.putInCache(acl);
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            Assert.fail("It should have thrown IllegalArgumentException");
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        }
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        catch (IllegalArgumentException expected) {
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            Assert.assertTrue(true);
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        }
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    }
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    public void testCacheOperationsAclWithoutParent() throws Exception {
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        Ehcache cache = getCache();
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        EhCacheBasedAclCache myCache = new EhCacheBasedAclCache(cache);
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        ObjectIdentity identity = new ObjectIdentityImpl("org.springframework.security.TargetObject", new Long(100));
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        AclAuthorizationStrategy aclAuthorizationStrategy = new AclAuthorizationStrategyImpl(new GrantedAuthority[] {
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                new GrantedAuthorityImpl("ROLE_OWNERSHIP"), new GrantedAuthorityImpl("ROLE_AUDITING"),
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                new GrantedAuthorityImpl("ROLE_GENERAL") });
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        MutableAcl acl = new AclImpl(identity, new Long(1), aclAuthorizationStrategy, new ConsoleAuditLogger());
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        myCache.putInCache(acl);
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        Assert.assertEquals(cache.getSize(), 2);
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        // Check we can get from cache the same objects we put in
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        Assert.assertEquals(myCache.getFromCache(new Long(1)), acl);
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        Assert.assertEquals(myCache.getFromCache(identity), acl);
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        // Put another object in cache
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        ObjectIdentity identity2 = new ObjectIdentityImpl("org.springframework.security.TargetObject", new Long(101));
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        MutableAcl acl2 = new AclImpl(identity2, new Long(2), aclAuthorizationStrategy, new ConsoleAuditLogger());
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        myCache.putInCache(acl2);
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        Assert.assertEquals(cache.getSize(), 4);
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        // Try to evict an entry that doesn't exist
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        myCache.evictFromCache(new Long(3));
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        myCache.evictFromCache(new ObjectIdentityImpl("org.springframework.security.TargetObject", new Long(102)));
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        Assert.assertEquals(cache.getSize(), 4);
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        myCache.evictFromCache(new Long(1));
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        Assert.assertEquals(cache.getSize(), 2);
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        // Check the second object inserted
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        Assert.assertEquals(myCache.getFromCache(new Long(2)), acl2);
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        Assert.assertEquals(myCache.getFromCache(identity2), acl2);
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        myCache.evictFromCache(identity2);
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        Assert.assertEquals(cache.getSize(), 0);
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    }
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    public void testCacheOperationsAclWithParent() throws Exception {
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        Ehcache cache = getCache();
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        EhCacheBasedAclCache myCache = new EhCacheBasedAclCache(cache);
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        Authentication auth = new TestingAuthenticationToken("user", "password", new GrantedAuthority[] {
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                new GrantedAuthorityImpl("ROLE_GENERAL") });
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        auth.setAuthenticated(true);
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        SecurityContextHolder.getContext().setAuthentication(auth);
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        ObjectIdentity identity = new ObjectIdentityImpl("org.springframework.security.TargetObject", new Long(100));
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        ObjectIdentity identityParent = new ObjectIdentityImpl("org.springframework.security.TargetObject", new Long(101));
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        AclAuthorizationStrategy aclAuthorizationStrategy = new AclAuthorizationStrategyImpl(new GrantedAuthority[] {
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                new GrantedAuthorityImpl("ROLE_OWNERSHIP"), new GrantedAuthorityImpl("ROLE_AUDITING"),
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                new GrantedAuthorityImpl("ROLE_GENERAL") });
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        MutableAcl acl = new AclImpl(identity, new Long(1), aclAuthorizationStrategy, new ConsoleAuditLogger());
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        MutableAcl parentAcl = new AclImpl(identityParent, new Long(2), aclAuthorizationStrategy, new ConsoleAuditLogger());
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        acl.setParent(parentAcl);
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        myCache.putInCache(acl);
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        Assert.assertEquals(cache.getSize(), 4);
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        // Check we can get from cache the same objects we put in
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        Assert.assertEquals(myCache.getFromCache(new Long(1)), acl);
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        Assert.assertEquals(myCache.getFromCache(identity), acl);
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        Assert.assertEquals(myCache.getFromCache(new Long(2)), parentAcl);
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        Assert.assertEquals(myCache.getFromCache(identityParent), parentAcl);
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    }
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    //~ Inner Classes ==================================================================================================
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    private class MockEhcache extends Cache {
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        public MockEhcache() {
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            super("cache", 0, true, true, 0, 0);
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        }
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    }
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+}
 
			 |