View Javadoc
1   /*
2    * Licensed to the Apache Software Foundation (ASF) under one
3    * or more contributor license agreements.  See the NOTICE file
4    * distributed with this work for additional information
5    * regarding copyright ownership.  The ASF licenses this file
6    * to you under the Apache License, Version 2.0 (the
7    * "License"); you may not use this file except in compliance
8    * with the License.  You may obtain a copy of the License at
9    *
10   *   http://www.apache.org/licenses/LICENSE-2.0
11   *
12   * Unless required by applicable law or agreed to in writing,
13   * software distributed under the License is distributed on an
14   * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
15   * KIND, either express or implied.  See the License for the
16   * specific language governing permissions and limitations
17   * under the License.
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 }