110 lines
4.3 KiB
Java
110 lines
4.3 KiB
Java
package org.datasurvey.config;
|
|
|
|
import static java.net.URLDecoder.decode;
|
|
|
|
import java.io.File;
|
|
import java.io.UnsupportedEncodingException;
|
|
import java.nio.charset.StandardCharsets;
|
|
import java.nio.file.Paths;
|
|
import java.util.*;
|
|
import javax.servlet.*;
|
|
import org.slf4j.Logger;
|
|
import org.slf4j.LoggerFactory;
|
|
import org.springframework.boot.web.server.*;
|
|
import org.springframework.boot.web.servlet.ServletContextInitializer;
|
|
import org.springframework.boot.web.servlet.server.ConfigurableServletWebServerFactory;
|
|
import org.springframework.context.annotation.Bean;
|
|
import org.springframework.context.annotation.Configuration;
|
|
import org.springframework.core.env.Environment;
|
|
import org.springframework.core.env.Profiles;
|
|
import org.springframework.util.CollectionUtils;
|
|
import org.springframework.web.cors.CorsConfiguration;
|
|
import org.springframework.web.cors.UrlBasedCorsConfigurationSource;
|
|
import org.springframework.web.filter.CorsFilter;
|
|
import tech.jhipster.config.JHipsterConstants;
|
|
import tech.jhipster.config.JHipsterProperties;
|
|
|
|
/**
|
|
* Configuration of web application with Servlet 3.0 APIs.
|
|
*/
|
|
@Configuration
|
|
public class WebConfigurer implements ServletContextInitializer, WebServerFactoryCustomizer<WebServerFactory> {
|
|
|
|
private final Logger log = LoggerFactory.getLogger(WebConfigurer.class);
|
|
|
|
private final Environment env;
|
|
|
|
private final JHipsterProperties jHipsterProperties;
|
|
|
|
public WebConfigurer(Environment env, JHipsterProperties jHipsterProperties) {
|
|
this.env = env;
|
|
this.jHipsterProperties = jHipsterProperties;
|
|
}
|
|
|
|
@Override
|
|
public void onStartup(ServletContext servletContext) throws ServletException {
|
|
if (env.getActiveProfiles().length != 0) {
|
|
log.info("Web application configuration, using profiles: {}", (Object[]) env.getActiveProfiles());
|
|
}
|
|
|
|
log.info("Web application fully configured");
|
|
}
|
|
|
|
/**
|
|
* Customize the Servlet engine: Mime types, the document root, the cache.
|
|
*/
|
|
@Override
|
|
public void customize(WebServerFactory server) {
|
|
// When running in an IDE or with ./mvnw spring-boot:run, set location of the static web assets.
|
|
setLocationForStaticAssets(server);
|
|
}
|
|
|
|
private void setLocationForStaticAssets(WebServerFactory server) {
|
|
if (server instanceof ConfigurableServletWebServerFactory) {
|
|
ConfigurableServletWebServerFactory servletWebServer = (ConfigurableServletWebServerFactory) server;
|
|
File root;
|
|
String prefixPath = resolvePathPrefix();
|
|
root = new File(prefixPath + "target/classes/static/");
|
|
if (root.exists() && root.isDirectory()) {
|
|
servletWebServer.setDocumentRoot(root);
|
|
}
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Resolve path prefix to static resources.
|
|
*/
|
|
private String resolvePathPrefix() {
|
|
String fullExecutablePath;
|
|
try {
|
|
fullExecutablePath = decode(this.getClass().getResource("").getPath(), StandardCharsets.UTF_8.name());
|
|
} catch (UnsupportedEncodingException e) {
|
|
/* try without decoding if this ever happens */
|
|
fullExecutablePath = this.getClass().getResource("").getPath();
|
|
}
|
|
String rootPath = Paths.get(".").toUri().normalize().getPath();
|
|
String extractedPath = fullExecutablePath.replace(rootPath, "");
|
|
int extractionEndIndex = extractedPath.indexOf("target/");
|
|
if (extractionEndIndex <= 0) {
|
|
return "";
|
|
}
|
|
return extractedPath.substring(0, extractionEndIndex);
|
|
}
|
|
|
|
@Bean
|
|
public CorsFilter corsFilter() {
|
|
UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
|
|
CorsConfiguration config = jHipsterProperties.getCors();
|
|
if (!CollectionUtils.isEmpty(config.getAllowedOrigins()) || !CollectionUtils.isEmpty(config.getAllowedOriginPatterns())) {
|
|
log.debug("Registering CORS filter");
|
|
source.registerCorsConfiguration("/api/**", config);
|
|
source.registerCorsConfiguration("/management/**", config);
|
|
source.registerCorsConfiguration("/v2/api-docs", config);
|
|
source.registerCorsConfiguration("/v3/api-docs", config);
|
|
source.registerCorsConfiguration("/swagger-resources", config);
|
|
source.registerCorsConfiguration("/swagger-ui/**", config);
|
|
}
|
|
return new CorsFilter(source);
|
|
}
|
|
}
|