You are viewing a plain text version of this content. The canonical link for it is here.
Posted to java-dev@axis.apache.org by di...@apache.org on 2005/09/15 21:07:03 UTC

svn commit: r289289 [5/134] - in /webservices/axis2/trunk/java: ./ etc/ modules/addressing/ modules/addressing/src/META-INF/ modules/addressing/src/org/apache/axis2/handlers/addressing/ modules/addressing/test-resources/ modules/addressing/test/org/apa...

Modified: webservices/axis2/trunk/java/modules/common/src/org/apache/axis2/i18n/ProjectResourceBundle.java
URL: http://svn.apache.org/viewcvs/webservices/axis2/trunk/java/modules/common/src/org/apache/axis2/i18n/ProjectResourceBundle.java?rev=289289&r1=289288&r2=289289&view=diff
==============================================================================
--- webservices/axis2/trunk/java/modules/common/src/org/apache/axis2/i18n/ProjectResourceBundle.java (original)
+++ webservices/axis2/trunk/java/modules/common/src/org/apache/axis2/i18n/ProjectResourceBundle.java Thu Sep 15 11:52:11 2005
@@ -1,460 +1,456 @@
-/*
- * Copyright 2001-2004 The Apache Software Foundation.
- * 
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- * 
- *      http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package org.apache.axis2.i18n;
-
-
-import org.apache.commons.logging.Log;
-import org.apache.commons.logging.LogFactory;
-
-import java.util.*;
-
-/**
- * <p>Wrapper class for resource bundles. Property files are used to store
- * resource strings, which are the only types of resources available.
- * Property files can inherit properties from other files so that
- * a base property file can be used and a small number of properties
- * can be over-ridden by another property file. For example you may
- * create an english version of a resource file named "resource.properties".
- * You then decide that the British English version of all of the properties
- * except one are the same, so there is no need to redefine all of the
- * properties in "resource_en_GB", just the one that is different.</p>
- * <p>The basename is the name of the property file without the ".properties"
- * extension.</p>
- * <p>Properties will be cached for performance.<p>
- * <p>Property values stored in the property files can also contain dynamic
- * variables. Any dynamic variable defined in PropertiesUtil.getVariableValue()
- * can be used (such as {date}), as well as arguments in the form {0}, {1}, etc.
- * Argument values are specified in the various overloaded getString() methods.</p>
- *
- * @author Richard A. Sitze (rsitze@us.ibm.com)
- * @author Karl Moss (kmoss@macromedia.com)
- * @author Glen Daniels (gdaniels@apache.org)
- */
-public class ProjectResourceBundle extends ResourceBundle {
-    protected static Log log =
-            LogFactory.getLog(ProjectResourceBundle.class.getName());
-
-
-    // The static cache of ResourceBundles.
-    // The key is the 'basename + locale + default locale'
-    // The element is a ResourceBundle object
-    private static final Hashtable bundleCache = new Hashtable();
-
-    private static final Locale defaultLocale = Locale.getDefault();
-
-    private final ResourceBundle resourceBundle;
-    private final String resourceName;
-
-
-    protected Object handleGetObject(String key)
-            throws MissingResourceException {
-        if (log.isDebugEnabled()) {
-            log.debug(this.toString() + "::handleGetObject(" + key + ")");
-        }
-//            return resourceBundle.handleGetObject(key);
-        Object obj;
-        try {
-            obj = resourceBundle.getObject(key);
-        } catch (MissingResourceException e) {
-            /* catch missing resource, ignore, & return null
-             * if this method doesn't return null, then parents
-             * are not searched
-             */
-            obj = null;
-        }
-        return obj;
-    }
-
-    public Enumeration getKeys() {
-        Enumeration myKeys = resourceBundle.getKeys();
-        if (parent == null) {
-            return myKeys;
-        } else {
-            final HashSet set = new HashSet();
-            while (myKeys.hasMoreElements()) {
-                set.add(myKeys.nextElement());
-            }
-
-            Enumeration pKeys = parent.getKeys();
-            while (pKeys.hasMoreElements()) {
-                set.add(pKeys.nextElement());
-            }
-
-            return new Enumeration() {
-                private Iterator it = set.iterator();
-
-                public boolean hasMoreElements() {
-                    return it.hasNext();
-                }
-
-                public Object nextElement() {
-                    return it.next();
-                }
-            };
-        }
-    }
-
-
-    /**
-     * Construct a new ProjectResourceBundle
-     *
-     * @param projectName  The name of the project to which the class belongs.
-     *                     It must be a proper prefix of the caller's package.
-     * @param caller       The calling class.
-     *                     This is used to get the package name to further construct
-     *                     the basename as well as to get the proper ClassLoader.
-     * @param resourceName The name of the resource without the
-     *                     ".properties" extension
-     * @throws MissingResourceException if projectName is not a prefix of
-     *                                  the caller's package name, or if the resource could not be
-     *                                  found/loaded.
-     */
-    public static ProjectResourceBundle getBundle(String projectName,
-                                                  String packageName,
-                                                  String resourceName)
-            throws MissingResourceException {
-        return getBundle(projectName, packageName, resourceName, null, null, null);
-    }
-
-    /**
-     * Construct a new ProjectResourceBundle
-     *
-     * @param projectName  The name of the project to which the class belongs.
-     *                     It must be a proper prefix of the caller's package.
-     * @param caller       The calling class.
-     *                     This is used to get the package name to further construct
-     *                     the basename as well as to get the proper ClassLoader.
-     * @param resourceName The name of the resource without the
-     *                     ".properties" extension
-     * @throws MissingResourceException if projectName is not a prefix of
-     *                                  the caller's package name, or if the resource could not be
-     *                                  found/loaded.
-     */
-    public static ProjectResourceBundle getBundle(String projectName,
-                                                  Class caller,
-                                                  String resourceName,
-                                                  Locale locale)
-            throws MissingResourceException {
-        return getBundle(projectName,
-                caller,
-                resourceName,
-                locale,
-                null);
-    }
-
-    /**
-     * Construct a new ProjectResourceBundle
-     *
-     * @param projectName  The name of the project to which the class belongs.
-     *                     It must be a proper prefix of the caller's package.
-     * @param caller       The calling class.
-     *                     This is used to get the package name to further construct
-     *                     the basename as well as to get the proper ClassLoader.
-     * @param resourceName The name of the resource without the
-     *                     ".properties" extension
-     * @param locale       The locale
-     * @throws MissingResourceException if projectName is not a prefix of
-     *                                  the caller's package name, or if the resource could not be
-     *                                  found/loaded.
-     */
-    public static ProjectResourceBundle getBundle(String projectName,
-                                                  String packageName,
-                                                  String resourceName,
-                                                  Locale locale,
-                                                  ClassLoader loader)
-            throws MissingResourceException {
-        return getBundle(projectName, packageName, resourceName, locale, loader, null);
-    }
-
-    /**
-     * Construct a new ProjectResourceBundle
-     *
-     * @param projectName   The name of the project to which the class belongs.
-     *                      It must be a proper prefix of the caller's package.
-     * @param caller        The calling class.
-     *                      This is used to get the package name to further construct
-     *                      the basename as well as to get the proper ClassLoader.
-     * @param resourceName  The name of the resource without the
-     *                      ".properties" extension
-     * @param locale        The locale
-     * @param extendsBundle If non-null, then this ExtendMessages will
-     *                      default to extendsBundle.
-     * @throws MissingResourceException if projectName is not a prefix of
-     *                                  the caller's package name, or if the resource could not be
-     *                                  found/loaded.
-     */
-    public static ProjectResourceBundle getBundle(String projectName,
-                                                  Class caller,
-                                                  String resourceName,
-                                                  Locale locale,
-                                                  ResourceBundle extendsBundle)
-            throws MissingResourceException {
-        return getBundle(projectName,
-                getPackage(caller.getClass().getName()),
-                resourceName,
-                locale,
-                caller.getClass().getClassLoader(),
-                extendsBundle);
-    }
-
-    /**
-     * Construct a new ProjectResourceBundle
-     *
-     * @param projectName   The name of the project to which the class belongs.
-     *                      It must be a proper prefix of the caller's package.
-     * @param caller        The calling class.
-     *                      This is used to get the package name to further construct
-     *                      the basename as well as to get the proper ClassLoader.
-     * @param resourceName  The name of the resource without the
-     *                      ".properties" extension
-     * @param locale        The locale
-     * @param extendsBundle If non-null, then this ExtendMessages will
-     *                      default to extendsBundle.
-     * @throws MissingResourceException if projectName is not a prefix of
-     *                                  the caller's package name, or if the resource could not be
-     *                                  found/loaded.
-     */
-    public static ProjectResourceBundle getBundle(String projectName,
-                                                  String packageName,
-                                                  String resourceName,
-                                                  Locale locale,
-                                                  ClassLoader loader,
-                                                  ResourceBundle extendsBundle)
-            throws MissingResourceException {
-        if (log.isDebugEnabled()) {
-            log.debug("getBundle(" + projectName + ","
-                    + packageName + ","
-                    + resourceName + ","
-                    + String.valueOf(locale) + ",...)");
-        }
-
-        Context context = new Context();
-        context.setLocale(locale);
-        context.setLoader(loader);
-        context.setProjectName(projectName);
-        context.setResourceName(resourceName);
-        context.setParentBundle(extendsBundle);
-
-        packageName = context.validate(packageName);
-
-        ProjectResourceBundle bundle = null;
-        try {
-            bundle = getBundle(context, packageName);
-        } catch (RuntimeException e) {
-            log.debug("Exception: ", e);
-            throw e;
-        }
-
-        if (bundle == null) {
-            throw new MissingResourceException("Cannot find resource '" +
-                    packageName + '.' + resourceName + "'",
-                    resourceName, "");
-        }
-
-        return bundle;
-    }
-
-    /**
-     * get bundle...
-     * - check cache
-     * - try up hierarchy
-     * - if at top of hierarchy, use (link to) context.getParentBundle()
-     */
-    private static synchronized ProjectResourceBundle getBundle(Context context, String packageName)
-            throws MissingResourceException {
-        String cacheKey = context.getCacheKey(packageName);
-
-        ProjectResourceBundle prb = (ProjectResourceBundle) bundleCache.get(cacheKey);
-
-        if (prb == null) {
-            String name = packageName + '.' + context.getResourceName();
-            ResourceBundle rb = context.loadBundle(packageName);
-            ResourceBundle parent = context.getParentBundle(packageName);
-
-            if (rb != null) {
-                prb = new ProjectResourceBundle(name, rb);
-                prb.setParent(parent);
-                if (log.isDebugEnabled()) {
-                    log.debug("Created " + prb + ", linked to parent " + String.valueOf(parent));
-                }
-            } else {
-                if (parent != null) {
-                    if (parent instanceof ProjectResourceBundle) {
-                        prb = (ProjectResourceBundle) parent;
-                    } else {
-                        prb = new ProjectResourceBundle(name, parent);
-                    }
-                    if (log.isDebugEnabled()) {
-                        log.debug("Root package not found, cross link to " + parent);
-                    }
-                }
-            }
-
-            if (prb != null) {
-                // Cache the resource
-                bundleCache.put(cacheKey, prb);
-            }
-        }
-
-        return prb;
-    }
-
-    private static final String getPackage(String name) {
-        return name.substring(0, name.lastIndexOf('.')).intern();
-    }
-
-    /**
-     * Construct a new ProjectResourceBundle
-     */
-    private ProjectResourceBundle(String name, ResourceBundle bundle)
-            throws MissingResourceException {
-        this.resourceBundle = bundle;
-        this.resourceName = name;
-    }
-
-    public String getResourceName() {
-        return resourceName;
-    }
-
-    /**
-     * Clears the internal cache
-     */
-    public static void clearCache() {
-        bundleCache.clear();
-    }
-
-    public String toString() {
-        return resourceName;
-    }
-
-
-    private static class Context {
-        private Locale _locale;
-        private ClassLoader _loader;
-        private String _projectName;
-        private String _resourceName;
-        private ResourceBundle _parent;
-
-        void setLocale(Locale l) {
-            /* 1. Docs indicate that if locale is not specified,
-             *    then the default local is used in it's place.
-             * 2. A null value for locale is invalid.
-             * 
-             * Therefore, default...
-             */
-            _locale = (l == null) ? defaultLocale : l;
-        }
-
-        void setLoader(ClassLoader l) {
-            _loader = (l != null) ? l : this.getClass().getClassLoader();
-            // START FIX: http://nagoya.apache.org/bugzilla/show_bug.cgi?id=16868
-            if (_loader == null) {
-                _loader = ClassLoader.getSystemClassLoader();
-            }
-            // END FIX: http://nagoya.apache.org/bugzilla/show_bug.cgi?id=16868
-        }
-
-        void setProjectName(String name) {
-            _projectName = name.intern();
-        }
-
-        void setResourceName(String name) {
-            _resourceName = name.intern();
-        }
-
-        void setParentBundle(ResourceBundle b) {
-            _parent = b;
-        }
-
-        Locale getLocale() {
-            return _locale;
-        }
-
-        ClassLoader getLoader() {
-            return _loader;
-        }
-
-        String getProjectName() {
-            return _projectName;
-        }
-
-        String getResourceName() {
-            return _resourceName;
-        }
-
-        ResourceBundle getParentBundle() {
-            return _parent;
-        }
-
-        String getCacheKey(String packageName) {
-            String loaderName = (_loader == null) ? "" : (":" + _loader.hashCode());
-            return packageName + "." + _resourceName + ":" + _locale + ":" + defaultLocale + loaderName;
-        }
-
-        ResourceBundle loadBundle(String packageName) {
-            try {
-                return ResourceBundle.getBundle(packageName + '.' + _resourceName,
-                        _locale,
-                        _loader);
-            } catch (MissingResourceException e) {
-                // Deliberately surpressing print stack.. just the string for info.
-                log.debug("loadBundle: Ignoring MissingResourceException: " + e.getMessage());
-            }
-            return null;
-        }
-
-        ResourceBundle getParentBundle(String packageName) {
-            ResourceBundle p;
-            if (!packageName.equals(_projectName)) {
-                p = getBundle(this, getPackage(packageName));
-            } else {
-                p = _parent;
-                _parent = null;
-            }
-            return p;
-        }
-
-        String validate(String packageName)
-                throws MissingResourceException {
-            if (_projectName == null || _projectName.length() == 0) {
-                log.debug("Project name not specified");
-                throw new MissingResourceException("Project name not specified",
-                        "", "");
-            }
-
-            if (packageName == null || packageName.length() == 0) {
-                log.debug("Package name not specified");
-                throw new MissingResourceException("Package not specified",
-                        packageName, "");
-            }
-            packageName = packageName.intern();
-    
-            /* Ensure that project is a proper prefix of class.
-             * Terminate project name with '.' to ensure proper match.
-             */
-            if (!packageName.equals(_projectName) && !packageName.startsWith(_projectName + '.')) {
-                log.debug("Project not a prefix of Package");
-                throw new MissingResourceException("Project '" + _projectName
-                        + "' must be a prefix of Package '"
-                        + packageName + "'",
-                        packageName + '.' + _resourceName, "");
-            }
-
-            return packageName;
-        }
-    }
-}
+/*
+ * Copyright 2004,2005 The Apache Software Foundation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.axis2.i18n;
+
+
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+
+import java.util.*;
+
+/**
+ * <p>Wrapper class for resource bundles. Property files are used to store
+ * resource strings, which are the only types of resources available.
+ * Property files can inherit properties from other files so that
+ * a base property file can be used and a small number of properties
+ * can be over-ridden by another property file. For example you may
+ * create an english version of a resource file named "resource.properties".
+ * You then decide that the British English version of all of the properties
+ * except one are the same, so there is no need to redefine all of the
+ * properties in "resource_en_GB", just the one that is different.</p>
+ * <p>The basename is the name of the property file without the ".properties"
+ * extension.</p>
+ * <p>Properties will be cached for performance.<p>
+ * <p>Property values stored in the property files can also contain dynamic
+ * variables. Any dynamic variable defined in PropertiesUtil.getVariableValue()
+ * can be used (such as {date}), as well as arguments in the form {0}, {1}, etc.
+ * Argument values are specified in the various overloaded getString() methods.</p>
+ */
+public class ProjectResourceBundle extends ResourceBundle {
+    protected static Log log =
+            LogFactory.getLog(ProjectResourceBundle.class.getName());
+
+
+    // The static cache of ResourceBundles.
+    // The key is the 'basename + locale + default locale'
+    // The element is a ResourceBundle object
+    private static final Hashtable bundleCache = new Hashtable();
+
+    private static final Locale defaultLocale = Locale.getDefault();
+
+    private final ResourceBundle resourceBundle;
+    private final String resourceName;
+
+
+    protected Object handleGetObject(String key)
+            throws MissingResourceException {
+        if (log.isDebugEnabled()) {
+            log.debug(this.toString() + "::handleGetObject(" + key + ")");
+        }
+//            return resourceBundle.handleGetObject(key);
+        Object obj;
+        try {
+            obj = resourceBundle.getObject(key);
+        } catch (MissingResourceException e) {
+            /* catch missing resource, ignore, & return null
+             * if this method doesn't return null, then parents
+             * are not searched
+             */
+            obj = null;
+        }
+        return obj;
+    }
+
+    public Enumeration getKeys() {
+        Enumeration myKeys = resourceBundle.getKeys();
+        if (parent == null) {
+            return myKeys;
+        } else {
+            final HashSet set = new HashSet();
+            while (myKeys.hasMoreElements()) {
+                set.add(myKeys.nextElement());
+            }
+
+            Enumeration pKeys = parent.getKeys();
+            while (pKeys.hasMoreElements()) {
+                set.add(pKeys.nextElement());
+            }
+
+            return new Enumeration() {
+                private Iterator it = set.iterator();
+
+                public boolean hasMoreElements() {
+                    return it.hasNext();
+                }
+
+                public Object nextElement() {
+                    return it.next();
+                }
+            };
+        }
+    }
+
+
+    /**
+     * Construct a new ProjectResourceBundle
+     *
+     * @param projectName  The name of the project to which the class belongs.
+     *                     It must be a proper prefix of the caller's package.
+     * @param caller       The calling class.
+     *                     This is used to get the package name to further construct
+     *                     the basename as well as to get the proper ClassLoader.
+     * @param resourceName The name of the resource without the
+     *                     ".properties" extension
+     * @throws MissingResourceException if projectName is not a prefix of
+     *                                  the caller's package name, or if the resource could not be
+     *                                  found/loaded.
+     */
+    public static ProjectResourceBundle getBundle(String projectName,
+                                                  String packageName,
+                                                  String resourceName)
+            throws MissingResourceException {
+        return getBundle(projectName, packageName, resourceName, null, null, null);
+    }
+
+    /**
+     * Construct a new ProjectResourceBundle
+     *
+     * @param projectName  The name of the project to which the class belongs.
+     *                     It must be a proper prefix of the caller's package.
+     * @param caller       The calling class.
+     *                     This is used to get the package name to further construct
+     *                     the basename as well as to get the proper ClassLoader.
+     * @param resourceName The name of the resource without the
+     *                     ".properties" extension
+     * @throws MissingResourceException if projectName is not a prefix of
+     *                                  the caller's package name, or if the resource could not be
+     *                                  found/loaded.
+     */
+    public static ProjectResourceBundle getBundle(String projectName,
+                                                  Class caller,
+                                                  String resourceName,
+                                                  Locale locale)
+            throws MissingResourceException {
+        return getBundle(projectName,
+                caller,
+                resourceName,
+                locale,
+                null);
+    }
+
+    /**
+     * Construct a new ProjectResourceBundle
+     *
+     * @param projectName  The name of the project to which the class belongs.
+     *                     It must be a proper prefix of the caller's package.
+     * @param caller       The calling class.
+     *                     This is used to get the package name to further construct
+     *                     the basename as well as to get the proper ClassLoader.
+     * @param resourceName The name of the resource without the
+     *                     ".properties" extension
+     * @param locale       The locale
+     * @throws MissingResourceException if projectName is not a prefix of
+     *                                  the caller's package name, or if the resource could not be
+     *                                  found/loaded.
+     */
+    public static ProjectResourceBundle getBundle(String projectName,
+                                                  String packageName,
+                                                  String resourceName,
+                                                  Locale locale,
+                                                  ClassLoader loader)
+            throws MissingResourceException {
+        return getBundle(projectName, packageName, resourceName, locale, loader, null);
+    }
+
+    /**
+     * Construct a new ProjectResourceBundle
+     *
+     * @param projectName   The name of the project to which the class belongs.
+     *                      It must be a proper prefix of the caller's package.
+     * @param caller        The calling class.
+     *                      This is used to get the package name to further construct
+     *                      the basename as well as to get the proper ClassLoader.
+     * @param resourceName  The name of the resource without the
+     *                      ".properties" extension
+     * @param locale        The locale
+     * @param extendsBundle If non-null, then this ExtendMessages will
+     *                      default to extendsBundle.
+     * @throws MissingResourceException if projectName is not a prefix of
+     *                                  the caller's package name, or if the resource could not be
+     *                                  found/loaded.
+     */
+    public static ProjectResourceBundle getBundle(String projectName,
+                                                  Class caller,
+                                                  String resourceName,
+                                                  Locale locale,
+                                                  ResourceBundle extendsBundle)
+            throws MissingResourceException {
+        return getBundle(projectName,
+                getPackage(caller.getClass().getName()),
+                resourceName,
+                locale,
+                caller.getClass().getClassLoader(),
+                extendsBundle);
+    }
+
+    /**
+     * Construct a new ProjectResourceBundle
+     *
+     * @param projectName   The name of the project to which the class belongs.
+     *                      It must be a proper prefix of the caller's package.
+     * @param caller        The calling class.
+     *                      This is used to get the package name to further construct
+     *                      the basename as well as to get the proper ClassLoader.
+     * @param resourceName  The name of the resource without the
+     *                      ".properties" extension
+     * @param locale        The locale
+     * @param extendsBundle If non-null, then this ExtendMessages will
+     *                      default to extendsBundle.
+     * @throws MissingResourceException if projectName is not a prefix of
+     *                                  the caller's package name, or if the resource could not be
+     *                                  found/loaded.
+     */
+    public static ProjectResourceBundle getBundle(String projectName,
+                                                  String packageName,
+                                                  String resourceName,
+                                                  Locale locale,
+                                                  ClassLoader loader,
+                                                  ResourceBundle extendsBundle)
+            throws MissingResourceException {
+        if (log.isDebugEnabled()) {
+            log.debug("getBundle(" + projectName + ","
+                    + packageName + ","
+                    + resourceName + ","
+                    + String.valueOf(locale) + ",...)");
+        }
+
+        Context context = new Context();
+        context.setLocale(locale);
+        context.setLoader(loader);
+        context.setProjectName(projectName);
+        context.setResourceName(resourceName);
+        context.setParentBundle(extendsBundle);
+
+        packageName = context.validate(packageName);
+
+        ProjectResourceBundle bundle = null;
+        try {
+            bundle = getBundle(context, packageName);
+        } catch (RuntimeException e) {
+            log.debug("Exception: ", e);
+            throw e;
+        }
+
+        if (bundle == null) {
+            throw new MissingResourceException("Cannot find resource '" +
+                    packageName + '.' + resourceName + "'",
+                    resourceName, "");
+        }
+
+        return bundle;
+    }
+
+    /**
+     * get bundle...
+     * - check cache
+     * - try up hierarchy
+     * - if at top of hierarchy, use (link to) context.getParentBundle()
+     */
+    private static synchronized ProjectResourceBundle getBundle(Context context, String packageName)
+            throws MissingResourceException {
+        String cacheKey = context.getCacheKey(packageName);
+
+        ProjectResourceBundle prb = (ProjectResourceBundle) bundleCache.get(cacheKey);
+
+        if (prb == null) {
+            String name = packageName + '.' + context.getResourceName();
+            ResourceBundle rb = context.loadBundle(packageName);
+            ResourceBundle parent = context.getParentBundle(packageName);
+
+            if (rb != null) {
+                prb = new ProjectResourceBundle(name, rb);
+                prb.setParent(parent);
+                if (log.isDebugEnabled()) {
+                    log.debug("Created " + prb + ", linked to parent " + String.valueOf(parent));
+                }
+            } else {
+                if (parent != null) {
+                    if (parent instanceof ProjectResourceBundle) {
+                        prb = (ProjectResourceBundle) parent;
+                    } else {
+                        prb = new ProjectResourceBundle(name, parent);
+                    }
+                    if (log.isDebugEnabled()) {
+                        log.debug("Root package not found, cross link to " + parent);
+                    }
+                }
+            }
+
+            if (prb != null) {
+                // Cache the resource
+                bundleCache.put(cacheKey, prb);
+            }
+        }
+
+        return prb;
+    }
+
+    private static final String getPackage(String name) {
+        return name.substring(0, name.lastIndexOf('.')).intern();
+    }
+
+    /**
+     * Construct a new ProjectResourceBundle
+     */
+    private ProjectResourceBundle(String name, ResourceBundle bundle)
+            throws MissingResourceException {
+        this.resourceBundle = bundle;
+        this.resourceName = name;
+    }
+
+    public String getResourceName() {
+        return resourceName;
+    }
+
+    /**
+     * Clears the internal cache
+     */
+    public static void clearCache() {
+        bundleCache.clear();
+    }
+
+    public String toString() {
+        return resourceName;
+    }
+
+
+    private static class Context {
+        private Locale _locale;
+        private ClassLoader _loader;
+        private String _projectName;
+        private String _resourceName;
+        private ResourceBundle _parent;
+
+        void setLocale(Locale l) {
+            /* 1. Docs indicate that if locale is not specified,
+             *    then the default local is used in it's place.
+             * 2. A null value for locale is invalid.
+             * 
+             * Therefore, default...
+             */
+            _locale = (l == null) ? defaultLocale : l;
+        }
+
+        void setLoader(ClassLoader l) {
+            _loader = (l != null) ? l : this.getClass().getClassLoader();
+            // START FIX: http://nagoya.apache.org/bugzilla/show_bug.cgi?id=16868
+            if (_loader == null) {
+                _loader = ClassLoader.getSystemClassLoader();
+            }
+            // END FIX: http://nagoya.apache.org/bugzilla/show_bug.cgi?id=16868
+        }
+
+        void setProjectName(String name) {
+            _projectName = name.intern();
+        }
+
+        void setResourceName(String name) {
+            _resourceName = name.intern();
+        }
+
+        void setParentBundle(ResourceBundle b) {
+            _parent = b;
+        }
+
+        Locale getLocale() {
+            return _locale;
+        }
+
+        ClassLoader getLoader() {
+            return _loader;
+        }
+
+        String getProjectName() {
+            return _projectName;
+        }
+
+        String getResourceName() {
+            return _resourceName;
+        }
+
+        ResourceBundle getParentBundle() {
+            return _parent;
+        }
+
+        String getCacheKey(String packageName) {
+            String loaderName = (_loader == null) ? "" : (":" + _loader.hashCode());
+            return packageName + "." + _resourceName + ":" + _locale + ":" + defaultLocale + loaderName;
+        }
+
+        ResourceBundle loadBundle(String packageName) {
+            try {
+                return ResourceBundle.getBundle(packageName + '.' + _resourceName,
+                        _locale,
+                        _loader);
+            } catch (MissingResourceException e) {
+                // Deliberately surpressing print stack.. just the string for info.
+                log.debug("loadBundle: Ignoring MissingResourceException: " + e.getMessage());
+            }
+            return null;
+        }
+
+        ResourceBundle getParentBundle(String packageName) {
+            ResourceBundle p;
+            if (!packageName.equals(_projectName)) {
+                p = getBundle(this, getPackage(packageName));
+            } else {
+                p = _parent;
+                _parent = null;
+            }
+            return p;
+        }
+
+        String validate(String packageName)
+                throws MissingResourceException {
+            if (_projectName == null || _projectName.length() == 0) {
+                log.debug("Project name not specified");
+                throw new MissingResourceException("Project name not specified",
+                        "", "");
+            }
+
+            if (packageName == null || packageName.length() == 0) {
+                log.debug("Package name not specified");
+                throw new MissingResourceException("Package not specified",
+                        packageName, "");
+            }
+            packageName = packageName.intern();
+    
+            /* Ensure that project is a proper prefix of class.
+             * Terminate project name with '.' to ensure proper match.
+             */
+            if (!packageName.equals(_projectName) && !packageName.startsWith(_projectName + '.')) {
+                log.debug("Project not a prefix of Package");
+                throw new MissingResourceException("Project '" + _projectName
+                        + "' must be a prefix of Package '"
+                        + packageName + "'",
+                        packageName + '.' + _resourceName, "");
+            }
+
+            return packageName;
+        }
+    }
+}

Propchange: webservices/axis2/trunk/java/modules/common/src/org/apache/axis2/i18n/ProjectResourceBundle.java
------------------------------------------------------------------------------
    svn:eol-style = native