diff --git a/src/main/java/it/inaf/oats/vospace/persistence/NodeDAO.java b/src/main/java/it/inaf/oats/vospace/persistence/NodeDAO.java index f07c4ce5be9a0ef976531dc6daf128d84db754d9..c15550dfe1aac47abb0054a3efbfb4eb18443146 100644 --- a/src/main/java/it/inaf/oats/vospace/persistence/NodeDAO.java +++ b/src/main/java/it/inaf/oats/vospace/persistence/NodeDAO.java @@ -403,6 +403,30 @@ public class NodeDAO { return ps; }); } + + public void setBranchImmutable(Long rootNodeId, boolean setImmutable) { + String sql = "UPDATE node c SET immutable = ? " + + "FROM node r " + + "WHERE r.node_id = ? " + + "AND r.path @> c.path"; + + jdbcTemplate.update(conn -> { + PreparedStatement ps = conn.prepareStatement(sql); + ps.setBoolean(1, setImmutable); + ps.setLong(2, rootNodeId); + return ps; + }); + } + + public boolean isBranchImmutable(long parentNodeId) { + + String sql = "SELECT COUNT(c.node_id) > 0 " + + "FROM node n " + + "JOIN node c ON c.path <@ n.path " + + "WHERE n.node_id = ? AND c.immutable IS TRUE"; + + return jdbcTemplate.queryForObject(sql, new Object[]{parentNodeId}, new int[]{Types.BIGINT}, Boolean.class); + } public void releaseBusyNodesByJobId(String jobId) { String sql = "UPDATE node SET job_id = NULL WHERE job_id = ?"; diff --git a/src/test/java/it/inaf/oats/vospace/persistence/NodeDAOTest.java b/src/test/java/it/inaf/oats/vospace/persistence/NodeDAOTest.java index 862b598461b5f1a2e53485c61fbcee82c5873fd8..8285f528f2e6de1b2250afff775fbb9a11f65888 100644 --- a/src/test/java/it/inaf/oats/vospace/persistence/NodeDAOTest.java +++ b/src/test/java/it/inaf/oats/vospace/persistence/NodeDAOTest.java @@ -50,7 +50,6 @@ public class NodeDAOTest { ReflectionTestUtils.setField(dao, "authority", AUTHORITY); } - @Test public void testCreateNode() { DataNode dataNode = new DataNode(); @@ -275,6 +274,27 @@ public class NodeDAOTest { } + @Test + public void testSetImmutable() { + Optional<Long> optId = dao.getNodeId("/test3/m1"); + assertTrue(optId.isPresent()); + + assertFalse(dao.isBranchImmutable(optId.get())); + + dao.setBranchImmutable(optId.get(), true); + + assertTrue(dao.isBranchImmutable(optId.get())); + + Optional<Long> childId = dao.getNodeId("/test3/m1/m2"); + assertTrue(childId.isPresent()); + + assertTrue(dao.isBranchImmutable(childId.get())); + + dao.setBranchImmutable(optId.get(), false); + + assertFalse(dao.isBranchBusy(optId.get())); + assertFalse(dao.isBranchBusy((childId.get()))); + } @Test public void testMoveNodeBranch() {