1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
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 }