# Jira durch Java ansprechen



## AmunRa (2. Aug 2010)

Hallo Ich hab eine "kleine" Aufgabe bekommen
und zwar soll ich ein Programm schreiben, mit dem ich bei JIRA z.B. einen Bug erstellen kann 

mein Problem, dass ich hab ist, dass ich leider keine Ahnung von JIRA hab und daher wollte ich fragen 

ob jemand von euch weiß wie ich von einem Java Progeram heraus mit einem Jira"-Server" (falls das so richtig ist) kommunizieren kann. 

Ob vl jemand ein Tutorial hat in dem ich dies lernen kann?


Mfg 
amunra


----------



## mvitz (2. Aug 2010)

Am besten geht das über die SOAP WebService Schnittstelle von JIRA.

Wenn ich morgen auf der Arbeit war, kann ich dir Abends ein paar Snippets posten/schicken, da ich bereits einmal mit der Schnitstelle gearbeitet habe.

Ansonsten gibts hier: Creating a SOAP Client - JIRA 4.1 - Atlassian Documentation - Confluence schonmal Informationen und du musst natürlich WebServices beherschen (z.B. Axis, Axis2, JaxWS, ...)


----------



## bygones (2. Aug 2010)

*hust* google hilft *hust*

JIRA RPC Services - JIRA 4.1 - Atlassian Documentation - Confluence


----------



## AmunRa (2. Aug 2010)

Vielen Dank für die Antworten, hab in der zwischen zeit auch das mit SOAP gefunden , aber auch XML-RCP (wobei dies nicht empfohlen wird) 


@mvitz ich wäre echt dankbar wenn du mir da etwas senden könntest.

ich werd mich heute mal noch versuchen in SOAP einzuarbeiten, da ich noch nie damit gearbeitet habe.

MFG 
amunra


----------



## AmunRa (2. Aug 2010)

Ich hab mir da jetzt ein paar informationen durchgelesen und bin jetzt auf eine Unklarheit gestossen.

Wenn ich SOAP nutze, brauche ich ja die WSDL datei und aus der kann ich dann iwie .java files generieren. Richtig? 

Nun soll aber mein Programm nicht einen speziellen JIRA Server ansprechen sondern, der User soll zur Laufzeit des Programms den Server angeben mit dem er kommunizieren will. Ist hierfür SOAP geeignet bzw versteh ich da iwie etwas falsch?

MFG
amunra


----------



## bygones (2. Aug 2010)

ich persoenlich wuerde auch nicht mehr mit SOAP etwas machen, sondern versuchen REST zu nutzen - dafuer bieten sie ja auch ne API an.


----------



## AmunRa (2. Aug 2010)

Mir sagt leider REST noch weniger wie SOAP.

Leider finde ich auf der Seite kein Tutorial wie ich einen REST Client schreibe oder hab ich da etwas übersehen?


Und um nocheinmal auf meine Zuvor gestellte Frage einzugehen.
Sehe ich dass richtig, dass ich meine Problemstellung (mit einem Client auf unterschiedliche Jira Server zu verbinden) mit SOAP nicht lösen kann? 


mfg 

amunra


----------



## mvitz (2. Aug 2010)

Doch man kann die Adresse der WSDL Datei auch zur Laufzeit übergeben, dass geht mit SOAP Problemlos. XML-RPC hatte damals ca. vor 6 Monaten viele Funktionen nicht, die aber per SOAP gehen.

Der REST Support ist mir neu. Wenn man es kann, sollte man vermutlich tatsächlich diesen nutzen, aber die Tutorial Seite ist imho noch sehr unvollständig...


----------



## AmunRa (2. Aug 2010)

Also sollte ich versuchen trotzdem versuchen das ganze mit REST zu implementieren. 

Wird ja eigentlich auch von atlassian empfohlen


> All Atlassian products, including JIRA, are gradually moving to REST as the preferred remote access method



Gut dann sollte ich mir mal ein Tutorial suchen dass mir ein bisschen die grundzüge für REST zeigt. 

wenn jemand ein etwas brauchbares kennt bitte posten 

Danke 
mfg 
amunra


----------



## mvitz (2. Aug 2010)

Als Anfang könntest du z.B. folgendes nehmen:
Jersey-Tutorial: REST, JAX-RS, RESTful Web-Services mit Java


----------



## bygones (2. Aug 2010)

REST fuer den Client ist eigentlich recht einfach.

Im Grunde ists nur ein HTTP Get Request an eine URL...


----------



## AmunRa (2. Aug 2010)

