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