(Android Studio) Jira Zugriff um Datensätze an zu zeigen

  • Antworten:9
niklas c.
  • Forum-Beiträge: 6

11.02.2018, 23:15:25 via Website

Hallo zusammen,

aus Interesse versuche ich gerade Datensätze aus meinem Jira Account aus zu lesen.

Ich habe in Android Studio auch die Funktion gefunden, dass Jira als Server importiert werden kann nur glaube ich das ich so auf dem Holzweg bin.

Mein Ziel ist es Datensätze aus zu lesen, zu erstellen und zu bearbeiten.

Leider komme ich mit meiner Recherche im Netz nicht weiter und würde mich freuen wenn mir jemand helfen kann oder mich in die richtige Richtung bringen kann.

Liebe Grüße

Niklas

Kommentieren
swa00
  • Forum-Beiträge: 3.704

12.02.2018, 00:22:53 via Website

Hallo Niklas,

ich vermute, du bist auf dem Holzweg.

Du musst zum Abfragen deines Jira Accounts deren API verwenden.
Das Jira im AS hat nichts mir deinem Account zu tun

https://developer.atlassian.com/cloud/jira/platform/rest/
https://confluence.atlassian.com/jira062/supported-platforms-588581513.html

— geändert am 12.02.2018, 00:25:46

Liebe Grüße - Stefan
[ App - Entwicklung ]

Hilfreich?
Pascal P.
Kommentieren
niklas c.
  • Forum-Beiträge: 6

14.02.2018, 08:00:57 via Website

Hallo Stefan,

vielen Dank für deine Rückmeldung.

Ich versuche mich jetzt mal an der Umsetzung mittels der API. Ich hoffe das wird was;)

Soll ich euch auf dem laufenden halten?

Liebe Grüße

Niklas

Hilfreich?
Kommentieren
Pascal P.
  • Admin
  • Forum-Beiträge: 11.286

14.02.2018, 18:46:32 via Website

Wäre nicht schlecht, zumal wir dir dann besser weiterhelfen könnten, solltest du ein Problem haben.

LG Pascal //It's not a bug, it's a feature. :) ;)

Hilfreich?
Kommentieren
niklas c.
  • Forum-Beiträge: 6

19.02.2018, 08:48:13 via Website

Hallo zusammen,

ich bin jetzt schon dank eurer Hilfe weitergekommen. Leider noch nicht so weit wie ich wollte. Ich habe die folgenden Libs eingebunden:
attlassian-util-concurrent-3.0.0.jar
jira-rest-Java-client-2.0.0-m2.jar

und versuche es mit dem folgenden Code:

import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import com.atlassian.jira.rest.client.JiraRestClient;
import com.atlassian.jira.rest.client.JiraRestClientFactory;
import com.atlassian.jira.rest.client.domain.BasicProject;
import com.atlassian.jira.rest.client.domain.Issue;
import com.atlassian.jira.rest.client.domain.BasicIssue;
import com.atlassian.jira.rest.client.domain.SearchResult;
import com.atlassian.jira.rest.client.domain.User;
import com.atlassian.jira.rest.client.domain.Version;
import com.atlassian.jira.rest.client.internal.async.AsynchronousJiraRestClientFactory;
import com.atlassian.util.concurrent.Promise;
import java.net.URI;

public class MainActivity extends AppCompatActivity {

private static final String JIRA_URL = "(Ich darf noch keine Links einfügen)net:8080";
private static final String JIRA_ADMIN_USERNAME = "admin";
private static final String JIRA_ADMIN_PASSWORD = "admin";


@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
}


public static void main(String[] args) throws Exception {
    // Construct the JRJC client
    System.out.println(String.format("Logging in to %s with username '%s' and password '%s'", JIRA_URL, JIRA_ADMIN_USERNAME, JIRA_ADMIN_PASSWORD));
    JiraRestClientFactory factory = new AsynchronousJiraRestClientFactory();
    URI uri = new URI(JIRA_URL);
    JiraRestClient client = factory.createWithBasicHttpAuthentication(uri, JIRA_ADMIN_USERNAME, JIRA_ADMIN_PASSWORD);

    // Invoke the JRJC Client
    Promise<User> promise = client.getUserClient().getUser("admin");
    User user = promise.claim();

    for (BasicProject project : client.getProjectClient().getAllProjects().claim()) {
        System.out.println(project.getKey() + ": " + project.getName());
    }

    Promise<SearchResult> searchJqlPromise = client.getSearchClient().searchJql("project = MYPURRJECT AND status in (Closed, Completed, Resolved) ORDER BY assignee, resolutiondate");

    for (BasicIssue issue : searchJqlPromise.claim().getIssues()) {
        System.out.println(issue.getSelf());
    }

    // Print the result
    System.out.println(String.format("Your admin user's email address is: %s\r\n", user.getEmailAddress()));

    // Done
    System.out.println("Example complete. Now exiting.");
    System.exit(0);

}

}

