Code Monkey home page Code Monkey logo

redmine-java-api's Introduction

Redmine/Chiliproject Java API.

Gradle dependency:

dependencies {
    compile 'com.taskadapter:redmine-java-api:<current-version>'
}

Check the latest release version in Maven Central

Sample code.

Obtain transport required for fluent-style calls

The new fluent-style API (v. 4.x) requires a transport instance for most calls. First, create an instance of RedmineManager and then obtain its transport:

RedmineManager mgr = RedmineManagerFactory.createWithApiKey(uri, apiAccessKey);
Transport transport = mgr.getTransport();

Get list of issues

String uri = "https://www.hostedredmine.com";
String apiAccessKey = "somekey";
String projectKey = "taskconnector-test";
Integer queryId = null; // any

RedmineManager mgr = RedmineManagerFactory.createWithApiKey(uri, apiAccessKey);
// override default page size if needed
mgr.setObjectsPerPage(100);
List<Issue> issues = mgr.getIssueManager().getIssues(projectKey, queryId);
for (Issue issue : issues) {
    System.out.println(issue.toString());
}

Multi-values search for issues

Params params = new Params()
            .add("set_filter", "1")
            .add("f[]", "summary")
            .add("op[summary]", "~")
            .add("v[summary]", "another")
            .add("f[]", "description")
            .add("op[description]", "~")
            .add("v[description][]", "abc");

result = issueManager.getIssues(params);

Redmine searches for "Open" issues by default. You can specify "all" in your Map if you want:

params.put("status_id", "*");    

Get related objects when retrieving issues

issue = issueManager.getIssueById(123, Include.journals, Include.relations, Include.attachments, 
                          Include.changesets, Include.watchers);
journals = issue.getJournals();

Create an issue

RedmineManager mgr = RedmineManagerFactory.createWithApiKey(uri, apiAccessKey);	
Version ver = new Version().setId(512);
IssueCategory cat = new IssueCategory(transport).setId(673);
ProjectManager projectManager = manager.getProjectManager();
Project projectByKey = projectManager.getProjectByKey("testid");

Issue issue = new Issue(mgr.getTransport(), projectId)
    .setSubject("test123")
    .setTargetVersion(ver)
    .setCategory(cat);
    .setProjectId(projectId)
    .create();

Get issue by Id

Issue retrievedIssue = issueManager.getIssueById(123);

Set custom field value on issue

Issue issue = ...
List<CustomFieldDefinition> customFieldDefinitions = mgr.getCustomFieldManager().getCustomFieldDefinitions();
// sample implementation for getCustomFieldByName() is in CustomFieldResolver (test class).
// in prod code you would typically know the custom field name or id already 
CustomFieldDefinition customField1 = getCustomFieldByName(customFieldDefinitions, "my_custom_1");
String custom1Value = "some value 123";
issue.addCustomField(CustomFieldFactory.create(customField1.getId(), customField1.getName(), custom1Value));
issueManager.update(issue);

Create project

Project project = new Project(transport)
			.setName("Upload project")
			.setIdentifier("uploadtmpproject")
			.create();

Get all projects

List<Project> projects = mgr.getProjectManager().getProjects();

Free-form search for users

Map<String, String> params = new HashMap<>();
params.put("name", name);
List<User> list = userManager.getUsers(params);

Create a group and add user to it

Group group = new Group(transport)
    .setName("group")
    .create();
    
User user = new User(transport).set(...)
    .create();
    
userManager.addUserToGroup(user, group);

Delete user

user.delete();

Get time entries

TimeEntryManager timeEntryManager = redmineManager.getTimeEntryManager();
final Map<String, String> params = new HashMap<>();
params.put("project_id", projectId);
params.put("activity_id", activityId);
final List<TimeEntry> elements = timeEntryManager.getTimeEntries(params);

Using a custom (e.g. self-signed) SSL certificate

Supposing you have:

  • caTrustStore: a Collection<KeyStore> object that has the custom CAs to use

Then the following function will return a RedmineManager object that uses those TrustStores to connect to Redmine:

