Search in sources :

Example 1 with ResourceRef

use of org.apache.naming.ResourceRef in project tomcat by apache.

the class BeanFactory method getObjectInstance.

// ----------------------------------------------------------- Constructors
// -------------------------------------------------------------- Constants
// ----------------------------------------------------- Instance Variables
// --------------------------------------------------------- Public Methods
// -------------------------------------------------- ObjectFactory Methods
/**
     * Create a new Bean instance.
     *
     * @param obj The reference object describing the Bean
     */
@Override
public Object getObjectInstance(Object obj, Name name, Context nameCtx, Hashtable<?, ?> environment) throws NamingException {
    if (obj instanceof ResourceRef) {
        try {
            Reference ref = (Reference) obj;
            String beanClassName = ref.getClassName();
            Class<?> beanClass = null;
            ClassLoader tcl = Thread.currentThread().getContextClassLoader();
            if (tcl != null) {
                try {
                    beanClass = tcl.loadClass(beanClassName);
                } catch (ClassNotFoundException e) {
                }
            } else {
                try {
                    beanClass = Class.forName(beanClassName);
                } catch (ClassNotFoundException e) {
                    e.printStackTrace();
                }
            }
            if (beanClass == null) {
                throw new NamingException("Class not found: " + beanClassName);
            }
            BeanInfo bi = Introspector.getBeanInfo(beanClass);
            PropertyDescriptor[] pda = bi.getPropertyDescriptors();
            Object bean = beanClass.newInstance();
            /* Look for properties with explicitly configured setter */
            RefAddr ra = ref.get("forceString");
            Map<String, Method> forced = new HashMap<>();
            String value;
            if (ra != null) {
                value = (String) ra.getContent();
                Class<?>[] paramTypes = new Class[1];
                paramTypes[0] = String.class;
                String setterName;
                int index;
                /* Items are given as comma separated list */
                for (String param : value.split(",")) {
                    param = param.trim();
                    /* A single item can either be of the form name=method
                         * or just a property name (and we will use a standard
                         * setter) */
                    index = param.indexOf('=');
                    if (index >= 0) {
                        setterName = param.substring(index + 1).trim();
                        param = param.substring(0, index).trim();
                    } else {
                        setterName = "set" + param.substring(0, 1).toUpperCase(Locale.ENGLISH) + param.substring(1);
                    }
                    try {
                        forced.put(param, beanClass.getMethod(setterName, paramTypes));
                    } catch (NoSuchMethodException | SecurityException ex) {
                        throw new NamingException("Forced String setter " + setterName + " not found for property " + param);
                    }
                }
            }
            Enumeration<RefAddr> e = ref.getAll();
            while (e.hasMoreElements()) {
                ra = e.nextElement();
                String propName = ra.getType();
                if (propName.equals(Constants.FACTORY) || propName.equals("scope") || propName.equals("auth") || propName.equals("forceString") || propName.equals("singleton")) {
                    continue;
                }
                value = (String) ra.getContent();
                Object[] valueArray = new Object[1];
                /* Shortcut for properties with explicitly configured setter */
                Method method = forced.get(propName);
                if (method != null) {
                    valueArray[0] = value;
                    try {
                        method.invoke(bean, valueArray);
                    } catch (IllegalAccessException | IllegalArgumentException | InvocationTargetException ex) {
                        throw new NamingException("Forced String setter " + method.getName() + " threw exception for property " + propName);
                    }
                    continue;
                }
                int i = 0;
                for (i = 0; i < pda.length; i++) {
                    if (pda[i].getName().equals(propName)) {
                        Class<?> propType = pda[i].getPropertyType();
                        if (propType.equals(String.class)) {
                            valueArray[0] = value;
                        } else if (propType.equals(Character.class) || propType.equals(char.class)) {
                            valueArray[0] = Character.valueOf(value.charAt(0));
                        } else if (propType.equals(Byte.class) || propType.equals(byte.class)) {
                            valueArray[0] = Byte.valueOf(value);
                        } else if (propType.equals(Short.class) || propType.equals(short.class)) {
                            valueArray[0] = Short.valueOf(value);
                        } else if (propType.equals(Integer.class) || propType.equals(int.class)) {
                            valueArray[0] = Integer.valueOf(value);
                        } else if (propType.equals(Long.class) || propType.equals(long.class)) {
                            valueArray[0] = Long.valueOf(value);
                        } else if (propType.equals(Float.class) || propType.equals(float.class)) {
                            valueArray[0] = Float.valueOf(value);
                        } else if (propType.equals(Double.class) || propType.equals(double.class)) {
                            valueArray[0] = Double.valueOf(value);
                        } else if (propType.equals(Boolean.class) || propType.equals(boolean.class)) {
                            valueArray[0] = Boolean.valueOf(value);
                        } else {
                            throw new NamingException("String conversion for property " + propName + " of type '" + propType.getName() + "' not available");
                        }
                        Method setProp = pda[i].getWriteMethod();
                        if (setProp != null) {
                            setProp.invoke(bean, valueArray);
                        } else {
                            throw new NamingException("Write not allowed for property: " + propName);
                        }
                        break;
                    }
                }
                if (i == pda.length) {
                    throw new NamingException("No set method found for property: " + propName);
                }
            }
            return bean;
        } catch (java.beans.IntrospectionException ie) {
            NamingException ne = new NamingException(ie.getMessage());
            ne.setRootCause(ie);
            throw ne;
        } catch (java.lang.IllegalAccessException iae) {
            NamingException ne = new NamingException(iae.getMessage());
            ne.setRootCause(iae);
            throw ne;
        } catch (java.lang.InstantiationException ie2) {
            NamingException ne = new NamingException(ie2.getMessage());
            ne.setRootCause(ie2);
            throw ne;
        } catch (java.lang.reflect.InvocationTargetException ite) {
            Throwable cause = ite.getCause();
            if (cause instanceof ThreadDeath) {
                throw (ThreadDeath) cause;
            }
            if (cause instanceof VirtualMachineError) {
                throw (VirtualMachineError) cause;
            }
            NamingException ne = new NamingException(ite.getMessage());
            ne.setRootCause(ite);
            throw ne;
        }
    } else {
        return null;
    }
}
Also used : HashMap(java.util.HashMap) BeanInfo(java.beans.BeanInfo) RefAddr(javax.naming.RefAddr) NamingException(javax.naming.NamingException) PropertyDescriptor(java.beans.PropertyDescriptor) Reference(javax.naming.Reference) Method(java.lang.reflect.Method) InvocationTargetException(java.lang.reflect.InvocationTargetException) InvocationTargetException(java.lang.reflect.InvocationTargetException) ResourceRef(org.apache.naming.ResourceRef)

