Search in sources :

Example 16 with WebContext

use of org.apache.openejb.core.WebContext in project tomee by apache.

the class javaURLContextFactory method getContext.

public static Context getContext() {
    final ThreadContext callContext = ThreadContext.getThreadContext();
    if (callContext == null) {
        final ContainerSystem containerSystem = SystemInstance.get().getComponent(ContainerSystem.class);
        final ClassLoader current = Thread.currentThread().getContextClassLoader();
        final Context globalContext = containerSystem.getJNDIContext();
        if (current == null) {
            return globalContext;
        }
        for (final AppContext appContext : containerSystem.getAppContexts()) {
            for (final WebContext web : appContext.getWebContexts()) {
                // more specific first
                if (current.equals(web.getClassLoader())) {
                    return new ContextHandler(web.getJndiEnc());
                }
            }
            if (current.equals(appContext.getClassLoader())) {
                return new ContextHandler(appContext.getAppJndiContext());
            }
        }
        return globalContext;
    }
    final BeanContext di = callContext.getBeanContext();
    if (di != null) {
        return di.getJndiEnc();
    } else {
        final ContainerSystem containerSystem = SystemInstance.get().getComponent(ContainerSystem.class);
        return containerSystem.getJNDIContext();
    }
}
Also used : ContainerSystem(org.apache.openejb.spi.ContainerSystem) BeanContext(org.apache.openejb.BeanContext) WebContext(org.apache.openejb.core.WebContext) AppContext(org.apache.openejb.AppContext) Context(javax.naming.Context) ThreadContext(org.apache.openejb.core.ThreadContext) ContextHandler(org.apache.openejb.core.ivm.ContextHandler) BeanContext(org.apache.openejb.BeanContext) WebContext(org.apache.openejb.core.WebContext) AppContext(org.apache.openejb.AppContext) ThreadContext(org.apache.openejb.core.ThreadContext)

Example 17 with WebContext

use of org.apache.openejb.core.WebContext in project tomee by apache.

the class ContextualJndiReference method findPrefix.

private String findPrefix() {
    final ClassLoader loader = Thread.currentThread().getContextClassLoader();
    final ContainerSystem containerSystem = SystemInstance.get().getComponent(ContainerSystem.class);
    for (final AppContext appContext : containerSystem.getAppContexts()) {
        if (appContext.getClassLoader().equals(loader)) {
            return appContext.getId();
        }
        for (final WebContext web : appContext.getWebContexts()) {
            if (web.getClassLoader().equals(loader)) {
                return appContext.getId();
            }
        }
    }
    if (1 == containerSystem.getAppContexts().size()) {
        return containerSystem.getAppContexts().iterator().next().getId();
    }
    return null;
}
Also used : ContainerSystem(org.apache.openejb.spi.ContainerSystem) WebContext(org.apache.openejb.core.WebContext) AppContext(org.apache.openejb.AppContext)

Example 18 with WebContext

use of org.apache.openejb.core.WebContext in project tomee by apache.

the class TomcatWebAppBuilder method afterStart.

/**
 * {@inheritDoc}
 */
