You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@commons.apache.org by di...@apache.org on 2006/05/24 17:00:43 UTC

svn commit: r409181 - /jakarta/commons/proper/modeler/trunk/src/java/org/apache/commons/modeler/Registry.java

Author: dims
Date: Wed May 24 08:00:42 2006
New Revision: 409181

URL: http://svn.apache.org/viewvc?rev=409181&view=rev
Log:
Fix for Bug 39521 - [modeler] Registry insufficiently synchronized

Modified:
    jakarta/commons/proper/modeler/trunk/src/java/org/apache/commons/modeler/Registry.java

Modified: jakarta/commons/proper/modeler/trunk/src/java/org/apache/commons/modeler/Registry.java
URL: http://svn.apache.org/viewvc/jakarta/commons/proper/modeler/trunk/src/java/org/apache/commons/modeler/Registry.java?rev=409181&r1=409180&r2=409181&view=diff
==============================================================================
--- jakarta/commons/proper/modeler/trunk/src/java/org/apache/commons/modeler/Registry.java (original)
+++ jakarta/commons/proper/modeler/trunk/src/java/org/apache/commons/modeler/Registry.java Wed May 24 08:00:42 2006
@@ -28,6 +28,8 @@
 import java.util.Hashtable;
 import java.util.Iterator;
 import java.util.List;
+import java.util.Collections;
+import java.util.Map;
 
 import javax.management.DynamicMBean;
 import javax.management.MBeanAttributeInfo;
@@ -106,16 +108,15 @@
      * The set of ManagedBean instances for the beans this registry
      * knows about, keyed by name.
      */
-    private HashMap descriptors = new HashMap();
+    private final HashMap descriptors = new HashMap();
 
     /** List of managed byeans, keyed by class name
      */
-    private HashMap descriptorsByClass = new HashMap();
+    private final HashMap descriptorsByClass = new HashMap();
 
     // map to avoid duplicated searching or loading descriptors 
-    private HashMap searchedPaths=new HashMap();
+    private final Map searchedPaths= Collections.synchronizedMap(new HashMap());
     
-    private Object key;
     private Object guard;
 
     // Id - small ints to use array access. No reset on stop()
