1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19 package org.apache.syncope.ext.scimv2.cxf;
20
21 import com.fasterxml.jackson.databind.SerializationFeature;
22 import com.fasterxml.jackson.databind.json.JsonMapper;
23 import com.fasterxml.jackson.jaxrs.json.JacksonJsonProvider;
24 import java.util.List;
25 import java.util.Map;
26 import org.apache.cxf.Bus;
27 import org.apache.cxf.endpoint.Server;
28 import org.apache.cxf.jaxrs.spring.JAXRSServerFactoryBeanDefinitionParser.SpringJAXRSServerFactoryBean;
29 import org.apache.cxf.jaxrs.validation.JAXRSBeanValidationInInterceptor;
30 import org.apache.cxf.transport.common.gzip.GZIPInInterceptor;
31 import org.apache.cxf.transport.common.gzip.GZIPOutInterceptor;
32 import org.apache.syncope.core.logic.GroupLogic;
33 import org.apache.syncope.core.logic.SCIMDataBinder;
34 import org.apache.syncope.core.logic.SCIMLogic;
35 import org.apache.syncope.core.logic.UserLogic;
36 import org.apache.syncope.core.logic.scim.SCIMConfManager;
37 import org.apache.syncope.core.persistence.api.dao.GroupDAO;
38 import org.apache.syncope.core.persistence.api.dao.UserDAO;
39 import org.apache.syncope.ext.scimv2.api.service.SCIMGroupService;
40 import org.apache.syncope.ext.scimv2.api.service.SCIMService;
41 import org.apache.syncope.ext.scimv2.api.service.SCIMUserService;
42 import org.apache.syncope.ext.scimv2.cxf.service.SCIMGroupServiceImpl;
43 import org.apache.syncope.ext.scimv2.cxf.service.SCIMServiceImpl;
44 import org.apache.syncope.ext.scimv2.cxf.service.SCIMUserServiceImpl;
45 import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
46 import org.springframework.context.ApplicationContext;
47 import org.springframework.context.annotation.Bean;
48 import org.springframework.context.annotation.Configuration;
49
50 @Configuration(proxyBeanMethods = false)
51 public class SCIMv2RESTCXFContext {
52
53 @ConditionalOnMissingBean
54 @Bean
55 public JacksonJsonProvider scimJacksonJsonProvider() {
56 return new JacksonJsonProvider(JsonMapper.builder().
57 findAndAddModules().disable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS).build());
58 }
59
60 @ConditionalOnMissingBean
61 @Bean
62 public SCIMExceptionMapper scimExceptionMapper() {
63 return new SCIMExceptionMapper();
64 }
65
66 @ConditionalOnMissingBean(name = "scimAddETagFilter")
67 @Bean
68 public AddETagFilter scimAddETagFilter() {
69 return new AddETagFilter();
70 }
71
72 @ConditionalOnMissingBean(name = "scimv2Container")
73 @Bean
74 public Server scimv2Container(
75 final SCIMService scimService,
76 final SCIMGroupService scimv2GroupService,
77 final SCIMUserService scimv2UserService,
78 final GZIPInInterceptor gzipInInterceptor,
79 final GZIPOutInterceptor gzipOutInterceptor,
80 final JAXRSBeanValidationInInterceptor validationInInterceptor,
81 final JacksonJsonProvider scimJacksonJsonProvider,
82 final SCIMExceptionMapper scimExceptionMapper,
83 final AddETagFilter scimAddETagFilter,
84 final Bus bus,
85 final ApplicationContext ctx) {
86
87 SpringJAXRSServerFactoryBean scimv2Container = new SpringJAXRSServerFactoryBean();
88 scimv2Container.setBus(bus);
89 scimv2Container.setAddress("/scim");
90 scimv2Container.setStaticSubresourceResolution(true);
91
92 scimv2Container.setProperties(Map.of("convert.wadl.resources.to.dom", "false"));
93
94 scimv2Container.setServiceBeans(List.of(scimService, scimv2GroupService, scimv2UserService));
95
96 scimv2Container.setInInterceptors(List.of(gzipInInterceptor, validationInInterceptor));
97
98 scimv2Container.setOutInterceptors(List.of(gzipOutInterceptor));
99
100 scimv2Container.setProviders(List.of(scimJacksonJsonProvider, scimExceptionMapper, scimAddETagFilter));
101
102 scimv2Container.setApplicationContext(ctx);
103 return scimv2Container.create();
104 }
105
106 @ConditionalOnMissingBean
107 @Bean
108 public SCIMService scimService(
109 final UserDAO userDAO,
110 final GroupDAO groupDAO,
111 final UserLogic userLogic,
112 final GroupLogic groupLogic,
113 final SCIMDataBinder binder,
114 final SCIMConfManager confManager,
115 final SCIMLogic scimLogic) {
116
117 return new SCIMServiceImpl(userDAO, groupDAO, userLogic, groupLogic, binder, confManager, scimLogic);
118 }
119
120 @ConditionalOnMissingBean
121 @Bean
122 public SCIMGroupService scimv2GroupService(
123 final UserDAO userDAO,
124 final GroupDAO groupDAO,
125 final UserLogic userLogic,
126 final GroupLogic groupLogic,
127 final SCIMDataBinder binder,
128 final SCIMConfManager confManager) {
129
130 return new SCIMGroupServiceImpl(userDAO, groupDAO, userLogic, groupLogic, binder, confManager);
131 }
132
133 @ConditionalOnMissingBean
134 @Bean
135 public SCIMUserService scimv2UserService(
136 final UserDAO userDAO,
137 final GroupDAO groupDAO,
138 final UserLogic userLogic,
139 final GroupLogic groupLogic,
140 final SCIMDataBinder binder,
141 final SCIMConfManager confManager) {
142
143 return new SCIMUserServiceImpl(userDAO, groupDAO, userLogic, groupLogic, binder, confManager);
144 }
145 }