The beginnings of a test suite. Slightly more flesh on the ARP interface. Memory...
authorwassa <wassa@ab3bd59b-922f-494d-bb5f-6f0a3c29deca>
Tue, 10 Dec 2002 03:47:25 +0000 (03:47 +0000)
committerwassa <wassa@ab3bd59b-922f-494d-bb5f-6f0a3c29deca>
Tue, 10 Dec 2002 03:47:25 +0000 (03:47 +0000)
git-svn-id: https://subversion.switch.ch/svn/shibboleth/java-idp/trunk@368 ab3bd59b-922f-494d-bb5f-6f0a3c29deca

src/edu/internet2/middleware/shibboleth/aa/arp/AAPrincipal.java [new file with mode: 0755]
src/edu/internet2/middleware/shibboleth/aa/arp/Arp.java
src/edu/internet2/middleware/shibboleth/aa/arp/ArpTests.java
src/edu/internet2/middleware/shibboleth/aa/arp/Rule.java
src/edu/internet2/middleware/shibboleth/aa/arp/provider/MemoryArpRepository.java

diff --git a/src/edu/internet2/middleware/shibboleth/aa/arp/AAPrincipal.java b/src/edu/internet2/middleware/shibboleth/aa/arp/AAPrincipal.java
new file mode 100755 (executable)
index 0000000..031a2f9
--- /dev/null
@@ -0,0 +1,80 @@
+/* 
+ * The Shibboleth License, Version 1. 
+ * Copyright (c) 2002 
+ * University Corporation for Advanced Internet Development, Inc. 
+ * All rights reserved
+ * 
+ * 
+ * Redistribution and use in source and binary forms, with or without 
+ * modification, are permitted provided that the following conditions are met:
+ * 
+ * Redistributions of source code must retain the above copyright notice, this 
+ * list of conditions and the following disclaimer.
+ * 
+ * Redistributions in binary form must reproduce the above copyright notice, 
+ * this list of conditions and the following disclaimer in the documentation 
+ * and/or other materials provided with the distribution, if any, must include 
+ * the following acknowledgment: "This product includes software developed by 
+ * the University Corporation for Advanced Internet Development 
+ * <http://www.ucaid.edu>Internet2 Project. Alternately, this acknowledegement 
+ * may appear in the software itself, if and wherever such third-party 
+ * acknowledgments normally appear.
+ * 
+ * Neither the name of Shibboleth nor the names of its contributors, nor 
+ * Internet2, nor the University Corporation for Advanced Internet Development, 
+ * Inc., nor UCAID may be used to endorse or promote products derived from this 
+ * software without specific prior written permission. For written permission, 
+ * please contact shibboleth@shibboleth.org
+ * 
+ * Products derived from this software may not be called Shibboleth, Internet2, 
+ * UCAID, or the University Corporation for Advanced Internet Development, nor 
+ * may Shibboleth appear in their name, without prior written permission of the 
+ * University Corporation for Advanced Internet Development.
+ * 
+ * 
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" 
+ * AND WITH ALL FAULTS. ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A 
+ * PARTICULAR PURPOSE, AND NON-INFRINGEMENT ARE DISCLAIMED AND THE ENTIRE RISK 
+ * OF SATISFACTORY QUALITY, PERFORMANCE, ACCURACY, AND EFFORT IS WITH LICENSEE. 
+ * IN NO EVENT SHALL THE COPYRIGHT OWNER, CONTRIBUTORS OR THE UNIVERSITY 
+ * CORPORATION FOR ADVANCED INTERNET DEVELOPMENT, INC. BE LIABLE FOR ANY DIRECT, 
+ * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES 
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; 
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND 
+ * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS 
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package edu.internet2.middleware.shibboleth.aa.arp;
+
+import java.security.Principal;
+
+/**
+ * <code>Principal</code> for use within the Shibboleth Attribute Authority.
+ * 
+ * @author Walter Hoehn (wassa@columbia.edu)
+ */
+
+public class AAPrincipal implements Principal {
+
+       private String principalName;
+
+       /**
+        * Constructor for AAPrincipal.
+        */
+
+       public AAPrincipal(String principalName) {
+               this.principalName = principalName;
+       }
+
+       /**
+        * @see java.security.Principal#getName()
+        */
+
+       public String getName() {
+               return principalName;
+       }
+
+}
index 6218b60..133eb40 100755 (executable)
@@ -63,6 +63,31 @@ public class Arp {
        private Principal principal;
        private HashSet rules;
        private String description;
+       private boolean sitePolicy = false;
+
+       /**
+        * Creates an Arp for the specified <code>Principal</code>.
+        */
+
+       public Arp(Principal principal) {
+               this.principal = principal;
+       }
+
+       /**
+        * Creates a "Site" Policy.
+        */
+
+       public Arp() {
+               sitePolicy = true;
+       }
+
+       /**
+        * Boolean indication of whether or not this Policy is a "Site" policy.
+        */
+
+       public boolean isSitePolicy() {
+               return sitePolicy;
+       }
 
        /**
         * Returns the <code>Principal</code> for which this policy is applicable.
@@ -79,6 +104,7 @@ public class Arp {
         */
 
        public void setPrincipal(Principal principal) {
+               sitePolicy = false;
                this.principal = principal;
        }
 
@@ -96,6 +122,7 @@ public class Arp {
         * Returns the description for this <code>Arp</code>.
         * @return String
         */
+
        public String getDescription() {
                return description;
        }
@@ -104,6 +131,7 @@ public class Arp {
         * Sets the description for this <code>Arp</code>.
         * @param description The description to set
         */
+
        public void setDescription(String description) {
                this.description = description;
        }
index a705347..5a3f606 100755 (executable)
@@ -75,7 +75,9 @@ public class ArpTests extends TestCase {
 
        public void testRepositories() {
 
-               //Test the Factory
+               /*
+                * Test the Factory
+                */
 
                //Make sure we fail if no Repository is specified
                Properties props = new Properties();
@@ -85,15 +87,64 @@ public class ArpTests extends TestCase {
                        //This is supposed to fail
                }
 
-               //Make sure we can create an Arp Repository
+               // Make sure we can create an Arp Repository
                props.setProperty(
                        "edu.internet2.middleware.shibboleth.aa.arp.ArpRepository.implementation",
                        "edu.internet2.middleware.shibboleth.aa.arp.provider.MemoryArpRepository");
+               ArpRepository repository = null;
                try {
-                       ArpRepositoryFactory.getInstance(props);
+                       repository = ArpRepositoryFactory.getInstance(props);
                } catch (ArpRepositoryException e) {
                        fail("Failed to create memory-based Arp Repository" + e);
                }
+               assertNotNull("Failed to create memory-based Arp Repository: Factory returned null.", repository);
+
+               /*
+                * Exercise the Memory Arp Repository
+                */
+
+               //Set/retrieve/remove a Site ARP
+               Arp siteArp1 = new Arp();
+               siteArp1.setDescription("Test Site Arp 1.");
+               try {
+                       repository.update(siteArp1);
+                       assertEquals(
+                               "Memory Repository does not store and retrieve Site ARPs properly.",
+                               siteArp1,
+                               repository.getSitePolicy());
+                       repository.remove(repository.getSitePolicy());
+                       assertNull("Memorty Repository does not properly delete Site ARPs.", repository.getSitePolicy());
+               } catch (ArpRepositoryException e) {
+                       fail("Error adding Site ARP to Memory Repository.");
+               }
+
+               //Set/retrieve/delete some user ARPs
+               Arp userArp1 = new Arp();
+               userArp1.setDescription("Broken User Arp 1.");
+               try {
+                       repository.update(userArp1);
+                       assertTrue(
+                               "Memory Repository does not store and retrieve User ARPs properly.",
+                               (!userArp1.equals(repository.getUserPolicy(userArp1.getPrincipal()))));
+               } catch (ArpRepositoryException e) {
+                       fail("Error adding User ARP to Memory Repository.");
+               }
+
+               Arp userArp2 = new Arp(new AAPrincipal("TestPrincipal"));
+               userArp2.setDescription("Test User Arp 2.");
+               try {
+                       repository.update(userArp2);
+                       assertEquals(
+                               "Memory Repository does not store and retrieve User ARPs properly.",
+                               userArp2,
+                               repository.getUserPolicy(userArp2.getPrincipal()));
+                       repository.remove(repository.getUserPolicy(userArp2.getPrincipal()));
+                       assertNull(
+                               "Memorty Repository does not properly delete User ARPs.",
+                               repository.getUserPolicy(userArp2.getPrincipal()));
+               } catch (ArpRepositoryException e) {
+                       fail("Error adding User ARP to Memory Repository.");
+               }
 
        }
 
index 52017dd..fc3ba48 100755 (executable)
@@ -57,4 +57,24 @@ package edu.internet2.middleware.shibboleth.aa.arp;
 
 public class Rule {
 
+       private String description;
+
+       /**
+        * Returns the description for this <code>Rule</code>.
+        * @return String
+        */
+
+       public String getDescription() {
+               return description;
+       }
+
+       /**
+        * Sets the description for this <code>Rule</code>.
+        * @param description The description to set
+        */
+
+       public void setDescription(String description) {
+               this.description = description;
+       }
+
 }
index 28b197d..84e0b76 100755 (executable)
@@ -54,6 +54,7 @@ import java.util.Collections;
 import java.util.HashMap;
 import java.util.Map;
 import java.util.Properties;
+import java.util.Set;
 
 import edu.internet2.middleware.shibboleth.aa.arp.Arp;
 import edu.internet2.middleware.shibboleth.aa.arp.ArpRepository;
@@ -72,16 +73,22 @@ public class MemoryArpRepository implements ArpRepository {
 
        public MemoryArpRepository(Properties props) {
        }
+
        /**
         * @see edu.internet2.middleware.shibboleth.aa.arp.ArpRepository#getAllPolicies(Principal)
         */
+
        public Arp[] getAllPolicies(Principal principal) throws ArpRepositoryException {
-               return (Arp[]) userPolicies.entrySet().toArray(new Arp[0]);
+
+               Set allPolicies = userPolicies.entrySet();
+               allPolicies.add(sitePolicy);
+               return (Arp[]) allPolicies.toArray(new Arp[0]);
        }
 
        /**
         * @see edu.internet2.middleware.shibboleth.aa.arp.ArpRepository#getSitePolicy()
         */
+
        public synchronized Arp getSitePolicy() throws ArpRepositoryException {
                return sitePolicy;
        }
@@ -89,6 +96,7 @@ public class MemoryArpRepository implements ArpRepository {
        /**
         * @see edu.internet2.middleware.shibboleth.aa.arp.ArpRepository#getUserPolicy(Principal)
         */
+
        public Arp getUserPolicy(Principal principal) throws ArpRepositoryException {
                return (Arp) userPolicies.get(principal);
        }
@@ -96,10 +104,11 @@ public class MemoryArpRepository implements ArpRepository {
        /**
         * @see edu.internet2.middleware.shibboleth.aa.arp.ArpRepository#remove(Arp)
         */
+
        public void remove(Arp arp) throws ArpRepositoryException {
 
-               if (arp.getPrincipal().equals(sitePolicy.getPrincipal())) {
-                       synchronized (sitePolicy) {
+               if (arp.isSitePolicy()) {
+                       synchronized (this) {
                                sitePolicy = null;
                        }
                } else if (userPolicies.containsKey(arp.getPrincipal())) {
@@ -110,7 +119,25 @@ public class MemoryArpRepository implements ArpRepository {
        /**
         * @see edu.internet2.middleware.shibboleth.aa.arp.ArpRepository#update(Arp)
         */
+
        public void update(Arp arp) throws ArpRepositoryException {
+
+               if (arp == null) {
+                       throw new ArpRepositoryException("Cannot add a null ARP to the repository.");
+               }
+
+               if (arp.isSitePolicy()) {
+                       synchronized (this) {
+                               sitePolicy = arp;
+                       }
+                       return;
+               }
+
+               if (arp.getPrincipal() == null) {
+                       throw new ArpRepositoryException("Cannot add ARP to repository.  Must contain a Principal or be a Site ARP.");
+               }
+
+               userPolicies.put(arp.getPrincipal(), arp);
        }
 
 }