From 9e41bb275e959f4e1fe78fb3af962b5d36eef7e2 Mon Sep 17 00:00:00 2001 From: Alexander Goussas Date: Fri, 22 May 2026 18:42:12 -0500 Subject: [PATCH] refactor: separate network logic into repository --- .../frustratedfunctor/GreetingResource.java | 16 --------- .../WordTranslationService.java | 36 ------------------- .../JsoupWordTranslationRepository.java | 36 +++++++++++++++++++ .../WordTranslation.java} | 4 +-- .../WordTranslationRepository.java | 15 ++++++++ .../WordTranslationResource.java | 7 ++-- .../translations/WordTranslationService.java | 28 +++++++++++++++ 7 files changed, 84 insertions(+), 58 deletions(-) delete mode 100644 src/main/java/net/frustratedfunctor/GreetingResource.java delete mode 100644 src/main/java/net/frustratedfunctor/WordTranslationService.java create mode 100644 src/main/java/net/frustratedfunctor/translations/JsoupWordTranslationRepository.java rename src/main/java/net/frustratedfunctor/{WordDefinition.java => translations/WordTranslation.java} (53%) create mode 100644 src/main/java/net/frustratedfunctor/translations/WordTranslationRepository.java rename src/main/java/net/frustratedfunctor/{ => translations}/WordTranslationResource.java (69%) create mode 100644 src/main/java/net/frustratedfunctor/translations/WordTranslationService.java diff --git a/src/main/java/net/frustratedfunctor/GreetingResource.java b/src/main/java/net/frustratedfunctor/GreetingResource.java deleted file mode 100644 index ab13b68..0000000 --- a/src/main/java/net/frustratedfunctor/GreetingResource.java +++ /dev/null @@ -1,16 +0,0 @@ -package net.frustratedfunctor; - -import jakarta.ws.rs.GET; -import jakarta.ws.rs.Path; -import jakarta.ws.rs.Produces; -import jakarta.ws.rs.core.MediaType; - -@Path("/hello") -public class GreetingResource { - - @GET - @Produces(MediaType.TEXT_PLAIN) - public String hello() { - return "Hello from Quarkus REST"; - } -} diff --git a/src/main/java/net/frustratedfunctor/WordTranslationService.java b/src/main/java/net/frustratedfunctor/WordTranslationService.java deleted file mode 100644 index 7ea96a2..0000000 --- a/src/main/java/net/frustratedfunctor/WordTranslationService.java +++ /dev/null @@ -1,36 +0,0 @@ -package net.frustratedfunctor; - -import jakarta.enterprise.context.ApplicationScoped; -import org.jsoup.Jsoup; - -import java.net.URI; -import java.util.ArrayList; - -@ApplicationScoped -public class WordTranslationService { - - public WordDefinition translate(String word) throws Exception { - if (word == null || word.isEmpty()) { - throw new InvalidWordException("The word cannot be empty"); - } - - final var larousseUrl = URI.create("https://www.larousse.fr/dictionnaires/francais-anglais/" + word).toURL(); - final var doc = Jsoup.parse(larousseUrl, 10_000); - - final var defs = doc.select("li.itemZONESEM"); - final var wordDefs = new ArrayList(); - - for (final var def : defs) { - final var translation = def.selectFirst("span.Traduction"); - if (translation != null) { - wordDefs.add(translation.text()); - } - } - - return new WordDefinition( - word, - wordDefs - ); - } - -} diff --git a/src/main/java/net/frustratedfunctor/translations/JsoupWordTranslationRepository.java b/src/main/java/net/frustratedfunctor/translations/JsoupWordTranslationRepository.java new file mode 100644 index 0000000..553b645 --- /dev/null +++ b/src/main/java/net/frustratedfunctor/translations/JsoupWordTranslationRepository.java @@ -0,0 +1,36 @@ +package net.frustratedfunctor.translations; + +import io.quarkus.logging.Log; +import jakarta.enterprise.context.ApplicationScoped; +import org.jsoup.Jsoup; + +import java.net.URI; +import java.util.ArrayList; +import java.util.List; + +@ApplicationScoped +public class JsoupWordTranslationRepository implements WordTranslationRepository { + + @Override + public List translationsForWord(String word) { + try { + final var larousseUrl = URI.create("https://www.larousse.fr/dictionnaires/francais-anglais/" + word).toURL(); + final var doc = Jsoup.parse(larousseUrl, 10_000); + + final var defs = doc.select("li.itemZONESEM"); + final var wordDefs = new ArrayList(); + + for (final var def : defs) { + final var translation = def.selectFirst("span.Traduction"); + if (translation != null) { + wordDefs.add(translation.text()); + } + } + + return wordDefs; + } catch (Exception e) { + Log.error("", e); + return new ArrayList<>(); + } + } +} diff --git a/src/main/java/net/frustratedfunctor/WordDefinition.java b/src/main/java/net/frustratedfunctor/translations/WordTranslation.java similarity index 53% rename from src/main/java/net/frustratedfunctor/WordDefinition.java rename to src/main/java/net/frustratedfunctor/translations/WordTranslation.java index ed5d79b..85778fc 100644 --- a/src/main/java/net/frustratedfunctor/WordDefinition.java +++ b/src/main/java/net/frustratedfunctor/translations/WordTranslation.java @@ -1,8 +1,8 @@ -package net.frustratedfunctor; +package net.frustratedfunctor.translations; import java.util.List; -public record WordDefinition( +public record WordTranslation( String word, List definitions ) { diff --git a/src/main/java/net/frustratedfunctor/translations/WordTranslationRepository.java b/src/main/java/net/frustratedfunctor/translations/WordTranslationRepository.java new file mode 100644 index 0000000..dc73314 --- /dev/null +++ b/src/main/java/net/frustratedfunctor/translations/WordTranslationRepository.java @@ -0,0 +1,15 @@ +package net.frustratedfunctor.translations; + +import java.util.List; + +public interface WordTranslationRepository { + + /** + * Get the list of translations for the given word. + * + * @param word The word to translate. + * @return A list of all available translations for the given word. + */ + List translationsForWord(String word); + +} diff --git a/src/main/java/net/frustratedfunctor/WordTranslationResource.java b/src/main/java/net/frustratedfunctor/translations/WordTranslationResource.java similarity index 69% rename from src/main/java/net/frustratedfunctor/WordTranslationResource.java rename to src/main/java/net/frustratedfunctor/translations/WordTranslationResource.java index 5145dfe..3d35730 100644 --- a/src/main/java/net/frustratedfunctor/WordTranslationResource.java +++ b/src/main/java/net/frustratedfunctor/translations/WordTranslationResource.java @@ -1,4 +1,4 @@ -package net.frustratedfunctor; +package net.frustratedfunctor.translations; import jakarta.ws.rs.GET; @@ -18,9 +18,8 @@ public class WordTranslationResource { @GET @Produces(MediaType.APPLICATION_JSON) - public WordDefinition translate(@RestQuery("q") String word) throws Exception { - final var definition = words.translate(word); - return definition; + public WordTranslation translate(@RestQuery("q") String word) { + return words.translate(word); } } diff --git a/src/main/java/net/frustratedfunctor/translations/WordTranslationService.java b/src/main/java/net/frustratedfunctor/translations/WordTranslationService.java new file mode 100644 index 0000000..b98c68d --- /dev/null +++ b/src/main/java/net/frustratedfunctor/translations/WordTranslationService.java @@ -0,0 +1,28 @@ +package net.frustratedfunctor.translations; + +import jakarta.enterprise.context.ApplicationScoped; +import net.frustratedfunctor.InvalidWordException; + +@ApplicationScoped +public class WordTranslationService { + + private final WordTranslationRepository repository; + + public WordTranslationService(WordTranslationRepository repository) { + this.repository = repository; + } + + public WordTranslation translate(String word) { + if (word == null || word.isEmpty()) { + throw new InvalidWordException("The word cannot be empty"); + } + + final var wordDefs = repository.translationsForWord(word); + + return new WordTranslation( + word, + wordDefs + ); + } + +} -- 2.43.0