Author: jboynes
Date: Tue Feb 22 19:23:52 2005
New Revision: 154941
URL: http://svn.apache.org/viewcvs?view=rev&rev=154941
Log:
Change GBean registries to key off GBeanName rather than ObjectName.
To reduce impact, the kernel API is currently unchanged and the kernel
maps names accordingly; this will be removed when the API is updated.
The JMXGBeanRegistry now uses an injected MBeanServer rather than
creating one itself; client code that creates this type of registry
has been updated to create the MBeanServer as well.
The GBeanDataRegistry (which holds GBeanData not GBeanInstance instances)
is no longer a GBeanRegistry but its own class. This is only used by
DeploymentContext.
Modified:
geronimo/trunk/modules/deployment/src/java/org/apache/geronimo/deployment/DeploymentContext.java
geronimo/trunk/modules/deployment/src/java/org/apache/geronimo/deployment/GBeanDataRegistry.java
geronimo/trunk/modules/kernel/src/java/org/apache/geronimo/gbean/GBeanName.java
geronimo/trunk/modules/kernel/src/java/org/apache/geronimo/gbean/runtime/GBeanInstance.java
geronimo/trunk/modules/kernel/src/java/org/apache/geronimo/kernel/Kernel.java
geronimo/trunk/modules/kernel/src/java/org/apache/geronimo/kernel/jmx/JMXGBeanRegistry.java
geronimo/trunk/modules/kernel/src/java/org/apache/geronimo/kernel/registry/AbstractGBeanRegistry.java
geronimo/trunk/modules/kernel/src/java/org/apache/geronimo/kernel/registry/BasicGBeanRegistry.java
geronimo/trunk/modules/kernel/src/java/org/apache/geronimo/kernel/registry/GBeanRegistry.java
geronimo/trunk/modules/kernel/src/test/org/apache/geronimo/gbean/GBeanNameTest.java
geronimo/trunk/modules/system/src/java/org/apache/geronimo/system/main/Daemon.java
geronimo/trunk/plugins/maven-geronimo-plugin/src/java/org/apache/geronimo/deployment/mavenplugin/StartServer.java
Modified:
geronimo/trunk/modules/deployment/src/java/org/apache/geronimo/deployment/DeploymentContext.java
URL:
http://svn.apache.org/viewcvs/geronimo/trunk/modules/deployment/src/java/org/apache/geronimo/deployment/DeploymentContext.java?view=diff&r1=154940&r2=154941
==============================================================================
---
geronimo/trunk/modules/deployment/src/java/org/apache/geronimo/deployment/DeploymentContext.java
(original)
+++
geronimo/trunk/modules/deployment/src/java/org/apache/geronimo/deployment/DeploymentContext.java
Tue Feb 22 19:23:52 2005
@@ -113,7 +113,7 @@
throw new AssertionError();
}
- gbeans.setDefaultDomain(domain);
+// gbeans.setDefaultDomain(domain);
if (kernel != null && parentID != null) {
ConfigurationManager configurationManager =
kernel.getConfigurationManager();
Modified:
geronimo/trunk/modules/deployment/src/java/org/apache/geronimo/deployment/GBeanDataRegistry.java
URL:
http://svn.apache.org/viewcvs/geronimo/trunk/modules/deployment/src/java/org/apache/geronimo/deployment/GBeanDataRegistry.java?view=diff&r1=154940&r2=154941
==============================================================================
---
geronimo/trunk/modules/deployment/src/java/org/apache/geronimo/deployment/GBeanDataRegistry.java
(original)
+++
geronimo/trunk/modules/deployment/src/java/org/apache/geronimo/deployment/GBeanDataRegistry.java
Tue Feb 22 19:23:52 2005
@@ -16,36 +16,34 @@
*/
package org.apache.geronimo.deployment;
-import java.util.Set;
import java.util.Collections;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.Set;
+import java.util.HashSet;
+import java.util.Iterator;
import javax.management.ObjectName;
import org.apache.geronimo.gbean.GBeanData;
+import org.apache.geronimo.gbean.GBeanName;
import org.apache.geronimo.kernel.GBeanNotFoundException;
-import org.apache.geronimo.kernel.registry.AbstractGBeanRegistry;
/**
* @version $Rev: $ $Date: $
*/
-public class GBeanDataRegistry extends AbstractGBeanRegistry {
-
- public void setDefaultDomain(String defaultDomain) {
- this.defaultDomainName = defaultDomain;
- }
+public class GBeanDataRegistry {
+ private final Map registry = new HashMap();
public void preregister(ObjectName name) {
- register(name, null);
+ registry.put(name, null);
}
public void register(GBeanData gbean) {
- register(gbean.getName(), gbean);
+ registry.put(gbean.getName(), gbean);
}
- public GBeanData getGBeanInstance(ObjectName name) throws
GBeanNotFoundException {
- GBeanData gbeanData;
- synchronized (this) {
- gbeanData = (GBeanData) registry.get(name);
- }
+ public synchronized GBeanData getGBeanInstance(ObjectName name) throws
GBeanNotFoundException {
+ GBeanData gbeanData = (GBeanData) registry.get(name);
if (gbeanData == null) {
throw new GBeanNotFoundException(name.getCanonicalName());
}
@@ -61,4 +59,15 @@
}
+ public Set listGBeans(ObjectName pattern) {
+ Set result = new HashSet();
+ for (Iterator i = registry.entrySet().iterator(); i.hasNext();) {
+ Map.Entry entry = (Map.Entry) i.next();
+ ObjectName name = (ObjectName) entry.getKey();
+ if (pattern.apply(name)) {
+ result.add(name);
+ }
+ }
+ return result;
+ }
}
Modified:
geronimo/trunk/modules/kernel/src/java/org/apache/geronimo/gbean/GBeanName.java
URL:
http://svn.apache.org/viewcvs/geronimo/trunk/modules/kernel/src/java/org/apache/geronimo/gbean/GBeanName.java?view=diff&r1=154940&r2=154941
==============================================================================
---
geronimo/trunk/modules/kernel/src/java/org/apache/geronimo/gbean/GBeanName.java
(original)
+++
geronimo/trunk/modules/kernel/src/java/org/apache/geronimo/gbean/GBeanName.java
Tue Feb 22 19:23:52 2005
@@ -19,8 +19,11 @@
import java.io.Serializable;
import java.util.Arrays;
import java.util.HashMap;
+import java.util.Hashtable;
import java.util.Iterator;
import java.util.Map;
+import javax.management.MalformedObjectNameException;
+import javax.management.ObjectName;
/**
@@ -180,5 +183,24 @@
private Object readResolve() {
return new GBeanName(name);
+ }
+
+ // utility methods to support conversion from ObjectName to GBeanName
+
+ /**
+ * @deprecated
+ */
+ public ObjectName getObjectName() throws MalformedObjectNameException {
+ return new ObjectName(domain, new Hashtable(props));
+ }
+
+ /**
+ * @deprecated
+ */
+ public GBeanName(ObjectName name) {
+ this.name = name.toString();
+ this.domain = name.getDomain();
+ this.props = new HashMap(name.getKeyPropertyList());
+ this.hashCode = domain.hashCode() + 37 * props.hashCode();
}
}
Modified:
geronimo/trunk/modules/kernel/src/java/org/apache/geronimo/gbean/runtime/GBeanInstance.java
URL:
http://svn.apache.org/viewcvs/geronimo/trunk/modules/kernel/src/java/org/apache/geronimo/gbean/runtime/GBeanInstance.java?view=diff&r1=154940&r2=154941
==============================================================================
---
geronimo/trunk/modules/kernel/src/java/org/apache/geronimo/gbean/runtime/GBeanInstance.java
(original)
+++
geronimo/trunk/modules/kernel/src/java/org/apache/geronimo/gbean/runtime/GBeanInstance.java
Tue Feb 22 19:23:52 2005
@@ -1237,10 +1237,17 @@
}
+ public boolean equals(Object obj) {
+ if (obj == this) return true;
+ if (obj instanceof GBeanInstance == false) return false;
+ return objectName.equals(((GBeanInstance)obj).objectName);
+ }
+
+ public int hashCode() {
+ return objectName.hashCode();
+ }
+
public String toString() {
- if (objectName == null) {
- return super.toString();
- }
return objectName.toString();
}
}
Modified:
geronimo/trunk/modules/kernel/src/java/org/apache/geronimo/kernel/Kernel.java
URL:
http://svn.apache.org/viewcvs/geronimo/trunk/modules/kernel/src/java/org/apache/geronimo/kernel/Kernel.java?view=diff&r1=154940&r2=154941
==============================================================================
---
geronimo/trunk/modules/kernel/src/java/org/apache/geronimo/kernel/Kernel.java
(original)
+++
geronimo/trunk/modules/kernel/src/java/org/apache/geronimo/kernel/Kernel.java
Tue Feb 22 19:23:52 2005
@@ -37,6 +37,7 @@
import org.apache.commons.logging.LogFactory;
import org.apache.geronimo.gbean.GBeanData;
import org.apache.geronimo.gbean.GBeanInfo;
+import org.apache.geronimo.gbean.GBeanName;
import org.apache.geronimo.gbean.runtime.GBeanInstance;
import org.apache.geronimo.kernel.config.Configuration;
import org.apache.geronimo.kernel.config.ConfigurationManager;
@@ -290,12 +291,12 @@
}
public Object getAttribute(ObjectName objectName, String attributeName)
throws GBeanNotFoundException, NoSuchAttributeException, Exception {
- GBeanInstance gbeanInstance =
gbeanRegistry.getGBeanInstance(objectName);
+ GBeanInstance gbeanInstance = gbeanRegistry.getGBeanInstance(new
GBeanName(objectName));
return gbeanInstance.getAttribute(attributeName);
}
public void setAttribute(ObjectName objectName, String attributeName,
Object attributeValue) throws GBeanNotFoundException, NoSuchAttributeException,
Exception {
- GBeanInstance gbeanInstance =
gbeanRegistry.getGBeanInstance(objectName);
+ GBeanInstance gbeanInstance = gbeanRegistry.getGBeanInstance(new
GBeanName(objectName));
gbeanInstance.setAttribute(attributeName, attributeValue);
}
@@ -304,21 +305,21 @@
}
public Object invoke(ObjectName objectName, String methodName, Object[]
args, String[] types) throws GBeanNotFoundException, NoSuchOperationException,
InternalKernelException, Exception {
- GBeanInstance gbeanInstance =
gbeanRegistry.getGBeanInstance(objectName);
+ GBeanInstance gbeanInstance = gbeanRegistry.getGBeanInstance(new
GBeanName(objectName));
return gbeanInstance.invoke(methodName, args, types);
}
public boolean isLoaded(ObjectName name) {
- return gbeanRegistry.isRegistered(name);
+ return gbeanRegistry.isRegistered(new GBeanName(name));
}
public GBeanInfo getGBeanInfo(ObjectName name) throws
GBeanNotFoundException {
- GBeanInstance gbeanInstance = gbeanRegistry.getGBeanInstance(name);
+ GBeanInstance gbeanInstance = gbeanRegistry.getGBeanInstance(new
GBeanName(name));
return gbeanInstance.getGBeanInfo();
}
public GBeanData getGBeanData(ObjectName name) throws
GBeanNotFoundException, InternalKernelException {
- GBeanInstance gbeanInstance = gbeanRegistry.getGBeanInstance(name);
+ GBeanInstance gbeanInstance = gbeanRegistry.getGBeanInstance(new
GBeanName(name));
return gbeanInstance.getGBeanData();
}
@@ -339,28 +340,37 @@
}
public void startGBean(ObjectName name) throws GBeanNotFoundException,
InternalKernelException, IllegalStateException {
- GBeanInstance gbeanInstance = gbeanRegistry.getGBeanInstance(name);
+ GBeanInstance gbeanInstance = gbeanRegistry.getGBeanInstance(new
GBeanName(name));
gbeanInstance.start();
}
public void startRecursiveGBean(ObjectName name) throws
GBeanNotFoundException, InternalKernelException, IllegalStateException {
- GBeanInstance gbeanInstance = gbeanRegistry.getGBeanInstance(name);
+ GBeanInstance gbeanInstance = gbeanRegistry.getGBeanInstance(new
GBeanName(name));
gbeanInstance.startRecursive();
}
public void stopGBean(ObjectName name) throws GBeanNotFoundException,
InternalKernelException, IllegalStateException {
- GBeanInstance gbeanInstance = gbeanRegistry.getGBeanInstance(name);
+ GBeanInstance gbeanInstance = gbeanRegistry.getGBeanInstance(new
GBeanName(name));
gbeanInstance.stop();
}
public void unloadGBean(ObjectName name) throws GBeanNotFoundException,
InternalKernelException, IllegalStateException {
- GBeanInstance gbeanInstance = gbeanRegistry.getGBeanInstance(name);
+ GBeanName gbeanName = new GBeanName(name);
+ GBeanInstance gbeanInstance =
gbeanRegistry.getGBeanInstance(gbeanName);
gbeanInstance.die();
- gbeanRegistry.unregister(name);
+ gbeanRegistry.unregister(gbeanName);
}
public Set listGBeans(ObjectName pattern) {
- return gbeanRegistry.listGBeans(pattern);
+ String domain = (pattern == null || pattern.isDomainPattern()) ? null
: pattern.getDomain();
+ Map props = pattern == null ? null : pattern.getKeyPropertyList();
+ Set gbeans = gbeanRegistry.listGBeans(domain, props);
+ Set result = new HashSet(gbeans.size());
+ for (Iterator i = gbeans.iterator(); i.hasNext();) {
+ GBeanInstance instance = (GBeanInstance) i.next();
+ result.add(instance.getObjectNameObject());
+ }
+ return result;
}
public Set listGBeans(Set patterns) {
@@ -408,7 +418,7 @@
GBeanInstance gbeanInstance = null;
try {
ObjectName configName =
Configuration.getConfigurationObjectName(configID);
- gbeanInstance = gbeanRegistry.getGBeanInstance(configName);
+ gbeanInstance = gbeanRegistry.getGBeanInstance(new
GBeanName(configName));
} catch (MalformedObjectNameException e) {
throw new NoSuchConfigException(e);
} catch (GBeanNotFoundException e) {
@@ -537,7 +547,7 @@
// ignore
}
try {
- gbeanRegistry.unregister(CONFIGURATION_MANAGER_NAME);
+ gbeanRegistry.unregister(new
GBeanName(CONFIGURATION_MANAGER_NAME));
} catch (Exception e) {
// ignore
}
@@ -550,7 +560,7 @@
}
public ClassLoader getClassLoaderFor(ObjectName name) throws
GBeanNotFoundException {
- GBeanInstance gbeanInstance = gbeanRegistry.getGBeanInstance(name);
+ GBeanInstance gbeanInstance = gbeanRegistry.getGBeanInstance(new
GBeanName(name));
return gbeanInstance.getClassLoader();
}
Modified:
geronimo/trunk/modules/kernel/src/java/org/apache/geronimo/kernel/jmx/JMXGBeanRegistry.java
URL:
http://svn.apache.org/viewcvs/geronimo/trunk/modules/kernel/src/java/org/apache/geronimo/kernel/jmx/JMXGBeanRegistry.java?view=diff&r1=154940&r2=154941
==============================================================================
---
geronimo/trunk/modules/kernel/src/java/org/apache/geronimo/kernel/jmx/JMXGBeanRegistry.java
(original)
+++
geronimo/trunk/modules/kernel/src/java/org/apache/geronimo/kernel/jmx/JMXGBeanRegistry.java
Tue Feb 22 19:23:52 2005
@@ -17,106 +17,94 @@
package org.apache.geronimo.kernel.jmx;
import java.util.HashMap;
-import java.util.Set;
+import java.util.Iterator;
import javax.management.InstanceAlreadyExistsException;
import javax.management.InstanceNotFoundException;
import javax.management.JMException;
import javax.management.JMRuntimeException;
import javax.management.MBeanInfo;
import javax.management.MBeanServer;
-import javax.management.MBeanServerFactory;
import javax.management.ObjectName;
+import org.apache.geronimo.gbean.GBeanName;
import org.apache.geronimo.gbean.runtime.GBeanInstance;
import org.apache.geronimo.gbean.runtime.LifecycleBroadcaster;
import org.apache.geronimo.kernel.GBeanAlreadyExistsException;
import org.apache.geronimo.kernel.GBeanNotFoundException;
-import org.apache.geronimo.kernel.registry.GBeanRegistry;
import org.apache.geronimo.kernel.InternalKernelException;
import org.apache.geronimo.kernel.Kernel;
import org.apache.geronimo.kernel.lifecycle.LifecycleListener;
+import org.apache.geronimo.kernel.registry.AbstractGBeanRegistry;
/**
+ * An implementation of GBeanRegistry that also registers the GBeans with a
JMX MBeanServer.
+ *
* @version $Rev$ $Date$
*/
-public class JMXGBeanRegistry implements GBeanRegistry {
+public class JMXGBeanRegistry extends AbstractGBeanRegistry {
private final HashMap registry = new HashMap();
private Kernel kernel;
- private MBeanServer mbServer;
+ private final MBeanServer mbServer;
+
+ public JMXGBeanRegistry(MBeanServer mbServer) {
+ this.mbServer = mbServer;
+ }
public void start(Kernel kernel) {
+ super.start(kernel);
this.kernel = kernel;
- mbServer =
MBeanServerFactory.createMBeanServer(kernel.getKernelName());
}
- public void stop() {
- MBeanServerFactory.releaseMBeanServer(mbServer);
+ public synchronized void stop() {
+ this.kernel = null;
- // todo destroy instances
- synchronized(this) {
- registry.clear();
+ // unregister all our GBean from the MBeanServer
+ for (Iterator i = registry.keySet().iterator(); i.hasNext();) {
+ GBeanName name = (GBeanName) i.next();
+ try {
+ mbServer.unregisterMBean(name.getObjectName());
+ } catch (Exception e) {
+ // ignore
+ }
}
+ super.stop();
}
- public MBeanServer getMBeanServer() {
- return mbServer;
- }
-
- public synchronized boolean isRegistered(ObjectName name) {
- return registry.containsKey(name);
- }
-
- public void register(GBeanInstance gbeanInstance) throws
GBeanAlreadyExistsException, InternalKernelException {
+ public void register(GBeanInstance gbeanInstance) throws
GBeanAlreadyExistsException {
+ // create an MBean to wrap the plain GBean
ObjectName name = gbeanInstance.getObjectNameObject();
MBeanInfo mbeanInfo =
JMXUtil.toMBeanInfo(gbeanInstance.getGBeanInfo());
GBeanMBean gbeanMBean = new GBeanMBean(kernel, name, mbeanInfo);
+
+ // register the MBean with the JMX MBeanServer
try {
mbServer.registerMBean(gbeanMBean, name);
} catch (InstanceAlreadyExistsException e) {
- throw new GBeanAlreadyExistsException("A GBean is alreayd
registered witht then name " + name);
+ throw new GBeanAlreadyExistsException("An MBean is already
registered under the name " + name);
} catch (Exception e) {
throw new InternalKernelException("Error loading GBean " +
name.getCanonicalName(), unwrapJMException(e));
}
- synchronized (this) {
- registry.put(name, gbeanInstance);
- }
+ super.register(gbeanInstance);
+ // todo when can we get rid if this?
+ // fire the loaded event from the gbeanMBean.. it was already fired
from the GBeanInstance when it was created
kernel.getLifecycleMonitor().addLifecycleListener(new
LifecycleBridge(gbeanMBean), name);
-
- // fire the loaded event from the gbeanMBean.. it was already fired
from
- // the GBeanInstance when it was created
- gbeanMBean.fireLoadedEvent();
+ gbeanMBean.fireLoadedEvent();
}
- public void unregister(ObjectName name) throws GBeanNotFoundException,
InternalKernelException {
+ public void unregister(GBeanName name) throws GBeanNotFoundException,
InternalKernelException {
try {
- mbServer.unregisterMBean(name);
+ ObjectName objectName = name.getObjectName();
+ mbServer.unregisterMBean(objectName);
} catch (InstanceNotFoundException e) {
- throw new GBeanNotFoundException(name.getCanonicalName());
+ // ignore - something else may have unregistered us
+ // if there truely is no GBean then we will catch it below whwn we
call the superclass
} catch (Exception e) {
throw new InternalKernelException("Error unloading GBean " + name,
unwrapJMException(e));
}
- synchronized (this) {
- registry.remove(name);
- }
- }
-
- public synchronized GBeanInstance getGBeanInstance(ObjectName name) throws
GBeanNotFoundException {
- GBeanInstance gbeanInstance = (GBeanInstance) registry.get(name);
- if (gbeanInstance == null) {
- throw new GBeanNotFoundException(name.getCanonicalName());
- }
- return gbeanInstance;
- }
-
- public Set listGBeans(ObjectName pattern) throws InternalKernelException {
- try {
- return mbServer.queryNames(pattern, null);
- } catch (RuntimeException e) {
- throw new InternalKernelException("Error while applying pattern "
+ pattern, e);
- }
+ super.unregister(name);
}
private Throwable unwrapJMException(Throwable cause) {
Modified:
geronimo/trunk/modules/kernel/src/java/org/apache/geronimo/kernel/registry/AbstractGBeanRegistry.java
URL:
http://svn.apache.org/viewcvs/geronimo/trunk/modules/kernel/src/java/org/apache/geronimo/kernel/registry/AbstractGBeanRegistry.java?view=diff&r1=154940&r2=154941
==============================================================================
---
geronimo/trunk/modules/kernel/src/java/org/apache/geronimo/kernel/registry/AbstractGBeanRegistry.java
(original)
+++
geronimo/trunk/modules/kernel/src/java/org/apache/geronimo/kernel/registry/AbstractGBeanRegistry.java
Tue Feb 22 19:23:52 2005
@@ -16,196 +16,74 @@
*/
package org.apache.geronimo.kernel.registry;
-import java.util.ArrayList;
-import java.util.Collections;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Iterator;
-import java.util.List;
import java.util.Map;
import java.util.Set;
-import java.util.regex.Pattern;
import javax.management.ObjectName;
+import org.apache.geronimo.gbean.GBeanName;
+import org.apache.geronimo.gbean.runtime.GBeanInstance;
+import org.apache.geronimo.kernel.GBeanAlreadyExistsException;
import org.apache.geronimo.kernel.GBeanNotFoundException;
import org.apache.geronimo.kernel.InternalKernelException;
+import org.apache.geronimo.kernel.Kernel;
/**
- * @version $Rev: $ $Date: $
+ * @version $Rev$ $Date$
*/
-public class AbstractGBeanRegistry {
+public abstract class AbstractGBeanRegistry implements GBeanRegistry {
protected final Map registry = new HashMap();
- protected final Map domainIndex = new HashMap();
- protected String defaultDomainName;
- public void stop() {
- // todo destroy instances
- synchronized (this) {
- registry.clear();
- domainIndex.clear();
- }
+ public void start(Kernel kernel) {
}
- public boolean isRegistered(ObjectName name) {
- synchronized (this) {
- return registry.containsKey(name);
- }
+ public synchronized void stop() {
+ registry.clear();
}
- protected void register(ObjectName name, Object gbean) {
- // do as much work as possible outside of the synchronized block
- String domainName = name.getDomain();
- // convert properties list to a HashMap as it is more efficient then
the synchronized Hashtable
- Map properties = new HashMap(name.getKeyPropertyList());
-
- synchronized (this) {
- registry.put(name, gbean);
-
- Map nameToProperties = (Map) domainIndex.get(domainName);
- if (nameToProperties == null) {
- nameToProperties = new HashMap();
- domainIndex.put(domainName, nameToProperties);
- }
- nameToProperties.put(name, properties);
- }
+ public synchronized boolean isRegistered(GBeanName name) {
+ return registry.containsKey(name);
}
- public void unregister(ObjectName name) throws GBeanNotFoundException,
InternalKernelException {
- String domainName = name.getDomain();
- synchronized (this) {
- registry.remove(name);
-
- // just leave the an empty nameToProperty map
- Map nameToProperties = (Map) domainIndex.get(domainName);
- if (nameToProperties != null) {
- nameToProperties.remove(name);
- }
+ public synchronized void register(GBeanInstance gbeanInstance) throws
GBeanAlreadyExistsException {
+ ObjectName objectName = gbeanInstance.getObjectNameObject();
+ GBeanName name = new GBeanName(objectName);
+ if (registry.containsKey(name)) {
+ throw new GBeanAlreadyExistsException("GBean already registered: "
+ name);
}
+ registry.put(name, gbeanInstance);
}
- public Set listGBeans(ObjectName pattern) throws InternalKernelException {
- if (pattern == null) {
- synchronized (this) {
- return new HashSet(registry.keySet());
- }
- }
-
- String patternDomain = pattern.getDomain();
- if (patternDomain.length() == 0) {
- patternDomain = defaultDomainName;
- }
-
- // work with a copy of the registry key set
- List nameToProperties;
- if (!pattern.isDomainPattern()) {
- synchronized (this) {
- // create an array list big enough to match all names... extra
space is better than resizing
- nameToProperties = new ArrayList(registry.size());
-
- // find we are only matching one specific domain, so
- // just grab it directly from the index
- Map map = (Map) domainIndex.get(patternDomain);
- if (map != null) {
- nameToProperties.addAll(map.entrySet());
- }
- }
- } else if (patternDomain.equals("*")) {
- // this is very commmon, so support it directly
- synchronized (this) {
- // create an array list big enough to match all names... extra
space is better than resizing
- nameToProperties = new ArrayList(registry.size());
-
- // find we are matching all domain, so just grab all of them
directly
- for (Iterator iterator = domainIndex.values().iterator();
iterator.hasNext();) {
- Map map = (Map) iterator.next();
-
- // we can just copy the entry set directly into the list
we don't
- // have to worry about duplicates as the maps are mutually
exclusive
- nameToProperties.addAll(map.entrySet());
- }
- }
- } else {
- String perl5Pattern = domainPatternToPerl5(patternDomain);
- Pattern domainPattern = Pattern.compile(perl5Pattern);
-
- synchronized (this) {
- // create an array list big enough to match all names... extra
space is better than resizing
- nameToProperties = new ArrayList(registry.size());
-
- // find all of the matching domains
- for (Iterator iterator = domainIndex.entrySet().iterator();
iterator.hasNext();) {
- Map.Entry entry = (Map.Entry) iterator.next();
- String domain = (String) entry.getKey();
- if (domainPattern.matcher(domain).matches()) {
- // we can just copy the entry set directly into the
list we don't
- // have to worry about duplicates as the maps are
mutually exclusive
- Map map = (Map) entry.getValue();
- nameToProperties.addAll(map.entrySet());
- }
- }
- }
- }
-
- if (nameToProperties.isEmpty()) {
- return Collections.EMPTY_SET;
+ public synchronized void unregister(GBeanName name) throws
GBeanNotFoundException, InternalKernelException {
+ if (registry.remove(name) == null) {
+ throw new GBeanNotFoundException("No GBean registered: " + name);
}
+ }
- // convert the pattern property list to a HashMap as it is not
synchronized
- Map patternProperties = new HashMap(pattern.getKeyPropertyList());
- patternProperties.remove("*");
- boolean isMatchAll = patternProperties.isEmpty();
- boolean isPropertyPattern = pattern.isPropertyPattern();
-
- Set matchingNames = new HashSet();
- for (Iterator iterator = nameToProperties.iterator();
iterator.hasNext();) {
- Map.Entry entry = (Map.Entry) iterator.next();
- Map properties = (Map) entry.getValue();
-
- if (isMatchAll) {
- matchingNames.add(entry.getKey());
- } else if (isPropertyPattern) {
- if
(properties.entrySet().containsAll(patternProperties.entrySet())) {
- matchingNames.add(entry.getKey());
- }
-
- } else {
- if
(properties.entrySet().equals(patternProperties.entrySet())) {
- matchingNames.add(entry.getKey());
- }
- }
+ public synchronized GBeanInstance getGBeanInstance(GBeanName name) throws
GBeanNotFoundException {
+ GBeanInstance instance = (GBeanInstance) registry.get(name);
+ if (instance == null) {
+ throw new GBeanNotFoundException("No GBean registered: " + name);
}
- return matchingNames;
+ return instance;
}
- private static String domainPatternToPerl5(String pattern) {
- char[] patternCharacters = pattern.toCharArray();
- StringBuffer buffer = new StringBuffer(2 * patternCharacters.length);
- for (int position = 0; position < patternCharacters.length;
position++) {
- char character = patternCharacters[position];
- switch (character) {
- case '*':
- // replace '*' with '.*'
- buffer.append(".*");
- break;
- case '?':
- // replace '?' with '.'
- buffer.append('.');
- break;
- default:
- // escape any perl5 characters with '\'
- if (isPerl5MetaCharacter(character)) {
- buffer.append('\\');
- }
- buffer.append(character);
- break;
+ public Set listGBeans(String domain, Map properties) {
+ // fairly dumb implementation that iterates the list of all registered
GBeans
+ Map clone;
+ synchronized(this) {
+ clone = new HashMap(registry);
+ }
+ Set result = new HashSet(clone.size());
+ for (Iterator i = clone.entrySet().iterator(); i.hasNext();) {
+ Map.Entry entry = (Map.Entry) i.next();
+ GBeanName name = (GBeanName) entry.getKey();
+ if (name.matches(domain, properties)) {
+ result.add(entry.getValue());
}
}
-
- return buffer.toString();
+ return result;
}
-
- private static boolean isPerl5MetaCharacter(char character) {
- return ("'*?+[]()|^$.{}\\".indexOf(character) >= 0);
- }
-
}
Modified:
geronimo/trunk/modules/kernel/src/java/org/apache/geronimo/kernel/registry/BasicGBeanRegistry.java
URL:
http://svn.apache.org/viewcvs/geronimo/trunk/modules/kernel/src/java/org/apache/geronimo/kernel/registry/BasicGBeanRegistry.java?view=diff&r1=154940&r2=154941
==============================================================================
---
geronimo/trunk/modules/kernel/src/java/org/apache/geronimo/kernel/registry/BasicGBeanRegistry.java
(original)
+++
geronimo/trunk/modules/kernel/src/java/org/apache/geronimo/kernel/registry/BasicGBeanRegistry.java
Tue Feb 22 19:23:52 2005
@@ -19,6 +19,7 @@
import javax.management.ObjectName;
import org.apache.geronimo.gbean.runtime.GBeanInstance;
+import org.apache.geronimo.gbean.GBeanName;
import org.apache.geronimo.kernel.GBeanAlreadyExistsException;
import org.apache.geronimo.kernel.GBeanNotFoundException;
import org.apache.geronimo.kernel.InternalKernelException;
@@ -27,27 +28,5 @@
/**
* @version $Rev$ $Date$
*/
-public class BasicGBeanRegistry extends AbstractGBeanRegistry implements
GBeanRegistry {
-
- public void start(Kernel kernel) {
- this.defaultDomainName = kernel.getKernelName();
- }
-
- public void register(GBeanInstance gbeanInstance) throws
GBeanAlreadyExistsException, InternalKernelException {
- ObjectName name = gbeanInstance.getObjectNameObject();
- register(name, gbeanInstance);
-
- }
-
- public GBeanInstance getGBeanInstance(ObjectName name) throws
GBeanNotFoundException {
- GBeanInstance gbeanInstance;
- synchronized (this) {
- gbeanInstance = (GBeanInstance) registry.get(name);
- }
- if (gbeanInstance == null) {
- throw new GBeanNotFoundException(name.getCanonicalName());
- }
- return gbeanInstance;
- }
-
+public class BasicGBeanRegistry extends AbstractGBeanRegistry {
}
Modified:
geronimo/trunk/modules/kernel/src/java/org/apache/geronimo/kernel/registry/GBeanRegistry.java
URL:
http://svn.apache.org/viewcvs/geronimo/trunk/modules/kernel/src/java/org/apache/geronimo/kernel/registry/GBeanRegistry.java?view=diff&r1=154940&r2=154941
==============================================================================
---
geronimo/trunk/modules/kernel/src/java/org/apache/geronimo/kernel/registry/GBeanRegistry.java
(original)
+++
geronimo/trunk/modules/kernel/src/java/org/apache/geronimo/kernel/registry/GBeanRegistry.java
Tue Feb 22 19:23:52 2005
@@ -17,29 +17,71 @@
package org.apache.geronimo.kernel.registry;
import java.util.Set;
+import java.util.Map;
import javax.management.ObjectName;
+import org.apache.geronimo.gbean.GBeanName;
import org.apache.geronimo.gbean.runtime.GBeanInstance;
-import org.apache.geronimo.kernel.Kernel;
import org.apache.geronimo.kernel.GBeanAlreadyExistsException;
-import org.apache.geronimo.kernel.InternalKernelException;
import org.apache.geronimo.kernel.GBeanNotFoundException;
+import org.apache.geronimo.kernel.Kernel;
/**
+ * Interface implemented by Registries that a Kernel can use to store and
retrieve GBeanInstances.
* @version $Rev$ $Date$
*/
public interface GBeanRegistry {
+ /**
+ * Start the registry and associate it with a kernel.
+ *
+ * @param kernel the kernel to associate with
+ */
void start(Kernel kernel);
+ /**
+ * Shut down the registry and unregister any GBeans
+ */
void stop();
- boolean isRegistered(ObjectName name);
-
- void register(GBeanInstance gbeanInstance) throws
GBeanAlreadyExistsException, InternalKernelException;
-
- void unregister(ObjectName name) throws GBeanNotFoundException,
InternalKernelException;
-
- GBeanInstance getGBeanInstance(ObjectName name) throws
GBeanNotFoundException;
-
- Set listGBeans(ObjectName pattern) throws InternalKernelException;
+ /**
+ * See if there is a GBean registered with a specific name.
+ *
+ * @param name the name of the GBean to check for
+ * @return true if there is a GBean registered with that name
+ */
+ boolean isRegistered(GBeanName name);
+
+ /**
+ * Register a GBean instance.
+ *
+ * @param gbeanInstance the GBean to register
+ * @throws GBeanAlreadyExistsException if there is already a GBean
registered with the instance's name
+ */
+ void register(GBeanInstance gbeanInstance) throws
GBeanAlreadyExistsException;
+
+ /**
+ * Unregister a GBean instance.
+ *
+ * @param name the name of the GBean to unregister
+ * @throws GBeanNotFoundException if there is no GBean registered with the
supplied name
+ */
+ void unregister(GBeanName name) throws GBeanNotFoundException;
+
+ /**
+ * Return the GBeanInstance registered with the supplied name.
+ *
+ * @param name the name of the instance to return
+ * @return the GBeanInstance
+ * @throws GBeanNotFoundException if there is no GBean registered with the
supplied name
+ */
+ GBeanInstance getGBeanInstance(GBeanName name) throws
GBeanNotFoundException;
+
+ /**
+ * Search the registry for GBeans matching a name pattern.
+ *
+ * @param domain the domain to query in; null indicates all
+ * @param properties the properties the GBeans must have
+ * @return an unordered Set<GBeanInstance> of GBeans that matched the
pattern
+ */
+ Set listGBeans(String domain, Map properties);
}
Modified:
geronimo/trunk/modules/kernel/src/test/org/apache/geronimo/gbean/GBeanNameTest.java
URL:
http://svn.apache.org/viewcvs/geronimo/trunk/modules/kernel/src/test/org/apache/geronimo/gbean/GBeanNameTest.java?view=diff&r1=154940&r2=154941
==============================================================================
---
geronimo/trunk/modules/kernel/src/test/org/apache/geronimo/gbean/GBeanNameTest.java
(original)
+++
geronimo/trunk/modules/kernel/src/test/org/apache/geronimo/gbean/GBeanNameTest.java
Tue Feb 22 19:23:52 2005
@@ -67,7 +67,7 @@
public void testInvalidNames() {
try {
- new GBeanName(null);
+ new GBeanName((String) null);
fail();
} catch (NullPointerException e) {
}
Modified:
geronimo/trunk/modules/system/src/java/org/apache/geronimo/system/main/Daemon.java
URL:
http://svn.apache.org/viewcvs/geronimo/trunk/modules/system/src/java/org/apache/geronimo/system/main/Daemon.java?view=diff&r1=154940&r2=154941
==============================================================================
---
geronimo/trunk/modules/system/src/java/org/apache/geronimo/system/main/Daemon.java
(original)
+++
geronimo/trunk/modules/system/src/java/org/apache/geronimo/system/main/Daemon.java
Tue Feb 22 19:23:52 2005
@@ -27,6 +27,7 @@
import java.util.List;
import java.util.Set;
import javax.management.ObjectName;
+import javax.management.MBeanServerFactory;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
@@ -132,7 +133,7 @@
}
// build a jms kernel
- final Kernel kernel = new Kernel("geronimo", new
JMXGBeanRegistry());
+ final Kernel kernel = new Kernel("geronimo", new
JMXGBeanRegistry(MBeanServerFactory.createMBeanServer("geronimo")));
// boot the kernel
try {
Modified:
geronimo/trunk/plugins/maven-geronimo-plugin/src/java/org/apache/geronimo/deployment/mavenplugin/StartServer.java
URL:
http://svn.apache.org/viewcvs/geronimo/trunk/plugins/maven-geronimo-plugin/src/java/org/apache/geronimo/deployment/mavenplugin/StartServer.java?view=diff&r1=154940&r2=154941
==============================================================================
---
geronimo/trunk/plugins/maven-geronimo-plugin/src/java/org/apache/geronimo/deployment/mavenplugin/StartServer.java
(original)
+++
geronimo/trunk/plugins/maven-geronimo-plugin/src/java/org/apache/geronimo/deployment/mavenplugin/StartServer.java
Tue Feb 22 19:23:52 2005
@@ -26,9 +26,11 @@
import java.util.List;
import java.util.StringTokenizer;
import javax.management.ObjectName;
+import javax.management.MBeanServerFactory;
import org.apache.geronimo.gbean.GBeanData;
import org.apache.geronimo.kernel.Kernel;
+import org.apache.geronimo.kernel.registry.BasicGBeanRegistry;
import org.apache.geronimo.kernel.jmx.JMXGBeanRegistry;
import org.apache.geronimo.kernel.config.ConfigurationManager;
import org.apache.geronimo.kernel.log.GeronimoLogging;
@@ -106,7 +108,7 @@
}
// build a basic kernel without a configuration-store, our
configuration store is
- Kernel kernel = new Kernel(getKernelName(), new JMXGBeanRegistry());
+ Kernel kernel = new Kernel(getKernelName(), new BasicGBeanRegistry());
kernel.boot();
ConfigurationManager configurationManager =
kernel.getConfigurationManager();