Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
@@ -0,0 +1,110 @@
package com.crowdin.client.core.http.impl.json;

import com.crowdin.client.projectsgroups.model.*;
import com.fasterxml.jackson.core.JsonParser;
import com.fasterxml.jackson.databind.DeserializationContext;
import com.fasterxml.jackson.databind.JsonDeserializer;
import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper;

import java.io.IOException;

public class FileFormatSettingsDeserializer extends JsonDeserializer<FileFormatSettingsResource> {

private final ObjectMapper objectMapper;

public FileFormatSettingsDeserializer(ObjectMapper objectMapper) {
this.objectMapper = objectMapper;
}

@Override
public FileFormatSettingsResource deserialize(JsonParser parser, DeserializationContext ctx) throws IOException {
JsonNode parentNode = parser.getCodec().readTree(parser);

FileFormatSettingsResource resource = this.objectMapper.readValue(parentNode.toString(), FileFormatSettingsResource.class);

Class<? extends FileFormatSettings> classToUse;
String format = parentNode.get("format").asText();

switch (format) {
case "properties":
classToUse = PropertiesFileFormatSettings.class;
break;
case "xml":
classToUse = XmlFileFormatSettings.class;
break;
case "webxml":
classToUse = WebXmlFileFormatSettings.class;
break;
case "html":
classToUse = HtmlFileFormatSettings.class;
break;
case "adoc":
classToUse = AdocFileFormatSettings.class;
break;
case "android":
classToUse = AndroidFileFormatSettings.class;
break;
case "md":
classToUse = MdFileFormatSettings.class;
break;
case "mdxV1":
classToUse = MdxV1FileFormatSettings.class;
break;
case "fmMd":
classToUse = FmMdFileFormatSettings.class;
break;
case "fmHtml":
classToUse = FmHtmlFileFormatSettings.class;
break;
case "madcapFlsnp":
classToUse = MadcapFlsnpFileFormatSettings.class;
break;
case "docx":
classToUse = DocxFileFormatSettings.class;
break;
case "idml":
classToUse = IdmlFileFormatSettings.class;
break;
case "mif":
classToUse = MifFileFormatSettings.class;
break;
case "dita":
classToUse = DitaFileFormatSettings.class;
break;
case "mediawiki":
classToUse = MediaWikiFileFormatSettings.class;
break;
case "arb":
classToUse = ArbFileFormatSettings.class;
break;
case "json":
classToUse = JsonFileFormatSettings.class;
break;
case "fjs":
classToUse = FJSFileFormatSettings.class;
break;
case "macosx":
classToUse = MacOSXFileFormatSettings.class;
break;
case "chrome":
classToUse = ChromeFileFormatSettings.class;
break;
case "react_intl":
classToUse = ReactIntlFileFormatSettings.class;
break;
case "txt":
classToUse = TxtFileFormatSettings.class;
break;
default:
classToUse = OtherFileFormatSettings.class;
break;
}

JsonNode settingsNode = parentNode.get("settings");
FileFormatSettings settings = this.objectMapper.readValue(settingsNode.toString(), classToUse);
resource.setSettings(settings);

return resource;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@
import com.crowdin.client.core.http.exceptions.CrowdinApiException;
import com.crowdin.client.core.http.exceptions.HttpBadRequestException;
import com.crowdin.client.core.http.exceptions.HttpException;
import com.crowdin.client.projectsgroups.model.FileFormatSettingsResource;
import com.crowdin.client.projectsgroups.model.Project;
import com.crowdin.client.sourcefiles.model.ExportOptions;
import com.crowdin.client.sourcefiles.model.FileInfo;
Expand Down Expand Up @@ -41,7 +42,8 @@ public JacksonJsonTransformer() {
.registerModule(new SimpleModule()
.addDeserializer(ImportOptions.class, new FileImportOptionsDeserializer(cleanObjectMapper))
.addDeserializer(ExportOptions.class, new FileExportOptionsDeserializer(cleanObjectMapper)))))
.addDeserializer(LanguageTranslations.class, new LanguageTranslationsDeserializer(cleanObjectMapper));
.addDeserializer(LanguageTranslations.class, new LanguageTranslationsDeserializer(cleanObjectMapper))
.addDeserializer(FileFormatSettingsResource.class, new FileFormatSettingsDeserializer(cleanObjectMapper));
this.objectMapper = cleanObjectMapper.copy()
.setSerializationInclusion(JsonInclude.Include.NON_NULL)
.setDateFormat(new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ssXXX"))
Expand Down
23 changes: 23 additions & 0 deletions src/main/java/com/crowdin/client/core/model/EscapeQuotesMode.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
package com.crowdin.client.core.model;

public enum EscapeQuotesMode implements EnumConverter<EscapeQuotesMode> {
DO_NOT_ESCAPE_SINGLE_QUOTE(0),
ESCAPE_SINGLE_QUOTE_BY_ANOTHER_SINGLE_QUOTE(1),
ESCAPE_SINGLE_QUOTE_BY_BACK_SLASH(2),
ESCAPE_SINGLE_QUOTE_BY_ANOTHER_SINGLE_QUOTE_ONLY_IF_VARIABLES(3);

private final int value;

EscapeQuotesMode(int value) {
this.value = value;
}

public static EscapeQuotesMode from(String value) {
return EscapeQuotesMode.values()[Integer.parseInt(value)];
}

@Override
public Integer to(EscapeQuotesMode v) {
return v.value;
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
package com.crowdin.client.core.model;

public enum EscapeSpecialCharsMode implements EnumConverter<EscapeSpecialCharsMode> {
DO_NOT_ESCAPE(0),
ESCAPE_BY_BACKSLASH(1);

private final int value;

EscapeSpecialCharsMode(int value) {
this.value = value;
}

public static EscapeSpecialCharsMode from(String value) {
return EscapeSpecialCharsMode.values()[Integer.parseInt(value)];
}

@Override
public Object to(EscapeSpecialCharsMode v) {
return v.value;
}
}
21 changes: 21 additions & 0 deletions src/main/java/com/crowdin/client/core/model/JsonFileType.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
package com.crowdin.client.core.model;

public enum JsonFileType implements EnumConverter<JsonFileType> {
I18NEXT_JSON("i18next_json"),
NESTJS_I18N("nestjs_i18n");

private String value;

JsonFileType(String value) {
this.value = value;
}

public static JsonFileType from(String value) {
return JsonFileType.valueOf(value.toUpperCase());
}

@Override
public String to(JsonFileType v) {
return v.value;
}
}
122 changes: 122 additions & 0 deletions src/main/java/com/crowdin/client/projectsgroups/ProjectsGroupsApi.java
Original file line number Diff line number Diff line change
Expand Up @@ -6,11 +6,17 @@
import com.crowdin.client.core.http.exceptions.HttpException;
import com.crowdin.client.core.model.ClientConfig;
import com.crowdin.client.core.model.Credentials;
import com.crowdin.client.core.model.DownloadLink;
import com.crowdin.client.core.model.DownloadLinkResponseObject;
import com.crowdin.client.core.model.PatchRequest;
import com.crowdin.client.core.model.ResponseList;
import com.crowdin.client.core.model.ResponseObject;
import com.crowdin.client.projectsgroups.model.AddGroupRequest;
import com.crowdin.client.projectsgroups.model.AddProjectFileFormatSettingsRequest;
import com.crowdin.client.projectsgroups.model.AddProjectRequest;
import com.crowdin.client.projectsgroups.model.FileFormatSettingsResource;
import com.crowdin.client.projectsgroups.model.FileFormatSettingsResponseList;
import com.crowdin.client.projectsgroups.model.FileFormatSettingsResponseObject;
import com.crowdin.client.projectsgroups.model.Group;
import com.crowdin.client.projectsgroups.model.GroupResponseList;
import com.crowdin.client.projectsgroups.model.GroupResponseObject;
Expand Down Expand Up @@ -170,4 +176,120 @@ public ResponseObject<? extends Project> editProject(Long projectId, List<PatchR
ProjectResponseObject projectResponseObject = this.httpClient.patch(this.url + "/projects/" + projectId, request, new HttpRequestConfig(), ProjectResponseObject.class);
return ResponseObject.of(projectResponseObject.getData());
}

//<editor-fold desc="File Format Settings">
/**
* @param projectId project identifier
* @param fileFormatSettingsId file format settings identifier
* @return download link
* @see <ul>
* <li><a href="https://developer.crowdin.com/api/v2/#operation/api.projects.file-format-settings.custom-segmentations.get"><b>API Documentation</b></a></li>
* <li><a href="https://developer.crowdin.com/enterprise/api/v2/#operation/api.projects.file-format-settings.custom-segmentations.get" target="_blank"><b>Enterprise API Documentation</b></a></li>
* </ul>
*/
public ResponseObject<DownloadLink> downloadProjectFileFormatSettingsCustomSegmentation(Long projectId, Long fileFormatSettingsId) {
String url = formUrl_projectFileFormatSettingsId_customSegmentations(projectId, fileFormatSettingsId);
DownloadLinkResponseObject response = this.httpClient.get(url, new HttpRequestConfig(), DownloadLinkResponseObject.class);
return ResponseObject.of(response.getData());
}

/**
* @param projectId project identifier
* @param fileFormatSettingsId file format settings identifier
* @see <ul>
* <li><a href="https://developer.crowdin.com/api/v2/#operation/api.projects.file-format-settings.custom-segmentations.delete"><b>API Documentation</b></a></li>
* <li><a href="https://developer.crowdin.com/enterprise/api/v2/#operation/api.projects.file-format-settings.custom-segmentations.delete" target="_blank"><b>Enterprise API Documentation</b></a></li>
* </ul>
*/
public void resetProjectFileFormatSettingsCustomSegmentation(Long projectId, Long fileFormatSettingsId) throws HttpException, HttpBadRequestException {
String url = formUrl_projectFileFormatSettingsId_customSegmentations(projectId, fileFormatSettingsId);
this.httpClient.delete(url, new HttpRequestConfig(), Void.class);
}

/**
* @param projectId project identifier
* @see <ul>
* <li><a href="https://developer.crowdin.com/api/v2/#operation/api.projects.file-format-settings.getMany"><b>API Documentation</b></a></li>
* <li><a href="https://developer.crowdin.com/enterprise/api/v2/#operation/api.projects.file-format-settings.getMany" target="_blank"><b>Enterprise API Documentation</b></a></li>
* </ul>
*/
public ResponseList<FileFormatSettingsResource> listProjectFileFormatSettings(Long projectId) {
String url = formUrl_projectFileFormatSettings(projectId);
FileFormatSettingsResponseList responseList = this.httpClient.get(url, new HttpRequestConfig(), FileFormatSettingsResponseList.class);
return FileFormatSettingsResponseList.to(responseList);
}

/**
* @param request request object
* @return newly created project
* @see <ul>
* <li><a href="https://developer.crowdin.com/api/v2/#operation/api.projects.file-format-settings.post" target="_blank"><b>API Documentation</b></a></li>
* <li><a href="https://developer.crowdin.com/enterprise/api/v2/#operation/api.projects.file-format-settings.post" target="_blank"><b>Enterprise API Documentation</b></a></li>
* </ul>
*/
public ResponseObject<FileFormatSettingsResource> addProjectFileFormatSettings(Long projectId, AddProjectFileFormatSettingsRequest request) {
String url = formUrl_projectFileFormatSettings(projectId);
FileFormatSettingsResponseObject response = this.httpClient.post(url, request, new HttpRequestConfig(), FileFormatSettingsResponseObject.class);
return ResponseObject.of(response.getData());
}

/**
* @param projectId project identifier
* @param fileFormatSettingsId file format settings identifier
* @return project
* @see <ul>
* <li><a href="https://developer.crowdin.com/api/v2/#operation/api.projects.file-format-settings.get" target="_blank"><b>API Documentation</b></a></li>
* <li><a href="https://developer.crowdin.com/enterprise/api/v2/#operation/api.projects.file-format-settings.get" target="_blank"><b>Enterprise API Documentation</b></a></li>
* </ul>
*/
public ResponseObject<FileFormatSettingsResource> getProjectFileFormatSettings(Long projectId, Long fileFormatSettingsId) {
String url = formUrl_projectFileFormatSettingsId(projectId, fileFormatSettingsId);
FileFormatSettingsResponseObject response = this.httpClient.get(url, new HttpRequestConfig(), FileFormatSettingsResponseObject.class);
return ResponseObject.of(response.getData());
}

/**
* @param projectId project identifier
* @param fileFormatSettingsId file format settings identifier
* @see <ul>
* <li><a href="https://developer.crowdin.com/api/v2/#operation/api.projects.file-format-settings.delete" target="_blank"><b>API Documentation</b></a></li>
* <li><a href="https://developer.crowdin.com/enterprise/api/v2/#operation/api.projects.file-format-settings.delete" target="_blank"><b>Enterprise API Documentation</b></a></li>
* </ul>
*/
public void deleteProjectFileFormatSettings(Long projectId, Long fileFormatSettingsId) throws HttpException, HttpBadRequestException {
String url = formUrl_projectFileFormatSettingsId(projectId, fileFormatSettingsId);
this.httpClient.delete(url, new HttpRequestConfig(), Void.class);
}

/**
* @param projectId project identifier
* @param fileFormatSettingsId file format settings identifier
* @param request request object
* @return updated file format settings
* @see <ul>
* <li><a href="https://developer.crowdin.com/api/v2/#operation/api.projects.file-format-settings.patch" target="_blank"><b>API Documentation</b></a></li>
* <li><a href="https://developer.crowdin.com/enterprise/api/v2/#operation/api.projects.file-format-settings.patch" target="_blank"><b>Enterprise API Documentation</b></a></li>
* </ul>
*/
public ResponseObject<FileFormatSettingsResource> editProjectFileFormatSettings(Long projectId, Long fileFormatSettingsId, List<PatchRequest> request) throws HttpException, HttpBadRequestException {
String url = formUrl_projectFileFormatSettingsId(projectId, fileFormatSettingsId);
FileFormatSettingsResponseObject response = this.httpClient.patch(url, request, new HttpRequestConfig(), FileFormatSettingsResponseObject.class);
return ResponseObject.of(response.getData());
}

//<editor-fold desc="Helper methods">
private String formUrl_projectFileFormatSettings(Long projectId) {
return this.url + "/projects/" + projectId + "/file-format-settings";
}

private String formUrl_projectFileFormatSettingsId(Long projectId, Long fileFormatSettingsId) {
return this.url + "/projects/" + projectId + "/file-format-settings/" + fileFormatSettingsId;
}

private String formUrl_projectFileFormatSettingsId_customSegmentations(Long projectId, Long fileFormatSettingsId) {
return this.url + "/projects/" + projectId + "/file-format-settings/" + fileFormatSettingsId + "/custom-segmentations";
}
//</editor-fold>

//</editor-fold>
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
package com.crowdin.client.projectsgroups.model;

import lombok.Data;

@Data
public class AddProjectFileFormatSettingsRequest {
private String format;
private FileFormatSettings settings;
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
package com.crowdin.client.projectsgroups.model;

import lombok.Data;

@Data
public class AdocFileFormatSettings extends FileFormatSettings {
private Boolean contentSegmentation;
private Long srxStorageId;
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
package com.crowdin.client.projectsgroups.model;

import lombok.Data;

@Data
public class AndroidFileFormatSettings extends FileFormatSettings {
private Boolean contentSegmentation;
private Long srxStorageId;
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
package com.crowdin.client.projectsgroups.model;

import lombok.Data;

@Data
public class ArbFileFormatSettings extends FileFormatSettings {
private Boolean contentSegmentation;
private Long srxStorageId;
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
package com.crowdin.client.projectsgroups.model;

import lombok.Data;

@Data
public class ChromeFileFormatSettings extends FileFormatSettings {
private Boolean contentSegmentation;
private Long srxStorageId;
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
package com.crowdin.client.projectsgroups.model;

import lombok.Data;

@Data
public class DitaFileFormatSettings extends FileFormatSettings {
private Boolean contentSegmentation;
private Long srxStorageId;
}
Loading