Есть ли java API для доступа к bugzilla?

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

Обновление:

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


person Mauli    schedule 10.03.2009    source источник


Ответы (7)


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

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

С уважением, Нандана.

person Nandana    schedule 03.10.2012
comment
это отличный обзор, жаль только, что большинство библиотек неполные. - person Mauli; 04.10.2012

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

person Esko    schedule 10.03.2009

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

person Vladimir Dyuzhev    schedule 10.03.2009

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

person nabeel    schedule 03.09.2010


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

person Ralph    schedule 21.04.2010

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

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

Подвести итог:

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

Затем используйте следующий класс в качестве базового класса (он обрабатывает файлы 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());
    }
}

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

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

}
person joshis    schedule 07.03.2011