[CalendarServer-changes] [8907] CalendarServer/trunk

source_changes at macosforge.org source_changes at macosforge.org
Sat Mar 17 00:27:16 PDT 2012


Revision: 8907
          http://trac.macosforge.org/projects/calendarserver/changeset/8907
Author:   wsanchez at apple.com
Date:     2012-03-17 00:27:16 -0700 (Sat, 17 Mar 2012)
Log Message:
-----------
Move twext.web2.dav.davxml to txdav.xml.element.

Modified Paths:
--------------
    CalendarServer/trunk/twext/web2/dav/__init__.py
    CalendarServer/trunk/twext/web2/dav/auth.py
    CalendarServer/trunk/twext/web2/dav/http.py
    CalendarServer/trunk/twext/web2/dav/method/prop_common.py
    CalendarServer/trunk/twext/web2/dav/method/report_expand.py
    CalendarServer/trunk/twext/web2/dav/method/report_principal_match.py
    CalendarServer/trunk/twext/web2/dav/method/report_principal_property_search.py
    CalendarServer/trunk/twext/web2/dav/resource.py
    CalendarServer/trunk/twext/web2/dav/test/test_acl.py
    CalendarServer/trunk/twext/web2/dav/test/test_xattrprops.py
    CalendarServer/trunk/twext/web2/dav/test/util.py
    CalendarServer/trunk/twext/web2/dav/util.py
    CalendarServer/trunk/twext/web2/dav/xattrprops.py
    CalendarServer/trunk/twistedcaldav/__init__.py
    CalendarServer/trunk/twistedcaldav/caldavxml.py
    CalendarServer/trunk/twistedcaldav/carddavxml.py
    CalendarServer/trunk/twistedcaldav/customxml.py
    CalendarServer/trunk/twistedcaldav/extensions.py
    CalendarServer/trunk/twistedcaldav/method/report_common.py
    CalendarServer/trunk/twistedcaldav/method/report_sync_collection.py
    CalendarServer/trunk/twistedcaldav/mkcolxml.py
    CalendarServer/trunk/twistedcaldav/resource.py
    CalendarServer/trunk/twistedcaldav/sharing.py
    CalendarServer/trunk/twistedcaldav/test/test_extensions.py
    CalendarServer/trunk/twistedcaldav/test/test_props.py
    CalendarServer/trunk/twistedcaldav/test/test_resource.py
    CalendarServer/trunk/twistedcaldav/test/test_upgrade.py
    CalendarServer/trunk/twistedcaldav/timezonexml.py
    CalendarServer/trunk/twistedcaldav/upgrade.py
    CalendarServer/trunk/txdav/base/propertystore/sql.py
    CalendarServer/trunk/txdav/base/propertystore/xattr.py
    CalendarServer/trunk/txdav/caldav/datastore/test/common.py
    CalendarServer/trunk/txdav/carddav/datastore/test/common.py
    CalendarServer/trunk/txdav/xml/__init__.py
    CalendarServer/trunk/txdav/xml/base.py
    CalendarServer/trunk/txdav/xml/element.py
    CalendarServer/trunk/txdav/xml/extensions.py
    CalendarServer/trunk/txdav/xml/parser_sax.py
    CalendarServer/trunk/txdav/xml/rfc2518.py
    CalendarServer/trunk/txdav/xml/rfc3253.py
    CalendarServer/trunk/txdav/xml/rfc3744.py
    CalendarServer/trunk/txdav/xml/rfc4331.py
    CalendarServer/trunk/txdav/xml/rfc5842.py
    CalendarServer/trunk/txdav/xml/test/test_base.py
    CalendarServer/trunk/txdav/xml/test/test_xml.py

Removed Paths:
-------------
    CalendarServer/trunk/twext/web2/dav/davxml.py

Modified: CalendarServer/trunk/twext/web2/dav/__init__.py
===================================================================
--- CalendarServer/trunk/twext/web2/dav/__init__.py	2012-03-17 03:37:14 UTC (rev 8906)
+++ CalendarServer/trunk/twext/web2/dav/__init__.py	2012-03-17 07:27:16 UTC (rev 8907)
@@ -52,5 +52,4 @@
     "xattrprops",
 ]
 
-from twext.web2.dav import davxml
-
+import txdav.xml.element as davxml

Modified: CalendarServer/trunk/twext/web2/dav/auth.py
===================================================================
--- CalendarServer/trunk/twext/web2/dav/auth.py	2012-03-17 03:37:14 UTC (rev 8906)
+++ CalendarServer/trunk/twext/web2/dav/auth.py	2012-03-17 07:27:16 UTC (rev 8907)
@@ -1,10 +1,24 @@
-from zope.interface import implements, Interface
-from twisted.internet import defer
-from twisted.cred import checkers, error, portal
-from twext.web2.resource import WrapperResource
-from twext.web2.dav import davxml
-from twext.web2.dav.davxml import twisted_private_namespace
-from txdav.xml.element import registerElement
+##
+# Copyright (c) 2005-2012 Apple Computer, Inc. All rights reserved.
+#
+# Permission is hereby granted, free of charge, to any person obtaining a copy
+# of this software and associated documentation files (the "Software"), to deal
+# in the Software without restriction, including without limitation the rights
+# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+# copies of the Software, and to permit persons to whom the Software is
+# furnished to do so, subject to the following conditions:
+# 
+# The above copyright notice and this permission notice shall be included in all
+# copies or substantial portions of the Software.
+# 
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+# SOFTWARE.
+##
 
 __all__ = [
     "IPrincipal",
@@ -14,6 +28,14 @@
     "AuthenticationWrapper",
 ]
 
+from zope.interface import implements, Interface
+from twisted.internet import defer
+from twisted.cred import checkers, error, portal
+from twext.web2.resource import WrapperResource
+from txdav.xml.element import twisted_private_namespace, registerElement
+from txdav.xml.element import WebDAVTextElement, Principal, HRef
+
+
 class AuthenticationWrapper(WrapperResource):
     def __init__(self, resource, portal, credentialFactories, loginInterfaces):
         """
@@ -48,7 +70,7 @@
 
     def requestAvatar(self, avatarId, mind, *interfaces):
         if IPrincipal in interfaces:
-            return IPrincipal, davxml.Principal(davxml.HRef(avatarId[0])), davxml.Principal(davxml.HRef(avatarId[1]))
+            return IPrincipal, Principal(HRef(avatarId[0])), Principal(HRef(avatarId[1]))
         
         raise NotImplementedError("Only IPrincipal interface is supported")
 
@@ -109,7 +131,7 @@
 # Utilities
 ##
 
-class TwistedPasswordProperty (davxml.WebDAVTextElement):
+class TwistedPasswordProperty (WebDAVTextElement):
     namespace = twisted_private_namespace
     name = "password"
 

Deleted: CalendarServer/trunk/twext/web2/dav/davxml.py
===================================================================
--- CalendarServer/trunk/twext/web2/dav/davxml.py	2012-03-17 03:37:14 UTC (rev 8906)
+++ CalendarServer/trunk/twext/web2/dav/davxml.py	2012-03-17 07:27:16 UTC (rev 8907)
@@ -1,73 +0,0 @@
-##
-# Copyright (c) 2005-2012 Apple Computer, Inc. All rights reserved.
-#
-# Permission is hereby granted, free of charge, to any person obtaining a copy
-# of this software and associated documentation files (the "Software"), to deal
-# in the Software without restriction, including without limitation the rights
-# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-# copies of the Software, and to permit persons to whom the Software is
-# furnished to do so, subject to the following conditions:
-# 
-# The above copyright notice and this permission notice shall be included in all
-# copies or substantial portions of the Software.
-# 
-# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
-# SOFTWARE.
-##
-
-"""
-WebDAV XML Support.
-
-This module provides XML utilities for use with WebDAV.
-
-This API is considered private to static.py and is therefore subject to
-change.
-
-See RFC 2518: http://www.ietf.org/rfc/rfc2518.txt (WebDAV)
-See RFC 3253: http://www.ietf.org/rfc/rfc3253.txt (WebDAV + Versioning)
-See RFC 3744: http://www.ietf.org/rfc/rfc3744.txt (WebDAV ACLs)
-"""
-
-#
-# Import all XML element definitions
-#
-
-from txdav.xml.base    import *
-from txdav.xml.parser  import *
-from txdav.xml.rfc2518 import *
-from txdav.xml.rfc3253 import *
-from txdav.xml.rfc3744 import *
-from txdav.xml.rfc4331 import *
-from txdav.xml.rfc5842 import *
-from txdav.xml.extensions import *
-
-#
-# Register all XML elements with the parser
-#
-
-from txdav.xml import base as b
-from txdav.xml import parser as p
-from txdav.xml import rfc2518 as r1
-from txdav.xml import rfc3253 as r2
-from txdav.xml import rfc3744 as r3
-from txdav.xml import rfc4331 as r4
-from txdav.xml import rfc5842 as r5
-from txdav.xml import extensions as e
-
-from txdav.xml.element import registerElements
-
-__all__ = (
-    registerElements(b) +
-    registerElements(p) +
-    registerElements(r1) +
-    registerElements(r2) +
-    registerElements(r3) +
-    registerElements(r4) +
-    registerElements(r5) +
-    registerElements(e)
-)

Modified: CalendarServer/trunk/twext/web2/dav/http.py
===================================================================
--- CalendarServer/trunk/twext/web2/dav/http.py	2012-03-17 03:37:14 UTC (rev 8906)
+++ CalendarServer/trunk/twext/web2/dav/http.py	2012-03-17 07:27:16 UTC (rev 8907)
@@ -47,15 +47,15 @@
 from twext.web2.iweb import IResponse
 from twext.web2.http import Response, HTTPError, StatusResponse
 from twext.web2.http_headers import MimeType
-from twext.web2.dav import davxml
 from twext.web2.dav.util import joinURL
+from txdav.xml import element
 
 log = Logger()
 
 
 class ErrorResponse(Response):
     """
-    A L{Response} object which contains a status code and a L{davxml.Error}
+    A L{Response} object which contains a status code and a L{element.Error}
     element.
     Renders itself as a DAV:error XML document.
     """
@@ -65,7 +65,7 @@
     def __init__(self, code, error, description=None):
         """
         @param code: a response code.
-        @param error: an L{davxml.WebDAVElement} identifying the error, or a
+        @param error: an L{WebDAVElement} identifying the error, or a
             tuple C{(namespace, name)} with which to create an empty element
             denoting the error.  (The latter is useful in the case of
             preconditions ans postconditions, not all of which have defined
@@ -75,15 +75,15 @@
         """
         if type(error) is tuple:
             xml_namespace, xml_name = error
-            error = davxml.WebDAVUnknownElement()
+            error = element.WebDAVUnknownElement()
             error.namespace = xml_namespace
             error.name = xml_name
 
         self.description = description
         if self.description:
-            output = davxml.Error(error, davxml.ErrorDescription(self.description)).toxml()
+            output = element.Error(error, element.ErrorDescription(self.description)).toxml()
         else:
-            output = davxml.Error(error).toxml()
+            output = element.Error(error).toxml()
 
         Response.__init__(self, code=code, stream=output)
 
@@ -114,10 +114,10 @@
                 uri = joinURL(base_uri, subpath)
 
             for p in privileges:
-                denials.append(davxml.Resource(davxml.HRef(uri), 
-                                               davxml.Privilege(p)))
+                denials.append(element.Resource(element.HRef(uri), 
+                                               element.Privilege(p)))
 
-        super(NeedPrivilegesResponse, self).__init__(responsecode.FORBIDDEN, davxml.NeedPrivileges(*denials))
+        super(NeedPrivilegesResponse, self).__init__(responsecode.FORBIDDEN, element.NeedPrivileges(*denials))
 
 class MultiStatusResponse (Response):
     """
@@ -126,10 +126,10 @@
     """
     def __init__(self, xml_responses):
         """
-        @param xml_responses: an interable of davxml.Response objects.
+        @param xml_responses: an interable of element.Response objects.
         """
         Response.__init__(self, code=responsecode.MULTI_STATUS,
-                          stream=davxml.MultiStatus(*xml_responses).toxml())
+                          stream=element.MultiStatus(*xml_responses).toxml())
 
         self.headers.setHeader("content-type", MimeType("text", "xml"))
 
@@ -181,13 +181,13 @@
         uri = path[self.path_basename_len:]
 
         children = []
-        children.append(davxml.HRef(uri))
-        children.append(davxml.Status.fromResponseCode(code))
+        children.append(element.HRef(uri))
+        children.append(element.Status.fromResponseCode(code))
         if error is not None:
             children.append(error)
         if message is not None:
-            children.append(davxml.ResponseDescription(message))
-        self.responses.append(davxml.StatusResponse(*children))
+            children.append(element.ResponseDescription(message))
+        self.responses.append(element.StatusResponse(*children))
 
     def response(self):
         """
@@ -237,19 +237,19 @@
 
         if len(property.children) > 0:
             # Re-instantiate as empty element.
-            property = davxml.WebDAVUnknownElement.withName(property.namespace, property.name)
+            property = element.WebDAVUnknownElement.withName(property.namespace, property.name)
 
         if code > 400: # Error codes only
             log.err("Error during %s for %s: %s" % (self.method, property, message))
 
         children = []
-        children.append(davxml.PropertyContainer(property))
-        children.append(davxml.Status.fromResponseCode(code))
+        children.append(element.PropertyContainer(property))
+        children.append(element.Status.fromResponseCode(code))
         if error is not None:
             children.append(error)
         if message is not None:
-            children.append(davxml.ResponseDescription(message))
-        self.propstats.append(davxml.PropertyStatus(*children))
+            children.append(element.ResponseDescription(message))
+        self.propstats.append(element.PropertyStatus(*children))
 
     def error(self):
         """
@@ -260,32 +260,32 @@
             changed_status = False
             newchildren = []
             for child in propstat.children:
-                if isinstance(child, davxml.Status) and (child.code / 100 == 2):
+                if isinstance(child, element.Status) and (child.code / 100 == 2):
                     # Change the code
-                    newchildren.append(davxml.Status.fromResponseCode(responsecode.FAILED_DEPENDENCY))
+                    newchildren.append(element.Status.fromResponseCode(responsecode.FAILED_DEPENDENCY))
                     changed_status = True
-                elif changed_status and isinstance(child, davxml.ResponseDescription):
-                    newchildren.append(davxml.ResponseDescription(responsecode.RESPONSES[responsecode.FAILED_DEPENDENCY]))
+                elif changed_status and isinstance(child, element.ResponseDescription):
+                    newchildren.append(element.ResponseDescription(responsecode.RESPONSES[responsecode.FAILED_DEPENDENCY]))
                 else:
                     newchildren.append(child)
-            self.propstats[index] = davxml.PropertyStatus(*newchildren)
+            self.propstats[index] = element.PropertyStatus(*newchildren)
 
     def response(self):
         """
         Generate a response from the responses contained in the queue or, if
         there are no such responses, return the C{success_response} provided to
         L{__init__}.
-        @return: a L{davxml.PropertyStatusResponse}.
+        @return: a L{element.PropertyStatusResponse}.
         """
         if self.propstats:
-            return davxml.PropertyStatusResponse(
-                davxml.HRef(self.uri),
+            return element.PropertyStatusResponse(
+                element.HRef(self.uri),
                 *self.propstats
             )
         else:
-            return davxml.StatusResponse(
-                davxml.HRef(self.uri),
-                davxml.Status.fromResponseCode(self.success_response)
+            return element.StatusResponse(
+                element.HRef(self.uri),
+                element.Status.fromResponseCode(self.success_response)
             )
 
 ##
@@ -331,7 +331,7 @@
 
 def errorForFailure(failure):
     if failure.check(HTTPError) and isinstance(failure.value.response, ErrorResponse):
-        return davxml.Error(failure.value.response.error)
+        return element.Error(failure.value.response.error)
     else:
         return None
 

Modified: CalendarServer/trunk/twext/web2/dav/method/prop_common.py
===================================================================
--- CalendarServer/trunk/twext/web2/dav/method/prop_common.py	2012-03-17 03:37:14 UTC (rev 8906)
+++ CalendarServer/trunk/twext/web2/dav/method/prop_common.py	2012-03-17 07:27:16 UTC (rev 8907)
@@ -13,8 +13,7 @@
 
 from twext.python.log import Logger
 from twext.web2 import responsecode
-from twext.web2.dav import davxml
-from txdav.xml.base import WebDAVElement
+from txdav.xml import element
 from twext.web2.dav.http import statusForFailure
 from twext.web2.dav.method.propfind import propertyName
 
@@ -33,20 +32,20 @@
         for status in properties_by_status:
             properties = properties_by_status[status]
             if properties:
-                xml_status = davxml.Status.fromResponseCode(status)
-                xml_container = davxml.PropertyContainer(*properties)
-                xml_propstat = davxml.PropertyStatus(xml_container, xml_status)
+                xml_status = element.Status.fromResponseCode(status)
+                xml_container = element.PropertyContainer(*properties)
+                xml_propstat = element.PropertyStatus(xml_container, xml_status)
 
                 propstats.append(xml_propstat)
 
         if propstats:
-            responses.append(davxml.PropertyStatusResponse(href, *propstats))
+            responses.append(element.PropertyStatusResponse(href, *propstats))
 
     else:
         responses.append(
-            davxml.StatusResponse(
+            element.StatusResponse(
                 href,
-                davxml.Status.fromResponseCode(responsecode.OK),
+                element.Status.fromResponseCode(responsecode.OK),
             )
         )
 
@@ -77,7 +76,7 @@
     }
     
     for property in props:
-        if isinstance(property, WebDAVElement):
+        if isinstance(property, element.WebDAVElement):
             qname = property.qname()
         else:
             qname = property

Modified: CalendarServer/trunk/twext/web2/dav/method/report_expand.py
===================================================================
--- CalendarServer/trunk/twext/web2/dav/method/report_expand.py	2012-03-17 03:37:14 UTC (rev 8906)
+++ CalendarServer/trunk/twext/web2/dav/method/report_expand.py	2012-03-17 07:27:16 UTC (rev 8907)
@@ -32,8 +32,8 @@
 
 from twext.python.log import Logger
 from twext.web2 import responsecode
-from twext.web2.dav import davxml
-from twext.web2.dav.davxml import dav_namespace
+from txdav.xml import element
+from txdav.xml.element import dav_namespace
 from twext.web2.dav.http import statusForFailure, MultiStatusResponse
 from twext.web2.dav.method import prop_common
 from twext.web2.dav.method.propfind import propertyName
@@ -52,9 +52,9 @@
     TODO: for simplicity we will only support one level of expansion.
     """
     # Verify root element
-    if not isinstance(expand_property, davxml.ExpandProperty):
+    if not isinstance(expand_property, element.ExpandProperty):
         raise ValueError("%s expected as root element, not %s."
-                         % (davxml.ExpandProperty.sname(), expand_property.sname()))
+                         % (element.ExpandProperty.sname(), expand_property.sname()))
 
     # Only handle Depth: 0
     depth = request.headers.getHeader("depth", "0")
@@ -102,27 +102,27 @@
             prop = (yield self.readProperty(qname, request))
             
             # Form the PROPFIND-style DAV:prop element we need later
-            props_to_return = davxml.PropertyContainer(*properties[qname])
+            props_to_return = element.PropertyContainer(*properties[qname])
 
             # Now dereference any HRefs
             responses = []
             for href in prop.children:
-                if isinstance(href, davxml.HRef):
+                if isinstance(href, element.HRef):
                     
                     # Locate the Href resource and its parent
                     resource_uri = str(href)
                     child = (yield request.locateResource(resource_uri))
     
                     if not child or not child.exists():
-                        responses.append(davxml.StatusResponse(href, davxml.Status.fromResponseCode(responsecode.NOT_FOUND)))
+                        responses.append(element.StatusResponse(href, element.Status.fromResponseCode(responsecode.NOT_FOUND)))
                         continue
                     parent = (yield request.locateResource(parentForURL(resource_uri)))
     
                     # Check privileges on parent - must have at least DAV:read
                     try:
-                        yield parent.checkPrivileges(request, (davxml.Read(),))
+                        yield parent.checkPrivileges(request, (element.Read(),))
                     except AccessDeniedError:
-                        responses.append(davxml.StatusResponse(href, davxml.Status.fromResponseCode(responsecode.FORBIDDEN)))
+                        responses.append(element.StatusResponse(href, element.Status.fromResponseCode(responsecode.FORBIDDEN)))
                         continue
                     
                     # Cache the last parent's inherited aces for checkPrivileges optimization
@@ -135,9 +135,9 @@
 
                     # Check privileges - must have at least DAV:read
                     try:
-                        yield child.checkPrivileges(request, (davxml.Read(),), inherited_aces=filteredaces)
+                        yield child.checkPrivileges(request, (element.Read(),), inherited_aces=filteredaces)
                     except AccessDeniedError:
-                        responses.append(davxml.StatusResponse(href, davxml.Status.fromResponseCode(responsecode.FORBIDDEN)))
+                        responses.append(element.StatusResponse(href, element.Status.fromResponseCode(responsecode.FORBIDDEN)))
                         continue
             
                     # Now retrieve all the requested properties on the HRef resource
@@ -163,11 +163,11 @@
 
     # Build the overall response
     propstats = [
-        davxml.PropertyStatus(
-            davxml.PropertyContainer(*properties_by_status[status]),
-            davxml.Status.fromResponseCode(status)
+        element.PropertyStatus(
+            element.PropertyContainer(*properties_by_status[status]),
+            element.Status.fromResponseCode(status)
         )
         for status in properties_by_status if properties_by_status[status]
     ]
 
-    returnValue(MultiStatusResponse((davxml.PropertyStatusResponse(davxml.HRef(request.uri), *propstats),)))
+    returnValue(MultiStatusResponse((element.PropertyStatusResponse(element.HRef(request.uri), *propstats),)))

Modified: CalendarServer/trunk/twext/web2/dav/method/report_principal_match.py
===================================================================
--- CalendarServer/trunk/twext/web2/dav/method/report_principal_match.py	2012-03-17 03:37:14 UTC (rev 8906)
+++ CalendarServer/trunk/twext/web2/dav/method/report_principal_match.py	2012-03-17 07:27:16 UTC (rev 8907)
@@ -35,8 +35,8 @@
 from twext.python.log import Logger
 from twext.web2 import responsecode
 from twext.web2.http import StatusResponse, HTTPError
-from twext.web2.dav import davxml
-from twext.web2.dav.davxml import dav_namespace
+from txdav.xml import element
+from txdav.xml.element import dav_namespace
 from twext.web2.dav.http import ErrorResponse, MultiStatusResponse
 from twext.web2.dav.method import prop_common
 from twext.web2.dav.method.report import NumberOfMatchesWithinLimits
@@ -51,9 +51,9 @@
     Generate a principal-match REPORT. (RFC 3744, section 9.3)
     """
     # Verify root element
-    if not isinstance(principal_match, davxml.PrincipalMatch):
+    if not isinstance(principal_match, element.PrincipalMatch):
         raise ValueError("%s expected as root element, not %s."
-                         % (davxml.PrincipalMatch.sname(), principal_match.sname()))
+                         % (element.PrincipalMatch.sname(), principal_match.sname()))
 
     # Only handle Depth: 0
     depth = request.headers.getHeader("depth", "0")
@@ -130,7 +130,7 @@
                         d = waitForDeferred(prop_common.responseForHref(
                             request,
                             responses,
-                            davxml.HRef.fromString(uri),
+                            element.HRef.fromString(uri),
                             principal,
                             propertiesForResource,
                             propElement
@@ -147,7 +147,7 @@
         
             children = []
             d = waitForDeferred(self.findChildren("infinity", request, lambda x, y: children.append((x,y)),
-                                                  privileges=(davxml.Read(),), inherited_aces=filteredaces))
+                                                  privileges=(element.Read(),), inherited_aces=filteredaces))
             yield d
             d.getResult()
 
@@ -159,7 +159,7 @@
                     prop = prop.getResult()
                     if prop: prop.removeWhitespaceNodes()
 
-                    if prop and len(prop.children) == 1 and isinstance(prop.children[0], davxml.HRef):
+                    if prop and len(prop.children) == 1 and isinstance(prop.children[0], element.HRef):
                         # Find principal associated with this property and test it
                         principal = waitForDeferred(request.locateResource(str(prop.children[0])))
                         yield principal
@@ -178,7 +178,7 @@
                                 d = waitForDeferred(prop_common.responseForHref(
                                     request,
                                     responses,
-                                    davxml.HRef.fromString(uri),
+                                    element.HRef.fromString(uri),
                                     child,
                                     propertiesForResource,
                                     propElement
@@ -194,7 +194,7 @@
         log.err("Too many matching components in principal-match report")
         raise HTTPError(ErrorResponse(
             responsecode.FORBIDDEN,
-            davxml.NumberOfMatchesWithinLimits()
+            element.NumberOfMatchesWithinLimits()
         ))
 
     yield MultiStatusResponse(responses)

Modified: CalendarServer/trunk/twext/web2/dav/method/report_principal_property_search.py
===================================================================
--- CalendarServer/trunk/twext/web2/dav/method/report_principal_property_search.py	2012-03-17 03:37:14 UTC (rev 8906)
+++ CalendarServer/trunk/twext/web2/dav/method/report_principal_property_search.py	2012-03-17 07:27:16 UTC (rev 8907)
@@ -34,8 +34,9 @@
 from twext.python.log import Logger
 from twext.web2 import responsecode
 from twext.web2.http import HTTPError, StatusResponse
-from twext.web2.dav import davxml
-from twext.web2.dav.davxml import dav_namespace
+from txdav.xml.base import PCDATAElement
+from txdav.xml import element
+from txdav.xml.element import dav_namespace
 from twext.web2.dav.http import ErrorResponse, MultiStatusResponse
 from twext.web2.dav.method import prop_common
 from twext.web2.dav.method.report import NumberOfMatchesWithinLimits
@@ -51,9 +52,9 @@
     """
 
     # Verify root element
-    if not isinstance(principal_property_search, davxml.PrincipalPropertySearch):
+    if not isinstance(principal_property_search, element.PrincipalPropertySearch):
         raise ValueError("%s expected as root element, not %s."
-                         % (davxml.PrincipalPropertySearch.sname(), principal_property_search.sname()))
+                         % (element.PrincipalPropertySearch.sname(), principal_property_search.sname()))
 
     # Only handle Depth: 0
     depth = request.headers.getHeader("depth", "0")
@@ -73,9 +74,9 @@
         elif child.qname() == (dav_namespace, "apply-to-principal-collection-set"):
             applyTo = True
         elif child.qname() == (dav_namespace, "property-search"):
-            props = child.childOfType(davxml.PropertyContainer)
+            props = child.childOfType(element.PropertyContainer)
             props.removeWhitespaceNodes()
-            match = child.childOfType(davxml.Match)
+            match = child.childOfType(element.Match)
             propertySearches.append((props.children, str(match).lower()))
     
     def nodeMatch(node, match):
@@ -88,7 +89,7 @@
         """
         node.removeWhitespaceNodes()
         for child in node.children:
-            if isinstance(child, davxml.PCDATAElement):
+            if isinstance(child, PCDATAElement):
                 comp = str(child).lower()
                 if comp.find(match) != -1:
                     return True
@@ -152,7 +153,7 @@
 
             children = []
             d = waitForDeferred(resource.findChildren("infinity", request, lambda x, y: children.append((x,y)),
-                                                      privileges=(davxml.Read(),), inherited_aces=filteredaces))
+                                                      privileges=(element.Read(),), inherited_aces=filteredaces))
             yield d
             d.getResult()
 
@@ -170,7 +171,7 @@
                         d = waitForDeferred(prop_common.responseForHref(
                             request,
                             responses,
-                            davxml.HRef.fromString(uri),
+                            element.HRef.fromString(uri),
                             child,
                             propertiesForResource,
                             propElement
@@ -182,7 +183,7 @@
         log.err("Too many matching components in prinicpal-property-search report")
         raise HTTPError(ErrorResponse(
             responsecode.FORBIDDEN,
-            davxml.NumberOfMatchesWithinLimits()
+            element.NumberOfMatchesWithinLimits()
         ))
 
     yield MultiStatusResponse(responses)

Modified: CalendarServer/trunk/twext/web2/dav/resource.py
===================================================================
--- CalendarServer/trunk/twext/web2/dav/resource.py	2012-03-17 03:37:14 UTC (rev 8906)
+++ CalendarServer/trunk/twext/web2/dav/resource.py	2012-03-17 07:27:16 UTC (rev 8907)
@@ -70,11 +70,13 @@
 from twext.web2.dav.noneprops import NonePropertyStore
 from twext.web2.dav.util import unimplemented, parentForURL, joinURL
 from twext.web2.dav.auth import PrincipalCredentials
-from twext.web2.dav import davxml
-from txdav.xml.base import dav_namespace
-from txdav.xml.base import twisted_dav_namespace, twisted_private_namespace
+from txdav.xml import element
+from txdav.xml.element import WebDAVElement, WebDAVEmptyElement, WebDAVTextElement
+from txdav.xml.element import dav_namespace
+from txdav.xml.element import twisted_dav_namespace, twisted_private_namespace
 from txdav.xml.element import registerElement, lookupElement
 
+
 log = Logger()
 
 
@@ -174,8 +176,8 @@
         @return: a dict-like object from which one can read and to
             which one can write dead properties.  Keys are qname
             tuples (i.e. C{(namespace, name)}) as returned by
-            L{davxml.WebDAVElement.qname()} and values are
-            L{davxml.WebDAVElement} instances.
+            L{WebDAVElement.qname()} and values are
+            L{WebDAVElement} instances.
         """
         if not hasattr(self, "_dead_properties"):
             self._dead_properties = NonePropertyStore(self)
@@ -228,20 +230,20 @@
                     if self.deadProperties().contains(qname):
                         returnValue(self.deadProperties().get(qname))
                     if self.isCollection():
-                        returnValue(davxml.ResourceType.collection) #@UndefinedVariable
-                    returnValue(davxml.ResourceType.empty) #@UndefinedVariable
+                        returnValue(element.ResourceType.collection) #@UndefinedVariable
+                    returnValue(element.ResourceType.empty) #@UndefinedVariable
 
                 if name == "getetag":
                     etag = (yield self.etag())
                     if etag is None:
                         returnValue(None)
-                    returnValue(davxml.GETETag(etag.generate()))
+                    returnValue(element.GETETag(etag.generate()))
 
                 if name == "getcontenttype":
                     mimeType = self.contentType()
                     if mimeType is None:
                         returnValue(None)
-                    returnValue(davxml.GETContentType(generateContentType(mimeType)))
+                    returnValue(element.GETContentType(generateContentType(mimeType)))
 
                 if name == "getcontentlength":
                     length = self.contentLength()
@@ -249,43 +251,43 @@
                         # TODO: really we should "render" the resource and 
                         # determine its size from that but for now we just 
                         # return an empty element.
-                        returnValue(davxml.GETContentLength(""))
+                        returnValue(element.GETContentLength(""))
                     else:
-                        returnValue(davxml.GETContentLength(str(length)))
+                        returnValue(element.GETContentLength(str(length)))
 
                 if name == "getlastmodified":
                     lastModified = self.lastModified()
                     if lastModified is None:
                         returnValue(None)
-                    returnValue(davxml.GETLastModified.fromDate(lastModified))
+                    returnValue(element.GETLastModified.fromDate(lastModified))
 
                 if name == "creationdate":
                     creationDate = self.creationDate()
                     if creationDate is None:
                         returnValue(None)
-                    returnValue(davxml.CreationDate.fromDate(creationDate))
+                    returnValue(element.CreationDate.fromDate(creationDate))
 
                 if name == "displayname":
                     displayName = self.displayName()
                     if displayName is None:
                         returnValue(None)
-                    returnValue(davxml.DisplayName(displayName))
+                    returnValue(element.DisplayName(displayName))
 
                 if name == "supportedlock":
