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 64ab6b68f8d52555f2388437491cbb01e462033c..508eb4465f4d45f7cfb203a090e046a83b374306 100644 --- a/src/main/java/it/inaf/oats/vospace/persistence/NodeDAO.java +++ b/src/main/java/it/inaf/oats/vospace/persistence/NodeDAO.java @@ -5,6 +5,7 @@ import net.ivoa.xml.vospace.v2.Node; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; +import java.sql.Types; import java.util.ArrayList; import java.util.List; import java.util.Optional; @@ -34,18 +35,65 @@ public class NodeDAO { jdbcTemplate = new JdbcTemplate(dataSource); } - public Node createNode(Node myNode) { + public void createNode(Node myNode) { + + // check if parent path exist, else throw HTTP 404 , secondo specifica vospace + + /* + Retrieve the path (ltree) and the relative_path (ltree) of the parent node: + + select path, relative_path from node n + join node_vos_path p on n.node_id = p.node_id + where p.vos_path = '/path/to/parent’ + + Then perform the insert using the path and relative_path to fill the parent_path and parent_relative_path columns of the new node. + + */ + + String nodeURI = myNode.getUri(); + String path = nodeURI.replaceAll("vos://[^/]+", ""); + String parentPath = getParentPath(path); + + String sql = "SELECT path, relative_path from " + + "node n join node_vos_path p on n.node_id = p.node_id " + + "where p.vos_path = ?"; + + List<NodePaths> paths = jdbcTemplate.query(conn -> { + PreparedStatement ps = conn.prepareStatement(sql); + ps.setString(1, parentPath); + return ps; + }, (row, index) -> { + return getPathsFromResultSet(row); + }); + + if(paths.isEmpty()) { + throw new IllegalStateException("Unable to find parent node during node creation"); + } + StringBuilder sb = new StringBuilder(); - sb.append("INSERT INTO "); - sb.append("NodeProperty"); - sb.append(" (nodeID,propertyURI,propertyValue) SELECT ?, ?, ?"); - sb.append(" WHERE NOT EXISTS (SELECT * FROM NodeProperty"); - sb.append(" WHERE nodeID=? and propertyURI=?)"); - String sqlQuery = sb.toString(); - - return myNode; + sb.append("INSERT INTO node"); + sb.append(" (name, busy_state, owner_id, creator_id, group_read, group_write,"); + sb.append(" is_public, parent_path, type)"); + sb.append(" VALUES (?, ?, ?, ?, ?, ?, ?, ?, ? )"); + + jdbcTemplate.update(conn -> { + PreparedStatement ps = conn.prepareStatement(sb.toString()); + ps.setString(1, getNodeName(myNode)); + ps.setBoolean(2, getIsBusy(myNode)); + ps.setString(3, getProperty(myNode, getPropertyURI("creator"))); + ps.setString(4, getProperty(myNode, getPropertyURI("creator"))); + ps.setArray(5, fromPropertyToArray(getProperty(myNode, getPropertyURI("groupread")))); + ps.setArray(6, fromPropertyToArray(getProperty(myNode, getPropertyURI("groupwrite")))); + ps.setBoolean(7, Boolean.valueOf(getProperty(myNode, getPropertyURI("publicread")))); + //ps.setBoolean(7, true); + ps.setObject(8, paths.get(0).parentPath, Types.OTHER); + ps.setString(9, getProperty(myNode, getPropertyURI("type"))); + return ps; + }); + } + public Optional<Node> listNode(String path) { @@ -168,4 +216,98 @@ public class NodeDAO { private String getUri(String path) { return "vos://" + authority + path; } + + + private NodePaths getPathsFromResultSet(ResultSet rs) throws SQLException { + + NodePaths paths = new NodePaths(rs.getString("path"), rs.getString("relative_path")); + + return paths; + + } + + private String getNodeName(String path) { + String[] parsedPath = path.split("/"); + + return parsedPath[parsedPath.length -1]; + + } + + + + private String getNodeName(Node myNode) { + + String uri = myNode.getUri(); + return getNodeName(uri); + + } + + + private boolean getIsBusy(Node myNode) { + + if (myNode instanceof DataNode) { + + DataNode dataNode = (DataNode)myNode; + return dataNode.isBusy(); + } + + return false; + + } + + + private String getParentPath(String path) { + String[] parsedPath = path.split("/"); + + StringBuilder sb = new StringBuilder(); + + for (int i = 0; i < parsedPath.length - 1; i++) { + sb.append("/").append(parsedPath[i]); + } + + return sb.toString(); + } + + + private String getProperty(Node node, String uri) { + for (Property property : node.getProperties()) { + if (uri.equals(property.getUri())) { + return property.getValue(); + } + } + return null; + } + + private Array fromPropertyToArray(String myProperty) { + + if (myProperty == null || myProperty.isBlank()) + + return null; + + else { + + //myProperty.split(" ") + return null; + } + + } + + + private class NodePaths { + + private String path; + private String parentPath; + + public NodePaths(String myPath, String myParentPath) { + + this.path = myPath; + this.parentPath = myParentPath; + + } + + public String toString() { + return parentPath + " " + path; + } + } + } 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 d1cfcf0ddd2cfac25120653b87d6b53dfb7fa500..47936c5a897c376ef46afced62fd64797966f11c 100644 --- a/src/test/java/it/inaf/oats/vospace/persistence/NodeDAOTest.java +++ b/src/test/java/it/inaf/oats/vospace/persistence/NodeDAOTest.java @@ -2,6 +2,7 @@ package it.inaf.oats.vospace.persistence; import javax.sql.DataSource; import net.ivoa.xml.vospace.v2.ContainerNode; +import net.ivoa.xml.vospace.v2.DataNode; import net.ivoa.xml.vospace.v2.Node; import net.ivoa.xml.vospace.v2.Property; import static org.junit.jupiter.api.Assertions.assertEquals; @@ -26,6 +27,16 @@ public class NodeDAOTest { public void init() { dao = new NodeDAO(dataSource); } + + @Test + public void testCreateNode() { + DataNode dataNode = new DataNode(); + + dataNode.setUri("vos://example.com!vospace/mydata1"); + + dao.createNode(dataNode); + + } @Test public void testListNode() {