Есть ли Java api для доступа к bugzilla? [закрытый]

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

обновление:

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

7 ответов


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

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

С Наилучшими Пожеланиями, Нандана!--1-->


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


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


вот простой пример использования api bugzilla с Java.. http://codehelpline.blogspot.com/2010/08/how-to-access-bugzilla-webservice-api.html



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


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

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

в итоге:

  • получить Apache XML-RPC libs
  • получите HTTP-клиент Apache из commons (старше версия)

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

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

переопределите класс, предоставив пользовательский конструктор и добавив методы:

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

}