package net.techreadiness.batch.user;
import java.util.List;
import javax.inject.Inject;
import javax.inject.Named;
import javax.persistence.EntityManager;
import javax.persistence.Query;
import javax.persistence.TypedQuery;
import net.techreadiness.persistence.dao.RoleDAO;
import net.techreadiness.persistence.domain.RoleDO;
import net.techreadiness.persistence.domain.UserDO;
import net.techreadiness.service.ServiceContext;
import org.springframework.batch.item.database.orm.JpaQueryProvider;
import org.springframework.context.annotation.Scope;
import com.google.common.collect.Lists;
@Named
@Scope("prototype")
public class UserExportQueryProvider implements JpaQueryProvider {
private EntityManager entityManager;
@Inject
private ServiceContext serviceContext;
@Inject
private RoleDAO roleDAO;
@Override
public Query createQuery() {
StringBuilder sb = new StringBuilder();
sb.append("select u from UserDO u ");
sb.append("where u.userId in (select urd.user.userId from UserRoleDO urd where urd.role.roleId in (:roleIds)) ");
sb.append("and u.userId in (select uo.user.userId from UserOrgDO uo join uo.org o join o.orgTrees aot where aot.ancestorOrg.orgId = :orgId)");
TypedQuery<UserDO> query = entityManager.createQuery(sb.toString(), UserDO.class);
query.setParameter("orgId", serviceContext.getOrgId());
List<RoleDO> roles = roleDAO.findDelegatableRoles(serviceContext.getUserId(), serviceContext.getScopeId());
List<Long> roleIds = Lists.newArrayList();
for (RoleDO role : roles) {
roleIds.add(role.getRoleId());
}
query.setParameter("roleIds", roleIds);
return query;
}
@Override
public void setEntityManager(EntityManager entityManager) {
this.entityManager = entityManager;
}
}