[Zope-CVS] CVS: Products/Ape/doc - apexml.txt:1.1.2.1 outline.txt:1.1.6.1 ape.txt:NONE
Shane Hathaway
shane@zope.com
Wed, 30 Jul 2003 16:54:43 -0400
Update of /cvs-repository/Products/Ape/doc
In directory cvs.zope.org:/tmp/cvs-serv31801
Modified Files:
Tag: ape-scan-branch
outline.txt
Added Files:
Tag: ape-scan-branch
apexml.txt
Removed Files:
Tag: ape-scan-branch
ape.txt
Log Message:
Finished describing all elements of apeconf.xml
=== Added File Products/Ape/doc/apexml.txt ===
Ape Configuration XML Files
Ape configures mappers using configuration files. The standard Zope 2
mapper configuration is in the file 'apeconf.xml' in the
'apelib.zope2' package. Look over the standard configuration file to
get a feel for what the file does. Refer to it as an example.
Ape lets you mix configurations from any number of configuration
files, as long as none of the files contain conflicting directives.
To add support for a new class to Ape, write your own 'apeconf.xml'
rather than modify the standard configuration. If you're writing a
Zope product, place your 'apeconf.xml' in your product directory. Ape
will look for it and mix your configuration with the standard
configuration.
The Ape configuration schema is fairly simple. The root
'configuration' tag contains component declarations. Component
declarations contain component-specific configurations and
registrations. Variation tags are intermingled with the other
configuration directives, allowing a configuration file to define
variations of the standard configuration.
The schema uses two conventions that differ from XML norms. First,
'variation' elements may appear anywhere child elements are allowed;
see the description of the 'variation' element. Second, most
attributes and child elements are optional, allowing minimal
declarations.
Elements
<configuration>
...
</configuration>
The root element of an Ape configuration file. Uses no
attributes.
<variation name="...">
...
</variation>
The variation tag signifies that all contained directives belong
to a variation rather than the standard configuration. A
variation element may appear anywhere child elements are allowed.
Variation tags let you specify multiple configuration variations
in a single file, keeping independent configurations together in a
logical way. Ape uses variations to keep 'apeconf.xml' clear
while providing alternative configurations.
The 'name' attribute is required. It specifies which variation
the child directives belong to. Placing many directives in a
single variation tag is equivalent to splitting those directives
into several variation tags of the same name.
Directives within a variation tag become part of a varied
configuration rather than the standard configuration. A
configuration file can modify any number of variations.
Directives outside any variation tag become part of the standard
configuration. When Ape loads a mapper, it specifies which
variation it needs, then the configuration machinery combines
directives from the variation with the standard directives.
Ape uses variations to configure both a SQL and filesystem mapper
in the same file. Before Ape used XML, it used three Python
modules to configure mappers: a base mapper, a filesystem
variation, and a SQL variation. The three separate files made it
difficult to understand how to configure a mapper, and in fact
introduced minor errors that went unnoticed for a long time. A
single XML file containing multiple variations turned out clearer
and shorter than equivalent Python code.
<mapper
name="..."
[ class="..." ]
[ parent="..." ]
[ extends="..." ] >
...
</mapper>
Declares a mapper component. The 'name' attribute is required and
usually specifies a fully-qualified class name. The rest of the
attributes are optional. A mapper element should be a direct
child of either a 'variation' or a 'configuration' element. A
mapper element may contain the following optional child elements:
serializer
gateway
classifier
keygen
use-for
option
variation
Ape mixes mapper configurations based on the mapper name. One
configuration file can define a mapper while another adds an extra
serializer, for example, as long as the two configurations do not
conflict.
The 'class' attribute specifies the class the mapper is to be used
for. If no 'class' attribute is associated with a mapper, Ape
defaults to using the mapper name as the class name. Since most
mappers are used for exactly one class and are named according to
that class, you can generally omit the 'class' attribute.
There are a few situations where you should specify a 'class'
attribute. Ape recognizes two special values for the 'class'
attribute, 'none' and 'any'. Use 'none' for abstract mappers,
which are designed to be extended but never used directly. Use
'any' to create a generic mapper. Generic mappers can serialize
instances of many classes. See the 'anyfile' and 'anyfolder' Zope
2 mappers for an example. Also, if you have a complex mapper
tree, you may need to apply a class to different mappers depending
on the context. To do this, set the class attributes for both
mappers to the fully-qualified class name, then use different
mapper names. When you specify a class attribute, the mapper name
does not need to specify a class.
The 'extends' attribute tells the mapper to inherit components
from a base mapper. The mapper will inherit gateways,
serializers, a classifier, and a keychain, but no options,
attributes, or 'use-for' registrations. The derived mapper can
override or disable inherited subcomponents by using the same name
that inherited subcomponents use.
The 'parent' attribute makes the mapper a child of another mapper.
It should contain the name of a mapper. Ape ignores mappers that
are not part of a mapper tree, so most mappers need a 'parent'
attribute.
Internally, Ape interprets a mapper element as several directives.
The directives get stored in small indexed tables. When an
application such as Zope requests a configured mapper, a
MapperAssembler iterates over the tables to configure mappers and
returns the root mapper.
<serializer
name="..."
factory="..." | use="..."
[ enabled="..." ]
[ param="..." ]
[ order="..." ] />
Declares a serializer. The 'name' attribute is required. Either
'factory' or 'use' is required. The 'enabled', 'param', and
'order' attributes are optional. The 'param' attribute is valid
only when a 'factory' is provided. The 'order' attribute is valid
only when the element descends from a mapper element. This
element accepts no child elements.
You can use this element to declare either a reusable serializer,
by placing it outside any mapper element, or a non-reusable
serializer, by placing it inside a mapper element. Reusable
serializers get added to a global namespace of serializers.
Non-reusable serializers get added to a namespace local to the
mapper.
Use a Python class to implement a serializer, then use the
'factory' attribute to link your class into Ape. Specify a
fully-qualified class name, such as "mypackage.mymodule.myclass".
If your class constructor requires a parameter, you may pass one
string parameter using the 'param' attribute.
To import a reusable serializer into a mapper, add a serializer
declaration to a 'mapper' element, specifying the name of the
serializer to import in the 'use' attribute of the serializer
declaration. The 'factory' and 'use' attributes can not be used
together.
Mappers can have any number of serializers, but keep the number
small for speed. Sometimes the order in which the serializers get
invoked matters. In those rare cases, use the 'order' attribute
to specify a sort key. Use 'a' to make it run first and 'z' to
make it run last. The default sort key is 'middle'.
The 'enabled' attribute lets you disable an unwanted inherited
serializer. To do this, set the 'enabled' attribute to 'false'
and match the name of the inherited serializer.
<gateway
name="..."
factory="..." | use="..."
[ enabled="..." ]
[ param="..." ] />
Declares a gateway. The 'name' attribute is required. Either
'factory' or 'use' is required. The 'enabled' and 'param'
attributes are optional. The 'param' attribute is valid only when
a 'factory' is provided. This element accepts no child elements.
You can use this element to declare either a reusable gateway, by
placing it outside any mapper element, or a non-reusable gateway,
by placing it inside a mapper element. Reusable gateways get
added to a global namespace of gateways. Non-reusable gateways
get added to a namespace local to the mapper.
Use a Python class to implement a gateway, then use the 'factory'
attribute to link your class into Ape. Specify a fully-qualified
class name, such as "mypackage.mymodule.myclass". If your class
constructor requires a parameter, you may pass one string
parameter using the 'param' attribute.
To import a reusable gateway into a mapper, add a gateway
declaration to a 'mapper' element, specifying the name of the
gateway to import in the 'use' attribute of the gateway
declaration. The 'factory' and 'use' attributes can not be used
together.
Mappers can have any number of gateways, but keep the number small
for speed. The order in which gateways are used should not
matter.
The 'enabled' attribute lets you disable an unwanted inherited
gateway. To do this, set the 'enabled' attribute to 'false' and
match the name of the inherited gateway.
<classifier
[name="..."]
factory="..." | use="..."
[ enabled="..." ]
[ param="..." ] />
<keygen
[name="..."]
factory="..." | use="..."
[ enabled="..." ]
[ param="..." ] />
Declares a classifier or keychain generator component. The 'name'
attribute is required for reusable components but should not be
present otherwise. Either 'factory' or 'use' is required. The
'enabled' and 'param' attributes are optional. The 'param'
attribute is valid only when a 'factory' is provided. This
element accepts no child elements.
Most mappers have neither a classifier nor a keychain generator.
Those that have either kind of component are called domain
mappers, meaning that the mapper marks the root object of an
application domain. The root mapper is always a domain mapper.
You can use a 'classifier' or 'keygen' element to declare either a
reusable component, by placing it outside any mapper element, or a
non-reusable component, by placing it inside a mapper element.
Reusable components get added to a global but type-specific
namespace. Non-reusable classifiers and keychain generators do
not have a name.
Use a Python class to implement a new classifier or keychain
generator, then use the 'factory' attribute to link your class
into Ape. Specify a fully-qualified class name. If your class
constructor requires a parameter, you may pass one string
parameter using the 'param' attribute.
To import a reusable component into a mapper, add a component
declaration to a 'mapper' element, specifying the name of the
component to import in the 'use' attribute of the component
declaration. The 'factory' and 'use' attributes can not be used
together.
The 'enabled' attribute lets you disable an unwanted inherited
component. To do this, set the 'enabled' attribute to 'false'.
<use-for
[ class="..." ]
[ extensions="..." ]
[ fallback="..." ]
[ key="..." ] />
The 'use-for' directive registers a mapper with the parent's
classifier. The 'use-for' directive must descend from a 'mapper'
element and accepts no children. All attributes are optional. A
mapper element can contain any number of 'use-for' directives.
The 'class' attribute tells the classifier to use this mapper for
an extra class. This is especially useful when working with
generic mappers. A generic mapper often has to make guesses about
the object it's serializing, and sometimes it doesn't make the
right guess. The 'class' attribute can solve the situation by
mapping problematic objects to a different mapper.
The 'extensions' attribute specifies filename extensions that
should imply this mapper. Separate the extensions with a space.
The first extension is the default. If you create an object in
Zope with no extension and store it in a mounted Ape filesystem,
Ape will append the default extension automatically.
The 'fallback' attribute tells the classifier to use this mapper
for objects or filesystem nodes with no other classification. The
allowable values for the 'fallback' attribute vary by classifier,
but the Zope 2 classifier recognizes the following values:
- 'directory': Use this mapper for filesystem directories.
- 'file': Use this mapper for filesystem files.
- 'folderish_object': Use this mapper for objects that extend
ObjectManager.
- 'fileish_object': Use this mapper for objects that do not
extend ObjectManager.
Again, the 'fallback' registrations only apply when no other
classification is available.
The 'key' attribute tells the classifier to use this mapper when
the last key of the keychain matches the attribute value. This is
useful for Zope's site-wide Application object, since it always
has a particular keychain.
Registrations made by 'use-for' get applied to the parent mapper's
classifier. If two mappers make conflicting registrations (such
as two mappers trying to use the same filename extension), Ape
will detect a conflict. If you need to override a registration
made by another mapper, you should use a variation.
<option name="..." value="..." />
The 'option' directive registers an mapper-specific option with
the parent's classifier. The 'option' directive must descend from
a 'mapper' element and accepts no children. The 'name' and
'value' attributes are both required. A mapper element can
contain any number of 'use-for' directives.
The one option that is currently available is specific to the Zope
2 classifier. The 'content_type_attr' tells the classifier that
when serializing, there will be an attribute on the object that
specifies the MIME type of the object's content. The classifier
then translates the MIME type to a default filename extension.
The value of the option is the name of the attribute, usually
'content_type'.
=== Products/Ape/doc/outline.txt 1.1 => 1.1.6.1 ===
--- Products/Ape/doc/outline.txt:1.1 Thu Mar 27 09:28:31 2003
+++ Products/Ape/doc/outline.txt Wed Jul 30 16:54:37 2003
@@ -362,10 +362,9 @@
III. Example: Mapping Zope 2
ApeLib provides two default Zope 2 mappers. One maps to the
- filesystem and the other maps to a PostgreSQL database. Because
- there is a lot in common between the two mappers, the createMapper()
- function in the basemapper module sets up the mappers and
- serializers, while two derivative functions set up the gateways.
+ filesystem and the other maps to a PostgreSQL database. Both are
+ configured through apeconf.xml files. See apexml.txt for more
+ details on the configuration files.
The PostgreSQL mapper uses the Psycopg module to connect to the
database. It uses integers as keys and puts information about
@@ -380,16 +379,22 @@
without filename extensions.
Normally, ZODB caches objects indefinitely. This leads to excellent
- performance, but prevents the object system from having the most
- current data all the time. One workaround is to set the ZODB cache
- size to zero, forcing ZODB to clear its cache after every
- transaction. But that solution eliminates the ZODB performance
- advantage, so ApeLib needs a better solution. Nothing specific is
- planned yet.
-
- To extend the Zope 2 mappers with your own mappers, you can write a
- function that first calls the standard mapper factory and then
- adds to the generated mapper tree.
+ performance, but in the case of Ape, it prevents the object system
+ from having the most current data all the time. One workaround is
+ to set the ZODB cache size to zero, forcing ZODB to clear its cache
+ after every transaction, but that solution eliminates the ZODB
+ performance advantage.
+
+ Ape has a new solution to the cache invalidation problem. Ape keeps
+ a record of which OIDs are in use and correlates them with
+ filesystem paths and last-modified times. Then it periodically
+ scans those paths, invalidating OIDs if it sees changes. The
+ solution could potentially work even better with RDBMSs, since the
+ periodic scan could be implemented using only a single query.
+
+ To extend the Zope 2 mappers with your own mappers, write an
+ apeconf.xml file and place it in your Zope 2 product. See
+ apexml.txt for more information.
IV. Multiple domains
@@ -459,7 +464,7 @@
ZEO: ApeLib separates serialization from data storage, making it
possible to perform serialization on a ZEO client while data storage
happens in a ZEO server. ZEO also adds the ability to keep a very
- large object cache.
+ large object cache. Ape has been successfully tested with ZEO 3.2.
Zope 3: ApeLib is currently designed with Zope 2 in mind, but meant
to be reusable for Zope 3. A new set of mappers will be needed, but
=== Removed File Products/Ape/doc/ape.txt ===