Commit 811fe56c authored by Sonia Zorba's avatar Sonia Zorba
Browse files

Bugfix setNode recursive

parent 2e24dfee
Loading
Loading
Loading
Loading
+88 −81
Original line number Original line Diff line number Diff line
@@ -136,22 +136,22 @@ public class NodeDAO {
        StringBuilder sb = new StringBuilder();
        StringBuilder sb = new StringBuilder();


        sb.append("UPDATE node");
        sb.append("UPDATE node");
        sb.append(" SET owner_id = ?, group_read = ?, group_write = ?, is_public = ? " );
        sb.append(" SET group_read = ?, group_write = ?, is_public = ? ");
        sb.append(" FROM node_vos_path p WHERE p.vos_path = ? AND p.node_id = node.node_id ");
        sb.append(" FROM node_vos_path p WHERE p.vos_path = ? AND p.node_id = node.node_id ");


        if (recursive) {
            updatePermissionsRecursively(newNode, vosPath);
        } else {
            jdbcTemplate.update(conn -> {
            jdbcTemplate.update(conn -> {
                PreparedStatement ps = conn.prepareStatement(sb.toString());
                PreparedStatement ps = conn.prepareStatement(sb.toString());
                int i = 0;
                int i = 0;
            ps.setString(++i, NodeProperties.getNodePropertyByURI(newNode, NodeProperties.CREATOR_URI));
                ps.setArray(++i, fromPropertyToArray(ps, NodeProperties.getNodePropertyByURI(newNode, NodeProperties.GROUP_READ_URI)));
                ps.setArray(++i, fromPropertyToArray(ps, NodeProperties.getNodePropertyByURI(newNode, NodeProperties.GROUP_READ_URI)));
                ps.setArray(++i, fromPropertyToArray(ps, NodeProperties.getNodePropertyByURI(newNode, NodeProperties.GROUP_WRITE_URI)));
                ps.setArray(++i, fromPropertyToArray(ps, NodeProperties.getNodePropertyByURI(newNode, NodeProperties.GROUP_WRITE_URI)));
                ps.setBoolean(++i, Boolean.valueOf(NodeProperties.getNodePropertyByURI(newNode, NodeProperties.PUBLIC_READ_URI)));
                ps.setBoolean(++i, Boolean.valueOf(NodeProperties.getNodePropertyByURI(newNode, NodeProperties.PUBLIC_READ_URI)));
                ps.setString(++i, vosPath);
                ps.setString(++i, vosPath);
                return ps;
                return ps;
            });
            });
        
        }
        if (recursive == true)
            updatePermissionsRecursively(newNode, vosPath);


        return newNode;
        return newNode;
    }
    }
@@ -324,7 +324,6 @@ public class NodeDAO {
        }
        }
    }
    }



    private String getUri(String path) {
    private String getUri(String path) {
        return "vos://" + authority + path;
        return "vos://" + authority + path;
    }
    }
