[Zope3-checkins] SVN: Zope3/branches/ZopeX3-3.0/src/zope/app/ Refactored xmlrpc:

Jim Fulton jim at zope.com
Fri Aug 27 10:28:21 EDT 2004


Log message for revision 27290:
  Refactored xmlrpc:
  
  - Made it possible to define xml-rpc methods on content. This made the
    "default view" mechanism unnecessary.
  
  - Removed the default-view mechanism.  This is backward incompatable, 
    but it's better to do this now, rather than after X3.0.
  
  This allowed the custom publication object to basically go away.
  
  - Added documentation in the form of a doctest.
  


Changed:
  U   Zope3/branches/ZopeX3-3.0/src/zope/app/i18n/xmlrpc/configure.zcml
  U   Zope3/branches/ZopeX3-3.0/src/zope/app/publication/tests/test_xmlrpcpublication.py
  U   Zope3/branches/ZopeX3-3.0/src/zope/app/publication/xmlrpc.py
  A   Zope3/branches/ZopeX3-3.0/src/zope/app/publisher/xmlrpc/README.txt
  U   Zope3/branches/ZopeX3-3.0/src/zope/app/publisher/xmlrpc/__init__.py
  A   Zope3/branches/ZopeX3-3.0/src/zope/app/publisher/xmlrpc/ftests.py
  U   Zope3/branches/ZopeX3-3.0/src/zope/app/publisher/xmlrpc/meta.zcml
  U   Zope3/branches/ZopeX3-3.0/src/zope/app/publisher/xmlrpc/metaconfigure.py
  U   Zope3/branches/ZopeX3-3.0/src/zope/app/publisher/xmlrpc/metadirectives.py
  A   Zope3/branches/ZopeX3-3.0/src/zope/app/publisher/xmlrpc/t
  U   Zope3/branches/ZopeX3-3.0/src/zope/app/publisher/xmlrpc/tests/test_directives.py
  U   Zope3/branches/ZopeX3-3.0/src/zope/app/publisher/xmlrpc/tests/xmlrpc.zcml
  U   Zope3/branches/ZopeX3-3.0/src/zope/app/publisher/xmlrpc/tests/xmlrpc_error.zcml


-=-
Modified: Zope3/branches/ZopeX3-3.0/src/zope/app/i18n/xmlrpc/configure.zcml
===================================================================
--- Zope3/branches/ZopeX3-3.0/src/zope/app/i18n/xmlrpc/configure.zcml	2004-08-27 14:28:18 UTC (rev 27289)
+++ Zope3/branches/ZopeX3-3.0/src/zope/app/i18n/xmlrpc/configure.zcml	2004-08-27 14:28:21 UTC (rev 27290)
@@ -6,15 +6,11 @@
   <!-- Translation Domain View Directives -->
 
   <xmlrpc:view
-      name="methods"
       for="zope.i18n.interfaces.ITranslationDomain"
       permission="zope.ManageContent" 
-      allowed_attributes="getAllLanguages getMessagesFor"
-      class=".methods.Methods" />
+      methods="getAllLanguages getMessagesFor"
+      class=".methods.Methods" 
+      />
       
-  <xmlrpc:defaultView
-      name="methods"
-      for="zope.i18n.interfaces.ITranslationDomain" />
-     
 
 </configure>

Modified: Zope3/branches/ZopeX3-3.0/src/zope/app/publication/tests/test_xmlrpcpublication.py
===================================================================
--- Zope3/branches/ZopeX3-3.0/src/zope/app/publication/tests/test_xmlrpcpublication.py	2004-08-27 14:28:18 UTC (rev 27289)
+++ Zope3/branches/ZopeX3-3.0/src/zope/app/publication/tests/test_xmlrpcpublication.py	2004-08-27 14:28:21 UTC (rev 27290)
@@ -30,6 +30,7 @@
 from zope.publisher.interfaces.xmlrpc import IXMLRPCRequest
 from zope.publisher.interfaces.xmlrpc import IXMLRPCPublisher
 from zope.publisher.xmlrpc import TestRequest
+from zope.app.tests import ztapi
 
 
 class SimpleObject(object):
@@ -99,6 +100,14 @@
                 pass
             implements(IXMLRPCPresentation)
 
+
+        # Register the simple traverser so we can traverse without @@
+        from zope.publisher.interfaces.xmlrpc import IXMLRPCPublisher
+        from zope.publisher.interfaces.xmlrpc import IXMLRPCRequest
+        from zope.app.publication.traversers import SimpleComponentTraverser
+        ztapi.provideView(Interface, IXMLRPCRequest, IXMLRPCPublisher, '',
+                          SimpleComponentTraverser)
+
         r = self._createRequest('/@@spam', pub)
         provideView = getService(Presentation).provideView
         provideView(I, 'spam', IXMLRPCRequest, V)
@@ -109,39 +118,6 @@
         self.assertEqual(removeAllProxies(ob2).__class__, V)
         
 
-    def testTraverseNameDefaultView(self):
-        pub = self.klass(self.db)
-
-        class I(Interface):
-            pass
-
-        class C(object):
-            implements(I)
-
-        ob = C()
-
-        class V(object):
-            implements(IXMLRPCPresentation)
-
-            def __init__(self, context, request):
-                pass
-
-            def spam(self):
-                return 'foo'
-
-        r = self._createRequest('/spam', pub)
-        provideView = getService(Presentation).provideView
-        setDefaultViewName = getService(Presentation).setDefaultViewName
-        provideView(I, 'view', IXMLRPCRequest, V)
-        setDefaultViewName(I, IXMLRPCRequest, 'view')
-
-        ob2 = pub.traverseName(r, ob, '@@spam')
-        self.assertEqual(removeAllProxies(ob2).__name__, V.spam.__name__)
-
-        ob2 = pub.traverseName(r, ob, 'spam')
-        self.assertEqual(removeAllProxies(ob2).__name__, V.spam.__name__)
-
-
     def testTraverseNameServices(self):
         pub = self.klass(self.db)
         class C(object):

Modified: Zope3/branches/ZopeX3-3.0/src/zope/app/publication/xmlrpc.py
===================================================================
--- Zope3/branches/ZopeX3-3.0/src/zope/app/publication/xmlrpc.py	2004-08-27 14:28:18 UTC (rev 27289)
+++ Zope3/branches/ZopeX3-3.0/src/zope/app/publication/xmlrpc.py	2004-08-27 14:28:21 UTC (rev 27290)
@@ -17,65 +17,17 @@
 
 $Id$
 """
+
+from zope.app import zapi
 from zope.component import queryView, queryDefaultViewName
 from zope.proxy import removeAllProxies
 from zope.app.publisher.interfaces.xmlrpc import IXMLRPCPresentation
 from zope.security.checker import ProxyFactory
 from zope.app.publication.http import BaseHTTPPublication
 
-class XMLRPCPublication(BaseHTTPPublication):
-    """XML-RPC publication handling."""
+# Don't need any special handling for xml-rpc
+XMLRPCPublication = BaseHTTPPublication
 
-    def traverseName(self, request, ob, name):
-        """Traverse the name.
-
-        The method should try the following things in this order:
-
-        1. Check whether ob is a view; if so try to find a public method
-           having the passed name.
-
-        2. If the ob is not a view, then we try to find a view for it. This
-           can be done in two ways:
-
-           (a) Look whether there is a view registered for this name.
-
-           (b) Check whether the default view has a matching method called name.
-
-        3. See whether the object has a subobject of this name. This test is
-           done last, since this is done by ZopePublication, and it knows how
-           to create all the correct error messages. No need for us to do that.
-
-        """
-        naked_ob = removeAllProxies(ob)
-
-        # Use the real view name
-        view_name = name
-        if view_name.startswith('@@'):
-            view_name = view_name[2:]
-
-        # If ob is a presentation object, then we just get the method
-        if (IXMLRPCPresentation.providedBy(naked_ob) and 
-            hasattr(ob, view_name)
-            ):
-            return ProxyFactory(getattr(ob, view_name))
-
-        # Let's check whether name could be a view 
-        view = queryView(ob, view_name, request)
-        if view is not None:
-            return ProxyFactory(view)
-
-        # Now let's see whether we have a default view with a matching method
-        # name
-        defaultName = queryDefaultViewName(ob, request)
-
-        if defaultName is not None:
-            view = queryView(ob, defaultName, request, object)
-            if hasattr(view, view_name):
-                return ProxyFactory(getattr(view, view_name))
-
-        # See whether we have a subobject
-        return super(XMLRPCPublication, self).traverseName(request, ob, name)
-
 # For now, have a factory that returns a singleton
 class XMLRPCPublicationFactory(object):
 

Added: Zope3/branches/ZopeX3-3.0/src/zope/app/publisher/xmlrpc/README.txt
===================================================================
--- Zope3/branches/ZopeX3-3.0/src/zope/app/publisher/xmlrpc/README.txt	2004-08-27 14:28:18 UTC (rev 27289)
+++ Zope3/branches/ZopeX3-3.0/src/zope/app/publisher/xmlrpc/README.txt	2004-08-27 14:28:21 UTC (rev 27290)
@@ -0,0 +1,136 @@
+XML-RPC views
+=============
+
+There are two ways to write XML-RPV views. You can write views that
+provide "methods" for other objects, and you can write views that have
+their own methods.  Let's look at the former case first, since it's a
+little bit simpler.
+
+Let's write a view that returns a folder listing:
+
+  >>> class FolderListing:
+  ...     def __init__(self, context, request):
+  ...         self.context = context
+  ...         self.request = request
+  ...
+  ...     def contents(self):
+  ...         return list(self.context.keys())
+
+Now we'll register it as a view:
+
+  >>> from zope.configuration import xmlconfig
+  >>> ignored = xmlconfig.string("""
+  ... <configure 
+  ...     xmlns="http://namespaces.zope.org/zope"
+  ...     xmlns:xmlrpc="http://namespaces.zope.org/xmlrpc"
+  ...     >
+  ...   <!-- We only need to do this include in this example, 
+  ...        Normally the include has already been done for us. -->
+  ...   <include package="zope.app.publisher.xmlrpc" file="meta.zcml" />
+  ...
+  ...   <xmlrpc:view
+  ...       for="zope.app.folder.folder.IFolder"
+  ...       methods="contents"
+  ...       class="zope.app.publisher.xmlrpc.README.FolderListing"
+  ...       permission="zope.ManageContent"
+  ...       />
+  ... </configure>
+  ... """)
+
+Now, we'll add some items to the root folder:
+
+  >>> print http(r"""
+  ... POST /++skin++Debug/@@contents.html HTTP/1.1
+  ... Authorization: Basic bWdyOm1ncnB3
+  ... Content-Length: 73
+  ... Content-Type: application/x-www-form-urlencoded
+  ... 
+  ... type_name=zope.app.browser.add.zope.app.folder.folder.Folder&new_value=f1"""
+  ... , handle_errors=False)
+  HTTP/1.1 303 See Other
+  ...
+
+  >>> print http(r"""
+  ... POST /@@contents.html HTTP/1.1
+  ... Authorization: Basic bWdyOm1ncnB3
+  ... Content-Length: 73
+  ... Content-Type: application/x-www-form-urlencoded
+  ... 
+  ... type_name=zope.app.browser.add.zope.app.folder.folder.Folder&new_value=f2""")
+  HTTP/1.1 303 See Other
+  ...
+
+And call our xmlrpc method:
+
+  >>> print http(r"""
+  ... POST / HTTP/1.0
+  ... Authorization: Basic bWdyOm1ncnB3
+  ... Content-Length: 102
+  ... Content-Type: text/xml
+  ... 
+  ... <?xml version='1.0'?>
+  ... <methodCall>
+  ... <methodName>contents</methodName>
+  ... <params>
+  ... </params>
+  ... </methodCall>
+  ... """)
+  HTTP/1.0 200 Ok
+  Content-Length: 208
+  Content-Type: text/xml;charset=utf-8
+  <BLANKLINE>
+  <?xml version='1.0'?>
+  <methodResponse>
+  <params>
+  <param>
+  <value><array><data>
+  <value><string>f1</string></value>
+  <value><string>f2</string></value>
+  </data></array></value>
+  </param>
+  </params>
+  </methodResponse>
+  <BLANKLINE>
+
+
+Note that we get an unauthorized error if we don't supply authentication
+credentials:
+
+  >>> print http(r"""
+  ... POST / HTTP/1.0
+  ... Content-Length: 102
+  ... Content-Type: text/xml
+  ... 
+  ... <?xml version='1.0'?>
+  ... <methodCall>
+  ... <methodName>contents</methodName>
+  ... <params>
+  ... </params>
+  ... </methodCall>
+  ... """)
+  HTTP/1.0 401 Unauthorized
+  Content-Length: 126
+  Content-Type: text/xml;charset=utf-8
+  Www-Authenticate: basic realm='Zope'
+  <BLANKLINE>
+  <?xml version='1.0'?>
+  <methodResponse>
+  <params>
+  <param>
+  <value><string></string></value>
+  </param>
+  </params>
+  </methodResponse>
+  <BLANKLINE>
+
+
+Now let's look at views that have their own methods.  Views that have
+their own methods have names that appear in URLs and they get
+traversed to get to their methods, as in::
+
+   .../somefolder/listing/contents
+
+To make this possible, the view has to support traversal, so that,
+when it is traversed, it traverses to it's attributes.
+
+XXX: need to finish


Property changes on: Zope3/branches/ZopeX3-3.0/src/zope/app/publisher/xmlrpc/README.txt
___________________________________________________________________
Name: svn:eol-style
   + native

Modified: Zope3/branches/ZopeX3-3.0/src/zope/app/publisher/xmlrpc/__init__.py
===================================================================
--- Zope3/branches/ZopeX3-3.0/src/zope/app/publisher/xmlrpc/__init__.py	2004-08-27 14:28:18 UTC (rev 27289)
+++ Zope3/branches/ZopeX3-3.0/src/zope/app/publisher/xmlrpc/__init__.py	2004-08-27 14:28:21 UTC (rev 27290)
@@ -28,3 +28,4 @@
     def __init__(self, context, request):
         self.context = context
         self.request = request
+

Added: Zope3/branches/ZopeX3-3.0/src/zope/app/publisher/xmlrpc/ftests.py
===================================================================
--- Zope3/branches/ZopeX3-3.0/src/zope/app/publisher/xmlrpc/ftests.py	2004-08-27 14:28:18 UTC (rev 27289)
+++ Zope3/branches/ZopeX3-3.0/src/zope/app/publisher/xmlrpc/ftests.py	2004-08-27 14:28:21 UTC (rev 27290)
@@ -0,0 +1,54 @@
+##############################################################################
+#
+# Copyright (c) 2004 Zope Corporation and Contributors.
+# All Rights Reserved.
+#
+# This software is subject to the provisions of the Zope Public License,
+# Version 2.1 (ZPL).  A copy of the ZPL should accompany this distribution.
+# THIS SOFTWARE IS PROVIDED "AS IS" AND ANY AND ALL EXPRESS OR IMPLIED
+# WARRANTIES ARE DISCLAIMED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+# WARRANTIES OF TITLE, MERCHANTABILITY, AGAINST INFRINGEMENT, AND FITNESS
+# FOR A PARTICULAR PURPOSE.
+#
+##############################################################################
+"""Functional tests for xmlrpc
+
+$Id$
+"""
+import sys
+
+# Evil hack to make pickling work with classes defined in doc tests
+class NoCopyDict(dict):
+    def copy(self):
+        return self
+
+class FakeModule:
+    def __init__(self, dict):
+        self.__dict = dict
+    def __getattr__(self, name):
+        try:
+            return self.__dict[name]
+        except KeyError:
+            raise AttributeError, name
+
+globs = NoCopyDict()
+name = 'zope.app.publisher.xmlrpc.README'
+
+
+def setUp():
+    globs['__name__'] = name    
+    sys.modules[name] = FakeModule(globs)
+
+def tearDown():
+    globs.clear()
+    del sys.modules[name]
+
+def test_suite():
+    from zope.app.tests.functional import FunctionalDocFileSuite
+    return FunctionalDocFileSuite(
+        'README.txt',
+        setUp=setUp, tearDown=tearDown, globs=globs)
+
+if __name__ == '__main__':
+    import unittest
+    unittest.main(defaultTest='test_suite')


Property changes on: Zope3/branches/ZopeX3-3.0/src/zope/app/publisher/xmlrpc/ftests.py
___________________________________________________________________
Name: svn:keywords
   + Id
Name: svn:eol-style
   + native

Modified: Zope3/branches/ZopeX3-3.0/src/zope/app/publisher/xmlrpc/meta.zcml
===================================================================
--- Zope3/branches/ZopeX3-3.0/src/zope/app/publisher/xmlrpc/meta.zcml	2004-08-27 14:28:18 UTC (rev 27289)
+++ Zope3/branches/ZopeX3-3.0/src/zope/app/publisher/xmlrpc/meta.zcml	2004-08-27 14:28:21 UTC (rev 27290)
@@ -8,10 +8,4 @@
        schema=".metadirectives.IViewDirective"
        handler=".metaconfigure.view" />
 
-  <meta:directive
-      namespace="http://namespaces.zope.org/xmlrpc"
-      name="defaultView"
-      schema=".metadirectives.IDefaultViewDirective"
-      handler=".metaconfigure.defaultView" />
-
 </configure>

Modified: Zope3/branches/ZopeX3-3.0/src/zope/app/publisher/xmlrpc/metaconfigure.py
===================================================================
--- Zope3/branches/ZopeX3-3.0/src/zope/app/publisher/xmlrpc/metaconfigure.py	2004-08-27 14:28:18 UTC (rev 27289)
+++ Zope3/branches/ZopeX3-3.0/src/zope/app/publisher/xmlrpc/metaconfigure.py	2004-08-27 14:28:21 UTC (rev 27290)
@@ -17,78 +17,108 @@
 """
 
 from zope.component.servicenames import Presentation
+from zope.configuration.exceptions import ConfigurationError
 from zope.app.component.metaconfigure import handler
-from zope.configuration.exceptions import ConfigurationError
+import zope.interface
+
 from zope.publisher.interfaces.xmlrpc import IXMLRPCRequest
 from zope.security.checker import CheckerPublic, Checker
 from zope.app.component.interface import provideInterface
 
+import zope.app.location
 
-def view(_context, name, class_=None, for_=None, layer=None,
-         permission=None, allowed_interface=None, allowed_attributes=None):
-
-    if layer is not None:
-        raise ConfigurationError("Layers are not supported for XML-RPC.")
+def view(_context, for_=None, interface=None, methods=None,
+         class_=None,  permission=None, name=None):
     
-    if name is None:
-        raise ConfigurationError("You must specify a view name.") 
-    
-    if ((allowed_attributes or allowed_interface)
-        and ((name is None) or not permission)):
-        raise ConfigurationError(
-            "Must use name attribute with allowed_interface or "
-            "allowed_attributes"
-            )
-    
-    allowed_interface = allowed_interface or []
-    allowed_attributes = allowed_attributes or []
+    interface = interface or []
+    methods = methods or []
 
     # If there were special permission settings provided, then use them
-    if permission:
-        if permission == 'zope.Public':
-            permission = CheckerPublic
-    
-        require = {}
-        for attr_name in allowed_attributes:
-            require[attr_name] = permission
-    
-        if allowed_interface:
-            for iface in allowed_interface:
-                for field_name in iface:
-                    require[field_name] = permission
-    
-        checker = Checker(require)
-    
-        def proxyView(context, request, class_=class_, checker=checker):
-            view = class_(context, request)
-            # We need this in case the resource gets unwrapped and
-            # needs to be rewrapped
-            view.__Security_checker__ = checker
-            return view
-    
-        class_ =  proxyView
+    if permission == 'zope.Public':
+        permission = CheckerPublic
 
