From 11f818f8117633b498e6df0f7725e1c2761256d8 Mon Sep 17 00:00:00 2001 From: Nicola Fulvio Calabria <nicola.calabria@inaf.it> Date: Wed, 6 Oct 2021 12:48:03 +0200 Subject: [PATCH] Added DAO for linked services --- .../vospace/persistence/LinkedServiceDAO.java | 44 +++++++++++++++++++ .../persistence/LinkedServiceDAOTest.java | 39 ++++++++++++++++ src/test/resources/test-data.sql | 2 + 3 files changed, 85 insertions(+) create mode 100644 src/main/java/it/inaf/oats/vospace/persistence/LinkedServiceDAO.java create mode 100644 src/test/java/it/inaf/oats/vospace/persistence/LinkedServiceDAOTest.java diff --git a/src/main/java/it/inaf/oats/vospace/persistence/LinkedServiceDAO.java b/src/main/java/it/inaf/oats/vospace/persistence/LinkedServiceDAO.java new file mode 100644 index 0000000..e8adf2f --- /dev/null +++ b/src/main/java/it/inaf/oats/vospace/persistence/LinkedServiceDAO.java @@ -0,0 +1,44 @@ +/* + * This file is part of vospace-rest + * Copyright (C) 2021 Istituto Nazionale di Astrofisica + * SPDX-License-Identifier: GPL-3.0-or-later + */ +package it.inaf.oats.vospace.persistence; + +import com.fasterxml.jackson.databind.ObjectMapper; +import javax.sql.DataSource; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.jdbc.core.JdbcTemplate; +import org.springframework.stereotype.Repository; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +@Repository +public class LinkedServiceDAO { + + private static final Logger LOG = LoggerFactory.getLogger(LinkedServiceDAO.class); + + private static final ObjectMapper MAPPER = new ObjectMapper(); + + private final JdbcTemplate jdbcTemplate; + + @Autowired + public LinkedServiceDAO(DataSource dataSource) { + jdbcTemplate = new JdbcTemplate(dataSource); + } + + boolean isLinkedServiceUrl(String targetUrl) { + String sql = " SELECT COUNT(*) > 0\n" + + "FROM linked_service\n" + + "WHERE ? LIKE service_base_url || '%'"; + + return jdbcTemplate.query(sql, ps -> { + ps.setString(1, targetUrl); + }, row -> { + if (!row.next()) { + throw new IllegalStateException("Expected one result"); + } + return row.getBoolean(1); + }); + } +} diff --git a/src/test/java/it/inaf/oats/vospace/persistence/LinkedServiceDAOTest.java b/src/test/java/it/inaf/oats/vospace/persistence/LinkedServiceDAOTest.java new file mode 100644 index 0000000..c58ecbd --- /dev/null +++ b/src/test/java/it/inaf/oats/vospace/persistence/LinkedServiceDAOTest.java @@ -0,0 +1,39 @@ +/* + * This file is part of vospace-rest + * Copyright (C) 2021 Istituto Nazionale di Astrofisica + * SPDX-License-Identifier: GPL-3.0-or-later + */ +package it.inaf.oats.vospace.persistence; + +import javax.sql.DataSource; +import static org.junit.jupiter.api.Assertions.assertTrue; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.test.context.ContextConfiguration; +import org.springframework.test.context.TestPropertySource; +import org.springframework.test.context.junit.jupiter.SpringExtension; +import static org.junit.jupiter.api.Assertions.assertFalse; + +@ExtendWith(SpringExtension.class) +@ContextConfiguration(classes = {DataSourceConfig.class}) +@TestPropertySource(locations = "classpath:test.properties") +public class LinkedServiceDAOTest { + + @Autowired + private DataSource dataSource; + private LinkedServiceDAO dao; + + @BeforeEach + public void init() { + dao = new LinkedServiceDAO(dataSource); + } + + @Test + void testIsLinkedService() { + assertTrue(dao.isLinkedServiceUrl("http://archives.ia2.inaf.it/files/aao/pippofile.fits.gz")); + assertFalse(dao.isLinkedServiceUrl("http://noportal.ia2.inaf.it/files/nop/nopippofile.tar.gz")); + } + +} diff --git a/src/test/resources/test-data.sql b/src/test/resources/test-data.sql index 3ae4a61..7827a3a 100644 --- a/src/test/resources/test-data.sql +++ b/src/test/resources/test-data.sql @@ -1,3 +1,5 @@ +INSERT INTO linked_service(service_base_url) VALUES ('http://archives.ia2.inaf.it/files/aao'); + INSERT INTO storage (storage_type, base_path, base_url, hostname) VALUES ('cold', '/ia2_tape/users', NULL, 'tape-server'); INSERT INTO storage (storage_type, base_path, base_url, hostname) VALUES ('hot', '/mnt/hot_storage/users', NULL, 'server'); INSERT INTO storage (storage_type, base_path, base_url, hostname) VALUES ('local', '/home', NULL, 'localhost'); -- GitLab