[Zope-CMF] Problem with Registering Local Utilities on reinstall of
product
Nathan Van Gheem
vangheem at gmail.com
Mon Jun 16 11:51:34 EDT 2008
Hello,
It seems that there is an issue with registering local utilities on a
Product install. It seems that on a product reinstall, the local utility is
re-registered. In doing so, you lose all data that the local utility was
managing.
Martin Aspeli pointed out,
> I think the problem is in Products.GenericSetup.components - in
> _initUtilities it does
>
> elif factory is not None:
> self.context.registerUtility(factory(), provided, name)
>
> without first checking of a utility with this name for this interface
> already exists.
Although, from what I've found, this is not the problem. By stepping
through the code, I found in this context, the local utility no longer
exists. So at some point in the install reinstall process it is
unregistered.
Looking deeper, I found that in the reinstall of a product the method
_cascadeRemove() is called from
Products.CMFQuickInstallerTool.InstalledProduct that unregisters all
utilities.
> if 'utilities' in cascade:
> utilities = getattr(self, 'utilities', [])
> if utilities:
> sm = getSiteManager()
> for registration in utilities:
> provided = _resolveDottedName(registration[0])
> name = registration[1]
> if queryUtility(provided, name=name) is not None:
> sm.unregisterUtility(provided=provided, name=name)
The stack trace is like so,
>
> /Applications/Plone-3.1.1/myproject/parts/zope2/lib/python/ZServer/PubCore/ZServerPublisher.py(25)__init__()
> -> response=b)
>
> /Applications/Plone-3.1.1/myproject/parts/zope2/lib/python/ZPublisher/Publish.py(401)publish_module()
> -> environ, debug, request, response)
>
> /Applications/Plone-3.1.1/myproject/parts/zope2/lib/python/ZPublisher/Publish.py(202)publish_module_standard()
> -> response = publish(request, module_name, after_list, debug=debug)
>
> /Applications/Plone-3.1.1/myproject/parts/zope2/lib/python/ZPublisher/Publish.py(119)publish()
> -> request, bind=1)
>
> /Applications/Plone-3.1.1/myproject/parts/zope2/lib/python/ZPublisher/mapply.py(88)mapply()
> -> if debug is not None: return debug(object,args,context)
>
> /Applications/Plone-3.1.1/myproject/parts/zope2/lib/python/ZPublisher/Publish.py(42)call_object()
> -> result=apply(object,args) # Type s<cr> to step into published object.
> <string>(6)_facade()
>
> /Applications/Plone-3.1.1/myproject/parts/zope2/lib/python/AccessControl/requestmethod.py(64)_curried()
> -> return callable(*args, **kw)
>
> /Applications/Plone-3.1.1/myproject/parts/plone/CMFQuickInstallerTool/QuickInstallerTool.py(639)reinstallProducts()
> -> self.uninstallProducts(products, cascade, reinstall=True)
> <string>(4)_facade()
>
> /Applications/Plone-3.1.1/myproject/parts/zope2/lib/python/AccessControl/requestmethod.py(64)_curried()
> -> return callable(*args, **kw)
>
> /Applications/Plone-3.1.1/myproject/parts/plone/CMFQuickInstallerTool/QuickInstallerTool.py(621)uninstallProducts()
> -> prod.uninstall(cascade=cascade, reinstall=reinstall)
>
> /Applications/Plone-3.1.1/myproject/parts/plone/CMFQuickInstallerTool/InstalledProduct.py(297)uninstall()
> -> self._cascadeRemove(cascade)
>
> /Applications/Plone-3.1.1/myproject/parts/plone/CMFQuickInstallerTool/InstalledProduct.py(386)_cascadeRemove()
> -> sm.unregisterUtility(provided=provided, name=name)
> >
> /Applications/Plone-3.1.1/myproject/parts/zope2/lib/python/zope/component/registry.py(102)unregisterUtility()
>
I don't know how to go about fixing this problem since the infrastructure is
not set up to handle this. Realistically, if there is an uninstall of a
component needed, I would think it could be handled in the
Products.GenericSetup.components class.
Any ideas to help me get around this problem would be greatly appreciated.
Thanks,
Nathan Van Gheem
-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://mail.zope.org/pipermail/zope-cmf/attachments/20080616/c5ba4398/attachment-0001.html
More information about the Zope-CMF
mailing list