package org.apache.maven.plugins.trac; /* * 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. */ 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; import org.codehaus.plexus.util.StringUtils; 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; /** * 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/" + String.valueOf( 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 ( !StringUtils.isEmpty( query ) ) { qstr = query; } Object[] params = new Object[] { qstr }; Object[] queryResult; ArrayList<Issue> issueList = new ArrayList<Issue>(); 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 ); } } } }