@@ -160,7 +161,6 @@
                 localRegistry=(Registry)perLoaderRegistries.get(key);
                 if( localRegistry == null ) {
                     localRegistry=new Registry();
-                    localRegistry.key=key;
                     localRegistry.guard=guard;
                     perLoaderRegistries.put( key, localRegistry );
                     return localRegistry;
@@ -218,9 +218,11 @@
      * @since 1.1
      */ 
     public void stop() {
-        descriptorsByClass = new HashMap();
-        descriptors = new HashMap();
-        searchedPaths=new HashMap();
+        synchronized(descriptors) {
+            descriptorsByClass.clear();
+            descriptors.clear();
+            searchedPaths.clear();
+        }
     }
     
     /** 
@@ -261,7 +263,6 @@
     public void loadMetadata(Object source ) throws Exception {
         if( source instanceof ClassLoader ) {
             loadMetaInfDescriptors((ClassLoader)source);
-            return;
         } else {
             loadDescriptors( null, source, null );
         }
@@ -411,9 +412,11 @@
      */
     public void addManagedBean(ManagedBean bean) {
         // XXX Use group + name
-        descriptors.put(bean.getName(), bean);
-        if( bean.getType() != null ) {
-            descriptorsByClass.put( bean.getType(), bean );
+        synchronized(descriptors) {
+            descriptors.put(bean.getName(), bean);
+            if( bean.getType() != null ) {
+                descriptorsByClass.put( bean.getType(), bean );
+            }
         }
     }
 
@@ -428,10 +431,12 @@
      */
     public ManagedBean findManagedBean(String name) {
         // XXX Group ?? Use Group + Type
-        ManagedBean mb=((ManagedBean) descriptors.get(name));
-        if( mb==null )
-            mb=(ManagedBean)descriptorsByClass.get(name);
-        return mb;
+        synchronized(descriptors) {
+            ManagedBean mb=((ManagedBean) descriptors.get(name));
+            if( mb==null )
+                mb=(ManagedBean)descriptorsByClass.get(name);
+            return mb;
+        }
     }
     
     /**
@@ -441,7 +446,9 @@
      * @since 1.0
      */
     public String[] findManagedBeans() {
-        return ((String[]) descriptors.keySet().toArray(new String[0]));
+        synchronized(descriptors) {
+            return ((String[]) descriptors.keySet().toArray(new String[0]));
+        }
     }
 
 
@@ -456,13 +463,16 @@
     public String[] findManagedBeans(String group) {
 
         ArrayList results = new ArrayList();
-        Iterator items = descriptors.values().iterator();
-        while (items.hasNext()) {
-            ManagedBean item = (ManagedBean) items.next();
-            if ((group == null) && (item.getGroup() == null)) {
-                results.add(item.getName());
-            } else if (group.equals(item.getGroup())) {
-                results.add(item.getName());
+        synchronized (descriptors) {
+            for (Iterator items = descriptors.values().iterator(); items.hasNext(); ) {
+                ManagedBean item = (ManagedBean) items.next();
+                if (group == null) {
+                    if (item.getGroup() == null) {
+                        results.add(item.getName());
+                    }
+                } else if (group.equals(item.getGroup())) {
+                    results.add(item.getName());
+                }
             }
         }
         String values[] = new String[results.size()];
@@ -479,8 +489,10 @@
      */
     public void removeManagedBean(ManagedBean bean) {
        // TODO: change this to use group/name
-        descriptors.remove(bean.getName());
-        descriptorsByClass.remove( bean.getType());
+        synchronized (descriptors) {
+            descriptors.remove(bean.getName());
+            descriptorsByClass.remove( bean.getType());
+        }
     }
 
     // -------------------- Deprecated 1.0 methods  --------------------
@@ -546,7 +558,7 @@
     public String getType( ObjectName oname, String attName )
     {
         String type=null;
-        MBeanInfo info=null;
+        MBeanInfo info;
         try {
             info=server.getMBeanInfo(oname);
         } catch (Exception e) {
@@ -573,7 +585,7 @@
     public MBeanOperationInfo getMethodInfo( ObjectName oname, String opName )
     {
         String type=null;
-        MBeanInfo info=null;
+        MBeanInfo info;
         try {
             info=server.getMBeanInfo(oname);
         } catch (Exception e) {
@@ -718,7 +730,7 @@
             objValue = new Long( value );
         } else if( "java.lang.Boolean".equals( type ) ||
                 "boolean".equals( type )) {
-            objValue=new Boolean( value );
+            objValue=Boolean.valueOf( value );
         }
         return objValue;
     }
@@ -840,7 +852,7 @@
      *
      * @param packageName
      */
-    public void loadDescriptors( String packageName, ClassLoader classLoader  ) {
+    public synchronized void loadDescriptors( String packageName, ClassLoader classLoader  ) {
         String res=packageName.replace( '.', '/');
 
         if( log.isTraceEnabled() ) {
@@ -869,12 +881,9 @@
                 loadDescriptors("MbeansDescriptorsDOMSource", dURL, null);
             else
                 loadDescriptors("MbeansDescriptorsSerSource", dURL, null);
-            return;
         } catch(Exception ex ) {
             log.error("Error loading " + dURL);
         }
-
-        return;
     }
 
     /** Experimental. Will become private, some code may still use it
@@ -939,9 +948,8 @@
         if( classLoader==null ) {
             classLoader=this.getClass().getClassLoader();
         }
-        
-        String className=type;
-        String pkg=className;
+
+        String pkg=type;
         while( pkg.indexOf( ".") > 0 ) {
             int lastComp=pkg.lastIndexOf( ".");
             if( lastComp <= 0 ) return;
@@ -951,7 +959,6 @@
             }
             loadDescriptors(pkg, classLoader);
         }
-        return;
     }
 
     private ModelerSource getModelerSource( String type )



---------------------------------------------------------------------
To unsubscribe, e-mail: commons-dev-unsubscribe@jakarta.apache.org
For additional commands, e-mail: commons-dev-help@jakarta.apache.org