--- jakarta-slide\src\webdav\client\src\org\apache\webdav\lib\properties\AclProperty.java	Thu May 17 20:30:57 2001
+++ jakarta-slide\src\webdav\client\src\org\apache\webdav\lib\properties\AclProperty.java	Fri Jun 08 15:12:59 2001
@@ -82,6 +82,7 @@
  * defined in the WebDAV Access Control Protocol specification.
  *
  * @author Remy Maucherat
+ * @author Dirk Verbeeck
  * @version $Revision: 1.1 $
  */
 public class AclProperty extends BaseProperty {
@@ -133,7 +134,9 @@
             } catch (ClassCastException e) {
             }
         }
-        return (Ace[]) aces.toArray();
+        Ace[] tmp=new Ace[aces.size()];
+        System.arraycopy(aces.toArray(),0,tmp,0,tmp.length);
+        return tmp;
     }
 
 
@@ -146,9 +149,34 @@
     protected Ace parseAce(Element element) {
 
         String principal = null;
-        Element child = DOMUtils.getFirstElement(element, "DAV:", "pricipal");
-        if (child != null) {
-            principal = DOMUtils.getTextValue(child);
+        Element child = DOMUtils.getFirstElement(element, "DAV:", "principal");
+        if (child == null) {
+            System.err.println("Error: mandatory element <principal> is missing !");
+            System.err.println("element: " + element);
+            return null;
+        }
+        
+        Element href = DOMUtils.getFirstElement(child, "DAV:", "href");
+        if (href!=null) 
+        {
+            principal = DOMUtils.getTextValue(href);
+        }
+
+        String[] types={"all","authenticated","unauthenticated","property","self"};
+        for (int i=0 ; i<types.length && principal==null ; i++)        
+        {
+            Element type = DOMUtils.getFirstElement(child, "DAV:", types[i]);
+            if (type!=null) 
+            {
+                principal=types[i];
+            }
+        }
+
+        if (principal==null) 
+        {
+            System.err.println("Error: unknown type of principal");
+            System.err.println("element: " + element);
+            return null;
         }
 
         Ace ace = new Ace(principal);
@@ -159,18 +187,31 @@
             ace.setNegative(true);
          }
         if (child != null) {
-            NodeList privilegeElements = 
-                child.getElementsByTagNameNS("DAV:", "privilege");
+            NodeList privilegeElements = child.getElementsByTagNameNS("DAV:", "privilege");
             for (int i = 0; i < privilegeElements.getLength(); i++) {
                 Element privilegeElement = (Element) privilegeElements.item(i);
-                ace.addPrivilege(parsePrivilege(privilegeElement));
+                NodeList privileges = privilegeElement.getElementsByTagName("*");
+                for (int j=0 ; j<privileges.getLength() ; j++)
+                {
+                    Element privilege = (Element) privileges.item(j);
+                    ace.addPrivilege(parsePrivilege(privilege));
+                }
             }
         }
 
         child = DOMUtils.getFirstElement(element, "DAV:", "inherited");
         if (child != null) {
-            ace.setInherited(true);
-            ace.setInheritedFrom(DOMUtils.getTextValue(child));
+            href=DOMUtils.getFirstElement(child, "DAV:", "href");
+            if (href!=null)
+            {
+                ace.setInherited(true);
+                ace.setInheritedFrom(DOMUtils.getTextValue(href));
+            }
+            else 
+            {
+                System.err.println("Error: mandatory element <href> is missing !");
+                return null;
+            }
         }
         
         child = DOMUtils.getFirstElement(element, "DAV:", "protected");
