Loading src/main/java/it/inaf/oats/vospace/persistence/NodeDAO.java +88 −81 Original line number Diff line number Diff line Loading @@ -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; } Loading Loading @@ -324,7 +324,6 @@ public class NodeDAO { } } private String getUri(String path) { return "vos://" + authority + path; } Loading @@ -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; Loading Loading @@ -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); Loading @@ -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 Loading @@ -443,7 +453,6 @@ public class NodeDAO { diff.removeAll(b); return diff; } private List<NodePaths> getNodePathsFromDB(String nodeURI) { Loading Loading @@ -489,7 +498,5 @@ public class NodeDAO { public String getRelativePath() { return this.relativePath; } } } src/test/java/it/inaf/oats/vospace/persistence/NodeDAOTest.java +2 −2 Original line number Diff line number Diff line Loading @@ -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"); Loading Loading
src/main/java/it/inaf/oats/vospace/persistence/NodeDAO.java +88 −81 Original line number Diff line number Diff line Loading @@ -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; } Loading Loading @@ -324,7 +324,6 @@ public class NodeDAO { } } private String getUri(String path) { return "vos://" + authority + path; } Loading @@ -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; Loading Loading @@ -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); Loading @@ -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 Loading @@ -443,7 +453,6 @@ public class NodeDAO { diff.removeAll(b); return diff; } private List<NodePaths> getNodePathsFromDB(String nodeURI) { Loading Loading @@ -489,7 +498,5 @@ public class NodeDAO { public String getRelativePath() { return this.relativePath; } } }
src/test/java/it/inaf/oats/vospace/persistence/NodeDAOTest.java +2 −2 Original line number Diff line number Diff line Loading @@ -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"); Loading