Search in sources :

Example 1 with ServiceRefData

use of org.apache.openejb.core.webservices.ServiceRefData 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<>();
    // 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 = 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 if (Application.class.equals(type)) {
                reference = new ObjectReference(ThreadLocalContextManager.APPLICATION);
            } 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<>(new BeanManagerLazyReference());
        } 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<>(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) 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 ServiceRefData

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

the class JaxWsServiceReference method getObject.

public Object getObject() throws NamingException {
    final String referenceClassName = referenceClass != null ? referenceClass.getName() : null;
    final Set<PortAddress> portAddresses = getPortAddressRegistry().getPorts(id, serviceQName, referenceClassName);
    // if we only have one address, use that address for the wsdl and the serviceQName
    URL wsdlUrl = this.wsdlUrl;
    QName serviceQName = this.serviceQName;
    if (portAddresses.size() == 1) {
        final PortAddress portAddress = portAddresses.iterator().next();
        try {
            wsdlUrl = new URL(portAddress.getAddress() + "?wsdl");
        } catch (final MalformedURLException e) {
        // no-op
        }
        serviceQName = portAddress.getServiceQName();
    }
    // add the port addresses to the portRefData
    final Map<QName, PortRefData> portsByQName = new HashMap<>();
    final List<PortRefData> ports = new ArrayList<>(portRefs.size() + portAddresses.size());
    for (final PortRefData portRef : portRefs) {
        final PortRefData port = new PortRefData(portRef);
        if (port.getQName() != null) {
            portsByQName.put(port.getQName(), port);
        }
        ports.add(port);
    }
    // add PortRefData for any portAddress not added above
    for (final PortAddress portAddress : portAddresses) {
        PortRefData port = portsByQName.get(portAddress.getPortQName());
        if (port == null) {
            port = new PortRefData();
            port.setQName(portAddress.getPortQName());
            port.setServiceEndpointInterface(portAddress.getServiceEndpointInterface());
            port.getAddresses().add(portAddress.getAddress());
            ports.add(port);
        } else {
            port.getAddresses().add(portAddress.getAddress());
            if (port.getServiceEndpointInterface() == null) {
                port.setServiceEndpointInterface(portAddress.getServiceEndpointInterface());
            }
        }
    }
    final WebServiceClientCustomizer customizer = SystemInstance.get().getComponent(WebServiceClientCustomizer.class);
    final Properties configuration = properties == null ? new Properties() : properties;
    ProviderWrapper.beforeCreate(ports, customizer, properties);
    Service instance;
    try {
        instance = null;
        if (Service.class.equals(serviceClass)) {
            instance = Service.create(wsdlUrl, serviceQName);
        } else {
            try {
                instance = serviceClass.getConstructor(URL.class, QName.class).newInstance(wsdlUrl, serviceQName);
            } catch (final Throwable e) {
                throw (NamingException) new NamingException("Could not instantiate jax-ws service class " + serviceClass.getName()).initCause(e);
            }
        }
    } finally {
        ProviderWrapper.afterCreate();
    }
    if (!handlerChains.isEmpty()) {
        final HandlerResolver handlerResolver = new HandlerResolverImpl(handlerChains, injections, new InitialContext());
        instance.setHandlerResolver(handlerResolver);
    }
    final Object port;
    if (referenceClass != null && !Service.class.isAssignableFrom(referenceClass)) {
        final WebServiceFeature[] features = customizer == null ? null : customizer.features(serviceQName, configuration);
        // do port lookup
        if (features == null || features.length == 0) {
            port = instance.getPort(referenceClass);
        } else {
            port = instance.getPort(referenceClass, features);
        }
    } else {
        // return service
        port = instance;
    }
    // register the service data so it can be fetched when the service is passed over the EJBd protocol
    final ServiceRefData serviceRefData = new ServiceRefData(id, serviceQName, serviceClass, portQName, referenceClass, wsdlUrl, handlerChains, portRefs);
    ServiceRefData.putServiceRefData(port, serviceRefData);
    return port;
}
Also used : MalformedURLException(java.net.MalformedURLException) HashMap(java.util.HashMap) QName(javax.xml.namespace.QName) ArrayList(java.util.ArrayList) Service(javax.xml.ws.Service) ServiceRefData(org.apache.openejb.core.webservices.ServiceRefData) Properties(java.util.Properties) URL(java.net.URL) InitialContext(javax.naming.InitialContext) HandlerResolverImpl(org.apache.openejb.core.webservices.HandlerResolverImpl) HandlerResolver(javax.xml.ws.handler.HandlerResolver) PortAddress(org.apache.openejb.core.webservices.PortAddress) WebServiceFeature(javax.xml.ws.WebServiceFeature) NamingException(javax.naming.NamingException) PortRefData(org.apache.openejb.core.webservices.PortRefData)

Example 3 with ServiceRefData

use of org.apache.openejb.core.webservices.ServiceRefData 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<>();
            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)

Aggregations

ArrayList (java.util.ArrayList)3 NamingException (javax.naming.NamingException)3 PortRefData (org.apache.openejb.core.webservices.PortRefData)3 ServiceRefData (org.apache.openejb.core.webservices.ServiceRefData)3 MalformedURLException (java.net.MalformedURLException)2 URL (java.net.URL)2 HashMap (java.util.HashMap)2 Context (javax.naming.Context)2 Validator (javax.validation.Validator)2 QName (javax.xml.namespace.QName)2 Service (javax.xml.ws.Service)2 HandlerChainData (org.apache.openejb.core.webservices.HandlerChainData)2 PortAddress (org.apache.openejb.core.webservices.PortAddress)2 Field (java.lang.reflect.Field)1 Method (java.lang.reflect.Method)1 List (java.util.List)1 Properties (java.util.Properties)1 Queue (java.util.Queue)1 TreeMap (java.util.TreeMap)1 ManagedBean (javax.annotation.ManagedBean)1