On Sep 26, 2007, at 3:33 AM, Kristian Köhler wrote:

Hi

i use a custom deployment mechanism to install my application into Geronimo 2.0.1. I have no special deployment plan for that kind of application. One component out of my application wants to access the DataSource registered within Geronimo Application server. The component tries to lookup the db via a JNDI lookup call.

My idea is to register the DB within the Global JNDI Namespace and that access it from within my application. I configured the pool via deployment plan and registered a GBeanBinding GBean for the registration in the Global Namespace.

My problem is: What's the name of the DBPool to access/ to link to with the GBeanBinding? Is this a passable way to do this?

You can but its a pain. You need to find the ManagedConnectionFactoryWrapper for your pool and call $getResource() on it to get the datasource.

Instead you might try the more specific connection factory binder dain wrote a long time ago that has been languishing in the sandbox. This will let you get the actual datasource out of jndi. I haven't tested it but someone has recently got something similar and a related class for admin objects to work.

thanks
david jencks

/*
* 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.connector.globaljndi;

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 javax.resource.ResourceException;

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 = null;
            try {
                resource = connectionFactorySource.$getResource();
            } catch (ResourceException e) {
throw (NamingException)new NamingException("Could not obtain connection factory from gbean").initCause(e);
            }
            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();
    }
}

Reply via email to