[CMF-checkins] SVN: CMF/branches/1.5/C CMFSetup: Add support for
configuring caching policy manager.
Tres Seaver
tseaver at palladion.com
Tue Oct 11 14:26:14 EDT 2005
Log message for revision 39057:
CMFSetup: Add support for configuring caching policy manager.
CMFDefault: Make the CPM part of the default configuration (empty for now).
Changed:
U CMF/branches/1.5/CHANGES.txt
A CMF/branches/1.5/CMFDefault/profiles/default/caching_policy_mgr.xml
U CMF/branches/1.5/CMFDefault/profiles/default/export_steps.xml
U CMF/branches/1.5/CMFDefault/profiles/default/import_steps.xml
U CMF/branches/1.5/CMFDefault/profiles/default/toolset.xml
U CMF/branches/1.5/CMFSetup/README.txt
A CMF/branches/1.5/CMFSetup/cachingpolicymgr.py
A CMF/branches/1.5/CMFSetup/tests/test_cachingpolicymgr.py
U CMF/branches/1.5/CMFSetup/utils.py
A CMF/branches/1.5/CMFSetup/xml/cpmExport.xml
-=-
Modified: CMF/branches/1.5/CHANGES.txt
===================================================================
--- CMF/branches/1.5/CHANGES.txt 2005-10-11 17:21:08 UTC (rev 39056)
+++ CMF/branches/1.5/CHANGES.txt 2005-10-11 18:26:14 UTC (rev 39057)
@@ -16,6 +16,8 @@
Features
+ - CMFSetup: added support for configuring caching policy manager.
+
- CMFSetup: added support for configuring cookie authentication and
mailhost tools (http://www.zope.org/Collectors/CMF/387).
Added: CMF/branches/1.5/CMFDefault/profiles/default/caching_policy_mgr.xml
===================================================================
--- CMF/branches/1.5/CMFDefault/profiles/default/caching_policy_mgr.xml 2005-10-11 17:21:08 UTC (rev 39056)
+++ CMF/branches/1.5/CMFDefault/profiles/default/caching_policy_mgr.xml 2005-10-11 18:26:14 UTC (rev 39057)
@@ -0,0 +1,4 @@
+<?xml version="1.0"?>
+<caching-policies>
+<!-- TODO: add some sensible defaults -->
+</caching-policies>
Modified: CMF/branches/1.5/CMFDefault/profiles/default/export_steps.xml
===================================================================
--- CMF/branches/1.5/CMFDefault/profiles/default/export_steps.xml 2005-10-11 17:21:08 UTC (rev 39056)
+++ CMF/branches/1.5/CMFDefault/profiles/default/export_steps.xml 2005-10-11 18:26:14 UTC (rev 39057)
@@ -110,4 +110,15 @@
</export-step>
+ <export-step id="caching_policy_mgr"
+ handler="Products.CMFSetup.cachingpolicymgr.exportCachingPolicyManager"
+ title="Caching Policies">
+
+
+
+ Export cacing policy manager's policies.
+
+
+
+ </export-step>
</export-steps>
Modified: CMF/branches/1.5/CMFDefault/profiles/default/import_steps.xml
===================================================================
--- CMF/branches/1.5/CMFDefault/profiles/default/import_steps.xml 2005-10-11 17:21:08 UTC (rev 39056)
+++ CMF/branches/1.5/CMFDefault/profiles/default/import_steps.xml 2005-10-11 18:26:14 UTC (rev 39057)
@@ -129,4 +129,16 @@
</import-step>
+ <import-step id="caching_policy_mgr" version="20051011-01"
+ handler="Products.CMFSetup.cachingpolicymgr.importCachingPolicyManager"
+ title="Caching Policies">
+ <dependency step="toolset"/>
+
+
+
+ Import cacing policy manager's policies.
+
+
+
+ </import-step>
</import-steps>
Modified: CMF/branches/1.5/CMFDefault/profiles/default/toolset.xml
===================================================================
--- CMF/branches/1.5/CMFDefault/profiles/default/toolset.xml 2005-10-11 17:21:08 UTC (rev 39056)
+++ CMF/branches/1.5/CMFDefault/profiles/default/toolset.xml 2005-10-11 18:26:14 UTC (rev 39057)
@@ -5,6 +5,8 @@
class="Products.MailHost.MailHost.MailHost"/>
<required tool_id="cookie_authentication"
class="Products.CMFCore.CookieCrumbler.CookieCrumbler"/>
+ <required tool_id="caching_policy_manager"
+ class="Products.CMFCore.CachingPolicyManager.CachingPolicyManager"/>
<required tool_id="portal_actions"
class="Products.CMFCore.ActionsTool.ActionsTool"/>
<required tool_id="portal_catalog"
Modified: CMF/branches/1.5/CMFSetup/README.txt
===================================================================
--- CMF/branches/1.5/CMFSetup/README.txt 2005-10-11 17:21:08 UTC (rev 39056)
+++ CMF/branches/1.5/CMFSetup/README.txt 2005-10-11 18:26:14 UTC (rev 39057)
@@ -46,13 +46,27 @@
o DCWorkflow definitions, including supporting scripts
- - (_) 'portal_catalog'
+ - (x) 'cookie_authentication'
+
+ o tool properties
+
+ - (x) 'MailHost'
+
+ o tool properties
+
+ - (x) 'portal_catalog'
(Products.CMFCore.CatalogTool.CatalogTool)
o index names / types
o metadata column names
+ - (x) folder structure
+
+ - (x) 'caching_policy_manager'
+
+ o policy settings
+
- (_) 'portal_membership'
o "skeleton" home folder (XXX: is this in the core?)
@@ -65,10 +79,6 @@
o predicate -> portal_type bindings.
- - (_) 'caching_policy_manager'
-
- o policy settings
-
- (_) 'portal_metadata'
o global properties
@@ -82,18 +92,8 @@
o action title / icon bindings
- - (x) 'cookie_authentication'
-
- o tool properties
-
- - (x) 'MailHost'
-
- o tool properties
-
- (_) user folder configuration
- - (_) folder structure
-
TODO
- (x) Display / download diffs between configurations (profiles
Added: CMF/branches/1.5/CMFSetup/cachingpolicymgr.py
===================================================================
--- CMF/branches/1.5/CMFSetup/cachingpolicymgr.py 2005-10-11 17:21:08 UTC (rev 39056)
+++ CMF/branches/1.5/CMFSetup/cachingpolicymgr.py 2005-10-11 18:26:14 UTC (rev 39057)
@@ -0,0 +1,140 @@
+##############################################################################
+#
+# Copyright (c) 2005 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.
+#
+##############################################################################
+"""CachingPolicyManager setup handlers.
+
+$Id$
+"""
+
+from AccessControl import ClassSecurityInfo
+from AccessControl.Permission import Permission
+from Globals import InitializeClass
+from Products.PageTemplates.PageTemplateFile import PageTemplateFile
+
+from Products.CMFCore.utils import getToolByName
+
+from permissions import ManagePortal
+from utils import CONVERTER
+from utils import DEFAULT
+from utils import ExportConfiguratorBase
+from utils import ImportConfiguratorBase
+from utils import KEY
+from utils import _xmldir
+
+#
+# Configurator entry points
+#
+_FILENAME = 'cachingpolicymgr.xml'
+
+def importCachingPolicyManager(context):
+ """ Import cache policy maanger settings from an XML file.
+ """
+ site = context.getSite()
+ cpm = getToolByName(site, 'caching_policy_manager', None)
+ if cpm is None:
+ return 'Cache policy manager: No tool!'
+
+ body = context.readDataFile(_FILENAME)
+ if body is None:
+ return 'Cache policy manager: Nothing to import.'
+
+ if context.shouldPurge():
+ cpm.__init__()
+
+ # now act on the settings we've retrieved
+ configurator = CachingPolicyManagerImportConfigurator(site)
+ cpm_info = configurator.parseXML(body)
+
+ for policy in cpm_info['policies']:
+ cpm.addPolicy(**policy)
+
+ return 'Cache policy manager settings imported.'
+
+def exportCachingPolicyManager(context):
+ """ Export caching policy manager settings as an XML file.
+ """
+ site = context.getSite()
+ mhc = CachingPolicyManagerExportConfigurator( site ).__of__( site )
+ text = mhc.generateXML()
+
+ context.writeDataFile( _FILENAME, text, 'text/xml' )
+
+ return 'Caching policy manager settings exported.'
+
+class CachingPolicyManagerExportConfigurator(ExportConfiguratorBase):
+ """ Synthesize XML description of cc properties.
+ """
+ security = ClassSecurityInfo()
+
+ security.declareProtected( ManagePortal, 'listPolicyInfo' )
+ def listPolicyInfo(self):
+ """ Return a list of mappings describing the tool's policies.
+ """
+ cpm = getToolByName(self._site, 'caching_policy_manager')
+ for policy_id, policy in cpm.listPolicies():
+ yield {'policy_id': policy_id,
+ 'predicate': policy.getPredicate(),
+ 'mtime_func': policy.getMTimeFunc(),
+ 'vary': policy.getVary(),
+ 'etag_func': policy.getETagFunc(),
+ 'max_age_secs': policy.getMaxAgeSecs(),
+ 's_max_age_secs': policy.getSMaxAgeSecs(),
+ 'pre_check': policy.getPreCheck(),
+ 'post_check': policy.getPostCheck(),
+ 'last_modified': bool(policy.getLastModified()),
+ 'no_cache': bool(policy.getNoCache()),
+ 'no_store': bool(policy.getNoStore()),
+ 'must_revalidate': bool(policy.getMustRevalidate()),
+ 'proxy_revalidate': bool(policy.getProxyRevalidate()),
+ 'no_transform': bool(policy.getNoTransform()),
+ 'public': bool(policy.getPublic()),
+ 'private': bool(policy.getPrivate()),
+ 'enable_304s': bool(policy.getEnable304s()),
+ }
+
+ security.declarePrivate('_getExportTemplate')
+ def _getExportTemplate(self):
+
+ return PageTemplateFile('cpmExport.xml', _xmldir)
+
+InitializeClass(CachingPolicyManagerExportConfigurator)
+
+class CachingPolicyManagerImportConfigurator(ImportConfiguratorBase):
+
+ def _getImportMapping(self):
+ return {
+ 'caching-policies':
+ { 'caching-policy': {KEY: 'policies', DEFAULT: ()} },
+ 'caching-policy':
+ { 'policy_id': {},
+ 'remove': {},
+ 'predicate': {},
+ 'mtime_func': {},
+ 'vary': {},
+ 'etag_func': {},
+ 'max_age_secs': {CONVERTER: self._convertToInteger},
+ 's_max_age_secs': {CONVERTER: self._convertToInteger},
+ 'pre_check': {CONVERTER: self._convertToInteger},
+ 'post_check': {CONVERTER: self._convertToInteger},
+ 'last_modified': {CONVERTER: self._convertToBoolean},
+ 'no_cache': {CONVERTER: self._convertToBoolean},
+ 'no_store': {CONVERTER: self._convertToBoolean},
+ 'must_revalidate': {CONVERTER: self._convertToBoolean},
+ 'proxy_revalidate': {CONVERTER: self._convertToBoolean},
+ 'no_transform': {CONVERTER: self._convertToBoolean},
+ 'public': {CONVERTER: self._convertToBoolean},
+ 'private': {CONVERTER: self._convertToBoolean},
+ 'enable_304s': {CONVERTER: self._convertToBoolean},
+ },
+ }
+
+InitializeClass(CachingPolicyManagerImportConfigurator)
Added: CMF/branches/1.5/CMFSetup/tests/test_cachingpolicymgr.py
===================================================================
--- CMF/branches/1.5/CMFSetup/tests/test_cachingpolicymgr.py 2005-10-11 17:21:08 UTC (rev 39056)
+++ CMF/branches/1.5/CMFSetup/tests/test_cachingpolicymgr.py 2005-10-11 18:26:14 UTC (rev 39057)
@@ -0,0 +1,250 @@
+##############################################################################
+#
+# Copyright (c) 2005 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.
+#
+##############################################################################
+"""CachingPolicyManager setup handler unit tests.
+
+$Id$
+"""
+import unittest
+#import Testing
+
+
+from common import BaseRegistryTests
+from common import DummyExportContext
+from common import DummyImportContext
+
+
+class _CachingPolicyManagerSetup(BaseRegistryTests):
+
+ POLICY_ID = 'policy_id'
+ PREDICATE = "python:object.getId() == 'foo'"
+ MTIME_FUNC = "object/modified"
+ MAX_AGE_SECS = 60
+ VARY = "Test"
+ ETAG_FUNC = "object/getETag"
+ S_MAX_AGE_SECS = 120
+ PRE_CHECK = 42
+ POST_CHECK = 43
+
+ _EMPTY_EXPORT = """\
+<?xml version="1.0"?>
+<caching-policies>
+</caching-policies>
+"""
+
+ _WITH_POLICY_EXPORT = """\
+<?xml version="1.0"?>
+<caching-policies>
+ <caching-policy
+ policy_id="%s"
+ predicate="%s"
+ mtime_func="%s"
+ vary="%s"
+ etag_func="%s"
+ max_age_secs="%d"
+ s_max_age_secs="%d"
+ pre_check="%d"
+ post_check="%d"
+ last_modified="False"
+ no_cache="True"
+ no_store="True"
+ must_revalidate="True"
+ proxy_revalidate="True"
+ no_transform="True"
+ public="True"
+ private="True"
+ enable_304s="True"
+ />
+</caching-policies>
+""" % (POLICY_ID,
+ PREDICATE,
+ MTIME_FUNC,
+ VARY,
+ ETAG_FUNC,
+ MAX_AGE_SECS,
+ S_MAX_AGE_SECS,
+ PRE_CHECK,
+ POST_CHECK,
+ )
+
+ def _initSite(self, with_policy=False):
+ from OFS.Folder import Folder
+ from Products.CMFCore.CachingPolicyManager import CachingPolicyManager
+
+ self.root.site = Folder(id='site')
+ site = self.root.site
+ mgr = CachingPolicyManager()
+ site._setObject( mgr.getId(), mgr )
+
+ if with_policy:
+ mgr.addPolicy( policy_id=self.POLICY_ID
+ , predicate=self.PREDICATE
+ , mtime_func=self.MTIME_FUNC
+ , max_age_secs=self.MAX_AGE_SECS
+ , no_cache=True
+ , no_store=True
+ , must_revalidate=True
+ , vary=self.VARY
+ , etag_func=self.ETAG_FUNC
+ , s_max_age_secs=self.S_MAX_AGE_SECS
+ , proxy_revalidate=True
+ , public=True
+ , private=True
+ , no_transform=True
+ , enable_304s=True
+ , last_modified=False
+ , pre_check=self.PRE_CHECK
+ , post_check=self.POST_CHECK
+ )
+ return site
+
+class CachingPolicyManagerExportConfiguratorTests(_CachingPolicyManagerSetup):
+
+ def _getTargetClass(self):
+ from Products.CMFSetup.cachingpolicymgr \
+ import CachingPolicyManagerExportConfigurator
+
+ return CachingPolicyManagerExportConfigurator
+
+ def test_generateXML_empty(self):
+ site = self._initSite(with_policy=False)
+ configurator = self._makeOne(site).__of__(site)
+
+ self._compareDOM(configurator.generateXML(), self._EMPTY_EXPORT)
+
+ def test_generateXML_with_policy(self):
+ site = self._initSite(with_policy=True)
+ configurator = self._makeOne(site).__of__(site)
+
+ self._compareDOM(configurator.generateXML(), self._WITH_POLICY_EXPORT)
+
+
+class CachingPolicyManagerImportConfiguratorTests(_CachingPolicyManagerSetup):
+
+ def _getTargetClass(self):
+ from Products.CMFSetup.cachingpolicymgr \
+ import CachingPolicyManagerImportConfigurator
+
+ return CachingPolicyManagerImportConfigurator
+
+ def test_parseXML_empty(self):
+ site = self._initSite(with_policy=False)
+ configurator = self._makeOne(site)
+ cpm_info = configurator.parseXML(self._EMPTY_EXPORT)
+
+ self.assertEqual(len(cpm_info['policies']), 0)
+
+ def test_parseXML_with_policy(self):
+ site = self._initSite(with_policy=False)
+ configurator = self._makeOne(site)
+ cpm_info = configurator.parseXML(self._WITH_POLICY_EXPORT)
+
+ self.assertEqual(len(cpm_info['policies']), 1)
+
+ info = cpm_info['policies'][0]
+ self.assertEqual(info['policy_id'], self.POLICY_ID)
+ self.assertEqual(info['predicate'], self.PREDICATE)
+ self.assertEqual(info['mtime_func'], self.MTIME_FUNC)
+ self.assertEqual(info['vary'], self.VARY)
+ self.assertEqual(info['etag_func'], self.ETAG_FUNC)
+ self.assertEqual(info['max_age_secs'], self.MAX_AGE_SECS)
+ self.assertEqual(info['s_max_age_secs'], self.S_MAX_AGE_SECS)
+ self.assertEqual(info['pre_check'], self.PRE_CHECK)
+ self.assertEqual(info['post_check'], self.POST_CHECK)
+ self.assertEqual(info['last_modified'], False)
+ self.assertEqual(info['no_cache'], True)
+ self.assertEqual(info['no_store'], True)
+ self.assertEqual(info['must_revalidate'], True)
+ self.assertEqual(info['proxy_revalidate'], True)
+ self.assertEqual(info['no_transform'], True)
+ self.assertEqual(info['public'], True)
+ self.assertEqual(info['private'], True)
+ self.assertEqual(info['enable_304s'], True)
+
+class Test_exportCachingPolicyManager(_CachingPolicyManagerSetup):
+
+ def test_empty(self):
+ from Products.CMFSetup.cachingpolicymgr \
+ import exportCachingPolicyManager
+
+ site = self._initSite(with_policy=False)
+ context = DummyExportContext(site)
+ exportCachingPolicyManager(context)
+
+ self.assertEqual(len(context._wrote), 1)
+ filename, text, content_type = context._wrote[0]
+ self.assertEqual(filename, 'cachingpolicymgr.xml')
+ self._compareDOM(text, self._EMPTY_EXPORT)
+ self.assertEqual(content_type, 'text/xml')
+
+ def test_with_policy(self):
+ from Products.CMFSetup.cachingpolicymgr \
+ import exportCachingPolicyManager
+
+ site = self._initSite(with_policy=True)
+ context = DummyExportContext(site)
+ exportCachingPolicyManager(context)
+
+ self.assertEqual(len(context._wrote), 1)
+ filename, text, content_type = context._wrote[0]
+ self.assertEqual(filename, 'cachingpolicymgr.xml')
+ self._compareDOM(text, self._WITH_POLICY_EXPORT)
+ self.assertEqual(content_type, 'text/xml')
+
+
+class Test_importCachingPolicyManager(_CachingPolicyManagerSetup):
+
+ def test_normal(self):
+ from Products.CMFSetup.cachingpolicymgr \
+ import importCachingPolicyManager
+
+ site = self._initSite(with_policy=False)
+ cpm = site.caching_policy_manager
+ self.assertEqual(len(cpm.listPolicies()), 0)
+
+ context = DummyImportContext(site)
+ context._files['cachingpolicymgr.xml'] = self._WITH_POLICY_EXPORT
+ importCachingPolicyManager(context)
+
+ self.assertEqual(len(cpm.listPolicies()), 1)
+ policy_id, policy = cpm.listPolicies()[0]
+
+ self.assertEqual(policy.getPolicyId(), self.POLICY_ID)
+ self.assertEqual(policy.getPredicate(), self.PREDICATE)
+ self.assertEqual(policy.getMTimeFunc(), self.MTIME_FUNC)
+ self.assertEqual(policy.getVary(), self.VARY)
+ self.assertEqual(policy.getETagFunc(), self.ETAG_FUNC)
+ self.assertEqual(policy.getMaxAgeSecs(), self.MAX_AGE_SECS)
+ self.assertEqual(policy.getSMaxAgeSecs(), self.S_MAX_AGE_SECS)
+ self.assertEqual(policy.getPreCheck(), self.PRE_CHECK)
+ self.assertEqual(policy.getPostCheck(), self.POST_CHECK)
+ self.assertEqual(policy.getLastModified(), False)
+ self.assertEqual(policy.getNoCache(), True)
+ self.assertEqual(policy.getNoStore(), True)
+ self.assertEqual(policy.getMustRevalidate(), True)
+ self.assertEqual(policy.getProxyRevalidate(), True)
+ self.assertEqual(policy.getNoTransform(), True)
+ self.assertEqual(policy.getPublic(), True)
+ self.assertEqual(policy.getPrivate(), True)
+ self.assertEqual(policy.getEnable304s(), True)
+
+
+def test_suite():
+ return unittest.TestSuite((
+ unittest.makeSuite(CachingPolicyManagerExportConfiguratorTests),
+ unittest.makeSuite(CachingPolicyManagerImportConfiguratorTests),
+ unittest.makeSuite(Test_exportCachingPolicyManager),
+ unittest.makeSuite(Test_importCachingPolicyManager),
+ ))
+
+if __name__ == '__main__':
+ unittest.main(defaultTest='test_suite')
Modified: CMF/branches/1.5/CMFSetup/utils.py
===================================================================
--- CMF/branches/1.5/CMFSetup/utils.py 2005-10-11 17:21:08 UTC (rev 39056)
+++ CMF/branches/1.5/CMFSetup/utils.py 2005-10-11 18:26:14 UTC (rev 39057)
@@ -233,6 +233,10 @@
return val.lower() in ('true', 'yes', '1')
+ def _convertToInteger(self, val):
+
+ return int(val.strip())
+
def _convertToUnique(self, val):
assert len(val) == 1
Added: CMF/branches/1.5/CMFSetup/xml/cpmExport.xml
===================================================================
--- CMF/branches/1.5/CMFSetup/xml/cpmExport.xml 2005-10-11 17:21:08 UTC (rev 39056)
+++ CMF/branches/1.5/CMFSetup/xml/cpmExport.xml 2005-10-11 18:26:14 UTC (rev 39057)
@@ -0,0 +1,43 @@
+<?xml version="1.0"?>
+<caching-policies xmlns:tal="http://xml.zope.org/namespaces/tal">
+ <caching-policy
+ policy_id="POLICY_ID"
+ predicate="PREDICATE"
+ mtime_func="MTIME_FUNC"
+ vary="VARY"
+ etag_func="ETAG_FUNC"
+ max_age_secs="MAX_AGE_SECS"
+ s_max_age_secs="S_MAX_AGE_SECS"
+ pre_check="PRE_CHECK"
+ post_check="POST_CHECK"
+ last_modified="LAST_MODIFIED"
+ no_cache="NO_CACHE"
+ no_store="NO_STORE"
+ must_revalidate="MUST_REVALIDATE"
+ proxy_revalidate="PROXY_REVALIDATE"
+ no_transform="NO_TRANSFORM"
+ public="PUBLIC"
+ private="PRIVATE"
+ enable_304s="ENABLE_304S"
+ tal:repeat="info context/listPolicyInfo"
+ tal:attributes="policy_id info/policy_id;
+ predicate info/predicate;
+ mtime_func info/mtime_func;
+ vary info/vary;
+ etag_func info/etag_func;
+ max_age_secs info/max_age_secs;
+ s_max_age_secs info/s_max_age_secs;
+ pre_check info/pre_check;
+ post_check info/post_check;
+ last_modified info/last_modified;
+ no_cache info/no_cache;
+ no_store info/no_store;
+ must_revalidate info/must_revalidate;
+ proxy_revalidate info/proxy_revalidate;
+ no_transform info/no_transform;
+ public info/public;
+ private info/private;
+ enable_304s info/enable_304s;
+ "
+ />
+</caching-policies>
More information about the CMF-checkins
mailing list