Redmine Java Api


#1

Hallo, ich arbeite momentan mit der Redmine Java Api. Das funktioniert soweit auch ganz gut, allerdings habe ich bei einer Sache Probleme, bei Abfragen über Rest müssen im Fall von gefillterten Abfragen Parameter übergeben werden.
Beispiel:

...
final ConcurrentMap<String, String> parameters = new ConcurrentHashMap<>();
            parameters.put("f[]", "status_id");
            parameters.put("op[status_id]", "o");
            parameters.put("op[subject]", "~");
            parameters.put("set_filter", "1");
            issues = mainController.getIssueManager().getIssues(parameters);
...```

Die Vorgabe des Frameworks sieht eine Map vor allerdings müssen manche Parameter scheinbar mehrfach übergeben werden(Siehe f[]).

Vielleicht kann mir ein Web- oder Rubyprogrammierer sogar einen Typ dazu geben wie dies mit einer Map zu bewerkstelligen ist. Redmine ist in Rails umgesetzt. Vielleicht lassen sich die Parameter auch mit einem Namen aber in einem Container übergeben. Meine Versuche waren bisher erfolglos. Freue mich auf eure Vorschläge!

#2

habe als sportliche Aufgabe ohne Kenntnis/ Verwendung der API ein wenig danach gesucht und das hier gefunden:

wobei der angesprochende zu ändernde API-Code für die erste Variante nicht mehr in RedmineManager steht (in der Github-Version), sondern in
https://github.com/taskadapter/redmine-java-api/blob/master/src/main/java/com/taskadapter/redmineapi/internal/ParameterMapConverter.java

immerhin eine passende kleine klare Klasse, die man austauschen könnte, falls Quellcode verfügbar und zu verwenden
oder neue Jar zu bauen akzeptabel und machbar,


aber erstaunlich dass so ein anscheinend überschaubares und zentrales Konzept noch nicht direkt gelöst ist,
braucht denn niemand bei Verwendung dieser Java-API 2x f[] ?..

oder die zweite Variante aus dem Link funktioniert, mehrere Parameter mit | verbinden


#3

Ich habe eine Löung gefunden, musste mich allerdings im Ordner internal bedienen. Allerdings habe ich das Framework nur erweitert nicht umgeändert wie manche es vorgeschlagen haben.
Die Lösung ist auch auf Github.

Hier noch einmal auf deutsch:

Als erstes erzeuge ich eine Instanz von der Klasse Transport in meinem Controller:

private void createTransport(){
transport=new Transport(new URIConfigurator(config.getRedmineUri(), 
config.getRedmineApiAccessKey()),new DefaultHttpClient());
}
...

Dann benutze ich ein Set mit NameValuePairs um die Abfrage Parameter zu setzen:

Set\<NameValuePair> params =new HashSet<>();
params.add(new BasicNameValuePair("f[]", "assigned_to_id"));
params.add(new BasicNameValuePair("f[]", "status_id"));
params.add(new BasicNameValuePair("op[status_id]", "o"));
params.add(new BasicNameValuePair("op[subject]", "~"));
params.add(new BasicNameValuePair("op[assigned_to_id]", "="));
params.add(new BasicNameValuePair("v[assigned_to_id][]","me"));
params.add(new BasicNameValuePair("set_filter", "1"));
List issues = null;
try {
// final MultiValueMap parameters = new MultiValueMap();
// parameters.put("f[]", "assigned_to_id|status_id");
// parameters.put("op[status_id]", "o");
// parameters.put("op[subject]", "~");
// parameters.put("op[assigned_to_id]", "=");
// parameters.put("v[assigned_to_id][]","me");
// parameters.put("set_filter", "1");
// issues = mainController.getIssueManager().getIssues(parameters);
issues=mainController.getTransport().getObjectsList(Issue.class, params);
} catch (RedmineException ex) {
...```
Es funktioniert, ist zwar ein wenig dirty weil ich auf die Klassen aus internal zugreifen muss, ist aber meiner Meinung nach deutlich sauberer als den Code des Frameworks zu ändern. Die meisten im obigen Link aufgeführten Lösungsansätze habe ich ausprobiert und Sie funktionieren leider nicht.