Search in sources :

Example 1 with HandlerChainData

use of org.apache.openejb.core.webservices.HandlerChainData in project tomee by apache.

the class JndiEncBuilder method buildMap.

public Map<String, Object> buildMap(final JndiScope scope) throws OpenEJBException {
    // let it be sorted for real binding
    final Map<String, Object> bindings = new TreeMap<String, Object>();
    // get JtaEntityManagerRegistry
    final JtaEntityManagerRegistry jtaEntityManagerRegistry = SystemInstance.get().getComponent(JtaEntityManagerRegistry.class);
    for (final EjbReferenceInfo referenceInfo : jndiEnc.ejbReferences) {
        final Reference reference;
        if (referenceInfo.location != null) {
            reference = buildReferenceLocation(referenceInfo.location);
        } else if (referenceInfo.ejbDeploymentId == null) {
            reference = new LazyEjbReference(new Ref(referenceInfo), moduleUri, useCrossClassLoaderRef);
        } else {
            final String jndiName = "openejb/Deployment/" + JndiBuilder.format(referenceInfo.ejbDeploymentId, referenceInfo.interfaceClassName, referenceInfo.localbean ? InterfaceType.LOCALBEAN : InterfaceType.BUSINESS_REMOTE);
            if (useCrossClassLoaderRef && referenceInfo.externalReference) {
                reference = new CrossClassLoaderJndiReference(jndiName);
            } else {
                reference = new IntraVmJndiReference(jndiName);
            }
        }
        bindings.put(normalize(referenceInfo.referenceName), reference);
    }
    for (final EjbReferenceInfo referenceInfo : jndiEnc.ejbLocalReferences) {
        final Reference reference;
        if (referenceInfo.location != null) {
            reference = buildReferenceLocation(referenceInfo.location);
        } else if (referenceInfo.ejbDeploymentId == null) {
            reference = new LazyEjbReference(new Ref(referenceInfo), moduleUri, false);
        } else {
            final String jndiName = "openejb/Deployment/" + JndiBuilder.format(referenceInfo.ejbDeploymentId, referenceInfo.interfaceClassName, referenceInfo.localbean ? InterfaceType.LOCALBEAN : InterfaceType.BUSINESS_LOCAL);
            reference = new IntraVmJndiReference(jndiName);
        }
        bindings.put(normalize(referenceInfo.referenceName), reference);
    }
    for (final EnvEntryInfo entry : jndiEnc.envEntries) {
        if (entry.location != null) {
            final Reference reference = buildReferenceLocation(entry.location);
            bindings.put(normalize(entry.referenceName), reference);
            continue;
        }
        //It is possible that the value and location are both null, as it is allowed to use @Resource(name="java:global/env/abc") with no value is specified in DD            
        if (entry.value == null) {
            continue;
        }
        try {
            final Class type = Classes.deprimitivize(getType(entry.type, entry));
            final Object obj;
            if (type == String.class) {
                obj = new String(entry.value);
            } else if (type == Double.class) {
                obj = new Double(entry.value);
            } else if (type == Integer.class) {
                obj = new Integer(entry.value);
            } else if (type == Long.class) {
                obj = new Long(entry.value);
            } else if (type == Float.class) {
                obj = new Float(entry.value);
            } else if (type == Short.class) {
                obj = new Short(entry.value);
            } else if (type == Boolean.class) {
                obj = Boolean.valueOf(entry.value);
            } else if (type == Byte.class) {
                obj = new Byte(entry.value);
            } else if (type == Character.class) {
                final StringBuilder sb = new StringBuilder(entry.value + " ");
                obj = new Character(sb.charAt(0));
            } else if (type == URL.class) {
                obj = new URL(entry.value);
            } else if (type == Class.class) {
                obj = new ClassReference(entry.value.trim());
            } else if (type.isEnum()) {
                obj = Enum.valueOf(type, entry.value.trim());
            } else {
                throw new IllegalArgumentException("Invalid env-entry-type " + type);
            }
            bindings.put(normalize(entry.referenceName), obj);
        } catch (final NumberFormatException e) {
            throw new IllegalArgumentException("The env-entry-value for entry " + entry.referenceName + " was not recognizable as type " + entry.type + ". Received Message: " + e.getLocalizedMessage(), e);
        } catch (final MalformedURLException e) {
            throw new IllegalArgumentException("URL for reference " + entry.referenceName + " was not a valid URL: " + entry.value, e);
        }
    }
    for (final ResourceReferenceInfo referenceInfo : jndiEnc.resourceRefs) {
        if (!(referenceInfo instanceof ContextReferenceInfo)) {
            if (referenceInfo.location != null) {
                final Reference reference = buildReferenceLocation(referenceInfo.location);
                bindings.put(normalize(referenceInfo.referenceName), reference);
                continue;
            }
            final Class<?> type = getType(referenceInfo.referenceType, referenceInfo);
            final Object reference;
            if (URL.class.equals(type)) {
                reference = new URLReference(referenceInfo.resourceID);
            } else if (type.isAnnotationPresent(ManagedBean.class)) {
                final ManagedBean managed = type.getAnnotation(ManagedBean.class);
                final String name = managed.value().length() == 0 ? type.getSimpleName() : managed.value();
                reference = new LinkRef("module/" + name);
            } else if (referenceInfo.resourceID != null) {
                final String jndiName = "openejb/Resource/" + referenceInfo.resourceID;
                reference = new IntraVmJndiReference(jndiName);
            } else {
                final String jndiName = "openejb/Resource/" + referenceInfo.referenceName;
                reference = new IntraVmJndiReference(jndiName);
            }
            bindings.put(normalize(referenceInfo.referenceName), reference);
        } else {
            final Class<?> type = getType(referenceInfo.referenceType, referenceInfo);
            final Object reference;
            if (Request.class.equals(type)) {
                reference = new ObjectReference(ThreadLocalContextManager.REQUEST);
            } else if (HttpServletRequest.class.equals(type)) {
                reference = new ObjectReference(ThreadLocalContextManager.HTTP_SERVLET_REQUEST);
            } else if (ServletRequest.class.equals(type)) {
                reference = new ObjectReference(ThreadLocalContextManager.SERVLET_REQUEST);
            } else if (UriInfo.class.equals(type)) {
                reference = new ObjectReference(ThreadLocalContextManager.URI_INFO);
            } else if (HttpHeaders.class.equals(type)) {
                reference = new ObjectReference(ThreadLocalContextManager.HTTP_HEADERS);
            } else if (SecurityContext.class.equals(type)) {
                reference = new ObjectReference(ThreadLocalContextManager.SECURITY_CONTEXT);
            } else if (ContextResolver.class.equals(type)) {
                reference = new ObjectReference(ThreadLocalContextManager.CONTEXT_RESOLVER);
            } else if (Providers.class.equals(type)) {
                reference = new ObjectReference(ThreadLocalContextManager.PROVIDERS);
            } else if (ServletConfig.class.equals(type)) {
                reference = new ObjectReference(ThreadLocalContextManager.SERVLET_CONFIG);
            } else if (ServletContext.class.equals(type)) {
                reference = new ObjectReference(ThreadLocalContextManager.SERVLET_CONTEXT);
            } else if (HttpServletResponse.class.equals(type)) {
                reference = new ObjectReference(ThreadLocalContextManager.HTTP_SERVLET_RESPONSE);
            } else if (javax.ws.rs.container.ResourceInfo.class.equals(type)) {
                reference = new ObjectReference(ThreadLocalContextManager.RESOURCE_INFO);
            } else if (ResourceContext.class.equals(type)) {
                reference = new ObjectReference(ThreadLocalContextManager.RESOURCE_CONTEXT);
            } else if (Configuration.class.equals(type)) {
                reference = new ObjectReference(ThreadLocalContextManager.CONFIGURATION);
            } else {
                reference = new MapObjectReference(ThreadLocalContextManager.OTHERS, referenceInfo.referenceType);
            }
            bindings.put(normalize(referenceInfo.referenceName), reference);
        }
    }
    for (final ResourceEnvReferenceInfo referenceInfo : jndiEnc.resourceEnvRefs) {
        if (referenceInfo.location != null) {
            final Reference reference = buildReferenceLocation(referenceInfo.location);
            bindings.put(normalize(referenceInfo.referenceName), reference);
            continue;
        }
        final Class<?> type = getType(referenceInfo.resourceEnvRefType, referenceInfo);
        final Object reference;
        if (EJBContext.class.isAssignableFrom(type)) {
            final String jndiName = "comp/EJBContext";
            reference = new LinkRef(jndiName);
            // Let the container bind this into JNDI
            if (jndiName.equals(referenceInfo.referenceName)) {
                continue;
            }
        } else if (Validator.class.equals(type)) {
            final String jndiName = "comp/Validator";
            reference = new LinkRef(jndiName);
        } else if (ValidatorFactory.class.equals(type)) {
            final String jndiName = "comp/ValidatorFactory";
            reference = new LinkRef(jndiName);
        } else if (WebServiceContext.class.equals(type)) {
            final String jndiName = "comp/WebServiceContext";
            reference = new LinkRef(jndiName);
        } else if (TimerService.class.equals(type)) {
            final String jndiName = "comp/TimerService";
            reference = new LinkRef(jndiName);
        } else if (BeanManager.class.equals(type)) {
            reference = new LazyObjectReference<BeanManager>(new Callable<BeanManager>() {

                @Override
                public BeanManager call() throws Exception {
                    return new InjectableBeanManager(WebBeansContext.currentInstance().getBeanManagerImpl());
                }
            });
        } else if (UserTransaction.class.equals(type)) {
            reference = new IntraVmJndiReference("comp/UserTransaction");
        } else if (referenceInfo.resourceID != null) {
            final String jndiName = "openejb/Resource/" + referenceInfo.resourceID;
            reference = new IntraVmJndiReference(jndiName);
        } else {
            final String jndiName = "openejb/Resource/" + referenceInfo.referenceName;
            reference = new IntraVmJndiReference(jndiName);
        }
        bindings.put(normalize(referenceInfo.referenceName), reference);
    }
    for (final PersistenceUnitReferenceInfo referenceInfo : jndiEnc.persistenceUnitRefs) {
        if (referenceInfo.location != null) {
            final Reference reference = buildReferenceLocation(referenceInfo.location);
            bindings.put(normalize(referenceInfo.referenceName), reference);
            continue;
        }
        final String jndiName = PersistenceBuilder.getOpenEJBJndiName(referenceInfo.unitId);
        final Reference reference = new IntraVmJndiReference(jndiName);
        bindings.put(normalize(referenceInfo.referenceName), reference);
    }
    for (final PersistenceContextReferenceInfo contextInfo : jndiEnc.persistenceContextRefs) {
        if (contextInfo.location != null) {
            final Reference reference = buildReferenceLocation(contextInfo.location);
            bindings.put(normalize(contextInfo.referenceName), reference);
            continue;
        }
        final Context context = SystemInstance.get().getComponent(ContainerSystem.class).getJNDIContext();
        final EntityManagerFactory factory;
        try {
            final String jndiName = PersistenceBuilder.getOpenEJBJndiName(contextInfo.unitId);
            factory = (EntityManagerFactory) context.lookup(jndiName);
        } catch (final NamingException e) {
            throw new OpenEJBException("PersistenceUnit '" + contextInfo.unitId + "' not found for EXTENDED ref '" + contextInfo.referenceName + "'");
        }
        final JtaEntityManager jtaEntityManager = new JtaEntityManager(contextInfo.persistenceUnitName, jtaEntityManagerRegistry, factory, contextInfo.properties, contextInfo.extended, contextInfo.synchronizationType);
        final Reference reference = new PersistenceContextReference(jtaEntityManager);
        bindings.put(normalize(contextInfo.referenceName), reference);
    }
    for (final ServiceReferenceInfo referenceInfo : jndiEnc.serviceRefs) {
        if (referenceInfo.location != null) {
            final Reference reference = buildReferenceLocation(referenceInfo.location);
            bindings.put(normalize(referenceInfo.referenceName), reference);
            continue;
        }
        // load service class which is used to construct the port
        Class<? extends Service> serviceClass = Service.class;
        if (referenceInfo.serviceType != null) {
            try {
                serviceClass = classLoader.loadClass(referenceInfo.serviceType).asSubclass(Service.class);
            } catch (final Exception e) {
                throw new OpenEJBException("Could not load service type class " + referenceInfo.serviceType, e);
            }
        }
        // load the reference class which is the ultimate type of the port
        Class<?> referenceClass = null;
        if (referenceInfo.referenceType != null) {
            try {
                referenceClass = classLoader.loadClass(referenceInfo.referenceType);
            } catch (final Exception e) {
                throw new OpenEJBException("Could not load reference type class " + referenceInfo.referenceType, e);
            }
        }
        // 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);
        }
        // determine the location of the wsdl file
        URL wsdlUrl = null;
        if (referenceInfo.wsdlFile != null) {
            try {
                wsdlUrl = new URL(referenceInfo.wsdlFile);
            } catch (final MalformedURLException e) {
                wsdlUrl = classLoader.getResource(referenceInfo.wsdlFile);
                if (wsdlUrl == null) {
                    logger.warning("Error obtaining WSDL: " + referenceInfo.wsdlFile, e);
                }
            }
        }
        // port refs
        final List<PortRefData> portRefs = new ArrayList<PortRefData>(referenceInfo.portRefs.size());
        for (final PortRefInfo portRefInfo : referenceInfo.portRefs) {
            final PortRefData portRef = new PortRefData();
            portRef.setQName(portRefInfo.qname);
            portRef.setServiceEndpointInterface(portRefInfo.serviceEndpointInterface);
            portRef.setEnableMtom(portRefInfo.enableMtom);
            portRef.getProperties().putAll(portRefInfo.properties);
            portRefs.add(portRef);
        }
        // create the handle chains
        List<HandlerChainData> handlerChains = null;
        if (!referenceInfo.handlerChains.isEmpty()) {
            handlerChains = WsBuilder.toHandlerChainData(referenceInfo.handlerChains, classLoader);
        }
        if (!client) {
            final Reference reference = new JaxWsServiceReference(referenceInfo.id, referenceInfo.serviceQName, serviceClass, referenceInfo.portQName, referenceClass, wsdlUrl, portRefs, handlerChains, injections, properties);
            bindings.put(normalize(referenceInfo.referenceName), reference);
        } else {
            final ServiceRefData serviceRefData = new ServiceRefData(referenceInfo.id, referenceInfo.serviceQName, serviceClass, referenceInfo.portQName, referenceClass, wsdlUrl, handlerChains, portRefs);
            bindings.put(normalize(referenceInfo.referenceName), serviceRefData);
        }
    }
    final OpenEjbConfiguration config = SystemInstance.get().getComponent(OpenEjbConfiguration.class);
    if (config != null) {
        for (final ResourceInfo resource : config.facilities.resources) {
            final String jndiName = resource.jndiName;
            if (jndiName != null && !jndiName.isEmpty() && isNotGobalOrIsHoldByThisApp(resource, scope)) {
                final String refName = "openejb/Resource/" + resource.id;
                final Object reference = new IntraVmJndiReference(refName);
                final String boundName = normalize(jndiName);
                bindings.put(boundName, reference);
            }
        }
    }
    return bindings;
}
Also used : ContainerSystem(org.apache.openejb.spi.ContainerSystem) OpenEJBException(org.apache.openejb.OpenEJBException) HandlerChainData(org.apache.openejb.core.webservices.HandlerChainData) MalformedURLException(java.net.MalformedURLException) Configuration(javax.ws.rs.core.Configuration) ArrayList(java.util.ArrayList) CrossClassLoaderJndiReference(org.apache.openejb.core.ivm.naming.CrossClassLoaderJndiReference) HttpServletRequest(javax.servlet.http.HttpServletRequest) JaxWsServiceReference(org.apache.openejb.core.ivm.naming.JaxWsServiceReference) IntraVmJndiReference(org.apache.openejb.core.ivm.naming.IntraVmJndiReference) JtaEntityManagerRegistry(org.apache.openejb.persistence.JtaEntityManagerRegistry) NamingException(javax.naming.NamingException) InjectableBeanManager(org.apache.webbeans.container.InjectableBeanManager) BeanManager(javax.enterprise.inject.spi.BeanManager) PersistenceContextReference(org.apache.openejb.core.ivm.naming.PersistenceContextReference) LazyObjectReference(org.apache.openejb.core.ivm.naming.LazyObjectReference) JtaEntityManager(org.apache.openejb.persistence.JtaEntityManager) EntityManagerFactory(javax.persistence.EntityManagerFactory) ManagedBean(javax.annotation.ManagedBean) Providers(javax.ws.rs.ext.Providers) HttpHeaders(javax.ws.rs.core.HttpHeaders) InjectableBeanManager(org.apache.webbeans.container.InjectableBeanManager) Providers(javax.ws.rs.ext.Providers) WebServiceContext(javax.xml.ws.WebServiceContext) URL(java.net.URL) ObjectReference(org.apache.openejb.core.ivm.naming.ObjectReference) MapObjectReference(org.apache.openejb.core.ivm.naming.MapObjectReference) LazyObjectReference(org.apache.openejb.core.ivm.naming.LazyObjectReference) ServletContext(javax.servlet.ServletContext) PortRefData(org.apache.openejb.core.webservices.PortRefData) LinkRef(javax.naming.LinkRef) SecurityContext(javax.ws.rs.core.SecurityContext) WebServiceContext(javax.xml.ws.WebServiceContext) WebBeansContext(org.apache.webbeans.config.WebBeansContext) Context(javax.naming.Context) EJBContext(javax.ejb.EJBContext) ResourceContext(javax.ws.rs.container.ResourceContext) ServletContext(javax.servlet.ServletContext) URLReference(org.apache.openejb.core.ivm.naming.URLReference) ObjectReference(org.apache.openejb.core.ivm.naming.ObjectReference) MapObjectReference(org.apache.openejb.core.ivm.naming.MapObjectReference) JndiReference(org.apache.openejb.core.ivm.naming.JndiReference) PersistenceContextReference(org.apache.openejb.core.ivm.naming.PersistenceContextReference) Reference(org.apache.openejb.core.ivm.naming.Reference) IntraVmJndiReference(org.apache.openejb.core.ivm.naming.IntraVmJndiReference) URLReference(org.apache.openejb.core.ivm.naming.URLReference) ClassReference(org.apache.openejb.core.ivm.naming.ClassReference) CrossClassLoaderJndiReference(org.apache.openejb.core.ivm.naming.CrossClassLoaderJndiReference) SystemComponentReference(org.apache.openejb.core.ivm.naming.SystemComponentReference) LazyObjectReference(org.apache.openejb.core.ivm.naming.LazyObjectReference) JndiUrlReference(org.apache.openejb.core.ivm.naming.JndiUrlReference) JaxWsServiceReference(org.apache.openejb.core.ivm.naming.JaxWsServiceReference) Service(javax.xml.ws.Service) TimerService(javax.ejb.TimerService) ServiceRefData(org.apache.openejb.core.webservices.ServiceRefData) TreeMap(java.util.TreeMap) NamingException(javax.naming.NamingException) OpenEJBException(org.apache.openejb.OpenEJBException) SystemException(org.apache.openejb.SystemException) MalformedURLException(java.net.MalformedURLException) LinkRef(javax.naming.LinkRef) SecurityContext(javax.ws.rs.core.SecurityContext) MapObjectReference(org.apache.openejb.core.ivm.naming.MapObjectReference) ClassReference(org.apache.openejb.core.ivm.naming.ClassReference) UriInfo(javax.ws.rs.core.UriInfo) Validator(javax.validation.Validator)

