[jboss-cvs] JBossAS SVN: r111082 - in projects/security/security-xacml/trunk/jboss-xacml/src/main/java/org/jboss/security/xacml: factories and 1 other directories.

jboss-cvs-commits at lists.jboss.org jboss-cvs-commits at lists.jboss.org
Thu Mar 31 13:50:05 EDT 2011


Author: anil.saldhana at jboss.com
Date: 2011-03-31 13:50:05 -0400 (Thu, 31 Mar 2011)
New Revision: 111082

Modified:
   projects/security/security-xacml/trunk/jboss-xacml/src/main/java/org/jboss/security/xacml/core/JBossPDP.java
   projects/security/security-xacml/trunk/jboss-xacml/src/main/java/org/jboss/security/xacml/core/SecurityActions.java
   projects/security/security-xacml/trunk/jboss-xacml/src/main/java/org/jboss/security/xacml/factories/PolicyFactory.java
   projects/security/security-xacml/trunk/jboss-xacml/src/main/java/org/jboss/security/xacml/util/XACMLPolicyUtil.java
Log:
SECURITY-580: policies from directory

Modified: projects/security/security-xacml/trunk/jboss-xacml/src/main/java/org/jboss/security/xacml/core/JBossPDP.java
===================================================================
--- projects/security/security-xacml/trunk/jboss-xacml/src/main/java/org/jboss/security/xacml/core/JBossPDP.java	2011-03-31 17:37:44 UTC (rev 111081)
+++ projects/security/security-xacml/trunk/jboss-xacml/src/main/java/org/jboss/security/xacml/core/JBossPDP.java	2011-03-31 17:50:05 UTC (rev 111082)
@@ -21,8 +21,12 @@
   */
 package org.jboss.security.xacml.core;
 
+import java.io.File;
+import java.io.FilenameFilter;
 import java.io.InputStream;
 import java.io.Serializable;
+import java.net.URI;
+import java.net.URISyntaxException;
 import java.net.URL;
 import java.util.ArrayList;
 import java.util.HashSet;
@@ -454,22 +458,34 @@
    private List<XACMLPolicy> addPolicySets(List<PolicySetType> policySets, boolean topLevel) throws Exception
    {
       List<XACMLPolicy> list = new ArrayList<XACMLPolicy>();
-
+      
       for (PolicySetType pst : policySets)
       {
          String loc = pst.getLocation();
-         XACMLPolicy policySet = PolicyFactory.createPolicySet(getInputStream(loc), policyFinder);
-         list.add(policySet);
+         log.info("Reading policysets from location="+loc); 
+         if( isDirectory(loc))
+         {
+            InputStream[] streams = this.readPoliciesFromDir(loc);
+            for( InputStream stream : streams)
+            {
+               list.add(PolicyFactory.create(stream, policyFinder));
+            }
+            policies.addAll(list);
+         }
+         else
+         {
+            XACMLPolicy policySet = PolicyFactory.createPolicySet(getInputStream(loc), policyFinder);
+            list.add(policySet);
+            List<XACMLPolicy> policyList = this.addPolicies(pst.getPolicy());
+            policySet.setEnclosingPolicies(policyList);
 
-         List<XACMLPolicy> policyList = this.addPolicies(pst.getPolicy());
-         policySet.setEnclosingPolicies(policyList);
+            List<PolicySetType> pset = pst.getPolicySet();
+            if (pset != null)
+               policySet.getEnclosingPolicies().addAll(this.addPolicySets(pset, false));
 
-         List<PolicySetType> pset = pst.getPolicySet();
-         if (pset != null)
-            policySet.getEnclosingPolicies().addAll(this.addPolicySets(pset, false));
-
-         if (topLevel)
-            policies.add(policySet);
+            if (topLevel)
+               policies.add(policySet); 
+         }
       }
 
       return list;
@@ -558,6 +574,80 @@
          throw new RuntimeException(jxb);
       }
    }