Example 2 with ResourceRef

use of org.apache.naming.ResourceRef in project tomee by apache.

the class TomcatWebAppBuilder method createReference.

private static Reference createReference(final ResourceBase resource) {
    final Reference ref;
    if (resource instanceof ContextResource) {
        final ContextResource cr = (ContextResource) resource;
        ref = new ResourceRef(resource.getType(), resource.getDescription(), cr.getScope(), cr.getAuth(), cr.getSingleton());
    } else {
        ref = new ResourceEnvRef(resource.getType());
    }
    final Iterator<String> params = resource.listProperties();
    while (params.hasNext()) {
        final String paramName = params.next();
        final String paramValue = (String) resource.getProperty(paramName);
        final StringRefAddr refAddr = new StringRefAddr(paramName, paramValue);
        ref.add(refAddr);
    }
    return ref;
}
Also used : StringRefAddr(javax.naming.StringRefAddr) SystemComponentReference(org.apache.openejb.core.ivm.naming.SystemComponentReference) Reference(javax.naming.Reference) AtomicReference(java.util.concurrent.atomic.AtomicReference) ResourceRef(org.apache.naming.ResourceRef) ResourceEnvRef(org.apache.naming.ResourceEnvRef) ContextResource(org.apache.tomcat.util.descriptor.web.ContextResource)

