2009-03-10 10 views
7

Có api java (độc lập) nào kết thúc giao diện XML-RPC với bugzilla không? Tôi không muốn chương trình api của riêng tôi cho nó, và tôi không thể thực sự tìm thấy một thư viện mà thực hiện điều này (và chỉ này).Có một api java để truy cập bugzilla không?

Cập nhật:

Tôi đang tìm một cái gì đó như thế này http://oss.dbc.dk/bugzproxy/ chỉ viết bằng Java

Trả lời

9

Tôi biết đây là một chủ đề hơi cũ nhưng vì nó là hoàn toàn có thể rằng những người có cùng một câu hỏi có thể hạ cánh lên ở đây tôi nghĩ đến việc chia sẻ một bài đăng blog tôi đã viết khoảng bốn Java thư viện khách hàng mà tôi đã tìm thấy để truy cập Bugzilla: J2Bugzilla, B4J (Bugzilla cho Java), Thư viện Bugzilla, LightingBugAPI.

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

Best Regards, Nandana

+0

đây là một tổng quan tuyệt vời, nó chỉ là không may là hầu hết các thư viện là rằng không đầy đủ. – Mauli

2

Thư viện/API được gọi JAX-WS (hoặc JAXB), và cho phép bạn gọi WS của bất kỳ bản chất nào. Lấy lược đồ, tạo các bean và proxy, gọi chúng.

5

Apache WS XML-RPC(bây giờ là một ngụm!) là triển khai XML-RPC đầy đủ mà bạn có thể sử dụng. Tôi không biết BugZilla tốt nhưng giả sử nó hỗ trợ XML-RPC, không nên có bất kỳ vấn đề nào bằng cách sử dụng cái miệng khổng lồ mà tôi vừa liên kết.

1

Ngoài ra còn có Mylyn được cho là chạy độc lập bên ngoài Eclipse. Tuy nhiên, tôi vẫn chưa quản lý nó một mình. Bạn có thể đưa ra một thử để riêng API Bugzilla Java của tôi mà cố gắng để trang trải các nhu cầu cấp bách nhất: http://techblog.ralph-schuster.eu/b4j-bugzilla-for-java/

1

Mylyn có thể là một lựa chọn tốt cho bạn.

Nếu bạn cần thiết lập đơn giản hơn hoặc kiểm soát tốt hơn cách mọi thứ xảy ra, bạn có thể viết các cuộc gọi XML-RPC của riêng bạn tới giao diện web-dịch vụ Bugzilla. Tôi đã tóm tắt quy trình trên blog của mình: Chat to Bugzilla from Java using Apache XML-RPC.

Nói tóm lại:

  • được libs Apache XML-RPC
  • lấy Client Apache HTTP từ commons (phiên bản cũ)

Sau đó, sử dụng lớp sau như một lớp cơ sở (nó xử lý cookie vv) và ghi đè lên:

/** 
* @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()); 
    } 
} 

Ghi đè lớp học bằng cách cung cấp cus tom constructor và bằng các phương pháp bổ sung:

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()); 
    } 

}