-    # Register the new view.
-    _context.action(
-        discriminator = ('view', tuple(for_), name, IXMLRPCRequest),
-        callable = handler,
-        args = (Presentation, 'provideAdapter', IXMLRPCRequest, class_,
-                name, for_) )
+    require = {}
+    for attr_name in methods:
+        require[attr_name] = permission
 
-    # Register the used interfaces with the interface service
-    for iface in for_:
-        if iface is not None:
+    if interface:
+        for iface in interface:
+            for field_name in iface:
+                require[field_name] = permission
             _context.action(
                 discriminator = None,
                 callable = provideInterface,
-                args = ('', iface)
+                args = ('', for_)
                 )
+
+    if name:
+        # Register a single view
         
+        if permission:
+            checker = Checker(require)
 
-def defaultView(_context, name, for_=None):
-    """Declare the view having the passed name as the default view."""
-    _context.action(
-        discriminator = ('defaultViewName', for_, IXMLRPCRequest, name),
-        callable = handler,
-        args = (Presentation, 'setDefaultViewName', for_, IXMLRPCRequest, name)
-        )
+            def proxyView(context, request, class_=class_, checker=checker):
+                view = class_(context, request)
+                # We need this in case the resource gets unwrapped and
+                # needs to be rewrapped
+                view.__Security_checker__ = checker
+                return view
+
+            class_ =  proxyView
+
+        # Register the new view.
+        _context.action(
+            discriminator = ('view', for_, name, IXMLRPCRequest),
+            callable = handler,
+            args = (Presentation, 'provideAdapter', IXMLRPCRequest, class_,
+                    name, (for_, )) )
+    else:
+        if permission:
+            checker = Checker({'__call__': permission})
+        else:
+            checker = None
+            
+        for name in require:
+            _context.action(
+                discriminator = ('view', for_, name, IXMLRPCRequest),
+                callable = handler,
+                args = (Presentation, 'provideAdapter', IXMLRPCRequest,
+                        MethodFactory(class_, name, checker),
+                        name, (for_, )) )
+
+    # Register the used interfaces with the interface service
+    if for_ is not None:
+        _context.action(
+            discriminator = None,
+            callable = provideInterface,
+            args = ('', for_)
+            )
+        
+
+
+class MethodFactory:
+
+    def __init__(self, cls, name, checker):
+        self.cls, self.name, self.checker = cls, name, checker
+
+    def __call__(self, context, request):
+        ob = self.cls(context, request)
+        ob = getattr(ob, self.name)
+        if self.checker is not None:
+            ob = ProtectedMethod(ob, self.checker)
+        return ob
+
+
+class ProtectedMethod:
+
+    zope.interface.implements(zope.app.location.ILocation)
+
+    __parent__ = __name__ = None
+
+    def __init__(self, ob, checker):
+        self.ob = ob
+        self.__Security_checker__ = checker
+
+    def __call__(self, *args):
+        return self.ob(*args)
+    

Modified: Zope3/branches/ZopeX3-3.0/src/zope/app/publisher/xmlrpc/metadirectives.py
===================================================================
--- Zope3/branches/ZopeX3-3.0/src/zope/app/publisher/xmlrpc/metadirectives.py	2004-08-27 14:28:18 UTC (rev 27289)
+++ Zope3/branches/ZopeX3-3.0/src/zope/app/publisher/xmlrpc/metadirectives.py	2004-08-27 14:28:21 UTC (rev 27290)
@@ -15,42 +15,73 @@
 
 $Id$
 """
-from zope.app.component.metadirectives import IBasicViewInformation
-from zope.configuration.fields import GlobalObject
-from zope.interface import Interface
-from zope.schema import TextLine
+import zope.configuration.fields
+import zope.interface
+import zope.schema
 
-class IViewDirective(IBasicViewInformation):
+import zope.app.security.fields
+
+class IViewDirective(zope.interface.Interface):
     """View Directive for XML-RPC methods."""
+    
+    for_ = zope.configuration.fields.GlobalObject(
+        title=u"Published Object Type",
+        description=u"""The types of objects to be published via XML-RPC
 
