You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@geronimo.apache.org by "Geir Magnusson Jr." <ge...@apache.org> on 2005/08/01 16:01:34 UTC
Re: svn commit: r226753 - in /geronimo/branches/v1_0_M4-QA/modules: deployment/src/java/org/apache/geronimo/deployment/ kernel/src/java/org/apache/geronimo/gbean/ kernel/src/java/org/apache/geronimo/kernel/basic/ kernel/src/test/org/apache/geronimo/gbean/
is this a backout only, or is there new code here?
On Aug 1, 2005, at 2:21 AM, dain@apache.org wrote:
> Author: dain
> Date: Sun Jul 31 23:21:08 2005
> New Revision: 226753
>
> URL: http://svn.apache.org/viewcvs?rev=226753&view=rev
> Log:
> Remove GBeanName code
>
> Removed:
> geronimo/branches/v1_0_M4-QA/modules/kernel/src/java/org/apache/
> geronimo/gbean/GBeanName.java
> geronimo/branches/v1_0_M4-QA/modules/kernel/src/test/org/apache/
> geronimo/gbean/GBeanNameTest.java
> Modified:
> geronimo/branches/v1_0_M4-QA/modules/deployment/src/java/org/
> apache/geronimo/deployment/GBeanDataRegistry.java
> geronimo/branches/v1_0_M4-QA/modules/kernel/src/java/org/apache/
> geronimo/kernel/basic/BasicKernel.java
> geronimo/branches/v1_0_M4-QA/modules/kernel/src/java/org/apache/
> geronimo/kernel/basic/BasicRegistry.java
>
> Modified: geronimo/branches/v1_0_M4-QA/modules/deployment/src/java/
> org/apache/geronimo/deployment/GBeanDataRegistry.java
> URL: http://svn.apache.org/viewcvs/geronimo/branches/v1_0_M4-QA/
> modules/deployment/src/java/org/apache/geronimo/deployment/
> GBeanDataRegistry.java?rev=226753&r1=226752&r2=226753&view=diff
> ======================================================================
> ========
> --- geronimo/branches/v1_0_M4-QA/modules/deployment/src/java/org/
> apache/geronimo/deployment/GBeanDataRegistry.java (original)
> +++ geronimo/branches/v1_0_M4-QA/modules/deployment/src/java/org/
> apache/geronimo/deployment/GBeanDataRegistry.java Sun Jul 31
> 23:21:08 2005
> @@ -25,7 +25,6 @@
> import javax.management.ObjectName;
>
> import org.apache.geronimo.gbean.GBeanData;
> -import org.apache.geronimo.gbean.GBeanName;
> import org.apache.geronimo.kernel.GBeanNotFoundException;
>
> /**
>
> Modified: geronimo/branches/v1_0_M4-QA/modules/kernel/src/java/org/
> apache/geronimo/kernel/basic/BasicKernel.java
> URL: http://svn.apache.org/viewcvs/geronimo/branches/v1_0_M4-QA/
> modules/kernel/src/java/org/apache/geronimo/kernel/basic/
> BasicKernel.java?rev=226753&r1=226752&r2=226753&view=diff
> ======================================================================
> ========
> --- geronimo/branches/v1_0_M4-QA/modules/kernel/src/java/org/apache/
> geronimo/kernel/basic/BasicKernel.java (original)
> +++ geronimo/branches/v1_0_M4-QA/modules/kernel/src/java/org/apache/
> geronimo/kernel/basic/BasicKernel.java Sun Jul 31 23:21:08 2005
> @@ -21,7 +21,6 @@
> import java.util.HashSet;
> import java.util.Iterator;
> import java.util.LinkedList;
> -import java.util.Map;
> import java.util.Set;
> import javax.management.ObjectName;
>
> @@ -29,7 +28,6 @@
> 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.DependencyManager;
> import org.apache.geronimo.kernel.GBeanAlreadyExistsException;
> @@ -128,7 +126,7 @@
> throw new IllegalArgumentException("Kernel name may
> not contain a ':', '*' or '?' character");
> }
> this.kernelName = kernelName;
> - this.registry = new BasicRegistry();
> + this.registry = new BasicRegistry(kernelName);
> }
>
> public String getKernelName() {
> @@ -158,97 +156,88 @@
> return proxyManager;
> }
>
> - public Object getAttribute(ObjectName objectName, String
> attributeName) throws GBeanNotFoundException,
> NoSuchAttributeException, Exception {
> - GBeanInstance gbeanInstance = registry.getGBeanInstance
> (createGBeanName(objectName));
> + public Object getAttribute(ObjectName name, String
> attributeName) throws GBeanNotFoundException,
> NoSuchAttributeException, Exception {
> + GBeanInstance gbeanInstance = registry.getGBeanInstance
> (name);
> return gbeanInstance.getAttribute(attributeName);
> }
>
> - public void setAttribute(ObjectName objectName, String
> attributeName, Object attributeValue) throws
> GBeanNotFoundException, NoSuchAttributeException, Exception {
> - GBeanInstance gbeanInstance = registry.getGBeanInstance
> (createGBeanName(objectName));
> + public void setAttribute(ObjectName name, String
> attributeName, Object attributeValue) throws
> GBeanNotFoundException, NoSuchAttributeException, Exception {
> + GBeanInstance gbeanInstance = registry.getGBeanInstance
> (name);
> gbeanInstance.setAttribute(attributeName, attributeValue);
> }
>
> - public Object invoke(ObjectName objectName, String methodName)
> throws GBeanNotFoundException, NoSuchOperationException,
> InternalKernelException, Exception {
> - return invoke(objectName, methodName, NO_ARGS, NO_TYPES);
> + public Object invoke(ObjectName name, String methodName)
> throws GBeanNotFoundException, NoSuchOperationException,
> InternalKernelException, Exception {
> + return invoke(name, methodName, NO_ARGS, NO_TYPES);
> }
>
> - public Object invoke(ObjectName objectName, String methodName,
> Object[] args, String[] types) throws GBeanNotFoundException,
> NoSuchOperationException, InternalKernelException, Exception {
> - GBeanInstance gbeanInstance = registry.getGBeanInstance
> (createGBeanName(objectName));
> + public Object invoke(ObjectName name, String methodName, Object
> [] args, String[] types) throws GBeanNotFoundException,
> NoSuchOperationException, InternalKernelException, Exception {
> + GBeanInstance gbeanInstance = registry.getGBeanInstance
> (name);
> return gbeanInstance.invoke(methodName, args, types);
> }
>
> public boolean isLoaded(ObjectName name) {
> - return registry.isRegistered(createGBeanName(name));
> + return registry.isRegistered(name);
> }
>
> public GBeanInfo getGBeanInfo(ObjectName name) throws
> GBeanNotFoundException {
> - GBeanInstance gbeanInstance = registry.getGBeanInstance
> (createGBeanName(name));
> + GBeanInstance gbeanInstance = registry.getGBeanInstance
> (name);
> return gbeanInstance.getGBeanInfo();
> }
>
> public GBeanData getGBeanData(ObjectName name) throws
> GBeanNotFoundException, InternalKernelException {
> - GBeanInstance gbeanInstance = registry.getGBeanInstance
> (createGBeanName(name));
> + GBeanInstance gbeanInstance = registry.getGBeanInstance
> (name);
> return gbeanInstance.getGBeanData();
> }
>
> public void loadGBean(GBeanData gbeanData, ClassLoader
> classLoader) throws GBeanAlreadyExistsException,
> InternalKernelException {
> - ObjectName objectName = gbeanData.getName();
> - GBeanInstance gbeanInstance = new GBeanInstance(gbeanData,
> this, dependencyManager, lifecycleMonitor.createLifecycleBroadcaster
> (objectName), classLoader);
> + ObjectName name = gbeanData.getName();
> + GBeanInstance gbeanInstance = new GBeanInstance(gbeanData,
> this, dependencyManager, lifecycleMonitor.createLifecycleBroadcaster
> (name), classLoader);
> registry.register(gbeanInstance);
> }
>
> public void startGBean(ObjectName name) throws
> GBeanNotFoundException, InternalKernelException,
> IllegalStateException {
> - GBeanInstance gbeanInstance = registry.getGBeanInstance
> (createGBeanName(name));
> + GBeanInstance gbeanInstance = registry.getGBeanInstance
> (name);
> gbeanInstance.start();
> }
>
> public void startRecursiveGBean(ObjectName name) throws
> GBeanNotFoundException, InternalKernelException,
> IllegalStateException {
> - GBeanInstance gbeanInstance = registry.getGBeanInstance
> (createGBeanName(name));
> + GBeanInstance gbeanInstance = registry.getGBeanInstance
> (name);
> gbeanInstance.startRecursive();
> }
>
> public void stopGBean(ObjectName name) throws
> GBeanNotFoundException, InternalKernelException,
> IllegalStateException {
> - GBeanInstance gbeanInstance = registry.getGBeanInstance
> (createGBeanName(name));
> + GBeanInstance gbeanInstance = registry.getGBeanInstance
> (name);
> gbeanInstance.stop();
> }
>
> public void unloadGBean(ObjectName name) throws
> GBeanNotFoundException, InternalKernelException,
> IllegalStateException {
> - GBeanName gbeanName = createGBeanName(name);
> - GBeanInstance gbeanInstance = registry.getGBeanInstance
> (gbeanName);
> + GBeanInstance gbeanInstance = registry.getGBeanInstance
> (name);
> gbeanInstance.die();
> - registry.unregister(gbeanName);
> + registry.unregister(name);
> }
>
> public int getGBeanState(ObjectName name) throws
> GBeanNotFoundException {
> - GBeanInstance gbeanInstance = registry.getGBeanInstance
> (createGBeanName(name));
> + GBeanInstance gbeanInstance = registry.getGBeanInstance
> (name);
> return gbeanInstance.getState();
> }
>
> public long getGBeanStartTime(ObjectName name) throws
> GBeanNotFoundException {
> - GBeanInstance gbeanInstance = registry.getGBeanInstance
> (createGBeanName(name));
> + GBeanInstance gbeanInstance = registry.getGBeanInstance
> (name);
> return gbeanInstance.getStartTime();
> }
>
> public boolean isGBeanEnabled(ObjectName name) throws
> GBeanNotFoundException {
> - GBeanInstance gbeanInstance = registry.getGBeanInstance
> (createGBeanName(name));
> + GBeanInstance gbeanInstance = registry.getGBeanInstance
> (name);
> return gbeanInstance.isEnabled();
> }
>
> public void setGBeanEnabled(ObjectName name, boolean enabled)
> throws GBeanNotFoundException {
> - GBeanInstance gbeanInstance = registry.getGBeanInstance
> (createGBeanName(name));
> + GBeanInstance gbeanInstance = registry.getGBeanInstance
> (name);
> gbeanInstance.setEnabled(enabled);
> }
>
> public Set listGBeans(ObjectName pattern) {
> - String domain = (pattern == null || pattern.isDomainPattern
> ()) ? null : pattern.getDomain();
> - Map props = pattern == null ? null :
> pattern.getKeyPropertyList();
> - Set gbeans = registry.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;
> + return registry.listGBeans(pattern);
> }
>
> public Set listGBeans(Set patterns) {
> @@ -356,14 +345,7 @@
> }
>
> public ClassLoader getClassLoaderFor(ObjectName name) throws
> GBeanNotFoundException {
> - GBeanInstance gbeanInstance = registry.getGBeanInstance
> (createGBeanName(name));
> + GBeanInstance gbeanInstance = registry.getGBeanInstance
> (name);
> return gbeanInstance.getClassLoader();
> - }
> -
> - private GBeanName createGBeanName(ObjectName objectName) {
> - if (objectName.getDomain().length() == 0) {
> - return new GBeanName(kernelName,
> objectName.getKeyPropertyList());
> - }
> - return new GBeanName(objectName);
> }
> }
>
> Modified: geronimo/branches/v1_0_M4-QA/modules/kernel/src/java/org/
> apache/geronimo/kernel/basic/BasicRegistry.java
> URL: http://svn.apache.org/viewcvs/geronimo/branches/v1_0_M4-QA/
> modules/kernel/src/java/org/apache/geronimo/kernel/basic/
> BasicRegistry.java?rev=226753&r1=226752&r2=226753&view=diff
> ======================================================================
> ========
> --- geronimo/branches/v1_0_M4-QA/modules/kernel/src/java/org/apache/
> geronimo/kernel/basic/BasicRegistry.java (original)
> +++ geronimo/branches/v1_0_M4-QA/modules/kernel/src/java/org/apache/
> geronimo/kernel/basic/BasicRegistry.java Sun Jul 31 23:21:08 2005
> @@ -21,15 +21,17 @@
> import java.util.Set;
> import java.util.HashSet;
> import java.util.Iterator;
> +import java.util.List;
> +import java.util.ArrayList;
> +import java.util.Collections;
> +import java.util.regex.Pattern;
>
> import javax.management.ObjectName;
> -import javax.management.MalformedObjectNameException;
>
> import org.apache.geronimo.kernel.Kernel;
> import org.apache.geronimo.kernel.GBeanAlreadyExistsException;
> import org.apache.geronimo.kernel.GBeanNotFoundException;
> import org.apache.geronimo.kernel.InternalKernelException;
> -import org.apache.geronimo.gbean.GBeanName;
> import org.apache.geronimo.gbean.runtime.GBeanInstance;
>
> /**
> @@ -37,23 +39,27 @@
> */
> public class BasicRegistry {
> private final Map registry = new HashMap();
> - private String kernelName = "";
> + private final Map domainIndex = new HashMap();
> + private String defaultDomainName;
> +
> + public BasicRegistry(String defaultDomainName) {
> + this.defaultDomainName = defaultDomainName;
> + }
>
> /**
> - * Start the registry and associate it with a kernel.
> - *
> - * @param kernel the kernel to associate with
> + * Start the registry.
> */
> public void start(Kernel kernel) {
> - kernelName = kernel.getKernelName();
> }
>
> /**
> * Shut down the registry and unregister any GBeans
> */
> - public synchronized void stop() {
> - registry.clear();
> - kernelName = "";
> + public void stop() {
> + synchronized (this) {
> + registry.clear();
> + domainIndex.clear();
> + }
> }
>
> /**
> @@ -62,8 +68,10 @@
> * @param name the name of the GBean to check for
> * @return true if there is a GBean registered with that name
> */
> - public synchronized boolean isRegistered(GBeanName name) {
> - return registry.containsKey(name);
> + public boolean isRegistered(ObjectName name) {
> + synchronized (this) {
> + return registry.containsKey(name);
> + }
> }
>
> /**
> @@ -73,11 +81,30 @@
> * @throws GBeanAlreadyExistsException if there is already a
> GBean registered with the instance's name
> */
> public synchronized void register(GBeanInstance gbeanInstance)
> throws GBeanAlreadyExistsException {
> - GBeanName name = createGBeanName
> (gbeanInstance.getObjectNameObject());
> + // do as much work as possible outside of the synchronized
> block
> + ObjectName name = gbeanInstance.getObjectNameObject();
> if (registry.containsKey(name)) {
> - throw new GBeanAlreadyExistsException("GBean already
> registered: " + name);
> + throw new GBeanAlreadyExistsException("GBean already
> registered: " + name.getCanonicalName());
> + }
> +
> + String domainName = name.getDomain();
> + if (domainName.length() == 0) {
> + domainName = defaultDomainName;
> + }
> +
> + // 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, gbeanInstance);
> +
> + Map nameToProperties = (Map) domainIndex.get(domainName);
> + if (nameToProperties == null) {
> + nameToProperties = new HashMap();
> + domainIndex.put(domainName, nameToProperties);
> + }
> + nameToProperties.put(name, properties);
> }
> - registry.put(name, gbeanInstance);
> }
>
> /**
> @@ -86,12 +113,15 @@
> * @param name the name of the GBean to unregister
> * @throws GBeanNotFoundException if there is no GBean
> registered with the supplied name
> */
> - public synchronized void unregister(GBeanName name) throws
> GBeanNotFoundException, InternalKernelException {
> - if (registry.remove(name) == null) {
> - try {
> - throw new GBeanNotFoundException(name.getObjectName
> ());
> - } catch (MalformedObjectNameException e) {
> - throw new InternalKernelException(e);
> + public synchronized 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);
> }
> }
> }
> @@ -103,14 +133,13 @@
> * @return the GBeanInstance
> * @throws GBeanNotFoundException if there is no GBean
> registered with the supplied name
> */
> - public synchronized GBeanInstance getGBeanInstance(GBeanName
> name) throws GBeanNotFoundException {
> - GBeanInstance instance = (GBeanInstance) registry.get(name);
> + public synchronized GBeanInstance getGBeanInstance(ObjectName
> name) throws GBeanNotFoundException {
> + GBeanInstance instance;
> + synchronized (this) {
> + instance = (GBeanInstance) registry.get(name);
> + }
> if (instance == null) {
> - try {
> - throw new GBeanNotFoundException(name.getObjectName
> ());
> - } catch (MalformedObjectNameException e) {
> - throw new InternalKernelException(e);
> - }
> + throw new GBeanNotFoundException(name);
> }
> return instance;
> }
> @@ -119,31 +148,131 @@
> /**
> * 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
> + * @param pattern object name pattern
> * @return an unordered Set<GBeanInstance> of GBeans that
> matched the pattern
> */
> - 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);
> + public Set listGBeans(ObjectName pattern) {
> + if (pattern == null) {
> + synchronized (this) {
> + return new HashSet(registry.keySet());
> + }
> }
> - 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());
> +
> + 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());
> + }
> + }
> }
> }
> - return result;
> +
> + if (nameToProperties.isEmpty()) {
> + return Collections.EMPTY_SET;
> + }
> +
> + // 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());
> + }
> + }
> + }
> + return matchingNames;
> }
>
> - private GBeanName createGBeanName(ObjectName objectName) {
> - if (objectName.getDomain().length() == 0) {
> - return new GBeanName(kernelName,
> objectName.getKeyPropertyList());
> + 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;
> + }
> }
> - return new GBeanName(objectName);
> +
> + return buffer.toString();
> + }
> +
> + private static boolean isPerl5MetaCharacter(char character) {
> + return ("'*?+[]()|^$.{}\\".indexOf(character) >= 0);
> }
> }
>
>
>
--
Geir Magnusson Jr +1-203-665-6437
geirm@apache.org
Re: svn commit: r226753 - in /geronimo/branches/v1_0_M4-QA/modules: deployment/src/java/org/apache/geronimo/deployment/ kernel/src/java/org/apache/geronimo/gbean/ kernel/src/java/org/apache/geronimo/kernel/basic/ kernel/src/test/org/apache/geronimo/gbean/
Posted by Dain Sundstrom <da...@iq80.com>.
I believe it is only a back out.
-dain
On Aug 1, 2005, at 7:01 AM, Geir Magnusson Jr. wrote:
> is this a backout only, or is there new code here?
>
> On Aug 1, 2005, at 2:21 AM, dain@apache.org wrote:
>
>
>> Author: dain
>> Date: Sun Jul 31 23:21:08 2005
>> New Revision: 226753
>>
>> URL: http://svn.apache.org/viewcvs?rev=226753&view=rev
>> Log:
>> Remove GBeanName code
>>
>> Removed:
>> geronimo/branches/v1_0_M4-QA/modules/kernel/src/java/org/
>> apache/geronimo/gbean/GBeanName.java
>> geronimo/branches/v1_0_M4-QA/modules/kernel/src/test/org/
>> apache/geronimo/gbean/GBeanNameTest.java
>> Modified:
>> geronimo/branches/v1_0_M4-QA/modules/deployment/src/java/org/
>> apache/geronimo/deployment/GBeanDataRegistry.java
>> geronimo/branches/v1_0_M4-QA/modules/kernel/src/java/org/
>> apache/geronimo/kernel/basic/BasicKernel.java
>> geronimo/branches/v1_0_M4-QA/modules/kernel/src/java/org/
>> apache/geronimo/kernel/basic/BasicRegistry.java
>>
>> Modified: geronimo/branches/v1_0_M4-QA/modules/deployment/src/java/
>> org/apache/geronimo/deployment/GBeanDataRegistry.java
>> URL: http://svn.apache.org/viewcvs/geronimo/branches/v1_0_M4-QA/
>> modules/deployment/src/java/org/apache/geronimo/deployment/
>> GBeanDataRegistry.java?rev=226753&r1=226752&r2=226753&view=diff
>> =====================================================================
>> =========
>> --- geronimo/branches/v1_0_M4-QA/modules/deployment/src/java/org/
>> apache/geronimo/deployment/GBeanDataRegistry.java (original)
>> +++ geronimo/branches/v1_0_M4-QA/modules/deployment/src/java/org/
>> apache/geronimo/deployment/GBeanDataRegistry.java Sun Jul 31
>> 23:21:08 2005
>> @@ -25,7 +25,6 @@
>> import javax.management.ObjectName;
>>
>> import org.apache.geronimo.gbean.GBeanData;
>> -import org.apache.geronimo.gbean.GBeanName;
>> import org.apache.geronimo.kernel.GBeanNotFoundException;
>>
>> /**
>>
>> Modified: geronimo/branches/v1_0_M4-QA/modules/kernel/src/java/org/
>> apache/geronimo/kernel/basic/BasicKernel.java
>> URL: http://svn.apache.org/viewcvs/geronimo/branches/v1_0_M4-QA/
>> modules/kernel/src/java/org/apache/geronimo/kernel/basic/
>> BasicKernel.java?rev=226753&r1=226752&r2=226753&view=diff
>> =====================================================================
>> =========
>> --- geronimo/branches/v1_0_M4-QA/modules/kernel/src/java/org/
>> apache/geronimo/kernel/basic/BasicKernel.java (original)
>> +++ geronimo/branches/v1_0_M4-QA/modules/kernel/src/java/org/
>> apache/geronimo/kernel/basic/BasicKernel.java Sun Jul 31 23:21:08
>> 2005
>> @@ -21,7 +21,6 @@
>> import java.util.HashSet;
>> import java.util.Iterator;
>> import java.util.LinkedList;
>> -import java.util.Map;
>> import java.util.Set;
>> import javax.management.ObjectName;
>>
>> @@ -29,7 +28,6 @@
>> 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.DependencyManager;
>> import org.apache.geronimo.kernel.GBeanAlreadyExistsException;
>> @@ -128,7 +126,7 @@
>> throw new IllegalArgumentException("Kernel name may
>> not contain a ':', '*' or '?' character");
>> }
>> this.kernelName = kernelName;
>> - this.registry = new BasicRegistry();
>> + this.registry = new BasicRegistry(kernelName);
>> }
>>
>> public String getKernelName() {
>> @@ -158,97 +156,88 @@
>> return proxyManager;
>> }
>>
>> - public Object getAttribute(ObjectName objectName, String
>> attributeName) throws GBeanNotFoundException,
>> NoSuchAttributeException, Exception {
>> - GBeanInstance gbeanInstance = registry.getGBeanInstance
>> (createGBeanName(objectName));
>> + public Object getAttribute(ObjectName name, String
>> attributeName) throws GBeanNotFoundException,
>> NoSuchAttributeException, Exception {
>> + GBeanInstance gbeanInstance = registry.getGBeanInstance
>> (name);
>> return gbeanInstance.getAttribute(attributeName);
>> }
>>
>> - public void setAttribute(ObjectName objectName, String
>> attributeName, Object attributeValue) throws
>> GBeanNotFoundException, NoSuchAttributeException, Exception {
>> - GBeanInstance gbeanInstance = registry.getGBeanInstance
>> (createGBeanName(objectName));
>> + public void setAttribute(ObjectName name, String
>> attributeName, Object attributeValue) throws
>> GBeanNotFoundException, NoSuchAttributeException, Exception {
>> + GBeanInstance gbeanInstance = registry.getGBeanInstance
>> (name);
>> gbeanInstance.setAttribute(attributeName, attributeValue);
>> }
>>
>> - public Object invoke(ObjectName objectName, String
>> methodName) throws GBeanNotFoundException,
>> NoSuchOperationException, InternalKernelException, Exception {
>> - return invoke(objectName, methodName, NO_ARGS, NO_TYPES);
>> + public Object invoke(ObjectName name, String methodName)
>> throws GBeanNotFoundException, NoSuchOperationException,
>> InternalKernelException, Exception {
>> + return invoke(name, methodName, NO_ARGS, NO_TYPES);
>> }
>>
>> - public Object invoke(ObjectName objectName, String
>> methodName, Object[] args, String[] types) throws
>> GBeanNotFoundException, NoSuchOperationException,
>> InternalKernelException, Exception {
>> - GBeanInstance gbeanInstance = registry.getGBeanInstance
>> (createGBeanName(objectName));
>> + public Object invoke(ObjectName name, String methodName,
>> Object[] args, String[] types) throws GBeanNotFoundException,
>> NoSuchOperationException, InternalKernelException, Exception {
>> + GBeanInstance gbeanInstance = registry.getGBeanInstance
>> (name);
>> return gbeanInstance.invoke(methodName, args, types);
>> }
>>
>> public boolean isLoaded(ObjectName name) {
>> - return registry.isRegistered(createGBeanName(name));
>> + return registry.isRegistered(name);
>> }
>>
>> public GBeanInfo getGBeanInfo(ObjectName name) throws
>> GBeanNotFoundException {
>> - GBeanInstance gbeanInstance = registry.getGBeanInstance
>> (createGBeanName(name));
>> + GBeanInstance gbeanInstance = registry.getGBeanInstance
>> (name);
>> return gbeanInstance.getGBeanInfo();
>> }
>>
>> public GBeanData getGBeanData(ObjectName name) throws
>> GBeanNotFoundException, InternalKernelException {
>> - GBeanInstance gbeanInstance = registry.getGBeanInstance
>> (createGBeanName(name));
>> + GBeanInstance gbeanInstance = registry.getGBeanInstance
>> (name);
>> return gbeanInstance.getGBeanData();
>> }
>>
>> public void loadGBean(GBeanData gbeanData, ClassLoader
>> classLoader) throws GBeanAlreadyExistsException,
>> InternalKernelException {
>> - ObjectName objectName = gbeanData.getName();
>> - GBeanInstance gbeanInstance = new GBeanInstance
>> (gbeanData, this, dependencyManager,
>> lifecycleMonitor.createLifecycleBroadcaster(objectName),
>> classLoader);
>> + ObjectName name = gbeanData.getName();
>> + GBeanInstance gbeanInstance = new GBeanInstance
>> (gbeanData, this, dependencyManager,
>> lifecycleMonitor.createLifecycleBroadcaster(name), classLoader);
>> registry.register(gbeanInstance);
>> }
>>
>> public void startGBean(ObjectName name) throws
>> GBeanNotFoundException, InternalKernelException,
>> IllegalStateException {
>> - GBeanInstance gbeanInstance = registry.getGBeanInstance
>> (createGBeanName(name));
>> + GBeanInstance gbeanInstance = registry.getGBeanInstance
>> (name);
>> gbeanInstance.start();
>> }
>>
>> public void startRecursiveGBean(ObjectName name) throws
>> GBeanNotFoundException, InternalKernelException,
>> IllegalStateException {
>> - GBeanInstance gbeanInstance = registry.getGBeanInstance
>> (createGBeanName(name));
>> + GBeanInstance gbeanInstance = registry.getGBeanInstance
>> (name);
>> gbeanInstance.startRecursive();
>> }
>>
>> public void stopGBean(ObjectName name) throws
>> GBeanNotFoundException, InternalKernelException,
>> IllegalStateException {
>> - GBeanInstance gbeanInstance = registry.getGBeanInstance
>> (createGBeanName(name));
>> + GBeanInstance gbeanInstance = registry.getGBeanInstance
>> (name);
>> gbeanInstance.stop();
>> }
>>
>> public void unloadGBean(ObjectName name) throws
>> GBeanNotFoundException, InternalKernelException,
>> IllegalStateException {
>> - GBeanName gbeanName = createGBeanName(name);
>> - GBeanInstance gbeanInstance = registry.getGBeanInstance
>> (gbeanName);
>> + GBeanInstance gbeanInstance = registry.getGBeanInstance
>> (name);
>> gbeanInstance.die();
>> - registry.unregister(gbeanName);
>> + registry.unregister(name);
>> }
>>
>> public int getGBeanState(ObjectName name) throws
>> GBeanNotFoundException {
>> - GBeanInstance gbeanInstance = registry.getGBeanInstance
>> (createGBeanName(name));
>> + GBeanInstance gbeanInstance = registry.getGBeanInstance
>> (name);
>> return gbeanInstance.getState();
>> }
>>
>> public long getGBeanStartTime(ObjectName name) throws
>> GBeanNotFoundException {
>> - GBeanInstance gbeanInstance = registry.getGBeanInstance
>> (createGBeanName(name));
>> + GBeanInstance gbeanInstance = registry.getGBeanInstance
>> (name);
>> return gbeanInstance.getStartTime();
>> }
>>
>> public boolean isGBeanEnabled(ObjectName name) throws
>> GBeanNotFoundException {
>> - GBeanInstance gbeanInstance = registry.getGBeanInstance
>> (createGBeanName(name));
>> + GBeanInstance gbeanInstance = registry.getGBeanInstance
>> (name);
>> return gbeanInstance.isEnabled();
>> }
>>
>> public void setGBeanEnabled(ObjectName name, boolean enabled)
>> throws GBeanNotFoundException {
>> - GBeanInstance gbeanInstance = registry.getGBeanInstance
>> (createGBeanName(name));
>> + GBeanInstance gbeanInstance = registry.getGBeanInstance
>> (name);
>> gbeanInstance.setEnabled(enabled);
>> }
>>
>> public Set listGBeans(ObjectName pattern) {
>> - String domain = (pattern == null ||
>> pattern.isDomainPattern()) ? null : pattern.getDomain();
>> - Map props = pattern == null ? null :
>> pattern.getKeyPropertyList();
>> - Set gbeans = registry.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;
>> + return registry.listGBeans(pattern);
>> }
>>
>> public Set listGBeans(Set patterns) {
>> @@ -356,14 +345,7 @@
>> }
>>
>> public ClassLoader getClassLoaderFor(ObjectName name) throws
>> GBeanNotFoundException {
>> - GBeanInstance gbeanInstance = registry.getGBeanInstance
>> (createGBeanName(name));
>> + GBeanInstance gbeanInstance = registry.getGBeanInstance
>> (name);
>> return gbeanInstance.getClassLoader();
>> - }
>> -
>> - private GBeanName createGBeanName(ObjectName objectName) {
>> - if (objectName.getDomain().length() == 0) {
>> - return new GBeanName(kernelName,
>> objectName.getKeyPropertyList());
>> - }
>> - return new GBeanName(objectName);
>> }
>> }
>>
>> Modified: geronimo/branches/v1_0_M4-QA/modules/kernel/src/java/org/
>> apache/geronimo/kernel/basic/BasicRegistry.java
>> URL: http://svn.apache.org/viewcvs/geronimo/branches/v1_0_M4-QA/
>> modules/kernel/src/java/org/apache/geronimo/kernel/basic/
>> BasicRegistry.java?rev=226753&r1=226752&r2=226753&view=diff
>> =====================================================================
>> =========
>> --- geronimo/branches/v1_0_M4-QA/modules/kernel/src/java/org/
>> apache/geronimo/kernel/basic/BasicRegistry.java (original)
>> +++ geronimo/branches/v1_0_M4-QA/modules/kernel/src/java/org/
>> apache/geronimo/kernel/basic/BasicRegistry.java Sun Jul 31
>> 23:21:08 2005
>> @@ -21,15 +21,17 @@
>> import java.util.Set;
>> import java.util.HashSet;
>> import java.util.Iterator;
>> +import java.util.List;
>> +import java.util.ArrayList;
>> +import java.util.Collections;
>> +import java.util.regex.Pattern;
>>
>> import javax.management.ObjectName;
>> -import javax.management.MalformedObjectNameException;
>>
>> import org.apache.geronimo.kernel.Kernel;
>> import org.apache.geronimo.kernel.GBeanAlreadyExistsException;
>> import org.apache.geronimo.kernel.GBeanNotFoundException;
>> import org.apache.geronimo.kernel.InternalKernelException;
>> -import org.apache.geronimo.gbean.GBeanName;
>> import org.apache.geronimo.gbean.runtime.GBeanInstance;
>>
>> /**
>> @@ -37,23 +39,27 @@
>> */
>> public class BasicRegistry {
>> private final Map registry = new HashMap();
>> - private String kernelName = "";
>> + private final Map domainIndex = new HashMap();
>> + private String defaultDomainName;
>> +
>> + public BasicRegistry(String defaultDomainName) {
>> + this.defaultDomainName = defaultDomainName;
>> + }
>>
>> /**
>> - * Start the registry and associate it with a kernel.
>> - *
>> - * @param kernel the kernel to associate with
>> + * Start the registry.
>> */
>> public void start(Kernel kernel) {
>> - kernelName = kernel.getKernelName();
>> }
>>
>> /**
>> * Shut down the registry and unregister any GBeans
>> */
>> - public synchronized void stop() {
>> - registry.clear();
>> - kernelName = "";
>> + public void stop() {
>> + synchronized (this) {
>> + registry.clear();
>> + domainIndex.clear();
>> + }
>> }
>>
>> /**
>> @@ -62,8 +68,10 @@
>> * @param name the name of the GBean to check for
>> * @return true if there is a GBean registered with that name
>> */
>> - public synchronized boolean isRegistered(GBeanName name) {
>> - return registry.containsKey(name);
>> + public boolean isRegistered(ObjectName name) {
>> + synchronized (this) {
>> + return registry.containsKey(name);
>> + }
>> }
>>
>> /**
>> @@ -73,11 +81,30 @@
>> * @throws GBeanAlreadyExistsException if there is already a
>> GBean registered with the instance's name
>> */
>> public synchronized void register(GBeanInstance
>> gbeanInstance) throws GBeanAlreadyExistsException {
>> - GBeanName name = createGBeanName
>> (gbeanInstance.getObjectNameObject());
>> + // do as much work as possible outside of the
>> synchronized block
>> + ObjectName name = gbeanInstance.getObjectNameObject();
>> if (registry.containsKey(name)) {
>> - throw new GBeanAlreadyExistsException("GBean already
>> registered: " + name);
>> + throw new GBeanAlreadyExistsException("GBean already
>> registered: " + name.getCanonicalName());
>> + }
>> +
>> + String domainName = name.getDomain();
>> + if (domainName.length() == 0) {
>> + domainName = defaultDomainName;
>> + }
>> +
>> + // 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, gbeanInstance);
>> +
>> + Map nameToProperties = (Map) domainIndex.get
>> (domainName);
>> + if (nameToProperties == null) {
>> + nameToProperties = new HashMap();
>> + domainIndex.put(domainName, nameToProperties);
>> + }
>> + nameToProperties.put(name, properties);
>> }
>> - registry.put(name, gbeanInstance);
>> }
>>
>> /**
>> @@ -86,12 +113,15 @@
>> * @param name the name of the GBean to unregister
>> * @throws GBeanNotFoundException if there is no GBean
>> registered with the supplied name
>> */
>> - public synchronized void unregister(GBeanName name) throws
>> GBeanNotFoundException, InternalKernelException {
>> - if (registry.remove(name) == null) {
>> - try {
>> - throw new GBeanNotFoundException
>> (name.getObjectName());
>> - } catch (MalformedObjectNameException e) {
>> - throw new InternalKernelException(e);
>> + public synchronized 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);
>> }
>> }
>> }
>> @@ -103,14 +133,13 @@
>> * @return the GBeanInstance
>> * @throws GBeanNotFoundException if there is no GBean
>> registered with the supplied name
>> */
>> - public synchronized GBeanInstance getGBeanInstance(GBeanName
>> name) throws GBeanNotFoundException {
>> - GBeanInstance instance = (GBeanInstance) registry.get(name);
>> + public synchronized GBeanInstance getGBeanInstance(ObjectName
>> name) throws GBeanNotFoundException {
>> + GBeanInstance instance;
>> + synchronized (this) {
>> + instance = (GBeanInstance) registry.get(name);
>> + }
>> if (instance == null) {
>> - try {
>> - throw new GBeanNotFoundException
>> (name.getObjectName());
>> - } catch (MalformedObjectNameException e) {
>> - throw new InternalKernelException(e);
>> - }
>> + throw new GBeanNotFoundException(name);
>> }
>> return instance;
>> }
>> @@ -119,31 +148,131 @@
>> /**
>> * 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
>> + * @param pattern object name pattern
>> * @return an unordered Set<GBeanInstance> of GBeans that
>> matched the pattern
>> */
>> - 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);
>> + public Set listGBeans(ObjectName pattern) {
>> + if (pattern == null) {
>> + synchronized (this) {
>> + return new HashSet(registry.keySet());
>> + }
>> }
>> - 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());
>> +
>> + 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());
>> + }
>> + }
>> }
>> }
>> - return result;
>> +
>> + if (nameToProperties.isEmpty()) {
>> + return Collections.EMPTY_SET;
>> + }
>> +
>> + // 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());
>> + }
>> + }
>> + }
>> + return matchingNames;
>> }
>>
>> - private GBeanName createGBeanName(ObjectName objectName) {
>> - if (objectName.getDomain().length() == 0) {
>> - return new GBeanName(kernelName,
>> objectName.getKeyPropertyList());
>> + 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;
>> + }
>> }
>> - return new GBeanName(objectName);
>> +
>> + return buffer.toString();
>> + }
>> +
>> + private static boolean isPerl5MetaCharacter(char character) {
>> + return ("'*?+[]()|^$.{}\\".indexOf(character) >= 0);
>> }
>> }
>>
>>
>>
>>
>
> --
> Geir Magnusson Jr +1-203-665-6437
> geirm@apache.org
>
>