This is an automated email from the ASF dual-hosted git repository. markt pushed a commit to branch 8.5.x in repository https://gitbox.apache.org/repos/asf/tomcat.git
The following commit(s) were added to refs/heads/8.5.x by this push: new 443f5ee Fix SpotBugs warnings. Align with 9.0.x/7.0.x. 443f5ee is described below commit 443f5ee0fd00e1412b69a7c8628055794d512b9f Author: Mark Thomas <ma...@apache.org> AuthorDate: Thu Nov 14 21:08:12 2019 +0000 Fix SpotBugs warnings. Align with 9.0.x/7.0.x. --- java/org/apache/tomcat/util/modeler/Registry.java | 476 ++++++++++------------ 1 file changed, 226 insertions(+), 250 deletions(-) diff --git a/java/org/apache/tomcat/util/modeler/Registry.java b/java/org/apache/tomcat/util/modeler/Registry.java index 0be0aff..f90d3ed 100644 --- a/java/org/apache/tomcat/util/modeler/Registry.java +++ b/java/org/apache/tomcat/util/modeler/Registry.java @@ -14,11 +14,8 @@ * See the License for the specific language governing permissions and * limitations under the License. */ - - package org.apache.tomcat.util.modeler; - import java.io.File; import java.io.FileInputStream; import java.io.InputStream; @@ -48,15 +45,15 @@ import org.apache.tomcat.util.modeler.modules.ModelerSource; - double check the interfaces - start removing the use of the experimental methods in tomcat, then remove the methods ( before 1.1 final ) - - is the security enough to prevent Registry being used to avoid the permission - checks in the mbean server ? + - is the security enough to prevent Registry being used to avoid the + permission checks in the mbean server ? */ /** * Registry for modeler MBeans. * - * This is the main entry point into modeler. It provides methods to create - * and manipulate model mbeans and simplify their use. + * This is the main entry point into modeler. It provides methods to create and + * manipulate model mbeans and simplify their use. * * This class is itself an mbean. * @@ -66,7 +63,8 @@ import org.apache.tomcat.util.modeler.modules.ModelerSource; * @author Craig R. McClanahan * @author Costin Manolache */ -public class Registry implements RegistryMBean, MBeanRegistration { +public class Registry implements RegistryMBean, MBeanRegistration { + /** * The Log instance to which we will write our log messages. */ @@ -74,13 +72,9 @@ public class Registry implements RegistryMBean, MBeanRegistration { // Support for the factory methods - /** Will be used to isolate different apps and enhance security. - */ - private static final HashMap<Object,Registry> perLoaderRegistries = null; - /** - * The registry instance created by our factory method the first time - * it is called. + * The registry instance created by our factory method the first time it is + * called. */ private static Registry registry = null; @@ -90,11 +84,12 @@ public class Registry implements RegistryMBean, MBeanRegistration { * The <code>MBeanServer</code> instance that we will use to register * management beans. */ - private MBeanServer server = null; + private volatile MBeanServer server = null; + private final Object serverLock = new Object(); /** - * The set of ManagedBean instances for the beans this registry - * knows about, keyed by name. + * The set of ManagedBean instances for the beans this registry knows about, + * keyed by name. */ private HashMap<String,ManagedBean> descriptors = new HashMap<>(); @@ -116,8 +111,6 @@ public class Registry implements RegistryMBean, MBeanRegistration { // ----------------------------------------------------------- Constructors - /** - */ public Registry() { super(); } @@ -129,50 +122,22 @@ public class Registry implements RegistryMBean, MBeanRegistration { * Factory method to create (if necessary) and return our * <code>Registry</code> instance. * - * The current version uses a static - future versions could use - * the thread class loader. - * - * @param key Support for application isolation. If null, the context class - * loader will be used ( if setUseContextClassLoader is called ) or the - * default registry is returned. + * @param key Unused * @param guard Prevent access to the registry by untrusted components + * * @return the registry * @since 1.1 */ public static synchronized Registry getRegistry(Object key, Object guard) { - Registry localRegistry; - if( perLoaderRegistries!=null ) { - if( key==null ) - key=Thread.currentThread().getContextClassLoader(); - if( key != null ) { - localRegistry = perLoaderRegistries.get(key); - if( localRegistry == null ) { - localRegistry=new Registry(); -// localRegistry.key=key; - localRegistry.guard=guard; - perLoaderRegistries.put( key, localRegistry ); - return localRegistry; - } - if( localRegistry.guard != null && - localRegistry.guard != guard ) { - return null; // XXX Should I throw a permission ex ? - } - return localRegistry; - } - } - - // static if (registry == null) { registry = new Registry(); } - if( registry.guard != null && - registry.guard != guard ) { + if (registry.guard != null && registry.guard != guard) { return null; } return registry; } - // -------------------- Generic methods -------------------- /** Lifecycle method - clean up the registry metadata. * Called from resetMetadata(). @@ -183,9 +148,10 @@ public class Registry implements RegistryMBean, MBeanRegistration { public void stop() { descriptorsByClass = new HashMap<>(); descriptors = new HashMap<>(); - searchedPaths=new HashMap<>(); + searchedPaths = new HashMap<>(); } + /** * Register a bean by creating a modeler mbean and adding it to the * MBeanServer. @@ -194,8 +160,9 @@ public class Registry implements RegistryMBean, MBeanRegistration { * "mbeans-descriptors.ser" or "mbeans-descriptors.xml" in the same package * or parent. * - * If the bean is an instance of DynamicMBean. it's metadata will be converted - * to a model mbean and we'll wrap it - so modeler services will be supported + * If the bean is an instance of DynamicMBean. it's metadata will be + * converted to a model mbean and we'll wrap it - so modeler services will + * be supported * * If the metadata is still not found, introspection will be used to extract * it automatically. @@ -203,36 +170,35 @@ public class Registry implements RegistryMBean, MBeanRegistration { * If an mbean is already registered under this name, it'll be first * unregistered. * - * If the component implements MBeanRegistration, the methods will be called. - * If the method has a method "setRegistry" that takes a RegistryMBean as - * parameter, it'll be called with the current registry. + * If the component implements MBeanRegistration, the methods will be + * called. If the method has a method "setRegistry" that takes a + * RegistryMBean as parameter, it'll be called with the current registry. * * * @param bean Object to be registered * @param oname Name used for registration * @param type The type of the mbean, as declared in mbeans-descriptors. If - * null, the name of the class will be used. This can be used as a hint or - * by subclasses. + * null, the name of the class will be used. This can be used as + * a hint or by subclasses. * @throws Exception if a registration error occurred * @since 1.1 */ @Override - public void registerComponent(Object bean, String oname, String type) - throws Exception - { + public void registerComponent(Object bean, String oname, String type) throws Exception { registerComponent(bean, new ObjectName(oname), type); } + /** - * Unregister a component. We'll first check if it is registered, - * and mask all errors. This is mostly a helper. + * Unregister a component. We'll first check if it is registered, and mask + * all errors. This is mostly a helper. * * @param oname Name used for unregistration * * @since 1.1 */ @Override - public void unregisterComponent( String oname ) { + public void unregisterComponent(String oname) { try { unregisterComponent(new ObjectName(oname)); } catch (MalformedObjectNameException e) { @@ -252,29 +218,31 @@ public class Registry implements RegistryMBean, MBeanRegistration { * @since 1.1 */ @Override - public void invoke(List<ObjectName> mbeans, String operation, - boolean failFirst ) throws Exception { - if( mbeans==null ) { + public void invoke(List<ObjectName> mbeans, String operation, boolean failFirst) + throws Exception { + + if (mbeans == null) { return; } for (ObjectName current : mbeans) { try { - if(current == null) { + if (current == null) { continue; } - if(getMethodInfo(current, operation) == null) { + if (getMethodInfo(current, operation) == null) { continue; } - getMBeanServer().invoke(current, operation, - new Object[] {}, new String[] {}); + getMBeanServer().invoke(current, operation, new Object[] {}, new String[] {}); - } catch( Exception t ) { - if( failFirst ) throw t; + } catch (Exception t) { + if (failFirst) + throw t; log.info("Error initializing " + current + " " + t.toString()); } } } + // -------------------- ID registry -------------------- /** @@ -287,40 +255,41 @@ public class Registry implements RegistryMBean, MBeanRegistration { * @since 1.1 */ @Override - public synchronized int getId( String domain, String name) { - if( domain==null) { - domain=""; + public synchronized int getId(String domain, String name) { + if (domain == null) { + domain = ""; } - Hashtable<String,Integer> domainTable = idDomains.get(domain); - if( domainTable == null ) { + Hashtable<String, Integer> domainTable = idDomains.get(domain); + if (domainTable == null) { domainTable = new Hashtable<>(); - idDomains.put( domain, domainTable); + idDomains.put(domain, domainTable); } - if( name==null ) { - name=""; + if (name == null) { + name = ""; } Integer i = domainTable.get(name); - if( i!= null ) { + if (i != null) { return i.intValue(); } int id[] = ids.get(domain); - if( id == null ) { - id=new int[1]; - ids.put( domain, id); + if (id == null) { + id = new int[1]; + ids.put(domain, id); } - int code=id[0]++; - domainTable.put( name, Integer.valueOf( code )); + int code = id[0]++; + domainTable.put(name, Integer.valueOf(code)); return code; } - // -------------------- Metadata -------------------- + + // -------------------- Metadata -------------------- // methods from 1.0 /** - * Add a new bean metadata to the set of beans known to this registry. - * This is used by internal components. + * Add a new bean metadata to the set of beans known to this registry. This + * is used by internal components. * * @param bean The managed bean to be added * @since 1.0 @@ -328,30 +297,31 @@ 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 ); + if (bean.getType() != null) { + descriptorsByClass.put(bean.getType(), bean); } } /** - * Find and return the managed bean definition for the specified - * bean name, if any; otherwise return <code>null</code>. + * Find and return the managed bean definition for the specified bean name, + * if any; otherwise return <code>null</code>. * * @param name Name of the managed bean to be returned. Since 1.1, both - * short names or the full name of the class can be used. + * short names or the full name of the class can be used. * @return the managed bean * @since 1.0 */ public ManagedBean findManagedBean(String name) { // XXX Group ?? Use Group + Type ManagedBean mb = descriptors.get(name); - if( mb==null ) + if (mb == null) mb = descriptorsByClass.get(name); return mb; } - // -------------------- Helpers -------------------- + + // -------------------- Helpers -------------------- /** * Get the type of an attribute of the object, from the metadata. @@ -361,27 +331,27 @@ public class Registry implements RegistryMBean, MBeanRegistration { * @return null if metadata about the attribute is not found * @since 1.1 */ - public String getType( ObjectName oname, String attName ) - { - String type=null; - MBeanInfo info=null; + public String getType(ObjectName oname, String attName) { + String type = null; + MBeanInfo info = null; try { - info=server.getMBeanInfo(oname); + info = getMBeanServer().getMBeanInfo(oname); } catch (Exception e) { log.info( "Can't find metadata for object" + oname ); return null; } - MBeanAttributeInfo attInfo[]=info.getAttributes(); - for( int i=0; i<attInfo.length; i++ ) { - if( attName.equals(attInfo[i].getName())) { - type=attInfo[i].getType(); + MBeanAttributeInfo attInfo[] = info.getAttributes(); + for (int i = 0; i < attInfo.length; i++) { + if (attName.equals(attInfo[i].getName())) { + type = attInfo[i].getType(); return type; } } return null; } + /** * Find the operation info for a method * @@ -389,31 +359,31 @@ public class Registry implements RegistryMBean, MBeanRegistration { * @param opName The operation name * @return the operation info for the specified operation */ - public MBeanOperationInfo getMethodInfo( ObjectName oname, String opName ) - { - MBeanInfo info=null; + public MBeanOperationInfo getMethodInfo(ObjectName oname, String opName) { + MBeanInfo info = null; try { - info=server.getMBeanInfo(oname); + info = getMBeanServer().getMBeanInfo(oname); } catch (Exception e) { log.info( "Can't find metadata " + oname ); return null; } - MBeanOperationInfo attInfo[]=info.getOperations(); - for( int i=0; i<attInfo.length; i++ ) { - if( opName.equals(attInfo[i].getName())) { + MBeanOperationInfo attInfo[] = info.getOperations(); + for (int i = 0; i < attInfo.length; i++) { + if (opName.equals(attInfo[i].getName())) { return attInfo[i]; } } return null; } + /** - * Unregister a component. This is just a helper that - * avoids exceptions by checking if the mbean is already registered + * Unregister a component. This is just a helper that avoids exceptions by + * checking if the mbean is already registered * * @param oname The bean name */ - public void unregisterComponent( ObjectName oname ) { + public void unregisterComponent(ObjectName oname) { try { if (oname != null && getMBeanServer().isRegistered(oname)) { getMBeanServer().unregisterMBean(oname); @@ -423,76 +393,85 @@ public class Registry implements RegistryMBean, MBeanRegistration { } } + /** * Factory method to create (if necessary) and return our * <code>MBeanServer</code> instance. + * * @return the MBean server */ - public synchronized MBeanServer getMBeanServer() { + public MBeanServer getMBeanServer() { if (server == null) { - long t1 = System.currentTimeMillis(); - if (MBeanServerFactory.findMBeanServer(null).size() > 0) { - server = MBeanServerFactory.findMBeanServer(null).get(0); - if (log.isDebugEnabled()) { - log.debug("Using existing MBeanServer " + (System.currentTimeMillis() - t1)); - } - } else { - server = ManagementFactory.getPlatformMBeanServer(); - if (log.isDebugEnabled()) { - log.debug("Creating MBeanServer" + (System.currentTimeMillis() - t1)); + synchronized (serverLock) { + if (server == null) { + long t1 = System.currentTimeMillis(); + if (MBeanServerFactory.findMBeanServer(null).size() > 0) { + server = MBeanServerFactory.findMBeanServer(null).get(0); + if (log.isDebugEnabled()) { + log.debug("Using existing MBeanServer " + (System.currentTimeMillis() - t1)); + } + } else { + server = ManagementFactory.getPlatformMBeanServer(); + if (log.isDebugEnabled()) { + log.debug("Creating MBeanServer" + (System.currentTimeMillis() - t1)); + } + } } } } return server; } + /** * Find or load metadata. + * * @param bean The bean * @param beanClass The bean class * @param type The registry type * @return the managed bean * @throws Exception An error occurred */ - public ManagedBean findManagedBean(Object bean, Class<?> beanClass, - String type) throws Exception { - if( bean!=null && beanClass==null ) { - beanClass=bean.getClass(); + public ManagedBean findManagedBean(Object bean, Class<?> beanClass, String type) + throws Exception { + + if (bean != null && beanClass == null) { + beanClass = bean.getClass(); } - if( type==null ) { - type=beanClass.getName(); + if (type == null) { + type = beanClass.getName(); } // first look for existing descriptor ManagedBean managed = findManagedBean(type); // Search for a descriptor in the same package - if( managed==null ) { + if (managed == null) { // check package and parent packages - if( log.isDebugEnabled() ) { - log.debug( "Looking for descriptor "); + if (log.isDebugEnabled()) { + log.debug("Looking for descriptor "); } - findDescriptor( beanClass, type ); + findDescriptor(beanClass, type); - managed=findManagedBean(type); + managed = findManagedBean(type); } // Still not found - use introspection - if( managed==null ) { - if( log.isDebugEnabled() ) { - log.debug( "Introspecting "); + if (managed == null) { + if (log.isDebugEnabled()) { + log.debug("Introspecting "); } // introspection load("MbeansDescriptorsIntrospectionSource", beanClass, type); - managed=findManagedBean(type); - if( managed==null ) { + managed = findManagedBean(type); + if (managed == null) { log.warn( "No metadata found for " + type ); return null; } - managed.setName( type ); + managed.setName(type); addManagedBean(managed); } return managed; @@ -501,40 +480,36 @@ public class Registry implements RegistryMBean, MBeanRegistration { /** * EXPERIMENTAL Convert a string to object, based on type. Used by several - * components. We could provide some pluggability. It is here to keep - * things consistent and avoid duplication in other tasks + * components. We could provide some pluggability. It is here to keep things + * consistent and avoid duplication in other tasks * * @param type Fully qualified class name of the resulting value * @param value String value to be converted * @return Converted value */ - public Object convertValue(String type, String value) - { - Object objValue=value; + public Object convertValue(String type, String value) { + Object objValue = value; - if( type==null || "java.lang.String".equals( type )) { + if (type == null || "java.lang.String".equals(type)) { // string is default - objValue=value; - } else if( "javax.management.ObjectName".equals( type ) || - "ObjectName".equals( type )) { + objValue = value; + } else if ("javax.management.ObjectName".equals(type) || "ObjectName".equals(type)) { try { - objValue=new ObjectName( value ); + objValue = new ObjectName(value); } catch (MalformedObjectNameException e) { return null; } - } else if( "java.lang.Integer".equals( type ) || - "int".equals( type )) { - objValue=Integer.valueOf( value ); - } else if( "java.lang.Long".equals( type ) || - "long".equals( type )) { - objValue=Long.valueOf( value ); - } else if( "java.lang.Boolean".equals( type ) || - "boolean".equals( type )) { - objValue=Boolean.valueOf( value ); + } else if ("java.lang.Integer".equals(type) || "int".equals(type)) { + objValue = Integer.valueOf(value); + } else if ("java.lang.Long".equals(type) || "long".equals(type)) { + objValue = Long.valueOf(value); + } else if ("java.lang.Boolean".equals(type) || "boolean".equals(type)) { + objValue = Boolean.valueOf(value); } return objValue; } + /** * Experimental. Load descriptors. * @@ -544,48 +519,46 @@ public class Registry implements RegistryMBean, MBeanRegistration { * @return List of descriptors * @throws Exception Error loading descriptors */ - public List<ObjectName> load( String sourceType, Object source, - String param) throws Exception { - if( log.isTraceEnabled()) { - log.trace("load " + source ); - } - String location=null; - String type=null; - Object inputsource=null; - - if( source instanceof URL ) { - URL url=(URL)source; - location=url.toString(); - type=param; - inputsource=url.openStream(); + public List<ObjectName> load(String sourceType, Object source, String param) throws Exception { + if (log.isTraceEnabled()) { + log.trace("load " + source); + } + String location = null; + String type = null; + Object inputsource = null; + + if (source instanceof URL) { + URL url = (URL) source; + location = url.toString(); + type = param; + inputsource = url.openStream(); if (sourceType == null && location.endsWith(".xml")) { sourceType = "MbeansDescriptorsDigesterSource"; } - } else if( source instanceof File ) { - location=((File)source).getAbsolutePath(); - inputsource=new FileInputStream((File)source); - type=param; + } else if (source instanceof File) { + location = ((File) source).getAbsolutePath(); + inputsource = new FileInputStream((File) source); + type = param; if (sourceType == null && location.endsWith(".xml")) { sourceType = "MbeansDescriptorsDigesterSource"; } - } else if( source instanceof InputStream ) { - type=param; - inputsource=source; - } else if( source instanceof Class<?> ) { - location=((Class<?>)source).getName(); - type=param; - inputsource=source; - if( sourceType== null ) { - sourceType="MbeansDescriptorsIntrospectionSource"; + } else if (source instanceof InputStream) { + type = param; + inputsource = source; + } else if (source instanceof Class<?>) { + location = ((Class<?>) source).getName(); + type = param; + inputsource = source; + if (sourceType == null) { + sourceType = "MbeansDescriptorsIntrospectionSource"; } } - if( sourceType==null ) { - sourceType="MbeansDescriptorsDigesterSource"; + if (sourceType == null) { + sourceType = "MbeansDescriptorsDigesterSource"; } - ModelerSource ds=getModelerSource(sourceType); - List<ObjectName> mbeans = - ds.loadDescriptors(this, type, inputsource); + ModelerSource ds = getModelerSource(sourceType); + List<ObjectName> mbeans = ds.loadDescriptors(this, type, inputsource); return mbeans; } @@ -599,21 +572,19 @@ public class Registry implements RegistryMBean, MBeanRegistration { * @param type The registry type * @throws Exception Error registering component */ - public void registerComponent(Object bean, ObjectName oname, String type) - throws Exception - { - if( log.isDebugEnabled() ) { - log.debug( "Managed= "+ oname); + public void registerComponent(Object bean, ObjectName oname, String type) throws Exception { + if (log.isDebugEnabled()) { + log.debug("Managed= " + oname); } - if( bean ==null ) { + if (bean == null) { log.error("Null component " + oname ); return; } try { - if( type==null ) { - type=bean.getClass().getName(); + if (type == null) { + type = bean.getClass().getName(); } ManagedBean managed = findManagedBean(null, bean.getClass(), type); @@ -621,47 +592,48 @@ public class Registry implements RegistryMBean, MBeanRegistration { // The real mbean is created and registered DynamicMBean mbean = managed.createMBean(bean); - if( getMBeanServer().isRegistered( oname )) { - if( log.isDebugEnabled()) { - log.debug("Unregistering existing component " + oname ); + if (getMBeanServer().isRegistered(oname)) { + if (log.isDebugEnabled()) { + log.debug("Unregistering existing component " + oname); } - getMBeanServer().unregisterMBean( oname ); + getMBeanServer().unregisterMBean(oname); } - getMBeanServer().registerMBean( mbean, oname); - } catch( Exception ex) { + getMBeanServer().registerMBean(mbean, oname); + } catch (Exception ex) { log.error("Error registering " + oname, ex ); throw ex; } } + /** - * Lookup the component descriptor in the package and - * in the parent packages. + * Lookup the component descriptor in the package and in the parent + * packages. * * @param packageName The package name * @param classLoader The class loader */ - public void loadDescriptors( String packageName, ClassLoader classLoader ) { - String res=packageName.replace( '.', '/'); + public void loadDescriptors(String packageName, ClassLoader classLoader) { + String res = packageName.replace('.', '/'); - if( log.isTraceEnabled() ) { - log.trace("Finding descriptor " + res ); + if (log.isTraceEnabled()) { + log.trace("Finding descriptor " + res); } - if( searchedPaths.get( packageName ) != null ) { + if (searchedPaths.get(packageName) != null) { return; } String descriptors = res + "/mbeans-descriptors.xml"; - URL dURL = classLoader.getResource( descriptors ); + URL dURL = classLoader.getResource(descriptors); if (dURL == null) { return; } - log.debug( "Found " + dURL); - searchedPaths.put( packageName, dURL ); + log.debug("Found " + dURL); + searchedPaths.put(packageName, dURL); try { load("MbeansDescriptorsDigesterSource", dURL, null); } catch(Exception ex ) { @@ -669,71 +641,75 @@ public class Registry implements RegistryMBean, MBeanRegistration { } } + /** - * Lookup the component descriptor in the package and - * in the parent packages. + * Lookup the component descriptor in the package and in the parent + * packages. */ private void findDescriptor(Class<?> beanClass, String type) { - if( type==null ) { - type=beanClass.getName(); + if (type == null) { + type = beanClass.getName(); } - ClassLoader classLoader=null; - if( beanClass!=null ) { - classLoader=beanClass.getClassLoader(); + ClassLoader classLoader = null; + if (beanClass != null) { + classLoader = beanClass.getClassLoader(); } - if( classLoader==null ) { - classLoader=Thread.currentThread().getContextClassLoader(); + if (classLoader == null) { + classLoader = Thread.currentThread().getContextClassLoader(); } - if( classLoader==null ) { - classLoader=this.getClass().getClassLoader(); + if (classLoader == null) { + classLoader = this.getClass().getClassLoader(); } - String className=type; - String pkg=className; - while( pkg.indexOf( ".") > 0 ) { - int lastComp=pkg.lastIndexOf( "."); - if( lastComp <= 0 ) return; - pkg=pkg.substring(0, lastComp); - if( searchedPaths.get( pkg ) != null ) { + String className = type; + String pkg = className; + while (pkg.indexOf(".") > 0) { + int lastComp = pkg.lastIndexOf("."); + if (lastComp <= 0) + return; + pkg = pkg.substring(0, lastComp); + if (searchedPaths.get(pkg) != null) { return; } loadDescriptors(pkg, classLoader); } - return; } - private ModelerSource getModelerSource( String type ) - throws Exception - { - if( type==null ) type="MbeansDescriptorsDigesterSource"; - if( type.indexOf( ".") < 0 ) { - type="org.apache.tomcat.util.modeler.modules." + type; + + private ModelerSource getModelerSource(String type) throws Exception { + if (type == null) + type = "MbeansDescriptorsDigesterSource"; + if (!type.contains(".")) { + type = "org.apache.tomcat.util.modeler.modules." + type; } Class<?> c = Class.forName(type); - ModelerSource ds=(ModelerSource)c.getConstructor().newInstance(); + ModelerSource ds = (ModelerSource) c.getConstructor().newInstance(); return ds; } - // -------------------- Registration -------------------- + // -------------------- Registration -------------------- @Override - public ObjectName preRegister(MBeanServer server, - ObjectName name) throws Exception - { - this.server=server; + public ObjectName preRegister(MBeanServer server, ObjectName name) throws Exception { + synchronized (serverLock) { + this.server = server; + } return name; } + @Override public void postRegister(Boolean registrationDone) { } + @Override public void preDeregister() throws Exception { } + @Override public void postDeregister() { } --------------------------------------------------------------------- To unsubscribe, e-mail: dev-unsubscr...@tomcat.apache.org For additional commands, e-mail: dev-h...@tomcat.apache.org