From: billbarker Date: Thu, 25 May 2006 04:07:25 +0000 (+0000) Subject: Port the fix for MODELER-3 from [modeler] (minus some of the fluff :). X-Git-Url: https://git.internetallee.de/?a=commitdiff_plain;h=47be6a67d6925e0f55f6786cee9e8a7d1cd85445;p=tomcat7.0 Port the fix for MODELER-3 from [modeler] (minus some of the fluff :). It's mostly non-critical path stuff, so it shouldn't be that much of a performance hit. Also throw in some Generics cleanups. git-svn-id: https://svn.apache.org/repos/asf/tomcat/tc6.0.x/trunk@409298 13f79535-47bb-0310-9956-ffa450edef68 --- diff --git a/java/org/apache/tomcat/util/modeler/Registry.java b/java/org/apache/tomcat/util/modeler/Registry.java index 6fdf23cc5..14bfa7c6f 100644 --- a/java/org/apache/tomcat/util/modeler/Registry.java +++ b/java/org/apache/tomcat/util/modeler/Registry.java @@ -106,14 +106,14 @@ public class Registry implements RegistryMBean, MBeanRegistration { * The set of ManagedBean instances for the beans this registry * knows about, keyed by name. */ - private HashMap descriptors = new HashMap(); + private HashMap descriptors = new HashMap(); /** List of managed byeans, keyed by class name */ - private HashMap descriptorsByClass = new HashMap(); + private HashMap descriptorsByClass = new HashMap(); // map to avoid duplicated searching or loading descriptors - private HashMap searchedPaths=new HashMap(); + private Hashtable searchedPaths=new Hashtable(); private Object key; private Object guard; @@ -218,9 +218,9 @@ public class Registry implements RegistryMBean, MBeanRegistration { * @since 1.1 */ public void stop() { - descriptorsByClass = new HashMap(); - descriptors = new HashMap(); - searchedPaths=new HashMap(); + descriptorsByClass = new HashMap(); + descriptors = new HashMap(); + searchedPaths=new Hashtable(); } /** @@ -411,9 +411,11 @@ public class Registry implements RegistryMBean, MBeanRegistration { */ 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 +430,12 @@ public class Registry implements RegistryMBean, MBeanRegistration { */ 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= descriptors.get(name); + if( mb==null ) + mb=descriptorsByClass.get(name); + return mb; + } } /** @@ -441,7 +445,9 @@ public class Registry implements RegistryMBean, MBeanRegistration { * @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 +462,15 @@ public class Registry implements RegistryMBean, MBeanRegistration { 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) { + Iterator items = descriptors.values().iterator(); + while (items.hasNext()) { + ManagedBean item = items.next(); + if ((group == null) && (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 +487,10 @@ public class Registry implements RegistryMBean, MBeanRegistration { */ 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 -------------------- @@ -840,7 +850,7 @@ public class Registry implements RegistryMBean, MBeanRegistration { * * @param packageName */ - public void loadDescriptors( String packageName, ClassLoader classLoader ) { + public synchronized void loadDescriptors( String packageName, ClassLoader classLoader ) { String res=packageName.replace( '.', '/'); if( log.isTraceEnabled() ) {