From 56682af0bdbc1bb1be6b5001a665e4aac22f78fa Mon Sep 17 00:00:00 2001 From: Tristan Lins Date: Wed, 5 Jun 2019 13:57:06 +0200 Subject: [PATCH 1/9] Use Query classes to retrieve projects Allow most flexibility and forward-compatiblity with new parameters, added in the future. --- src/main/java/org/gitlab/api/GitlabAPI.java | 16 +- src/main/java/org/gitlab/api/Pagination.java | 52 +++-- .../org/gitlab/api/query/PaginationQuery.java | 40 ++++ .../org/gitlab/api/query/ProjectsQuery.java | 192 ++++++++++++++++++ 4 files changed, 270 insertions(+), 30 deletions(-) create mode 100644 src/main/java/org/gitlab/api/query/PaginationQuery.java create mode 100644 src/main/java/org/gitlab/api/query/ProjectsQuery.java diff --git a/src/main/java/org/gitlab/api/GitlabAPI.java b/src/main/java/org/gitlab/api/GitlabAPI.java index c544351d..bdd4e5f3 100644 --- a/src/main/java/org/gitlab/api/GitlabAPI.java +++ b/src/main/java/org/gitlab/api/GitlabAPI.java @@ -5,6 +5,8 @@ import org.gitlab.api.http.GitlabHTTPRequestor; import org.gitlab.api.http.Query; import org.gitlab.api.models.*; +import org.gitlab.api.query.PaginationQuery; +import org.gitlab.api.query.ProjectsQuery; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -377,7 +379,7 @@ public GitlabSSHKey createSSHKey(Integer targetUserId, String title, String key) return dispatch().to(tailUrl, GitlabSSHKey.class); } - + /** * Create a new ssh key for the authenticated user. * @@ -632,7 +634,7 @@ public GitlabGroup createGroup(String name, String path, String ldapCn, GitlabAc return dispatch().to(tailUrl, GitlabGroup.class); } - + /** * Creates a Group * @@ -828,6 +830,16 @@ public List getProjectsWithPagination(int page, int perPage) thro return getProjectsWithPagination(pagination); } + /** + * Get a list of projects accessible by the authenticated user. + * + * @return A list of gitlab projects + */ + public List getProjects(ProjectsQuery projectsQuery) { + String tailUrl = GitlabProject.URL + projectsQuery; + return retrieve().getAll(tailUrl, GitlabProject[].class); + } + /** * Get a list of projects by pagination accessible by the authenticated user. * diff --git a/src/main/java/org/gitlab/api/Pagination.java b/src/main/java/org/gitlab/api/Pagination.java index b7084529..20be0d27 100644 --- a/src/main/java/org/gitlab/api/Pagination.java +++ b/src/main/java/org/gitlab/api/Pagination.java @@ -1,48 +1,44 @@ package org.gitlab.api; import org.gitlab.api.http.Query; +import org.gitlab.api.query.PaginationQuery; -import java.io.UnsupportedEncodingException; +/** + * @deprecated Use {@link PaginationQuery#PARAM_PAGE} instead. + */ +@Deprecated +public class Pagination extends PaginationQuery { -public class Pagination { - public static final String PARAM_PAGE = "page"; - public static final String PARAM_PER_PAGE = "per_page"; - public static final int MAX_ITEMS_PER_PAGE = 100; - private final Query paginationQuery = new Query(); + /** + * @deprecated Use {@link PaginationQuery#PARAM_PAGE} instead. + */ + @Deprecated + public static final String PARAM_PAGE = PaginationQuery.PARAM_PAGE; - public void setPage(int page) { - try { - paginationQuery.append(PARAM_PAGE, String.valueOf(page)); - } catch (UnsupportedEncodingException ignored) { - } - } + /** + @deprecated Use {@link PaginationQuery#PARAM_PER_PAGE} instead. + */ + @Deprecated + public static final String PARAM_PER_PAGE = PaginationQuery.PARAM_PER_PAGE; + + /** + @deprecated Use {@link PaginationQuery#MAX_ITEMS_PER_PAGE} instead. + */ + @Deprecated + public static final int MAX_ITEMS_PER_PAGE = PaginationQuery.MAX_ITEMS_PER_PAGE; - public void setPerPage(int perPage) { - if (perPage > MAX_ITEMS_PER_PAGE) { - throw new IllegalArgumentException("Max value for perPage is " + MAX_ITEMS_PER_PAGE); - } - try { - paginationQuery.append(PARAM_PER_PAGE, String.valueOf(perPage)); - } catch (UnsupportedEncodingException ignored) { - } - } - public Pagination withPage(int page) { setPage(page); return this; } - + public Pagination withPerPage(int perPage) { setPerPage(perPage); return this; } public Query asQuery() { - return paginationQuery; + return this; } - @Override - public String toString() { - return paginationQuery.toString(); - } } diff --git a/src/main/java/org/gitlab/api/query/PaginationQuery.java b/src/main/java/org/gitlab/api/query/PaginationQuery.java new file mode 100644 index 00000000..7996ec3f --- /dev/null +++ b/src/main/java/org/gitlab/api/query/PaginationQuery.java @@ -0,0 +1,40 @@ +package org.gitlab.api.query; + +import org.gitlab.api.http.Query; + +import java.io.UnsupportedEncodingException; + +public class PaginationQuery extends Query { + + public static final String PARAM_PAGE = "page"; + public static final String PARAM_PER_PAGE = "per_page"; + public static final int MAX_ITEMS_PER_PAGE = 100; + + public void setPage(int page) { + try { + append(PARAM_PAGE, String.valueOf(page)); + } catch (UnsupportedEncodingException ignored) { + } + } + + public void setPerPage(int perPage) { + if (perPage > MAX_ITEMS_PER_PAGE) { + throw new IllegalArgumentException("Max value for perPage is " + MAX_ITEMS_PER_PAGE); + } + try { + append(PARAM_PER_PAGE, String.valueOf(perPage)); + } catch (UnsupportedEncodingException ignored) { + } + } + + public PaginationQuery withPage(int page) { + setPage(page); + return this; + } + + public PaginationQuery withPerPage(int perPage) { + setPerPage(perPage); + return this; + } + +} diff --git a/src/main/java/org/gitlab/api/query/ProjectsQuery.java b/src/main/java/org/gitlab/api/query/ProjectsQuery.java new file mode 100644 index 00000000..02fd4142 --- /dev/null +++ b/src/main/java/org/gitlab/api/query/ProjectsQuery.java @@ -0,0 +1,192 @@ +package org.gitlab.api.query; + +import org.gitlab.api.models.GitlabAccessLevel; + +import java.io.UnsupportedEncodingException; + +public class ProjectsQuery extends PaginationQuery { + + public static final String PARAM_ARCHIVED = "archived"; + public static final String PARAM_VISIBILITY = "visibility"; + public static final String PARAM_ORDER_BY = "order_by"; + public static final String PARAM_SORT = "sort"; + public static final String PARAM_SEARCH = "search"; + public static final String PARAM_SIMPLE = "simple"; + public static final String PARAM_OWNED = "owned"; + public static final String PARAM_MEMBERSHIP = "membership"; + public static final String PARAM_STARRED = "starred"; + public static final String PARAM_STATISTICS = "statistics"; + public static final String PARAM_WITH_CUSTOM_ATTRIBUTES = "with_custom_attributes"; + public static final String PARAM_WITH_ISSUES_ENABLED = "with_issues_enabled"; + public static final String PARAM_WITH_MERGE_REQUESTS_ENABLED = "with_merge_requests_enabled"; + public static final String PARAM_WITH_PROGRAMMING_LANGUAGE = "with_programming_language"; + public static final String PARAM_WIKI_CHECKSUM_FAILED = "wiki_checksum_failed"; + public static final String PARAM_REPOSITORY_CHECKSUM_FAILED = "repository_checksum_failed"; + public static final String PARAM_MIN_ACCESS_LEVEL = "min_access_level"; + + public void setArchived(Boolean archived) throws UnsupportedEncodingException { + appendIf(PARAM_ARCHIVED, archived); + } + + public ProjectsQuery withArchived(Boolean archived) throws UnsupportedEncodingException { + setArchived(archived); + return this; + } + + public void setVisibility(String visibility) throws UnsupportedEncodingException { + appendIf(PARAM_VISIBILITY, visibility); + } + + public ProjectsQuery withVisibility(String visibility) throws UnsupportedEncodingException { + setVisibility(visibility); + return this; + } + + public void setOrderBy(String orderBy) throws UnsupportedEncodingException { + appendIf(PARAM_ORDER_BY, orderBy); + } + + public ProjectsQuery withOrderBy(String orderBy) throws UnsupportedEncodingException { + setOrderBy(orderBy); + return this; + } + + public void setSort(String sort) throws UnsupportedEncodingException { + appendIf(PARAM_SORT, sort); + } + + public ProjectsQuery withSort(String sort) throws UnsupportedEncodingException { + setSort(sort); + return this; + } + + public void setSearch(String search) throws UnsupportedEncodingException { + appendIf(PARAM_SEARCH, search); + } + + public ProjectsQuery withSearch(String search) throws UnsupportedEncodingException { + setSearch(search); + return this; + } + + public void setSimple(Boolean simple) throws UnsupportedEncodingException { + appendIf(PARAM_SIMPLE, simple); + } + + public ProjectsQuery withSimple(Boolean simple) throws UnsupportedEncodingException { + setSimple(simple); + return this; + } + + public void setOwned(Boolean owned) throws UnsupportedEncodingException { + appendIf(PARAM_OWNED, owned); + } + + public ProjectsQuery withOwned(Boolean owned) throws UnsupportedEncodingException { + setOwned(owned); + return this; + } + + public void setMembership(Boolean membership) throws UnsupportedEncodingException { + appendIf(PARAM_MEMBERSHIP, membership); + } + + public ProjectsQuery withMembership(Boolean membership) throws UnsupportedEncodingException { + setMembership(membership); + return this; + } + + public void setStarred(Boolean starred) throws UnsupportedEncodingException { + appendIf(PARAM_STARRED, starred); + } + + public ProjectsQuery withStarred(Boolean starred) throws UnsupportedEncodingException { + setStarred(starred); + return this; + } + + public void setStatistics(Boolean statistics) throws UnsupportedEncodingException { + appendIf(PARAM_STATISTICS, statistics); + } + + public ProjectsQuery withStatistics(Boolean statistics) throws UnsupportedEncodingException { + setStatistics(statistics); + return this; + } + + public void setWithCustomAttributes(Boolean withCustomAttributes) throws UnsupportedEncodingException { + appendIf(PARAM_WITH_CUSTOM_ATTRIBUTES, withCustomAttributes); + } + + public ProjectsQuery withWithCustomAttributes(Boolean withCustomAttributes) throws UnsupportedEncodingException { + setWithCustomAttributes(withCustomAttributes); + return this; + } + + public void setWithIssuesEnabled(Boolean withIssuesEnabled) throws UnsupportedEncodingException { + appendIf(PARAM_WITH_ISSUES_ENABLED, withIssuesEnabled); + } + + public ProjectsQuery withWithIssuesEnabled(Boolean withIssuesEnabled) throws UnsupportedEncodingException { + setWithIssuesEnabled(withIssuesEnabled); + return this; + } + + public void setWithMergeRequestsEnabled(Boolean withMergeRequestsEnabled) throws UnsupportedEncodingException { + appendIf(PARAM_WITH_MERGE_REQUESTS_ENABLED, withMergeRequestsEnabled); + } + + public ProjectsQuery withWithMergeRequestsEnabled(Boolean withMergeRequestsEnabled) throws UnsupportedEncodingException { + setWithMergeRequestsEnabled(withMergeRequestsEnabled); + return this; + } + + public void setWithProgrammingLanguage(String withProgrammingLanguage) throws UnsupportedEncodingException { + appendIf(PARAM_WITH_PROGRAMMING_LANGUAGE, withProgrammingLanguage); + } + + public ProjectsQuery withWithProgrammingLanguage(String withProgrammingLanguage) throws UnsupportedEncodingException { + setWithProgrammingLanguage(withProgrammingLanguage); + return this; + } + + public void setWikiChecksumFailed(Boolean wikiChecksumFailed) throws UnsupportedEncodingException { + appendIf(PARAM_WIKI_CHECKSUM_FAILED, wikiChecksumFailed); + } + + public ProjectsQuery withWikiChecksumFailed(Boolean wikiChecksumFailed) throws UnsupportedEncodingException { + setWikiChecksumFailed(wikiChecksumFailed); + return this; + } + + public void setRepositoryChecksumFailed(Boolean repositoryChecksumFailed) throws UnsupportedEncodingException { + appendIf(PARAM_REPOSITORY_CHECKSUM_FAILED, repositoryChecksumFailed); + } + + public ProjectsQuery withRepositoryChecksumFailed(Boolean repositoryChecksumFailed) throws UnsupportedEncodingException { + setRepositoryChecksumFailed(repositoryChecksumFailed); + return this; + } + + public void setMinAccessLevel(GitlabAccessLevel minAccessLevel) throws UnsupportedEncodingException { + appendIf(PARAM_MIN_ACCESS_LEVEL, minAccessLevel); + } + + public ProjectsQuery withMinAccessLevel(GitlabAccessLevel minAccessLevel) throws UnsupportedEncodingException { + setMinAccessLevel(minAccessLevel); + return this; + } + + @Override + public ProjectsQuery withPage(int page) { + super.withPage(page); + return this; + } + + @Override + public ProjectsQuery withPerPage(int perPage) { + super.withPerPage(perPage); + return this; + } + +} From 5fbaea5e86abd31b910a440868888dafa35cf089 Mon Sep 17 00:00:00 2001 From: Tristan Lins Date: Wed, 5 Jun 2019 13:59:08 +0200 Subject: [PATCH 2/9] Add GitlabAPI#getProjectPipelines() --- src/main/java/org/gitlab/api/GitlabAPI.java | 42 ++++++++ .../org/gitlab/api/query/PipelinesQuery.java | 100 ++++++++++++++++++ 2 files changed, 142 insertions(+) create mode 100644 src/main/java/org/gitlab/api/query/PipelinesQuery.java diff --git a/src/main/java/org/gitlab/api/GitlabAPI.java b/src/main/java/org/gitlab/api/GitlabAPI.java index bdd4e5f3..ed9874a4 100644 --- a/src/main/java/org/gitlab/api/GitlabAPI.java +++ b/src/main/java/org/gitlab/api/GitlabAPI.java @@ -6,6 +6,7 @@ import org.gitlab.api.http.Query; import org.gitlab.api.models.*; import org.gitlab.api.query.PaginationQuery; +import org.gitlab.api.query.PipelinesQuery; import org.gitlab.api.query.ProjectsQuery; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -973,6 +974,47 @@ public GitlabUpload uploadFile(GitlabProject project, File file) throws IOExcept return dispatch().withAttachment("file", file).to(tailUrl, GitlabUpload.class); } + /** + * Get a list of a project's pipelines in Gitlab + * + * @param project the project + * @return A list of project pipelines + */ + public List getProjectPipelines(GitlabProject project) { + return getProjectPipelines(project.getId()); + } + + /** + * Get a list of a project's pipelines in Gitlab + * + * @param projectId the project id + * @return A list of project pipelines + */ + public List getProjectPipelines(Integer projectId) { + return getProjectPipelines(projectId, new PipelinesQuery().withPerPage(PaginationQuery.MAX_ITEMS_PER_PAGE)); + } + + /** + * Get a list of a project's pipelines in Gitlab + * + * @param project the project + * @return A list of project pipelines + */ + public List getProjectPipelines(GitlabProject project, PipelinesQuery pipelinesQuery) { + return getProjectPipelines(project.getId(), pipelinesQuery); + } + + /** + * Get a list of a project's pipelines in Gitlab + * + * @param projectId the project id + * @return A list of project pipelines + */ + public List getProjectPipelines(Integer projectId, PipelinesQuery pipelinesQuery) { + String tailUrl = GitlabProject.URL + "/" + sanitizeProjectId(projectId) + GitlabPipeline.URL + pipelinesQuery; + return retrieve().getAll(tailUrl, GitlabPipeline[].class); + } + /** * Gets a list of a project's jobs in Gitlab * diff --git a/src/main/java/org/gitlab/api/query/PipelinesQuery.java b/src/main/java/org/gitlab/api/query/PipelinesQuery.java new file mode 100644 index 00000000..5c919e2c --- /dev/null +++ b/src/main/java/org/gitlab/api/query/PipelinesQuery.java @@ -0,0 +1,100 @@ +package org.gitlab.api.query; + +import java.io.UnsupportedEncodingException; + +public class PipelinesQuery extends PaginationQuery { + + public void setScope(String scope) throws UnsupportedEncodingException { + appendIf("scope", scope); + } + + public PipelinesQuery withScope(String scope) throws UnsupportedEncodingException { + this.setScope(scope); + return this; + } + + public void setStatus(String status) throws UnsupportedEncodingException { + appendIf("status", status); + } + + public PipelinesQuery withStatus(String status) throws UnsupportedEncodingException { + this.setStatus(status); + return this; + } + + public void setRef(String ref) throws UnsupportedEncodingException { + appendIf("ref", ref); + } + + public PipelinesQuery withRef(String ref) throws UnsupportedEncodingException { + this.setRef(ref); + return this; + } + + public void setSha(String sha) throws UnsupportedEncodingException { + appendIf("sha", sha); + } + + public PipelinesQuery withSha(String sha) throws UnsupportedEncodingException { + this.setSha(sha); + return this; + } + + public void setYamlErrors(Boolean yamlErrors) throws UnsupportedEncodingException { + appendIf("yaml_errors", yamlErrors); + } + + public PipelinesQuery withYamlErrors(Boolean yamlErrors) throws UnsupportedEncodingException { + this.setYamlErrors(yamlErrors); + return this; + } + + public void setName(String name) throws UnsupportedEncodingException { + appendIf("name", name); + } + + public PipelinesQuery withName(String name) throws UnsupportedEncodingException { + this.setName(name); + return this; + } + + public void setUsername(String username) throws UnsupportedEncodingException { + appendIf("username", username); + } + + public PipelinesQuery withUsername(String username) throws UnsupportedEncodingException { + this.setUsername(username); + return this; + } + + public void setOrderBy(String orderBy) throws UnsupportedEncodingException { + appendIf("order_by", orderBy); + } + + public PipelinesQuery withOrderBy(String orderBy) throws UnsupportedEncodingException { + this.setOrderBy(orderBy); + return this; + } + + public void setSort(String sort) throws UnsupportedEncodingException { + appendIf("sort", sort); + } + + public PipelinesQuery withSort(String sort) throws UnsupportedEncodingException { + this.setSort(sort); + return this; + } + + @Override + public PipelinesQuery withPage(int page) { + super.withPage(page); + return this; + } + + @Override + public PipelinesQuery withPerPage(int perPage) { + super.withPerPage(perPage); + return this; + } + +} From 56deddb2096059dc2a77ac4e3e2864cd190c5e6e Mon Sep 17 00:00:00 2001 From: Tristan Lins Date: Wed, 5 Jun 2019 14:20:27 +0200 Subject: [PATCH 3/9] [CI] deploy package to gitlab repository --- .gitlab-ci.yml | 24 ++++++++++++++++++++++++ ci_settings.xml | 16 ++++++++++++++++ pom.xml | 19 +++++++++++++++++++ 3 files changed, 59 insertions(+) create mode 100644 .gitlab-ci.yml create mode 100644 ci_settings.xml diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml new file mode 100644 index 00000000..a0fb56e1 --- /dev/null +++ b/.gitlab-ci.yml @@ -0,0 +1,24 @@ +image: adoptopenjdk/openjdk11 + +cache: + paths: + - /root/.m2/repository + +build: + artifacts: + name: build + paths: + - target + untracked: true + expire_in: 30 days + when: always + script: + - ./mvnw -B -V package + +deploy: + dependencies: + - build + only: + - master + script: + - ./mvnw -B -V -s ci_settings.xml -P gitlab-repository deploy diff --git a/ci_settings.xml b/ci_settings.xml new file mode 100644 index 00000000..20e8f6eb --- /dev/null +++ b/ci_settings.xml @@ -0,0 +1,16 @@ + + + + gitlab-maven + + + + Job-Token + ${env.CI_JOB_TOKEN} + + + + + + \ No newline at end of file diff --git a/pom.xml b/pom.xml index f61b6cd0..0893d033 100644 --- a/pom.xml +++ b/pom.xml @@ -298,5 +298,24 @@ + + gitlab-repository + + + gitlab-maven + https://gitlab.com/api/v4/projects/${env.CI_PROJECT_ID}/packages/maven + + + + + gitlab-maven + https://gitlab.com/api/v4/projects/${env.CI_PROJECT_ID}/packages/maven + + + gitlab-maven + https://gitlab.com/api/v4/projects/${env.CI_PROJECT_ID}/packages/maven + + + From ec39106a173071fedc0fad6a5da47b8b01390377 Mon Sep 17 00:00:00 2001 From: Tristan Lins Date: Wed, 5 Jun 2019 14:20:40 +0200 Subject: [PATCH 4/9] Upgrade gradle --- build.gradle | 4 ---- gradle/wrapper/gradle-wrapper.jar | Bin 54413 -> 54329 bytes gradle/wrapper/gradle-wrapper.properties | 2 +- 3 files changed, 1 insertion(+), 5 deletions(-) diff --git a/build.gradle b/build.gradle index c9fd7ac3..800980e4 100644 --- a/build.gradle +++ b/build.gradle @@ -55,10 +55,6 @@ task sourcesJar(type: Jar, dependsOn:classes) { artifacts { archives sourcesJar } -task wrapper(type: Wrapper) { - gradleVersion = "4.6" -} - test { useJUnitPlatform { includeEngines 'junit-jupiter' diff --git a/gradle/wrapper/gradle-wrapper.jar b/gradle/wrapper/gradle-wrapper.jar index 0d4a9516871afd710a9d84d89e31ba77745607bd..f6b961fd5a86aa5fbfe90f707c3138408be7c718 100644 GIT binary patch delta 7286 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 delta 7399 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 DOQ Date: Wed, 5 Jun 2019 14:21:49 +0200 Subject: [PATCH 5/9] fixup! [CI] deploy package to gitlab repository --- .gitlab-ci.yml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index a0fb56e1..2d361e13 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -5,6 +5,7 @@ cache: - /root/.m2/repository build: + stage: build artifacts: name: build paths: @@ -16,6 +17,7 @@ build: - ./mvnw -B -V package deploy: + stage: deploy dependencies: - build only: From 7e5f89ac4c7f7488b6b8f51c9727c0e0cd4b71a0 Mon Sep 17 00:00:00 2001 From: Tristan Lins Date: Sun, 30 Jun 2019 16:20:41 +0200 Subject: [PATCH 6/9] Add missing fields to GitlabPipeline --- .../api/jackson/InstantDeserializer.java | 80 ++++++ .../org/gitlab/api/models/GitlabPipeline.java | 272 +++++++++++++++++- .../gitlab/api/InstantDeserializerTest.java | 33 +++ 3 files changed, 373 insertions(+), 12 deletions(-) create mode 100644 src/main/java/org/gitlab/api/jackson/InstantDeserializer.java create mode 100644 src/test/java/org/gitlab/api/InstantDeserializerTest.java diff --git a/src/main/java/org/gitlab/api/jackson/InstantDeserializer.java b/src/main/java/org/gitlab/api/jackson/InstantDeserializer.java new file mode 100644 index 00000000..5663826a --- /dev/null +++ b/src/main/java/org/gitlab/api/jackson/InstantDeserializer.java @@ -0,0 +1,80 @@ +package org.gitlab.api.jackson; + +import com.fasterxml.jackson.core.JsonParseException; +import com.fasterxml.jackson.core.JsonParser; +import com.fasterxml.jackson.core.JsonToken; +import com.fasterxml.jackson.databind.DeserializationContext; +import com.fasterxml.jackson.databind.deser.std.StdDeserializer; + +import java.io.IOException; +import java.time.Instant; +import java.time.format.DateTimeFormatter; +import java.time.format.DateTimeFormatterBuilder; +import java.time.format.DateTimeParseException; +import java.time.format.FormatStyle; +import java.util.Locale; +import java.util.Objects; +import java.util.stream.Stream; + +/** + * A spezialized {@link Instant} deserializer that can parse different formats. + */ +public class InstantDeserializer extends StdDeserializer { + + private static final DateTimeFormatter LOCAL_DATE_TIME_FORMATTER_WITH_SPACE_SEPARATOR = new DateTimeFormatterBuilder() + .parseCaseInsensitive() + .append(DateTimeFormatter.ISO_LOCAL_DATE) + .appendLiteral(' ') + .append(DateTimeFormatter.ISO_LOCAL_TIME) + .toFormatter(Locale.getDefault(Locale.Category.FORMAT)); + + public InstantDeserializer() { + super(Instant.class); + } + + @Override + public Instant deserialize(JsonParser parser, DeserializationContext context) throws IOException { + if (JsonToken.VALUE_NULL.equals(parser.getCurrentToken())) { + return null; + } + + final String text = parser.getText(); + + if (null == text || text.trim().isEmpty()) { + return null; + } + + return getFormatters() + .map(formatter -> { + try { + return formatter.parse(text, Instant::from); + } catch (DateTimeParseException e) { + return null; + } + }) + .filter(Objects::nonNull) + .findFirst() + .orElseThrow(() -> new JsonParseException("Unable to parse instant \"" + text + "\"", parser.getCurrentLocation())); + } + + private static Stream getFormatters() { + return Stream.of( + // English (Standard) Formats + DateTimeFormatter.ofLocalizedDateTime(FormatStyle.LONG, FormatStyle.LONG).withLocale(Locale.ENGLISH), + DateTimeFormatter.ofLocalizedDateTime(FormatStyle.MEDIUM, FormatStyle.LONG).withLocale(Locale.ENGLISH), + DateTimeFormatter.ofLocalizedDateTime(FormatStyle.SHORT, FormatStyle.LONG).withLocale(Locale.ENGLISH), + DateTimeFormatter.ofLocalizedDateTime(FormatStyle.LONG, FormatStyle.MEDIUM).withLocale(Locale.ENGLISH), + DateTimeFormatter.ofLocalizedDateTime(FormatStyle.MEDIUM, FormatStyle.MEDIUM).withLocale(Locale.ENGLISH), + DateTimeFormatter.ofLocalizedDateTime(FormatStyle.SHORT, FormatStyle.MEDIUM).withLocale(Locale.ENGLISH), + DateTimeFormatter.ofLocalizedDateTime(FormatStyle.LONG, FormatStyle.SHORT).withLocale(Locale.ENGLISH), + DateTimeFormatter.ofLocalizedDateTime(FormatStyle.MEDIUM, FormatStyle.SHORT).withLocale(Locale.ENGLISH), + DateTimeFormatter.ofLocalizedDateTime(FormatStyle.SHORT, FormatStyle.SHORT).withLocale(Locale.ENGLISH), + + // ISO Formats + LOCAL_DATE_TIME_FORMATTER_WITH_SPACE_SEPARATOR, + DateTimeFormatter.ISO_LOCAL_DATE_TIME, + DateTimeFormatter.ISO_DATE_TIME + ); + } + +} diff --git a/src/main/java/org/gitlab/api/models/GitlabPipeline.java b/src/main/java/org/gitlab/api/models/GitlabPipeline.java index 31927db5..fc92b1cd 100644 --- a/src/main/java/org/gitlab/api/models/GitlabPipeline.java +++ b/src/main/java/org/gitlab/api/models/GitlabPipeline.java @@ -1,23 +1,70 @@ package org.gitlab.api.models; import com.fasterxml.jackson.annotation.JsonProperty; +import com.fasterxml.jackson.databind.annotation.JsonDeserialize; +import org.gitlab.api.jackson.InstantDeserializer; + +import java.time.Instant; public class GitlabPipeline { public static final String URL = "/pipelines"; - @JsonProperty("id") private Integer id; - @JsonProperty("ref") - private String ref; - @JsonProperty("sha") private String sha; + @JsonProperty("ref") + private String ref; + @JsonProperty("status") private String status; + @JsonProperty("web_url") + private String webUrl; + + @JsonProperty("before_sha") + private String beforeSha; + + @JsonProperty("tag") + private boolean tag; + + @JsonProperty("yaml_errors") + private String yamlErrors; + + @JsonProperty("user") + private GitlabUser user; + + @JsonProperty("created_at") + @JsonDeserialize(using = InstantDeserializer.class) + private Instant createdAt; + + @JsonProperty("updated_at") + @JsonDeserialize(using = InstantDeserializer.class) + private Instant updatedAt; + + @JsonProperty("started_at") + @JsonDeserialize(using = InstantDeserializer.class) + private Instant startedAt; + + @JsonProperty("finished_at") + @JsonDeserialize(using = InstantDeserializer.class) + private Instant finishedAt; + + @JsonProperty("committed_at") + @JsonDeserialize(using = InstantDeserializer.class) + private Instant committedAt; + + @JsonProperty("duration") + private int duration; + + @JsonProperty("coverage") + private String coverage; + + @JsonProperty("detailed_status") + private DetailedStatus detailedStatus; + public Integer getId() { return id; } @@ -26,14 +73,6 @@ public void setId(Integer id) { this.id = id; } - public String getRef() { - return ref; - } - - public void setRef(String ref) { - this.ref = ref; - } - public String getSha() { return sha; } @@ -42,6 +81,14 @@ public void setSha(String sha) { this.sha = sha; } + public String getRef() { + return ref; + } + + public void setRef(String ref) { + this.ref = ref; + } + public String getStatus() { return status; } @@ -49,4 +96,205 @@ public String getStatus() { public void setStatus(String status) { this.status = status; } + + public String getWebUrl() { + return webUrl; + } + + public void setWebUrl(String webUrl) { + this.webUrl = webUrl; + } + + public String getBeforeSha() { + return beforeSha; + } + + public void setBeforeSha(String beforeSha) { + this.beforeSha = beforeSha; + } + + public boolean isTag() { + return tag; + } + + public void setTag(boolean tag) { + this.tag = tag; + } + + public String getYamlErrors() { + return yamlErrors; + } + + public void setYamlErrors(String yamlErrors) { + this.yamlErrors = yamlErrors; + } + + public GitlabUser getUser() { + return user; + } + + public void setUser(GitlabUser user) { + this.user = user; + } + + public Instant getCreatedAt() { + return createdAt; + } + + public void setCreatedAt(Instant createdAt) { + this.createdAt = createdAt; + } + + public Instant getUpdatedAt() { + return updatedAt; + } + + public void setUpdatedAt(Instant updatedAt) { + this.updatedAt = updatedAt; + } + + public Instant getStartedAt() { + return startedAt; + } + + public void setStartedAt(Instant startedAt) { + this.startedAt = startedAt; + } + + public Instant getFinishedAt() { + return finishedAt; + } + + public void setFinishedAt(Instant finishedAt) { + this.finishedAt = finishedAt; + } + + public Instant getCommittedAt() { + return committedAt; + } + + public void setCommittedAt(Instant committedAt) { + this.committedAt = committedAt; + } + + public int getDuration() { + return duration; + } + + public void setDuration(int duration) { + this.duration = duration; + } + + public String getCoverage() { + return coverage; + } + + public void setCoverage(String coverage) { + this.coverage = coverage; + } + + public DetailedStatus getDetailedStatus() { + return detailedStatus; + } + + public void setDetailedStatus(DetailedStatus detailedStatus) { + this.detailedStatus = detailedStatus; + } + + public static class DetailedStatus { + + private String icon; + + private String text; + + private String label; + + private String group; + + private String tooltip; + + @JsonProperty("has_details") + private String hasDetails; + + @JsonProperty("details_path") + private String detailsPath; + + private String illustration; + + private String favicon; + + public String getIcon() { + return icon; + } + + public void setIcon(String icon) { + this.icon = icon; + } + + public String getText() { + return text; + } + + public void setText(String text) { + this.text = text; + } + + public String getLabel() { + return label; + } + + public void setLabel(String label) { + this.label = label; + } + + public String getGroup() { + return group; + } + + public void setGroup(String group) { + this.group = group; + } + + public String getTooltip() { + return tooltip; + } + + public void setTooltip(String tooltip) { + this.tooltip = tooltip; + } + + public String getHasDetails() { + return hasDetails; + } + + public void setHasDetails(String hasDetails) { + this.hasDetails = hasDetails; + } + + public String getDetailsPath() { + return detailsPath; + } + + public void setDetailsPath(String detailsPath) { + this.detailsPath = detailsPath; + } + + public String getIllustration() { + return illustration; + } + + public void setIllustration(String illustration) { + this.illustration = illustration; + } + + public String getFavicon() { + return favicon; + } + + public void setFavicon(String favicon) { + this.favicon = favicon; + } + + } + } diff --git a/src/test/java/org/gitlab/api/InstantDeserializerTest.java b/src/test/java/org/gitlab/api/InstantDeserializerTest.java new file mode 100644 index 00000000..03c6f49e --- /dev/null +++ b/src/test/java/org/gitlab/api/InstantDeserializerTest.java @@ -0,0 +1,33 @@ +package org.gitlab.api; + +import com.fasterxml.jackson.core.JsonParser; +import com.fasterxml.jackson.databind.ObjectMapper; +import org.gitlab.api.jackson.InstantDeserializer; +import org.junit.jupiter.api.Test; + +import java.io.IOException; +import java.time.*; + +import static org.junit.jupiter.api.Assertions.*; + +class InstantDeserializerTest { + + @Test + void deserialize() throws IOException { + final ObjectMapper objectMapper = new ObjectMapper(); + + final InstantDeserializer deserializer = new InstantDeserializer(); + final JsonParser parser = objectMapper.treeAsTokens(objectMapper.readTree("\"2016-08-11T11:28:34.085Z\"")); + parser.nextToken(); + final Instant instant = deserializer.deserialize(parser, objectMapper.getDeserializationContext()); + + assertEquals(Instant.from( + ZonedDateTime.of( + LocalDate.of(2016, 8, 11), + LocalTime.of(11, 28, 34, 85), + ZoneOffset.UTC + ) + ), instant); + } + +} \ No newline at end of file From 903ea84401067e903977ba8037b1db0e6f79f16a Mon Sep 17 00:00:00 2001 From: Tristan Lins Date: Sun, 30 Jun 2019 16:33:48 +0200 Subject: [PATCH 7/9] Add methods GitlabAPI#getProjectPipeline(...) --- src/main/java/org/gitlab/api/GitlabAPI.java | 23 +++++++++++++++++++++ 1 file changed, 23 insertions(+) diff --git a/src/main/java/org/gitlab/api/GitlabAPI.java b/src/main/java/org/gitlab/api/GitlabAPI.java index c8770ec1..210787fe 100644 --- a/src/main/java/org/gitlab/api/GitlabAPI.java +++ b/src/main/java/org/gitlab/api/GitlabAPI.java @@ -976,6 +976,29 @@ public GitlabUpload uploadFile(GitlabProject project, File file) throws IOExcept return dispatch().withAttachment("file", file).to(tailUrl, GitlabUpload.class); } + /** + * Get a project's pipeline + * + * @param project the project + * @param pipeline the pipeline + * @return The project pipeline + */ + public GitlabPipeline getProjectPipeline(GitlabProject project, GitlabPipeline pipeline) throws IOException { + return getProjectPipeline(project.getId(), pipeline.getId()); + } + + /** + * Get a project's pipeline + * + * @param projectId the project id + * @param pipelineId the pipeline id + * @return The project pipeline + */ + public GitlabPipeline getProjectPipeline(Integer projectId, Integer pipelineId) throws IOException { + String tailUrl = GitlabProject.URL + "/" + sanitizeProjectId(projectId) + GitlabPipeline.URL + sanitizeId(pipelineId, "pipelineId"); + return retrieve().to(tailUrl, GitlabPipeline.class); + } + /** * Gets a list of a project's jobs in Gitlab * From d8852f1d705a8e388759f6203f703443c386d205 Mon Sep 17 00:00:00 2001 From: Tristan Lins Date: Sun, 30 Jun 2019 17:20:07 +0200 Subject: [PATCH 8/9] Update readme --- README.md | 31 ++++++++++++++++++++++++++----- 1 file changed, 26 insertions(+), 5 deletions(-) diff --git a/README.md b/README.md index 4dea5cbd..8269762d 100644 --- a/README.md +++ b/README.md @@ -1,8 +1,29 @@ # Gitlab Java API Wrapper -[![Maven Central](https://img.shields.io/maven-central/v/org.gitlab/java-gitlab-api.svg)](http://mvnrepository.com/artifact/org.gitlab/java-gitlab-api) -[![Build Status](https://travis-ci.org/timols/java-gitlab-api.svg?branch=master)](https://travis-ci.org/timols/java-gitlab-api) -A wrapper for the [Gitlab API](https://docs.gitlab.com/ee/api/) written in Java. +This is a fork of [timols/java-gitlab-api](https://github.com/timols/java-gitlab-api)! -[Documentation](https://timols.github.io/java-gitlab-api) is available in the form of [Javadocs](https://timols.github.io/java-gitlab-api) -The major version indicates the API version of gitlab. +Most features / enhancements are [open pull requests](https://github.com/timols/java-gitlab-api/pulls/tristanlins) + +This fork can be used thanks to gitlabs [maven repository](https://gitlab.com/tristanlins/java-gitlab-api/-/packages) feature. + +## How to use this fork + +Add the repository to your `build.gradle` or `pom.xml`: + +```groovy +repositories { + maven { url "https://gitlab.com/api/v4/projects/12707257/packages/maven" } +} +``` + +```xml + + + tristanlins/java-gitlab-api + https://gitlab.com/api/v4/projects/12707257/packages/maven + + +``` + +Then change your dependency version, to [latest snapshot](https://gitlab.com/tristanlins/java-gitlab-api/-/packages). + \ No newline at end of file From 5fa146d8dbee5368b0dc953d780ca235695eb9a9 Mon Sep 17 00:00:00 2001 From: Tristan Lins Date: Sun, 30 Jun 2019 17:52:54 +0200 Subject: [PATCH 9/9] Add missing / at pipeline url --- src/main/java/org/gitlab/api/GitlabAPI.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/org/gitlab/api/GitlabAPI.java b/src/main/java/org/gitlab/api/GitlabAPI.java index bfd402b6..bd3faa92 100644 --- a/src/main/java/org/gitlab/api/GitlabAPI.java +++ b/src/main/java/org/gitlab/api/GitlabAPI.java @@ -1049,7 +1049,7 @@ public GitlabPipeline getProjectPipeline(GitlabProject project, GitlabPipeline p * @return The project pipeline */ public GitlabPipeline getProjectPipeline(Integer projectId, Integer pipelineId) throws IOException { - String tailUrl = GitlabProject.URL + "/" + sanitizeProjectId(projectId) + GitlabPipeline.URL + sanitizeId(pipelineId, "pipelineId"); + String tailUrl = GitlabProject.URL + "/" + sanitizeProjectId(projectId) + GitlabPipeline.URL + "/" + sanitizeId(pipelineId, "pipelineId"); return retrieve().to(tailUrl, GitlabPipeline.class); }