Extended code.

master
Christian P. MOMON 6 years ago
parent 90dee57a2e
commit e0efd2b812
  1. 6
      .classpath
  2. 60
      .settings/org.eclipse.jdt.ui.prefs
  3. 3
      README.MD
  4. 4
      log4j.properties
  5. 114
      src/fr/devinsy/gitlabapic/Utils.java
  6. 524
      src/fr/devinsy/gitlabapic/v3/GitLab.java
  7. 34
      src/fr/devinsy/gitlabapic/v3/Issue.java
  8. 10
      src/fr/devinsy/gitlabapic/v3/Label.java
  9. 170
      src/fr/devinsy/gitlabapic/v3/Note.java
  10. 32
      src/fr/devinsy/gitlabapic/v3/Notes.java

@ -1,13 +1,13 @@
<?xml version="1.0" encoding="UTF-8"?>
<classpath>
<classpathentry kind="src" path="src"/>
<classpathentry kind="lib" path="lib/apache-httpclient-4.5.2.jar"/>
<classpathentry kind="lib" path="lib/apache-httpclient-4.5.2.jar" sourcepath="lib/apache-httpclient-4.5.2-sources.zip"/>
<classpathentry kind="lib" path="lib/apache-httpcore-4.4.5.jar"/>
<classpathentry kind="lib" path="lib/commons-io-2.4.jar"/>
<classpathentry kind="lib" path="lib/commons-io-2.4.jar" sourcepath="lib/commons-io-2.4-sources.jar"/>
<classpathentry kind="lib" path="lib/commons-lang3-3.1.jar"/>
<classpathentry kind="lib" path="lib/commons-logging-1.2.jar"/>
<classpathentry kind="lib" path="lib/devinsy-utils-0.3.1.jar"/>
<classpathentry kind="lib" path="lib/javax.json-1.0.4.jar"/>
<classpathentry kind="lib" path="lib/javax.json-1.0.4.jar" sourcepath="lib/javax.json-1.0.4-sources.jar"/>
<classpathentry kind="lib" path="lib/log4j-1.2.16.jar"/>
<classpathentry kind="lib" path="lib/slf4j-api-1.7.5.jar"/>
<classpathentry kind="lib" path="lib/slf4j-log4j12-1.7.5.jar"/>

@ -13,7 +13,7 @@ cleanup.always_use_this_for_non_static_field_access=true
cleanup.always_use_this_for_non_static_method_access=false
cleanup.convert_functional_interfaces=false
cleanup.convert_to_enhanced_for_loop=false
cleanup.correct_indentation=false
cleanup.correct_indentation=true
cleanup.format_source_code=true
cleanup.format_source_code_changes_only=false
cleanup.insert_inferred_type_arguments=false
@ -57,5 +57,63 @@ cleanup.use_this_for_non_static_method_access_only_if_necessary=true
cleanup_profile=_GitLabAPI
cleanup_settings_version=2
eclipse.preferences.version=1
editor_save_participant_org.eclipse.jdt.ui.postsavelistener.cleanup=true
formatter_profile=_GitLabAPI
formatter_settings_version=12
sp_cleanup.add_default_serial_version_id=true
sp_cleanup.add_generated_serial_version_id=false
sp_cleanup.add_missing_annotations=true
sp_cleanup.add_missing_deprecated_annotations=true
sp_cleanup.add_missing_methods=false
sp_cleanup.add_missing_nls_tags=false
sp_cleanup.add_missing_override_annotations=true
sp_cleanup.add_missing_override_annotations_interface_methods=true
sp_cleanup.add_serial_version_id=false
sp_cleanup.always_use_blocks=true
sp_cleanup.always_use_parentheses_in_expressions=true
sp_cleanup.always_use_this_for_non_static_field_access=true
sp_cleanup.always_use_this_for_non_static_method_access=false
sp_cleanup.convert_functional_interfaces=false
sp_cleanup.convert_to_enhanced_for_loop=false
sp_cleanup.correct_indentation=true
sp_cleanup.format_source_code=true
sp_cleanup.format_source_code_changes_only=false
sp_cleanup.insert_inferred_type_arguments=false
sp_cleanup.make_local_variable_final=false
sp_cleanup.make_parameters_final=true
sp_cleanup.make_private_fields_final=false
sp_cleanup.make_type_abstract_if_missing_method=false
sp_cleanup.make_variable_declarations_final=true
sp_cleanup.never_use_blocks=false
sp_cleanup.never_use_parentheses_in_expressions=false
sp_cleanup.on_save_use_additional_actions=true
sp_cleanup.organize_imports=true
sp_cleanup.qualify_static_field_accesses_with_declaring_class=false
sp_cleanup.qualify_static_member_accesses_through_instances_with_declaring_class=true
sp_cleanup.qualify_static_member_accesses_through_subtypes_with_declaring_class=true
sp_cleanup.qualify_static_member_accesses_with_declaring_class=false
sp_cleanup.qualify_static_method_accesses_with_declaring_class=false
sp_cleanup.remove_private_constructors=true
sp_cleanup.remove_redundant_type_arguments=false
sp_cleanup.remove_trailing_whitespaces=true
sp_cleanup.remove_trailing_whitespaces_all=true
sp_cleanup.remove_trailing_whitespaces_ignore_empty=false
sp_cleanup.remove_unnecessary_casts=true
sp_cleanup.remove_unnecessary_nls_tags=true
sp_cleanup.remove_unused_imports=true
sp_cleanup.remove_unused_local_variables=false
sp_cleanup.remove_unused_private_fields=true
sp_cleanup.remove_unused_private_members=false
sp_cleanup.remove_unused_private_methods=true
sp_cleanup.remove_unused_private_types=true
sp_cleanup.sort_members=true
sp_cleanup.sort_members_all=false
sp_cleanup.use_anonymous_class_creation=false
sp_cleanup.use_blocks=true
sp_cleanup.use_blocks_only_for_return_and_throw=false
sp_cleanup.use_lambda=true
sp_cleanup.use_parentheses_in_expressions=true
sp_cleanup.use_this_for_non_static_field_access=true
sp_cleanup.use_this_for_non_static_field_access_only_if_necessary=false
sp_cleanup.use_this_for_non_static_method_access=true
sp_cleanup.use_this_for_non_static_method_access_only_if_necessary=true