-                    returnValue(davxml.SupportedLock(
-                        davxml.LockEntry(
-                            davxml.LockScope.exclusive, #@UndefinedVariable
-                            davxml.LockType.write #@UndefinedVariable
+                    returnValue(element.SupportedLock(
+                        element.LockEntry(
+                            element.LockScope.exclusive, #@UndefinedVariable
+                            element.LockType.write #@UndefinedVariable
                         ),
-                        davxml.LockEntry(
-                            davxml.LockScope.shared, #@UndefinedVariable
-                            davxml.LockType.write #@UndefinedVariable
+                        element.LockEntry(
+                            element.LockScope.shared, #@UndefinedVariable
+                            element.LockType.write #@UndefinedVariable
                         ),
                     ))
 
                 if name == "supported-report-set":
-                    returnValue(davxml.SupportedReportSet(*[
-                        davxml.SupportedReport(report,)
+                    returnValue(element.SupportedReportSet(*[
+                        element.SupportedReport(report,)
                         for report in self.supportedReports()
                     ]))
 
@@ -293,14 +295,14 @@
                     returnValue((yield self.supportedPrivileges(request)))
 
                 if name == "acl-restrictions":
-                    returnValue(davxml.ACLRestrictions())
+                    returnValue(element.ACLRestrictions())
 
                 if name == "inherited-acl-set":
-                    returnValue(davxml.InheritedACLSet(*self.inheritedACLSet()))
+                    returnValue(element.InheritedACLSet(*self.inheritedACLSet()))
 
                 if name == "principal-collection-set":
-                    returnValue(davxml.PrincipalCollectionSet(*[
-                        davxml.HRef(
+                    returnValue(element.PrincipalCollectionSet(*[
+                        element.HRef(
                             principalCollection.principalCollectionURL()
                         )
                         for principalCollection in self.principalCollections()
@@ -323,9 +325,9 @@
                     @inlineCallbacks
                     def callback():
                         privs = yield self.currentPrivileges(request)
-                        returnValue(davxml.CurrentUserPrivilegeSet(*privs))
+                        returnValue(element.CurrentUserPrivilegeSet(*privs))
                     returnValue((yield ifAllowed(
-                        (davxml.ReadCurrentUserPrivilegeSet(),),
+                        (element.ReadCurrentUserPrivilegeSet(),),
                         callback
                     )))
 
@@ -334,14 +336,14 @@
                     def callback():
                         acl = yield self.accessControlList(request)
                         if acl is None:
-                            acl = davxml.ACL()
+                            acl = element.ACL()
                         returnValue(acl)
                     returnValue(
-                        (yield ifAllowed((davxml.ReadACL(),), callback))
+                        (yield ifAllowed((element.ReadACL(),), callback))
                     )
 
                 if name == "current-user-principal":
-                    returnValue(davxml.CurrentUserPrincipal(
+                    returnValue(element.CurrentUserPrincipal(
                         self.currentPrincipal(request).children[0]
                     ))
 
@@ -353,7 +355,7 @@
                             "Property %s does not exist." % (sname,)
                         ))
                     else:
-                        returnValue(davxml.QuotaAvailableBytes(str(qvalue[0])))
+                        returnValue(element.QuotaAvailableBytes(str(qvalue[0])))
 
                 if name == "quota-used-bytes":
                     qvalue = yield self.quota(request)
@@ -363,7 +365,7 @@
                             "Property %s does not exist." % (sname,)
                         ))
                     else:
-                        returnValue(davxml.QuotaUsedBytes(str(qvalue[1])))
+                        returnValue(element.QuotaUsedBytes(str(qvalue[1])))
 
             elif namespace == twisted_dav_namespace:
                 if name == "resource-class":
@@ -384,7 +386,7 @@
         """
         See L{IDAVResource.writeProperty}.
         """
-        assert isinstance(property, davxml.WebDAVElement), (
+        assert isinstance(property, WebDAVElement), (
             "Not a property: %r" % (property,)
         )
 
@@ -546,17 +548,17 @@
     # to override the values of some HTTP metadata.
     #
     def contentType(self):
-        if self.hasDeadProperty((davxml.dav_namespace, "getcontenttype")):
+        if self.hasDeadProperty((element.dav_namespace, "getcontenttype")):
             return self.readDeadProperty(
-                (davxml.dav_namespace, "getcontenttype")
+                (element.dav_namespace, "getcontenttype")
             ).mimeType()
         else:
             return super(DAVPropertyMixIn, self).contentType()
 
     def displayName(self):
-        if self.hasDeadProperty((davxml.dav_namespace, "displayname")):
+        if self.hasDeadProperty((element.dav_namespace, "displayname")):
             return str(self.readDeadProperty(
-                (davxml.dav_namespace, "displayname")
+                (element.dav_namespace, "displayname")
             ))
         else:
             return super(DAVPropertyMixIn, self).displayName()
@@ -807,7 +809,7 @@
         for ace in acl.children:
             for privilege in tuple(pending):
                 if not self.matchPrivilege(
-                    davxml.Privilege(privilege), ace.privileges, privyset
+                    element.Privilege(privilege), ace.privileges, privyset
                 ):
                     continue
 
@@ -862,7 +864,7 @@
 
         aces.extend(inherited_aces)
 
-        acl = davxml.ACL(*aces)
+        acl = element.ACL(*aces)
 
         return acl
     
@@ -874,10 +876,10 @@
         expand-property.
         """
         result = []
-        result.append(davxml.Report(davxml.ACLPrincipalPropSet(),))
-        result.append(davxml.Report(davxml.PrincipalMatch(),))
-        result.append(davxml.Report(davxml.PrincipalPropertySearch(),))
-        result.append(davxml.Report(davxml.ExpandProperty(),))
+        result.append(element.Report(element.ACLPrincipalPropSet(),))
+        result.append(element.Report(element.PrincipalMatch(),))
+        result.append(element.Report(element.PrincipalPropertySearch(),))
+        result.append(element.Report(element.ExpandProperty(),))
         return result
 
     ##
@@ -907,7 +909,7 @@
             def translateError(response):
                 return Failure(HTTPError(response))
 
-            if request.authnUser == davxml.Principal(davxml.Unauthenticated()):
+            if request.authnUser == element.Principal(element.Unauthenticated()):
                 return UnauthorizedResponse.makeResponse(
                     request.credentialFactories,
                     request.remoteAddr).addCallback(translateError)
@@ -933,7 +935,7 @@
         necessary authentication metadata.
 
         If the request was not thusly prepared, both C{authzUser} and
-        C{authnUser} will be L{davxml.Unauthenticated}.
+        C{authnUser} will be L{element.Unauthenticated}.
 
         @param request: the request which may contain authentication
             information and a reference to a portal to authenticate
@@ -949,8 +951,8 @@
         if not (hasattr(request, 'portal') and
                 hasattr(request, 'credentialFactories') and
                 hasattr(request, 'loginInterfaces')):
-            request.authnUser = davxml.Principal(davxml.Unauthenticated())
-            request.authzUser = davxml.Principal(davxml.Unauthenticated())
+            request.authnUser = element.Principal(element.Unauthenticated())
+            request.authzUser = element.Principal(element.Unauthenticated())
             return succeed((request.authnUser, request.authzUser))
 
         authHeader = request.headers.getHeader('authorization')
@@ -1021,8 +1023,8 @@
                 # This request has already been authenticated via the wiki
                 return succeed((request.authnUser, request.authzUser))
 
-            request.authnUser = davxml.Principal(davxml.Unauthenticated())
-            request.authzUser = davxml.Principal(davxml.Unauthenticated())
+            request.authnUser = element.Principal(element.Unauthenticated())
+            request.authzUser = element.Principal(element.Unauthenticated())
             return succeed((request.authnUser, request.authzUser))
 
     ##
@@ -1051,7 +1053,7 @@
 
     def defaultRootAccessControlList(self):
         """
-        @return: the L{davxml.ACL} element containing the default
+        @return: the L{element.ACL} element containing the default
             access control list for this resource.
         """
         #
@@ -1063,14 +1065,14 @@
 
     def defaultAccessControlList(self):
         """
-        @return: the L{davxml.ACL} element containing the default
+        @return: the L{element.ACL} element containing the default
             access control list for this resource.
         """
         #
         # The default behaviour is no ACL; we should inherit from the parent
         # collection.
         #
-        return davxml.ACL()
+        return element.ACL()
 
     def setAccessControlList(self, acl):
         """
@@ -1092,7 +1094,7 @@
         entry. This is the behaviour required by the C{ACL}
         request. (RFC 3744, section 8.1).
 
-        @param new_acl:  an L{davxml.ACL} element
+        @param new_acl:  an L{element.ACL} element
         @param request: the request being processed.
         @return: a tuple of the C{DAV:error} precondition element if
             an error occurred, C{None} otherwise.
@@ -1133,14 +1135,14 @@
             and recurse into any DAV:SupportedPrivilege's
             """
             for item in sp.children:
-                if isinstance(item, davxml.Privilege):
+                if isinstance(item, element.Privilege):
                     supported.append(item.children[0])
-                elif isinstance(item, davxml.SupportedPrivilege):
+                elif isinstance(item, element.SupportedPrivilege):
                     addSupportedPrivilege(item)
 
         supportedPrivs = (yield self.supportedPrivileges(request))
         for item in supportedPrivs.children:
-            assert isinstance(item, davxml.SupportedPrivilege), (
+            assert isinstance(item, element.SupportedPrivilege), (
                 "Not a SupportedPrivilege: %r" % (item,)
             )
             addSupportedPrivilege(item)
@@ -1156,7 +1158,7 @@
                                 "on resource %r"
                                 % (old_ace, self))
                         returnValue((
-                            davxml.dav_namespace,
+                            element.dav_namespace,
                             "no-protected-ace-conflict"
                         ))
 
@@ -1177,7 +1179,7 @@
                     #    log.err("Attempt to overwrite inherited ace %r "
                     #            "on resource %r" % (old_ace, self))
                     #    returnValue((
-                    #        davxml.dav_namespace,
+                    #        element.dav_namespace,
                     #        "no-inherited-ace-conflict"
                     #    ))
 
@@ -1186,7 +1188,7 @@
                 log.err("Attempt to set grant ace %r after deny ace "
                         "on resource %r"
                         % (ace, self))
-                returnValue((davxml.dav_namespace, "deny-before-grant"))
+                returnValue((element.dav_namespace, "deny-before-grant"))
             got_deny = not ace.allow
 
             # Step 4: ignore as this server has no abstract privileges
@@ -1199,19 +1201,19 @@
                             "in ace %r on resource %r"
                             % (privilege.children[0], ace, self))
                     returnValue((
-                        davxml.dav_namespace,
+                        element.dav_namespace,
                         "not-supported-privilege"
                     ))
 
             if ace.protected:
                 log.err("Attempt to create protected ace %r on resource %r"
                         % (ace, self))
-                returnValue((davxml.dav_namespace, "no-ace-conflict"))
+                returnValue((element.dav_namespace, "no-ace-conflict"))
 
             if ace.inherited:
                 log.err("Attempt to create inherited ace %r on resource %r"
                         % (ace, self))
-                returnValue((davxml.dav_namespace, "no-ace-conflict"))
+                returnValue((element.dav_namespace, "no-ace-conflict"))
 
             # Step 6
             valid = (yield self.validPrincipal(ace.principal, request))
@@ -1220,7 +1222,7 @@
                 log.err("Attempt to use unrecognized principal %r "
                         "in ace %r on resource %r"
                         % (ace.principal, ace, self))
-                returnValue((davxml.dav_namespace, "recognized-principal"))
+                returnValue((element.dav_namespace, "recognized-principal"))
 
         # Step 8 & 9
         #
@@ -1257,7 +1259,7 @@
         command.
         @param new_aces: C{list} of L{ACE} for ACL being set.
         """
-        return self.setAccessControlList(davxml.ACL(*new_aces))
+        return self.setAccessControlList(element.ACL(*new_aces))
 
 
     def matchPrivilege(self, privilege, ace_privileges, supportedPrivileges):
@@ -1281,15 +1283,15 @@
         (RFC 3744, section 5.5)
 
         @param request: the request being processed.
-        @param privileges: an iterable of L{davxml.WebDAVElement}
+        @param privileges: an iterable of L{WebDAVElement}
             elements denoting access control privileges.
         @param recurse: C{True} if a recursive check on all child
             resources of this resource should be performed as well,
             C{False} otherwise.
-        @param principal: the L{davxml.Principal} to check privileges
+        @param principal: the L{element.Principal} to check privileges
             for.  If C{None}, it is deduced from C{request} by calling
             L{currentPrincipal}.
-        @param inherited_aces: a list of L{davxml.ACE}s corresponding
+        @param inherited_aces: a list of L{element.ACE}s corresponding
             to the pre-computed inheritable aces from the parent
             resource hierarchy.
         @return: a L{Deferred} that callbacks with C{None} or errbacks
@@ -1334,7 +1336,7 @@
             for ace in acl.children:
                 for privilege in tuple(pending):
                     if not self.matchPrivilege(
-                        davxml.Privilege(privilege),
+                        element.Privilege(privilege),
                         ace.privileges, supportedPrivs
                     ):
                         continue
@@ -1425,7 +1427,7 @@
             return url
 
         try:
-            acl = self.readDeadProperty(davxml.ACL)
+            acl = self.readDeadProperty(element.ACL)
         except HTTPError, e:
             assert e.response.code == responsecode.NOT_FOUND, (
                 "Expected %s response from readDeadProperty() exception, "
@@ -1475,9 +1477,9 @@
                                 children = list(ace.children)
                                 children.remove(TwistedACLInheritable())
                                 children.append(
-                                    davxml.Inherited(davxml.HRef(parentURL))
+                                    element.Inherited(element.HRef(parentURL))
                                 )
-                                aces.append(davxml.ACE(*children))
+                                aces.append(element.ACE(*children))
             else:
                 aces.extend(inherited_aces)
 
@@ -1486,14 +1488,14 @@
             # inheritance.
             if not expanding:
                 aces = [
-                    davxml.ACE(*[
+                    element.ACE(*[
                         c for c in ace.children
                         if c != TwistedACLInheritable()
                     ])
                     for ace in aces
                 ]
 
-            acl = davxml.ACL(*aces)
+            acl = element.ACL(*aces)
 
         returnValue(acl)
 
@@ -1527,11 +1529,11 @@
                     children = list(ace.children)
                     children.remove(TwistedACLInheritable())
                     children.append(
-                        davxml.Inherited(
-                            davxml.HRef(request.urlForResource(self))
+                        element.Inherited(
+                            element.HRef(request.urlForResource(self))
                         )
                     )
-                    aces.append(davxml.ACE(*children))
+                    aces.append(element.ACE(*children))
             return aces
 
         d = self.accessControlList(request, inheritance=True, expanding=True)
@@ -1540,7 +1542,7 @@
 
     def inheritedACLSet(self):
         """
-        @return: a sequence of L{davxml.HRef}s from which ACLs are
+        @return: a sequence of L{element.HRef}s from which ACLs are
         inherited.
 
         This implementation returns an empty set.
@@ -1628,12 +1630,12 @@
         principal2 = principal2.children[0]
 
         if type(principal1) == type(principal2):
-            if isinstance(principal1, davxml.Property):
+            if isinstance(principal1, element.Property):
                 return (
                     type(principal1.children[0]) ==
                     type(principal2.children[0])
                 )
-            elif isinstance(principal1, davxml.HRef):
+            elif isinstance(principal1, element.HRef):
                 return (
                     str(principal1.children[0]) ==
                     str(principal2.children[0])
@@ -1649,7 +1651,7 @@
         by principal2.
 
         @param principal1: a L{Principal} to test. C{principal1} must
-            contain a L{davxml.HRef} or L{davxml.Unauthenticated}
+            contain a L{element.HRef} or L{element.Unauthenticated}
             element.
         @param principal2: a L{Principal} to test.
         @param request: the request being processed.
@@ -1671,27 +1673,27 @@
             return succeed(match)
 
         def doMatch():
-            if isinstance(principal2, davxml.All):
+            if isinstance(principal2, element.All):
                 return succeed(True)
 
-            elif isinstance(principal2, davxml.Authenticated):
-                if isinstance(principal1, davxml.Unauthenticated):
+            elif isinstance(principal2, element.Authenticated):
+                if isinstance(principal1, element.Unauthenticated):
                     return succeed(False)
-                elif isinstance(principal1, davxml.All):
+                elif isinstance(principal1, element.All):
                     return succeed(False)
                 else:
                     return succeed(True)
 
-            elif isinstance(principal2, davxml.Unauthenticated):
-                if isinstance(principal1, davxml.Unauthenticated):
+            elif isinstance(principal2, element.Unauthenticated):
+                if isinstance(principal1, element.Unauthenticated):
                     return succeed(True)
                 else:
                     return succeed(False)
 
-            elif isinstance(principal1, davxml.Unauthenticated):
+            elif isinstance(principal1, element.Unauthenticated):
                 return succeed(False)
 
-            assert isinstance(principal1, davxml.HRef), (
+            assert isinstance(principal1, element.HRef), (
                 "Not an HRef: %r" % (principal1,)
             )
 
@@ -1766,7 +1768,7 @@
             #
             real_principal = ace_principal.children[0]
 
-            if isinstance(real_principal, davxml.Property):
+            if isinstance(real_principal, element.Property):
                 # See comments in matchPrincipal().  We probably need
                 # some common code.
                 log.err("Encountered a property principal (%s), "
@@ -1774,7 +1776,7 @@
                         % (real_principal,))
                 return False
 
-            if isinstance(real_principal, davxml.HRef):
+            if isinstance(real_principal, element.HRef):
                 return self.validHrefPrincipal(real_principal, request)
 
             return True
@@ -1810,27 +1812,27 @@
 
     def resolvePrincipal(self, principal, request):
         """
-        Resolves a L{davxml.Principal} element into a L{davxml.HRef}
+        Resolves a L{element.Principal} element into a L{element.HRef}
         element if possible.  Specifically, the given C{principal}'s
         contained element is resolved.
 
-        L{davxml.Property} is resolved to the URI in the contained
+        L{element.Property} is resolved to the URI in the contained
         property.
 
-        L{davxml.Self} is resolved to the URI of this resource.
+        L{element.Self} is resolved to the URI of this resource.
 
-        L{davxml.HRef} elements are returned as-is.
+        L{element.HRef} elements are returned as-is.
 
         All other principals, including meta-principals
-        (eg. L{davxml.All}), resolve to C{None}.
+        (eg. L{element.All}), resolve to C{None}.
 
-        @param principal: the L{davxml.Principal} child element to
+        @param principal: the L{element.Principal} child element to
         resolve.
         @param request: the request being processed.
-        @return: a deferred L{davxml.HRef} element or C{None}.
+        @return: a deferred L{element.HRef} element or C{None}.
         """
 
-        if isinstance(principal, davxml.Property):
+        if isinstance(principal, element.Property):
             # NotImplementedError("Property principals are not implemented.")
             #
             # We can't raise here without potentially crippling the
@@ -1861,7 +1863,7 @@
                     )
                     return None
 
-                if not isinstance(principal, davxml.Principal):
+                if not isinstance(principal, element.Principal):
                     log.err("Non-principal value in property {%s}%s "
                             "referenced by property principal."
                             % (namespace, name))
@@ -1879,22 +1881,22 @@
             d.addCallback(gotPrincipal)
             return d
 
-        elif isinstance(principal, davxml.Self):
+        elif isinstance(principal, element.Self):
             try:
                 self = IDAVPrincipalResource(self)
             except TypeError:
                 log.err("DAV:self ACE is set on non-principal resource %r"
                         % (self,))
                 return succeed(None)
-            principal = davxml.HRef(self.principalURL())
+            principal = element.HRef(self.principalURL())
 
-        if isinstance(principal, davxml.HRef):
+        if isinstance(principal, element.HRef):
             return succeed(principal)
 
         assert isinstance(principal, (
-            davxml.All,
-            davxml.Authenticated,
-            davxml.Unauthenticated
+            element.All,
+            element.Authenticated,
+            element.Unauthenticated
         )), "Not a meta-principal: %r" % (principal,)
 
         return succeed(None)
@@ -1957,7 +1959,7 @@
     
     def principalSearchPropertySet(self):
         """
-        @return: a L{davxml.PrincipalSearchPropertySet} element describing the
+        @return: a L{element.PrincipalSearchPropertySet} element describing the
         principal properties that can be searched on this principal collection,
         or C{None} if this is not a principal collection.
         
@@ -2321,19 +2323,19 @@
 
             if namespace == dav_namespace:
                 if name == "alternate-URI-set":
-                    return davxml.AlternateURISet(*[
-                        davxml.HRef(u) for u in self.alternateURIs()
+                    return element.AlternateURISet(*[
+                        element.HRef(u) for u in self.alternateURIs()
                     ])
 
                 if name == "principal-URL":
-                    return davxml.PrincipalURL(
-                        davxml.HRef(self.principalURL())
+                    return element.PrincipalURL(
+                        element.HRef(self.principalURL())
                     )
 
                 if name == "group-member-set":
                     def callback(members):
-                        return davxml.GroupMemberSet(*[
-                            davxml.HRef(p.principalURL())
+                        return element.GroupMemberSet(*[
+                            element.HRef(p.principalURL())
                             for p in members
                         ])
                     
@@ -2343,8 +2345,8 @@
 
                 if name == "group-membership":
                     def callback(memberships):
-                        return davxml.GroupMembership(*[
-                            davxml.HRef(g.principalURL())
+                        return element.GroupMembership(*[
+                            element.HRef(g.principalURL())
                             for g in memberships
                         ])
                     
@@ -2354,12 +2356,12 @@
 
                 if name == "resourcetype":
                     if self.isCollection():
-                        return davxml.ResourceType(
-                            davxml.Collection(),
-                            davxml.Principal()
+                        return element.ResourceType(
+                            element.Collection(),
+                            element.Principal()
                         )
                     else:
-                        return davxml.ResourceType(davxml.Principal())
+                        return element.ResourceType(element.Principal())
 
             return super(DAVPrincipalResource, self).readProperty(
                 qname, request
@@ -2512,7 +2514,7 @@
     else:
         return True
 
-class TwistedACLInheritable (davxml.WebDAVEmptyElement):
+class TwistedACLInheritable (WebDAVEmptyElement):
     """
     When set on an ACE, this indicates that the ACE privileges should
     be inherited by all child resources within the resource with this
@@ -2522,9 +2524,9 @@
     name = "inheritable"
 
 registerElement(TwistedACLInheritable)
-davxml.ACE.allowed_children[(twisted_dav_namespace, "inheritable")] = (0, 1)
+element.ACE.allowed_children[(twisted_dav_namespace, "inheritable")] = (0, 1)
 
-class TwistedGETContentMD5 (davxml.WebDAVTextElement):
+class TwistedGETContentMD5 (WebDAVTextElement):
     """
     MD5 hash of the resource content.
     """
@@ -2534,7 +2536,7 @@
 registerElement(TwistedGETContentMD5)
 
 
-class TwistedQuotaRootProperty (davxml.WebDAVTextElement):
+class TwistedQuotaRootProperty (WebDAVTextElement):
     """
     When set on a collection, this property indicates that the
     collection has a quota limit for the size of all resources stored
@@ -2547,7 +2549,7 @@
 
 registerElement(TwistedQuotaRootProperty)
 
-class TwistedQuotaUsedProperty (davxml.WebDAVTextElement):
+class TwistedQuotaUsedProperty (WebDAVTextElement):
     """
     When set on a collection, this property contains the cached
     running total of the size of all resources stored in the
@@ -2559,28 +2561,28 @@
 
 registerElement(TwistedQuotaUsedProperty)
 
-allACL = davxml.ACL(
-    davxml.ACE(
-        davxml.Principal(davxml.All()),
-        davxml.Grant(davxml.Privilege(davxml.All())),
-        davxml.Protected(),
+allACL = element.ACL(
+    element.ACE(
+        element.Principal(element.All()),
+        element.Grant(element.Privilege(element.All())),
+        element.Protected(),
         TwistedACLInheritable()
     )
 )
 
-readonlyACL = davxml.ACL(
-    davxml.ACE(
-        davxml.Principal(davxml.All()),
-        davxml.Grant(davxml.Privilege(davxml.Read())),
-        davxml.Protected(),
+readonlyACL = element.ACL(
+    element.ACE(
+        element.Principal(element.All()),
+        element.Grant(element.Privilege(element.Read())),
+        element.Protected(),
         TwistedACLInheritable()
     )
 )
 
-allPrivilegeSet = davxml.SupportedPrivilegeSet(
-    davxml.SupportedPrivilege(
-        davxml.Privilege(davxml.All()),
-        davxml.Description("all privileges", **{"xml:lang": "en"})
+allPrivilegeSet = element.SupportedPrivilegeSet(
+    element.SupportedPrivilege(
+        element.Privilege(element.All()),
+        element.Description("all privileges", **{"xml:lang": "en"})
     )
 )
 
@@ -2588,79 +2590,79 @@
 # This is one possible graph of the "standard" privileges documented
 # in 3744, section 3.
 #
-davPrivilegeSet = davxml.SupportedPrivilegeSet(
-    davxml.SupportedPrivilege(
-        davxml.Privilege(davxml.All()),
-        davxml.Description(
+davPrivilegeSet = element.SupportedPrivilegeSet(
+    element.SupportedPrivilege(
+        element.Privilege(element.All()),
+        element.Description(
             "all privileges",
             **{"xml:lang": "en"}
         ),
-        davxml.SupportedPrivilege(
-            davxml.Privilege(davxml.Read()),
-            davxml.Description(
+        element.SupportedPrivilege(
+            element.Privilege(element.Read()),
+            element.Description(
                 "read resource",
                 **{"xml:lang": "en"}
             ),
         ),
-        davxml.SupportedPrivilege(
-            davxml.Privilege(davxml.Write()),
-            davxml.Description(
+        element.SupportedPrivilege(
+            element.Privilege(element.Write()),
+            element.Description(
                 "write resource",
                 **{"xml:lang": "en"}
             ),
-            davxml.SupportedPrivilege(
-                davxml.Privilege(davxml.WriteProperties()),
-                davxml.Description(
+            element.SupportedPrivilege(
+                element.Privilege(element.WriteProperties()),
+                element.Description(
                     "write resource properties",
                     **{"xml:lang": "en"}
                 ),
             ),
-            davxml.SupportedPrivilege(
-                davxml.Privilege(davxml.WriteContent()),
-                davxml.Description(
+            element.SupportedPrivilege(
+                element.Privilege(element.WriteContent()),
+                element.Description(
                     "write resource content",
                     **{"xml:lang": "en"}
                 ),
             ),
-            davxml.SupportedPrivilege(
-                davxml.Privilege(davxml.Bind()),
-                davxml.Description(
+            element.SupportedPrivilege(
+                element.Privilege(element.Bind()),
+                element.Description(
                     "add child resource",
                     **{"xml:lang": "en"}
                 ),
             ),
-            davxml.SupportedPrivilege(
-                davxml.Privilege(davxml.Unbind()),
-                davxml.Description(
+            element.SupportedPrivilege(
+                element.Privilege(element.Unbind()),
+                element.Description(
                     "remove child resource",
                     **{"xml:lang": "en"}
                 ),
             ),
         ),
-        davxml.SupportedPrivilege(
-            davxml.Privilege(davxml.Unlock()),
-            davxml.Description(
+        element.SupportedPrivilege(
+            element.Privilege(element.Unlock()),
+            element.Description(
                 "unlock resource without ownership of lock",
                 **{"xml:lang": "en"}
             ),
         ),
-        davxml.SupportedPrivilege(
-            davxml.Privilege(davxml.ReadACL()),
-            davxml.Description(
+        element.SupportedPrivilege(
+            element.Privilege(element.ReadACL()),
+            element.Description(
                 "read resource access control list",
                 **{"xml:lang": "en"}
             ),
         ),
-        davxml.SupportedPrivilege(
-            davxml.Privilege(davxml.WriteACL()),
-            davxml.Description(
+        element.SupportedPrivilege(
+            element.Privilege(element.WriteACL()),
+            element.Description(
                 "write resource access control list",
                 **{"xml:lang": "en"}
             ),
         ),
-        davxml.SupportedPrivilege(
-            davxml.Privilege(davxml.ReadCurrentUserPrivilegeSet()),
-            davxml.Description(
+        element.SupportedPrivilege(
+            element.Privilege(element.ReadCurrentUserPrivilegeSet()),
+            element.Description(
                 "read privileges for current principal",
                 **{"xml:lang": "en"}
             ),
@@ -2668,10 +2670,10 @@
     ),
 )
 
-unauthenticatedPrincipal = davxml.Principal(davxml.Unauthenticated())
+unauthenticatedPrincipal = element.Principal(element.Unauthenticated())
 
 
-class ResourceClass (davxml.WebDAVTextElement):
+class ResourceClass (WebDAVTextElement):
     namespace = twisted_dav_namespace
     name = "resource-class"
     hidden = False

Modified: CalendarServer/trunk/twext/web2/dav/test/test_acl.py
===================================================================
--- CalendarServer/trunk/twext/web2/dav/test/test_acl.py	2012-03-17 03:37:14 UTC (rev 8906)
+++ CalendarServer/trunk/twext/web2/dav/test/test_acl.py	2012-03-17 07:27:16 UTC (rev 8907)
@@ -29,18 +29,18 @@
 from twext.web2 import responsecode
 from twext.web2.auth import basic
 from twext.web2.stream import MemoryStream
-from twext.web2.dav import davxml
-
 from twext.web2.dav.util import davXMLFromStream
 from twext.web2.dav.auth import TwistedPasswordProperty, IPrincipal, DavRealm, TwistedPropertyChecker, AuthenticationWrapper
 from twext.web2.dav.fileop import rmdir
-
-import twext.web2.dav.test.util
 from twext.web2.test.test_server import SimpleRequest
 from twext.web2.dav.test.util import Site, serialize
 from twext.web2.dav.test.test_resource import \
     TestDAVPrincipalResource, TestPrincipalsCollection
 
+from txdav.xml import element
+
+import twext.web2.dav.test.util
+
 class ACL(twext.web2.dav.test.util.TestCase):
     """
     RFC 3744 (WebDAV ACL) tests.
@@ -75,14 +75,14 @@
             loginInterfaces
         ))
 
-        rootResource.setAccessControlList(self.grant(davxml.All()))
+        rootResource.setAccessControlList(self.grant(element.All()))
 
         for name, acl in (
             ("none"       , self.grant()),
-            ("read"       , self.grant(davxml.Read())),
-            ("read-write" , self.grant(davxml.Read(), davxml.Write())),
-            ("unlock"     , self.grant(davxml.Unlock())),
-            ("all"        , self.grant(davxml.All())),
+            ("read"       , self.grant(element.Read())),
+            ("read-write" , self.grant(element.Read(), element.Write())),
+            ("unlock"     , self.grant(element.Unlock())),
+            ("all"        , self.grant(element.All())),
         ):
             filename = os.path.join(docroot, name)
             if not os.path.isfile(filename):
@@ -92,8 +92,8 @@
 
         for name, acl in (
             ("nobind" , self.grant()),
-            ("bind"   , self.grant(davxml.Bind())),
-            ("unbind" , self.grant(davxml.Bind(), davxml.Unbind())),
+            ("bind"   , self.grant(element.Bind())),
+            ("unbind" , self.grant(element.Bind(), element.Unbind())),
         ):
             dirname = os.path.join(docroot, name)
             if not os.path.isdir(dirname):
@@ -131,15 +131,15 @@
                 src_resource = self.resource_class(src_path)
                 src_resource.setAccessControlList({
                     "nobind": self.grant(),
-                    "bind"  : self.grant(davxml.Bind()),
-                    "unbind": self.grant(davxml.Bind(), davxml.Unbind())
+                    "bind"  : self.grant(element.Bind()),
+                    "unbind": self.grant(element.Bind(), element.Unbind())
                 }[src])
                 for name, acl in (
                     ("none"       , self.grant()),
-                    ("read"       , self.grant(davxml.Read())),
-                    ("read-write" , self.grant(davxml.Read(), davxml.Write())),
-                    ("unlock"     , self.grant(davxml.Unlock())),
-                    ("all"        , self.grant(davxml.All())),
+                    ("read"       , self.grant(element.Read())),
+                    ("read-write" , self.grant(element.Read(), element.Write())),
+                    ("unlock"     , self.grant(element.Unlock())),
+                    ("all"        , self.grant(element.All())),
                 ):
                     filename = os.path.join(src_path, name)
                     if not os.path.isfile(filename):
@@ -318,7 +318,7 @@
 
                 request = SimpleRequest(self.site, "PROPPATCH", "/" + name)
                 request.stream = MemoryStream(
-                    davxml.WebDAVDocument(davxml.PropertyUpdate()).toxml()
+                    element.WebDAVDocument(element.PropertyUpdate()).toxml()
                 )
                 _add_auth_header(request)
 
@@ -354,7 +354,7 @@
 
                     request = SimpleRequest(self.site, method, "/" + name)
                     if method == "REPORT":
-                        request.stream = MemoryStream(davxml.PrincipalPropertySearch().toxml())
+                        request.stream = MemoryStream(element.PrincipalPropertySearch().toxml())
 
                     _add_auth_header(request)
 

Modified: CalendarServer/trunk/twext/web2/dav/test/test_xattrprops.py
===================================================================
--- CalendarServer/trunk/twext/web2/dav/test/test_xattrprops.py	2012-03-17 03:37:14 UTC (rev 8906)
+++ CalendarServer/trunk/twext/web2/dav/test/test_xattrprops.py	2012-03-17 07:27:16 UTC (rev 8907)
@@ -15,7 +15,7 @@
 from twext.web2.responsecode import FORBIDDEN
 from twext.web2.http import HTTPError
 from twext.web2.dav.static import DAVFile
-from twext.web2.dav.davxml import Depth, WebDAVDocument
+from txdav.xml.element import Depth, WebDAVDocument
 
 try:
     from twext.web2.dav.xattrprops import xattrPropertyStore

Modified: CalendarServer/trunk/twext/web2/dav/test/util.py
===================================================================
--- CalendarServer/trunk/twext/web2/dav/test/util.py	2012-03-17 03:37:14 UTC (rev 8906)
+++ CalendarServer/trunk/twext/web2/dav/test/util.py	2012-03-17 07:27:16 UTC (rev 8907)
@@ -34,11 +34,10 @@
 from twext.python.log import Logger
 from twext.web2.http import HTTPError, StatusResponse
 from twext.web2 import responsecode
-from twext.web2.dav import davxml
-
 from twext.web2.dav.resource import TwistedACLInheritable
 from twext.web2.dav.static import DAVFile
 from twext.web2.dav.util import joinURL
+from txdav.xml import element
 
 log = Logger()
 
@@ -61,7 +60,7 @@
                 "No such property: {%s}%s" % qname
             ))
 
-        doc = davxml.WebDAVDocument.fromString(property)
+        doc = element.WebDAVDocument.fromString(property)
         return doc.root_element
 
     def set(self, property):
@@ -100,10 +99,10 @@
     resource_class = TestFile
 
     def grant(*privileges):
-        return davxml.ACL(*[
-            davxml.ACE(
-                davxml.Grant(davxml.Privilege(privilege)),
-                davxml.Principal(davxml.All())
+        return element.ACL(*[
+            element.ACE(
+                element.Grant(element.Privilege(privilege)),
+                element.Principal(element.All())
             )
             for privilege in privileges
         ])
@@ -111,10 +110,10 @@
     grant = staticmethod(grant)
 
     def grantInherit(*privileges):
-        return davxml.ACL(*[
-            davxml.ACE(
-                davxml.Grant(davxml.Privilege(privilege)),
-                davxml.Principal(davxml.All()),
+        return element.ACL(*[
+            element.ACE(
+                element.Grant(element.Privilege(privilege)),
+                element.Principal(element.All()),
                 TwistedACLInheritable()
             )
             for privilege in privileges
@@ -126,7 +125,7 @@
         docroot = self.mktemp()
         os.mkdir(docroot)
         rootresource = self.resource_class(docroot)
-        rootresource.setAccessControlList(self.grantInherit(davxml.All()))
+        rootresource.setAccessControlList(self.grantInherit(element.All()))
 
         dirnames = (
             os.path.join(docroot, "dir1"),                          # 0
@@ -173,7 +172,7 @@
     def _getSite(self):
         if not hasattr(self, "_site"):
             rootresource = self.resource_class(self.docroot)
-            rootresource.setAccessControlList(self.grantInherit(davxml.All()))
+            rootresource.setAccessControlList(self.grantInherit(element.All()))
             self._site = Site(rootresource)
         return self._site
 

Modified: CalendarServer/trunk/twext/web2/dav/util.py
===================================================================
--- CalendarServer/trunk/twext/web2/dav/util.py	2012-03-17 03:37:14 UTC (rev 8906)
+++ CalendarServer/trunk/twext/web2/dav/util.py	2012-03-17 07:27:16 UTC (rev 8907)
@@ -50,7 +50,7 @@
 
 from twext.python.log import Logger
 from twext.web2.stream import readStream
-from twext.web2.dav import davxml
+from txdav.xml.parser import WebDAVDocument
 
 log = Logger()
 
@@ -79,7 +79,7 @@
 
     def parse(xml):
         try:
-            doc = davxml.WebDAVDocument.fromString(xml)
+            doc = WebDAVDocument.fromString(xml)
             doc.root_element.validate()
             return doc
         except ValueError:

Modified: CalendarServer/trunk/twext/web2/dav/xattrprops.py
===================================================================
--- CalendarServer/trunk/twext/web2/dav/xattrprops.py	2012-03-17 03:37:14 UTC (rev 8906)
+++ CalendarServer/trunk/twext/web2/dav/xattrprops.py	2012-03-17 07:27:16 UTC (rev 8907)
@@ -52,8 +52,8 @@
 from twisted.python.log import err
 from twext.web2 import responsecode
 from twext.web2.http import HTTPError, StatusResponse
-from twext.web2.dav import davxml
 from twext.web2.dav.http import statusForFailure
+from txdav.xml.parser import WebDAVDocument
 
 # RFC 2518 Section 12.13.1 says that removal of non-existing property
 # is not an error.  python-xattr on Linux fails with ENODATA in this
@@ -170,7 +170,7 @@
             legacy = True
 
         try:
-            doc = davxml.WebDAVDocument.fromString(data)
+            doc = WebDAVDocument.fromString(data)
         except ValueError:
             try:
                 doc = unpickle(data)

Modified: CalendarServer/trunk/twistedcaldav/__init__.py
===================================================================
--- CalendarServer/trunk/twistedcaldav/__init__.py	2012-03-17 03:37:14 UTC (rev 8906)
+++ CalendarServer/trunk/twistedcaldav/__init__.py	2012-03-17 07:27:16 UTC (rev 8907)
@@ -38,13 +38,8 @@
 import twistedcaldav.mkcolxml
 import twistedcaldav.customxml
 
-from txdav.xml.element import registerElements
+twistedcaldav # Shhh.. pyflakes
 
-registerElements(twistedcaldav.caldavxml)
-registerElements(twistedcaldav.customxml)
-registerElements(twistedcaldav.carddavxml)
-registerElements(twistedcaldav.mkcolxml)
-
 #
 # DefaultHTTPHandler
 #

Modified: CalendarServer/trunk/twistedcaldav/caldavxml.py
===================================================================
--- CalendarServer/trunk/twistedcaldav/caldavxml.py	2012-03-17 03:37:14 UTC (rev 8906)
+++ CalendarServer/trunk/twistedcaldav/caldavxml.py	2012-03-17 07:27:16 UTC (rev 8907)
@@ -27,7 +27,10 @@
 
 from pycalendar.datetime import PyCalendarDateTime
 
-from twext.web2.dav import davxml
+from txdav.xml.element import registerElement, dav_namespace
+from txdav.xml.element import WebDAVElement, PCDATAElement
+from txdav.xml.element import WebDAVEmptyElement, WebDAVTextElement
+from txdav.xml.element import ResourceType, Collection
 
 from twext.python.log import Logger
 
@@ -61,24 +64,28 @@
     "calendar-query-extended",
 )
 
-class CalDAVElement (davxml.WebDAVElement):
+
+class CalDAVElement (WebDAVElement):
     """
     CalDAV XML element.
     """
     namespace = caldav_namespace
 
-class CalDAVEmptyElement (davxml.WebDAVEmptyElement):
+
+class CalDAVEmptyElement (WebDAVEmptyElement):
     """
     CalDAV element with no contents.
     """
     namespace = caldav_namespace
 
-class CalDAVTextElement (davxml.WebDAVTextElement):
+
+class CalDAVTextElement (WebDAVTextElement):
     """
     CalDAV element containing PCDATA.
     """
     namespace = caldav_namespace
 
+
 class CalDAVTimeRangeElement (CalDAVEmptyElement):
     """
     CalDAV element containing a time range.
@@ -121,11 +128,11 @@
         # No other tests
         return True
 
+
 class CalDAVTimeZoneElement (CalDAVTextElement):
     """
     CalDAV element containing iCalendar data with a single VTIMEZONE component.
     """
-
     def calendar(self):
         """
         Returns a calendar component derived from this element, which contains
@@ -160,6 +167,8 @@
 
         return found
         
+
+ at registerElement
 class CalendarHomeSet (CalDAVElement):
     """
     The calendar collections URLs for this principal's calendar user.
@@ -168,8 +177,10 @@
     name = "calendar-home-set"
     hidden = True
 
-    allowed_children = { (davxml.dav_namespace, "href"): (0, None) }
+    allowed_children = { (dav_namespace, "href"): (0, None) }
 
+
+ at registerElement
 class CalendarDescription (CalDAVTextElement):
     """
     Provides a human-readable description of what this calendar collection
@@ -180,6 +191,8 @@
     hidden = True
     # May be protected; but we'll let the client set this if they like.
 
+
+ at registerElement
 class CalendarTimeZone (CalDAVTimeZoneElement):
     """
     Specifies a time zone on a calendar collection.
@@ -188,6 +201,8 @@
     name = "calendar-timezone"
     hidden = True
 
+
+ at registerElement
 class SupportedCalendarComponentSets (CalDAVElement):
     """
     Indicates what set of calendar components the server is willing to allow
@@ -200,6 +215,8 @@
 
     allowed_children = { (caldav_namespace, "supported-calendar-component-set"): (0, None) }
 
+
+ at registerElement
 class SupportedCalendarComponentSet (CalDAVElement):
     """
     Indicates what set of calendar components are allowed in a collection.
@@ -211,6 +228,8 @@
 
     allowed_children = { (caldav_namespace, "comp"): (0, None) }
 
+
+ at registerElement
 class SupportedCalendarData (CalDAVElement):
     """
     Specifies restrictions on a calendar collection.
@@ -222,6 +241,8 @@
 
     allowed_children = { (caldav_namespace, "calendar-data"): (0, None) }
 
+
+ at registerElement
 class MaxResourceSize (CalDAVTextElement):
     """
     Specifies restrictions on a calendar collection.
@@ -231,6 +252,8 @@
     hidden = True
     protected = True
 
+
+ at registerElement
 class MinDateTime (CalDAVTextElement):
     """
     Specifies restrictions on a calendar collection.
@@ -240,6 +263,8 @@
     hidden = True
     protected = True
 
+
+ at registerElement
 class MaxDateTime (CalDAVTextElement):
     """
     Specifies restrictions on a calendar collection.
@@ -249,6 +274,8 @@
     hidden = True
     protected = True
 
+
+ at registerElement
 class MaxInstances (CalDAVTextElement):
     """
     Specifies restrictions on a calendar collection.
@@ -258,6 +285,8 @@
     hidden = True
     protected = True
 
+
+ at registerElement
 class MaxAttendeesPerInstance (CalDAVTextElement):
     """
     Specifies restrictions on a calendar collection.
@@ -267,6 +296,8 @@
     hidden = True
     protected = True
 
+
+ at registerElement
 class Calendar (CalDAVEmptyElement):
     """
     Denotes a calendar collection.
@@ -274,6 +305,8 @@
     """
     name = "calendar"
 
+
+ at registerElement
 class MakeCalendar (CalDAVElement):
     """
     Top-level element for request body in MKCALENDAR.
@@ -281,10 +314,12 @@
     """
     name = "mkcalendar"
 
-    allowed_children = { (davxml.dav_namespace, "set"): (0, 1) }
+    allowed_children = { (dav_namespace, "set"): (0, 1) }
 
     child_types = { "WebDAVUnknownElement": (0, None) }
 
+
+ at registerElement
 class MakeCalendarResponse (CalDAVElement):
     """
     Top-level element for response body in MKCALENDAR.
@@ -292,8 +327,10 @@
     """
     name = "mkcalendar-response"
 
-    allowed_children = { davxml.WebDAVElement: (0, None) }
+    allowed_children = { WebDAVElement: (0, None) }
 
+
+ at registerElement
 class CalendarQuery (CalDAVElement):
     """
     Defines a report for querying calendar data.
@@ -302,11 +339,11 @@
     name = "calendar-query"
 
     allowed_children = {
-        (davxml.dav_namespace, "allprop" ): (0, None),
-        (davxml.dav_namespace, "propname"): (0, None),
-        (davxml.dav_namespace, "prop"    ): (0, None),
-        (caldav_namespace,     "timezone"): (0, 1),
-        (caldav_namespace,     "filter"  ): (0, 1), # Actually (1, 1) unless element is empty
+        (dav_namespace,    "allprop" ): (0, None),
+        (dav_namespace,    "propname"): (0, None),
+        (dav_namespace,    "prop"    ): (0, None),
+        (caldav_namespace, "timezone"): (0, 1),
+        (caldav_namespace, "filter"  ): (0, 1), # Actually (1, 1) unless element is empty
     }
 
     def __init__(self, *children, **attributes):
@@ -320,9 +357,9 @@
             qname = child.qname()
 
             if qname in (
-                (davxml.dav_namespace, "allprop" ),
-                (davxml.dav_namespace, "propname"),
-                (davxml.dav_namespace, "prop"    ),
+                (dav_namespace, "allprop" ),
+                (dav_namespace, "propname"),
+                (dav_namespace, "prop"    ),
             ):
                 if props is not None:
                     raise ValueError("Only one of CalDAV:allprop, CalDAV:propname, CalDAV:prop allowed")
@@ -345,6 +382,8 @@
         self.filter = filter
         self.timezone = timezone
 
+
+ at registerElement
 class CalendarData (CalDAVElement):
     """
     Defines which parts of a calendar component object should be returned by a
@@ -358,7 +397,7 @@
         (caldav_namespace, "expand"               ): (0, 1),
         (caldav_namespace, "limit-recurrence-set" ): (0, 1),
         (caldav_namespace, "limit-freebusy-set"   ): (0, 1),
-        davxml.PCDATAElement: (0, None),
+        PCDATAElement: (0, None),
     }
     allowed_attributes = {
         "content-type": False,
@@ -370,10 +409,10 @@
         if isinstance(calendar, str):
             if not calendar:
                 raise ValueError("Missing calendar data")
-            return clazz(davxml.PCDATAElement(calendar))
+            return clazz(PCDATAElement(calendar))
         elif isinstance(calendar, iComponent):
             assert calendar.name() == "VCALENDAR", "Not a calendar: %r" % (calendar,)
-            return clazz(davxml.PCDATAElement(calendar.getTextWithTimezones(includeTimezones=not config.EnableTimezonesByReference)))
+            return clazz(PCDATAElement(calendar.getTextWithTimezones(includeTimezones=not config.EnableTimezonesByReference)))
         else:
             raise ValueError("Not a calendar: %s" % (calendar,))
 
@@ -404,7 +443,7 @@
             elif qname == (caldav_namespace, "limit-freebusy-set"):
                 freebusy_set = child
 
-            elif isinstance(child, davxml.PCDATAElement):
+            elif isinstance(child, PCDATAElement):
                 if data is None:
                     data = child
                 else:
@@ -469,7 +508,7 @@
         Returns the calendar data derived from this element.
         """
         for data in self.children:
-            if not isinstance(data, davxml.PCDATAElement):
+            if not isinstance(data, PCDATAElement):
                 return None
             else:
                 # We guaranteed in __init__() that there is only one child...
@@ -479,6 +518,8 @@
 
     textData = calendarData
 
+
+ at registerElement
 class CalendarComponent (CalDAVElement):
     """
     Defines which component types to return.
@@ -581,6 +622,8 @@
 
         return result
 
+
+ at registerElement
 class AllComponents (CalDAVEmptyElement):
     """
     Specifies that all components shall be returned.
@@ -588,6 +631,8 @@
     """
     name = "allcomp"
 
+
+ at registerElement
 class AllProperties (CalDAVEmptyElement):
     """
     Specifies that all properties shall be returned.
@@ -595,6 +640,8 @@
     """
     name = "allprop"
 
+
+ at registerElement
 class Property (CalDAVEmptyElement):
     """
     Defines a property to return in a response.
@@ -623,6 +670,8 @@
         else:
             self.novalue = False
 
+
+ at registerElement
 class Expand (CalDAVTimeRangeElement):
     """
     Specifies that the server should expand recurring components into separate
@@ -631,6 +680,8 @@
     """
     name = "expand"
 
+
+ at registerElement
 class LimitRecurrenceSet (CalDAVTimeRangeElement):
     """
     Specifies a time range to limit the set of recurrence instances returned by
@@ -639,6 +690,8 @@
     """
     name = "limit-recurrence-set"
 
+
+ at registerElement
 class LimitFreeBusySet (CalDAVTimeRangeElement):
     """
     Specifies a time range to limit the set of FREEBUSY properties returned by
@@ -647,6 +700,8 @@
     """
     name = "limit-freebusy-set"
 
+
+ at registerElement
 class Filter (CalDAVElement):
     """
     Determines which matching components are returned.
@@ -656,6 +711,8 @@
 
     allowed_children = { (caldav_namespace, "comp-filter"): (1, 1) }
 
+
+ at registerElement
 class ComponentFilter (CalDAVElement):
     """
     Limits a search to only the chosen component types.
@@ -674,6 +731,8 @@
         "test": False,
     }
 
+
+ at registerElement
 class PropertyFilter (CalDAVElement):
     """
     Limits a search to specific properties.
@@ -692,6 +751,8 @@
         "test": False,
     }
 
+
+ at registerElement
 class ParameterFilter (CalDAVElement):
     """
     Limits a search to specific parameters.
@@ -705,6 +766,8 @@
     }
     allowed_attributes = { "name": True }
 
+
+ at registerElement
 class IsNotDefined (CalDAVEmptyElement):
     """
     Specifies that the named iCalendar item does not exist.
@@ -712,6 +775,8 @@
     """
     name = "is-not-defined"
 
+
+ at registerElement
 class TextMatch (CalDAVTextElement):
     """
     Specifies a substring match on a property or parameter value.
@@ -726,11 +791,11 @@
             caseless = "no"
 
         if type(string) is str:
-            return clazz(davxml.PCDATAElement(string), caseless=caseless)
+            return clazz(PCDATAElement(string), caseless=caseless)
         elif type(string) is unicode:
-            return clazz(davxml.PCDATAElement(string.encode("utf-8")), caseless=caseless)
+            return clazz(PCDATAElement(string.encode("utf-8")), caseless=caseless)
         else:
-            return clazz(davxml.PCDATAElement(str(string)), caseless=caseless)
+            return clazz(PCDATAElement(str(string)), caseless=caseless)
 
     fromString = classmethod(fromString)
 
@@ -740,6 +805,8 @@
         "match-type": False,
     }
 
+
+ at registerElement
 class TimeZone (CalDAVTimeZoneElement):
     """
     Specifies a time zone component.
@@ -747,6 +814,8 @@
     """
     name = "timezone"
 
+
+ at registerElement
 class TimeRange (CalDAVTimeRangeElement):
     """
     Specifies a time for testing components against.
@@ -754,6 +823,8 @@
     """
     name = "time-range"
 
+
+ at registerElement
 class CalendarMultiGet (CalDAVElement):
     """
     CalDAV report used to retrieve specific calendar component items via their
@@ -765,10 +836,10 @@
     # To allow for an empty element in a supported-report-set property we need
     # to relax the child restrictions
     allowed_children = {
-        (davxml.dav_namespace, "allprop" ): (0, 1),
-        (davxml.dav_namespace, "propname"): (0, 1),
-        (davxml.dav_namespace, "prop"    ): (0, 1),
-        (davxml.dav_namespace, "href"    ): (0, None),    # Actually ought to be (1, None)
+        (dav_namespace, "allprop" ): (0, 1),
+        (dav_namespace, "propname"): (0, 1),
+        (dav_namespace, "prop"    ): (0, 1),
+        (dav_namespace, "href"    ): (0, None),    # Actually ought to be (1, None)
     }
 
     def __init__(self, *children, **attributes):
@@ -781,20 +852,22 @@
             qname = child.qname()
 
             if qname in (
-                (davxml.dav_namespace, "allprop" ),
-                (davxml.dav_namespace, "propname"),
-                (davxml.dav_namespace, "prop"    ),
+                (dav_namespace, "allprop" ),
+                (dav_namespace, "propname"),
+                (dav_namespace, "prop"    ),
             ):
                 if property is not None:
                     raise ValueError("Only one of DAV:allprop, DAV:propname, DAV:prop allowed")
                 property = child
 
-            elif qname == (davxml.dav_namespace, "href"):
+            elif qname == (dav_namespace, "href"):
                 resources.append(child)
 
         self.property  = property
         self.resources = resources
 
+
+ at registerElement
 class FreeBusyQuery (CalDAVElement):
     """
     CalDAV report used to generate a VFREEBUSY to determine busy time over a
@@ -824,6 +897,8 @@
 
         self.timerange  = timerange
 
+
+ at registerElement
 class ReadFreeBusy(CalDAVEmptyElement):
     """
     Privilege which allows the free busy report to be executed.
@@ -831,6 +906,8 @@
     """
     name = "read-free-busy"
     
+
+ at registerElement
 class NoUIDConflict(CalDAVElement):
     """
     CalDAV precondition used to indicate a UID conflict during PUT/COPY/MOVE.
@@ -838,8 +915,10 @@
     """
     name = "no-uid-conflict"
 
-    allowed_children = { (davxml.dav_namespace, "href"): (1, 1) }
+    allowed_children = { (dav_namespace, "href"): (1, 1) }
     
+
+ at registerElement
 class SupportedFilter(CalDAVElement):
     """
     CalDAV precondition used to indicate an unsupported component type in a
@@ -858,6 +937,7 @@
 # CalDAV Schedule objects
 ##
 
+ at registerElement
 class CalendarUserAddressSet (CalDAVElement):
     """
     The list of calendar user addresses for this principal's calendar user.
@@ -866,8 +946,10 @@
     name = "calendar-user-address-set"
     hidden = True
 
-    allowed_children = { (davxml.dav_namespace, "href"): (0, None) }
+    allowed_children = { (dav_namespace, "href"): (0, None) }
 
+
+ at registerElement
 class CalendarFreeBusySet (CalDAVElement):
     """
     The list of calendar URIs that contribute to free-busy for this principal's calendar user.
@@ -877,8 +959,10 @@
     name = "calendar-free-busy-set"
     hidden = True
 
-    allowed_children = { (davxml.dav_namespace, "href"): (0, None) }
+    allowed_children = { (dav_namespace, "href"): (0, None) }
 
+
+ at registerElement
 class ScheduleCalendarTransp (CalDAVElement):
     """
     Indicates whether a calendar should be used for freebusy lookups.
@@ -890,26 +974,34 @@
         (caldav_namespace,     "transparent" ): (0, 1),
     }
 
+
+ at registerElement
 class Opaque (CalDAVEmptyElement):
     """
     Indicates that a calendar is used in freebusy lookups.
     """
     name = "opaque"
 
+
+ at registerElement
 class Transparent (CalDAVEmptyElement):
     """
     Indicates that a calendar is not used in freebusy lookups.
     """
     name = "transparent"
 
+
+ at registerElement
 class ScheduleDefaultCalendarURL (CalDAVElement):
     """
     A single href indicating which calendar is the default for scheduling.
     """
     name = "schedule-default-calendar-URL"
 
-    allowed_children = { (davxml.dav_namespace, "href"): (0, 1) }
+    allowed_children = { (dav_namespace, "href"): (0, 1) }
 
+
+ at registerElement
 class ScheduleInboxURL (CalDAVElement):
     """
     A principal property to indicate the schedule INBOX for the principal.
@@ -919,8 +1011,10 @@
     hidden = True
     protected = True
 
-    allowed_children = { (davxml.dav_namespace, "href"): (0, 1) }
+    allowed_children = { (dav_namespace, "href"): (0, 1) }
 
+
+ at registerElement
 class ScheduleOutboxURL (CalDAVElement):
     """
     A principal property to indicate the schedule OUTBOX for the principal.
@@ -930,8 +1024,10 @@
     hidden = True
     protected = True
 
-    allowed_children = { (davxml.dav_namespace, "href"): (0, 1) }
+    allowed_children = { (dav_namespace, "href"): (0, 1) }
 
+
+ at registerElement
 class Originator (CalDAVElement):
     """
     A property on resources in schedule Inbox and Outbox indicating the Originator used
@@ -942,8 +1038,10 @@
     hidden = True
     protected = True
 
-    allowed_children = { (davxml.dav_namespace, "href"): (0, 1) } # NB Minimum is zero because this is a property name
+    allowed_children = { (dav_namespace, "href"): (0, 1) } # NB Minimum is zero because this is a property name
 
+
+ at registerElement
 class Recipient (CalDAVElement):
     """
     A property on resources in schedule Inbox indicating the Recipients targeted
@@ -957,8 +1055,10 @@
     hidden = True
     protected = True
 
-    allowed_children = { (davxml.dav_namespace, "href"): (0, None) } # NB Minimum is zero because this is a property name
+    allowed_children = { (dav_namespace, "href"): (0, None) } # NB Minimum is zero because this is a property name
 
+
+ at registerElement
 class ScheduleTag (CalDAVTextElement):
     """
     Property on scheduling resources.
@@ -968,6 +1068,8 @@
     hidden = True
     protected = True
 
+
+ at registerElement
 class ScheduleInbox (CalDAVEmptyElement):
     """
     Denotes the resource type of a calendar schedule Inbox.
@@ -975,6 +1077,8 @@
     """
     name = "schedule-inbox"
 
+
+ at registerElement
 class ScheduleOutbox (CalDAVEmptyElement):
     """
     Denotes the resource type of a calendar schedule Outbox.
@@ -982,6 +1086,8 @@
     """
     name = "schedule-outbox"
 
+
+ at registerElement
 class ScheduleResponse (CalDAVElement):
     """
     The set of responses for a SCHEDULE method operation.
@@ -991,6 +1097,8 @@
 
     allowed_children = { (caldav_namespace, "response"): (0, None) }
 
+
+ at registerElement
 class Response (CalDAVElement):
     """
     A response to an iTIP request against a specific recipient.
@@ -999,13 +1107,15 @@
     name = "response"
 
     allowed_children = {
-        (caldav_namespace,     "recipient"          ): (1, 1),
-        (caldav_namespace,     "request-status"     ): (1, 1),
-        (caldav_namespace,     "calendar-data"      ): (0, 1),
-        (davxml.dav_namespace, "error"              ): (0, 1),        # 2518bis
-        (davxml.dav_namespace, "responsedescription"): (0, 1)
+        (caldav_namespace, "recipient"          ): (1, 1),
+        (caldav_namespace, "request-status"     ): (1, 1),
+        (caldav_namespace, "calendar-data"      ): (0, 1),
+        (dav_namespace,    "error"              ): (0, 1),  # 2518bis
+        (dav_namespace,    "responsedescription"): (0, 1)
     }
 
+
+ at registerElement
 class RequestStatus (CalDAVTextElement):
     """
     The iTIP REQUEST-STATUS value for the iTIP operation.
@@ -1013,6 +1123,8 @@
     """
     name = "request-status"
 
+
+ at registerElement
 class Schedule (CalDAVEmptyElement):
     """
     Privilege which allows the SCHEDULE method to be executed.
@@ -1020,6 +1132,8 @@
     """
     name = "schedule"
     
+
+ at registerElement
 class ScheduleDeliver (CalDAVEmptyElement):
     """
     Privilege which controls scheduling messages going into the Inbox.
@@ -1027,6 +1141,8 @@
     """
     name = "schedule-deliver"
     
+
+ at registerElement
 class ScheduleSend (CalDAVEmptyElement):
     """
     Privilege which controls the ability to send scheduling messages.
@@ -1034,6 +1150,8 @@
     """
     name = "schedule-send"
     
+
+ at registerElement
 class CalendarUserType (CalDAVTextElement):
     """
     The CALDAV:calendar-user-type property from section 9.2.4 of caldav-sched-05
@@ -1041,6 +1159,7 @@
     name = "calendar-user-type"
     protected = True
 
+
 ##
 # draft-daboo-valarm-extensions
 ##
@@ -1049,6 +1168,7 @@
     "calendar-default-alarms",
 )
 
+
 class DefaultAlarmBase (CalDAVTextElement):
     """
     Common behavior for default alarm properties.
@@ -1089,10 +1209,10 @@
         
         return True
 
+
+ at registerElement
 class DefaultAlarmVEventDateTime (DefaultAlarmBase):
-
     name = "default-alarm-vevent-datetime"
-
     calendartxt = """
 BEGIN:VCALENDAR
 VERSION:2.0
@@ -1107,10 +1227,10 @@
 END:VCALENDAR
 """
     
+
+ at registerElement
 class DefaultAlarmVEventDate (DefaultAlarmBase):
-
     name = "default-alarm-vevent-date"
-
     calendartxt = """
 BEGIN:VCALENDAR
 VERSION:2.0
@@ -1125,11 +1245,10 @@
 END:VCALENDAR
 """
     
+
+ at registerElement
 class DefaultAlarmVToDoDateTime (DefaultAlarmBase):
-
     name = "default-alarm-vtodo-datetime"
-    
-
     calendartxt = """
 BEGIN:VCALENDAR
 VERSION:2.0
@@ -1143,10 +1262,10 @@
 END:VCALENDAR
 """
 
+
+ at registerElement
 class DefaultAlarmVToDoDate (DefaultAlarmBase):
-
     name = "default-alarm-vtodo-date"
-    
     calendartxt = """
 BEGIN:VCALENDAR
 VERSION:2.0
@@ -1160,12 +1279,14 @@
 END:VCALENDAR
 """
 
+
 ##
-# Extensions to davxml.ResourceType
+# Extensions to ResourceType
 ##
 
 def _isCalendar(self): return bool(self.childrenOfType(Calendar))
-davxml.ResourceType.isCalendar = _isCalendar
-davxml.ResourceType.calendar = davxml.ResourceType(davxml.Collection(), Calendar())
-davxml.ResourceType.scheduleInbox = davxml.ResourceType(davxml.Collection(), ScheduleInbox())
-davxml.ResourceType.scheduleOutbox = davxml.ResourceType(davxml.Collection(), ScheduleOutbox())
+ResourceType.isCalendar = _isCalendar
+
+ResourceType.calendar       = ResourceType(Collection(), Calendar())
+ResourceType.scheduleInbox  = ResourceType(Collection(), ScheduleInbox())
+ResourceType.scheduleOutbox = ResourceType(Collection(), ScheduleOutbox())

Modified: CalendarServer/trunk/twistedcaldav/carddavxml.py
===================================================================
--- CalendarServer/trunk/twistedcaldav/carddavxml.py	2012-03-17 03:37:14 UTC (rev 8906)
+++ CalendarServer/trunk/twistedcaldav/carddavxml.py	2012-03-17 07:27:16 UTC (rev 8907)
@@ -25,7 +25,11 @@
 See draft spec: 
 """
 
-from twext.web2.dav import davxml
+from txdav.xml.element import registerElement, dav_namespace
+from txdav.xml.element import WebDAVElement, PCDATAElement
+from txdav.xml.element import WebDAVEmptyElement, WebDAVTextElement
+from txdav.xml.element import ResourceType, Collection
+
 from twistedcaldav.vcard import Component
 
 ##
@@ -38,24 +42,29 @@
     "addressbook",
 )
 
-class CardDAVElement (davxml.WebDAVElement):
+
+class CardDAVElement (WebDAVElement):
     """
     CardDAV XML element.
     """
     namespace = carddav_namespace
 
-class CardDAVEmptyElement (davxml.WebDAVEmptyElement):
+
+class CardDAVEmptyElement (WebDAVEmptyElement):
     """
     CardDAV element with no contents.
     """
     namespace = carddav_namespace
 
-class CardDAVTextElement (davxml.WebDAVTextElement):
+
+class CardDAVTextElement (WebDAVTextElement):
     """
     CardDAV element containing PCDATA.
     """
     namespace = carddav_namespace
 
+
+ at registerElement
 class AddressBookHomeSet (CardDAVElement):
     """
     The address book collections URLs for this principal.
@@ -64,8 +73,10 @@
     name = "addressbook-home-set"
     hidden = True
 
-    allowed_children = { (davxml.dav_namespace, "href"): (0, None) }
+    allowed_children = { (dav_namespace, "href"): (0, None) }
 
+
+ at registerElement
 class AddressBookDescription (CardDAVTextElement):
     """
     Provides a human-readable description of what this address book collection
@@ -76,6 +87,8 @@
     hidden = True
     # May be protected; but we'll let the client set this if they like.
 
+
+ at registerElement
 class SupportedAddressData (CardDAVElement):
     """
     Specifies restrictions on an address book collection.
@@ -87,6 +100,8 @@
 
     allowed_children = { (carddav_namespace, "address-data-type"): (0, None) }
 
+
+ at registerElement
 class MaxResourceSize (CardDAVTextElement):
     """
     Specifies restrictions on an address book collection.
@@ -96,6 +111,8 @@
     hidden = True
     protected = True
 
+
+ at registerElement
 class AddressBook (CardDAVEmptyElement):
     """
     Denotes an address book collection.
@@ -103,6 +120,8 @@
     """
     name = "addressbook"
 
+
+ at registerElement
 class AddressBookQuery (CardDAVElement):
     """
     Defines a report for querying address book data.
@@ -111,11 +130,11 @@
     name = "addressbook-query"
 
     allowed_children = {
-        (davxml.dav_namespace, "allprop" ): (0, None),
-        (davxml.dav_namespace, "propname"): (0, None),
-        (davxml.dav_namespace, "prop"    ): (0, None),
-        (carddav_namespace,    "filter"  ): (0, 1), # Actually (1, 1) unless element is empty
-        (carddav_namespace,    "limit"    ): (0, None),
+        (dav_namespace,     "allprop" ): (0, None),
+        (dav_namespace,     "propname"): (0, None),
+        (dav_namespace,     "prop"    ): (0, None),
+        (carddav_namespace, "filter"  ): (0, 1), # Actually (1, 1) unless element is empty
+        (carddav_namespace, "limit"    ): (0, None),
     }
 
     def __init__(self, *children, **attributes):
@@ -129,9 +148,9 @@
             qname = child.qname()
 
             if qname in (
-                (davxml.dav_namespace, "allprop" ),
-                (davxml.dav_namespace, "propname"),
-                (davxml.dav_namespace, "prop"    ),
+                (dav_namespace, "allprop" ),
+                (dav_namespace, "propname"),
+                (dav_namespace, "prop"    ),
             ):
                 if props is not None:
                     raise ValueError("Only one of CardDAV:allprop, CardDAV:propname, CardDAV:prop allowed")
@@ -155,6 +174,8 @@
         self.filter = filter
         self.limit = limit
 
+
+ at registerElement
 class AddressDataType (CardDAVEmptyElement):
     """
     Defines which parts of a address component object should be returned by a
@@ -168,6 +189,8 @@
         "version"     : False,
     }
 
+
+ at registerElement
 class AddressData (CardDAVElement):
     """
     Defines which parts of a address component object should be returned by a
@@ -178,8 +201,8 @@
 
     allowed_children = {
         (carddav_namespace, "allprop"): (0, 1),
-        (carddav_namespace, "prop"): (0, None),
-        davxml.PCDATAElement:        (0, None),
+        (carddav_namespace, "prop"   ): (0, None),
+        PCDATAElement                 : (0, None),
     }
     allowed_attributes = {
         "content-type": False,
@@ -189,7 +212,7 @@
     @classmethod
     def fromAddress(clazz, address):
         assert address.name() == "VCARD", "Not a vCard: %r" % (address,)
-        return clazz(davxml.PCDATAElement(str(address)))
+        return clazz(PCDATAElement(str(address)))
 
     @classmethod
     def fromAddressData(clazz, addressdata):
@@ -198,7 +221,7 @@
         @param addressdata: a string of valid address data.
         @return: a L{Addressata} element.
         """
-        return clazz(davxml.PCDATAElement(addressdata))
+        return clazz(PCDATAElement(addressdata))
 
     fromTextData = fromAddressData
 
@@ -227,7 +250,7 @@
                     else:
                         raise ValueError("CardDAV:allprop and CardDAV:prop may not be combined")
 
-            elif isinstance(child, davxml.PCDATAElement):
+            elif isinstance(child, PCDATAElement):
                 if data is None:
                     data = child
                 else:
@@ -289,7 +312,7 @@
         Returns an address component derived from this element.
         """
         for data in self.children:
-            if not isinstance(data, davxml.PCDATAElement):
+            if not isinstance(data, PCDATAElement):
                 return None
             else:
                 # We guaranteed in __init__() that there is only one child...
@@ -299,6 +322,8 @@
 
     textData = addressData
 
+
+ at registerElement
 class AllProperties (CardDAVEmptyElement):
     """
     Specifies that all properties shall be returned.
@@ -306,6 +331,8 @@
     """
     name = "allprop"
 
+
+ at registerElement
 class Property (CardDAVEmptyElement):
     """
     Defines a property to return in a response.
@@ -334,6 +361,8 @@
         else:
             self.novalue = False
 
+
+ at registerElement
 class Filter (CardDAVElement):
     """
     Determines which matching components are returned.
@@ -344,6 +373,8 @@
     allowed_children = { (carddav_namespace, "prop-filter"): (0, None) }
     allowed_attributes = { "test": False }
         
+
+ at registerElement
 class PropertyFilter (CardDAVElement):
     """
     Limits a search to specific properties.
@@ -361,6 +392,8 @@
         "test": False,
     }
 
+
+ at registerElement
 class ParameterFilter (CardDAVElement):
     """
     Limits a search to specific parameters.
@@ -374,7 +407,9 @@
     }
     allowed_attributes = { "name": True }
 
-class Limit (davxml.WebDAVElement):
+
+ at registerElement
+class Limit (WebDAVElement):
     """
     Client supplied limit for reports.
     """
@@ -384,7 +419,9 @@
         (carddav_namespace, "nresults" )  : (1, 1),
     }
 
-class NResults (davxml.WebDAVTextElement):
+
+ at registerElement
+class NResults (WebDAVTextElement):
     """
     Number of results limit.
     """
@@ -392,6 +429,8 @@
     name = "nresults"
 
 
+
+ at registerElement
 class IsNotDefined (CardDAVEmptyElement):
     """
     Specifies that the named vCard item does not exist.
@@ -399,6 +438,8 @@
     """
     name = "is-not-defined"
 
+
+ at registerElement
 class TextMatch (CardDAVTextElement):
     """
     Specifies a substring match on a property or parameter value.
@@ -408,11 +449,11 @@
 
     def fromString(clazz, string): #@NoSelf
         if type(string) is str:
-            return clazz(davxml.PCDATAElement(string))
+            return clazz(PCDATAElement(string))
         elif type(string) is unicode:
-            return clazz(davxml.PCDATAElement(string.encode("utf-8")))
+            return clazz(PCDATAElement(string.encode("utf-8")))
         else:
-            return clazz(davxml.PCDATAElement(str(string)))
+            return clazz(PCDATAElement(str(string)))
 
     fromString = classmethod(fromString)
 
@@ -422,6 +463,8 @@
         "match-type": False
     }
 
+
+ at registerElement
 class AddressBookMultiGet (CardDAVElement):
     """
     CardDAV report used to retrieve specific vCard items via their URIs.
@@ -432,10 +475,10 @@
     # To allow for an empty element in a supported-report-set property we need
     # to relax the child restrictions
     allowed_children = {
-        (davxml.dav_namespace, "allprop" ): (0, 1),
-        (davxml.dav_namespace, "propname"): (0, 1),
-        (davxml.dav_namespace, "prop"    ): (0, 1),
-        (davxml.dav_namespace, "href"    ): (0, None),    # Actually ought to be (1, None)
+        (dav_namespace, "allprop" ): (0, 1),
+        (dav_namespace, "propname"): (0, 1),
+        (dav_namespace, "prop"    ): (0, 1),
+        (dav_namespace, "href"    ): (0, None),    # Actually ought to be (1, None)
     }
 
     def __init__(self, *children, **attributes):
@@ -448,20 +491,22 @@
             qname = child.qname()
 
             if qname in (
-                (davxml.dav_namespace, "allprop" ),
-                (davxml.dav_namespace, "propname"),
-                (davxml.dav_namespace, "prop"    ),
+                (dav_namespace, "allprop" ),
+                (dav_namespace, "propname"),
+                (dav_namespace, "prop"    ),
             ):
                 if property is not None:
                     raise ValueError("Only one of DAV:allprop, DAV:propname, DAV:prop allowed")
                 property = child
 
-            elif qname == (davxml.dav_namespace, "href"):
+            elif qname == (dav_namespace, "href"):
                 resources.append(child)
 
         self.property  = property
         self.resources = resources
 
+
+ at registerElement
 class NoUIDConflict(CardDAVElement):
     """
     CardDAV precondition used to indicate a UID conflict during PUT/COPY/MOVE.
@@ -469,8 +514,10 @@
     """
     name = "no-uid-conflict"
 
-    allowed_children = { (davxml.dav_namespace, "href"): (1, 1) }
+    allowed_children = { (dav_namespace, "href"): (1, 1) }
     
+
+ at registerElement
 class SupportedFilter(CardDAVElement):
     """
     CardDAV precondition used to indicate an unsupported component type in a
@@ -484,6 +531,8 @@
         (carddav_namespace, "param-filter"): (0, None)
     }
     
+
+ at registerElement
 class DirectoryGateway(CardDAVElement):
     """
     CardDAV property on a principal to indicate where the directory gateway resource is.
@@ -492,27 +541,32 @@
     hidden = True
     protected = True
 
-    allowed_children = { (davxml.dav_namespace, "href"): (0, None) }
+    allowed_children = { (dav_namespace, "href"): (0, None) }
     
+
+ at registerElement
 class Directory(CardDAVEmptyElement):
     """
     CardDAV property on a principal to indicate where the directory resource is.
     """
     name = "directory"
     
+
+ at registerElement
 class DefaultAddressBookURL (CardDAVElement):
     """
     A single href indicating which addressbook is the default.
     """
     name = "default-addressbook-URL"
 
-    allowed_children = { (davxml.dav_namespace, "href"): (0, 1) }
+    allowed_children = { (dav_namespace, "href"): (0, 1) }
 
 ##
-# Extensions to davxml.ResourceType
+# Extensions to ResourceType
 ##
 
 def _isAddressBook(self): return bool(self.childrenOfType(AddressBook))
-davxml.ResourceType.isAddressBook = _isAddressBook
-davxml.ResourceType.addressbook = davxml.ResourceType(davxml.Collection(), AddressBook())
-davxml.ResourceType.directory = davxml.ResourceType(davxml.Collection(), AddressBook(), Directory())
+ResourceType.isAddressBook = _isAddressBook
+
+ResourceType.addressbook = ResourceType(Collection(), AddressBook())
+ResourceType.directory   = ResourceType(Collection(), AddressBook(), Directory())

Modified: CalendarServer/trunk/twistedcaldav/customxml.py
===================================================================
--- CalendarServer/trunk/twistedcaldav/customxml.py	2012-03-17 03:37:14 UTC (rev 8906)
+++ CalendarServer/trunk/twistedcaldav/customxml.py	2012-03-17 07:27:16 UTC (rev 8907)
@@ -23,16 +23,19 @@
 change.
 """
 
-from twext.web2.dav.davxml import dav_namespace
-from twext.web2.dav.davxml import twisted_dav_namespace
-from txdav.xml.base import twisted_private_namespace
-from twext.web2.dav import davxml
+from txdav.xml.element import registerElement, dav_namespace
+from txdav.xml.element import twisted_dav_namespace, twisted_private_namespace
+from txdav.xml.element import WebDAVElement, PCDATAElement
+from txdav.xml.element import WebDAVEmptyElement, WebDAVTextElement
+from txdav.xml.element import PrincipalPropertySearch, Match
+from txdav.xml.element import ResourceType, Collection, Principal
 
 from twistedcaldav import caldavxml, carddavxml
 from twistedcaldav.ical import Component as iComponent
 
 from pycalendar.datetime import PyCalendarDateTime
 
+
 calendarserver_namespace = "http://calendarserver.org/ns/"
 
 calendarserver_proxy_compliance = (
@@ -60,7 +63,9 @@
     "calendarserver-sharing-no-scheduling",
 )
 
-class TwistedCalendarSupportedComponents (davxml.WebDAVTextElement):
+
+ at registerElement
+class TwistedCalendarSupportedComponents (WebDAVTextElement):
     """
     Contains the calendar supported components list.
     """
@@ -71,7 +76,9 @@
     def getValue(self):
         return str(self)
 
-class TwistedCalendarAccessProperty (davxml.WebDAVTextElement):
+
+ at registerElement
+class TwistedCalendarAccessProperty (WebDAVTextElement):
     """
     Contains the calendar access level (private events) for the resource.
     """
@@ -82,7 +89,9 @@
     def getValue(self):
         return str(self)
 
-class TwistedSchedulingObjectResource (davxml.WebDAVTextElement):
+
+ at registerElement
+class TwistedSchedulingObjectResource (WebDAVTextElement):
     """
     Indicates that the resource is a scheduling object resource.    
     """
@@ -90,7 +99,9 @@
     name = "scheduling-object-resource"
     hidden = True
 
-class TwistedScheduleMatchETags(davxml.WebDAVElement):
+
+ at registerElement
+class TwistedScheduleMatchETags(WebDAVElement):
     """
     List of ETags that can be used for a "weak" If-Match comparison.    
     """
@@ -100,7 +111,9 @@
 
     allowed_children = { (dav_namespace, "getetag"): (0, None) }
 
-class TwistedCalendarHasPrivateCommentsProperty (davxml.WebDAVEmptyElement):
+
+ at registerElement
+class TwistedCalendarHasPrivateCommentsProperty (WebDAVEmptyElement):
     """
     Indicates that a calendar resource has private comments.
     
@@ -112,7 +125,9 @@
     name = "calendar-has-private-comments"
     hidden = True
 
-class CalendarProxyRead (davxml.WebDAVEmptyElement):
+
+ at registerElement
+class CalendarProxyRead (WebDAVEmptyElement):
     """
     A read-only calendar user proxy principal resource.
     (Apple Extension to CalDAV)
@@ -120,7 +135,9 @@
     namespace = calendarserver_namespace
     name = "calendar-proxy-read"
 
-class CalendarProxyWrite (davxml.WebDAVEmptyElement):
+
+ at registerElement
+class CalendarProxyWrite (WebDAVEmptyElement):
     """
     A read-write calendar user proxy principal resource.
     (Apple Extension to CalDAV)
@@ -128,7 +145,9 @@
     namespace = calendarserver_namespace
     name = "calendar-proxy-write"
 
-class CalendarProxyReadFor (davxml.WebDAVElement):
+
+ at registerElement
+class CalendarProxyReadFor (WebDAVElement):
     """
     List of principals granting read-only proxy status.
     (Apple Extension to CalDAV)
@@ -140,7 +159,9 @@
 
     allowed_children = { (dav_namespace, "href"): (0, None) }
 
-class CalendarProxyWriteFor (davxml.WebDAVElement):
+
+ at registerElement
+class CalendarProxyWriteFor (WebDAVElement):
     """
     List of principals granting read-write proxy status.
     (Apple Extension to CalDAV)
@@ -152,7 +173,9 @@
 
     allowed_children = { (dav_namespace, "href"): (0, None) }
 
-class DropBoxHome (davxml.WebDAVEmptyElement):
+
+ at registerElement
+class DropBoxHome (WebDAVEmptyElement):
     """
     Denotes a drop box home collection (a collection that will contain drop boxes).
     (Apple Extension to CalDAV)
@@ -160,7 +183,9 @@
     namespace = calendarserver_namespace
     name = "dropbox-home"
 
-class DropBox (davxml.WebDAVEmptyElement):
+
+ at registerElement
+class DropBox (WebDAVEmptyElement):
     """
     Denotes a drop box collection.
     (Apple Extension to CalDAV)
@@ -168,7 +193,9 @@
     namespace = calendarserver_namespace
     name = "dropbox"
 
-class DropBoxHomeURL (davxml.WebDAVElement):
+
+ at registerElement
+class DropBoxHomeURL (WebDAVElement):
     """
     A principal property to indicate the location of the drop box home.
     (Apple Extension to CalDAV)
@@ -178,9 +205,11 @@
     hidden = True
     protected = True
 
-    allowed_children = { (davxml.dav_namespace, "href"): (0, 1) }
+    allowed_children = { (dav_namespace, "href"): (0, 1) }
 
-class GETCTag (davxml.WebDAVTextElement):
+
+ at registerElement
+class GETCTag (WebDAVTextElement):
     """
     Contains the calendar collection entity tag.
     """
@@ -188,7 +217,9 @@
     name = "getctag"
     protected = True
 
-class CalendarAvailability (davxml.WebDAVTextElement):
+
+ at registerElement
+class CalendarAvailability (WebDAVTextElement):
     """
     Contains the calendar availability property.
     """
@@ -232,7 +263,9 @@
 
         return found
 
-class MaxCollections (davxml.WebDAVTextElement):
+
+ at registerElement
+class MaxCollections (WebDAVTextElement):
     """
     Maximum number of child collections in a home collection
     """
@@ -241,7 +274,9 @@
     hidden = True
     protected = True
 
-class MaxResources (davxml.WebDAVTextElement):
+
+ at registerElement
+class MaxResources (WebDAVTextElement):
     """
     Maximum number of child resources in a collection
     """
@@ -250,7 +285,9 @@
     hidden = True
     protected = True
 
-class Timezones (davxml.WebDAVEmptyElement):
+
+ at registerElement
+class Timezones (WebDAVEmptyElement):
     """
     Denotes a timezone service resource.
     (Apple Extension to CalDAV)
@@ -258,7 +295,9 @@
     namespace = calendarserver_namespace
     name = "timezones"
 
-class TZIDs (davxml.WebDAVElement):
+
+ at registerElement
+class TZIDs (WebDAVElement):
     """
     Wraps a list of timezone ids.
     """
@@ -266,14 +305,18 @@
     name = "tzids"
     allowed_children = { (calendarserver_namespace, "tzid" ): (0, None) }
 
-class TZID (davxml.WebDAVTextElement):
+
+ at registerElement
+class TZID (WebDAVTextElement):
     """
     A timezone id.
     """
     namespace = calendarserver_namespace
     name = "tzid"
 
-class TZData (davxml.WebDAVElement):
+
+ at registerElement
+class TZData (WebDAVElement):
     """
     Wraps a list of timezone observances.
     """
@@ -281,7 +324,9 @@
     name = "tzdata"
     allowed_children = { (calendarserver_namespace, "observance" ): (0, None) }
 
-class Observance (davxml.WebDAVElement):
+
+ at registerElement
+class Observance (WebDAVElement):
     """
     A timezone observance.
     """
@@ -292,21 +337,27 @@
         (calendarserver_namespace, "utc-offset" ): (1, 1),
     }
 
-class Onset (davxml.WebDAVTextElement):
+
+ at registerElement
+class Onset (WebDAVTextElement):
     """
     The onset date-time for a DST transition.
     """
     namespace = calendarserver_namespace
     name = "onset"
 
-class UTCOffset (davxml.WebDAVTextElement):
+
+ at registerElement
+class UTCOffset (WebDAVTextElement):
     """
     A UTC offset value for a timezone observance.
     """
     namespace = calendarserver_namespace
     name = "utc-offset"
 
-class PubSubPushTransportsProperty (davxml.WebDAVTextElement):
+
+ at registerElement
+class PubSubPushTransportsProperty (WebDAVTextElement):
     """
     A calendar property describing the available push notification transports
     available.
@@ -319,7 +370,9 @@
         (calendarserver_namespace, "transport") : (0, 1),
     }
 
-class PubSubTransportProperty (davxml.WebDAVTextElement):
+
+ at registerElement
+class PubSubTransportProperty (WebDAVTextElement):
     namespace = calendarserver_namespace
     name = "transport"
     protected = True
@@ -335,32 +388,42 @@
         (calendarserver_namespace, "xmpp-uri") : (1, 1),
     }
 
-class PubSubSubscriptionProperty (davxml.WebDAVTextElement):
+
+ at registerElement
+class PubSubSubscriptionProperty (WebDAVTextElement):
     namespace = calendarserver_namespace
     name = "subscription-url"
     protected = True
     hidden = True
-    allowed_children = { (davxml.dav_namespace, "href"): (0, 1) }
+    allowed_children = { (dav_namespace, "href"): (0, 1) }
 
-class PubSubAPSBundleIDProperty (davxml.WebDAVTextElement):
+
+ at registerElement
+class PubSubAPSBundleIDProperty (WebDAVTextElement):
     namespace = calendarserver_namespace
     name = "apsbundleid"
     protected = True
     hidden = True
 
-class PubSubAPSEnvironmentProperty (davxml.WebDAVTextElement):
+
+ at registerElement
+class PubSubAPSEnvironmentProperty (WebDAVTextElement):
     namespace = calendarserver_namespace
     name = "env"
     protected = True
     hidden = True
 
-class PubSubXMPPPushKeyProperty (davxml.WebDAVTextElement):
+
+ at registerElement
+class PubSubXMPPPushKeyProperty (WebDAVTextElement):
     namespace = calendarserver_namespace
     name = "pushkey"
     protected = True
     hidden = True
 
-class PubSubXMPPURIProperty (davxml.WebDAVTextElement):
+
+ at registerElement
+class PubSubXMPPURIProperty (WebDAVTextElement):
     """
     A calendar home property to indicate the pubsub XMPP URI to subscribe to
     for notifications.
@@ -370,7 +433,9 @@
     protected = True
     hidden = True
 
-class PubSubHeartbeatProperty (davxml.WebDAVElement):
+
+ at registerElement
+class PubSubHeartbeatProperty (WebDAVElement):
     """
     A calendar home property to indicate the pubsub XMPP URI to subscribe to
     for server heartbeats.
@@ -384,19 +449,25 @@
         (calendarserver_namespace, "xmpp-heartbeat-minutes" ) : (1, 1),
     }
 
-class PubSubHeartbeatURIProperty (davxml.WebDAVTextElement):
+
+ at registerElement
+class PubSubHeartbeatURIProperty (WebDAVTextElement):
     namespace = calendarserver_namespace
     name = "xmpp-heartbeat-uri"
     protected = True
     hidden = True
 
-class PubSubHeartbeatMinutesProperty (davxml.WebDAVTextElement):
+
+ at registerElement
+class PubSubHeartbeatMinutesProperty (WebDAVTextElement):
     namespace = calendarserver_namespace
     name = "xmpp-heartbeat-minutes"
     protected = True
     hidden = True
 
-class PubSubXMPPServerProperty (davxml.WebDAVTextElement):
+
+ at registerElement
+class PubSubXMPPServerProperty (WebDAVTextElement):
     """
     A calendar home property to indicate the pubsub XMPP hostname to
     contact for notifications.
@@ -406,14 +477,17 @@
     protected = True
     hidden = True
 
-davxml.PrincipalPropertySearch.allowed_children[(calendarserver_namespace, "limit")] = (0, 1)
-davxml.PrincipalPropertySearch.allowed_attributes["type"] = False
-davxml.Match.allowed_attributes = {
+
+PrincipalPropertySearch.allowed_children[(calendarserver_namespace, "limit")] = (0, 1)
+PrincipalPropertySearch.allowed_attributes["type"] = False
+Match.allowed_attributes = {
     "caseless": False,
     "match-type": False,
 }
 
-class Limit (davxml.WebDAVElement):
+
+ at registerElement
+class Limit (WebDAVElement):
     """
     Client supplied limit for reports.
     """
@@ -423,14 +497,18 @@
         (calendarserver_namespace, "nresults" )  : (1, 1),
     }
 
-class NResults (davxml.WebDAVTextElement):
+
+ at registerElement
+class NResults (WebDAVTextElement):
     """
     Number of results limit.
     """
     namespace = calendarserver_namespace
     name = "nresults"
 
-class FirstNameProperty (davxml.WebDAVTextElement):
+
+ at registerElement
+class FirstNameProperty (WebDAVTextElement):
     """
     A property representing first name of a principal
     """
@@ -439,7 +517,9 @@
     protected = True
     hidden = True
 
-class LastNameProperty (davxml.WebDAVTextElement):
+
+ at registerElement
+class LastNameProperty (WebDAVTextElement):
     """
     A property representing last name of a principal
     """
@@ -448,7 +528,9 @@
     protected = True
     hidden = True
 
-class EmailAddressProperty (davxml.WebDAVTextElement):
+
+ at registerElement
+class EmailAddressProperty (WebDAVTextElement):
     """
     A property representing email address of a principal
     """
@@ -457,7 +539,9 @@
     protected = True
     hidden = True
 
-class EmailAddressSet (davxml.WebDAVElement):
+
+ at registerElement
+class EmailAddressSet (WebDAVElement):
     """
     The list of email addresses of a principal
     """
@@ -467,7 +551,9 @@
 
     allowed_children = { (calendarserver_namespace, "email-address"): (0, None) }
 
-class ExpandedGroupMemberSet (davxml.WebDAVElement):
+
+ at registerElement
+class ExpandedGroupMemberSet (WebDAVElement):
     """
     The expanded list of members of a (group) principal
     """
@@ -478,7 +564,9 @@
 
     allowed_children = { (dav_namespace, "href"): (0, None) }
 
-class ExpandedGroupMembership (davxml.WebDAVElement):
+
+ at registerElement
+class ExpandedGroupMembership (WebDAVElement):
     """
     The expanded list of groups a principal is a member of
     """
@@ -489,7 +577,9 @@
 
     allowed_children = { (dav_namespace, "href"): (0, None) }
 
-class IScheduleInbox (davxml.WebDAVEmptyElement):
+
+ at registerElement
+class IScheduleInbox (WebDAVEmptyElement):
     """
     Denotes the resourcetype of a iSchedule Inbox.
     (CalDAV-s2s-xx, section x.x.x)
@@ -497,7 +587,9 @@
     namespace = calendarserver_namespace
     name = "ischedule-inbox"
 
-class FreeBusyURL (davxml.WebDAVEmptyElement):
+
+ at registerElement
+class FreeBusyURL (WebDAVEmptyElement):
     """
     Denotes the resourcetype of a free-busy URL resource.
     (CalDAV-s2s-xx, section x.x.x)
@@ -505,7 +597,9 @@
     namespace = calendarserver_namespace
     name = "free-busy-url"
 
-class ScheduleChanges (davxml.WebDAVElement):
+
+ at registerElement
+class ScheduleChanges (WebDAVElement):
     """
     Change indicator for a scheduling message.
     """
@@ -518,16 +612,20 @@
         (calendarserver_namespace, "action" )      : (0, 1), # Have to allow 0 as element is empty in PROPFIND requests
     }
 
-class ScheduleDefaultTasksURL (davxml.WebDAVElement):
+
+ at registerElement
+class ScheduleDefaultTasksURL (WebDAVElement):
     """
     A single href indicating which calendar is the default for VTODO scheduling.
     """
     namespace = calendarserver_namespace
     name = "schedule-default-tasks-URL"
 
-    allowed_children = { (davxml.dav_namespace, "href"): (0, 1) }
+    allowed_children = { (dav_namespace, "href"): (0, 1) }
 
-class DTStamp (davxml.WebDAVTextElement):
+
+ at registerElement
+class DTStamp (WebDAVTextElement):
     """
     A UTC timestamp in iCal format.
     """
@@ -536,9 +634,11 @@
 
     def __init__(self, *children):
         super(DTStamp, self).__init__(children)
-        self.children = (davxml.PCDATAElement(PyCalendarDateTime.getNowUTC().getText()),)
+        self.children = (PCDATAElement(PyCalendarDateTime.getNowUTC().getText()),)
 
-class Action (davxml.WebDAVElement):
+
+ at registerElement
+class Action (WebDAVElement):
     """
     A UTC timestamp in iCal format.
     """
@@ -551,14 +651,18 @@
         (calendarserver_namespace, "reply" )  : (0, 1),
     }
 
-class Create (davxml.WebDAVEmptyElement):
+
+ at registerElement
+class Create (WebDAVEmptyElement):
     """
     Event created.
     """
     namespace = calendarserver_namespace
     name = "create"
 
-class Update (davxml.WebDAVElement):
+
+ at registerElement
+class Update (WebDAVElement):
     """
     Event updated.
     """
@@ -568,7 +672,9 @@
         (calendarserver_namespace, "recurrence" ) : (1, None),
     }
 
-class Cancel (davxml.WebDAVElement):
+
+ at registerElement
+class Cancel (WebDAVElement):
     """
     Event cancelled.
     """
@@ -578,7 +684,9 @@
         (calendarserver_namespace, "recurrence" ) : (0, 1),
     }
 
-class Reply (davxml.WebDAVElement):
+
+ at registerElement
+class Reply (WebDAVElement):
     """
     Event replied to.
     """
@@ -589,7 +697,9 @@
         (calendarserver_namespace, "recurrence" )      : (1, None),
     }
 
-class Recurrence (davxml.WebDAVElement):
+
+ at registerElement
+class Recurrence (WebDAVElement):
     """
     Changes to an event.
     """
@@ -601,21 +711,27 @@
         (calendarserver_namespace, "changes" )      : (0, 1),
     }
 
-class Master (davxml.WebDAVEmptyElement):
+
+ at registerElement
+class Master (WebDAVEmptyElement):
     """
     Master instance changed.
     """
     namespace = calendarserver_namespace
     name = "master"
 
-class RecurrenceID (davxml.WebDAVTextElement):
+
+ at registerElement
+class RecurrenceID (WebDAVTextElement):
     """
     A recurrence instance changed.
     """
     namespace = calendarserver_namespace
     name = "recurrenceid"
 
-class Changes (davxml.WebDAVElement):
+
+ at registerElement
+class Changes (WebDAVElement):
     """
     Changes to an event.
     """
@@ -625,7 +741,9 @@
         (calendarserver_namespace, "changed-property" )  : (0, None),
     }
 
-class ChangedProperty (davxml.WebDAVElement):
+
+ at registerElement
+class ChangedProperty (WebDAVElement):
     """
     Changes to a property.
     """
@@ -640,7 +758,9 @@
         "name" : True,
     }
 
-class ChangedParameter (davxml.WebDAVEmptyElement):
+
+ at registerElement
+class ChangedParameter (WebDAVEmptyElement):
     """
     Changes to a parameter.
     """
@@ -651,14 +771,18 @@
         "name" : True,
     }
 
-class Attendee (davxml.WebDAVTextElement):
+
+ at registerElement
+class Attendee (WebDAVTextElement):
     """
     An attendee calendar user address.
     """
     namespace = calendarserver_namespace
     name = "attendee"
 
-class RecordType (davxml.WebDAVTextElement):
+
+ at registerElement
+class RecordType (WebDAVTextElement):
     """
     Exposes the type of a record
     """
@@ -667,68 +791,88 @@
     protected = True
     hidden = True
 
-class AutoSchedule (davxml.WebDAVTextElement):
+
+ at registerElement
+class AutoSchedule (WebDAVTextElement):
     """
     Whether the principal automatically accepts invitations
     """
     namespace = calendarserver_namespace
     name = "auto-schedule"
 
-class AutoScheduleMode (davxml.WebDAVTextElement):
+
+ at registerElement
+class AutoScheduleMode (WebDAVTextElement):
     """
     The principal's auto-schedule mode
     """
     namespace = calendarserver_namespace
     name = "auto-schedule-mode"
 
+
 ##
 # Sharing
 ##
 
-class ReadAccess (davxml.WebDAVEmptyElement):
+ at registerElement
+class ReadAccess (WebDAVEmptyElement):
     """
     Denotes read and update attendee partstat on a shared calendar.
     """
     namespace = calendarserver_namespace
     name = "read"
 
-class ReadWriteAccess (davxml.WebDAVEmptyElement):
+
+ at registerElement
+class ReadWriteAccess (WebDAVEmptyElement):
     """
     Denotes read and write access on a shared calendar.
     """
     namespace = calendarserver_namespace
     name = "read-write"
 
-class UID (davxml.WebDAVTextElement):
+
+ at registerElement
+class UID (WebDAVTextElement):
     namespace = calendarserver_namespace
     name = "uid"
 
-class InReplyTo (davxml.WebDAVTextElement):
+
+ at registerElement
+class InReplyTo (WebDAVTextElement):
     namespace = calendarserver_namespace
     name = "in-reply-to"
 
-class SharedOwner (davxml.WebDAVEmptyElement):
+
+ at registerElement
+class SharedOwner (WebDAVEmptyElement):
     """
     Denotes a shared collection.
     """
     namespace = calendarserver_namespace
     name = "shared-owner"
 
-class Shared (davxml.WebDAVEmptyElement):
+
+ at registerElement
+class Shared (WebDAVEmptyElement):
     """
     Denotes a shared collection.
     """
     namespace = calendarserver_namespace
     name = "shared"
 
-class Subscribed (davxml.WebDAVEmptyElement):
+
+ at registerElement
+class Subscribed (WebDAVEmptyElement):
     """
     Denotes a subscribed calendar collection.
     """
     namespace = calendarserver_namespace
     name = "subscribed"
 
-class SharedURL (davxml.WebDAVTextElement):
+
+ at registerElement
+class SharedURL (WebDAVTextElement):
     """
     The source url for a shared calendar.
     """
@@ -737,7 +881,9 @@
     protected = True
     hidden = True
 
-class SharedAs (davxml.WebDAVElement):
+
+ at registerElement
+class SharedAs (WebDAVElement):
     """
     The url for a shared calendar.
     """
@@ -748,21 +894,27 @@
         (dav_namespace, "href")    : (1, 1),
     }
 
-class SharedAcceptEmailNotification (davxml.WebDAVTextElement):
+
+ at registerElement
+class SharedAcceptEmailNotification (WebDAVTextElement):
     """
     The accept email flag for a shared calendar.
     """
     namespace = calendarserver_namespace
     name = "shared-accept-email-notification"
 
-class Birthday (davxml.WebDAVEmptyElement):
+
+ at registerElement
+class Birthday (WebDAVEmptyElement):
     """
     Denotes a birthday calendar collection.
     """
     namespace = calendarserver_namespace
     name = "birthday"
 
-class AllowedSharingModes (davxml.WebDAVElement):
+
+ at registerElement
+class AllowedSharingModes (WebDAVElement):
     namespace = calendarserver_namespace
     name = "allowed-sharing-modes"
     protected = True
@@ -773,15 +925,21 @@
         (calendarserver_namespace, "can-be-published") : (0, 1),
     }
 
-class CanBeShared (davxml.WebDAVEmptyElement):
+
+ at registerElement
+class CanBeShared (WebDAVEmptyElement):
     namespace = calendarserver_namespace
     name = "can-be-shared"
 
-class CanBePublished (davxml.WebDAVEmptyElement):
+
+ at registerElement
+class CanBePublished (WebDAVEmptyElement):
     namespace = calendarserver_namespace
     name = "can-be-published"
 
-class InviteShare (davxml.WebDAVElement):
+
+ at registerElement
+class InviteShare (WebDAVElement):
     namespace = calendarserver_namespace
     name = "share"
 
@@ -790,7 +948,9 @@
         (calendarserver_namespace, "remove") : (0, None),
     }
 
-class InviteSet (davxml.WebDAVElement):
+
+ at registerElement
+class InviteSet (WebDAVElement):
     namespace = calendarserver_namespace
     name = "set"
 
@@ -803,7 +963,9 @@
         (calendarserver_namespace, "read-write-schedule") : (0, 1),
     }
 
-class InviteRemove (davxml.WebDAVElement):
+
+ at registerElement
+class InviteRemove (WebDAVElement):
     namespace = calendarserver_namespace
     name = "remove"
 
@@ -814,7 +976,9 @@
         (calendarserver_namespace, "read-write-schedule") : (0, 1),
     }
 
-class InviteUser (davxml.WebDAVElement):
+
+ at registerElement
+class InviteUser (WebDAVElement):
     namespace = calendarserver_namespace
     name = "user"
 
@@ -831,7 +995,9 @@
         (calendarserver_namespace, "summary")           : (0, 1),
     }
 
-class InviteAccess (davxml.WebDAVElement):
+
+ at registerElement
+class InviteAccess (WebDAVElement):
     namespace = calendarserver_namespace
     name = "access"
 
@@ -841,7 +1007,9 @@
         (calendarserver_namespace, "read-write-schedule") : (0, 1),
     }
 
-class Invite (davxml.WebDAVElement):
+
+ at registerElement
+class Invite (WebDAVElement):
     namespace = calendarserver_namespace
     name = "invite"
 
@@ -849,31 +1017,45 @@
         (calendarserver_namespace, "user") : (0, None),
     }
 
-class InviteSummary (davxml.WebDAVTextElement):
+
+ at registerElement
+class InviteSummary (WebDAVTextElement):
     namespace = calendarserver_namespace
     name = "summary"
 
-class InviteStatusNoResponse (davxml.WebDAVEmptyElement):
+
+ at registerElement
+class InviteStatusNoResponse (WebDAVEmptyElement):
     namespace = calendarserver_namespace
     name = "invite-noresponse"
 
-class InviteStatusDeleted (davxml.WebDAVEmptyElement):
+
+ at registerElement
+class InviteStatusDeleted (WebDAVEmptyElement):
     namespace = calendarserver_namespace
     name = "invite-deleted"
 
-class InviteStatusAccepted (davxml.WebDAVEmptyElement):
+
+ at registerElement
+class InviteStatusAccepted (WebDAVEmptyElement):
     namespace = calendarserver_namespace
     name = "invite-accepted"
 
-class InviteStatusDeclined (davxml.WebDAVEmptyElement):
+
+ at registerElement
+class InviteStatusDeclined (WebDAVEmptyElement):
     namespace = calendarserver_namespace
     name = "invite-declined"
 
-class InviteStatusInvalid (davxml.WebDAVEmptyElement):
+
+ at registerElement
+class InviteStatusInvalid (WebDAVEmptyElement):
     namespace = calendarserver_namespace
     name = "invite-invalid"
 
-class HostURL (davxml.WebDAVElement):
+
+ at registerElement
+class HostURL (WebDAVElement):
     """
     The source for a shared calendar
     """
@@ -884,7 +1066,9 @@
         (dav_namespace, "href") : (0, None)
     }
 
-class Organizer (davxml.WebDAVElement):
+
+ at registerElement
+class Organizer (WebDAVElement):
     """
     The organizer for a shared calendar
     """
@@ -896,14 +1080,18 @@
         (calendarserver_namespace, "common-name")  : (0, 1)
     }
 
-class CommonName (davxml.WebDAVTextElement):
+
+ at registerElement
+class CommonName (WebDAVTextElement):
     """
     Common name for Sharer or Sharee
     """
     namespace = calendarserver_namespace
     name = "common-name"
 
-class InviteNotification (davxml.WebDAVElement):
+
+ at registerElement
+class InviteNotification (WebDAVElement):
     namespace = calendarserver_namespace
     name = "invite-notification"
 
@@ -924,7 +1112,9 @@
         "shared-type" : True,
     }
 
-class InviteReply (davxml.WebDAVElement):
+
+ at registerElement
+class InviteReply (WebDAVElement):
     namespace = calendarserver_namespace
     name = "invite-reply"
 
@@ -937,7 +1127,9 @@
         (calendarserver_namespace, "summary")         : (0, 1),
     }
 
-class ResourceUpdateNotification (davxml.WebDAVElement):
+
+ at registerElement
+class ResourceUpdateNotification (WebDAVElement):
     namespace = calendarserver_namespace
     name = "resource-update-notification"
 
@@ -949,19 +1141,27 @@
         (calendarserver_namespace, "resource-deleted-notification") : (0, 1),
     }
 
-class ResourceUpdateAdded(davxml.WebDAVEmptyElement):
+
+ at registerElement
+class ResourceUpdateAdded(WebDAVEmptyElement):
     namespace = calendarserver_namespace
     name = "resource-added-notification"
 
-class ResourceUpdateUpdated(davxml.WebDAVEmptyElement):
+
+ at registerElement
+class ResourceUpdateUpdated(WebDAVEmptyElement):
     namespace = calendarserver_namespace
     name = "resource-updated-notification"
 
-class ResourceUpdateDeleted(davxml.WebDAVEmptyElement):
+
+ at registerElement
+class ResourceUpdateDeleted(WebDAVEmptyElement):
     namespace = calendarserver_namespace
     name = "resource-deleted-notification"
 
-class SharedCalendarUpdateNotification (davxml.WebDAVElement):
+
+ at registerElement
+class SharedCalendarUpdateNotification (WebDAVElement):
     namespace = calendarserver_namespace
     name = "shared-update-notification"
 
@@ -977,7 +1177,8 @@
 # Notifications
 ##
 
-class Notification (davxml.WebDAVElement):
+ at registerElement
+class Notification (WebDAVElement):
     """
     Denotes a notification collection, or a notification message.
     """
@@ -992,7 +1193,9 @@
         (calendarserver_namespace, "shared-update-notification")    : (0, None),
     }
 
-class NotificationURL (davxml.WebDAVElement):
+
+ at registerElement
+class NotificationURL (WebDAVElement):
     """
     A principal property to indicate the notification collection for the principal.
     """
@@ -1005,7 +1208,9 @@
         (dav_namespace, "href") : (0, 1)
     }
 
-class NotificationType (davxml.WebDAVElement):
+
+ at registerElement
+class NotificationType (WebDAVElement):
     """
     A property to indicate what type of notification the resource represents.
     """
@@ -1019,16 +1224,20 @@
         (calendarserver_namespace, "invite-reply")          : (0, None),
     }
 
-class Link (davxml.WebDAVEmptyElement):
+
+ at registerElement
+class Link (WebDAVEmptyElement):
     """
     Denotes a linked resource.
     """
     namespace = calendarserver_namespace
     name = "link"
 
+
 mm_namespace = "http://me.com/_namespace/"
 
-class Multiput (davxml.WebDAVElement):
+ at registerElement
+class Multiput (WebDAVElement):
     namespace = mm_namespace
     name = "multiput"
 
@@ -1036,32 +1245,40 @@
         (mm_namespace, "resource")   : (1, None),
     }
 
