Hello,<br><br>&nbsp;&nbsp;&nbsp; It seems that there is an issue with registering local utilities on a Product install.&nbsp; It seems that on a product reinstall, the local utility is re-registered.&nbsp; In doing so, you lose all data that the local utility was managing.&nbsp; <br>
<br>Martin Aspeli pointed out,<br><blockquote class="gmail_quote" style="border-left: 1px solid rgb(204, 204, 204); margin: 0pt 0pt 0pt 0.8ex; padding-left: 1ex;">I think the problem is in Products.GenericSetup.components - in _initUtilities it does<br>

<br>
 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; elif factory is not None:<br>
 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;self.context.registerUtility(factory(), provided, name)<br>
<br>
without first checking of a utility with this name for this interface already exists.</blockquote><br>Although, from what I&#39;ve found, this is not the problem.&nbsp; By stepping through the code, I found in this context, the local utility no longer exists.&nbsp; So at some point in the install reinstall process it is unregistered.<br>
<br>Looking deeper, I found that in the reinstall of a product the method _cascadeRemove() is called from Products.CMFQuickInstallerTool.InstalledProduct that unregisters all utilities.<br><blockquote style="border-left: 1px solid rgb(204, 204, 204); margin: 0pt 0pt 0pt 0.8ex; padding-left: 1ex;" class="gmail_quote">
if &#39;utilities&#39; in cascade:<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; utilities = getattr(self, &#39;utilities&#39;, [])<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if utilities:<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; sm = getSiteManager()<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for registration in utilities:<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; provided = _resolveDottedName(registration[0])<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; name = registration[1]<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if queryUtility(provided, name=name) is not None:<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; sm.unregisterUtility(provided=provided, name=name)</blockquote>
<div><br>The stack trace is like so,<br><blockquote style="border-left: 1px solid rgb(204, 204, 204); margin: 0pt 0pt 0pt 0.8ex; padding-left: 1ex;" class="gmail_quote">&nbsp; /Applications/Plone-3.1.1/myproject/parts/zope2/lib/python/ZServer/PubCore/ZServerPublisher.py(25)__init__()<br>
-&gt; response=b)<br>&nbsp; /Applications/Plone-3.1.1/myproject/parts/zope2/lib/python/ZPublisher/Publish.py(401)publish_module()<br>-&gt; environ, debug, request, response)<br>&nbsp; /Applications/Plone-3.1.1/myproject/parts/zope2/lib/python/ZPublisher/Publish.py(202)publish_module_standard()<br>
-&gt; response = publish(request, module_name, after_list, debug=debug)<br>&nbsp; /Applications/Plone-3.1.1/myproject/parts/zope2/lib/python/ZPublisher/Publish.py(119)publish()<br>-&gt; request, bind=1)<br>&nbsp; /Applications/Plone-3.1.1/myproject/parts/zope2/lib/python/ZPublisher/mapply.py(88)mapply()<br>
-&gt; if debug is not None: return debug(object,args,context)<br>&nbsp; /Applications/Plone-3.1.1/myproject/parts/zope2/lib/python/ZPublisher/Publish.py(42)call_object()<br>-&gt; result=apply(object,args) # Type s&lt;cr&gt; to step into published object.<br>
&nbsp; &lt;string&gt;(6)_facade()<br>&nbsp; /Applications/Plone-3.1.1/myproject/parts/zope2/lib/python/AccessControl/requestmethod.py(64)_curried()<br>-&gt; return callable(*args, **kw)<br>&nbsp; /Applications/Plone-3.1.1/myproject/parts/plone/CMFQuickInstallerTool/QuickInstallerTool.py(639)reinstallProducts()<br>
-&gt; self.uninstallProducts(products, cascade, reinstall=True)<br>&nbsp; &lt;string&gt;(4)_facade()<br>&nbsp; /Applications/Plone-3.1.1/myproject/parts/zope2/lib/python/AccessControl/requestmethod.py(64)_curried()<br>-&gt; return callable(*args, **kw)<br>
&nbsp; /Applications/Plone-3.1.1/myproject/parts/plone/CMFQuickInstallerTool/QuickInstallerTool.py(621)uninstallProducts()<br>-&gt; prod.uninstall(cascade=cascade, reinstall=reinstall)<br>&nbsp; /Applications/Plone-3.1.1/myproject/parts/plone/CMFQuickInstallerTool/InstalledProduct.py(297)uninstall()<br>
-&gt; self._cascadeRemove(cascade)<br>&nbsp; /Applications/Plone-3.1.1/myproject/parts/plone/CMFQuickInstallerTool/InstalledProduct.py(386)_cascadeRemove()<br>-&gt; sm.unregisterUtility(provided=provided, name=name)<br>&gt; /Applications/Plone-3.1.1/myproject/parts/zope2/lib/python/zope/component/registry.py(102)unregisterUtility()<br>
</blockquote>&nbsp;<br>I don&#39;t know how to go about fixing this problem since the infrastructure is not set up to handle this.&nbsp; Realistically, if there is an uninstall of a component needed, I would think it could be handled in the Products.GenericSetup.components class.&nbsp; <br>
<br>Any ideas to help me get around this problem would be greatly appreciated.<br><br><br>Thanks,<br>Nathan Van Gheem<br></div>