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