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

NodeDAO: handled also basic accepts and provides views

parent 31c44baa
No related branches found
No related tags found
No related merge requests found
...@@ -7,12 +7,16 @@ import java.sql.ResultSet; ...@@ -7,12 +7,16 @@ import java.sql.ResultSet;
import java.sql.SQLException; import java.sql.SQLException;
import java.sql.Types; import java.sql.Types;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Arrays;
import java.util.List; import java.util.List;
import java.util.Optional; import java.util.Optional;
import java.util.function.Function;
import java.util.stream.Collectors;
import javax.sql.DataSource; import javax.sql.DataSource;
import net.ivoa.xml.vospace.v2.ContainerNode; import net.ivoa.xml.vospace.v2.ContainerNode;
import net.ivoa.xml.vospace.v2.DataNode; import net.ivoa.xml.vospace.v2.DataNode;
import net.ivoa.xml.vospace.v2.Property; 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.Autowired;
import org.springframework.beans.factory.annotation.Value; import org.springframework.beans.factory.annotation.Value;
import org.springframework.jdbc.core.JdbcTemplate; import org.springframework.jdbc.core.JdbcTemplate;
...@@ -63,29 +67,33 @@ public class NodeDAO { ...@@ -63,29 +67,33 @@ public class NodeDAO {
StringBuilder sb = new StringBuilder(); StringBuilder sb = new StringBuilder();
sb.append("INSERT INTO node"); sb.append("INSERT INTO node");
sb.append(" (name, busy_state, owner_id, creator_id, group_read, group_write,"); 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(" is_public, parent_path, parent_relative_path, type, accept_views, provide_views)");
sb.append(" VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ? )"); sb.append(" VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)");
jdbcTemplate.update(conn -> { jdbcTemplate.update(conn -> {
PreparedStatement ps = conn.prepareStatement(sb.toString()); PreparedStatement ps = conn.prepareStatement(sb.toString());
ps.setString(1, getNodeName(myNode)); int i = 0;
ps.setBoolean(2, getIsBusy(myNode)); ps.setString(++i, getNodeName(myNode));
ps.setString(3, getProperty(myNode, getPropertyURI("creator"))); ps.setBoolean(++i, getIsBusy(myNode));
ps.setString(4, getProperty(myNode, getPropertyURI("creator"))); ps.setString(++i, getProperty(myNode, getPropertyURI("creator")));
ps.setArray(5, fromPropertyToArray(ps, getProperty(myNode, getPropertyURI("groupread")))); ps.setString(++i, getProperty(myNode, getPropertyURI("creator")));
ps.setArray(6, fromPropertyToArray(ps, getProperty(myNode, getPropertyURI("groupwrite")))); ps.setArray(++i, fromPropertyToArray(ps, getProperty(myNode, getPropertyURI("groupread"))));
ps.setBoolean(7, Boolean.valueOf(getProperty(myNode, getPropertyURI("publicread")))); ps.setArray(++i, fromPropertyToArray(ps, getProperty(myNode, getPropertyURI("groupwrite"))));
ps.setObject(8, paths.get(0).path, Types.OTHER); ps.setBoolean(++i, Boolean.valueOf(getProperty(myNode, getPropertyURI("publicread"))));
ps.setObject(9, paths.get(0).relativePath, Types.OTHER); ps.setObject(++i, paths.get(0).path, Types.OTHER);
ps.setObject(10, getDbNodeType(myNode), 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; return ps;
}); });
} }
public Optional<Node> listNode(String path) { 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" + "JOIN node_vos_path os ON n.node_id = os.node_id\n"
+ "WHERE n.path ~ (" + getFirstLevelChildrenSelector(path) + ")::lquery\n" + "WHERE n.path ~ (" + getFirstLevelChildrenSelector(path) + ")::lquery\n"
+ "OR os.vos_path = ? ORDER BY vos_path"; + "OR os.vos_path = ? ORDER BY vos_path";
...@@ -132,7 +140,12 @@ public class NodeDAO { ...@@ -132,7 +140,12 @@ public class NodeDAO {
Node node = getTypedNode(rs.getString("type")); Node node = getTypedNode(rs.getString("type"));
if (node instanceof DataNode) { 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"))); node.setUri(getUri(rs.getString("vos_path")));
...@@ -273,6 +286,31 @@ public class NodeDAO { ...@@ -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) { private String getDbNodeType(Node node) {
if (node instanceof ContainerNode) { if (node instanceof ContainerNode) {
return "container"; return "container";
......
package it.inaf.oats.vospace.persistence; package it.inaf.oats.vospace.persistence;
import java.util.ArrayList;
import java.util.List;
import javax.sql.DataSource; import javax.sql.DataSource;
import net.ivoa.xml.vospace.v2.ContainerNode; import net.ivoa.xml.vospace.v2.ContainerNode;
import net.ivoa.xml.vospace.v2.DataNode; import net.ivoa.xml.vospace.v2.DataNode;
import net.ivoa.xml.vospace.v2.Node; import net.ivoa.xml.vospace.v2.Node;
import net.ivoa.xml.vospace.v2.Property; import net.ivoa.xml.vospace.v2.Property;
import net.ivoa.xml.vospace.v2.View;
import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertEquals;
import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test; import org.junit.jupiter.api.Test;
...@@ -33,9 +36,16 @@ public class NodeDAOTest { ...@@ -33,9 +36,16 @@ public class NodeDAOTest {
DataNode dataNode = new DataNode(); DataNode dataNode = new DataNode();
dataNode.setUri("vos://example.com!vospace/mydata1"); dataNode.setUri("vos://example.com!vospace/mydata1");
dataNode.setAccepts(getViews());
dataNode.setProvides(getViews());
dataNode.setBusy(true);
dao.createNode(dataNode); 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 @Test
...@@ -54,4 +64,12 @@ public class NodeDAOTest { ...@@ -54,4 +64,12 @@ public class NodeDAOTest {
} }
return null; return null;
} }
private List<View> getViews() {
View view = new View();
view.setUri("urn:myview");
List<View> views = new ArrayList<>();
views.add(view);
return views;
}
} }
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment