diff --git a/gitlab4j-api/src/main/java/org/gitlab4j/api/ProjectApi.java b/gitlab4j-api/src/main/java/org/gitlab4j/api/ProjectApi.java index fba7d470d..3b1b239f3 100644 --- a/gitlab4j-api/src/main/java/org/gitlab4j/api/ProjectApi.java +++ b/gitlab4j-api/src/main/java/org/gitlab4j/api/ProjectApi.java @@ -41,36 +41,7 @@ import jakarta.ws.rs.core.MultivaluedMap; import jakarta.ws.rs.core.Response; -import org.gitlab4j.api.models.AccessLevel; -import org.gitlab4j.api.models.AccessRequest; -import org.gitlab4j.api.models.ApprovalRule; -import org.gitlab4j.api.models.ApprovalRuleParams; -import org.gitlab4j.api.models.AuditEvent; -import org.gitlab4j.api.models.Badge; -import org.gitlab4j.api.models.CustomAttribute; -import org.gitlab4j.api.models.Event; -import org.gitlab4j.api.models.FileUpload; -import org.gitlab4j.api.models.Issue; -import org.gitlab4j.api.models.Iteration; -import org.gitlab4j.api.models.IterationFilter; -import org.gitlab4j.api.models.Member; -import org.gitlab4j.api.models.Namespace; -import org.gitlab4j.api.models.Project; -import org.gitlab4j.api.models.ProjectAccessToken; -import org.gitlab4j.api.models.ProjectApprovalsConfig; -import org.gitlab4j.api.models.ProjectFetches; -import org.gitlab4j.api.models.ProjectFilter; -import org.gitlab4j.api.models.ProjectGroup; -import org.gitlab4j.api.models.ProjectGroupsFilter; -import org.gitlab4j.api.models.ProjectHook; -import org.gitlab4j.api.models.ProjectUser; -import org.gitlab4j.api.models.PullMirror; -import org.gitlab4j.api.models.PushRules; -import org.gitlab4j.api.models.RemoteMirror; -import org.gitlab4j.api.models.Snippet; -import org.gitlab4j.api.models.UploadedFile; -import org.gitlab4j.api.models.Variable; -import org.gitlab4j.api.models.Visibility; +import org.gitlab4j.api.models.*; import org.gitlab4j.models.Constants; import org.gitlab4j.models.utils.ISO8601; @@ -4774,4 +4745,50 @@ public List listProjectIterations(Object projectIdOrPath, IterationFi get(Response.Status.OK, queryParams, "projects", getProjectIdOrPath(projectIdOrPath), "iterations"); return (response.readEntity(new GenericType>() {})); } + + /** + * Get project templates of the specified type. + * + *
GitLab Endpoint: GET /projects/:id/templates/:type
+ * + * @param projectIdOrPath the project in the form of a Long(ID), String(path), or Project instance + * @param type type of the template. Accepted values are: dockerfiles, gitignores, gitlab_ci_ymls, licenses, issues, or merge_requests. + * @return the list of project templates + * @throws GitLabApiException if any exception occurs + */ + public List getProjectTemplates(Object projectIdOrPath, ProjectTemplateType type) + throws GitLabApiException { + Response response = get( + Response.Status.OK, + null, + "projects", + getProjectIdOrPath(projectIdOrPath), + "templates", + type.toString()); + return (response.readEntity(new GenericType>() {})); + } + + /** + * Get a specific project template of the specified type. + * + *
GitLab Endpoint: GET /projects/:id/templates/:type/:name
+ * + * @param projectIdOrPath the project in the form of a Long(ID), String(path), or Project instance + * @param type type of the template. Accepted values are: dockerfiles, gitignores, gitlab_ci_ymls, licenses, issues, or merge_requests. + * @param templateName Key of the template + * @return the project template detail + * @throws GitLabApiException if any exception occurs + */ + public ProjectTemplateDetail getProjectTemplate( + Object projectIdOrPath, ProjectTemplateType type, String templateName) throws GitLabApiException { + Response response = get( + Response.Status.OK, + null, + "projects", + getProjectIdOrPath(projectIdOrPath), + "templates", + type.toString(), + templateName); + return (response.readEntity(ProjectTemplateDetail.class)); + } } diff --git a/gitlab4j-api/src/test/java/org/gitlab4j/api/TestProjectApi.java b/gitlab4j-api/src/test/java/org/gitlab4j/api/TestProjectApi.java index 55de3b7c6..2bf9eb870 100644 --- a/gitlab4j-api/src/test/java/org/gitlab4j/api/TestProjectApi.java +++ b/gitlab4j-api/src/test/java/org/gitlab4j/api/TestProjectApi.java @@ -53,6 +53,8 @@ import org.gitlab4j.api.models.Project; import org.gitlab4j.api.models.ProjectFetches; import org.gitlab4j.api.models.ProjectFilter; +import org.gitlab4j.api.models.ProjectTemplate; +import org.gitlab4j.api.models.ProjectTemplateType; import org.gitlab4j.api.models.User; import org.gitlab4j.api.models.Variable; import org.gitlab4j.api.models.Visibility; @@ -1084,4 +1086,30 @@ public void testRotateProjectAccessToken() throws GitLabApiException { // assertTrue(gitLabApi.getProjectApi().getProjectAccessToken(testProject.getId(), // token.getId()).isRevoked()); } + + @Test + public void testProjectTemplates() throws GitLabApiException { + + assumeTrue(testProject != null); + + // Act + List templates = + gitLabApi.getProjectApi().getProjectTemplates(testProject, ProjectTemplateType.LICENSES); + + // Assert + assertNotNull(templates); + } + + @Test + public void testProjectTemplate() throws GitLabApiException { + + assumeTrue(testProject != null); + + // Act + ProjectTemplate template = + gitLabApi.getProjectApi().getProjectTemplate(testProject, ProjectTemplateType.LICENSES, "mit"); + + // Assert + assertNotNull(template); + } } diff --git a/gitlab4j-models/src/main/java/org/gitlab4j/api/models/ProjectTemplate.java b/gitlab4j-models/src/main/java/org/gitlab4j/api/models/ProjectTemplate.java new file mode 100644 index 000000000..b5fedee68 --- /dev/null +++ b/gitlab4j-models/src/main/java/org/gitlab4j/api/models/ProjectTemplate.java @@ -0,0 +1,33 @@ +package org.gitlab4j.api.models; + +import java.io.Serializable; + +import org.gitlab4j.models.utils.JacksonJson; + +public class ProjectTemplate implements Serializable { + private static final long serialVersionUID = 1L; + + private String key; + private String name; + + public String getKey() { + return key; + } + + public void setKey(String key) { + this.key = key; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + @Override + public String toString() { + return (JacksonJson.toJsonString(this)); + } +} diff --git a/gitlab4j-models/src/main/java/org/gitlab4j/api/models/ProjectTemplateDetail.java b/gitlab4j-models/src/main/java/org/gitlab4j/api/models/ProjectTemplateDetail.java new file mode 100644 index 000000000..b75407413 --- /dev/null +++ b/gitlab4j-models/src/main/java/org/gitlab4j/api/models/ProjectTemplateDetail.java @@ -0,0 +1,95 @@ +package org.gitlab4j.api.models; + +import java.util.List; + +import com.fasterxml.jackson.annotation.JsonProperty; + +public class ProjectTemplateDetail extends ProjectTemplate { + + private String nickname; + private Boolean popular; + + @JsonProperty("html_url") + private String htmlUrl; + + @JsonProperty("source_url") + private String sourceUrl; + + private String content; + private String description; + private List conditions; + private List permissions; + private List limitations; + + public String getNickname() { + return nickname; + } + + public void setNickname(String nickname) { + this.nickname = nickname; + } + + public Boolean getPopular() { + return popular; + } + + public void setPopular(Boolean popular) { + this.popular = popular; + } + + public String getHtmlUrl() { + return htmlUrl; + } + + public void setHtmlUrl(String htmlUrl) { + this.htmlUrl = htmlUrl; + } + + public String getSourceUrl() { + return sourceUrl; + } + + public void setSourceUrl(String sourceUrl) { + this.sourceUrl = sourceUrl; + } + + public String getContent() { + return content; + } + + public void setContent(String content) { + this.content = content; + } + + public String getDescription() { + return description; + } + + public void setDescription(String description) { + this.description = description; + } + + public List getConditions() { + return conditions; + } + + public void setConditions(List conditions) { + this.conditions = conditions; + } + + public List getPermissions() { + return permissions; + } + + public void setPermissions(List permissions) { + this.permissions = permissions; + } + + public List getLimitations() { + return limitations; + } + + public void setLimitations(List limitations) { + this.limitations = limitations; + } +} diff --git a/gitlab4j-models/src/main/java/org/gitlab4j/api/models/ProjectTemplateType.java b/gitlab4j-models/src/main/java/org/gitlab4j/api/models/ProjectTemplateType.java new file mode 100644 index 000000000..ef72683a9 --- /dev/null +++ b/gitlab4j-models/src/main/java/org/gitlab4j/api/models/ProjectTemplateType.java @@ -0,0 +1,33 @@ +package org.gitlab4j.api.models; + +import org.gitlab4j.models.utils.JacksonJsonEnumHelper; + +import com.fasterxml.jackson.annotation.JsonCreator; +import com.fasterxml.jackson.annotation.JsonValue; + +public enum ProjectTemplateType { + DOCKERFILES, + GITIGNORES, + GITLAB_CI_YMLS, + LICENSES, + ISSUES, + MERGE_REQUESTS; + + private static final JacksonJsonEnumHelper enumHelper = + new JacksonJsonEnumHelper<>(ProjectTemplateType.class); + + @JsonCreator + public static ProjectTemplateType forValue(String value) { + return enumHelper.forValue(value); + } + + @JsonValue + public String toValue() { + return (enumHelper.toString(this)); + } + + @Override + public String toString() { + return (enumHelper.toString(this)); + } +} diff --git a/gitlab4j-models/src/test/java/org/gitlab4j/models/TestGitLabApiBeans.java b/gitlab4j-models/src/test/java/org/gitlab4j/models/TestGitLabApiBeans.java index 59d834b7f..44db4ac92 100644 --- a/gitlab4j-models/src/test/java/org/gitlab4j/models/TestGitLabApiBeans.java +++ b/gitlab4j-models/src/test/java/org/gitlab4j/models/TestGitLabApiBeans.java @@ -496,6 +496,18 @@ public void testProjectApprovalsCofig() throws Exception { assertTrue(compareJson(approvalsConfig, "project-approvals-config.json")); } + @Test + public void testProjectTemplates() throws Exception { + List projectTemplates = unmarshalResourceList(ProjectTemplate.class, "project-templates.json"); + assertTrue(compareJson(projectTemplates, "project-templates.json")); + } + + @Test + public void testProjectTemplate() throws Exception { + ProjectTemplateDetail projectTemplate = unmarshalResource(ProjectTemplateDetail.class, "project-template.json"); + assertTrue(compareJson(projectTemplate, "project-template.json")); + } + @Test public void testProtectedBranch() throws Exception { ProtectedBranch protectedBranch = unmarshalResource(ProtectedBranch.class, "protected-branch.json"); diff --git a/gitlab4j-models/src/test/resources/org/gitlab4j/models/project-template.json b/gitlab4j-models/src/test/resources/org/gitlab4j/models/project-template.json new file mode 100644 index 000000000..9797200aa --- /dev/null +++ b/gitlab4j-models/src/test/resources/org/gitlab4j/models/project-template.json @@ -0,0 +1,23 @@ +{ + "key": "mit", + "name": "MIT License", + "nickname": "nickname", + "popular": true, + "html_url": "http://choosealicense.com/licenses/mit/", + "source_url": "https://opensource.org/licenses/MIT", + "description": "A short and simple permissive license with conditions only requiring preservation of copyright and license notices. Licensed works, modifications, and larger works may be distributed under different terms and without source code.", + "conditions": [ + "include-copyright" + ], + "permissions": [ + "commercial-use", + "modifications", + "distribution", + "private-use" + ], + "limitations": [ + "liability", + "warranty" + ], + "content": "MIT License content" +} diff --git a/gitlab4j-models/src/test/resources/org/gitlab4j/models/project-templates.json b/gitlab4j-models/src/test/resources/org/gitlab4j/models/project-templates.json new file mode 100644 index 000000000..f62d027fc --- /dev/null +++ b/gitlab4j-models/src/test/resources/org/gitlab4j/models/project-templates.json @@ -0,0 +1,10 @@ +[ + { + "key": "epl-1.0", + "name": "Eclipse Public License 1.0" + }, + { + "key": "lgpl-3.0", + "name": "GNU Lesser General Public License v3.0" + } +]