Example 3 with ResourceRef

use of org.apache.naming.ResourceRef in project tomee by apache.

the class WsFactory method getObjectInstance.

public Object getObjectInstance(final Object object, final Name name, final Context context, final Hashtable environment) throws Exception {
    // ignore non resource-refs
    if (!(object instanceof ResourceRef)) {
        return null;
    }
    final Reference ref = (Reference) object;
    final Object value;
    if (NamingUtil.getProperty(ref, NamingUtil.JNDI_NAME) != null) {
        // lookup the value in JNDI
        value = super.getObjectInstance(object, name, context, environment);
    } else {
        // load service class which is used to construct the port
        final String serviceClassName = NamingUtil.getProperty(ref, NamingUtil.WS_CLASS);
        Class<? extends Service> serviceClass = Service.class;
        if (serviceClassName != null) {
            serviceClass = NamingUtil.loadClass(serviceClassName).asSubclass(Service.class);
            if (serviceClass == null) {
                throw new NamingException("Could not load service type class " + serviceClassName);
            }
        }
        // load the reference class which is the ultimate type of the port
        final Class<?> referenceClass = NamingUtil.loadClass(ref.getClassName());
        // if ref class is a subclass of Service, use it for the service class
        if (referenceClass != null && Service.class.isAssignableFrom(referenceClass)) {
            serviceClass = referenceClass.asSubclass(Service.class);
        }
        // PORT ID
        final String serviceId = NamingUtil.getProperty(ref, NamingUtil.WS_ID);
        // Service QName
        QName serviceQName = null;
        if (NamingUtil.getProperty(ref, NamingUtil.WS_QNAME) != null) {
            serviceQName = QName.valueOf(NamingUtil.getProperty(ref, NamingUtil.WS_QNAME));
        }
        // WSDL URL
        URL wsdlUrl = null;
        if (NamingUtil.getProperty(ref, NamingUtil.WSDL_URL) != null) {
            wsdlUrl = new URL(NamingUtil.getProperty(ref, NamingUtil.WSDL_URL));
        }
        // Port QName
        QName portQName = null;
        if (NamingUtil.getProperty(ref, NamingUtil.WS_PORT_QNAME) != null) {
            portQName = QName.valueOf(NamingUtil.getProperty(ref, NamingUtil.WS_PORT_QNAME));
        }
        // port refs
        List<PortRefData> portRefs = NamingUtil.getStaticValue(ref, "port-refs");
        if (portRefs == null) {
            portRefs = Collections.emptyList();
        }
        // HandlerChain
        List<HandlerChainData> handlerChains = NamingUtil.getStaticValue(ref, "handler-chains");
        if (handlerChains == null) {
            handlerChains = Collections.emptyList();
        }
        Collection<Injection> injections = NamingUtil.getStaticValue(ref, "injections");
        if (injections == null) {
            injections = Collections.emptyList();
        }
        final Properties properties = new Properties();
        properties.putAll(environment);
        final JaxWsServiceReference serviceReference = new JaxWsServiceReference(serviceId, serviceQName, serviceClass, portQName, referenceClass, wsdlUrl, portRefs, handlerChains, injections, properties);
        value = serviceReference.getObject();
    }
    return value;
}
Also used : HandlerChainData(org.apache.openejb.core.webservices.HandlerChainData) Reference(javax.naming.Reference) JaxWsServiceReference(org.apache.openejb.core.ivm.naming.JaxWsServiceReference) QName(javax.xml.namespace.QName) Service(javax.xml.ws.Service) Injection(org.apache.openejb.Injection) Properties(java.util.Properties) URL(java.net.URL) JaxWsServiceReference(org.apache.openejb.core.ivm.naming.JaxWsServiceReference) ResourceRef(org.apache.naming.ResourceRef) NamingException(javax.naming.NamingException) PortRefData(org.apache.openejb.core.webservices.PortRefData)

