From bbfd56309d1c9499f44c10974591d89e348a1958 Mon Sep 17 00:00:00 2001 From: Sonia Zorba <sonia.zorba@inaf.it> Date: Wed, 20 Jan 2021 13:38:05 +0100 Subject: [PATCH] NodeDAO: handled also basic accepts and provides views --- .../oats/vospace/persistence/NodeDAO.java | 68 +++++++++++++++---- .../oats/vospace/persistence/NodeDAOTest.java | 26 +++++-- 2 files changed, 75 insertions(+), 19 deletions(-) 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 d8f1801..6a8a0cf 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,16 @@ 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.View; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; import org.springframework.jdbc.core.JdbcTemplate; @@ -63,29 +67,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 +140,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"))); @@ -273,6 +286,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/NodeDAOTest.java b/src/test/java/it/inaf/oats/vospace/persistence/NodeDAOTest.java index 47936c5..ee7bbe2 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; + } } -- GitLab