Can we plz use the new m2 layout?

--jason


On Sep 29, 2006, at 1:14 PM, [EMAIL PROTECTED] wrote:

Author: dain
Date: Fri Sep 29 13:13:59 2006
New Revision: 451419

URL: http://svn.apache.org/viewvc?view=rev&rev=451419
Log:
Added ResourceBindings and EjbBindings.
Added support for duplicate bindings to the same name - basically we create a wating queue and when the current binding unregisters the next in the queue gets registered.
Fixed several bugs in cleanup code.

Added:
geronimo/sandbox/plugins/global-jndi/src/java/org/apache/ geronimo/gjndi/binding/ geronimo/sandbox/plugins/global-jndi/src/java/org/apache/ geronimo/gjndi/binding/EjbBindings.java geronimo/sandbox/plugins/global-jndi/src/java/org/apache/ geronimo/gjndi/binding/ResourceBindings.java geronimo/sandbox/plugins/global-jndi/src/test/org/apache/ geronimo/gjndi/binding/ geronimo/sandbox/plugins/global-jndi/src/test/org/apache/ geronimo/gjndi/binding/ResourceBindingsTest.java
Modified:
    geronimo/sandbox/plugins/global-jndi/pom.xml
geronimo/sandbox/plugins/global-jndi/src/java/org/apache/ geronimo/gjndi/KernelContextGBean.java

Modified: geronimo/sandbox/plugins/global-jndi/pom.xml
URL: http://svn.apache.org/viewvc/geronimo/sandbox/plugins/global- jndi/pom.xml?view=diff&rev=451419&r1=451418&r2=451419 ====================================================================== ========
--- geronimo/sandbox/plugins/global-jndi/pom.xml (original)
+++ geronimo/sandbox/plugins/global-jndi/pom.xml Fri Sep 29 13:13:59 2006
@@ -36,7 +36,7 @@
         <dependency>
             <groupId>org.apache.xbean</groupId>
             <artifactId>xbean-naming</artifactId>
-            <version>COL-SNAPSHOT</version>
+            <version>2.7-SNAPSHOT</version>
         </dependency>
         <dependency>
             <groupId>org.apache.geronimo.modules</groupId>
@@ -47,6 +47,17 @@
             <groupId>backport-util-concurrent</groupId>
             <artifactId>backport-util-concurrent</artifactId>
         </dependency>
+        <dependency>
+            <groupId>org.apache.geronimo.modules</groupId>
+            <artifactId>geronimo-connector</artifactId>
+            <version>${pom.version}</version>
+            <optional>true</optional>
+        </dependency>
+        <!--<dependency>-->
+            <!--<groupId>org.openejb</groupId>-->
+            <!--<artifactId>openejb-core</artifactId>-->
+            <!--<optional>true</optional>-->
+        <!--</dependency>-->
     </dependencies>
     <repositories>
         <!-- keep the central repo so that it is first tried -->

Modified: geronimo/sandbox/plugins/global-jndi/src/java/org/apache/ geronimo/gjndi/KernelContextGBean.java URL: http://svn.apache.org/viewvc/geronimo/sandbox/plugins/global- jndi/src/java/org/apache/geronimo/gjndi/KernelContextGBean.java? view=diff&rev=451419&r1=451418&r2=451419 ====================================================================== ======== --- geronimo/sandbox/plugins/global-jndi/src/java/org/apache/ geronimo/gjndi/KernelContextGBean.java (original) +++ geronimo/sandbox/plugins/global-jndi/src/java/org/apache/ geronimo/gjndi/KernelContextGBean.java Fri Sep 29 13:13:59 2006
@@ -34,7 +34,9 @@
 import javax.naming.NamingException;
 import java.util.Collections;
 import java.util.HashMap;
+import java.util.HashSet;
 import java.util.Iterator;
+import java.util.LinkedHashMap;
 import java.util.Map;
 import java.util.Set;