Leider erhalte ich immer die folgenden Fehlermeldungen obwohl genau dieses Beispiel oftmals in vielen anderen Beispielen verwendet wird.

Fehlerbeschreibung:
1. Error:(40, 28) error: cannot access ListenableFuture
class file for com.google.common.util.concurrent.ListenableFuture not found


  1. Error:Execution failed for task ':app:compileDebugJavaWithJavac'.

    Compilation failed; see the compiler error output for details.



Wenn ihr mir hier helfen könnten oder Lösungsvorschläge habt würde ich mich sehr freuen:)

Liebe Grüße

Niklas

— geändert am 19.02.2018, 08:51:28

Hilfreich?
Kommentieren
niklas c.
  • Forum-Beiträge: 6

19.02.2018, 18:59:32 via Website

Hallo Pascal,

danke für deine Rückmeldung. Dein zweiter Tipp hat sehr gut geklappt, ich konnte damit auch kompilieren.
Leider hatte ich dann einen Abruch, wenn dieser Teil:
JiraRestClient client = factory.createWithBasicHttpAuthentication(uri, JIRA_ADMIN_USERNAME, JIRA_ADMIN_PASSWORD);
aufgerufen wurde.

Dann habe ich deinen ersten Tipp beherzigt und versucht umzusetzen. Libs per Grandle hatte ich vorher noch nie eingebunden. Ich mache mit Sicherheit etwas falsch.

dependencies {
implementation fileTree(include: ['*.jar'], dir: 'libs')
implementation 'com.android.support:appcompat-v7:26.1.0'
implementation 'com.android.support.constraint:constraint-layout:1.0.2'
testImplementation 'junit:junit:4.12'
androidTestImplementation 'com.android.support.test:runner:1.0.1'
androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.1'

compile 'com.google.guava:guava:20.0'
compile 'com.atlassian.jira:jira-rest-java-client-api:4.0.0'
compile 'io.atlassian.util.concurrent:atlassian-util-concurrent:4.0.1'
compile 'com.atlassian.fugue:fugue:3.0.0-m007'

}

Hier bekomme ich die folgenden Fehlermeldungen:
Error:com.android.builder.dexing.DexArchiveBuilderException: Failed to process C:\Users\nikla.gradle\caches\modules-2\files-2.1\io.atlassian.util.concurrent\atlassian-util-concurrent\4.0.1\34fdb324a609ff5e008e707de7c0741aeaa4b981\atlassian-util-concurrent-4.0.1.jar

Error:com.android.builder.dexing.DexArchiveBuilderException: Error while dexing io/atlassian/util/concurrent/atomic/Atomics.class

Error:com.android.dx.cf.code.SimException: invalid opcode ba (invokedynamic requires --min-sdk-version >= 26)

Error:Execution failed for task ':app:transformClassesWithDexBuilderForDebug'.

com.android.build.api.transform.TransformException: com.android.builder.dexing.DexArchiveBuilderException: com.android.builder.dexing.DexArchiveBuilderException: Failed to process C:\Users\nikla.gradle\caches\modules-2\files-2.1\io.atlassian.util.concurrent\atlassian-util-concurrent\4.0.1\34fdb324a609ff5e008e707de7c0741aeaa4b981\atlassian-util-concurrent-4.0.1.jar

Wenn ihr mir noch einmal helfen könntet würde ich mich sehr freuen.

Wenn dann alles funktioniert veröffentliche ich mein Ergebnis natürlich für alle, damit andere in der Community auch davon profitieren können.

Liebe Grüße

Niklas

Hilfreich?
Kommentieren
Pascal P.
  • Admin
  • Forum-Beiträge: 11.286

19.02.2018, 19:23:01 via Website

Statt compile nutzt man jetzt 'implementation', das ist aber nur notation.

Jetzt wo du die Libs mit Gradle einbindest, solltest du die Jars löschen oder diese Zeile rausnehmen:

implementation fileTree(include: ['*.jar'], dir: 'libs') 

zudem solltest du vlt. auf Java 8 aufbauen: https://stackoverflow.com/a/45862662
https://forum.unity.com/threads/java-8-aar-library-requires-minimum-sdk-version-26.504040/

LG Pascal //It's not a bug, it's a feature. :) ;)

Hilfreich?
Kommentieren
niklas c.
  • Forum-Beiträge: 6

06.03.2018, 10:07:39 via Website

Hallo zusammen,

ich bekomme leider keine Verbindung aufgebaut und möchte euch auf dem laufenden halten. Ich versuche derzeit nebenbei nun die Verbindung über JSON auf zu bauen. Leider bekomme ich das nicht hin mich zu Authentifizieren. Ich habe euch meinen Code mal angehangen, weiß leider aber nicht wo ich die Basic Authentifizierung unterbringen soll. Der JSON Test war nur für Testzwecke und wird umgeändert wenn die Verbindung aufgebaut wird.