@Override
public void afterStart(final StandardContext standardContext) {
    if (isIgnored(standardContext)) {
        return;
    }
    if (shouldNotDeploy(standardContext)) {
        return;
    }
    final Realm realm = standardContext.getRealm();
    final ClassLoader classLoader = standardContext.getLoader().getClassLoader();
    final Thread thread = Thread.currentThread();
    final ClassLoader originalLoader = thread.getContextClassLoader();
    if (realm != null && !(realm instanceof TomEERealm) && (standardContext.getParent() == null || (!realm.equals(standardContext.getParent().getRealm())))) {
        thread.setContextClassLoader(classLoader);
        try {
            standardContext.setRealm(tomeeRealm(realm));
        } finally {
            thread.setContextClassLoader(originalLoader);
        }
    }
    // if appInfo is null this is a failed deployment... just ignore
    final ContextInfo contextInfo = getContextInfo(standardContext);
    // shouldnt be there after startup (actually we shouldnt need it from info tree but our scanning does)
    contextInfo.module = null;
    if (contextInfo != null && contextInfo.appInfo == null) {
        return;
    } else if (contextInfo == null) {
        // openejb webapp loaded from the LoaderServlet
        return;
    }
    final String id = getId(standardContext);
    WebAppInfo currentWebAppInfo = null;
    for (final WebAppInfo webAppInfo : contextInfo.appInfo.webApps) {
        final String wId = getId(webAppInfo.host, webAppInfo.contextRoot, contextInfo.version);
        if (id.equals(wId)) {
            currentWebAppInfo = webAppInfo;
            break;
        }
    }
    // bind extra stuff at the java:comp level which can only be
    // bound after the context is created
    thread.setContextClassLoader(classLoader);
    final NamingContextListener ncl = standardContext.getNamingContextListener();
    final String listenerName = ncl.getName();
    ContextAccessController.setWritable(listenerName, standardContext.getNamingToken());
    try {
        final Context openejbContext = (Context) getContainerSystem().getJNDIContext().lookup("openejb");
        final Context root = (Context) ContextBindings.getClassLoader().lookup("");
        // usually fails
        final Context comp = (Context) ContextBindings.getClassLoader().lookup("comp");
        // Context root = ncl.getNamingContext();
        // Context comp = (Context) root.lookup("comp");
        safeBind(root, "openejb", openejbContext);
        // add context to WebDeploymentInfo
        if (currentWebAppInfo != null) {
            final WebContext webContext = getContainerSystem().getWebContext(currentWebAppInfo.moduleId);
            if (webContext != null) {
                webContext.setJndiEnc(root);
            }
            try {
                // Bean Validation
                standardContext.getServletContext().setAttribute("javax.faces.validator.beanValidator.ValidatorFactory", openejbContext.lookup(Assembler.VALIDATOR_FACTORY_NAMING_CONTEXT.replaceFirst("openejb", "") + currentWebAppInfo.uniqueId));
            } catch (final NamingException ne) {
                LOGGER.warning("no validator factory found for webapp " + currentWebAppInfo.moduleId);
            }
        }
        try {
            final Class<?> orb = TomcatWebAppBuilder.class.getClassLoader().loadClass("org.omg.CORBA.ORB");
            if (SystemInstance.get().getComponent(orb) != null) {
                safeBind(comp, "ORB", new SystemComponentReference(orb));
            }
        } catch (final NoClassDefFoundError | ClassNotFoundException cnfe) {
        // no-op
        }
        if (SystemInstance.get().getComponent(HandleDelegate.class) != null) {
            safeBind(comp, "HandleDelegate", new SystemComponentReference(HandleDelegate.class));
        }
    } catch (final NamingException e) {
    // no-op
    } finally {
        // see also the start method getContainerSystem().addWebDeployment(webContext);
        try {
            servletContextHandler.getContexts().put(classLoader, standardContext.getServletContext());
            for (final WebAppInfo webAppInfo : contextInfo.appInfo.webApps) {
                final String wId = getId(webAppInfo.host, webAppInfo.contextRoot, contextInfo.version);
                if (id.equals(wId)) {
                    // Allow any post-deployment to happen without the RequestContext of a call to /tomee/ejb
                    final Request request = OpenEJBSecurityListener.requests.get();
                    OpenEJBSecurityListener.requests.remove();
                    SystemInstance.get().fireEvent(new AfterApplicationCreated(contextInfo.appInfo, webAppInfo, standardContext.getServletContext()));
                    if (request != null) {
                        OpenEJBSecurityListener.requests.set(request);
                    }
                    break;
                }
            }
        } finally {
            servletContextHandler.getContexts().remove(classLoader);
        }
        thread.setContextClassLoader(originalLoader);
        ContextAccessController.setReadOnly(listenerName);
    }
    thread.setContextClassLoader(classLoader);
    try {
        // owb integration filters
        final WebBeansContext webBeansContext = getWebBeansContext(contextInfo);
        if (webBeansContext != null) {
            // it is important to have a begin and a end listener
            // to be sure to create contexts before other listeners
            // and destroy contexts after other listeners
            final BeginWebBeansListener beginWebBeansListener = new BeginWebBeansListener(webBeansContext);
            final EndWebBeansListener endWebBeansListener = new EndWebBeansListener(webBeansContext);
            {
                final Object[] appEventListeners = standardContext.getApplicationEventListeners();
                final Object[] newEventListeners = new Object[appEventListeners.length + 2];
                newEventListeners[0] = beginWebBeansListener;
                System.arraycopy(appEventListeners, 0, newEventListeners, 1, appEventListeners.length);
                newEventListeners[newEventListeners.length - 1] = endWebBeansListener;
                standardContext.setApplicationEventListeners(newEventListeners);
            }
            {
                final Object[] lifecycleListeners = standardContext.getApplicationLifecycleListeners();
                final Object[] newLifecycleListeners = new Object[lifecycleListeners.length + 2];
                newLifecycleListeners[0] = beginWebBeansListener;
                System.arraycopy(lifecycleListeners, 0, newLifecycleListeners, 1, lifecycleListeners.length);
                newLifecycleListeners[newLifecycleListeners.length - 1] = endWebBeansListener;
                standardContext.setApplicationLifecycleListeners(newLifecycleListeners);
            }
            // also add the ThreadBindingListener to clean up async thread executions
            {
                WebBeansThreadBindingListener webBeansThreadBindingListener = new WebBeansThreadBindingListener(webBeansContext, standardContext.getThreadBindingListener());
                standardContext.setThreadBindingListener(webBeansThreadBindingListener);
            }
            final ContextsService contextsService = webBeansContext.getContextsService();
            if (CdiAppContextsService.class.isInstance(contextsService)) {
                // here ServletContext is usable
                CdiAppContextsService.class.cast(contextsService).applicationStarted(standardContext.getServletContext());
            }
        } else {
            // just add the end listener to be able to stack tasks to execute at the request end
            final EndWebBeansListener endWebBeansListener = new EndWebBeansListener(webBeansContext);
            {
                final Object[] appEventListeners = standardContext.getApplicationEventListeners();
                final Object[] newEventListeners = new Object[appEventListeners.length + 1];
                System.arraycopy(appEventListeners, 0, newEventListeners, 0, appEventListeners.length);
                newEventListeners[newEventListeners.length - 1] = endWebBeansListener;
                standardContext.setApplicationEventListeners(newEventListeners);
            }
            {
                final Object[] lifecycleListeners = standardContext.getApplicationLifecycleListeners();
                final Object[] newLifecycleListeners = new Object[lifecycleListeners.length + 1];
                System.arraycopy(lifecycleListeners, 0, newLifecycleListeners, 0, lifecycleListeners.length);
                newLifecycleListeners[newLifecycleListeners.length - 1] = endWebBeansListener;
                standardContext.setApplicationLifecycleListeners(newLifecycleListeners);
            }
        }
    } finally {
        thread.setContextClassLoader(originalLoader);
    }
    LinkageErrorProtection.preload(standardContext);
    final Pipeline pipeline = standardContext.getPipeline();
    pipeline.addValve(new OpenEJBValve());
    final String[] valves = SystemInstance.get().getOptions().get("tomee.valves", "").split(" *, *");
    for (final String className : valves) {
        if ("".equals(className)) {
            continue;
        }
        try {
            final Class<?> clazz = classLoader.loadClass(className);
            if (Valve.class.isAssignableFrom(clazz)) {
                final Valve valve = (Valve) clazz.newInstance();
                pipeline.addValve(valve);
            }
        } catch (final Exception e) {
            LOGGER.error("can't add the valve " + className, e);
        }
    }
    // add servlets to webappinfo
    if (currentWebAppInfo != null) {
        for (final String mapping : standardContext.findServletMappings()) {
            final ServletInfo info = new ServletInfo();
            info.servletName = standardContext.findServletMapping(mapping);
            info.mappings.add(mapping);
            final Container container = standardContext.findChild(info.servletName);
            if (container instanceof StandardWrapper) {
                info.servletClass = ((StandardWrapper) container).getServletClass();
            } else {
                info.servletClass = mapping;
            }
            currentWebAppInfo.servlets.add(info);
        }
    }
    addConfiguredDocBases(standardContext, contextInfo);
    ensureMyFacesDontLooseFacesContext(standardContext);
}
Also used : WebContext(org.apache.openejb.core.WebContext) CdiAppContextsService(org.apache.openejb.cdi.CdiAppContextsService) ServletInfo(org.apache.openejb.assembler.classic.ServletInfo) BeginWebBeansListener(org.apache.openejb.server.httpd.BeginWebBeansListener) WebAppInfo(org.apache.openejb.assembler.classic.WebAppInfo) Container(org.apache.catalina.Container) WebBeansContext(org.apache.webbeans.config.WebBeansContext) EndWebBeansListener(org.apache.openejb.server.httpd.EndWebBeansListener) NewEjbAvailableAfterApplicationCreated(org.apache.openejb.assembler.classic.event.NewEjbAvailableAfterApplicationCreated) AfterApplicationCreated(org.apache.tomee.catalina.event.AfterApplicationCreated) RouterValve(org.apache.tomee.catalina.routing.RouterValve) Valve(org.apache.catalina.Valve) NamingException(javax.naming.NamingException) NamingContextListener(org.apache.catalina.core.NamingContextListener) Realm(org.apache.catalina.Realm) WebContext(org.apache.openejb.core.WebContext) InitialContext(javax.naming.InitialContext) WebBeansContext(org.apache.webbeans.config.WebBeansContext) BeanContext(org.apache.openejb.BeanContext) Context(javax.naming.Context) ServletContext(javax.servlet.ServletContext) PolicyContext(org.apache.openejb.assembler.classic.PolicyContext) AppContext(org.apache.openejb.AppContext) StandardContext(org.apache.catalina.core.StandardContext) CdiAppContextsService(org.apache.openejb.cdi.CdiAppContextsService) ContextsService(org.apache.webbeans.spi.ContextsService) WebBeansThreadBindingListener(org.apache.tomee.catalina.cdi.WebBeansThreadBindingListener) Request(org.apache.catalina.connector.Request) HttpServletRequest(javax.servlet.http.HttpServletRequest) SystemComponentReference(org.apache.openejb.core.ivm.naming.SystemComponentReference) LifecycleException(org.apache.catalina.LifecycleException) NameNotFoundException(javax.naming.NameNotFoundException) IOException(java.io.IOException) NamingException(javax.naming.NamingException) OpenEJBException(org.apache.openejb.OpenEJBException) OpenEJBRuntimeException(org.apache.openejb.OpenEJBRuntimeException) Pipeline(org.apache.catalina.Pipeline) HandleDelegate(javax.ejb.spi.HandleDelegate) StandardWrapper(org.apache.catalina.core.StandardWrapper)

