package com.venky.swf.plugins.collab.extensions.participation; import java.util.ArrayList; import java.util.Iterator; import java.util.List; import com.venky.core.collections.SequenceSet; import com.venky.swf.db.extensions.ParticipantExtension; import com.venky.swf.db.model.User; import com.venky.swf.plugins.collab.db.model.participants.admin.Facility; import com.venky.swf.plugins.collab.db.model.participants.admin.FacilityUser; import com.venky.swf.plugins.collab.db.model.user.UserFacility; import com.venky.swf.pm.DataSecurityFilter; public class UserFacilityParticipantExtension extends ParticipantExtension<UserFacility> { static { registerExtension(new UserFacilityParticipantExtension()); } @Override protected List<Integer> getAllowedFieldValues(User user, UserFacility model, String fieldName) { List<Integer> ret = null; if (fieldName.equalsIgnoreCase("FACILITY_ID")){ ret = new ArrayList<Integer>(); if (model.getFacilityId() > 0 ){ if (model.getFacility().isAccessibleBy(user, Facility.class)){ if (model.getUserId() == 0 || model.getFacility().isAccessibleBy(model.getUser(), Facility.class)){ ret.add(model.getFacilityId()); } } }else { List<Facility> facilites = DataSecurityFilter.getRecordsAccessible(Facility.class,user); if (model.getUserId() > 0 ){ ret = new ArrayList<Integer>(); for (Facility f : facilites){ if (f.isAccessibleBy(model.getUser(), Facility.class)){ ret.add(f.getId()); } } }else { ret = DataSecurityFilter.getIds(facilites); } } }else if (fieldName.equalsIgnoreCase("USER_ID")){ if (model.getUserId() > 0){ ret = new ArrayList<Integer>(); if (model.getUser().isAccessibleBy(user, User.class)){ if (model.getFacilityId() == 0 || (model.getFacility().isAccessibleBy(user, Facility.class) && model.getFacility().isAccessibleBy(model.getUser(), Facility.class))){ ret.add(model.getUserId()); } } }else { List<Facility> facilites = DataSecurityFilter.getRecordsAccessible(Facility.class,user); List<Integer> facilityIds = DataSecurityFilter.getIds(facilites); ret = new SequenceSet<Integer>(); if (facilityIds.isEmpty() || ( model.getFacilityId() > 0 && !facilityIds.contains(model.getFacilityId()))){ return ret; } //Facility is accessible or not passed. List<Integer> userIdsAlreadySubscribedToSomeFacility = new SequenceSet<Integer>(); for (Facility f : facilites){ for (FacilityUser fu : f.getFacilityUsers()){ userIdsAlreadySubscribedToSomeFacility.add(fu.getUserId()); } } Facility f = model.getFacility(); List<User> allowedUsers = DataSecurityFilter.getRecordsAccessible(User.class,user); Iterator<User> aui = allowedUsers.iterator(); while( aui.hasNext() ){ User allowedUser = aui.next(); Integer companyId = ((com.venky.swf.plugins.collab.db.model.user.User)allowedUser).getCompanyId(); if (companyId == null){ aui.remove(); }else if (userIdsAlreadySubscribedToSomeFacility.contains(allowedUser.getId())){ aui.remove(); }else if (f != null){ if (f.getCompanyId() != companyId){ aui.remove(); }else if (!f.isAccessibleBy(allowedUser)){ aui.remove(); } } } ret = DataSecurityFilter.getIds(allowedUsers); } } return ret; } }