1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19 package org.apache.syncope.common.keymaster.client.self;
20
21 import com.fasterxml.jackson.databind.json.JsonMapper;
22 import com.fasterxml.jackson.jaxrs.json.JacksonJsonProvider;
23 import java.util.List;
24 import java.util.regex.Pattern;
25 import org.apache.cxf.ext.logging.LoggingFeature;
26 import org.apache.cxf.jaxrs.client.JAXRSClientFactoryBean;
27 import org.apache.syncope.common.keymaster.client.api.ConfParamOps;
28 import org.apache.syncope.common.keymaster.client.api.DomainOps;
29 import org.apache.syncope.common.keymaster.client.api.KeymasterProperties;
30 import org.apache.syncope.common.keymaster.client.api.ServiceOps;
31 import org.springframework.beans.factory.annotation.Qualifier;
32 import org.springframework.boot.autoconfigure.condition.ConditionOutcome;
33 import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
34 import org.springframework.boot.autoconfigure.condition.SpringBootCondition;
35 import org.springframework.boot.context.properties.EnableConfigurationProperties;
36 import org.springframework.context.annotation.Bean;
37 import org.springframework.context.annotation.ConditionContext;
38 import org.springframework.context.annotation.Conditional;
39 import org.springframework.context.annotation.Configuration;
40 import org.springframework.core.type.AnnotatedTypeMetadata;
41
42 @EnableConfigurationProperties(KeymasterProperties.class)
43 @Configuration(proxyBeanMethods = false)
44 public class SelfKeymasterClientContext {
45
46 private static final Pattern HTTP = Pattern.compile("^http.+");
47
48 static class SelfKeymasterCondition extends SpringBootCondition {
49
50 @Override
51 public ConditionOutcome getMatchOutcome(final ConditionContext context, final AnnotatedTypeMetadata metadata) {
52 String keymasterAddress = context.getEnvironment().getProperty("keymaster.address");
53 return new ConditionOutcome(
54 keymasterAddress != null && HTTP.matcher(keymasterAddress).matches(),
55 "Keymaster address not set for Self: " + keymasterAddress);
56 }
57 }
58
59 @Conditional(SelfKeymasterCondition.class)
60 @Bean
61 @ConditionalOnMissingBean(name = "selfKeymasterRESTClientFactoryBean")
62 public JAXRSClientFactoryBean selfKeymasterRESTClientFactoryBean(final KeymasterProperties props) {
63 JAXRSClientFactoryBean restClientFactoryBean = new JAXRSClientFactoryBean();
64 restClientFactoryBean.setAddress(props.getAddress());
65 restClientFactoryBean.setUsername(props.getUsername());
66 restClientFactoryBean.setPassword(props.getPassword());
67 restClientFactoryBean.setThreadSafe(true);
68 restClientFactoryBean.setInheritHeaders(true);
69 restClientFactoryBean.getFeatures().add(new LoggingFeature());
70 restClientFactoryBean.setProviders(List.of(
71 new JacksonJsonProvider(JsonMapper.builder().findAndAddModules().build()),
72 new SelfKeymasterClientExceptionMapper()));
73 return restClientFactoryBean;
74 }
75
76 @Conditional(SelfKeymasterCondition.class)
77 @Bean
78 @ConditionalOnMissingBean(name = "selfConfParamOps")
79 public ConfParamOps selfConfParamOps(@Qualifier("selfKeymasterRESTClientFactoryBean")
80 final JAXRSClientFactoryBean selfKeymasterRESTClientFactoryBean) {
81 return new SelfKeymasterConfParamOps(selfKeymasterRESTClientFactoryBean);
82 }
83
84 @Conditional(SelfKeymasterCondition.class)
85 @Bean
86 @ConditionalOnMissingBean(name = "selfServiceOps")
87 public ServiceOps selfServiceOps(@Qualifier("selfKeymasterRESTClientFactoryBean")
88 final JAXRSClientFactoryBean selfKeymasterRESTClientFactoryBean) {
89 return new SelfKeymasterServiceOps(selfKeymasterRESTClientFactoryBean, 5);
90 }
91
92 @Conditional(SelfKeymasterCondition.class)
93 @Bean
94 @ConditionalOnMissingBean(name = "domainOps")
95 public DomainOps domainOps(@Qualifier("selfKeymasterRESTClientFactoryBean")
96 final JAXRSClientFactoryBean selfKeymasterRESTClientFactoryBean) {
97 return new SelfKeymasterDomainOps(selfKeymasterRESTClientFactoryBean);
98 }
99 }