From ca0af58ddd9f4427a2271d36fcf5bb5afbf93315 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Luk=C3=A1=C5=A1=20Ka=C5=88ka?= Date: Thu, 14 Nov 2024 15:07:34 +0100 Subject: [PATCH] [Enhancement kbss-cvut/termit-ui#528] Change TermDao#resolveVocabularyId to return optional URI instead of throwing when term is not found (not in a vocabulary). --- .../cz/cvut/kbss/termit/persistence/dao/TermDao.java | 12 ++++++------ .../kbss/termit/persistence/dao/TermDaoTest.java | 9 +++++++++ 2 files changed, 15 insertions(+), 6 deletions(-) diff --git a/src/main/java/cz/cvut/kbss/termit/persistence/dao/TermDao.java b/src/main/java/cz/cvut/kbss/termit/persistence/dao/TermDao.java index 052035b25..47180aa51 100644 --- a/src/main/java/cz/cvut/kbss/termit/persistence/dao/TermDao.java +++ b/src/main/java/cz/cvut/kbss/termit/persistence/dao/TermDao.java @@ -91,8 +91,8 @@ protected URI labelProperty() { @Override public Optional find(URI id) { try { - final Optional result = Optional.ofNullable( - em.find(Term.class, id, descriptorFactory.termDescriptor(resolveVocabularyId(id)))); + final Optional result = resolveVocabularyId(id).map(vocabulary -> + em.find(Term.class, id, descriptorFactory.termDescriptor(vocabulary))); result.ifPresent(this::postLoad); return result; } catch (RuntimeException e) { @@ -100,14 +100,14 @@ public Optional find(URI id) { } } - private URI resolveVocabularyId(URI termId) { + private Optional resolveVocabularyId(URI termId) { try { - return em.createNativeQuery("SELECT DISTINCT ?v WHERE { ?t ?inVocabulary ?v . }", URI.class) + return Optional.of(em.createNativeQuery("SELECT DISTINCT ?v WHERE { ?t ?inVocabulary ?v . }", URI.class) .setParameter("t", termId) .setParameter("inVocabulary", TERM_FROM_VOCABULARY) - .getSingleResult(); + .getSingleResult()); } catch (NoResultException | NoUniqueResultException e) { - throw new PersistenceException("Unable to resolve term vocabulary.", e); + return Optional.empty(); } } diff --git a/src/test/java/cz/cvut/kbss/termit/persistence/dao/TermDaoTest.java b/src/test/java/cz/cvut/kbss/termit/persistence/dao/TermDaoTest.java index 036c8bcf4..75ac29892 100644 --- a/src/test/java/cz/cvut/kbss/termit/persistence/dao/TermDaoTest.java +++ b/src/test/java/cz/cvut/kbss/termit/persistence/dao/TermDaoTest.java @@ -82,6 +82,7 @@ import static org.hamcrest.Matchers.lessThan; import static org.hamcrest.Matchers.not; import static org.hamcrest.Matchers.nullValue; +import static org.junit.jupiter.api.Assertions.assertDoesNotThrow; import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertFalse; import static org.junit.jupiter.api.Assertions.assertInstanceOf; @@ -1394,4 +1395,12 @@ void findByIdLoadsTermFromVocabularyContextOnly() { assertTrue(result.isPresent()); assertFalse(result.get().getProperties().containsKey(property)); } + + @Test + void findByIdReturnsOptionalEmptyWhenTermDoesNotExists() { + final Term term = Generator.generateTermWithId(vocabulary.getUri()); + // trying to find a non-existing term + final Optional empty = assertDoesNotThrow(()-> sut.find(term.getUri())); + assertTrue(empty.isEmpty()); + } }