Loading pom.xml +0 −1 Original line number Diff line number Diff line Loading @@ -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> Loading src/main/java/it/inaf/oats/vospace/persistence/NodeDAO.java +57 −15 Original line number Diff line number Diff line Loading @@ -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; Loading Loading @@ -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"; Loading Loading @@ -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"))); Loading Loading @@ -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"); } Loading Loading @@ -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"; Loading src/test/java/it/inaf/oats/vospace/persistence/DataSourceConfig.java +1 −1 Original line number Diff line number Diff line Loading @@ -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 Loading src/test/java/it/inaf/oats/vospace/persistence/NodeDAOTest.java +22 −4 Original line number Diff line number Diff line 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; Loading Loading @@ -33,9 +36,16 @@ public class NodeDAOTest { 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 Loading @@ -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; } } Loading
pom.xml +0 −1 Original line number Diff line number Diff line Loading @@ -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> Loading
src/main/java/it/inaf/oats/vospace/persistence/NodeDAO.java +57 −15 Original line number Diff line number Diff line Loading @@ -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; Loading Loading @@ -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"; Loading Loading @@ -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"))); Loading Loading @@ -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"); } Loading Loading @@ -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"; Loading
src/test/java/it/inaf/oats/vospace/persistence/DataSourceConfig.java +1 −1 Original line number Diff line number Diff line Loading @@ -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 Loading
src/test/java/it/inaf/oats/vospace/persistence/NodeDAOTest.java +22 −4 Original line number Diff line number Diff line 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; Loading Loading @@ -33,9 +36,16 @@ public class NodeDAOTest { 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 Loading @@ -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; } }