1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19 package org.apache.syncope.client.console.rest;
20
21 import java.util.HashMap;
22 import java.util.List;
23 import java.util.Map;
24 import javax.ws.rs.core.GenericType;
25 import javax.ws.rs.core.Response;
26 import org.apache.syncope.client.ui.commons.Constants;
27 import org.apache.syncope.client.ui.commons.status.Status;
28 import org.apache.syncope.client.ui.commons.status.StatusBean;
29 import org.apache.syncope.client.ui.commons.status.StatusUtils;
30 import org.apache.syncope.common.lib.request.BooleanReplacePatchItem;
31 import org.apache.syncope.common.lib.request.StatusR;
32 import org.apache.syncope.common.lib.request.UserCR;
33 import org.apache.syncope.common.lib.request.UserUR;
34 import org.apache.syncope.common.lib.to.ProvisioningResult;
35 import org.apache.syncope.common.lib.to.UserTO;
36 import org.apache.syncope.common.lib.types.ExecStatus;
37 import org.apache.syncope.common.lib.types.StatusRType;
38 import org.apache.syncope.common.rest.api.beans.AnyQuery;
39 import org.apache.syncope.common.rest.api.service.AnyService;
40 import org.apache.syncope.common.rest.api.service.UserService;
41 import org.apache.wicket.extensions.markup.html.repeater.util.SortParam;
42
43
44
45
46 public class UserRestClient extends AbstractAnyRestClient<UserTO> {
47
48 private static final long serialVersionUID = -1575748964398293968L;
49
50 @Override
51 protected Class<? extends AnyService<UserTO>> getAnyServiceClass() {
52 return UserService.class;
53 }
54
55 public ProvisioningResult<UserTO> create(final UserCR createReq) {
56 Response response = getService(UserService.class).create(createReq);
57 return response.readEntity(new GenericType<>() {
58 });
59 }
60
61 public ProvisioningResult<UserTO> update(final String etag, final UserUR updateReq) {
62 ProvisioningResult<UserTO> result;
63 synchronized (this) {
64 result = getService(etag, UserService.class).update(updateReq).readEntity(new GenericType<>() {
65 });
66 resetClient(getAnyServiceClass());
67 }
68 return result;
69 }
70
71 @Override
72 public int count(final String realm, final String fiql, final String type) {
73 return getService(UserService.class).
74 search(new AnyQuery.Builder().realm(realm).fiql(fiql).page(1).size(0).details(false).build()).
75 getTotalCount();
76 }
77
78 @Override
79 public List<UserTO> search(
80 final String realm, final String fiql, final int page, final int size, final SortParam<String> sort,
81 final String type) {
82
83 return getService(UserService.class).
84 search(new AnyQuery.Builder().realm(realm).fiql(fiql).page(page).size(size).details(false).
85 orderBy(toOrderBy(sort)).details(false).build()).getResult();
86 }
87
88 public ProvisioningResult<UserTO> mustChangePassword(final String etag, final boolean value, final String key) {
89 UserUR userUR = new UserUR.Builder(key).
90 mustChangePassword(new BooleanReplacePatchItem.Builder().value(value).build()).
91 build();
92 return update(etag, userUR);
93 }
94
95 private Map<String, String> status(
96 final StatusRType type, final String etag, final String userKey, final List<StatusBean> statuses) {
97
98 StatusR statusR = StatusUtils.statusR(userKey, type, statuses);
99
100 Map<String, String> results;
101 synchronized (this) {
102 ProvisioningResult<UserTO> provisioningResult = getService(etag, UserService.class).status(statusR).
103 readEntity(new GenericType<>() {
104 });
105
106 statuses.forEach(statusBean -> statusBean.setStatus(Status.UNDEFINED));
107
108 results = new HashMap<>();
109 provisioningResult.getPropagationStatuses().forEach(propagationStatus -> {
110 results.put(propagationStatus.getResource(), propagationStatus.getStatus().name());
111
112 if (propagationStatus.getAfterObj() != null) {
113 Boolean enabled = StatusUtils.isEnabled(propagationStatus.getAfterObj());
114 if (enabled != null) {
115 statuses.stream().
116 filter(statusBean -> propagationStatus.getResource().equals(statusBean.getResource())).
117 findFirst().
118 ifPresent(statusBean -> statusBean.setStatus(
119 enabled ? Status.ACTIVE : Status.SUSPENDED));
120 }
121 }
122 });
123 statuses.stream().
124 filter(statusBean -> Constants.SYNCOPE.equals(statusBean.getResource())).
125 findFirst().
126 ifPresent(statusBean -> statusBean.setStatus(
127 "suspended".equalsIgnoreCase(provisioningResult.getEntity().getStatus())
128 ? Status.SUSPENDED : Status.ACTIVE));
129 if (statusR.isOnSyncope()) {
130 results.put(Constants.SYNCOPE,
131 ("suspended".equalsIgnoreCase(provisioningResult.getEntity().getStatus())
132 && type == StatusRType.SUSPEND)
133 || ("active".equalsIgnoreCase(provisioningResult.getEntity().getStatus())
134 && type == StatusRType.REACTIVATE)
135 ? ExecStatus.SUCCESS.name()
136 : ExecStatus.FAILURE.name());
137 }
138
139 resetClient(UserService.class);
140 }
141 return results;
142 }
143
144 public Map<String, String> suspend(
145 final String etag, final String userKey, final List<StatusBean> statuses) {
146
147 return status(StatusRType.SUSPEND, etag, userKey, statuses);
148 }
149
150 public Map<String, String> reactivate(
151 final String etag, final String userKey, final List<StatusBean> statuses) {
152
153 return status(StatusRType.REACTIVATE, etag, userKey, statuses);
154 }
155 }