Skip to content

Commit b9c5104

Browse files
authored
Add Glossary support
- Added Glossaries client and data models: Glossary, GlossaryImport, and GlossaryCounts - Extended Translator, TranslateOptions, DocumentUploadOptions, and DocumentTranslateOptions to support glossaries parameter - Updated ClientResponse to handle raw CSV responses when Content-Type is text/csv
1 parent f6e27fe commit b9c5104

10 files changed

Lines changed: 399 additions & 22 deletions

src/main/java/com/translated/lara/net/ClientResponse.java

Lines changed: 50 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
import com.translated.lara.errors.LaraApiConnectionException;
88
import com.translated.lara.errors.LaraApiException;
99

10+
import java.io.BufferedReader;
1011
import java.io.IOException;
1112
import java.io.InputStreamReader;
1213
import java.io.Reader;
@@ -15,12 +16,15 @@
1516
import java.util.ArrayList;
1617
import java.util.Collections;
1718
import java.util.List;
19+
import java.util.stream.Collectors;
1820

1921
public class ClientResponse {
2022

2123
private final Gson gson;
2224
private final LaraApiException error;
2325
private final JsonElement data;
26+
private final String rawData;
27+
private final String contentType;
2428

2529
ClientResponse(Gson gson, HttpURLConnection connection) throws LaraApiConnectionException {
2630
this.gson = gson;
@@ -34,31 +38,46 @@ public class ClientResponse {
3438

3539
boolean isSuccessful = httpStatus >= 200 && httpStatus < 300;
3640

37-
JsonElement response;
38-
try (Reader reader = new InputStreamReader(isSuccessful ? connection.getInputStream() : connection.getErrorStream(), StandardCharsets.UTF_8)) {
39-
JsonObject root = JsonParser.parseReader(reader).getAsJsonObject();
40-
response = root.get(isSuccessful ? "content" : "error");
41-
} catch (IOException e) {
42-
throw new LaraApiConnectionException("Failed to get response stream", e);
43-
}
41+
this.contentType = connection.getContentType();
4442

45-
if (isSuccessful) {
46-
this.error = null;
47-
this.data = response;
43+
if (isSuccessful && contentType != null && contentType.contains("text/csv")) {
44+
try (BufferedReader reader = new BufferedReader(
45+
new InputStreamReader(connection.getInputStream(), StandardCharsets.UTF_8))) {
46+
this.rawData = reader.lines().collect(Collectors.joining("\n"));
47+
this.data = null;
48+
this.error = null;
49+
} catch (IOException e) {
50+
throw new LaraApiConnectionException("Failed to get response stream", e);
51+
}
4852
} else {
49-
String type = "UnknownError";
50-
String message = "An unknown error occurred";
51-
52-
if (response != null) {
53-
JsonObject error = response.getAsJsonObject();
54-
if (error.has("type"))
55-
type = error.get("type").getAsString();
56-
if (error.has("message"))
57-
message = error.get("message").getAsString();
53+
this.rawData = null;
54+
55+
JsonElement response;
56+
try (Reader reader = new InputStreamReader(isSuccessful ? connection.getInputStream() : connection.getErrorStream(), StandardCharsets.UTF_8)) {
57+
JsonObject root = JsonParser.parseReader(reader).getAsJsonObject();
58+
response = root.get(isSuccessful ? "content" : "error");
59+
} catch (IOException e) {
60+
throw new LaraApiConnectionException("Failed to get response stream", e);
5861
}
5962

60-
this.error = new LaraApiException(httpStatus, type, message);
61-
this.data = null;
63+
if (isSuccessful) {
64+
this.error = null;
65+
this.data = response;
66+
} else {
67+
String type = "UnknownError";
68+
String message = "An unknown error occurred";
69+
70+
if (response != null) {
71+
JsonObject error = response.getAsJsonObject();
72+
if (error.has("type"))
73+
type = error.get("type").getAsString();
74+
if (error.has("message"))
75+
message = error.get("message").getAsString();
76+
}
77+
78+
this.error = new LaraApiException(httpStatus, type, message);
79+
this.data = null;
80+
}
6281
}
6382
}
6483

@@ -73,7 +92,16 @@ public <T> List<T> asList(Class<T> clazz) throws LaraApiException {
7392
ArrayList<T> list = new ArrayList<>();
7493
for (JsonElement element : data.getAsJsonArray())
7594
list.add(gson.fromJson(element, clazz));
95+
7696
return Collections.unmodifiableList(list);
7797
}
7898

79-
}
99+
@Override
100+
public String toString() {
101+
if (contentType != null && contentType.contains("text/csv")) {
102+
return rawData;
103+
} else {
104+
return gson.toJson(data);
105+
}
106+
}
107+
}

src/main/java/com/translated/lara/translator/DocumentTranslateOptions.java

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
public class DocumentTranslateOptions {
88

99
private String[] adaptTo = null;
10+
private String[] glossaries = null;
1011
private String outputFormat = null;
1112
private Boolean noTrace = null;
1213

@@ -33,6 +34,20 @@ public DocumentTranslateOptions setOutputFormat(String outputFormat) {
3334
return this;
3435
}
3536

37+
public String[] getGlossaries() {
38+
return glossaries;
39+
}
40+
41+
public DocumentTranslateOptions setGlossaries(List<String> glossaries) {
42+
this.glossaries = glossaries != null ? glossaries.toArray(new String[0]) : null;
43+
return this;
44+
}
45+
46+
public DocumentTranslateOptions setGlossaries(String... glossaries) {
47+
this.glossaries = glossaries;
48+
return this;
49+
}
50+
3651
public Boolean getNoTrace() {
3752
return noTrace;
3853
}
@@ -45,6 +60,7 @@ public DocumentTranslateOptions setNoTrace(Boolean noTrace) {
4560
public HttpParams<Object> toParams() {
4661
HttpParams<Object> params = new HttpParams<>();
4762
params.set("adapt_to", adaptTo);
63+
params.set("glossaries", glossaries);
4864
params.set("output_format", outputFormat);
4965

5066
return params;

src/main/java/com/translated/lara/translator/DocumentUploadOptions.java

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
public class DocumentUploadOptions {
88

99
private String[] adaptTo = null;
10+
private String[] glossaries = null;
1011
private Boolean noTrace = null;
1112

1213
public String[] getAdaptTo() {
@@ -23,6 +24,20 @@ public DocumentUploadOptions setAdaptTo(String... adaptTo) {
2324
return this;
2425
}
2526

27+
public String[] getGlossaries() {
28+
return glossaries;
29+
}
30+
31+
public DocumentUploadOptions setGlossaries(List<String> glossaries) {
32+
this.glossaries = glossaries != null ? glossaries.toArray(new String[0]) : null;
33+
return this;
34+
}
35+
36+
public DocumentUploadOptions setGlossaries(String... glossaries) {
37+
this.glossaries = glossaries;
38+
return this;
39+
}
40+
2641
public Boolean getNoTrace() {
2742
return noTrace;
2843
}
@@ -35,6 +50,7 @@ public DocumentUploadOptions setNoTrace(Boolean noTrace) {
3550
public HttpParams<Object> toParams() {
3651
HttpParams<Object> params = new HttpParams<>();
3752
params.set("adapt_to", adaptTo);
53+
params.set("glossaries", glossaries);
3854

3955
return params;
4056
}

src/main/java/com/translated/lara/translator/Documents.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -117,6 +117,7 @@ public InputStream translate(File input, String source, String target) throws S3
117117
public InputStream translate(File input, String source, String target, DocumentTranslateOptions options) throws S3Exception, LaraException, InterruptedException {
118118
DocumentUploadOptions uploadOptions = options != null ? new DocumentUploadOptions() : null;
119119
if (options != null && options.getAdaptTo() != null) uploadOptions.setAdaptTo(options.getAdaptTo());
120+
if (options != null && options.getGlossaries() != null) uploadOptions.setGlossaries(options.getGlossaries());
120121
if (options != null && options.getNoTrace()) uploadOptions.setNoTrace(true);
121122

122123
Document document = upload(input, source, target, uploadOptions);
Lines changed: 120 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,120 @@
1+
package com.translated.lara.translator;
2+
3+
import com.translated.lara.errors.LaraApiException;
4+
import com.translated.lara.errors.LaraException;
5+
import com.translated.lara.errors.TimeoutException;
6+
import com.translated.lara.net.HttpParams;
7+
import com.translated.lara.net.LaraClient;
8+
9+
import java.io.File;
10+
import java.util.List;
11+
import java.util.Map;
12+
import java.util.function.Consumer;
13+
14+
public class Glossaries {
15+
private final LaraClient client;
16+
private final long pollingInterval;
17+
18+
Glossaries(LaraClient client) {
19+
this(client, 2000);
20+
}
21+
22+
Glossaries(LaraClient client, long pollingInterval) {
23+
this.client = client;
24+
this.pollingInterval = pollingInterval;
25+
}
26+
27+
public List<Glossary> list() throws LaraException {
28+
return client.get("/glossaries").asList(Glossary.class);
29+
}
30+
31+
public Glossary create(String name) throws LaraException {
32+
return client.post("/glossaries", new HttpParams<>()
33+
.set("name", name)
34+
.build()
35+
).as(Glossary.class);
36+
}
37+
38+
public Glossary get(String id) throws LaraException {
39+
try {
40+
return client.get("/glossaries/" + id).as(Glossary.class);
41+
} catch (LaraApiException e) {
42+
if (e.getStatusCode() == 404) {
43+
return null;
44+
}
45+
46+
throw e;
47+
}
48+
}
49+
50+
public Glossary delete(String id) throws LaraException {
51+
return client.delete("/glossaries/" + id).as(Glossary.class);
52+
}
53+
54+
public Glossary update(String id, String name) throws LaraException {
55+
return client.put("/glossaries/" + id, new HttpParams<>()
56+
.set("name", name)
57+
.build()
58+
).as(Glossary.class);
59+
}
60+
61+
public GlossaryImport importCsv(String id, File csv) throws LaraException {
62+
return importCsv(id, csv, csv.getName().toLowerCase().endsWith(".gz"));
63+
}
64+
65+
public GlossaryImport importCsv(String id, File csv, boolean gzip) throws LaraException {
66+
Map<String, Object> params = new HttpParams<>()
67+
.set("compression", gzip ? "gzip" : null)
68+
.build();
69+
Map<String, File> files = new HttpParams<File>()
70+
.set("csv", csv)
71+
.build();
72+
73+
return client.post("/glossaries/" + id + "/import", params, files).as(GlossaryImport.class);
74+
}
75+
76+
public GlossaryImport getImportStatus(String id) throws LaraException {
77+
return client.get("/glossaries/imports/" + id).as(GlossaryImport.class);
78+
}
79+
80+
public GlossaryImport waitForImport(GlossaryImport gImport) throws LaraException, InterruptedException {
81+
return waitForImport(gImport, null, 0);
82+
}
83+
84+
public GlossaryImport waitForImport(GlossaryImport gImport, Consumer<GlossaryImport> updateCallback) throws LaraException, InterruptedException {
85+
return waitForImport(gImport, updateCallback, 0);
86+
}
87+
88+
public GlossaryImport waitForImport(GlossaryImport gImport, long maxWaitTimeMs) throws LaraException, InterruptedException {
89+
return waitForImport(gImport, null, maxWaitTimeMs);
90+
}
91+
92+
public GlossaryImport waitForImport(GlossaryImport gImport, Consumer<GlossaryImport> updateCallback, long maxWaitTimeMs) throws LaraException, InterruptedException {
93+
long start = System.currentTimeMillis();
94+
while (gImport.getProgress() < 1.) {
95+
if (maxWaitTimeMs > 0 && System.currentTimeMillis() - start > maxWaitTimeMs)
96+
throw new TimeoutException();
97+
98+
Thread.sleep(this.pollingInterval);
99+
100+
gImport = getImportStatus(gImport.getId());
101+
if (updateCallback != null)
102+
updateCallback.accept(gImport);
103+
}
104+
105+
return gImport;
106+
}
107+
108+
public String export(String id, Glossary.Type contentType, String source) throws LaraException {
109+
HttpParams<Object> params = new HttpParams<>()
110+
.set("content_type", contentType.toString());
111+
if (source != null) {
112+
params.set("source", source);
113+
}
114+
return client.get("/glossaries/" + id + "/export", params.build()).toString();
115+
}
116+
117+
public GlossaryCounts counts(String id) throws LaraException {
118+
return client.get("/glossaries/" + id + "/counts").as(GlossaryCounts.class);
119+
}
120+
}
Lines changed: 74 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,74 @@
1+
package com.translated.lara.translator;
2+
3+
import java.util.Date;
4+
import java.util.Objects;
5+
6+
public class Glossary {
7+
8+
public enum Type {
9+
CSV_TABLE_UNI("csv/table-uni");
10+
11+
private final String value;
12+
13+
Type(String value) {
14+
this.value = value;
15+
}
16+
17+
@Override
18+
public String toString() {
19+
return value;
20+
}
21+
}
22+
23+
private final String id;
24+
private final Date createdAt;
25+
private final Date updatedAt;
26+
private final String name;
27+
private final String ownerId;
28+
29+
public Glossary(String id, Date createdAt, Date updatedAt, String name, String ownerId) {
30+
this.id = id;
31+
this.createdAt = createdAt;
32+
this.updatedAt = updatedAt;
33+
this.name = name;
34+
this.ownerId = ownerId;
35+
}
36+
37+
public String getId() {
38+
return id;
39+
}
40+
41+
public Date getCreatedAt() {
42+
return createdAt;
43+
}
44+
45+
public Date getUpdatedAt() {
46+
return updatedAt;
47+
}
48+
49+
public String getName() {
50+
return name;
51+
}
52+
53+
public String getOwnerId() {
54+
return ownerId;
55+
}
56+
57+
@Override
58+
public String toString() {
59+
return "Glossary{id='" + id + "', name='" + name + "'}";
60+
}
61+
62+
@Override
63+
public boolean equals(Object object) {
64+
if (this == object) return true;
65+
if (!(object instanceof Glossary)) return false;
66+
Glossary glossary = (Glossary) object;
67+
return Objects.equals(id, glossary.id);
68+
}
69+
70+
@Override
71+
public int hashCode() {
72+
return Objects.hashCode(id);
73+
}
74+
}

0 commit comments

Comments
 (0)