Skip to content

Commit

Permalink
Change transUnitIdent handling
Browse files Browse the repository at this point in the history
  • Loading branch information
André Laugks committed Apr 5, 2024
1 parent 7e0202e commit ce81f9b
Show file tree
Hide file tree
Showing 14 changed files with 236 additions and 75 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -2,18 +2,18 @@

import io.github.alaugks.spring.messagesource.xliff.catalog.CatalogBuilder;
import io.github.alaugks.spring.messagesource.xliff.catalog.CatalogHandler;
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.List;
import java.util.Locale;
import org.springframework.cache.CacheManager;
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 java.text.MessageFormat;
import java.util.List;
import java.util.Locale;

public class XliffTranslationMessageSource implements MessageSource {

public static final String CACHE_NAME = "io.github.alaugks.spring.messagesource.xliff.cache";
Expand All @@ -31,7 +31,7 @@ private XliffTranslationMessageSource(Builder builder) {

this.catalogHandler = new CatalogHandler(
CatalogBuilder.builder(resourcesLoader)
.translationUnitIdentifiersOrdering(builder.translationUnitIdentifiers)
.transUnitIdentifier(builder.transUnitIdentifier)
.build(),
builder.defaultLocale,
builder.defaultDomain,
Expand All @@ -49,7 +49,7 @@ public static final class Builder {
private String basename;
private Iterable<String> basenames;
private String defaultDomain = "messages";
private List<String> translationUnitIdentifiers;
private List<XliffIdentifierInterface> transUnitIdentifier;

private Builder(CacheManager cacheManager) {
this.cacheManager = cacheManager;
Expand All @@ -75,12 +75,8 @@ public Builder defaultDomain(String defaultDomain) {
return this;
}

/**
* @deprecated Will be replaced with another method.
*/
@Deprecated(since = "2.0.1")
public Builder translationUnitIdentifiersOrdering(List<String> translationUnitIdentifiers) {
this.translationUnitIdentifiers = translationUnitIdentifiers;
public Builder setTransUnitIdentifier(List<XliffIdentifierInterface> transUnitIdentifier) {
this.transUnitIdentifier = transUnitIdentifier;
return this;
}

Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
package io.github.alaugks.spring.messagesource.xliff.catalog;

import io.github.alaugks.spring.messagesource.xliff.catalog.xliff.XliffDocument;
import io.github.alaugks.spring.messagesource.xliff.catalog.xliff.XliffIdentifierInterface;
import io.github.alaugks.spring.messagesource.xliff.catalog.xliff.XliffVersion12;
import io.github.alaugks.spring.messagesource.xliff.catalog.xliff.XliffVersion2;
import io.github.alaugks.spring.messagesource.xliff.catalog.xliff.XliffVersionInterface;
Expand All @@ -19,21 +20,20 @@
import javax.xml.parsers.ParserConfigurationException;
import java.io.IOException;
import java.util.List;
import java.util.Set;

public final class CatalogBuilder {

private final ResourcesLoader resourceLoader;
private Catalog catalog;
private final List<String> translationUnitIdentifiers;
Set<XliffVersionInterface> supportedVersions = Set.of(
private final List<XliffIdentifierInterface> transUnitIdentifier;
List<XliffVersionInterface> supportedVersions = List.of(
new XliffVersion12(),
new XliffVersion2()
);

public CatalogBuilder(Builder builder) {
this.resourceLoader = builder.resourceLoader;
this.translationUnitIdentifiers = builder.translationUnitIdentifiers;
this.transUnitIdentifier = builder.transUnitIdentifier;
}

public static Builder builder(ResourcesLoader resourceLoader) {
Expand All @@ -43,15 +43,15 @@ public static Builder builder(ResourcesLoader resourceLoader) {
public static final class Builder {

private final ResourcesLoader resourceLoader;
private List<String> translationUnitIdentifiers;
private List<XliffIdentifierInterface> transUnitIdentifier;

private Builder(ResourcesLoader resourceLoader) {
this.resourceLoader = resourceLoader;
}

public Builder translationUnitIdentifiersOrdering(List<String> translationUnitIdentifiers) {
public Builder transUnitIdentifier(List<XliffIdentifierInterface> translationUnitIdentifiers) {
if (translationUnitIdentifiers != null) {
this.translationUnitIdentifiers = translationUnitIdentifiers;
this.transUnitIdentifier = translationUnitIdentifiers;
}
return this;
}
Expand All @@ -73,12 +73,11 @@ public Catalog createCatalog(Catalog catalog) {
}

public XliffVersionInterface getReader(String version) {
for (XliffVersionInterface xliffClass : this.supportedVersions) {
if (xliffClass.support(version)) {
return xliffClass;
}
}
return null;
return this.supportedVersions
.stream()
.filter(o -> o.support(version))
.findFirst()
.orElse(null);
}

private void readFile(List<ResourcesLoader.Dto> translationFiles) throws ParserConfigurationException, IOException {
Expand Down Expand Up @@ -106,10 +105,9 @@ private void readFile(List<ResourcesLoader.Dto> translationFiles) throws ParserC
String xliffVersion = xliffDocument.getXliffVersion();

XliffVersionInterface xliffReader = this.getReader(xliffVersion);

if (xliffReader != null) {
if (this.translationUnitIdentifiers != null) {
xliffReader.setUnitIdentifiersOrdering(this.translationUnitIdentifiers);
}
xliffReader.setTransUnitIdentifier(this.transUnitIdentifier);
xliffReader.read(this.catalog, xliffDocument, translationFile.getDomain(), translationFile.getLocale());
} else {
throw new XliffMessageSourceVersionSupportException(
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
package io.github.alaugks.spring.messagesource.xliff.catalog.xliff;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

public class Xliff12XliffIdentifier implements XliffIdentifierInterface {

// https://docs.oasis-open.org/xliff/v1.2/xliff-profile-html/xliff-profile-html-1.2.html#General_Identifiers
private List<String> unitIdentifiers = new ArrayList<>(Arrays.asList("resname", "id"));

public Xliff12XliffIdentifier() {
}

public Xliff12XliffIdentifier(List<String> unitIdentifiers) {
this.unitIdentifiers = unitIdentifiers;
}

@Override
public List<String> getList() {
return unitIdentifiers;
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
package io.github.alaugks.spring.messagesource.xliff.catalog.xliff;

import java.util.ArrayList;
import java.util.List;

public class Xliff2XliffIdentifier implements XliffIdentifierInterface {

// https://docs.oasis-open.org/xliff/xliff-core/v2.0/csprd01/xliff-core-v2.0-csprd01.html#segment
// https://docs.oasis-open.org/xliff/xliff-core/v2.1/os/xliff-core-v2.1-os.html#segment
private List<String> unitIdentifiers = new ArrayList<>(List.of("id"));

public Xliff2XliffIdentifier() {
}

public Xliff2XliffIdentifier(List<String> unitIdentifiers) {
this.unitIdentifiers = unitIdentifiers;
}

@Override
public List<String> getList() {
return unitIdentifiers;
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
package io.github.alaugks.spring.messagesource.xliff.catalog.xliff;

import java.util.List;

public interface XliffIdentifierInterface {

List<String> getList();
}
Original file line number Diff line number Diff line change
Expand Up @@ -2,29 +2,38 @@

import io.github.alaugks.spring.messagesource.xliff.catalog.CatalogInterface;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Locale;

// https://docs.oasis-open.org/xliff/v1.2/xliff-profile-html/xliff-profile-html-1.2.html#General_Identifiers
public final class XliffVersion12 implements XliffVersionInterface {
private List<String> translationUnitIdentifiers = new ArrayList<>(Arrays.asList("resname", "id"));

private XliffIdentifierInterface transUnitIdentifier;

public XliffVersion12() {
this.transUnitIdentifier = new Xliff12XliffIdentifier();
}

@Override
public boolean support(String version) {
return version.equals("1.2");
}

@Override
public void setUnitIdentifiersOrdering(List<String> unitIdentifiers) {
this.translationUnitIdentifiers = unitIdentifiers;
public void setTransUnitIdentifier(List<XliffIdentifierInterface> unitIdentifiers) {
if (unitIdentifiers != null) {
this.transUnitIdentifier = unitIdentifiers
.stream()
.filter(u -> u.getClass() == Xliff12XliffIdentifier.class)
.findFirst()
.orElse(this.transUnitIdentifier);
}
}

@Override
public void read(CatalogInterface catalog, XliffDocument document, String domain, Locale locale) {
document.getTransUnits("trans-unit", this.translationUnitIdentifiers).forEach(
document.getTransUnits("trans-unit", this.transUnitIdentifier.getList()).forEach(
transUnit -> catalog.put(locale, domain, transUnit.getCode(), transUnit.getTargetValue())
);
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -2,29 +2,38 @@

import io.github.alaugks.spring.messagesource.xliff.catalog.CatalogInterface;

import java.util.ArrayList;
import java.util.List;
import java.util.Locale;

// https://docs.oasis-open.org/xliff/xliff-core/v2.0/csprd01/xliff-core-v2.0-csprd01.html#segment
// https://docs.oasis-open.org/xliff/xliff-core/v2.1/os/xliff-core-v2.1-os.html#segment
public final class XliffVersion2 implements XliffVersionInterface {
private List<String> translationUnitIdentifiers = new ArrayList<>(List.of("id"));

private XliffIdentifierInterface transUnitIdentifier;

public XliffVersion2() {
this.transUnitIdentifier = new Xliff2XliffIdentifier();
}

@Override
public boolean support(String version) {
return List.of("2.0", "2.1").contains(version);
}

@Override
public void setUnitIdentifiersOrdering(List<String> unitIdentifiers) {
this.translationUnitIdentifiers = unitIdentifiers;
public void setTransUnitIdentifier(List<XliffIdentifierInterface> unitIdentifiers) {
if (unitIdentifiers != null) {
this.transUnitIdentifier = unitIdentifiers
.stream()
.filter(u -> u.getClass() == Xliff2XliffIdentifier.class)
.findFirst()
.orElse(this.transUnitIdentifier);
}
}

@Override
public void read(CatalogInterface catalog, XliffDocument document, String domain, Locale locale) {
document.getTransUnits("segment", this.translationUnitIdentifiers).forEach(
document.getTransUnits("segment", this.transUnitIdentifier.getList()).forEach(
transUnit -> catalog.put(locale, domain, transUnit.getCode(), transUnit.getTargetValue())
);
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@
public interface XliffVersionInterface {
boolean support(String version);

void setUnitIdentifiersOrdering(List<String> unitIdentifiers);
void setTransUnitIdentifier(List<XliffIdentifierInterface> unitIdentifiers);

void read(CatalogInterface catalog, XliffDocument document, String domain, Locale locale);
}
Original file line number Diff line number Diff line change
Expand Up @@ -3,8 +3,10 @@
import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.junit.jupiter.api.Assertions.assertThrows;

import io.github.alaugks.spring.messagesource.xliff.catalog.xliff.Xliff12XliffIdentifier;
import io.github.alaugks.spring.messagesource.xliff.catalog.xliff.Xliff2XliffIdentifier;
import io.github.alaugks.spring.messagesource.xliff.catalog.xliff.XliffIdentifierInterface;
import io.github.alaugks.spring.messagesource.xliff.exception.XliffMessageSourceRuntimeException;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Locale;
Expand Down Expand Up @@ -90,12 +92,12 @@ void test_setBasenamesPattern() {

@ParameterizedTest(name = "{index} => translationUnitIdentifiers={0}, code={1}, expected={2}, value={3}")
@MethodSource("dataProvider_setTranslationUnitIdentifiersOrdering")
void test_setTranslationUnitIdentifiersOrdering(ArrayList<String> translationUnitIdentifiers, String code, String expected) {
void test_setTranslationUnitIdentifiersOrdering(List<XliffIdentifierInterface> translationUnitIdentifiers, String code, String expected) {
var messageSource = XliffTranslationMessageSource
.builder(TestUtilities.getMockedCacheManager())
.basenamePattern("translations/*")
.basenamePattern("identifier/*")
.defaultLocale(Locale.forLanguageTag("en"))
.translationUnitIdentifiersOrdering(translationUnitIdentifiers)
.setTransUnitIdentifier(translationUnitIdentifiers)
.build();

String message = messageSource.getMessage(
Expand All @@ -109,24 +111,47 @@ void test_setTranslationUnitIdentifiersOrdering(ArrayList<String> translationUni
private static Stream<Arguments> dataProvider_setTranslationUnitIdentifiersOrdering() {
return Stream.of(
Arguments.of(
new ArrayList<>(List.of("resname")),
"code-resname-a",
"Target"
Arrays.asList(new Xliff2XliffIdentifier(List.of("resname")), new Xliff12XliffIdentifier(List.of("resname"))),
"identifierv1.code-resname-a",
"Target A"
),
Arguments.of(
Arrays.asList(new Xliff2XliffIdentifier(List.of("id")), new Xliff12XliffIdentifier(List.of("id"))),
"identifierv1.code-id-a",
"Target A"
),

Arguments.of(
Arrays.asList(new Xliff2XliffIdentifier(List.of("resname", "id")), new Xliff12XliffIdentifier(List.of("resname", "id"))),
"identifierv1.code-id-b",
"Target B"
),
Arguments.of(
new ArrayList<>(List.of("id")),
"code-id-a",
"Target"
Arrays.asList(new Xliff2XliffIdentifier(List.of("id", "resname")), new Xliff12XliffIdentifier(List.of("id", "resname"))),
"identifierv1.code-resname-c",
"Target C"
),

Arguments.of(
Arrays.asList(new Xliff2XliffIdentifier(List.of("resname")), new Xliff12XliffIdentifier(List.of("resname"))),
"identifierv2.code-resname-a",
"Target A"
),
Arguments.of(
Arrays.asList(new Xliff2XliffIdentifier(List.of("id")), new Xliff12XliffIdentifier(List.of("id"))),
"identifierv2.code-id-a",
"Target A"
),

Arguments.of(
new ArrayList<>(Arrays.asList("resname", "id")),
"code-resname-a",
"Target"
Arrays.asList(new Xliff2XliffIdentifier(List.of("resname", "id")), new Xliff12XliffIdentifier(List.of("resname", "id"))),
"identifierv2.code-id-b",
"Target B"
),
Arguments.of(
new ArrayList<>(Arrays.asList("id", "resname")),
"code-id-a",
"Target"
Arrays.asList(new Xliff2XliffIdentifier(List.of("id", "resname")), new Xliff12XliffIdentifier(List.of("id", "resname"))),
"identifierv2.code-resname-c",
"Target C"
)
);
}
Expand Down
Loading

0 comments on commit ce81f9b

Please sign in to comment.