+   
+   private boolean isDirectory(String location)
+   {
+      boolean result = false;
+      File file = new File(location);
+      result =  (file !=null && file.isDirectory());
+      URI uri = null;
+      
+      if( !result)
+      {
+         uri = getResourceViaClassLoader(SecurityActions.getContextClassLoader(), location);
+         if( uri != null)
+         {
+            file = new File( uri ); 
+         } 
+         result = (file !=null && file.isDirectory()); 
+      }
+      if( !result)
+      { 
+         uri = getResourceViaClassLoader(SecurityActions.getClassLoader(getClass()), location);
+         if( uri != null)
+         {
+            file = new File( uri ); 
+         } 
+         result = (file !=null && file.isDirectory()); 
+      }
+      return result;
+   }
+   
+   private URI getResourceViaClassLoader( ClassLoader cl, String location)
+   {
+      URL url = cl.getResource(location);
+      if( url != null )
+      {
+         try
+         {
+            return url.toURI();
+         }
+         catch (URISyntaxException e)
+         {
+            // ignore
+         }
+      }
+      return null;
+   }
+   
+   private InputStream[] readPoliciesFromDir( String location)
+   {
+      URI uri = getResourceViaClassLoader(SecurityActions.getContextClassLoader(), location);
+      if( uri == null)
+         uri = getResourceViaClassLoader(SecurityActions.getClassLoader(getClass()), location);
+      
+      if( uri == null )
+         throw new RuntimeException("Unable to load the URI:" + location);
+      
+      ArrayList<InputStream> list = new ArrayList<InputStream>();
+      File dir = new File(uri);
+      if( dir == null || !dir.isDirectory())
+         throw new RuntimeException( location + " is not a directory" );
+      String[]  files = dir.list(new FilenameFilter()
+      {     
+         public boolean accept(File dir, String name)
+         { 
+            return !name.startsWith(".");
+         }
+      });
+      for( String fileName: files)
+      {
+         list.add(getInputStream(location + fileName));
+      }
+      InputStream[] isArr = new InputStream[list.size()];
+      list.toArray(isArr);
+      return isArr;
+   }
 
    private InputStream getInputStream(String loc)
    {

Modified: projects/security/security-xacml/trunk/jboss-xacml/src/main/java/org/jboss/security/xacml/core/SecurityActions.java
===================================================================
--- projects/security/security-xacml/trunk/jboss-xacml/src/main/java/org/jboss/security/xacml/core/SecurityActions.java	2011-03-31 17:37:44 UTC (rev 111081)
+++ projects/security/security-xacml/trunk/jboss-xacml/src/main/java/org/jboss/security/xacml/core/SecurityActions.java	2011-03-31 17:50:05 UTC (rev 111082)
@@ -48,6 +48,17 @@
       });
    }
    
+   static ClassLoader getClassLoader( final Class<?> clazz)
+   {
+      return AccessController.doPrivileged(new PrivilegedAction<ClassLoader>()
+      {
+         public ClassLoader run()
+         {
+            return clazz.getClassLoader();
+         }
+      });
+   }
+   
    static String getSystemProperty(final String key)
    {
       return AccessController.doPrivileged(new PrivilegedAction<String>()

Modified: projects/security/security-xacml/trunk/jboss-xacml/src/main/java/org/jboss/security/xacml/factories/PolicyFactory.java
===================================================================
--- projects/security/security-xacml/trunk/jboss-xacml/src/main/java/org/jboss/security/xacml/factories/PolicyFactory.java	2011-03-31 17:37:44 UTC (rev 111081)
+++ projects/security/security-xacml/trunk/jboss-xacml/src/main/java/org/jboss/security/xacml/factories/PolicyFactory.java	2011-03-31 17:50:05 UTC (rev 111082)
@@ -45,8 +45,12 @@
  */
 public class PolicyFactory
 {
-   public static Class<?> constructingClass = JBossXACMLPolicy.class;
+   private static Class<?> constructingClass = JBossXACMLPolicy.class;
 
+   /**
+    * Set the class that constructs {@link XACMLPolicy}
+    * @param clazz
+    */
    public static void setConstructingClass(Class<?> clazz)
    {
       if (XACMLPolicy.class.isAssignableFrom(clazz) == false)
@@ -54,6 +58,10 @@
       constructingClass = clazz;
    }
 
+   /**
+    * Set the class that constructs {@link XACMLPolicy}
+    * @param fqn
+    */
    public static void setConstructingClass(String fqn)
    {
       ClassLoader tcl = SecurityActions.getContextClassLoader();
@@ -67,24 +75,49 @@
       }
    }
 
+   /**
+    * Create a {@link XACMLPolicy}
+    * @param policySetFile
+    * @return
+    * @throws Exception
+    */
    public static XACMLPolicy createPolicySet(InputStream policySetFile) throws Exception
    {
       return (XACMLPolicy) getCtr().newInstance(new Object[]
       {policySetFile, XACMLPolicy.POLICYSET});
    }
 
+   /**
+    * Create {@link XACMLPolicy}
+    * @param policySetFile inputstream to a policyset
+    * @param theFinder
+    * @return
+    * @throws Exception
+    */
    public static XACMLPolicy createPolicySet(InputStream policySetFile, JBossPolicyFinder theFinder) throws Exception
    {
       return (XACMLPolicy) getCtrWithFinder().newInstance(new Object[]
       {policySetFile, XACMLPolicy.POLICYSET, theFinder});
    }
 
+   /**
+    * Create a {@link XACMLPolicy}
+    * @param policyFile inputstream to a Policy
+    * @return
+    * @throws Exception
+    */
    public static XACMLPolicy createPolicy(InputStream policyFile) throws Exception
    {
       return (XACMLPolicy) getCtr().newInstance(new Object[]
       {policyFile, XACMLPolicy.POLICY});
    }
 
+   /**
+    * Construct {@link XACMLPolicy}
+    * @param policyFile a {@link PolicyType}
+    * @return
+    * @throws Exception
+    */
    public static XACMLPolicy createPolicy(PolicyType policyFile) throws Exception
    {
       JAXBElement<PolicyType> jaxbPolicy = new ObjectFactory().createPolicy(policyFile);
@@ -94,6 +127,21 @@
       return (XACMLPolicy) getCtr().newInstance(new Object[]
       {bis, XACMLPolicy.POLICY});
    }
+   
+   /**
+    * Create {@link XACMLPolicy}
+    * @param is an inputstream to a policy or policyset
+    * @param finder a {@link JBossPolicyFinder}
+    * @return
+    * @throws Exception
+    */
+   @SuppressWarnings("unchecked")
+   public static XACMLPolicy create(InputStream is, JBossPolicyFinder finder) throws Exception
+   {
+      Constructor<XACMLPolicy> ctr = (Constructor<XACMLPolicy>) constructingClass.getConstructor(new Class[]{
+             InputStream.class,JBossPolicyFinder.class});
+      return ctr.newInstance(new Object[]{is, finder});
+   }
 
    @SuppressWarnings("unchecked")
    private static Constructor<XACMLPolicy> getCtr() throws Exception
@@ -108,4 +156,4 @@
       return (Constructor<XACMLPolicy>) constructingClass.getConstructor(new Class[]
       {InputStream.class, Integer.TYPE, JBossPolicyFinder.class});
    }
-}
+}
\ No newline at end of file

