/* * RHQ Management Platform * Copyright (C) 2005-2008 Red Hat, Inc. * All rights reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation version 2 of the License. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ package org.rhq.plugins.jira; import org.rhq.plugins.jira.soapclient.jira.JiraSoapService; import org.rhq.plugins.jira.soapclient.jira.JiraSoapServiceServiceLocator; import org.rhq.plugins.jira.soapclient.jira.RemoteFilter; import org.rhq.plugins.jira.soapclient.jira.RemoteProject; import org.rhq.plugins.jira.soapclient.jira.RemoteServerInfo; import org.rhq.plugins.jira.soapclient.jira.RemoteIssue; import java.rmi.RemoteException; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; /** * Manages cached access to jira. Just some very basic stuff right now... Projects, filters and their counts. The * Jira remote api's are not terribly robust. * * @author Greg Hinkle */ public class JiraClient { public static final String WS_ENDPOINT = "/rpc/soap/jirasoapservice-v2"; private String user; private String password; private String url; private String token; private JiraSoapService jira; private Map<String, RemoteProject> projectMap = new HashMap<String, RemoteProject>(); private Map<String, List<RemoteFilter>> filters = new HashMap<String, List<RemoteFilter>>(); public JiraClient(org.rhq.core.domain.configuration.Configuration config) { user = config.getSimple("user").getStringValue(); password = config.getSimple("password").getStringValue(); url = config.getSimple("url").getStringValue(); } public JiraClient(String user, String password, String url) { this.user = user; this.password = password; this.url = url; } public RemoteServerInfo getServerInfo() { getToken(); try { return jira.getServerInfo(token); } catch (RemoteException e) { throw new RuntimeException("Couldn't connect to jira", e); } } public void refreshCaches() { long start = System.currentTimeMillis(); try { getToken(); RemoteProject[] projects = jira.getProjectsNoSchemes(token); for (RemoteProject project : projects) { projectMap.put(project.getKey(), project); //System.out.println("Project: " + project.getName() + ":" + project.getId() + " (" + project.getDescription() + ")"); RemoteIssue[] issues = jira.getIssuesFromTextSearch(token, "rhq"); // System.out.println("PROJECT: " + project.getName()); // System.out.println("\tLead: " + project.getLead()); // System.out.println("\tDescription: " + project.getDescription()); // System.out.println("\tId: " + project.getId()); // System.out.println("\tURL: " + project.getProjectUrl()); // System.out.println("\tIssues: " + issues.length); } // System.out.println("------------------------"); RemoteFilter[] filterArray = jira.getSavedFilters(token); for (RemoteFilter filter : filterArray) { String projectKey = null; for (RemoteProject p : projects) { if (filter.getProject() != null && filter.getProject().equals(p.getId())) { projectKey = p.getKey(); } } if (projectKey != null) { List<RemoteFilter> projectFilters = filters.get(projectKey); if (projectFilters == null) { projectFilters = new ArrayList<RemoteFilter>(); filters.put(projectKey,projectFilters); } projectFilters.add(filter); } //System.out.println("Filter: " + filter.getName() + " (" + filter.getProject() + ")"); } } catch (org.rhq.plugins.jira.soapclient.jira.RemotePermissionException e) { e.printStackTrace(); //To change body of catch statement use File | Settings | File Templates. } catch (org.rhq.plugins.jira.soapclient.jira.RemoteAuthenticationException e) { e.printStackTrace(); //To change body of catch statement use File | Settings | File Templates. } catch (org.rhq.plugins.jira.soapclient.jira.RemoteException e) { e.printStackTrace(); //To change body of catch statement use File | Settings | File Templates. } catch (java.rmi.RemoteException e) { e.printStackTrace(); //To change body of catch statement use File | Settings | File Templates. } // System.out.println("JiraClient cache load time: " + (System.currentTimeMillis() - start)); } public String getToken() { if (token == null) { try { JiraSoapServiceServiceLocator l = new JiraSoapServiceServiceLocator(); l.setJirasoapserviceV2EndpointAddress(url + WS_ENDPOINT); jira = l.getJirasoapserviceV2(); token = jira.login(user, password); } catch (org.rhq.plugins.jira.soapclient.jira.RemoteAuthenticationException e) { e.printStackTrace(); //To change body of catch statement use File | Settings | File Templates. } catch (org.rhq.plugins.jira.soapclient.jira.RemoteException e) { e.printStackTrace(); //To change body of catch statement use File | Settings | File Templates. } catch (java.rmi.RemoteException e) { e.printStackTrace(); //To change body of catch statement use File | Settings | File Templates. } catch (javax.xml.rpc.ServiceException e) { e.printStackTrace(); //To change body of catch statement use File | Settings | File Templates. } } return token; } public Map<String, RemoteProject> getProjectMap() { return projectMap; } public Map<String, List<RemoteFilter>> getFilters() { return filters; } public static void main(String[] args) throws Exception { JiraClient jc = new JiraClient("user", "pass", "http://jira.rhq-project.org"); jc.refreshCaches(); /* URL service = new URL("http://jira.jboss.com/jira/rpc/soap/jirasoapservice-v2"); JiraSoapServiceServiceLocator l = new JiraSoapServiceServiceLocator(); l.setJirasoapserviceV2EndpointAddress("http://jira.jboss.com/jira/rpc/soap/jirasoapservice-v2"); JiraSoapService jira = l.getJirasoapserviceV2(); String token = jira.login("usre", "pass"); RemoteProject[] projects = jira.getProjectsNoSchemes(token); Map<String, RemoteProject> projectMap = new HashMap<String, RemoteProject>(); for (RemoteProject project : projects) { projectMap.put(project.getKey(), project); System.out.println("Project: " + project.getName() + ":" + project.getId() + " (" + project.getDescription() + ")"); } //RemoteProject proj = jira.getProjectByKey(token, "JBNADM"); System.out.println("------------------------"); RemoteFilter[] filters = jira.getSavedFilters(token); for (RemoteFilter filter : filters) { System.out.println("Filter: " + filter.getName() + " (" + filter.getProject() + ")"); } RemoteServerInfo serverInfo = jira.getServerInfo(token); System.out.println("Server Version: " + serverInfo.getVersion()); System.out.println("---------------------------------------------"); RemoteProject jbnadm = projectMap.get("JBNADM"); System.out.println("PROJECT: " + jbnadm.getName()); System.out.println("\tLead: " + jbnadm.getLead()); System.out.println("\tDescription: " + jbnadm.getDescription()); System.out.println("\tId: " + jbnadm.getId()); System.out.println("\tURL: " + jbnadm.getProjectUrl()); for (RemoteFilter filter : filters) { if (jbnadm.getId().equals(filter.getProject())) { long count = jira.getIssueCountForFilter(token, filter.getId()); System.out.println("Filter: " + filter.getName() + " Count: " + count); } } RemoteVersion[] versions = jira.getVersions(token, jbnadm.getKey()); for (RemoteVersion version : versions) { System.out.println("\tVersion: " + version.getName() + " (" + (version.getReleaseDate() != null ? version.getReleaseDate().getTime() : "") + ")"); }*/ /* Slow and uses way too much memory System.out.println("-----------------"); RemoteIssue[] issues = jira.getIssuesFromTextSearch(token,"jbnadm open ff:2.0.1"); System.out.println("Found: " + issues.length + " issues"); Map<String, Integer> priorityCounts = new HashMap<String, Integer>(); for (RemoteIssue issue :issues) { Integer c = priorityCounts.get(issue.getPriority()); if (c == null) { c = 0; } priorityCounts.put(issue.getPriority(), c + 1); } for (String priority : priorityCounts.keySet()) { System.out.println("\t" + priority + ": " + priorityCounts.get(priority)); }*/ } public long getIssueCount(String filterId) throws RemoteException { return jira.getIssueCountForFilter(token, filterId); } }