diff --git a/pom.xml b/pom.xml index f16c5d503ad46b305b0ffbd279348a4aa5b50f5f..70540865ad8cbb638f22b1732c0efaf5035dce7c 100644 --- a/pom.xml +++ b/pom.xml @@ -15,7 +15,6 @@ <description>VOSpace REST service</description> <properties> - <java.version>11</java.version> <!-- File catalog repository directory --> <init_database_scripts_path>../../../vospace-file-catalog</init_database_scripts_path> <finalName>${project.artifactId}-${project.version}</finalName> 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 d8f18014b8ec5bd3a6f58a699151671b6a9fa3ef..b6021f217d757681a799e23bebdc15b143bf4646 100644 --- a/src/main/java/it/inaf/oats/vospace/persistence/NodeDAO.java +++ b/src/main/java/it/inaf/oats/vospace/persistence/NodeDAO.java @@ -7,12 +7,17 @@ import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Types; import java.util.ArrayList; +import java.util.Arrays; import java.util.List; import java.util.Optional; +import java.util.function.Function; +import java.util.stream.Collectors; import javax.sql.DataSource; import net.ivoa.xml.vospace.v2.ContainerNode; import net.ivoa.xml.vospace.v2.DataNode; import net.ivoa.xml.vospace.v2.Property; +import net.ivoa.xml.vospace.v2.StructuredDataNode; +import net.ivoa.xml.vospace.v2.View; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; import org.springframework.jdbc.core.JdbcTemplate; @@ -63,29 +68,33 @@ public class NodeDAO { StringBuilder sb = new StringBuilder(); sb.append("INSERT INTO node"); sb.append(" (name, busy_state, owner_id, creator_id, group_read, group_write,"); - sb.append(" is_public, parent_path, parent_relative_path, type)"); - sb.append(" VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ? )"); + sb.append(" is_public, parent_path, parent_relative_path, type, accept_views, provide_views)"); + 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(ps, getProperty(myNode, getPropertyURI("groupread")))); - ps.setArray(6, fromPropertyToArray(ps, getProperty(myNode, getPropertyURI("groupwrite")))); - ps.setBoolean(7, Boolean.valueOf(getProperty(myNode, getPropertyURI("publicread")))); - ps.setObject(8, paths.get(0).path, Types.OTHER); - ps.setObject(9, paths.get(0).relativePath, Types.OTHER); - ps.setObject(10, getDbNodeType(myNode), Types.OTHER); + int i = 0; + ps.setString(++i, getNodeName(myNode)); + ps.setBoolean(++i, getIsBusy(myNode)); + ps.setString(++i, getProperty(myNode, getPropertyURI("creator"))); + ps.setString(++i, getProperty(myNode, getPropertyURI("creator"))); + ps.setArray(++i, fromPropertyToArray(ps, getProperty(myNode, getPropertyURI("groupread")))); + ps.setArray(++i, fromPropertyToArray(ps, getProperty(myNode, getPropertyURI("groupwrite")))); + ps.setBoolean(++i, Boolean.valueOf(getProperty(myNode, getPropertyURI("publicread")))); + ps.setObject(++i, paths.get(0).path, Types.OTHER); + ps.setObject(++i, paths.get(0).relativePath, Types.OTHER); + ps.setObject(++i, getDbNodeType(myNode), Types.OTHER); + ps.setObject(++i, fromViewsToArray(ps, myNode, d -> d.getAccepts()), Types.OTHER); + ps.setObject(++i, fromViewsToArray(ps, myNode, d -> d.getProvides()), Types.OTHER); return ps; }); - } public Optional<Node> listNode(String path) { - String sql = "SELECT os.vos_path, n.node_id, type, async_trans, busy_state, creator_id, group_read, group_write, is_public, content_length, created_on, last_modified from node n\n" + String sql = "SELECT os.vos_path, n.node_id, type, async_trans, busy_state, creator_id, group_read, group_write,\n" + + "is_public, content_length, created_on, last_modified, accept_views, provide_views\n" + + "FROM node n\n" + "JOIN node_vos_path os ON n.node_id = os.node_id\n" + "WHERE n.path ~ (" + getFirstLevelChildrenSelector(path) + ")::lquery\n" + "OR os.vos_path = ? ORDER BY vos_path"; @@ -132,7 +141,12 @@ public class NodeDAO { Node node = getTypedNode(rs.getString("type")); if (node instanceof DataNode) { - ((DataNode) node).setBusy(rs.getBoolean("busy_state")); + + DataNode dataNode = (DataNode) node; + + dataNode.setBusy(rs.getBoolean("busy_state")); + dataNode.setAccepts(getViews(rs.getArray("accept_views"))); + dataNode.setProvides(getViews(rs.getArray("provide_views"))); } node.setUri(getUri(rs.getString("vos_path"))); @@ -198,6 +212,9 @@ public class NodeDAO { case "data": node = new DataNode(); break; + case "structured": + node = new StructuredDataNode(); + break; default: throw new UnsupportedOperationException("Node type " + type + " not supported yet"); } @@ -273,6 +290,31 @@ public class NodeDAO { } } + private Array fromViewsToArray(PreparedStatement ps, Node node, Function<DataNode, List<View>> viewsExtractor) throws SQLException { + if (node instanceof DataNode) { + DataNode dataNode = (DataNode) node; + List<View> views = viewsExtractor.apply(dataNode); + if (views != null && !views.isEmpty()) { + Object[] array = views.stream().map(v -> v.getUri()).toArray(); + return ps.getConnection().createArrayOf("varchar", array); + } + } + return null; + } + + private List<View> getViews(Array array) throws SQLException { + if (array == null) { + return null; + } + return Arrays.stream((String[]) array.getArray()) + .map(uri -> { + View view = new View(); + view.setUri(uri); + return view; + }) + .collect(Collectors.toList()); + } + private String getDbNodeType(Node node) { if (node instanceof ContainerNode) { return "container"; diff --git a/src/test/java/it/inaf/oats/vospace/persistence/DataSourceConfig.java b/src/test/java/it/inaf/oats/vospace/persistence/DataSourceConfig.java index eadeaec8d8962ee0e45436f8ebc06caf269762f8..5993356419744cb12394870e580c7be9d85fffea 100644 --- a/src/test/java/it/inaf/oats/vospace/persistence/DataSourceConfig.java +++ b/src/test/java/it/inaf/oats/vospace/persistence/DataSourceConfig.java @@ -75,7 +75,7 @@ public class DataSourceConfig { File scriptDir = currentDir.toPath().resolve(scriptPath).toFile().getCanonicalFile(); assertTrue(scriptDir.exists(), "DAO tests require " + scriptDir.getAbsolutePath() + " to exists.\n" - + "Please clone the repository from https://www.ict.inaf.it/gitlab/ia2/vospace-file-catalog.git"); + + "Please clone the repository from https://www.ict.inaf.it/gitlab/vospace/vospace-file-catalog.git"); File[] scripts = scriptDir.listFiles(f -> f.getName().endsWith(".sql")); Arrays.sort(scripts); // sort alphabetically 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 47936c5a897c376ef46afced62fd64797966f11c..ee7bbe23edb92f3c538f71bc6e85279d728b63c0 100644 --- a/src/test/java/it/inaf/oats/vospace/persistence/NodeDAOTest.java +++ b/src/test/java/it/inaf/oats/vospace/persistence/NodeDAOTest.java @@ -1,10 +1,13 @@ package it.inaf.oats.vospace.persistence; +import java.util.ArrayList; +import java.util.List; 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 net.ivoa.xml.vospace.v2.View; import static org.junit.jupiter.api.Assertions.assertEquals; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; @@ -27,15 +30,22 @@ 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"); - + dataNode.setAccepts(getViews()); + dataNode.setProvides(getViews()); + dataNode.setBusy(true); + dao.createNode(dataNode); - + + DataNode retrievedNode = (DataNode) dao.listNode("/mydata1").get(); + + assertEquals(retrievedNode.getAccepts().get(0).getUri(), dataNode.getAccepts().get(0).getUri()); + assertEquals(retrievedNode.getProvides().get(0).getUri(), dataNode.getProvides().get(0).getUri()); } @Test @@ -54,4 +64,12 @@ public class NodeDAOTest { } return null; } + + private List<View> getViews() { + View view = new View(); + view.setUri("urn:myview"); + List<View> views = new ArrayList<>(); + views.add(view); + return views; + } }