parent
							
								
									ff08f6dd02
								
							
						
					
					
						commit
						e7bd5da6fa
					
				| @ -0,0 +1,73 @@ | ||||
| package org.airsonic.player.spring; | ||||
| 
 | ||||
| import org.airsonic.player.service.SettingsService; | ||||
| import org.airsonic.player.spring.webxmldomain.ServletDef; | ||||
| import org.airsonic.player.spring.webxmldomain.ServletMappingDef; | ||||
| import org.airsonic.player.spring.webxmldomain.WebApp; | ||||
| import org.apache.commons.io.IOUtils; | ||||
| import org.apache.cxf.jaxb.JAXBDataBinding; | ||||
| import org.slf4j.Logger; | ||||
| import org.slf4j.LoggerFactory; | ||||
| import org.springframework.boot.web.servlet.ServletContextInitializer; | ||||
| import org.springframework.stereotype.Component; | ||||
| 
 | ||||
| import javax.servlet.ServletContext; | ||||
| import javax.servlet.ServletRegistration; | ||||
| import javax.xml.bind.JAXBContext; | ||||
| import javax.xml.bind.JAXBException; | ||||
| import javax.xml.bind.Unmarshaller; | ||||
| 
 | ||||
| import java.io.InputStream; | ||||
| import java.io.SequenceInputStream; | ||||
| import java.nio.charset.Charset; | ||||
| 
 | ||||
| @Component | ||||
| public class RegisterPrecompiledJSPInitializer implements ServletContextInitializer { | ||||
| 
 | ||||
|     private static final Logger logger = LoggerFactory.getLogger(RegisterPrecompiledJSPInitializer.class); | ||||
| 
 | ||||
|     @Override | ||||
|     public void onStartup(ServletContext servletContext) { | ||||
|         if(SettingsService.isDevelopmentMode()) { | ||||
|             logger.debug("Not registering precompiled jsps"); | ||||
|         } else { | ||||
|             logger.debug("Registering precompiled jsps"); | ||||
|             registerPrecompiledJSPs(servletContext); | ||||
|         } | ||||
|     } | ||||
| 
 | ||||
|     private static void registerPrecompiledJSPs(ServletContext servletContext) { | ||||
|         WebApp webApp = parseXmlFragment(); | ||||
|         for (ServletDef def :  webApp.getServletDefs()) { | ||||
|             logger.trace("Registering precompiled JSP: {} -> {}", def.getName(), def.getSclass()); | ||||
|             ServletRegistration.Dynamic reg = servletContext.addServlet(def.getName(), def.getSclass()); | ||||
|             // Need to set loadOnStartup somewhere between 0 and 128. 0 is highest priority. 99 should be fine
 | ||||
|             reg.setLoadOnStartup(99); | ||||
|         } | ||||
| 
 | ||||
|         for (ServletMappingDef mapping : webApp.getServletMappingDefs()) { | ||||
|             logger.trace("Mapping servlet: {} -> {}", mapping.getName(), mapping.getUrlPattern()); | ||||
|             servletContext.getServletRegistration(mapping.getName()).addMapping(mapping.getUrlPattern()); | ||||
|         } | ||||
|     } | ||||
| 
 | ||||
|     private static WebApp parseXmlFragment() { | ||||
|         InputStream precompiledJspWebXml = RegisterPrecompiledJSPInitializer.class.getResourceAsStream("/precompiled-jsp-web.xml"); | ||||
|         InputStream webXmlIS = new SequenceInputStream( | ||||
|                 new SequenceInputStream( | ||||
|                         IOUtils.toInputStream("<web-app>", Charset.defaultCharset()), | ||||
|                         precompiledJspWebXml), | ||||
|                 IOUtils.toInputStream("</web-app>", Charset.defaultCharset())); | ||||
| 
 | ||||
|         JAXBContext jaxbContext; | ||||
|         try { | ||||
|             jaxbContext = new JAXBDataBinding(WebApp.class).getContext(); | ||||
|             Unmarshaller unmarshaller = jaxbContext.createUnmarshaller(); | ||||
|             WebApp webapp = (WebApp) unmarshaller.unmarshal(webXmlIS); | ||||
|             return webapp; | ||||
|         } catch (JAXBException e) { | ||||
|             throw new RuntimeException("Could not parse precompiled-jsp-web.xml", e); | ||||
|         } | ||||
|     } | ||||
| 
 | ||||
| } | ||||
| @ -0,0 +1,32 @@ | ||||
| package org.airsonic.player.spring.webxmldomain; | ||||
| 
 | ||||