-class Resource (davxml.WebDAVElement):
+
+ at registerElement
+class Resource (WebDAVElement):
     namespace = mm_namespace
     name = "resource"
 
     allowed_children = {
-        (davxml,       "href")     : (0, 1),
-        (mm_namespace, "if-match") : (0, 1),
-        (davxml,       "set")      : (0, 1),
-        (davxml,       "remove")   : (0, 1),
-        (mm_namespace, "delete")   : (0, 1),
+        (dav_namespace, "href")     : (0, 1),
+        (mm_namespace,  "if-match") : (0, 1),
+        (dav_namespace, "set")      : (0, 1),
+        (dav_namespace, "remove")   : (0, 1),
+        (mm_namespace,  "delete")   : (0, 1),
     }
 
-class IfMatch (davxml.WebDAVElement):
+
+ at registerElement
+class IfMatch (WebDAVElement):
     namespace = mm_namespace
     name = "if-match"
 
     allowed_children = {
-        (davxml, "getetag")   : (1, 1),
+        (dav_namespace, "getetag")   : (1, 1),
     }
 
-class Delete (davxml.WebDAVEmptyElement):
+
+ at registerElement
+class Delete (WebDAVEmptyElement):
     namespace = mm_namespace
     name = "delete"
 
 
-class BulkRequests (davxml.WebDAVElement):
+
+ at registerElement
+class BulkRequests (WebDAVElement):
     namespace = mm_namespace
     name = "bulk-requests"
     hidden = True
