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