2009-03-10 12 views

risposta

9

So che questo è un filo po 'vecchio, ma come è del tutto possibile che le persone con la stessa domanda potrebbe sbarcare fino qui ho pensato di condividere un post sul blog ho scritto su quattro Java librerie client che ho trovato per accedere a Bugzilla: J2Bugzilla, B4J (Bugzilla per Java), Libreria Bugzilla, LightingBugAPI.

http://www.dzone.com/links/r/bugzilla_web_service_and_java_client_libraries.html

migliori saluti, Nandana

+0

questa è una grande panoramica, è un peccato solo che la maggior parte delle biblioteche sono che incompleti. – Mauli

2

La biblioteca/API viene chiamata JAX-WS (o JAXB), e permette di richiamare WS di qualsiasi natura Ottieni lo schema, genera i bean e i proxy, chiamali.

5

C'è Apache WS XML-RPC(ora è un boccone!) che è un'implementazione XML-RPC completa che è possibile utilizzare. Non conosco bene BugZilla ma supponendo che supporti XML-RPC, non dovrebbero esserci problemi usando il mostruoso boccone che ho appena collegato.

1

Mylyn potrebbe essere una buona scelta per tu.

Se è necessaria una configurazione più semplice o un controllo migliore di come accadono le cose, è possibile scrivere le proprie chiamate XML-RPC all'interfaccia del servizio Web di Bugzilla. Ho riassunto il processo sul mio blog: Chat to Bugzilla from Java using Apache XML-RPC.

Per riassumere:

  • ottenere le librerie Apache XML-RPC
  • ottenere il client HTTP Apache da Commons (vecchia versione)

Quindi utilizzare seguente classe come classe base (gestisce i cookie etc.) e ignorare che:

/** 
* @author joshis_tweets 
*/ 
public class BugzillaAbstractRPCCall { 

    private static XmlRpcClient client = null; 

    // Very simple cookie storage 
    private final static LinkedHashMap<String, String> cookies = new LinkedHashMap<String, String>(); 

    private HashMap<String, Object> parameters = new HashMap<String, Object>(); 
    private String command; 

    // path to Bugzilla XML-RPC interface 
    private static final String BZ_PATH = "https://localhost/bugzilla/xmlrpc.cgi"; 

    /** 
    * Creates a new instance of the Bugzilla XML-RPC command executor for a specific command 
    * @param command A remote method associated with this instance of RPC call executor 
    */ 
    public BugzillaAbstractRPCCall(String command) { 
     synchronized (this) { 
      this.command = command; 
      if (client == null) { // assure the initialization is done only once 
       client = new XmlRpcClient(); 
       XmlRpcClientConfigImpl config = new XmlRpcClientConfigImpl(); 
       try { 
        config.setServerURL(new URL(BZ_PATH)); 
       } catch (MalformedURLException ex) { 
        Logger.getLogger(BugzillaAbstractRPCCall.class.getName()).log(Level.SEVERE, null, ex); 
       } 
       XmlRpcTransportFactory factory = new XmlRpcTransportFactory() { 

        public XmlRpcTransport getTransport() { 
         return new XmlRpcSunHttpTransport(client) { 

          private URLConnection conn; 

          @Override 
          protected URLConnection newURLConnection(URL pURL) throws IOException { 
           conn = super.newURLConnection(pURL); 
           return conn; 
          } 

          @Override 
          protected void initHttpHeaders(XmlRpcRequest pRequest) throws XmlRpcClientException { 
           super.initHttpHeaders(pRequest); 
           setCookies(conn); 
          } 

          @Override 
          protected void close() throws XmlRpcClientException { 
           getCookies(conn); 
          } 

          private void setCookies(URLConnection pConn) { 
           String cookieString = ""; 
           for (String cookieName : cookies.keySet()) { 
            cookieString += "; " + cookieName + "=" + cookies.get(cookieName); 
           } 
           if (cookieString.length() > 2) { 
            setRequestHeader("Cookie", cookieString.substring(2)); 
           } 
          } 

          private void getCookies(URLConnection pConn) { 
           String headerName = null; 
           for (int i = 1; (headerName = pConn.getHeaderFieldKey(i)) != null; i++) { 
            if (headerName.equals("Set-Cookie")) { 
             String cookie = pConn.getHeaderField(i); 
             cookie = cookie.substring(0, cookie.indexOf(";")); 
             String cookieName = cookie.substring(0, cookie.indexOf("=")); 
             String cookieValue = cookie.substring(cookie.indexOf("=") + 1, cookie.length()); 
             cookies.put(cookieName, cookieValue); 
            } 
           } 
          } 
         }; 
        } 
       }; 
       client.setTransportFactory(factory); 
       client.setConfig(config); 
      } 
     } 
    } 

    /** 
    * Get the parameters of this call, that were set using setParameter method 
    * @return Array with a parameter hashmap 
    */ 
    protected Object[] getParameters() { 
     return new Object[] {parameters}; 
    } 

    /** 
    * Set parameter to a given value 
    * @param name Name of the parameter to be set 
    * @param value A value of the parameter to be set 
    * @return Previous value of the parameter, if it was set already. 
    */ 
    public Object setParameter(String name, Object value) { 
     return this.parameters.put(name, value); 
    } 

    /** 
    * Executes the XML-RPC call to Bugzilla instance and returns a map with result 
    * @return A map with response 
    * @throws XmlRpcException 
    */ 
    public Map execute() throws XmlRpcException { 
     return (Map) client.execute(command, this.getParameters()); 
    } 
} 

sostituire la classe, fornendo CUS tom costruttore e con metodi aggiungendo:

public class BugzillaLoginCall extends BugzillaAbstractRPCCall { 

    /** 
    * Create a Bugzilla login call instance and set parameters 
    */ 
    public BugzillaLoginCall(String username, String password) { 
     super("User.login"); 
     setParameter("login", username); 
     setParameter("password", password); 
    } 

    /** 
    * Perform the login action and set the login cookies 
    * @returns True if login is successful, false otherwise. The method sets Bugzilla login cookies. 
    */ 
    public static boolean login(String username, String password) { 
     Map result = null; 
     try { 
      // the result should contain one item with ID of logged in user 
      result = new BugzillaLoginCall(username, password).execute(); 
     } catch (XmlRpcException ex) { 
      Logger.getLogger(BugzillaLoginCall.class.getName()).log(Level.SEVERE, null, ex); 
     } 
     // generally, this is the place to initialize model class from the result map 
     return !(result == null || result.isEmpty()); 
    } 

}