diff --git a/backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/ShibbolethUiApplication.java b/backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/ShibbolethUiApplication.java index 2c241cf8e..db1779592 100644 --- a/backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/ShibbolethUiApplication.java +++ b/backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/ShibbolethUiApplication.java @@ -11,6 +11,8 @@ import org.springframework.boot.web.servlet.support.SpringBootServletInitializer; import org.springframework.context.annotation.Profile; import org.springframework.context.event.EventListener; +import org.springframework.context.support.PropertySourcesPlaceholderConfigurer; +import org.springframework.core.env.PropertyResolver; import org.springframework.data.jpa.repository.config.EnableJpaAuditing; import org.springframework.scheduling.annotation.EnableScheduling; import org.springframework.stereotype.Component; @@ -40,12 +42,22 @@ public static class MetadataResolversResourceIdEmitter { @Value("${idp.home}") String idpHome; + @Autowired + PropertySourcesPlaceholderConfigurer propertySourcesPlaceholderConfigurer; + + @Autowired + PropertyResolver propertyResolver; + @EventListener void showMetadataResolversResourceIds(ApplicationStartedEvent e) { metadataResolverRepository.findAll() .forEach(it -> System.out.println(String.format("MetadataResolver [%s: %s]", it.getName(), it.getResourceId()))); System.out.println("IDP HOME: " + idpHome); + String rawValue = "%{idp.home}/metadata/file.xml"; + boolean hasToken = rawValue.contains("%{idp.home}"); + String resolvedIdpHome = propertyResolver.resolvePlaceholders("${idp.home}"); + String fullyResolvedDir = rawValue.replace("%{idp.home}", resolvedIdpHome); } } diff --git a/backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/configuration/postprocessors/IdpHomeValueSettingEnvironmentPostProcessor.java b/backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/configuration/postprocessors/IdpHomeValueSettingEnvironmentPostProcessor.java index 74b35f362..814a797c2 100644 --- a/backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/configuration/postprocessors/IdpHomeValueSettingEnvironmentPostProcessor.java +++ b/backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/configuration/postprocessors/IdpHomeValueSettingEnvironmentPostProcessor.java @@ -17,7 +17,8 @@ import java.util.Map; /** - * Spring Boot Environment Post Processor setting the value for idp.home property to an abstract temp directory. + * Spring Boot Environment Post Processor setting the value for idp.home property to an abstract temp directory + * if no IDP_HOME environment variable has been set already. * * @author Dmitriy Kopylenko */ @@ -47,7 +48,11 @@ public void postProcessEnvironment(ConfigurableEnvironment environment, SpringAp Map map = new HashMap<>(1); try { - map.put(IDP_HOME_PROP, Files.createTempDirectory(null).toAbsolutePath().toString()); + Path tempDir = Files.createTempDirectory(String.format("%s.%s.", "shibui", IDP_HOME_PROP)); + String tempDirName = tempDir.toAbsolutePath().toString(); + Path tempMetadataSubDir = Paths.get(tempDirName, METADATA_DIR); + Files.createDirectories(tempMetadataSubDir); + map.put(IDP_HOME_PROP, tempDirName); } catch (IOException e) { LOGGER.error(e.getMessage()); throw new RuntimeException(e); diff --git a/backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/domain/resolvers/MetadataResolverPropertyPlaceholderValuesReplacer.java b/backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/domain/resolvers/MetadataResolverPropertyPlaceholderValuesReplacer.java new file mode 100644 index 000000000..10887e97f --- /dev/null +++ b/backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/domain/resolvers/MetadataResolverPropertyPlaceholderValuesReplacer.java @@ -0,0 +1,17 @@ +package edu.internet2.tier.shibboleth.admin.ui.domain.resolvers; + +/** + * An SPI to resolve and convert data for different types of {@link MetadataResolver}s from possible provided '%{}' placeholders + *

+ * Typical usage is - multiple replacers for concrete type of resolvers are configured in Spring Application Context, + * aggregated by {@link MetadataResolverPropertyPlaceholderValuesResolvingService} facade and then that facade is injected into upstream consumers of it + * such as REST controllers, etc. + * + * @author Dmitriy Kopylenko + */ +public interface MetadataResolverPropertyPlaceholderValuesReplacer { + + boolean supports(T metadataResolver); + + void replacePlaceholderValuesIfResolvableOrFail(T metadataResolver); +} diff --git a/backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/domain/resolvers/MetadataResolverPropertyPlaceholderValuesResolvingService.java b/backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/domain/resolvers/MetadataResolverPropertyPlaceholderValuesResolvingService.java new file mode 100644 index 000000000..e7639cfde --- /dev/null +++ b/backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/domain/resolvers/MetadataResolverPropertyPlaceholderValuesResolvingService.java @@ -0,0 +1,29 @@ +package edu.internet2.tier.shibboleth.admin.ui.domain.resolvers; + +import java.util.ArrayList; +import java.util.List; + +/** + * A facade that aggregates {@link MetadataResolverPropertyPlaceholderValuesReplacer}s available to call just one of them supporting the type of a given resolver. + * If no {@link MetadataResolverPropertyPlaceholderValuesReplacer}s are configured, considers a noop. + * + * Uses chain-of-responsibility design pattern + * + * @author Dmitriy Kopylenko + */ +public class MetadataResolverPropertyPlaceholderValuesResolvingService { + + private List> replacers; + + public MetadataResolverPropertyPlaceholderValuesResolvingService(List> replacers) { + this.replacers = replacers != null ? replacers : new ArrayList<>(); + } + + public void replacePlacehoderValuesOrFail(T metadataResolver) { + this.replacers + .stream() + .filter(r -> r.supports(metadataResolver)) + .findFirst() + .ifPresent(r -> r.replacePlaceholderValuesIfResolvableOrFail(metadataResolver)); + } +}