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.core.rest.cxf.service;
20  
21  import java.time.OffsetDateTime;
22  import java.util.List;
23  import javax.ws.rs.core.Response;
24  import org.apache.commons.lang3.tuple.Pair;
25  import org.apache.syncope.common.lib.request.AnyCR;
26  import org.apache.syncope.common.lib.request.AnyUR;
27  import org.apache.syncope.common.lib.to.PagedResult;
28  import org.apache.syncope.common.lib.to.ProvisioningResult;
29  import org.apache.syncope.common.lib.to.RemediationTO;
30  import org.apache.syncope.common.rest.api.beans.RemediationQuery;
31  import org.apache.syncope.common.rest.api.service.RemediationService;
32  import org.apache.syncope.core.logic.RemediationLogic;
33  import org.apache.syncope.core.persistence.api.dao.AnyDAO;
34  import org.apache.syncope.core.persistence.api.dao.AnyObjectDAO;
35  import org.apache.syncope.core.persistence.api.dao.GroupDAO;
36  import org.apache.syncope.core.persistence.api.dao.NotFoundException;
37  import org.apache.syncope.core.persistence.api.dao.UserDAO;
38  import org.springframework.stereotype.Service;
39  
40  @Service
41  public class RemediationServiceImpl extends AbstractService implements RemediationService {
42  
43      protected final RemediationLogic logic;
44  
45      protected final UserDAO userDAO;
46  
47      protected final GroupDAO groupDAO;
48  
49      protected final AnyObjectDAO anyObjectDAO;
50  
51      public RemediationServiceImpl(
52              final RemediationLogic logic,
53              final UserDAO userDAO,
54              final GroupDAO groupDAO,
55              final AnyObjectDAO anyObjectDAO) {
56  
57          this.logic = logic;
58          this.userDAO = userDAO;
59          this.groupDAO = groupDAO;
60          this.anyObjectDAO = anyObjectDAO;
61      }
62  
63      @Override
64      public PagedResult<RemediationTO> list(final RemediationQuery query) {
65          Pair<Integer, List<RemediationTO>> result = logic.list(
66                  query.getBefore(),
67                  query.getAfter(),
68                  query.getPage(),
69                  query.getSize(),
70                  getOrderByClauses(query.getOrderBy()));
71          return buildPagedResult(result.getRight(), query.getPage(), query.getSize(), result.getLeft());
72      }
73  
74      @Override
75      public RemediationTO read(final String key) {
76          return logic.read(key);
77      }
78  
79      @Override
80      public Response delete(final String key) {
81          logic.delete(key);
82          return Response.noContent().build();
83      }
84  
85      @Override
86      public Response remedy(final String remediationKey, final AnyCR anyCR) {
87          ProvisioningResult<?> created = logic.remedy(remediationKey, anyCR, isNullPriorityAsync());
88          return createResponse(created);
89      }
90  
91      private void check(final String key, final String anyKey) {
92          RemediationTO remediation = logic.read(key);
93  
94          AnyDAO<?> anyDAO;
95          switch (remediation.getAnyType()) {
96              case "USER":
97                  anyDAO = userDAO;
98                  break;
99  
100             case "GROUP":
101                 anyDAO = groupDAO;
102                 break;
103 
104             default:
105                 anyDAO = anyObjectDAO;
106         }
107 
108         OffsetDateTime etag = anyDAO.findLastChange(anyKey);
109         if (etag == null) {
110             throw new NotFoundException(remediation.getAnyType() + " for " + key);
111         }
112         checkETag(String.valueOf(etag.toInstant().toEpochMilli()));
113     }
114 
115     @Override
116     public Response remedy(final String remediationKey, final AnyUR anyUR) {
117         check(remediationKey, anyUR.getKey());
118 
119         ProvisioningResult<?> updated = logic.remedy(remediationKey, anyUR, isNullPriorityAsync());
120         return modificationResponse(updated);
121     }
122 
123     @Override
124     public Response remedy(final String remediationKey, final String anyKey) {
125         check(remediationKey, anyKey);
126 
127         ProvisioningResult<?> deleted = logic.remedy(remediationKey, anyKey, isNullPriorityAsync());
128         return modificationResponse(deleted);
129     }
130 
131 }