@@ -1072,7 +1289,9 @@
         (mm_namespace, "crud")     : (0, 1),
     }
 
-class Simple (davxml.WebDAVElement):
+
+ at registerElement
+class Simple (WebDAVElement):
     namespace = mm_namespace
     name = "simple"
     hidden = True
@@ -1083,7 +1302,9 @@
         (mm_namespace, "max-bytes")       : (1, 1),
     }
 
-class CRUD (davxml.WebDAVElement):
+
+ at registerElement
+class CRUD (WebDAVElement):
     namespace = mm_namespace
     name = "crud"
     hidden = True
@@ -1094,11 +1315,15 @@
         (mm_namespace, "max-bytes")       : (1, 1),
     }
 
-class MaxBulkResources (davxml.WebDAVTextElement):
+
+ at registerElement
+class MaxBulkResources (WebDAVTextElement):
     namespace = mm_namespace
     name = "max-resources"
 
-class MaxBulkBytes (davxml.WebDAVTextElement):
+
+ at registerElement
+class MaxBulkBytes (WebDAVTextElement):
     namespace = mm_namespace
     name = "max-bytes"
 
@@ -1107,23 +1332,31 @@
 # Client properties we might care about
 #
 
-class CalendarColor(davxml.WebDAVTextElement):
+ at registerElement
+class CalendarColor(WebDAVTextElement):
     namespace = "http://apple.com/ns/ical/"
     name = "calendar-color"
 
 ##
