package net.rrm.ehour.user.service;
import net.rrm.ehour.data.LegacyUserDepartment;
import net.rrm.ehour.domain.User;
import net.rrm.ehour.domain.UserDepartment;
import net.rrm.ehour.persistence.user.dao.UserDao;
import org.apache.log4j.Logger;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;
import java.util.List;
/**
* Migrate user departments in the user from one-to-many to many-to-many relation
*/
@Service
public class UserDepartmentMigrator {
private static final Logger LOGGER = Logger.getLogger(UserDepartmentMigrator.class);
private UserDao userDao;
@Autowired
public UserDepartmentMigrator(UserDao userDao) {
this.userDao = userDao;
}
@Transactional(propagation = Propagation.REQUIRES_NEW)
public void migrate() {
LOGGER.info("Migrating user departments in user to a more flexible structure...");
List<LegacyUserDepartment> legacyUserDepartments = userDao.findLegacyUserDepartments();
int count = 0;
for (LegacyUserDepartment legacyUserDepartment : legacyUserDepartments) {
User user = userDao.findById(legacyUserDepartment.getUserId());
user.clearLegacyDepartment();
user.getUserDepartments().clear();
user.getUserDepartments().add(new UserDepartment(legacyUserDepartment.getDepartmentId()));
userDao.persist(user);
count++;
}
LOGGER.info(String.format("%d users found with legacy user department, all converted.", count));
}
}