geronimo-dev mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From Jason Dillon <ja...@planet57.com>
Subject Re: svn commit: r451419 - in /geronimo/sandbox/plugins/global-jndi: ./ src/java/org/apache/geronimo/gjndi/ src/java/org/apache/geronimo/gjndi/binding/ src/test/org/apache/geronimo/gjndi/binding/
Date Fri, 29 Sep 2006 20:40:37 GMT
Can we plz use the new m2 layout?

--jason


On Sep 29, 2006, at 1:14 PM, dain@apache.org 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;
> +        }
> +    }
> +}
>
>


Mime
View raw message