public RedmineManager connectToRedmine(String apiAccessKey, String url) throws IOException {
    try {
        ClientConnectionManaget connectionManager =
                RedmineManagerFactory.createConnectionManagerWithExtraTrust(caTrustStore);
        HttpClient client = RedmineManagerFactory.getNewHttpClient(url, connectionManager);
        return RedmineManagerFactory.createWithApiKey(url, apiAccessKey, client);
    } catch (Exception e) {
        System.out.println("Could not connect to Redmine");
        throw new IOException(e.getMessage());
    }
}

For another example, see IntegrationTestHelper class:

Optional<KeyStore> builtInExtension = getExtensionKeystore();
if (builtInExtension.isPresent()) {
    return RedmineManagerFactory.createConnectionManagerWithExtraTrust(
            Collections.singletonList(builtInExtension.get()));
}

Using a custom (e.g. self-signed) SSL certificate with Client Certificate Authentication

Supposing you have:

  • clientKeyStore: a KeyStore object that has your Client Certificate and Private Key loaded
  • caTrustStore: a Collection<KeyStore> object that has the custom CAs to use
  • password: A string representing clientKeyStore's password

Then the following function will return a RedmineManager object that uses those KeyStores to connect to Redmine:

public RedmineManager connectToRedmine(String apiAccessKey, String url) throws IOException {
    try {
        ClientConnectionManaget connectionManager = 
                RedmineManagerFactory.createConnectionManagerWithClientCertificate(
                clientKeyStore, password, caTrustStore);  
        HttpClient client = RedmineManagerFactory.getNewHttpClient(url, connectionManager);
        return RedmineManagerFactory.createWithApiKey(url, apiAccessKey, client);
    } catch (Exception e) {
        System.out.println("Could not connect to Redmine");
        throw new IOException(e.getMessage());
    } 
}

For another example, see IntegrationTestHelper class:

Optional<KeyStore> builtInExtension = getExtensionKeystore();
Optional<KeyStore> builtInClient = getClientKeystore();
if (builtInExtension.isPresent() && builtInClient.isPresent()) {
    return RedmineManagerFactory.createConnectionManagerWithClientCertificate(builtInClient.get(), 
            "keystore-password", Collections.singletonList(builtInExtension.get()));
}

redmine-java-api's People

Contributors

a11n avatar adriandiemerdev avatar albfan avatar alecharp avatar alexey-twilio avatar alexeyongithub avatar amuniz avatar bcmedeiros avatar ciasnmic avatar cuckoom avatar imalygin avatar imk avatar javiertuya avatar jeeeyul avatar karottenreibe avatar kenneth-sperow avatar keritaf avatar kkkon avatar luichijuntaandalucia avatar manuelsanchezortiz avatar marob avatar matthiasblaesing avatar maxkar avatar mikhailklimenko avatar mkhokhlov avatar mpscholz avatar panekzogen avatar rmedinaday avatar wurmy avatar zmd avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

redmine-java-api's Issues

can't delete the test project in Redmine 2.0.2 after all tests are done

all tests in RedmineManagerTest pass OK, but then teardown() method fails with