-    name = TextLine(
-        title=u"The name of the view.",
-        description=u"The name shows up in URLs/paths. For example 'foo'.",
-        required=False)
+        This can be expressed with either a class or an interface
+        """,
+        required=True,
+        )
 
+    interface = zope.configuration.fields.Tokens(
+        title=u"Interface to be published.",
+        required=False,
+        value_type=zope.configuration.fields.GlobalObject()
+        )
 
-class IDefaultViewDirective(Interface):
-    """
-    The name of the view that should be the default.
-              
-    This name refers to view that should be the
-    view used by default (if no view name is supplied
-    explicitly).
-    """
-
-    name = TextLine(
-        title=u"The name of the view that should be the default.",
-        description=u"""
-        This name refers to view that should be the view used by
-        default (if no view name is supplied explicitly).""",
-        required=True
+    methods = zope.configuration.fields.Tokens(
+        title=u"Methods (or attributes) to be published",
+        required=False,
+        value_type=zope.configuration.fields.PythonIdentifier()
         )
 
-    for_ = GlobalObject(
-        title=u"The interface this view is the default for.",
-        description=u"""Specifies the interface for which the view is
-        registered. All objects implementing this interface can make use of
-        this view. If this attribute is not specified, the view is available
-        for all objects.""",
+    class_ = zope.configuration.fields.GlobalObject(
+        title=u"Class",
+        description=u"A class that provides attributes used by the view.",
         required=False
         )
+
+    permission = zope.app.security.fields.Permission(
+        title=u"Permission",
+        description=u"""The permission needed to use the view.
+
+        If this option is used and a name is given for the view, then
+        the names defined by the given methods or interfaces will be
+        under the given permission.
+
+        If a name is not given for the view, then, this option is
+        required and the the given permission is required to call the
+        individual views defined by the given interface and methods.
+
+        (See the name attribute.)
+
+        If no permission is given, then permissions should be declared
+        for the view using other means, such as the class directive.
+        """,
+        required=False, )
+
+    name = zope.schema.TextLine(
+        title=u"The name of the view.",
+        description=u"""
+        
+        If a name is given, then rpc methods are accessed by
+        traversing the name and then accessing the methods.  In this
+        case, the class should implement
+        zope.pubisher.interfaces.IPublishTraverse.
+
+        If no name is provided, then the names given by the attributes
+        and interfaces are published directly as callable views.
+
+        """,
+        required=False,
+        )

Added: Zope3/branches/ZopeX3-3.0/src/zope/app/publisher/xmlrpc/t
===================================================================
--- Zope3/branches/ZopeX3-3.0/src/zope/app/publisher/xmlrpc/t	2004-08-27 14:28:18 UTC (rev 27289)
+++ Zope3/branches/ZopeX3-3.0/src/zope/app/publisher/xmlrpc/t	2004-08-27 14:28:21 UTC (rev 27290)
@@ -0,0 +1,3597 @@
+
+
+  >>> print http(r"""
+  ... GET /manage HTTP/1.1
+  ... Authorization: Basic Z2xvYmFsbWdyOmdsb2JhbG1ncnB3
+  ... """)
+  HTTP/1.1 303 See Other
+  Connection: close
+  Content-Length: 0
+  Content-Type: text/plain;charset=utf-8
+  Location: @@contents.html
+  <BLANKLINE>
+
+
+  >>> print http(r"""
+  ... GET /@@contents.html HTTP/1.1
+  ... Authorization: Basic Z2xvYmFsbWdyOmdsb2JhbG1ncnB3
+  ... """)
+  HTTP/1.1 200 Ok
+  Connection: close
+  Content-Length: 6948
+  Content-Type: text/html;charset=utf-8
+  <BLANKLINE>
+  <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+  <BLANKLINE>
+  <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en"
+        lang="en">
+  <BLANKLINE>
+    <head>
+      <title>Z3: </title>
+  <BLANKLINE>
+      <style type="text/css" media="all">@import url(http://localhost:8081/@@/zope3.css);</style>
+  <BLANKLINE>
+  <BLANKLINE>
+  <BLANKLINE>
+      <meta http-equiv="Content-Type" content="text/html;charset=utf-8" />
+  <BLANKLINE>
+  <BLANKLINE>
+  <BLANKLINE>
+  <BLANKLINE>
+  <BLANKLINE>
+      <!-- Popup script for the OnlineHelp -->
+      <script type="text/javascript"
+              src="http://localhost:8081/@@/onlinehelp.js">
+      </script>
+  <BLANKLINE>
+  <BLANKLINE>
+      <!-- Ugly is better than lobotomized. -->
+      <script type="text/javascript"
+              src="http://localhost:8081/@@/xmltree.js">
+      </script>
+  <BLANKLINE>
+  <BLANKLINE>
+  <BLANKLINE>
+  <BLANKLINE>
+  <BLANKLINE>
+      <link rel="icon" type="image/png"
+            href="http://localhost:8081/@@/favicon.png" />
+    </head>
+  <BLANKLINE>
+    <body onload="loadtree('http://localhost:8081/', 'http://localhost:8081/')">
+  <BLANKLINE>
+  <BLANKLINE>
+      <div id="global">
+        <div id="userDetails">
+  <BLANKLINE>
+            User:
+            Sample Manager
+  <BLANKLINE>
+  <BLANKLINE>
+  <BLANKLINE>
+            <a href="@@logout.html?nextURL=http%3A//localhost%3A8081/%40%40contents.html">[Logout]</a>
+  <BLANKLINE>
+  <BLANKLINE>
+  <BLANKLINE>
+        </div>
+        <img src="http://localhost:8081/@@/zope3logo.gif" />
+      </div>
+  <BLANKLINE>
+  <BLANKLINE>
+  <BLANKLINE>
+  <BLANKLINE>
+      <div id="navigators">
+  <BLANKLINE>
+        <!-- Navigation tree box -->
+  <BLANKLINE>
+      <!-- Ugly is better than lobotomized. -->
+        <div class="box" id="navigationTree">
+          <h4>Navigation</h4>
+          <div xmlns="http://www.zope.org/zope3xmltree"
+               id="navtreecontents" class="body"
+               onclick="treeclicked(event);">Loading...</div>
+        </div>
+  <BLANKLINE>
+  <BLANKLINE>
+  <BLANKLINE>
+  <BLANKLINE>
+          <div class="box" id="commonTasks">
+  <BLANKLINE>
+  <BLANKLINE>
+            <h4>Add:</h4>
+            <div class="body">
+  <BLANKLINE>
+  <BLANKLINE>
+  <BLANKLINE>
+      <div class="content even">
+  <BLANKLINE>
+  <BLANKLINE>
+        <a href="http://localhost:8081/@@+/action.html?type_name=zope.app.dtmlpage.DTMLPage"
+           class="">DTML Page</a>
+  <BLANKLINE>
+  <BLANKLINE>
+      </div>
+  <BLANKLINE>
+  <BLANKLINE>
+      <div class="content odd">
+  <BLANKLINE>
+  <BLANKLINE>
+        <a href="http://localhost:8081/@@+/action.html?type_name=zope.app.file.File"
+           class="">File</a>
+  <BLANKLINE>
+  <BLANKLINE>
+      </div>
+  <BLANKLINE>
+  <BLANKLINE>
+      <div class="content even">
+        <a href="http://localhost:8081/@@contents.html?type_name=zope.app.browser.add.zope.app.folder.folder.Folder"
+           class="">Folder</a>
+  <BLANKLINE>
+  <BLANKLINE>
+  <BLANKLINE>
+  <BLANKLINE>
+      </div>
+  <BLANKLINE>
+  <BLANKLINE>
+      <div class="content odd">
+        <a href="http://localhost:8081/@@contents.html?type_name=zope.app.browser.add.zope.app.i18nfile.i18nfile.I18nFile"
+           class="">I18n File</a>
+  <BLANKLINE>
+  <BLANKLINE>
+  <BLANKLINE>
+  <BLANKLINE>
+      </div>
+  <BLANKLINE>
+  <BLANKLINE>
+      <div class="content even">
+        <a href="http://localhost:8081/@@contents.html?type_name=zope.app.browser.add.zope.app.i18nfile.i18nimage.I18nImage"
+           class="">I18n Image</a>
+  <BLANKLINE>
+  <BLANKLINE>
+  <BLANKLINE>
+  <BLANKLINE>
+      </div>
+  <BLANKLINE>
+  <BLANKLINE>
+      <div class="content odd">
+  <BLANKLINE>
+  <BLANKLINE>
+        <a href="http://localhost:8081/@@+/action.html?type_name=zope.app.file.Image"
+           class="">Image</a>
+  <BLANKLINE>
+  <BLANKLINE>
+      </div>
+  <BLANKLINE>
+  <BLANKLINE>
+      <div class="content even">
+  <BLANKLINE>
+  <BLANKLINE>
+        <a href="http://localhost:8081/@@+/action.html?type_name=zope.app.sqlscript.SQLScript"
+           class="">SQL Script</a>
+  <BLANKLINE>
+  <BLANKLINE>
+      </div>
+  <BLANKLINE>
+  <BLANKLINE>
+      <div class="content odd">
+  <BLANKLINE>
+  <BLANKLINE>
+        <a href="http://localhost:8081/@@+/action.html?type_name=zope.app.zptpage.ZPTPage"
+           class="">ZPT Page</a>
+  <BLANKLINE>
+  <BLANKLINE>
+      </div>
+  <BLANKLINE>
+  <BLANKLINE>
+  <BLANKLINE>
+            </div>
+          </div>
+  <BLANKLINE>
+  <BLANKLINE>
+        <!-- Tree of the help topics that appears on the help namespace -->
+  <BLANKLINE>
+  <BLANKLINE>
+      </div>
+  <BLANKLINE>
+  <BLANKLINE>
+      <div id="workspace">
+  <BLANKLINE>
+  <BLANKLINE>
+        <div id="breadcrumbs"> Location:&nbsp;<a
+      href="http://localhost:8081/@@SelectedManagementView.html">[top]</a>
+             /
+        </div>
+  <BLANKLINE>
+  <BLANKLINE>
+  <BLANKLINE>
+        <div class="itemViews">
+  <BLANKLINE>
+            <a href="@@contents.html" class="selected">Contents</a>
+  <BLANKLINE>
+  <BLANKLINE>
+            <a href="@@preview.html" class="">Preview</a>
+  <BLANKLINE>
+  <BLANKLINE>
+            <a href="@@EditMetaData.html" class="">Metadata</a>
+  <BLANKLINE>
+  <BLANKLINE>
+            <a href="@@classBrowser.html" class="">Introspector</a>
+  <BLANKLINE>
+        </div>
+  <BLANKLINE>
+        <!-- OnlineHelp with popup support -->
+        <!-- note, we reverse the actions list 'cos they're packed to the
+             screen from the right -->
+        <div id="actions">
+  <BLANKLINE>
+  <BLANKLINE>
+            <a href="javascript:popup('contents.html/++help++/@@contexthelp.html','OnlineHelp','height=400
+                                             ,width=700
+                                             ,resizable=1
+                                             ,scrollbars=yes
+                                             ,location=no
+                                             ,status=no
+                                             ,toolbar=no
+                                             ,menubar=no')">Help</a>
+  <BLANKLINE>
+  <BLANKLINE>
+            <a href="@@undoAll.html">Undo all</a>
+            <a href="@@undoMore.html">Undo more</a>
+            <a href="@@undo.html">Undo!</a>
+            <a href="@@errorRedirect.html">Errors</a>
+            <a href="@@grant.html">Grant</a>
+            <a href="@@+">Add</a>
+            <a href="@@find.html">Find</a>
+            <a href="++etc++process/index.html">Manage Process</a>
+            <a href="++etc++site/@@SelectedManagementView.html">Manage Site</a>
+  <BLANKLINE>
+          &nbsp;
+        </div>
+  <BLANKLINE>
+  <BLANKLINE>
+        <div id="viewspace">
+  <BLANKLINE>
+          <div id="message">
+          </div>
+  <BLANKLINE>
+          <div id="content">
+            <div>
+    <div>
+  <BLANKLINE>
+      <form name="containerContentsForm" method="POST"
+            action="http://localhost:8081/@@contents.html">
+  <BLANKLINE>
+  <BLANKLINE>
+  <BLANKLINE>
+  <BLANKLINE>
+  <BLANKLINE>
+  <BLANKLINE>
+        <table id="sortable" class="listing"
+               summary="Content listing">
+  <BLANKLINE>
+          <thead>
+            <tr>
+              <th>&nbsp;</th>
+              <th>Name</th>
+              <th>Title</th>
+              <th>Size</th>
+              <th>Created</th>
+              <th>Modified</th>
+            </tr>
+          </thead>
+  <BLANKLINE>
+          <tbody>
+  <BLANKLINE>
+  <BLANKLINE>
+  <BLANKLINE>
+  <BLANKLINE>
+          </tbody>
+        </table>
+  <BLANKLINE>
+        <div>
+  <BLANKLINE>
+  <BLANKLINE>
+  <BLANKLINE>
+  <BLANKLINE>
+  <BLANKLINE>
+  <BLANKLINE>
+  <BLANKLINE>
+  <BLANKLINE>
+  <BLANKLINE>
+  <BLANKLINE>
+        </div>
+  <BLANKLINE>
+  <BLANKLINE>
+  <BLANKLINE>
+      </form>
+  <BLANKLINE>
+      <script><!--
+          prettydump('focus', LG_INFO);
+          if (document.containerContentsForm.new_value)
+  	        document.containerContentsForm.new_value.focus();
+          //-->
+      </script>
+  <BLANKLINE>
+    </div>
+  <BLANKLINE>
+  </div>
+          </div>
+  <BLANKLINE>
+  <BLANKLINE>
+          <div id="context_information">
+  <BLANKLINE>
+            <div id="helpers">
+  <BLANKLINE>
+  <BLANKLINE>
+  <BLANKLINE>
+  <BLANKLINE>
+            </div>
+  <BLANKLINE>
+  <!--
+            <div id="inspectors">
+  <BLANKLINE>
+              <div class="box" id="metadata"
+                  tal:define="view context/@@MetaDataBox|nothing"
+                  tal:condition="view/strip|nothing">
+  <BLANKLINE>
+                <h4 i18n:translate="">Metadata</h4>
+  <BLANKLINE>
+                <div class="body">
+  <BLANKLINE>
+                  <div class="content" tal:content="structure view">
+                    Some metadata
+                  </div>
+  <BLANKLINE>
+                </div>
+              </div>
+            </div>
+  -->
+  <BLANKLINE>
+          </div>
+  <BLANKLINE>
+          <div class="spacer">
+            &nbsp;
+          </div>
+  <BLANKLINE>
+        </div>
+      </div>
+  <BLANKLINE>
+      <div id="footer" />
+  <BLANKLINE>
+      <div id="logger" />
+  <BLANKLINE>
+    </body>
+  <BLANKLINE>
+  </html>
+  <BLANKLINE>
+  <BLANKLINE>
+  <BLANKLINE>
+
+
+  >>> print http(r"""
+  ... GET /++etc++site/@@manage HTTP/1.1
+  ... Authorization: Basic Z2xvYmFsbWdyOmdsb2JhbG1ncnB3
+  ... Referer: http://localhost:8081/@@contents.html
+  ... """)
+  HTTP/1.1 303 See Other
+  Connection: close
+  Content-Length: 0
+  Content-Type: text/plain;charset=utf-8
+  Location: @@tasks.html
+  <BLANKLINE>
+
+
+  >>> print http(r"""
+  ... GET /++etc++site/@@tasks.html HTTP/1.1
+  ... Authorization: Basic Z2xvYmFsbWdyOmdsb2JhbG1ncnB3
+  ... Referer: http://localhost:8081/@@contents.html
+  ... """)
+  HTTP/1.1 200 Ok
+  Connection: close
+  Content-Length: 7224
+  Content-Type: text/html;charset=utf-8
+  <BLANKLINE>
+  <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+  <BLANKLINE>
+  <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en"
+        lang="en">
+  <BLANKLINE>
+    <head>
+      <title>Z3: ++etc++site</title>
+  <BLANKLINE>
+      <style type="text/css" media="all">@import url(http://localhost:8081/@@/zope3.css);</style>
+  <BLANKLINE>
+      <style type="text/css" media="all">@import url(http://localhost:8081/@@/site_management.css);</style>
+  <BLANKLINE>
+      <meta http-equiv="Content-Type" content="text/html;charset=utf-8" />
+  <BLANKLINE>
+  <BLANKLINE>
+  <BLANKLINE>
+  <BLANKLINE>
+  <BLANKLINE>
+      <!-- Popup script for the OnlineHelp -->
+      <script type="text/javascript"
+              src="http://localhost:8081/@@/onlinehelp.js">
+      </script>
+  <BLANKLINE>
+  <BLANKLINE>
+      <!-- Ugly is better than lobotomized. -->
+      <script type="text/javascript"
+              src="http://localhost:8081/@@/xmltree.js">
+      </script>
+  <BLANKLINE>
+  <BLANKLINE>
+  <BLANKLINE>
+  <BLANKLINE>
+  <BLANKLINE>
+      <link rel="icon" type="image/png"
+            href="http://localhost:8081/@@/favicon.png" />
+    </head>
+  <BLANKLINE>
+    <body onload="loadtree('http://localhost:8081/', 'http://localhost:8081/++etc++site/')">
+  <BLANKLINE>
+  <BLANKLINE>
+      <div id="global">
+        <div id="userDetails">
+  <BLANKLINE>
+            User:
+            Sample Manager
+  <BLANKLINE>
+  <BLANKLINE>
+  <BLANKLINE>
+            <a href="@@logout.html?nextURL=http%3A//localhost%3A8081/%2B%2Betc%2B%2Bsite/%40%40tasks.html">[Logout]</a>
+  <BLANKLINE>
+  <BLANKLINE>
+  <BLANKLINE>
+        </div>
+        <img src="http://localhost:8081/@@/zope3logo.gif" />
+      </div>
+  <BLANKLINE>
+  <BLANKLINE>
+  <BLANKLINE>
+  <BLANKLINE>
+      <div id="navigators">
+  <BLANKLINE>
+        <!-- Navigation tree box -->
+  <BLANKLINE>
+      <!-- Ugly is better than lobotomized. -->
+        <div class="box" id="navigationTree">
+          <h4>Navigation</h4>
+          <div xmlns="http://www.zope.org/zope3xmltree"
+               id="navtreecontents" class="body"
+               onclick="treeclicked(event);">Loading...</div>
+        </div>
+  <BLANKLINE>
+  <BLANKLINE>
+  <BLANKLINE>
+  <BLANKLINE>
+          <div class="box" id="commonTasks">
+  <BLANKLINE>
+  <BLANKLINE>
+            <h4>Add:</h4>
+            <div class="body">
+  <BLANKLINE>
+  <BLANKLINE>
+  <BLANKLINE>
+      <div class="content even">
+        <a href="http://localhost:8081/++etc++site/@@contents.html?type_name=zope.app.browser.add.zope.app.site.folder.SiteManagementFolder"
+           class="">Site-Management Folder</a>
+  <BLANKLINE>
+  <BLANKLINE>
+  <BLANKLINE>
+  <BLANKLINE>
+      </div>
+  <BLANKLINE>
+  <BLANKLINE>
+  <BLANKLINE>
+            </div>
+          </div>
+  <BLANKLINE>
+  <BLANKLINE>
+        <!-- Tree of the help topics that appears on the help namespace -->
+  <BLANKLINE>
+  <BLANKLINE>
+      </div>
+  <BLANKLINE>
+  <BLANKLINE>
+      <div id="workspace">
+  <BLANKLINE>
+  <BLANKLINE>
+        <div id="breadcrumbs"> Location:&nbsp;<a
+      href="http://localhost:8081/@@SelectedManagementView.html">[top]</a>
+             /
+            <a href="http://localhost:8081/++etc++site/@@SelectedManagementView.html">++etc++site</a> /
+        </div>
+  <BLANKLINE>
+  <BLANKLINE>
+  <BLANKLINE>
+        <div class="itemViews">
+  <BLANKLINE>
+            <a href="@@tasks.html" class="selected">Tasks</a>
+  <BLANKLINE>
+  <BLANKLINE>
+            <a href="@@services.html" class="">Services</a>
+  <BLANKLINE>
+  <BLANKLINE>
+            <a href="@@interfacebrowse.html" class="">Interface Browse</a>
+  <BLANKLINE>
+  <BLANKLINE>
+            <a href="@@contents.html" class="">Software</a>
+  <BLANKLINE>
+  <BLANKLINE>
+            <a href="@@tools.html" class="">Tools</a>
+  <BLANKLINE>
+  <BLANKLINE>
+            <a href="@@EditMetaData.html" class="">Metadata</a>
+  <BLANKLINE>
+  <BLANKLINE>
+            <a href="@@classBrowser.html" class="">Introspector</a>
+  <BLANKLINE>
+        </div>
+  <BLANKLINE>
+        <!-- OnlineHelp with popup support -->
+        <!-- note, we reverse the actions list 'cos they're packed to the
+             screen from the right -->
+        <div id="actions">
+  <BLANKLINE>
+  <BLANKLINE>
+            <a href="javascript:popup('tasks.html/++help++/@@contexthelp.html','OnlineHelp','height=400
+                                             ,width=700
+                                             ,resizable=1
+                                             ,scrollbars=yes
+                                             ,location=no
+                                             ,status=no
+                                             ,toolbar=no
+                                             ,menubar=no')">Help</a>
+  <BLANKLINE>
+  <BLANKLINE>
+            <a href="@@undoAll.html">Undo all</a>
+            <a href="@@undoMore.html">Undo more</a>
+            <a href="@@undo.html">Undo!</a>
+            <a href="@@errorRedirect.html">Errors</a>
+            <a href="@@find.html">Find</a>
+            <a href="@@grant.html">Grant</a>
+            <a href="@@+">Add Site Management Folder</a>
+            <a href="default/AddService">Add service</a>
+            <a href="default/@@SelectedManagementView.html">Visit default folder</a>
+  <BLANKLINE>
+          &nbsp;
+        </div>
+  <BLANKLINE>
+  <BLANKLINE>
+        <div id="viewspace">
+  <BLANKLINE>
+          <div id="message">
+          </div>
+  <BLANKLINE>
+          <div id="content">
+            <div>
+  <BLANKLINE>
+    <h2>
+      Common Site Management Tasks
+    </h2>
+  <BLANKLINE>
+    <p>
+      The site management interface allows you to setup and configure
+      software for this site.
+    </p>
+  <BLANKLINE>
+    <dl>
+      <dt>Tools:</dt>
+      <dd>
+  <BLANKLINE>
+  <BLANKLINE>
+          Tools consist of Services and Utilities. Services register
+          themselves with the Service Service while utilities register
+          themselves with the Utility Service. They perform tasks like
+          error logging, translation, authentication and so on. You may
+          configure the services and utilities already present in this
+          site or provide new serivces and utilities (which may override
+          existing tools).
+  <BLANKLINE>
+  <BLANKLINE>
+        <ul>
+          <li>
+            <a href="@@tools.html">
+              Tools Management
+            </a>
+          </li>
+          <li>
+            <a href="@@services.html">
+              Services Overview
+            </a>
+          </li>
+  <BLANKLINE>
+          <li>
+            <a href="default/Utilities/@@utilities.html">
+              Utilities Overview (<b>default</b> Site Manager)
+            </a>
+          </li>
+        </ul>
+      </dd>
+  <BLANKLINE>
+      <dt>Software:</dt>
+  <BLANKLINE>
+      <dd>
+  <BLANKLINE>
+          The site may customize the behavior of existing software or
+          define its own. The first step in creating a new software
+          package is to create a new Site Management Folder to contain
+          the software.
+  <BLANKLINE>
+  <BLANKLINE>
+        <ul>
+          <li>
+            <a href="@@contents.html">
+              Customize the behavior of existing software
+            </a>
+          </li>
+  <BLANKLINE>
+          <li>
+            <a href="@@+">
+              Create a new Site Management Folder
+            </a>
+          </li>
+        </ul>
+      </dd>
+  <BLANKLINE>
+      <!-- When software bundles are more than a wiki page, revisit this.
+       <dt>
+         <tal:text i18n:translate="label-software-bundles">
+           Software Bundles
+         </tal:text>:
+       </dt>
+       <dd i18n:translate="">
+        Installing,
+        Removing,
+        etc.
+       </dd>
+      -->
+  <BLANKLINE>
+  </dl></div>
+          </div>
+  <BLANKLINE>
+  <BLANKLINE>
+          <div id="context_information">
+  <BLANKLINE>
+            <div id="helpers">
+  <BLANKLINE>
+  <BLANKLINE>
+  <BLANKLINE>
+  <BLANKLINE>
+            </div>
+  <BLANKLINE>
+  <!--
+            <div id="inspectors">
+  <BLANKLINE>
+              <div class="box" id="metadata"
+                  tal:define="view context/@@MetaDataBox|nothing"
+                  tal:condition="view/strip|nothing">
+  <BLANKLINE>
+                <h4 i18n:translate="">Metadata</h4>
+  <BLANKLINE>
+                <div class="body">
+  <BLANKLINE>
+                  <div class="content" tal:content="structure view">
+                    Some metadata
+                  </div>
+  <BLANKLINE>
+                </div>
+              </div>
+            </div>
+  -->
+  <BLANKLINE>
+          </div>
+  <BLANKLINE>
+          <div class="spacer">
+            &nbsp;
+          </div>
+  <BLANKLINE>
+        </div>
+      </div>
+  <BLANKLINE>
+      <div id="footer" />
+  <BLANKLINE>
+      <div id="logger" />
+  <BLANKLINE>
+    </body>
+  <BLANKLINE>
+  </html>
+  <BLANKLINE>
+  <BLANKLINE>
+  <BLANKLINE>
+
+
+  >>> print http(r"""
+  ... GET /++etc++site/default/AddService HTTP/1.1
+  ... Authorization: Basic Z2xvYmFsbWdyOmdsb2JhbG1ncnB3
+  ... Referer: http://localhost:8081/++etc++site/@@tasks.html
+  ... """)
+  HTTP/1.1 200 Ok
+  Connection: close
+  Content-Length: 7153
+  Content-Type: text/html;charset=utf-8
+  <BLANKLINE>
+  <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+  <BLANKLINE>
+  <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en"
+        lang="en">
+  <BLANKLINE>
+    <head>
+  <base href="http://localhost:8081/++etc++site/default/AddService/index.html" />
+  <BLANKLINE>
+      <title>Z3: default</title>
+  <BLANKLINE>
+      <style type="text/css" media="all">@import url(http://localhost:8081/@@/zope3.css);</style>
+  <BLANKLINE>
+      <style type="text/css" media="all">@import url(http://localhost:8081/@@/site_management.css);</style>
+  <BLANKLINE>
+      <meta http-equiv="Content-Type" content="text/html;charset=utf-8" />
+  <BLANKLINE>
+  <BLANKLINE>
+  <BLANKLINE>
+  <BLANKLINE>
+  <BLANKLINE>
+      <!-- Popup script for the OnlineHelp -->
+      <script type="text/javascript"
+              src="http://localhost:8081/@@/onlinehelp.js">
+      </script>
+  <BLANKLINE>
+  <BLANKLINE>
+      <!-- Ugly is better than lobotomized. -->
+      <script type="text/javascript"
+              src="http://localhost:8081/@@/xmltree.js">
+      </script>
+  <BLANKLINE>
+  <BLANKLINE>
+  <BLANKLINE>
+  <BLANKLINE>
+  <BLANKLINE>
+      <link rel="icon" type="image/png"
+            href="http://localhost:8081/@@/favicon.png" />
+    </head>
+  <BLANKLINE>
+    <body onload="loadtree('http://localhost:8081/', 'http://localhost:8081/++etc++site/default/AddService/')">
+  <BLANKLINE>
+  <BLANKLINE>
+      <div id="global">
+        <div id="userDetails">
+  <BLANKLINE>
+            User:
+            Sample Manager
+  <BLANKLINE>
+  <BLANKLINE>
+  <BLANKLINE>
+            <a href="@@logout.html?nextURL=http%3A//localhost%3A8081/%2B%2Betc%2B%2Bsite/default/AddService/index.html">[Logout]</a>
+  <BLANKLINE>
+  <BLANKLINE>
+  <BLANKLINE>
+        </div>
+        <img src="http://localhost:8081/@@/zope3logo.gif" />
+      </div>
+  <BLANKLINE>
+  <BLANKLINE>
+  <BLANKLINE>
+  <BLANKLINE>
+      <div id="navigators">
+  <BLANKLINE>
+        <!-- Navigation tree box -->
+  <BLANKLINE>
+      <!-- Ugly is better than lobotomized. -->
+        <div class="box" id="navigationTree">
+          <h4>Navigation</h4>
+          <div xmlns="http://www.zope.org/zope3xmltree"
+               id="navtreecontents" class="body"
+               onclick="treeclicked(event);">Loading...</div>
+        </div>
+  <BLANKLINE>
+  <BLANKLINE>
+  <BLANKLINE>
+  <BLANKLINE>
+        <!-- Tree of the help topics that appears on the help namespace -->
+  <BLANKLINE>
+  <BLANKLINE>
+      </div>
+  <BLANKLINE>
+  <BLANKLINE>
+      <div id="workspace">
+  <BLANKLINE>
+  <BLANKLINE>
+        <div id="breadcrumbs"> Location:&nbsp;<a
+      href="http://localhost:8081/@@SelectedManagementView.html">[top]</a>
+             /
+            <a href="http://localhost:8081/++etc++site/@@SelectedManagementView.html">++etc++site</a> /
+            <a href="http://localhost:8081/++etc++site/default/@@SelectedManagementView.html">default</a> /
+        </div>
+  <BLANKLINE>
+  <BLANKLINE>
+  <BLANKLINE>
+  <BLANKLINE>
+  <BLANKLINE>
+        <!-- OnlineHelp with popup support -->
+        <!-- note, we reverse the actions list 'cos they're packed to the
+             screen from the right -->
+  <BLANKLINE>
+  <BLANKLINE>
+  <BLANKLINE>
+        <div id="viewspace">
+  <BLANKLINE>
+          <div id="message">
+          </div>
+  <BLANKLINE>
+          <div id="content">
+            <div>
+  <BLANKLINE>
+    <form method="post" action="action.html">
+      <table class="TypeListing" cellpadding="3">
+  <BLANKLINE>
+        <caption>Add Service</caption>
+  <BLANKLINE>
+        <tbody>
+  <BLANKLINE>
+          <tr>
+  <BLANKLINE>
+            <td class="Selector">
+              <input type="radio" name="type_name"
+                     id="zope.app.browser.add.zope.app.adapter.adapter.LocalAdapterService"
+                     value="zope.app.browser.add.zope.app.adapter.adapter.LocalAdapterService" />
+            </td>
+  <BLANKLINE>
+            <td class="TypeName">
+              <label style="font-weight: bold;"
+                     for="zope.app.browser.add.zope.app.adapter.adapter.LocalAdapterService">
+                Adapter Service
+              </label>
+              <div class="TypeDescription">Allows the registration of Adapters in this site</div>
+            </td>
+          </tr>
+          <tr>
+  <BLANKLINE>
+            <td class="Selector">
+              <input type="radio" name="type_name"
+                     id="zope.app.browser.add.zope.app.pluggableauth.PluggableAuthenticationService"
+                     value="zope.app.browser.add.zope.app.pluggableauth.PluggableAuthenticationService" />
+            </td>
+  <BLANKLINE>
+            <td class="TypeName">
+              <label style="font-weight: bold;"
+                     for="zope.app.browser.add.zope.app.pluggableauth.PluggableAuthenticationService">
+                Authentication Service
+              </label>
+              <div class="TypeDescription">A Pluggable Authentication uses plug-in principal sources.</div>
+            </td>
+          </tr>
+          <tr>
+  <BLANKLINE>
+            <td class="Selector">
+              <input type="radio" name="type_name"
+                     id="zope.app.browser.add.zope.app.errorservice.ErrorReportingService"
+                     value="zope.app.browser.add.zope.app.errorservice.ErrorReportingService" />
+            </td>
+  <BLANKLINE>
+            <td class="TypeName">
+              <label style="font-weight: bold;"
+                     for="zope.app.browser.add.zope.app.errorservice.ErrorReportingService">
+                Error Logging Service
+              </label>
+              <div class="TypeDescription">Error Reporting Service for Logging Errors</div>
+            </td>
+          </tr>
+          <tr>
+  <BLANKLINE>
+            <td class="Selector">
+              <input type="radio" name="type_name"
+                     id="zope.app.browser.add.zope.app.principalannotation.PrincipalAnnotationService"
+                     value="zope.app.browser.add.zope.app.principalannotation.PrincipalAnnotationService" />
+            </td>
+  <BLANKLINE>
+            <td class="TypeName">
+              <label style="font-weight: bold;"
+                     for="zope.app.browser.add.zope.app.principalannotation.PrincipalAnnotationService">
+                Principal Annotation Service
+              </label>
+              <div class="TypeDescription">Stores Annotations for Principals</div>
+            </td>
+          </tr>
+          <tr>
+  <BLANKLINE>
+            <td class="Selector">
+              <input type="radio" name="type_name"
+                     id="zope.app.browser.add.zope.app.utility.utility.LocalUtilityService"
+                     value="zope.app.browser.add.zope.app.utility.utility.LocalUtilityService" />
+            </td>
+  <BLANKLINE>
+            <td class="TypeName">
+              <label style="font-weight: bold;"
+                     for="zope.app.browser.add.zope.app.utility.utility.LocalUtilityService">
+                Utility Service
+              </label>
+              <div class="TypeDescription">A Local Utility Service allows you to register Utilities in this site</div>
+            </td>
+          </tr>
+  <BLANKLINE>
+        <tr>
+          <td><br /></td>
+          <td><input type="text" name="id" />
+              <input type="submit" name="add" value=" Add " />
+          </td>
+        </tr>
+  <BLANKLINE>
+        </tbody>
+  <BLANKLINE>
+      </table>
+  <BLANKLINE>
+    </form>
+  <BLANKLINE>
+  </div>
+          </div>
+  <BLANKLINE>
+  <BLANKLINE>
+          <div id="context_information">
+  <BLANKLINE>
+            <div id="helpers">
+  <BLANKLINE>
+  <BLANKLINE>
+  <BLANKLINE>
+  <BLANKLINE>
+            </div>
+  <BLANKLINE>
+  <!--
+            <div id="inspectors">
+  <BLANKLINE>
+              <div class="box" id="metadata"
+                  tal:define="view context/@@MetaDataBox|nothing"
+                  tal:condition="view/strip|nothing">
+  <BLANKLINE>
+                <h4 i18n:translate="">Metadata</h4>
+  <BLANKLINE>
+                <div class="body">
+  <BLANKLINE>
+                  <div class="content" tal:content="structure view">
+                    Some metadata
+                  </div>
+  <BLANKLINE>
+                </div>
+              </div>
+            </div>
+  -->
+  <BLANKLINE>
+          </div>
+  <BLANKLINE>
+          <div class="spacer">
+            &nbsp;
+          </div>
+  <BLANKLINE>
+        </div>
+      </div>
+  <BLANKLINE>
+      <div id="footer" />
+  <BLANKLINE>
+      <div id="logger" />
+  <BLANKLINE>
+    </body>
+  <BLANKLINE>
+  </html>
+  <BLANKLINE>
+  <BLANKLINE>
+  <BLANKLINE>
+
+
+  >>> print http(r"""
+  ... POST /++etc++site/default/AddService/action.html HTTP/1.1
+  ... Authorization: Basic Z2xvYmFsbWdyOmdsb2JhbG1ncnB3
+  ... Content-Length: 98
+  ... Content-Type: application/x-www-form-urlencoded
+  ... Referer: http://localhost:8081/++etc++site/default/AddService
+  ... 
+  ... type_name=zope.app.browser.add.zope.app.pluggableauth.PluggableAuthenticationService&id=&add=+Add+""")
+  HTTP/1.1 303 See Other
+  Connection: close
+  Content-Length: 4
+  Content-Type: text/plain;charset=utf-8
+  Location: http://localhost:8081/++etc++site/default/PluggableAuthenticationService/@@registration.html
+  <BLANKLINE>
+  None
+
+
+  >>> print http(r"""
+  ... GET /++etc++site/default/PluggableAuthenticationService/@@registration.html HTTP/1.1
+  ... Authorization: Basic Z2xvYmFsbWdyOmdsb2JhbG1ncnB3
+  ... Referer: http://localhost:8081/++etc++site/default/AddService
+  ... """)
+  HTTP/1.1 200 Ok
+  Connection: close
+  Content-Length: 6208
+  Content-Type: text/html;charset=utf-8
+  <BLANKLINE>
+  <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+  <BLANKLINE>
+  <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en"
+        lang="en">
+  <BLANKLINE>
+    <head>
+      <title>Z3: PluggableAuthenticationService</title>
+  <BLANKLINE>
+      <style type="text/css" media="all">@import url(http://localhost:8081/@@/zope3.css);</style>
+  <BLANKLINE>
+      <style type="text/css" media="all">@import url(http://localhost:8081/@@/site_management.css);</style>
+  <BLANKLINE>
+      <meta http-equiv="Content-Type" content="text/html;charset=utf-8" />
+  <BLANKLINE>
+  <BLANKLINE>
+  <BLANKLINE>
+  <BLANKLINE>
+  <BLANKLINE>
+      <!-- Popup script for the OnlineHelp -->
+      <script type="text/javascript"
+              src="http://localhost:8081/@@/onlinehelp.js">
+      </script>
+  <BLANKLINE>
+  <BLANKLINE>
+      <!-- Ugly is better than lobotomized. -->
+      <script type="text/javascript"
+              src="http://localhost:8081/@@/xmltree.js">
+      </script>
+  <BLANKLINE>
+  <BLANKLINE>
+  <BLANKLINE>
+  <BLANKLINE>
+  <BLANKLINE>
+      <link rel="icon" type="image/png"
+            href="http://localhost:8081/@@/favicon.png" />
+    </head>
+  <BLANKLINE>
+    <body onload="loadtree('http://localhost:8081/', 'http://localhost:8081/++etc++site/default/PluggableAuthenticationService/')">
+  <BLANKLINE>
+  <BLANKLINE>
+      <div id="global">
+        <div id="userDetails">
+  <BLANKLINE>
+            User:
+            Sample Manager
+  <BLANKLINE>
+  <BLANKLINE>
+  <BLANKLINE>
+            <a href="@@logout.html?nextURL=http%3A//localhost%3A8081/%2B%2Betc%2B%2Bsite/default/PluggableAuthenticationService/%40%40registration.html">[Logout]</a>
+  <BLANKLINE>
+  <BLANKLINE>
+  <BLANKLINE>
+        </div>
+        <img src="http://localhost:8081/@@/zope3logo.gif" />
+      </div>
+  <BLANKLINE>
+  <BLANKLINE>
+  <BLANKLINE>
+  <BLANKLINE>
+      <div id="navigators">
+  <BLANKLINE>
+        <!-- Navigation tree box -->
+  <BLANKLINE>
+      <!-- Ugly is better than lobotomized. -->
+        <div class="box" id="navigationTree">
+          <h4>Navigation</h4>
+          <div xmlns="http://www.zope.org/zope3xmltree"
+               id="navtreecontents" class="body"
+               onclick="treeclicked(event);">Loading...</div>
+        </div>
+  <BLANKLINE>
+  <BLANKLINE>
+  <BLANKLINE>
+  <BLANKLINE>
+          <div class="box" id="commonTasks">
+  <BLANKLINE>
+  <BLANKLINE>
+            <h4>Add:</h4>
+            <div class="body">
+  <BLANKLINE>
+  <BLANKLINE>
+  <BLANKLINE>
+      <div class="content even">
+        <a href="http://localhost:8081/++etc++site/default/PluggableAuthenticationService/@@contents.html?type_name=zope.app.browser.add.zope.app.pluggableauth.BTreePrincipalSource"
+           class="">Add Principal Source</a>
+  <BLANKLINE>
+  <BLANKLINE>
+  <BLANKLINE>
+  <BLANKLINE>
+      </div>
+  <BLANKLINE>
+  <BLANKLINE>
+  <BLANKLINE>
+            </div>
+          </div>
+  <BLANKLINE>
+  <BLANKLINE>
+        <!-- Tree of the help topics that appears on the help namespace -->
+  <BLANKLINE>
+  <BLANKLINE>
+      </div>
+  <BLANKLINE>
+  <BLANKLINE>
+      <div id="workspace">
+  <BLANKLINE>
+  <BLANKLINE>
+        <div id="breadcrumbs"> Location:&nbsp;<a
+      href="http://localhost:8081/@@SelectedManagementView.html">[top]</a>
+             /
+            <a href="http://localhost:8081/++etc++site/@@SelectedManagementView.html">++etc++site</a> /
+            <a href="http://localhost:8081/++etc++site/default/@@SelectedManagementView.html">default</a> /
+            <a href="http://localhost:8081/++etc++site/default/PluggableAuthenticationService/@@SelectedManagementView.html">PluggableAuthenticationService</a> /
+        </div>
+  <BLANKLINE>
+  <BLANKLINE>
+  <BLANKLINE>
+        <div class="itemViews">
+  <BLANKLINE>
+            <a href="@@contents.html" class="">Contents</a>
+  <BLANKLINE>
+  <BLANKLINE>
+            <a href="@@registration.html" class="selected">Registration</a>
+  <BLANKLINE>
+  <BLANKLINE>
+            <a href="@@EditMetaData.html" class="">Metadata</a>
+  <BLANKLINE>
+  <BLANKLINE>
+            <a href="@@classBrowser.html" class="">Introspector</a>
+  <BLANKLINE>
+        </div>
+  <BLANKLINE>
+        <!-- OnlineHelp with popup support -->
+        <!-- note, we reverse the actions list 'cos they're packed to the
+             screen from the right -->
+        <div id="actions">
+  <BLANKLINE>
+  <BLANKLINE>
+            <a href="javascript:popup('registration.html/++help++/@@contexthelp.html','OnlineHelp','height=400
+                                             ,width=700
+                                             ,resizable=1
+                                             ,scrollbars=yes
+                                             ,location=no
+                                             ,status=no
+                                             ,toolbar=no
+                                             ,menubar=no')">Help</a>
+  <BLANKLINE>
+  <BLANKLINE>
+            <a href="@@undoAll.html">Undo all</a>
+            <a href="@@undoMore.html">Undo more</a>
+            <a href="@@undo.html">Undo!</a>
+            <a href="@@errorRedirect.html">Errors</a>
+            <a href="@@find.html">Find</a>
+            <a href="@@grant.html">Grant</a>
+            <a href="@@tools.html">Tools</a>
+            <a href="@@+">Add</a>
+  <BLANKLINE>
+          &nbsp;
+        </div>
+  <BLANKLINE>
+  <BLANKLINE>
+        <div id="viewspace">
+  <BLANKLINE>
+          <div id="message">
+          </div>
+  <BLANKLINE>
+          <div id="content">
+            <div>
+  <BLANKLINE>
+  <form method="POST"
+        action="http://localhost:8081/++etc++site/default/PluggableAuthenticationService/@@registration.html">
+  <BLANKLINE>
+    <div>
+      <div>
+        <p>This object is registered as:</p>
+  <BLANKLINE>
+        <div class="registrationSummary">
+          <div class="usageSummary">Authentication Service</div>
+          <div class="implementationSummary">PluggableAuthenticationService</div>
+          <div class="modificationLink">
+            <a href="http://localhost:8081/++etc++site/default/RegistrationManager/Authentication">(modify)</a>
+          </div>
+        </div>
+  <BLANKLINE>
+  <BLANKLINE>
+          <p>This object is currently active.</p>
+          <input type="submit" value="Deactivate"
+                 name="deactivate" />
+  <BLANKLINE>
+  <BLANKLINE>
+      </div>
+  <BLANKLINE>
+      <hr />
+      <a href="registrations.html">
+        Advanced Options
+      </a>
+  <BLANKLINE>
+    </div>
+  <BLANKLINE>
+  <BLANKLINE>
+  <BLANKLINE>
+  </form>
+  <BLANKLINE>
+  </div>
+          </div>
+  <BLANKLINE>
+  <BLANKLINE>
+          <div id="context_information">
+  <BLANKLINE>
+            <div id="helpers">
+  <BLANKLINE>
+  <BLANKLINE>
+  <BLANKLINE>
+  <BLANKLINE>
+            </div>
+  <BLANKLINE>
+  <!--
+            <div id="inspectors">
+  <BLANKLINE>
+              <div class="box" id="metadata"
+                  tal:define="view context/@@MetaDataBox|nothing"
+                  tal:condition="view/strip|nothing">
+  <BLANKLINE>
+                <h4 i18n:translate="">Metadata</h4>
+  <BLANKLINE>
+                <div class="body">
+  <BLANKLINE>
+                  <div class="content" tal:content="structure view">
+                    Some metadata
+                  </div>
+  <BLANKLINE>
+                </div>
+              </div>
+            </div>
+  -->
+  <BLANKLINE>
+          </div>
+  <BLANKLINE>
+          <div class="spacer">
+            &nbsp;
+          </div>
+  <BLANKLINE>
+        </div>
+      </div>
+  <BLANKLINE>
+      <div id="footer" />
+  <BLANKLINE>
+      <div id="logger" />
+  <BLANKLINE>
+    </body>
+  <BLANKLINE>
+  </html>
+  <BLANKLINE>
+  <BLANKLINE>
+  <BLANKLINE>
+
+
+  >>> print http(r"""
+  ... GET /++etc++site/default/PluggableAuthenticationService/@@contents.html HTTP/1.1
+  ... Authorization: Basic Z2xvYmFsbWdyOmdsb2JhbG1ncnB3
+  ... Referer: http://localhost:8081/++etc++site/default/PluggableAuthenticationService/@@registration.html
+  ... """)
+  HTTP/1.1 200 Ok
+  Connection: close
+  Content-Length: 6583
+  Content-Type: text/html;charset=utf-8
+  <BLANKLINE>
+  <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+  <BLANKLINE>
+  <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en"
+        lang="en">
+  <BLANKLINE>
+    <head>
+      <title>Z3: PluggableAuthenticationService</title>
+  <BLANKLINE>
+      <style type="text/css" media="all">@import url(http://localhost:8081/@@/zope3.css);</style>
+  <BLANKLINE>
+      <style type="text/css" media="all">@import url(http://localhost:8081/@@/site_management.css);</style>
+  <BLANKLINE>
+      <meta http-equiv="Content-Type" content="text/html;charset=utf-8" />
+  <BLANKLINE>
+  <BLANKLINE>
+  <BLANKLINE>
+  <BLANKLINE>
+  <BLANKLINE>
+      <!-- Popup script for the OnlineHelp -->
+      <script type="text/javascript"
+              src="http://localhost:8081/@@/onlinehelp.js">
+      </script>
+  <BLANKLINE>
+  <BLANKLINE>
+      <!-- Ugly is better than lobotomized. -->
+      <script type="text/javascript"
+              src="http://localhost:8081/@@/xmltree.js">
+      </script>
+  <BLANKLINE>
+  <BLANKLINE>
+  <BLANKLINE>
+  <BLANKLINE>
+  <BLANKLINE>
+      <link rel="icon" type="image/png"
+            href="http://localhost:8081/@@/favicon.png" />
+    </head>
+  <BLANKLINE>
+    <body onload="loadtree('http://localhost:8081/', 'http://localhost:8081/++etc++site/default/PluggableAuthenticationService/')">
+  <BLANKLINE>
+  <BLANKLINE>
+      <div id="global">
+        <div id="userDetails">
+  <BLANKLINE>
+            User:
+            Sample Manager
+  <BLANKLINE>
+  <BLANKLINE>
+  <BLANKLINE>
+            <a href="@@logout.html?nextURL=http%3A//localhost%3A8081/%2B%2Betc%2B%2Bsite/default/PluggableAuthenticationService/%40%40contents.html">[Logout]</a>
+  <BLANKLINE>
+  <BLANKLINE>
+  <BLANKLINE>
+        </div>
+        <img src="http://localhost:8081/@@/zope3logo.gif" />
+      </div>
+  <BLANKLINE>
+  <BLANKLINE>
+  <BLANKLINE>
+  <BLANKLINE>
+      <div id="navigators">
+  <BLANKLINE>
+        <!-- Navigation tree box -->
+  <BLANKLINE>
+      <!-- Ugly is better than lobotomized. -->
+        <div class="box" id="navigationTree">
+          <h4>Navigation</h4>
+          <div xmlns="http://www.zope.org/zope3xmltree"
+               id="navtreecontents" class="body"
+               onclick="treeclicked(event);">Loading...</div>
+        </div>
+  <BLANKLINE>
+  <BLANKLINE>
+  <BLANKLINE>
+  <BLANKLINE>
+          <div class="box" id="commonTasks">
+  <BLANKLINE>
+  <BLANKLINE>
+            <h4>Add:</h4>
+            <div class="body">
+  <BLANKLINE>
+  <BLANKLINE>
+  <BLANKLINE>
+      <div class="content even">
+        <a href="http://localhost:8081/++etc++site/default/PluggableAuthenticationService/@@contents.html?type_name=zope.app.browser.add.zope.app.pluggableauth.BTreePrincipalSource"
+           class="">Add Principal Source</a>
+  <BLANKLINE>
+  <BLANKLINE>
+  <BLANKLINE>
+  <BLANKLINE>
+      </div>
+  <BLANKLINE>
+  <BLANKLINE>
+  <BLANKLINE>
+            </div>
+          </div>
+  <BLANKLINE>
+  <BLANKLINE>
+        <!-- Tree of the help topics that appears on the help namespace -->
+  <BLANKLINE>
+  <BLANKLINE>
+      </div>
+  <BLANKLINE>
+  <BLANKLINE>
+      <div id="workspace">
+  <BLANKLINE>
+  <BLANKLINE>
+        <div id="breadcrumbs"> Location:&nbsp;<a
+      href="http://localhost:8081/@@SelectedManagementView.html">[top]</a>
+             /
+            <a href="http://localhost:8081/++etc++site/@@SelectedManagementView.html">++etc++site</a> /
+            <a href="http://localhost:8081/++etc++site/default/@@SelectedManagementView.html">default</a> /
+            <a href="http://localhost:8081/++etc++site/default/PluggableAuthenticationService/@@SelectedManagementView.html">PluggableAuthenticationService</a> /
+        </div>
+  <BLANKLINE>
+  <BLANKLINE>
+  <BLANKLINE>
+        <div class="itemViews">
+  <BLANKLINE>
+            <a href="@@contents.html" class="selected">Contents</a>
+  <BLANKLINE>
+  <BLANKLINE>
+            <a href="@@registration.html" class="">Registration</a>
+  <BLANKLINE>
+  <BLANKLINE>
+            <a href="@@EditMetaData.html" class="">Metadata</a>
+  <BLANKLINE>
+  <BLANKLINE>
+            <a href="@@classBrowser.html" class="">Introspector</a>
+  <BLANKLINE>
+        </div>
+  <BLANKLINE>
+        <!-- OnlineHelp with popup support -->
+        <!-- note, we reverse the actions list 'cos they're packed to the
+             screen from the right -->
+        <div id="actions">
+  <BLANKLINE>
+  <BLANKLINE>
+            <a href="javascript:popup('contents.html/++help++/@@contexthelp.html','OnlineHelp','height=400
+                                             ,width=700
+                                             ,resizable=1
+                                             ,scrollbars=yes
+                                             ,location=no
+                                             ,status=no
+                                             ,toolbar=no
+                                             ,menubar=no')">Help</a>
+  <BLANKLINE>
+  <BLANKLINE>
+            <a href="@@undoAll.html">Undo all</a>
+            <a href="@@undoMore.html">Undo more</a>
+            <a href="@@undo.html">Undo!</a>
+            <a href="@@errorRedirect.html">Errors</a>
+            <a href="@@find.html">Find</a>
+            <a href="@@grant.html">Grant</a>
+            <a href="@@tools.html">Tools</a>
+            <a href="@@+">Add</a>
+  <BLANKLINE>
+          &nbsp;
+        </div>
+  <BLANKLINE>
+  <BLANKLINE>
+        <div id="viewspace">
+  <BLANKLINE>
+          <div id="message">
+          </div>
+  <BLANKLINE>
+          <div id="content">
+            <div>
+    <div>
+  <BLANKLINE>
+      <form name="containerContentsForm" method="POST"
+            action="http://localhost:8081/++etc++site/default/PluggableAuthenticationService/@@contents.html">
+  <BLANKLINE>
+  <BLANKLINE>
+  <BLANKLINE>
+  <BLANKLINE>
+  <BLANKLINE>
+  <BLANKLINE>
+        <table id="sortable" class="listing"
+               summary="Content listing">
+  <BLANKLINE>
+          <thead>
+            <tr>
+              <th>&nbsp;</th>
+              <th>Name</th>
+              <th>Title</th>
+              <th>Size</th>
+              <th>Created</th>
+              <th>Modified</th>
+            </tr>
+          </thead>
+  <BLANKLINE>
+          <tbody>
+  <BLANKLINE>
+  <BLANKLINE>
+  <BLANKLINE>
+  <BLANKLINE>
+          </tbody>
+        </table>
+  <BLANKLINE>
+        <div>
+  <BLANKLINE>
+  <BLANKLINE>
+  <BLANKLINE>
+  <BLANKLINE>
+  <BLANKLINE>
+  <BLANKLINE>
+  <BLANKLINE>
+  <BLANKLINE>
+  <BLANKLINE>
+            <input type="submit" name="container_add_button"
+                   value="Add" />
+            <input type="text" name="single_new_value"
+                   id="focusid" />
+            <input type="hidden" name="single_type_name"
+                   value="zope.app.browser.add.zope.app.pluggableauth.BTreePrincipalSource" />
+  <BLANKLINE>
+  <BLANKLINE>
+        </div>
+  <BLANKLINE>
+  <BLANKLINE>
+  <BLANKLINE>
+      </form>
+  <BLANKLINE>
+      <script><!--
+          prettydump('focus', LG_INFO);
+          if (document.containerContentsForm.new_value)
+  	        document.containerContentsForm.new_value.focus();
+          //-->
+      </script>
+  <BLANKLINE>
+    </div>
+  <BLANKLINE>
+  </div>
+          </div>
+  <BLANKLINE>
+  <BLANKLINE>
+          <div id="context_information">
+  <BLANKLINE>
+            <div id="helpers">
+  <BLANKLINE>
+  <BLANKLINE>
+  <BLANKLINE>
+  <BLANKLINE>
+            </div>
+  <BLANKLINE>
+  <!--
+            <div id="inspectors">
+  <BLANKLINE>
+              <div class="box" id="metadata"
+                  tal:define="view context/@@MetaDataBox|nothing"
+                  tal:condition="view/strip|nothing">
+  <BLANKLINE>
+                <h4 i18n:translate="">Metadata</h4>
+  <BLANKLINE>
+                <div class="body">
+  <BLANKLINE>
+                  <div class="content" tal:content="structure view">
+                    Some metadata
+                  </div>
+  <BLANKLINE>
+                </div>
+              </div>
+            </div>
+  -->
+  <BLANKLINE>
+          </div>
+  <BLANKLINE>
+          <div class="spacer">
+            &nbsp;
+          </div>
+  <BLANKLINE>
+        </div>
+      </div>
+  <BLANKLINE>
+      <div id="footer" />
+  <BLANKLINE>
+      <div id="logger" />
+  <BLANKLINE>
+    </body>
+  <BLANKLINE>
+  </html>
+  <BLANKLINE>
+  <BLANKLINE>
+  <BLANKLINE>
+
+
+  >>> print http(r"""
+  ... POST /++etc++site/default/PluggableAuthenticationService/@@contents.html HTTP/1.1
+  ... Authorization: Basic Z2xvYmFsbWdyOmdsb2JhbG1ncnB3
+  ... Content-Length: 124
+  ... Content-Type: application/x-www-form-urlencoded
+  ... Referer: http://localhost:8081/++etc++site/default/PluggableAuthenticationService/@@contents.html
+  ... 
+  ... container_add_button=Add&single_new_value=&single_type_name=zope.app.browser.add.zope.app.pluggableauth.BTreePrincipalSource""")
+  HTTP/1.1 303 See Other
+  Connection: close
+  Content-Length: 6479
+  Content-Type: text/html;charset=utf-8
+  Location: http://localhost:8081/++etc++site/default/PluggableAuthenticationService/@@contents.html
+  <BLANKLINE>
+  <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+  <BLANKLINE>
+  <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en"
+        lang="en">
+  <BLANKLINE>
+    <head>
+      <title>Z3: PluggableAuthenticationService</title>
+  <BLANKLINE>
+      <style type="text/css" media="all">@import url(http://localhost:8081/@@/zope3.css);</style>
+  <BLANKLINE>
+      <style type="text/css" media="all">@import url(http://localhost:8081/@@/site_management.css);</style>
+  <BLANKLINE>
+      <meta http-equiv="Content-Type" content="text/html;charset=utf-8" />
+  <BLANKLINE>
+  <BLANKLINE>
+  <BLANKLINE>
+  <BLANKLINE>
+  <BLANKLINE>
+      <!-- Popup script for the OnlineHelp -->
+      <script type="text/javascript"
+              src="http://localhost:8081/@@/onlinehelp.js">
+      </script>
+  <BLANKLINE>
+  <BLANKLINE>
+      <!-- Ugly is better than lobotomized. -->
+      <script type="text/javascript"
+              src="http://localhost:8081/@@/xmltree.js">
+      </script>
+  <BLANKLINE>
+  <BLANKLINE>
+  <BLANKLINE>
+  <BLANKLINE>
+  <BLANKLINE>
+      <link rel="icon" type="image/png"
+            href="http://localhost:8081/@@/favicon.png" />
+    </head>
+  <BLANKLINE>
+    <body onload="loadtree('http://localhost:8081/', 'http://localhost:8081/++etc++site/default/PluggableAuthenticationService/')">
+  <BLANKLINE>
+  <BLANKLINE>
+      <div id="global">
+        <div id="userDetails">
+  <BLANKLINE>
+            User:
+            Sample Manager
+  <BLANKLINE>
+  <BLANKLINE>
+  <BLANKLINE>
+            <a href="@@logout.html?nextURL=http%3A//localhost%3A8081/%2B%2Betc%2B%2Bsite/default/PluggableAuthenticationService/%40%40contents.html">[Logout]</a>
+  <BLANKLINE>
+  <BLANKLINE>
+  <BLANKLINE>
+        </div>
+        <img src="http://localhost:8081/@@/zope3logo.gif" />
+      </div>
+  <BLANKLINE>
+  <BLANKLINE>
+  <BLANKLINE>
+  <BLANKLINE>
+      <div id="navigators">
+  <BLANKLINE>
+        <!-- Navigation tree box -->
+  <BLANKLINE>
+      <!-- Ugly is better than lobotomized. -->
+        <div class="box" id="navigationTree">
+          <h4>Navigation</h4>
+          <div xmlns="http://www.zope.org/zope3xmltree"
+               id="navtreecontents" class="body"
+               onclick="treeclicked(event);">Loading...</div>
+        </div>
+  <BLANKLINE>
+  <BLANKLINE>
+  <BLANKLINE>
+  <BLANKLINE>
+          <div class="box" id="commonTasks">
+  <BLANKLINE>
+  <BLANKLINE>
+            <h4>Add:</h4>
+            <div class="body">
+  <BLANKLINE>
+  <BLANKLINE>
+  <BLANKLINE>
+      <div class="content even">
+        <a href="http://localhost:8081/++etc++site/default/PluggableAuthenticationService/@@contents.html?type_name=zope.app.browser.add.zope.app.pluggableauth.BTreePrincipalSource"
+           class="">Add Principal Source</a>
+  <BLANKLINE>
+  <BLANKLINE>
+  <BLANKLINE>
+  <BLANKLINE>
+      </div>
+  <BLANKLINE>
+  <BLANKLINE>
+  <BLANKLINE>
+            </div>
+          </div>
+  <BLANKLINE>
+  <BLANKLINE>
+        <!-- Tree of the help topics that appears on the help namespace -->
+  <BLANKLINE>
+  <BLANKLINE>
+      </div>
+  <BLANKLINE>
+  <BLANKLINE>
+      <div id="workspace">
+  <BLANKLINE>
+  <BLANKLINE>
+        <div id="breadcrumbs"> Location:&nbsp;<a
+      href="http://localhost:8081/@@SelectedManagementView.html">[top]</a>
+             /
+            <a href="http://localhost:8081/++etc++site/@@SelectedManagementView.html">++etc++site</a> /
+            <a href="http://localhost:8081/++etc++site/default/@@SelectedManagementView.html">default</a> /
+            <a href="http://localhost:8081/++etc++site/default/PluggableAuthenticationService/@@SelectedManagementView.html">PluggableAuthenticationService</a> /
+        </div>
+  <BLANKLINE>
+  <BLANKLINE>
+  <BLANKLINE>
+        <div class="itemViews">
+  <BLANKLINE>
+            <a href="@@contents.html" class="selected">Contents</a>
+  <BLANKLINE>
+  <BLANKLINE>
+            <a href="@@registration.html" class="">Registration</a>
+  <BLANKLINE>
+  <BLANKLINE>
+            <a href="@@EditMetaData.html" class="">Metadata</a>
+  <BLANKLINE>
+  <BLANKLINE>
+            <a href="@@classBrowser.html" class="">Introspector</a>
+  <BLANKLINE>
+        </div>
+  <BLANKLINE>
+        <!-- OnlineHelp with popup support -->
+        <!-- note, we reverse the actions list 'cos they're packed to the
+             screen from the right -->
+        <div id="actions">
+  <BLANKLINE>
+  <BLANKLINE>
+            <a href="javascript:popup('contents.html/++help++/@@contexthelp.html','OnlineHelp','height=400
+                                             ,width=700
+                                             ,resizable=1
+                                             ,scrollbars=yes
+                                             ,location=no
+                                             ,status=no
+                                             ,toolbar=no
+                                             ,menubar=no')">Help</a>
+  <BLANKLINE>
+  <BLANKLINE>
+            <a href="@@undoAll.html">Undo all</a>
+            <a href="@@undoMore.html">Undo more</a>
+            <a href="@@undo.html">Undo!</a>
+            <a href="@@errorRedirect.html">Errors</a>
+            <a href="@@find.html">Find</a>
+            <a href="@@grant.html">Grant</a>
+            <a href="@@tools.html">Tools</a>
+            <a href="@@+">Add</a>
+  <BLANKLINE>
+          &nbsp;
+        </div>
+  <BLANKLINE>
+  <BLANKLINE>
+        <div id="viewspace">
+  <BLANKLINE>
+          <div id="message">
+          </div>
+  <BLANKLINE>
+          <div id="content">
+            <div>
+    <div>
+  <BLANKLINE>
+      <form name="containerContentsForm" method="POST"
+            action="http://localhost:8081/++etc++site/default/PluggableAuthenticationService/@@contents.html">
+  <BLANKLINE>
+        <input type="hidden" name="type_name"
+               value="zope.app.browser.add.zope.app.pluggableauth.BTreePrincipalSource" />
+  <BLANKLINE>
+  <BLANKLINE>
+  <BLANKLINE>
+  <BLANKLINE>
+        <table id="sortable" class="listing"
+               summary="Content listing">
+  <BLANKLINE>
+          <thead>
+            <tr>
+              <th>&nbsp;</th>
+              <th>Name</th>
+              <th>Title</th>
+              <th>Size</th>
+              <th>Created</th>
+              <th>Modified</th>
+            </tr>
+          </thead>
+  <BLANKLINE>
+          <tbody>
+  <BLANKLINE>
+          <tr>
+            <td></td>
+            <td><input name="new_value" id="focusid" value="" /></td>
+            <td></td>
+            <td></td>
+            <td></td>
+          </tr>
+  <BLANKLINE>
+  <BLANKLINE>
+          </tbody>
+        </table>
+  <BLANKLINE>
+  <BLANKLINE>
+  <BLANKLINE>
+  <BLANKLINE>
+  <BLANKLINE>
+      </form>
+  <BLANKLINE>
+      <script><!--
+          prettydump('focus', LG_INFO);
+          if (document.containerContentsForm.new_value)
+  	        document.containerContentsForm.new_value.focus();
+          //-->
+      </script>
+  <BLANKLINE>
+    </div>
+  <BLANKLINE>
+  </div>
+          </div>
+  <BLANKLINE>
+  <BLANKLINE>
+          <div id="context_information">
+  <BLANKLINE>
+            <div id="helpers">
+  <BLANKLINE>
+  <BLANKLINE>
+  <BLANKLINE>
+  <BLANKLINE>
+            </div>
+  <BLANKLINE>
+  <!--
+            <div id="inspectors">
+  <BLANKLINE>
+              <div class="box" id="metadata"
+                  tal:define="view context/@@MetaDataBox|nothing"
+                  tal:condition="view/strip|nothing">
+  <BLANKLINE>
+                <h4 i18n:translate="">Metadata</h4>
+  <BLANKLINE>
+                <div class="body">
+  <BLANKLINE>
+                  <div class="content" tal:content="structure view">
+                    Some metadata
+                  </div>
+  <BLANKLINE>
+                </div>
+              </div>
+            </div>
+  -->
+  <BLANKLINE>
+          </div>
+  <BLANKLINE>
+          <div class="spacer">
+            &nbsp;
+          </div>
+  <BLANKLINE>
+        </div>
+      </div>
+  <BLANKLINE>
+      <div id="footer" />
+  <BLANKLINE>
+      <div id="logger" />
+  <BLANKLINE>
+    </body>
+  <BLANKLINE>
+  </html>
+  <BLANKLINE>
+  <BLANKLINE>
+  <BLANKLINE>
+
+
+  >>> print http(r"""
+  ... GET /++etc++site/default/PluggableAuthenticationService/@@contents.html HTTP/1.1
+  ... Authorization: Basic Z2xvYmFsbWdyOmdsb2JhbG1ncnB3
+  ... Referer: http://localhost:8081/++etc++site/default/PluggableAuthenticationService/@@contents.html
+  ... """)
+  HTTP/1.1 200 Ok
+  Connection: close
+  Content-Length: 7799
+  Content-Type: text/html;charset=utf-8
+  <BLANKLINE>
+  <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+  <BLANKLINE>
+  <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en"
+        lang="en">
+  <BLANKLINE>
+    <head>
+      <title>Z3: PluggableAuthenticationService</title>
+  <BLANKLINE>
+      <style type="text/css" media="all">@import url(http://localhost:8081/@@/zope3.css);</style>
+  <BLANKLINE>
+      <style type="text/css" media="all">@import url(http://localhost:8081/@@/site_management.css);</style>
+  <BLANKLINE>
+      <meta http-equiv="Content-Type" content="text/html;charset=utf-8" />
+  <BLANKLINE>
+  <BLANKLINE>
+  <BLANKLINE>
+  <BLANKLINE>
+  <BLANKLINE>
+      <!-- Popup script for the OnlineHelp -->
+      <script type="text/javascript"
+              src="http://localhost:8081/@@/onlinehelp.js">
+      </script>
+  <BLANKLINE>
+  <BLANKLINE>
+      <!-- Ugly is better than lobotomized. -->
+      <script type="text/javascript"
+              src="http://localhost:8081/@@/xmltree.js">
+      </script>
+  <BLANKLINE>
+  <BLANKLINE>
+  <BLANKLINE>
+  <BLANKLINE>
+  <BLANKLINE>
+      <link rel="icon" type="image/png"
+            href="http://localhost:8081/@@/favicon.png" />
+    </head>
+  <BLANKLINE>
+    <body onload="loadtree('http://localhost:8081/', 'http://localhost:8081/++etc++site/default/PluggableAuthenticationService/')">
+  <BLANKLINE>
+  <BLANKLINE>
+      <div id="global">
+        <div id="userDetails">
+  <BLANKLINE>
+            User:
+            Sample Manager
+  <BLANKLINE>
+  <BLANKLINE>
+  <BLANKLINE>
+            <a href="@@logout.html?nextURL=http%3A//localhost%3A8081/%2B%2Betc%2B%2Bsite/default/PluggableAuthenticationService/%40%40contents.html">[Logout]</a>
+  <BLANKLINE>
+  <BLANKLINE>
+  <BLANKLINE>
+        </div>
+        <img src="http://localhost:8081/@@/zope3logo.gif" />
+      </div>
+  <BLANKLINE>
+  <BLANKLINE>
+  <BLANKLINE>
+  <BLANKLINE>
+      <div id="navigators">
+  <BLANKLINE>
+        <!-- Navigation tree box -->
+  <BLANKLINE>
+      <!-- Ugly is better than lobotomized. -->
+        <div class="box" id="navigationTree">
+          <h4>Navigation</h4>
+          <div xmlns="http://www.zope.org/zope3xmltree"
+               id="navtreecontents" class="body"
+               onclick="treeclicked(event);">Loading...</div>
+        </div>
+  <BLANKLINE>
+  <BLANKLINE>
+  <BLANKLINE>
+  <BLANKLINE>
+          <div class="box" id="commonTasks">
+  <BLANKLINE>
+  <BLANKLINE>
+            <h4>Add:</h4>
+            <div class="body">
+  <BLANKLINE>
+  <BLANKLINE>
+  <BLANKLINE>
+      <div class="content even">
+        <a href="http://localhost:8081/++etc++site/default/PluggableAuthenticationService/@@contents.html?type_name=zope.app.browser.add.zope.app.pluggableauth.BTreePrincipalSource"
+           class="">Add Principal Source</a>
+  <BLANKLINE>
+  <BLANKLINE>
+  <BLANKLINE>
+  <BLANKLINE>
+      </div>
+  <BLANKLINE>
+  <BLANKLINE>
+  <BLANKLINE>
+            </div>
+          </div>
+  <BLANKLINE>
+  <BLANKLINE>
+        <!-- Tree of the help topics that appears on the help namespace -->
+  <BLANKLINE>
+  <BLANKLINE>
+      </div>
+  <BLANKLINE>
+  <BLANKLINE>
+      <div id="workspace">
+  <BLANKLINE>
+  <BLANKLINE>
+        <div id="breadcrumbs"> Location:&nbsp;<a
+      href="http://localhost:8081/@@SelectedManagementView.html">[top]</a>
+             /
+            <a href="http://localhost:8081/++etc++site/@@SelectedManagementView.html">++etc++site</a> /
+            <a href="http://localhost:8081/++etc++site/default/@@SelectedManagementView.html">default</a> /
+            <a href="http://localhost:8081/++etc++site/default/PluggableAuthenticationService/@@SelectedManagementView.html">PluggableAuthenticationService</a> /
+        </div>
+  <BLANKLINE>
+  <BLANKLINE>
+  <BLANKLINE>
+        <div class="itemViews">
+  <BLANKLINE>
+            <a href="@@contents.html" class="selected">Contents</a>
+  <BLANKLINE>
+  <BLANKLINE>
+            <a href="@@registration.html" class="">Registration</a>
+  <BLANKLINE>
+  <BLANKLINE>
+            <a href="@@EditMetaData.html" class="">Metadata</a>
+  <BLANKLINE>
+  <BLANKLINE>
+            <a href="@@classBrowser.html" class="">Introspector</a>
+  <BLANKLINE>
+        </div>
+  <BLANKLINE>
+        <!-- OnlineHelp with popup support -->
+        <!-- note, we reverse the actions list 'cos they're packed to the
+             screen from the right -->
+        <div id="actions">
+  <BLANKLINE>
+  <BLANKLINE>
+            <a href="javascript:popup('contents.html/++help++/@@contexthelp.html','OnlineHelp','height=400
+                                             ,width=700
+                                             ,resizable=1
+                                             ,scrollbars=yes
+                                             ,location=no
+                                             ,status=no
+                                             ,toolbar=no
+                                             ,menubar=no')">Help</a>
+  <BLANKLINE>
+  <BLANKLINE>
+            <a href="@@undoAll.html">Undo all</a>
+            <a href="@@undoMore.html">Undo more</a>
+            <a href="@@undo.html">Undo!</a>
+            <a href="@@errorRedirect.html">Errors</a>
+            <a href="@@find.html">Find</a>
+            <a href="@@grant.html">Grant</a>
+            <a href="@@tools.html">Tools</a>
+            <a href="@@+">Add</a>
+  <BLANKLINE>
+          &nbsp;
+        </div>
+  <BLANKLINE>
+  <BLANKLINE>
+        <div id="viewspace">
+  <BLANKLINE>
+          <div id="message">
+          </div>
+  <BLANKLINE>
+          <div id="content">
+            <div>
+    <div>
+  <BLANKLINE>
+      <form name="containerContentsForm" method="POST"
+            action="http://localhost:8081/++etc++site/default/PluggableAuthenticationService/@@contents.html">
+  <BLANKLINE>
+  <BLANKLINE>
+  <BLANKLINE>
+  <BLANKLINE>
+  <BLANKLINE>
+  <BLANKLINE>
+        <table id="sortable" class="listing"
+               summary="Content listing">
+  <BLANKLINE>
+          <thead>
+            <tr>
+              <th>&nbsp;</th>
+              <th>Name</th>
+              <th>Title</th>
+              <th>Size</th>
+              <th>Created</th>
+              <th>Modified</th>
+            </tr>
+          </thead>
+  <BLANKLINE>
+          <tbody>
+  <BLANKLINE>
+  <BLANKLINE>
+  <BLANKLINE>
+  <BLANKLINE>
+            <tr class="even">
+              <td>
+                <input type="checkbox" class="noborder"
+                       name="ids:list"
+                       id="BTreePrincipalSource"
+                       value="BTreePrincipalSource" />
+              </td>
+              <td><a href="BTreePrincipalSource/@@SelectedManagementView.html"></a><span>
+                    <a href="BTreePrincipalSource/@@SelectedManagementView.html">BTreePrincipalSource</a><a
+      href="http://localhost:8081/++etc++site/default/PluggableAuthenticationService/@@contents.html?rename_ids:list=BTreePrincipalSource">&nbsp;&nbsp;</a></span></td>
+              <td>
+  <BLANKLINE>
+  <BLANKLINE>
+                <span>&nbsp;&nbsp;&nbsp;&nbsp;</span>
+              </td>
+  <BLANKLINE>
+              <td><span>0 items</span></td>
+              <td><span>&nbsp;</span></td>
+              <td><span>&nbsp;</span></td>
+            </tr>
+  <BLANKLINE>
+  <BLANKLINE>
+          </tbody>
+        </table>
+  <BLANKLINE>
+        <div>
+  <BLANKLINE>
+          <input type="submit" name="container_rename_button"
+                 value="Rename" />
+          <input type="submit" name="container_cut_button"
+                 value="Cut" />
+          <input type="submit" name="container_copy_button"
+                 value="Copy" />
+  <BLANKLINE>
+          <input type="submit" name="container_delete_button"
+                 value="Delete" />
+  <BLANKLINE>
+  <BLANKLINE>
+  <BLANKLINE>
+            <input type="submit" name="container_add_button"
+                   value="Add" />
+            <input type="text" name="single_new_value"
+                   id="focusid" />
+            <input type="hidden" name="single_type_name"
+                   value="zope.app.browser.add.zope.app.pluggableauth.BTreePrincipalSource" />
+  <BLANKLINE>
+  <BLANKLINE>
+        </div>
+  <BLANKLINE>
+  <BLANKLINE>
+  <BLANKLINE>
+      </form>
+  <BLANKLINE>
+      <script><!--
+          prettydump('focus', LG_INFO);
+          if (document.containerContentsForm.new_value)
+  	        document.containerContentsForm.new_value.focus();
+          //-->
+      </script>
+  <BLANKLINE>
+    </div>
+  <BLANKLINE>
+  </div>
+          </div>
+  <BLANKLINE>
+  <BLANKLINE>
+          <div id="context_information">
+  <BLANKLINE>
+            <div id="helpers">
+  <BLANKLINE>
+  <BLANKLINE>
+  <BLANKLINE>
+  <BLANKLINE>
+            </div>
+  <BLANKLINE>
+  <!--
+            <div id="inspectors">
+  <BLANKLINE>
+              <div class="box" id="metadata"
+                  tal:define="view context/@@MetaDataBox|nothing"
+                  tal:condition="view/strip|nothing">
+  <BLANKLINE>
+                <h4 i18n:translate="">Metadata</h4>
+  <BLANKLINE>
+                <div class="body">
+  <BLANKLINE>
+                  <div class="content" tal:content="structure view">
+                    Some metadata
+                  </div>
+  <BLANKLINE>
+                </div>
+              </div>
+            </div>
+  -->
+  <BLANKLINE>
+          </div>
+  <BLANKLINE>
+          <div class="spacer">
+            &nbsp;
+          </div>
+  <BLANKLINE>
+        </div>
+      </div>
+  <BLANKLINE>
+      <div id="footer" />
+  <BLANKLINE>
+      <div id="logger" />
+  <BLANKLINE>
+    </body>
+  <BLANKLINE>
+  </html>
+  <BLANKLINE>
+  <BLANKLINE>
+  <BLANKLINE>
+
+
+  >>> print http(r"""
+  ... GET /++etc++site/default/PluggableAuthenticationService/BTreePrincipalSource/@@SelectedManagementView.html HTTP/1.1
+  ... Authorization: Basic Z2xvYmFsbWdyOmdsb2JhbG1ncnB3
+  ... Referer: http://localhost:8081/++etc++site/default/PluggableAuthenticationService/@@contents.html
+  ... """)
+  HTTP/1.1 303 See Other
+  Connection: close
+  Content-Length: 0
+  Content-Type: text/plain;charset=utf-8
+  Location: @@contents.html
+  <BLANKLINE>
+
+
+  >>> print http(r"""
+  ... GET /++etc++site/default/PluggableAuthenticationService/BTreePrincipalSource/@@contents.html HTTP/1.1
+  ... Authorization: Basic Z2xvYmFsbWdyOmdsb2JhbG1ncnB3
+  ... Referer: http://localhost:8081/++etc++site/default/PluggableAuthenticationService/@@contents.html
+  ... """)
+  HTTP/1.1 200 Ok
+  Connection: close
+  Content-Length: 6407
+  Content-Type: text/html;charset=utf-8
+  <BLANKLINE>
+  <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+  <BLANKLINE>
+  <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en"
+        lang="en">
+  <BLANKLINE>
+    <head>
+      <title>Z3: BTreePrincipalSource</title>
+  <BLANKLINE>
+      <style type="text/css" media="all">@import url(http://localhost:8081/@@/zope3.css);</style>
+  <BLANKLINE>
+      <style type="text/css" media="all">@import url(http://localhost:8081/@@/site_management.css);</style>
+  <BLANKLINE>
+      <meta http-equiv="Content-Type" content="text/html;charset=utf-8" />
+  <BLANKLINE>
+  <BLANKLINE>
+  <BLANKLINE>
+  <BLANKLINE>
+  <BLANKLINE>
+      <!-- Popup script for the OnlineHelp -->
+      <script type="text/javascript"
+              src="http://localhost:8081/@@/onlinehelp.js">
+      </script>
+  <BLANKLINE>
+  <BLANKLINE>
+      <!-- Ugly is better than lobotomized. -->
+      <script type="text/javascript"
+              src="http://localhost:8081/@@/xmltree.js">
+      </script>
+  <BLANKLINE>
+  <BLANKLINE>
+  <BLANKLINE>
+  <BLANKLINE>
+  <BLANKLINE>
+      <link rel="icon" type="image/png"
+            href="http://localhost:8081/@@/favicon.png" />
+    </head>
+  <BLANKLINE>
+    <body onload="loadtree('http://localhost:8081/', 'http://localhost:8081/++etc++site/default/PluggableAuthenticationService/BTreePrincipalSource/')">
+  <BLANKLINE>
+  <BLANKLINE>
+      <div id="global">
+        <div id="userDetails">
+  <BLANKLINE>
+            User:
+            Sample Manager
+  <BLANKLINE>
+  <BLANKLINE>
+  <BLANKLINE>
+            <a href="@@logout.html?nextURL=http%3A//localhost%3A8081/%2B%2Betc%2B%2Bsite/default/PluggableAuthenticationService/BTreePrincipalSource/%40%40contents.html">[Logout]</a>
+  <BLANKLINE>
+  <BLANKLINE>
+  <BLANKLINE>
+        </div>
+        <img src="http://localhost:8081/@@/zope3logo.gif" />
+      </div>
+  <BLANKLINE>
+  <BLANKLINE>
+  <BLANKLINE>
+  <BLANKLINE>
+      <div id="navigators">
+  <BLANKLINE>
+        <!-- Navigation tree box -->
+  <BLANKLINE>
+      <!-- Ugly is better than lobotomized. -->
+        <div class="box" id="navigationTree">
+          <h4>Navigation</h4>
+          <div xmlns="http://www.zope.org/zope3xmltree"
+               id="navtreecontents" class="body"
+               onclick="treeclicked(event);">Loading...</div>
+        </div>
+  <BLANKLINE>
+  <BLANKLINE>
+  <BLANKLINE>
+  <BLANKLINE>
+          <div class="box" id="commonTasks">
+  <BLANKLINE>
+  <BLANKLINE>
+            <h4>Add:</h4>
+            <div class="body">
+  <BLANKLINE>
+  <BLANKLINE>
+  <BLANKLINE>
+      <div class="content even">
+  <BLANKLINE>
+  <BLANKLINE>
+        <a href="http://localhost:8081/++etc++site/default/PluggableAuthenticationService/BTreePrincipalSource/@@+/action.html?type_name=AddPrincipalForm.html"
+           class="">Principal</a>
+  <BLANKLINE>
+  <BLANKLINE>
+      </div>
+  <BLANKLINE>
+  <BLANKLINE>
+  <BLANKLINE>
+            </div>
+          </div>
+  <BLANKLINE>
+  <BLANKLINE>
+        <!-- Tree of the help topics that appears on the help namespace -->
+  <BLANKLINE>
+  <BLANKLINE>
+      </div>
+  <BLANKLINE>
+  <BLANKLINE>
+      <div id="workspace">
+  <BLANKLINE>
+  <BLANKLINE>
+        <div id="breadcrumbs"> Location:&nbsp;<a
+      href="http://localhost:8081/@@SelectedManagementView.html">[top]</a>
+             /
+            <a href="http://localhost:8081/++etc++site/@@SelectedManagementView.html">++etc++site</a> /
+            <a href="http://localhost:8081/++etc++site/default/@@SelectedManagementView.html">default</a> /
+            <a href="http://localhost:8081/++etc++site/default/PluggableAuthenticationService/@@SelectedManagementView.html">PluggableAuthenticationService</a> /
+            <a href="http://localhost:8081/++etc++site/default/PluggableAuthenticationService/BTreePrincipalSource/@@SelectedManagementView.html">BTreePrincipalSource</a> /
+        </div>
+  <BLANKLINE>
+  <BLANKLINE>
+  <BLANKLINE>
+        <div class="itemViews">
+  <BLANKLINE>
+            <a href="@@contents.html" class="selected">Contents</a>
+  <BLANKLINE>
+  <BLANKLINE>
+            <a href="@@classBrowser.html" class="">Introspector</a>
+  <BLANKLINE>
+        </div>
+  <BLANKLINE>
+        <!-- OnlineHelp with popup support -->
+        <!-- note, we reverse the actions list 'cos they're packed to the
+             screen from the right -->
+        <div id="actions">
+  <BLANKLINE>
+  <BLANKLINE>
+            <a href="javascript:popup('contents.html/++help++/@@contexthelp.html','OnlineHelp','height=400
+                                             ,width=700
+                                             ,resizable=1
+                                             ,scrollbars=yes
+                                             ,location=no
+                                             ,status=no
+                                             ,toolbar=no
+                                             ,menubar=no')">Help</a>
+  <BLANKLINE>
+  <BLANKLINE>
+            <a href="@@undoAll.html">Undo all</a>
+            <a href="@@undoMore.html">Undo more</a>
+            <a href="@@undo.html">Undo!</a>
+            <a href="@@errorRedirect.html">Errors</a>
+            <a href="@@find.html">Find</a>
+            <a href="@@+">Add</a>
+  <BLANKLINE>
+          &nbsp;
+        </div>
+  <BLANKLINE>
+  <BLANKLINE>
+        <div id="viewspace">
+  <BLANKLINE>
+          <div id="message">
+          </div>
+  <BLANKLINE>
+          <div id="content">
+            <div>
+    <div>
+  <BLANKLINE>
+      <form name="containerContentsForm" method="POST"
+            action="http://localhost:8081/++etc++site/default/PluggableAuthenticationService/BTreePrincipalSource/@@contents.html">
+  <BLANKLINE>
+  <BLANKLINE>
+  <BLANKLINE>
+  <BLANKLINE>
+  <BLANKLINE>
+  <BLANKLINE>
+        <table id="sortable" class="listing"
+               summary="Content listing">
+  <BLANKLINE>
+          <thead>
+            <tr>
+              <th>&nbsp;</th>
+              <th>Name</th>
+              <th>Title</th>
+              <th>Size</th>
+              <th>Created</th>
+              <th>Modified</th>
+            </tr>
+          </thead>
+  <BLANKLINE>
+          <tbody>
+  <BLANKLINE>
+  <BLANKLINE>
+  <BLANKLINE>
+  <BLANKLINE>
+          </tbody>
+        </table>
+  <BLANKLINE>
+        <div>
+  <BLANKLINE>
+  <BLANKLINE>
+  <BLANKLINE>
+  <BLANKLINE>
+  <BLANKLINE>
+  <BLANKLINE>
+  <BLANKLINE>
+  <BLANKLINE>
+  <BLANKLINE>
+            <input type="submit" name="container_add_button"
+                   value="Add" />
+  <BLANKLINE>
+            <input type="hidden" name="single_type_name"
+                   value="AddPrincipalForm.html" />
+  <BLANKLINE>
+  <BLANKLINE>
+        </div>
+  <BLANKLINE>
+  <BLANKLINE>
+  <BLANKLINE>
+      </form>
+  <BLANKLINE>
+      <script><!--
+          prettydump('focus', LG_INFO);
+          if (document.containerContentsForm.new_value)
+  	        document.containerContentsForm.new_value.focus();
+          //-->
+      </script>
+  <BLANKLINE>
+    </div>
+  <BLANKLINE>
+  </div>
+          </div>
+  <BLANKLINE>
+  <BLANKLINE>
+          <div id="context_information">
+  <BLANKLINE>
+            <div id="helpers">
+  <BLANKLINE>
+  <BLANKLINE>
+  <BLANKLINE>
+  <BLANKLINE>
+            </div>
+  <BLANKLINE>
+  <!--
+            <div id="inspectors">
+  <BLANKLINE>
+              <div class="box" id="metadata"
+                  tal:define="view context/@@MetaDataBox|nothing"
+                  tal:condition="view/strip|nothing">
+  <BLANKLINE>
+                <h4 i18n:translate="">Metadata</h4>
+  <BLANKLINE>
+                <div class="body">
+  <BLANKLINE>
+                  <div class="content" tal:content="structure view">
+                    Some metadata
+                  </div>
+  <BLANKLINE>
+                </div>
+              </div>
+            </div>
+  -->
+  <BLANKLINE>
+          </div>
+  <BLANKLINE>
+          <div class="spacer">
+            &nbsp;
+          </div>
+  <BLANKLINE>
+        </div>
+      </div>
+  <BLANKLINE>
+      <div id="footer" />
+  <BLANKLINE>
+      <div id="logger" />
+  <BLANKLINE>
+    </body>
+  <BLANKLINE>
+  </html>
+  <BLANKLINE>
+  <BLANKLINE>
+  <BLANKLINE>
+
+
+  >>> print http(r"""
+  ... POST /++etc++site/default/PluggableAuthenticationService/BTreePrincipalSource/@@contents.html HTTP/1.1
+  ... Authorization: Basic Z2xvYmFsbWdyOmdsb2JhbG1ncnB3
+  ... Content-Length: 63
+  ... Content-Type: application/x-www-form-urlencoded
+  ... Referer: http://localhost:8081/++etc++site/default/PluggableAuthenticationService/BTreePrincipalSource/@@contents.html
+  ... 
+  ... container_add_button=Add&single_type_name=AddPrincipalForm.html""")
+  HTTP/1.1 303 See Other
+  Connection: close
+  Content-Length: 6212
+  Content-Type: text/html;charset=utf-8
+  Location: http://localhost:8081/++etc++site/default/PluggableAuthenticationService/BTreePrincipalSource/+/AddPrincipalForm.html=
+  <BLANKLINE>
+  <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+  <BLANKLINE>
+  <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en"
+        lang="en">
+  <BLANKLINE>
+    <head>
+      <title>Z3: BTreePrincipalSource</title>
+  <BLANKLINE>
+      <style type="text/css" media="all">@import url(http://localhost:8081/@@/zope3.css);</style>
+  <BLANKLINE>
+      <style type="text/css" media="all">@import url(http://localhost:8081/@@/site_management.css);</style>
+  <BLANKLINE>
+      <meta http-equiv="Content-Type" content="text/html;charset=utf-8" />
+  <BLANKLINE>
+  <BLANKLINE>
+  <BLANKLINE>
+  <BLANKLINE>
+  <BLANKLINE>
+      <!-- Popup script for the OnlineHelp -->
+      <script type="text/javascript"
+              src="http://localhost:8081/@@/onlinehelp.js">
+      </script>
+  <BLANKLINE>
+  <BLANKLINE>
+      <!-- Ugly is better than lobotomized. -->
+      <script type="text/javascript"
+              src="http://localhost:8081/@@/xmltree.js">
+      </script>
+  <BLANKLINE>
+  <BLANKLINE>
+  <BLANKLINE>
+  <BLANKLINE>
+  <BLANKLINE>
+      <link rel="icon" type="image/png"
+            href="http://localhost:8081/@@/favicon.png" />
+    </head>
+  <BLANKLINE>
+    <body onload="loadtree('http://localhost:8081/', 'http://localhost:8081/++etc++site/default/PluggableAuthenticationService/BTreePrincipalSource/')">
+  <BLANKLINE>
+  <BLANKLINE>
+      <div id="global">
+        <div id="userDetails">
+  <BLANKLINE>
+            User:
+            Sample Manager
+  <BLANKLINE>
+  <BLANKLINE>
+  <BLANKLINE>
+            <a href="@@logout.html?nextURL=http%3A//localhost%3A8081/%2B%2Betc%2B%2Bsite/default/PluggableAuthenticationService/BTreePrincipalSource/%40%40contents.html">[Logout]</a>
+  <BLANKLINE>
+  <BLANKLINE>
+  <BLANKLINE>
+        </div>
+        <img src="http://localhost:8081/@@/zope3logo.gif" />
+      </div>
+  <BLANKLINE>
+  <BLANKLINE>
+  <BLANKLINE>
+  <BLANKLINE>
+      <div id="navigators">
+  <BLANKLINE>
+        <!-- Navigation tree box -->
+  <BLANKLINE>
+      <!-- Ugly is better than lobotomized. -->
+        <div class="box" id="navigationTree">
+          <h4>Navigation</h4>
+          <div xmlns="http://www.zope.org/zope3xmltree"
+               id="navtreecontents" class="body"
+               onclick="treeclicked(event);">Loading...</div>
+        </div>
+  <BLANKLINE>
+  <BLANKLINE>
+  <BLANKLINE>
+  <BLANKLINE>
+          <div class="box" id="commonTasks">
+  <BLANKLINE>
+  <BLANKLINE>
+            <h4>Add:</h4>
+            <div class="body">
+  <BLANKLINE>
+  <BLANKLINE>
+  <BLANKLINE>
+      <div class="content even">
+  <BLANKLINE>
+  <BLANKLINE>
+        <a href="http://localhost:8081/++etc++site/default/PluggableAuthenticationService/BTreePrincipalSource/@@+/action.html?type_name=AddPrincipalForm.html"
+           class="">Principal</a>
+  <BLANKLINE>
+  <BLANKLINE>
+      </div>
+  <BLANKLINE>
+  <BLANKLINE>
+  <BLANKLINE>
+            </div>
+          </div>
+  <BLANKLINE>
+  <BLANKLINE>
+        <!-- Tree of the help topics that appears on the help namespace -->
+  <BLANKLINE>
+  <BLANKLINE>
+      </div>
+  <BLANKLINE>
+  <BLANKLINE>
+      <div id="workspace">
+  <BLANKLINE>
+  <BLANKLINE>
+        <div id="breadcrumbs"> Location:&nbsp;<a
+      href="http://localhost:8081/@@SelectedManagementView.html">[top]</a>
+             /
+            <a href="http://localhost:8081/++etc++site/@@SelectedManagementView.html">++etc++site</a> /
+            <a href="http://localhost:8081/++etc++site/default/@@SelectedManagementView.html">default</a> /
+            <a href="http://localhost:8081/++etc++site/default/PluggableAuthenticationService/@@SelectedManagementView.html">PluggableAuthenticationService</a> /
+            <a href="http://localhost:8081/++etc++site/default/PluggableAuthenticationService/BTreePrincipalSource/@@SelectedManagementView.html">BTreePrincipalSource</a> /
+        </div>
+  <BLANKLINE>
+  <BLANKLINE>
+  <BLANKLINE>
+        <div class="itemViews">
+  <BLANKLINE>
+            <a href="@@contents.html" class="selected">Contents</a>
+  <BLANKLINE>
+  <BLANKLINE>
+            <a href="@@classBrowser.html" class="">Introspector</a>
+  <BLANKLINE>
+        </div>
+  <BLANKLINE>
+        <!-- OnlineHelp with popup support -->
+        <!-- note, we reverse the actions list 'cos they're packed to the
+             screen from the right -->
+        <div id="actions">
+  <BLANKLINE>
+  <BLANKLINE>
+            <a href="javascript:popup('contents.html/++help++/@@contexthelp.html','OnlineHelp','height=400
+                                             ,width=700
+                                             ,resizable=1
+                                             ,scrollbars=yes
+                                             ,location=no
+                                             ,status=no
+                                             ,toolbar=no
+                                             ,menubar=no')">Help</a>
+  <BLANKLINE>
+  <BLANKLINE>
+            <a href="@@undoAll.html">Undo all</a>
+            <a href="@@undoMore.html">Undo more</a>
+            <a href="@@undo.html">Undo!</a>
+            <a href="@@errorRedirect.html">Errors</a>
+            <a href="@@find.html">Find</a>
+            <a href="@@+">Add</a>
+  <BLANKLINE>
+          &nbsp;
+        </div>
+  <BLANKLINE>
+  <BLANKLINE>
+        <div id="viewspace">
+  <BLANKLINE>
+          <div id="message">
+          </div>
+  <BLANKLINE>
+          <div id="content">
+            <div>
+    <div>
+  <BLANKLINE>
+      <form name="containerContentsForm" method="POST"
+            action="http://localhost:8081/++etc++site/default/PluggableAuthenticationService/BTreePrincipalSource/@@contents.html">
+  <BLANKLINE>
+        <input type="hidden" name="type_name"
+               value="AddPrincipalForm.html" />
+  <BLANKLINE>
+  <BLANKLINE>
+  <BLANKLINE>
+  <BLANKLINE>
+        <table id="sortable" class="listing"
+               summary="Content listing">
+  <BLANKLINE>
+          <thead>
+            <tr>
+              <th>&nbsp;</th>
+              <th>Name</th>
+              <th>Title</th>
+              <th>Size</th>
+              <th>Created</th>
+              <th>Modified</th>
+            </tr>
+          </thead>
+  <BLANKLINE>
+          <tbody>
+  <BLANKLINE>
+  <BLANKLINE>
+  <BLANKLINE>
+  <BLANKLINE>
+          </tbody>
+        </table>
+  <BLANKLINE>
+  <BLANKLINE>
+  <BLANKLINE>
+  <BLANKLINE>
+  <BLANKLINE>
+      </form>
+  <BLANKLINE>
+      <script><!--
+          prettydump('focus', LG_INFO);
+          if (document.containerContentsForm.new_value)
+  	        document.containerContentsForm.new_value.focus();
+          //-->
+      </script>
+  <BLANKLINE>
+    </div>
+  <BLANKLINE>
+  </div>
+          </div>
+  <BLANKLINE>
+  <BLANKLINE>
+          <div id="context_information">
+  <BLANKLINE>
+            <div id="helpers">
+  <BLANKLINE>
+  <BLANKLINE>
+  <BLANKLINE>
+  <BLANKLINE>
+            </div>
+  <BLANKLINE>
+  <!--
+            <div id="inspectors">
+  <BLANKLINE>
+              <div class="box" id="metadata"
+                  tal:define="view context/@@MetaDataBox|nothing"
+                  tal:condition="view/strip|nothing">
+  <BLANKLINE>
+                <h4 i18n:translate="">Metadata</h4>
+  <BLANKLINE>
+                <div class="body">
+  <BLANKLINE>
+                  <div class="content" tal:content="structure view">
+                    Some metadata
+                  </div>
+  <BLANKLINE>
+                </div>
+              </div>
+            </div>
+  -->
+  <BLANKLINE>
+          </div>
+  <BLANKLINE>
+          <div class="spacer">
+            &nbsp;
+          </div>
+  <BLANKLINE>
+        </div>
+      </div>
+  <BLANKLINE>
+      <div id="footer" />
+  <BLANKLINE>
+      <div id="logger" />
+  <BLANKLINE>
+    </body>
+  <BLANKLINE>
+  </html>
+  <BLANKLINE>
+  <BLANKLINE>
+  <BLANKLINE>
+
+
+  >>> print http(r"""
+  ... GET /++etc++site/default/PluggableAuthenticationService/BTreePrincipalSource/+/AddPrincipalForm.html= HTTP/1.1
+  ... Authorization: Basic Z2xvYmFsbWdyOmdsb2JhbG1ncnB3
+  ... Referer: http://localhost:8081/++etc++site/default/PluggableAuthenticationService/BTreePrincipalSource/@@contents.html
+  ... """)
+  HTTP/1.1 200 Ok
+  Connection: close
+  Content-Length: 6224
+  Content-Type: text/html;charset=utf-8
+  <BLANKLINE>
+  <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+  <BLANKLINE>
+  <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en"
+        lang="en">
+  <BLANKLINE>
+    <head>
+      <title>Z3: +</title>
+  <BLANKLINE>
+      <style type="text/css" media="all">@import url(http://localhost:8081/@@/zope3.css);</style>
+  <BLANKLINE>
+      <style type="text/css" media="all">@import url(http://localhost:8081/@@/site_management.css);</style>
+  <BLANKLINE>
+      <meta http-equiv="Content-Type" content="text/html;charset=utf-8" />
+  <BLANKLINE>
+  <BLANKLINE>
+  <BLANKLINE>
+  <BLANKLINE>
+  <BLANKLINE>
+      <!-- Popup script for the OnlineHelp -->
+      <script type="text/javascript"
+              src="http://localhost:8081/@@/onlinehelp.js">
+      </script>
+  <BLANKLINE>
+  <BLANKLINE>
+      <!-- Ugly is better than lobotomized. -->
+      <script type="text/javascript"
+              src="http://localhost:8081/@@/xmltree.js">
+      </script>
+  <BLANKLINE>
+  <BLANKLINE>
+  <BLANKLINE>
+  <BLANKLINE>
+  <BLANKLINE>
+      <link rel="icon" type="image/png"
+            href="http://localhost:8081/@@/favicon.png" />
+    </head>
+  <BLANKLINE>
+    <body onload="loadtree('http://localhost:8081/', 'http://localhost:8081/++etc++site/default/PluggableAuthenticationService/BTreePrincipalSource/+/')">
+  <BLANKLINE>
+  <BLANKLINE>
+      <div id="global">
+        <div id="userDetails">
+  <BLANKLINE>
+            User:
+            Sample Manager
+  <BLANKLINE>
+  <BLANKLINE>
+  <BLANKLINE>
+            <a href="@@logout.html?nextURL=http%3A//localhost%3A8081/%2B%2Betc%2B%2Bsite/default/PluggableAuthenticationService/BTreePrincipalSource/%2B/AddPrincipalForm.html%253D">[Logout]</a>
+  <BLANKLINE>
+  <BLANKLINE>
+  <BLANKLINE>
+        </div>
+        <img src="http://localhost:8081/@@/zope3logo.gif" />
+      </div>
+  <BLANKLINE>
+  <BLANKLINE>
+  <BLANKLINE>
+  <BLANKLINE>
+      <div id="navigators">
+  <BLANKLINE>
+        <!-- Navigation tree box -->
+  <BLANKLINE>
+      <!-- Ugly is better than lobotomized. -->
+        <div class="box" id="navigationTree">
+          <h4>Navigation</h4>
+          <div xmlns="http://www.zope.org/zope3xmltree"
+               id="navtreecontents" class="body"
+               onclick="treeclicked(event);">Loading...</div>
+        </div>
+  <BLANKLINE>
+  <BLANKLINE>
+  <BLANKLINE>
+  <BLANKLINE>
+        <!-- Tree of the help topics that appears on the help namespace -->
+  <BLANKLINE>
+  <BLANKLINE>
+      </div>
+  <BLANKLINE>
+  <BLANKLINE>
+      <div id="workspace">
+  <BLANKLINE>
+  <BLANKLINE>
+        <div id="breadcrumbs"> Location:&nbsp;<a
+      href="http://localhost:8081/@@SelectedManagementView.html">[top]</a>
+             /
+            <a href="http://localhost:8081/++etc++site/@@SelectedManagementView.html">++etc++site</a> /
+            <a href="http://localhost:8081/++etc++site/default/@@SelectedManagementView.html">default</a> /
+            <a href="http://localhost:8081/++etc++site/default/PluggableAuthenticationService/@@SelectedManagementView.html">PluggableAuthenticationService</a> /
+            <a href="http://localhost:8081/++etc++site/default/PluggableAuthenticationService/BTreePrincipalSource/@@SelectedManagementView.html">BTreePrincipalSource</a> /
+            <a href="http://localhost:8081/++etc++site/default/PluggableAuthenticationService/BTreePrincipalSource/+/@@SelectedManagementView.html">+</a> /
+        </div>
+  <BLANKLINE>
+  <BLANKLINE>
+  <BLANKLINE>
+  <BLANKLINE>
+  <BLANKLINE>
+        <!-- OnlineHelp with popup support -->
+        <!-- note, we reverse the actions list 'cos they're packed to the
+             screen from the right -->
+  <BLANKLINE>
+  <BLANKLINE>
+  <BLANKLINE>
+        <div id="viewspace">
+  <BLANKLINE>
+          <div id="message">
+          </div>
+  <BLANKLINE>
+          <div id="content">
+            <div>
+  <BLANKLINE>
+    <div>
+  <BLANKLINE>
+      <form action="http://localhost:8081/++etc++site/default/PluggableAuthenticationService/BTreePrincipalSource/+/AddPrincipalForm.html%3D"
+            method="post" enctype="multipart/form-data">
+  <BLANKLINE>
+        <div>
+  <BLANKLINE>
+          <h3>Add Simple User with details</h3>
+  <BLANKLINE>
+  <BLANKLINE>
+  <BLANKLINE>
+  <BLANKLINE>
+  <BLANKLINE>
+  <BLANKLINE>
+  <BLANKLINE>
+  <BLANKLINE>
+  <BLANKLINE>
+  <BLANKLINE>
+        <div class="row">
+  <BLANKLINE>
+            <div class="label">
+              <label for="field.login"
+                     title="The Login/Username of the user. This value can change.">Login</label>
+            </div>
+            <div class="field"><input class="textType" id="field.login" name="field.login" size="20" type="text" value=""  /></div>
+  <BLANKLINE>
+  <BLANKLINE>
+        </div>
+        <div class="row">
+  <BLANKLINE>
+            <div class="label">
+              <label for="field.password"
+                     title="The password for the user.">Password</label>
+            </div>
+            <div class="field"><input class="passwordType" id="field.password" name="field.password" size="20" type="password" value=""  /></div>
+  <BLANKLINE>
+  <BLANKLINE>
+        </div>
+        <div class="row">
+  <BLANKLINE>
+            <div class="label">
+              <label for="field.title"
+                     title="The title of the principal. This is usually used in the UI.">Title</label>
+            </div>
+            <div class="field"><input class="textType" id="field.title" name="field.title" size="20" type="text" value=""  /></div>
+  <BLANKLINE>
+  <BLANKLINE>
+        </div>
+        <div class="row">
+  <BLANKLINE>
+            <div class="label">
+              <label for="field.description"
+                     title="A detailed description of the principal.">Description</label>
+            </div>
+            <div class="field"><textarea cols="60" id="field.description" name="field.description" rows="15" ></textarea></div>
+  <BLANKLINE>
+  <BLANKLINE>
+        </div>
+  <BLANKLINE>
+  <BLANKLINE>
+          <div class="separator"></div>
+  <BLANKLINE>
+  <BLANKLINE>
+  <BLANKLINE>
+          <div class="separator"></div>
+  <BLANKLINE>
+        </div>
+        <br /><br />
+        <div class="row">
+          <div class="controls"><hr />
+            <input type="submit" value="Refresh" />
+            <input type="submit" value="Add"
+                   name="UPDATE_SUBMIT" />
+  <BLANKLINE>
+          </div>
+        </div>
+  <BLANKLINE>
+  <BLANKLINE>
+  <BLANKLINE>
+        <div class="separator"></div>
+      </form>
+    </div>
+  <BLANKLINE>
+    </div>
+          </div>
+  <BLANKLINE>
+  <BLANKLINE>
+          <div id="context_information">
+  <BLANKLINE>
+            <div id="helpers">
+  <BLANKLINE>
+  <BLANKLINE>
+  <BLANKLINE>
+  <BLANKLINE>
+            </div>
+  <BLANKLINE>
+  <!--
+            <div id="inspectors">
+  <BLANKLINE>
+              <div class="box" id="metadata"
+                  tal:define="view context/@@MetaDataBox|nothing"
+                  tal:condition="view/strip|nothing">
+  <BLANKLINE>
+                <h4 i18n:translate="">Metadata</h4>
+  <BLANKLINE>
+                <div class="body">
+  <BLANKLINE>
+                  <div class="content" tal:content="structure view">
+                    Some metadata
+                  </div>
+  <BLANKLINE>
+                </div>
+              </div>
+            </div>
+  -->
+  <BLANKLINE>
+          </div>
+  <BLANKLINE>
+          <div class="spacer">
+            &nbsp;
+          </div>
+  <BLANKLINE>
+        </div>
+      </div>
+  <BLANKLINE>
+      <div id="footer" />
+  <BLANKLINE>
+      <div id="logger" />
+  <BLANKLINE>
+    </body>
+  <BLANKLINE>
+  </html>
+  <BLANKLINE>
+  <BLANKLINE>
+  <BLANKLINE>
+  <BLANKLINE>
+
+
+  >>> print http(r"""
+  ... POST /++etc++site/default/PluggableAuthenticationService/BTreePrincipalSource/+/AddPrincipalForm.html%3D HTTP/1.1
+  ... Authorization: Basic Z2xvYmFsbWdyOmdsb2JhbG1ncnB3
+  ... Content-Length: 670
+  ... Content-Type: multipart/form-data; boundary=---------------------------1667868105456130284903308969
+  ... Referer: http://localhost:8081/++etc++site/default/PluggableAuthenticationService/BTreePrincipalSource/+/AddPrincipalForm.html=
+  ... 
+  ... -----------------------------1667868105456130284903308969
+  ... Content-Disposition: form-data; name="field.login"
+  ... 
+  ... mgr
+  ... -----------------------------1667868105456130284903308969
+  ... Content-Disposition: form-data; name="field.password"
+  ... 
+  ... mgrpw
+  ... -----------------------------1667868105456130284903308969
+  ... Content-Disposition: form-data; name="field.title"
+  ... 
+  ... Test Manager
+  ... -----------------------------1667868105456130284903308969
+  ... Content-Disposition: form-data; name="field.description"
+  ... 
+  ... 
+  ... -----------------------------1667868105456130284903308969
+  ... Content-Disposition: form-data; name="UPDATE_SUBMIT"
+  ... 
+  ... Add
+  ... -----------------------------1667868105456130284903308969--
+  ... """)
+  HTTP/1.1 303 See Other
+  Connection: close
+  Content-Length: 6239
+  Content-Type: text/html;charset=utf-8
+  Location: http://localhost:8081/++etc++site/default/PluggableAuthenticationService/BTreePrincipalSource/@@contents.html
+  <BLANKLINE>
+  <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+  <BLANKLINE>
+  <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en"
+        lang="en">
+  <BLANKLINE>
+    <head>
+      <title>Z3: +</title>
+  <BLANKLINE>
+      <style type="text/css" media="all">@import url(http://localhost:8081/@@/zope3.css);</style>
+  <BLANKLINE>
+      <style type="text/css" media="all">@import url(http://localhost:8081/@@/site_management.css);</style>
+  <BLANKLINE>
+      <meta http-equiv="Content-Type" content="text/html;charset=utf-8" />
+  <BLANKLINE>
+  <BLANKLINE>
+  <BLANKLINE>
+  <BLANKLINE>
+  <BLANKLINE>
+      <!-- Popup script for the OnlineHelp -->
+      <script type="text/javascript"
+              src="http://localhost:8081/@@/onlinehelp.js">
+      </script>
+  <BLANKLINE>
+  <BLANKLINE>
+      <!-- Ugly is better than lobotomized. -->
+      <script type="text/javascript"
+              src="http://localhost:8081/@@/xmltree.js">
+      </script>
+  <BLANKLINE>
+  <BLANKLINE>
+  <BLANKLINE>
+  <BLANKLINE>
+  <BLANKLINE>
+      <link rel="icon" type="image/png"
+            href="http://localhost:8081/@@/favicon.png" />
+    </head>
+  <BLANKLINE>
+    <body onload="loadtree('http://localhost:8081/', 'http://localhost:8081/++etc++site/default/PluggableAuthenticationService/BTreePrincipalSource/+/')">
+  <BLANKLINE>
+  <BLANKLINE>
+      <div id="global">
+        <div id="userDetails">
+  <BLANKLINE>
+            User:
+            Sample Manager
+  <BLANKLINE>
+  <BLANKLINE>
+  <BLANKLINE>
+            <a href="@@logout.html?nextURL=http%3A//localhost%3A8081/%2B%2Betc%2B%2Bsite/default/PluggableAuthenticationService/BTreePrincipalSource/%2B/AddPrincipalForm.html%253D">[Logout]</a>
+  <BLANKLINE>
+  <BLANKLINE>
+  <BLANKLINE>
+        </div>
+        <img src="http://localhost:8081/@@/zope3logo.gif" />
+      </div>
+  <BLANKLINE>
+  <BLANKLINE>
+  <BLANKLINE>
+  <BLANKLINE>
+      <div id="navigators">
+  <BLANKLINE>
+        <!-- Navigation tree box -->
+  <BLANKLINE>
+      <!-- Ugly is better than lobotomized. -->
+        <div class="box" id="navigationTree">
+          <h4>Navigation</h4>
+          <div xmlns="http://www.zope.org/zope3xmltree"
+               id="navtreecontents" class="body"
+               onclick="treeclicked(event);">Loading...</div>
+        </div>
+  <BLANKLINE>
+  <BLANKLINE>
+  <BLANKLINE>
+  <BLANKLINE>
+        <!-- Tree of the help topics that appears on the help namespace -->
+  <BLANKLINE>
+  <BLANKLINE>
+      </div>
+  <BLANKLINE>
+  <BLANKLINE>
+      <div id="workspace">
+  <BLANKLINE>
+  <BLANKLINE>
+        <div id="breadcrumbs"> Location:&nbsp;<a
+      href="http://localhost:8081/@@SelectedManagementView.html">[top]</a>
+             /
+            <a href="http://localhost:8081/++etc++site/@@SelectedManagementView.html">++etc++site</a> /
+            <a href="http://localhost:8081/++etc++site/default/@@SelectedManagementView.html">default</a> /
+            <a href="http://localhost:8081/++etc++site/default/PluggableAuthenticationService/@@SelectedManagementView.html">PluggableAuthenticationService</a> /
+            <a href="http://localhost:8081/++etc++site/default/PluggableAuthenticationService/BTreePrincipalSource/@@SelectedManagementView.html">BTreePrincipalSource</a> /
+            <a href="http://localhost:8081/++etc++site/default/PluggableAuthenticationService/BTreePrincipalSource/+/@@SelectedManagementView.html">+</a> /
+        </div>
+  <BLANKLINE>
+  <BLANKLINE>
+  <BLANKLINE>
+  <BLANKLINE>
+  <BLANKLINE>
+        <!-- OnlineHelp with popup support -->
+        <!-- note, we reverse the actions list 'cos they're packed to the
+             screen from the right -->
+  <BLANKLINE>
+  <BLANKLINE>
+  <BLANKLINE>
+        <div id="viewspace">
+  <BLANKLINE>
+          <div id="message">
+          </div>
+  <BLANKLINE>
+          <div id="content">
+            <div>
+  <BLANKLINE>
+    <div>
+  <BLANKLINE>
+      <form action="http://localhost:8081/++etc++site/default/PluggableAuthenticationService/BTreePrincipalSource/+/AddPrincipalForm.html%3D"
+            method="post" enctype="multipart/form-data">
+  <BLANKLINE>
+        <div>
+  <BLANKLINE>
+          <h3>Add Simple User with details</h3>
+  <BLANKLINE>
+  <BLANKLINE>
+  <BLANKLINE>
+  <BLANKLINE>
+  <BLANKLINE>
+  <BLANKLINE>
+  <BLANKLINE>
+  <BLANKLINE>
+  <BLANKLINE>
+  <BLANKLINE>
+        <div class="row">
+  <BLANKLINE>
+            <div class="label">
+              <label for="field.login"
+                     title="The Login/Username of the user. This value can change.">Login</label>
+            </div>
+            <div class="field"><input class="textType" id="field.login" name="field.login" size="20" type="text" value="mgr"  /></div>
+  <BLANKLINE>
+  <BLANKLINE>
+        </div>
+        <div class="row">
+  <BLANKLINE>
+            <div class="label">
+              <label for="field.password"
+                     title="The password for the user.">Password</label>
+            </div>
+            <div class="field"><input class="passwordType" id="field.password" name="field.password" size="20" type="password" value=""  /></div>
+  <BLANKLINE>
+  <BLANKLINE>
+        </div>
+        <div class="row">
+  <BLANKLINE>
+            <div class="label">
+              <label for="field.title"
+                     title="The title of the principal. This is usually used in the UI.">Title</label>
+            </div>
+            <div class="field"><input class="textType" id="field.title" name="field.title" size="20" type="text" value="Test Manager"  /></div>
+  <BLANKLINE>
+  <BLANKLINE>
+        </div>
+        <div class="row">
+  <BLANKLINE>
+            <div class="label">
+              <label for="field.description"
+                     title="A detailed description of the principal.">Description</label>
+            </div>
+            <div class="field"><textarea cols="60" id="field.description" name="field.description" rows="15" ></textarea></div>
+  <BLANKLINE>
+  <BLANKLINE>
+        </div>
+  <BLANKLINE>
+  <BLANKLINE>
+          <div class="separator"></div>
+  <BLANKLINE>
+  <BLANKLINE>
+  <BLANKLINE>
+          <div class="separator"></div>
+  <BLANKLINE>
+        </div>
+        <br /><br />
+        <div class="row">
+          <div class="controls"><hr />
+            <input type="submit" value="Refresh" />
+            <input type="submit" value="Add"
+                   name="UPDATE_SUBMIT" />
+  <BLANKLINE>
+          </div>
+        </div>
+  <BLANKLINE>
+  <BLANKLINE>
+  <BLANKLINE>
+        <div class="separator"></div>
+      </form>
+    </div>
+  <BLANKLINE>
+    </div>
+          </div>
+  <BLANKLINE>
+  <BLANKLINE>
+          <div id="context_information">
+  <BLANKLINE>
+            <div id="helpers">
+  <BLANKLINE>
+  <BLANKLINE>
+  <BLANKLINE>
+  <BLANKLINE>
+            </div>
+  <BLANKLINE>
+  <!--
+            <div id="inspectors">
+  <BLANKLINE>
+              <div class="box" id="metadata"
+                  tal:define="view context/@@MetaDataBox|nothing"
+                  tal:condition="view/strip|nothing">
+  <BLANKLINE>
+                <h4 i18n:translate="">Metadata</h4>
+  <BLANKLINE>
+                <div class="body">
+  <BLANKLINE>
+                  <div class="content" tal:content="structure view">
+                    Some metadata
+                  </div>
+  <BLANKLINE>
+                </div>
+              </div>
+            </div>
+  -->
+  <BLANKLINE>
+          </div>
+  <BLANKLINE>
+          <div class="spacer">
+            &nbsp;
+          </div>
+  <BLANKLINE>
+        </div>
+      </div>
+  <BLANKLINE>
+      <div id="footer" />
+  <BLANKLINE>
+      <div id="logger" />
+  <BLANKLINE>
+    </body>
+  <BLANKLINE>
+  </html>
+  <BLANKLINE>
+  <BLANKLINE>
+  <BLANKLINE>
+  <BLANKLINE>
+
+
+  >>> print http(r"""
+  ... GET /++etc++site/default/PluggableAuthenticationService/BTreePrincipalSource/@@contents.html HTTP/1.1
+  ... Authorization: Basic Z2xvYmFsbWdyOmdsb2JhbG1ncnB3
+  ... Referer: http://localhost:8081/++etc++site/default/PluggableAuthenticationService/BTreePrincipalSource/+/AddPrincipalForm.html=
+  ... """)
+  HTTP/1.1 200 Ok
+  Connection: close
+  Content-Length: 7252
+  Content-Type: text/html;charset=utf-8
+  <BLANKLINE>
+  <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+  <BLANKLINE>
+  <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en"
+        lang="en">
+  <BLANKLINE>
+    <head>
+      <title>Z3: BTreePrincipalSource</title>
+  <BLANKLINE>
+      <style type="text/css" media="all">@import url(http://localhost:8081/@@/zope3.css);</style>
+  <BLANKLINE>
+      <style type="text/css" media="all">@import url(http://localhost:8081/@@/site_management.css);</style>
+  <BLANKLINE>
+      <meta http-equiv="Content-Type" content="text/html;charset=utf-8" />
+  <BLANKLINE>
+  <BLANKLINE>
+  <BLANKLINE>
+  <BLANKLINE>
+  <BLANKLINE>
+      <!-- Popup script for the OnlineHelp -->
+      <script type="text/javascript"
+              src="http://localhost:8081/@@/onlinehelp.js">
+      </script>
+  <BLANKLINE>
+  <BLANKLINE>
+      <!-- Ugly is better than lobotomized. -->
+      <script type="text/javascript"
+              src="http://localhost:8081/@@/xmltree.js">
+      </script>
+  <BLANKLINE>
+  <BLANKLINE>
+  <BLANKLINE>
+  <BLANKLINE>
+  <BLANKLINE>
+      <link rel="icon" type="image/png"
+            href="http://localhost:8081/@@/favicon.png" />
+    </head>
+  <BLANKLINE>
+    <body onload="loadtree('http://localhost:8081/', 'http://localhost:8081/++etc++site/default/PluggableAuthenticationService/BTreePrincipalSource/')">
+  <BLANKLINE>
+  <BLANKLINE>
+      <div id="global">
+        <div id="userDetails">
+  <BLANKLINE>
+            User:
+            Sample Manager
+  <BLANKLINE>
+  <BLANKLINE>
+  <BLANKLINE>
+            <a href="@@logout.html?nextURL=http%3A//localhost%3A8081/%2B%2Betc%2B%2Bsite/default/PluggableAuthenticationService/BTreePrincipalSource/%40%40contents.html">[Logout]</a>
+  <BLANKLINE>
+  <BLANKLINE>
+  <BLANKLINE>
+        </div>
+        <img src="http://localhost:8081/@@/zope3logo.gif" />
+      </div>
+  <BLANKLINE>
+  <BLANKLINE>
+  <BLANKLINE>
+  <BLANKLINE>
+      <div id="navigators">
+  <BLANKLINE>
+        <!-- Navigation tree box -->
+  <BLANKLINE>
+      <!-- Ugly is better than lobotomized. -->
+        <div class="box" id="navigationTree">
+          <h4>Navigation</h4>
+          <div xmlns="http://www.zope.org/zope3xmltree"
+               id="navtreecontents" class="body"
+               onclick="treeclicked(event);">Loading...</div>
+        </div>
+  <BLANKLINE>
+  <BLANKLINE>
+  <BLANKLINE>
+  <BLANKLINE>
+          <div class="box" id="commonTasks">
+  <BLANKLINE>
+  <BLANKLINE>
+            <h4>Add:</h4>
+            <div class="body">
+  <BLANKLINE>
+  <BLANKLINE>
+  <BLANKLINE>
+      <div class="content even">
+  <BLANKLINE>
+  <BLANKLINE>
+        <a href="http://localhost:8081/++etc++site/default/PluggableAuthenticationService/BTreePrincipalSource/@@+/action.html?type_name=AddPrincipalForm.html"
+           class="">Principal</a>
+  <BLANKLINE>
+  <BLANKLINE>
+      </div>
+  <BLANKLINE>
+  <BLANKLINE>
+  <BLANKLINE>
+            </div>
+          </div>
+  <BLANKLINE>
+  <BLANKLINE>
+        <!-- Tree of the help topics that appears on the help namespace -->
+  <BLANKLINE>
+  <BLANKLINE>
+      </div>
+  <BLANKLINE>
+  <BLANKLINE>
+      <div id="workspace">
+  <BLANKLINE>
+  <BLANKLINE>
+        <div id="breadcrumbs"> Location:&nbsp;<a
+      href="http://localhost:8081/@@SelectedManagementView.html">[top]</a>
+             /
+            <a href="http://localhost:8081/++etc++site/@@SelectedManagementView.html">++etc++site</a> /
+            <a href="http://localhost:8081/++etc++site/default/@@SelectedManagementView.html">default</a> /
+            <a href="http://localhost:8081/++etc++site/default/PluggableAuthenticationService/@@SelectedManagementView.html">PluggableAuthenticationService</a> /
+            <a href="http://localhost:8081/++etc++site/default/PluggableAuthenticationService/BTreePrincipalSource/@@SelectedManagementView.html">BTreePrincipalSource</a> /
+        </div>
+  <BLANKLINE>
+  <BLANKLINE>
+  <BLANKLINE>
+        <div class="itemViews">
+  <BLANKLINE>
+            <a href="@@contents.html" class="selected">Contents</a>
+  <BLANKLINE>
+  <BLANKLINE>
+            <a href="@@classBrowser.html" class="">Introspector</a>
+  <BLANKLINE>
+        </div>
+  <BLANKLINE>
+        <!-- OnlineHelp with popup support -->
+        <!-- note, we reverse the actions list 'cos they're packed to the
+             screen from the right -->
+        <div id="actions">
+  <BLANKLINE>
+  <BLANKLINE>
+            <a href="javascript:popup('contents.html/++help++/@@contexthelp.html','OnlineHelp','height=400
+                                             ,width=700
+                                             ,resizable=1
+                                             ,scrollbars=yes
+                                             ,location=no
+                                             ,status=no
+                                             ,toolbar=no
+                                             ,menubar=no')">Help</a>
+  <BLANKLINE>
+  <BLANKLINE>
+            <a href="@@undoAll.html">Undo all</a>
+            <a href="@@undoMore.html">Undo more</a>
+            <a href="@@undo.html">Undo!</a>
+            <a href="@@errorRedirect.html">Errors</a>
+            <a href="@@find.html">Find</a>
+            <a href="@@+">Add</a>
+  <BLANKLINE>
+          &nbsp;
+        </div>
+  <BLANKLINE>
+  <BLANKLINE>
+        <div id="viewspace">
+  <BLANKLINE>
+          <div id="message">
+          </div>
+  <BLANKLINE>
+          <div id="content">
+            <div>
+    <div>
+  <BLANKLINE>
+      <form name="containerContentsForm" method="POST"
+            action="http://localhost:8081/++etc++site/default/PluggableAuthenticationService/BTreePrincipalSource/@@contents.html">
+  <BLANKLINE>
+  <BLANKLINE>
+  <BLANKLINE>
+  <BLANKLINE>
+  <BLANKLINE>
+  <BLANKLINE>
+        <table id="sortable" class="listing"
+               summary="Content listing">
+  <BLANKLINE>
+          <thead>
+            <tr>
+              <th>&nbsp;</th>
+              <th>Name</th>
+              <th>Title</th>
+              <th>Size</th>
+              <th>Created</th>
+              <th>Modified</th>
+            </tr>
+          </thead>
+  <BLANKLINE>
+          <tbody>
+  <BLANKLINE>
+  <BLANKLINE>
+  <BLANKLINE>
+  <BLANKLINE>
+            <tr class="even">
+              <td>
+                <input type="checkbox" class="noborder"
+                       name="ids:list" id="mgr" value="mgr" />
+              </td>
+              <td><a href="mgr/@@SelectedManagementView.html"></a><span>
+                    <a href="mgr/@@SelectedManagementView.html">mgr</a></span></td>
+              <td>
+  <BLANKLINE>
+  <BLANKLINE>
+                <span>&nbsp;&nbsp;&nbsp;&nbsp;</span>
+              </td>
+  <BLANKLINE>
+              <td><span>n/a</span></td>
+              <td><span>&nbsp;</span></td>
+              <td><span>&nbsp;</span></td>
+            </tr>
+  <BLANKLINE>
+  <BLANKLINE>
+          </tbody>
+        </table>
+  <BLANKLINE>
+        <div>
+  <BLANKLINE>
+  <BLANKLINE>
+          <input type="submit" name="container_cut_button"
+                 value="Cut" />
+          <input type="submit" name="container_copy_button"
+                 value="Copy" />
+  <BLANKLINE>
+          <input type="submit" name="container_delete_button"
+                 value="Delete" />
+  <BLANKLINE>
+  <BLANKLINE>
+  <BLANKLINE>
+            <input type="submit" name="container_add_button"
+                   value="Add" />
+  <BLANKLINE>
+            <input type="hidden" name="single_type_name"
+                   value="AddPrincipalForm.html" />
+  <BLANKLINE>
+  <BLANKLINE>
+        </div>
+  <BLANKLINE>
+  <BLANKLINE>
+  <BLANKLINE>
+      </form>
+  <BLANKLINE>
+      <script><!--
+          prettydump('focus', LG_INFO);
+          if (document.containerContentsForm.new_value)
+  	        document.containerContentsForm.new_value.focus();
+          //-->
+      </script>
+  <BLANKLINE>
+    </div>
+  <BLANKLINE>
+  </div>
+          </div>
+  <BLANKLINE>
+  <BLANKLINE>
+          <div id="context_information">
+  <BLANKLINE>
+            <div id="helpers">
+  <BLANKLINE>
+  <BLANKLINE>
+  <BLANKLINE>
+  <BLANKLINE>
+            </div>
+  <BLANKLINE>
+  <!--
+            <div id="inspectors">
+  <BLANKLINE>
+              <div class="box" id="metadata"
+                  tal:define="view context/@@MetaDataBox|nothing"
+                  tal:condition="view/strip|nothing">
+  <BLANKLINE>
+                <h4 i18n:translate="">Metadata</h4>
+  <BLANKLINE>
+                <div class="body">
+  <BLANKLINE>
+                  <div class="content" tal:content="structure view">
+                    Some metadata
+                  </div>
+  <BLANKLINE>
+                </div>
+              </div>
+            </div>
+  -->
+  <BLANKLINE>
+          </div>
+  <BLANKLINE>
+          <div class="spacer">
+            &nbsp;
+          </div>
+  <BLANKLINE>
+        </div>
+      </div>
+  <BLANKLINE>
+      <div id="footer" />
+  <BLANKLINE>
+      <div id="logger" />
+  <BLANKLINE>
+    </body>
+  <BLANKLINE>
+  </html>
+  <BLANKLINE>
+  <BLANKLINE>
+  <BLANKLINE>

Modified: Zope3/branches/ZopeX3-3.0/src/zope/app/publisher/xmlrpc/tests/test_directives.py
===================================================================
--- Zope3/branches/ZopeX3-3.0/src/zope/app/publisher/xmlrpc/tests/test_directives.py	2004-08-27 14:28:18 UTC (rev 27289)
+++ Zope3/branches/ZopeX3-3.0/src/zope/app/publisher/xmlrpc/tests/test_directives.py	2004-08-27 14:28:21 UTC (rev 27290)
@@ -43,31 +43,31 @@
 
     def testView(self):
         self.assertEqual(queryView(ob, 'test', request), None)
-        context = xmlconfig.file("xmlrpc.zcml", xmlrpc.tests)
+        xmlconfig.file("xmlrpc.zcml", xmlrpc.tests)
         self.assertEqual(queryView(ob, 'test', request).__class__, V1)
 
     def testInterfaceProtectedView(self):
-        context = xmlconfig.file("xmlrpc.zcml", xmlrpc.tests)
+        xmlconfig.file("xmlrpc.zcml", xmlrpc.tests)
         v = getView(ob, 'test2', request)
         v = ProxyFactory(v)
         self.assertEqual(v.index(), 'V1 here')
         self.assertRaises(Exception, getattr, v, 'action')
 
     def testAttributeProtectedView(self):
-        context = xmlconfig.file("xmlrpc.zcml", xmlrpc.tests)
+        xmlconfig.file("xmlrpc.zcml", xmlrpc.tests)
         v = getView(ob, 'test3', request)
         v = ProxyFactory(v)
         self.assertEqual(v.action(), 'done')
         self.assertRaises(Exception, getattr, v, 'index')
 
     def testInterfaceAndAttributeProtectedView(self):
-        context = xmlconfig.file("xmlrpc.zcml", xmlrpc.tests)
+        xmlconfig.file("xmlrpc.zcml", xmlrpc.tests)
         v = getView(ob, 'test4', request)
         self.assertEqual(v.index(), 'V1 here')
         self.assertEqual(v.action(), 'done')
 
     def testDuplicatedInterfaceAndAttributeProtectedView(self):
-        context = xmlconfig.file("xmlrpc.zcml", xmlrpc.tests)
+        xmlconfig.file("xmlrpc.zcml", xmlrpc.tests)
         v = getView(ob, 'test5', request)
         self.assertEqual(v.index(), 'V1 here')
         self.assertEqual(v.action(), 'done')
@@ -76,11 +76,16 @@
         self.assertRaises(ConfigurationError, xmlconfig.file,
                           "xmlrpc_error.zcml", xmlrpc.tests)
 
-    def testDefaultView(self):
-        context = xmlconfig.file("xmlrpc.zcml", xmlrpc.tests)
-        self.assertEqual(getDefaultViewName(ob, request), 'test')
+    def test_no_name(self):
+        xmlconfig.file("xmlrpc.zcml", xmlrpc.tests)
+        v = getView(ob, 'index', request)
+        self.assertEqual(v(), 'V1 here')
+        v = getView(ob, 'action', request)
+        self.assertEqual(v(), 'done')
 
+        
 
+
 def test_suite():
     return unittest.TestSuite((
         unittest.makeSuite(DirectivesTest),

Modified: Zope3/branches/ZopeX3-3.0/src/zope/app/publisher/xmlrpc/tests/xmlrpc.zcml
===================================================================
--- Zope3/branches/ZopeX3-3.0/src/zope/app/publisher/xmlrpc/tests/xmlrpc.zcml	2004-08-27 14:28:18 UTC (rev 27289)
+++ Zope3/branches/ZopeX3-3.0/src/zope/app/publisher/xmlrpc/tests/xmlrpc.zcml	2004-08-27 14:28:21 UTC (rev 27290)
@@ -8,40 +8,46 @@
   <xmlrpc:view 
       name="test"
       class="zope.app.component.tests.views.V1"
-      for="zope.app.component.tests.views.IC" />
+      for="zope.app.component.tests.views.IC" 
+      />
 
   <xmlrpc:view 
       name="test2"
       class="zope.app.component.tests.views.V1"
       for="zope.app.component.tests.views.IC"
       permission="zope.Public"
-      allowed_interface="zope.app.component.tests.views.IV" />
+      interface="zope.app.component.tests.views.IV" 
+      />
 
   <xmlrpc:view 
       name="test3"
       class="zope.app.component.tests.views.V1"
       for="zope.app.component.tests.views.IC"
       permission="zope.Public"
-      allowed_attributes="action" />
+      methods="action" />
 
   <xmlrpc:view 
       name="test4"
       class="zope.app.component.tests.views.V1"
       for="zope.app.component.tests.views.IC"
       permission="zope.Public"
-      allowed_attributes="action"
-      allowed_interface="zope.app.component.tests.views.IV" />
+      methods="action"
+      interface="zope.app.component.tests.views.IV" />
 
   <xmlrpc:view 
       name="test5"
       class="zope.app.component.tests.views.V1"
       for="zope.app.component.tests.views.IC"
       permission="zope.Public"
-      allowed_attributes="action index"
-      allowed_interface="zope.app.component.tests.views.IV" />
+      methods="action index"
+      interface="zope.app.component.tests.views.IV" />
 
-  <xmlrpc:defaultView 
-      name="test"
-      for="zope.app.component.tests.views.IC" />
+ 
+  <xmlrpc:view 
+      class="zope.app.component.tests.views.V1"
+      for="zope.app.component.tests.views.IC" 
+      interface="zope.app.component.tests.views.IV"
+      methods="action"
+      />
 
 </configure>

Modified: Zope3/branches/ZopeX3-3.0/src/zope/app/publisher/xmlrpc/tests/xmlrpc_error.zcml
===================================================================
--- Zope3/branches/ZopeX3-3.0/src/zope/app/publisher/xmlrpc/tests/xmlrpc_error.zcml	2004-08-27 14:28:18 UTC (rev 27289)
+++ Zope3/branches/ZopeX3-3.0/src/zope/app/publisher/xmlrpc/tests/xmlrpc_error.zcml	2004-08-27 14:28:21 UTC (rev 27290)
@@ -8,6 +8,6 @@
         name="test"
         factory="zope.component.tests.views.V1"
         for="zope.component.tests.views.IC"
-        allowed_attributes="action index" />
+        methods="action index" />
 
 </configure>



More information about the Zope3-Checkins mailing list