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.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   * Console client for invoking rest users services.
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 }