--- jakarta-slide\src\webdav\server\org\apache\slide\webdav\method\AclMethod.java	Wed May 16 14:07:50 2001
+++ jakarta-slide\src\webdav\server\org\apache\slide\webdav\method\AclMethod.java	Fri Jun 08 14:50:44 2001
@@ -88,6 +88,7 @@
  * ACL method.
  *
  * @author <a href="mailto:remm@apache.org">Remy Maucherat</a>
+ * @author Dirk Verbeeck
  */
 public class AclMethod extends WebdavMethod {
     
@@ -110,11 +111,11 @@
     protected static final int PRIVILEGE_REMOVE_REVISION_METADATA = 12;
     protected static final int PRIVILEGE_CREATE_REVISION_CONTENT = 13;
     protected static final int PRIVILEGE_MODIFY_REVISION_CONTENT = 14;
-    protected static final int PRIVILEGE_READ_ACL = 15;
-    protected static final int PRIVILEGE_WRITE_ACL = 16;
-    protected static final int PRIVILEGE_GRANT_PERMISSION = 17;
-    protected static final int PRIVILEGE_REVOKE_PERMISSION = 18;
-    
+    protected static final int PRIVILEGE_REMOVE_REVISION_CONTENT = 15;
+    protected static final int PRIVILEGE_READ_ACL = 16;
+    protected static final int PRIVILEGE_WRITE_ACL = 17;
+    protected static final int PRIVILEGE_GRANT_PERMISSION = 18;
+    protected static final int PRIVILEGE_REVOKE_PERMISSION = 19;    
     
     // ----------------------------------------------------- Instance Variables
     
@@ -178,19 +179,7 @@
                     (new StringReader(requestBody))));
                 
                 // Get the root element of the document
-                Element rootElement = document.getDocumentElement();
-                //NodeList childList = rootElement.getChildNodes();
-                
-                NodeList aclList = 
-                    rootElement.getElementsByTagNameNS
-                    (NodeProperty.DEFAULT_NAMESPACE, "acl");
-                
-                if (aclList.getLength() != 1) {
-                    resp.setStatus(WebdavStatus.SC_BAD_REQUEST);
-                    throw new WebdavException(WebdavStatus.SC_BAD_REQUEST);
-                }
-                
-                Element acl = (Element) aclList.item(0);
+                Element acl = document.getDocumentElement();
                 
                 NodeList aceList = acl.getElementsByTagNameNS
                     (NodeProperty.DEFAULT_NAMESPACE, "ace");
@@ -236,13 +225,8 @@
                     NodeList denyList = ace.getElementsByTagNameNS
                         (NodeProperty.DEFAULT_NAMESPACE, "deny");
                     
-                    if ((grantList.getLength() > 0) && 
-                        (denyList.getLength() > 0)) {
-                        resp.setStatus(WebdavStatus.SC_BAD_REQUEST);
-                        throw new WebdavException(WebdavStatus.SC_BAD_REQUEST);
-                    }
-                    if ((grantList.getLength() == 0) && 
-                        (denyList.getLength() == 0)) {
+                    // there must be only ONE grant or deny element
+                    if ((grantList.getLength()+denyList.getLength())!=1) {
                         resp.setStatus(WebdavStatus.SC_BAD_REQUEST);
                         throw new WebdavException(WebdavStatus.SC_BAD_REQUEST);
                     }
@@ -252,15 +236,17 @@
                     NodeList privilegeList = null;
                     
                     if (negative) {
-                        privilegeList = denyList;
+                        Element denyElement=(Element) denyList.item(0);
+                        privilegeList = denyElement.getElementsByTagNameNS(NodeProperty.DEFAULT_NAMESPACE, "privilege");
                     } else {
-                        privilegeList = grantList;
+                        Element grantElement=(Element) grantList.item(0);
+                        privilegeList = grantElement.getElementsByTagNameNS(NodeProperty.DEFAULT_NAMESPACE, "privilege");
                     }
                     
                     boolean inheritable = true; 
                     // FIXME : Use the very unofficial Advanced ACL spec here.
                     
-                    for (int j = 0; i < privilegeList.getLength(); j++) {
+                    for (int j = 0; j < privilegeList.getLength(); j++) {
                         
                         Element privilegeElement = 
                             (Element) privilegeList.item(j);
@@ -378,13 +364,27 @@
                                  config.getRevokePermissionAction().getUri(), 
                                  negative, inheritable);
                             break;
+                        default:
+                           // FIXME: ignore the other permissions ???
+                           // System.out.println("Error: Unknown internal privilege code !!!");
+                           // resp.setStatus(WebdavStatus.SC_INTERNAL_SERVER_ERROR);
+                           // throw new WebdavException(WebdavStatus.SC_INTERNAL_SERVER_ERROR);
                         }
-                        
                     }
-                    
                 }
-                
+            } catch (AbstractMethodError e) {
+                System.err.println("You are using using an incorrect older parser");
+                System.err.println("that doesn't provide Element::getElementsByTagNameNS");
+                System.err.println("consult the documentation for a list of valid parsers.");
+                System.err.println("You are currently using: ");
+                System.err.println("   " + documentBuilder.getClass().getName());
+                e.printStackTrace();
+                resp.setStatus(WebdavStatus.SC_INTERNAL_SERVER_ERROR);
+                throw new WebdavException(WebdavStatus.SC_INTERNAL_SERVER_ERROR);
             } catch (SAXException e) {
+				System.err.println("Error parsing requestBody:");
+                System.err.println(requestBody);
+                e.printStackTrace();
                 resp.setStatus(WebdavStatus.SC_BAD_REQUEST);
                 throw new WebdavException(WebdavStatus.SC_BAD_REQUEST);
             } catch (IOException e) {
@@ -529,12 +529,16 @@
                             "modify-revision-content")) {
             return PRIVILEGE_MODIFY_REVISION_CONTENT;
         } else if (hasChild(privilege, SLIDE_NAMESPACE, 
+                            "remove-revision-content")) {
+            return PRIVILEGE_REMOVE_REVISION_CONTENT;
+        } else if (hasChild(privilege, SLIDE_NAMESPACE, 
                             "grant-permission")) {
             return PRIVILEGE_GRANT_PERMISSION;
         } else if (hasChild(privilege, SLIDE_NAMESPACE, 
                             "revoke-permission")) {
             return PRIVILEGE_REVOKE_PERMISSION;
         } else {
+            System.err.println("Error: Unknown privilege !!!");
             throw new WebdavException(WebdavStatus.SC_BAD_REQUEST);
         }
         
