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 Diff line number Diff line
@@ -136,22 +136,22 @@ public class NodeDAO {
        StringBuilder sb = new StringBuilder();

        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 ");

        if (recursive) {
            updatePermissionsRecursively(newNode, vosPath);
        } else {
            jdbcTemplate.update(conn -> {
                PreparedStatement ps = conn.prepareStatement(sb.toString());
                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_WRITE_URI)));
                ps.setBoolean(++i, Boolean.valueOf(NodeProperties.getNodePropertyByURI(newNode, NodeProperties.PUBLIC_READ_URI)));
                ps.setString(++i, vosPath);
                return ps;
            });
        
        if (recursive == true)
            updatePermissionsRecursively(newNode, vosPath);
        }

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


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


    private Array fromPropertyToArray(PreparedStatement ps, String myProperty) throws SQLException {
        if (myProperty == null || myProperty.isBlank()) {
            return null;
@@ -380,27 +378,37 @@ public class NodeDAO {
    column name     value
    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 "
                + "FROM node n JOIN node_vos_path p ON n.node_id = p.node_id "
                + "WHERE p.vos_path = ?";

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

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

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

        List<String> newGroupReadList = NodeProperties.getNodePropertyAsListByURI(newNode, NodeProperties.GROUP_READ_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> groupWriteToRemove = differenceBetweenSets(existingGroupWrite, newGroupWrite);

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

        jdbcTemplate.update(conn -> {
            PreparedStatement ps = conn.prepareStatement(sql);
            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.setString(++i, vosPath);
            return ps;
        });
        
    }

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

        return diff;
        
    }

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

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

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