diff --git a/src/main/java/ru/dankoy/korvotoanki/core/command/GoogleTranslateCommand.java b/src/main/java/ru/dankoy/korvotoanki/core/command/GoogleTranslateCommand.java index 098bfb6..29956ca 100644 --- a/src/main/java/ru/dankoy/korvotoanki/core/command/GoogleTranslateCommand.java +++ b/src/main/java/ru/dankoy/korvotoanki/core/command/GoogleTranslateCommand.java @@ -16,7 +16,7 @@ public class GoogleTranslateCommand { private final ObjectMapperService objectMapperService; - // gt --text hello --options t,at,md + // gt --text hello --options t,at,md,bd @Command(command = "google-translate", alias = "gt", description = "Translate text using google translate") diff --git a/src/main/java/ru/dankoy/korvotoanki/core/domain/googletranslation/Definition.java b/src/main/java/ru/dankoy/korvotoanki/core/domain/googletranslation/Definition.java new file mode 100644 index 0000000..34d95c4 --- /dev/null +++ b/src/main/java/ru/dankoy/korvotoanki/core/domain/googletranslation/Definition.java @@ -0,0 +1,10 @@ +package ru.dankoy.korvotoanki.core.domain.googletranslation; + + +/** + * @param type noun, verb, exclamation, etc + * @param info the actual definition + */ +public record Definition(String type, String info) { + +} diff --git a/src/main/java/ru/dankoy/korvotoanki/core/domain/googletranslation/GoogleTranslation.java b/src/main/java/ru/dankoy/korvotoanki/core/domain/googletranslation/GoogleTranslation.java new file mode 100644 index 0000000..6501df3 --- /dev/null +++ b/src/main/java/ru/dankoy/korvotoanki/core/domain/googletranslation/GoogleTranslation.java @@ -0,0 +1,19 @@ +package ru.dankoy.korvotoanki.core.domain.googletranslation; + +import java.util.ArrayList; +import java.util.List; +import lombok.Data; +import lombok.RequiredArgsConstructor; + + +@RequiredArgsConstructor +@Data +public class GoogleTranslation { + + private final List translations = new ArrayList<>(); + + private final String transcription; + + private final List definitions = new ArrayList<>(); + +} diff --git a/src/main/java/ru/dankoy/korvotoanki/core/service/googletrans/GoogleTranslator.java b/src/main/java/ru/dankoy/korvotoanki/core/service/googletrans/GoogleTranslator.java index e463dbd..a9a9dc2 100644 --- a/src/main/java/ru/dankoy/korvotoanki/core/service/googletrans/GoogleTranslator.java +++ b/src/main/java/ru/dankoy/korvotoanki/core/service/googletrans/GoogleTranslator.java @@ -1,6 +1,7 @@ package ru.dankoy.korvotoanki.core.service.googletrans; import java.util.List; +import ru.dankoy.korvotoanki.core.domain.googletranslation.GoogleTranslation; /* * Used info from: @@ -11,6 +12,6 @@ public interface GoogleTranslator { - String translate(String text, String targetLanguage, String sourceLanguage, + GoogleTranslation translate(String text, String targetLanguage, String sourceLanguage, List dtOptions); } diff --git a/src/main/java/ru/dankoy/korvotoanki/core/service/googletrans/GoogleTranslatorOkHttp.java b/src/main/java/ru/dankoy/korvotoanki/core/service/googletrans/GoogleTranslatorOkHttp.java index 9ba029c..5300403 100644 --- a/src/main/java/ru/dankoy/korvotoanki/core/service/googletrans/GoogleTranslatorOkHttp.java +++ b/src/main/java/ru/dankoy/korvotoanki/core/service/googletrans/GoogleTranslatorOkHttp.java @@ -11,7 +11,9 @@ import okhttp3.Response; import org.springframework.stereotype.Service; import ru.dankoy.korvotoanki.config.GoogleTranslatorProperties; +import ru.dankoy.korvotoanki.core.domain.googletranslation.GoogleTranslation; import ru.dankoy.korvotoanki.core.exceptions.GoogleTranslatorException; +import ru.dankoy.korvotoanki.core.service.googletrans.parser.GoogleTranslatorParser; @Slf4j @@ -23,8 +25,10 @@ public class GoogleTranslatorOkHttp implements GoogleTranslator { private final GoogleTranslatorProperties googleTranslatorProperties; + private final GoogleTranslatorParser googleTranslatorParser; + @Override - public String translate(String text, + public GoogleTranslation translate(String text, String targetLanguage, String sourceLanguage, List dtOptions @@ -68,7 +72,10 @@ public String translate(String text, try (var response = call.execute()) { checkStatus(response); - return response.body() != null ? response.body().string() : ""; + var body = response.body() != null ? response.body().string() : ""; + + return googleTranslatorParser.parse(body); + } catch (Exception e) { throw new GoogleTranslatorException(e); diff --git a/src/main/java/ru/dankoy/korvotoanki/core/service/googletrans/parser/GoogleTranslatorParser.java b/src/main/java/ru/dankoy/korvotoanki/core/service/googletrans/parser/GoogleTranslatorParser.java new file mode 100644 index 0000000..e293578 --- /dev/null +++ b/src/main/java/ru/dankoy/korvotoanki/core/service/googletrans/parser/GoogleTranslatorParser.java @@ -0,0 +1,8 @@ +package ru.dankoy.korvotoanki.core.service.googletrans.parser; + +import ru.dankoy.korvotoanki.core.domain.googletranslation.GoogleTranslation; + +public interface GoogleTranslatorParser { + + GoogleTranslation parse(String data); +} diff --git a/src/main/java/ru/dankoy/korvotoanki/core/service/googletrans/parser/GoogleTranslatorParserImpl.java b/src/main/java/ru/dankoy/korvotoanki/core/service/googletrans/parser/GoogleTranslatorParserImpl.java new file mode 100644 index 0000000..87dcf1c --- /dev/null +++ b/src/main/java/ru/dankoy/korvotoanki/core/service/googletrans/parser/GoogleTranslatorParserImpl.java @@ -0,0 +1,85 @@ +package ru.dankoy.korvotoanki.core.service.googletrans.parser; + + +import com.fasterxml.jackson.databind.JsonNode; +import com.fasterxml.jackson.databind.ObjectMapper; +import com.fasterxml.jackson.databind.node.ArrayNode; +import java.util.ArrayList; +import java.util.List; +import java.util.Objects; +import java.util.stream.IntStream; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Service; +import ru.dankoy.korvotoanki.core.domain.googletranslation.Definition; +import ru.dankoy.korvotoanki.core.domain.googletranslation.GoogleTranslation; +import ru.dankoy.korvotoanki.core.exceptions.GoogleTranslatorException; + +// Currently parse only data for keys: t,at,md,rm + +@Service +@RequiredArgsConstructor +public class GoogleTranslatorParserImpl implements GoogleTranslatorParser { + + private final ObjectMapper mapper; + + @Override + public GoogleTranslation parse(String data) { + + String transcriptionString = null; + + JsonNode jsonNodeRoot = toJsonNode(data); + + // translation and transcription. + ArrayNode translationAndTranscriptionNode = (ArrayNode) jsonNodeRoot.get(0); + ArrayNode multipleTranslations = (ArrayNode) jsonNodeRoot.get(5); + + ArrayNode definitions = (ArrayNode) jsonNodeRoot.get(12); + + // obtain transcription + JsonNode transcription = translationAndTranscriptionNode.get(1).get(3); + if (Objects.nonNull(transcription)) { + transcriptionString = transcription.asText(); + } + + // obtain list of translations + ArrayNode mts = (ArrayNode) multipleTranslations.get(0).get(2); + List translations = IntStream.range(0, mts.size()) + .mapToObj(mts::get) + .map(c -> (ArrayNode) c) + .map(n -> n.get(0).asText()) + .toList(); + + List defs = new ArrayList<>(); + // obtain definitions + if (Objects.nonNull(definitions)) { + defs = IntStream.range(0, definitions.size()) + .mapToObj(definitions::get) + .map(d -> { + var type = d.get(0).asText(); + var def = d.get(1).get(0).get(0).asText(); + return new Definition(type, def); + }) + .toList(); + } + + var googleTranslation = new GoogleTranslation(transcriptionString); + googleTranslation.getTranslations().addAll(translations); + googleTranslation.getDefinitions().addAll(defs); + + return googleTranslation; + + } + + private JsonNode toJsonNode(String json) { + + try { + return mapper.readTree(json); + } catch (Exception e) { + throw new GoogleTranslatorException( + String.format("Couldn't read json tree '%s'", json), e); + } + + } + + +}