Example 19 with WebContext

use of org.apache.openejb.core.WebContext in project tomee by apache.

the class TomcatWebAppBuilder method getWebBeansContext.

private WebBeansContext getWebBeansContext(final ContextInfo contextInfo) {
    final AppContext appContext = getContainerSystem().getAppContext(contextInfo.appInfo.appId);
    if (appContext == null) {
        return null;
    }
    WebBeansContext webBeansContext = appContext.getWebBeansContext();
    if (webBeansContext == null) {
        return null;
    }
    for (final WebContext web : appContext.getWebContexts()) {
        final String stdName = removeFirstSlashAndWar(contextInfo.standardContext.getName());
        if (stdName == null) {
            continue;
        }
        final String name = removeFirstSlashAndWar(web.getContextRoot());
        if (stdName.equals(name)) {
            webBeansContext = web.getWebbeansContext();
            if (Contexts.getHostname(contextInfo.standardContext).equals(web.getHost())) {
                break;
            }
        // else loop hoping to find a better matching
        }
    }
    if (webBeansContext == null) {
        webBeansContext = appContext.getWebBeansContext();
    }
    return webBeansContext;
}
Also used : WebBeansContext(org.apache.webbeans.config.WebBeansContext) WebContext(org.apache.openejb.core.WebContext) AppContext(org.apache.openejb.AppContext)

