View Javadoc

1   package org.apache.maven.archetype.source;
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.archetype.catalog.Archetype;
23  import org.apache.maven.archetype.catalog.ArchetypeCatalog;
24  import org.apache.maven.artifact.manager.WagonManager;
25  import org.apache.maven.wagon.Wagon;
26  import org.apache.maven.wagon.WagonException;
27  import org.apache.maven.wagon.authentication.AuthenticationInfo;
28  import org.apache.maven.wagon.proxy.ProxyInfo;
29  import org.apache.maven.wagon.repository.Repository;
30  import org.codehaus.plexus.util.ReaderFactory;
31  
32  import java.io.File;
33  import java.io.IOException;
34  import java.util.Properties;
35  
36  /**
37   * @plexus.component role-hint="remote-catalog"
38   * @author Jason van Zyl
39   */
40  public class RemoteCatalogArchetypeDataSource
41      extends CatalogArchetypeDataSource
42  {
43      /** @plexus.requirement */
44      private WagonManager wagonManager;
45  
46      public static final String REPOSITORY_PROPERTY = "repository";
47  
48      /**
49       * Id of the repository used to download catalog file. Proxy or authentication info can
50       * be setup in settings.xml.
51       */
52      public static final String REPOSITORY_ID = "archetype";
53  
54      public ArchetypeCatalog getArchetypeCatalog( Properties properties )
55          throws ArchetypeDataSourceException
56      {
57          String repository = properties.getProperty( REPOSITORY_PROPERTY );
58  
59          if ( repository == null )
60          {
61              throw new ArchetypeDataSourceException( "To use the remote catalog you must specify the 'repository'"
62                  + " property with an URL." );
63          }
64  
65          if ( repository.endsWith( "/" ) )
66          {
67              repository = repository.substring( 0, repository.length() - 1 );
68          }
69  
70          try
71          {
72              return downloadCatalog( repository, ARCHETYPE_CATALOG_FILENAME );
73          }
74          catch ( ArchetypeDataSourceException e )
75          {
76              throw e;
77          }
78          catch ( Exception e )
79          { // When the default archetype catalog name doesn't work, we assume the repository is the URL to a file
80              String repositoryPath = repository.substring( 0, repository.lastIndexOf( "/" ) );
81              String filename = repository.substring( repository.lastIndexOf( "/" ) + 1 );
82  
83              try
84              {
85                  return downloadCatalog( repositoryPath, filename );
86              }
87              catch ( Exception ex )
88              {
89                  getLogger().warn( "Error reading archetype catalog " + repository, ex );
90                  return new ArchetypeCatalog();
91              }
92          }
93      }
94  
95      public void updateCatalog( Properties properties, Archetype archetype )
96          throws ArchetypeDataSourceException
97      {
98          throw new ArchetypeDataSourceException( "Not supported yet." );
99      }
100 
101     private ArchetypeCatalog downloadCatalog( String repositoryPath, String filename )
102         throws WagonException, IOException, ArchetypeDataSourceException
103     {
104         getLogger().debug( "Searching for remote catalog: " + repositoryPath + "/" + filename );
105 
106         // We use wagon to take advantage of a Proxy that has already been setup in a Maven environment.
107         Repository wagonRepository = new Repository( REPOSITORY_ID, repositoryPath );
108         AuthenticationInfo authInfo = wagonManager.getAuthenticationInfo( wagonRepository.getId() );
109         ProxyInfo proxyInfo = wagonManager.getProxy( wagonRepository.getProtocol() );
110 
111         Wagon wagon = wagonManager.getWagon( wagonRepository );
112 
113         File catalog = File.createTempFile( "archetype-catalog", ".xml" );
114         try
115         {
116             wagon.connect( wagonRepository, authInfo, proxyInfo );
117             wagon.get( filename, catalog );
118 
119             return readCatalog( ReaderFactory.newXmlReader( catalog ) );
120         }
121         finally
122         {
123             disconnectWagon( wagon );
124             catalog.delete();
125         }
126     }
127 
128     private void disconnectWagon( Wagon wagon )
129     {
130         try
131         {
132             wagon.disconnect();
133         }
134         catch ( Exception e )
135         {
136             getLogger().warn( "Problem disconnecting from wagon - ignoring: " + e.getMessage() );
137         }
138     }
139 
140 }