danke für den Link

ich weiß noch immer nicht wwelcher weg der beste ist um mit JIRA zu komunizieren. 
ob SOAP oder REST. 

mvitz könntest du mir bitte trotzdem (falls es möglich ist ) mir deinen Code für SOAP zukommen lassen? 


mfg 
amunra


----------



## bygones (2. Aug 2010)

AmunRa hat gesagt.:


> danke für den Link
> 
> ich weiß noch immer nicht wwelcher weg der beste ist um mit JIRA zu komunizieren.
> ob SOAP oder REST.
> ...


wenn sie selbst sagen es ist REST, so wuerde ich mir erstmal das REST API anschauen und schaun obs funktioniert.

wenn es das nicht dann kannst du immer noch mit SOAP es versuchen.

wie gesagt - REST ist verblueffend einfach...


----------



## mvitz (2. Aug 2010)

Jap, stimme bygones da zu. Im Endeffekt muss man einfach nur HTTP GET Requests an die passende URL senden (bei JIRA kommt dann idr. noch irgendwie das mitsenden der Login Informationen dazu) und die Antwort (XML, JSON, HTML) parsen und in deine Objekte umwandeln (z.B. bei XML mit JAX-B).

Alternativ kann man eben auch die Jersey Client Klassen nutzen, das spart einem hier und da bestimmt Arbeit.

Die SOAP Sachen, sofern ich sie noch habe/finde lasse ich dir auf jeden Fall zu kommen.


----------



## AmunRa (3. Aug 2010)

Hallo 

bzg. REST bei JIRA weis irgendwer ab welcher Version vom JIRA-Server dies unterstütz wird

ich glaub ich hab irgendwo gelesen, dass dies erst mit der neuesten Version geht oder lieg ich da falsch?
ich find nur den beitrag nicht mehr wo das gestanden ist.

mfg 
amunra


----------



## mvitz (3. Aug 2010)

Sry, dass ich erst jetzt erst wieder was schreibe, bin aber gerade erst an nen PC gekommen.

1) Zu der Versionsfrage, musst du mal selber auf der JIRA Seite suchen, hatte da bisher nix zu gelesen und hab jetzt keine Lust zu suchen 
2) Das Projekt habe ich von der Arbeit kopiert, werde dann morgen das ganze so verkleinern, dass es als Beispiel/Start für dich passt. Hoffe du kannst Ant, denn darüber generiere ich z.B. die JIRA SOAP Klassen. Denke mal, dass ich das bis ca. 12:00 geschafft haben sollte.


----------



## AmunRa (4. Aug 2010)

So 
Es ist jetzt entschieden worden, dass es über SOAP gelöst werden soll.
Hab jetzt leider nur das Problem, dass ich z.B die WSDL datei von  http://jira.atlassian.com/rpc/soap/jirasoapservice-v2?wsdl
weder mit wsimport noch mit wsdl2java parsen kann.

hab dann versucht die kommunikation mit JIRA ohne WSDL -Datei zu realisieren, z.B über Dynamic Interface Invokation,  und das funktioniert auch bis zu einem gewissen grad (ich kann mich anmelden und wieder ausloggen). Aber sobald ich eine Methode aufrufe die eine Object zurückliefert das kein JAVA Standard Typ ist bekomme ich  diese Exception 

