2009-03-10 1 views
7

Есть ли (автономный!) Java api, который обертывает интерфейс XML-RPC в bugzilla? Я не хочу программировать свой собственный api для него, и я не могу найти библиотеку, которая делает это (и только это).Есть ли java api для доступа к bugzilla?

Update:

Я ищу что-то вроде этого http://oss.dbc.dk/bugzproxy/ только написанного на Java

ответ

9

Я знаю, что это немного старая нить, но как вполне возможно, что люди с таким же вопросом могли приземлиться здесь я думал делить пост в блоге я писал о четырех Java которые я нашел для доступа к Bugzilla: J2Bugzilla, B4J (Bugzilla для Java), Bugzilla Library, LightingBugAPI.

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

С наилучшими пожеланиями, Nandana

+0

это отличный обзор, только жаль, что большинство библиотек, которые неполно. – Mauli

2

Библиотеки/API называется JAX-WS (или JAXB), и позволяю вызывать WS из любой природы. Получите схему, сгенерируйте бобы и прокси, вызовите их.

5

Apache WS XML-RPC(теперь это глоток!), который представляет собой полную реализацию XML-RPC, которую вы могли бы использовать. Я не знаю BugZilla, но, полагая, что он поддерживает XML-RPC, не должно быть никаких проблем, используя чудовищный рот, который я только что связал.

1

Существует также Mylyn, который должен работать автономно вне Eclipse. Тем не менее, я еще не успел сделать это автономным. Вы можете дать попробовать на свой собственный Bugzilla Java API, который пытается охватить наиболее насущные потребности: http://techblog.ralph-schuster.eu/b4j-bugzilla-for-java/

1

Mylyn может быть хорошим выбором для вы.

Если вам нужна более простая настройка или лучший контроль над тем, как все происходит, вы можете написать свои собственные вызовы XML-RPC для интерфейса веб-сервиса Bugzilla. Я обобщил этот процесс в своем блоге: Chat to Bugzilla from Java using Apache XML-RPC.

Подводя итог:

  • получить Apache XML-RPC ЛИЭС
  • получить клиента Apache HTTP из достоянию (старая версия)

Затем использовать следующий класс в качестве базового класса (он обрабатывает файлы cookie и т. д.) и отменяет его:

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

Переопределить класс, предоставив cus Том конструктор и метода добавления:

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

}