Modified: projects/security/security-xacml/trunk/jboss-xacml/src/main/java/org/jboss/security/xacml/util/XACMLPolicyUtil.java
===================================================================
--- projects/security/security-xacml/trunk/jboss-xacml/src/main/java/org/jboss/security/xacml/util/XACMLPolicyUtil.java	2011-03-31 17:37:44 UTC (rev 111081)
+++ projects/security/security-xacml/trunk/jboss-xacml/src/main/java/org/jboss/security/xacml/util/XACMLPolicyUtil.java	2011-03-31 17:50:05 UTC (rev 111082)
@@ -29,10 +29,12 @@
 import javax.xml.parsers.DocumentBuilderFactory;
 import javax.xml.parsers.ParserConfigurationException;
 
+import org.jboss.security.xacml.sunxacml.AbstractPolicy;
 import org.jboss.security.xacml.sunxacml.Policy;
 import org.jboss.security.xacml.sunxacml.PolicySet;
 import org.jboss.security.xacml.sunxacml.finder.PolicyFinder;
 import org.w3c.dom.Document;
+import org.w3c.dom.Node;
 import org.xml.sax.SAXException;
 
 /**
@@ -44,6 +46,25 @@
 public class XACMLPolicyUtil
 {
    /**
+    * Construct {@link AbstractPolicy}
+    * @param is inputstream to a policy or policyset
+    * @param finder
+    * @return
+    * @throws Exception
+    */
+   public AbstractPolicy create(InputStream is, PolicyFinder finder) throws Exception
+   {
+      if (finder == null)
+         throw new IllegalArgumentException("Policy Finder is null");
+      Document doc = getDocument(is);
+      Node root = doc.getFirstChild();
+      if( root.getNodeName().contains("PolicySet"))
+      {
+         return PolicySet.getInstance(root, finder);
+      }
+      return Policy.getInstance(root);
+   }
+   /**
     * Create a PolicySet
     * @param location location of the policy set file
     * @param finder PolicyFinder instance
@@ -91,7 +112,7 @@
    {
       Document doc = getDocument(is);
       return Policy.getInstance(doc.getFirstChild());
-   }
+   } 
 
    private Document getDocument(InputStream is) throws ParserConfigurationException, SAXException, IOException
    {
@@ -101,4 +122,4 @@
       Document doc = docBuilder.parse(is);
       return doc;
    }
-}
+}
\ No newline at end of file



More information about the jboss-cvs-commits mailing list