[c] org.xml.sax.SAXException: No deserializer defined for array type {http://beans.soap.rpc.jira.atlassian.com}RemoteProject[/c]

was verständlich ist, da ja mein Programm nicht wissen kann wie er dies parsen/deserialisieren soll. 

Hier ist mal mein CODE mit dem ich das versuchen wollte

```
package jira.test.soap;

import java.rmi.RemoteException;


import javax.xml.namespace.QName;
import javax.xml.rpc.Call;
import javax.xml.rpc.ServiceException;
import javax.xml.rpc.ServiceFactory;
import javax.xml.rpc.Service;

import com.atlassian.jira.rpc.soap.beans.RemoteProject;
import com.atlassian.jira.rpc.soap.*;

public class Main {
	
    static final String LOGIN_NAME = "amunra";
    static final String LOGIN_PASSWORD = "";
    static final String SERVICE_NAME= "JiraSoapServiceService";
    static final String URI_= "impl:jirasoapservice-v2SoapBinding";
    static final String ENDPOINT = "http://jira.atlassian.com/rpc/soap/jirasoapservice-v2";
    static final String WSDLLOCATION= "http://jira.atlassian.com/rpc/soap/jirasoapservice-v2?wsdl";

    private static String token;
    private static Call call;
    private static Service service;
    private static boolean loggedin = false;
	/**
	 * @param args
	 */
	public static void main(String[] args) {
		
		try{	
			ServiceFactory factory = 
                ServiceFactory.newInstance();
			 service= factory.createService(new java.net.URL(WSDLLOCATION),new QName(ENDPOINT, SERVICE_NAME));
			call= (Call)service.createCall();
			login();
			
			askAllProjects();  //<---- BEI DIESER METHODE TRITT DER FEHLER AUF
		
			logout();
			
			
			
			}catch(org.apache.axis.AxisFault fault){
				if (loggedin){
					logout();
				}
				
				System.out.println("AXIS FAULT");
				System.out.println("Fault Code: "+fault.getFaultCode());
				System.out.println("Fault String: "+fault.getFaultString());
				System.out.println("Fault Details: "+fault.getFaultDetails());
				System.out.println("Fault Reason: "+ fault.getFaultReason());
				System.out.println("Fault Role: "+fault.getFaultRole());
				fault.printStackTrace();
				
			}catch(Exception e){
				if (loggedin){
					logout();
				}
				System.out.println("Failure during execution of the command");
				System.err.println(e);
			}
	}

	
	
	private static void askAllProjects() throws RemoteException, ServiceException {
		//Dynmaic Proxy
//		JiraSoapService soapservice= (JiraSoapService) service.getPort(new QName(ENDPOINT, "jirasoapservice-v2"), JiraSoapService.class);

		//Dynmaic Interface Invokation
		call.setOperationName(new QName(ENDPOINT, "getProjectsNoSchemes"));
		RemoteProject[] output=(RemoteProject[])call.invoke(new Object[]{token});
		
		
	}
	public static void login() throws RemoteException{
		call.setOperationName(new QName(ENDPOINT, "login"));
		
		call.setTargetEndpointAddress(ENDPOINT);
		token=  (String)call.invoke(new Object[] {
			LOGIN_NAME, 
			LOGIN_PASSWORD});
		System.out.println("you are logged in successfully!\n your token is:\n"+ token);
		loggedin= true;
		
	}
	private static void logout(){
		
		try{
		call.setOperationName(new QName(ENDPOINT,"logout"));
		call.setTargetEndpointAddress(ENDPOINT);
		if ((Boolean)call.invoke(new Object[]{token}))		System.out.println("Logout successful");
		}catch(org.apache.axis.AxisFault fault){
		
			System.out.println("AXIS FAULT");
			System.out.println("Fault Code: "+fault.getFaultCode());
			System.out.println("Fault String: "+fault.getFaultString());
			System.out.println("Fault Details: "+fault.getFaultDetails());
			System.out.println("Fault Reason: "+ fault.getFaultReason());
			System.out.println("Fault Role: "+fault.getFaultRole());
			fault.printStackTrace();
			
		}catch(Exception e){
			
			System.out.println("Failure during execution of the command logout");
			System.err.println(e);
		}
		
		
	}
	
}
```


----------



## mvitz (4. Aug 2010)

Also ich weiß es nicht mehr genau, aber ich hatte zumindest mit Axis2 auch Probleme, weil deren WSDL sich wohl nicht 100% an die Spezifikation hält. Deshalb habe ich Axis1 benutzt, das WSDL2Java funktioniert nämlich.

Ich habe dir mal meine Sourcen hochgeladen: http://dl.dropbox.com/u/6767204/Jira-SOAP-Client-0.0.1-src.tar.gz

Wenn du das ganze als Eclipse Project benutzen möchtest, musst du folgende Ordner zu Source-Foldern machen:


```
src/java
src/conf
build/gen-src
```
build/gen-src erscheint erst, nachdem man das Ant-Target: build aufgerufen hat (hier landen die aus der WSDL generieren Klassen.

Zum testen habe ich mir gerade hier: System Dashboard - Atlassian Software Inc. einen Account angelegt. Wenn du das auch machst, musst du nur noch in der Main-Klasse User/Passwort eintragen, dann bekommst du den Projectleader des Projectes JRA angezeigt.

Hoffe das hilft.


----------



## AmunRa (4. Aug 2010)

Vielen Dank für dein Bemühen du hast recht mit einer der Axis 1.3 kann ich wsdl2Java nutzen 

ich werd mir deinen Code auch gleich ansehen. und er wird mir sicher weiter helfen 

wenn ich noch weitere Fragen habe werd ich mich nocheinmal melden


----------

