geronimo-scm mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From d...@apache.org
Subject 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/
Date Mon, 01 Aug 2005 06:21:12 GMT
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);
     }
 }



Mime
View raw message