Search in sources :

Example 1 with ThrowableArtifact

use of org.apache.openejb.client.ThrowableArtifact 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)

Example 2 with ThrowableArtifact

use of org.apache.openejb.client.ThrowableArtifact in project tomee by apache.

the class EjbRequestHandler method doEjbHome_CREATE.

protected void doEjbHome_CREATE(final EJBRequest req, final EJBResponse res) throws Exception {
    final CallContext call = CallContext.getCallContext();
    final RpcContainer c = (RpcContainer) call.getBeanContext().getContainer();
    Object result = c.invoke(req.getDeploymentId(), InterfaceType.EJB_HOME, req.getInterfaceClass(), req.getMethodInstance(), req.getMethodParameters(), req.getPrimaryKey());
    if (result instanceof ProxyInfo) {
        final ProxyInfo info = (ProxyInfo) result;
        res.setResponse(req.getVersion(), ResponseCodes.EJB_OK, info.getPrimaryKey());
    } else {
        result = new RemoteException("The bean is not EJB compliant.  The bean should be created or and exception should be thrown.");
        LOGGER.error(req + "The bean is not EJB compliant.  The bean should be created or and exception should be thrown.");
        res.setResponse(req.getVersion(), ResponseCodes.EJB_SYS_EXCEPTION, new ThrowableArtifact((Throwable) result));
    }
}
Also used : ProxyInfo(org.apache.openejb.ProxyInfo) RpcContainer(org.apache.openejb.RpcContainer) ThrowableArtifact(org.apache.openejb.client.ThrowableArtifact) RemoteException(java.rmi.RemoteException)

Example 3 with ThrowableArtifact

use of org.apache.openejb.client.ThrowableArtifact in project tomee by apache.

the class JndiRequestHandler method processRequest.

@Override
public Response processRequest(final ObjectInputStream in, final ProtocolMetaData metaData) {
    final JNDIRequest req = new JNDIRequest();
    final JNDIResponse res = new JNDIResponse();
    res.setRequest(req);
    try {
        req.setMetaData(metaData);
        req.readExternal(in);
    } catch (Throwable e) {
        res.setResponseCode(ResponseCodes.JNDI_NAMING_EXCEPTION);
        final NamingException namingException = new NamingException("Could not read jndi request");
        namingException.setRootCause(e);
        res.setResult(new ThrowableArtifact(namingException));
        if (LOGGER.isDebugEnabled()) {
            try {
                logRequestResponse(req, res);
            } catch (Exception ignore) {
            // no-op
            }
        }
    }
    return res;
}
Also used : JNDIRequest(org.apache.openejb.client.JNDIRequest) JNDIResponse(org.apache.openejb.client.JNDIResponse) ThrowableArtifact(org.apache.openejb.client.ThrowableArtifact) NamingException(javax.naming.NamingException) NamingException(javax.naming.NamingException) NameNotFoundException(javax.naming.NameNotFoundException)

Example 4 with ThrowableArtifact

use of org.apache.openejb.client.ThrowableArtifact in project tomee by apache.

the class JndiRequestHandler method processResponse.

