You are viewing a plain text version of this content. The canonical link for it is here.
Posted to scm@geronimo.apache.org by da...@apache.org on 2004/11/24 07:16:55 UTC

svn commit: r106387 - in geronimo/trunk/modules: connector/src/java/org/apache/geronimo/connector connector/src/java/org/apache/geronimo/connector/outbound jetty/src/test/org/apache/geronimo/jetty kernel/src/java/org/apache/geronimo/gbean/jmx kernel/src/java/org/apache/geronimo/kernel kernel/src/java/org/apache/geronimo/kernel/jmx kernel/src/java/org/apache/geronimo/kernel/proxy kernel/src/test/org/apache/geronimo/gbean remoting/src/test/org/apache/geronimo/remoting security/src/java/org/apache/geronimo/security/jaas security/src/java/org/apache/geronimo/security/realm security/src/test/org/apache/geronimo/security/remoting/jmx

Author: dain
Date: Tue Nov 23 22:16:54 2004
New Revision: 106387

Added:
   geronimo/trunk/modules/kernel/src/java/org/apache/geronimo/gbean/jmx/ProxyCollection.java
   geronimo/trunk/modules/kernel/src/java/org/apache/geronimo/kernel/jmx/JMXGetAttributeInvoker.java
      - copied, changed from r106284, geronimo/trunk/modules/kernel/src/java/org/apache/geronimo/gbean/jmx/JMXGetAttributeInvoker.java
   geronimo/trunk/modules/kernel/src/java/org/apache/geronimo/kernel/jmx/JMXInvocationHandler.java
      - copied, changed from r106284, geronimo/trunk/modules/kernel/src/java/org/apache/geronimo/gbean/jmx/JMXGBeanInvoker.java
   geronimo/trunk/modules/kernel/src/java/org/apache/geronimo/kernel/jmx/JMXInvoker.java
   geronimo/trunk/modules/kernel/src/java/org/apache/geronimo/kernel/jmx/JMXOperationInvoker.java
      - copied, changed from r106284, geronimo/trunk/modules/kernel/src/java/org/apache/geronimo/gbean/jmx/JMXOperationInvoker.java
   geronimo/trunk/modules/kernel/src/java/org/apache/geronimo/kernel/jmx/JMXSetAttributeInvoker.java
      - copied, changed from r106284, geronimo/trunk/modules/kernel/src/java/org/apache/geronimo/gbean/jmx/JMXSetAttributeInvoker.java
   geronimo/trunk/modules/kernel/src/java/org/apache/geronimo/kernel/proxy/
   geronimo/trunk/modules/kernel/src/java/org/apache/geronimo/kernel/proxy/DeadProxyException.java
   geronimo/trunk/modules/kernel/src/java/org/apache/geronimo/kernel/proxy/KernelGetAttributeInvoker.java
   geronimo/trunk/modules/kernel/src/java/org/apache/geronimo/kernel/proxy/KernelOperationInvoker.java
   geronimo/trunk/modules/kernel/src/java/org/apache/geronimo/kernel/proxy/KernelSetAttributeInvoker.java
   geronimo/trunk/modules/kernel/src/java/org/apache/geronimo/kernel/proxy/ProxyFactory.java
   geronimo/trunk/modules/kernel/src/java/org/apache/geronimo/kernel/proxy/ProxyInvoker.java
   geronimo/trunk/modules/kernel/src/java/org/apache/geronimo/kernel/proxy/ProxyManager.java
   geronimo/trunk/modules/kernel/src/java/org/apache/geronimo/kernel/proxy/ProxyMethodInterceptor.java
   geronimo/trunk/modules/kernel/src/java/org/apache/geronimo/kernel/proxy/RawGetAttributeInvoker.java
   geronimo/trunk/modules/kernel/src/java/org/apache/geronimo/kernel/proxy/RawOperationInvoker.java
   geronimo/trunk/modules/kernel/src/java/org/apache/geronimo/kernel/proxy/RawSetAttributeInvoker.java
Removed:
   geronimo/trunk/modules/kernel/src/java/org/apache/geronimo/gbean/jmx/CGLibMethodInterceptor.java
   geronimo/trunk/modules/kernel/src/java/org/apache/geronimo/gbean/jmx/CGLibProxyFactory.java
   geronimo/trunk/modules/kernel/src/java/org/apache/geronimo/gbean/jmx/DeadProxyException.java
   geronimo/trunk/modules/kernel/src/java/org/apache/geronimo/gbean/jmx/GBeanCollectionProxy.java
   geronimo/trunk/modules/kernel/src/java/org/apache/geronimo/gbean/jmx/GBeanInvoker.java
   geronimo/trunk/modules/kernel/src/java/org/apache/geronimo/gbean/jmx/GBeanSingleProxy.java
   geronimo/trunk/modules/kernel/src/java/org/apache/geronimo/gbean/jmx/JMXGBeanInvoker.java
   geronimo/trunk/modules/kernel/src/java/org/apache/geronimo/gbean/jmx/JMXGetAttributeInvoker.java
   geronimo/trunk/modules/kernel/src/java/org/apache/geronimo/gbean/jmx/JMXOperationInvoker.java
   geronimo/trunk/modules/kernel/src/java/org/apache/geronimo/gbean/jmx/JMXSetAttributeInvoker.java
   geronimo/trunk/modules/kernel/src/java/org/apache/geronimo/gbean/jmx/NoSuchOperationError.java
   geronimo/trunk/modules/kernel/src/java/org/apache/geronimo/gbean/jmx/ProxyFactory.java
   geronimo/trunk/modules/kernel/src/java/org/apache/geronimo/gbean/jmx/ProxyMethodInterceptor.java
   geronimo/trunk/modules/kernel/src/java/org/apache/geronimo/gbean/jmx/RawGetAttributeInvoker.java
   geronimo/trunk/modules/kernel/src/java/org/apache/geronimo/gbean/jmx/RawOperationInvoker.java
   geronimo/trunk/modules/kernel/src/java/org/apache/geronimo/gbean/jmx/RawSetAttributeInvoker.java
   geronimo/trunk/modules/kernel/src/java/org/apache/geronimo/gbean/jmx/VMMethodInterceptor.java
   geronimo/trunk/modules/kernel/src/java/org/apache/geronimo/gbean/jmx/VMProxyFactory.java
Modified:
   geronimo/trunk/modules/connector/src/java/org/apache/geronimo/connector/ConnectorMethodInterceptor.java
   geronimo/trunk/modules/connector/src/java/org/apache/geronimo/connector/outbound/ManagedConnectionFactoryWrapper.java
   geronimo/trunk/modules/jetty/src/test/org/apache/geronimo/jetty/SecurityTest.java
   geronimo/trunk/modules/kernel/src/java/org/apache/geronimo/gbean/jmx/AbstractGBeanReference.java
   geronimo/trunk/modules/kernel/src/java/org/apache/geronimo/gbean/jmx/GBeanCollectionReference.java
   geronimo/trunk/modules/kernel/src/java/org/apache/geronimo/gbean/jmx/GBeanMBean.java
   geronimo/trunk/modules/kernel/src/java/org/apache/geronimo/gbean/jmx/GBeanSingleReference.java
   geronimo/trunk/modules/kernel/src/java/org/apache/geronimo/kernel/Kernel.java
   geronimo/trunk/modules/kernel/src/java/org/apache/geronimo/kernel/jmx/MBeanProxyFactory.java
   geronimo/trunk/modules/kernel/src/test/org/apache/geronimo/gbean/Speed.java
   geronimo/trunk/modules/remoting/src/test/org/apache/geronimo/remoting/JMXRemotingTest.java
   geronimo/trunk/modules/security/src/java/org/apache/geronimo/security/jaas/JaasLoginCoordinator.java
   geronimo/trunk/modules/security/src/java/org/apache/geronimo/security/realm/GenericSecurityRealm.java
   geronimo/trunk/modules/security/src/test/org/apache/geronimo/security/remoting/jmx/RemoteLoginTest.java
Log:
Moved all proxy creation code to a ProxyManager kernel service.
Don't use this yet, we may remove it or change it.


Modified: geronimo/trunk/modules/connector/src/java/org/apache/geronimo/connector/ConnectorMethodInterceptor.java
Url: http://svn.apache.org/viewcvs/geronimo/trunk/modules/connector/src/java/org/apache/geronimo/connector/ConnectorMethodInterceptor.java?view=diff&rev=106387&p1=geronimo/trunk/modules/connector/src/java/org/apache/geronimo/connector/ConnectorMethodInterceptor.java&r1=106386&p2=geronimo/trunk/modules/connector/src/java/org/apache/geronimo/connector/ConnectorMethodInterceptor.java&r2=106387
==============================================================================
--- geronimo/trunk/modules/connector/src/java/org/apache/geronimo/connector/ConnectorMethodInterceptor.java	(original)
+++ geronimo/trunk/modules/connector/src/java/org/apache/geronimo/connector/ConnectorMethodInterceptor.java	Tue Nov 23 22:16:54 2004
@@ -24,7 +24,8 @@
 import net.sf.cglib.proxy.MethodInterceptor;
 import net.sf.cglib.proxy.MethodProxy;
 import org.apache.geronimo.kernel.Kernel;