@@ -81,12 +83,10 @@

     private synchronized void destroy() {
kernel.getLifecycleMonitor().removeLifecycleListener (listener); - for (Iterator iterator = bindingsByAbstractName.values ().iterator(); iterator.hasNext();) {
-            try {
-                Name name = (Name) iterator.next();
-                removeDeepBinding(name, true);
-            } catch (NamingException ignored) {
-            }
+ Set abstractNames = new HashSet (bindingsByAbstractName.keySet()); + for (Iterator iterator = abstractNames.iterator(); iterator.hasNext();) { + AbstractName abstractName = (AbstractName) iterator.next();
+            removeBinding(abstractName);
         }
         bindingsByAbstractName.clear();
     }
@@ -119,53 +119,128 @@

     /**
* Binds the specified gbean. This method uses createBindingName and preprocessValue before binding the object.
+     *
      * @param abstractName the abstract name of the gbean to bind
      * @throws NamingException if an error occurs during binding
      */
protected synchronized void addBinding(AbstractName abstractName) throws NamingException {
+        if (bindingsByAbstractName.containsKey(abstractName)) {
+            // previously bound
+            return;
+        }
+
         // get the gbean
-        Object value = null;
+        Object instance = null;
         try {
-            value = kernel.getGBean(abstractName);
+            instance = kernel.getGBean(abstractName);
         } catch (GBeanNotFoundException e) {
throw new NamingException("GBean not found: " + abstractName);
         }

-        // generate a name for this binding
-        Name name = createBindingName(abstractName, value);
-        if (name == null) return;
-
-        // give sub classes a chance to preprocess the value
-        value = preprocessVaue(abstractName, name, value);
-        if (value == null) return;
+        // create the bindings for this object
+        Map bindings = createBindings(abstractName, instance);
+        if (bindings == null || bindings.isEmpty()) {
+            return;
+        }

         // bind the value
-
-        addDeepBinding(name, value, true, true);
+ for (Iterator iterator = bindings.entrySet().iterator(); iterator.hasNext();) {
+            Map.Entry entry = (Map.Entry) iterator.next();
+            Name name = (Name) entry.getKey();
+            Object value = entry.getValue();
+            addBinding(abstractName, name, value);
+        }

         // remember where we bound this value
-        bindingsByAbstractName.put(abstractName, name);
+        bindingsByAbstractName.put(abstractName, bindings.keySet());
+    }
+
+    private Map bindingsByName = new HashMap();
+
+ private synchronized void addBinding(AbstractName abstractName, Name name, Object value) throws NamingException { + LinkedHashMap bindings = (LinkedHashMap) bindingsByName.get (name);
+        if (bindings == null) {
+            addDeepBinding(name, value, true, true);
+
+            bindings = new LinkedHashMap();
+            bindings.put(abstractName, value);
+            bindingsByName.put(name, bindings);
+        } else {
+            bindings.put(abstractName, value);
+        }
     }

     /**
      * Unbinds the specified gbean.
+     *
      * @param abstractName the abstract name of the gbean to unbind
      */
protected synchronized void removeBinding(AbstractName abstractName) { - Name name = (Name) bindingsByAbstractName.remove (abstractName);
-        if (name != null) {
-            try {
-                removeDeepBinding(name, true);
-            } catch (NamingException ignored) {
+ Set bindingNames = (Set) bindingsByAbstractName.remove (abstractName);
+        if (bindingNames == null) return;
+
+ for (Iterator iterator = bindingNames.iterator(); iterator.hasNext();) {
+            Name name = (Name) iterator.next();
+
+ LinkedHashMap bindings = (LinkedHashMap) bindingsByName.get(name);
+            if (bindings == null) continue;
+
+            if (first(bindings).getKey().equals(abstractName)) {
+                bindings.remove(abstractName);
+                Map.Entry newEntry = first(bindings);
+                if (newEntry != null) {
+                    Object newAbstractName = newEntry.getValue();
+                    Object newValue = newEntry.getValue();
+                    try {
+                        addDeepBinding(name, newValue, true, true);
+                    } catch (NamingException e) {
+                        boolean logged = false;
+                        try {
+                            removeDeepBinding(name, true);
+                        } catch (NamingException e1) {
+                            logged = true;
+ log.error("Unable to remove binding " + name + " to " + abstractName, e);
+                        }
+ if (!logged) log.error("Unable to rebind binding " + name + " to " + newAbstractName);
+                    }
+                } else {
+                    bindingsByName.remove(name);
+                    try {
+                        removeDeepBinding(name, true, true);
+                    } catch (NamingException e) {
+ log.error("Unable to remove binding " + name + " to " + abstractName, e);
+                    }
+                }
+            } else {
+                bindings.remove(abstractName);
             }
         }
     }

+    private static Map.Entry first(LinkedHashMap map) {
+        if (map.isEmpty()) return null;
+        return (Map.Entry) map.entrySet().iterator().next();
+    }
+
+ protected Map createBindings(AbstractName abstractName, Object value) throws NamingException {
+        // generate a name for this binding
+        Name name = createBindingName(abstractName, value);
+        if (name == null) return null;
+
+        // give sub classes a chance to preprocess the value
+        value = preprocessVaue(abstractName, name, value);
+        if (value == null) return null;
+
+        Map bindings = Collections.singletonMap(name, value);
+        return bindings;
+    }
+
     /**
* Create a name under which we will bind the specified gbean with the specified value. * By default, this method simply returns the "name" element of the abstract name
+     *
      * @param abstractName the abstract name of the gbean to bind
-     * @param value the gbean instance
+     * @param value        the gbean instance
      * @return the name under which the gbean should be bound
      */
protected Name createBindingName(AbstractName abstractName, Object value) throws NamingException {
@@ -176,9 +251,10 @@
     /**
* Preprocess the value before it is bound. This is usefult for wrapping values with reference objects.
      * By default, this method simply return the value.
+     *
      * @param abstractName the abstract name of the gbean to bind
-     * @param name the name under which the gbean will be bound
-     * @param value the gbean instance
+ * @param name the name under which the gbean will be bound
+     * @param value        the gbean instance
      * @return the value to bind
      */
protected Object preprocessVaue(AbstractName abstractName, Name name, Object value) throws NamingException {

Added: geronimo/sandbox/plugins/global-jndi/src/java/org/apache/ geronimo/gjndi/binding/EjbBindings.java URL: http://svn.apache.org/viewvc/geronimo/sandbox/plugins/global- jndi/src/java/org/apache/geronimo/gjndi/binding/EjbBindings.java? view=auto&rev=451419 ====================================================================== ======== --- geronimo/sandbox/plugins/global-jndi/src/java/org/apache/ geronimo/gjndi/binding/EjbBindings.java (added) +++ geronimo/sandbox/plugins/global-jndi/src/java/org/apache/ geronimo/gjndi/binding/EjbBindings.java Fri Sep 29 13:13:59 2006
@@ -0,0 +1,108 @@
+/**
+ *
+ * Copyright 2006 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.gjndi.binding;
+
+import org.apache.geronimo.gbean.AbstractName;
+import org.apache.geronimo.gbean.AbstractNameQuery;
+import org.apache.geronimo.gbean.GBeanInfo;
+import org.apache.geronimo.gbean.GBeanInfoBuilder;
+import org.apache.geronimo.gbean.GBeanLifecycle;
+import org.apache.geronimo.gjndi.KernelContextGBean;
+import org.apache.geronimo.kernel.Kernel;
+import org.openejb.RpcEjbDeployment;
+
+import javax.ejb.EJBHome;
+import javax.ejb.EJBLocalHome;
+import javax.naming.Name;
+import javax.naming.NameParser;
+import javax.naming.NamingException;
+import java.util.Collections;
+import java.util.LinkedHashMap;
+import java.util.Map;
+
+/**
+ * @version $Rev$ $Date$
+ */
+public class EjbBindings extends KernelContextGBean implements GBeanLifecycle {
+    private final Name homeContext;
+    private final Name localHomeContext;
+
+ public EjbBindings(Kernel kernel, String homeContext, String localHomeContext) throws NamingException { + super("", new AbstractNameQuery(null, Collections.EMPTY_MAP, RpcEjbDeployment.class.getName()), kernel);
+        NameParser parser = getNameParser();
+        this.homeContext = parser.parse(homeContext);
+        this.localHomeContext = parser.parse(localHomeContext);
+    }
+
+ protected Map createBindings(AbstractName abstractName, Object value) throws NamingException {
+        if (value instanceof RpcEjbDeployment) {
+            RpcEjbDeployment deployment = (RpcEjbDeployment) value;
+
+            NameParser parser = getNameParser();
+            Name ejbName = parser.parse(deployment.getEjbName());
+
+            Map bindings = new LinkedHashMap();
+
+            // create home binding
+ if (deployment.getProxyInfo().getHomeInterface() != null) {
+                EJBHome ejbHome = deployment.getEjbHome();
+
+                String[] jndiNames = deployment.getJndiNames();
+                for (int i = 0; i < jndiNames.length; i++) {
+                    String jndiName = jndiNames[i];
+                    Name name = parser.parse(jndiName);
+                    bindings.put(name, ejbHome);
+                }
+
+                Name homeName = ((Name) homeContext.clone());
+                homeName.addAll(ejbName);
+                bindings.put(homeName, ejbHome);
+            }
+
+            // create local home binding
+ if (deployment.getProxyInfo().getLocalHomeInterface() ! = null) { + EJBLocalHome ejbLocalHome = deployment.getEjbLocalHome();
+
+ String[] localJndiNames = deployment.getLocalJndiNames();
+                for (int i = 0; i < localJndiNames.length; i++) {
+                    String localJndiName = localJndiNames[i];
+                    Name name = parser.parse(localJndiName);
+                    bindings.put(name, ejbLocalHome);
+                }
+
+ Name localHomeName = ((Name) localHomeContext.clone ());
+                localHomeName.addAll(ejbName);
+                bindings.put(localHomeName, ejbLocalHome);
+            }
+
+            return bindings;
+        }
+ throw new NamingException("value is not a RpcEjbDeployment: abstractName=" + abstractName + " valueType=" + value.getClass().getName());
+    }
+
+    public static final GBeanInfo GBEAN_INFO;
+
+    public static GBeanInfo getGBeanInfo() {
+        return EjbBindings.GBEAN_INFO;
+    }
+
+    static {
+ GBeanInfoBuilder builder = GBeanInfoBuilder.createStatic (EjbBindings.class, "EjbBindings"); + builder.setConstructor(new String[]{"kernel", "homeContext", "localHomeContext"});
+        GBEAN_INFO = builder.getBeanInfo();
+    }
+}

Added: geronimo/sandbox/plugins/global-jndi/src/java/org/apache/ geronimo/gjndi/binding/ResourceBindings.java URL: http://svn.apache.org/viewvc/geronimo/sandbox/plugins/global- jndi/src/java/org/apache/geronimo/gjndi/binding/ ResourceBindings.java?view=auto&rev=451419 ====================================================================== ======== --- geronimo/sandbox/plugins/global-jndi/src/java/org/apache/ geronimo/gjndi/binding/ResourceBindings.java (added) +++ geronimo/sandbox/plugins/global-jndi/src/java/org/apache/ geronimo/gjndi/binding/ResourceBindings.java Fri Sep 29 13:13:59 2006
@@ -0,0 +1,80 @@
+/**
+ *
+ * Copyright 2006 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.gjndi.binding;
+
+import org.apache.geronimo.connector.outbound.ConnectionFactorySource;
+import org.apache.geronimo.gbean.AbstractName;
+import org.apache.geronimo.gbean.AbstractNameQuery;
+import org.apache.geronimo.gbean.GBeanInfo;
+import org.apache.geronimo.gbean.GBeanInfoBuilder;
+import org.apache.geronimo.gbean.GBeanLifecycle;
+import org.apache.geronimo.gjndi.KernelContextGBean;
+import org.apache.geronimo.kernel.Kernel;
+
+import javax.naming.Name;
+import javax.naming.NameParser;
+import javax.naming.NamingException;
+import java.util.Collections;
+import java.util.Map;
+
+/**
+ * @version $Rev$ $Date$
+ */
+public class ResourceBindings extends KernelContextGBean implements GBeanLifecycle {
+    private final Class type;
+
+ public ResourceBindings(Kernel kernel, String nameInNamespace, Class type) throws NamingException { + super(nameInNamespace, new AbstractNameQuery(null, Collections.EMPTY_MAP, ConnectionFactorySource.class.getName()), kernel);
+        this.type = type;
+    }
+
+ public ResourceBindings(Kernel kernel, String nameInNamespace, ClassLoader classLoader, String type) throws NamingException, ClassNotFoundException { + super(nameInNamespace, new AbstractNameQuery(null, Collections.EMPTY_MAP, ConnectionFactorySource.class.getName()), kernel);
+        this.type = classLoader.loadClass(type);
+    }
+
+ protected Map createBindings(AbstractName abstractName, Object value) throws NamingException {
+        if (value instanceof ConnectionFactorySource) {
+ ConnectionFactorySource connectionFactorySource = (ConnectionFactorySource) value;
+
+ String name = (String) abstractName.getName().get ("name");
+            if (name == null) return null;
+
+            Object resource = connectionFactorySource.$getResource();
+            if (!type.isInstance(resource)) return null;
+
+            NameParser parser = getNameParser();
+            Name jndiName = parser.parse(name);
+
+            return Collections.singletonMap(jndiName, resource);
+        }
+ throw new NamingException("value is not a ConnectionFactorySource: abstractName=" + abstractName + " valueType=" + value.getClass().getName());
+    }
+
+    public static final GBeanInfo GBEAN_INFO;
+
+    public static GBeanInfo getGBeanInfo() {
+        return ResourceBindings.GBEAN_INFO;
+    }
+
+    static {
+ GBeanInfoBuilder builder = GBeanInfoBuilder.createStatic (ResourceBindings.class, "JdbcBindings");
+        builder.addAttribute("type", String.class, true);
+ builder.setConstructor(new String[]{"kernel", "nameInNamespace", "classLoader", "type"});
+        GBEAN_INFO = builder.getBeanInfo();
+    }
+}

Added: geronimo/sandbox/plugins/global-jndi/src/test/org/apache/ geronimo/gjndi/binding/ResourceBindingsTest.java URL: http://svn.apache.org/viewvc/geronimo/sandbox/plugins/global- jndi/src/test/org/apache/geronimo/gjndi/binding/ ResourceBindingsTest.java?view=auto&rev=451419 ====================================================================== ======== --- geronimo/sandbox/plugins/global-jndi/src/test/org/apache/ geronimo/gjndi/binding/ResourceBindingsTest.java (added) +++ geronimo/sandbox/plugins/global-jndi/src/test/org/apache/ geronimo/gjndi/binding/ResourceBindingsTest.java Fri Sep 29 13:13:59 2006
@@ -0,0 +1,290 @@
+/**
+ *
+ * Copyright 2006 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.gjndi.binding;
+
+import org.apache.geronimo.connector.outbound.ConnectionFactorySource;
+import org.apache.geronimo.gbean.AbstractName;
+import org.apache.geronimo.gbean.GBeanData;
+import org.apache.geronimo.gbean.GBeanInfo;
+import org.apache.geronimo.gbean.GBeanInfoBuilder;
+import org.apache.geronimo.gbean.GBeanLifecycle;
+import org.apache.geronimo.gjndi.AbstractContextTest;
+import org.apache.geronimo.gjndi.GlobalContextGBean;
+import org.apache.geronimo.kernel.Kernel;
+import org.apache.geronimo.kernel.KernelFactory;
+import org.apache.geronimo.kernel.config.ConfigurationData;
+import org.apache.geronimo.kernel.config.ConfigurationUtil;
+import org.apache.geronimo.kernel.config.EditableConfigurationManager; +import org.apache.geronimo.kernel.config.EditableKernelConfigurationManager;
+import org.apache.geronimo.kernel.repository.Artifact;
+import org.apache.geronimo.kernel.repository.DefaultArtifactManager;
+import org.apache.geronimo.kernel.repository.DefaultArtifactResolver;
+import org.apache.geronimo.naming.java.RootContext;
+import org.apache.xbean.naming.context.ImmutableContext;
+import org.apache.xbean.naming.global.GlobalContextManager;
+
+import javax.naming.Context;
+import javax.naming.InitialContext;
+import javax.sql.DataSource;
+import java.io.PrintWriter;
+import java.sql.Connection;
+import java.sql.SQLException;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.Hashtable;
+import java.util.Iterator;
+import java.util.Map;
+
+/**
+ * @version $Rev$ $Date$
+ */
+public class ResourceBindingsTest extends AbstractContextTest {
+    private Kernel kernel;
+    private EditableConfigurationManager configurationManager;
+    private DataSource ds1 = new MockDataSource();
+    private DataSource ds2 = new MockDataSource();
+
+//    private GBeanInfo immutableContextGBeanInfo;
+    private Hashtable contextEnv;
+    private Map globalBindings;
+    private AbstractName jdbcBindingsName;
+    private AbstractName ds1Name;
+
+    public void testBasics() throws Exception {
+        InitialContext ctx = new InitialContext(contextEnv);
+        assertEq(globalBindings, ctx);
+
+        //
+        // stop test ds1
+        //
+        kernel.stopGBean(ds1Name);
+        globalBindings.remove("ds/ds1");
+        assertEq(globalBindings, ctx);
+
+        //
+        // stop ds context
+        //
+        kernel.stopGBean(jdbcBindingsName);
+
+        assertEq(Collections.EMPTY_MAP, ctx);
+
+
+        //
+        // restart ds context
+        //
+        kernel.startGBean(jdbcBindingsName);
+
+        assertEq(globalBindings, ctx);
+
+        //
+        // restart test context
+        //
+        kernel.startGBean(ds1Name);
+        globalBindings.put("ds/ds1", ds1);
+        assertEq(globalBindings, ctx);
+    }
+
+    public void testDupeName() throws Exception {
+ Artifact dupeArtifactName = new Artifact("test2", "test2", "", "car"); + ConfigurationData dupeConfigData = new ConfigurationData (dupeArtifactName, kernel.getNaming());
+
+        // dupe ds1
+        DataSource dupeDs1 = new MockDataSource();
+        Map nameProps = new HashMap();
+        nameProps.put("name", "ds1");
+        nameProps.put("foo", "bar");
+ AbstractName dupeDs1Name = new AbstractName (dupeArtifactName, nameProps); + GBeanData ds1GBean = new GBeanData(dupeDs1Name, MockConnectionFactorySource.GBEAN_INFO);
+        dupeConfigData.addGBean(ds1GBean);
+        ds1GBean.setAttribute("resource", dupeDs1);
+
+        // start the config
+        configurationManager.loadConfiguration(dupeConfigData);
+ configurationManager.startConfiguration (dupeConfigData.getId());
+
+        InitialContext ctx = new InitialContext(contextEnv);
+        assertEq(globalBindings, ctx);
+
+        //
+        // stop test ds1
+        //
+        kernel.stopGBean(ds1Name);
+        globalBindings.put("ds/ds1", dupeDs1);
+        assertEq(globalBindings, ctx);
+
+        //
+        // restart test context
+        //
+        kernel.startGBean(ds1Name);
+        assertEq(globalBindings, ctx);
+
+        //
+        // stop test ds1Dupe
+        //
+        kernel.stopGBean(dupeDs1Name);
+        globalBindings.put("ds/ds1", ds1);
+        assertEq(globalBindings, ctx);
+
+        //
+        // stop test ds1
+        //
+        kernel.stopGBean(ds1Name);
+        globalBindings.remove("ds/ds1");
+        assertEq(globalBindings, ctx);
+    }
+
+ protected Map getNestedBindings(Map globalBindings, String nestedPath) {
+        HashMap nestedBindings = new HashMap();
+ for (Iterator iterator = globalBindings.entrySet().iterator (); iterator.hasNext();) {
+            Map.Entry entry = (Map.Entry) iterator.next();
+            String globalName = (String) entry.getKey();
+            Object value = entry.getValue();
+
+            if (globalName.startsWith(nestedPath)) {
+ String nestedName = globalName.substring (nestedPath.length());
+                nestedBindings.put(nestedName, value);
+            }
+        }
+        return nestedBindings;
+    }
+
+    protected void setUp() throws Exception {
+        super.setUp();
+
+        kernel = KernelFactory.newInstance().createKernel("test");
+        kernel.boot();
+
+ ConfigurationData bootstrap = new ConfigurationData(new Artifact("bootstrap", "bootstrap", "", "car"), kernel.getNaming());
+
+ GBeanData artifactManagerData = bootstrap.addGBean ("ArtifactManager", DefaultArtifactManager.GBEAN_INFO);
+
+ GBeanData artifactResolverData = bootstrap.addGBean ("ArtifactResolver", DefaultArtifactResolver.GBEAN_INFO); + artifactResolverData.setReferencePattern ("ArtifactManager", artifactManagerData.getAbstractName());
+
+ GBeanData configurationManagerData = bootstrap.addGBean ("ConfigurationManager", EditableKernelConfigurationManager.GBEAN_INFO); + configurationManagerData.setReferencePattern ("ArtifactManager", artifactManagerData.getAbstractName()); + configurationManagerData.setReferencePattern ("ArtifactResolver", artifactResolverData.getAbstractName());
+
+ ConfigurationUtil.loadBootstrapConfiguration(kernel, bootstrap, getClass().getClassLoader());
+
+ configurationManager = ConfigurationUtil.getEditableConfigurationManager(kernel);
+
+ ConfigurationData configurationData = new ConfigurationData (new Artifact("test", "test", "", "car"), kernel.getNaming()); + configurationData.addGBean("GlobalContext", GlobalContextGBean.GBEAN_INFO);
+
+        contextEnv = new Hashtable();
+ contextEnv.put(Context.INITIAL_CONTEXT_FACTORY, GlobalContextManager.class.getName());
+
+        // global bindings
+        globalBindings = new HashMap();
+        globalBindings.put("ds/ds1", ds1);
+        globalBindings.put("ds/ds2", ds2);
+
+ Map javaCompBindings = getNestedBindings(globalBindings, "java:comp/"); + ImmutableContext javaCompContext = new ImmutableContext (javaCompBindings);
+        RootContext.setComponentContext(javaCompContext);
+
+        // ds constext
+ GBeanData jdbcBindings = configurationData.addGBean ("JdbcBindings", ResourceBindings.GBEAN_INFO);
+        jdbcBindingsName = jdbcBindings.getAbstractName();
+        jdbcBindings.setAttribute("nameInNamespace", "ds");
+ jdbcBindings.setAttribute("type", DataSource.class.getName ());
+
+        // resources
+ GBeanData stringResource = configurationData.addGBean ("StringResource", MockConnectionFactorySource.GBEAN_INFO);
+        stringResource.setAttribute("resource", "SomeString");
+
+ GBeanData ds1GBean = configurationData.addGBean("ds1", MockConnectionFactorySource.GBEAN_INFO);
+        ds1Name = ds1GBean.getAbstractName();
+        ds1GBean.setAttribute("resource", ds1);
+
+ GBeanData ds2GBean = configurationData.addGBean("ds2", MockConnectionFactorySource.GBEAN_INFO);
+        ds2GBean.setAttribute("resource", ds2);
+
+        configurationManager.loadConfiguration(configurationData);
+ configurationManager.startConfiguration (configurationData.getId());
+
+    }
+
+    protected void tearDown() throws Exception {
+        kernel.shutdown();
+        super.tearDown();
+    }
+
+ public static class MockConnectionFactorySource implements ConnectionFactorySource, GBeanLifecycle {
+        private final Object resource;
+        private boolean running = false;
+
+        public MockConnectionFactorySource(Object resource) {
+            this.resource = resource;
+        }
+
+        public Object $getResource() {
+ if (!running) throw new IllegalStateException("not running");
+            return resource;
+        }
+
+        public void doStart() throws Exception {
+            running = true;
+        }
+
+        public void doStop() throws Exception {
+            running = false;
+        }
+
+        public void doFail() {
+            running = false;
+        }
+
+        public static final GBeanInfo GBEAN_INFO;
+
+        public static GBeanInfo getGBeanInfo() {
+            return GBEAN_INFO;
+        }
+
+        static {
+ GBeanInfoBuilder builder = GBeanInfoBuilder.createStatic(MockConnectionFactorySource.class, "MockConnectionFactorySource");
+            builder.addAttribute("resource", Object.class, true);
+            builder.setConstructor(new String[]{"resource"});
+            GBEAN_INFO = builder.getBeanInfo();
+        }
+    }
+
+    public static class MockDataSource implements DataSource {
+        public Connection getConnection() throws SQLException {
+            return null;
+        }
+
+ public Connection getConnection(String username, String password) throws SQLException {
+            return null;
+        }
+
+        public PrintWriter getLogWriter() throws SQLException {
+            return null;
+        }
+
+ public void setLogWriter(PrintWriter out) throws SQLException {
+        }
+
+ public void setLoginTimeout(int seconds) throws SQLException {
+        }
+
+        public int getLoginTimeout() throws SQLException {
+            return 0;
+        }
+    }
+}



Reply via email to