Ticket #269: Partial fix of the most immediately apparent (upon login) query errors. Need to rework queries.

This commit is contained in:
Michael Jumper
2013-02-25 02:37:43 -08:00
parent 97c2e3ceb9
commit 73641925fc

View File

@@ -39,6 +39,7 @@ import com.google.common.collect.Lists;
import com.google.inject.Inject; import com.google.inject.Inject;
import com.google.inject.Provider; import com.google.inject.Provider;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap; import java.util.HashMap;
import java.util.HashSet; import java.util.HashSet;
import java.util.List; import java.util.List;
@@ -684,10 +685,17 @@ public class PermissionCheckUtility {
* @return the list of all connections this user has access to * @return the list of all connections this user has access to
*/ */
private Set<MySQLConnection> getConnections(int userID, String permissionType) { private Set<MySQLConnection> getConnections(int userID, String permissionType) {
// If connections available, query them
Set<Integer> affectedConnectionIDs = getConnectionIDs(userID, permissionType); Set<Integer> affectedConnectionIDs = getConnectionIDs(userID, permissionType);
if (!affectedConnectionIDs.isEmpty()) {
// Query available connections
ConnectionExample example = new ConnectionExample(); ConnectionExample example = new ConnectionExample();
example.createCriteria().andConnection_idIn(Lists.newArrayList(affectedConnectionIDs)); example.createCriteria().andConnection_idIn(Lists.newArrayList(affectedConnectionIDs));
List<Connection> connectionDBOjects = connectionDAO.selectByExample(example); List<Connection> connectionDBOjects = connectionDAO.selectByExample(example);
// Add connections to final set
Set<MySQLConnection> affectedConnections = new HashSet<MySQLConnection>(); Set<MySQLConnection> affectedConnections = new HashSet<MySQLConnection>();
for(Connection affectedConnection : connectionDBOjects) { for(Connection affectedConnection : connectionDBOjects) {
MySQLConnection mySQLConnection = mySQLConnectionProvider.get(); MySQLConnection mySQLConnection = mySQLConnectionProvider.get();
@@ -698,6 +706,11 @@ public class PermissionCheckUtility {
return affectedConnections; return affectedConnections;
} }
// Otherwise, no connections available
return Collections.EMPTY_SET;
}
/** /**
* Find the list of the IDs of all connections a user has permission to. * Find the list of the IDs of all connections a user has permission to.
* The access type is defined by permissionType. * The access type is defined by permissionType.
@@ -795,23 +808,29 @@ public class PermissionCheckUtility {
public Set<Permission> getAllPermissions(int userID) { public Set<Permission> getAllPermissions(int userID) {
Set<Permission> allPermissions = new HashSet<Permission>(); Set<Permission> allPermissions = new HashSet<Permission>();
// first, user permissions // First, user permissions
UserPermissionExample userPermissionExample = new UserPermissionExample(); UserPermissionExample userPermissionExample = new UserPermissionExample();
userPermissionExample.createCriteria().andUser_idEqualTo(userID); userPermissionExample.createCriteria().andUser_idEqualTo(userID);
List<UserPermissionKey> userPermissions = userPermissionDAO.selectByExample(userPermissionExample); List<UserPermissionKey> userPermissions =
List<Integer> affectedUserIDs = new ArrayList<Integer>(); userPermissionDAO.selectByExample(userPermissionExample);
for(UserPermissionKey userPermission : userPermissions) {
affectedUserIDs.add(userPermission.getAffected_user_id());
}
// If user permissions present, add permissions
if (!userPermissions.isEmpty()) {
// Get list of affected user IDs
List<Integer> affectedUserIDs = new ArrayList<Integer>();
for(UserPermissionKey userPermission : userPermissions)
affectedUserIDs.add(userPermission.getAffected_user_id());
// Query all affected users, store in map indexed by user ID
UserExample userExample = new UserExample(); UserExample userExample = new UserExample();
userExample.createCriteria().andUser_idIn(affectedUserIDs); userExample.createCriteria().andUser_idIn(affectedUserIDs);
List<User> users = userDAO.selectByExample(userExample); List<User> users = userDAO.selectByExample(userExample);
Map<Integer, User> userMap = new HashMap<Integer, User>(); Map<Integer, User> userMap = new HashMap<Integer, User>();
for(User user : users) { for(User user : users)
userMap.put(user.getUser_id(), user); userMap.put(user.getUser_id(), user);
}
// Add user permissions
for(UserPermissionKey userPermission : userPermissions) { for(UserPermissionKey userPermission : userPermissions) {
User affectedUser = userMap.get(userPermission.getAffected_user_id()); User affectedUser = userMap.get(userPermission.getAffected_user_id());
UserPermission newPermission = new UserPermission( UserPermission newPermission = new UserPermission(
@@ -821,23 +840,31 @@ public class PermissionCheckUtility {
allPermissions.add(newPermission); allPermissions.add(newPermission);
} }
//secondly, connection permissions
ConnectionPermissionExample connectionPermissionExample = new ConnectionPermissionExample();
connectionPermissionExample.createCriteria().andUser_idEqualTo(userID);
List<ConnectionPermissionKey> connectionPermissions = connectionPermissionDAO.selectByExample(connectionPermissionExample);
List<Integer> affectedConnectionIDs = new ArrayList<Integer>();
for(ConnectionPermissionKey connectionPermission : connectionPermissions) {
affectedConnectionIDs.add(connectionPermission.getConnection_id());
} }
// Secondly, connection permissions
ConnectionPermissionExample connectionPermissionExample = new ConnectionPermissionExample();
connectionPermissionExample.createCriteria().andUser_idEqualTo(userID);
List<ConnectionPermissionKey> connectionPermissions =
connectionPermissionDAO.selectByExample(connectionPermissionExample);
// If connection permissions present, add permissions
if (!connectionPermissions.isEmpty()) {
// Get list of affected connection IDs
List<Integer> affectedConnectionIDs = new ArrayList<Integer>();
for(ConnectionPermissionKey connectionPermission : connectionPermissions)
affectedConnectionIDs.add(connectionPermission.getConnection_id());
// Query connections, store in map indexed by connection ID
ConnectionExample connectionExample = new ConnectionExample(); ConnectionExample connectionExample = new ConnectionExample();
connectionExample.createCriteria().andConnection_idIn(affectedConnectionIDs); connectionExample.createCriteria().andConnection_idIn(affectedConnectionIDs);
List<Connection> connections = connectionDAO.selectByExample(connectionExample); List<Connection> connections = connectionDAO.selectByExample(connectionExample);
Map<Integer, Connection> connectionMap = new HashMap<Integer, Connection>(); Map<Integer, Connection> connectionMap = new HashMap<Integer, Connection>();
for(Connection connection : connections) { for(Connection connection : connections)
connectionMap.put(connection.getConnection_id(), connection); connectionMap.put(connection.getConnection_id(), connection);
}
// Add connection permissions
for(ConnectionPermissionKey connectionPermission : connectionPermissions) { for(ConnectionPermissionKey connectionPermission : connectionPermissions) {
Connection affectedConnection = connectionMap.get(connectionPermission.getConnection_id()); Connection affectedConnection = connectionMap.get(connectionPermission.getConnection_id());
ConnectionPermission newPermission = new ConnectionPermission( ConnectionPermission newPermission = new ConnectionPermission(
@@ -847,10 +874,13 @@ public class PermissionCheckUtility {
allPermissions.add(newPermission); allPermissions.add(newPermission);
} }
//and finally, system permissions }
// And finally, system permissions
SystemPermissionExample systemPermissionExample = new SystemPermissionExample(); SystemPermissionExample systemPermissionExample = new SystemPermissionExample();
systemPermissionExample.createCriteria().andUser_idEqualTo(userID); systemPermissionExample.createCriteria().andUser_idEqualTo(userID);
List<SystemPermissionKey> systemPermissions = systemPermissionDAO.selectByExample(systemPermissionExample); List<SystemPermissionKey> systemPermissions =
systemPermissionDAO.selectByExample(systemPermissionExample);
for(SystemPermissionKey systemPermission : systemPermissions) { for(SystemPermissionKey systemPermission : systemPermissions) {
SystemPermission newPermission = null; SystemPermission newPermission = null;
if(systemPermission.getPermission().equals(MySQLConstants.SYSTEM_USER_CREATE)) if(systemPermission.getPermission().equals(MySQLConstants.SYSTEM_USER_CREATE))