]> source.dussan.org Git - archiva.git/blob
ae4e878269cb86af570bdaa5d00a464fd680002f
[archiva.git] /
1 package org.apache.maven.archiva.cli;
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.commons.cli.CommandLine;
23 import org.apache.commons.cli.Option;
24 import org.apache.commons.cli.Options;
25 import org.apache.commons.lang.StringUtils;
26 import org.apache.maven.archiva.common.utils.DateUtil;
27 import org.apache.maven.archiva.configuration.ArchivaConfiguration;
28 import org.apache.maven.archiva.consumers.ConsumerException;
29 import org.apache.maven.archiva.consumers.RepositoryContentConsumer;
30 import org.apache.maven.archiva.converter.RepositoryConversionException;
31 import org.apache.maven.archiva.converter.legacy.LegacyRepositoryConverter;
32 import org.apache.maven.archiva.model.ArchivaRepository;
33 import org.apache.maven.archiva.model.RepositoryContentStatistics;
34 import org.apache.maven.archiva.repository.RepositoryException;
35 import org.apache.maven.archiva.repository.scanner.RepositoryScanner;
36 import org.codehaus.plexus.PlexusContainer;
37 import org.codehaus.plexus.component.repository.exception.ComponentLookupException;
38 import org.codehaus.plexus.tools.cli.AbstractCli;
39
40 import java.io.File;
41 import java.io.FileInputStream;
42 import java.io.IOException;
43 import java.text.SimpleDateFormat;
44 import java.util.ArrayList;
45 import java.util.Arrays;
46 import java.util.Collection;
47 import java.util.Iterator;
48 import java.util.List;
49 import java.util.Map;
50 import java.util.Properties;
51
52 /**
53  * ArchivaCli 
54  *
55  * @author Jason van Zyl
56  * @author <a href="mailto:joakim@erdfelt.com">Joakim Erdfelt</a>
57  * @version $Id$
58  */
59 public class ArchivaCli
60     extends AbstractCli
61 {
62     // ----------------------------------------------------------------------------
63     // Options
64     // ----------------------------------------------------------------------------
65
66     public static final char CONVERT = 'c';
67
68     public static final char SCAN = 's';
69
70     public static final char CONSUMERS = 'u';
71
72     public static final char LIST_CONSUMERS = 'l';
73     
74     public static final char DUMP_CONFIGURATION = 'd';
75
76     // ----------------------------------------------------------------------------
77     // Properties controlling Repository conversion
78     // ----------------------------------------------------------------------------
79
80     public static final String SOURCE_REPO_PATH = "sourceRepositoryPath";
81
82     public static final String TARGET_REPO_PATH = "targetRepositoryPath";
83
84     public static final String BLACKLISTED_PATTERNS = "blacklistPatterns";
85
86     /**
87      * Configuration store.
88      *
89      * @plexus.requirement
90      */
91     private ArchivaConfiguration archivaConfiguration;
92     
93     public static void main( String[] args )
94         throws Exception
95     {
96         new ArchivaCli().execute( args );
97     }
98
99     public String getPomPropertiesPath()
100     {
101         return "META-INF/maven/org.apache.maven.archiva/archiva-cli/pom.properties";
102     }
103
104     private Option createOption( char shortOpt, String longOpt, int argCount, String description )
105     {
106         boolean hasArg = ( argCount > 0 );
107         Option opt = new Option( String.valueOf( shortOpt ), hasArg, description );
108         opt.setLongOpt( longOpt );
109         if ( hasArg )
110         {
111             opt.setArgs( argCount );
112         }
113         return opt;
114     }
115
116     public Options buildCliOptions( Options options )
117     {
118         Option convertOption = createOption( CONVERT, "convert", 1, "Convert a legacy Maven 1.x repository to a "
119             + "Maven 2.x repository using a properties file to describe the conversion." );
120         convertOption.setArgName( "conversion.properties" );
121         options.addOption( convertOption );
122
123         Option scanOption = createOption( SCAN, "scan", 1, "Scan the specified repository." );
124         scanOption.setArgName( "repository directory" );
125         options.addOption( scanOption );
126
127         Option consumerOption = createOption( CONSUMERS, "consumers", 1, "The consumers to use. "
128             + "(comma delimited. default: 'count-artifacts')" );
129         consumerOption.setArgName( "consumer list" );
130         options.addOption( consumerOption );
131
132         Option listConsumersOption = createOption( LIST_CONSUMERS, "listconsumers", 0, "List available consumers." );
133         options.addOption( listConsumersOption );
134
135         Option dumpConfig = createOption( DUMP_CONFIGURATION, "dumpconfig", 0, "Dump Current Configuration." );
136         options.addOption( dumpConfig );
137         
138         return options;
139     }
140
141     public void invokePlexusComponent( CommandLine cli, PlexusContainer plexus )
142         throws Exception
143     {
144         if ( cli.hasOption( CONVERT ) )
145         {
146             doConversion( cli, plexus );
147         }
148         else if ( cli.hasOption( SCAN ) )
149         {
150             doScan( cli, plexus );
151         }
152         else if ( cli.hasOption( LIST_CONSUMERS ) )
153         {
154             dumpAvailableConsumers( plexus );
155         }
156         else if ( cli.hasOption( DUMP_CONFIGURATION ) )
157         {
158             dumpConfiguration( plexus );
159         }
160         else
161         {
162             displayHelp();
163         }
164     }
165
166     private void doScan( CommandLine cli, PlexusContainer plexus )
167         throws ConsumerException, ComponentLookupException
168     {
169         String path = cli.getOptionValue( SCAN );
170
171         ArchivaRepository repo = new ArchivaRepository( "cliRepo", "Archiva CLI Provided Repo", "file://" + path );
172
173         List consumerList = new ArrayList();
174
175         consumerList.addAll( getConsumerList( cli, plexus ) );
176
177         RepositoryScanner scanner = new RepositoryScanner();
178
179         try
180         {
181             RepositoryContentStatistics stats = scanner.scan( repo, consumerList, true );
182
183             SimpleDateFormat df = new SimpleDateFormat();
184             System.out.println( "" );
185             System.out.println( ".\\ Scan of " + repo.getId() + " \\.__________________________________________" );
186             System.out.println( "  Repository URL    : " + repo.getUrl() );
187             System.out.println( "  Repository Name   : " + repo.getModel().getName() );
188             System.out.println( "  Repository Layout : " + repo.getModel().getLayoutName() );
189             System.out.println( "  Consumers         : (" + consumerList.size() + " active)" );
190             for ( Iterator iter = consumerList.iterator(); iter.hasNext(); )
191             {
192                 RepositoryContentConsumer consumer = (RepositoryContentConsumer) iter.next();
193                 System.out.println( "                      " + consumer.getId() + " - " + consumer.getDescription() );
194             }
195             System.out.println( "  Duration          : " + DateUtil.getDuration( stats.getDuration() ) );
196             System.out.println( "  When Gathered     : " + df.format( stats.getWhenGathered() ) );
197             System.out.println( "  Total File Count  : " + stats.getTotalFileCount() );
198             long averageMsPerFile = ( stats.getDuration() / stats.getTotalFileCount() );
199             System.out.println( "  Avg Time Per File : " + DateUtil.getDuration( averageMsPerFile ) );
200             System.out.println( "______________________________________________________________" );
201         }
202         catch ( RepositoryException e )
203         {
204             e.printStackTrace( System.err );
205         }
206     }
207
208     private Collection getConsumerList( CommandLine cli, PlexusContainer plexus )
209         throws ComponentLookupException, ConsumerException
210     {
211         String specifiedConsumers = "count-artifacts";
212
213         if ( cli.hasOption( CONSUMERS ) )
214         {
215             specifiedConsumers = cli.getOptionValue( CONSUMERS );
216         }
217
218         List consumerList = new ArrayList();
219
220         Map availableConsumers = plexus.lookupMap( RepositoryContentConsumer.class );
221
222         String consumerArray[] = StringUtils.split( specifiedConsumers, ',' );
223
224         for ( int i = 0; i < consumerArray.length; i++ )
225         {
226             String specifiedConsumer = consumerArray[i];
227             if ( !availableConsumers.containsKey( specifiedConsumer ) )
228             {
229                 System.err.println( "Specified consumer [" + specifiedConsumer + "] not found." );
230                 dumpAvailableConsumers( plexus );
231                 System.exit( 1 );
232             }
233
234             consumerList.add( availableConsumers.get( specifiedConsumer ) );
235         }
236
237         return consumerList;
238     }
239
240     private void dumpAvailableConsumers( PlexusContainer plexus )
241         throws ComponentLookupException
242     {
243         Map availableConsumers = plexus.lookupMap( RepositoryContentConsumer.class );
244
245         System.out.println( ".\\ Available Consumer List \\.______________________________" );
246
247         for ( Iterator iter = availableConsumers.entrySet().iterator(); iter.hasNext(); )
248         {
249             Map.Entry entry = (Map.Entry) iter.next();
250             String consumerHint = (String) entry.getKey();
251             RepositoryContentConsumer consumer = (RepositoryContentConsumer) entry.getValue();
252             System.out.println( "  " + consumerHint + ": " + consumer.getDescription() + " ("
253                 + consumer.getClass().getName() + ")" );
254         }
255     }
256
257     private void doConversion( CommandLine cli, PlexusContainer plexus )
258         throws ComponentLookupException
259     {
260         LegacyRepositoryConverter legacyRepositoryConverter = (LegacyRepositoryConverter) plexus
261             .lookup( LegacyRepositoryConverter.ROLE );
262
263         Properties p = new Properties();
264
265         try
266         {
267             p.load( new FileInputStream( cli.getOptionValue( CONVERT ) ) );
268         }
269         catch ( IOException e )
270         {
271             showFatalError( "Cannot find properties file which describes the conversion.", e, true );
272         }
273
274         File oldRepositoryPath = new File( p.getProperty( SOURCE_REPO_PATH ) );
275
276         File newRepositoryPath = new File( p.getProperty( TARGET_REPO_PATH ) );
277
278         System.out.println( "Converting " + oldRepositoryPath + " to " + newRepositoryPath );
279
280         List fileExclusionPatterns = null;
281
282         String s = p.getProperty( BLACKLISTED_PATTERNS );
283
284         if ( s != null )
285         {
286             fileExclusionPatterns = Arrays.asList( StringUtils.split( s, "," ) );
287         }
288
289         try
290         {
291             legacyRepositoryConverter.convertLegacyRepository( oldRepositoryPath, newRepositoryPath,
292                                                                fileExclusionPatterns, true );
293         }
294         catch ( RepositoryConversionException e )
295         {
296             showFatalError( "Error converting repository.", e, true );
297         }
298     }
299     
300     private void dumpConfiguration( PlexusContainer plexus ) throws ComponentLookupException
301     {
302         archivaConfiguration = (ArchivaConfiguration) plexus.lookup( ArchivaConfiguration.ROLE );
303         
304         System.out.println( "File Type Count: " + archivaConfiguration.getConfiguration().getRepositoryScanning().getFileTypes().size() );
305     }
306 }