1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19 package org.apache.syncope.core.provisioning.java.job;
20
21 import java.util.Collection;
22 import java.util.List;
23 import org.apache.commons.lang3.StringUtils;
24 import org.apache.syncope.common.lib.to.PropagationStatus;
25 import org.apache.syncope.common.lib.types.AnyTypeKind;
26 import org.apache.syncope.common.lib.types.ProvisionAction;
27 import org.apache.syncope.common.lib.types.TaskType;
28 import org.apache.syncope.core.persistence.api.dao.AnySearchDAO;
29 import org.apache.syncope.core.persistence.api.dao.GroupDAO;
30 import org.apache.syncope.core.persistence.api.dao.search.MembershipCond;
31 import org.apache.syncope.core.persistence.api.dao.search.SearchCond;
32 import org.apache.syncope.core.persistence.api.entity.anyobject.AnyObject;
33 import org.apache.syncope.core.persistence.api.entity.group.Group;
34 import org.apache.syncope.core.persistence.api.entity.task.SchedTask;
35 import org.apache.syncope.core.persistence.api.entity.task.TaskExec;
36 import org.apache.syncope.core.persistence.api.entity.user.User;
37 import org.apache.syncope.core.provisioning.api.AnyObjectProvisioningManager;
38 import org.apache.syncope.core.provisioning.api.UserProvisioningManager;
39 import org.quartz.JobExecutionContext;
40 import org.quartz.JobExecutionException;
41 import org.springframework.beans.factory.annotation.Autowired;
42 import org.springframework.transaction.annotation.Transactional;
43
44 public class GroupMemberProvisionTaskJobDelegate extends AbstractSchedTaskJobDelegate<SchedTask> {
45
46 public static final String ACTION_JOBDETAIL_KEY = "action";
47
48 public static final String GROUP_KEY_JOBDETAIL_KEY = "groupKey";
49
50 @Autowired
51 private GroupDAO groupDAO;
52
53 @Autowired
54 private AnySearchDAO searchDAO;
55
56 @Autowired
57 private UserProvisioningManager userProvisioningManager;
58
59 @Autowired
60 private AnyObjectProvisioningManager anyObjectProvisioningManager;
61
62 private String groupKey;
63
64 private ProvisionAction action;
65
66 @Transactional
67 @Override
68 public void execute(
69 final TaskType taskType,
70 final String taskKey,
71 final boolean dryRun,
72 final JobExecutionContext context)
73 throws JobExecutionException {
74
75 groupKey = context.getMergedJobDataMap().getString(GROUP_KEY_JOBDETAIL_KEY);
76 action = (ProvisionAction) context.getMergedJobDataMap().get(ACTION_JOBDETAIL_KEY);
77
78 super.execute(taskType, taskKey, dryRun, context);
79 }
80
81 @Override
82 protected String doExecute(final boolean dryRun, final String executor, final JobExecutionContext context)
83 throws JobExecutionException {
84
85 Group group = groupDAO.authFind(groupKey);
86
87 StringBuilder result = new StringBuilder("Group ").append(group.getName()).append(" members ");
88 if (action == ProvisionAction.DEPROVISION) {
89 result.append("de");
90 }
91 result.append("provision\n\n");
92
93 setStatus(result.toString());
94
95 MembershipCond membershipCond = new MembershipCond();
96 membershipCond.setGroup(groupKey);
97 List<User> users = searchDAO.search(SearchCond.getLeaf(membershipCond), AnyTypeKind.USER);
98 Collection<String> gResources = groupDAO.findAllResourceKeys(groupKey);
99 setStatus("About to "
100 + (action == ProvisionAction.DEPROVISION ? "de" : "") + "provision "
101 + users.size() + " users from " + gResources);
102
103 for (int i = 0; i < users.size() && !interrupt; i++) {
104 List<PropagationStatus> statuses = action == ProvisionAction.DEPROVISION
105 ? userProvisioningManager.deprovision(
106 users.get(i).getKey(), gResources, false, executor)
107 : userProvisioningManager.provision(
108 users.get(i).getKey(), true, null, gResources, false, executor);
109 for (PropagationStatus propagationStatus : statuses) {
110 result.append("User ").append(users.get(i).getKey()).append('\t').
111 append("Resource ").append(propagationStatus.getResource()).append('\t').
112 append(propagationStatus.getStatus());
113 if (StringUtils.isNotBlank(propagationStatus.getFailureReason())) {
114 result.append('\n').append(propagationStatus.getFailureReason()).append('\n');
115 }
116 result.append('\n');
117 }
118 result.append('\n');
119 }
120 if (interrupt) {
121 LOG.debug("Group assignment interrupted");
122 interrupted = true;
123 return result.append("\n*** Group assignment interrupted ***\n").toString();
124 }
125
126 membershipCond = new MembershipCond();
127 membershipCond.setGroup(groupKey);
128 List<AnyObject> anyObjects = searchDAO.search(SearchCond.getLeaf(membershipCond), AnyTypeKind.ANY_OBJECT);
129 setStatus("About to "
130 + (action == ProvisionAction.DEPROVISION ? "de" : "") + "provision "
131 + anyObjects.size() + " any objects from " + gResources);
132
133 for (int i = 0; i < anyObjects.size() && !interrupt; i++) {
134 List<PropagationStatus> statuses = action == ProvisionAction.DEPROVISION
135 ? anyObjectProvisioningManager.deprovision(
136 anyObjects.get(i).getKey(), gResources, false, executor)
137 : anyObjectProvisioningManager.provision(
138 anyObjects.get(i).getKey(), gResources, false, executor);
139
140 for (PropagationStatus propagationStatus : statuses) {
141 result.append(anyObjects.get(i).getType().getKey()).append(' ').
142 append(anyObjects.get(i).getKey()).append('\t').
143 append("Resource ").append(propagationStatus.getResource()).append('\t').
144 append(propagationStatus.getStatus());
145 if (StringUtils.isNotBlank(propagationStatus.getFailureReason())) {
146 result.append('\n').append(propagationStatus.getFailureReason()).append('\n');
147 }
148 result.append('\n');
149 }
150 result.append('\n');
151 }
152 if (interrupt) {
153 LOG.debug("Group assignment interrupted");
154 interrupted = true;
155 result.append("\n*** Group assignment interrupted ***\n");
156 }
157
158 return result.toString();
159 }
160
161 @Override
162 protected boolean hasToBeRegistered(final TaskExec<?> execution) {
163
164 return true;
165 }
166 }