can't delete the test project 'test1339952530448. reason: Server returned '404 not found'. response body: <title>Redmine 404 error</title> <style> body{ font-family: Trebuchet MS,Georgia,"Times New Roman",serif; color:#303030; margin:10px; } h1{ font-size:1.5em; } p{ font-size:0.8em; } </style>

Page not found

The page you were trying to access doesn't exist or has been removed.

Back

date parsing fails with Redmine 2.0.2

i got error when i use api.
the api is "createUser".

Forgive my bad english!

Fri Jun 15 13:31:12 CST 2012 - [DEBUG] - RedmineManager - {"user":{"id":3,"login":"login","mail":"[email protected]","lastname":"lastName","created_on":"2012-06-15T05:30:50Z","firstname":"fullName"}}
org.redmine.ta.RedmineFormatException: org.json.JSONException: Bad date value 2012-06-15T05:30:50Z
at org.redmine.ta.internal.Transport.parseResponce(Transport.java:459)
at org.redmine.ta.internal.Transport.addObject(Transport.java:187)
at org.redmine.ta.RedmineManager.createUser(RedmineManager.java:374)
at org.redmine.ta.Simple.createUser(Simple.java:59)
at org.redmine.ta.Simple.main(Simple.java:25)
Caused by: org.json.JSONException: Bad date value 2012-06-15T05:30:50Z
at org.redmine.ta.internal.json.JsonInput.getDateOrNull(JsonInput.java:110)
at org.redmine.ta.internal.RedmineJSONParser.getDateOrNull(RedmineJSONParser.java:554)
at org.redmine.ta.internal.RedmineJSONParser.parseUser(RedmineJSONParser.java:489)
at org.redmine.ta.internal.RedmineJSONParser$6.parse(RedmineJSONParser.java:75)
at org.redmine.ta.internal.RedmineJSONParser$6.parse(RedmineJSONParser.java:1)
at org.redmine.ta.internal.Transport.parseResponce(Transport.java:456)
... 4 more

RedmineManager.getProject() returns all projects

I call getProjects method when authenticating with a user login and password, it returns all the projects of the redmine instance. It should return just the projects in which the user is member.

Associate an attachment to an issue?

Hello!
Apparently we don't have a way to associate an attachment to a issue.
I can upload a file but I can't see any method to associate them.

Could you provide any guidance?

Regards!

Android support

Right now, redmine-java-api is not compatible with Android due to the old Apache libraries bundled within Android. I began to work on the compatibility, here's a patch:

From eff39696ea531da290d8393f174e23cad2de1290 Mon Sep 17 00:00:00 2001
From: Marc Plano-Lesay <[email protected]>
Date: Sun, 14 Oct 2012 00:20:06 +0200
Subject: [PATCH] Begin of Android compatibility

---
 .../redmineapi/internal/comm/HttpUtil.java         | 22 ++++++++++--
 .../naivessl/NaiveAndroidSSLSocketFactory.java     | 40 ++++++++++++++++++++++
 2 files changed, 59 insertions(+), 3 deletions(-)
 create mode 100644 src/main/java/com/taskadapter/redmineapi/internal/comm/naivessl/NaiveAndroidSSLSocketFactory.java

diff --git a/src/main/java/com/taskadapter/redmineapi/internal/comm/HttpUtil.java b/src/main/java/com/taskadapter/redmineapi/internal/comm/HttpUtil.java
index c6d967d..69a9981 100644
--- a/src/main/java/com/taskadapter/redmineapi/internal/comm/HttpUtil.java
+++ b/src/main/java/com/taskadapter/redmineapi/internal/comm/HttpUtil.java
@@ -1,6 +1,7 @@
 package com.taskadapter.redmineapi.internal.comm;

 import com.taskadapter.redmineapi.RedmineConfigurationException;
+import com.taskadapter.redmineapi.internal.comm.naivessl.NaiveAndroidSSLSocketFactory;
 import com.taskadapter.redmineapi.internal.comm.naivessl.NaiveSSLFactory;
 import org.apache.http.Header;
 import org.apache.http.HttpEntity;
@@ -23,6 +24,7 @@ import org.apache.http.util.EntityUtils;

 import java.io.IOException;
 import java.security.KeyManagementException;
+import java.security.KeyStore;
 import java.security.KeyStoreException;
 import java.security.NoSuchAlgorithmException;
 import java.security.UnrecoverableKeyException;
@@ -50,11 +52,25 @@ class HttpUtil {
            int maxConnections) throws KeyStoreException,
            NoSuchAlgorithmException, CertificateException, IOException,
            KeyManagementException, UnrecoverableKeyException {
-        SSLSocketFactory factory = NaiveSSLFactory.createNaiveSSLSocketFactory();
+       SSLSocketFactory factory = null;
+       try {
+           factory = NaiveSSLFactory.createNaiveSSLSocketFactory();
+       } catch (NoSuchMethodError e) {
+           // Android fallback
+           KeyStore trustStore = KeyStore.getInstance(KeyStore.getDefaultType());
+           trustStore.load(null, null);
+           factory = new NaiveAndroidSSLSocketFactory(trustStore);
+       }

         SchemeRegistry registry = new SchemeRegistry();
-       registry.register(new Scheme("http", 80, PlainSocketFactory.getSocketFactory()));
-       registry.register(new Scheme("https", 443, factory));
+       try {
+           registry.register(new Scheme("http", 80, PlainSocketFactory.getSocketFactory()));
+           registry.register(new Scheme("https", 443, factory));
+       } catch (NoSuchMethodError e) {
+           // Android fallback
+           registry.register(new Scheme("http", PlainSocketFactory.getSocketFactory(), 80));
+           registry.register(new Scheme("https", factory, 443));
+       }

         PoolingClientConnectionManager manager = new PoolingClientConnectionManager(registry);
        manager.setMaxTotal(maxConnections);
diff --git a/src/main/java/com/taskadapter/redmineapi/internal/comm/naivessl/NaiveAndroidSSLSocketFactory.java b/src/main/java/com/taskadapter/redmineapi/internal/comm/naivessl/NaiveAndroidSSLSocketFactory.java
new file mode 100644
index 0000000..868bd57
--- /dev/null
+++ b/src/main/java/com/taskadapter/redmineapi/internal/comm/naivessl/NaiveAndroidSSLSocketFactory.java
@@ -0,0 +1,40 @@
+package com.taskadapter.redmineapi.internal.comm.naivessl;
+
+import java.io.IOException;
+import java.net.Socket;
+import java.net.UnknownHostException;
+import java.security.KeyManagementException;
+import java.security.KeyStore;
+import java.security.KeyStoreException;
+import java.security.NoSuchAlgorithmException;
+import javax.net.ssl.SSLContext;
+import javax.net.ssl.TrustManager;
+import org.apache.http.conn.ssl.SSLSocketFactory;
+
+/**
+ * Create naive Android SSLSocket factory which will authorize any TSL/SSL host.
+ *
+ * @author Marc Plano-Lesay (kernald)
+ */
+public class NaiveAndroidSSLSocketFactory extends SSLSocketFactory {
+    SSLContext sslContext = SSLContext.getInstance("TLS");
+
+    public NaiveAndroidSSLSocketFactory(KeyStore truststore) throws NoSuchAlgorithmException, KeyManagementException, KeyStoreException, UnrecoverableKeyException {
+        super(truststore);
+
+        TrustManager tm = new NaiveX509TrustManager();
+
+        sslContext.init(null, new TrustManager[] { tm }, null);
+    }
+
+    @Override
+    public Socket createSocket(Socket socket, String host, int port, boolean autoClose) throws IOException, UnknownHostException {
+        return sslContext.getSocketFactory().createSocket(socket, host, port, autoClose);
+    }
+
+    @Override
+    public Socket createSocket() throws IOException {
+        return sslContext.getSocketFactory().createSocket();
+    }
+}
-- 
1.7.12.3

I still have an issue: PoolingClientConnectionManager doesn't exist on Android. Otherwise, the SSL socket creation works fine.

Redmine 1.0.5: A JSONObject text must begin with '{' at character 1

When I download the source code and try to compile and generate .jar I receive the following error:

com.taskadapter.redmineapi.RedmineFormatException: org.json.JSONException: A JSONObject text must begin with '{' at character 1 at com.taskadapter.redmineapi.internal.Transport.parseResponse(Transport.java:453) at com.taskadapter.redmineapi.internal.Transport.getObject(Transport.java:271) at com.taskadapter.redmineapi.RedmineManager.getProjectByKey(RedmineManager.java:236)

If I generate .jar without run the unit tests I receive the same error when I try to create a project in redmine, like:
Project createdProject = mgr.createProject("myProject");

testAttachmentUploads test fails with Redmine 2.1.0

trying our tests with the Redmine 2.1.0 instance provided by Bruno:

Sep 20, 2012 7:06:56 PM com.taskadapter.redmineapi.RedmineManagerTest oneTimeSetUp
INFO: Running redmine tests using: http://hq.visagio.com.br/redminedev

com.taskadapter.redmineapi.RedmineFormatException: org.json.JSONException: A JSONObject text must begin with '{' at character 1
at com.taskadapter.redmineapi.internal.Transport.parseResponse(Transport.java:453)
at com.taskadapter.redmineapi.internal.Transport.upload(Transport.java:310)
at com.taskadapter.redmineapi.RedmineManager.uploadAttachment(RedmineManager.java:695)
at com.taskadapter.redmineapi.RedmineManager.uploadAttachment(RedmineManager.java:748)
at com.taskadapter.redmineapi.RedmineManagerTest.testAttachmentUploads(RedmineManagerTest.java:1938)

at Caused by: org.json.JSONException: A JSONObject text must begin with '{' at character 1
at org.json.JSONTokener.syntaxError(JSONTokener.java:410)
at org.json.JSONObject.<init>(JSONObject.java:179)

com.taskadapter.redmineapi.internal.RedmineJSONParser.getResponseSingleObject(RedmineJSONParser.java:607)
at com.taskadapter.redmineapi.internal.Transport.parseResponse(Transport.java:451)

castor version problem (???)

I getting started to use redmine-java-api and nowadays I'm a newbie with java. After installing a lot of depencies in my Fedora 16 I defined this classpath:

/home/oriol/.m2/repository/:/home/oriol/workspace/redmine/redmine-java-api/target/classes/:/usr/share/java:/usr/share/java/httpcomponents/httpcore.jar:/usr/share/java/httpcomponents/httpclient.jar:/usr/share/java/castor.jar:/usr/share/java/xerces-j2.jar:/usr/share/java/castor-xml.jar:/home/oriol/workspace/redmine/org/redmine/ta/:.

and using Simple.java example with a call to versions I get a 404 Not found page. And when I make a few changes to get user information I get this error:

Thu Apr 12 09:49:39 CEST 2012 - [DEBUG] - Communicator - GET http://projects.vision-robotics.com/users/current.xml?key=XXXX HTTP/1.1
Exception in thread "main" java.lang.NoSuchMethodError: org.exolab.castor.xml.Unmarshaller.setClass(Ljava/lang/Class;)V
at org.redmine.ta.internal.RedmineXMLParser.getUnmarshaller(RedmineXMLParser.java:143)
at org.redmine.ta.internal.RedmineXMLParser.parseObjectFromXML(RedmineXMLParser.java:194)
at org.redmine.ta.internal.RedmineXMLParser.parseUserFromXML(RedmineXMLParser.java:216)
at org.redmine.ta.RedmineManager.getCurrentUser(RedmineManager.java:565)
at org.redmine.ta.Simple.printCurrentUser(Simple.java:134)
at org.redmine.ta.Simple.main(Simple.java:28)

My castor and castor-xml packages are 0.9.5 version, do I need an older version of castor for work?

Thanks in advance for your help.

Oriol

project update failed

Reported by [email protected], Aug 10, 2011
while calling the function
updateProject(Project project)
throws RedmineException: Homepage is too long(maximum 255 characters)

Android 2.3.3

Please provide any additional information below.

Comment 1 by [email protected], Aug 10, 2011
It is solved now with project.setHomepage(null) for my case.

Comment 2 by project member alskor, Aug 11, 2011
please, provide a complete test code. specify Redmine version.
ideally - send a fix patch, please.

Comment 4 by [email protected], Aug 11, 2011
Redmine 1.1.2

project.setName("name");
project.setDescription("description");
project.setHomepage(null);
mgr.updateProject(project);

if setHomepage is not set to null it will throw RedmineException: Homepage is too long(maximum 255 characters)

remove deprecated methods in RedmineManager

sample:
/**
* @deprecated this method will be deleted in the future releases. use update() method instead
*/
public void updateTimeEntry(TimeEntry obj) throws IOException, AuthenticationException, NotFoundException, RedmineException

confusing message about missing priority when no default priority is set on the server

ttp://www.redmine.org/issues/9133

One of the users has reported that could not create issues using Redmine Java API:
org.redmine.ta.RedmineException: Priority can't be blank
at org.redmine.ta.RedmineManager.sendRequest(RedmineManager.java:270)
at org.redmine.ta.RedmineManager.createIssue(RedmineManager.java:167)
at org.redmine.ta.Simple.tryCreateIssue(Simple.java:90)
at org.redmine.ta.Simple.main(Simple.java:48)

I was trying to reproduce the problem on several different Redmine installs with Postgresql, MySQL, different Redmine versions, ...

It turned out the user didn't have a "default Issue priority" set in his Redmine administration panel.

A good solution here is for REST API to provide a list of existing priorities with IDs so that remote clients can use them. This is requested in http://www.redmine.org/issues/8596.

A minor easy fix would be to improve the error message: change it from

Priority can't be blank

to

Priority can't be blank. No default priority is set in the Redmine server settings. please use menu "Administration -> Enumerations -> Issue Priorities" to set the default priority.

we can do that in Redmine Java API layer until it's properly implemented in the Redmine REST API itself.

Create Issue with custom fields

Hello,

when i try to create a new Issue with custom fields and set one of the custom fields (type date) as "2012-08-02" the POST message at the redmine server is

Processing IssuesController#create to json (for 10.194.6.36 at 2012-08-02 09:30:22) [POST]
Parameters: {"controller"=>"issues", "format"=>"json", "include"=>"attachments", "key"=>"bfdf8a14c30c9145f493589de534ddac82f8bfd8", "action"=>"create", "issue"=>{"assigned_to_id"=>3, "description"=>"my description", "custom_field_values"=>{"15"=>"Oui", "14"=>"Oui", "13"=>"Oui", "12"=>"1000", "11"=>"Oui", "10"=>"Oui", "19"=>"02/08/2012", "17"=>"02/08/2012", "2"=>"100", "3"=>"02/08/2012", "4"=>"02/08/2012", "1"=>"02/08/2012", "22"=>"02/08/2012", "21"=>"02/08/2012", "20"=>"02/08/2012", "25"=>Fri, 20 Jul 2012}, "project_id"=>"compliance", "start_date"=>"2012/08/02 00:00:00 +0200", "subject"=>"my subject"}}

In the custom field "25" the date was changed to Fri, 20 Jul 2012 and i get the error

Rendering common/error_messages.api (unprocessable_entity)
Completed in 41ms (View: 0, DB: 6) | 422 Unprocessable Entity [http://10.194.6.35/issues.json?include=attachments&key=bfdf8a14c30c9145f493589de534ddac82f8bfd8]

Thanks.

Best regards
Jorge Neves

Multiple Issue Filters in Rest API

  1. Using HashMap, create a subject filter (e.g.):
    ?set_filter=1&f[]=subject&op[subject]=~&v[subject][]=Facebook

    Map<String, String> query = new HashMap<String, String>();
    query.put("set_filter", "1");
    query.put("f[]", "subject");
    query.put("op[subject]", "~");
    query.put("v[subject][]", "Facebook");

  2. Using same HashMap, add an additional assignee filter (e.g.):
    f[]=assigned_to_id&op[assigned_to_id]=%3D&v[assigned_to_id][]=41

    query.put("f[]", "assigned_to_id");
    query.put("op[assigned_to_id]", "=");
    query.put("v[assigned_to_id][]", "41");

  3. Call RedmineManager.getIssues(Map) with the query HashMap.

Expected output should be a URL query for the RestAPI that matches the parameters passed in.

The latter f[] has overwritten the former. Therefore, only the second query is implemented on the query part of the URL for the Rest APIs.

Exception at XML parsing

copied from the old google code project:

Reported by Shatunov2008
What steps will reproduce the problem?

  1. basic example

What is the expected output? What do you see instead?

org.exolab.castor.xml.MarshalException: Illegal Text data found as child of: custom_field
value: "Ожидает внедрения"{File: [not available]; line: 19; column: 227}
at org.exolab.castor.xml.Unmarshaller.convertSAXExceptionToMarshalException(Unmarshaller.java:794)
at org.exolab.castor.xml.Unmarshaller.unmarshal(Unmarshaller.java:760)
at org.exolab.castor.xml.Unmarshaller.unmarshal(Unmarshaller.java:626)
at org.redmine.ta.internal.RedmineXMLParser.parseObjectsFromXML(RedmineXMLParser.java:177)
at org.redmine.ta.RedmineManager.getObjectsListV11(RedmineManager.java:404)
at org.redmine.ta.RedmineManager.getObjectsList(RedmineManager.java:370)
at org.redmine.ta.RedmineManager.getIssues(RedmineManager.java:315)
at ru.partclub.testapi.App.tryGetIssues(App.java:30)
at ru.partclub.testapi.App.main(App.java:23)
Caused by: org.xml.sax.SAXException: Illegal Text data found as child of: custom_field

What version of the product are you using? On what operating system?
from the official maven repo

SSLPeerUnverifiedException: peer not authenticated when SSL certificate is invalid

com.taskadapter.redmineapi.RedmineTransportException: Cannot fetch data from https://............./issues.json : javax.net.ssl.SSLPeerUnverifiedException: peer not authenticated
at com.taskadapter.redmineapi.internal.comm.BaseCommunicator.sendRequest(BaseCommunicator.java:97)
at com.taskadapter.redmineapi.internal.comm.redmine.RedmineAuthenticator.sendRequest(RedmineAuthenticator.java:54)
at com.taskadapter.redmineapi.internal.comm.FmapCommunicator.sendRequest(FmapCommunicator.java:26)
at com.taskadapter.redmineapi.internal.comm.FmapCommunicator.sendRequest(FmapCommunicator.java:26)
at com.taskadapter.redmineapi.internal.comm.BasicSimplifier.sendRequest(BasicSimplifier.java:24)
at com.taskadapter.redmineapi.internal.Transport.getObjectsList(Transport.java:368)
at com.taskadapter.redmineapi.RedmineManager.getIssues(RedmineManager.java:278)
at alskor.tryapi.Simple.tryGetIssues(Simple.java:78)

Caused by: javax.net.ssl.SSLPeerUnverifiedException: peer not authenticated
at com.sun.net.ssl.internal.ssl.SSLSessionImpl.getPeerCertificates(SSLSessionImpl.java:352)

JSONBuilder does not write all the values of a custom field when the field is a list.

To reproduce the problem you need a CustomField of type List that accepts multiple values.
Then use the API to set the field with a list of strings.

To fix/workaround the problem I added check "isMultiple" to the method writeCustomFields in the class RedmineJSONBuilder.

private static void writeCustomFields(JSONWriter writer,
        List<CustomField> customFields) throws JSONException {
    if (customFields == null || customFields.isEmpty())
        return;
    writer.key("custom_field_values").object();
    for (CustomField field : customFields) {
        if(field.isMultiple())
            writer.key(Integer.toString(field.getId())).value(field.getValues());
        else
            writer.key(Integer.toString(field.getId())).value(field.getValue());
    }
    writer.endObject();
}

JSONException calling getSavedQueries with the newer JSon library

  • Got the following exception calling getSavedQueries.
  • It seems that the field "is_public" is a boolean not a string.
  • I am using Redmine 2.0.3.stable
  • I added the method getBooleanOrNull to JsonInput and changed the method RedmineJSONParser.parseSavedQuery to use JsonInput.getBooleanOrNull instead of getStringOrNull and that seems to fix the problem.

com.taskadapter.redmineapi.RedmineFormatException: org.json.JSONException: JSONObject["is_public"] not a string.
at com.taskadapter.redmineapi.internal.Transport.getObjectsList(Transport.java:386)
at com.taskadapter.redmineapi.internal.Transport.getObjectsList(Transport.java:335)
at com.taskadapter.redmineapi.RedmineManager.getSavedQueries(RedmineManager.java:440)
at aA.TicketExample.showQueries(TicketExample.java:47)
at aA.TicketExample.main(TicketExample.java:27)
Caused by: org.json.JSONException: JSONObject["is_public"] not a string.
at org.json.JSONObject.getString(JSONObject.java:644)
at com.taskadapter.redmineapi.internal.json.JsonInput.getStringOrNull(JsonInput.java:128)
at com.taskadapter.redmineapi.internal.RedmineJSONParser.parseSavedQuery(RedmineJSONParser.java:224)
at com.taskadapter.redmineapi.internal.RedmineJSONParser$15.parse(RedmineJSONParser.java:139)
at com.taskadapter.redmineapi.internal.RedmineJSONParser$15.parse(RedmineJSONParser.java:1)
at com.taskadapter.redmineapi.internal.json.JsonInput.getListOrNull(JsonInput.java:58)
at com.taskadapter.redmineapi.internal.Transport.getObjectsList(Transport.java:375)
... 4 more

regression in json version: empty description is returned as NULL

our Task Adapter test fails:

    GTask task = TestUtils.generateTask();
    GTask loadedTask = new TestSaver(connector).unselectField(FIELD.DESCRIPTION).saveAndLoad(task);
    assertEquals("", loadedTask.getDescription());

getDescription() returns NULL in json-based version

Redmine URLs ending with / do not work

Hey,

Since there's no hint trailing slashes aren't allowed, but the api pretty much adds slashes for whatever path it accesses, this'll end up in 404 pages with urls like http://demo.redmine.org:8080//issues.

It would be sort of nice if the api were to strip trailing slashes manually, if any exist; or if the javadoc is updated to explicitly say this isn't allowed.

Redmine-java-api in Android project

Hi All, I am new to Android. I am using redmine-java-api.jar in my android project. The project compiles fine but at run time I am getting below exception. I have added Redmine-java-api.jar as external JAR and added to project build path. my android environment is 2.2. please suggest.
Also, to resolve this issue, I downloaded and added the following dependency jar's commons-codec-1.4.jar, httpcore-4.2.1.jar, httpclient-4.2.jar, json-org.jar

(java.lang.NoSuchMethodError: org.apache.http.conn.ssl.SSLSocketFactory.
08-20 09:08:48.344: E/AndroidRuntime(333): at com.taskadapter.redmineapi.internal.comm.naivessl.NaiveSSLFactory.createNaiveSSLSocketFactory(NaiveSSLFactory.java:35)
08-20 09:08:48.344: E/AndroidRuntime(333): at com.taskadapter.redmineapi.internal.comm.HttpUtil.createConnectionManager(HttpUtil.java:53)
08-20 09:08:48.344: E/AndroidRuntime(333): at com.taskadapter.redmineapi.internal.comm.BaseCommunicator.(BaseCommunicator.java:30)
08-20 09:08:48.344: E/AndroidRuntime(333): at com.taskadapter.redmineapi.internal.Transport.(Transport.java:141)
08-20 09:08:48.344: E/AndroidRuntime(333): at com.taskadapter.redmineapi.RedmineManager.(RedmineManager.java:96)
08-20 09:08:48.344: E/AndroidRuntime(333): at com.taskadapter.redmineapi.RedmineManager.(RedmineManager.java:77)
08-20 09:08:48.344: E/AndroidRuntime(333): at com.example.againred.MainActivity.onCreate(MainActivity.java:20)

speed up API calls by caching HttpClient instance in RemineManager

original issue: http://code.google.com/p/redmine-java-api/issues/detail?id=87

this is just an idea to explore. we should try keeping HttpClient instance in RedmineManager class and see if this helps to speed up multiple "save" requests.

the reason for this refactoring is that Jean reported that his "create task" speed is roughly 100 times faster than the one measured for Task Adapter application.

Comment 3 by maksim.a.khokhlov, Nov 22, 2011
Profiled saving 110 task. See top 2 outstanding methods - those has been invoked (n tasks) + 1 times. The 2nd one is a result of creating an instance of DefaultHttpClient for every action.

Android: VerifyError: org.redmine.ta.internal.URIConfigurator

I have added following line in my pom.xml :

dependency
groupId com.taskadapter /groupId
artifactId redmine-java-api /artifactId
version1.11.0 /version
/dependency

with proper brackets.

and I tried "mvn clean install" .

The dependency was installed, but when I tried to run the application it crashed giving me this error:

java.lang.VerifyError: org.redmine.ta.internal.URIConfigurator
E/AndroidRuntime( 187): at org.redmine.ta.RedmineManager.(RedmineManager.java:105)
E/AndroidRuntime( 187): at org.redmine.ta.RedmineManager.(RedmineManager.java:100)
E/AndroidRuntime( 187): at org.redmine.ta.RedmineManager.(RedmineManager.java:54)
E/AndroidRuntime( 187): at org.umit.icm.mobile.gui.BugReportActivity.onCreate(BugReportActivity.java:77)
E/AndroidRuntime( 187): at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1123)
E/AndroidRuntime( 187): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2364)
E/AndroidRuntime( 187): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2417)
E/AndroidRuntime( 187): at android.app.ActivityThread.access$2100(ActivityThread.java:116)
E/AndroidRuntime( 187): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1794)
E/AndroidRuntime( 187): at android.os.Handler.dispatchMessage(Handler.java:99)
E/AndroidRuntime( 187): at android.os.Looper.loop(Looper.java:123)
E/AndroidRuntime( 187): at android.app.ActivityThread.main(ActivityThread.java:4203)
E/AndroidRuntime( 187): at java.lang.reflect.Method.invokeNative(Native Method)
E/AndroidRuntime( 187): at java.lang.reflect.Method.invoke(Method.java:521)
E/AndroidRuntime( 187): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:791)
E/AndroidRuntime( 187): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:549)
E/AndroidRuntime( 187): at dalvik.system.NativeStart.main(Native Method)

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.