Example 2 with HandlerChainData

use of org.apache.openejb.core.webservices.HandlerChainData 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 3 with HandlerChainData

use of org.apache.openejb.core.webservices.HandlerChainData in project tomee by apache.

the class JndiRequestHandler method doLookup.

private void doLookup(final JNDIRequest req, final JNDIResponse res, final String prefix) {
    Object object;
    final String name = req.getRequestString();
    try {
        if (name.equals("info/injections")) {
            //noinspection unchecked
            final List<Injection> injections = (List<Injection>) rootContext.lookup(prefix + name);
            final InjectionMetaData metaData = new InjectionMetaData();
            for (final Injection injection : injections) {
                if (injection.getTarget() == null) {
                    continue;
                }
                metaData.addInjection(injection.getTarget().getName(), injection.getName(), injection.getJndiName());
            }
            res.setResponseCode(ResponseCodes.JNDI_INJECTIONS);
            res.setResult(metaData);
            return;
        } else {
            try {
                object = rootContext.lookup(prefix + name);
            } catch (NameNotFoundException nnfe) {
                // fallback to resources
                object = rootContext.lookup("openejb/Resource/" + name);
            }
        }
        if (object instanceof Context) {
            res.setResponseCode(ResponseCodes.JNDI_CONTEXT);
            return;
        } else if (object == null) {
            throw new NullPointerException("lookup of '" + name + "' returned null");
        } else if (object instanceof DataSource) {
            if (DataSourceFactory.knows(object)) {
                try {
                    final DbcpDataSource cf = new DbcpDataSource(object);
                    final DataSourceMetaData dataSourceMetaData = new DataSourceMetaData(cf.getDriverClassName(), cf.getUrl(), cf.getUsername(), cf.getPassword());
                    res.setResponseCode(ResponseCodes.JNDI_DATA_SOURCE);
                    res.setResult(dataSourceMetaData);
                } catch (Exception e) {
                    res.setResponseCode(ResponseCodes.JNDI_ERROR);
                    res.setResult(new ThrowableArtifact(e));
                }
                return;
            } else if (object instanceof Referenceable) {
                res.setResponseCode(ResponseCodes.JNDI_REFERENCE);
                res.setResult(((Referenceable) object).getReference());
                return;
            }
        } else if (object instanceof ConnectionFactory) {
            res.setResponseCode(ResponseCodes.JNDI_RESOURCE);
            res.setResult(ConnectionFactory.class.getName());
            return;
        } else if (ORB_CLASS != null && ORB_CLASS.isInstance(object)) {
            res.setResponseCode(ResponseCodes.JNDI_RESOURCE);
            res.setResult(ORB_CLASS.getName());
            return;
        } else if (object instanceof ValidatorFactory) {
            res.setResponseCode(ResponseCodes.JNDI_RESOURCE);
            res.setResult(ValidatorFactory.class.getName());
            return;
        } else if (object instanceof Validator) {
            res.setResponseCode(ResponseCodes.JNDI_RESOURCE);
            res.setResult(Validator.class.getName());
            return;
        } else if (object instanceof Queue) {
            res.setResponseCode(ResponseCodes.JNDI_RESOURCE);
            res.setResult(Queue.class.getName());
            return;
        } else if (object instanceof Topic) {
            res.setResponseCode(ResponseCodes.JNDI_RESOURCE);
            res.setResult(Topic.class.getName());
            return;
        }
        final ServiceRefData serviceRef;
        if (object instanceof ServiceRefData) {
            serviceRef = (ServiceRefData) object;
        } else {
            serviceRef = ServiceRefData.getServiceRefData(object);
        }
        if (serviceRef != null) {
            final WsMetaData serviceMetaData = new WsMetaData();
            // service class
            String serviceClassName = null;
            if (serviceRef.getServiceClass() != null) {
                serviceClassName = serviceRef.getServiceClass().getName();
            }
            serviceMetaData.setServiceClassName(serviceClassName);
            // reference class
            String referenceClassName = null;
            if (serviceRef.getReferenceClass() != null) {
                referenceClassName = serviceRef.getReferenceClass().getName();
            }
            serviceMetaData.setReferenceClassName(referenceClassName);
            // set service qname
            if (serviceRef.getServiceQName() != null) {
                serviceMetaData.setServiceQName(serviceRef.getServiceQName().toString());
            }
            // get the port addresses for this service
            final PortAddressRegistry portAddressRegistry = SystemInstance.get().getComponent(PortAddressRegistry.class);
            Set<PortAddress> portAddresses = null;
            if (portAddressRegistry != null) {
                portAddresses = portAddressRegistry.getPorts(serviceRef.getId(), serviceRef.getServiceQName(), referenceClassName);
            }
            // resolve the wsdl url
            if (serviceRef.getWsdlURL() != null) {
                serviceMetaData.setWsdlUrl(serviceRef.getWsdlURL().toExternalForm());
            }
            if (portAddresses.size() == 1) {
                final PortAddress portAddress = portAddresses.iterator().next();
                serviceMetaData.setWsdlUrl(portAddress.getAddress() + "?wsdl");
            }
            // add handler chains
            for (final HandlerChainData handlerChain : serviceRef.getHandlerChains()) {
                final HandlerChainMetaData handlerChainMetaData = new HandlerChainMetaData();
                handlerChainMetaData.setServiceNamePattern(handlerChain.getServiceNamePattern());
                handlerChainMetaData.setPortNamePattern(handlerChain.getPortNamePattern());
                handlerChainMetaData.getProtocolBindings().addAll(handlerChain.getProtocolBindings());
                for (final HandlerData handler : handlerChain.getHandlers()) {
                    final HandlerMetaData handlerMetaData = new HandlerMetaData();
                    handlerMetaData.setHandlerClass(handler.getHandlerClass().getName());
                    for (final Method method : handler.getPostConstruct()) {
                        final CallbackMetaData callbackMetaData = new CallbackMetaData();
                        callbackMetaData.setClassName(method.getDeclaringClass().getName());
                        callbackMetaData.setMethod(method.getName());
                        handlerMetaData.getPostConstruct().add(callbackMetaData);
                    }
                    for (final Method method : handler.getPreDestroy()) {
                        final CallbackMetaData callbackMetaData = new CallbackMetaData();
                        callbackMetaData.setClassName(method.getDeclaringClass().getName());
                        callbackMetaData.setMethod(method.getName());
                        handlerMetaData.getPreDestroy().add(callbackMetaData);
                    }
                    handlerChainMetaData.getHandlers().add(handlerMetaData);
                }
                serviceMetaData.getHandlerChains().add(handlerChainMetaData);
            }
            // add port refs
            final Map<QName, PortRefMetaData> portsByQName = new HashMap<QName, PortRefMetaData>();
            for (final PortRefData portRef : serviceRef.getPortRefs()) {
                final PortRefMetaData portRefMetaData = new PortRefMetaData();
                portRefMetaData.setQName(portRef.getQName());
                portRefMetaData.setServiceEndpointInterface(portRef.getServiceEndpointInterface());
                portRefMetaData.setEnableMtom(portRef.isEnableMtom());
                portRefMetaData.getProperties().putAll(portRef.getProperties());
                portRefMetaData.getAddresses().addAll(portRef.getAddresses());
                if (portRef.getQName() != null) {
                    portsByQName.put(portRef.getQName(), portRefMetaData);
                }
                serviceMetaData.getPortRefs().add(portRefMetaData);
            }
            // add PortRefMetaData for any portAddress not added above
            for (final PortAddress portAddress : portAddresses) {
                PortRefMetaData portRefMetaData = portsByQName.get(portAddress.getPortQName());
                if (portRefMetaData == null) {
                    portRefMetaData = new PortRefMetaData();
                    portRefMetaData.setQName(portAddress.getPortQName());
                    portRefMetaData.setServiceEndpointInterface(portAddress.getServiceEndpointInterface());
                    portRefMetaData.getAddresses().add(portAddress.getAddress());
                    serviceMetaData.getPortRefs().add(portRefMetaData);
                } else {
                    portRefMetaData.getAddresses().add(portAddress.getAddress());
                    if (portRefMetaData.getServiceEndpointInterface() == null) {
                        portRefMetaData.setServiceEndpointInterface(portAddress.getServiceEndpointInterface());
                    }
                }
            }
            res.setResponseCode(ResponseCodes.JNDI_WEBSERVICE);
            res.setResult(serviceMetaData);
            return;
        }
    } catch (NameNotFoundException e) {
        res.setResponseCode(ResponseCodes.JNDI_NOT_FOUND);
        return;
    } catch (NamingException e) {
        res.setResponseCode(ResponseCodes.JNDI_NAMING_EXCEPTION);
        res.setResult(new ThrowableArtifact(e));
        return;
    }
    BaseEjbProxyHandler handler;
    try {
        handler = (BaseEjbProxyHandler) ProxyManager.getInvocationHandler(object);
    } catch (Exception e) {
        try {
            final Field field = object.getClass().getDeclaredField("invocationHandler");
            field.setAccessible(true);
            handler = (BaseEjbProxyHandler) field.get(object);
        } catch (Exception e1) {
            // Not a proxy.  See if it's serializable and send it
            if (object instanceof java.io.Serializable) {
                res.setResponseCode(ResponseCodes.JNDI_OK);
                res.setResult(object);
                return;
            } else {
                res.setResponseCode(ResponseCodes.JNDI_NAMING_EXCEPTION);
                final NamingException namingException = new NamingException("Expected an ejb proxy, found unknown object: type=" + object.getClass().getName() + ", toString=" + object);
                res.setResult(new ThrowableArtifact(namingException));
                return;
            }
        }
    }
    final ProxyInfo proxyInfo = handler.getProxyInfo();
    final BeanContext beanContext = proxyInfo.getBeanContext();
    final String deploymentID = beanContext.getDeploymentID().toString();
    updateServer(req, res, proxyInfo);
    switch(proxyInfo.getInterfaceType()) {
        case EJB_HOME:
            {
                res.setResponseCode(ResponseCodes.JNDI_EJBHOME);
                final EJBMetaDataImpl metaData = new EJBMetaDataImpl(beanContext.getHomeInterface(), beanContext.getRemoteInterface(), beanContext.getPrimaryKeyClass(), beanContext.getComponentType().toString(), deploymentID, -1, convert(proxyInfo.getInterfaceType()), null, beanContext.getAsynchronousMethodSignatures());
                metaData.loadProperties(beanContext.getProperties());
                log(metaData);
                res.setResult(metaData);
                break;
            }
        case EJB_LOCAL_HOME:
            {
                res.setResponseCode(ResponseCodes.JNDI_NAMING_EXCEPTION);
                final NamingException namingException = new NamingException("Not remotable: '" + name + "'. EJBLocalHome interfaces are not remotable as per the EJB specification.");
                res.setResult(new ThrowableArtifact(namingException));
                break;
            }
        case BUSINESS_REMOTE:
            {
                res.setResponseCode(ResponseCodes.JNDI_BUSINESS_OBJECT);
                final EJBMetaDataImpl metaData = new EJBMetaDataImpl(null, null, beanContext.getPrimaryKeyClass(), beanContext.getComponentType().toString(), deploymentID, -1, convert(proxyInfo.getInterfaceType()), proxyInfo.getInterfaces(), beanContext.getAsynchronousMethodSignatures());
                metaData.setPrimaryKey(proxyInfo.getPrimaryKey());
                metaData.loadProperties(beanContext.getProperties());
                log(metaData);
                res.setResult(metaData);
                break;
            }
        case BUSINESS_LOCAL:
            {
                res.setResponseCode(ResponseCodes.JNDI_NAMING_EXCEPTION);
                final NamingException namingException = new NamingException("Not remotable: '" + name + "'. Business Local interfaces are not remotable as per the EJB specification.  To disable this restriction, set the system property 'openejb.remotable.businessLocals=true' in the server.");
                res.setResult(new ThrowableArtifact(namingException));
                break;
            }
        case LOCALBEAN:
            {
                res.setResponseCode(ResponseCodes.JNDI_NAMING_EXCEPTION);
                final NamingException namingException = new NamingException("Not remotable: '" + name + "'. LocalBean classes are not remotable as per the EJB specification.");
                res.setResult(new ThrowableArtifact(namingException));
                break;
            }
        default:
            {
                res.setResponseCode(ResponseCodes.JNDI_NAMING_EXCEPTION);
                final NamingException namingException = new NamingException("Not remotable: '" + name + "'.");
                res.setResult(new ThrowableArtifact(namingException));
            }
    }
}
Also used : HandlerChainData(org.apache.openejb.core.webservices.HandlerChainData) HandlerMetaData(org.apache.openejb.client.HandlerMetaData) HashMap(java.util.HashMap) WsMetaData(org.apache.openejb.client.WsMetaData) DataSourceMetaData(org.apache.openejb.client.DataSourceMetaData) InjectionMetaData(org.apache.openejb.client.InjectionMetaData) HandlerData(org.apache.openejb.core.webservices.HandlerData) Field(java.lang.reflect.Field) ProxyInfo(org.apache.openejb.ProxyInfo) ConnectionFactory(javax.jms.ConnectionFactory) Referenceable(javax.resource.Referenceable) List(java.util.List) ArrayList(java.util.ArrayList) NamingException(javax.naming.NamingException) PortRefData(org.apache.openejb.core.webservices.PortRefData) Topic(javax.jms.Topic) Queue(java.util.Queue) CallbackMetaData(org.apache.openejb.client.CallbackMetaData) IvmContext(org.apache.openejb.core.ivm.naming.IvmContext) BeanContext(org.apache.openejb.BeanContext) Context(javax.naming.Context) BaseEjbProxyHandler(org.apache.openejb.core.ivm.BaseEjbProxyHandler) ValidatorFactory(javax.validation.ValidatorFactory) NameNotFoundException(javax.naming.NameNotFoundException) QName(javax.xml.namespace.QName) ThrowableArtifact(org.apache.openejb.client.ThrowableArtifact) PortRefMetaData(org.apache.openejb.client.PortRefMetaData) Injection(org.apache.openejb.Injection) ServiceRefData(org.apache.openejb.core.webservices.ServiceRefData) Method(java.lang.reflect.Method) NamingException(javax.naming.NamingException) NameNotFoundException(javax.naming.NameNotFoundException) DataSource(javax.sql.DataSource) BeanContext(org.apache.openejb.BeanContext) PortAddress(org.apache.openejb.core.webservices.PortAddress) EJBMetaDataImpl(org.apache.openejb.client.EJBMetaDataImpl) PortAddressRegistry(org.apache.openejb.core.webservices.PortAddressRegistry) Validator(javax.validation.Validator) HandlerChainMetaData(org.apache.openejb.client.HandlerChainMetaData)