@@ -334,7 +333,6 @@ public class NodeDAO {
        return paths;
        return paths;
    }
    }



    private Array fromPropertyToArray(PreparedStatement ps, String myProperty) throws SQLException {
    private Array fromPropertyToArray(PreparedStatement ps, String myProperty) throws SQLException {
        if (myProperty == null || myProperty.isBlank()) {
        if (myProperty == null || myProperty.isBlank()) {
            return null;
            return null;
@@ -380,27 +378,37 @@ public class NodeDAO {
    column name     value
    column name     value
    and value is a String containing comma separated groups having permissions
    and value is a String containing comma separated groups having permissions
     */
     */
    private Map getPermissionsFromDB(String vosPath) {
    private Map<String, List<String>> getPermissionsFromDB(String vosPath) {


        String sql = "SELECT group_read, group_write "
        String sql = "SELECT group_read, group_write "
                + "FROM node n JOIN node_vos_path p ON n.node_id = p.node_id "
                + "FROM node n JOIN node_vos_path p ON n.node_id = p.node_id "
                + "WHERE p.vos_path = ?";
                + "WHERE p.vos_path = ?";


        Map<String, Object> result =  (Map<String, Object>) jdbcTemplate
        return jdbcTemplate.query(sql, new Object[]{vosPath}, rs -> {
                              .queryForMap(sql, new Object[] {vosPath});
            if (!rs.next()) {
        
                throw new InternalFaultException("No records found for " + vosPath);
        return result;
            }
            return Map.of(
                    "group_read", getArrayValue(rs, "group_read"),
                    "group_write", getArrayValue(rs, "group_write")
            );
        });
    }


    private List<String> getArrayValue(ResultSet rs, String key) throws SQLException {
        Array array = rs.getArray(key);
        if (array == null) {
            return new ArrayList<>();
        }
        return Arrays.asList((String[]) array.getArray());
    }
    }


    private void updatePermissionsRecursively(Node newNode, String vosPath) {
    private void updatePermissionsRecursively(Node newNode, String vosPath) {


        Map permissions = getPermissionsFromDB(vosPath);
        Map<String, List<String>> permissions = getPermissionsFromDB(vosPath);
        String existingGroupReadStr = (String)permissions.get("group_read");
        String existingGroupWriteStr = (String)permissions.get("group_write");


        List<String> existingGroupReadList = NodeProperties.parsePropertyStringToList(existingGroupReadStr);
        List<String> existingGroupReadList = permissions.get("group_read");
        List<String> existingGroupWriteList = NodeProperties.parsePropertyStringToList(existingGroupWriteStr);
        List<String> existingGroupWriteList = permissions.get("group_write");


        List<String> newGroupReadList = NodeProperties.getNodePropertyAsListByURI(newNode, NodeProperties.GROUP_READ_URI);
        List<String> newGroupReadList = NodeProperties.getNodePropertyAsListByURI(newNode, NodeProperties.GROUP_READ_URI);
        List<String> newGroupWriteList = NodeProperties.getNodePropertyAsListByURI(newNode, NodeProperties.GROUP_WRITE_URI);
        List<String> newGroupWriteList = NodeProperties.getNodePropertyAsListByURI(newNode, NodeProperties.GROUP_WRITE_URI);
@@ -417,23 +425,25 @@ public class NodeDAO {
        Set<String> groupWriteToAdd = differenceBetweenSets(newGroupWrite, existingGroupWrite);
        Set<String> groupWriteToAdd = differenceBetweenSets(newGroupWrite, existingGroupWrite);
        Set<String> groupWriteToRemove = differenceBetweenSets(existingGroupWrite, newGroupWrite);
        Set<String> groupWriteToRemove = differenceBetweenSets(existingGroupWrite, newGroupWrite);


        String sql = "UPDATE node SET " +
        String sql = "UPDATE node SET "
                       "group_read = update_array(group_read, " +  groupReadToAdd + ", " + groupReadToRemove + "), " +
                + "group_read = update_array(group_read, ?, ?), "
                       "group_write = update_array(group_write, " + groupWriteToAdd + ", " + groupWriteToRemove + "), " + 
                + "group_write = update_array(group_write, ?, ?), "
                       "is_public = ? " +
                + "is_public = ? "
                       "WHERE path <@ (SELECT path FROM node n " +
                + "WHERE path <@ (SELECT path FROM node n "
                       "JOIN node_vos_path p ON n.node_id = p.node_id " +
                + "JOIN node_vos_path p ON n.node_id = p.node_id "
                       "AND p.vos_path = ?)";
                + "AND p.vos_path = ?)";
        


        jdbcTemplate.update(conn -> {
        jdbcTemplate.update(conn -> {
            PreparedStatement ps = conn.prepareStatement(sql);
            PreparedStatement ps = conn.prepareStatement(sql);
            int i = 0;
            int i = 0;
            ps.setArray(++i, ps.getConnection().createArrayOf("varchar", groupReadToAdd.toArray()));
            ps.setArray(++i, ps.getConnection().createArrayOf("varchar", groupReadToRemove.toArray()));
            ps.setArray(++i, ps.getConnection().createArrayOf("varchar", groupWriteToAdd.toArray()));
            ps.setArray(++i, ps.getConnection().createArrayOf("varchar", groupWriteToRemove.toArray()));
            ps.setBoolean(++i, Boolean.valueOf(NodeProperties.getNodePropertyByURI(newNode, NodeProperties.PUBLIC_READ_URI)));
            ps.setBoolean(++i, Boolean.valueOf(NodeProperties.getNodePropertyByURI(newNode, NodeProperties.PUBLIC_READ_URI)));
            ps.setString(++i, vosPath);
            ps.setString(++i, vosPath);
            return ps;
            return ps;
        });
        });
        
    }
    }


    // Returns the difference a minus b
    // Returns the difference a minus b
@@ -443,7 +453,6 @@ public class NodeDAO {
        diff.removeAll(b);
        diff.removeAll(b);


        return diff;
        return diff;
        
    }
    }


    private List<NodePaths> getNodePathsFromDB(String nodeURI) {
    private List<NodePaths> getNodePathsFromDB(String nodeURI) {
@@ -489,7 +498,5 @@ public class NodeDAO {
        public String getRelativePath() {
        public String getRelativePath() {
            return this.relativePath;
            return this.relativePath;
        }
        }
        
    }
    }
    
}
}
+2 −2
Original line number Original line Diff line number Diff line
@@ -142,7 +142,7 @@ public class NodeDAOTest {
        assertEquals("true", NodeProperties.getNodePropertyByURI(node, NodeProperties.PUBLIC_READ_URI));
        assertEquals("true", NodeProperties.getNodePropertyByURI(node, NodeProperties.PUBLIC_READ_URI));
    }
    }


    //@Test
    @Test
    public void testSetNodeRecursiveGroup() {
    public void testSetNodeRecursiveGroup() {


        Property parentGroupRead = getProperty(NodeProperties.GROUP_READ_URI, "group1 group2");
        Property parentGroupRead = getProperty(NodeProperties.GROUP_READ_URI, "group1 group2");