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