diff --git a/bwreg-entities/src/main/java/edu/kit/scc/webreg/entity/project/ProjectEntity.java b/bwreg-entities/src/main/java/edu/kit/scc/webreg/entity/project/ProjectEntity.java index d8f7e4d7174e000704561daecebd30681a6c5fbd..d51b46a34ae3e6308ae89bfa5651d67337572222 100644 --- a/bwreg-entities/src/main/java/edu/kit/scc/webreg/entity/project/ProjectEntity.java +++ b/bwreg-entities/src/main/java/edu/kit/scc/webreg/entity/project/ProjectEntity.java @@ -11,6 +11,7 @@ package edu.kit.scc.webreg.entity.project; import java.sql.Types; +import java.util.Date; import java.util.Set; import org.hibernate.annotations.JdbcTypeCode; @@ -95,6 +96,9 @@ public class ProjectEntity extends AbstractBaseEntity { @OneToMany(mappedBy = "project") private Set<ProjectIdentityAdminEntity> projectAdmins; + @Column(name = "last_sync_to_group") + private Date lastSyncToGroup; + public String getName() { return name; } @@ -222,4 +226,12 @@ public class ProjectEntity extends AbstractBaseEntity { public void setAttributeName(String attributeName) { this.attributeName = attributeName; } + + public Date getLastSyncToGroup() { + return lastSyncToGroup; + } + + public void setLastSyncToGroup(Date lastSyncToGroup) { + this.lastSyncToGroup = lastSyncToGroup; + } } diff --git a/bwreg-service/src/main/java/edu/kit/scc/webreg/job/ProjectsSyncToGroup.java b/bwreg-service/src/main/java/edu/kit/scc/webreg/job/ProjectsSyncToGroup.java new file mode 100644 index 0000000000000000000000000000000000000000..ba65e3183147d8ceeaaa0dab6f75e07db372b648 --- /dev/null +++ b/bwreg-service/src/main/java/edu/kit/scc/webreg/job/ProjectsSyncToGroup.java @@ -0,0 +1,90 @@ +/******************************************************************************* + * Copyright (c) 2014 Michael Simon. + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the GNU Public License v3.0 + * which accompanies this distribution, and is available at + * http://www.gnu.org/licenses/gpl.html + * + * Contributors: + * Michael Simon - initial + ******************************************************************************/ +package edu.kit.scc.webreg.job; + +import static edu.kit.scc.webreg.dao.ops.PaginateBy.withLimit; +import static edu.kit.scc.webreg.dao.ops.RqlExpressions.and; +import static edu.kit.scc.webreg.dao.ops.RqlExpressions.isNull; +import static edu.kit.scc.webreg.dao.ops.RqlExpressions.lessThanOrEqualTo; +import static edu.kit.scc.webreg.dao.ops.RqlExpressions.notEqual; +import static edu.kit.scc.webreg.dao.ops.RqlExpressions.or; +import static edu.kit.scc.webreg.dao.ops.SortBy.ascendingBy; +import static java.time.temporal.ChronoUnit.MILLIS; + +import java.time.Instant; +import java.util.Date; +import java.util.List; + +import javax.naming.InitialContext; +import javax.naming.NamingException; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import edu.kit.scc.webreg.dao.ops.RqlExpressions; +import edu.kit.scc.webreg.entity.project.ProjectEntity; +import edu.kit.scc.webreg.entity.project.ProjectEntity_; +import edu.kit.scc.webreg.entity.project.ProjectStatus; +import edu.kit.scc.webreg.service.project.ProjectService; + +public class ProjectsSyncToGroup extends AbstractExecutableJob { + + private static final long serialVersionUID = 1L; + + @Override + public void execute() { + Logger logger = LoggerFactory.getLogger(ProjectsSyncToGroup.class); + + Long olderThanMillis; + + if (!getJobStore().containsKey("older_than_millis")) { + olderThanMillis = 24L * 60L * 60L * 1000L; + } else { + olderThanMillis = Long.parseLong(getJobStore().get("older_than_millis")); + } + + Date olderThan = Date.from(Instant.now().minus(olderThanMillis, MILLIS)); + + Integer limit; + + if (!getJobStore().containsKey("limit")) { + limit = 2; + } else { + limit = Integer.parseInt(getJobStore().get("limit")); + } + + try { + InitialContext ic = new InitialContext(); + + ProjectService projectService = (ProjectService) ic.lookup( + "global/bwreg/bwreg-service/ProjectServiceImpl!edu.kit.scc.webreg.service.project.ProjectService"); + + logger.info("Starting project member sync to group"); + + List<ProjectEntity> projectList = projectService.findAll(withLimit(limit), + ascendingBy(ProjectEntity_.lastSyncToGroup), + and(or(lessThanOrEqualTo(ProjectEntity_.lastSyncToGroup, olderThan), + isNull(ProjectEntity_.lastSyncToGroup)), + or(notEqual(ProjectEntity_.projectStatus, ProjectStatus.DELETED), + RqlExpressions.isNull(ProjectEntity_.projectStatus)))); + + for (ProjectEntity project : projectList) { + logger.info("Syncing project {}", project.getShortName()); + projectService.syncAllMembersToGroup(project, "project-sync-job"); + } + + logger.info("Project member sync to group done"); + + } catch (NamingException e) { + logger.warn("Could not clear Audit Logs: {}", e); + } + } +} diff --git a/regapp-project/src/main/java/edu/kit/scc/webreg/service/project/AbstractProjectUpdater.java b/regapp-project/src/main/java/edu/kit/scc/webreg/service/project/AbstractProjectUpdater.java index 0dcb3aac5deb91aa0854fc7441c84efd357c5d12..694f256adca1de5085d8a45a1c491d624f24e368 100644 --- a/regapp-project/src/main/java/edu/kit/scc/webreg/service/project/AbstractProjectUpdater.java +++ b/regapp-project/src/main/java/edu/kit/scc/webreg/service/project/AbstractProjectUpdater.java @@ -4,6 +4,7 @@ import static org.apache.commons.lang3.RandomStringUtils.randomAlphanumeric; import java.io.Serializable; import java.util.ArrayList; +import java.util.Date; import java.util.HashSet; import java.util.List; import java.util.Set; @@ -203,6 +204,8 @@ public abstract class AbstractProjectUpdater<T extends ProjectEntity> implements logger.info("Remove user {} from project-group for project {}", user.getId(), project.getName()); groupDao.removeUserGromGroup(user, project.getProjectGroup()); } + + project.setLastSyncToGroup(new Date()); } public void syncMemberToGroup(ProjectEntity project, IdentityEntity identity, String executor) {