Example 4 with HandlerChainData

use of org.apache.openejb.core.webservices.HandlerChainData in project tomee by apache.

the class WsBuilder method toHandlerChainData.

public static List<HandlerChainData> toHandlerChainData(final List<HandlerChainInfo> chains, final ClassLoader classLoader) throws OpenEJBException {
    final List<HandlerChainData> handlerChains = new ArrayList<HandlerChainData>();
    for (final HandlerChainInfo handlerChain : chains) {
        final List<HandlerData> handlers = new ArrayList<HandlerData>();
        for (final HandlerInfo handler : handlerChain.handlers) {
            try {
                final Class<?> handlerClass = classLoader.loadClass(handler.handlerClass);
                final HandlerData handlerData = new HandlerData(handlerClass);
                handlerData.getInitParams().putAll(handler.initParams);
                handlerData.getSoapHeaders().addAll(handler.soapHeaders);
                handlerData.getSoapRoles().addAll(handler.soapRoles);
                handlers.add(handlerData);
            } catch (final ClassNotFoundException e) {
                throw new OpenEJBException("Could not load handler class " + handler.handlerClass);
            }
        }
        final HandlerChainData handlerChainData = new HandlerChainData(handlerChain.serviceNamePattern, handlerChain.portNamePattern, handlerChain.protocolBindings, handlers);
        handlerChains.add(handlerChainData);
    }
    return handlerChains;
}
Also used : HandlerData(org.apache.openejb.core.webservices.HandlerData) HandlerChainData(org.apache.openejb.core.webservices.HandlerChainData) OpenEJBException(org.apache.openejb.OpenEJBException) ArrayList(java.util.ArrayList)