Example 4 with ResourceRef

use of org.apache.naming.ResourceRef in project tomee by apache.

the class PersistenceContextFactory method getObjectInstance.

public Object getObjectInstance(final Object object, final Name name, final Context context, final Hashtable environment) throws Exception {
    // ignore non resource-refs
    if (!(object instanceof ResourceRef)) {
        return null;
    }
    final Reference ref = (Reference) object;
    final Object value;
    if (getProperty(ref, JNDI_NAME) != null) {
        // lookup the value in JNDI
        value = super.getObjectInstance(object, name, context, environment);
    } else {
        // value is hard hard coded in the properties
        value = getStaticValue(ref);
    }
    return value;
}
Also used : Reference(javax.naming.Reference) ResourceRef(org.apache.naming.ResourceRef)

Example 5 with ResourceRef

use of org.apache.naming.ResourceRef in project tomcat by apache.

the class NamingContextListener method addResource.

/**
     * Set the specified resources in the naming context.
     *
     * @param resource the resource descriptor
     */
public void addResource(ContextResource resource) {
    // Create a reference to the resource.
    Reference ref = new ResourceRef(resource.getType(), resource.getDescription(), resource.getScope(), resource.getAuth(), resource.getSingleton());
    // Adding the additional parameters, if any
    Iterator<String> params = resource.listProperties();
    while (params.hasNext()) {
        String paramName = params.next();
        String paramValue = (String) resource.getProperty(paramName);
        StringRefAddr refAddr = new StringRefAddr(paramName, paramValue);
        ref.add(refAddr);
    }
    try {
        if (log.isDebugEnabled()) {
            log.debug("  Adding resource ref " + resource.getName() + "  " + ref);
        }
        createSubcontexts(envCtx, resource.getName());
        envCtx.bind(resource.getName(), ref);
    } catch (NamingException e) {
        log.error(sm.getString("naming.bindFailed", e));
    }
    if ("javax.sql.DataSource".equals(ref.getClassName()) && resource.getSingleton()) {
        try {
            ObjectName on = createObjectName(resource);
            Object actualResource = envCtx.lookup(resource.getName());
            Registry.getRegistry(null, null).registerComponent(actualResource, on, null);
            objectNames.put(resource.getName(), on);
        } catch (Exception e) {
            log.warn(sm.getString("naming.jmxRegistrationFailed", e));
        }
    }
}
Also used : StringRefAddr(javax.naming.StringRefAddr) Reference(javax.naming.Reference) ResourceRef(org.apache.naming.ResourceRef) NamingException(javax.naming.NamingException) NamingException(javax.naming.NamingException) MalformedObjectNameException(javax.management.MalformedObjectNameException) MalformedURLException(java.net.MalformedURLException) NameAlreadyBoundException(javax.naming.NameAlreadyBoundException) ObjectName(javax.management.ObjectName)

Aggregations

Reference (javax.naming.Reference)6 ResourceRef (org.apache.naming.ResourceRef)6 NamingException (javax.naming.NamingException)3 StringRefAddr (javax.naming.StringRefAddr)2 BeanInfo (java.beans.BeanInfo)1 PropertyDescriptor (java.beans.PropertyDescriptor)1 InvocationTargetException (java.lang.reflect.InvocationTargetException)1 Method (java.lang.reflect.Method)1 MalformedURLException (java.net.MalformedURLException)1 URL (java.net.URL)1 HashMap (java.util.HashMap)1 Properties (java.util.Properties)1 AtomicReference (java.util.concurrent.atomic.AtomicReference)1 MalformedObjectNameException (javax.management.MalformedObjectNameException)1 ObjectName (javax.management.ObjectName)1 NameAlreadyBoundException (javax.naming.NameAlreadyBoundException)1 RefAddr (javax.naming.RefAddr)1 QName (javax.xml.namespace.QName)1 Service (javax.xml.ws.Service)1 ResourceEnvRef (org.apache.naming.ResourceEnvRef)1