-import org.apache.geronimo.gbean.jmx.DeadProxyException;
+import org.apache.geronimo.kernel.proxy.DeadProxyException;
+import org.apache.geronimo.kernel.proxy.DeadProxyException;
 
 /**
  * MethodInterceptor used by various Proxies.  The important part of this class is the

Modified: geronimo/trunk/modules/connector/src/java/org/apache/geronimo/connector/outbound/ManagedConnectionFactoryWrapper.java
Url: http://svn.apache.org/viewcvs/geronimo/trunk/modules/connector/src/java/org/apache/geronimo/connector/outbound/ManagedConnectionFactoryWrapper.java?view=diff&rev=106387&p1=geronimo/trunk/modules/connector/src/java/org/apache/geronimo/connector/outbound/ManagedConnectionFactoryWrapper.java&r1=106386&p2=geronimo/trunk/modules/connector/src/java/org/apache/geronimo/connector/outbound/ManagedConnectionFactoryWrapper.java&r2=106387
==============================================================================
--- geronimo/trunk/modules/connector/src/java/org/apache/geronimo/connector/outbound/ManagedConnectionFactoryWrapper.java	(original)
+++ geronimo/trunk/modules/connector/src/java/org/apache/geronimo/connector/outbound/ManagedConnectionFactoryWrapper.java	Tue Nov 23 22:16:54 2004
@@ -244,7 +244,8 @@
             try {
                 GeronimoContextManager.unbind(globalJNDIName);
             } catch (NamingException e) {
-                throw new RuntimeException(e);
+                // this will happen on failure since doStop is called twice
+                // the error is not important
             }
         }
     }

Modified: geronimo/trunk/modules/jetty/src/test/org/apache/geronimo/jetty/SecurityTest.java
Url: http://svn.apache.org/viewcvs/geronimo/trunk/modules/jetty/src/test/org/apache/geronimo/jetty/SecurityTest.java?view=diff&rev=106387&p1=geronimo/trunk/modules/jetty/src/test/org/apache/geronimo/jetty/SecurityTest.java&r1=106386&p2=geronimo/trunk/modules/jetty/src/test/org/apache/geronimo/jetty/SecurityTest.java&r2=106387
==============================================================================
--- geronimo/trunk/modules/jetty/src/test/org/apache/geronimo/jetty/SecurityTest.java	(original)
+++ geronimo/trunk/modules/jetty/src/test/org/apache/geronimo/jetty/SecurityTest.java	Tue Nov 23 22:16:54 2004
@@ -25,7 +25,6 @@
 import java.net.URL;
 
 import org.apache.geronimo.gbean.jmx.GBeanMBean;
-import org.apache.geronimo.kernel.jmx.MBeanProxyFactory;
 import org.apache.geronimo.security.SecurityService;
 import org.apache.geronimo.security.deploy.AutoMapAssistant;
 import org.apache.geronimo.security.deploy.DefaultPrincipal;
@@ -156,73 +155,79 @@
         securityConfig.getRoleNames().add("content-administrator");
         securityConfig.getRoleNames().add("auto-administrator");
 
-        securityConfig.autoGenerate((SecurityService) MBeanProxyFactory.getProxy(SecurityService.class, kernel.getMBeanServer(), securityServiceName));
+        SecurityService securityService = null;
+        try {
+            securityService = (SecurityService) kernel.getProxyManager().createProxy(securityServiceName, SecurityService.class);
+            securityConfig.autoGenerate(securityService);
 
-        startWebApp(securityConfig);
+            startWebApp(securityConfig);
 
-        HttpURLConnection connection = (HttpURLConnection) new URL("http://localhost:5678/test/protected/hello.txt").openConnection();
-        connection.setInstanceFollowRedirects(false);
-        assertEquals(HttpURLConnection.HTTP_MOVED_TEMP, connection.getResponseCode());
-
-        String cookie = connection.getHeaderField("Set-Cookie");
-        cookie = cookie.substring(0, cookie.lastIndexOf(';'));
-        String location = connection.getHeaderField("Location");
+            HttpURLConnection connection = (HttpURLConnection) new URL("http://localhost:5678/test/protected/hello.txt").openConnection();
+            connection.setInstanceFollowRedirects(false);
+            assertEquals(HttpURLConnection.HTTP_MOVED_TEMP, connection.getResponseCode());
 
-        connection = (HttpURLConnection) new URL(location).openConnection();
-        connection.setInstanceFollowRedirects(false);
-        assertEquals(HttpURLConnection.HTTP_OK, connection.getResponseCode());
+            String cookie = connection.getHeaderField("Set-Cookie");
+            cookie = cookie.substring(0, cookie.lastIndexOf(';'));
+            String location = connection.getHeaderField("Location");
 
-        location = location.substring(0, location.lastIndexOf('/')) + "/j_security_check?j_username=izumi&j_password=violin";
+            connection = (HttpURLConnection) new URL(location).openConnection();
+            connection.setInstanceFollowRedirects(false);
+            assertEquals(HttpURLConnection.HTTP_OK, connection.getResponseCode());
 
-        connection = (HttpURLConnection) new URL(location).openConnection();
-        connection.setRequestMethod("POST");
-        connection.setRequestProperty("Cookie", cookie);
-        connection.setInstanceFollowRedirects(false);
-        assertEquals(HttpURLConnection.HTTP_MOVED_TEMP, connection.getResponseCode());
+            location = location.substring(0, location.lastIndexOf('/')) + "/j_security_check?j_username=izumi&j_password=violin";
 
-        connection = (HttpURLConnection) new URL("http://localhost:5678/test/protected/hello.txt").openConnection();
-        connection.setRequestProperty("Cookie", cookie);
-        connection.setInstanceFollowRedirects(false);
-        BufferedReader reader = new BufferedReader(new InputStreamReader(connection.getInputStream()));
+            connection = (HttpURLConnection) new URL(location).openConnection();
+            connection.setRequestMethod("POST");
+            connection.setRequestProperty("Cookie", cookie);
+            connection.setInstanceFollowRedirects(false);
+            assertEquals(HttpURLConnection.HTTP_MOVED_TEMP, connection.getResponseCode());
 
-        assertEquals(HttpURLConnection.HTTP_OK, connection.getResponseCode());
-        assertEquals("Hello World", reader.readLine());
-        connection.disconnect();
+            connection = (HttpURLConnection) new URL("http://localhost:5678/test/protected/hello.txt").openConnection();
+            connection.setRequestProperty("Cookie", cookie);
+            connection.setInstanceFollowRedirects(false);
+            BufferedReader reader = new BufferedReader(new InputStreamReader(connection.getInputStream()));
 
+            assertEquals(HttpURLConnection.HTTP_OK, connection.getResponseCode());
+            assertEquals("Hello World", reader.readLine());
+            connection.disconnect();
 
-        connection = (HttpURLConnection) new URL("http://localhost:5678/test/protected/hello.txt").openConnection();
-        connection.setInstanceFollowRedirects(false);
-        assertEquals(HttpURLConnection.HTTP_MOVED_TEMP, connection.getResponseCode());
 
-        cookie = connection.getHeaderField("Set-Cookie");
-        cookie = cookie.substring(0, cookie.lastIndexOf(';'));
-        location = connection.getHeaderField("Location");
+            connection = (HttpURLConnection) new URL("http://localhost:5678/test/protected/hello.txt").openConnection();
+            connection.setInstanceFollowRedirects(false);
+            assertEquals(HttpURLConnection.HTTP_MOVED_TEMP, connection.getResponseCode());
 
-        connection = (HttpURLConnection) new URL(location).openConnection();
-        connection.setInstanceFollowRedirects(false);
-        assertEquals(HttpURLConnection.HTTP_OK, connection.getResponseCode());
+            cookie = connection.getHeaderField("Set-Cookie");
+            cookie = cookie.substring(0, cookie.lastIndexOf(';'));
+            location = connection.getHeaderField("Location");
 
-        location = location.substring(0, location.lastIndexOf('/')) + "/j_security_check?j_username=alan&j_password=starcraft";
+            connection = (HttpURLConnection) new URL(location).openConnection();
+            connection.setInstanceFollowRedirects(false);
+            assertEquals(HttpURLConnection.HTTP_OK, connection.getResponseCode());
 
-        connection = (HttpURLConnection) new URL(location).openConnection();
-        connection.setRequestMethod("POST");
-        connection.setRequestProperty("Cookie", cookie);
-        connection.setInstanceFollowRedirects(false);
-        assertEquals(HttpURLConnection.HTTP_MOVED_TEMP, connection.getResponseCode());
+            location = location.substring(0, location.lastIndexOf('/')) + "/j_security_check?j_username=alan&j_password=starcraft";
 
-        try {
-            connection = (HttpURLConnection) new URL("http://localhost:5678/test/protected/hello.txt").openConnection();
+            connection = (HttpURLConnection) new URL(location).openConnection();
+            connection.setRequestMethod("POST");
             connection.setRequestProperty("Cookie", cookie);
             connection.setInstanceFollowRedirects(false);
-            reader = new BufferedReader(new InputStreamReader(connection.getInputStream()));
+            assertEquals(HttpURLConnection.HTTP_MOVED_TEMP, connection.getResponseCode());
 
-            fail("Should throw an IOException for HTTP 403 response");
-        } catch (IOException e) {
+            try {
+                connection = (HttpURLConnection) new URL("http://localhost:5678/test/protected/hello.txt").openConnection();
+                connection.setRequestProperty("Cookie", cookie);
+                connection.setInstanceFollowRedirects(false);
+                reader = new BufferedReader(new InputStreamReader(connection.getInputStream()));
+
+                fail("Should throw an IOException for HTTP 403 response");
+            } catch (IOException e) {
+            }
+
+            assertEquals(HttpURLConnection.HTTP_FORBIDDEN, connection.getResponseCode());
+            connection.disconnect();
+            stopWebApp();
+        } finally {
+            kernel.getProxyManager().destroyProxy(securityService);
         }
-
-        assertEquals(HttpURLConnection.HTTP_FORBIDDEN, connection.getResponseCode());
-        connection.disconnect();
-        stopWebApp();
     }
 
     /**
@@ -242,91 +247,97 @@
         securityConfig.getRoleNames().add("content-administrator");
         securityConfig.getRoleNames().add("auto-administrator");
 
-        securityConfig.autoGenerate((SecurityService) MBeanProxyFactory.getProxy(SecurityService.class, kernel.getMBeanServer(), securityServiceName));
-
-        DefaultPrincipal defaultPrincipal = new DefaultPrincipal();
-        defaultPrincipal.setRealmName("demo-properties-realm");
-        Principal principal = new Principal();
-        principal.setClassName("org.apache.geronimo.security.realm.providers.GeronimoUserPrincipal");
-        principal.setPrincipalName("izumi");
-        defaultPrincipal.setPrincipal(principal);
-
-        securityConfig.setDefaultPrincipal(defaultPrincipal);
-
-        Role role = new Role();
-        role.setRoleName("content-administrator");
-        principal = new Principal();
-        principal.setClassName("org.apache.geronimo.security.realm.providers.GeronimoGroupPrincipal");
-        principal.setPrincipalName("it");
-        Realm realm = new Realm();
-        realm.setRealmName("demo-properties-realm");
-        realm.getPrincipals().add(principal);
-        role.getRealms().put(realm.getRealmName(), realm);
+        SecurityService securityService = null;
+        try {
+            securityService = (SecurityService) kernel.getProxyManager().createProxy(securityServiceName, SecurityService.class);
+            securityConfig.autoGenerate(securityService);
 
-        securityConfig.append(role);
+            DefaultPrincipal defaultPrincipal = new DefaultPrincipal();
+            defaultPrincipal.setRealmName("demo-properties-realm");
+            Principal principal = new Principal();
+            principal.setClassName("org.apache.geronimo.security.realm.providers.GeronimoUserPrincipal");
+            principal.setPrincipalName("izumi");
+            defaultPrincipal.setPrincipal(principal);
+
+            securityConfig.setDefaultPrincipal(defaultPrincipal);
+
+            Role role = new Role();
+            role.setRoleName("content-administrator");
+            principal = new Principal();
+            principal.setClassName("org.apache.geronimo.security.realm.providers.GeronimoGroupPrincipal");
+            principal.setPrincipalName("it");
+            Realm realm = new Realm();
+            realm.setRealmName("demo-properties-realm");
+            realm.getPrincipals().add(principal);
+            role.getRealms().put(realm.getRealmName(), realm);
 
-        startWebApp(securityConfig);
+            securityConfig.append(role);
 
-        HttpURLConnection connection = (HttpURLConnection) new URL("http://localhost:5678/test/protected/hello.txt").openConnection();
-        connection.setInstanceFollowRedirects(false);
-        assertEquals(HttpURLConnection.HTTP_MOVED_TEMP, connection.getResponseCode());
+            startWebApp(securityConfig);
 
-        String cookie = connection.getHeaderField("Set-Cookie");
-        cookie = cookie.substring(0, cookie.lastIndexOf(';'));
-        String location = connection.getHeaderField("Location");
+            HttpURLConnection connection = (HttpURLConnection) new URL("http://localhost:5678/test/protected/hello.txt").openConnection();
+            connection.setInstanceFollowRedirects(false);
+            assertEquals(HttpURLConnection.HTTP_MOVED_TEMP, connection.getResponseCode());
 
-        connection = (HttpURLConnection) new URL(location).openConnection();
-        connection.setInstanceFollowRedirects(false);
-        assertEquals(HttpURLConnection.HTTP_OK, connection.getResponseCode());
+            String cookie = connection.getHeaderField("Set-Cookie");
+            cookie = cookie.substring(0, cookie.lastIndexOf(';'));
+            String location = connection.getHeaderField("Location");
 
-        location = location.substring(0, location.lastIndexOf('/')) + "/j_security_check?j_username=izumi&j_password=violin";
+            connection = (HttpURLConnection) new URL(location).openConnection();
+            connection.setInstanceFollowRedirects(false);
+            assertEquals(HttpURLConnection.HTTP_OK, connection.getResponseCode());
 
-        connection = (HttpURLConnection) new URL(location).openConnection();
-        connection.setRequestMethod("POST");
-        connection.setRequestProperty("Cookie", cookie);
-        connection.setInstanceFollowRedirects(false);
-        assertEquals(HttpURLConnection.HTTP_MOVED_TEMP, connection.getResponseCode());
+            location = location.substring(0, location.lastIndexOf('/')) + "/j_security_check?j_username=izumi&j_password=violin";
 
-        connection = (HttpURLConnection) new URL("http://localhost:5678/test/protected/hello.txt").openConnection();
-        connection.setRequestProperty("Cookie", cookie);
-        connection.setInstanceFollowRedirects(false);
-        BufferedReader reader = new BufferedReader(new InputStreamReader(connection.getInputStream()));
+            connection = (HttpURLConnection) new URL(location).openConnection();
+            connection.setRequestMethod("POST");
+            connection.setRequestProperty("Cookie", cookie);
+            connection.setInstanceFollowRedirects(false);
+            assertEquals(HttpURLConnection.HTTP_MOVED_TEMP, connection.getResponseCode());
 
-        assertEquals(HttpURLConnection.HTTP_OK, connection.getResponseCode());
-        assertEquals("Hello World", reader.readLine());
-        connection.disconnect();
+            connection = (HttpURLConnection) new URL("http://localhost:5678/test/protected/hello.txt").openConnection();
+            connection.setRequestProperty("Cookie", cookie);
+            connection.setInstanceFollowRedirects(false);
+            BufferedReader reader = new BufferedReader(new InputStreamReader(connection.getInputStream()));
 
+            assertEquals(HttpURLConnection.HTTP_OK, connection.getResponseCode());
+            assertEquals("Hello World", reader.readLine());
+            connection.disconnect();
 
-        connection = (HttpURLConnection) new URL("http://localhost:5678/test/protected/hello.txt").openConnection();
-        connection.setInstanceFollowRedirects(false);
-        assertEquals(HttpURLConnection.HTTP_MOVED_TEMP, connection.getResponseCode());
 
-        cookie = connection.getHeaderField("Set-Cookie");
-        cookie = cookie.substring(0, cookie.lastIndexOf(';'));
-        location = connection.getHeaderField("Location");
+            connection = (HttpURLConnection) new URL("http://localhost:5678/test/protected/hello.txt").openConnection();
+            connection.setInstanceFollowRedirects(false);
+            assertEquals(HttpURLConnection.HTTP_MOVED_TEMP, connection.getResponseCode());
 
-        connection = (HttpURLConnection) new URL(location).openConnection();
-        connection.setInstanceFollowRedirects(false);
-        assertEquals(HttpURLConnection.HTTP_OK, connection.getResponseCode());
+            cookie = connection.getHeaderField("Set-Cookie");
+            cookie = cookie.substring(0, cookie.lastIndexOf(';'));
+            location = connection.getHeaderField("Location");
 
-        location = location.substring(0, location.lastIndexOf('/')) + "/j_security_check?j_username=alan&j_password=starcraft";
+            connection = (HttpURLConnection) new URL(location).openConnection();
+            connection.setInstanceFollowRedirects(false);
+            assertEquals(HttpURLConnection.HTTP_OK, connection.getResponseCode());
 
-        connection = (HttpURLConnection) new URL(location).openConnection();
-        connection.setRequestMethod("POST");
-        connection.setRequestProperty("Cookie", cookie);
-        connection.setInstanceFollowRedirects(false);
-        assertEquals(HttpURLConnection.HTTP_MOVED_TEMP, connection.getResponseCode());
+            location = location.substring(0, location.lastIndexOf('/')) + "/j_security_check?j_username=alan&j_password=starcraft";
 
-        connection = (HttpURLConnection) new URL("http://localhost:5678/test/protected/hello.txt").openConnection();
-        connection.setRequestProperty("Cookie", cookie);
-        connection.setInstanceFollowRedirects(false);
-        reader = new BufferedReader(new InputStreamReader(connection.getInputStream()));
+            connection = (HttpURLConnection) new URL(location).openConnection();
+            connection.setRequestMethod("POST");
+            connection.setRequestProperty("Cookie", cookie);
+            connection.setInstanceFollowRedirects(false);
+            assertEquals(HttpURLConnection.HTTP_MOVED_TEMP, connection.getResponseCode());
 
-        assertEquals(HttpURLConnection.HTTP_OK, connection.getResponseCode());
-        assertEquals("Hello World", reader.readLine());
-        connection.disconnect();
+            connection = (HttpURLConnection) new URL("http://localhost:5678/test/protected/hello.txt").openConnection();
+            connection.setRequestProperty("Cookie", cookie);
+            connection.setInstanceFollowRedirects(false);
+            reader = new BufferedReader(new InputStreamReader(connection.getInputStream()));
 
-        stopWebApp();
+            assertEquals(HttpURLConnection.HTTP_OK, connection.getResponseCode());
+            assertEquals("Hello World", reader.readLine());
+            connection.disconnect();
+
+            stopWebApp();
+        } finally {
+            kernel.getProxyManager().destroyProxy(securityService);
+        }
     }
 
     protected void startWebApp(Security securityConfig) throws Exception {

Modified: geronimo/trunk/modules/kernel/src/java/org/apache/geronimo/gbean/jmx/AbstractGBeanReference.java
Url: http://svn.apache.org/viewcvs/geronimo/trunk/modules/kernel/src/java/org/apache/geronimo/gbean/jmx/AbstractGBeanReference.java?view=diff&rev=106387&p1=geronimo/trunk/modules/kernel/src/java/org/apache/geronimo/gbean/jmx/AbstractGBeanReference.java&r1=106386&p2=geronimo/trunk/modules/kernel/src/java/org/apache/geronimo/gbean/jmx/AbstractGBeanReference.java&r2=106387
==============================================================================
--- geronimo/trunk/modules/kernel/src/java/org/apache/geronimo/gbean/jmx/AbstractGBeanReference.java	(original)
+++ geronimo/trunk/modules/kernel/src/java/org/apache/geronimo/gbean/jmx/AbstractGBeanReference.java	Tue Nov 23 22:16:54 2004
@@ -26,14 +26,12 @@
 import javax.management.InstanceNotFoundException;
 import javax.management.ObjectName;
 
-import org.apache.geronimo.kernel.LifecycleAdapter;
-import org.apache.geronimo.kernel.LifecycleListener;
 import org.apache.geronimo.gbean.GReferenceInfo;
 import org.apache.geronimo.gbean.InvalidConfigurationException;
 import org.apache.geronimo.kernel.ClassLoading;
 import org.apache.geronimo.kernel.Kernel;
-import org.apache.geronimo.kernel.LifecycleListener;
 import org.apache.geronimo.kernel.LifecycleAdapter;
+import org.apache.geronimo.kernel.LifecycleListener;
 import org.apache.geronimo.kernel.management.State;
 
 /**
@@ -81,6 +79,11 @@
      */
     private Kernel kernel;
 