Example 5 with HandlerChainData

use of org.apache.openejb.core.webservices.HandlerChainData in project tomee by apache.

the class TomcatJndiBuilder method mergeRef.

public void mergeRef(final NamingResourcesImpl naming, final ServiceReferenceInfo ref) {
    if (isLookupRef(naming, ref)) {
        return;
    }
    ContextResource resource = naming.findResource(ref.referenceName.replaceAll("^comp/env/", ""));
    boolean addEntry = false;
    if (resource == null) {
        resource = new ContextResource();
        resource.setName(ref.referenceName.replaceAll("^comp/env/", ""));
        addEntry = true;
    }
    resource.setProperty(Constants.FACTORY, WsFactory.class.getName());
    resource.setProperty(NamingUtil.NAME, ref.referenceName.replaceAll("^comp/env/", ""));
    if (ref.referenceType != null) {
        resource.setType(ref.referenceType);
    } else {
        resource.setType(ref.serviceType);
    }
    if (ref.location != null) {
        resource.setProperty(NamingUtil.JNDI_NAME, ref.location.jndiName);
        resource.setProperty(NamingUtil.JNDI_PROVIDER_ID, ref.location.jndiProviderId);
    } else {
        // ID
        if (ref.id != null) {
            resource.setProperty(NamingUtil.WS_ID, ref.id);
        }
        // Service QName
        if (ref.serviceQName != null) {
            resource.setProperty(NamingUtil.WS_QNAME, ref.serviceQName.toString());
        }
        // Service Class
        resource.setProperty(NamingUtil.WS_CLASS, ref.serviceType);
        // Port QName
        if (ref.portQName != null) {
            resource.setProperty(NamingUtil.WS_PORT_QNAME, ref.portQName.toString());
        }
        // add the wsdl url
        final URL wsdlURL = getWsdlUrl(ref);
        if (wsdlURL != null) {
            resource.setProperty(NamingUtil.WSDL_URL, wsdlURL.toString());
        }
        // add port refs
        if (!ref.portRefs.isEmpty()) {
            final List<PortRefData> portRefs = new ArrayList<PortRefData>(ref.portRefs.size());
            for (final PortRefInfo portRefInfo : ref.portRefs) {
                final PortRefData portRef = new PortRefData();
                portRef.setQName(portRefInfo.qname);
                portRef.setServiceEndpointInterface(portRefInfo.serviceEndpointInterface);
                portRef.setEnableMtom(portRefInfo.enableMtom);
                portRef.getProperties().putAll(portRefInfo.properties);
                portRefs.add(portRef);
            }
            setResource(resource, "port-refs", portRefs);
        }
        // add the handle chains
        if (!ref.handlerChains.isEmpty()) {
            try {
                final List<HandlerChainData> handlerChains = WsBuilder.toHandlerChainData(ref.handlerChains, standardContext.getLoader().getClassLoader());
                setResource(resource, "handler-chains", handlerChains);
                setResource(resource, "injections", injections);
            } catch (final OpenEJBException e) {
                throw new IllegalArgumentException("Error creating handler chain for web service-ref " + ref.referenceName.replaceAll("^comp/env/", ""));
            }
        }
    }
    // if there was a service entry, remove it
    final ContextService service = naming.findService(ref.referenceName.replaceAll("^comp/env/", ""));
    final String serviceName = service != null ? service.getName() : null;
    if (serviceName != null) {
        ContextAccessController.setWritable(namingContextListener.getName(), standardContext.getNamingToken());
        if (!addEntry) {
            namingContextListener.removeService(serviceName);
        }
        ContextAccessController.setReadOnly(namingContextListener.getName());
    }
    // add the new resource entry
    if (addEntry) {
        naming.addResource(resource);
    }
    // or replace the exisitng resource entry
    if (replaceEntry) {
        ContextAccessController.setWritable(namingContextListener.getName(), standardContext.getNamingToken());
        if (!addEntry) {
            namingContextListener.removeResource(resource.getName());
        }
        namingContextListener.addResource(resource);
        ContextAccessController.setReadOnly(namingContextListener.getName());
    }
}
Also used : HandlerChainData(org.apache.openejb.core.webservices.HandlerChainData) OpenEJBException(org.apache.openejb.OpenEJBException) WsFactory(org.apache.tomee.common.WsFactory) ContextService(org.apache.tomcat.util.descriptor.web.ContextService) ArrayList(java.util.ArrayList) PortRefInfo(org.apache.openejb.assembler.classic.PortRefInfo) URL(java.net.URL) ContextResource(org.apache.tomcat.util.descriptor.web.ContextResource) PortRefData(org.apache.openejb.core.webservices.PortRefData)

Aggregations

HandlerChainData (org.apache.openejb.core.webservices.HandlerChainData)5 ArrayList (java.util.ArrayList)4 PortRefData (org.apache.openejb.core.webservices.PortRefData)4 URL (java.net.URL)3 NamingException (javax.naming.NamingException)3 Context (javax.naming.Context)2 Validator (javax.validation.Validator)2 QName (javax.xml.namespace.QName)2 Service (javax.xml.ws.Service)2 Injection (org.apache.openejb.Injection)2 OpenEJBException (org.apache.openejb.OpenEJBException)2 JaxWsServiceReference (org.apache.openejb.core.ivm.naming.JaxWsServiceReference)2 ServiceRefData (org.apache.openejb.core.webservices.ServiceRefData)2 Field (java.lang.reflect.Field)1 Method (java.lang.reflect.Method)1 MalformedURLException (java.net.MalformedURLException)1 HashMap (java.util.HashMap)1 List (java.util.List)1 Properties (java.util.Properties)1 Queue (java.util.Queue)1