summaryrefslogtreecommitdiff
path: root/src/main/java/dev/dnpm/oshelper/atc/services
diff options
context:
space:
mode:
authorPaul-Christian Volkmer2026-09-03 14:35:10 +0200
committerGitHub2026-09-03 14:35:10 +0200
commitfb91356b7777dfa5b6088bcc3a48b43924c1c0fd (patch)
treea3d384390e388395953865a286f15292aaa04a86 /src/main/java/dev/dnpm/oshelper/atc/services
parent59daf77a63bd17bb14248cf9881046dd6b331e2a (diff)
build: apply Spotless plugin (#293)
Diffstat (limited to 'src/main/java/dev/dnpm/oshelper/atc/services')
-rw-r--r--src/main/java/dev/dnpm/oshelper/atc/services/AgentCodeService.java126
-rw-r--r--src/main/java/dev/dnpm/oshelper/atc/services/CsvAgentCodeService.java119
-rw-r--r--src/main/java/dev/dnpm/oshelper/atc/services/OnkostarAgentCodeService.java79
3 files changed, 162 insertions, 162 deletions
diff --git a/src/main/java/dev/dnpm/oshelper/atc/services/AgentCodeService.java b/src/main/java/dev/dnpm/oshelper/atc/services/AgentCodeService.java
index b074364..f1dc2e2 100644
--- a/src/main/java/dev/dnpm/oshelper/atc/services/AgentCodeService.java
+++ b/src/main/java/dev/dnpm/oshelper/atc/services/AgentCodeService.java
@@ -19,17 +19,15 @@
package dev.dnpm.oshelper.atc.services;
+import static java.util.stream.Collectors.groupingBy;
import dev.dnpm.oshelper.atc.AgentCode;
-import org.jspecify.annotations.NullMarked;
-
import java.util.Comparator;
import java.util.List;
import java.util.Objects;
import java.util.function.Function;
import java.util.stream.Collectors;
-
-import static java.util.stream.Collectors.groupingBy;
+import org.jspecify.annotations.NullMarked;
/**
* Common interface for agent code services
@@ -39,69 +37,67 @@ import static java.util.stream.Collectors.groupingBy;
*/
public interface AgentCodeService {
- /**
- * Filters the provided list of AgentCodes to include only the latest available versions
- * for each unique code name and, if required, code.
- * If the input list is empty or null, an empty list will be returned.
- *
- * @param agentCodes A list of {@link AgentCode} objects to be filtered. Each object in the list
- * should contain information about the agent's code, name, system, and version.
- * @param classifier A function that returns a string value to be used as a key for grouping agent codes.
- * @return A list of {@link AgentCode} objects representing the latest available versions of unique agent codes.
- * If no valid inputs are provided, an empty list is returned.
- */
- @NullMarked
- static List<AgentCode> latestAgentCodeVersions(List<AgentCode> agentCodes, Function<AgentCode, String> classifier) {
- return latestAvailable(agentCodes, classifier);
- }
-
- /**
- * Function that extracts the name of an {@link AgentCode} object.
- * This function is used as a classifier for grouping agent codes by their name.
- */
- Function<AgentCode, String> byCodeOnly = AgentCode::getName;
+ /**
+ * Filters the provided list of AgentCodes to include only the latest available versions for each
+ * unique code name and, if required, code. If the input list is empty or null, an empty list will
+ * be returned.
+ *
+ * @param agentCodes A list of {@link AgentCode} objects to be filtered. Each object in the list
+ * should contain information about the agent's code, name, system, and version.
+ * @param classifier A function that returns a string value to be used as a key for grouping agent
+ * codes.
+ * @return A list of {@link AgentCode} objects representing the latest available versions of
+ * unique agent codes. If no valid inputs are provided, an empty list is returned.
+ */
+ @NullMarked
+ static List<AgentCode> latestAgentCodeVersions(
+ List<AgentCode> agentCodes, Function<AgentCode, String> classifier) {
+ return latestAvailable(agentCodes, classifier);
+ }
- /**
- * Function that extracts the name and code of an {@link AgentCode} object.
- * This function is used as a classifier for grouping agent codes by their name and code.
- */
- Function<AgentCode, String> byNameAndCode = (agentCode ->
- String.format("%s_%s", agentCode.getCode(), agentCode.getName())
- );
+ /**
+ * Function that extracts the name of an {@link AgentCode} object. This function is used as a
+ * classifier for grouping agent codes by their name.
+ */
+ Function<AgentCode, String> byCodeOnly = AgentCode::getName;
+ /**
+ * Function that extracts the name and code of an {@link AgentCode} object. This function is used
+ * as a classifier for grouping agent codes by their name and code.
+ */
+ Function<AgentCode, String> byNameAndCode =
+ (agentCode -> String.format("%s_%s", agentCode.getCode(), agentCode.getName()));
- @NullMarked
- private static List<AgentCode> latestAvailable(
- List<AgentCode> agentCodes,
- Function<AgentCode, String> classifier
- ) {
- return agentCodes.stream()
- .collect(groupingBy(classifier)).values().stream()
- .map(list ->
- list.stream()
- .sorted(Comparator.comparing(AgentCode::getCode))
- .max((ac1, ac2) -> {
- if (null == ac1.getVersion()) {
- return -1;
- } else if (null == ac2.getVersion()) {
- return 1;
- }
- return ac1.getVersion().compareTo(ac2.getVersion());
- })
- .orElse(null)
- )
- .filter(Objects::nonNull)
- .distinct()
- .collect(Collectors.toList());
- }
+ @NullMarked
+ private static List<AgentCode> latestAvailable(
+ List<AgentCode> agentCodes, Function<AgentCode, String> classifier) {
+ return agentCodes.stream().collect(groupingBy(classifier)).values().stream()
+ .map(
+ list ->
+ list.stream()
+ .sorted(Comparator.comparing(AgentCode::getCode))
+ .max(
+ (ac1, ac2) -> {
+ if (null == ac1.getVersion()) {
+ return -1;
+ } else if (null == ac2.getVersion()) {
+ return 1;
+ }
+ return ac1.getVersion().compareTo(ac2.getVersion());
+ })
+ .orElse(null))
+ .filter(Objects::nonNull)
+ .distinct()
+ .collect(Collectors.toList());
+ }
- /**
- * Queries source for agents with name and code starting with query string.
- * If size is zero, all available results will be returned.
- *
- * @param query The query string
- * @param size Maximal amount of responses
- * @return A list with agent codes
- */
- List<AgentCode> findAgentCodes(String query, int size);
+ /**
+ * Queries source for agents with name and code starting with query string. If size is zero, all
+ * available results will be returned.
+ *
+ * @param query The query string
+ * @param size Maximal amount of responses
+ * @return A list with agent codes
+ */
+ List<AgentCode> findAgentCodes(String query, int size);
}
diff --git a/src/main/java/dev/dnpm/oshelper/atc/services/CsvAgentCodeService.java b/src/main/java/dev/dnpm/oshelper/atc/services/CsvAgentCodeService.java
index cf80738..abb006b 100644
--- a/src/main/java/dev/dnpm/oshelper/atc/services/CsvAgentCodeService.java
+++ b/src/main/java/dev/dnpm/oshelper/atc/services/CsvAgentCodeService.java
@@ -22,17 +22,15 @@ package dev.dnpm.oshelper.atc.services;
import dev.dnpm.oshelper.atc.AgentCode;
import dev.dnpm.oshelper.atc.AtcCode;
import dev.dnpm.oshelper.exceptions.FileParsingException;
-import org.apache.commons.csv.CSVFormat;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.springframework.stereotype.Service;
-
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.List;
import java.util.Objects;
import java.util.stream.Collectors;
+import org.apache.commons.csv.CSVFormat;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
/**
* Service to query for agent codes based on ATC codes file
@@ -42,65 +40,72 @@ import java.util.stream.Collectors;
*/
public class CsvAgentCodeService implements AgentCodeService {
- protected final Logger logger = LoggerFactory.getLogger(this.getClass());
- protected final List<AgentCode> codeList = new ArrayList<>();
+ protected final Logger logger = LoggerFactory.getLogger(this.getClass());
+ protected final List<AgentCode> codeList = new ArrayList<>();
- private static final String ATC_CODE_COLUMN = "ATC-Code";
- private static final String ATC_NAME_COLUMN = "ATC-Bedeutung";
- private static final String ATC_VERSION_COLUMN = "Version";
+ private static final String ATC_CODE_COLUMN = "ATC-Code";
+ private static final String ATC_NAME_COLUMN = "ATC-Bedeutung";
+ private static final String ATC_VERSION_COLUMN = "Version";
- public CsvAgentCodeService() {
- this.codeList.addAll(parseFile());
- }
+ public CsvAgentCodeService() {
+ this.codeList.addAll(parseFile());
+ }
- /**
- * Queries source for agents code starting with or name containing query string.
- * If size is zero, all available results will be returned.
- *
- * @param query The query string
- * @param size Maximal amount of responses
- * @return A list with agent codes
- */
- @Override
- public List<AgentCode> findAgentCodes(final String query, final int size) {
- var resultStream = this.codeList.stream().filter(agentCode ->
- agentCode.getCode().toLowerCase().startsWith(query.toLowerCase())
- || agentCode.getName().toLowerCase().contains(query.toLowerCase())
- );
+ /**
+ * Queries source for agents code starting with or name containing query string. If size is zero,
+ * all available results will be returned.
+ *
+ * @param query The query string
+ * @param size Maximal amount of responses
+ * @return A list with agent codes
+ */
+ @Override
+ public List<AgentCode> findAgentCodes(final String query, final int size) {
+ var resultStream =
+ this.codeList.stream()
+ .filter(
+ agentCode ->
+ agentCode.getCode().toLowerCase().startsWith(query.toLowerCase())
+ || agentCode.getName().toLowerCase().contains(query.toLowerCase()));
- if (size > 0) {
- return resultStream.limit(size).collect(Collectors.toList());
- }
- return resultStream.collect(Collectors.toList());
+ if (size > 0) {
+ return resultStream.limit(size).collect(Collectors.toList());
}
+ return resultStream.collect(Collectors.toList());
+ }
- protected List<AgentCode> parseFile() {
- var result = new ArrayList<AgentCode>();
+ protected List<AgentCode> parseFile() {
+ var result = new ArrayList<AgentCode>();
- try {
- var inputStream = Objects.requireNonNull(this.getClass().getClassLoader().getResourceAsStream("atc.csv"));
- var parser = CSVFormat.RFC4180
- .withHeader()
- .withDelimiter('\t')
- .withIgnoreEmptyLines()
- .withSkipHeaderRecord()
- .parse(new InputStreamReader(inputStream));
- for (var row : parser) {
- if (!row.isMapped(ATC_CODE_COLUMN) || !row.isMapped(ATC_NAME_COLUMN)) {
- throw new FileParsingException("No CSV column for ATC code or name found");
- }
- if (row.isMapped(ATC_VERSION_COLUMN)) {
- result.add(new AtcCode(row.get(ATC_CODE_COLUMN).trim(), row.get(ATC_NAME_COLUMN), row.get(ATC_VERSION_COLUMN)));
- } else {
- result.add(new AtcCode(row.get(ATC_CODE_COLUMN).trim(), row.get(ATC_NAME_COLUMN)));
- }
- }
- return result;
- } catch (IOException | FileParsingException e) {
- logger.warn("Error reading information from ATC codes");
+ try {
+ var inputStream =
+ Objects.requireNonNull(this.getClass().getClassLoader().getResourceAsStream("atc.csv"));
+ var parser =
+ CSVFormat.RFC4180
+ .withHeader()
+ .withDelimiter('\t')
+ .withIgnoreEmptyLines()
+ .withSkipHeaderRecord()
+ .parse(new InputStreamReader(inputStream));
+ for (var row : parser) {
+ if (!row.isMapped(ATC_CODE_COLUMN) || !row.isMapped(ATC_NAME_COLUMN)) {
+ throw new FileParsingException("No CSV column for ATC code or name found");
}
- logger.info("Found {} ATC codes", result.size());
- return result;
+ if (row.isMapped(ATC_VERSION_COLUMN)) {
+ result.add(
+ new AtcCode(
+ row.get(ATC_CODE_COLUMN).trim(),
+ row.get(ATC_NAME_COLUMN),
+ row.get(ATC_VERSION_COLUMN)));
+ } else {
+ result.add(new AtcCode(row.get(ATC_CODE_COLUMN).trim(), row.get(ATC_NAME_COLUMN)));
+ }
+ }
+ return result;
+ } catch (IOException | FileParsingException e) {
+ logger.warn("Error reading information from ATC codes");
}
-
+ logger.info("Found {} ATC codes", result.size());
+ return result;
+ }
}
diff --git a/src/main/java/dev/dnpm/oshelper/atc/services/OnkostarAgentCodeService.java b/src/main/java/dev/dnpm/oshelper/atc/services/OnkostarAgentCodeService.java
index 306563d..0dfb1e6 100644
--- a/src/main/java/dev/dnpm/oshelper/atc/services/OnkostarAgentCodeService.java
+++ b/src/main/java/dev/dnpm/oshelper/atc/services/OnkostarAgentCodeService.java
@@ -22,10 +22,9 @@ package dev.dnpm.oshelper.atc.services;
import dev.dnpm.oshelper.atc.AgentCode;
import dev.dnpm.oshelper.atc.AtcCode;
import dev.dnpm.oshelper.atc.UnregisteredCode;
-import org.springframework.jdbc.core.JdbcTemplate;
-
-import javax.sql.DataSource;
import java.util.List;
+import javax.sql.DataSource;
+import org.springframework.jdbc.core.JdbcTemplate;
/**
* Implementation of {@link AgentCodeService} that uses database to query for unregistered agents
@@ -35,45 +34,45 @@ import java.util.List;
*/
public class OnkostarAgentCodeService implements AgentCodeService {
- private final JdbcTemplate jdbcTemplate;
-
- public OnkostarAgentCodeService(final DataSource dataSource) {
- this.jdbcTemplate = new JdbcTemplate(dataSource);
- }
+ private final JdbcTemplate jdbcTemplate;
- /**
- * Queries source for agents code starting with or name containing query string.
- * If size is zero, all available results will be returned.
- *
- * @param query The query string
- * @param size Maximal amount of responses
- * @return A list with agent codes
- */
- @Override
- public List<AgentCode> findAgentCodes(final String query, final int size) {
- var sql = "SELECT code, shortdesc, synonyms\n" +
- " FROM property_catalogue\n" +
- " JOIN property_catalogue_version ON (property_catalogue_version.datacatalog_id = property_catalogue.id)\n" +
- " JOIN property_catalogue_version_entry p ON (p.property_version_id = property_catalogue_version.id)\n" +
- " WHERE name = 'OS.Substanzen'\n" +
- " AND (LOWER(code) LIKE ? OR LOWER(shortdesc) LIKE ? OR LOWER(synonyms) LIKE ?)";
+ public OnkostarAgentCodeService(final DataSource dataSource) {
+ this.jdbcTemplate = new JdbcTemplate(dataSource);
+ }
- if (size > 0) {
- sql = sql + " LIMIT " + size;
- }
+ /**
+ * Queries source for agents code starting with or name containing query string. If size is zero,
+ * all available results will be returned.
+ *
+ * @param query The query string
+ * @param size Maximal amount of responses
+ * @return A list with agent codes
+ */
+ @Override
+ public List<AgentCode> findAgentCodes(final String query, final int size) {
+ var sql =
+ "SELECT code, shortdesc, synonyms\n"
+ + " FROM property_catalogue\n"
+ + " JOIN property_catalogue_version ON (property_catalogue_version.datacatalog_id = property_catalogue.id)\n"
+ + " JOIN property_catalogue_version_entry p ON (p.property_version_id = property_catalogue_version.id)\n"
+ + " WHERE name = 'OS.Substanzen'\n"
+ + " AND (LOWER(code) LIKE ? OR LOWER(shortdesc) LIKE ? OR LOWER(synonyms) LIKE ?)";
- return jdbcTemplate.query(
- sql,
- new Object[]{query + "%", "%" + query + "%", "%" + query + "%"},
- (resultSet, i) -> {
- var code = resultSet.getString("code");
- var shortdesc = resultSet.getString("shortdesc");
- var synonyms = resultSet.getString("synonyms");
- if (AtcCode.isAtcCode(code)) {
- return new AtcCode(code, shortdesc);
- }
- return new UnregisteredCode(code, shortdesc, synonyms);
- }
- );
+ if (size > 0) {
+ sql = sql + " LIMIT " + size;
}
+
+ return jdbcTemplate.query(
+ sql,
+ new Object[] {query + "%", "%" + query + "%", "%" + query + "%"},
+ (resultSet, i) -> {
+ var code = resultSet.getString("code");
+ var shortdesc = resultSet.getString("shortdesc");
+ var synonyms = resultSet.getString("synonyms");
+ if (AtcCode.isAtcCode(code)) {
+ return new AtcCode(code, shortdesc);
+ }
+ return new UnregisteredCode(code, shortdesc, synonyms);
+ });
+ }
}