-# Extensions to davxml.ResourceType
+# Extensions to ResourceType
 ##
 
-davxml.ResourceType.dropboxhome = davxml.ResourceType(davxml.Collection(), DropBoxHome())
-davxml.ResourceType.dropbox = davxml.ResourceType(davxml.Collection(), DropBox())
-davxml.ResourceType.calendarproxyread = davxml.ResourceType(davxml.Principal(), davxml.Collection(), CalendarProxyRead())
-davxml.ResourceType.calendarproxywrite = davxml.ResourceType(davxml.Principal(), davxml.Collection(), CalendarProxyWrite())
-davxml.ResourceType.timezones = davxml.ResourceType(Timezones())
-davxml.ResourceType.ischeduleinbox = davxml.ResourceType(IScheduleInbox())
-davxml.ResourceType.freebusyurl = davxml.ResourceType(FreeBusyURL())
-davxml.ResourceType.notification = davxml.ResourceType(davxml.Collection(), Notification())
-davxml.ResourceType.sharedownercalendar = davxml.ResourceType(davxml.Collection(), caldavxml.Calendar(), SharedOwner())
-davxml.ResourceType.sharedcalendar = davxml.ResourceType(davxml.Collection(), caldavxml.Calendar(), Shared())
-davxml.ResourceType.sharedaddressbook = davxml.ResourceType(davxml.Collection(), carddavxml.AddressBook(), Shared())
-davxml.ResourceType.link = davxml.ResourceType(Link())
+ResourceType.dropboxhome = ResourceType(Collection(), DropBoxHome())
+ResourceType.dropbox     = ResourceType(Collection(), DropBox())
+
+ResourceType.calendarproxyread  = ResourceType(Principal(), Collection(), CalendarProxyRead())
+ResourceType.calendarproxywrite = ResourceType(Principal(), Collection(), CalendarProxyWrite())
+
+ResourceType.timezones = ResourceType(Timezones())
+
+ResourceType.ischeduleinbox = ResourceType(IScheduleInbox())
+
+ResourceType.freebusyurl = ResourceType(FreeBusyURL())
+
+ResourceType.notification = ResourceType(Collection(), Notification())
+
+ResourceType.sharedownercalendar = ResourceType(Collection(), caldavxml.Calendar(),     SharedOwner())
+ResourceType.sharedcalendar      = ResourceType(Collection(), caldavxml.Calendar(),     Shared())
+ResourceType.sharedaddressbook   = ResourceType(Collection(), carddavxml.AddressBook(), Shared())
+
+ResourceType.link = ResourceType(Link())

Modified: CalendarServer/trunk/twistedcaldav/extensions.py
===================================================================
--- CalendarServer/trunk/twistedcaldav/extensions.py	2012-03-17 03:37:14 UTC (rev 8906)
+++ CalendarServer/trunk/twistedcaldav/extensions.py	2012-03-17 07:27:16 UTC (rev 8907)
@@ -47,9 +47,9 @@
 from twext.web2.http_headers import MimeType
 from twext.web2.stream import FileStream
 from twext.web2.static import MetaDataMixin, StaticRenderMixin
-from twext.web2.dav import davxml
+from txdav.xml import element
+from txdav.xml.element import dav_namespace
 from twext.web2.dav.auth import PrincipalCredentials
-from twext.web2.dav.davxml import dav_namespace
 from twext.web2.dav.http import MultiStatusResponse
 from twext.web2.dav.idav import IDAVPrincipalResource
 from twext.web2.dav.static import DAVFile as SuperDAVFile
@@ -102,8 +102,8 @@
             hasattr(request, "credentialFactories") and
             hasattr(request, "loginInterfaces")
         ):
-            request.authnUser = davxml.Principal(davxml.Unauthenticated())
-            request.authzUser = davxml.Principal(davxml.Unauthenticated())
+            request.authnUser = element.Principal(element.Unauthenticated())
+            request.authzUser = element.Principal(element.Unauthenticated())
             returnValue((request.authnUser, request.authzUser,))
 
         authHeader = request.headers.getHeader("authorization")
@@ -155,8 +155,8 @@
                 # This request has already been authenticated via the wiki
                 returnValue((request.authnUser, request.authzUser))
 
-            request.authnUser = davxml.Principal(davxml.Unauthenticated())
-            request.authzUser = davxml.Principal(davxml.Unauthenticated())
+            request.authnUser = element.Principal(element.Unauthenticated())
+            request.authzUser = element.Principal(element.Unauthenticated())
             returnValue((request.authnUser, request.authzUser,))
 
     def principalsForAuthID(self, request, creds):
@@ -290,8 +290,8 @@
         searching.
         """
         # Verify root element
-        if not isinstance(principal_property_search, davxml.PrincipalPropertySearch):
-            msg = "%s expected as root element, not %s." % (davxml.PrincipalPropertySearch.sname(), principal_property_search.sname())
+        if not isinstance(principal_property_search, element.PrincipalPropertySearch):
+            msg = "%s expected as root element, not %s." % (element.PrincipalPropertySearch.sname(), principal_property_search.sname())
             log.warn(msg)
             raise HTTPError(StatusResponse(responsecode.BAD_REQUEST, msg))
 
@@ -334,10 +334,10 @@
                 applyTo = True
 
             elif child.qname() == (dav_namespace, "property-search"):
-                props = child.childOfType(davxml.PropertyContainer)
+                props = child.childOfType(element.PropertyContainer)
                 props.removeWhitespaceNodes()
 
-                match = child.childOfType(davxml.Match)
+                match = child.childOfType(element.Match)
                 caseless = match.attributes.get("caseless", "yes")
                 if caseless not in ("yes", "no"):
                     msg = "Bad XML: unknown value for caseless attribute: %s" % (caseless,)
@@ -434,7 +434,7 @@
             yield prop_common.responseForHref(
                 request,
                 responses,
-                davxml.HRef.fromString(url),
+                element.HRef.fromString(url),
                 resource,
                 propertiesForResource,
                 propElement
@@ -444,13 +444,13 @@
             if resultsWereLimited[0] == "server":
                 log.err("Too many matching resources in "
                         "principal-property-search report")
-            responses.append(davxml.StatusResponse(
-                davxml.HRef.fromString(request.uri),
-                davxml.Status.fromResponseCode(
+            responses.append(element.StatusResponse(
+                element.HRef.fromString(request.uri),
+                element.Status.fromResponseCode(
                     responsecode.INSUFFICIENT_STORAGE_SPACE
                 ),
-                davxml.Error(davxml.NumberOfMatchesWithinLimits()),
-                davxml.ResponseDescription("Results limited by %s at %d"
+                element.Error(element.NumberOfMatchesWithinLimits()),
+                element.ResponseDescription("Results limited by %s at %d"
                                            % resultsWereLimited),
             ))
         returnValue(MultiStatusResponse(responses))
@@ -714,7 +714,7 @@
         # Allow live property to be overridden by dead property
         if self.deadProperties().contains((dav_namespace, "resourcetype")):
             return self.deadProperties().get((dav_namespace, "resourcetype"))
-        return davxml.ResourceType(davxml.Collection()) if self.isCollection() else davxml.ResourceType()
+        return element.ResourceType(element.Collection()) if self.isCollection() else element.ResourceType()
 
     def contentType(self):
         return MimeType("httpd", "unix-directory") if self.isCollection() else None
@@ -842,13 +842,13 @@
             if name == "expanded-group-member-set":
                 principals = (yield self.expandedGroupMembers())
                 returnValue(customxml.ExpandedGroupMemberSet(
-                    *[davxml.HRef(p.principalURL()) for p in principals]
+                    *[element.HRef(p.principalURL()) for p in principals]
                 ))
 
             elif name == "expanded-group-membership":
                 principals = (yield self.expandedGroupMemberships())
                 returnValue(customxml.ExpandedGroupMembership(
-                    *[davxml.HRef(p.principalURL()) for p in principals]
+                    *[element.HRef(p.principalURL()) for p in principals]
                 ))
 
             elif name == "record-type":
@@ -882,9 +882,9 @@
         if self.deadProperties().contains((dav_namespace, "resourcetype")):
             return self.deadProperties().get((dav_namespace, "resourcetype"))
         if self.isCollection():
-            return davxml.ResourceType(davxml.Principal(), davxml.Collection())
+            return element.ResourceType(element.Principal(), element.Collection())
         else:
-            return davxml.ResourceType(davxml.Principal())
+            return element.ResourceType(element.Principal())
 
 
 
@@ -899,8 +899,8 @@
         if self.deadProperties().contains((dav_namespace, "resourcetype")):
             return self.deadProperties().get((dav_namespace, "resourcetype"))
         if self.isCollection():
-            return davxml.ResourceType.collection #@UndefinedVariable
-        return davxml.ResourceType.empty #@UndefinedVariable
+            return element.ResourceType.collection #@UndefinedVariable
+        return element.ResourceType.empty #@UndefinedVariable
 
     def render(self, request):
         if not self.fp.exists():

Modified: CalendarServer/trunk/twistedcaldav/method/report_common.py
===================================================================
--- CalendarServer/trunk/twistedcaldav/method/report_common.py	2012-03-17 03:37:14 UTC (rev 8906)
+++ CalendarServer/trunk/twistedcaldav/method/report_common.py	2012-03-17 07:27:16 UTC (rev 8907)
@@ -39,8 +39,8 @@
 from twisted.internet.defer import inlineCallbacks, returnValue, maybeDeferred
 from twisted.python.failure import Failure
 from twext.web2 import responsecode
-from twext.web2.dav import davxml
-from txdav.xml.base import WebDAVElement
+
+from txdav.xml import element
 from twext.web2.dav.http import statusForFailure
 from twext.web2.dav.method.propfind import propertyName
 from twext.web2.dav.method.report import NumberOfMatchesWithinLimits
@@ -183,14 +183,14 @@
         for status in properties_by_status:
             properties = properties_by_status[status]
             if properties:
-                xml_status = davxml.Status.fromResponseCode(status)
-                xml_container = davxml.PropertyContainer(*properties)
-                xml_propstat = davxml.PropertyStatus(xml_container, xml_status)
+                xml_status = element.Status.fromResponseCode(status)
+                xml_container = element.PropertyContainer(*properties)
+                xml_propstat = element.PropertyStatus(xml_container, xml_status)
 
                 propstats.append(xml_propstat)
 
         if propstats:
-            responses.append(davxml.PropertyStatusResponse(href, *propstats))
+            responses.append(element.PropertyStatusResponse(href, *propstats))
 
     d = propertiesForResource(request, propertyreq, resource, calendar, timezone, vcard, isowner)
     d.addCallback(_defer)
@@ -354,7 +354,7 @@
             properties_by_status[responsecode.OK].append(propvalue)
             continue
     
-        if isinstance(property, WebDAVElement):
+        if isinstance(property, element.WebDAVElement):
             qname = property.qname()
         else:
             qname = property

Modified: CalendarServer/trunk/twistedcaldav/method/report_sync_collection.py
===================================================================
--- CalendarServer/trunk/twistedcaldav/method/report_sync_collection.py	2012-03-17 03:37:14 UTC (rev 8906)
+++ CalendarServer/trunk/twistedcaldav/method/report_sync_collection.py	2012-03-17 07:27:16 UTC (rev 8907)
@@ -20,16 +20,13 @@
 
 __all__ = ["report_DAV__sync_collection"]
 
-from twext.python.log import Logger
-from twext.web2.dav.davxml import SyncToken
-from twext.web2.dav.http import ErrorResponse
-
 from twisted.internet.defer import inlineCallbacks, returnValue
 from twisted.python.failure import Failure
+
+from twext.python.log import Logger
+from txdav.xml import element
+from twext.web2.dav.http import ErrorResponse
 from twext.web2 import responsecode
-from twext.web2.dav import davxml
-from txdav.xml.base import WebDAVElement
-from txdav.xml.extensions import SyncCollection
 from twext.web2.dav.http import MultiStatusResponse, statusForFailure
 from twext.web2.dav.method.prop_common import responseForHref
 from twext.web2.dav.method.propfind import propertyName
@@ -51,11 +48,11 @@
     """
     
     # These resource support the report
-    if not config.EnableSyncReport or davxml.Report(SyncCollection(),) not in self.supportedReports():
+    if not config.EnableSyncReport or element.Report(element.SyncCollection(),) not in self.supportedReports():
         log.err("sync-collection report is only allowed on calendar/inbox/addressbook/notification collection resources %s" % (self,))
         raise HTTPError(ErrorResponse(
             responsecode.FORBIDDEN,
-            davxml.SupportedReport(),
+            element.SupportedReport(),
             "Report not supported on this resource",
         ))
    
@@ -92,7 +89,7 @@
         }
         
         for property in props:
-            if isinstance(property, WebDAVElement):
+            if isinstance(property, element.WebDAVElement):
                 qname = property.qname()
             else:
                 qname = property
@@ -132,12 +129,12 @@
             lambda x, y: ok_resources.append((x, y)),
             lambda x, y: forbidden_resources.append((x, y)),
             changed,
-            (davxml.Read(),),
+            (element.Read(),),
             inherited_aces=filteredaces
         )
 
     for child, child_uri in ok_resources:
