Skip to content

Commit

Permalink
Validate required options
Browse files Browse the repository at this point in the history
  • Loading branch information
André Laugks committed Apr 10, 2024
1 parent 90582d4 commit 3450536
Show file tree
Hide file tree
Showing 6 changed files with 64 additions and 102 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -5,14 +5,19 @@
import io.github.alaugks.spring.messagesource.xliff.catalog.xliff.XliffIdentifierInterface;
import io.github.alaugks.spring.messagesource.xliff.ressources.ResourcesLoader;
import java.text.MessageFormat;
import java.util.HashSet;
import java.util.List;
import java.util.Locale;
import java.util.Set;
import java.util.stream.Collectors;
import java.util.stream.StreamSupport;
import org.springframework.cache.Cache;
import org.springframework.context.MessageSource;
import org.springframework.context.MessageSourceResolvable;
import org.springframework.context.NoSuchMessageException;
import org.springframework.context.support.DefaultMessageSourceResolvable;
import org.springframework.lang.Nullable;
import org.springframework.util.Assert;

public class XliffTranslationMessageSource implements MessageSource {

Expand All @@ -22,8 +27,6 @@ private XliffTranslationMessageSource(Builder builder) {
ResourcesLoader resourcesLoader = ResourcesLoader
.builder()
.defaultLocale(builder.defaultLocale)
.defaultDomain(builder.defaultDomain)
.basenamePattern(builder.basename)
.basenamesPattern(builder.basenames)
.build();

Expand All @@ -44,8 +47,7 @@ public static final class Builder {

private final Cache cache;
private Locale defaultLocale;
private String basename;
private Iterable<String> basenames;
private final Set<String> basenames = new HashSet<>();
private String defaultDomain = "messages";
private List<XliffIdentifierInterface> transUnitIdentifier;

Expand All @@ -59,12 +61,19 @@ public Builder defaultLocale(Locale locale) {
}

public Builder basenamePattern(String basename) {
this.basename = basename;
this.basenamesPattern(List.of(basename));
return this;
}

public Builder basenamesPattern(Iterable<String> basenames) {
this.basenames = basenames;
if (basenames != null) {
Set<String> basenamesSet = StreamSupport.stream(basenames.spliterator(), false)
.collect(Collectors.toSet());
for (String basename : basenamesSet) {
Assert.hasText(basename, "Basename must not be empty");
this.basenames.add(basename.trim());
}
}
return this;
}

Expand All @@ -79,6 +88,18 @@ public Builder setTransUnitIdentifier(List<XliffIdentifierInterface> transUnitId
}

public XliffTranslationMessageSource build() {
// Default Domain
Assert.notNull(this.defaultDomain, "Default domain is null");
Assert.isTrue(!this.defaultDomain.trim().isEmpty(), "Default domain is empty");

// Default Locale
Assert.notNull(this.defaultLocale, "Default locale is null");
Assert.isTrue(!this.defaultLocale.toString().trim().isEmpty(), "Default locale is empty");

// Basenames
Assert.notEmpty(this.basenames, "Basename(s) is not set");


return new XliffTranslationMessageSource(this);
}
}
Expand Down
Original file line number Diff line number Diff line change
@@ -1,76 +1,54 @@
package io.github.alaugks.spring.messagesource.xliff.ressources;

import io.github.alaugks.spring.messagesource.xliff.exception.XliffMessageSourceRuntimeException;
import java.io.IOException;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.List;
import java.util.Locale;
import java.util.Optional;
import java.util.Set;
import org.springframework.core.io.Resource;
import org.springframework.core.io.support.PathMatchingResourcePatternResolver;
import org.springframework.util.Assert;

import java.io.IOException;
import java.io.InputStream;
import java.util.*;
;

public final class ResourcesLoader {

private final Locale defaultLocale;
private final Set<String> basenameSet;
private final Set<String> basenames;
private final List<String> fileExtensions = List.of("xlf", "xliff");

private ResourcesLoader(ResourcesLoader.Builder builder) {
this.defaultLocale = builder.defaultLocale;
this.basenameSet = builder.basenameSet;
this.basenames = builder.basenames;
}

public static ResourcesLoader.Builder builder() {
return new ResourcesLoader.Builder();
}

public static final class Builder {
Locale defaultLocale;
String defaultDomain;
private final Set<String> basenameSet = new LinkedHashSet<>();

private Locale defaultLocale;
private Set<String> basenames;

public ResourcesLoader.Builder defaultLocale(Locale locale) {
this.defaultLocale = locale;
return this;
}

public ResourcesLoader.Builder defaultDomain(String defaultDomain) {
this.defaultDomain = defaultDomain;
return this;
}

public ResourcesLoader.Builder basenamePattern(String basename) {
if (basename != null) {
this.basenamesPattern(List.of(basename));
}
public ResourcesLoader.Builder basenamesPattern(Set<String> basenames) {
this.basenames = basenames;
return this;
}

public ResourcesLoader.Builder basenamesPattern(Iterable<String> basenames) {
if (basenames != null) {
this.basenameSet.clear();
this.addBasenames(basenames);
}
return this;
}

private void addBasenames(Iterable<String> basenames) {
for (String basename : basenames) {
Assert.hasText(basename, "Basename must not be empty");
this.basenameSet.add(basename.trim());
}
}

public ResourcesLoader build() {
return new ResourcesLoader(this);
}

}

public List<Dto> getTranslationFiles() throws IOException {
if (this.defaultLocale == null || this.defaultLocale.toString().isEmpty()) {
throw new XliffMessageSourceRuntimeException("Default language is not set or empty.");
}
ArrayList<Dto> translationFiles = new ArrayList<>();
PathMatchingResourcePatternResolver resourceLoader = new PathMatchingResourcePatternResolver();
for (String basename : getBasenameSet()) {
Expand Down Expand Up @@ -138,6 +116,6 @@ private String getFileExtension(String filename) {
}

private Set<String> getBasenameSet() {
return this.basenameSet;
return this.basenames;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -5,11 +5,14 @@
import io.github.alaugks.spring.messagesource.xliff.ressources.ResourcesLoader;
import java.io.IOException;
import java.io.InputStream;
import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
import java.util.Locale;
import java.util.Map;
import java.util.Set;
import java.util.concurrent.ConcurrentHashMap;
import java.util.stream.Collectors;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
Expand All @@ -36,10 +39,6 @@ public static Cache getCache() {
return getMockedCacheManager(CATALOG_CACHE).getCache(CATALOG_CACHE);
}

public static CacheManager getMockedCacheManager() {
return getMockedCacheManager(CATALOG_CACHE);
}

public static CacheManager getMockedCacheManager(String cacheName) {
ConcurrentMapCacheManager cacheManager = new ConcurrentMapCacheManager();
cacheManager.setCacheNames(List.of(cacheName));
Expand All @@ -50,7 +49,7 @@ public static ResourcesLoader getResourcesLoader() {
return ResourcesLoader
.builder()
.defaultLocale(Locale.forLanguageTag("en"))
.basenamePattern("translations/*")
.basenamesPattern(listToSet("translations/*"))
.build();
}

Expand All @@ -69,4 +68,8 @@ public static Map<Object, Object> cacheToArray(Cache cache) {
return new HashMap<>(nativeCache);
}

public static Set<String> listToSet(String... list) {
return Arrays.stream(list).collect(Collectors.toSet());
}

}
Original file line number Diff line number Diff line change
@@ -1,40 +1,13 @@
package io.github.alaugks.spring.messagesource.xliff;

import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.junit.jupiter.api.Assertions.assertThrows;

import io.github.alaugks.spring.messagesource.xliff.exception.XliffMessageSourceRuntimeException;
import java.util.List;
import java.util.Locale;
import org.junit.jupiter.api.Test;

class XliffTranslationMessageSourceCasesTest {

@Test
void test_withRegion_setDefaultLocale_notSet() {
var builder = XliffTranslationMessageSource
.builder(TestUtilities.getCache())
.basenamePattern("translations/*");

XliffMessageSourceRuntimeException exception = assertThrows(
XliffMessageSourceRuntimeException.class, builder::build
);
assertEquals("Default language is not set or empty.", exception.getMessage());
}

@Test
void test_withRegion_setDefaultLocale_empty() {
var builder = XliffTranslationMessageSource
.builder(TestUtilities.getCache())
.basenamePattern("translations/*")
.defaultLocale(Locale.forLanguageTag(""));

XliffMessageSourceRuntimeException exception = assertThrows(
XliffMessageSourceRuntimeException.class, builder::build
);
assertEquals("Default language is not set or empty.", exception.getMessage());
}

@Test
void test_setDefaultDomain() {
var messageSource = XliffTranslationMessageSource
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@
import static org.junit.jupiter.api.Assertions.assertNull;
import static org.junit.jupiter.api.Assertions.assertThrows;

import io.github.alaugks.spring.messagesource.xliff.TestUtilities;
import io.github.alaugks.spring.messagesource.xliff.catalog.Catalog;
import io.github.alaugks.spring.messagesource.xliff.catalog.CatalogBuilder;
import io.github.alaugks.spring.messagesource.xliff.catalog.CatalogInterface;
Expand All @@ -22,7 +23,7 @@ void test_createCatalog() {
ResourcesLoader resourcesLoader = ResourcesLoader
.builder()
.defaultLocale(Locale.forLanguageTag("en"))
.basenamePattern("translations/*")
.basenamesPattern(TestUtilities.listToSet("translations/*"))
.build();

CatalogBuilder catalogBuilder = CatalogBuilder
Expand All @@ -39,7 +40,7 @@ void test_createCatalog_versionNotSupported() {
ResourcesLoader resourcesLoader = ResourcesLoader
.builder()
.defaultLocale(Locale.forLanguageTag("en-GB"))
.basenamePattern("fixtures/*")
.basenamesPattern(TestUtilities.listToSet("fixtures/*"))
.build();

CatalogBuilder catalogBuilder = CatalogBuilder
Expand All @@ -61,7 +62,7 @@ void test_createCatalog_parseError() {
ResourcesLoader resourcesLoader = ResourcesLoader
.builder()
.defaultLocale(Locale.forLanguageTag("en"))
.basenamePattern("translations_broken/*")
.basenamesPattern(TestUtilities.listToSet("translations_broken/*"))
.build();

CatalogBuilder catalogBuilder = CatalogBuilder
Expand Down
Original file line number Diff line number Diff line change
@@ -1,14 +1,13 @@
package io.github.alaugks.spring.messagesource.xliff.ressources;

import org.junit.jupiter.api.Test;
import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.junit.jupiter.api.Assertions.assertInstanceOf;

import io.github.alaugks.spring.messagesource.xliff.TestUtilities;
import java.io.IOException;
import java.io.InputStream;
import java.util.List;
import java.util.Locale;

import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.junit.jupiter.api.Assertions.assertInstanceOf;
import org.junit.jupiter.api.Test;

class ResourcesLoaderTest {

Expand All @@ -17,9 +16,7 @@ void test_setBasenamePattern() throws IOException {
ResourcesLoader resourcesLoader = ResourcesLoader
.builder()
.defaultLocale(Locale.forLanguageTag("en"))
.basenamePattern(
"translations/*"
)
.basenamesPattern(TestUtilities.listToSet("translations/*"))
.build();

assertEquals(5, resourcesLoader.getTranslationFiles().size());
Expand All @@ -30,9 +27,7 @@ void test_setBasenamePattern_domainMessages() throws IOException {
ResourcesLoader resourcesLoader = ResourcesLoader
.builder()
.defaultLocale(Locale.forLanguageTag("en"))
.basenamePattern(
"translations/messages*"
)
.basenamesPattern(TestUtilities.listToSet("translations/messages*"))
.build();

assertEquals(3, resourcesLoader.getTranslationFiles().size());
Expand All @@ -44,9 +39,7 @@ void test_setBasenamePattern_languageDe() throws IOException {
ResourcesLoader resourcesLoader = ResourcesLoader
.builder()
.defaultLocale(Locale.forLanguageTag("en"))
.basenamePattern(
"translations/*_de*"
)
.basenamesPattern(TestUtilities.listToSet("translations/*_de*"))
.build();

assertEquals(2, resourcesLoader.getTranslationFiles().size());
Expand All @@ -57,12 +50,7 @@ void test_setBasenamesPattern() throws IOException {
ResourcesLoader resourcesLoader = ResourcesLoader
.builder()
.defaultLocale(Locale.forLanguageTag("en"))
.basenamesPattern(
List.of(
"translations_en/*",
"translations_de/*"
)
)
.basenamesPattern(TestUtilities.listToSet("translations_en/*", "translations_de/*"))
.build();

assertEquals(4, resourcesLoader.getTranslationFiles().size());
Expand All @@ -73,9 +61,7 @@ void test_Dto() throws IOException {
ResourcesLoader resourcesLoader = ResourcesLoader
.builder()
.defaultLocale(Locale.forLanguageTag("en"))
.basenamePattern(
"translations_en_US/*"
)
.basenamesPattern(TestUtilities.listToSet("translations_en_US/*"))
.build();

ResourcesLoader.Dto dto = resourcesLoader.getTranslationFiles().get(0);
Expand Down

0 comments on commit 3450536

Please sign in to comment.