vgritsenko 02/01/07 21:44:54 Modified: src/java/org/apache/cocoon/i18n XMLResourceBundle.java XMLResourceBundleFactory.java src/java/org/apache/cocoon/transformation I18nTransformer.java Log: Fixing NPE in i18n transformer: - transformer handles lifecycle of factory only - factory handles lifecycle of bundle Todo: - factory's dispose Revision Changes Path 1.2 +7 -6 xml-cocoon2/src/java/org/apache/cocoon/i18n/XMLResourceBundle.java Index: XMLResourceBundle.java =================================================================== RCS file: /home/cvs/xml-cocoon2/src/java/org/apache/cocoon/i18n/XMLResourceBundle.java,v retrieving revision 1.1 retrieving revision 1.2 diff -u -r1.1 -r1.2 --- XMLResourceBundle.java 3 Jan 2002 12:31:17 -0000 1.1 +++ XMLResourceBundle.java 8 Jan 2002 05:44:54 -0000 1.2 @@ -32,7 +32,7 @@ * @author <a href="mailto:[EMAIL PROTECTED]">Mike Engelhart</a> * @author <a href="mailto:[EMAIL PROTECTED]">Neeme Praks</a> * @author <a href="mailto:[EMAIL PROTECTED]">Oleg Podolsky</a> - * @version $Id: XMLResourceBundle.java,v 1.1 2002/01/03 12:31:17 giacomo Exp $ + * @version $Id: XMLResourceBundle.java,v 1.2 2002/01/08 05:44:54 vgritsenko Exp $ */ public class XMLResourceBundle extends ResourceBundle @@ -78,6 +78,12 @@ } } + public void dispose() + { + this.manager.release((Component)this.processor); + this.processor = null; + } + /** * Initalize the bundle * @@ -477,10 +483,5 @@ public Enumeration getKeys() { return cache.keys(); - } - - public void dispose() - { - this.manager.release((Component)this.processor); } } 1.2 +25 -5 xml-cocoon2/src/java/org/apache/cocoon/i18n/XMLResourceBundleFactory.java Index: XMLResourceBundleFactory.java =================================================================== RCS file: /home/cvs/xml-cocoon2/src/java/org/apache/cocoon/i18n/XMLResourceBundleFactory.java,v retrieving revision 1.1 retrieving revision 1.2 diff -u -r1.1 -r1.2 --- XMLResourceBundleFactory.java 3 Jan 2002 12:31:17 -0000 1.1 +++ XMLResourceBundleFactory.java 8 Jan 2002 05:44:54 -0000 1.2 @@ -8,9 +8,12 @@ //package org.apache.avalon.excalibur.i18n; package org.apache.cocoon.i18n; +import org.apache.avalon.framework.activity.Disposable; import org.apache.avalon.framework.component.Component; import org.apache.avalon.framework.component.ComponentException; import org.apache.avalon.framework.component.DefaultComponentSelector; +import org.apache.avalon.framework.component.Composable; +import org.apache.avalon.framework.component.ComponentManager; import org.apache.avalon.framework.configuration.Configurable; import org.apache.avalon.framework.configuration.Configuration; import org.apache.avalon.framework.configuration.ConfigurationException; @@ -30,12 +33,12 @@ * @author <a href="mailto:[EMAIL PROTECTED]">Mike Engelhart</a> * @author <a href="mailto:[EMAIL PROTECTED]">Neeme Praks</a> * @author <a href="mailto:[EMAIL PROTECTED]">Oleg Podolsky</a> - * @version $Id: XMLResourceBundleFactory.java,v 1.1 2002/01/03 12:31:17 giacomo Exp $ + * @version $Id: XMLResourceBundleFactory.java,v 1.2 2002/01/08 05:44:54 vgritsenko Exp $ */ public class XMLResourceBundleFactory extends DefaultComponentSelector - implements Configurable, Loggable, ThreadSafe + implements Configurable, Composable, Loggable, Disposable, ThreadSafe { /** Should we load bundles to cache on startup or not? */ protected boolean cacheAtStartup = false; @@ -49,6 +52,9 @@ /** The logger */ protected Logger logger; + /** Component Manager */ + protected ComponentManager manager = null; + /** Constants for configuration keys */ public static class ConfigurationKeys { @@ -63,6 +69,15 @@ { } + public void compose(ComponentManager manager) { + this.manager = manager; + } + + public void dispose() { + // FIXME: Need to go through all bundles and call dispose() on them + this.manager = null; + } + /** * Set the logger. * @@ -277,19 +292,24 @@ parentBundle = (XMLResourceBundle) selectParent(name, loc); bundle = new XMLResourceBundle(); bundle.setLogger(logger); + bundle.compose(this.manager); bundle.init(name, fileName, loc, parentBundle, cacheAtStartup); + return bundle; } catch (SAXParseException e) { if (logger.isInfoEnabled()) logger.info("Resource loading failed: " + e.getMessage()); - bundle = null; } catch (Exception e) { logger.error("Error while loading resource: " + name + ", locale " + loc + ", bundleName " + fileName, e); - bundle = null; } - return bundle; + return null; + } + + public void release(Component component) + { + // Do nothing } /** 1.3 +18 -8 xml-cocoon2/src/java/org/apache/cocoon/transformation/I18nTransformer.java Index: I18nTransformer.java =================================================================== RCS file: /home/cvs/xml-cocoon2/src/java/org/apache/cocoon/transformation/I18nTransformer.java,v retrieving revision 1.2 retrieving revision 1.3 diff -u -r1.2 -r1.3 --- I18nTransformer.java 7 Jan 2002 13:09:02 -0000 1.2 +++ I18nTransformer.java 8 Jan 2002 05:44:54 -0000 1.3 @@ -10,6 +10,7 @@ package org.apache.cocoon.transformation; import org.apache.avalon.excalibur.pool.Poolable; +import org.apache.avalon.framework.activity.Disposable; import org.apache.avalon.framework.component.ComponentManager; import org.apache.avalon.framework.component.Composable; import org.apache.avalon.framework.configuration.Configurable; @@ -188,7 +189,7 @@ * @author <a href="mailto:[EMAIL PROTECTED]">Michael Enke</a> */ public class I18nTransformer extends AbstractTransformer - implements Composable, Poolable, Configurable, Recyclable { + implements Composable, Poolable, Configurable, Recyclable, Disposable { private static final String FILE = "file:"; @@ -336,6 +337,10 @@ * Dictionary data. */ private XMLResourceBundle dictionary; + + // FIXME: Shouldn't factory be the global component? + // Now every I18nTransformer have own instance of factory + // every of which in turn have own file cache. private XMLResourceBundleFactory factory = new XMLResourceBundleFactory(); /* @@ -442,13 +447,10 @@ debug( "using locale " + locale.toString() ); dictionary = - (XMLResourceBundle) factory.select( - localCatName == null ? catalogueName : localCatName, - locale - ); - - //FIXME(DIMS): Why should i do this explicitly? Is there an alternative? - dictionary.compose( this.manager ); + (XMLResourceBundle) factory.select( + localCatName == null ? catalogueName : localCatName, + locale + ); debug( "selected dictionary " + dictionary ); @@ -504,6 +506,7 @@ public void compose( ComponentManager manager ) { this.manager = manager; + factory.compose( manager ); } public void startElement( String uri, String name, String raw, @@ -1201,5 +1204,12 @@ untranslated = globalUntranslated; debug( "untranslated-text restored to " + untranslated ); } + factory.release(dictionary); + dictionary = null; + } + + public void dispose() { + factory.dispose(); + factory = null; } }
---------------------------------------------------------------------- In case of troubles, e-mail: [EMAIL PROTECTED] To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED]