[undertow-dev] ServletContext.getResource() and FileNotFound

Davide Ungari ungarida at gmail.com
Wed Nov 12 16:47:34 EST 2014


Hi Stuart,
Tomaž warned me by IRC chat about that.

At the end I developed like this:

URL rootUrl = getClassLoader().getResource(".");
File root = new File(rootUrl.getFile());
ResourceManager resourceManager = new FileResourceManager(root, 1024 *
1024);
deploymentInfo.setResourceManager(resourceManager);

It works, and now I will try to experiment better perfomance
using CachingResourceManager as suggested by Tomaž.

Thanks everybody!

--
Davide

On Wed, Nov 12, 2014 at 9:12 PM, Stuart Douglas <sdouglas at redhat.com> wrote:

> ServletResourceManager is only really relevant to Wildfly. You will want
> to use either FileResourceManager or ClassPathResourceManager.
>
> Stuart
>
> ----- Original Message -----
> > From: "Tomaž Cerar" <tomaz.cerar at gmail.com>
> > To: "Davide Ungari" <ungarida at gmail.com>
> > Cc: undertow-dev at lists.jboss.org
> > Sent: Wednesday, 12 November, 2014 11:47:01 PM
> > Subject: Re: [undertow-dev] ServletContext.getResource() and FileNotFound
> >
> > I think you are missing configuration for resourceManager, as if not set
> it
> > defaults to empty resource manager.
> >
> >
> > add something like this to getDeploymentInfo
> > ResourceManager resourceManager = new ServletResourceManager(
> deploymentRoot
> > , overlays , explodedDeployment );
> > //this is not needed, but it good for performance
> > resourceManager = new CachingResourceManager( 100 , 10 * 1024 * 1024 ,
> > servletContainer.getBufferCache(), resourceManager, explodedDeployment ?
> > 2000 : - 1 );
> > deploymentInfo.setResourceManager(resourceManager);
> > --
> > tomaz
> >
> > On Wed, Nov 12, 2014 at 10:56 AM, Davide Ungari < ungarida at gmail.com >
> wrote:
> >
> >
> >
> > Hi,
> > I'm using version 1.1.0.CR8.
> >
> > --
> > Davide
> >
> > On Wed, Nov 12, 2014 at 8:47 AM, Davide Ungari < ungarida at gmail.com >
> wrote:
> >
> >
> >
> > Hi everybody,
> > I'm trying to migrate my webapp from Jetty to Undertow.
> >
> > The stack is composed by Undertow Guice and Struts2.
> >
> > I developed the following class to configure undertow:
> >
> >
> >
> >
> > package com.billdrawer.website.server;
> >
> > import io.undertow.Undertow;
> > import io.undertow.predicate.Predicates;
> > import io.undertow.server.HandlerWrapper;
> > import io.undertow.server.HttpHandler;
> > import io.undertow.server.HttpServerExchange;
> > import io.undertow.server.handlers.PathHandler;
> > import io.undertow.server.handlers.PredicateHandler;
> > import io.undertow.server.handlers.resource.ResourceHandler;
> > import io.undertow.servlet.api.ConfidentialPortManager;
> > import io.undertow.servlet.api.Deployment;
> > import io.undertow.servlet.api.DeploymentInfo;
> > import io.undertow.servlet.api.DeploymentManager;
> > import io.undertow.servlet.api.FilterInfo;
> > import io.undertow.servlet.api.ListenerInfo;
> > import io.undertow.servlet.api.LoginConfig;
> > import io.undertow.servlet.api.SecurityConstraint;
> > import io.undertow.servlet.api.ServletContainer;
> > import io.undertow.servlet.api.WebResourceCollection;
> >
> > import java.net.URL;
> > import java.nio.file.Files;
> > import java.nio.file.Paths;
> > import java.util.EnumSet;
> >
> > import javax.inject.Inject;
> > import javax.inject.Named;
> > import javax.servlet.DispatcherType;
> > import javax.servlet.ServletContext;
> > import javax.servlet.ServletException;
> >
> > import org.apache.log4j.Logger;
> > import
> org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter;
> > import org.keycloak.adapters.AdapterConstants;
> > import org.keycloak.adapters.undertow.KeycloakServletExtension;
> >
> > import com.billdrawer.website.common.Config;
> > import com.billdrawer.website.listener.WebsiteServletContextListener;
> > import com.google.inject.servlet.GuiceFilter;
> >
> > public class UndertowServer implements Server {
> >     private Logger _logger = Logger.getLogger(UndertowServer.class);
> >     private Undertow _server;
> >     private DeploymentManager _manager;
> >     private int _port;
> >     private String _host;
> >
> >     @Inject
> >     public UndertowServer(@Named(Config.STAGE) String stage,
> >     @Named(Config.SERVER_HOST) String host, @Named(Config.SERVER_PORT)
> int
> >     port,
> >             @Named(Config.SERVER_TIMEOUT) int timeout) {
> >         _port = port;
> >         _host = host;
> >
> >         DeploymentInfo deploymentInfo = getDeploymentInfo(stage);
> >
> >         ServletContainer _container =
> ServletContainer.Factory.newInstance();
> >         _manager = _container.addDeployment(deploymentInfo);
> >         _manager.deploy();
> >
> >         Deployment deployment = _manager.getDeployment();
> >
> >         KeycloakServletExtension keycloak = new
> KeycloakServletExtension();
> >         deploymentInfo.addServletExtension(keycloak);
> >
>  deploymentInfo.addInitParameter(AdapterConstants.AUTH_DATA_PARAM_NAME,
> >         getKeyloakJson());
> >         keycloak.handleDeployment(deploymentInfo,
> >         _manager.getDeployment().getServletContext());
> >
> >         final ServletContext servletContext =
> deployment.getServletContext();
> >         _logger.debug("Context
> >         initialized:"+servletContext.getContextPath());
> >     }
> >
> >     protected String getKeyloakJson() {
> >         String keycloak = "";
> >         URL url = getClassLoader().getResource("keycloak.json");
> >         if (url != null) {
> >             try {
> >                 byte[] encoded =
> Files.readAllBytes(Paths.get(url.toURI()));
> >                 keycloak = new String(encoded, "utf-8");
> >             } catch (Exception e) {
> >                 _logger.error("Can't read keycloak.json", e);
> >             }
> >         }
> >         return keycloak;
> >     }
> >
> >     protected DeploymentInfo getDeploymentInfo(String stage) {
> >         final DeploymentInfo deploymentInfo = new DeploymentInfo();
> >         deploymentInfo.setClassLoader(getClassLoader());
> >         deploymentInfo.setContextPath("/");
> >         deploymentInfo.setDefaultEncoding("UTF-8");
> >         deploymentInfo.setDeploymentName("website.war");
> >         deploymentInfo.setDisplayName("WebsiteServer");
> >         deploymentInfo.setUrlEncoding("UTF-8");
> >
> >         deploymentInfo.addListener(new
> >         ListenerInfo(WebsiteServletContextListener.class));
> >
> >         FilterInfo guiceFilter = new FilterInfo("GuiceFilter",
> >         GuiceFilter.class);
> >         deploymentInfo.addFilter(guiceFilter);
> >         for (DispatcherType dispatcher :
> EnumSet.allOf(DispatcherType.class))
> >         {
> >             deploymentInfo.addFilterUrlMapping(guiceFilter.getName(),
> "/*",
> >             dispatcher);
> >         }
> >
> >         FilterInfo strutsPrepareAndExecuteFilter = new
> >         FilterInfo("StrutsFilter", StrutsPrepareAndExecuteFilter.class);
> >         deploymentInfo.addFilter(strutsPrepareAndExecuteFilter);
> >         for (DispatcherType dispatcher :
> EnumSet.allOf(DispatcherType.class))
> >         {
> >
>  deploymentInfo.addFilterUrlMapping(strutsPrepareAndExecuteFilter.getName(),
> >             "/*", dispatcher);
> >         }
> >
> >         deploymentInfo.addInitialHandlerChainWrapper(new
> HandlerWrapper() {
> >             @Override
> >             public HttpHandler wrap(final HttpHandler handler) {
> >                 final ResourceHandler resourceHandler = new
> >                 ResourceHandler(deploymentInfo.getResourceManager());
> >                 PredicateHandler predicateHandler = new
> >
>  PredicateHandler(Predicates.suffixes(".css",".html",".js"),resourceHandler,
> >                 handler);
> >                 return predicateHandler;
> >             }
> >         });
> >
> >         configureSecurity(deploymentInfo);
> >
> >         return deploymentInfo;
> >     }
> >
> >     protected void configureSecurity(DeploymentInfo deploymentInfo) {
> >         deploymentInfo.setLoginConfig(new LoginConfig("KEYCLOAK",
> >         "billdrawer"));
> >         deploymentInfo.setConfidentialPortManager(new
> >         ConfidentialPortManager() {
> >             @Override
> >             public int getConfidentialPort(HttpServerExchange exchange) {
> >                 return _port;
> >             }
> >         });
> >         SecurityConstraint securityConstraint = new SecurityConstraint();
> >         WebResourceCollection webResourceCollection = new
> >         WebResourceCollection();
> >         webResourceCollection.addUrlPattern("/dashboard/*");
> >
>  securityConstraint.addWebResourceCollection(webResourceCollection);
> >         securityConstraint.addRoleAllowed("user");
> >         deploymentInfo.addSecurityConstraint(securityConstraint);
> >     }
> >
> >     protected ClassLoader getClassLoader() {
> >         return getClass().getClassLoader();
> >     }
> >
> >     public void start() {
> >         _logger.debug("starting...");
> >         try {
> >             Undertow.Builder builder = Undertow.builder();
> >             builder.addHttpListener(_port, _host);
> >
> >             final PathHandler rootHandler = new PathHandler();
> >
>  rootHandler.addPrefixPath(_manager.getDeployment().getDeploymentInfo().getContextPath(),
> >             _manager.start());
> >
> >             builder.setHandler(rootHandler);
> >             _server = builder.build();
> >             _server.start();
> >         } catch (ServletException e) {
> >             _logger.error("Unexpected exception", e);
> >         }
> >         _ logger.info ("###START###");
> >     }
> >
> >     public void stop() {
> >         _logger.debug("stopping...");
> >         try {
> >             _manager.stop();
> >             _server.stop();
> >         } catch (ServletException e) {
> >             _logger.error("Unexpected exception", e);
> >         }
> >         _ logger.info ("###STOP###");
> >     }
> > }
> > Everything is working until I do not try to load resources from context.
> > I need some help before rollback to Jetty :(
> >
> > --
> > Davide
> >
> >
> > _______________________________________________
> > undertow-dev mailing list
> > undertow-dev at lists.jboss.org
> > https://lists.jboss.org/mailman/listinfo/undertow-dev
> >
> >
> > _______________________________________________
> > undertow-dev mailing list
> > undertow-dev at lists.jboss.org
> > https://lists.jboss.org/mailman/listinfo/undertow-dev
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://lists.jboss.org/pipermail/undertow-dev/attachments/20141112/5f9d0e32/attachment.html 


More information about the undertow-dev mailing list