Loading src/main/java/it/inaf/oats/vospace/persistence/NodeDAO.java +88 −81 Original line number Original line Diff line number Diff line Loading @@ -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; } } Loading Loading @@ -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; } } Loading @@ -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; Loading Loading @@ -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); Loading @@ -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 Loading @@ -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) { Loading Loading @@ -489,7 +498,5 @@ public class NodeDAO { public String getRelativePath() { public String getRelativePath() { return this.relativePath; return this.relativePath; } } } } } } src/test/java/it/inaf/oats/vospace/persistence/NodeDAOTest.java +2 −2 Original line number Original line Diff line number Diff line Loading @@ -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"); Loading Loading
src/main/java/it/inaf/oats/vospace/persistence/NodeDAO.java +88 −81 Original line number Original line Diff line number Diff line Loading @@ -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; } } Loading Loading @@ -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; } } Loading @@ -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; Loading Loading @@ -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); Loading @@ -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 Loading @@ -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) { Loading Loading @@ -489,7 +498,5 @@ public class NodeDAO { public String getRelativePath() { public String getRelativePath() { return this.relativePath; return this.relativePath; } } } } } }
src/test/java/it/inaf/oats/vospace/persistence/NodeDAOTest.java +2 −2 Original line number Original line Diff line number Diff line Loading @@ -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"); Loading