You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@geronimo.apache.org by Jarek Gawor <jg...@gmail.com> on 2008/01/28 03:13:09 UTC

Re: svn commit: r615514 - in /geronimo/server/trunk: framework/modules/geronimo-naming/src/main/java/org/apache/geronimo/gjndi/ framework/modules/geronimo-naming/src/main/java/org/apache/geronimo/gjndi/binding/ framework/modules/geronimo-naming/src/t

David,

I think these changes are causing a lot of error messages to be logged
in the geronimo.log file on shutdown. For example:

javax.naming.ContextNotEmptyException: javamail
	at org.apache.xbean.naming.context.WritableContext.removeBinding(WritableContext.java:139)
	at org.apache.xbean.naming.context.WritableContext.access$200(WritableContext.java:36)
	at org.apache.xbean.naming.context.WritableContext$NestedWritableContext.removeBinding(WritableContext.java:240)
	at org.apache.xbean.naming.context.AbstractContext.unbind(AbstractContext.java:483)
	at org.apache.xbean.naming.context.AbstractContext.removeDeepBinding(AbstractContext.java:420)
	at org.apache.geronimo.gjndi.KernelContextGBean.removeBinding(KernelContextGBean.java:205)
	at org.apache.geronimo.gjndi.KernelContextGBean.destroy(KernelContextGBean.java:87)
	at org.apache.geronimo.gjndi.KernelContextGBean.doStop(KernelContextGBean.java:76)
	at org.apache.geronimo.gbean.runtime.GBeanInstance.destroyInstance(GBeanInstance.java:1161)

See http://geronimo.apache.org/maven/server/binaries/trunk/20080126/logs-2100-tomcat/console-testsuite/target/geronimo-tomcat6-javaee5-2.1-SNAPSHOT/var/log/geronimo.log
for details.

Jarek