Example 20 with WebContext

use of org.apache.openejb.core.WebContext in project tomee by apache.

the class ServletContextHandler method invoke.

@Override
public Object invoke(final Object proxy, final Method method, final Object[] args) throws Throwable {
    // ITE are handled by Proxys
    final Request request = OpenEJBSecurityListener.requests.get();
    if (request != null) {
        return method.invoke(request.getServletContext(), args);
    }
    final ClassLoader contextClassLoader = Thread.currentThread().getContextClassLoader();
    final ServletContext c = contexts.get(contextClassLoader);
    if (c != null) {
        return method.invoke(c, args);
    }
    // can be a not container thread so clean it up
    OpenEJBSecurityListener.requests.remove();
    for (final AppContext a : SystemInstance.get().getComponent(ContainerSystem.class).getAppContexts()) {
        for (final WebContext w : a.getWebContexts()) {
            if (w.getClassLoader() == contextClassLoader) {
                // not in CXF so == should be fine
                return method.invoke(w.getServletContext(), args);
            }
        }
    }
    throw new IllegalStateException("Didnt find a web context for " + contextClassLoader);
}
Also used : ContainerSystem(org.apache.openejb.spi.ContainerSystem) WebContext(org.apache.openejb.core.WebContext) AppContext(org.apache.openejb.AppContext) Request(org.apache.catalina.connector.Request) ServletContext(javax.servlet.ServletContext)

Aggregations

WebContext (org.apache.openejb.core.WebContext)25 AppContext (org.apache.openejb.AppContext)17 BeanContext (org.apache.openejb.BeanContext)11 ContainerSystem (org.apache.openejb.spi.ContainerSystem)11 WebBeansContext (org.apache.webbeans.config.WebBeansContext)9 NamingException (javax.naming.NamingException)8 IOException (java.io.IOException)7 Context (javax.naming.Context)7 OpenEJBRuntimeException (org.apache.openejb.OpenEJBRuntimeException)7 ArrayList (java.util.ArrayList)6 ServletContext (javax.servlet.ServletContext)6 OpenEJBException (org.apache.openejb.OpenEJBException)6 MalformedURLException (java.net.MalformedURLException)5 NameNotFoundException (javax.naming.NameNotFoundException)5 Injection (org.apache.openejb.Injection)5 WebAppInfo (org.apache.openejb.assembler.classic.WebAppInfo)5 InitialContext (javax.naming.InitialContext)4 ThreadContext (org.apache.openejb.core.ThreadContext)4 URL (java.net.URL)3 HashSet (java.util.HashSet)3