Skip to content
Snippets Groups Projects
Commit 811fe56c authored by Sonia Zorba's avatar Sonia Zorba
Browse files

Bugfix setNode recursive

parent 2e24dfee
No related branches found
No related tags found
No related merge requests found
......@@ -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;
}
}
}
......@@ -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");
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment