blob: 3588fef9ac272a1aa10f328b926e038742a34dfb [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
package org.apache.maven.plugins.trac;
import java.net.MalformedURLException;
import java.net.URL;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
import java.util.List;
import java.util.Locale;
import java.util.Map;
import org.apache.maven.plugins.issues.Issue;
import org.apache.maven.project.MavenProject;
import org.apache.xmlrpc.XmlRpcException;
import org.apache.xmlrpc.client.XmlRpcClient;
import org.apache.xmlrpc.client.XmlRpcClientConfigImpl;
import org.apache.xmlrpc.client.XmlRpcCommonsTransportFactory;
/**
* Get issues from a Trac installation.
*
* @author Dennis Lundberg
* @version $Id$
* @since 2.4
*/
public class TracDownloader {
/** The Maven project. */
private MavenProject project;
/** The Trac query for searching for tickets. */
private String query;
/** The password for authentication into a private Trac installation. */
private String tracPassword;
/** The username for authentication into a private Trac installation. */
private String tracUser;
private Issue createIssue(Object[] ticketObj) {
Issue issue = new Issue();
issue.setId(String.valueOf(ticketObj[0]));
issue.setKey(String.valueOf(ticketObj[0]));
issue.setLink(getUrl() + "/ticket/" + ticketObj[0]);
issue.setCreated(parseDate(String.valueOf(ticketObj[1])));
issue.setUpdated(parseDate(String.valueOf(ticketObj[2])));
@SuppressWarnings("unchecked")
Map<String, String> attributes = (Map<String, String>) ticketObj[3];
issue.setType(attributes.get("type"));
issue.setSummary(attributes.get("summary"));
issue.setStatus(attributes.get("status"));
issue.setResolution(attributes.get("resolution"));
issue.setAssignee(attributes.get("owner"));
issue.addFixVersion(attributes.get("milestone"));
issue.setPriority(attributes.get("priority"));
issue.setReporter(attributes.get("reporter"));
issue.addComponent(attributes.get("component"));
return issue;
}
public List<Issue> getIssueList() throws MalformedURLException, XmlRpcException {
// Create and configure an XML-RPC client
XmlRpcClientConfigImpl config = new XmlRpcClientConfigImpl();
try {
config.setServerURL(new URL(getUrl() + "/login/xmlrpc"));
} catch (MalformedURLException e) {
throw new MalformedURLException("The Trac URL is incorrect.");
}
config.setBasicUserName(tracUser);
config.setBasicPassword(tracPassword);
XmlRpcClient client = new XmlRpcClient();
client.setConfig(config);
client.setTransportFactory(new XmlRpcCommonsTransportFactory(client));
// Fetch issues
String qstr = "";
if (!(query == null || query.isEmpty())) {
qstr = query;
}
Object[] params = new Object[] {qstr};
Object[] queryResult;
ArrayList<Issue> issueList = new ArrayList<>();
try {
queryResult = (Object[]) client.execute("ticket.query", params);
for (Object aQueryResult : queryResult) {
params = new Object[] {aQueryResult};
Object[] ticketGetResult;
ticketGetResult = (Object[]) client.execute("ticket.get", params);
issueList.add(createIssue(ticketGetResult));
}
} catch (XmlRpcException e) {
throw new XmlRpcException("XmlRpc Error.", e);
}
return issueList;
}
private String getUrl() {
String url = project.getIssueManagement().getUrl();
if (url.endsWith("/")) {
url = url.substring(0, url.length() - 1);
}
return url;
}
public void setProject(MavenProject project) {
this.project = project;
}
public void setQuery(String query) {
this.query = query;
}
public void setTracPassword(String tracPassword) {
this.tracPassword = tracPassword;
}
public void setTracUser(String tracUser) {
this.tracUser = tracUser;
}
private Date parseDate(String timeCreated) throws RuntimeException {
try {
long millis = Long.parseLong(timeCreated);
Calendar cld = Calendar.getInstance();
cld.setTimeInMillis(millis * 1000L);
return cld.getTime();
} catch (NumberFormatException e) {
SimpleDateFormat format = new SimpleDateFormat("EEE MMM dd HH:mm:ss z yyyy", Locale.ENGLISH);
try {
return format.parse(timeCreated);
} catch (ParseException e1) {
throw new RuntimeException("Failed to parse date '" + timeCreated + "' as a date.", e1);
}
}
}
}