Skip to content

Commit c2f2ef9

Browse files
committed
SAK-49949 tasks Soft delete tasks for soft deleted sites
https://sakaiproject.atlassian.net/browse/SAK-49949
1 parent 5278ec9 commit c2f2ef9

File tree

14 files changed

+187
-156
lines changed

14 files changed

+187
-156
lines changed

kernel/api/src/main/java/org/sakaiproject/site/api/SiteService.java

+3
Original file line numberDiff line numberDiff line change
@@ -95,6 +95,9 @@ public interface SiteService extends EntityProducer
9595

9696
/** Name for the event for soft deleting a site */
9797
static final String SOFT_DELETE_SITE = "site.del.soft";
98+
99+
/** Name for the event for restoring a soft deleted site */
100+
static final String SITE_RESTORED = "site.restored";
98101

99102
/** Name for the event of removing a site that has already been softly deleted */
100103
static final String SECURE_REMOVE_SOFTLY_DELETED_SITE = "site.del.softly.deleted";

kernel/api/src/main/java/org/sakaiproject/tasks/api/Task.java

+3-1
Original file line numberDiff line numberDiff line change
@@ -86,5 +86,7 @@ public class Task implements PersistableEntity<Long> {
8686

8787
@Column(name = "TASK_OWNER", length = 99)
8888
private String owner;
89-
89+
90+
@Column(name = "SOFT_DELETED")
91+
private Boolean softDeleted;
9092
}

kernel/api/src/main/java/org/sakaiproject/tasks/api/repository/TaskRepository.java

+2
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,8 @@
2929

3030
public interface TaskRepository extends SpringCrudRepository<Task, Long> {
3131

32+
List<Task> findBySiteId(String siteId);
3233
Optional<Task> findByReference(String reference);
3334
List<Task> findByGroupsContaining(String groupId);
35+
int setSoftDeletedBySiteId(String siteId, Boolean softDeleted);
3436
}

kernel/api/src/main/java/org/sakaiproject/tasks/api/repository/UserTaskRepository.java

+4-3
Original file line numberDiff line numberDiff line change
@@ -31,11 +31,12 @@
3131

3232
public interface UserTaskRepository extends SpringCrudRepository<UserTask, Long> {
3333

34+
List<UserTask> findBySiteId(String siteId);
3435
List<UserTask> findByTaskIdAndUserIdIn(Long taskId, List<String> userIds);
35-
List<UserTask> findByUserIdAndStartsAfter(String userId, Instant from);
36+
List<UserTask> findByUserIdAndStartsAfterAndSoftDeleted(String userId, Instant from, Boolean softDeleted);
3637
List<UserTask> findByUserIdAndSiteId(String userId, String siteId);
3738
List<UserTask> findByUserIdAndTask_StartsLessThanEqual(String userId, Instant instant);
3839
List<UserTask> findByTask_SiteId(String siteId);
39-
void deleteByTask(Task task);
40-
void deleteByTaskAndUserIdNotIn(Task task, Set<String> users);
40+
int deleteByTask(Task task);
41+
int deleteByTaskAndUserIdNotIn(Task task, Set<String> users);
4142
}

kernel/kernel-impl/src/main/java/org/sakaiproject/tasks/impl/TaskServiceImpl.java

+58-9
Original file line numberDiff line numberDiff line change
@@ -56,7 +56,8 @@
5656

5757
import org.springframework.beans.BeanUtils;
5858
import org.springframework.beans.factory.annotation.Autowired;
59-
59+
import org.springframework.beans.factory.annotation.Qualifier;
60+
import org.springframework.transaction.PlatformTransactionManager;
6061
import org.springframework.transaction.annotation.Transactional;
6162
import org.springframework.transaction.support.TransactionTemplate;
6263