-        href = davxml.HRef.fromString(child_uri)
+        href = element.HRef.fromString(child_uri)
         try:
             yield responseForHref(
                 request,
@@ -155,7 +152,7 @@
             log.err("Missing resource during sync: %s" % (href,))
 
     for child, child_uri in forbidden_resources:
-        href = davxml.HRef.fromString(child_uri)
+        href = element.HRef.fromString(child_uri)
         try:
             yield responseForHref(
                 request,
@@ -173,17 +170,17 @@
             log.err("Missing resource during sync: %s" % (href,))
 
     for name in removed:
-        href = davxml.HRef.fromString(joinURL(request.uri, name))
-        responses.append(davxml.StatusResponse(davxml.HRef.fromString(href), davxml.Status.fromResponseCode(responsecode.NOT_FOUND)))
+        href = element.HRef.fromString(joinURL(request.uri, name))
+        responses.append(element.StatusResponse(element.HRef.fromString(href), element.Status.fromResponseCode(responsecode.NOT_FOUND)))
     
     for name in notallowed:
-        href = davxml.HRef.fromString(joinURL(request.uri, name))
-        responses.append(davxml.StatusResponse(davxml.HRef.fromString(href), davxml.Status.fromResponseCode(responsecode.NOT_ALLOWED)))
+        href = element.HRef.fromString(joinURL(request.uri, name))
+        responses.append(element.StatusResponse(element.HRef.fromString(href), element.Status.fromResponseCode(responsecode.NOT_ALLOWED)))
     
     if not hasattr(request, "extendedLogItems"):
         request.extendedLogItems = {}
     request.extendedLogItems["responses"] = len(responses)
 
-    responses.append(SyncToken.fromString(newtoken))
+    responses.append(element.SyncToken.fromString(newtoken))
 
     returnValue(MultiStatusResponse(responses))

Modified: CalendarServer/trunk/twistedcaldav/mkcolxml.py
===================================================================
--- CalendarServer/trunk/twistedcaldav/mkcolxml.py	2012-03-17 03:37:14 UTC (rev 8906)
+++ CalendarServer/trunk/twistedcaldav/mkcolxml.py	2012-03-17 07:27:16 UTC (rev 8907)
@@ -26,6 +26,7 @@
 """
 
 from twext.web2.dav import davxml
+from txdav.xml.element import registerElement
 
 ##
 # Extended MKCOL objects
@@ -35,6 +36,8 @@
     "extended-mkcol",
 )
 
+
+ at registerElement
 class MakeCollection (davxml.WebDAVElement):
     """
     Top-level element for request body in MKCOL.
@@ -46,6 +49,8 @@
 
     child_types = { "WebDAVUnknownElement": (0, None) }
 
+
+ at registerElement
 class MakeCollectionResponse (davxml.WebDAVElement):
     """
     Top-level element for response body in MKCOL.

Modified: CalendarServer/trunk/twistedcaldav/resource.py
===================================================================
--- CalendarServer/trunk/twistedcaldav/resource.py	2012-03-17 03:37:14 UTC (rev 8906)
+++ CalendarServer/trunk/twistedcaldav/resource.py	2012-03-17 07:27:16 UTC (rev 8907)
@@ -37,23 +37,23 @@
 
 from zope.interface import implements
 
-from twext.python.log import LoggingMixIn
-from twext.web2.dav.davxml import SyncCollection
-from twext.web2.dav.http import ErrorResponse
-
 from twisted.internet.defer import succeed, maybeDeferred, fail
 from twisted.internet.defer import inlineCallbacks, returnValue
 
+from twext.python.log import LoggingMixIn
+
+from txdav.xml import element
+from txdav.xml.element import dav_namespace
+
 from twext.web2 import responsecode, http, http_headers
-from twext.web2.dav import davxml
 from twext.web2.dav.auth import AuthenticationWrapper as SuperAuthenticationWrapper
-from twext.web2.dav.davxml import dav_namespace
 from twext.web2.dav.idav import IDAVPrincipalCollectionResource
 from twext.web2.dav.resource import AccessDeniedError, DAVPrincipalCollectionResource,\
     davPrivilegeSet
 from twext.web2.dav.resource import TwistedACLInheritable
 from twext.web2.dav.util import joinURL, parentForURL, normalizeURL
 from twext.web2.http import HTTPError, RedirectResponse, StatusResponse, Response
+from twext.web2.dav.http import ErrorResponse
 from twext.web2.http_headers import MimeType, ETag
 from twext.web2.stream import MemoryStream
 
@@ -146,37 +146,37 @@
 
     top_supported_privileges = []
 
-    for supported_privilege in davPrivilegeSet.childrenOfType(davxml.SupportedPrivilege):
-        all_privilege = supported_privilege.childOfType(davxml.Privilege)
-        if isinstance(all_privilege.children[0], davxml.All):
-            all_description = supported_privilege.childOfType(davxml.Description)
+    for supported_privilege in davPrivilegeSet.childrenOfType(element.SupportedPrivilege):
+        all_privilege = supported_privilege.childOfType(element.Privilege)
+        if isinstance(all_privilege.children[0], element.All):
+            all_description = supported_privilege.childOfType(element.Description)
             all_supported_privileges = []
-            for all_supported_privilege in supported_privilege.childrenOfType(davxml.SupportedPrivilege):
-                read_privilege = all_supported_privilege.childOfType(davxml.Privilege)
-                if isinstance(read_privilege.children[0], davxml.Read):
-                    read_description = all_supported_privilege.childOfType(davxml.Description)
-                    read_supported_privileges = list(all_supported_privilege.childrenOfType(davxml.SupportedPrivilege))
+            for all_supported_privilege in supported_privilege.childrenOfType(element.SupportedPrivilege):
+                read_privilege = all_supported_privilege.childOfType(element.Privilege)
+                if isinstance(read_privilege.children[0], element.Read):
+                    read_description = all_supported_privilege.childOfType(element.Description)
+                    read_supported_privileges = list(all_supported_privilege.childrenOfType(element.SupportedPrivilege))
                     read_supported_privileges.append(
-                        davxml.SupportedPrivilege(
-                            davxml.Privilege(caldavxml.ReadFreeBusy()),
-                            davxml.Description("allow free busy report query", **{"xml:lang": "en"}),
+                        element.SupportedPrivilege(
+                            element.Privilege(caldavxml.ReadFreeBusy()),
+                            element.Description("allow free busy report query", **{"xml:lang": "en"}),
                         )
                     )
                     all_supported_privileges.append(
-                        davxml.SupportedPrivilege(read_privilege, read_description, *read_supported_privileges)
+                        element.SupportedPrivilege(read_privilege, read_description, *read_supported_privileges)
                     )
                     edited = True
                 else:
                     all_supported_privileges.append(all_supported_privilege)
             top_supported_privileges.append(
-                davxml.SupportedPrivilege(all_privilege, all_description, *all_supported_privileges)
+                element.SupportedPrivilege(all_privilege, all_description, *all_supported_privileges)
             )
         else:
             top_supported_privileges.append(supported_privilege)
 
     assert edited, "Structure of davPrivilegeSet changed in a way that I don't know how to extend for calendarPrivilegeSet"
 
-    return davxml.SupportedPrivilegeSet(*top_supported_privileges)
+    return element.SupportedPrivilegeSet(*top_supported_privileges)
 
 calendarPrivilegeSet = _calendarPrivilegeSet()
 
@@ -381,7 +381,7 @@
 
     def liveProperties(self):
         baseProperties = (
-            davxml.Owner.qname(),               # Private Events needs this but it is also OK to return empty
+            element.Owner.qname(),               # Private Events needs this but it is also OK to return empty
         )
         
         if self.isPseudoCalendarCollection():
@@ -405,7 +405,7 @@
 
         if self.isCalendarCollection():
             baseProperties += (
-                davxml.ResourceID.qname(),
+                element.ResourceID.qname(),
                 
                 # These are "live" properties in the sense of WebDAV, however "live" for twext actually means
                 # ones that are also always present, but the default alarm properties are allowed to be absent
@@ -420,7 +420,7 @@
 
         if self.isAddressBookCollection():
             baseProperties += (
-                davxml.ResourceID.qname(),
+                element.ResourceID.qname(),
                 carddavxml.SupportedAddressData.qname(),
                 customxml.GETCTag.qname(),
                 customxml.PubSubXMPPPushKeyProperty.qname(),
@@ -435,11 +435,11 @@
                 caldavxml.ScheduleTag.qname(),
             )
             
-        if config.EnableSyncReport and (davxml.Report(SyncCollection(),) in self.supportedReports()):
-            baseProperties += (davxml.SyncToken.qname(),)
+        if config.EnableSyncReport and (element.Report(element.SyncCollection(),) in self.supportedReports()):
+            baseProperties += (element.SyncToken.qname(),)
             
         if config.EnableAddMember and (self.isCalendarCollection() or self.isAddressBookCollection()):
-            baseProperties += (davxml.AddMember.qname(),)
+            baseProperties += (element.AddMember.qname(),)
             
         if config.Sharing.Enabled:
             if config.Sharing.Calendars.Enabled and self.isCalendarCollection():
@@ -474,7 +474,7 @@
         """
         if qname in self.liveProperties():
             if qname in (
-                davxml.DisplayName.qname(),
+                element.DisplayName.qname(),
                 customxml.Invite.qname(),
             ):
                 return False
@@ -598,31 +598,31 @@
     @inlineCallbacks
     def _readGlobalProperty(self, qname, property, request):
 
-        if qname == davxml.Owner.qname():
+        if qname == element.Owner.qname():
             owner = (yield self.owner(request))
-            returnValue(davxml.Owner(owner))
+            returnValue(element.Owner(owner))
 
-        elif qname == davxml.ResourceType.qname():
+        elif qname == element.ResourceType.qname():
             returnValue(self.resourceType())
 
-        elif qname == davxml.ResourceID.qname():
-            returnValue(davxml.ResourceID(davxml.HRef.fromString(self.resourceID())))
+        elif qname == element.ResourceID.qname():
+            returnValue(element.ResourceID(element.HRef.fromString(self.resourceID())))
 
         elif qname == customxml.GETCTag.qname() and (
             self.isPseudoCalendarCollection() or self.isAddressBookCollection()
         ):
             returnValue(customxml.GETCTag.fromString((yield self.getInternalSyncToken())))
 
-        elif qname == davxml.SyncToken.qname() and config.EnableSyncReport and (
-            davxml.Report(SyncCollection(),) in self.supportedReports()
+        elif qname == element.SyncToken.qname() and config.EnableSyncReport and (
+            element.Report(element.SyncCollection(),) in self.supportedReports()
         ):
-            returnValue(davxml.SyncToken.fromString((yield self.getSyncToken())))
+            returnValue(element.SyncToken.fromString((yield self.getSyncToken())))
 
-        elif qname == davxml.AddMember.qname() and config.EnableAddMember and (
+        elif qname == element.AddMember.qname() and config.EnableAddMember and (
             self.isCalendarCollection() or self.isAddressBookCollection()
         ):
             url = (yield self.canonicalURL(request))
-            returnValue(davxml.AddMember(davxml.HRef.fromString(url + "/;add-member")))
+            returnValue(element.AddMember(element.HRef.fromString(url + "/;add-member")))
 
         elif qname == caldavxml.SupportedCalendarComponentSet.qname() and self.isPseudoCalendarCollection():
             returnValue(self.getSupportedComponentSet())
@@ -707,7 +707,7 @@
             isvirt = self.isVirtualShare()
             
             if isvirt:
-                returnValue(customxml.SharedURL(davxml.HRef.fromString(self._share.hosturl)))
+                returnValue(customxml.SharedURL(element.HRef.fromString(self._share.hosturl)))
             else:
                 returnValue(None)
 
@@ -716,7 +716,7 @@
 
     @inlineCallbacks
     def writeProperty(self, property, request):
-        assert isinstance(property, davxml.WebDAVElement), (
+        assert isinstance(property, element.WebDAVElement), (
             "%r is not a WebDAVElement instance" % (property,)
         )
         
@@ -805,7 +805,7 @@
 
         yield self._preProcessWriteProperty(property, request)
 
-        if property.qname() == davxml.ResourceType.qname():
+        if property.qname() == element.ResourceType.qname():
             if self.isCalendarCollection() or self.isAddressBookCollection():
                 sawShare = [child for child in property.children if child.qname() == (calendarserver_namespace, "shared-owner")]
                 if sawShare:
@@ -823,7 +823,7 @@
                 # Check if adding or removing share
                 shared = (yield self.isShared(request))
                 for child in property.children:
-                    if child.qname() == davxml.Collection.qname():
+                    if child.qname() == element.Collection.qname():
                         break
                 else:
                     raise HTTPError(StatusResponse(
@@ -893,37 +893,37 @@
                 if self.accessMode == Component.ACCESS_PRIVATE:
                     newacls.extend(config.AdminACEs)
                     newacls.extend(config.ReadACEs)
-                    newacls.append(davxml.ACE(
-                        davxml.Invert(
-                            davxml.Principal(owner),
+                    newacls.append(element.ACE(
+                        element.Invert(
+                            element.Principal(owner),
                         ),
-                        davxml.Deny(
-                            davxml.Privilege(
-                                davxml.Read(),
+                        element.Deny(
+                            element.Privilege(
+                                element.Read(),
                             ),
-                            davxml.Privilege(
-                                davxml.Write(),
+                            element.Privilege(
+                                element.Write(),
                             ),
                         ),
-                        davxml.Protected(),
+                        element.Protected(),
                     ))
                 else:
                     newacls.extend(config.AdminACEs)
                     newacls.extend(config.ReadACEs)
-                    newacls.append(davxml.ACE(
-                        davxml.Invert(
-                            davxml.Principal(owner),
+                    newacls.append(element.ACE(
+                        element.Invert(
+                            element.Principal(owner),
                         ),
-                        davxml.Deny(
-                            davxml.Privilege(
-                                davxml.Write(),
+                        element.Deny(
+                            element.Privilege(
+                                element.Write(),
                             ),
                         ),
-                        davxml.Protected(),
+                        element.Protected(),
                     ))
                 newacls.extend(acls.children)
 
-                acls = davxml.ACL(*newacls)
+                acls = element.ACL(*newacls)
  
         returnValue(acls)
 
@@ -992,7 +992,7 @@
         current = self.currentPrincipal(request)
         if current in config.AllAdminPrincipalObjects:
             returnValue(True)
-        if davxml.Principal((yield self.owner(request))) == current:
+        if element.Principal((yield self.owner(request))) == current:
             returnValue(True)
         returnValue(False)
 
@@ -1002,7 +1002,7 @@
     ##
 
     def displayName(self):
-        if self.isAddressBookCollection() and not self.hasDeadProperty((davxml.dav_namespace, "displayname")):
+        if self.isAddressBookCollection() and not self.hasDeadProperty((dav_namespace, "displayname")):
             return None
         
         if 'record' in dir(self):
@@ -1022,10 +1022,10 @@
         return None
 
     def resourceID(self):
-        if not self.hasDeadProperty(davxml.ResourceID.qname()):
+        if not self.hasDeadProperty(element.ResourceID.qname()):
             uuidval = uuid.uuid4()
-            self.writeDeadProperty(davxml.ResourceID(davxml.HRef.fromString(uuidval.urn)))
-        return str(self.readDeadProperty(davxml.ResourceID.qname()).children[0])
+            self.writeDeadProperty(element.ResourceID(element.HRef.fromString(uuidval.urn)))
+        return str(self.readDeadProperty(element.ResourceID.qname()).children[0])
 
     ##
     # CalDAV
@@ -1140,7 +1140,7 @@
             
             # Adjust the default calendar setting if necessary
             if defaultCalendarType is not None:
-                yield inbox.writeProperty(defaultCalendarType(davxml.HRef(destination_path)), request)               
+                yield inbox.writeProperty(defaultCalendarType(element.HRef(destination_path)), request)               
 
     def isCalendarOpaque(self):
         
@@ -1219,7 +1219,7 @@
             principal = (yield self.resourceOwnerPrincipal(request))
             home = (yield principal.addressBookHome(request))
             (_ignore_scheme, _ignore_host, destination_path, _ignore_query, _ignore_fragment) = urlsplit(normalizeURL(destination_uri))
-            yield home.writeProperty(carddavxml.DefaultAddressBookURL(davxml.HRef(destination_path)), request)               
+            yield home.writeProperty(carddavxml.DefaultAddressBookURL(element.HRef(destination_path)), request)               
 
     @inlineCallbacks
     def isDefaultAddressBook(self, request):
@@ -1265,21 +1265,21 @@
 
     def supportedReports(self):
         result = super(CalDAVResource, self).supportedReports()
-        result.append(davxml.Report(caldavxml.CalendarQuery(),))
-        result.append(davxml.Report(caldavxml.CalendarMultiGet(),))
+        result.append(element.Report(caldavxml.CalendarQuery(),))
+        result.append(element.Report(caldavxml.CalendarMultiGet(),))
         if self.isCollection():
             # Only allowed on collections
-            result.append(davxml.Report(caldavxml.FreeBusyQuery(),))
+            result.append(element.Report(caldavxml.FreeBusyQuery(),))
         if config.EnableCardDAV:
-            result.append(davxml.Report(carddavxml.AddressBookQuery(),))
-            result.append(davxml.Report(carddavxml.AddressBookMultiGet(),))
+            result.append(element.Report(carddavxml.AddressBookQuery(),))
+            result.append(element.Report(carddavxml.AddressBookMultiGet(),))
         if (
             self.isPseudoCalendarCollection() or
             self.isAddressBookCollection() or
             self.isNotificationCollection()
         ) and config.EnableSyncReport:
             # Only allowed on calendar/inbox/addressbook/notification collections
-            result.append(davxml.Report(SyncCollection(),))
+            result.append(element.Report(element.SyncCollection(),))
         return result
 
     def writeNewACEs(self, newaces):
@@ -1300,7 +1300,7 @@
                 if TwistedACLInheritable() not in ace.children:
                     children = list(ace.children)
                     children.append(TwistedACLInheritable())
-                    edited_aces.append(davxml.ACE(*children))
+                    edited_aces.append(element.ACE(*children))
                 else:
                     edited_aces.append(ace)
         else:
@@ -1817,26 +1817,26 @@
         principal-search-property-set report.
         """
         result = super(CalendarPrincipalCollectionResource, self).supportedReports()
-        result.append(davxml.Report(davxml.PrincipalSearchPropertySet(),))
+        result.append(element.Report(element.PrincipalSearchPropertySet(),))
         return result
 
     def principalSearchPropertySet(self):
-        return davxml.PrincipalSearchPropertySet(
-            davxml.PrincipalSearchProperty(
-                davxml.PropertyContainer(
-                    davxml.DisplayName()
+        return element.PrincipalSearchPropertySet(
+            element.PrincipalSearchProperty(
+                element.PropertyContainer(
+                    element.DisplayName()
                 ),
-                davxml.Description(
-                    davxml.PCDATAElement("Display Name"),
+                element.Description(
+                    element.PCDATAElement("Display Name"),
                     **{"xml:lang":"en"}
                 ),
             ),
-            davxml.PrincipalSearchProperty(
-                davxml.PropertyContainer(
+            element.PrincipalSearchProperty(
+                element.PropertyContainer(
                     caldavxml.CalendarUserAddressSet()
                 ),
-                davxml.Description(
-                    davxml.PCDATAElement("Calendar User Addresses"),
+                element.Description(
+                    element.PCDATAElement("Calendar User Addresses"),
                     **{"xml:lang":"en"}
                 ),
             ),
@@ -1904,12 +1904,12 @@
         if namespace == caldav_namespace and self.calendarsEnabled():
             if name == "calendar-home-set":
                 returnValue(caldavxml.CalendarHomeSet(
-                    *[davxml.HRef(url) for url in self.calendarHomeURLs()]
+                    *[element.HRef(url) for url in self.calendarHomeURLs()]
                 ))
 
             elif name == "calendar-user-address-set":
                 returnValue(caldavxml.CalendarUserAddressSet(
-                    *[davxml.HRef(uri) for uri in self.calendarUserAddresses()]
+                    *[element.HRef(uri) for uri in self.calendarUserAddresses()]
                 ))
 
             elif name == "schedule-inbox-URL":
@@ -1917,14 +1917,14 @@
                 if url is None:
                     returnValue(None)
                 else:
-                    returnValue(caldavxml.ScheduleInboxURL(davxml.HRef(url)))
+                    returnValue(caldavxml.ScheduleInboxURL(element.HRef(url)))
 
             elif name == "schedule-outbox-URL":
                 url = self.scheduleOutboxURL()
                 if url is None:
                     returnValue(None)
                 else:
-                    returnValue(caldavxml.ScheduleOutboxURL(davxml.HRef(url)))
+                    returnValue(caldavxml.ScheduleOutboxURL(element.HRef(url)))
 
             elif name == "calendar-user-type":
                 returnValue(caldavxml.CalendarUserType(self.record.getCUType()))
@@ -1935,25 +1935,25 @@
                 if url is None:
                     returnValue(None)
                 else:
-                    returnValue(customxml.DropBoxHomeURL(davxml.HRef(url)))
+                    returnValue(customxml.DropBoxHomeURL(element.HRef(url)))
 
             elif name == "notification-URL" and config.Sharing.Enabled:
                 url = yield self.notificationURL()
                 if url is None:
                     returnValue(None)
                 else:
-                    returnValue(customxml.NotificationURL(davxml.HRef(url)))
+                    returnValue(customxml.NotificationURL(element.HRef(url)))
 
             elif name == "calendar-proxy-read-for" and self.calendarsEnabled():
                 results = (yield self.proxyFor(False))
                 returnValue(customxml.CalendarProxyReadFor(
-                    *[davxml.HRef(principal.principalURL()) for principal in results]
+                    *[element.HRef(principal.principalURL()) for principal in results]
                 ))
 
             elif name == "calendar-proxy-write-for" and self.calendarsEnabled():
                 results = (yield self.proxyFor(True))
                 returnValue(customxml.CalendarProxyWriteFor(
-                    *[davxml.HRef(principal.principalURL()) for principal in results]
+                    *[element.HRef(principal.principalURL()) for principal in results]
                 ))
 
             elif name == "auto-schedule" and self.calendarsEnabled():
@@ -1967,11 +1967,11 @@
         elif namespace == carddav_namespace and self.addressBooksEnabled():
             if name == "addressbook-home-set":
                 returnValue(carddavxml.AddressBookHomeSet(
-                    *[davxml.HRef(url) for url in self.addressBookHomeURLs()]
+                    *[element.HRef(url) for url in self.addressBookHomeURLs()]
                  ))
             elif name == "directory-gateway" and self.directoryAddressBookEnabled():
                 returnValue(carddavxml.DirectoryGateway(
-                    davxml.HRef.fromString(joinURL("/", config.DirectoryAddressBook.name, "/"))
+                    element.HRef.fromString(joinURL("/", config.DirectoryAddressBook.name, "/"))
                 ))
 
         result = (yield super(CalendarPrincipalResource, self).readProperty(property, request))
@@ -2180,7 +2180,7 @@
         result = super(CommonHomeResource, self).supportedReports()
         if config.EnableSyncReport and config.EnableSyncReportHome:
             # Allowed on any home
-            result.append(davxml.Report(SyncCollection(),))
+            result.append(element.Report(element.SyncCollection(),))
         return result
 
     def _mergeSyncTokens(self, hometoken, notificationtoken):
@@ -2313,7 +2313,7 @@
                             children.append(
                                 customxml.PubSubTransportProperty(
                                     customxml.PubSubSubscriptionProperty(
-                                        davxml.HRef(
+                                        element.HRef(
                                             apsConfiguration["SubscriptionURL"]
                                         ),
                                     ),
@@ -2405,7 +2405,7 @@
     ##
 
     def owner(self, request):
-        return succeed(davxml.HRef(self.principalForRecord().principalURL()))
+        return succeed(element.HRef(self.principalForRecord().principalURL()))
 
     def ownerPrincipal(self, request):
         return succeed(self.principalForRecord())
@@ -2419,18 +2419,18 @@
         # Server may be read only
         if config.EnableReadOnlyServer:
             owner_privs = (
-                davxml.Privilege(davxml.Read()),
-                davxml.Privilege(davxml.ReadCurrentUserPrivilegeSet()),
+                element.Privilege(element.Read()),
+                element.Privilege(element.ReadCurrentUserPrivilegeSet()),
             )
         else:
-            owner_privs = (davxml.Privilege(davxml.All()),)
+            owner_privs = (element.Privilege(element.All()),)
 
         aces = (
             # Inheritable access for the resource's associated principal.
-            davxml.ACE(
-                davxml.Principal(davxml.HRef(myPrincipal.principalURL())),
-                davxml.Grant(*owner_privs),
-                davxml.Protected(),
+            element.ACE(
+                element.Principal(element.HRef(myPrincipal.principalURL())),
+                element.Grant(*owner_privs),
+                element.Protected(),
                 TwistedACLInheritable(),
             ),
         )
@@ -2441,7 +2441,7 @@
         # Give all access to config.AdminPrincipals
         aces += config.AdminACEs
         
-        return davxml.ACL(*aces)
+        return element.ACL(*aces)
 
     def accessControlList(self, request, inheritance=True, expanding=False, inherited_aces=None):
         # Permissions here are fixed, and are not subject to inheritance rules, etc.
@@ -2622,24 +2622,24 @@
         # Server may be read only
         if config.EnableReadOnlyServer:
             owner_privs = (
-                davxml.Privilege(davxml.Read()),
-                davxml.Privilege(davxml.ReadCurrentUserPrivilegeSet()),
+                element.Privilege(element.Read()),
+                element.Privilege(element.ReadCurrentUserPrivilegeSet()),
             )
         else:
-            owner_privs = (davxml.Privilege(davxml.All()),)
+            owner_privs = (element.Privilege(element.All()),)
 
         aces = (
             # Inheritable access for the resource's associated principal.
-            davxml.ACE(
-                davxml.Principal(davxml.HRef(myPrincipal.principalURL())),
-                davxml.Grant(*owner_privs),
-                davxml.Protected(),
+            element.ACE(
+                element.Principal(element.HRef(myPrincipal.principalURL())),
+                element.Grant(*owner_privs),
+                element.Protected(),
                 TwistedACLInheritable(),
             ),
             # Inheritable CALDAV:read-free-busy access for authenticated users.
-            davxml.ACE(
-                davxml.Principal(davxml.Authenticated()),
-                davxml.Grant(davxml.Privilege(caldavxml.ReadFreeBusy())),
+            element.ACE(
+                element.Principal(element.Authenticated()),
+                element.Grant(element.Privilege(caldavxml.ReadFreeBusy())),
                 TwistedACLInheritable(),
             ),
         )
@@ -2654,37 +2654,37 @@
             # Server may be read only
             if config.EnableReadOnlyServer:
                 rw_proxy_privs = (
-                    davxml.Privilege(davxml.Read()),
-                    davxml.Privilege(davxml.ReadCurrentUserPrivilegeSet()),
+                    element.Privilege(element.Read()),
+                    element.Privilege(element.ReadCurrentUserPrivilegeSet()),
                 )
             else:
                 rw_proxy_privs = (
-                    davxml.Privilege(davxml.Read()),
-                    davxml.Privilege(davxml.ReadCurrentUserPrivilegeSet()),
-                    davxml.Privilege(davxml.Write()),
+                    element.Privilege(element.Read()),
+                    element.Privilege(element.ReadCurrentUserPrivilegeSet()),
+                    element.Privilege(element.Write()),
                 )
 
             aces += (
                 # DAV:read/DAV:read-current-user-privilege-set access for this principal's calendar-proxy-read users.
-                davxml.ACE(
-                    davxml.Principal(davxml.HRef(joinURL(myPrincipal.principalURL(), "calendar-proxy-read/"))),
-                    davxml.Grant(
-                        davxml.Privilege(davxml.Read()),
-                        davxml.Privilege(davxml.ReadCurrentUserPrivilegeSet()),
+                element.ACE(
+                    element.Principal(element.HRef(joinURL(myPrincipal.principalURL(), "calendar-proxy-read/"))),
+                    element.Grant(
+                        element.Privilege(element.Read()),
+                        element.Privilege(element.ReadCurrentUserPrivilegeSet()),
                     ),
-                    davxml.Protected(),
+                    element.Protected(),
                     TwistedACLInheritable(),
                 ),
                 # DAV:read/DAV:read-current-user-privilege-set/DAV:write access for this principal's calendar-proxy-write users.
-                davxml.ACE(
-                    davxml.Principal(davxml.HRef(joinURL(myPrincipal.principalURL(), "calendar-proxy-write/"))),
-                    davxml.Grant(*rw_proxy_privs),
-                    davxml.Protected(),
+                element.ACE(
+                    element.Principal(element.HRef(joinURL(myPrincipal.principalURL(), "calendar-proxy-write/"))),
+                    element.Grant(*rw_proxy_privs),
+                    element.Protected(),
                     TwistedACLInheritable(),
                 ),
             )
 
-        return davxml.ACL(*aces)
+        return element.ACL(*aces)
 
 
     @inlineCallbacks
@@ -2785,11 +2785,11 @@
 
     @inlineCallbacks
     def writeProperty(self, property, request):
-        assert isinstance(property, davxml.WebDAVElement)
+        assert isinstance(property, element.WebDAVElement)
 
         if property.qname() == carddavxml.DefaultAddressBookURL.qname():
             # Verify that the address book added in the PROPPATCH is valid.
-            property.children = [davxml.HRef(normalizeURL(str(href))) for href in property.children]
+            property.children = [element.HRef(normalizeURL(str(href))) for href in property.children]
             new_adbk = [str(href) for href in property.children]
             adbk = None
             if len(new_adbk) == 1:
@@ -2807,7 +2807,7 @@
                 adbkURI = (yield adbk.canonicalURL(request))
                 if not adbkURI.endswith("/"):
                     adbkURI += "/"
-                property = carddavxml.DefaultAddressBookURL(davxml.HRef(adbkURI))
+                property = carddavxml.DefaultAddressBookURL(element.HRef(adbkURI))
 
         yield super(AddressBookHomeResource, self).writeProperty(property, request)
 
@@ -2875,11 +2875,11 @@
 
         self.writeDeadProperty(
             carddavxml.DefaultAddressBookURL(
-                davxml.HRef(defaultAddressBookURL)
+                element.HRef(defaultAddressBookURL)
             )
         )
         returnValue(carddavxml.DefaultAddressBookURL(
-            davxml.HRef(defaultAddressBookURL))
+            element.HRef(defaultAddressBookURL))
         )
 
     @inlineCallbacks
@@ -2929,35 +2929,35 @@
     """
 
     def resourceType(self):
-        return davxml.ResourceType.sharedaddressbook #@UndefinedVariable
+        return element.ResourceType.sharedaddressbook #@UndefinedVariable
 
     def defaultAccessControlList(self):
 
         aces = (
-            davxml.ACE(
-                davxml.Principal(davxml.Authenticated()),
-                davxml.Grant(
-                    davxml.Privilege(davxml.Read()),
-                    davxml.Privilege(davxml.ReadCurrentUserPrivilegeSet()),
-                    davxml.Privilege(davxml.Write()),
+            element.ACE(
+                element.Principal(element.Authenticated()),
+                element.Grant(
+                    element.Privilege(element.Read()),
+                    element.Privilege(element.ReadCurrentUserPrivilegeSet()),
+                    element.Privilege(element.Write()),
                 ),
-                davxml.Protected(),
+                element.Protected(),
                 TwistedACLInheritable(),
            ),
         )
         
         if config.GlobalAddressBook.EnableAnonymousReadAccess:
             aces += (
-                davxml.ACE(
-                    davxml.Principal(davxml.Unauthenticated()),
-                    davxml.Grant(
-                        davxml.Privilege(davxml.Read()),
+                element.ACE(
+                    element.Principal(element.Unauthenticated()),
+                    element.Grant(
+                        element.Privilege(element.Read()),
                     ),
-                    davxml.Protected(),
+                    element.Protected(),
                     TwistedACLInheritable(),
                ),
             )
-        return davxml.ACL(*aces)
+        return element.ACL(*aces)
 
     def accessControlList(self, request, inheritance=True, expanding=False, inherited_aces=None):
         # Permissions here are fixed, and are not subject to inheritance rules, etc.

Modified: CalendarServer/trunk/twistedcaldav/sharing.py
===================================================================
--- CalendarServer/trunk/twistedcaldav/sharing.py	2012-03-17 03:37:14 UTC (rev 8906)
+++ CalendarServer/trunk/twistedcaldav/sharing.py	2012-03-17 07:27:16 UTC (rev 8907)
@@ -26,11 +26,11 @@
 
 from twext.python.log import LoggingMixIn
 from twext.web2 import responsecode
-from twext.web2.dav import davxml
+from twext.web2.http import HTTPError, Response, XMLResponse
 from twext.web2.dav.http import ErrorResponse, MultiStatusResponse
 from twext.web2.dav.resource import TwistedACLInheritable
 from twext.web2.dav.util import allDataFromStream, joinURL
-from twext.web2.http import HTTPError, Response, XMLResponse
+from txdav.xml import element
 
 from twisted.internet.defer import succeed, inlineCallbacks, DeferredList,\
     returnValue
@@ -77,7 +77,7 @@
         
         # Change resourcetype
         rtype = self.resourceType()
-        rtype = davxml.ResourceType(*(rtype.children + (customxml.SharedOwner(),)))
+        rtype = element.ResourceType(*(rtype.children + (customxml.SharedOwner(),)))
         self.writeDeadProperty(rtype)
         
         # Create invites database
@@ -89,7 +89,7 @@
         # Change resource type (note this might be called after deleting a resource
         # so we have to cope with that)
         rtype = self.resourceType()
-        rtype = davxml.ResourceType(*([child for child in rtype.children if child != customxml.SharedOwner()]))
+        rtype = element.ResourceType(*([child for child in rtype.children if child != customxml.SharedOwner()]))
         self.writeDeadProperty(rtype)
         
         # Remove all invitees
@@ -141,11 +141,11 @@
         """
         
         # Need to have at least DAV:read to do this
-        yield self.authorize(request, (davxml.Read(),))
+        yield self.authorize(request, (element.Read(),))
         
         # Find current principal
         authz_principal = self.currentPrincipal(request).children[0]
-        if not isinstance(authz_principal, davxml.HRef):
+        if not isinstance(authz_principal, element.HRef):
             raise HTTPError(ErrorResponse(
                 responsecode.FORBIDDEN,
                 (calendarserver_namespace, "valid-principal"),
@@ -236,13 +236,13 @@
         try:
             superMethod = superObject.resourceType
         except AttributeError:
-            rtype = davxml.ResourceType()
+            rtype = element.ResourceType()
         else:
             rtype = superMethod()
 
         isVirt = self.isVirtualShare()
         if isVirt:
-            rtype = davxml.ResourceType(
+            rtype = element.ResourceType(
                 *(
                     tuple([child for child in rtype.children if child.qname() != customxml.SharedOwner.qname()]) +
                     (customxml.Shared(),)
@@ -299,28 +299,28 @@
                 self._share.shareuid
             )
             if invite is None:
-                returnValue(davxml.ACL())
+                returnValue(element.ACL())
             inviteAccess = invite.access
             
         userprivs = [
         ]
         if inviteAccess in ("read-only", "read-write", "read-write-schedule",):
-            userprivs.append(davxml.Privilege(davxml.Read()))
-            userprivs.append(davxml.Privilege(davxml.ReadACL()))
-            userprivs.append(davxml.Privilege(davxml.ReadCurrentUserPrivilegeSet()))
+            userprivs.append(element.Privilege(element.Read()))
+            userprivs.append(element.Privilege(element.ReadACL()))
+            userprivs.append(element.Privilege(element.ReadCurrentUserPrivilegeSet()))
         if inviteAccess in ("read-only",):
-            userprivs.append(davxml.Privilege(davxml.WriteProperties()))
+            userprivs.append(element.Privilege(element.WriteProperties()))
         if inviteAccess in ("read-write", "read-write-schedule",):
-            userprivs.append(davxml.Privilege(davxml.Write()))
+            userprivs.append(element.Privilege(element.Write()))
         proxyprivs = list(userprivs)
-        proxyprivs.remove(davxml.Privilege(davxml.ReadACL()))
+        proxyprivs.remove(element.Privilege(element.ReadACL()))
 
         aces = (
             # Inheritable specific access for the resource's associated principal.
-            davxml.ACE(
-                davxml.Principal(davxml.HRef(self._shareePrincipal.principalURL())),
-                davxml.Grant(*userprivs),
-                davxml.Protected(),
+            element.ACE(
+                element.Principal(element.HRef(self._shareePrincipal.principalURL())),
+                element.Grant(*userprivs),
+                element.Protected(),
                 TwistedACLInheritable(),
             ),
         )
@@ -328,9 +328,9 @@
         if self.isCalendarCollection():
             aces += (
                 # Inheritable CALDAV:read-free-busy access for authenticated users.
-                davxml.ACE(
-                    davxml.Principal(davxml.Authenticated()),
-                    davxml.Grant(davxml.Privilege(caldavxml.ReadFreeBusy())),
+                element.ACE(
+                    element.Principal(element.Authenticated()),
+                    element.Grant(element.Privilege(caldavxml.ReadFreeBusy())),
                     TwistedACLInheritable(),
                 ),
             )
@@ -344,25 +344,25 @@
         if config.EnableProxyPrincipals:
             aces += (
                 # DAV:read/DAV:read-current-user-privilege-set access for this principal's calendar-proxy-read users.
-                davxml.ACE(
-                    davxml.Principal(davxml.HRef(joinURL(self._shareePrincipal.principalURL(), "calendar-proxy-read/"))),
-                    davxml.Grant(
-                        davxml.Privilege(davxml.Read()),
-                        davxml.Privilege(davxml.ReadCurrentUserPrivilegeSet()),
+                element.ACE(
+                    element.Principal(element.HRef(joinURL(self._shareePrincipal.principalURL(), "calendar-proxy-read/"))),
+                    element.Grant(
+                        element.Privilege(element.Read()),
+                        element.Privilege(element.ReadCurrentUserPrivilegeSet()),
                     ),
-                    davxml.Protected(),
+                    element.Protected(),
                     TwistedACLInheritable(),
                 ),
                 # DAV:read/DAV:read-current-user-privilege-set/DAV:write access for this principal's calendar-proxy-write users.
-                davxml.ACE(
-                    davxml.Principal(davxml.HRef(joinURL(self._shareePrincipal.principalURL(), "calendar-proxy-write/"))),
-                    davxml.Grant(*proxyprivs),
-                    davxml.Protected(),
+                element.ACE(
+                    element.Principal(element.HRef(joinURL(self._shareePrincipal.principalURL(), "calendar-proxy-write/"))),
+                    element.Grant(*proxyprivs),
+                    element.Protected(),
                     TwistedACLInheritable(),
                 ),
             )
 
-        returnValue(davxml.ACL(*aces))
+        returnValue(element.ACL(*aces))
 
     def validUserIDForShare(self, userid):
         """
@@ -633,14 +633,14 @@
             customxml.DTStamp.fromString(PyCalendarDateTime.getNowUTC().getText()),
             customxml.InviteNotification(
                 customxml.UID.fromString(record.inviteuid),
-                davxml.HRef.fromString(record.userid),
+                element.HRef.fromString(record.userid),
                 inviteStatusMapToXML[record.state](),
                 customxml.InviteAccess(inviteAccessMapToXML[record.access]()),
                 customxml.HostURL(
-                    davxml.HRef.fromString(hosturl),
+                    element.HRef.fromString(hosturl),
                 ),
                 customxml.Organizer(
-                    davxml.HRef.fromString(owner),
+                    element.HRef.fromString(owner),
                     customxml.CommonName.fromString(ownerCN),
                 ),
                 customxml.InviteSummary.fromString(record.summary),
@@ -666,7 +666,7 @@
 
     @inlineCallbacks
     def _xmlHandleInvite(self, request, docroot):
-        yield self.authorize(request, (davxml.Read(), davxml.Write()))
+        yield self.authorize(request, (element.Read(), element.Write()))
         result = (yield self._handleInvite(request, docroot))
         returnValue(result)
     
@@ -677,7 +677,7 @@
             access = None
             summary = None
             for item in inviteset.children:
-                if isinstance(item, davxml.HRef):
+                if isinstance(item, element.HRef):
                     userid = str(item)
                     continue
                 if isinstance(item, customxml.CommonName):
@@ -709,7 +709,7 @@
             userid = None
             access = []
             for item in inviteremove.children:
-                if isinstance(item, davxml.HRef):
+                if isinstance(item, element.HRef):
                     userid = str(item)
                     continue
                 if isinstance(item, customxml.ReadAccess) or isinstance(item, customxml.ReadWriteAccess):
@@ -785,11 +785,11 @@
             if badusers:
                 xml_responses = []
                 xml_responses.extend([
-                    davxml.StatusResponse(davxml.HRef(userid), davxml.Status.fromResponseCode(ok_code))
+                    element.StatusResponse(element.HRef(userid), element.Status.fromResponseCode(ok_code))
                     for userid in sorted(okusers)
                 ])
                 xml_responses.extend([
-                    davxml.StatusResponse(davxml.HRef(userid), davxml.Status.fromResponseCode(responsecode.FORBIDDEN))
+                    element.StatusResponse(element.HRef(userid), element.Status.fromResponseCode(responsecode.FORBIDDEN))
                     for userid in sorted(badusers)
                 ])
             
@@ -804,7 +804,7 @@
 
     @inlineCallbacks
     def _xmlHandleInviteReply(self, request, docroot):
-        yield self.authorize(request, (davxml.Read(), davxml.Write()))
+        yield self.authorize(request, (element.Read(), element.Write()))
         result = (yield self._handleInviteReply(request, docroot))
         returnValue(result)
     
@@ -817,7 +817,7 @@
         # Need to read the data and get the root element first
         xmldata = (yield allDataFromStream(request.stream))
         try:
-            doc = davxml.WebDAVDocument.fromString(xmldata)
+            doc = element.WebDAVDocument.fromString(xmldata)
         except ValueError, e:
             self.log_error("Error parsing doc (%s) Doc:\n %s" % (str(e), xmldata,))
             raise HTTPError(ErrorResponse(
@@ -889,7 +889,7 @@
         
         return customxml.InviteUser(
             customxml.UID.fromString(self.inviteuid),
-            davxml.HRef.fromString(self.userid),
+            element.HRef.fromString(self.userid),
             customxml.CommonName.fromString(self.name),
             customxml.InviteAccess(inviteAccessMapToXML[self.access]()),
             inviteStatusMapToXML[self.state](),
@@ -1110,7 +1110,7 @@
         # Set per-user displayname or color to whatever was given
         sharedCollection.setVirtualShare(ownerPrincipal, share)
         if displayname:
-            yield sharedCollection.writeProperty(davxml.DisplayName.fromString(displayname), request)
+            yield sharedCollection.writeProperty(element.DisplayName.fromString(displayname), request)
         if color:
             yield sharedCollection.writeProperty(customxml.CalendarColor.fromString(color), request)
 
@@ -1129,7 +1129,7 @@
         returnValue(XMLResponse(
             code = responsecode.OK,
             element = customxml.SharedAs(
-                davxml.HRef.fromString(joinURL(self.url(), share.localname))
+                element.HRef.fromString(joinURL(self.url(), share.localname))
             )
         ))
 
@@ -1219,10 +1219,10 @@
             customxml.InviteReply(
                 *(
                     (
-                        davxml.HRef.fromString(sharee),
+                        element.HRef.fromString(sharee),
                         inviteStatusMapToXML[state](),
                         customxml.HostURL(
-                            davxml.HRef.fromString(hostUrl),
+                            element.HRef.fromString(hostUrl),
                         ),
                         customxml.InReplyTo.fromString(replytoUID),
                     ) + ((customxml.InviteSummary.fromString(displayname),) if displayname is not None else ())
@@ -1248,7 +1248,7 @@
                 summary = str(item)
             elif isinstance(item, customxml.HostURL):
                 for hosturlItem in item.children:
-                    if isinstance(hosturlItem, davxml.HRef):
+                    if isinstance(hosturlItem, element.HRef):
                         hostUrl = str(hosturlItem)
             elif isinstance(item, customxml.InReplyTo):
                 replytoUID = str(item)

Modified: CalendarServer/trunk/twistedcaldav/test/test_extensions.py
===================================================================
--- CalendarServer/trunk/twistedcaldav/test/test_extensions.py	2012-03-17 03:37:14 UTC (rev 8906)
+++ CalendarServer/trunk/twistedcaldav/test/test_extensions.py	2012-03-17 07:27:16 UTC (rev 8907)
@@ -16,8 +16,7 @@
 ##
 
 from twext.python.filepath import CachingFilePath as FilePath
-from twext.web2.dav import davxml
-from txdav.xml.base import WebDAVElement
+from txdav.xml.element import WebDAVElement, ResourceType
 from twext.web2.http_headers import MimeType
 from twext.web2.static import MetaDataMixin
 
@@ -164,7 +163,7 @@
         def addUnicodeChild(davFile):
             m = MetaDataMixin()
             m.contentType = lambda: MimeType.fromString('text/plain')
-            m.resourceType = lambda: davxml.ResourceType()
+            m.resourceType = lambda: ResourceType()
             m.isCollection = lambda: False
             davFile.putChild(unicodeChildName, m)
         yield self.doDirectoryTest([nonASCIIFilename], addUnicodeChild,

Modified: CalendarServer/trunk/twistedcaldav/test/test_props.py
===================================================================
--- CalendarServer/trunk/twistedcaldav/test/test_props.py	2012-03-17 03:37:14 UTC (rev 8906)
+++ CalendarServer/trunk/twistedcaldav/test/test_props.py	2012-03-17 07:27:16 UTC (rev 8907)
@@ -202,8 +202,8 @@
                 return davXMLFromStream(response.stream).addCallback(got_xml)
 
             query = davxml.PropertyFind(
-                        davxml.AllProperties(),
-                    )
+                davxml.AllProperties(),
+            )
 
             request = SimpleRequest(
                 self.site,

Modified: CalendarServer/trunk/twistedcaldav/test/test_resource.py
===================================================================
--- CalendarServer/trunk/twistedcaldav/test/test_resource.py	2012-03-17 03:37:14 UTC (rev 8906)
+++ CalendarServer/trunk/twistedcaldav/test/test_resource.py	2012-03-17 07:27:16 UTC (rev 8907)
@@ -14,10 +14,7 @@
 # limitations under the License.
 ##
 
-from twext.web2.dav import davxml
-from twext.web2.dav.davxml import Principal
-from twext.web2.dav.davxml import Unauthenticated
-from txdav.xml.rfc2518 import HRef
+from txdav.xml.element import HRef, Principal, Unauthenticated
 from twext.web2.http import HTTPError
 from twext.web2.test.test_server import SimpleRequest
 
@@ -273,7 +270,7 @@
         newadbk = yield request.locateResource("/addressbooks/users/wsanchez/newadbk")
         yield newadbk.createAddressBookCollection()
         home.writeDeadProperty(carddavxml.DefaultAddressBookURL(
-            davxml.HRef("/addressbooks/__uids__/6423F94A-6B76-4A3A-815B-D52CFD77935D/newadbk/")
+            HRef("/addressbooks/__uids__/6423F94A-6B76-4A3A-815B-D52CFD77935D/newadbk/")
         ))
         request._newStoreTransaction.commit()
         
@@ -321,7 +318,7 @@
         newadbk = yield request.locateResource("/addressbooks/__uids__/6423F94A-6B76-4A3A-815B-D52CFD77935D/newadbk/")
         yield newadbk.createAddressBookCollection()
         home.writeDeadProperty(carddavxml.DefaultAddressBookURL(
-            davxml.HRef("/addressbooks/__uids__/6423F94A-6B76-4A3A-815B-D52CFD77935D/newadbk/")
+            HRef("/addressbooks/__uids__/6423F94A-6B76-4A3A-815B-D52CFD77935D/newadbk/")
         ))
         try:
             default = yield home.readProperty(carddavxml.DefaultAddressBookURL, request)

Modified: CalendarServer/trunk/twistedcaldav/test/test_upgrade.py
===================================================================
--- CalendarServer/trunk/twistedcaldav/test/test_upgrade.py	2012-03-17 03:37:14 UTC (rev 8906)
+++ CalendarServer/trunk/twistedcaldav/test/test_upgrade.py	2012-03-17 07:27:16 UTC (rev 8907)
@@ -14,9 +14,15 @@
 # limitations under the License.
 ##
 
+import hashlib
+import os, zlib, cPickle
 
+from twisted.python.reflect import namedClass
 from twisted.internet.defer import inlineCallbacks
-from twext.web2.dav import davxml
+
+from txdav.xml.parser import WebDAVDocument
+from txdav.caldav.datastore.index_file import db_basename
+
 from twistedcaldav.config import config
 from twistedcaldav.directory.xmlfile import XMLDirectoryService
 from twistedcaldav.directory.resourceinfo import ResourceInfoDatabase
@@ -28,13 +34,8 @@
 from twistedcaldav.test.util import TestCase
 from calendarserver.tools.util import getDirectory
 
-import hashlib
-import os, zlib, cPickle
-from txdav.caldav.datastore.index_file import db_basename
-from twisted.python.reflect import namedClass
 
 
-
 freeBusyAttr = xattrname(
     "{urn:ietf:params:xml:ns:caldav}calendar-free-busy-set"
 )
@@ -214,7 +215,7 @@
 
         # Pickled XML
         value = "<?xml version='1.0' encoding='UTF-8'?>\r\n<calendar-free-busy-set xmlns='urn:ietf:params:xml:ns:caldav'>\r\n  <href xmlns='DAV:'>/calendars/__uids__/BB05932F-DCE7-4195-9ED4-0896EAFF3B0B/calendar</href>\r\n</calendar-free-busy-set>\r\n"
-        doc = davxml.WebDAVDocument.fromString(value)
+        doc = WebDAVDocument.fromString(value)
         value = cPickle.dumps(doc.root_element)
         self.assertEquals(updateFreeBusySet(value, directory), None)
 
@@ -240,7 +241,7 @@
 
         # Pickled XML
         value = "<?xml version='1.0' encoding='UTF-8'?>\r\n<calendar-free-busy-set xmlns='urn:ietf:params:xml:ns:caldav'>\r\n  <href xmlns='DAV:'>/calendars/users/wsanchez/calendar</href>\r\n</calendar-free-busy-set>\r\n"
-        doc = davxml.WebDAVDocument.fromString(value)
+        doc = WebDAVDocument.fromString(value)
         value = cPickle.dumps(doc.root_element)
         newValue = updateFreeBusySet(value, directory)
         newValue = zlib.decompress(newValue)
@@ -387,7 +388,7 @@
                             "@xattrs" :
                             {
                                 # Pickled XML Doc
-                                freeBusyAttr : cPickle.dumps(davxml.WebDAVDocument.fromString("<?xml version='1.0' encoding='UTF-8'?>\r\n<calendar-free-busy-set xmlns='urn:ietf:params:xml:ns:caldav'>\r\n  <href xmlns='DAV:'>/calendars/users/wsanchez/calendar</href>\r\n</calendar-free-busy-set>\r\n").root_element),
+                                freeBusyAttr : cPickle.dumps(WebDAVDocument.fromString("<?xml version='1.0' encoding='UTF-8'?>\r\n<calendar-free-busy-set xmlns='urn:ietf:params:xml:ns:caldav'>\r\n  <href xmlns='DAV:'>/calendars/users/wsanchez/calendar</href>\r\n</calendar-free-busy-set>\r\n").root_element),
                             },
                         },
                     },
@@ -1705,7 +1706,7 @@
     except zlib.error:
         return False
     try:
-        davxml.WebDAVDocument.fromString(value)
+        WebDAVDocument.fromString(value)
         return True
     except ValueError:
         return False

Modified: CalendarServer/trunk/twistedcaldav/timezonexml.py
===================================================================
--- CalendarServer/trunk/twistedcaldav/timezonexml.py	2012-03-17 03:37:14 UTC (rev 8906)
+++ CalendarServer/trunk/twistedcaldav/timezonexml.py	2012-03-17 07:27:16 UTC (rev 8907)
@@ -1,5 +1,5 @@
 ##
-# Copyright (c) 2011 Apple Inc. All rights reserved.
+# Copyright (c) 2011-2012 Apple Inc. All rights reserved.
 #
 # Licensed under the Apache License, Version 2.0 (the "License");
 # you may not use this file except in compliance with the License.
@@ -19,13 +19,17 @@
 """
 
 from twext.web2.dav import davxml
+from txdav.xml.element import registerElement
 
+
 ##
 # Timezone Service XML Definitions
 ##
 
 timezone_namespace = "urn:ietf:params:xml:ns:timezone-service"
 
+
+ at registerElement
 class Capabilities (davxml.WebDAVElement):
     namespace = timezone_namespace
     name = "capabilities"
@@ -33,6 +37,8 @@
         (timezone_namespace, "operation"): (0, None),
     }
 
+
+ at registerElement
 class Operation (davxml.WebDAVElement):
     namespace = timezone_namespace
     name = "operation"
@@ -42,14 +48,20 @@
         (timezone_namespace, "accept-parameter"): (0, None),
     }
 
+
+ at registerElement
 class Action (davxml.WebDAVTextElement):
     namespace = timezone_namespace
     name = "action"
 
+
+ at registerElement
 class Description (davxml.WebDAVTextElement):
     namespace = timezone_namespace
     name = "description"
 
+
+ at registerElement
 class AcceptParameter (davxml.WebDAVElement):
     namespace = timezone_namespace
     name = "accept-parameter"
@@ -61,22 +73,32 @@
         (timezone_namespace, "description"): (0, 1),
     }
 
+
+ at registerElement
 class Name (davxml.WebDAVTextElement):
     namespace = timezone_namespace
     name = "name"
 
+
+ at registerElement
 class Required (davxml.WebDAVTextElement):
     namespace = timezone_namespace
     name = "required"
 
+
+ at registerElement
 class Multi (davxml.WebDAVTextElement):
     namespace = timezone_namespace
     name = "multi"
 
+
+ at registerElement
 class Value (davxml.WebDAVTextElement):
     namespace = timezone_namespace
     name = "value"
 
+
+ at registerElement
 class TimezoneList (davxml.WebDAVElement):
     namespace = timezone_namespace
     name = "timezone-list"
@@ -85,10 +107,14 @@
         (timezone_namespace, "summary"): (0, None),
     }
 
+
+ at registerElement
 class Dtstamp (davxml.WebDAVTextElement):
     namespace = timezone_namespace
     name = "dtstamp"
 
+
+ at registerElement
 class Summary (davxml.WebDAVElement):
     namespace = timezone_namespace
     name = "summary"
@@ -100,26 +126,38 @@
         (timezone_namespace, "inactive"): (0, 1),
     }
 
+
+ at registerElement
 class Tzid (davxml.WebDAVTextElement):
     namespace = timezone_namespace
     name = "tzid"
 
+
+ at registerElement
 class LastModified (davxml.WebDAVTextElement):
     namespace = timezone_namespace
     name = "last-modified"
 
+
+ at registerElement
 class LocalName (davxml.WebDAVTextElement):
     namespace = timezone_namespace
     name = "local-name"
 
+
+ at registerElement
 class Alias (davxml.WebDAVTextElement):
     namespace = timezone_namespace
     name = "alias"
 
+
+ at registerElement
 class Inactive (davxml.WebDAVEmptyElement):
     namespace = timezone_namespace
     name = "inactive"
 
+
+ at registerElement
 class Timezones (davxml.WebDAVElement):
     namespace = timezone_namespace
     name = "timezones"
@@ -128,6 +166,8 @@
         (timezone_namespace, "tzdata"): (0, None),
     }
 
+
+ at registerElement
 class Tzdata (davxml.WebDAVElement):
     namespace = timezone_namespace
     name = "tzdata"
@@ -137,10 +177,14 @@
         (timezone_namespace, "observance"): (0, None),
     }
 
+
+ at registerElement
 class Calscale (davxml.WebDAVTextElement):
     namespace = timezone_namespace
     name = "calscale"
 
+
+ at registerElement
 class Observance (davxml.WebDAVElement):
     namespace = timezone_namespace
     name = "observance"
@@ -152,15 +196,20 @@
         (timezone_namespace, "utc-offset-to"): (1, 1),
     }
 
+
+ at registerElement
 class Onset (davxml.WebDAVTextElement):
     namespace = timezone_namespace
     name = "onset"
 
+
+ at registerElement
 class UTCOffsetFrom (davxml.WebDAVTextElement):
     namespace = timezone_namespace
     name = "utc-offset-from"
 
+
+ at registerElement
 class UTCOffsetTo (davxml.WebDAVTextElement):
     namespace = timezone_namespace
     name = "utc-offset-to"
-

Modified: CalendarServer/trunk/twistedcaldav/upgrade.py
===================================================================
--- CalendarServer/trunk/twistedcaldav/upgrade.py	2012-03-17 03:37:14 UTC (rev 8906)
+++ CalendarServer/trunk/twistedcaldav/upgrade.py	2012-03-17 07:27:16 UTC (rev 8907)
@@ -22,7 +22,7 @@
 from cPickle import loads as unpickle, UnpicklingError
 
 from twext.python.log import Logger
-from twext.web2.dav import davxml
+from txdav.xml import element
 from twext.web2.dav.fileop import rmdir
 
 from twistedcaldav import caldavxml
@@ -814,7 +814,7 @@
         pass
 
     try:
-        doc = davxml.WebDAVDocument.fromString(value)
+        doc = element.WebDAVDocument.fromString(value)
         freeBusySet = doc.root_element
     except ValueError:
         try:
@@ -837,7 +837,7 @@
                 fbset.add(newHref)
 
     if didUpdate:
-        property = caldavxml.CalendarFreeBusySet(*[davxml.HRef(href)
+        property = caldavxml.CalendarFreeBusySet(*[element.HRef(href)
             for href in fbset])
         value = compress(property.toxml())
         return value
@@ -1112,8 +1112,8 @@
                     request = FakeRequest(root, "PUT", None)
                     request.noAttendeeRefresh = True # tell scheduling to skip refresh
                     request.checkedSACL = True
-                    request.authnUser = request.authzUser = davxml.Principal(
-                        davxml.HRef.fromString("/principals/__uids__/%s/" % (uuid,))
+                    request.authnUser = request.authzUser = element.Principal(
+                        element.HRef.fromString("/principals/__uids__/%s/" % (uuid,))
                     )
 
                     # The request may end up with an associated transaction and we must make sure that is

Modified: CalendarServer/trunk/txdav/base/propertystore/sql.py
===================================================================
--- CalendarServer/trunk/txdav/base/propertystore/sql.py	2012-03-17 03:37:14 UTC (rev 8906)
+++ CalendarServer/trunk/txdav/base/propertystore/sql.py	2012-03-17 07:27:16 UTC (rev 8907)
@@ -29,12 +29,11 @@
 from twext.enterprise.dal.syntax import (
     Select, Parameter, Update, Insert, TableSyntax, Delete)
 
+from txdav.xml.parser import WebDAVDocument
 from txdav.common.datastore.sql_tables import schema
 from txdav.base.propertystore.base import (AbstractPropertyStore,
                                            PropertyName, validKey)
 
-from twext.web2.dav.davxml import WebDAVDocument
-
 from twisted.internet.defer import inlineCallbacks, returnValue
 
 

Modified: CalendarServer/trunk/txdav/base/propertystore/xattr.py
===================================================================
--- CalendarServer/trunk/txdav/base/propertystore/xattr.py	2012-03-17 03:37:14 UTC (rev 8906)
+++ CalendarServer/trunk/txdav/base/propertystore/xattr.py	2012-03-17 07:27:16 UTC (rev 8907)
@@ -32,12 +32,12 @@
 from cPickle import UnpicklingError, loads as unpickle
 from xattr import xattr
 
-from twext.web2.dav.davxml import WebDAVDocument
+from twisted.python.reflect import namedAny
 
+from txdav.xml.parser import WebDAVDocument
 from txdav.base.propertystore.base import AbstractPropertyStore, PropertyName,\
         validKey
 from txdav.idav import PropertyStoreError
-from twisted.python.reflect import namedAny
 
 #
 # RFC 2518 Section 12.13.1 says that removal of non-existing property is not an

Modified: CalendarServer/trunk/txdav/caldav/datastore/test/common.py
===================================================================
--- CalendarServer/trunk/txdav/caldav/datastore/test/common.py	2012-03-17 03:37:14 UTC (rev 8906)
+++ CalendarServer/trunk/txdav/caldav/datastore/test/common.py	2012-03-17 07:27:16 UTC (rev 8907)
@@ -27,15 +27,12 @@
 from twisted.python import hashlib
 
 from twext.python.clsprop import classproperty
-
-from twext.enterprise.ienterprise import AlreadyFinishedError
-
+from twext.python.vcomponent import VComponent
 from twext.python.filepath import CachingFilePath as FilePath
-from twext.web2.dav import davxml
+from twext.enterprise.ienterprise import AlreadyFinishedError
 from twext.web2.http_headers import MimeType
-from txdav.xml.base import WebDAVUnknownElement
-from twext.python.vcomponent import VComponent
 
+from txdav.xml.element import WebDAVUnknownElement, ResourceType
 from txdav.idav import IPropertyStore, IDataStore
 from txdav.base.propertystore.base import PropertyName
 from txdav.common.icommondatastore import HomeChildNameAlreadyExistsError, \
@@ -710,9 +707,9 @@
                 yield home.calendarWithName(name)).properties()
             self.assertEquals(
                 calendarProperties[
-                    PropertyName.fromString(davxml.ResourceType.sname())
+                    PropertyName.fromString(ResourceType.sname())
                 ],
-                davxml.ResourceType.calendar #@UndefinedVariable
+                ResourceType.calendar #@UndefinedVariable
             )
         yield checkProperties()
 

Modified: CalendarServer/trunk/txdav/carddav/datastore/test/common.py
===================================================================
--- CalendarServer/trunk/txdav/carddav/datastore/test/common.py	2012-03-17 03:37:14 UTC (rev 8906)
+++ CalendarServer/trunk/txdav/carddav/datastore/test/common.py	2012-03-17 07:27:16 UTC (rev 8907)
@@ -41,8 +41,7 @@
 from twistedcaldav.vcard import Component as VComponent
 
 from twext.python.filepath import CachingFilePath as FilePath
-from twext.web2.dav import davxml
-from txdav.xml.base import WebDAVUnknownElement
+from txdav.xml.element import WebDAVUnknownElement, ResourceType
 
 
 storePath = FilePath(__file__).parent().child("addressbook_store")
@@ -319,10 +318,10 @@
         self.assertNotIdentical((yield home.addressbookWithName(name)), None)
         def checkProperties():
             addressbookProperties = (yield home.addressbookWithName(name)).properties()
-            addressbookType = davxml.ResourceType.addressbook #@UndefinedVariable
+            addressbookType = ResourceType.addressbook #@UndefinedVariable
             self.assertEquals(
                 addressbookProperties[
-                    PropertyName.fromString(davxml.ResourceType.sname())
+                    PropertyName.fromString(ResourceType.sname())
                 ],
                 addressbookType
             )

Modified: CalendarServer/trunk/txdav/xml/__init__.py
===================================================================
--- CalendarServer/trunk/txdav/xml/__init__.py	2012-03-17 03:37:14 UTC (rev 8906)
+++ CalendarServer/trunk/txdav/xml/__init__.py	2012-03-17 07:27:16 UTC (rev 8907)
@@ -2,7 +2,7 @@
 # See LICENSE for details.
 
 ##
-# Copyright (c) 2005-1012 Apple Computer, Inc. All rights reserved.
+# Copyright (c) 2005-2012 Apple Computer, Inc. All rights reserved.
 #
 # Permission is hereby granted, free of charge, to any person obtaining a copy
 # of this software and associated documentation files (the "Software"), to deal
@@ -25,16 +25,28 @@
 
 """
 WebDAV XML support.
+
+This module provides XML utilities for use with WebDAV.
+
+See RFC 2518: http://www.ietf.org/rfc/rfc2518.txt (WebDAV)
+See RFC 3253: http://www.ietf.org/rfc/rfc3253.txt (WebDAV + Versioning)
+See RFC 3744: http://www.ietf.org/rfc/rfc3744.txt (WebDAV ACLs)
+See RFC 4331: http://www.ietf.org/rfc/rfc4331.txt (WebDAV Quota)
+See RFC 5842: http://www.ietf.org/rfc/rfc5842.txt (WebDAV Bind)
 """
 
 __all__ = [
     "base",
+    "element",
     "parser",
-    "util",
-    "rfc2518",
-    "rfc3253",
-    "rfc3744",
-    "rfc4331",
-    "rfc5842",
-    "extensions",
 ]
+
+import txdav.xml.rfc2518
+import txdav.xml.rfc3253
+import txdav.xml.rfc3744
+import txdav.xml.rfc4331
+import txdav.xml.rfc5842
+import txdav.xml.extensions
+
+txdav # Shhh pyflakes
+

Modified: CalendarServer/trunk/txdav/xml/base.py
===================================================================
--- CalendarServer/trunk/txdav/xml/base.py	2012-03-17 03:37:14 UTC (rev 8906)
+++ CalendarServer/trunk/txdav/xml/base.py	2012-03-17 07:27:16 UTC (rev 8907)
@@ -59,6 +59,8 @@
 # Base XML elements
 ##
 
+_elements_by_qname = {}
+
 dav_namespace = "DAV:"
 twisted_dav_namespace = "http://twistedmatrix.com/xml_namespace/dav/"
 twisted_private_namespace = twisted_dav_namespace + "private/"

Modified: CalendarServer/trunk/txdav/xml/element.py
===================================================================
--- CalendarServer/trunk/txdav/xml/element.py	2012-03-17 03:37:14 UTC (rev 8906)
+++ CalendarServer/trunk/txdav/xml/element.py	2012-03-17 07:27:16 UTC (rev 8907)
@@ -25,65 +25,68 @@
 """
 
 __all__ = [
+    "WebDAVDocument",
     "dav_namespace",
     "twisted_dav_namespace",
     "twisted_private_namespace",
+    "WebDAVElement",
+    "PCDATAElement",
+    "WebDAVOneShotElement",
+    "WebDAVUnknownElement",
+    "WebDAVEmptyElement",
+    "WebDAVTextElement",
+    "WebDAVDateTimeElement",
+    "DateTimeHeaderElement",
     "registerElement",
-    "registerElements",
+    "registerElementClass",
     "lookupElement",
 ]
 
+from txdav.xml.parser import WebDAVDocument
 from txdav.xml.base import dav_namespace
 from txdav.xml.base import twisted_dav_namespace, twisted_private_namespace
-
 from txdav.xml.base import WebDAVElement
+from txdav.xml.base import PCDATAElement, WebDAVOneShotElement, WebDAVUnknownElement
+from txdav.xml.base import WebDAVEmptyElement, WebDAVTextElement
+from txdav.xml.base import WebDAVDateTimeElement, DateTimeHeaderElement
+from txdav.xml.base import _elements_by_qname
 
 
 ##
 # XML element registration
 ##
 
-_elements_by_qname = {}
-
-
-def registerElements(module):
+def registerElement(elementClass):
     """
-    Register XML elements defined in the given module with the parser.
+    Register an XML element class with the parser and add to this module's namespace.
     """
-    element_names = []
+    assert issubclass(elementClass, WebDAVElement), "Not a WebDAVElement: %s" % (elementClass,)
+    assert elementClass.namespace, "Element has no namespace: %s" % (elementClass,)
+    assert elementClass.name, "Element has no name: %s" % (elementClass,)
 
-    items = module.__all__ if hasattr(module, "__all__") else dir(module)
-    for element_class_name in items:
-        element_class = getattr(module, element_class_name)
-
-        if type(element_class) is type and issubclass(element_class, WebDAVElement):
-            if element_class.namespace is None: continue
-            if element_class.name is None: continue
-            if element_class.unregistered: continue
-
-            registerElement(element_class)
-
-            element_names.append(element_class.__name__)
-
-    return element_names
-
-
-def registerElement(element_class):
-    """
-    Register the supplied XML elements with the parser.
-    """
-    qname = element_class.namespace, element_class.name
+    qname = elementClass.namespace, elementClass.name
     
     if qname in _elements_by_qname:
         raise AssertionError(
-            "Attempting to register qname %s multiple times: (%r, %r)"
-            % (qname, _elements_by_qname[qname], element_class)
+            "Attempting to register element %s multiple times: (%r, %r)"
+            % (elementClass.sname(), _elements_by_qname[qname], elementClass)
         )
     
-    if not (qname in _elements_by_qname and issubclass(element_class, _elements_by_qname[qname])):
-        _elements_by_qname[qname] = element_class
+    if not (qname in _elements_by_qname and issubclass(elementClass, _elements_by_qname[qname])):
+        _elements_by_qname[qname] = elementClass
 
+    return elementClass
 
+
+def registerElementClass(elementClass):
+    """
+    Add an XML element class to this module's namespace.
+    """
+    globals()[elementClass.__name__] = elementClass
+    __all__.append(elementClass.__name__)
+    return elementClass
+
+
 def lookupElement(qname):
     """
     Return the element class for the element with the given qname.

Modified: CalendarServer/trunk/txdav/xml/extensions.py
===================================================================
--- CalendarServer/trunk/txdav/xml/extensions.py	2012-03-17 03:37:14 UTC (rev 8906)
+++ CalendarServer/trunk/txdav/xml/extensions.py	2012-03-17 07:27:16 UTC (rev 8907)
@@ -38,9 +38,12 @@
 ]
 
 from txdav.xml.base import WebDAVElement, WebDAVTextElement
-from txdav.xml.base import dav_namespace, twisted_dav_namespace
+from txdav.xml.element import dav_namespace, twisted_dav_namespace
+from txdav.xml.element import registerElement, registerElementClass
 
 
+ at registerElement
+ at registerElementClass
 class CurrentUserPrincipal(WebDAVElement):
     """
     Current principal information
@@ -53,6 +56,8 @@
     }
 
 
+ at registerElement
+ at registerElementClass
 class ErrorDescription(WebDAVTextElement):
     """
     The human-readable description of a failed precondition
@@ -62,6 +67,8 @@
     protected = True
 
 
+ at registerElement
+ at registerElementClass
 class AddMember (WebDAVElement):
     """
     A property on a collection to allow for "anonymous" creation of resources.
@@ -74,6 +81,8 @@
     allowed_children = { (dav_namespace, "href"): (0, 1) }
 
 
+ at registerElement
+ at registerElementClass
 class SyncCollection (WebDAVElement):
     """
     DAV report used to retrieve specific calendar component items via their
@@ -112,6 +121,8 @@
                 self.property = child
 
 
+ at registerElement
+ at registerElementClass
 class SyncToken (WebDAVTextElement):
     """
     Synchronization token used in report and as a property.
@@ -121,6 +132,8 @@
     protected = True
 
 
+ at registerElement
+ at registerElementClass
 class SyncLevel (WebDAVTextElement):
     """
     Synchronization level used in report.

Modified: CalendarServer/trunk/txdav/xml/parser_sax.py
===================================================================
--- CalendarServer/trunk/txdav/xml/parser_sax.py	2012-03-17 03:37:14 UTC (rev 8906)
+++ CalendarServer/trunk/txdav/xml/parser_sax.py	2012-03-17 07:27:16 UTC (rev 8907)
@@ -28,7 +28,7 @@
 import xml.sax
 
 from txdav.xml.base import WebDAVUnknownElement, PCDATAElement
-from txdav.xml.element import _elements_by_qname
+from txdav.xml.base import _elements_by_qname
 from txdav.xml.parser_base import AbstractWebDAVDocument
 from txdav.xml.xmlext import Print as xmlPrint
 

Modified: CalendarServer/trunk/txdav/xml/rfc2518.py
===================================================================
--- CalendarServer/trunk/txdav/xml/rfc2518.py	2012-03-17 03:37:14 UTC (rev 8906)
+++ CalendarServer/trunk/txdav/xml/rfc2518.py	2012-03-17 07:27:16 UTC (rev 8907)
@@ -31,16 +31,18 @@
 from twext.web2 import responsecode
 from twext.web2.http_headers import MimeType
 
-from txdav.xml.base import dav_namespace
 from txdav.xml.base import WebDAVElement, WebDAVTextElement, PCDATAElement
 from txdav.xml.base import WebDAVEmptyElement, WebDAVOneShotElement
 from txdav.xml.base import WebDAVDateTimeElement, DateTimeHeaderElement
+from txdav.xml.element import dav_namespace, registerElement, registerElementClass
 
 
 ##
 # Section 12
 ##
 
+ at registerElement
+ at registerElementClass
 class ActiveLock (WebDAVElement):
     """
     Describes a lock on a resource. (RFC 2518, section 12.1)
@@ -57,6 +59,8 @@
     }
 
 
+ at registerElement
+ at registerElementClass
 class Depth (WebDAVTextElement):
     """
     The value of the depth header. (RFC 2518, section 12.1.1)
@@ -71,6 +75,8 @@
             raise ValueError("Invalid depth: %s" % (depth,))
 
 
+ at registerElement
+ at registerElementClass
 class LockToken (WebDAVElement):
     """
     The lock token associated with a lock. (RFC 2518, section 12.1.2)
@@ -80,6 +86,8 @@
     allowed_children = { (dav_namespace, "href"): (1, None) }
 
 
+ at registerElement
+ at registerElementClass
 class Timeout (WebDAVTextElement):
     """
     The timeout associated with a lock. (RFC 2518, section 12.1.3)
@@ -87,6 +95,8 @@
     name = "timeout"
 
 
+ at registerElement
+ at registerElementClass
 class Collection (WebDAVEmptyElement):
     """
     Identifies the associated resource as a collection. (RFC 2518, section 12.2)
@@ -94,6 +104,8 @@
     name = "collection"
 
 
+ at registerElement
+ at registerElementClass
 class HRef (WebDAVTextElement):
     """
     Identifies the content of the element as a URI. (RFC 2518, section 12.3)
@@ -101,6 +113,8 @@
     name = "href"
 
 
+ at registerElement
+ at registerElementClass
 class Link (WebDAVElement):
     """
     Identifies the property as a link and contains the source and
@@ -114,6 +128,8 @@
     }
 
 
+ at registerElement
+ at registerElementClass
 class LinkDestination (WebDAVTextElement):
     """
     Indicates the destination of a link. (RFC 2518, section 12.4.1)
@@ -121,6 +137,8 @@
     name = "dst"
 
 
+ at registerElement
+ at registerElementClass
 class LinkSource (WebDAVTextElement):
     """
     Indicates the source of a link. (RFC 2518, section 12.4.2)
@@ -128,6 +146,8 @@
     name = "src"
 
 
+ at registerElement
+ at registerElementClass
 class LockEntry (WebDAVElement):
     """
     Defines the types of lock that can be used with the
@@ -141,6 +161,8 @@
     }
 
 
+ at registerElement
+ at registerElementClass
 class LockInfo (WebDAVElement):
     """
     Used with a LOCK method to specify the type of lock that the
@@ -155,6 +177,8 @@
     }
 
 
+ at registerElement
+ at registerElementClass
 class LockScope (WebDAVOneShotElement):
     """
     Specifies whether a lock is an exclusive lock or a shared
@@ -168,6 +192,8 @@
     }
 
 
+ at registerElement
+ at registerElementClass
 class Exclusive (WebDAVEmptyElement):
     """
     Indicates an exclusive lock. (RFC 2518, section 12.7.1)
@@ -177,6 +203,8 @@
 LockScope.exclusive = LockScope(Exclusive())
 
 
+ at registerElement
+ at registerElementClass
 class Shared (WebDAVEmptyElement):
     """
     Indicates a shared lock. (RFC 2518, section 12.7.2)
@@ -186,6 +214,8 @@
 LockScope.shared = LockScope(Shared())
 
 
+ at registerElement
+ at registerElementClass
 class LockType (WebDAVOneShotElement):
     """
     Specifies the access type of a lock. (RFC 2518, section 12.8)
@@ -195,6 +225,8 @@
     allowed_children = { (dav_namespace, "write"): (0, 1) }
 
 
+ at registerElement
+ at registerElementClass
 class Write (WebDAVEmptyElement):
     """
     Indicates a write lock. (RFC 2518, section 12.8.1)
@@ -207,6 +239,8 @@
 LockType.write = LockType(Write())
 
 
+ at registerElement
+ at registerElementClass
 class MultiStatus (WebDAVElement):
     """
     Contains multiple Responses. (RFC 2518, section 12.9)
@@ -219,6 +253,8 @@
     }
 
 
+ at registerElement
+ at registerElementClass
 class Response (WebDAVElement):
     """
     Holds a single response describing the effect of a method on a
@@ -267,6 +303,7 @@
         return StatusResponse.__new__(StatusResponse, *children)
 
 
+ at registerElementClass
 class StatusResponse (Response):
     """
     Specialized derivative of Response for resource status.
@@ -281,6 +318,7 @@
     }
 
 
+ at registerElementClass
 class PropertyStatusResponse (Response):
     """
     Specialized derivative of Response for property status.
@@ -295,6 +333,8 @@
     }
 
 
+ at registerElement
+ at registerElementClass
 class PropertyStatus (WebDAVElement):
     """
     Groups together a Property and Status element that is associated
@@ -310,6 +350,8 @@
     }
 
 
+ at registerElement
+ at registerElementClass
 class Status (WebDAVTextElement):
     """
     Holds a single HTTP status line. (RFC 2518, section 12.9.1.2)
@@ -342,6 +384,8 @@
         self.code = code
 
 
+ at registerElement
+ at registerElementClass
 class ResponseDescription (WebDAVTextElement):
     """
     Contains a message that can be displayed to the user explaining the nature
@@ -350,6 +394,8 @@
     name = "responsedescription"
 
 
+ at registerElement
+ at registerElementClass
 class Owner (WebDAVElement):
     """
     Property which provides information about the principal taking out a lock.
@@ -366,6 +412,8 @@
     allowed_children = { WebDAVElement: (0, None) }
 
 
+ at registerElement
+ at registerElementClass
 class PropertyContainer (WebDAVElement):
     """
     Contains properties related to a resource. (RFC 2518, section 12.11)
@@ -375,6 +423,8 @@
     allowed_children = { WebDAVElement: (0, None) }
 
 
+ at registerElement
+ at registerElementClass
 class PropertyBehavior (WebDAVElement):
     """
     Specifies how properties are handled during a COPY or MOVE. (RFC 2518,
@@ -399,6 +449,8 @@
         self.behavior = children[0]
 
 
+ at registerElement
+ at registerElementClass
 class KeepAlive (WebDAVElement):
     """
     Specifies requirements for the copying/moving or live properties. (RFC 2518,
@@ -430,6 +482,8 @@
                 raise ValueError("Invalid keepalive value: %r", (str(self),))
 
 
+ at registerElement
+ at registerElementClass
 class Omit (WebDAVEmptyElement):
     """
     Instructs the server that it should use best effort to copy properties. (RFC
@@ -438,6 +492,8 @@
     name = "omit"
 
 
+ at registerElement
+ at registerElementClass
 class PropertyUpdate (WebDAVElement):
     """
     Contains a request to alter the properties on a resource. (RFC 2518, section
@@ -451,6 +507,8 @@
     }
 
 
+ at registerElement
+ at registerElementClass
 class Remove (WebDAVElement):
     """
     Lists the DAV properties to be removed from a resource. (RFC 2518, section
@@ -461,6 +519,8 @@
     allowed_children = { (dav_namespace, "prop"): (1, 1) }
 
 
+ at registerElement
+ at registerElementClass
 class Set (WebDAVElement):
     """
     Lists the DAV properties to be set for a resource. (RFC 2518, section
@@ -471,6 +531,8 @@
     allowed_children = { (dav_namespace, "prop"): (1, 1) }
 
 
+ at registerElement
+ at registerElementClass
 class PropertyFind (WebDAVElement):
     """
     Specifies the properties to be returned from a PROPFIND
@@ -494,6 +556,8 @@
             )
 
 
+ at registerElement
+ at registerElementClass
 class AllProperties (WebDAVEmptyElement):
     """
     Specifies that all property names and values on the resource are
@@ -502,6 +566,8 @@
     name = "allprop"
 
 
+ at registerElement
+ at registerElementClass
 class PropertyName (WebDAVEmptyElement):
     """
     Specifies that only a list of property names on the resource are
@@ -514,6 +580,8 @@
 # Section 13
 ##
 
+ at registerElement
+ at registerElementClass
 class CreationDate (WebDAVDateTimeElement):
     """
     Records the time and date that the resource was created. (RFC 2518, section
@@ -524,6 +592,8 @@
     protected = True
 
 
+ at registerElement
+ at registerElementClass
 class DisplayName (WebDAVTextElement):
     """
     Provides a name for the resource that is suitable for presentation
@@ -532,6 +602,8 @@
     name = "displayname"
 
 
+ at registerElement
+ at registerElementClass
 class GETContentLanguage (WebDAVTextElement):
     """
     Contains the Content-Language header returned by a GET without
@@ -540,6 +612,8 @@
     name = "getcontentlanguage"
 
 
+ at registerElement
+ at registerElementClass
 class GETContentLength (WebDAVTextElement):
     """
     Contains the Content-Length header returned by a GET without
@@ -549,6 +623,8 @@
     protected = True
 
 
+ at registerElement
+ at registerElementClass
 class GETContentType (WebDAVTextElement):
     """
     Contains the Content-Type header returned by a GET without
@@ -560,6 +636,8 @@
         return MimeType.fromString(str(self))
 
 
+ at registerElement
+ at registerElementClass
 class GETETag (WebDAVTextElement):
     """
     Contains the ETag header returned by a GET without
@@ -569,6 +647,8 @@
     protected = True
 
 
+ at registerElement
+ at registerElementClass
 class GETLastModified (DateTimeHeaderElement):
     """
     Contains the Last-Modified header returned by a GET without accept
@@ -578,6 +658,8 @@
     protected = True
 
 
+ at registerElement
+ at registerElementClass
 class LockDiscovery (WebDAVElement):
     """
     Describes the active locks on a resource. (RFC 2518, section 13.8)
@@ -588,6 +670,8 @@
     allowed_children = { (dav_namespace, "activelock"): (0, None) }
 
 
+ at registerElement
+ at registerElementClass
 class ResourceType (WebDAVElement):
     """
     Specifies the nature of the resource. (RFC 2518, section 13.9)
@@ -601,6 +685,8 @@
 ResourceType.empty      = ResourceType()
 
 
+ at registerElement
+ at registerElementClass
 class Source (WebDAVElement):
     """
     The destination of the source link identifies the resource that
@@ -612,6 +698,8 @@
     allowed_children = { (dav_namespace, "link"): (0, None) }
 
 
+ at registerElement
+ at registerElementClass
 class SupportedLock (WebDAVElement):
     """
     Provides a listing of the lock capabilities supported by the
@@ -626,6 +714,8 @@
 # Pre-conditions codes defined in RFC4918
 
 
+ at registerElement
+ at registerElementClass
 class PropfindFiniteDepth (WebDAVEmptyElement):
     """
     Error which indicates Depth:infinity PROPFIND not allowed

Modified: CalendarServer/trunk/txdav/xml/rfc3253.py
===================================================================
--- CalendarServer/trunk/txdav/xml/rfc3253.py	2012-03-17 03:37:14 UTC (rev 8906)
+++ CalendarServer/trunk/txdav/xml/rfc3253.py	2012-03-17 07:27:16 UTC (rev 8907)
@@ -28,14 +28,16 @@
 See RFC 3253: http://www.ietf.org/rfc/rfc3253.txt
 """
 
-from txdav.xml.base import dav_namespace
-from txdav.xml.base import WebDAVElement, WebDAVTextElement
+from txdav.xml.base import WebDAVElement, WebDAVTextElement, dav_namespace
+from txdav.xml.element import registerElement, registerElementClass
 
 
 ##
 # Section 1
 ##
 
+ at registerElement
+ at registerElementClass
 class Error (WebDAVElement):
     """
     Specifies an error condition. (RFC 3253, section 1.6)
@@ -51,6 +53,8 @@
 # Section 3
 ##
 
+ at registerElement
+ at registerElementClass
 class Comment (WebDAVTextElement):
     """
     Property used to track a brief comment about a resource that is suitable for
@@ -61,6 +65,8 @@
     hidden = True
 
 
+ at registerElement
+ at registerElementClass
 class CreatorDisplayName (WebDAVTextElement):
     """
     Property which contains a description of the creator of the resource that is
@@ -70,6 +76,8 @@
     hidden = True
 
 
+ at registerElement
+ at registerElementClass
 class SupportedMethod (WebDAVElement):
     """
     Property which identifies a method that is supported by a resource. A method
@@ -85,6 +93,8 @@
     allowed_attributes = { "name": True }
 
 
+ at registerElement
+ at registerElementClass
 class SupportedMethodSet (WebDAVElement):
     """
     Property which identifies the methods that are supported by a resource. (RFC
@@ -97,6 +107,8 @@
     allowed_children = { (dav_namespace, "supported-method"): (0, None) }
 
 
+ at registerElement
+ at registerElementClass
 class SupportedLiveProperty (WebDAVElement):
     """
     Property which identifies a live property that is supported by a resource. A
@@ -112,6 +124,8 @@
     allowed_children = { (dav_namespace, "name"): (1, 1) }
 
 
+ at registerElement
+ at registerElementClass
 class SupportedLivePropertySet (WebDAVElement):
     """
     Property which identifies the live properties that are supported by a
@@ -124,6 +138,8 @@
     allowed_children = { (dav_namespace, "supported-live-property"): (0, None) }
 
 
+ at registerElement
+ at registerElementClass
 class Report (WebDAVElement):
     """
     A report. (RFC 3253, section 3.1.5)
@@ -134,6 +150,8 @@
     allowed_children = { WebDAVElement: (0, None) }
 
 
+ at registerElement
+ at registerElementClass
 class SupportedReport (WebDAVElement):
     """
     Identifies a report that is supported by the resource.  (RFC 3253, section
@@ -167,6 +185,8 @@
     allowed_children = { (dav_namespace, "report"): (0, 1) }
 
 
+ at registerElement
+ at registerElementClass
 class SupportedReportSet (WebDAVElement):
     """
     Property which identifies the reports that are supported by the resource.
@@ -179,6 +199,8 @@
     allowed_children = { (dav_namespace, "supported-report"): (0, None) }
 
 
+ at registerElement
+ at registerElementClass
 class ExpandProperty (WebDAVElement):
     """
     Report which provides a mechanism for retrieving in one request the
@@ -190,6 +212,8 @@
     allowed_children = { (dav_namespace, "property"): (0, None) }
 
 
+ at registerElement
+ at registerElementClass
 class Property (WebDAVElement):
     """
     Identifies a property by name. (RFC 3253, section 3.8)

Modified: CalendarServer/trunk/txdav/xml/rfc3744.py
===================================================================
--- CalendarServer/trunk/txdav/xml/rfc3744.py	2012-03-17 03:37:14 UTC (rev 8906)
+++ CalendarServer/trunk/txdav/xml/rfc3744.py	2012-03-17 07:27:16 UTC (rev 8907)
@@ -28,15 +28,17 @@
 See RFC 3744: http://www.ietf.org/rfc/rfc3744.txt
 """
 
-from txdav.xml.base import dav_namespace
 from txdav.xml.base import WebDAVElement, PCDATAElement
 from txdav.xml.base import WebDAVEmptyElement, WebDAVTextElement
+from txdav.xml.element import dav_namespace, registerElement, registerElementClass
 
 
 ##
 # Section 3 (Privileges)
 ##
 
+ at registerElement
+ at registerElementClass
 class Read (WebDAVEmptyElement):
     """
     Privilege which controls methods that return information about the state
@@ -50,6 +52,8 @@
 # rfc2518.py.
 
 
+ at registerElement
+ at registerElementClass
 class WriteProperties (WebDAVEmptyElement):
     """
     Privilege which controls methods that modify the dead properties of a
@@ -58,6 +62,8 @@
     name = "write-properties"
 
 
+ at registerElement
+ at registerElementClass
 class WriteContent (WebDAVEmptyElement):
     """
     Privilege which controls methods that modify the content of an existing
@@ -66,6 +72,8 @@
     name = "write-content"
 
 
+ at registerElement
+ at registerElementClass
 class Unlock (WebDAVEmptyElement):
     """
     Privilege which controls the use of the UNLOCK method by a principal other
@@ -74,6 +82,8 @@
     name = "unlock"
 
 
+ at registerElement
+ at registerElementClass
 class ReadACL (WebDAVEmptyElement):
     """
     Privilege which controls the use of the PROPFIND method to retrieve the
@@ -82,6 +92,8 @@
     name = "read-acl"
 
 
+ at registerElement
+ at registerElementClass
 class ReadCurrentUserPrivilegeSet (WebDAVEmptyElement):
     """
     Privilege which controls the use of the PROPFIND method to retrieve the
@@ -91,6 +103,8 @@
     name = "read-current-user-privilege-set"
 
 
+ at registerElement
+ at registerElementClass
 class WriteACL (WebDAVEmptyElement):
     """
     Privilege which controls the use of the ACL method to modify the DAV:acl
@@ -99,6 +113,8 @@
     name = "write-acl"
 
 
+ at registerElement
+ at registerElementClass
 class Bind (WebDAVEmptyElement):
     """
     Privilege which allows a method to add a new member URL from the a
@@ -107,6 +123,8 @@
     name = "bind"
 
 
+ at registerElement
+ at registerElementClass
 class Unbind (WebDAVEmptyElement):
     """
     Privilege which allows a method to remove a member URL from the a collection
@@ -115,6 +133,8 @@
     name = "unbind"
 
 
+ at registerElement
+ at registerElementClass
 class All (WebDAVEmptyElement):
     """
     Aggregate privilege that contains the entire set of privileges that can be
@@ -128,6 +148,8 @@
 # Section 4 (Principal Properties)
 ##
 
+ at registerElement
+ at registerElementClass
 class Principal (WebDAVElement):
     """
     Indicates a principal resource type. (RFC 3744, section 4)
@@ -156,6 +178,8 @@
             )
 
 
+ at registerElement
+ at registerElementClass
 class AlternateURISet (WebDAVElement):
     """
     Property which contains the URIs of network resources with additional
@@ -168,6 +192,8 @@
     allowed_children = { (dav_namespace, "href"): (0, None) }
 
 
+ at registerElement
+ at registerElementClass
 class PrincipalURL (WebDAVElement):
     """
     Property which contains the URL that must be used to identify this principal
@@ -180,6 +206,8 @@
     allowed_children = { (dav_namespace, "href"): (0, 1) }
 
 
+ at registerElement
+ at registerElementClass
 class GroupMemberSet (WebDAVElement):
     """
     Property which identifies the principals that are direct members of a group
@@ -192,6 +220,8 @@
     allowed_children = { (dav_namespace, "href"): (0, None) }
 
 
+ at registerElement
+ at registerElementClass
 class GroupMembership (WebDAVElement):
     """
     Property which identifies the group principals in which a principal is
@@ -212,6 +242,8 @@
 # rfc2518.py.
 
 
+ at registerElement
+ at registerElementClass
 class Group (WebDAVElement):
     """
     Property which identifies a particular principal as being the group
@@ -224,6 +256,8 @@
     allowed_children = { (dav_namespace, "href"): (0, 1) }
 
 
+ at registerElement
+ at registerElementClass
 class SupportedPrivilegeSet (WebDAVElement):
     """
     Property which identifies the privileges defined for a resource. (RFC 3744,
@@ -236,6 +270,8 @@
     allowed_children = { (dav_namespace, "supported-privilege"): (0, None) }
 
 
+ at registerElement
+ at registerElementClass
 class SupportedPrivilege (WebDAVElement):
     """
     Identifies a privilege defined for a resource. (RFC 3744, section 5.3)
@@ -250,6 +286,8 @@
     }
 
 
+ at registerElement
+ at registerElementClass
 class Privilege (WebDAVElement):
     """
     Identifies a privilege. (RFC 3744, sections 5.3 and 5.5.1)
@@ -343,6 +381,8 @@
         return aggregates
 
 
+ at registerElement
+ at registerElementClass
 class Abstract (WebDAVElement):
     """
     Identifies a privilege as abstract. (RFC 3744, section 5.3)
@@ -350,6 +390,8 @@
     name = "abstract"
 
 
+ at registerElement
+ at registerElementClass
 class Description (WebDAVTextElement):
     """
     A human-readable description of what privilege controls access to. (RFC
@@ -359,6 +401,8 @@
     allowed_attributes = { "xml:lang": True }
 
 
+ at registerElement
+ at registerElementClass
 class CurrentUserPrivilegeSet (WebDAVElement):
     """
     Property which contains the exact set of privileges (as computer by the
@@ -375,6 +419,8 @@
 # For DAV:privilege element (RFC 3744, section 5.4) see Privilege class above.
 
 
+ at registerElement
+ at registerElementClass
 class ACL (WebDAVElement):
     """
     Property which specifies the list of access control entries which define
@@ -388,6 +434,8 @@
     allowed_children = { (dav_namespace, "ace"): (0, None) }
 
 
+ at registerElement
+ at registerElementClass
 class ACE (WebDAVElement):
     """
     Specifies the list of access control entries which define what privileges
@@ -477,6 +525,8 @@
 # For DAV:all element (RFC 3744, section 5.5.1) see All class above.
 
 
+ at registerElement
+ at registerElementClass
 class Authenticated (WebDAVEmptyElement):
     """
     Principal which matches authenticated users. (RFC 3744, section 5.5.1)
@@ -484,6 +534,8 @@
     name = "authenticated"
 
 
+ at registerElement
+ at registerElementClass
 class Unauthenticated (WebDAVEmptyElement):
     """
     Principal which matches unauthenticated users. (RFC 3744, section 5.5.1)
@@ -495,6 +547,8 @@
 # class above.
 
 
+ at registerElement
+ at registerElementClass
 class Self (WebDAVEmptyElement):
     """
     Principal which matches a user if a resource is a principal and the user
@@ -503,6 +557,8 @@
     name = "self"
 
 
+ at registerElement
+ at registerElementClass
 class Invert (WebDAVElement):
     """
     Principal which matches a user if the user does not match the principal
@@ -513,6 +569,8 @@
     allowed_children = { (dav_namespace, "principal"): (1, 1) }
 
 
+ at registerElement
+ at registerElementClass
 class Grant (WebDAVElement):
     """
     Grants the contained privileges to a principal. (RFC 3744, section 5.5.2)
@@ -522,6 +580,8 @@
     allowed_children = { (dav_namespace, "privilege"): (1, None) }
 
 
+ at registerElement
+ at registerElementClass
 class Deny (WebDAVElement):
     """
     Denies the contained privileges to a principal. (RFC 3744, section 5.5.2)
@@ -535,6 +595,8 @@
 # class above.
 
 
+ at registerElement
+ at registerElementClass
 class Protected (WebDAVEmptyElement):
     """
     Identifies an ACE as protected. (RFC 3744, section 5.5.3)
@@ -542,6 +604,8 @@
     name = "protected"
 
 
+ at registerElement
+ at registerElementClass
 class Inherited (WebDAVElement):
     """
     Indicates that an ACE is inherited from the resource indentified by the
@@ -552,6 +616,8 @@
     allowed_children = { (dav_namespace, "href"): (1, 1) }
 
 
+ at registerElement
+ at registerElementClass
 class ACLRestrictions (WebDAVElement):
     """
     Property which defines the types of ACLs supported by this server, to avoid
@@ -569,6 +635,8 @@
     }
 
 
+ at registerElement
+ at registerElementClass
 class GrantOnly (WebDAVEmptyElement):
     """
     Indicates that ACEs with deny clauses are not allowed. (RFC 3744, section
@@ -577,6 +645,8 @@
     name = "grant-only"
 
 
+ at registerElement
+ at registerElementClass
 class NoInvert (WebDAVEmptyElement):
     """
     Indicates that ACEs with the DAV:invert element are not allowed. (RFC 3744,
@@ -585,6 +655,8 @@
     name = "no-invert"
 
 
+ at registerElement
+ at registerElementClass
 class DenyBeforeGrant (WebDAVEmptyElement):
     """
     Indicates that all deny ACEs must precede all grant ACEs. (RFC 3744, section
@@ -593,6 +665,8 @@
     name = "deny-before-grant"
 
 
+ at registerElement
+ at registerElementClass
 class RequiredPrincipal (WebDAVElement):
     """
     Indicates which principals must have an ACE defined in an ACL. (RFC 3744,
@@ -625,6 +699,8 @@
                 )
 
 
+ at registerElement
+ at registerElementClass
 class InheritedACLSet (WebDAVElement):
     """
     Property which contains a set of URLs that identify other resources that
@@ -637,6 +713,8 @@
     allowed_children = { (dav_namespace, "href"): (0, None) }
 
 
+ at registerElement
+ at registerElementClass
 class PrincipalCollectionSet (WebDAVElement):
     """
     Property which contains a set of URLs that identify the root collections
@@ -654,6 +732,8 @@
 # Section 7 (Access Control and existing methods)
 ##
 
+ at registerElement
+ at registerElementClass
 class NeedPrivileges (WebDAVElement):
     """
     Error which indicates insufficient privileges. (RFC 3744, section 7.1.1)
@@ -663,6 +743,8 @@
     allowed_children = { (dav_namespace, "resource"): (0, None) }
 
 
+ at registerElement
+ at registerElementClass
 class Resource (WebDAVElement):
     """
     Identifies which resource had insufficient privileges. (RFC 3744, section
@@ -680,6 +762,8 @@
 # Section 9 (Access Control Reports)
 ##
 
+ at registerElement
+ at registerElementClass
 class ACLPrincipalPropSet (WebDAVElement):
     """
     Report which returns, for all principals in the DAV:acl property (of the
@@ -706,6 +790,8 @@
                 prop = True
 
 
+ at registerElement
+ at registerElementClass
 class PrincipalMatch (WebDAVElement):
     """
     Report used to identify all members (at any depth) of the collection
@@ -747,6 +833,8 @@
             )
 
 
+ at registerElement
+ at registerElementClass
 class PrincipalProperty (WebDAVElement):
     """
     Identifies a property. (RFC 3744, section 9.3)
@@ -759,6 +847,8 @@
 # For DAV:self element (RFC 3744, section 9.3) see Self class above.
 
 
+ at registerElement
+ at registerElementClass
 class PrincipalPropertySearch (WebDAVElement):
     """
     Report which performs a search for all principals whose properties contain
@@ -775,6 +865,8 @@
     allowed_attributes = { "test": False }
 
 
+ at registerElement
+ at registerElementClass
 class PropertySearch (WebDAVElement):
     """
     Contains a DAV:prop element enumerating the properties to be searched and a
@@ -788,6 +880,8 @@
     }
 
 
+ at registerElement
+ at registerElementClass
 class Match (WebDAVTextElement):
     """
     Contains a search string. (RFC 3744, section 9.4)
@@ -795,6 +889,8 @@
     name = "match"
 
 
+ at registerElement
+ at registerElementClass
 class PrincipalSearchPropertySet (WebDAVElement):
     """
     Report which identifies those properties that may be searched using the
@@ -805,6 +901,8 @@
     allowed_children = { (dav_namespace, "principal-search-property"): (0, None) }
 
 
+ at registerElement
+ at registerElementClass
 class PrincipalSearchProperty (WebDAVElement):
     """
     Contains exactly one searchable property, and a description of the property.
@@ -818,6 +916,8 @@
     }
 
 
+ at registerElement
+ at registerElementClass
 class NumberOfMatchesWithinLimits (WebDAVEmptyElement):
     """
     Error which indicates too many results

Modified: CalendarServer/trunk/txdav/xml/rfc4331.py
===================================================================
--- CalendarServer/trunk/txdav/xml/rfc4331.py	2012-03-17 03:37:14 UTC (rev 8906)
+++ CalendarServer/trunk/txdav/xml/rfc4331.py	2012-03-17 07:27:16 UTC (rev 8907)
@@ -29,12 +29,14 @@
 """
 
 from txdav.xml.base import WebDAVTextElement
+from txdav.xml.element import registerElement, registerElementClass
 
-
 ##
 # Section 3 & 4 (Quota Properties)
 ##
 
+ at registerElement
+ at registerElementClass
 class QuotaAvailableBytes (WebDAVTextElement):
     """
     Property which contains the the number of bytes available under the
@@ -45,6 +47,8 @@
     protected = True
 
 
+ at registerElement
+ at registerElementClass
 class QuotaUsedBytes (WebDAVTextElement):
     """
     Property which contains the the number of bytes used under the

Modified: CalendarServer/trunk/txdav/xml/rfc5842.py
===================================================================
--- CalendarServer/trunk/txdav/xml/rfc5842.py	2012-03-17 03:37:14 UTC (rev 8906)
+++ CalendarServer/trunk/txdav/xml/rfc5842.py	2012-03-17 07:27:16 UTC (rev 8907)
@@ -21,7 +21,7 @@
 ##
 
 from txdav.xml.base import WebDAVTextElement, WebDAVElement
-from txdav.xml.base import dav_namespace
+from txdav.xml.element import dav_namespace, registerElement, registerElementClass
 
 """
 RFC 5842 (Binding Extensions to WebDAV) XML Elements
@@ -31,6 +31,8 @@
 See RFC 5842: http://www.ietf.org/rfc/rfc5842.txt
 """
 
+ at registerElement
+ at registerElementClass
 class ResourceID (WebDAVElement):
     """
     Unique identifier for a resource
@@ -42,6 +44,8 @@
     allowed_children = { (dav_namespace, "href"): (0, 1) }
 
 
+ at registerElement
+ at registerElementClass
 class ParentSet (WebDAVElement):
     """
     Identifies other bindings to a resource
@@ -53,6 +57,8 @@
     allowed_children = { (dav_namespace, "parent"): (0, 1) }
 
 
+ at registerElement
+ at registerElementClass
 class Parent (WebDAVElement):
 
     name = "parent"
@@ -63,6 +69,8 @@
     }
 
 
+ at registerElement
+ at registerElementClass
 class Segment (WebDAVTextElement):
 
     name = "segment"
@@ -75,6 +83,8 @@
 # sub-elements and so that can extend it here.
 
 
+#@registerElement
+#@registerElementClass
 #class BindResponse (WebDAVElement):
 #    """
 #    Response body for a BIND request
@@ -87,6 +97,8 @@
 #    }
 #
 #
+#@registerElement
+#@registerElementClass
 #class UnbindRequest (WebDAVElement):
 #    """
 #    Request body for a UNBIND request
@@ -99,6 +111,8 @@
 #    }
 #
 #
+#@registerElement
+#@registerElementClass
 #class Unbind (WebDAVElement):
 #    """
 #    Response body for a UNBIND request
@@ -111,6 +125,8 @@
 #    }
 #
 #
+#@registerElement
+#@registerElementClass
 #class RebindRequest (WebDAVElement):
 #    """
 #    Request body for a REBIND request
@@ -124,6 +140,8 @@
 #    }
 #
 #
+#@registerElement
+#@registerElementClass
 #class Rebind (WebDAVElement):
 #    """
 #    Response body for a UNBIND request

Modified: CalendarServer/trunk/txdav/xml/test/test_base.py
===================================================================
--- CalendarServer/trunk/txdav/xml/test/test_base.py	2012-03-17 03:37:14 UTC (rev 8906)
+++ CalendarServer/trunk/txdav/xml/test/test_base.py	2012-03-17 07:27:16 UTC (rev 8907)
@@ -27,7 +27,8 @@
 
 from twisted.trial.unittest import TestCase
 from txdav.xml.base import decodeXMLName, encodeXMLName
-from twext.web2.dav.davxml import WebDAVDocument, WebDAVUnknownElement
+from txdav.xml.base import WebDAVUnknownElement
+from txdav.xml.parser import WebDAVDocument
 
 
 class NameEncodeTests(TestCase):

Modified: CalendarServer/trunk/txdav/xml/test/test_xml.py
===================================================================
--- CalendarServer/trunk/txdav/xml/test/test_xml.py	2012-03-17 03:37:14 UTC (rev 8906)
+++ CalendarServer/trunk/txdav/xml/test/test_xml.py	2012-03-17 07:27:16 UTC (rev 8907)
@@ -28,8 +28,8 @@
 """
 
 from twisted.trial.unittest import TestCase
-from twext.web2.dav.davxml import Response, HRef, MultiStatus, Status
-from twext.web2.dav.davxml import CurrentUserPrincipal
+from txdav.xml.element import Response, HRef, MultiStatus, Status
+from txdav.xml.element import CurrentUserPrincipal
 from txdav.xml.test.test_base import WebDAVElementTestsMixin
 
 
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.macosforge.org/pipermail/calendarserver-changes/attachments/20120317/eb4ab1c0/attachment-0001.html>


More information about the calendarserver-changes mailing list