@ -0,0 +1,3 @@
GitLabAPIC is a GitLab API Client.
CAUTION: the GitLab API is huge bugged and limited. Lucky you are if it is enough.

@ -2,7 +2,7 @@
# ################
log4j.rootLogger = INFO, CONSOLE
log4j.logger.fr.devinsy.gitlabapi = DEBUG
log4j.logger.fr.devinsy.gitlabapic = DEBUG
log4j.logger.org.apache.http = INFO
org.apache.commons.beanutils = INFO
@ -10,4 +10,4 @@ org.apache.commons.beanutils = INFO
#--
log4j.appender.CONSOLE=org.apache.log4j.ConsoleAppender
log4j.appender.CONSOLE.layout=org.apache.log4j.PatternLayout
log4j.appender.CONSOLE.layout.ConversionPattern = %d{ISO8601} - MIGPUCK [%-5p] %34.34c.%25M - %m%n
log4j.appender.CONSOLE.layout.ConversionPattern = %d{ISO8601} - GITLABAPIC [%-5p] %34.34c.%25M - %m%n

@ -1,5 +1,6 @@
package fr.devinsy.gitlabapic;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.net.MalformedURLException;
import java.net.URI;
@ -9,20 +10,23 @@ import java.util.ArrayList;
import java.util.List;
import org.apache.commons.io.IOUtils;
import org.apache.http.HttpEntity;
import org.apache.commons.lang3.StringUtils;
import org.apache.http.HttpException;
import org.apache.http.NameValuePair;
import org.apache.http.client.entity.UrlEncodedFormEntity;
import org.apache.http.client.methods.CloseableHttpResponse;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.client.methods.HttpPut;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.message.BasicNameValuePair;
import org.apache.http.util.EntityUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import fr.devinsy.util.strings.StringList;
/**
*
*
* @author Christian Pierre MOMON (christian.momon@devinsy.fr)
*/
public class Utils
@ -32,7 +36,7 @@ public class Utils
public static final String DEFAULT_CHARSET_NAME = "UTF-8";
/**
*
*
* @param source
* @return
*/
@ -47,7 +51,7 @@ public class Utils
}
/**
*
*
* @param source
* @return
*/
@ -98,14 +102,15 @@ public class Utils
}
/**
*
*
* @param uri
* @return
* @throws IOException
* @throws HttpException
*/
public static int httpPost(final URI uri, final String privateToken, final String... parameters) throws IOException
public static String httpPost(final URI uri, final String privateToken, final String... parameters) throws IOException, HttpException
{
int result;
String result;
logger.debug("[uri={}][privateToken={}][parameters={}]", uri, privateToken, parameters);
@ -115,7 +120,7 @@ public class Utils
}
else
{
CloseableHttpResponse response2 = null;
CloseableHttpResponse response = null;
try
{
CloseableHttpClient httpClient = HttpClients.createDefault();
@ -134,22 +139,97 @@ public class Utils
nvps.add(new BasicNameValuePair(parameters[parameterIndex], parameters[parameterIndex + 1]));
}
}
ByteArrayOutputStream out = new ByteArrayOutputStream(100000);
new UrlEncodedFormEntity(nvps).writeTo(out);
logger.debug("urlencoded=[{}]", out.toString());
httpPost.setEntity(new UrlEncodedFormEntity(nvps));
logger.debug("httpPost={}", httpPost);
response2 = httpClient.execute(httpPost);
response = httpClient.execute(httpPost);
logger.debug("status line={} [{}]", response.getStatusLine(), uri);
if ((response.getStatusLine().getStatusCode() != 200) && (response.getStatusLine().getStatusCode() != 201))
{
throw new HttpException("Status code returned: " + response.getStatusLine());
}
else
{
result = new StringList(IOUtils.readLines(response.getEntity().getContent())).toString();
}
}
finally
{
response.close();
}
}
//
return result;
}
/**
*
* @param uri
* @param privateToken
* @param parameters
* @return
* @throws IOException
* @throws HttpException
*/
public static String httpPut(final URI uri, final String privateToken, final String... parameters) throws IOException, HttpException
{
String result;
logger.debug("[uri={}][privateToken={}][parameters={}]", uri, privateToken, parameters);
if (uri == null)
{
throw new IllegalArgumentException("Null parameter.");
}
else
{
CloseableHttpResponse response = null;
try
{
CloseableHttpClient httpClient = HttpClients.createDefault();
HttpPut httpPut = new HttpPut(uri);
if (privateToken != null)
{
httpPut.setHeader("PRIVATE-TOKEN", privateToken);
}
logger.debug("status line={} [{}]", response2.getStatusLine(), uri);
result = response2.getStatusLine().getStatusCode();
HttpEntity entity2 = response2.getEntity();
List<NameValuePair> nvps = new ArrayList<NameValuePair>();
for (int parameterIndex = 0; parameterIndex < parameters.length; parameterIndex += 2)
{
if (StringUtils.isNotBlank(parameters[parameterIndex + 1]))
{
nvps.add(new BasicNameValuePair(parameters[parameterIndex], parameters[parameterIndex + 1]));
}
}
// do something useful with the response body
// and ensure it is fully consumed
EntityUtils.consume(entity2);
ByteArrayOutputStream out = new ByteArrayOutputStream(100000);
new UrlEncodedFormEntity(nvps).writeTo(out);
logger.debug("urlencoded=[{}]", out.toString());
httpPut.setEntity(new UrlEncodedFormEntity(nvps));
logger.debug("httpPut={}", httpPut);
response = httpClient.execute(httpPut);
logger.debug("status line={} [{}]", response.getStatusLine(), uri);
if ((response.getStatusLine().getStatusCode() != 200) && (response.getStatusLine().getStatusCode() != 201))
{
throw new HttpException("Status code returned: " + response.getStatusLine());
}
else
{
result = new StringList(IOUtils.readLines(response.getEntity().getContent())).toString();
}
}
finally
{
response2.close();
response.close();
}
}

@ -2,6 +2,7 @@ package fr.devinsy.gitlabapic.v3;
import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.io.StringReader;
import java.net.URI;
import java.net.URISyntaxException;
import java.net.URL;
@ -10,17 +11,20 @@ import javax.json.Json;
import javax.json.JsonArray;
import javax.json.JsonObject;
import javax.json.JsonReader;
import javax.json.JsonString;
import org.apache.commons.io.IOUtils;
import org.apache.commons.lang3.StringUtils;
import org.apache.http.HttpException;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import fr.devinsy.gitlabapic.GitLabAPIException;
import fr.devinsy.gitlabapic.Utils;
import fr.devinsy.util.strings.StringList;
/**
*
*
* @author Christian Pierre MOMON (christian.momon@devinsy.fr)
*/
public class GitLab
@ -28,15 +32,21 @@ public class GitLab
private static final Logger logger = LoggerFactory.getLogger(GitLab.class);
public static final String DEFAULT_CHARSET_NAME = "UTF-8";
public static final int NOID = -1;
public static void closeIssue(final ProjectRef source, final int issueId, final String updatedAt) throws GitLabAPIException
{
editIssue(source, issueId, null, null, null, null, null, "close", updatedAt);
}
/**
*
*
* @throws GitLabAPIException
* @throws IOException
* @throws URISyntaxException
*/
public static void copyLabels(final ProjectRef source, final ProjectRef target) throws IOException, URISyntaxException
public static void copyLabels(final ProjectRef source, final ProjectRef target) throws GitLabAPIException
{
//
Labels labels = GitLab.searchLabels(source);
for (Label label : labels)
{
@ -45,12 +55,13 @@ public class GitLab
}
/**
*
*
* @param args
* @throws GitLabAPIException
* @throws IOException
* @throws URISyntaxException
*/
public static int createIssue(final ProjectRef project, final Issue issue) throws IOException, URISyntaxException
public static int createIssue(final ProjectRef project, final Issue issue) throws GitLabAPIException
{
int result;
@ -61,80 +72,219 @@ public class GitLab
}
/**
*
*
* CAUTION: created_at parameter is ignored in case of non project owner or
* admin.
*
*
* @param args
* @throws GitLabAPIException
* @throws IOException
* @throws URISyntaxException
*/
public static int createIssue(final ProjectRef project, final String title, final String description, final String assigneeId, final String milestoneId, final StringList labels,
final String createdAt) throws IOException, URISyntaxException
final String createdAt) throws GitLabAPIException
{
int result;
String url = String.format("%sapi/v3/projects/%d/issues", project.getWebsite(), project.getId());
StringList fixedLabels;
if (labels == null)
try
{
fixedLabels = new StringList();
String url = String.format("%sapi/v3/projects/%d/issues", project.getWebsite(), project.getId());
StringList fixedLabels;
if (labels == null)
{
fixedLabels = new StringList();
}
else
{
fixedLabels = labels;
}
//
String response = Utils.httpPost(new URI(url), project.getPrivateToken(), "title", fixBug19902(title), "description", fixBug19902(description), "labels", fixedLabels.toStringWithCommas(),
"created_at", createdAt);
//
JsonReader source = Json.createReader(new StringReader(response));
JsonObject item = source.readObject();
result = item.getInt("id");
}
else
catch (IOException | URISyntaxException | HttpException exception)
{
fixedLabels = labels;
logger.error(exception.getMessage(), exception);
throw new GitLabAPIException("Error creating issue: " + exception.getMessage(), exception);
}
result = Utils.httpPost(new URI(url), project.getPrivateToken(), "title", title, "description", description, "labels", fixedLabels.toStringWithCommas(), "created_at", createdAt);
//
return result;
}
/**
*
* @param args
* @throws IOException
* @throws URISyntaxException
* @throws GitLabAPIException
*/
public static String createLabel(final ProjectRef project, final Label label) throws GitLabAPIException
{
String result;
result = createLabel(project, label.getName(), label.getColor(), label.getDescription());
//
return result;
}
/**
*
* @param args
* @throws GitLabAPIException
* @throws IOException
* @throws URISyntaxException
*/
public static String createLabel(final ProjectRef project, final String name, final String color, final String description) throws GitLabAPIException
{
String result;
String url = String.format("%sapi/v3/projects/%d/labels", project.getWebsite(), project.getId());
try
{
String response = Utils.httpPost(new URI(url), project.getPrivateToken(), "name", name, "color", color, "description", description);
JsonReader source = Json.createReader(new StringReader(response));
JsonObject item = source.readObject();
result = item.getString("name");
}
catch (IOException | URISyntaxException | HttpException exception)
{
logger.error(exception.getMessage(), exception);
throw new GitLabAPIException("Error creating label: " + exception.getMessage(), exception);
}
//
return result;
}
/**
*
*
* CAUTION: created_at parameter is ignored in case of non project owner or
* admin.
*
* @param args
* @throws GitLabAPIException
* @throws IOException
* @throws URISyntaxException
*/
public static int createLabel(final ProjectRef project, final Label label) throws IOException, URISyntaxException
public static int createNote(final ProjectRef project, final int parentId, final String body, final String createdAt) throws GitLabAPIException
{
int result;
try
{
String url = String.format("%sapi/v3/projects/%d/issues/%d/notes", project.getWebsite(), project.getId(), parentId);
result = createLabel(project, label.getName(), label.getColor(), label.getDescription());
String response = Utils.httpPost(new URI(url), project.getPrivateToken(), "body", fixBug19902(body), "created_at", createdAt, "system", "true");
logger.debug("response=[{}]", response);
result = 0;
}
catch (IOException | URISyntaxException | HttpException exception)
{
logger.error(exception.getMessage(), exception);
throw new GitLabAPIException("Error creating note: " + exception.getMessage(), exception);
}
//
return result;
}
/**
*
*
* CAUTION: created_at parameter is ignored in case of non project owner or
* admin.
*
* @param args
* @throws GitLabAPIException
* @throws IOException
* @throws URISyntaxException
*/
public static int createLabel(final ProjectRef project, final String name, final String color, final String description) throws IOException, URISyntaxException
public static int editIssue(final ProjectRef project, final int issueId, final String title, final String description, final String assigneeId, final String milestoneId, final StringList labels,
final String stateEvent, final String updatedAt) throws GitLabAPIException
{
int result;
String url = String.format("%sapi/v3/projects/%d/labels", project.getWebsite(), project.getId());
try
{
String url = String.format("%sapi/v3/projects/%d/issues/%d", project.getWebsite(), project.getId(), issueId);
result = Utils.httpPost(new URI(url), project.getPrivateToken(), "name", name, "color", color, "description", description);
StringList fixedLabels;
if (labels == null)
{
fixedLabels = new StringList();
}
else
{
fixedLabels = labels;
}
//
String response = Utils.httpPut(new URI(url), project.getPrivateToken(), "title", fixBug19902(title), "description", fixBug19902(description), "labels", fixedLabels.toStringWithCommas(),
"state_event", stateEvent, "updated_at", updatedAt);
//
JsonReader source = Json.createReader(new StringReader(response));
JsonObject item = source.readObject();
result = item.getInt("id");
}
catch (IOException | URISyntaxException | HttpException exception)
{
logger.error(exception.getMessage(), exception);
throw new GitLabAPIException("Error creating issue: " + exception.getMessage(), exception);
}
//
return result;
}
/**
*
* https://gitlab.com/gitlab-org/gitlab-ce/issues/19902
*
* @param source
* @return
*/
private static String fixBug19902(final String string)
{
String result;
if (string == null)
{
result = null;
}
else
{
result = string.replace("é", "e").replace("ç", "c").replace("è", "e");
}
//
return result;
}
/**
*
*
* @param sourceWebsite
* @param projectId
* @param privateToken
* @throws GitLabAPIException
* @throws IOException
* @throws URISyntaxException
*/
public static void importLabels(final ProjectRef source, final ProjectRef target) throws IOException, URISyntaxException
public static void importLabels(final ProjectRef source, final ProjectRef target) throws GitLabAPIException
{
Labels labels = GitLab.searchLabels(source);
@ -145,100 +295,176 @@ public class GitLab
}
/**
*
*
* @param args
* @throws IOException
* @throws GitLabAPIException
* @throws URISyntaxException
*/
public static Issue searchIssue(final ProjectRef project, final int issueId) throws IOException
public static Issue searchIssue(final ProjectRef project, final int issueId) throws GitLabAPIException
{
Issue result;
logger.debug("[project={}][issueId={}]", project, issueId);
try
{
logger.debug("[project={}][issueId={}]", project, issueId);
String url = String.format("%sapi/v3/projects/%d/issues/%d", project.getWebsite(), project.getId(), issueId);
String url = String.format("%sapi/v3/projects/%d/issues/%d", project.getWebsite(), project.getId(), issueId);
logger.debug("url=[{}]", url);
logger.debug("url=[{}]", url);
//
byte[] data = Utils.httpGet(new URL(url), project.getPrivateToken());
//
byte[] data = Utils.httpGet(new URL(url), project.getPrivateToken());
//
StringList json = new StringList(IOUtils.readLines(new ByteArrayInputStream(data), DEFAULT_CHARSET_NAME));
logger.debug("json={}", json);
//
StringList json = new StringList(IOUtils.readLines(new ByteArrayInputStream(data), DEFAULT_CHARSET_NAME));
logger.debug("json={}", json);
//
JsonReader source = Json.createReader(new ByteArrayInputStream(data));
JsonArray items = source.readArray();
result = new Issue();
/*
result.setId(item.getInt("id"));
result.setIid(item.getInt("iid"));
result.setProjectId(item.getInt("project_id"));
result.setTitle(item.getString("title"));
result.setDescription(item.getString("description"));
result.setState(item.getString("state"));
result.setCreatedAt(item.getString("created_at"));
result.setUpdatedAt(item.getString("updated_at"));
// private StringList labels;
// issue.setMilestone(item.getString("milestone"));
// private String assignee;
result.setAuthorId(item.getJsonObject("author").getInt("id"));
result.setAuthorUserName(item.getJsonObject("author").getString("username"));
result.setSubscribed(item.getBoolean("subscribed"));
*/
//
JsonReader source = Json.createReader(new ByteArrayInputStream(data));
JsonArray items = source.readArray();
result = new Issue();
/*
result.setId(item.getInt("id"));
result.setIid(item.getInt("iid"));
result.setProjectId(item.getInt("project_id"));
result.setTitle(item.getString("title"));
result.setDescription(item.getString("description"));
result.setState(item.getString("state"));
result.setCreatedAt(item.getString("created_at"));
result.setUpdatedAt(item.getString("updated_at"));
// private StringList labels;
// issue.setMilestone(item.getString("milestone"));
// private String assignee;
result.setAuthorId(item.getJsonObject("author").getInt("id"));
result.setAuthorUserName(item.getJsonObject("author").getString("username"));
result.setSubscribed(item.getBoolean("subscribed"));
*/
}
catch (IOException exception)
{
logger.error(exception.getMessage(), exception);
throw new GitLabAPIException("Error searching issue: " + exception.getMessage(), exception);
}
//
return result;
}
/**
*
*
* @param args
* @throws GitLabAPIException
* @throws IOException
* @throws URISyntaxException
*/
public static Issues searchIssues(final ProjectRef project) throws IOException
public static Notes searchIssueNotes(final ProjectRef project, final int issueId) throws GitLabAPIException
{
Issues result;
Notes result;
String url = String.format("%sapi/v3/projects/%d/issues", project.getWebsite(), project.getId());
try
{
String url = String.format("%sapi/v3/projects/%d/issues/%d/notes", project.getWebsite(), project.getId(), issueId);
//
byte[] data = Utils.httpGet(new URL(url), project.getPrivateToken());
//
byte[] data = Utils.httpGet(new URL(url), project.getPrivateToken());
//
StringList json = new StringList(IOUtils.readLines(new ByteArrayInputStream(data), DEFAULT_CHARSET_NAME));
logger.debug("json={}", json);
//
StringList json = new StringList(IOUtils.readLines(new ByteArrayInputStream(data), DEFAULT_CHARSET_NAME));
logger.debug("json={}", json);
//
JsonReader source = Json.createReader(new ByteArrayInputStream(data));
JsonArray items = source.readArray();
result = new Notes();
for (JsonObject item : items.getValuesAs(JsonObject.class))
{
Note note = new Note();
note.setId(item.getInt("id"));
note.setBody(item.getString("body"));
note.setCreatedAt(item.getString("created_at"));
note.setAuthorId(item.getJsonObject("author").getInt("id"));
note.setAuthorName(item.getJsonObject("author").getString("name"));
note.setAuthorUserName(item.getJsonObject("author").getString("username"));
result.add(note);
}
}
catch (IOException exception)
{
logger.error(exception.getMessage(), exception);
throw new GitLabAPIException("Error searching labels: " + exception.getMessage(), exception);
}
//
JsonReader source = Json.createReader(new ByteArrayInputStream(data));
return result;
}
JsonArray items = source.readArray();
/**
*
* @param args
* @throws GitLabAPIException
* @throws IOException
* @throws URISyntaxException
*/
public static Issues searchIssues(final ProjectRef project) throws GitLabAPIException
{
Issues result;
result = new Issues();
for (JsonObject item : items.getValuesAs(JsonObject.class))
try
{
Issue issue = new Issue();
issue.setId(item.getInt("id"));
issue.setIid(item.getInt("iid"));
issue.setProjectId(item.getInt("project_id"));
issue.setTitle(item.getString("title"));
issue.setDescription(item.getString("description"));
issue.setState(item.getString("state"));
issue.setCreatedAt(item.getString("created_at"));
issue.setUpdatedAt(item.getString("updated_at"));
// private StringList labels;
// issue.setMilestone(item.getString("milestone"));
// private String assignee;
issue.setAuthorId(item.getJsonObject("author").getInt("id"));
issue.setAuthorUserName(item.getJsonObject("author").getString("username"));
issue.setSubscribed(item.getBoolean("subscribed"));
String url = String.format("%sapi/v3/projects/%d/issues", project.getWebsite(), project.getId());
//
byte[] data = Utils.httpGet(new URL(url), project.getPrivateToken());
//
StringList json = new StringList(IOUtils.readLines(new ByteArrayInputStream(data), DEFAULT_CHARSET_NAME));
logger.debug("json={}", json);
//
JsonReader source = Json.createReader(new ByteArrayInputStream(data));
result.add(issue);
JsonArray items = source.readArray();
result = new Issues();
for (JsonObject item : items.getValuesAs(JsonObject.class))
{
Issue issue = new Issue();
issue.setId(item.getInt("id"));
issue.setIid(item.getInt("iid"));
issue.setProjectId(item.getInt("project_id"));
issue.setTitle(item.getString("title"));
issue.setDescription(item.getString("description"));
issue.setState(item.getString("state"));
issue.setCreatedAt(item.getString("created_at"));
issue.setUpdatedAt(item.getString("updated_at"));
for (JsonString subItem : item.getJsonArray("labels").getValuesAs(JsonString.class))
{
issue.labels().add(subItem.getString());
}
// issue.setMilestone(item.getString("milestone"));
// private String assignee;
issue.setAuthorId(item.getJsonObject("author").getInt("id"));
issue.setAuthorName(item.getJsonObject("author").getString("name"));
issue.setAuthorUserName(item.getJsonObject("author").getString("username"));
issue.setSubscribed(item.getBoolean("subscribed"));
result.add(issue);
}
}
catch (IOException exception)
{
logger.error(exception.getMessage(), exception);
throw new GitLabAPIException("Error searching labels: " + exception.getMessage(), exception);
}
//
@ -246,38 +472,47 @@ public class GitLab
}
/**
*
*
* @param args
* @throws GitLabAPIException
* @throws IOException
* @throws URISyntaxException
*/
public static Labels searchLabels(final ProjectRef project) throws IOException
public static Labels searchLabels(final ProjectRef project) throws GitLabAPIException
{
Labels result;
String url = String.format("%sapi/v3/projects/%d/labels", project.getWebsite(), project.getId());
try
{
String url = String.format("%sapi/v3/projects/%d/labels", project.getWebsite(), project.getId());
//
byte[] data = Utils.httpGet(new URL(url), project.getPrivateToken());
//
byte[] data = Utils.httpGet(new URL(url), project.getPrivateToken());
//
StringList json = new StringList(IOUtils.readLines(new ByteArrayInputStream(data), DEFAULT_CHARSET_NAME));
logger.debug("json={}", json);
//
StringList json = new StringList(IOUtils.readLines(new ByteArrayInputStream(data), DEFAULT_CHARSET_NAME));
logger.debug("json={}", json);
//
JsonReader source = Json.createReader(new ByteArrayInputStream(data));
//
JsonReader source = Json.createReader(new ByteArrayInputStream(data));
JsonArray items = source.readArray();
JsonArray items = source.readArray();
result = new Labels();
for (JsonObject item : items.getValuesAs(JsonObject.class))
{
Label label = new Label();
result = new Labels();
for (JsonObject item : items.getValuesAs(JsonObject.class))
{
Label label = new Label();
label.setName(item.getString("name"));
label.setColor(item.getString("color"));
label.setName(item.getString("name"));
label.setColor(item.getString("color"));
result.add(label);
result.add(label);
}
}
catch (IOException exception)
{
logger.error(exception.getMessage(), exception);
throw new GitLabAPIException("Error searching labels: " + exception.getMessage(), exception);
}
//
@ -285,67 +520,76 @@ public class GitLab
}
/**
*
*
* @param website
* @param projectName
* name of project with namespace
* @param privateToken
* @return
* @throws GitLabAPIException
* @throws IOException
* @throws URISyntaxException
*/
public static ProjectRef searchProject(final String website, final String token, final String privateToken) throws IOException
public static ProjectRef searchProject(final String website, final String token, final String privateToken) throws GitLabAPIException
{
ProjectRef result;
String url = String.format("%sapi/v3/projects", website);
try
{
String url = String.format("%sapi/v3/projects", website);
//
byte[] data = Utils.httpGet(new URL(url), privateToken);
//
byte[] data = Utils.httpGet(new URL(url), privateToken);
//
StringList json = new StringList(IOUtils.readLines(new ByteArrayInputStream(data), DEFAULT_CHARSET_NAME));
logger.debug("json={}", json);
//
StringList json = new StringList(IOUtils.readLines(new ByteArrayInputStream(data), DEFAULT_CHARSET_NAME));
logger.debug("json={}", json);
//
JsonReader source = Json.createReader(new ByteArrayInputStream(data));
JsonArray items = source.readArray();
//
JsonReader source = Json.createReader(new ByteArrayInputStream(data));
JsonArray items = source.readArray();
//
boolean ended = false;
int itemIndex = 0;
JsonObject searchedItem = null;
while (!ended)
{
if (itemIndex < items.size())
//
boolean ended = false;
int itemIndex = 0;
JsonObject searchedItem = null;
while (!ended)
{
JsonObject item = items.getJsonObject(itemIndex);
if (StringUtils.equals(item.getString("name_with_namespace"), token))
if (itemIndex < items.size())
{
ended = true;
searchedItem = item;
JsonObject item = items.getJsonObject(itemIndex);
if (StringUtils.equals(item.getString("name_with_namespace"), token))
{
ended = true;
searchedItem = item;
}
else
{
itemIndex += 1;
}
}
else
{
itemIndex += 1;
ended = true;
searchedItem = null;
}
}
//
if (searchedItem == null)
{
result = null;
}
else
{
ended = true;
searchedItem = null;
result = new ProjectRef(website, searchedItem.getInt("id"), privateToken);
}
}
//
if (searchedItem == null)
{
result = null;
}
else
catch (IOException exception)
{
result = new ProjectRef(website, searchedItem.getInt("id"), privateToken);
logger.error(exception.getMessage(), exception);
throw new GitLabAPIException("Error searching labels: " + exception.getMessage(), exception);
}
//

@ -7,7 +7,7 @@ import org.slf4j.LoggerFactory;
import fr.devinsy.util.strings.StringList;
/**
*
*
* @author Christian Pierre MOMON (christian.momon@devinsy.fr)
*/
public class Issue
@ -25,12 +25,13 @@ public class Issue
private StringList labels;
private String milestone;
private String assignee;
private String authorUserName;
private int authorId;
private String authorName;
private String authorUserName;
private boolean subscribed;
/**
*
*
*/
public Issue()
{
@ -47,6 +48,11 @@ public class Issue
return this.authorId;
}
public String getAuthorName()
{
return this.authorName;
}
public String getAuthorUserName()
{
return this.authorUserName;
@ -72,11 +78,6 @@ public class Issue
return this.iid;
}
public StringList labels()
{
return this.labels;
}
public String getMilestone()
{
return this.milestone;
@ -102,11 +103,21 @@ public class Issue
return this.updatedAt;
}
public boolean isSubscribed()
{
return this.subscribed;
}
public boolean isSuscribed()
{
return this.subscribed;
}
public StringList labels()
{
return this.labels;
}
public void setAssignee(final String assignee)
{
this.assignee = assignee;
@ -117,6 +128,11 @@ public class Issue
this.authorId = authorId;
}
public void setAuthorName(final String authorName)
{
this.authorName = authorName;
}
public void setAuthorUserName(final String authorUserName)
{
this.authorUserName = authorUserName;
@ -173,7 +189,7 @@ public class Issue
}
/**
*
*
*/
@Override
public String toString()

@ -4,7 +4,7 @@ import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
/**
*
*
* @author Christian Pierre MOMON (christian.momon@devinsy.fr)
*/
public class Label
@ -16,7 +16,7 @@ public class Label
private String description;
/**
*
*
* @param name
* @param color
*/
@ -26,7 +26,7 @@ public class Label
}
/**
*
*
* @param name
* @param color
*/
@ -36,7 +36,7 @@ public class Label
}
/**
*
*
* @param name
* @param color
* @param description
@ -79,7 +79,7 @@ public class Label
}
/**
*
*
*/
@Override
public String toString()

@ -0,0 +1,170 @@
package fr.devinsy.gitlabapic.v3;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
/**
*
* @author Christian Pierre MOMON (christian.momon@devinsy.fr)
*/
public class Note
{
private static final Logger logger = LoggerFactory.getLogger(Note.class);
private int id;
private String body;
// "attachment": null,
private int authorId;
private String authorName;
private String authorUserName;
// "author": {"id": 1, "username": "pipin", "email": "admin@example.com",
// "name": "Pip", "state": "active", "created_at": "2013-09-30T13:46:01Z" },
private String createdAt;
private String updatedAt;
private boolean system;
private boolean upvote;
private boolean downvote;
private int noteableId;
private String noteableType;
/**
*
*/
public Note()
{
}
public int getAuthorId()
{
return this.authorId;
}
public String getAuthorName()
{
return this.authorName;
}
public String getAuthorUserName()
{
return this.authorUserName;
}
public String getBody()
{
return this.body;
}
public String getCreatedAt()
{
return this.createdAt;
}
public int getId()
{
return this.id;
}
public int getNoteableId()
{
return this.noteableId;
}
public String getNoteableType()
{
return this.noteableType;
}
public String getUpdatedAt()
{
return this.updatedAt;
}
public boolean isDownvote()
{
return this.downvote;
}
public boolean isSystem()
{
return this.system;
}
public boolean isUpvote()
{
return this.upvote;
}
public void setAuthorId(final int authorId)
{
this.authorId = authorId;
}
public void setAuthorName(final String authorName)
{
this.authorName = authorName;
}
public void setAuthorUserName(final String authorUserName)
{
this.authorUserName = authorUserName;
}
public void setBody(final String body)
{
this.body = body;
}
public void setCreatedAt(final String createdAt)
{
this.createdAt = createdAt;
}
public void setDownvote(final boolean downvote)
{
this.downvote = downvote;
}
public void setId(final int id)
{
this.id = id;
}
public void setNoteableId(final int noteableId)
{
this.noteableId = noteableId;
}
public void setNoteableType(final String noteableType)
{
this.noteableType = noteableType;
}
public void setSystem(final boolean system)
{
this.system = system;
}
public void setUpdatedAt(final String updatedAt)
{
this.updatedAt = updatedAt;
}
public void setUpvote(final boolean upvote)
{
this.upvote = upvote;
}
/**
*
*/
@Override
public String toString()
{
String result;
result = String.format("[id=%d][body=%s]", this.id, this.body);
//
return result;
}
}

@ -0,0 +1,32 @@
package fr.devinsy.gitlabapic.v3;
import java.util.ArrayList;
import java.util.Collections;
import fr.devinsy.gitlabapic.v3.IssueComparator.Sorting;
/**
*
* @author Christian Pierre MOMON (christian.momon@devinsy.fr)
*/
public class Notes extends ArrayList<Note>
{
private static final long serialVersionUID = 5126712173655206727L;
/**
*
*/
public Notes()
{
super();
}
/**
*
* @param initialCapacity
*/