package org.carlspring.strongbox.config; import org.carlspring.strongbox.configuration.StrongboxSecurityConfig; import org.carlspring.strongbox.utils.CustomAntPathMatcher; import org.carlspring.strongbox.web.HeaderMappingFilter; import javax.inject.Inject; import javax.inject.Named; import javax.xml.bind.Marshaller; import java.util.HashMap; import java.util.List; import java.util.Map; import com.fasterxml.jackson.databind.ObjectMapper; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.cache.annotation.EnableCaching; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.ComponentScan; import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.Import; import org.springframework.http.converter.ByteArrayHttpMessageConverter; import org.springframework.http.converter.FormHttpMessageConverter; import org.springframework.http.converter.HttpMessageConverter; import org.springframework.http.converter.ResourceHttpMessageConverter; import org.springframework.http.converter.StringHttpMessageConverter; import org.springframework.http.converter.json.MappingJackson2HttpMessageConverter; import org.springframework.http.converter.xml.MarshallingHttpMessageConverter; import org.springframework.oxm.jaxb.Jaxb2Marshaller; import org.springframework.web.servlet.config.annotation.EnableWebMvc; import org.springframework.web.servlet.config.annotation.PathMatchConfigurer; import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter; @Configuration @ComponentScan({ "org.carlspring.strongbox.controllers", "org.carlspring.strongbox.mapper", "org.carlspring.strongbox.security", "org.carlspring.strongbox.users", "org.carlspring.strongbox.utils", "org.carlspring.logging" }) @Import({ CommonConfig.class, StrongboxSecurityConfig.class, StorageApiConfig.class, Maven2LayoutProviderConfig.class, NugetLayoutProviderConfig.class, StorageCoreConfig.class, UsersConfig.class, SecurityConfig.class, ClientConfig.class }) @EnableCaching(order = 105) @EnableWebMvc public class WebConfig extends WebMvcConfigurerAdapter { private static final Logger logger = LoggerFactory.getLogger(WebConfig.class); @Inject @Named("customAntPathMatcher") CustomAntPathMatcher antPathMatcher; @Inject ObjectMapper objectMapper; public WebConfig() { logger.debug("Initialized web configuration."); } @Bean public HeaderMappingFilter headerMappingFilter() { return new HeaderMappingFilter(); } @Override public void configureMessageConverters(List<HttpMessageConverter<?>> converters) { StringHttpMessageConverter stringConverter = new StringHttpMessageConverter(); stringConverter.setWriteAcceptCharset(false); converters.add(new ByteArrayHttpMessageConverter()); // if your argument is a byte[] converters.add(stringConverter); converters.add(new FormHttpMessageConverter()); converters.add(jackson2Converter()); converters.add(marshallingMessageConverter()); converters.add(new ResourceHttpMessageConverter()); } @Bean public MarshallingHttpMessageConverter marshallingMessageConverter() { MarshallingHttpMessageConverter converter = new MarshallingHttpMessageConverter(); converter.setMarshaller(marshaller()); converter.setUnmarshaller(marshaller()); return converter; } @Bean public Jaxb2Marshaller marshaller() { Jaxb2Marshaller marshaller = new Jaxb2Marshaller(); marshaller.setPackagesToScan("org.carlspring.strongbox.artifact.coordinates", "org.carlspring.strongbox.authentication.registry", "org.carlspring.strongbox.configuration", //TODO: resolve @XmlRootElement(name = "repository") conflict with org.carlspring.strongbox.storage.repository.Repository //"org.carlspring.strongbox.providers.layout.p2", "org.carlspring.strongbox.storage", "org.carlspring.strongbox.storage.indexing", "org.carlspring.strongbox.storage.repository", "org.carlspring.strongbox.storage.repository.aws", "org.carlspring.strongbox.storage.repository.gcs", "org.carlspring.strongbox.storage.routing", "org.carlspring.strongbox.users.security", "org.carlspring.strongbox.xml"); Map<String, Object> props = new HashMap<>(); props.put(Marshaller.JAXB_FORMATTED_OUTPUT, true); marshaller.setMarshallerProperties(props); return marshaller; } @Bean public MappingJackson2HttpMessageConverter jackson2Converter() { MappingJackson2HttpMessageConverter converter = new MappingJackson2HttpMessageConverter(); converter.setObjectMapper(objectMapper); return converter; } @Override public void configurePathMatch(PathMatchConfigurer configurer) { configurer.setUseSuffixPatternMatch(true) .setUseTrailingSlashMatch(false) .setUseRegisteredSuffixPatternMatch(true) .setPathMatcher(antPathMatcher); } }