@Override
public void processResponse(final Response response, final ObjectOutputStream out, final ProtocolMetaData metaData) throws Exception {
    if (JNDIResponse.class.isInstance(response)) {
        final JNDIResponse res = (JNDIResponse) response;
        final JNDIRequest req = res.getRequest();
        try {
            // Only process if 'processRequest' was ok...
            final Object result = res.getResult();
            if (null == result || !ThrowableArtifact.class.isInstance(result)) {
                if (req.getRequestString().startsWith("/")) {
                    req.setRequestString(req.getRequestString().substring(1));
                }
                final String prefix = getPrefix(req);
                switch(req.getRequestMethod()) {
                    case JNDI_LOOKUP:
                        doLookup(req, res, prefix);
                        break;
                    case JNDI_LIST:
                        doList(req, res, prefix);
                        break;
                }
            }
        } catch (Throwable e) {
            res.setResponseCode(ResponseCodes.JNDI_NAMING_EXCEPTION);
            final NamingException namingException = new NamingException("Unknown error in container");
            namingException.setRootCause(e);
            res.setResult(new ThrowableArtifact(namingException));
        } finally {
            try {
                res.setMetaData(metaData);
                res.writeExternal(out);
            } catch (Throwable e) {
                LOGGER.fatal("Could not write JndiResponse to output stream", e);
            }
            if (LOGGER.isDebugEnabled()) {
                try {
                    // force it to as correct as possible response size
                    out.flush();
                    logRequestResponse(req, res);
                } catch (Exception ignore) {
                // no-op
                }
            }
        }
    } else {
        LOGGER.error("JndiRequestHandler cannot process an instance of: " + response.getClass().getName());
    }
}
Also used : JNDIRequest(org.apache.openejb.client.JNDIRequest) JNDIResponse(org.apache.openejb.client.JNDIResponse) ThrowableArtifact(org.apache.openejb.client.ThrowableArtifact) NamingException(javax.naming.NamingException) NamingException(javax.naming.NamingException) NameNotFoundException(javax.naming.NameNotFoundException)

Example 5 with ThrowableArtifact

use of org.apache.openejb.client.ThrowableArtifact in project tomee by apache.

the class JndiRequestHandler method doList.

private void doList(final JNDIRequest req, final JNDIResponse res, final String prefix) {
    final String name = req.getRequestString();
    try {
        final NamingEnumeration<NameClassPair> namingEnumeration = rootContext.list(prefix + name);
        if (namingEnumeration == null) {
            res.setResponseCode(ResponseCodes.JNDI_OK);
            res.setResult(null);
        } else {
            res.setResponseCode(ResponseCodes.JNDI_ENUMERATION);
            final ArrayList<NameClassPair> list = Collections.list(namingEnumeration);
            for (final NameClassPair pair : list) {
                if (pair.getClassName().equals(IvmContext.class.getName())) {
                    pair.setClassName(javax.naming.Context.class.getName());
                }
            }
            res.setResult(new NameClassPairEnumeration(list));
        }
    } catch (NameNotFoundException e) {
        res.setResponseCode(ResponseCodes.JNDI_NOT_FOUND);
    } catch (NamingException e) {
        res.setResponseCode(ResponseCodes.JNDI_NAMING_EXCEPTION);
        res.setResult(new ThrowableArtifact(e));
    }
}
Also used : IvmContext(org.apache.openejb.core.ivm.naming.IvmContext) BeanContext(org.apache.openejb.BeanContext) Context(javax.naming.Context) IvmContext(org.apache.openejb.core.ivm.naming.IvmContext) NameNotFoundException(javax.naming.NameNotFoundException) NameClassPair(javax.naming.NameClassPair) ThrowableArtifact(org.apache.openejb.client.ThrowableArtifact) NamingException(javax.naming.NamingException) NameClassPairEnumeration(org.apache.openejb.client.NameClassPairEnumeration)

Aggregations

ThrowableArtifact (org.apache.openejb.client.ThrowableArtifact)7 NameNotFoundException (javax.naming.NameNotFoundException)4 NamingException (javax.naming.NamingException)4 RemoteException (java.rmi.RemoteException)3 BeanContext (org.apache.openejb.BeanContext)3 Context (javax.naming.Context)2 ProxyInfo (org.apache.openejb.ProxyInfo)2 JNDIRequest (org.apache.openejb.client.JNDIRequest)2 JNDIResponse (org.apache.openejb.client.JNDIResponse)2 IvmContext (org.apache.openejb.core.ivm.naming.IvmContext)2 Field (java.lang.reflect.Field)1 Method (java.lang.reflect.Method)1 ArrayList (java.util.ArrayList)1 HashMap (java.util.HashMap)1 List (java.util.List)1 Queue (java.util.Queue)1 ConnectionFactory (javax.jms.ConnectionFactory)1 Topic (javax.jms.Topic)1 NameClassPair (javax.naming.NameClassPair)1 Referenceable (javax.resource.Referenceable)1