This is an automated email from the ASF dual-hosted git repository.

remm pushed a commit to branch 10.0.x
in repository https://gitbox.apache.org/repos/asf/tomcat.git


The following commit(s) were added to refs/heads/10.0.x by this push:
     new 509138a  Fix delete then create
509138a is described below

commit 509138afb41308ef4cd3d60feaa863f5e496244a
Author: remm <r...@apache.org>
AuthorDate: Mon Sep 20 21:19:12 2021 +0200

    Fix delete then create
    
    Delete is remembered so that everything gets removed before creating new
    objects.
---
 .../catalina/users/DataSourceUserDatabase.java     | 221 ++++++++++-----------
 webapps/docs/changelog.xml                         |   4 +
 2 files changed, 114 insertions(+), 111 deletions(-)

diff --git a/java/org/apache/catalina/users/DataSourceUserDatabase.java 
b/java/org/apache/catalina/users/DataSourceUserDatabase.java
index 01f6718..a010498 100644
--- a/java/org/apache/catalina/users/DataSourceUserDatabase.java
+++ b/java/org/apache/catalina/users/DataSourceUserDatabase.java
@@ -562,7 +562,6 @@ public class DataSourceUserDatabase extends 
SparseUserDatabase {
             Group group = new GenericGroup<>(this, groupname, description, 
null);
             createdGroups.put(groupname, group);
             modifiedGroups.remove(groupname);
-            removedGroups.remove(groupname);
             return group;
         } finally {
             readLock.unlock();
@@ -576,7 +575,6 @@ public class DataSourceUserDatabase extends 
SparseUserDatabase {
             Role role = new GenericRole<>(this, rolename, description);
             createdRoles.put(rolename, role);
             modifiedRoles.remove(rolename);
-            removedRoles.remove(rolename);
             return role;
         } finally {
             readLock.unlock();
@@ -590,7 +588,6 @@ public class DataSourceUserDatabase extends 
SparseUserDatabase {
             User user = new GenericUser<>(this, username, password, fullName, 
null, null);
             createdUsers.put(username, user);
             modifiedUsers.remove(username);
-            removedUsers.remove(username);
             return user;
         } finally {
             readLock.unlock();
@@ -1048,6 +1045,49 @@ public class DataSourceUserDatabase extends 
SparseUserDatabase {
 
         if (isRoleStoreDefined()) {
 
+            // Removed roles
+            if (!removedRoles.isEmpty()) {
+                temp = new StringBuilder("DELETE FROM ");
+                temp.append(roleTable);
+                temp.append(" WHERE ").append(roleNameCol);
+                temp.append(" = ?");
+                if (groupRoleTable != null) {
+                    tempRelationDelete = new StringBuilder("DELETE FROM ");
+                    tempRelationDelete.append(groupRoleTable);
+                    tempRelationDelete.append(" WHERE ");
+                    tempRelationDelete.append(roleNameCol);
+                    tempRelationDelete.append(" = ?");
+                }
+                StringBuilder tempRelationDelete2 = new StringBuilder("DELETE 
FROM ");
+                tempRelationDelete2.append(userRoleTable);
+                tempRelationDelete2.append(" WHERE ");
+                tempRelationDelete2.append(roleNameCol);
+                tempRelationDelete2.append(" = ?");
+                for (Role role : removedRoles.values()) {
+                    if (tempRelationDelete != null) {
+                        try (PreparedStatement stmt = 
dbConnection.prepareStatement(tempRelationDelete.toString())) {
+                            stmt.setString(1, role.getRolename());
+                            stmt.executeUpdate();
+                        } catch (SQLException e) {
+                            
log.error(sm.getString("dataSourceUserDatabase.exception"), e);
+                        }
+                    }
+                    try (PreparedStatement stmt = 
dbConnection.prepareStatement(tempRelationDelete2.toString())) {
+                        stmt.setString(1, role.getRolename());
+                        stmt.executeUpdate();
+                    } catch (SQLException e) {
+                        
log.error(sm.getString("dataSourceUserDatabase.exception"), e);
+                    }
+                    try (PreparedStatement stmt = 
dbConnection.prepareStatement(temp.toString())) {
+                        stmt.setString(1, role.getRolename());
+                        stmt.executeUpdate();
+                    } catch (SQLException e) {
+                        
log.error(sm.getString("dataSourceUserDatabase.exception"), e);
+                    }
+                }
+                removedRoles.clear();
+            }
+
             // Created roles
             if (!createdRoles.isEmpty()) {
                 temp = new StringBuilder("INSERT INTO ");
@@ -1094,49 +1134,6 @@ public class DataSourceUserDatabase extends 
SparseUserDatabase {
                 modifiedRoles.clear();
             }
 
-            // Removed roles
-            if (!removedRoles.isEmpty()) {
-                temp = new StringBuilder("DELETE FROM ");
-                temp.append(roleTable);
-                temp.append(" WHERE ").append(roleNameCol);
-                temp.append(" = ?");
-                if (groupRoleTable != null) {
-                    tempRelationDelete = new StringBuilder("DELETE FROM ");
-                    tempRelationDelete.append(groupRoleTable);
-                    tempRelationDelete.append(" WHERE ");
-                    tempRelationDelete.append(roleNameCol);
-                    tempRelationDelete.append(" = ?");
-                }
-                StringBuilder tempRelationDelete2 = new StringBuilder("DELETE 
FROM ");
-                tempRelationDelete2.append(userRoleTable);
-                tempRelationDelete2.append(" WHERE ");
-                tempRelationDelete2.append(roleNameCol);
-                tempRelationDelete2.append(" = ?");
-                for (Role role : removedRoles.values()) {
-                    if (tempRelationDelete != null) {
-                        try (PreparedStatement stmt = 
dbConnection.prepareStatement(tempRelationDelete.toString())) {
-                            stmt.setString(1, role.getRolename());
-                            stmt.executeUpdate();
-                        } catch (SQLException e) {
-                            
log.error(sm.getString("dataSourceUserDatabase.exception"), e);
-                        }
-                    }
-                    try (PreparedStatement stmt = 
dbConnection.prepareStatement(tempRelationDelete2.toString())) {
-                        stmt.setString(1, role.getRolename());
-                        stmt.executeUpdate();
-                    } catch (SQLException e) {
-                        
log.error(sm.getString("dataSourceUserDatabase.exception"), e);
-                    }
-                    try (PreparedStatement stmt = 
dbConnection.prepareStatement(temp.toString())) {
-                        stmt.setString(1, role.getRolename());
-                        stmt.executeUpdate();
-                    } catch (SQLException e) {
-                        
log.error(sm.getString("dataSourceUserDatabase.exception"), e);
-                    }
-                }
-                removedRoles.clear();
-            }
-
         } else if (userRoleTable != null && roleNameCol != null) {
             // Only remove role from users
             tempRelationDelete = new StringBuilder("DELETE FROM ");
@@ -1171,6 +1168,40 @@ public class DataSourceUserDatabase extends 
SparseUserDatabase {
             tempRelationDelete.append(" = ?");
             String groupRoleRelationDelete = tempRelationDelete.toString();
 
+            // Removed groups
+            if (!removedGroups.isEmpty()) {
+                temp = new StringBuilder("DELETE FROM ");
+                temp.append(groupTable);
+                temp.append(" WHERE ").append(groupNameCol);
+                temp.append(" = ?");
+                StringBuilder tempRelationDelete2 = new StringBuilder("DELETE 
FROM ");
+                tempRelationDelete2.append(userGroupTable);
+                tempRelationDelete2.append(" WHERE ");
+                tempRelationDelete2.append(groupNameCol);
+                tempRelationDelete2.append(" = ?");
+                for (Group group : removedGroups.values()) {
+                    try (PreparedStatement stmt = 
dbConnection.prepareStatement(groupRoleRelationDelete)) {
+                        stmt.setString(1, group.getGroupname());
+                        stmt.executeUpdate();
+                    } catch (SQLException e) {
+                        
log.error(sm.getString("dataSourceUserDatabase.exception"), e);
+                    }
+                    try (PreparedStatement stmt = 
dbConnection.prepareStatement(tempRelationDelete2.toString())) {
+                        stmt.setString(1, group.getGroupname());
+                        stmt.executeUpdate();
+                    } catch (SQLException e) {
+                        
log.error(sm.getString("dataSourceUserDatabase.exception"), e);
+                    }
+                    try (PreparedStatement stmt = 
dbConnection.prepareStatement(temp.toString())) {
+                        stmt.setString(1, group.getGroupname());
+                        stmt.executeUpdate();
+                    } catch (SQLException e) {
+                        
log.error(sm.getString("dataSourceUserDatabase.exception"), e);
+                    }
+                }
+                removedGroups.clear();
+            }
+
             // Created groups
             if (!createdGroups.isEmpty()) {
                 temp = new StringBuilder("INSERT INTO ");
@@ -1249,40 +1280,6 @@ public class DataSourceUserDatabase extends 
SparseUserDatabase {
                 modifiedGroups.clear();
             }
 
-            // Removed groups
-            if (!removedGroups.isEmpty()) {
-                temp = new StringBuilder("DELETE FROM ");
-                temp.append(groupTable);
-                temp.append(" WHERE ").append(groupNameCol);
-                temp.append(" = ?");
-                StringBuilder tempRelationDelete2 = new StringBuilder("DELETE 
FROM ");
-                tempRelationDelete2.append(userGroupTable);
-                tempRelationDelete2.append(" WHERE ");
-                tempRelationDelete2.append(groupNameCol);
-                tempRelationDelete2.append(" = ?");
-                for (Group group : removedGroups.values()) {
-                    try (PreparedStatement stmt = 
dbConnection.prepareStatement(groupRoleRelationDelete)) {
-                        stmt.setString(1, group.getGroupname());
-                        stmt.executeUpdate();
-                    } catch (SQLException e) {
-                        
log.error(sm.getString("dataSourceUserDatabase.exception"), e);
-                    }
-                    try (PreparedStatement stmt = 
dbConnection.prepareStatement(tempRelationDelete2.toString())) {
-                        stmt.setString(1, group.getGroupname());
-                        stmt.executeUpdate();
-                    } catch (SQLException e) {
-                        
log.error(sm.getString("dataSourceUserDatabase.exception"), e);
-                    }
-                    try (PreparedStatement stmt = 
dbConnection.prepareStatement(temp.toString())) {
-                        stmt.setString(1, group.getGroupname());
-                        stmt.executeUpdate();
-                    } catch (SQLException e) {
-                        
log.error(sm.getString("dataSourceUserDatabase.exception"), e);
-                    }
-                }
-                removedGroups.clear();
-            }
-
         }
 
         String userRoleRelation = null;
@@ -1320,6 +1317,39 @@ public class DataSourceUserDatabase extends 
SparseUserDatabase {
             userGroupRelationDelete = tempRelationDelete.toString();
         }
 
+        // Removed users
+        if (!removedUsers.isEmpty()) {
+            temp = new StringBuilder("DELETE FROM ");
+            temp.append(userTable);
+            temp.append(" WHERE ").append(userNameCol);
+            temp.append(" = ?");
+            for (User user : removedUsers.values()) {
+                if (userRoleRelationDelete != null) {
+                    try (PreparedStatement stmt = 
dbConnection.prepareStatement(userRoleRelationDelete)) {
+                        stmt.setString(1, user.getUsername());
+                        stmt.executeUpdate();
+                    } catch (SQLException e) {
+                        
log.error(sm.getString("dataSourceUserDatabase.exception"), e);
+                    }
+                }
+                if (userGroupRelationDelete != null) {
+                    try (PreparedStatement stmt = 
dbConnection.prepareStatement(userGroupRelationDelete)) {
+                        stmt.setString(1, user.getUsername());
+                        stmt.executeUpdate();
+                    } catch (SQLException e) {
+                        
log.error(sm.getString("dataSourceUserDatabase.exception"), e);
+                    }
+                }
+                try (PreparedStatement stmt = 
dbConnection.prepareStatement(temp.toString())) {
+                    stmt.setString(1, user.getUsername());
+                    stmt.executeUpdate();
+                } catch (SQLException e) {
+                    
log.error(sm.getString("dataSourceUserDatabase.exception"), e);
+                }
+            }
+            removedUsers.clear();
+        }
+
         // Created users
         if (!createdUsers.isEmpty()) {
             temp = new StringBuilder("INSERT INTO ");
@@ -1445,37 +1475,6 @@ public class DataSourceUserDatabase extends 
SparseUserDatabase {
             modifiedGroups.clear();
         }
 
-        // Removed users
-        if (!removedUsers.isEmpty()) {
-            temp = new StringBuilder("DELETE FROM ");
-            temp.append(userTable);
-            temp.append(" WHERE ").append(userNameCol);
-            temp.append(" = ?");
-            for (User user : removedUsers.values()) {
-                try (PreparedStatement stmt = 
dbConnection.prepareStatement(userRoleRelationDelete)) {
-                    stmt.setString(1, user.getUsername());
-                    stmt.executeUpdate();
-                } catch (SQLException e) {
-                    
log.error(sm.getString("dataSourceUserDatabase.exception"), e);
-                }
-                if (userGroupRelationDelete != null) {
-                    try (PreparedStatement stmt = 
dbConnection.prepareStatement(userGroupRelationDelete)) {
-                        stmt.setString(1, user.getUsername());
-                        stmt.executeUpdate();
-                    } catch (SQLException e) {
-                        
log.error(sm.getString("dataSourceUserDatabase.exception"), e);
-                    }
-                }
-                try (PreparedStatement stmt = 
dbConnection.prepareStatement(temp.toString())) {
-                    stmt.setString(1, user.getUsername());
-                    stmt.executeUpdate();
-                } catch (SQLException e) {
-                    
log.error(sm.getString("dataSourceUserDatabase.exception"), e);
-                }
-            }
-            removedUsers.clear();
-        }
-
     }
 
     @Override
diff --git a/webapps/docs/changelog.xml b/webapps/docs/changelog.xml
index 9c88fc6..0b64126 100644
--- a/webapps/docs/changelog.xml
+++ b/webapps/docs/changelog.xml
@@ -111,6 +111,10 @@
         Provide the DataSource in the constructor of
         <code>DataSourceUserDatabase</code>, since it is always global. (remm)
       </fix>
+      <fix>
+        Fix delete then create object manipulations with
+        <code>DataSourceUserDatabase</code>. (remm)
+      </fix>
     </changelog>
   </subsection>
   <subsection name="Coyote">

---------------------------------------------------------------------
To unsubscribe, e-mail: dev-unsubscr...@tomcat.apache.org
For additional commands, e-mail: dev-h...@tomcat.apache.org

Reply via email to