+    /**
+     * Proxy for this reference
+     */
+    private Object proxy;
+
     public AbstractGBeanReference(GBeanMBean gmbean, GReferenceInfo referenceInfo, Class constructorType) throws InvalidConfigurationException {
         this.gmbean = gmbean;
         this.name = referenceInfo.getName();
@@ -133,6 +136,15 @@
 
     public final Class getType() {
         return type;
+    }
+
+
+    public Object getProxy() {
+        return proxy;
+    }
+
+    protected void setProxy(Object proxy) {
+        this.proxy = proxy;
     }
 
     public final Set getPatterns() {

Deleted: /geronimo/trunk/modules/kernel/src/java/org/apache/geronimo/gbean/jmx/CGLibMethodInterceptor.java
Url: http://svn.apache.org/viewcvs/geronimo/trunk/modules/kernel/src/java/org/apache/geronimo/gbean/jmx/CGLibMethodInterceptor.java?view=auto&rev=106386
==============================================================================

Deleted: /geronimo/trunk/modules/kernel/src/java/org/apache/geronimo/gbean/jmx/CGLibProxyFactory.java
Url: http://svn.apache.org/viewcvs/geronimo/trunk/modules/kernel/src/java/org/apache/geronimo/gbean/jmx/CGLibProxyFactory.java?view=auto&rev=106386
==============================================================================

Deleted: /geronimo/trunk/modules/kernel/src/java/org/apache/geronimo/gbean/jmx/DeadProxyException.java
Url: http://svn.apache.org/viewcvs/geronimo/trunk/modules/kernel/src/java/org/apache/geronimo/gbean/jmx/DeadProxyException.java?view=auto&rev=106386
==============================================================================

Deleted: /geronimo/trunk/modules/kernel/src/java/org/apache/geronimo/gbean/jmx/GBeanCollectionProxy.java
Url: http://svn.apache.org/viewcvs/geronimo/trunk/modules/kernel/src/java/org/apache/geronimo/gbean/jmx/GBeanCollectionProxy.java?view=auto&rev=106386
==============================================================================

Modified: geronimo/trunk/modules/kernel/src/java/org/apache/geronimo/gbean/jmx/GBeanCollectionReference.java
Url: http://svn.apache.org/viewcvs/geronimo/trunk/modules/kernel/src/java/org/apache/geronimo/gbean/jmx/GBeanCollectionReference.java?view=diff&rev=106387&p1=geronimo/trunk/modules/kernel/src/java/org/apache/geronimo/gbean/jmx/GBeanCollectionReference.java&r1=106386&p2=geronimo/trunk/modules/kernel/src/java/org/apache/geronimo/gbean/jmx/GBeanCollectionReference.java&r2=106387
==============================================================================
--- geronimo/trunk/modules/kernel/src/java/org/apache/geronimo/gbean/jmx/GBeanCollectionReference.java	(original)
+++ geronimo/trunk/modules/kernel/src/java/org/apache/geronimo/gbean/jmx/GBeanCollectionReference.java	Tue Nov 23 22:16:54 2004
@@ -26,11 +26,6 @@
  * @version $Rev: 71492 $ $Date: 2004-11-14 21:31:50 -0800 (Sun, 14 Nov 2004) $
  */
 public class GBeanCollectionReference extends AbstractGBeanReference {
-    /**
-     * Proxy to the to this connection.
-     */
-    private GBeanCollectionProxy proxy;
-
     public GBeanCollectionReference(GBeanMBean gmbean, GReferenceInfo referenceInfo, Class constructorType) throws InvalidConfigurationException {
         super(gmbean, referenceInfo, constructorType);
     }
@@ -42,36 +37,31 @@
         }
 
         // if we already have a proxy then we have already been started
-        if (proxy != null) {
+        if (getProxy() != null) {
             return;
         }
 
         // add a dependency on our target and create the proxy
-        proxy = new GBeanCollectionProxy(getKernel(), getName(), getType(), getTargets());
+        setProxy(new ProxyCollection(getName(), getType(), getKernel().getProxyManager(), getTargets()));
     }
 
     public synchronized void stop() {
+        ProxyCollection proxy = (ProxyCollection) getProxy();
         if (proxy != null) {
             proxy.destroy();
-            proxy = null;
-        }
-    }
-
-    public Object getProxy() {
-        if (proxy == null) {
-            return null;
-        } else {
-            return proxy.getProxy();
+            setProxy(null);
         }
     }
 
     public synchronized void targetAdded(ObjectName target) {
+        ProxyCollection proxy = (ProxyCollection) getProxy();
         if (proxy != null) {
             proxy.addTarget(target);
         }
     }
 
     public synchronized void targetRemoved(ObjectName target) {
+        ProxyCollection proxy = (ProxyCollection) getProxy();
         if (proxy != null) {
             proxy.removeTarget(target);
         }

Deleted: /geronimo/trunk/modules/kernel/src/java/org/apache/geronimo/gbean/jmx/GBeanInvoker.java
Url: http://svn.apache.org/viewcvs/geronimo/trunk/modules/kernel/src/java/org/apache/geronimo/gbean/jmx/GBeanInvoker.java?view=auto&rev=106386
==============================================================================

Modified: geronimo/trunk/modules/kernel/src/java/org/apache/geronimo/gbean/jmx/GBeanMBean.java
Url: http://svn.apache.org/viewcvs/geronimo/trunk/modules/kernel/src/java/org/apache/geronimo/gbean/jmx/GBeanMBean.java?view=diff&rev=106387&p1=geronimo/trunk/modules/kernel/src/java/org/apache/geronimo/gbean/jmx/GBeanMBean.java&r1=106386&p2=geronimo/trunk/modules/kernel/src/java/org/apache/geronimo/gbean/jmx/GBeanMBean.java&r2=106387
==============================================================================
--- geronimo/trunk/modules/kernel/src/java/org/apache/geronimo/gbean/jmx/GBeanMBean.java	(original)
+++ geronimo/trunk/modules/kernel/src/java/org/apache/geronimo/gbean/jmx/GBeanMBean.java	Tue Nov 23 22:16:54 2004
@@ -70,8 +70,9 @@
 public class GBeanMBean extends AbstractManagedObject implements DynamicMBean {
     /**
      * Attribute name used to retrieve the RawInvoker for the GBean
+     * @deprecated DO NOT USE THIS... THIS WILL BE REMOVED!!!!!!
      */
-    static final String RAW_INVOKER = "$$RAW_INVOKER$$";
+    public static final String RAW_INVOKER = "$$RAW_INVOKER$$";
 
     /**
      * Attribute name used to retrieve the GBeanData for the GBean
@@ -661,17 +662,19 @@
             references[i].stop();
         }
 
-        // stop all of the attributes
-        for (int i = 0; i < attributes.length; i++) {
-            GBeanMBeanAttribute attribute = attributes[i];
-            if (attribute.isPersistent() && attribute.isReadable()) {
-                // copy the current attribute value to the persistent value
-                Object value = attribute.getValue();
-                attribute.setPersistentValue(value);
+        if (target != null) {
+            // stop all of the attributes
+            for (int i = 0; i < attributes.length; i++) {
+                GBeanMBeanAttribute attribute = attributes[i];
+                if (attribute.isPersistent() && attribute.isReadable()) {
+                    // copy the current attribute value to the persistent value
+                    Object value = attribute.getValue();
+                    attribute.setPersistentValue(value);
+                }
             }
-        }
 
-        target = null;
+            target = null;
+        }
     }
 
     protected void doFail() {

Deleted: /geronimo/trunk/modules/kernel/src/java/org/apache/geronimo/gbean/jmx/GBeanSingleProxy.java
Url: http://svn.apache.org/viewcvs/geronimo/trunk/modules/kernel/src/java/org/apache/geronimo/gbean/jmx/GBeanSingleProxy.java?view=auto&rev=106386
==============================================================================

Modified: geronimo/trunk/modules/kernel/src/java/org/apache/geronimo/gbean/jmx/GBeanSingleReference.java
Url: http://svn.apache.org/viewcvs/geronimo/trunk/modules/kernel/src/java/org/apache/geronimo/gbean/jmx/GBeanSingleReference.java?view=diff&rev=106387&p1=geronimo/trunk/modules/kernel/src/java/org/apache/geronimo/gbean/jmx/GBeanSingleReference.java&r1=106386&p2=geronimo/trunk/modules/kernel/src/java/org/apache/geronimo/gbean/jmx/GBeanSingleReference.java&r2=106387
==============================================================================
--- geronimo/trunk/modules/kernel/src/java/org/apache/geronimo/gbean/jmx/GBeanSingleReference.java	(original)
+++ geronimo/trunk/modules/kernel/src/java/org/apache/geronimo/gbean/jmx/GBeanSingleReference.java	Tue Nov 23 22:16:54 2004
@@ -40,9 +40,9 @@
     private boolean waitingForMe = false;
 
     /**
-     * Proxy to the to this connection.
+     * The object to which the proxy is bound
      */
-    private GBeanSingleProxy proxy;
+    private ObjectName proxyTarget;
 
     public GBeanSingleReference(GBeanMBean gmbean, GReferenceInfo referenceInfo, Class constructorType) throws InvalidConfigurationException {
         super(gmbean, referenceInfo, constructorType);
@@ -55,7 +55,7 @@
         }
 
         // if we already have a proxy then we have already been started
-        if (proxy != null) {
+        if (getProxy() != null) {
             return;
         }
 
@@ -79,8 +79,9 @@
 
         // add a dependency on our target and create the proxy
         ObjectName target = (ObjectName) targets.iterator().next();
+        setProxy(kernel.getProxyManager().createProxy(target, getType()));
+        proxyTarget = target;
         kernel.getDependencyManager().addDependency(objectName, target);
-        proxy = new GBeanSingleProxy(kernel, getType(), target);
     }
 
     public synchronized void stop() {
@@ -92,18 +93,12 @@
             kernel.getDependencyManager().removeStartHolds(objectName, patterns);
         }
 
+        Object proxy = getProxy();
         if (proxy != null) {
-            kernel.getDependencyManager().removeDependency(objectName, proxy.getTarget());
-            proxy.destroy();
-            proxy = null;
-        }
-    }
-
-    public Object getProxy() {
-        if (proxy == null) {
-            return null;
-        } else {
-            return proxy.getProxy();
+            kernel.getDependencyManager().removeDependency(objectName, proxyTarget);
+            kernel.getProxyManager().destroyProxy(proxy);
+            setProxy(null);
+            proxyTarget = null;
         }
     }
 

Deleted: /geronimo/trunk/modules/kernel/src/java/org/apache/geronimo/gbean/jmx/JMXGBeanInvoker.java
Url: http://svn.apache.org/viewcvs/geronimo/trunk/modules/kernel/src/java/org/apache/geronimo/gbean/jmx/JMXGBeanInvoker.java?view=auto&rev=106386
==============================================================================

Deleted: /geronimo/trunk/modules/kernel/src/java/org/apache/geronimo/gbean/jmx/JMXGetAttributeInvoker.java
Url: http://svn.apache.org/viewcvs/geronimo/trunk/modules/kernel/src/java/org/apache/geronimo/gbean/jmx/JMXGetAttributeInvoker.java?view=auto&rev=106386
==============================================================================

Deleted: /geronimo/trunk/modules/kernel/src/java/org/apache/geronimo/gbean/jmx/JMXOperationInvoker.java
Url: http://svn.apache.org/viewcvs/geronimo/trunk/modules/kernel/src/java/org/apache/geronimo/gbean/jmx/JMXOperationInvoker.java?view=auto&rev=106386
==============================================================================

Deleted: /geronimo/trunk/modules/kernel/src/java/org/apache/geronimo/gbean/jmx/JMXSetAttributeInvoker.java
Url: http://svn.apache.org/viewcvs/geronimo/trunk/modules/kernel/src/java/org/apache/geronimo/gbean/jmx/JMXSetAttributeInvoker.java?view=auto&rev=106386
==============================================================================

Deleted: /geronimo/trunk/modules/kernel/src/java/org/apache/geronimo/gbean/jmx/NoSuchOperationError.java
Url: http://svn.apache.org/viewcvs/geronimo/trunk/modules/kernel/src/java/org/apache/geronimo/gbean/jmx/NoSuchOperationError.java?view=auto&rev=106386
==============================================================================

Added: geronimo/trunk/modules/kernel/src/java/org/apache/geronimo/gbean/jmx/ProxyCollection.java
Url: http://svn.apache.org/viewcvs/geronimo/trunk/modules/kernel/src/java/org/apache/geronimo/gbean/jmx/ProxyCollection.java?view=auto&rev=106387
==============================================================================
--- (empty file)
+++ geronimo/trunk/modules/kernel/src/java/org/apache/geronimo/gbean/jmx/ProxyCollection.java	Tue Nov 23 22:16:54 2004
@@ -0,0 +1,243 @@
+/**
+ *
+ * Copyright 2004 The Apache Software Foundation
+ *
+ *  Licensed under the Apache License, Version 2.0 (the "License");
+ *  you may not use this file except in compliance with the License.
+ *  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing, software
+ *  distributed under the License is distributed on an "AS IS" BASIS,
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *  See the License for the specific language governing permissions and
+ *  limitations under the License.
+ */
+package org.apache.geronimo.gbean.jmx;
+
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.HashSet;
+import java.util.Iterator;
+import java.util.NoSuchElementException;
+import java.util.Set;
+import java.util.HashMap;
+import java.util.Map;
+
+import javax.management.ObjectName;
+
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.apache.geronimo.gbean.ReferenceCollection;
+import org.apache.geronimo.gbean.ReferenceCollectionEvent;
+import org.apache.geronimo.gbean.ReferenceCollectionListener;
+import org.apache.geronimo.kernel.proxy.ProxyManager;
+import org.apache.geronimo.kernel.proxy.ProxyFactory;
+
+/**
+ * @version $Rev$ $Date$
+ */
+class ProxyCollection implements ReferenceCollection {
+    private static final Log log = LogFactory.getLog(ProxyCollection.class);
+    private final String name;
+    private final ProxyManager proxyManager;
+    private final ProxyFactory factory;
+    private final Map proxies = new HashMap();
+    private final Set listeners = new HashSet();
+    private boolean stopped = false;
+
+    public ProxyCollection(String name, Class type, ProxyManager proxyManager, Set targets) {
+        this.name = name;
+        this.proxyManager = proxyManager;
+        factory = proxyManager.createProxyFactory(type);
+
+        for (Iterator iterator = targets.iterator(); iterator.hasNext();) {
+            addTarget((ObjectName) iterator.next());
+        }
+    }
+
+    synchronized void destroy() {
+        stopped = true;
+        for (Iterator iterator = proxies.values().iterator(); iterator.hasNext();) {
+            proxyManager.destroyProxy(iterator.next());
+        }
+        proxies.clear();
+        listeners.clear();
+    }
+
+    void addTarget(ObjectName target) {
+        Object proxy;
+        ArrayList listenerCopy;
+        synchronized (this) {
+            // if this is not a new target return
+            if (proxies.containsKey(target)) {
+                return;
+            }
+
+            // create and add the proxy
+            proxy = factory.createProxy(target);
+            proxies.put(target, proxy);
+
+            // make a snapshot of the listeners
+            listenerCopy = new ArrayList(listeners);
+        }
+
+        // fire the member added event
+        for (Iterator iterator = listenerCopy.iterator(); iterator.hasNext();) {
+            ReferenceCollectionListener listener = (ReferenceCollectionListener) iterator.next();
+            try {
+                listener.memberAdded(new ReferenceCollectionEvent(name, proxy));
+            } catch (Throwable t) {
+                log.error("Listener threw exception", t);
+            }
+        }
+    }
+
+    void removeTarget(ObjectName target) {
+        Object proxy;
+        ArrayList listenerCopy;
+        synchronized (this) {
+            // remove the proxy
+            proxy = proxies.remove(target);
+
+            // if this was not a target return
+            if (proxy == null) {
+                return;
+            }
+
+            // make a snapshot of the listeners
+            listenerCopy = new ArrayList(listeners);
+        }
+
+        // fire the member removed event
+        for (Iterator iterator = listenerCopy.iterator(); iterator.hasNext();) {
+            ReferenceCollectionListener listener = (ReferenceCollectionListener) iterator.next();
+            try {
+                listener.memberRemoved(new ReferenceCollectionEvent(name, proxy));
+            } catch (Throwable t) {
+                log.error("Listener threw exception", t);
+            }
+        }
+
+        // destroy the proxy
+        proxyManager.destroyProxy(proxy);
+    }
+
+    public synchronized boolean isStopped() {
+        return stopped;
+    }
+
+    public synchronized void addReferenceCollectionListener(ReferenceCollectionListener listener) {
+        listeners.add(listener);
+    }
+
+    public synchronized void removeReferenceCollectionListener(ReferenceCollectionListener listener) {
+        listeners.remove(listener);
+    }
+
+    public synchronized int size() {
+        if (stopped) {
+            return 0;
+        }
+        return proxies.size();
+    }
+
+    public synchronized boolean isEmpty() {
+        if (stopped) {
+            return true;
+        }
+        return proxies.isEmpty();
+    }
+
+    public synchronized boolean contains(Object o) {
+        if (stopped) {
+            return false;
+        }
+        return proxies.containsValue(o);
+    }
+
+    public synchronized Iterator iterator() {
+        if (stopped) {
+            return new Iterator() {
+                public boolean hasNext() {
+                    return false;
+                }
+
+                public Object next() {
+                    throw new NoSuchElementException();
+                }
+
+                public void remove() {
+                    throw new UnsupportedOperationException();
+                }
+            };
+        }
+
+        return new Iterator() {
+            // copy the proxies, so the client can iterate without concurrent modification
+            // this is necssary since the client has nothing to synchronize on
+            private final Iterator iterator = new ArrayList(proxies.values()).iterator();
+
+            public boolean hasNext() {
+                return iterator.hasNext();
+            }
+
+            public Object next() {
+                return iterator.next();
+            }
+
+            public void remove() {
+                throw new UnsupportedOperationException();
+            }
+        };
+    }
+
+    public synchronized Object[] toArray() {
+        if (stopped) {
+            return new Object[0];
+        }
+        return proxies.values().toArray();
+    }
+
+    public synchronized Object[] toArray(Object a[]) {
+        if (stopped) {
+            if (a.length > 0) {
+                a[0] = null;
+            }
+            return a;
+        }
+        return proxies.values().toArray(a);
+    }
+
+    public synchronized boolean containsAll(Collection c) {
+        if (stopped) {
+            return c.isEmpty();
+        }
+        return proxies.values().containsAll(c);
+    }
+
+    public boolean add(Object o) {
+        throw new UnsupportedOperationException();
+    }
+
+    public boolean remove(Object o) {
+        throw new UnsupportedOperationException();
+    }
+
+    public boolean addAll(Collection c) {
+        throw new UnsupportedOperationException();
+    }
+
+    public boolean removeAll(Collection c) {
+        throw new UnsupportedOperationException();
+    }
+
+    public boolean retainAll(Collection c) {
+        throw new UnsupportedOperationException();
+    }
+
+    public void clear() {
+        throw new UnsupportedOperationException();
+    }
+}

Deleted: /geronimo/trunk/modules/kernel/src/java/org/apache/geronimo/gbean/jmx/ProxyFactory.java
Url: http://svn.apache.org/viewcvs/geronimo/trunk/modules/kernel/src/java/org/apache/geronimo/gbean/jmx/ProxyFactory.java?view=auto&rev=106386
==============================================================================

Deleted: /geronimo/trunk/modules/kernel/src/java/org/apache/geronimo/gbean/jmx/ProxyMethodInterceptor.java
Url: http://svn.apache.org/viewcvs/geronimo/trunk/modules/kernel/src/java/org/apache/geronimo/gbean/jmx/ProxyMethodInterceptor.java?view=auto&rev=106386
==============================================================================

Deleted: /geronimo/trunk/modules/kernel/src/java/org/apache/geronimo/gbean/jmx/RawGetAttributeInvoker.java
Url: http://svn.apache.org/viewcvs/geronimo/trunk/modules/kernel/src/java/org/apache/geronimo/gbean/jmx/RawGetAttributeInvoker.java?view=auto&rev=106386
==============================================================================

Deleted: /geronimo/trunk/modules/kernel/src/java/org/apache/geronimo/gbean/jmx/RawOperationInvoker.java
Url: http://svn.apache.org/viewcvs/geronimo/trunk/modules/kernel/src/java/org/apache/geronimo/gbean/jmx/RawOperationInvoker.java?view=auto&rev=106386
==============================================================================

Deleted: /geronimo/trunk/modules/kernel/src/java/org/apache/geronimo/gbean/jmx/RawSetAttributeInvoker.java
Url: http://svn.apache.org/viewcvs/geronimo/trunk/modules/kernel/src/java/org/apache/geronimo/gbean/jmx/RawSetAttributeInvoker.java?view=auto&rev=106386
==============================================================================

Deleted: /geronimo/trunk/modules/kernel/src/java/org/apache/geronimo/gbean/jmx/VMMethodInterceptor.java
Url: http://svn.apache.org/viewcvs/geronimo/trunk/modules/kernel/src/java/org/apache/geronimo/gbean/jmx/VMMethodInterceptor.java?view=auto&rev=106386
==============================================================================

Deleted: /geronimo/trunk/modules/kernel/src/java/org/apache/geronimo/gbean/jmx/VMProxyFactory.java
Url: http://svn.apache.org/viewcvs/geronimo/trunk/modules/kernel/src/java/org/apache/geronimo/gbean/jmx/VMProxyFactory.java?view=auto&rev=106386
==============================================================================

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&rev=106387&p1=geronimo/trunk/modules/kernel/src/java/org/apache/geronimo/kernel/Kernel.java&r1=106386&p2=geronimo/trunk/modules/kernel/src/java/org/apache/geronimo/kernel/Kernel.java&r2=106387
==============================================================================
--- 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 Nov 23 22:16:54 2004
@@ -53,6 +53,7 @@
 import org.apache.geronimo.kernel.config.NoSuchConfigException;
 import org.apache.geronimo.kernel.config.NoSuchStoreException;
 import org.apache.geronimo.kernel.jmx.JMXUtil;
+import org.apache.geronimo.kernel.proxy.ProxyManager;
 
 
 /**
@@ -166,6 +167,12 @@
     private LifecycleMonitor lifecycleMonitor;
 
     /**
+     * This factory gbean proxies, and tracks all proxies in the system
+     * @deprecated don't use this yet... it may go away
+     */
+    private ProxyManager proxyManager;
+
+    /**
      * No-arg constructor allowing this class to be used as a GBean reference.
      */
     public Kernel() {
@@ -265,6 +272,14 @@
         return lifecycleMonitor;
     }
 
+    /**
+     * Gets the proxy manager.
+     * @deprecated don't use this yet... it may change or go away
+     */
+    public ProxyManager getProxyManager() {
+        return proxyManager;
+    }
+
     public Object getAttribute(ObjectName objectName, String attributeName) throws Exception {
         try {
             return mbServer.getAttribute(objectName, attributeName);
@@ -503,8 +518,8 @@
         mbServer = MBeanServerFactory.createMBeanServer(domainName);
         mbServer.registerMBean(this, KERNEL);
         dependencyManager = new DependencyManager(mbServer);
-
         lifecycleMonitor = new LifecycleMonitor(mbServer);
+        proxyManager = new ProxyManager(this);
 
         configurationManagerGBean = new GBeanMBean(ConfigurationManagerImpl.GBEAN_INFO);
         configurationManagerGBean.setReferencePatterns("Stores", Collections.singleton(CONFIGURATION_STORE_PATTERN));

Copied: geronimo/trunk/modules/kernel/src/java/org/apache/geronimo/kernel/jmx/JMXGetAttributeInvoker.java (from r106284, geronimo/trunk/modules/kernel/src/java/org/apache/geronimo/gbean/jmx/JMXGetAttributeInvoker.java)
Url: http://svn.apache.org/viewcvs/geronimo/trunk/modules/kernel/src/java/org/apache/geronimo/kernel/jmx/JMXGetAttributeInvoker.java?view=diff&rev=106387&p1=geronimo/trunk/modules/kernel/src/java/org/apache/geronimo/gbean/jmx/JMXGetAttributeInvoker.java&r1=106284&p2=geronimo/trunk/modules/kernel/src/java/org/apache/geronimo/kernel/jmx/JMXGetAttributeInvoker.java&r2=106387
==============================================================================
--- geronimo/trunk/modules/kernel/src/java/org/apache/geronimo/gbean/jmx/JMXGetAttributeInvoker.java	(original)
+++ geronimo/trunk/modules/kernel/src/java/org/apache/geronimo/kernel/jmx/JMXGetAttributeInvoker.java	Tue Nov 23 22:16:54 2004
@@ -15,7 +15,7 @@
  *  limitations under the License.
  */
 
-package org.apache.geronimo.gbean.jmx;
+package org.apache.geronimo.kernel.jmx;
 
 import java.lang.reflect.Method;
 import javax.management.MBeanException;
@@ -29,7 +29,7 @@
 /**
  * @version $Rev$ $Date$
  */
-public final class JMXGetAttributeInvoker implements GBeanInvoker {
+public final class JMXGetAttributeInvoker implements JMXInvoker {
     private final MBeanServerConnection server;
     private final String name;
     private final Class[] declaredExceptions;

Copied: geronimo/trunk/modules/kernel/src/java/org/apache/geronimo/kernel/jmx/JMXInvocationHandler.java (from r106284, geronimo/trunk/modules/kernel/src/java/org/apache/geronimo/gbean/jmx/JMXGBeanInvoker.java)
Url: http://svn.apache.org/viewcvs/geronimo/trunk/modules/kernel/src/java/org/apache/geronimo/kernel/jmx/JMXInvocationHandler.java?view=diff&rev=106387&p1=geronimo/trunk/modules/kernel/src/java/org/apache/geronimo/gbean/jmx/JMXGBeanInvoker.java&r1=106284&p2=geronimo/trunk/modules/kernel/src/java/org/apache/geronimo/kernel/jmx/JMXInvocationHandler.java&r2=106387
==============================================================================
--- geronimo/trunk/modules/kernel/src/java/org/apache/geronimo/gbean/jmx/JMXGBeanInvoker.java	(original)
+++ geronimo/trunk/modules/kernel/src/java/org/apache/geronimo/kernel/jmx/JMXInvocationHandler.java	Tue Nov 23 22:16:54 2004
@@ -1,6 +1,6 @@
 /**
  *
- * Copyright 2003-2004 The Apache Software Foundation
+ * Copyright 2004 The Apache Software Foundation
  *
  *  Licensed under the Apache License, Version 2.0 (the "License");
  *  you may not use this file except in compliance with the License.
@@ -14,93 +14,168 @@
  *  See the License for the specific language governing permissions and
  *  limitations under the License.
  */
+package org.apache.geronimo.kernel.jmx;
 
-package org.apache.geronimo.gbean.jmx;
-
+import java.beans.Introspector;
+import java.lang.reflect.InvocationHandler;
 import java.lang.reflect.Method;
-import javax.management.Attribute;
-import javax.management.MBeanException;
-import javax.management.MBeanServer;
+import java.lang.reflect.Proxy;
+import java.util.HashMap;
+import java.util.Map;
+import javax.management.MBeanAttributeInfo;
+import javax.management.MBeanInfo;
+import javax.management.MBeanOperationInfo;
+import javax.management.MBeanServerConnection;
 import javax.management.ObjectName;
-import javax.management.ReflectionException;
-import javax.management.RuntimeErrorException;
-import javax.management.RuntimeMBeanException;
-import javax.management.RuntimeOperationsException;
+
+import org.apache.geronimo.gbean.GOperationSignature;
 
 /**
  * @version $Rev$ $Date$
  */
-public final class JMXGBeanInvoker implements GBeanInvoker {
-    private final MBeanServer server;
-    private final int methodType;
-    private final String name;
-    private final String[] argumentTypes;
-    private final Class[] declaredExceptions;
-
-    public JMXGBeanInvoker(MBeanServer server, Method method, int methodType) {
-        this.server = server;
-        this.methodType = methodType;
+public class JMXInvocationHandler implements InvocationHandler {
+    private final Class proxyType;
+    private final ObjectName objectName;
+    private final Map gbeanInvokers;
+
+    public JMXInvocationHandler(Class type, MBeanServerConnection server, ObjectName objectName) {
+        assert type != null;
+        assert server != null;
+        assert objectName != null;
+        this.proxyType = type;
+        this.objectName = objectName;
+        gbeanInvokers = createGBeanInvokers(server, objectName);
+    }
 
-        if (methodType == GBeanInvoker.OPERATION) {
-            name = method.getName();
-        } else {
-            // strip off the is, get, or set from the method name
-            if (method.getName().startsWith("is")) {
-                name = method.getName().substring(2);
-            } else {
-                name = method.getName().substring(3);
-            }
+    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
+        JMXInvoker jmxInvoker = (JMXInvoker) gbeanInvokers.get(method);
+        if (jmxInvoker == null) {
+            throw new UnsupportedOperationException("No implementation method: objectName=" + objectName + ", method=" + method);
         }
 
-        // convert the parameters to a MBeanServer friendly string array
-        Class[] parameters = method.getParameterTypes();
-        argumentTypes = new String[parameters.length];
-        for (int i = 0; i < parameters.length; i++) {
-            argumentTypes[i] = parameters[i].getName();
+        return jmxInvoker.invoke(objectName, args);
+    }
+
+    public ObjectName getObjectName() {
+        return objectName;
+    }
+
+    private Map createGBeanInvokers(MBeanServerConnection server, ObjectName objectName) {
+        Map invokers = createJMXGBeanInvokers(server, objectName, proxyType);
+
+        // handle equals, hashCode and toString directly here
+        try {
+            invokers.put(Object.class.getMethod("equals", new Class[]{Object.class}), new EqualsInvoke());
+            invokers.put(Object.class.getMethod("hashCode", null), new HashCodeInvoke());
+            invokers.put(Object.class.getMethod("toString", null), new ToStringInvoke(proxyType.getName()));
+        } catch (Exception e) {
+            // this can not happen... all classes must implement equals, hashCode and toString
+            throw new AssertionError(e);
         }
 
-        declaredExceptions = method.getExceptionTypes();
+        return invokers;
     }
 
-    public Object invoke(ObjectName objectName, Object[] arguments) throws Throwable {
+    private Map createJMXGBeanInvokers(MBeanServerConnection server, ObjectName objectName, Class proxyType) {
+        MBeanInfo info;
         try {
-            switch (methodType) {
-                case GBeanInvoker.OPERATION:
-                    return server.invoke(objectName, name, arguments, argumentTypes);
-                case GBeanInvoker.GETTER:
-                    return server.getAttribute(objectName, name);
-                case GBeanInvoker.SETTER:
-                    server.setAttribute(objectName, new Attribute(name, arguments[0]));
-                    return null;
-                default:
-                    throw new AssertionError();
-            }
-        } catch (Throwable t) {
-            Throwable throwable = t;
-            while (true) {
-                for (int i = 0; i < declaredExceptions.length; i++) {
-                    Class declaredException = declaredExceptions[i];
-                    if (declaredException.isInstance(throwable)) {
-                        throw throwable;
-                    }
-                }
+            info = server.getMBeanInfo(objectName);
+        } catch (Exception e) {
+            throw new IllegalArgumentException("Could not get MBeanInfo for target object: " + objectName);
+        }
+
+        // build attributeName->attributeInfo map
+        MBeanAttributeInfo[] attributeInfos = info.getAttributes();
+        Map attributes = new HashMap(attributeInfos.length);
+        for (int i = 0; i < attributeInfos.length; i++) {
+            MBeanAttributeInfo attributeInfo = attributeInfos[i];
+            attributes.put(attributeInfo.getName(), attributeInfo);
+        }
+
+        // build operationName->operationInfo map
+        MBeanOperationInfo[] operationInfos = info.getOperations();
+        Map operations = new HashMap(operationInfos.length);
+        for (int i = 0; i < operationInfos.length; i++) {
+            MBeanOperationInfo operationInfo = operationInfos[i];
+            operations.put(new GOperationSignature(operationInfo), operationInfo);
+        }
+
+        // build the method lookup table
+        Method[] methods = proxyType.getMethods();
+        Map invokers = new HashMap(methods.length);
+        for (int i = 0; i < methods.length; i++) {
+            Method method = methods[i];
+            invokers.put(method, createJMXGBeanInvoker(server, method, operations, attributes));
+        }
+
+        return invokers;
+    }
+
+    private JMXInvoker createJMXGBeanInvoker(MBeanServerConnection server, Method method, Map operations, Map attributes) {
+        if (operations.containsKey(new GOperationSignature(method))) {
+            return new JMXOperationInvoker(server, method);
+        }
+
+        String name = method.getName();
+        if (name.startsWith("get")) {
+            String attrName = method.getName().substring(3);
+            if (attributes.containsKey(attrName)) {
+                return new JMXGetAttributeInvoker(server, method, attrName);
+            }
+            attrName = Introspector.decapitalize(attrName);
+            if (attributes.containsKey(attrName)) {
+                return new JMXGetAttributeInvoker(server, method, attrName);
+            }
+        } else if (name.startsWith("is")) {
+            String attrName = method.getName().substring(2);
+            if (attributes.containsKey(attrName)) {
+                return new JMXGetAttributeInvoker(server, method, attrName);
+            }
+            attrName = Introspector.decapitalize(attrName);
+            if (attributes.containsKey(attrName)) {
+                return new JMXGetAttributeInvoker(server, method, attrName);
+            }
+        } else if (name.startsWith("set")) {
+            String attrName = method.getName().substring(3);
+            if (attributes.containsKey(attrName)) {
+                return new JMXSetAttributeInvoker(server, method, attrName);
+            }
+            attrName = Introspector.decapitalize(attrName);
+            if (attributes.containsKey(attrName)) {
+                return new JMXSetAttributeInvoker(server, method, attrName);
+            }
+        }
+        return null;
+    }
+    private static final class HashCodeInvoke implements JMXInvoker {
+        public Object invoke(ObjectName objectName, Object[] arguments) throws Throwable {
+            return new Integer(objectName.hashCode());
+        }
+    }
 
-                // Unwrap the exceptions we understand
-                if (throwable instanceof MBeanException) {
-                    throwable = (((MBeanException) throwable).getTargetException());
-                } else if (throwable instanceof ReflectionException) {
-                    throwable = (((ReflectionException) throwable).getTargetException());
-                } else if (throwable instanceof RuntimeOperationsException) {
-                    throwable = (((RuntimeOperationsException) throwable).getTargetException());
-                } else if (throwable instanceof RuntimeMBeanException) {
-                    throwable = (((RuntimeMBeanException) throwable).getTargetException());
-                } else if (throwable instanceof RuntimeErrorException) {
-                    throwable = (((RuntimeErrorException) throwable).getTargetError());
-                } else {
-                    // don't know how to unwrap this, just throw it
-                    throw throwable;
+    private static final class EqualsInvoke implements JMXInvoker {
+        public Object invoke(ObjectName objectName, Object[] arguments) throws Throwable {
+            try {
+                InvocationHandler handler = Proxy.getInvocationHandler(arguments[0]);
+                if (handler instanceof JMXInvocationHandler) {
+                    ObjectName otherObjectName = ((JMXInvocationHandler) handler).getObjectName();
+                    return Boolean.valueOf(objectName.equals(otherObjectName));
                 }
+            } catch (IllegalArgumentException e) {
             }
+            return Boolean.FALSE;
+        }
+    }
+
+    private static final class ToStringInvoke implements JMXInvoker {
+        private final String interfaceName;
+
+        public ToStringInvoke(String interfaceName) {
+            this.interfaceName = "[" + interfaceName + ": ";
+        }
+
+        public Object invoke(ObjectName objectName, Object[] arguments) throws Throwable {
+            return interfaceName + objectName + "]";
         }
     }
 }

Added: geronimo/trunk/modules/kernel/src/java/org/apache/geronimo/kernel/jmx/JMXInvoker.java
Url: http://svn.apache.org/viewcvs/geronimo/trunk/modules/kernel/src/java/org/apache/geronimo/kernel/jmx/JMXInvoker.java?view=auto&rev=106387
==============================================================================
--- (empty file)
+++ geronimo/trunk/modules/kernel/src/java/org/apache/geronimo/kernel/jmx/JMXInvoker.java	Tue Nov 23 22:16:54 2004
@@ -0,0 +1,26 @@
+/**
+ *
+ * Copyright 2004 The Apache Software Foundation
+ *
+ *  Licensed under the Apache License, Version 2.0 (the "License");
+ *  you may not use this file except in compliance with the License.
+ *  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing, software
+ *  distributed under the License is distributed on an "AS IS" BASIS,
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *  See the License for the specific language governing permissions and
+ *  limitations under the License.
+ */
+package org.apache.geronimo.kernel.jmx;
+
+import javax.management.ObjectName;
+
+/**
+ * @version $Rev: 46019 $ $Date: 2004-09-14 02:56:06 -0700 (Tue, 14 Sep 2004) $
+ */
+public interface JMXInvoker {
+    Object invoke(ObjectName objectName, Object[] arguments) throws Throwable;
+}

Copied: geronimo/trunk/modules/kernel/src/java/org/apache/geronimo/kernel/jmx/JMXOperationInvoker.java (from r106284, geronimo/trunk/modules/kernel/src/java/org/apache/geronimo/gbean/jmx/JMXOperationInvoker.java)
Url: http://svn.apache.org/viewcvs/geronimo/trunk/modules/kernel/src/java/org/apache/geronimo/kernel/jmx/JMXOperationInvoker.java?view=diff&rev=106387&p1=geronimo/trunk/modules/kernel/src/java/org/apache/geronimo/gbean/jmx/JMXOperationInvoker.java&r1=106284&p2=geronimo/trunk/modules/kernel/src/java/org/apache/geronimo/kernel/jmx/JMXOperationInvoker.java&r2=106387
==============================================================================
--- geronimo/trunk/modules/kernel/src/java/org/apache/geronimo/gbean/jmx/JMXOperationInvoker.java	(original)
+++ geronimo/trunk/modules/kernel/src/java/org/apache/geronimo/kernel/jmx/JMXOperationInvoker.java	Tue Nov 23 22:16:54 2004
@@ -15,7 +15,7 @@
  *  limitations under the License.
  */
 
-package org.apache.geronimo.gbean.jmx;
+package org.apache.geronimo.kernel.jmx;
 
 import java.lang.reflect.Method;
 import javax.management.MBeanException;
@@ -29,7 +29,7 @@
 /**
  * @version $Rev$ $Date$
  */
-public final class JMXOperationInvoker implements GBeanInvoker {
+public final class JMXOperationInvoker implements JMXInvoker {
     private final MBeanServerConnection server;
     private final String name;
     private final String[] argumentTypes;

Copied: geronimo/trunk/modules/kernel/src/java/org/apache/geronimo/kernel/jmx/JMXSetAttributeInvoker.java (from r106284, geronimo/trunk/modules/kernel/src/java/org/apache/geronimo/gbean/jmx/JMXSetAttributeInvoker.java)
Url: http://svn.apache.org/viewcvs/geronimo/trunk/modules/kernel/src/java/org/apache/geronimo/kernel/jmx/JMXSetAttributeInvoker.java?view=diff&rev=106387&p1=geronimo/trunk/modules/kernel/src/java/org/apache/geronimo/gbean/jmx/JMXSetAttributeInvoker.java&r1=106284&p2=geronimo/trunk/modules/kernel/src/java/org/apache/geronimo/kernel/jmx/JMXSetAttributeInvoker.java&r2=106387
==============================================================================
--- geronimo/trunk/modules/kernel/src/java/org/apache/geronimo/gbean/jmx/JMXSetAttributeInvoker.java	(original)
+++ geronimo/trunk/modules/kernel/src/java/org/apache/geronimo/kernel/jmx/JMXSetAttributeInvoker.java	Tue Nov 23 22:16:54 2004
@@ -15,7 +15,7 @@
  *  limitations under the License.
  */
 
-package org.apache.geronimo.gbean.jmx;
+package org.apache.geronimo.kernel.jmx;
 
 import java.lang.reflect.Method;
 import javax.management.Attribute;
@@ -30,7 +30,7 @@
 /**
  * @version $Rev$ $Date$
  */
-public final class JMXSetAttributeInvoker implements GBeanInvoker {
+public final class JMXSetAttributeInvoker implements JMXInvoker {
     private final MBeanServerConnection server;
     private final String name;
     private final Class[] declaredExceptions;

Modified: geronimo/trunk/modules/kernel/src/java/org/apache/geronimo/kernel/jmx/MBeanProxyFactory.java
Url: http://svn.apache.org/viewcvs/geronimo/trunk/modules/kernel/src/java/org/apache/geronimo/kernel/jmx/MBeanProxyFactory.java?view=diff&rev=106387&p1=geronimo/trunk/modules/kernel/src/java/org/apache/geronimo/kernel/jmx/MBeanProxyFactory.java&r1=106386&p2=geronimo/trunk/modules/kernel/src/java/org/apache/geronimo/kernel/jmx/MBeanProxyFactory.java&r2=106387
==============================================================================
--- geronimo/trunk/modules/kernel/src/java/org/apache/geronimo/kernel/jmx/MBeanProxyFactory.java	(original)
+++ geronimo/trunk/modules/kernel/src/java/org/apache/geronimo/kernel/jmx/MBeanProxyFactory.java	Tue Nov 23 22:16:54 2004
@@ -17,13 +17,10 @@
 
 package org.apache.geronimo.kernel.jmx;
 
-import java.util.Set;
+import java.lang.reflect.Proxy;
 import javax.management.MBeanServerConnection;
 import javax.management.ObjectName;
 
-import org.apache.geronimo.gbean.jmx.ProxyFactory;
-import org.apache.geronimo.gbean.jmx.ProxyMethodInterceptor;
-
 /**
  * MBeanProxyFactory creates a dynamic proxy to an MBean by ObjectName.
  * The interface type and object existance are enforced during construction.
@@ -31,7 +28,6 @@
  * @version $Rev$ $Date$
  */
 public final class MBeanProxyFactory {
-
     /**
      * Creates an MBean proxy using the specified interface to the objectName.
      *
@@ -39,6 +35,7 @@
      * @param server the MBeanServer in which the object is registered
      * @param objectName the objectName of the MBean to proxy
      * @return the new MBean proxy, which implemnts the specified interface
+     *
      */
     public static Object getProxy(Class type, MBeanServerConnection server, ObjectName objectName) {
         assert type != null;
@@ -46,18 +43,9 @@
 
         if (objectName.isPattern()) {
             throw new UnsupportedOperationException();
-/*
-            Set names = server.queryNames(objectName, null);
-            if (names.isEmpty()) {
-                throw new IllegalArgumentException("No names mbeans registered that match object name pattern: " + objectName);
-            }
-            objectName = (ObjectName) names.iterator().next();
-*/
         }
 
-        ProxyFactory factory = ProxyFactory.newProxyFactory(type);
-        ProxyMethodInterceptor methodInterceptor = factory.getMethodInterceptor();
-        methodInterceptor.connect(server, objectName);
-        return factory.create(methodInterceptor);
+        JMXInvocationHandler interceptor = new JMXInvocationHandler(type, server, objectName);
+        return Proxy.newProxyInstance(type.getClassLoader(), new Class[]{type}, interceptor);
     }
 }

Added: geronimo/trunk/modules/kernel/src/java/org/apache/geronimo/kernel/proxy/DeadProxyException.java
Url: http://svn.apache.org/viewcvs/geronimo/trunk/modules/kernel/src/java/org/apache/geronimo/kernel/proxy/DeadProxyException.java?view=auto&rev=106387
==============================================================================
--- (empty file)
+++ geronimo/trunk/modules/kernel/src/java/org/apache/geronimo/kernel/proxy/DeadProxyException.java	Tue Nov 23 22:16:54 2004
@@ -0,0 +1,26 @@
+/**
+ *
+ * Copyright 2004 The Apache Software Foundation
+ *
+ *  Licensed under the Apache License, Version 2.0 (the "License");
+ *  you may not use this file except in compliance with the License.
+ *  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing, software
+ *  distributed under the License is distributed on an "AS IS" BASIS,
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *  See the License for the specific language governing permissions and
+ *  limitations under the License.
+ */
+package org.apache.geronimo.kernel.proxy;
+
+/**
+ * @version $Rev$ $Date$
+ */
+public class DeadProxyException extends IllegalStateException {
+    public DeadProxyException(String s) {
+        super(s);
+    }
+}

Added: geronimo/trunk/modules/kernel/src/java/org/apache/geronimo/kernel/proxy/KernelGetAttributeInvoker.java
Url: http://svn.apache.org/viewcvs/geronimo/trunk/modules/kernel/src/java/org/apache/geronimo/kernel/proxy/KernelGetAttributeInvoker.java?view=auto&rev=106387
==============================================================================
--- (empty file)
+++ geronimo/trunk/modules/kernel/src/java/org/apache/geronimo/kernel/proxy/KernelGetAttributeInvoker.java	Tue Nov 23 22:16:54 2004
@@ -0,0 +1,39 @@
+/**
+ *
+ * Copyright 2003-2004 The Apache Software Foundation
+ *
+ *  Licensed under the Apache License, Version 2.0 (the "License");
+ *  you may not use this file except in compliance with the License.
+ *  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing, software
+ *  distributed under the License is distributed on an "AS IS" BASIS,
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *  See the License for the specific language governing permissions and
+ *  limitations under the License.
+ */
+
+package org.apache.geronimo.kernel.proxy;
+
+import javax.management.ObjectName;
+
+import org.apache.geronimo.kernel.Kernel;
+
+/**
+ * @version $Rev: 46019 $ $Date: 2004-09-14 02:56:06 -0700 (Tue, 14 Sep 2004) $
+ */
+public final class KernelGetAttributeInvoker implements ProxyInvoker {
+    private final Kernel kernel;
+    private final String name;
+
+    public KernelGetAttributeInvoker(Kernel kernel, String name) {
+        this.kernel = kernel;
+        this.name = name;
+    }
+
+    public Object invoke(ObjectName objectName, Object[] arguments) throws Throwable {
+        return kernel.getAttribute(objectName, name);
+    }
+}

Added: geronimo/trunk/modules/kernel/src/java/org/apache/geronimo/kernel/proxy/KernelOperationInvoker.java
Url: http://svn.apache.org/viewcvs/geronimo/trunk/modules/kernel/src/java/org/apache/geronimo/kernel/proxy/KernelOperationInvoker.java?view=auto&rev=106387
==============================================================================
--- (empty file)
+++ geronimo/trunk/modules/kernel/src/java/org/apache/geronimo/kernel/proxy/KernelOperationInvoker.java	Tue Nov 23 22:16:54 2004
@@ -0,0 +1,48 @@
+/**
+ *
+ * Copyright 2003-2004 The Apache Software Foundation
+ *
+ *  Licensed under the Apache License, Version 2.0 (the "License");
+ *  you may not use this file except in compliance with the License.
+ *  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing, software
+ *  distributed under the License is distributed on an "AS IS" BASIS,
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *  See the License for the specific language governing permissions and
+ *  limitations under the License.
+ */
+
+package org.apache.geronimo.kernel.proxy;
+
+import java.lang.reflect.Method;
+import javax.management.ObjectName;
+
+import org.apache.geronimo.kernel.Kernel;
+
+/**
+ * @version $Rev: 46019 $ $Date: 2004-09-14 02:56:06 -0700 (Tue, 14 Sep 2004) $
+ */
+public final class KernelOperationInvoker implements ProxyInvoker {
+    private final Kernel kernel;
+    private final String name;
+    private final String[] argumentTypes;
+
+    public KernelOperationInvoker(Kernel kernel, Method method) {
+        this.kernel = kernel;
+        name = method.getName();
+
+        // convert the parameters to a MBeanServer friendly string array
+        Class[] parameters = method.getParameterTypes();
+        argumentTypes = new String[parameters.length];
+        for (int i = 0; i < parameters.length; i++) {
+            argumentTypes[i] = parameters[i].getName();
+        }
+    }
+
+    public Object invoke(ObjectName objectName, Object[] arguments) throws Throwable {
+        return kernel.invoke(objectName, name, arguments, argumentTypes);
+    }
+}

Added: geronimo/trunk/modules/kernel/src/java/org/apache/geronimo/kernel/proxy/KernelSetAttributeInvoker.java
Url: http://svn.apache.org/viewcvs/geronimo/trunk/modules/kernel/src/java/org/apache/geronimo/kernel/proxy/KernelSetAttributeInvoker.java?view=auto&rev=106387
==============================================================================
--- (empty file)
+++ geronimo/trunk/modules/kernel/src/java/org/apache/geronimo/kernel/proxy/KernelSetAttributeInvoker.java	Tue Nov 23 22:16:54 2004
@@ -0,0 +1,40 @@
+/**
+ *
+ * Copyright 2003-2004 The Apache Software Foundation
+ *
+ *  Licensed under the Apache License, Version 2.0 (the "License");
+ *  you may not use this file except in compliance with the License.
+ *  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing, software
+ *  distributed under the License is distributed on an "AS IS" BASIS,
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *  See the License for the specific language governing permissions and
+ *  limitations under the License.
+ */
+
+package org.apache.geronimo.kernel.proxy;
+
+import javax.management.ObjectName;
+
+import org.apache.geronimo.kernel.Kernel;
+
+/**
+ * @version $Rev: 46019 $ $Date: 2004-09-14 02:56:06 -0700 (Tue, 14 Sep 2004) $
+ */
+public final class KernelSetAttributeInvoker implements ProxyInvoker {
+    private final Kernel kernel;
+    private final String name;
+
+    public KernelSetAttributeInvoker(Kernel kernel, String name) {
+        this.kernel = kernel;
+        this.name = name;
+    }
+
+    public Object invoke(ObjectName objectName, Object[] arguments) throws Throwable {
+        kernel.setAttribute(objectName, name, arguments[0]);
+        return null;
+    }
+}

Added: geronimo/trunk/modules/kernel/src/java/org/apache/geronimo/kernel/proxy/ProxyFactory.java
Url: http://svn.apache.org/viewcvs/geronimo/trunk/modules/kernel/src/java/org/apache/geronimo/kernel/proxy/ProxyFactory.java?view=auto&rev=106387
==============================================================================
--- (empty file)
+++ geronimo/trunk/modules/kernel/src/java/org/apache/geronimo/kernel/proxy/ProxyFactory.java	Tue Nov 23 22:16:54 2004
@@ -0,0 +1,28 @@
+/**
+ *
+ * Copyright 2003-2004 The Apache Software Foundation
+ *
+ *  Licensed under the Apache License, Version 2.0 (the "License");
+ *  you may not use this file except in compliance with the License.
+ *  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing, software
+ *  distributed under the License is distributed on an "AS IS" BASIS,
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *  See the License for the specific language governing permissions and
+ *  limitations under the License.
+ */
+
+package org.apache.geronimo.kernel.proxy;
+
+import javax.management.ObjectName;
+
+
+/**
+ * @version $Rev: 71492 $ $Date: 2004-11-14 21:31:50 -0800 (Sun, 14 Nov 2004) $
+ */
+public interface ProxyFactory {
+    Object createProxy(ObjectName target);
+}

Added: geronimo/trunk/modules/kernel/src/java/org/apache/geronimo/kernel/proxy/ProxyInvoker.java
Url: http://svn.apache.org/viewcvs/geronimo/trunk/modules/kernel/src/java/org/apache/geronimo/kernel/proxy/ProxyInvoker.java?view=auto&rev=106387
==============================================================================
--- (empty file)
+++ geronimo/trunk/modules/kernel/src/java/org/apache/geronimo/kernel/proxy/ProxyInvoker.java	Tue Nov 23 22:16:54 2004
@@ -0,0 +1,26 @@
+/**
+ *
+ * Copyright 2004 The Apache Software Foundation
+ *
+ *  Licensed under the Apache License, Version 2.0 (the "License");
+ *  you may not use this file except in compliance with the License.
+ *  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing, software
+ *  distributed under the License is distributed on an "AS IS" BASIS,
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *  See the License for the specific language governing permissions and
+ *  limitations under the License.
+ */
+package org.apache.geronimo.kernel.proxy;
+
+import javax.management.ObjectName;
+
+/**
+ * @version $Rev: 46019 $ $Date: 2004-09-14 02:56:06 -0700 (Tue, 14 Sep 2004) $
+ */
+public interface ProxyInvoker {
+    Object invoke(ObjectName objectName, Object[] arguments) throws Throwable;
+}

Added: geronimo/trunk/modules/kernel/src/java/org/apache/geronimo/kernel/proxy/ProxyManager.java
Url: http://svn.apache.org/viewcvs/geronimo/trunk/modules/kernel/src/java/org/apache/geronimo/kernel/proxy/ProxyManager.java?view=auto&rev=106387
==============================================================================
--- (empty file)
+++ geronimo/trunk/modules/kernel/src/java/org/apache/geronimo/kernel/proxy/ProxyManager.java	Tue Nov 23 22:16:54 2004
@@ -0,0 +1,103 @@
+/**
+ *
+ * Copyright 2004 The Apache Software Foundation
+ *
+ *  Licensed under the Apache License, Version 2.0 (the "License");
+ *  you may not use this file except in compliance with the License.
+ *  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing, software
+ *  distributed under the License is distributed on an "AS IS" BASIS,
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *  See the License for the specific language governing permissions and
+ *  limitations under the License.
+ */
+package org.apache.geronimo.kernel.proxy;
+
+import java.util.IdentityHashMap;
+import javax.management.ObjectName;
+
+import net.sf.cglib.proxy.Callback;
+import net.sf.cglib.proxy.Enhancer;
+import net.sf.cglib.proxy.MethodInterceptor;
+import org.apache.geronimo.kernel.Kernel;
+
+/**
+ * @version $Rev$ $Date$
+ */
+public class ProxyManager {
+    private final Kernel kernel;
+
+    // todo use weak keys for this
+    private final IdentityHashMap interceptors = new IdentityHashMap();
+
+    /**
+     * @deprecated don't use this yet... it may change or go away
+     */
+    public ProxyManager(Kernel kernel) {
+        this.kernel = kernel;
+    }
+
+    public synchronized ProxyFactory createProxyFactory(Class type) {
+        assert type != null: "type is null";
+        return new ManagedProxyFactory(type);
+    }
+
+    public synchronized Object createProxy(ObjectName target, Class type) {
+        assert type != null: "type is null";
+        assert target != null: "target is null";
+
+        return createProxyFactory(type).createProxy(target);
+    }
+
+    public synchronized void destroyProxy(Object proxy) {
+        if (proxy == null) {
+            return;
+        }
+
+        ProxyMethodInterceptor methodInterceptor = (ProxyMethodInterceptor) interceptors.remove(proxy);
+        if (methodInterceptor != null) {
+            methodInterceptor.destroy();
+        }
+    }
+
+    public boolean isProxy(Object proxy) {
+        return interceptors.containsKey(proxy);
+    }
+
+    public synchronized ObjectName getProxyTarget(Object proxy) {
+        ProxyMethodInterceptor methodInterceptor = (ProxyMethodInterceptor) interceptors.remove(proxy);
+        if (methodInterceptor == null) {
+            return null;
+        }
+        return methodInterceptor.getObjectName();
+    }
+
+    private class ManagedProxyFactory implements ProxyFactory {
+        private final Class type;
+        private final Enhancer enhancer;
+
+        public ManagedProxyFactory(Class type) {
+            enhancer = new Enhancer();
+            enhancer.setSuperclass(type);
+            enhancer.setCallbackType(MethodInterceptor.class);
+            enhancer.setUseFactory(false);
+            this.type = enhancer.createClass();
+        }
+
+        public synchronized Object createProxy(ObjectName target) {
+            assert target != null: "target is null";
+
+            ProxyMethodInterceptor interceptor = new ProxyMethodInterceptor(type, kernel, target);
+
+            // @todo trap CodeGenerationException indicating missing no-arg ctr
+            enhancer.setCallbacks(new Callback[]{interceptor});
+            Object proxy = enhancer.create();
+
+            interceptors.put(proxy, interceptor);
+            return proxy;
+        }
+    }
+}

Added: geronimo/trunk/modules/kernel/src/java/org/apache/geronimo/kernel/proxy/ProxyMethodInterceptor.java
Url: http://svn.apache.org/viewcvs/geronimo/trunk/modules/kernel/src/java/org/apache/geronimo/kernel/proxy/ProxyMethodInterceptor.java?view=auto&rev=106387
==============================================================================
--- (empty file)
+++ geronimo/trunk/modules/kernel/src/java/org/apache/geronimo/kernel/proxy/ProxyMethodInterceptor.java	Tue Nov 23 22:16:54 2004
@@ -0,0 +1,306 @@
+/**
+ *
+ * Copyright 2004 The Apache Software Foundation
+ *
+ *  Licensed under the Apache License, Version 2.0 (the "License");
+ *  you may not use this file except in compliance with the License.
+ *  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing, software
+ *  distributed under the License is distributed on an "AS IS" BASIS,
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *  See the License for the specific language governing permissions and
+ *  limitations under the License.
+ */
+package org.apache.geronimo.kernel.proxy;
+
+import java.beans.Introspector;
+import java.lang.reflect.Method;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.Map;
+import javax.management.MBeanAttributeInfo;
+import javax.management.MBeanInfo;
+import javax.management.MBeanOperationInfo;
+import javax.management.ObjectName;
+
+import net.sf.cglib.core.Signature;
+import net.sf.cglib.proxy.MethodInterceptor;
+import net.sf.cglib.proxy.MethodProxy;
+import net.sf.cglib.reflect.FastClass;
+import org.apache.geronimo.gbean.GOperationSignature;
+import org.apache.geronimo.gbean.jmx.GBeanMBean;
+import org.apache.geronimo.gbean.jmx.RawInvoker;
+import org.apache.geronimo.kernel.Kernel;
+import org.objectweb.asm.Type;
+
+/**
+ * @version $Rev: 106345 $ $Date: 2004-11-23 12:37:03 -0800 (Tue, 23 Nov 2004) $
+ */
+public class ProxyMethodInterceptor implements MethodInterceptor {
+    /**
+     * Type of the proxy interface
+     */
+    private final Class proxyType;
+
+    /**
+     * The object name to which we are connected.
+     */
+    private final ObjectName objectName;
+
+    /**
+     * GBeanInvokers keyed on the proxy interface method index
+     */
+    private ProxyInvoker[] gbeanInvokers;
+
+    public ProxyMethodInterceptor(Class proxyType, Kernel kernel, ObjectName objectName) {
+        assert proxyType != null;
+        assert kernel != null;
+        assert objectName != null;
+
+        this.proxyType = proxyType;
+        this.objectName = objectName;
+        gbeanInvokers = createGBeanInvokers(kernel, objectName);
+    }
+
+    public synchronized void destroy() {
+        gbeanInvokers = null;
+    }
+
+    public ObjectName getObjectName() {
+        return objectName;
+    }
+
+    public final Object intercept(final Object object, final Method method, final Object[] args, final MethodProxy proxy) throws Throwable {
+        ProxyInvoker gbeanInvoker;
+
+        int interfaceIndex = proxy.getSuperIndex();
+        synchronized (this) {
+            if (gbeanInvokers == null) {
+                throw new DeadProxyException("Proxy is no longer valid");
+            }
+            gbeanInvoker = gbeanInvokers[interfaceIndex];
+        }
+
+        if (gbeanInvoker == null) {
+            throw new UnsupportedOperationException("No implementation method: objectName=" + objectName + ", method=" + method);
+        }
+
+        return gbeanInvoker.invoke(objectName, args);
+    }
+
+    private ProxyInvoker[] createGBeanInvokers(Kernel kernel, ObjectName objectName) {
+        ProxyInvoker[] invokers;
+        try {
+            RawInvoker rawInvoker = (RawInvoker) kernel.getAttribute(objectName, GBeanMBean.RAW_INVOKER);
+            invokers = createRawGBeanInvokers(rawInvoker, proxyType);
+        } catch (Exception e) {
+            invokers = createKernelGBeanInvokers(kernel, objectName, proxyType);
+        }
+
+        // handle equals, hashCode and toString directly here
+        try {
+            invokers[getSuperIndex(proxyType, proxyType.getMethod("equals", new Class[]{Object.class}))] = new EqualsInvoke(kernel.getProxyManager());
+            invokers[getSuperIndex(proxyType, proxyType.getMethod("hashCode", null))] = new HashCodeInvoke();
+            invokers[getSuperIndex(proxyType, proxyType.getMethod("toString", null))] = new ToStringInvoke(proxyType.getName());
+        } catch (Exception e) {
+            // this can not happen... all classes must implement equals, hashCode and toString
+            throw new AssertionError(e);
+        }
+
+        return invokers;
+    }
+
+    private ProxyInvoker[] createRawGBeanInvokers(RawInvoker rawInvoker, Class proxyType) {
+        Map operations = rawInvoker.getOperationIndex();
+        Map attributes = rawInvoker.getAttributeIndex();
+
+        // build the method lookup table
+        FastClass fastClass = FastClass.create(proxyType);
+        ProxyInvoker[] invokers = new ProxyInvoker[fastClass.getMaxIndex() + 1];
+        Method[] methods = proxyType.getMethods();
+        for (int i = 0; i < methods.length; i++) {
+            Method method = methods[i];
+            int interfaceIndex = getSuperIndex(proxyType, method);
+            if (interfaceIndex >= 0) {
+                invokers[interfaceIndex] = createRawGBeanInvoker(rawInvoker, method, operations, attributes);
+            }
+        }
+
+        return invokers;
+    }
+
+    private ProxyInvoker createRawGBeanInvoker(RawInvoker rawInvoker, Method method, Map operations, Map attributes) {
+        if (operations.containsKey(new GOperationSignature(method))) {
+            int methodIndex = ((Integer) operations.get(new GOperationSignature(method))).intValue();
+            return new RawOperationInvoker(rawInvoker, methodIndex);
+        }
+
+        if (method.getName().startsWith("get")) {
+            String attributeName = method.getName().substring(3);
+            Integer methodIndex = ((Integer) attributes.get(attributeName));
+            if (methodIndex != null) {
+                return new RawGetAttributeInvoker(rawInvoker, methodIndex.intValue());
+            }
+            methodIndex = getMethodIndex(attributes, attributeName);
+            if (methodIndex != null) {
+                return new RawGetAttributeInvoker(rawInvoker, methodIndex.intValue());
+            }
+        }
+
+        if (method.getName().startsWith("is")) {
+            String attributeName = method.getName().substring(2);
+            Integer methodIndex = ((Integer) attributes.get(attributeName));
+            if (methodIndex != null) {
+                return new RawGetAttributeInvoker(rawInvoker, methodIndex.intValue());
+            }
+            methodIndex = getMethodIndex(attributes, attributeName);
+            if (methodIndex != null) {
+                return new RawGetAttributeInvoker(rawInvoker, methodIndex.intValue());
+            }
+        }
+
+        if (method.getName().startsWith("set")) {
+            String attributeName = method.getName().substring(3);
+            Integer methodIndex = ((Integer) attributes.get(attributeName));
+            if (methodIndex != null) {
+                return new RawSetAttributeInvoker(rawInvoker, methodIndex.intValue());
+            }
+            methodIndex = getMethodIndex(attributes, attributeName);
+            if (methodIndex != null) {
+                return new RawSetAttributeInvoker(rawInvoker, methodIndex.intValue());
+            }
+        }
+        return null;
+    }
+
+    private ProxyInvoker[] createKernelGBeanInvokers(Kernel kernel, ObjectName objectName, Class proxyType) {
+        MBeanInfo info;
+        try {
+            // todo convert this over to gbean info
+            info = kernel.getMBeanServer().getMBeanInfo(objectName);
+        } catch (Exception e) {
+            throw new IllegalArgumentException("Could not get MBeanInfo for target object: " + objectName);
+        }
+
+        // build attributeName->attributeInfo map
+        MBeanAttributeInfo[] attributeInfos = info.getAttributes();
+        Map attributes = new HashMap(attributeInfos.length);
+        for (int i = 0; i < attributeInfos.length; i++) {
+            MBeanAttributeInfo attributeInfo = attributeInfos[i];
+            attributes.put(attributeInfo.getName(), attributeInfo);
+        }
+
+        // build operationName->operationInfo map
+        MBeanOperationInfo[] operationInfos = info.getOperations();
+        Map operations = new HashMap(operationInfos.length);
+        for (int i = 0; i < operationInfos.length; i++) {
+            MBeanOperationInfo operationInfo = operationInfos[i];
+            operations.put(new GOperationSignature(operationInfo), operationInfo);
+        }
+
+        // build the method lookup table
+        FastClass fastClass = FastClass.create(proxyType);
+        ProxyInvoker[] invokers = new ProxyInvoker[fastClass.getMaxIndex() + 1];
+        Method[] methods = proxyType.getMethods();
+        for (int i = 0; i < methods.length; i++) {
+            Method method = methods[i];
+            int interfaceIndex = getSuperIndex(proxyType, method);
+            if (interfaceIndex >= 0) {
+                invokers[interfaceIndex] = createJMXGBeanInvoker(kernel, method, operations, attributes);
+            }
+        }
+
+        return invokers;
+    }
+
+    private ProxyInvoker createJMXGBeanInvoker(Kernel kernel, Method method, Map operations, Map attributes) {
+        if (operations.containsKey(new GOperationSignature(method))) {
+            return new KernelOperationInvoker(kernel, method);
+        }
+
+        String name = method.getName();
+        if (name.startsWith("get")) {
+            String attrName = method.getName().substring(3);
+            if (attributes.containsKey(attrName)) {
+                return new KernelGetAttributeInvoker(kernel, attrName);
+            }
+            attrName = Introspector.decapitalize(attrName);
+            if (attributes.containsKey(attrName)) {
+                return new KernelGetAttributeInvoker(kernel, attrName);
+            }
+        } else if (name.startsWith("is")) {
+            String attrName = method.getName().substring(2);
+            if (attributes.containsKey(attrName)) {
+                return new KernelGetAttributeInvoker(kernel, attrName);
+            }
+            attrName = Introspector.decapitalize(attrName);
+            if (attributes.containsKey(attrName)) {
+                return new KernelGetAttributeInvoker(kernel, attrName);
+            }
+        } else if (name.startsWith("set")) {
+            String attrName = method.getName().substring(3);
+            if (attributes.containsKey(attrName)) {
+                return new KernelSetAttributeInvoker(kernel, attrName);
+            }
+            attrName = Introspector.decapitalize(attrName);
+            if (attributes.containsKey(attrName)) {
+                return new KernelSetAttributeInvoker(kernel, attrName);
+            }
+        }
+        return null;
+    }
+
+    private static int getSuperIndex(Class proxyType, Method method) {
+        Signature signature = new Signature(method.getName(), Type.getReturnType(method), Type.getArgumentTypes(method));
+        MethodProxy methodProxy = MethodProxy.find(proxyType, signature);
+        if (methodProxy != null) {
+            return methodProxy.getSuperIndex();
+        }
+        return -1;
+    }
+
+    private static Integer getMethodIndex(Map attributes, String attributeName) {
+        Iterator iter = attributes.keySet().iterator();
+        while (iter.hasNext()) {
+            String key = (String) iter.next();
+            if (key.equalsIgnoreCase(attributeName)) {
+                return (Integer) attributes.get(key);
+            }
+        }
+        return null;
+    }
+
+    static final class HashCodeInvoke implements ProxyInvoker {
+        public Object invoke(ObjectName objectName, Object[] arguments) throws Throwable {
+            return new Integer(objectName.hashCode());
+        }
+    }
+
+    static final class EqualsInvoke implements ProxyInvoker {
+        private final ProxyManager proxyManager;
+
+        public EqualsInvoke(ProxyManager proxyManager) {
+            this.proxyManager = proxyManager;
+        }
+
+        public Object invoke(ObjectName objectName, Object[] arguments) throws Throwable {
+            ObjectName proxyTarget = proxyManager.getProxyTarget(arguments[0]);
+            return Boolean.valueOf(objectName.equals(proxyTarget));
+        }
+    }
+
+    static final class ToStringInvoke implements ProxyInvoker {
+        private final String interfaceName;
+
+        public ToStringInvoke(String interfaceName) {
+            this.interfaceName = "[" + interfaceName + ": ";
+        }
+
+        public Object invoke(ObjectName objectName, Object[] arguments) throws Throwable {
+            return interfaceName + objectName + "]";
+        }
+    }
+}

Added: geronimo/trunk/modules/kernel/src/java/org/apache/geronimo/kernel/proxy/RawGetAttributeInvoker.java
Url: http://svn.apache.org/viewcvs/geronimo/trunk/modules/kernel/src/java/org/apache/geronimo/kernel/proxy/RawGetAttributeInvoker.java?view=auto&rev=106387
==============================================================================
--- (empty file)
+++ geronimo/trunk/modules/kernel/src/java/org/apache/geronimo/kernel/proxy/RawGetAttributeInvoker.java	Tue Nov 23 22:16:54 2004
@@ -0,0 +1,38 @@
+/**
+ *
+ * Copyright 2004 The Apache Software Foundation
+ *
+ *  Licensed under the Apache License, Version 2.0 (the "License");
+ *  you may not use this file except in compliance with the License.
+ *  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing, software
+ *  distributed under the License is distributed on an "AS IS" BASIS,
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *  See the License for the specific language governing permissions and
+ *  limitations under the License.
+ */
+package org.apache.geronimo.kernel.proxy;
+
+import javax.management.ObjectName;
+
+import org.apache.geronimo.gbean.jmx.RawInvoker;
+
+/**
+ * @version $Rev: 46019 $ $Date: 2004-09-14 02:56:06 -0700 (Tue, 14 Sep 2004) $
+ */
+public final class RawGetAttributeInvoker implements ProxyInvoker {
+    private final RawInvoker rawInvoker;
+    private final int methodIndex;
+
+    public RawGetAttributeInvoker(RawInvoker rawInvoker, int methodIndex) {
+        this.rawInvoker = rawInvoker;
+        this.methodIndex = methodIndex;
+    }
+
+    public Object invoke(final ObjectName objectName, final Object[] arguments) throws Throwable {
+        return rawInvoker.getAttribute(methodIndex);
+    }
+}

Added: geronimo/trunk/modules/kernel/src/java/org/apache/geronimo/kernel/proxy/RawOperationInvoker.java
Url: http://svn.apache.org/viewcvs/geronimo/trunk/modules/kernel/src/java/org/apache/geronimo/kernel/proxy/RawOperationInvoker.java?view=auto&rev=106387
==============================================================================
--- (empty file)
+++ geronimo/trunk/modules/kernel/src/java/org/apache/geronimo/kernel/proxy/RawOperationInvoker.java	Tue Nov 23 22:16:54 2004
@@ -0,0 +1,38 @@
+/**
+ *
+ * Copyright 2004 The Apache Software Foundation
+ *
+ *  Licensed under the Apache License, Version 2.0 (the "License");
+ *  you may not use this file except in compliance with the License.
+ *  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing, software
+ *  distributed under the License is distributed on an "AS IS" BASIS,
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *  See the License for the specific language governing permissions and
+ *  limitations under the License.
+ */
+package org.apache.geronimo.kernel.proxy;
+
+import javax.management.ObjectName;
+
+import org.apache.geronimo.gbean.jmx.RawInvoker;
+
+/**
+ * @version $Rev: 46019 $ $Date: 2004-09-14 02:56:06 -0700 (Tue, 14 Sep 2004) $
+ */
+public final class RawOperationInvoker implements ProxyInvoker {
+    private final RawInvoker rawInvoker;
+    private final int methodIndex;
+
+    public RawOperationInvoker(RawInvoker rawInvoker, int methodIndex) {
+        this.rawInvoker = rawInvoker;
+        this.methodIndex = methodIndex;
+    }
+
+    public Object invoke(final ObjectName objectName, final Object[] arguments) throws Throwable {
+        return rawInvoker.invoke(methodIndex, arguments);
+    }
+}

Added: geronimo/trunk/modules/kernel/src/java/org/apache/geronimo/kernel/proxy/RawSetAttributeInvoker.java
Url: http://svn.apache.org/viewcvs/geronimo/trunk/modules/kernel/src/java/org/apache/geronimo/kernel/proxy/RawSetAttributeInvoker.java?view=auto&rev=106387
==============================================================================
--- (empty file)
+++ geronimo/trunk/modules/kernel/src/java/org/apache/geronimo/kernel/proxy/RawSetAttributeInvoker.java	Tue Nov 23 22:16:54 2004
@@ -0,0 +1,39 @@
+/**
+ *
+ * Copyright 2004 The Apache Software Foundation
+ *
+ *  Licensed under the Apache License, Version 2.0 (the "License");
+ *  you may not use this file except in compliance with the License.
+ *  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing, software
+ *  distributed under the License is distributed on an "AS IS" BASIS,
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *  See the License for the specific language governing permissions and
+ *  limitations under the License.
+ */
+package org.apache.geronimo.kernel.proxy;
+
+import javax.management.ObjectName;
+
+import org.apache.geronimo.gbean.jmx.RawInvoker;
+
+/**
+ * @version $Rev: 46019 $ $Date: 2004-09-14 02:56:06 -0700 (Tue, 14 Sep 2004) $
+ */
+public final class RawSetAttributeInvoker implements ProxyInvoker {
+    private final RawInvoker rawInvoker;
+    private final int methodIndex;
+
+    public RawSetAttributeInvoker(RawInvoker rawInvoker, int methodIndex) {
+        this.rawInvoker = rawInvoker;
+        this.methodIndex = methodIndex;
+    }
+
+    public Object invoke(final ObjectName objectName, final Object[] arguments) throws Throwable {
+        rawInvoker.setAttribute(methodIndex, arguments[0]);
+        return null;
+    }
+}

Modified: geronimo/trunk/modules/kernel/src/test/org/apache/geronimo/gbean/Speed.java
Url: http://svn.apache.org/viewcvs/geronimo/trunk/modules/kernel/src/test/org/apache/geronimo/gbean/Speed.java?view=diff&rev=106387&p1=geronimo/trunk/modules/kernel/src/test/org/apache/geronimo/gbean/Speed.java&r1=106386&p2=geronimo/trunk/modules/kernel/src/test/org/apache/geronimo/gbean/Speed.java&r2=106387
==============================================================================
--- geronimo/trunk/modules/kernel/src/test/org/apache/geronimo/gbean/Speed.java	(original)
+++ geronimo/trunk/modules/kernel/src/test/org/apache/geronimo/gbean/Speed.java	Tue Nov 23 22:16:54 2004
@@ -20,20 +20,13 @@
  * @version $Rev$ $Date$
  */
 import java.lang.reflect.Method;
-
 import javax.management.ObjectName;
 
 import net.sf.cglib.reflect.FastClass;
-import net.sf.cglib.proxy.MethodProxy;
-import org.apache.geronimo.gbean.jmx.CGLibProxyFactory;
-import org.apache.geronimo.gbean.jmx.ProxyFactory;
-import org.apache.geronimo.gbean.jmx.ProxyMethodInterceptor;
-import org.apache.geronimo.gbean.jmx.VMProxyFactory;
 import org.apache.geronimo.gbean.jmx.GBeanMBean;
-import org.apache.geronimo.gbean.jmx.CGLibMethodInterceptor;
-import org.apache.geronimo.gbean.jmx.RawInvoker;
-import org.apache.geronimo.kernel.MockGBean;
 import org.apache.geronimo.kernel.Kernel;
+import org.apache.geronimo.kernel.MockGBean;
+import org.apache.geronimo.gbean.jmx.RawInvoker;
 
 /**
  * @version $Rev$ $Date$
@@ -112,27 +105,27 @@
         kernel.startGBean(objectName);
 
         // reflect proxy
-        ProxyFactory vmProxyFactory = new VMProxyFactory(MyInterface.class);
-        ProxyMethodInterceptor vmMethodInterceptor = vmProxyFactory.getMethodInterceptor();
-        MyInterface vmProxy = (MyInterface) vmProxyFactory.create(vmMethodInterceptor);
-        vmMethodInterceptor.connect(kernel.getMBeanServer(), objectName);
-        iterations = 50000;
-        for (int i = 0; i < iterations; i++) {
-            vmProxy.doNothing();
-        }
-        start = System.currentTimeMillis();
-        for (int i = 0; i < iterations; i++) {
-            vmProxy.doNothing();
-        }
-        end = System.currentTimeMillis();
-        printResults("ReflectionProxy", end, start, iterations);
+//        ProxyFactory vmProxyFactory = new VMProxyFactory(MyInterface.class);
+//        ProxyMethodInterceptor vmMethodInterceptor = vmProxyFactory.getMethodInterceptor();
+//        MyInterface vmProxy = (MyInterface) vmProxyFactory.create(vmMethodInterceptor);
+//        vmMethodInterceptor.connect(kernel.getMBeanServer(), objectName);
+//        iterations = 50000;
+//        for (int i = 0; i < iterations; i++) {
+//            vmProxy.doNothing();
+//        }
+//        start = System.currentTimeMillis();
+//        for (int i = 0; i < iterations; i++) {
+//            vmProxy.doNothing();
+//        }
+//        end = System.currentTimeMillis();
+//        printResults("ReflectionProxy", end, start, iterations);
 
         // cglib proxy (front half)
 /*
         ProxyFactory frontCGLibProxyFactory = new CGLibProxyFactory(MyInterface.class);
-        ProxyMethodInterceptor frontCGLibMethodInterceptor = new CGLibMethodInterceptor(MyInterface.class);
+        ProxyMethodInterceptor frontCGLibMethodInterceptor = new ProxyMethodInterceptor(MyInterface.class);
         Class enhancedType = frontCGLibProxyFactory.create(frontCGLibMethodInterceptor).getClass();
-        frontCGLibMethodInterceptor = new CGLibMethodInterceptor(enhancedType) {
+        frontCGLibMethodInterceptor = new ProxyMethodInterceptor(enhancedType) {
             public Object intercept(Object object, Method method, Object[] args, MethodProxy proxy) throws Throwable {
                 return null;
             }
@@ -165,21 +158,21 @@
         end = System.currentTimeMillis();
         printResults("Raw Invoker", end, start, iterations);
 
-        // cglib proxy
-        ProxyFactory cgLibProxyFactory = new CGLibProxyFactory(MyInterface.class);
-        ProxyMethodInterceptor cgLibMethodInterceptor = cgLibProxyFactory.getMethodInterceptor();
-        MyInterface cgLibProxy = (MyInterface) cgLibProxyFactory.create(cgLibMethodInterceptor);
-        cgLibMethodInterceptor.connect(kernel.getMBeanServer(), objectName);
-        iterations = 1000000;
-        for (int i = 0; i < iterations; i++) {
-            cgLibProxy.doNothing();
-        }
-        start = System.currentTimeMillis();
-        for (int i = 0; i < iterations; i++) {
-            cgLibProxy.doNothing();
-        }
-        end = System.currentTimeMillis();
-        printResults("CGLibProxy", end, start, iterations);
+//        // cglib proxy
+//        ProxyFactory cgLibProxyFactory = new CGLibProxyFactory(MyInterface.class);
+//        ProxyMethodInterceptor cgLibMethodInterceptor = cgLibProxyFactory.getMethodInterceptor();
+//        MyInterface cgLibProxy = (MyInterface) cgLibProxyFactory.create(cgLibMethodInterceptor);
+//        cgLibMethodInterceptor.connect(kernel.getMBeanServer(), objectName);
+//        iterations = 1000000;
+//        for (int i = 0; i < iterations; i++) {
+//            cgLibProxy.doNothing();
+//        }
+//        start = System.currentTimeMillis();
+//        for (int i = 0; i < iterations; i++) {
+//            cgLibProxy.doNothing();
+//        }
+//        end = System.currentTimeMillis();
+//        printResults("CGLibProxy", end, start, iterations);
     }
 
 
@@ -242,36 +235,36 @@
         kernel.startGBean(objectName);
 
         // reflect proxy
-        ProxyFactory vmProxyFactory = new VMProxyFactory(MyInterface.class);
-        ProxyMethodInterceptor vmMethodInterceptor = vmProxyFactory.getMethodInterceptor();
-        MyInterface vmProxy = (MyInterface) vmProxyFactory.create(vmMethodInterceptor);
-        vmMethodInterceptor.connect(kernel.getMBeanServer(), objectName);
-        iterations = 50000;
-        for (int i = 0; i < iterations; i++) {
-            result = vmProxy.echo(msg);
-        }
-        start = System.currentTimeMillis();
-        for (int i = 0; i < iterations; i++) {
-            result = vmProxy.echo(msg);
-        }
-        end = System.currentTimeMillis();
-        printResults("ReflectionProxy", end, start, iterations);
-
-        // cglib proxy
-        ProxyFactory cgLibProxyFactory = new CGLibProxyFactory(MyInterface.class);
-        ProxyMethodInterceptor cgLibMethodInterceptor = cgLibProxyFactory.getMethodInterceptor();
-        MyInterface cgLibProxy = (MyInterface) cgLibProxyFactory.create(cgLibMethodInterceptor);
-        cgLibMethodInterceptor.connect(kernel.getMBeanServer(), objectName);
-        iterations = 1000000;
-        for (int i = 0; i < iterations; i++) {
-            result = cgLibProxy.echo(msg);
-        }
-        start = System.currentTimeMillis();
-        for (int i = 0; i < iterations; i++) {
-            result = cgLibProxy.echo(msg);
-        }
-        end = System.currentTimeMillis();
-        printResults("CGLibProxy", end, start, iterations);
+//        ProxyFactory vmProxyFactory = new VMProxyFactory(MyInterface.class);
+//        ProxyMethodInterceptor vmMethodInterceptor = vmProxyFactory.getMethodInterceptor();
+//        MyInterface vmProxy = (MyInterface) vmProxyFactory.create(vmMethodInterceptor);
+//        vmMethodInterceptor.connect(kernel.getMBeanServer(), objectName);
+//        iterations = 50000;
+//        for (int i = 0; i < iterations; i++) {
+//            result = vmProxy.echo(msg);
+//        }
+//        start = System.currentTimeMillis();
+//        for (int i = 0; i < iterations; i++) {
+//            result = vmProxy.echo(msg);
+//        }
+//        end = System.currentTimeMillis();
+//        printResults("ReflectionProxy", end, start, iterations);
+
+//        // cglib proxy
+//        ProxyFactory cgLibProxyFactory = new CGLibProxyFactory(MyInterface.class);
+//        ProxyMethodInterceptor cgLibMethodInterceptor = cgLibProxyFactory.getMethodInterceptor();
+//        MyInterface cgLibProxy = (MyInterface) cgLibProxyFactory.create(cgLibMethodInterceptor);
+//        cgLibMethodInterceptor.connect(kernel.getMBeanServer(), objectName);
+//        iterations = 1000000;
+//        for (int i = 0; i < iterations; i++) {
+//            result = cgLibProxy.echo(msg);
+//        }
+//        start = System.currentTimeMillis();
+//        for (int i = 0; i < iterations; i++) {
+//            result = cgLibProxy.echo(msg);
+//        }
+//        end = System.currentTimeMillis();
+//        printResults("CGLibProxy", end, start, iterations);
     }
 
     private static void printResults(String invocationType, long end, long start, int iterations) {

Modified: geronimo/trunk/modules/remoting/src/test/org/apache/geronimo/remoting/JMXRemotingTest.java
Url: http://svn.apache.org/viewcvs/geronimo/trunk/modules/remoting/src/test/org/apache/geronimo/remoting/JMXRemotingTest.java?view=diff&rev=106387&p1=geronimo/trunk/modules/remoting/src/test/org/apache/geronimo/remoting/JMXRemotingTest.java&r1=106386&p2=geronimo/trunk/modules/remoting/src/test/org/apache/geronimo/remoting/JMXRemotingTest.java&r2=106387
==============================================================================
--- geronimo/trunk/modules/remoting/src/test/org/apache/geronimo/remoting/JMXRemotingTest.java	(original)
+++ geronimo/trunk/modules/remoting/src/test/org/apache/geronimo/remoting/JMXRemotingTest.java	Tue Nov 23 22:16:54 2004
@@ -17,18 +17,15 @@
 
 package org.apache.geronimo.remoting;
 
-import javax.management.ObjectName;
-import javax.management.MBeanServer;
 import java.net.URI;
 import java.util.Collections;
+import javax.management.MBeanServer;
+import javax.management.ObjectName;
 
 import junit.framework.TestCase;
 import org.apache.geronimo.gbean.jmx.GBeanMBean;
 import org.apache.geronimo.kernel.Kernel;
-import org.apache.geronimo.kernel.jmx.MBeanProxyFactory;
-import org.apache.geronimo.remoting.MarshalledObject;
 import org.apache.geronimo.remoting.jmx.RemoteMBeanServerFactory;
-import org.apache.geronimo.remoting.transport.TransportLoader;
 import org.apache.geronimo.remoting.transport.BytesMarshalledObject;
 
 
@@ -78,8 +75,7 @@
         kernel.startGBean(jmxRouter);
         kernel.startGBean(serverStub);
 
-        TransportLoader bean = (TransportLoader) MBeanProxyFactory.getProxy(TransportLoader.class, kernel.getMBeanServer(), asyncTransport);
-        connectURI = bean.getClientConnectURI();
+        connectURI = (URI) kernel.getAttribute(asyncTransport, "clientConnectURI"); 
 
         // simulate remote copy of handle
         MarshalledObject mo = new BytesMarshalledObject(RemoteMBeanServerFactory.create(connectURI.getHost(), connectURI.getPort()));

Modified: geronimo/trunk/modules/security/src/java/org/apache/geronimo/security/jaas/JaasLoginCoordinator.java
Url: http://svn.apache.org/viewcvs/geronimo/trunk/modules/security/src/java/org/apache/geronimo/security/jaas/JaasLoginCoordinator.java?view=diff&rev=106387&p1=geronimo/trunk/modules/security/src/java/org/apache/geronimo/security/jaas/JaasLoginCoordinator.java&r1=106386&p2=geronimo/trunk/modules/security/src/java/org/apache/geronimo/security/jaas/JaasLoginCoordinator.java&r2=106387
==============================================================================
--- geronimo/trunk/modules/security/src/java/org/apache/geronimo/security/jaas/JaasLoginCoordinator.java	(original)
+++ geronimo/trunk/modules/security/src/java/org/apache/geronimo/security/jaas/JaasLoginCoordinator.java	Tue Nov 23 22:16:54 2004
@@ -16,17 +16,23 @@
  */
 package org.apache.geronimo.security.jaas;
 
-import org.apache.geronimo.security.remoting.jmx.JaasLoginServiceRemotingClient;
-import org.apache.geronimo.kernel.Kernel;
-import org.apache.geronimo.kernel.jmx.MBeanProxyFactory;
-
-import javax.security.auth.spi.LoginModule;
+import java.security.Principal;
+import java.util.ArrayList;
+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 javax.security.auth.Subject;
-import javax.security.auth.login.LoginException;
-import javax.security.auth.callback.CallbackHandler;
 import javax.security.auth.callback.Callback;
-import java.util.*;
-import java.security.Principal;
+import javax.security.auth.callback.CallbackHandler;
+import javax.security.auth.login.LoginException;
+import javax.security.auth.spi.LoginModule;
+
+import org.apache.geronimo.kernel.Kernel;
+import org.apache.geronimo.kernel.jmx.MBeanProxyFactory;
+import org.apache.geronimo.security.remoting.jmx.JaasLoginServiceRemotingClient;
 
 /**
  * A LoginModule implementation which connects to a Geronimo server under

Modified: geronimo/trunk/modules/security/src/java/org/apache/geronimo/security/realm/GenericSecurityRealm.java
Url: http://svn.apache.org/viewcvs/geronimo/trunk/modules/security/src/java/org/apache/geronimo/security/realm/GenericSecurityRealm.java?view=diff&rev=106387&p1=geronimo/trunk/modules/security/src/java/org/apache/geronimo/security/realm/GenericSecurityRealm.java&r1=106386&p2=geronimo/trunk/modules/security/src/java/org/apache/geronimo/security/realm/GenericSecurityRealm.java&r2=106387
==============================================================================
--- geronimo/trunk/modules/security/src/java/org/apache/geronimo/security/realm/GenericSecurityRealm.java	(original)
+++ geronimo/trunk/modules/security/src/java/org/apache/geronimo/security/realm/GenericSecurityRealm.java	Tue Nov 23 22:16:54 2004
@@ -16,26 +16,25 @@
  */
 package org.apache.geronimo.security.realm;
 
-import javax.management.MalformedObjectNameException;
-import javax.management.ObjectName;
 import java.util.ArrayList;
+import java.util.Collections;
 import java.util.Enumeration;
 import java.util.HashMap;
 import java.util.HashSet;
+import java.util.Iterator;
 import java.util.List;
 import java.util.Map;
 import java.util.Properties;
 import java.util.Set;
-import java.util.Collections;
-import java.util.Iterator;
 import javax.management.MalformedObjectNameException;
 import javax.management.ObjectName;
 import javax.security.auth.spi.LoginModule;
+
 import org.apache.geronimo.common.GeronimoSecurityException;
 import org.apache.geronimo.gbean.GBeanInfo;
 import org.apache.geronimo.gbean.GBeanInfoBuilder;
 import org.apache.geronimo.kernel.Kernel;
-import org.apache.geronimo.kernel.jmx.MBeanProxyFactory;
+import org.apache.geronimo.kernel.proxy.ProxyManager;
 import org.apache.geronimo.security.deploy.Principal;
 import org.apache.geronimo.security.jaas.ConfigurationEntryFactory;
 import org.apache.geronimo.security.jaas.JaasLoginCoordinator;
@@ -221,6 +220,7 @@
         Set domains = new HashSet();
         List list = new ArrayList();
         LoginModuleControlFlagEditor editor = new LoginModuleControlFlagEditor();
+        ProxyManager proxyManager = kernel.getProxyManager();
         while (true) {
             boolean found = false;
             String prefix = "LoginModule." + i + ".";
@@ -230,31 +230,36 @@
                     String flagName = key.substring(prefix.length()).toUpperCase();
                     editor.setAsText(flagName);
                     LoginModuleControlFlag flag = (LoginModuleControlFlag) editor.getValue();
-                    LoginModuleGBean module = (LoginModuleGBean) MBeanProxyFactory.getProxy(LoginModuleGBean.class, kernel.getMBeanServer(), new ObjectName(props.getProperty(key)));
-                    Map options = module.getOptions();
-                    if (options != null) {
-                        options = new HashMap(options);
-                    } else {
-                        options = new HashMap();
-                    }
-                    if (kernel != null && !options.containsKey(KERNEL_LM_OPTION)) {
-                        options.put(KERNEL_LM_OPTION, kernel.getKernelName());
-                    }
-                    if (serverInfo != null && !options.containsKey(SERVERINFO_LM_OPTION)) {
-                        options.put(SERVERINFO_LM_OPTION, serverInfo);
-                    }
-                    if (classLoader != null && !options.containsKey(CLASSLOADER_LM_OPTION)) {
-                        options.put(CLASSLOADER_LM_OPTION, classLoader);
-                    }
-                    if(module.getLoginDomainName() != null) {
-                        if(domains.contains(module.getLoginDomainName())) {
-                            throw new IllegalStateException("Error in "+realmName+": one security realm cannot contain multiple login modules for the same login domain");
+                    LoginModuleGBean module = null;
+                    try {
+                        module = (LoginModuleGBean) proxyManager.createProxy(new ObjectName(props.getProperty(key)), LoginModuleGBean.class);
+                        Map options = module.getOptions();
+                        if (options != null) {
+                            options = new HashMap(options);
                         } else {
-                            domains.add(module.getLoginDomainName());
+                            options = new HashMap();
+                        }
+                        if (kernel != null && !options.containsKey(KERNEL_LM_OPTION)) {
+                            options.put(KERNEL_LM_OPTION, kernel.getKernelName());
+                        }
+                        if (serverInfo != null && !options.containsKey(SERVERINFO_LM_OPTION)) {
+                            options.put(SERVERINFO_LM_OPTION, serverInfo);
+                        }
+                        if (classLoader != null && !options.containsKey(CLASSLOADER_LM_OPTION)) {
+                            options.put(CLASSLOADER_LM_OPTION, classLoader);
+                        }
+                        if(module.getLoginDomainName() != null) {
+                            if(domains.contains(module.getLoginDomainName())) {
+                                throw new IllegalStateException("Error in "+realmName+": one security realm cannot contain multiple login modules for the same login domain");
+                            } else {
+                                domains.add(module.getLoginDomainName());
+                            }
                         }
+                        JaasLoginModuleConfiguration config = new JaasLoginModuleConfiguration(module.getLoginModuleClass(), flag, options, module.isServerSide(), module.getLoginDomainName());
+                        list.add(config);
+                    } finally {
+                        proxyManager.destroyProxy(module);
                     }
-                    JaasLoginModuleConfiguration config = new JaasLoginModuleConfiguration(module.getLoginModuleClass(), flag, options, module.isServerSide(), module.getLoginDomainName());
-                    list.add(config);
                     ++i;
                     found = true;
                     break;

Modified: geronimo/trunk/modules/security/src/test/org/apache/geronimo/security/remoting/jmx/RemoteLoginTest.java
Url: http://svn.apache.org/viewcvs/geronimo/trunk/modules/security/src/test/org/apache/geronimo/security/remoting/jmx/RemoteLoginTest.java?view=diff&rev=106387&p1=geronimo/trunk/modules/security/src/test/org/apache/geronimo/security/remoting/jmx/RemoteLoginTest.java&r1=106386&p2=geronimo/trunk/modules/security/src/test/org/apache/geronimo/security/remoting/jmx/RemoteLoginTest.java&r2=106387
==============================================================================
--- geronimo/trunk/modules/security/src/test/org/apache/geronimo/security/remoting/jmx/RemoteLoginTest.java	(original)
+++ geronimo/trunk/modules/security/src/test/org/apache/geronimo/security/remoting/jmx/RemoteLoginTest.java	Tue Nov 23 22:16:54 2004
@@ -34,8 +34,6 @@
 import junit.framework.TestCase;
 import org.apache.geronimo.gbean.jmx.GBeanMBean;
 import org.apache.geronimo.kernel.Kernel;
-import org.apache.geronimo.kernel.jmx.MBeanProxyFactory;
-import org.apache.geronimo.remoting.transport.TransportLoader;
 import org.apache.geronimo.security.IdentificationPrincipal;
 import org.apache.geronimo.security.RealmPrincipal;
 import org.apache.geronimo.security.jaas.JaasLoginServiceMBean;
@@ -182,16 +180,13 @@
         kernel.startGBean(secureJmxRouter);
         kernel.startGBean(serverStub);
 
-        TransportLoader bean = (TransportLoader) MBeanProxyFactory.getProxy(TransportLoader.class, kernel.getMBeanServer(), asyncTransport);
-        URI connectURI = bean.getClientConnectURI();
+        URI connectURI = (URI) kernel.getAttribute(asyncTransport, "clientConnectURI");
         asyncRemoteProxy = JaasLoginServiceRemotingClient.create(connectURI.getHost(), connectURI.getPort());
 
-        bean = (TransportLoader) MBeanProxyFactory.getProxy(TransportLoader.class, kernel.getMBeanServer(), saslTransport);
-        connectURI = bean.getClientConnectURI();
+        connectURI = (URI) kernel.getAttribute(saslTransport, "clientConnectURI");
         saslRemoteProxy = JaasLoginServiceRemotingClient.create(connectURI.getHost(), connectURI.getPort());
 
-        bean = (TransportLoader) MBeanProxyFactory.getProxy(TransportLoader.class, kernel.getMBeanServer(), gssapiTransport);
-        connectURI = bean.getClientConnectURI();
+        connectURI = (URI) kernel.getAttribute(gssapiTransport, "clientConnectURI");
         gssapiRemoteProxy = JaasLoginServiceRemotingClient.create(connectURI.getHost(), connectURI.getPort());
     }