View Javadoc

1   package org.apache.maven.plugin.trac;
2   
3   /*
4    * Licensed to the Apache Software Foundation (ASF) under one
5    * or more contributor license agreements.  See the NOTICE file
6    * distributed with this work for additional information
7    * regarding copyright ownership.  The ASF licenses this file
8    * to you under the Apache License, Version 2.0 (the
9    * "License"); you may not use this file except in compliance
10   * with the License.  You may obtain a copy of the License at
11   *
12   *   http://www.apache.org/licenses/LICENSE-2.0
13   *
14   * Unless required by applicable law or agreed to in writing,
15   * software distributed under the License is distributed on an
16   * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
17   * KIND, either express or implied.  See the License for the
18   * specific language governing permissions and limitations
19   * under the License.
20   */
21  
22  import org.apache.maven.plugin.issues.Issue;
23  import org.apache.maven.project.MavenProject;
24  import org.apache.xmlrpc.XmlRpcException;
25  import org.apache.xmlrpc.client.XmlRpcClient;
26  import org.apache.xmlrpc.client.XmlRpcClientConfigImpl;
27  import org.codehaus.plexus.util.StringUtils;
28  
29  import java.net.MalformedURLException;
30  import java.net.URL;
31  import java.text.ParseException;
32  import java.text.SimpleDateFormat;
33  import java.util.ArrayList;
34  import java.util.Calendar;
35  import java.util.Date;
36  import java.util.List;
37  import java.util.Locale;
38  import java.util.Map;
39  
40  /**
41   * Get issues from a Trac installation.
42   *
43   * @author Dennis Lundberg
44   * @version $Id: TracDownloader.java 1098320 2011-05-01 14:28:01Z dennisl $
45   * @since 2.4
46   */
47  public class TracDownloader
48  {
49      /** The Maven project. */
50      private MavenProject project;
51      /** The Trac query for searching for tickets. */
52      private String query;
53      /** The password for authentication into a private Trac installation. */
54      private String tracPassword;
55      /** The username for authentication into a private Trac installation. */
56      private String tracUser;
57  
58      private Issue createIssue( Object[] ticketObj )
59      {
60          Issue issue = new Issue();
61  
62          issue.setId( String.valueOf( ticketObj[0] ) );
63  
64          issue.setLink( getUrl() + "/ticket/" + String.valueOf( ticketObj[0] ) );
65  
66          issue.setCreated( parseDate( String.valueOf( ticketObj[1] ) ) );
67  
68          issue.setUpdated( parseDate( String.valueOf( ticketObj[2] ) ) );
69  
70          Map attributes = (Map) ticketObj[3];
71  
72          issue.setType( (String) attributes.get( "type" ) );
73  
74          issue.setSummary( (String) attributes.get( "summary" ) );
75  
76          issue.setStatus( (String) attributes.get( "status" ) );
77  
78          issue.setResolution( (String) attributes.get( "resolution" ) );
79  
80          issue.setAssignee( (String) attributes.get( "owner" ) );
81  
82          issue.addFixVersion( (String) attributes.get( "milestone" ) );
83  
84          issue.setPriority( (String) attributes.get( "priority" ) );
85  
86          issue.setReporter( (String) attributes.get( "reporter" ) );
87  
88          issue.addComponent( (String) attributes.get( "component" ) );
89  
90          return issue;
91      }
92  
93      public List<Issue> getIssueList() throws MalformedURLException, XmlRpcException
94      {
95          // Create and configure an XML-RPC client
96          XmlRpcClientConfigImpl config = new XmlRpcClientConfigImpl();
97  
98          try
99          {
100             config.setServerURL( new URL( getUrl() + "/login/xmlrpc" ) );
101         }
102         catch ( MalformedURLException e )
103         {
104             throw new MalformedURLException( "The Trac URL is incorrect." );
105         }
106         config.setBasicUserName( tracUser );
107         config.setBasicPassword( tracPassword );
108 
109         XmlRpcClient client = new XmlRpcClient();
110 
111         client.setConfig( config );
112 
113         // Fetch issues
114         String qstr = "";
115 
116         if ( !StringUtils.isEmpty( query ) )
117         {
118             qstr = query;
119         }
120 
121         Object[] params = new Object[] { new String( qstr ) };
122         Object[] queryResult = null;
123         ArrayList<Issue> issueList = new ArrayList<Issue>();
124         try
125         {
126             queryResult = (Object[]) client.execute( "ticket.query", params );
127 
128             for ( int i = 0; i < queryResult.length; i++ )
129             {
130                 params = new Object[] { queryResult[i] };
131                 Object[] ticketGetResult = null;
132                 ticketGetResult = (Object[]) client.execute( "ticket.get", params );
133                 issueList.add( createIssue( ticketGetResult ) );
134             }
135         }
136         catch ( XmlRpcException e )
137         {
138             throw new XmlRpcException( "XmlRpc Error.", e );
139         }
140         return issueList;
141     }
142 
143     private String getUrl()
144     {
145 
146         String url = project.getIssueManagement().getUrl();
147 
148         if ( url.endsWith( "/" ) )
149         {
150             url = url.substring( 0, url.length() - 1 );
151         }
152 
153         return url;
154     }
155 
156     public void setProject( MavenProject project )
157     {
158         this.project = project;
159     }
160 
161     public void setQuery( String query )
162     {
163         this.query = query;
164     }
165 
166     public void setTracPassword( String tracPassword )
167     {
168         this.tracPassword = tracPassword;
169     }
170 
171     public void setTracUser( String tracUser )
172     {
173         this.tracUser = tracUser;
174     }
175 
176     private Date parseDate( String timeCreated )
177         throws RuntimeException
178     {
179         try
180         {
181             long millis = Long.parseLong( timeCreated );
182             Calendar cld = Calendar.getInstance();
183             cld.setTimeInMillis( millis * 1000L );
184             return cld.getTime();
185         }
186         catch ( NumberFormatException e )
187         {
188             SimpleDateFormat format = new SimpleDateFormat( "EEE MMM dd HH:mm:ss z yyyy", Locale.ENGLISH );
189             try
190             {
191                 return format.parse( timeCreated );
192             }
193             catch ( ParseException e1 )
194             {
195                 throw new RuntimeException( "Failed to parse date '" + timeCreated + "' as a date.", e1 );
196             }
197         }
198     }
199 }