From 352c2818f7d3474e891891d10575c76a79011681 Mon Sep 17 00:00:00 2001 From: Alexander Goussas Date: Sun, 17 May 2026 23:00:47 -0500 Subject: [PATCH] feat: add application skeleton classes --- .../io/github/aloussase/GreetingResource.java | 16 -------- .../controller/SearchResource.java | 23 ++++++++++++ .../io/github/aloussase/config/AppConfig.java | 18 +++++++++ .../aloussase/domain/entity/MastersInfo.java | 9 +++++ .../domain/repository/CompositeSource.java | 37 +++++++++++++++++++ .../domain/repository/LocalSource.java | 4 ++ .../domain/repository/RemoteSource.java | 8 ++++ .../aloussase/domain/repository/Source.java | 15 ++++++++ .../domain/service/SearchService.java | 19 ++++++++++ 9 files changed, 133 insertions(+), 16 deletions(-) delete mode 100644 src/main/java/io/github/aloussase/GreetingResource.java create mode 100644 src/main/java/io/github/aloussase/application/controller/SearchResource.java create mode 100644 src/main/java/io/github/aloussase/config/AppConfig.java create mode 100644 src/main/java/io/github/aloussase/domain/entity/MastersInfo.java create mode 100644 src/main/java/io/github/aloussase/domain/repository/CompositeSource.java create mode 100644 src/main/java/io/github/aloussase/domain/repository/LocalSource.java create mode 100644 src/main/java/io/github/aloussase/domain/repository/RemoteSource.java create mode 100644 src/main/java/io/github/aloussase/domain/repository/Source.java create mode 100644 src/main/java/io/github/aloussase/domain/service/SearchService.java diff --git a/src/main/java/io/github/aloussase/GreetingResource.java b/src/main/java/io/github/aloussase/GreetingResource.java deleted file mode 100644 index 9ac0cc9..0000000 --- a/src/main/java/io/github/aloussase/GreetingResource.java +++ /dev/null @@ -1,16 +0,0 @@ -package io.github.aloussase; - -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/io/github/aloussase/application/controller/SearchResource.java b/src/main/java/io/github/aloussase/application/controller/SearchResource.java new file mode 100644 index 0000000..5098bce --- /dev/null +++ b/src/main/java/io/github/aloussase/application/controller/SearchResource.java @@ -0,0 +1,23 @@ +package io.github.aloussase.application.controller; + +import io.github.aloussase.domain.service.SearchService; +import jakarta.ws.rs.GET; +import jakarta.ws.rs.Path; +import jakarta.ws.rs.Produces; +import jakarta.ws.rs.core.MediaType; + +@Path("/search") +public class SearchResource { + + private final SearchService searchService; + + public SearchResource(SearchService searchService) { + this.searchService = searchService; + } + + @GET + @Produces(MediaType.TEXT_PLAIN) + public String search() { + return "Hello from Quarkus REST"; + } +} diff --git a/src/main/java/io/github/aloussase/config/AppConfig.java b/src/main/java/io/github/aloussase/config/AppConfig.java new file mode 100644 index 0000000..bcbf3a4 --- /dev/null +++ b/src/main/java/io/github/aloussase/config/AppConfig.java @@ -0,0 +1,18 @@ +package io.github.aloussase.config; + +import io.github.aloussase.domain.repository.CompositeSource; +import io.github.aloussase.domain.service.SearchService; +import jakarta.enterprise.context.ApplicationScoped; +import jakarta.ws.rs.Produces; + + +public class AppConfig { + + @Produces + @ApplicationScoped + public SearchService providesSearchService() { + final var cs = new CompositeSource(); + return new SearchService(cs); + } + +} diff --git a/src/main/java/io/github/aloussase/domain/entity/MastersInfo.java b/src/main/java/io/github/aloussase/domain/entity/MastersInfo.java new file mode 100644 index 0000000..e44125a --- /dev/null +++ b/src/main/java/io/github/aloussase/domain/entity/MastersInfo.java @@ -0,0 +1,9 @@ +package io.github.aloussase.domain.entity; + +public record MastersInfo( + String mastersName, + String shortDescription, + String institution, + String infoUrl +) { +} diff --git a/src/main/java/io/github/aloussase/domain/repository/CompositeSource.java b/src/main/java/io/github/aloussase/domain/repository/CompositeSource.java new file mode 100644 index 0000000..02a7fbf --- /dev/null +++ b/src/main/java/io/github/aloussase/domain/repository/CompositeSource.java @@ -0,0 +1,37 @@ +package io.github.aloussase.domain.repository; + +import io.github.aloussase.domain.entity.MastersInfo; + +import java.util.Collections; +import java.util.List; + +/** + * A {@link Source} that can invoke multiple other sources. + */ +public class CompositeSource implements Source { + private List sources; + + /** + * Add a new source. + * + * @param source The source to add. + * @return The {@code CompositeSource} instance for fluent chaining. + */ + public CompositeSource addSource(Source source) { + sources.add(source); + return this; + } + + public List getSources() { + return Collections.unmodifiableList(sources); + } + + @Override + public List search(String query) { + // TODO: Parallelize this. + return sources + .stream() + .flatMap(s -> s.search(query).stream()) + .toList(); + } +} diff --git a/src/main/java/io/github/aloussase/domain/repository/LocalSource.java b/src/main/java/io/github/aloussase/domain/repository/LocalSource.java new file mode 100644 index 0000000..22124b3 --- /dev/null +++ b/src/main/java/io/github/aloussase/domain/repository/LocalSource.java @@ -0,0 +1,4 @@ +package io.github.aloussase.domain.repository; + +public interface LocalSource extends Source { +} diff --git a/src/main/java/io/github/aloussase/domain/repository/RemoteSource.java b/src/main/java/io/github/aloussase/domain/repository/RemoteSource.java new file mode 100644 index 0000000..f7de707 --- /dev/null +++ b/src/main/java/io/github/aloussase/domain/repository/RemoteSource.java @@ -0,0 +1,8 @@ +package io.github.aloussase.domain.repository; + +/** + * A {@link Source} that works by fetching {@link io.github.aloussase.domain.entity.MastersInfo} + * from a third party provider via HTTP. + */ +public interface RemoteSource extends Source { +} diff --git a/src/main/java/io/github/aloussase/domain/repository/Source.java b/src/main/java/io/github/aloussase/domain/repository/Source.java new file mode 100644 index 0000000..4d92ac7 --- /dev/null +++ b/src/main/java/io/github/aloussase/domain/repository/Source.java @@ -0,0 +1,15 @@ +package io.github.aloussase.domain.repository; + +import io.github.aloussase.domain.entity.MastersInfo; + +import java.util.List; + +public interface Source { + /** + * Search for {@link MastersInfo} using the provided query. + * + * @param query A query to be interpreted by the implementation + * @return A list of masters info that matched the query. + */ + List search(String query); +} diff --git a/src/main/java/io/github/aloussase/domain/service/SearchService.java b/src/main/java/io/github/aloussase/domain/service/SearchService.java new file mode 100644 index 0000000..be2d642 --- /dev/null +++ b/src/main/java/io/github/aloussase/domain/service/SearchService.java @@ -0,0 +1,19 @@ +package io.github.aloussase.domain.service; + +import io.github.aloussase.domain.entity.MastersInfo; +import io.github.aloussase.domain.repository.Source; + +import java.util.List; + +public class SearchService { + + private final Source source; + + public SearchService(Source source) { + this.source = source; + } + + public List search(String query) { + return source.search(query); + } +} -- 2.43.0