@@ -72,15 +73,17 @@ public class TaskServiceImpl implements TaskService, Observer {
7273
@Autowired private EntityManager entityManager;
7374
@Autowired private EventTrackingService eventTrackingService;
7475
@Autowired private FunctionManager functionManager;
76+
77+
@Qualifier("org.sakaiproject.springframework.orm.hibernate.GlobalTransactionManager")
78+
@Autowired private PlatformTransactionManager transactionManager;
79+
7580
@Autowired private SecurityService securityService;
7681
@Autowired private SessionManager sessionManager;
7782
@Autowired private SiteService siteService;
7883
@Autowired private TaskAssignedRepository taskAssignedRepository;
7984
@Autowired private TaskRepository taskRepository;
8085
@Autowired private UserTaskRepository userTaskRepository;
8186

82-
@Setter private TransactionTemplate transactionTemplate;
83-
8487
public void init() {
8588

8689
functionManager.registerFunction(TaskPermissions.CREATE_TASK, true);
@@ -95,7 +98,10 @@ public void update(Observable o, Object arg) {
9598
if (event.getEvent().equals(SiteService.SECURE_UPDATE_SITE_MEMBERSHIP)) {
9699
try {
97100
Set<String> siteUsers = siteService.getSite(event.getContext()).getUsers();
98-
transactionTemplate.executeWithoutResult(status -> {
101+
102+
TransactionTemplate tt = new TransactionTemplate(transactionManager);
103+
104+
tt.executeWithoutResult(status -> {
99105

100106
userTaskRepository.findByTask_SiteId(event.getContext()).forEach(userTask -> {
101107

@@ -112,7 +118,10 @@ public void update(Observable o, Object arg) {
112118
String groupId = event.getResource();
113119
try {
114120
String groupRef = AuthzGroupReferenceBuilder.builder().site(event.getContext()).group(groupId).build();
115-
transactionTemplate.executeWithoutResult(status -> {
121+
122+
TransactionTemplate tt = new TransactionTemplate(transactionManager);
123+
124+
tt.executeWithoutResult(status -> {
116125

117126
// Find any task containing this group
118127
taskRepository.findByGroupsContaining(groupRef).forEach(t -> {
@@ -134,6 +143,46 @@ public void update(Observable o, Object arg) {
134143
} catch (Exception e) {
135144
log.error("Failed to update user tasks for group {}: {}", groupId, e.toString());
136145
}
146+
} else if (event.getEvent().equals(SiteService.SOFT_DELETE_SITE)) {
147+
148+
String siteId = event.getContext();
149+
150+
TransactionTemplate tt = new TransactionTemplate(transactionManager);
151+
152+
tt.executeWithoutResult(status -> {
153+
154+
userTaskRepository.findBySiteId(siteId).forEach(ut -> {
155+
156+
ut.setSoftDeleted(Boolean.TRUE);
157+
userTaskRepository.save(ut);
158+
});
159+
160+
taskRepository.findBySiteId(siteId).forEach(t -> {
161+
162+
t.setSoftDeleted(Boolean.TRUE);
163+
taskRepository.save(t);
164+
});
165+
});
166+
} else if (event.getEvent().equals(SiteService.SITE_RESTORED)) {
167+
168+
String siteId = event.getContext();
169+
170+
TransactionTemplate tt = new TransactionTemplate(transactionManager);
171+
172+
tt.executeWithoutResult(status -> {
173+
174+
userTaskRepository.findBySiteId(siteId).forEach(ut -> {
175+
176+
ut.setSoftDeleted(Boolean.FALSE);
177+
userTaskRepository.save(ut);
178+
});
179+
180+
taskRepository.findBySiteId(siteId).forEach(t -> {
181+
182+
t.setSoftDeleted(Boolean.FALSE);
183+
taskRepository.save(t);
184+
});
185+
});
137186
}
138187
}
139188
}
@@ -162,9 +211,7 @@ public Task createTask(Task task, Set<String> users, Integer priority) {
162211

163212
Optional<Task> optionalCurrentTask = getTask(task.getReference());
164213

165-
if (optionalCurrentTask.isPresent()) {
166-
task.setId(optionalCurrentTask.get().getId());
167-
}
214+
optionalCurrentTask.ifPresent(t -> task.setId(t.getId()));
168215

169216
final Task mergedTask = taskRepository.save(task);
170217

@@ -217,6 +264,7 @@ public UserTask saveUserTask(UserTaskAdapterBean transfer) {
217264

218265
@Transactional
219266
public UserTask createUserTask(Task task, UserTaskAdapterBean transfer) {
267+
220268
UserTask userTask = new UserTask();
221269
userTask.setTask(task);
222270
BeanUtils.copyProperties(transfer, userTask);
@@ -241,9 +289,10 @@ public List<UserTaskAdapterBean> getCurrentTasksForCurrentUser() {
241289

242290
String userId = sessionManager.getCurrentSessionUserId();
243291

244-
return userTaskRepository.findByUserIdAndStartsAfter(userId, Instant.now())
292+
return userTaskRepository.findByUserIdAndStartsAfterAndSoftDeleted(userId, Instant.now(), Boolean.FALSE)
245293
.stream()
246294
.map(ut -> {
295+
247296
UserTaskAdapterBean bean = new UserTaskAdapterBean();
248297
BeanUtils.copyProperties(ut, bean);
249298
BeanUtils.copyProperties(ut.getTask(), bean);

kernel/kernel-impl/src/main/java/org/sakaiproject/tasks/impl/repository/TaskRepositoryImpl.java

+25
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@
2626

2727
import javax.persistence.criteria.CriteriaBuilder;
2828
import javax.persistence.criteria.CriteriaQuery;
29+
import javax.persistence.criteria.CriteriaUpdate;
2930
import javax.persistence.criteria.Root;
3031

3132
import org.hibernate.Session;
@@ -36,6 +37,18 @@
3637

3738
public class TaskRepositoryImpl extends SpringCrudRepositoryImpl<Task, Long> implements TaskRepository {
3839

40+
public List<Task> findBySiteId(String siteId) {
41+
42+
Session session = sessionFactory.getCurrentSession();
43+
44+
CriteriaBuilder cb = session.getCriteriaBuilder();
45+
CriteriaQuery<Task> cq = cb.createQuery(Task.class);
46+
Root<Task> root = cq.from(Task.class);
47+
cq.where(cb.equal(root.get("siteId"), siteId));
48+
49+
return session.createQuery(cq).list();
50+
}
51+
3952
public Optional<Task> findByReference(String reference) {
4053

4154
Session session = sessionFactory.getCurrentSession();
@@ -60,4 +73,16 @@ public List<Task> findByGroupsContaining(String groupId) {
6073

6174
return session.createQuery(cq).list();
6275
}
76+
77+
public int setSoftDeletedBySiteId(String siteId, Boolean softDeleted) {
78+
79+
Session session = sessionFactory.getCurrentSession();
80+
81+
CriteriaBuilder cb = session.getCriteriaBuilder();
82+
CriteriaUpdate<Task> cu = cb.createCriteriaUpdate(Task.class);
83+
Root<Task> root = cu.from(Task.class);
84+
cu.set("softDeleted", softDeleted).where(cb.equal(root.get("siteId"), siteId));
85+
86+
return session.createQuery(cu).executeUpdate();
87+
}
6388
}

kernel/kernel-impl/src/main/java/org/sakaiproject/tasks/impl/repository/UserTaskRepositoryImpl.java

+43-20
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,6 @@
2626
import java.time.Instant;
2727

2828
import org.hibernate.Session;
29-
import org.hibernate.criterion.Restrictions;
3029

3130
import javax.persistence.criteria.CriteriaBuilder;
3231
import javax.persistence.criteria.CriteriaDelete;
@@ -41,23 +40,39 @@
4140

4241
public class UserTaskRepositoryImpl extends SpringCrudRepositoryImpl<UserTask, Long> implements UserTaskRepository {
4342

43+
public List<UserTask> findBySiteId(String siteId) {
44+
45+
Session session = sessionFactory.getCurrentSession();
46+
47+
CriteriaBuilder cb = session.getCriteriaBuilder();
48+
CriteriaQuery<UserTask> query = cb.createQuery(UserTask.class);
49+
Root<UserTask> userTask = query.from(UserTask.class);
50+
query.where(cb.equal(userTask.get("task").get("siteId"), siteId));
51+
52+
return session.createQuery(query).list();
53+
}
54+
4455
public List<UserTask> findByTaskIdAndUserIdIn(Long taskId, List<String> userIds) {
4556

4657
Session session = sessionFactory.getCurrentSession();
4758

48-
return (List<UserTask>) session.createCriteria(UserTask.class)
49-
.add(Restrictions.eq("task.id", taskId))
50-
.add(Restrictions.in("userId", userIds)).list();
59+
CriteriaBuilder cb = session.getCriteriaBuilder();
60+
CriteriaQuery<UserTask> query = cb.createQuery(UserTask.class);
61+
Root<UserTask> userTask = query.from(UserTask.class);
62+
query.where(cb.equal(userTask.get("task").get("id"), taskId), userTask.get("userId").in(userIds));
63+
64+
return session.createQuery(query).list();
5165
}
5266

53-
public List<UserTask> findByUserIdAndStartsAfter(String userId, Instant from) {
67+
public List<UserTask> findByUserIdAndStartsAfterAndSoftDeleted(String userId, Instant from, Boolean softDeleted) {
5468

5569
Session session = sessionFactory.getCurrentSession();
5670

5771
CriteriaBuilder cb = session.getCriteriaBuilder();
5872
CriteriaQuery<UserTask> query = cb.createQuery(UserTask.class);
5973
Root<UserTask> userTask = query.from(UserTask.class);
60-
query.where(cb.equal(userTask.get("userId"), userId), cb.lessThanOrEqualTo(userTask.get("task").get("starts"), from));
74+
query.where(cb.and(cb.equal(userTask.get("userId"), userId) , cb.lessThanOrEqualTo(userTask.get("task").get("starts"), from))
75+
, cb.or(cb.isNull(userTask.get("softDeleted")), cb.equal(userTask.get("softDeleted"), softDeleted)));
6176

6277
return session.createQuery(query).list();
6378
}
@@ -66,18 +81,24 @@ public List<UserTask> findByUserIdAndSiteId(String userId, String siteId) {
6681

6782
Session session = sessionFactory.getCurrentSession();
6883

69-
return session.createQuery("select u from UserTask u where userId = :userId and task.siteId = :siteId")
70-
.setParameter("userId", userId)
71-
.setParameter("siteId", siteId).list();
84+
CriteriaBuilder cb = session.getCriteriaBuilder();
85+
CriteriaQuery<UserTask> query = cb.createQuery(UserTask.class);
86+
Root<UserTask> userTask = query.from(UserTask.class);
87+
query.where(cb.equal(userTask.get("userId"), userId), cb.equal(userTask.get("task").get("siteId"), siteId));
88+
89+
return session.createQuery(query).list();
7290
}
7391

74-
public List<UserTask> findByUserIdAndTask_StartsLessThanEqual(String userId, Instant instant) {
92+
public List<UserTask> findByUserIdAndTask_StartsLessThanEqual(String userId, Instant earlierThan) {
7593

7694
Session session = sessionFactory.getCurrentSession();
7795

78-
return (List<UserTask>) session.createCriteria(UserTask.class)
79-
.add(Restrictions.eq("userId", userId))
80-
.add(Restrictions.le("task.starts", instant)).list();
96+
CriteriaBuilder cb = session.getCriteriaBuilder();
97+
CriteriaQuery<UserTask> query = cb.createQuery(UserTask.class);
98+
Root<UserTask> userTask = query.from(UserTask.class);
99+
query.where(cb.equal(userTask.get("userId"), userId), cb.lessThanOrEqualTo(userTask.get("task").get("starts"), earlierThan));
100+
101+
return session.createQuery(query).list();
81102
}
82103

83104
public List<UserTask> findByTask_SiteId(String siteId) {
@@ -92,19 +113,21 @@ public List<UserTask> findByTask_SiteId(String siteId) {
92113
cq.where(cb.equal(taskJoin.get("siteId"), siteId));
93114

94115
return session.createQuery(cq).list();
95-
96116
}
97117

98-
public void deleteByTask(Task task) {
118+
public int deleteByTask(Task task) {
99119

100120
Session session = sessionFactory.getCurrentSession();
101121

102-
session.createQuery("delete from UserTask where task = :task")
103-
.setParameter("task", task).executeUpdate();
104-
session.delete(task);
122+
CriteriaBuilder cb = session.getCriteriaBuilder();
123+
CriteriaDelete<UserTask> cd = cb.createCriteriaDelete(UserTask.class);
124+
Root<UserTask> userTask = cd.from(UserTask.class);
125+
cd.where(cb.equal(userTask.get("task"), task));
126+
127+
return session.createQuery(cd).executeUpdate();
105128
}
106129

107-
public void deleteByTaskAndUserIdNotIn(Task task, Set<String> users) {
130+
public int deleteByTaskAndUserIdNotIn(Task task, Set<String> users) {
108131

109132
Session session = sessionFactory.getCurrentSession();
110133

@@ -113,6 +136,6 @@ public void deleteByTaskAndUserIdNotIn(Task task, Set<String> users) {
113136
Root<UserTask> root = cd.from(UserTask.class);
114137
cd.where(cb.equal(root.get("task"), task), cb.not(root.get("userId").in(users)));
115138

116-
session.createQuery(cd).executeUpdate();
139+
return session.createQuery(cd).executeUpdate();
117140
}
118141
}

kernel/kernel-impl/src/main/webapp/WEB-INF/tasks-components.xml

+2-2
Original file line numberDiff line numberDiff line change
@@ -21,11 +21,11 @@
2121
<bean id="org.sakaiproject.tasks.api.TaskService"
2222
class="org.sakaiproject.tasks.impl.TaskServiceImpl" init-method="init">
2323

24-
<property name="transactionTemplate">
24+
<!--property name="transactionTemplate">
2525
<bean class="org.springframework.transaction.support.TransactionTemplate">
2626
<property name="transactionManager" ref="org.sakaiproject.springframework.orm.hibernate.GlobalTransactionManager"/>
2727
</bean>
28-
</property>
28+
</property-->
2929
</bean>
3030

3131
<bean id="org.sakaiproject.springframework.orm.hibernate.impl.AdditionalHibernateMappings.taskservice"

0 commit comments

Comments
 (0)