| import javax.xml.bind.annotation.XmlAccessType; | ||||
| import javax.xml.bind.annotation.XmlAccessorType; | ||||
| import javax.xml.bind.annotation.XmlElement; | ||||
| import javax.xml.bind.annotation.XmlRootElement; | ||||
| 
 | ||||
| @XmlRootElement | ||||
| @XmlAccessorType(XmlAccessType.FIELD) | ||||
| public class ServletDef { | ||||
|     @XmlElement(name="servlet-name") | ||||
|     private String name; | ||||
| 
 | ||||
|     @XmlElement(name="servlet-class") | ||||
|     private String sclass; | ||||
| 
 | ||||
|     public String getName() { | ||||
|         return name; | ||||
|     } | ||||
| 
 | ||||
|     public void setName(String name) { | ||||
|         this.name = name; | ||||
|     } | ||||
| 
 | ||||
|     public String getSclass() { | ||||
|         return sclass; | ||||
|     } | ||||
| 
 | ||||
|     public void setSclass(String sclass) { | ||||
|         this.sclass = sclass; | ||||
|     } | ||||
| } | ||||
| @ -0,0 +1,33 @@ | ||||
| package org.airsonic.player.spring.webxmldomain; | ||||
| 
 | ||||
| import javax.xml.bind.annotation.XmlAccessType; | ||||
| import javax.xml.bind.annotation.XmlAccessorType; | ||||
| import javax.xml.bind.annotation.XmlElement; | ||||
| import javax.xml.bind.annotation.XmlRootElement; | ||||
| 
 | ||||
| @XmlRootElement | ||||
| @XmlAccessorType(XmlAccessType.FIELD) | ||||
| public class ServletMappingDef { | ||||
|     @XmlElement(name="servlet-name") | ||||
|     private String name; | ||||
| 
 | ||||
|     @XmlElement(name="url-pattern") | ||||
|     private String urlPattern; | ||||
| 
 | ||||
|     public String getName() { | ||||
|         return name; | ||||
|     } | ||||
| 
 | ||||
|     public void setName(String name) { | ||||
|         this.name = name; | ||||
|     } | ||||
| 
 | ||||
|     public String getUrlPattern() { | ||||
|         return urlPattern; | ||||
|     } | ||||
| 
 | ||||
|     public void setUrlPattern(String urlPattern) { | ||||
|         this.urlPattern = urlPattern; | ||||
|     } | ||||
| 
 | ||||
| } | ||||
| @ -0,0 +1,34 @@ | ||||
| package org.airsonic.player.spring.webxmldomain; | ||||
| 
 | ||||
| import javax.xml.bind.annotation.XmlAccessType; | ||||
| import javax.xml.bind.annotation.XmlAccessorType; | ||||
| import javax.xml.bind.annotation.XmlElement; | ||||
| import javax.xml.bind.annotation.XmlRootElement; | ||||
| 
 | ||||
| import java.util.List; | ||||
| 
 | ||||
| @XmlRootElement(name="web-app") | ||||
| @XmlAccessorType(XmlAccessType.FIELD) | ||||
| public class WebApp { | ||||
|     @XmlElement(name="servlet") | ||||
|     private List<ServletDef> servletDefs; | ||||
| 
 | ||||
|     @XmlElement(name="servlet-mapping") | ||||
|     private List<ServletMappingDef> servletMappingDefs; | ||||
| 
 | ||||
|     public List<ServletDef> getServletDefs() { | ||||
|         return servletDefs; | ||||
|     } | ||||
| 
 | ||||
|     public void setServletDefs(List<ServletDef> servletDefs) { | ||||
|         this.servletDefs = servletDefs; | ||||
|     } | ||||
| 
 | ||||
|     public List<ServletMappingDef> getServletMappingDefs() { | ||||
|         return servletMappingDefs; | ||||
|     } | ||||
| 
 | ||||
|     public void setServletMappingDefs(List<ServletMappingDef> servletMappingDefs) { | ||||
|         this.servletMappingDefs = servletMappingDefs; | ||||
|     } | ||||
| } | ||||
					Loading…
					
					
				
		Reference in new issue