/* * JBoss, Home of Professional Open Source * * Distributable under LGPL license. * See terms of license at gnu.org. */ package org.jboss.seam.wiki.connectors.jira; import org.apache.xmlrpc.XmlRpcException; import org.apache.xmlrpc.client.XmlRpcClient; import org.apache.xmlrpc.client.XmlRpcClientConfigImpl; import org.jboss.seam.ScopeType; import org.jboss.seam.annotations.*; import org.jboss.seam.log.Log; import java.net.MalformedURLException; import java.net.URL; import java.util.ArrayList; import java.util.Collections; import java.util.List; import java.util.Map; /** * Single-threaded component used for accessing a remote JIRA webservice. * <p> * Do NOT access this component without synchronizing multi-thread access! * </p> * http://confluence.atlassian.com/pages/viewpage.action?pageId=1035 * http://docs.atlassian.com/software/jira/docs/api/rpc-jira-plugin/latest/com/atlassian/jira/rpc/xmlrpc/XmlRpcService.html * http://ws.apache.org/xmlrpc/apidocs/index.html?index-all.html * * @author Christian Bauer */ @Name("jiraConnector") @Roles( @Role(name = "jiraIssueListConnector") ) @Scope(ScopeType.APPLICATION) @AutoCreate public class JiraConnector implements JiraIssueListConnector { private static final String RPC_PATH = "/rpc/xmlrpc"; @Logger Log log; @In("#{preferences.get('JiraConnector')}") JiraConnectorPreferences prefs; XmlRpcClient client = new XmlRpcClient(); private String connectAndLogin(String url, String username, String password) { if (url.endsWith("/")) url = url.substring(0, url.length()-1); try { XmlRpcClientConfigImpl config = new XmlRpcClientConfigImpl(); config.setServerURL(new URL(url + RPC_PATH)); config.setConnectionTimeout(prefs.getConnectionTimeoutSeconds().intValue()); config.setReplyTimeout(prefs.getReplyTimeoutSeconds().intValue()); client = new XmlRpcClient(); client.setConfig(config); List loginParams = new ArrayList(2); loginParams.add(username); loginParams.add(password); return (String) client.execute("jira1.login", loginParams); } catch (MalformedURLException urlEx) { log.warn("URL is not valid: " + url); return null; } catch (Exception ex) { log.warn("couldn't connect to remote JIRA webservice: " + url + RPC_PATH + ", " + ex.getMessage()); return null; } } private boolean disconnectAndLogout(String loginToken) { try { return (Boolean) client.execute("jira1.logout", wrapLoginToken(loginToken)); } catch (XmlRpcException rpcEx) { log.warn("couldn't disconnect from remote JIRA webservice, " + rpcEx.getMessage()); } return false; } private List wrapLoginToken(String loginToken) { List loginTokenParam = new ArrayList(1); loginTokenParam.add(loginToken); return loginTokenParam; } public List<JiraIssue> getIssues(String url, String username, String password, String filterId) { try { log.debug("getting issue list from remote JIRA webservice: " + url + " using filter: " + filterId); String loginToken = connectAndLogin(url, username, password); if (loginToken != null) { log.debug("remote login successful, retrieving list"); List<String> params = new ArrayList<String>(2); params.add(loginToken); params.add(filterId); Object[] result = (Object[]) client.execute("jira1.getIssuesFromFilter", params); List<JiraIssue> issues = new ArrayList<JiraIssue>(); for (Object r : result) { JiraIssue issue = JiraIssue.fromMap((Map)r); log.trace("retrieved remote object: " + issue); issues.add(issue); } disconnectAndLogout(loginToken); return issues; } } catch (Exception ex) { log.warn("exception while executing remote JIRA webservice operation", ex); return Collections.emptyList(); } return Collections.EMPTY_LIST; } }