import android.os.AsyncTask;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;

import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;

import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.URL;
import java.util.Base64;

public class MainActivity extends AppCompatActivity {

/* private static final String username = "admin";
private static final String password = "admin";
private static final String jiraBaseURL = "test.atlassian.net/rest/api/2/";*/

public class DownloadTask extends AsyncTask<String, Void, String> {

    @Override
    protected String doInBackground(String... urls) {
        String result = "";
        URL url;
        HttpURLConnection urlConnection = null;

        try{
            url = new URL(urls[0]);

            urlConnection = (HttpURLConnection) url.openConnection();
            InputStream inputStream = urlConnection.getInputStream();
            InputStreamReader reader = new InputStreamReader(inputStream);
            int data = reader.read();

            while(data != -1){
                char current = (char)data;
                result += current;
                data = reader.read();
            }
            return result;

        }catch (Exception e){
            e.printStackTrace();
            return null;
        }
    }
    // hier wird das Ergebnis ausgegeben welches in der doInBackground läuft
    @Override
    protected void onPostExecute(String s) {
        super.onPostExecute(s);
        try {
            //Hier wird eine Jason Datei aus der Übergagbevariable s erzeugt
            JSONObject jsonObject = new JSONObject(s);
            // Hier wird das ganze Object abgfefragt
            //Wenn hier z.B. weather abgefragt wird, werden nur die Werte Werte des Objectes Weather ausgegeben
            String ersteVar = jsonObject.getString("weather");
            Log.i("Wetter",ersteVar);

            //Hier wird ein Array erzeugt und aus dem Object ein Wert abgefragt
            JSONArray arr = new JSONArray(ersteVar);
            for (int i = 0; i<arr.length();i++){
                JSONObject jasonPart = arr.getJSONObject(i);
                //Hier können nun einzelne Werte aus dem Object ausgelesen werden.
                Log.i("Clear",jasonPart.getString("main"));
                Log.i("description",jasonPart.getString("description"));
            }



        } catch (JSONException e) {
            e.printStackTrace();
        }
        Log.i("JSON",s);
    }
}



@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    String encodedString1 = decodePWBN();
    Log.i("Encoder neu",encodedString1);

    // Hier wird der PRozess erstellt
    DownloadTask task = new DownloadTask();
    // Hier wird der Task mit einem JSON String ausgeführt
    //Wichtig in der AndroidManifest XML wie folgt ergänzen:     <uses-permission android:name="android.permission.INTERNET"/>
    try{

        task.execute("samples.openweathermap.org/data/2.5/weather?lat=35&lon=139&appid=b6907d289e10d714a6e88b30761fae22");
    }catch (Exception e){
        e.printStackTrace();
    }

}

public String decodePWBN(){
String originalInput = "admin:admin";
String encodedString = Base64.getEncoder().encodeToString(originalInput.getBytes());
return encodedString;
}

/*
String url = "test.atlassian.net/rest/api/2/";
String name = "java2novice";
String password = "Simple4u!";
String authString = name + ":" + password;
String authStringEnc = new BASE64Encoder().encode(authString.getBytes());
System.out.println("Base64 encoded auth string: " + authStringEnc);
Client restClient = Client.create();
WebResource webResource = restClient.resource(url);
ClientResponse resp = webResource.accept("application/json")
.header("Authorization", "Basic " + authStringEnc)
.get(ClientResponse.class);
if(resp.getStatus() != 200){
System.err.println("Unable to connect to the server");
}
String output = resp.getEntity(String.class);
System.out.println("response: "+output);*/

}

Hilfreich?
Kommentieren
niklas c.
  • Forum-Beiträge: 6

06.03.2018, 10:17:06 via Website

Hallo zusammen,

zwei Minuten nach meinem Post hatte ich die "Erleuchtung":D nun klappt auch die Authentifizierung.

Hier mein zusätzlich ergänzter Code:

    @Override
    protected String doInBackground(String... urls) {
        String result = "";
        URL url;
        HttpURLConnection urlConnection = null;
        String encodedString1 = decodePWBN();
        String loginbn = "Basic " + encodedString1;
        try{
            url = new URL(urls[0]);

            urlConnection = (HttpURLConnection) url.openConnection();
            urlConnection.setRequestProperty("Authorization",loginbn);
            InputStream inputStream = urlConnection.getInputStream();
            InputStreamReader reader = new InputStreamReader(inputStream);
            int data = reader.read();

            while(data != -1){
                char current = (char)data;
                result += current;
                data = reader.read();
            }
            return result;

        }catch (Exception e){
            e.printStackTrace();
            return null;
        }
    }

Liebe Grüße

Niklas

Hilfreich?
Kommentieren