Optimalizace načítání dat z databáze. Joinované kolekce lze označit jako
lazy. Do servisní vrstvy se pak implementuje transakční metoda s anotací LazyLoader, která donačte kolekci.
This commit is contained in:
@@ -171,6 +171,7 @@ public class AppInitListener implements ServletContextListener {
|
||||
boolean adminExists = false;
|
||||
|
||||
for (User u : userService.getAll()) {
|
||||
userService.loadAuthorities(u);
|
||||
if (userService.hasRole(u, Constants.ROLE_ADMIN)) {
|
||||
adminExists = true;
|
||||
break;
|
||||
|
||||
@@ -0,0 +1,59 @@
|
||||
package info.bukova.isspst;
|
||||
|
||||
import info.bukova.isspst.data.Role;
|
||||
import info.bukova.isspst.data.User;
|
||||
import info.bukova.isspst.data.Workgroup;
|
||||
|
||||
import java.io.Serializable;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
|
||||
public class SessionData implements Serializable {
|
||||
|
||||
/**
|
||||
*
|
||||
*/
|
||||
private static final long serialVersionUID = -764426911263559758L;
|
||||
|
||||
private List<Workgroup> userCentres;
|
||||
private List<Workgroup> userWorkgroups;
|
||||
private User currentUser;
|
||||
private Map<Integer, List<Role>> workgroupRoles;
|
||||
|
||||
public SessionData() {
|
||||
|
||||
}
|
||||
|
||||
public List<Workgroup> getUserCentres() {
|
||||
return userCentres;
|
||||
}
|
||||
|
||||
public void setUserCentres(List<Workgroup> userCentres) {
|
||||
this.userCentres = userCentres;
|
||||
}
|
||||
|
||||
public List<Workgroup> getUserWorkgroups() {
|
||||
return userWorkgroups;
|
||||
}
|
||||
|
||||
public void setUserWorkgroups(List<Workgroup> userWorkgroups) {
|
||||
this.userWorkgroups = userWorkgroups;
|
||||
}
|
||||
|
||||
public User getCurrentUser() {
|
||||
return currentUser;
|
||||
}
|
||||
|
||||
public void setCurrentUser(User currentUser) {
|
||||
this.currentUser = currentUser;
|
||||
}
|
||||
|
||||
public Map<Integer, List<Role>> getWorkgroupRoles() {
|
||||
return workgroupRoles;
|
||||
}
|
||||
|
||||
public void setWorkgroupRoles(Map<Integer, List<Role>> workgroupRoles) {
|
||||
this.workgroupRoles = workgroupRoles;
|
||||
}
|
||||
|
||||
}
|
||||
@@ -31,7 +31,7 @@ public abstract class Member implements DataModel {
|
||||
@Column(name = "MODIFIED")
|
||||
private Date modified;
|
||||
@ManyToMany
|
||||
@LazyCollection(LazyCollectionOption.FALSE)
|
||||
@LazyCollection(LazyCollectionOption.TRUE)
|
||||
@JoinTable(name="MEMBER_PARENT", joinColumns={@JoinColumn(name="MEMBER_ID")}, inverseJoinColumns={@JoinColumn(name="PARENT_ID")})
|
||||
private List<Workgroup> parents;
|
||||
@Transient
|
||||
|
||||
@@ -38,7 +38,7 @@ public class User extends Member implements UserDetails, DataModel {
|
||||
private String email;
|
||||
@Column(name="NOTIFY")
|
||||
private boolean notify;
|
||||
@ManyToMany(fetch=FetchType.EAGER)
|
||||
@ManyToMany(fetch=FetchType.LAZY)
|
||||
@JoinTable(name="USER_ROLE", joinColumns={@JoinColumn(name="USER_ID")}, inverseJoinColumns={@JoinColumn(name="ROLE_ID")})
|
||||
private List<Role> authorities;
|
||||
|
||||
|
||||
@@ -1,5 +1,6 @@
|
||||
package info.bukova.isspst.data;
|
||||
|
||||
import java.io.Serializable;
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
|
||||
@@ -19,14 +20,19 @@ import org.hibernate.annotations.LazyCollectionOption;
|
||||
|
||||
@Entity
|
||||
@Table(name = "WORKGROUP")
|
||||
public class Workgroup extends Member implements OwnedDataModel {
|
||||
public class Workgroup extends Member implements OwnedDataModel, Serializable {
|
||||
|
||||
/**
|
||||
*
|
||||
*/
|
||||
private static final long serialVersionUID = -5039169434782289101L;
|
||||
|
||||
@Column(name = "CODE")
|
||||
private String code;
|
||||
@Column(name = "NAME")
|
||||
private String name;
|
||||
@ManyToMany(cascade = {CascadeType.ALL})
|
||||
@LazyCollection(LazyCollectionOption.FALSE)
|
||||
@LazyCollection(LazyCollectionOption.TRUE)
|
||||
@JoinTable(name="WORKGROUP_MEMBER", joinColumns={@JoinColumn(name="WORKGROUP_ID")}, inverseJoinColumns={@JoinColumn(name="JOBMAPPING_ID")})
|
||||
private List<JobMapping> members;
|
||||
@Column(name = "CENTRE")
|
||||
|
||||
@@ -0,0 +1,59 @@
|
||||
package info.bukova.isspst.security;
|
||||
|
||||
import info.bukova.isspst.SessionData;
|
||||
import info.bukova.isspst.data.Role;
|
||||
import info.bukova.isspst.data.User;
|
||||
import info.bukova.isspst.data.Workgroup;
|
||||
import info.bukova.isspst.services.users.UserService;
|
||||
import info.bukova.isspst.services.workgroups.WorkgroupService;
|
||||
|
||||
import java.io.IOException;
|
||||
import java.util.HashMap;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
|
||||
import javax.servlet.ServletException;
|
||||
import javax.servlet.http.HttpServletRequest;
|
||||
import javax.servlet.http.HttpServletResponse;
|
||||
|
||||
import org.slf4j.Logger;
|
||||
import org.slf4j.LoggerFactory;
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.springframework.security.core.Authentication;
|
||||
import org.springframework.security.web.authentication.AuthenticationSuccessHandler;
|
||||
|
||||
public class LoginSuccessHandler implements AuthenticationSuccessHandler {
|
||||
|
||||
@Autowired
|
||||
private SessionData sessionData;
|
||||
@Autowired
|
||||
private WorkgroupService workgroupService;
|
||||
@Autowired
|
||||
private UserService userService;
|
||||
|
||||
private static final Logger logger = LoggerFactory.getLogger(LoginSuccessHandler.class);
|
||||
|
||||
@Override
|
||||
public void onAuthenticationSuccess(HttpServletRequest request,
|
||||
HttpServletResponse response, Authentication auth) throws IOException,
|
||||
ServletException {
|
||||
|
||||
User u = (User) userService.loadUserByUsername(((User)auth.getPrincipal()).getUsername());
|
||||
|
||||
logger.info("User " + u.getUsername() + " logged in");
|
||||
|
||||
sessionData.setUserCentres(workgroupService.getUserCentres((User) auth.getPrincipal()));
|
||||
sessionData.setUserWorkgroups(workgroupService.getUserWorkgroups((User) auth.getPrincipal()));
|
||||
workgroupService.loadParents(u);
|
||||
sessionData.setCurrentUser(u);
|
||||
|
||||
Map<Integer, List<Role>> wgRoles = new HashMap<Integer, List<Role>>();
|
||||
for (Workgroup w : u.getParents()) {
|
||||
wgRoles.put(w.getId(), workgroupService.getUserWorkgroupRoles(w, u));
|
||||
}
|
||||
sessionData.setWorkgroupRoles(wgRoles);
|
||||
|
||||
response.sendRedirect("app/");
|
||||
}
|
||||
|
||||
}
|
||||
@@ -36,6 +36,10 @@ public class AbstractOwnedService<T extends OwnedDataModel> extends AbstractServ
|
||||
|
||||
@Transactional
|
||||
protected User getLoggedInUser() {
|
||||
if (sessionData.getCurrentUser() != null) {
|
||||
return sessionData.getCurrentUser();
|
||||
}
|
||||
|
||||
try {
|
||||
String query = "from User where USERNAME = '" + ((UserDetails)SecurityContextHolder.getContext().getAuthentication().getPrincipal()).getUsername() + "'";
|
||||
Query q = dao.getQuery(query);
|
||||
|
||||
@@ -3,6 +3,7 @@ package info.bukova.isspst.services;
|
||||
import static ch.lambdaj.Lambda.filter;
|
||||
import info.bukova.isspst.Constants;
|
||||
import info.bukova.isspst.Module;
|
||||
import info.bukova.isspst.SessionData;
|
||||
import info.bukova.isspst.dao.BaseDao;
|
||||
import info.bukova.isspst.data.DataModel;
|
||||
import info.bukova.isspst.data.NumberSeries;
|
||||
@@ -10,6 +11,9 @@ import info.bukova.isspst.filters.Filter;
|
||||
import info.bukova.isspst.reporting.Report;
|
||||
import info.bukova.isspst.services.numberseries.NumberSeriesService;
|
||||
|
||||
import java.lang.annotation.Annotation;
|
||||
import java.lang.reflect.InvocationTargetException;
|
||||
import java.lang.reflect.Method;
|
||||
import java.util.Arrays;
|
||||
import java.util.Date;
|
||||
import java.util.List;
|
||||
@@ -20,6 +24,7 @@ import javax.validation.Validator;
|
||||
|
||||
import org.hibernate.NonUniqueResultException;
|
||||
import org.hibernate.Query;
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.springframework.security.access.prepost.PreAuthorize;
|
||||
import org.springframework.transaction.annotation.Transactional;
|
||||
|
||||
@@ -27,6 +32,8 @@ public abstract class AbstractService<T extends DataModel> implements Service<T>
|
||||
|
||||
protected BaseDao<T> dao;
|
||||
private Validator validator;
|
||||
@Autowired
|
||||
protected SessionData sessionData;
|
||||
|
||||
private NumberSeriesService numberSeriesService;
|
||||
|
||||
@@ -183,4 +190,36 @@ public abstract class AbstractService<T extends DataModel> implements Service<T>
|
||||
|
||||
return currentNumber;
|
||||
}
|
||||
|
||||
@Override
|
||||
@Transactional
|
||||
public void loadLazyData(T entity) {
|
||||
loadLazyData("", entity);
|
||||
}
|
||||
|
||||
@Override
|
||||
@Transactional
|
||||
public void loadLazyData(String group, T entity) {
|
||||
Method[] methods = this.getClass().getMethods();
|
||||
|
||||
for (Method m : methods) {
|
||||
Annotation[] annotations = m.getAnnotations();
|
||||
for (Annotation a : annotations) {
|
||||
if (a instanceof LazyLoader) {
|
||||
String[] values = ((LazyLoader) a).value();
|
||||
if (group.isEmpty() || values.length == 0 || Arrays.asList(values).contains(group)) {
|
||||
try {
|
||||
m.invoke(this, entity);
|
||||
} catch (IllegalArgumentException e) {
|
||||
throw new LazyLoadException(e.getCause());
|
||||
} catch (IllegalAccessException e) {
|
||||
throw new LazyLoadException(e.getCause());
|
||||
} catch (InvocationTargetException e) {
|
||||
throw new LazyLoadException(e.getCause());
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -0,0 +1,12 @@
|
||||
package info.bukova.isspst.services;
|
||||
|
||||
|
||||
public class LazyLoadException extends RuntimeException {
|
||||
|
||||
private static final long serialVersionUID = -2251676786418660140L;
|
||||
|
||||
public LazyLoadException(Throwable cause) {
|
||||
super(cause);
|
||||
}
|
||||
|
||||
}
|
||||
@@ -0,0 +1,12 @@
|
||||
package info.bukova.isspst.services;
|
||||
|
||||
import java.lang.annotation.ElementType;
|
||||
import java.lang.annotation.Retention;
|
||||
import java.lang.annotation.RetentionPolicy;
|
||||
import java.lang.annotation.Target;
|
||||
|
||||
@Retention(RetentionPolicy.RUNTIME)
|
||||
@Target(ElementType.METHOD)
|
||||
public @interface LazyLoader {
|
||||
String[] value() default "";
|
||||
}
|
||||
@@ -13,6 +13,8 @@ public interface Service<T> {
|
||||
public void update(T entity);
|
||||
public void delete(T entity);
|
||||
public void validate(T entity) throws ValidationException;
|
||||
public void loadLazyData(T entity);
|
||||
public void loadLazyData(String group, T entity);
|
||||
public List<T> getAll();
|
||||
public List<T> execQuery(String query);
|
||||
public T selectSingle(String query);
|
||||
|
||||
@@ -9,11 +9,13 @@ import info.bukova.isspst.data.User;
|
||||
import info.bukova.isspst.data.Workflow;
|
||||
import info.bukova.isspst.data.Workgroup;
|
||||
import info.bukova.isspst.services.AbstractOwnedService;
|
||||
import info.bukova.isspst.services.LazyLoader;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.Date;
|
||||
import java.util.List;
|
||||
|
||||
import org.hibernate.LazyInitializationException;
|
||||
import org.springframework.security.access.prepost.PreAuthorize;
|
||||
import org.springframework.transaction.annotation.Transactional;
|
||||
|
||||
@@ -69,27 +71,58 @@ public abstract class RequirementBaseServiceImpl<T extends RequirementBase> exte
|
||||
|
||||
@Override
|
||||
@Transactional
|
||||
@LazyLoader({"grid", "form"})
|
||||
public void loadAuthItems(T entity) {
|
||||
try {
|
||||
if (entity.getAuthorization() == null) {
|
||||
throw new LazyInitializationException("");
|
||||
}
|
||||
entity.getAuthorization().size();
|
||||
} catch (LazyInitializationException ex) {
|
||||
T e = dao.getById(entity.getId());
|
||||
e.getAuthorization().size();
|
||||
entity.setAuthorization(e.getAuthorization());
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
@Transactional
|
||||
@LazyLoader("grid")
|
||||
public void loadType(T data) {
|
||||
try {
|
||||
if (data.getType() == null) {
|
||||
throw new LazyInitializationException("");
|
||||
}
|
||||
data.getType().getType();
|
||||
} catch (LazyInitializationException ex) {
|
||||
T e = dao.getById(data.getId());
|
||||
|
||||
if (e.getType() == null) {
|
||||
return;
|
||||
}
|
||||
|
||||
e.getType().getType();
|
||||
data.setType(e.getType());
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
@Transactional
|
||||
@LazyLoader({"grid", "form"})
|
||||
public void loadWorkflow(T data) {
|
||||
try {
|
||||
if (data.getWorkflow() == null) {
|
||||
throw new LazyInitializationException("");
|
||||
}
|
||||
data.getWorkflow().size();
|
||||
} catch (LazyInitializationException ex) {
|
||||
T e = dao.getById(data.getId());
|
||||
e.getWorkflow().size();
|
||||
e.getOwnedBy().getFullName();
|
||||
data.setWorkflow(e.getWorkflow());
|
||||
data.setOwnedBy(e.getOwnedBy());
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
|
||||
+16
-3
@@ -4,11 +4,13 @@ import info.bukova.isspst.Constants;
|
||||
import info.bukova.isspst.data.RequirementState;
|
||||
import info.bukova.isspst.data.TripRequirement;
|
||||
import info.bukova.isspst.data.Workgroup;
|
||||
import info.bukova.isspst.services.LazyLoader;
|
||||
import info.bukova.isspst.services.workgroups.WorkgroupService;
|
||||
|
||||
import java.util.Date;
|
||||
import java.util.List;
|
||||
|
||||
import org.hibernate.LazyInitializationException;
|
||||
import org.hibernate.Query;
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.springframework.security.access.prepost.PostFilter;
|
||||
@@ -66,7 +68,7 @@ public class TripRequirementServiceImpl extends RequirementBaseServiceImpl<TripR
|
||||
@PostFilter("hasPermission(filterObject, 'PERM_SHOW_CENTRE_REQ')")
|
||||
public List<TripRequirement> getCentreReq() {
|
||||
List<Workgroup> wgList = workgroupService.getUserCentres(getLoggedInUser());
|
||||
Query q = dao.getQuery("select tr from TripRequirement tr join tr.centre c where tr.state != :state and c in (:wgList)");
|
||||
Query q = dao.getQuery("select tr from TripRequirement tr join fetch tr.ownedBy join tr.centre c where tr.state != :state and c in (:wgList) order by tr.numser");
|
||||
q.setParameterList("wgList", wgList);
|
||||
q.setParameter("state", RequirementState.APPROVED);
|
||||
return q.list();
|
||||
@@ -79,25 +81,36 @@ public class TripRequirementServiceImpl extends RequirementBaseServiceImpl<TripR
|
||||
@PostFilter("hasPermission(filterObject, 'PERM_SHOW_WORKGROUP_REQ')")
|
||||
public List<TripRequirement> getWorkgroupReq() {
|
||||
List<Workgroup> wgList = workgroupService.getUserWorkgroups(getLoggedInUser());
|
||||
Query q = dao.getQuery("select tr from TripRequirement tr join tr.workgroup w where tr.state != :state and w in (:wgList)");
|
||||
Query q = dao.getQuery("select tr from TripRequirement tr join fetch tr.ownedBy join tr.workgroup w where tr.state != :state and w in (:wgList) order by tr.numser");
|
||||
q.setParameterList("wgList", wgList);
|
||||
q.setParameter("state", RequirementState.APPROVED);
|
||||
return q.list();
|
||||
}
|
||||
|
||||
@SuppressWarnings("unchecked")
|
||||
@Override
|
||||
@Transactional
|
||||
@PreAuthorize("hasPermission(this, 'PERM_SHOW_ALL_REQ')")
|
||||
public List<TripRequirement> getFromAll() {
|
||||
return super.getAll();
|
||||
Query q = dao.getQuery("from TripRequirement as tr join fetch tr.ownedBy order by tr.numser");
|
||||
return q.list();
|
||||
}
|
||||
|
||||
@Override
|
||||
@Transactional
|
||||
@LazyLoader("form")
|
||||
public void loadPassangers(TripRequirement entity) {
|
||||
try {
|
||||
if (entity.getPassengers() == null) {
|
||||
throw new LazyInitializationException("");
|
||||
}
|
||||
|
||||
entity.getPassengers().size();
|
||||
} catch (LazyInitializationException ex) {
|
||||
TripRequirement e = dao.getById(entity.getId());
|
||||
e.getPassengers().size();
|
||||
entity.setPassengers(e.getPassengers());
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -18,5 +18,6 @@ public interface UserService extends UserDetailsService, Service<User> {
|
||||
public String encodePassword(User user, String plain);
|
||||
public void grantAdmin();
|
||||
public void removeAccess();
|
||||
public void loadAuthorities(User user);
|
||||
|
||||
}
|
||||
|
||||
@@ -4,6 +4,7 @@ import java.util.HashSet;
|
||||
import java.util.List;
|
||||
import java.util.Set;
|
||||
|
||||
import org.hibernate.LazyInitializationException;
|
||||
import org.hibernate.Query;
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.springframework.security.authentication.UsernamePasswordAuthenticationToken;
|
||||
@@ -18,6 +19,7 @@ import info.bukova.isspst.Constants;
|
||||
import info.bukova.isspst.data.Role;
|
||||
import info.bukova.isspst.data.User;
|
||||
import info.bukova.isspst.services.AbstractService;
|
||||
import info.bukova.isspst.services.LazyLoader;
|
||||
|
||||
public class UserServiceImpl extends AbstractService<User> implements UserService {
|
||||
|
||||
@@ -34,7 +36,7 @@ public class UserServiceImpl extends AbstractService<User> implements UserServic
|
||||
public UserDetails loadUserByUsername(String username)
|
||||
throws UsernameNotFoundException {
|
||||
|
||||
Query q = dao.getQuery("from User user where user.username = :username");
|
||||
Query q = dao.getQuery("from User user join fetch user.authorities where user.username = :username");
|
||||
q.setString("username", username);
|
||||
User u = (User) q.uniqueResult();
|
||||
|
||||
@@ -73,6 +75,10 @@ public class UserServiceImpl extends AbstractService<User> implements UserServic
|
||||
@Override
|
||||
@Transactional
|
||||
public User getCurrent() {
|
||||
if (sessionData.getCurrentUser() != null) {
|
||||
return sessionData.getCurrentUser();
|
||||
}
|
||||
|
||||
Authentication auth = SecurityContextHolder.getContext().getAuthentication();
|
||||
|
||||
if (auth != null && auth.getPrincipal() != null) {
|
||||
@@ -128,5 +134,22 @@ public class UserServiceImpl extends AbstractService<User> implements UserServic
|
||||
return u;
|
||||
}
|
||||
|
||||
@Override
|
||||
@Transactional
|
||||
@LazyLoader({"grid", "form"})
|
||||
public void loadAuthorities(User user) {
|
||||
try {
|
||||
if (user.getAuthorities() == null) {
|
||||
throw new LazyInitializationException("");
|
||||
}
|
||||
|
||||
user.getAuthorities().size();
|
||||
} catch (LazyInitializationException ex) {
|
||||
User u = dao.getById(user.getId());
|
||||
u.getAuthorities().size();
|
||||
user.setAuthorities(u.getAuthorities());
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
||||
@@ -20,5 +20,7 @@ public interface WorkgroupService extends Service<Workgroup> {
|
||||
public List<Workgroup> getUserWorkgroups(User user);
|
||||
public List<Role> getUserWorkgroupRoles(Workgroup workgroup, User user);
|
||||
public List<Member> getMembers(Workgroup workgroup);
|
||||
public void loadMembers(Workgroup workgroup);
|
||||
public void loadParents(Member member);
|
||||
|
||||
}
|
||||
|
||||
@@ -7,10 +7,12 @@ import info.bukova.isspst.data.Role;
|
||||
import info.bukova.isspst.data.User;
|
||||
import info.bukova.isspst.data.Workgroup;
|
||||
import info.bukova.isspst.services.AbstractOwnedService;
|
||||
import info.bukova.isspst.services.LazyLoader;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
|
||||
import org.hibernate.LazyInitializationException;
|
||||
import org.hibernate.Query;
|
||||
import org.springframework.security.access.prepost.PreAuthorize;
|
||||
import org.springframework.transaction.annotation.Transactional;
|
||||
@@ -66,7 +68,13 @@ public class WorkgroupServiceImpl extends AbstractOwnedService<Workgroup> implem
|
||||
}
|
||||
|
||||
@Override
|
||||
@Transactional
|
||||
public boolean isMember(Workgroup workgroup, Member member) {
|
||||
if (member.equals(getLoggedInUser()) && sessionData.getCurrentUser() != null) {
|
||||
return member.getParents().contains(workgroup);
|
||||
}
|
||||
|
||||
loadMembers(workgroup);
|
||||
for (JobMapping jm : workgroup.getMembers()) {
|
||||
if (jm.getMember().equals(member)) {
|
||||
return true;
|
||||
@@ -98,6 +106,10 @@ public class WorkgroupServiceImpl extends AbstractOwnedService<Workgroup> implem
|
||||
@Override
|
||||
@Transactional
|
||||
public List<Workgroup> getUserCentres(User user) {
|
||||
if (user.equals(getLoggedInUser()) && sessionData.getUserCentres() != null) {
|
||||
return sessionData.getUserCentres();
|
||||
}
|
||||
|
||||
List<Workgroup> parents = getParents(user);
|
||||
|
||||
if (parents == null) {
|
||||
@@ -112,6 +124,7 @@ public class WorkgroupServiceImpl extends AbstractOwnedService<Workgroup> implem
|
||||
}
|
||||
|
||||
for (Workgroup w : getUserWorkgroups(user)) {
|
||||
loadParents(w);
|
||||
for (Workgroup centre : w.getParents()) {
|
||||
if (!centres.contains(centre)) {
|
||||
centres.add(centre);
|
||||
@@ -124,6 +137,10 @@ public class WorkgroupServiceImpl extends AbstractOwnedService<Workgroup> implem
|
||||
@Override
|
||||
@Transactional
|
||||
public List<Workgroup> getUserWorkgroups(User user) {
|
||||
if (user.equals(getLoggedInUser()) && sessionData.getUserWorkgroups() != null) {
|
||||
return sessionData.getUserWorkgroups();
|
||||
}
|
||||
|
||||
List<Workgroup> parents = getParents(user);
|
||||
|
||||
if (parents == null) {
|
||||
@@ -141,15 +158,9 @@ public class WorkgroupServiceImpl extends AbstractOwnedService<Workgroup> implem
|
||||
}
|
||||
|
||||
private List<Workgroup> getParents(User user) {
|
||||
List<Workgroup> parents;
|
||||
loadParents(user);
|
||||
|
||||
if (user.getParents() == null) {
|
||||
parents = loadUser(user).getParents();
|
||||
} else {
|
||||
parents = user.getParents();
|
||||
}
|
||||
|
||||
return parents;
|
||||
return user.getParents();
|
||||
}
|
||||
|
||||
private User loadUser(User user) {
|
||||
@@ -186,6 +197,10 @@ public class WorkgroupServiceImpl extends AbstractOwnedService<Workgroup> implem
|
||||
@Override
|
||||
@Transactional
|
||||
public List<Role> getUserWorkgroupRoles(Workgroup workgroup, User user) {
|
||||
if (user.equals(getLoggedInUser()) && sessionData.getWorkgroupRoles() != null) {
|
||||
return sessionData.getWorkgroupRoles().get(workgroup.getId());
|
||||
}
|
||||
|
||||
List<Role> roles = new ArrayList<Role>();
|
||||
User u;
|
||||
|
||||
@@ -199,6 +214,8 @@ public class WorkgroupServiceImpl extends AbstractOwnedService<Workgroup> implem
|
||||
return null;
|
||||
}
|
||||
|
||||
loadMembers(workgroup);
|
||||
|
||||
for (JobMapping jm : workgroup.getMembers()) {
|
||||
if (jm.getMember().equals(u)) {
|
||||
roles.add(jm.getRole());
|
||||
@@ -212,7 +229,9 @@ public class WorkgroupServiceImpl extends AbstractOwnedService<Workgroup> implem
|
||||
@Transactional
|
||||
@PreAuthorize("hasPermission(this, 'PERM_DELETE')")
|
||||
public void delete(Workgroup entity) {
|
||||
loadMembers(entity);
|
||||
for (JobMapping m : entity.getMembers()) {
|
||||
loadParents(m.getMember());
|
||||
m.getMember().removeParent(entity);
|
||||
dao.getSession().merge(m.getMember());
|
||||
}
|
||||
@@ -221,6 +240,7 @@ public class WorkgroupServiceImpl extends AbstractOwnedService<Workgroup> implem
|
||||
|
||||
@Override
|
||||
public List<Member> getMembers(Workgroup workgroup) {
|
||||
loadMembers(workgroup);
|
||||
List<JobMapping> jmList = workgroup.getMembers();
|
||||
List<Member> members = new ArrayList<Member>();
|
||||
|
||||
@@ -231,4 +251,42 @@ public class WorkgroupServiceImpl extends AbstractOwnedService<Workgroup> implem
|
||||
return members;
|
||||
}
|
||||
|
||||
@Override
|
||||
@Transactional
|
||||
@LazyLoader({"grid", "form"})
|
||||
public void loadMembers(Workgroup workgroup) {
|
||||
try {
|
||||
if (workgroup.getMembers() == null) {
|
||||
throw new LazyInitializationException("");
|
||||
}
|
||||
workgroup.getMembers().size();
|
||||
} catch (LazyInitializationException e) {
|
||||
Workgroup w = dao.getById(workgroup.getId());
|
||||
w.getMembers().size();
|
||||
workgroup.setMembers(w.getMembers());
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
@Transactional
|
||||
@LazyLoader("form")
|
||||
public void loadParents(Member member) {
|
||||
try {
|
||||
if (member.getParents() == null) {
|
||||
throw new LazyInitializationException("");
|
||||
}
|
||||
member.getParents().size();
|
||||
} catch (LazyInitializationException e) {
|
||||
if (member.isPerson()) {
|
||||
User u = loadUser((User) member);
|
||||
u.getParents().size();
|
||||
member.setParents(u.getParents());
|
||||
} else {
|
||||
Workgroup w = dao.getById(member.getId());
|
||||
w.getParents().size();
|
||||
member.setParents(w.getParents());
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -61,7 +61,7 @@ public class ListViewModel<T extends DataModel> {
|
||||
}
|
||||
|
||||
protected void loadLazyData(T data) {
|
||||
|
||||
service.loadLazyData("grid", data);
|
||||
}
|
||||
|
||||
public void setDataFilter(Filter<T> dataFilter) {
|
||||
@@ -164,7 +164,7 @@ public class ListViewModel<T extends DataModel> {
|
||||
}
|
||||
|
||||
protected void loadLazyDataForEdit(T data) {
|
||||
|
||||
service.loadLazyData("form", data);
|
||||
}
|
||||
|
||||
@Command
|
||||
|
||||
@@ -1,17 +1,16 @@
|
||||
package info.bukova.isspst.ui.dashboard;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.HashMap;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
|
||||
import info.bukova.isspst.data.Role;
|
||||
import info.bukova.isspst.data.User;
|
||||
import info.bukova.isspst.data.Workgroup;
|
||||
import info.bukova.isspst.services.users.UserService;
|
||||
import info.bukova.isspst.services.workgroups.WorkgroupService;
|
||||
|
||||
import org.springframework.security.core.context.SecurityContextHolder;
|
||||
import java.util.ArrayList;
|
||||
import java.util.HashMap;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
|
||||
import org.zkoss.bind.annotation.Init;
|
||||
import org.zkoss.zk.ui.select.annotation.WireVariable;
|
||||
|
||||
@@ -26,11 +25,7 @@ public class DashBoardVM {
|
||||
|
||||
@Init
|
||||
public void init() {
|
||||
user = User.class.cast(SecurityContextHolder.getContext().getAuthentication().getPrincipal());
|
||||
|
||||
if (user.getParents() == null) { // try reload from DB
|
||||
user = userService.getCurrent();
|
||||
}
|
||||
|
||||
groupRoles = new HashMap<Workgroup, List<Role>>();
|
||||
|
||||
|
||||
@@ -16,13 +16,6 @@ public class RequirementSubpage<T extends RequirementBase> extends ListViewModel
|
||||
return (RequirementBaseService<T>) service;
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void loadLazyData(T data) {
|
||||
this.getReqService().loadAuthItems(data);
|
||||
this.getReqService().loadWorkflow(data);
|
||||
this.getReqService().loadType(data);
|
||||
}
|
||||
|
||||
@Command
|
||||
@NotifyChange({"dataBean", "canApprove"})
|
||||
public void approve() {
|
||||
|
||||
@@ -60,9 +60,4 @@ public class TripRequirementListAll extends RequirementSubpage<TripRequirement>
|
||||
this.reload();
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void loadLazyDataForEdit(TripRequirement data) {
|
||||
tripRequirementService.loadPassangers(data);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -57,9 +57,4 @@ public class TripRequirementListCentre extends RequirementSubpage<TripRequiremen
|
||||
this.reload();
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void loadLazyDataForEdit(TripRequirement data) {
|
||||
tripRequirementService.loadPassangers(data);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -63,9 +63,4 @@ public class TripRequirementListWorkgroup extends RequirementSubpage<TripRequire
|
||||
this.reload();
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void loadLazyDataForEdit(TripRequirement data) {
|
||||
tripRequirementService.loadPassangers(data);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -76,6 +76,7 @@ public class WorkgroupForm extends FormViewModel<Workgroup> {
|
||||
if (!r.getAuthority().equals(Constants.ROLE_USER)) {
|
||||
List<User> users = userService.getUsersWithRole(r);
|
||||
for (User u : users) {
|
||||
workgroupService.loadParents(u);
|
||||
workgroupService.addMember(getDataBean(), u, r);
|
||||
}
|
||||
}
|
||||
@@ -124,6 +125,8 @@ public class WorkgroupForm extends FormViewModel<Workgroup> {
|
||||
return;
|
||||
}
|
||||
|
||||
workgroupService.loadMembers(getDataBean());
|
||||
workgroupService.loadParents(u.getMember());
|
||||
workgroupService.removeMember(getDataBean(), u);
|
||||
|
||||
if (!target.equals("users")) {
|
||||
@@ -139,6 +142,13 @@ public class WorkgroupForm extends FormViewModel<Workgroup> {
|
||||
return;
|
||||
}
|
||||
|
||||
workgroupService.loadMembers(getDataBean());
|
||||
workgroupService.loadParents(u);
|
||||
|
||||
if (!u.isPerson()) {
|
||||
workgroupService.loadMembers((Workgroup) u);
|
||||
}
|
||||
|
||||
workgroupService.addMember(getDataBean(), u, roleService.getRoleByAuthority(target));
|
||||
|
||||
if (!u.isPerson()) {
|
||||
|
||||
@@ -35,6 +35,7 @@ public class WorkgroupList extends ListViewModel<Workgroup> {
|
||||
formZul = "workgroupForm.zul";
|
||||
dataFilter = new WorkgroupFilter(getFilterTemplate());
|
||||
treeFactory = new WorkgroupTreeFactory();
|
||||
treeFactory.setWorkgroupService(workgroupService);
|
||||
boolConverter = new BoolConverter();
|
||||
}
|
||||
|
||||
|
||||
@@ -7,6 +7,7 @@ import info.bukova.isspst.Constants;
|
||||
import info.bukova.isspst.data.JobMapping;
|
||||
import info.bukova.isspst.data.Member;
|
||||
import info.bukova.isspst.data.Workgroup;
|
||||
import info.bukova.isspst.services.workgroups.WorkgroupService;
|
||||
|
||||
import org.zkoss.zul.DefaultTreeModel;
|
||||
import org.zkoss.zul.TreeModel;
|
||||
@@ -14,6 +15,8 @@ import org.zkoss.zul.TreeNode;
|
||||
|
||||
public class WorkgroupTreeFactory {
|
||||
|
||||
private WorkgroupService workgroupService;
|
||||
|
||||
public TreeModel<TreeNode<Member>> createTreeModel(Workgroup workgroup) {
|
||||
WorkgroupTreeNode root = new WorkgroupTreeNode(null, generateChildren(workgroup));
|
||||
|
||||
@@ -24,6 +27,8 @@ public class WorkgroupTreeFactory {
|
||||
Collection<WorkgroupTreeNode> children = new LinkedList<WorkgroupTreeNode>();
|
||||
Workgroup workgroup = Workgroup.class.cast(member);
|
||||
|
||||
workgroupService.loadMembers(workgroup);
|
||||
|
||||
for (JobMapping jm : workgroup.getMembers()) {
|
||||
if (jm.getRole().getAuthority().equals(Constants.ROLE_USER) && jm.getMember().isPerson()) {
|
||||
children.add(new WorkgroupTreeNode(jm.getMember()));
|
||||
@@ -35,4 +40,8 @@ public class WorkgroupTreeFactory {
|
||||
return children;
|
||||
}
|
||||
|
||||
public void setWorkgroupService(WorkgroupService workgroupService) {
|
||||
this.workgroupService = workgroupService;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -49,6 +49,7 @@
|
||||
<prop key="hibernate.dialect">${jdbc.dialect}</prop>
|
||||
<prop key="hibernate.show_sql">false</prop>
|
||||
<prop key="hibernate.hbm2ddl.auto">update</prop>
|
||||
<!-- <prop key="hibernate.enable_lazy_load_no_trans">true</prop> -->
|
||||
</props>
|
||||
</property>
|
||||
</bean>
|
||||
@@ -81,7 +82,8 @@
|
||||
<security:intercept-url pattern="/admin/addressbook/**" access="hasRole('PERM_READ_ADDRESSBOOK')"/>
|
||||
<security:intercept-url pattern="/munits/**" access="hasRole('PERM_READ_MUNITS')"/>
|
||||
<security:form-login login-page="/login.zhtml"
|
||||
authentication-failure-handler-ref="loginFail"/>
|
||||
authentication-failure-handler-ref="loginFail"
|
||||
authentication-success-handler-ref="loginSuccess"/>
|
||||
<security:http-basic/>
|
||||
<security:logout invalidate-session="true"/>
|
||||
</security:http>
|
||||
@@ -101,6 +103,8 @@
|
||||
|
||||
<bean id="loginFail" class="info.bukova.isspst.security.LoginFailHandler"/>
|
||||
|
||||
<bean id="loginSuccess" class="info.bukova.isspst.security.LoginSuccessHandler"/>
|
||||
|
||||
<!-- Reporting -->
|
||||
<bean id="reportDefinition" class="info.bukova.isspst.reporting.ReportDefinition" scope="session">
|
||||
<aop:scoped-proxy/>
|
||||
@@ -110,6 +114,11 @@
|
||||
|
||||
<bean id="genFactory" class="info.bukova.isspst.reporting.GeneratorFactory"/>
|
||||
|
||||
<!-- Session data -->
|
||||
<bean id="sessionData" class="info.bukova.isspst.SessionData" scope="session">
|
||||
<aop:scoped-proxy/>
|
||||
</bean>
|
||||
|
||||
<!-- DAO -->
|
||||
<bean id="userDao" class="info.bukova.isspst.dao.jpa.UserDaoJPA">
|
||||
<property name="sessionFactory" ref="sessionFactory"/>
|
||||
|
||||
Reference in New Issue
Block a user