On Jan 26, 2008 5:08 PM,  <dj...@apache.org> wrote:
> Author: djencks
> Date: Sat Jan 26 14:08:26 2008
> New Revision: 615514
>
> URL: http://svn.apache.org/viewvc?rev=615514&view=rev
> Log:
> GERONIMO-2971 automatically bind jca resources (connection factories and admin objects) to jndi
>
> Added:
>     geronimo/server/trunk/framework/modules/geronimo-naming/src/main/java/org/apache/geronimo/gjndi/binding/GBeanFormatBinding.java   (with props)
>     geronimo/server/trunk/framework/modules/geronimo-naming/src/main/java/org/apache/geronimo/gjndi/binding/ResourceBinding.java   (with props)
>     geronimo/server/trunk/framework/modules/geronimo-naming/src/test/java/org/apache/geronimo/gjndi/binding/FormatTest.java   (with props)
> Modified:
>     geronimo/server/trunk/framework/modules/geronimo-naming/src/main/java/org/apache/geronimo/gjndi/KernelContextGBean.java
>     geronimo/server/trunk/framework/modules/geronimo-naming/src/main/java/org/apache/geronimo/gjndi/binding/GBeanBinding.java
>     geronimo/server/trunk/plugins/connector/transaction/pom.xml
>     geronimo/server/trunk/plugins/connector/transaction/src/main/plan/plan.xml
>
> Modified: geronimo/server/trunk/framework/modules/geronimo-naming/src/main/java/org/apache/geronimo/gjndi/KernelContextGBean.java
> URL: http://svn.apache.org/viewvc/geronimo/server/trunk/framework/modules/geronimo-naming/src/main/java/org/apache/geronimo/gjndi/KernelContextGBean.java?rev=615514&r1=615513&r2=615514&view=diff
> ==============================================================================
> --- geronimo/server/trunk/framework/modules/geronimo-naming/src/main/java/org/apache/geronimo/gjndi/KernelContextGBean.java (original)
> +++ geronimo/server/trunk/framework/modules/geronimo-naming/src/main/java/org/apache/geronimo/gjndi/KernelContextGBean.java Sat Jan 26 14:08:26 2008
> @@ -16,6 +16,16 @@
>   */
>  package org.apache.geronimo.gjndi;
>
> +import java.util.Collections;
> +import java.util.HashMap;
> +import java.util.HashSet;
> +import java.util.LinkedHashMap;
> +import java.util.Map;
> +import java.util.Set;
> +
> +import javax.naming.Name;
> +import javax.naming.NamingException;
> +
>  import org.apache.commons.logging.Log;
>  import org.apache.commons.logging.LogFactory;
>  import org.apache.geronimo.gbean.AbstractName;
> @@ -30,16 +40,6 @@
>  import org.apache.xbean.naming.context.ContextAccess;
>  import org.apache.xbean.naming.context.WritableContext;
>
> -import javax.naming.Name;
> -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;
> -
>  /**
>   * @version $Rev$ $Date$
>   */
> @@ -49,7 +49,7 @@
>      private final Kernel kernel;
>      private final AbstractNameQuery abstractNameQuery;
>      private final LifecycleListener listener = new ContextLifecycleListener();
> -    private final Map bindingsByAbstractName = new HashMap();
> +    private final Map<AbstractName, Set<Name>> bindingsByAbstractName = new HashMap<AbstractName, Set<Name>>();
>
>      public KernelContextGBean(String nameInNamespace, AbstractNameQuery abstractNameQuery, Kernel kernel) throws NamingException {
>          super(nameInNamespace, Collections.EMPTY_MAP, ContextAccess.MODIFIABLE, false);
> @@ -59,15 +59,14 @@
>
>      public synchronized void doStart() {
>          kernel.getLifecycleMonitor().addLifecycleListener(listener, abstractNameQuery);
> -        Set set = kernel.listGBeans(abstractNameQuery);
> -        for (Iterator iterator = set.iterator(); iterator.hasNext();) {
> -            AbstractName abstractName = (AbstractName) iterator.next();
> +        Set<AbstractName> set = kernel.listGBeans(abstractNameQuery);
> +        for (AbstractName abstractName : set) {
>              try {
>                  if (kernel.isRunning(abstractName)) {
>                      addBinding(abstractName);
>                  }
>              } catch (NamingException e) {
> -                log.error("Error adding binding for " + abstractName);
> +                log.error("Error adding binding for " + abstractName, e);
>              }
>          }
>
> @@ -83,9 +82,8 @@
>
>      private synchronized void destroy() {
>          kernel.getLifecycleMonitor().removeLifecycleListener(listener);
> -        Set abstractNames = new HashSet(bindingsByAbstractName.keySet());
> -        for (Iterator iterator = abstractNames.iterator(); iterator.hasNext();) {
> -            AbstractName abstractName = (AbstractName) iterator.next();
> +        Set<AbstractName> abstractNames = new HashSet<AbstractName>(bindingsByAbstractName.keySet());
> +        for (AbstractName abstractName : abstractNames) {
>              removeBinding(abstractName);
>          }
>          bindingsByAbstractName.clear();
> @@ -130,7 +128,7 @@
>          }
>
>          // get the gbean
> -        Object instance = null;
> +        Object instance;
>          try {
>              instance = kernel.getGBean(abstractName);
>          } catch (GBeanNotFoundException e) {
> @@ -138,15 +136,14 @@
>          }
>
>          // create the bindings for this object
> -        Map bindings = createBindings(abstractName, instance);
> +        Map<Name, Object> bindings = createBindings(abstractName, instance);
>          if (bindings == null || bindings.isEmpty()) {
>              return;
>          }
>
>          // bind the value
> -        for (Iterator iterator = bindings.entrySet().iterator(); iterator.hasNext();) {
> -            Map.Entry entry = (Map.Entry) iterator.next();
> -            Name name = (Name) entry.getKey();
> +        for (Map.Entry<Name, Object> entry : bindings.entrySet()) {
> +            Name name = entry.getKey();
>              Object value = entry.getValue();
>              addBinding(abstractName, name, value);
>          }
> @@ -155,16 +152,17 @@
>          bindingsByAbstractName.put(abstractName, bindings.keySet());
>      }
>
> -    private Map bindingsByName = new HashMap();
> +    private Map<Name, LinkedHashMap<AbstractName, Object>> bindingsByName = new HashMap<Name, LinkedHashMap<AbstractName, Object>>();
>
>      private synchronized void addBinding(AbstractName abstractName, Name name, Object value) throws NamingException {
> -        LinkedHashMap bindings = (LinkedHashMap) bindingsByName.get(name);
> +        LinkedHashMap<AbstractName, Object> bindings = bindingsByName.get(name);
>          if (bindings == null) {
>              addDeepBinding(name, value, true, true);
>
> -            bindings = new LinkedHashMap();
> +            bindings = new LinkedHashMap<AbstractName, Object>();
>              bindings.put(abstractName, value);
>              bindingsByName.put(name, bindings);
> +            log.info("bound gbean " + abstractName + " at name " + name);
>          } else {
>              bindings.put(abstractName, value);
>          }
> @@ -176,20 +174,18 @@
>       * @param abstractName the abstract name of the gbean to unbind
>       */
>      protected synchronized void removeBinding(AbstractName abstractName) {
> -        Set bindingNames = (Set) bindingsByAbstractName.remove(abstractName);
> +        Set<Name> bindingNames = bindingsByAbstractName.remove(abstractName);
>          if (bindingNames == null) return;
>
> -        for (Iterator iterator = bindingNames.iterator(); iterator.hasNext();) {
> -            Name name = (Name) iterator.next();
> +        for (Name name : bindingNames) {
>
> -            LinkedHashMap bindings = (LinkedHashMap) bindingsByName.get(name);
> +            LinkedHashMap<AbstractName, Object> bindings = bindingsByName.get(name);
>              if (bindings == null) continue;
>
>              if (first(bindings).getKey().equals(abstractName)) {
>                  bindings.remove(abstractName);
> -                Map.Entry newEntry = first(bindings);
> +                Map.Entry<AbstractName, Object> newEntry = first(bindings);
>                  if (newEntry != null) {
> -                    Object newAbstractName = newEntry.getValue();
>                      Object newValue = newEntry.getValue();
>                      try {
>                          addDeepBinding(name, newValue, true, true);
> @@ -201,7 +197,7 @@
>                              logged = true;
>                              log.error("Unable to remove binding " + name + " to " + abstractName, e);
>                          }
> -                        if (!logged) log.error("Unable to rebind binding " + name + " to " + newAbstractName);
> +                        if (!logged) log.error("Unable to rebind binding " + name + " to " + newEntry.getKey());
>                      }
>                  } else {
>                      bindingsByName.remove(name);
> @@ -210,6 +206,7 @@
>                      } catch (NamingException e) {
>                          log.error("Unable to remove binding " + name + " to " + abstractName, e);
>                      }
> +                    log.info("unbound gbean " + abstractName + " at name " + name);
>                  }
>              } else {
>                  bindings.remove(abstractName);
> @@ -217,12 +214,12 @@
>          }
>      }
>
> -    private static Map.Entry first(LinkedHashMap map) {
> +    private static Map.Entry<AbstractName, Object> first(LinkedHashMap<AbstractName, Object> map) {
>          if (map.isEmpty()) return null;
> -        return (Map.Entry) map.entrySet().iterator().next();
> +        return map.entrySet().iterator().next();
>      }
>
> -    protected Map createBindings(AbstractName abstractName, Object value) throws NamingException {
> +    protected Map<Name, Object> createBindings(AbstractName abstractName, Object value) throws NamingException {
>          // generate a name for this binding
>          Name name = createBindingName(abstractName, value);
>          if (name == null) return null;
> @@ -231,8 +228,7 @@
>          value = preprocessVaue(abstractName, name, value);
>          if (value == null) return null;
>
> -        Map bindings = Collections.singletonMap(name, value);
> -        return bindings;
> +        return Collections.singletonMap(name, value);
>      }
>
>      /**
> @@ -242,6 +238,7 @@
>       * @param abstractName the abstract name of the gbean to bind
>       * @param value        the gbean instance
>       * @return the name under which the gbean should be bound
> +     * @throws javax.naming.NamingException should something go wrong
>       */
>      protected Name createBindingName(AbstractName abstractName, Object value) throws NamingException {
>          String shortName = (String) abstractName.getName().get("name");
> @@ -256,6 +253,7 @@
>       * @param name         the name under which the gbean will be bound
>       * @param value        the gbean instance
>       * @return the value to bind
> +     * @throws javax.naming.NamingException should something go wrong
>       */
>      protected Object preprocessVaue(AbstractName abstractName, Name name, Object value) throws NamingException {
>          return value;
>
> Modified: geronimo/server/trunk/framework/modules/geronimo-naming/src/main/java/org/apache/geronimo/gjndi/binding/GBeanBinding.java
> URL: http://svn.apache.org/viewvc/geronimo/server/trunk/framework/modules/geronimo-naming/src/main/java/org/apache/geronimo/gjndi/binding/GBeanBinding.java?rev=615514&r1=615513&r2=615514&view=diff
> ==============================================================================
> --- geronimo/server/trunk/framework/modules/geronimo-naming/src/main/java/org/apache/geronimo/gjndi/binding/GBeanBinding.java (original)
> +++ geronimo/server/trunk/framework/modules/geronimo-naming/src/main/java/org/apache/geronimo/gjndi/binding/GBeanBinding.java Sat Jan 26 14:08:26 2008
> @@ -16,6 +16,14 @@
>   */
>  package org.apache.geronimo.gjndi.binding;
>
> +import java.util.HashSet;
> +import java.util.LinkedHashMap;
> +import java.util.Map;
> +import java.util.Set;
> +
> +import javax.naming.Context;
> +import javax.naming.NamingException;
> +
>  import org.apache.commons.logging.Log;
>  import org.apache.commons.logging.LogFactory;
>  import org.apache.geronimo.gbean.AbstractName;
> @@ -28,14 +36,6 @@
>  import org.apache.geronimo.kernel.lifecycle.LifecycleAdapter;
>  import org.apache.geronimo.kernel.lifecycle.LifecycleListener;
>
> -import javax.naming.Context;
> -import javax.naming.NamingException;
> -import java.util.HashSet;
> -import java.util.Iterator;
> -import java.util.LinkedHashMap;
> -import java.util.Map;
> -import java.util.Set;
> -
>  /**
>   * @version $Rev$ $Date$
>   */
> @@ -48,7 +48,7 @@
>      private final Kernel kernel;
>
>      private final LifecycleListener listener = new GBeanLifecycleListener();
> -    private final LinkedHashMap bindings = new LinkedHashMap();
> +    private final LinkedHashMap<AbstractName, Object> bindings = new LinkedHashMap<AbstractName, Object>();
>
>      public GBeanBinding(Context context, String name, AbstractNameQuery abstractNameQuery, Kernel kernel) {
>          this.context = context;
> @@ -59,9 +59,8 @@
>
>      public synchronized void doStart() {
>          kernel.getLifecycleMonitor().addLifecycleListener(listener, abstractNameQuery);
> -        Set set = kernel.listGBeans(abstractNameQuery);
> -        for (Iterator iterator = set.iterator(); iterator.hasNext();) {
> -            AbstractName abstractName = (AbstractName) iterator.next();
> +        Set<AbstractName> set = kernel.listGBeans(abstractNameQuery);
> +        for (AbstractName abstractName : set) {
>              try {
>                  if (kernel.isRunning(abstractName)) {
>                      addBinding(abstractName);
> @@ -83,9 +82,8 @@
>
>      private synchronized void destroy() {
>          kernel.getLifecycleMonitor().removeLifecycleListener(listener);
> -        Set abstractNames = new HashSet(bindings.keySet());
> -        for (Iterator iterator = abstractNames.iterator(); iterator.hasNext();) {
> -            AbstractName abstractName = (AbstractName) iterator.next();
> +        Set<AbstractName> abstractNames = new HashSet<AbstractName>(bindings.keySet());
> +        for (AbstractName abstractName : abstractNames) {
>              removeBinding(abstractName);
>          }
>          bindings.clear();
> @@ -130,7 +128,7 @@
>          }
>
>          // get the gbean
> -        Object instance = null;
> +        Object instance;
>          try {
>              instance = kernel.getGBean(abstractName);
>          } catch (GBeanNotFoundException e) {
>
> Added: geronimo/server/trunk/framework/modules/geronimo-naming/src/main/java/org/apache/geronimo/gjndi/binding/GBeanFormatBinding.java
> URL: http://svn.apache.org/viewvc/geronimo/server/trunk/framework/modules/geronimo-naming/src/main/java/org/apache/geronimo/gjndi/binding/GBeanFormatBinding.java?rev=615514&view=auto
> ==============================================================================
> --- geronimo/server/trunk/framework/modules/geronimo-naming/src/main/java/org/apache/geronimo/gjndi/binding/GBeanFormatBinding.java (added)
> +++ geronimo/server/trunk/framework/modules/geronimo-naming/src/main/java/org/apache/geronimo/gjndi/binding/GBeanFormatBinding.java Sat Jan 26 14:08:26 2008
> @@ -0,0 +1,106 @@
> +/*
> + * Licensed to the Apache Software Foundation (ASF) under one
> + * or more contributor license agreements.  See the NOTICE file
> + * distributed with this work for additional information
> + * regarding copyright ownership.  The ASF licenses this file
> + * to you 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 java.util.HashMap;
> +import java.util.Map;
> +import java.util.regex.Matcher;
> +import java.util.regex.Pattern;
> +
> +import javax.naming.Name;
> +import javax.naming.NamingException;
> +
> +import org.apache.commons.logging.Log;
> +import org.apache.commons.logging.LogFactory;
> +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.gjndi.KernelContextGBean;
> +import org.apache.geronimo.kernel.Kernel;
> +import org.apache.geronimo.kernel.repository.Artifact;
> +
> +/**
> + * @version $Rev:$ $Date:$
> + */
> +public class GBeanFormatBinding extends KernelContextGBean {
> +    protected static final Log log = LogFactory.getLog(GBeanFormatBinding.class);
> +    private static final Pattern PATTERN = Pattern.compile("(\\{)(\\w+)(})");
> +
> +    protected final String format;
> +    protected final Pattern namePattern;
> +
> +    public GBeanFormatBinding(String format, String namePattern, String nameInNamespace, AbstractNameQuery abstractNameQuery, Kernel kernel) throws NamingException {
> +        super(nameInNamespace, abstractNameQuery, kernel);
> +        this.format = format;
> +        if (namePattern != null && namePattern.length() > 0) {
> +            this.namePattern = Pattern.compile(namePattern);
> +        } else {
> +            this.namePattern = null;
> +        }
> +    }
> +
> +    @Override
> +    protected Name createBindingName(AbstractName abstractName, Object value) throws NamingException {
> +        String name = abstractName.getNameProperty("name");
> +        if (namePattern != null) {
> +            Matcher matcher = namePattern.matcher(name);
> +            if (!matcher.matches()) {
> +                return null;
> +            }
> +        }
> +        Map<String, String> map = new HashMap<String, String>(abstractName.getName());
> +        Artifact artifact = abstractName.getArtifact();
> +        map.put("groupId", artifact.getGroupId());
> +        map.put("artifactId", artifact.getArtifactId());
> +        map.put("version", artifact.getVersion().toString());
> +        map.put("type", artifact.getType());
> +        String fullName = format(format, map);
> +        return getNameParser().parse(fullName);
> +    }
> +
> +    static String format(String input, Map<String, String> map) {
> +        Matcher matcher = PATTERN.matcher(input);
> +        StringBuffer buf = new StringBuffer();
> +        while (matcher.find()) {
> +            String key = matcher.group(2);
> +            String value = map.get(key);
> +            matcher.appendReplacement(buf, value);
> +        }
> +        matcher.appendTail(buf);
> +        return buf.toString();
> +    }
> +
> +    public static final GBeanInfo GBEAN_INFO;
> +
> +    static {
> +        GBeanInfoBuilder builder = GBeanInfoBuilder.createStatic(GBeanFormatBinding.class, KernelContextGBean.GBEAN_INFO, "Context");
> +        builder.addAttribute("format", String.class, true);
> +        builder.addAttribute("namePattern", String.class, true);
> +        builder.setConstructor(new String[]{"format", "namePattern", "nameInNamespace", "abstractNameQuery", "kernel"});
> +        GBEAN_INFO = builder.getBeanInfo();
> +    }
> +
> +    public static GBeanInfo getGBeanInfo() {
> +        return GBEAN_INFO;
> +    }
> +
> +}
>
> Propchange: geronimo/server/trunk/framework/modules/geronimo-naming/src/main/java/org/apache/geronimo/gjndi/binding/GBeanFormatBinding.java
> ------------------------------------------------------------------------------
>     svn:eol-style = native
>
> Propchange: geronimo/server/trunk/framework/modules/geronimo-naming/src/main/java/org/apache/geronimo/gjndi/binding/GBeanFormatBinding.java
> ------------------------------------------------------------------------------
>     svn:keywords = Date Revision
>
> Propchange: geronimo/server/trunk/framework/modules/geronimo-naming/src/main/java/org/apache/geronimo/gjndi/binding/GBeanFormatBinding.java
> ------------------------------------------------------------------------------
>     svn:mime-type = text/plain
>
> Added: geronimo/server/trunk/framework/modules/geronimo-naming/src/main/java/org/apache/geronimo/gjndi/binding/ResourceBinding.java
> URL: http://svn.apache.org/viewvc/geronimo/server/trunk/framework/modules/geronimo-naming/src/main/java/org/apache/geronimo/gjndi/binding/ResourceBinding.java?rev=615514&view=auto
> ==============================================================================
> --- geronimo/server/trunk/framework/modules/geronimo-naming/src/main/java/org/apache/geronimo/gjndi/binding/ResourceBinding.java (added)
> +++ geronimo/server/trunk/framework/modules/geronimo-naming/src/main/java/org/apache/geronimo/gjndi/binding/ResourceBinding.java Sat Jan 26 14:08:26 2008
> @@ -0,0 +1,68 @@
> +/**
> + *  Licensed to the Apache Software Foundation (ASF) under one or more
> + *  contributor license agreements.  See the NOTICE file distributed with
> + *  this work for additional information regarding copyright ownership.
> + *  The ASF licenses this file to You 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 javax.naming.NamingException;
> +
> +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.kernel.Kernel;
> +import org.apache.geronimo.naming.ResourceSource;
> +
> +/**
> + * @version $Rev$ $Date$
> + */
> +public class ResourceBinding extends GBeanFormatBinding {
> +
> +    public ResourceBinding(String format, String namePattern, String nameInNamespace, AbstractNameQuery abstractNameQuery, Kernel kernel) throws NamingException {
> +        super(format, namePattern, nameInNamespace, abstractNameQuery, kernel);
> +    }
> +
> +    /**
> +     * 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 value        the gbean instance
> +     * @return the value to bind  or null if there was a problem
> +     */
> +    protected Object preprocessVaue(AbstractName abstractName, Object value) {
> +        if (!(value instanceof ResourceSource)) {
> +            log.info("value at " + abstractName + " is not a ResourceSource: " + value.getClass().getName());
> +            return null;
> +        }
> +        try {
> +            return ((ResourceSource) value).$getResource();
> +        } catch (Throwable throwable) {
> +            log.info("Could not get resource from gbean at " + abstractName,throwable);
> +            return null;
> +        }
> +    }
> +
> +    public static final GBeanInfo GBEAN_INFO;
> +
> +    static {
> +        GBeanInfoBuilder builder = GBeanInfoBuilder.createStatic(ResourceBinding.class, GBeanFormatBinding.GBEAN_INFO, "Context");
> +        GBEAN_INFO = builder.getBeanInfo();
> +    }
> +
> +    public static GBeanInfo getGBeanInfo() {
> +        return GBEAN_INFO;
> +    }
> +}
> \ No newline at end of file
>
> Propchange: geronimo/server/trunk/framework/modules/geronimo-naming/src/main/java/org/apache/geronimo/gjndi/binding/ResourceBinding.java
> ------------------------------------------------------------------------------
>     svn:eol-style = native
>
> Propchange: geronimo/server/trunk/framework/modules/geronimo-naming/src/main/java/org/apache/geronimo/gjndi/binding/ResourceBinding.java
> ------------------------------------------------------------------------------
>     svn:keywords = Date Revision
>
> Propchange: geronimo/server/trunk/framework/modules/geronimo-naming/src/main/java/org/apache/geronimo/gjndi/binding/ResourceBinding.java
> ------------------------------------------------------------------------------
>     svn:mime-type = text/plain
>
> Added: geronimo/server/trunk/framework/modules/geronimo-naming/src/test/java/org/apache/geronimo/gjndi/binding/FormatTest.java
> URL: http://svn.apache.org/viewvc/geronimo/server/trunk/framework/modules/geronimo-naming/src/test/java/org/apache/geronimo/gjndi/binding/FormatTest.java?rev=615514&view=auto
> ==============================================================================
> --- geronimo/server/trunk/framework/modules/geronimo-naming/src/test/java/org/apache/geronimo/gjndi/binding/FormatTest.java (added)
> +++ geronimo/server/trunk/framework/modules/geronimo-naming/src/test/java/org/apache/geronimo/gjndi/binding/FormatTest.java Sat Jan 26 14:08:26 2008
> @@ -0,0 +1,48 @@
> +/*
> + * Licensed to the Apache Software Foundation (ASF) under one
> + * or more contributor license agreements.  See the NOTICE file
> + * distributed with this work for additional information
> + * regarding copyright ownership.  The ASF licenses this file
> + * to you 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 java.util.Map;
> +import java.util.HashMap;
> +
> +import junit.framework.TestCase;
> +import org.apache.geronimo.gbean.GBeanInfo;
> +
> +/**
> + * @version $Rev:$ $Date:$
> + */
> +public class FormatTest extends TestCase {
> +
> +    public void testPattern() throws Exception {
> +        Map<String, String> map = new HashMap<String, String>();
> +        map.put("foo", "white");
> +        map.put("bar", "black");
> +        assertEquals("white/black", GBeanFormatBinding.format("{foo}/{bar}", map));
> +        assertEquals("black/black", GBeanFormatBinding.format("{bar}/{bar}", map));
> +        assertEquals("java:white/test/black/test", GBeanFormatBinding.format("java:{foo}/test/{bar}/test", map));
> +    }
> +
> +    public void testGBeanInfos() throws Exception {
> +        GBeanInfo info = ResourceBinding.getGBeanInfo();
> +        info = GBeanFormatBinding.getGBeanInfo();
> +    }
> +
> +}
>
> Propchange: geronimo/server/trunk/framework/modules/geronimo-naming/src/test/java/org/apache/geronimo/gjndi/binding/FormatTest.java
> ------------------------------------------------------------------------------
>     svn:eol-style = native
>
> Propchange: geronimo/server/trunk/framework/modules/geronimo-naming/src/test/java/org/apache/geronimo/gjndi/binding/FormatTest.java
> ------------------------------------------------------------------------------
>     svn:keywords = Date Revision
>
> Propchange: geronimo/server/trunk/framework/modules/geronimo-naming/src/test/java/org/apache/geronimo/gjndi/binding/FormatTest.java
> ------------------------------------------------------------------------------
>     svn:mime-type = text/plain
>
> Modified: geronimo/server/trunk/plugins/connector/transaction/pom.xml
> URL: http://svn.apache.org/viewvc/geronimo/server/trunk/plugins/connector/transaction/pom.xml?rev=615514&r1=615513&r2=615514&view=diff
> ==============================================================================
> --- geronimo/server/trunk/plugins/connector/transaction/pom.xml (original)
> +++ geronimo/server/trunk/plugins/connector/transaction/pom.xml Sat Jan 26 14:08:26 2008
> @@ -108,6 +108,22 @@
>                          <value>true</value>
>                          <includeVersion>true</includeVersion>
>                      </useMavenDependencies>
> +                    <instance>
> +                        <plugin-artifact>
> +                            <config-xml-content>
> +                                <gbean name="ResourceBindings" class="org.apache.geronimo.gjndi.binding.ResourceBinding">
> +                                    <attribute name="format">${ResourceBindingsFormat}</attribute>
> +                                    <attribute name="nameInNamespace">${ResourceBindingsNameInNamespace}</attribute>
> +                                    <attribute name="namePattern">${ResourceBindingsNamePattern}</attribute>
> +                                    <attribute name="abstractNameQuery">${ResourceBindingsQuery}</attribute>
> +                                </gbean>
> +                            </config-xml-content>
> +                            <config-substitution key="ResourceBindingsFormat">{groupId}/{artifactId}/{j2eeType}/{name}</config-substitution>
> +                            <config-substitution key="ResourceBindingsNameInNamespace">jca:</config-substitution>
> +                            <config-substitution key="ResourceBindingsNamePattern"></config-substitution>
> +                            <config-substitution key="ResourceBindingsQuery">?#org.apache.geronimo.naming.ResourceSource</config-substitution>
> +                        </plugin-artifact>
> +                    </instance>
>                  </configuration>
>              </plugin>
>          </plugins>
>
> Modified: geronimo/server/trunk/plugins/connector/transaction/src/main/plan/plan.xml
> URL: http://svn.apache.org/viewvc/geronimo/server/trunk/plugins/connector/transaction/src/main/plan/plan.xml?rev=615514&r1=615513&r2=615514&view=diff
> ==============================================================================
> --- geronimo/server/trunk/plugins/connector/transaction/src/main/plan/plan.xml (original)
> +++ geronimo/server/trunk/plugins/connector/transaction/src/main/plan/plan.xml Sat Jan 26 14:08:26 2008
> @@ -100,4 +100,10 @@
>          </reference>
>      </gbean>
>
> +    <gbean name="ResourceBindings" class="org.apache.geronimo.gjndi.binding.ResourceBinding">
> +        <attribute name="format">{groupId}/{artifactId}/{j2eeType}/{name}</attribute>
> +        <attribute name="nameInNamespace">jca:</attribute>
> +        <attribute name="abstractNameQuery">?#org.apache.geronimo.naming.ResourceSource</attribute>
> +    </gbean>
> +
>  </module>
>
>
>