View Javadoc
1   package org.apache.archiva.metadata.repository.storage.maven2;
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 junit.framework.TestCase;
23  import org.apache.archiva.common.utils.FileUtil;
24  import org.apache.archiva.configuration.ArchivaConfiguration;
25  import org.apache.archiva.configuration.Configuration;
26  import org.apache.archiva.configuration.ManagedRepositoryConfiguration;
27  import org.apache.archiva.configuration.ProxyConnectorConfiguration;
28  import org.apache.archiva.configuration.RemoteRepositoryConfiguration;
29  import org.apache.archiva.metadata.model.ArtifactMetadata;
30  import org.apache.archiva.metadata.model.Dependency;
31  import org.apache.archiva.metadata.model.License;
32  import org.apache.archiva.metadata.model.MailingList;
33  import org.apache.archiva.metadata.model.ProjectVersionMetadata;
34  import org.apache.archiva.metadata.model.maven2.MavenArtifactFacet;
35  import org.apache.archiva.metadata.repository.filter.AllFilter;
36  import org.apache.archiva.metadata.repository.filter.ExcludesFilter;
37  import org.apache.archiva.metadata.repository.filter.Filter;
38  import org.apache.archiva.metadata.repository.storage.ReadMetadataRequest;
39  import org.apache.archiva.metadata.repository.storage.RepositoryStorageMetadataInvalidException;
40  import org.apache.archiva.metadata.repository.storage.RepositoryStorageMetadataNotFoundException;
41  import org.apache.archiva.proxy.common.WagonFactory;
42  import org.apache.archiva.proxy.common.WagonFactoryRequest;
43  import org.apache.archiva.test.utils.ArchivaSpringJUnit4ClassRunner;
44  import org.apache.commons.io.FileUtils;
45  import org.apache.maven.wagon.Wagon;
46  import org.junit.Before;
47  import org.junit.Test;
48  import org.junit.runner.RunWith;
49  import org.springframework.test.context.ContextConfiguration;
50  
51  import javax.inject.Inject;
52  import javax.inject.Named;
53  import java.io.File;
54  import java.io.IOException;
55  import java.net.URL;
56  import java.nio.file.CopyOption;
57  import java.nio.file.Files;
58  import java.nio.file.Path;
59  import java.nio.file.Paths;
60  import java.nio.file.StandardCopyOption;
61  import java.util.ArrayList;
62  import java.util.Arrays;
63  import java.util.Collection;
64  import java.util.Collections;
65  import java.util.Comparator;
66  import java.util.List;
67  
68  import static org.mockito.Mockito.mock;
69  import static org.mockito.Mockito.when;
70  
71  @RunWith ( ArchivaSpringJUnit4ClassRunner.class )
72  @ContextConfiguration ( { "classpath*:/META-INF/spring-context.xml", "classpath:/spring-context.xml" } )
73  public class Maven2RepositoryMetadataResolverTest
74      extends TestCase
75  {
76      private static final Filter<String> ALL = new AllFilter<String>();
77  
78      @Inject
79      @Named ( "repositoryStorage#maven2" )
80      private Maven2RepositoryStorage storage;
81  
82      private static final String TEST_REPO_ID = "test";
83  
84      private static final String TEST_REMOTE_REPO_ID = "central";
85  
86      private static final String ASF_SCM_CONN_BASE = "scm:svn:http://svn.apache.org/repos/asf/";
87  
88      private static final String ASF_SCM_DEV_CONN_BASE = "scm:svn:https://svn.apache.org/repos/asf/";
89  
90      private static final String ASF_SCM_VIEWVC_BASE = "http://svn.apache.org/viewvc/";
91  
92      private static final String TEST_SCM_CONN_BASE = "scm:svn:http://svn.example.com/repos/";
93  
94      private static final String TEST_SCM_DEV_CONN_BASE = "scm:svn:https://svn.example.com/repos/";
95  
96      private static final String TEST_SCM_URL_BASE = "http://svn.example.com/repos/";
97  
98      private static final String EMPTY_MD5 = "d41d8cd98f00b204e9800998ecf8427e";
99  
100     private static final String EMPTY_SHA1 = "da39a3ee5e6b4b0d3255bfef95601890afd80709";
101 
102     @Inject
103     @Named ( "archivaConfiguration#default" )
104     protected ArchivaConfiguration configuration;
105 
106     private WagonFactory wagonFactory;
107 
108     ManagedRepositoryConfiguration testRepo;
109 
110     Configuration c;
111 
112     @Before
113     @Override
114     public void setUp()
115         throws Exception
116     {
117         super.setUp();
118 
119         c = new Configuration();
120         testRepo = new ManagedRepositoryConfiguration();
121         testRepo.setId( TEST_REPO_ID );
122         testRepo.setLocation( new File( "target/test-repository" ).getAbsolutePath() );
123         testRepo.setReleases( true );
124         testRepo.setSnapshots( true );
125         c.addManagedRepository( testRepo );
126 
127         RemoteRepositoryConfiguration testRemoteRepo = new RemoteRepositoryConfiguration();
128         testRemoteRepo.setId( TEST_REMOTE_REPO_ID );
129         testRemoteRepo.setLayout( "default" );
130         testRemoteRepo.setName( "Central Repository" );
131         testRemoteRepo.setUrl( "http://central.repo.com/maven2" );
132         testRemoteRepo.setTimeout( 10 );
133         c.addRemoteRepository( testRemoteRepo );
134 
135         ProxyConnectorConfiguration proxyConnector = new ProxyConnectorConfiguration();
136         proxyConnector.setSourceRepoId( TEST_REPO_ID );
137         proxyConnector.setTargetRepoId( TEST_REMOTE_REPO_ID );
138         proxyConnector.setDisabled( false );
139         c.addProxyConnector( proxyConnector );
140 
141         configuration.save( c );
142 
143         assertTrue( c.getManagedRepositories().get( 0 ).isSnapshots() );
144         assertTrue( c.getManagedRepositories().get( 0 ).isReleases() );
145 
146         wagonFactory = mock( WagonFactory.class );
147 
148         storage.setWagonFactory( wagonFactory );
149 
150         Wagon wagon = new MockWagon();
151         when( wagonFactory.getWagon( new WagonFactoryRequest().protocol( "wagon#http" ) ) ).thenReturn( wagon );
152     }
153 
154     @Test
155     public void testModelWithJdkProfileActivation()
156         throws Exception
157     {
158         ReadMetadataRequest readMetadataRequest =
159             new ReadMetadataRequest().repositoryId( TEST_REPO_ID ).namespace( "org.apache.maven" ).projectId(
160                 "maven-archiver" ).projectVersion( "2.4.1" );
161         ProjectVersionMetadata metadata = storage.readProjectVersionMetadata( readMetadataRequest );
162         MavenProjectFacet facet = (MavenProjectFacet) metadata.getFacet( MavenProjectFacet.FACET_ID );
163     }
164 
165     @Test
166     public void testGetProjectVersionMetadata()
167         throws Exception
168     {
169         ProjectVersionMetadata metadata = storage.readProjectVersionMetadata(
170             new ReadMetadataRequest( TEST_REPO_ID, "org.apache.archiva", "archiva-common", "1.2.1" ) );
171         MavenProjectFacet facet = (MavenProjectFacet) metadata.getFacet( MavenProjectFacet.FACET_ID );
172         assertEquals( "jar", facet.getPackaging() );
173         assertEquals( "http://archiva.apache.org/ref/1.2.1/archiva-base/archiva-common", metadata.getUrl() );
174         assertEquals( "org.apache.archiva", facet.getParent().getGroupId() );
175         assertEquals( "archiva-base", facet.getParent().getArtifactId() );
176         assertEquals( "1.2.1", facet.getParent().getVersion() );
177         assertEquals( "archiva-common", facet.getArtifactId() );
178         assertEquals( "org.apache.archiva", facet.getGroupId() );
179         assertEquals( "continuum", metadata.getCiManagement().getSystem() );
180         assertEquals( "http://vmbuild.apache.org/continuum", metadata.getCiManagement().getUrl() );
181         assertNotNull( metadata.getDescription() );
182         // TODO: this would be better
183 //        assertEquals(
184 //            "Archiva is an application for managing one or more remote repositories, including administration, artifact handling, browsing and searching.",
185 //            metadata.getDescription() );
186         assertEquals( "1.2.1", metadata.getId() );
187         assertEquals( "jira", metadata.getIssueManagement().getSystem() );
188         assertEquals( "http://jira.codehaus.org/browse/MRM", metadata.getIssueManagement().getUrl() );
189         checkApacheLicense( metadata );
190         assertEquals( "Archiva Base :: Common", metadata.getName() );
191         String path = "archiva/tags/archiva-1.2.1/archiva-modules/archiva-base/archiva-common";
192         assertEquals( ASF_SCM_CONN_BASE + path, metadata.getScm().getConnection() );
193         assertEquals( ASF_SCM_DEV_CONN_BASE + path, metadata.getScm().getDeveloperConnection() );
194         assertEquals( ASF_SCM_VIEWVC_BASE + path, metadata.getScm().getUrl() );
195         checkOrganizationApache( metadata );
196 
197         assertEquals( 4, metadata.getMailingLists().size() );
198         assertMailingList( "users", metadata.getMailingLists().get( 0 ), "Archiva User List", true,
199                            "http://www.nabble.com/archiva-users-f16426.html" );
200         assertMailingList( "dev", metadata.getMailingLists().get( 1 ), "Archiva Developer List", true,
201                            "http://www.nabble.com/archiva-dev-f16427.html" );
202         assertMailingList( "commits", metadata.getMailingLists().get( 2 ), "Archiva Commits List", false, null );
203         assertMailingList( "issues", metadata.getMailingLists().get( 3 ), "Archiva Issues List", false,
204                            "http://www.nabble.com/Archiva---Issues-f29617.html" );
205 
206         List<Dependency> dependencies = metadata.getDependencies();
207         assertEquals( 10, dependencies.size() );
208         assertDependency( dependencies.get( 0 ), "commons-lang", "commons-lang", "2.2" );
209         assertDependency( dependencies.get( 1 ), "commons-io", "commons-io", "1.4" );
210         assertDependency( dependencies.get( 2 ), "org.slf4j", "slf4j-api", "1.5.0" );
211         assertDependency( dependencies.get( 3 ), "org.codehaus.plexus", "plexus-component-api", "1.0-alpha-22" );
212         assertDependency( dependencies.get( 4 ), "org.codehaus.plexus", "plexus-spring", "1.2", "test" );
213         assertDependency( dependencies.get( 5 ), "xalan", "xalan", "2.7.0" );
214         assertDependency( dependencies.get( 6 ), "dom4j", "dom4j", "1.6.1", "test" );
215         assertDependency( dependencies.get( 7 ), "junit", "junit", "3.8.1", "test" );
216         assertDependency( dependencies.get( 8 ), "easymock", "easymock", "1.2_Java1.3", "test" );
217         assertDependency( dependencies.get( 9 ), "easymock", "easymockclassextension", "1.2", "test" );
218 
219         assertEquals( 8, metadata.getProperties().size() );
220         assertEquals( "http://www.apache.org/images/asf_logo_wide.gif", metadata.getProperties().get("organization.logo") );
221     }
222 
223     @Test
224     public void testGetArtifactMetadata()
225         throws Exception
226     {
227         Collection<ArtifactMetadata> springArtifacts = storage.readArtifactsMetadata(
228             new ReadMetadataRequest( TEST_REPO_ID, "org.codehaus.plexus", "plexus-spring", "1.2", ALL ) );
229         List<ArtifactMetadata> artifacts = new ArrayList<>( springArtifacts );
230         Collections.sort( artifacts, new Comparator<ArtifactMetadata>()
231         {
232             @Override
233             public int compare( ArtifactMetadata o1, ArtifactMetadata o2 )
234             {
235                 return o1.getId().compareTo( o2.getId() );
236             }
237         } );
238 
239         assertEquals( 3, artifacts.size() );
240 
241         ArtifactMetadata artifactMetadata = artifacts.get( 0 );
242         assertEquals( "plexus-spring-1.2-sources.jar", artifactMetadata.getId() );
243         MavenArtifactFacet facet = (MavenArtifactFacet) artifactMetadata.getFacet( MavenArtifactFacet.FACET_ID );
244         assertEquals( 0, facet.getBuildNumber() );
245         assertNull( facet.getTimestamp() );
246         assertEquals( "sources", facet.getClassifier() );
247         assertEquals( "java-source", facet.getType() );
248 
249         artifactMetadata = artifacts.get( 1 );
250         assertEquals( "plexus-spring-1.2.jar", artifactMetadata.getId() );
251         facet = (MavenArtifactFacet) artifactMetadata.getFacet( MavenArtifactFacet.FACET_ID );
252         assertEquals( 0, facet.getBuildNumber() );
253         assertNull( facet.getTimestamp() );
254         assertNull( facet.getClassifier() );
255         assertEquals( "jar", facet.getType() );
256 
257         artifactMetadata = artifacts.get( 2 );
258         assertEquals( "plexus-spring-1.2.pom", artifactMetadata.getId() );
259         facet = (MavenArtifactFacet) artifactMetadata.getFacet( MavenArtifactFacet.FACET_ID );
260         assertEquals( 0, facet.getBuildNumber() );
261         assertNull( facet.getTimestamp() );
262         assertNull( facet.getClassifier() );
263         assertEquals( "pom", facet.getType() );
264     }
265 
266     @Test
267     public void testGetArtifactMetadataSnapshots()
268         throws Exception
269     {
270         Collection<ArtifactMetadata> testArtifacts = storage.readArtifactsMetadata(
271             new ReadMetadataRequest( TEST_REPO_ID, "com.example.test", "test-artifact", "1.0-SNAPSHOT", ALL ) );
272         List<ArtifactMetadata> artifacts = new ArrayList<>( testArtifacts );
273         Collections.sort( artifacts, new Comparator<ArtifactMetadata>()
274         {
275             @Override
276             public int compare( ArtifactMetadata o1, ArtifactMetadata o2 )
277             {
278                 return o1.getId().compareTo( o2.getId() );
279             }
280         } );
281 
282         assertEquals( 6, artifacts.size() );
283 
284         ArtifactMetadata artifactMetadata = artifacts.get( 0 );
285         assertEquals( "test-artifact-1.0-20100308.230825-1.jar", artifactMetadata.getId() );
286         MavenArtifactFacet facet = (MavenArtifactFacet) artifactMetadata.getFacet( MavenArtifactFacet.FACET_ID );
287         assertEquals( 1, facet.getBuildNumber() );
288         assertEquals( "20100308.230825", facet.getTimestamp() );
289         assertNull( facet.getClassifier() );
290         assertEquals( "jar", facet.getType() );
291 
292         artifactMetadata = artifacts.get( 1 );
293         assertEquals( "test-artifact-1.0-20100308.230825-1.pom", artifactMetadata.getId() );
294         facet = (MavenArtifactFacet) artifactMetadata.getFacet( MavenArtifactFacet.FACET_ID );
295         assertEquals( 1, facet.getBuildNumber() );
296         assertEquals( "20100308.230825", facet.getTimestamp() );
297         assertNull( facet.getClassifier() );
298         assertEquals( "pom", facet.getType() );
299 
300         artifactMetadata = artifacts.get( 2 );
301         assertEquals( "test-artifact-1.0-20100310.014828-2-javadoc.jar", artifactMetadata.getId() );
302         facet = (MavenArtifactFacet) artifactMetadata.getFacet( MavenArtifactFacet.FACET_ID );
303         assertEquals( 2, facet.getBuildNumber() );
304         assertEquals( "20100310.014828", facet.getTimestamp() );
305         assertEquals( "javadoc", facet.getClassifier() );
306         assertEquals( "javadoc", facet.getType() );
307 
308         artifactMetadata = artifacts.get( 3 );
309         assertEquals( "test-artifact-1.0-20100310.014828-2-sources.jar", artifactMetadata.getId() );
310         facet = (MavenArtifactFacet) artifactMetadata.getFacet( MavenArtifactFacet.FACET_ID );
311         assertEquals( 2, facet.getBuildNumber() );
312         assertEquals( "20100310.014828", facet.getTimestamp() );
313         assertEquals( "sources", facet.getClassifier() );
314         assertEquals( "java-source", facet.getType() );
315 
316         artifactMetadata = artifacts.get( 4 );
317         assertEquals( "test-artifact-1.0-20100310.014828-2.jar", artifactMetadata.getId() );
318         facet = (MavenArtifactFacet) artifactMetadata.getFacet( MavenArtifactFacet.FACET_ID );
319         assertEquals( 2, facet.getBuildNumber() );
320         assertEquals( "20100310.014828", facet.getTimestamp() );
321         assertNull( facet.getClassifier() );
322         assertEquals( "jar", facet.getType() );
323 
324         artifactMetadata = artifacts.get( 5 );
325         assertEquals( "test-artifact-1.0-20100310.014828-2.pom", artifactMetadata.getId() );
326         facet = (MavenArtifactFacet) artifactMetadata.getFacet( MavenArtifactFacet.FACET_ID );
327         assertEquals( 2, facet.getBuildNumber() );
328         assertEquals( "20100310.014828", facet.getTimestamp() );
329         assertNull( facet.getClassifier() );
330         assertEquals( "pom", facet.getType() );
331     }
332 
333     @Test
334     public void testGetArtifactMetadataSnapshotsMRM1859()
335             throws Exception
336     {
337         Path repoDir = Paths.get("target/test-repository/com/example/test/test-artifact/1.0-SNAPSHOT");
338         URL url = Thread.currentThread().getContextClassLoader().getResource("resolver-status.properties");
339         Path resFile = Paths.get(url.toURI());
340         Path destFile = repoDir.resolve(resFile.getFileName());
341         Files.copy(resFile, destFile, StandardCopyOption.REPLACE_EXISTING);
342         URL url2 = Thread.currentThread().getContextClassLoader().getResource("test01.properties");
343         Path resFile2 = Paths.get(url2.toURI());
344         Path destFile2 = repoDir.resolve(resFile2.getFileName());
345         Files.copy(resFile2, destFile2, StandardCopyOption.REPLACE_EXISTING);
346 
347         try {
348 
349 
350             Collection<ArtifactMetadata> testArtifacts = storage.readArtifactsMetadata(
351                     new ReadMetadataRequest(TEST_REPO_ID, "com.example.test", "test-artifact", "1.0-SNAPSHOT", ALL));
352             List<ArtifactMetadata> artifacts = new ArrayList<>(testArtifacts);
353             Collections.sort(artifacts, new Comparator<ArtifactMetadata>() {
354                 @Override
355                 public int compare(ArtifactMetadata o1, ArtifactMetadata o2) {
356                     return o1.getId().compareTo(o2.getId());
357                 }
358             });
359 
360             assertEquals(6, artifacts.size());
361 
362             ArtifactMetadata artifactMetadata = artifacts.get(0);
363             assertEquals("test-artifact-1.0-20100308.230825-1.jar", artifactMetadata.getId());
364             MavenArtifactFacet facet = (MavenArtifactFacet) artifactMetadata.getFacet(MavenArtifactFacet.FACET_ID);
365             assertEquals(1, facet.getBuildNumber());
366             assertEquals("20100308.230825", facet.getTimestamp());
367             assertNull(facet.getClassifier());
368             assertEquals("jar", facet.getType());
369 
370             artifactMetadata = artifacts.get(1);
371             assertEquals("test-artifact-1.0-20100308.230825-1.pom", artifactMetadata.getId());
372             facet = (MavenArtifactFacet) artifactMetadata.getFacet(MavenArtifactFacet.FACET_ID);
373             assertEquals(1, facet.getBuildNumber());
374             assertEquals("20100308.230825", facet.getTimestamp());
375             assertNull(facet.getClassifier());
376             assertEquals("pom", facet.getType());
377 
378             artifactMetadata = artifacts.get(2);
379             assertEquals("test-artifact-1.0-20100310.014828-2-javadoc.jar", artifactMetadata.getId());
380             facet = (MavenArtifactFacet) artifactMetadata.getFacet(MavenArtifactFacet.FACET_ID);
381             assertEquals(2, facet.getBuildNumber());
382             assertEquals("20100310.014828", facet.getTimestamp());
383             assertEquals("javadoc", facet.getClassifier());
384             assertEquals("javadoc", facet.getType());
385 
386             artifactMetadata = artifacts.get(3);
387             assertEquals("test-artifact-1.0-20100310.014828-2-sources.jar", artifactMetadata.getId());
388             facet = (MavenArtifactFacet) artifactMetadata.getFacet(MavenArtifactFacet.FACET_ID);
389             assertEquals(2, facet.getBuildNumber());
390             assertEquals("20100310.014828", facet.getTimestamp());
391             assertEquals("sources", facet.getClassifier());
392             assertEquals("java-source", facet.getType());
393 
394             artifactMetadata = artifacts.get(4);
395             assertEquals("test-artifact-1.0-20100310.014828-2.jar", artifactMetadata.getId());
396             facet = (MavenArtifactFacet) artifactMetadata.getFacet(MavenArtifactFacet.FACET_ID);
397             assertEquals(2, facet.getBuildNumber());
398             assertEquals("20100310.014828", facet.getTimestamp());
399             assertNull(facet.getClassifier());
400             assertEquals("jar", facet.getType());
401 
402             artifactMetadata = artifacts.get(5);
403             assertEquals("test-artifact-1.0-20100310.014828-2.pom", artifactMetadata.getId());
404             facet = (MavenArtifactFacet) artifactMetadata.getFacet(MavenArtifactFacet.FACET_ID);
405             assertEquals(2, facet.getBuildNumber());
406             assertEquals("20100310.014828", facet.getTimestamp());
407             assertNull(facet.getClassifier());
408             assertEquals("pom", facet.getType());
409 
410         } finally {
411             Files.delete(destFile);
412             Files.delete(destFile2);
413         }
414 
415     }
416 
417     private void assertDependency( Dependency dependency, String groupId, String artifactId, String version )
418     {
419         assertDependency( dependency, groupId, artifactId, version, "compile" );
420     }
421 
422     private void assertDependency( Dependency dependency, String groupId, String artifactId, String version,
423                                    String scope )
424     {
425         assertEquals( artifactId, dependency.getArtifactId() );
426         assertEquals( "jar", dependency.getType() );
427         assertEquals( version, dependency.getVersion() );
428         assertEquals( groupId, dependency.getGroupId() );
429         assertEquals( scope, dependency.getScope() );
430         assertNull( dependency.getClassifier() );
431         assertNull( dependency.getSystemPath() );
432     }
433 
434     @Test
435     public void testGetProjectVersionMetadataForTimestampedSnapshot()
436         throws Exception
437     {
438         ProjectVersionMetadata metadata = storage.readProjectVersionMetadata(
439             new ReadMetadataRequest( TEST_REPO_ID, "org.apache", "apache", "5-SNAPSHOT" ) );
440         MavenProjectFacet facet = MavenProjectFacet.class.cast( metadata.getFacet( MavenProjectFacet.FACET_ID ) );
441         assertEquals( "pom", facet.getPackaging() );
442         assertEquals( "http://www.apache.org/", metadata.getUrl() );
443         assertNull( facet.getParent() );
444         assertEquals( "org.apache", facet.getGroupId() );
445         assertEquals( "apache", facet.getArtifactId() );
446         assertNull( metadata.getCiManagement() );
447         assertNotNull( metadata.getDescription() );
448         // TODO: this would be better
449 //        assertEquals(
450 //            "The Apache Software Foundation provides support for the Apache community of open-source software projects. " +
451 //                "The Apache projects are characterized by a collaborative, consensus based development process, an open " +
452 //                "and pragmatic software license, and a desire to create high quality software that leads the way in its " +
453 //                "field. We consider ourselves not simply a group of projects sharing a server, but rather a community of " +
454 //                "developers and users.", metadata.getDescription() );
455         assertEquals( "5-SNAPSHOT", metadata.getId() );
456         assertNull( metadata.getIssueManagement() );
457         checkApacheLicense( metadata );
458         assertEquals( "The Apache Software Foundation", metadata.getName() );
459         String path = "maven/pom/trunk/asf";
460         assertEquals( ASF_SCM_CONN_BASE + path, metadata.getScm().getConnection() );
461         assertEquals( ASF_SCM_DEV_CONN_BASE + path, metadata.getScm().getDeveloperConnection() );
462         assertEquals( ASF_SCM_VIEWVC_BASE + path, metadata.getScm().getUrl() );
463         checkOrganizationApache( metadata );
464         assertEquals( 1, metadata.getMailingLists().size() );
465         assertMailingList( metadata.getMailingLists().get( 0 ), "Apache Announce List",
466                            "http://mail-archives.apache.org/mod_mbox/www-announce/", "announce@apache.org",
467                            "announce-subscribe@apache.org", "announce-unsubscribe@apache.org",
468                            Collections.<String>emptyList(), true );
469         assertEquals( Collections.<Dependency>emptyList(), metadata.getDependencies() );
470     }
471 
472     @Test
473     public void testGetProjectVersionMetadataForTimestampedSnapshotMissingMetadata()
474         throws Exception
475     {
476         try
477         {
478             storage.readProjectVersionMetadata(
479                 new ReadMetadataRequest( TEST_REPO_ID, "com.example.test", "missing-metadata", "1.0-SNAPSHOT" ) );
480             fail( "Should not be found" );
481         }
482         catch ( RepositoryStorageMetadataNotFoundException e )
483         {
484             assertEquals( "missing-pom", e.getId() );
485         }
486     }
487 
488     @Test
489     public void testGetProjectVersionMetadataForTimestampedSnapshotMalformedMetadata()
490         throws Exception
491     {
492         try
493         {
494             storage.readProjectVersionMetadata(
495                 new ReadMetadataRequest( TEST_REPO_ID, "com.example.test", "malformed-metadata", "1.0-SNAPSHOT" ) );
496             fail( "Should not be found" );
497         }
498         catch ( RepositoryStorageMetadataNotFoundException e )
499         {
500             assertEquals( "missing-pom", e.getId() );
501         }
502     }
503 
504     @Test
505     public void testGetProjectVersionMetadataForTimestampedSnapshotIncompleteMetadata()
506         throws Exception
507     {
508         try
509         {
510             storage.readProjectVersionMetadata(
511                 new ReadMetadataRequest( TEST_REPO_ID, "com.example.test", "incomplete-metadata", "1.0-SNAPSHOT" ) );
512             fail( "Should not be found" );
513         }
514         catch ( RepositoryStorageMetadataNotFoundException e )
515         {
516             assertEquals( "missing-pom", e.getId() );
517         }
518     }
519 
520     @Test
521     public void testGetProjectVersionMetadataForInvalidPom()
522         throws Exception
523     {
524         try
525         {
526             storage.readProjectVersionMetadata(
527                 new ReadMetadataRequest( TEST_REPO_ID, "com.example.test", "invalid-pom", "1.0" ) );
528             fail( "Should have received an exception due to invalid POM" );
529         }
530         catch ( RepositoryStorageMetadataInvalidException e )
531         {
532             assertEquals( "invalid-pom", e.getId() );
533         }
534     }
535 
536     @Test
537     public void testGetProjectVersionMetadataForMislocatedPom()
538         throws Exception
539     {
540         try
541         {
542             storage.readProjectVersionMetadata(
543                 new ReadMetadataRequest( TEST_REPO_ID, "com.example.test", "mislocated-pom", "1.0" ) );
544             fail( "Should have received an exception due to mislocated POM" );
545         }
546         catch ( RepositoryStorageMetadataInvalidException e )
547         {
548             assertEquals( "mislocated-pom", e.getId() );
549         }
550     }
551 
552     @Test
553     public void testGetProjectVersionMetadataForMissingPom()
554         throws Exception
555     {
556         try
557         {
558             storage.readProjectVersionMetadata(
559                 new ReadMetadataRequest( TEST_REPO_ID, "com.example.test", "missing-pom", "1.0" ) );
560             fail( "Should not be found" );
561         }
562         catch ( RepositoryStorageMetadataNotFoundException e )
563         {
564             assertEquals( "missing-pom", e.getId() );
565         }
566     }
567 
568     @Test
569     public void testGetRootNamespaces()
570         throws Exception
571     {
572         assertEquals( Arrays.asList( "com", "org" ), storage.listRootNamespaces( TEST_REPO_ID, ALL ) );
573     }
574 
575     @Test
576     public void testGetNamespaces()
577         throws Exception
578     {
579         assertEquals( Arrays.asList( "example" ), storage.listNamespaces( TEST_REPO_ID, "com", ALL ) );
580         assertEquals( Arrays.asList( "test" ), storage.listNamespaces( TEST_REPO_ID, "com.example", ALL ) );
581         assertEquals( Collections.<String>emptyList(),
582                       storage.listNamespaces( TEST_REPO_ID, "com.example.test", ALL ) );
583 
584         assertEquals( Arrays.asList( "apache", "codehaus" ), storage.listNamespaces( TEST_REPO_ID, "org", ALL ) );
585         assertEquals( Arrays.asList( "archiva", "maven" ), storage.listNamespaces( TEST_REPO_ID, "org.apache", ALL ) );
586         assertEquals( Collections.<String>emptyList(),
587                       storage.listNamespaces( TEST_REPO_ID, "org.apache.archiva", ALL ) );
588         assertEquals( Arrays.asList( "plugins", "shared" ),
589                       storage.listNamespaces( TEST_REPO_ID, "org.apache.maven", ALL ) );
590         assertEquals( Collections.<String>emptyList(),
591                       storage.listNamespaces( TEST_REPO_ID, "org.apache.maven.plugins", ALL ) );
592         assertEquals( Collections.<String>emptyList(),
593                       storage.listNamespaces( TEST_REPO_ID, "org.apache.maven.shared", ALL ) );
594 
595         assertEquals( Arrays.asList( "plexus" ), storage.listNamespaces( TEST_REPO_ID, "org.codehaus", ALL ) );
596         assertEquals( Collections.<String>emptyList(),
597                       storage.listNamespaces( TEST_REPO_ID, "org.codehaus.plexus", ALL ) );
598     }
599 
600     @Test
601     public void testGetProjects()
602         throws Exception
603     {
604         assertEquals( Collections.<String>emptyList(), storage.listProjects( TEST_REPO_ID, "com", ALL ) );
605         assertEquals( Collections.<String>emptyList(), storage.listProjects( TEST_REPO_ID, "com.example", ALL ) );
606         assertEquals( Arrays.asList( "incomplete-metadata", "invalid-pom", "malformed-metadata", "mislocated-pom",
607                                      "missing-metadata", "missing-parent", "test-artifact" ),
608                       storage.listProjects( TEST_REPO_ID, "com.example.test", ALL ) );
609 
610         assertEquals( Collections.<String>emptyList(), storage.listProjects( TEST_REPO_ID, "org", ALL ) );
611         assertEquals( Arrays.asList( "apache" ), storage.listProjects( TEST_REPO_ID, "org.apache", ALL ) );
612         assertEquals( Arrays.asList( "archiva", "archiva-base", "archiva-common", "archiva-modules", "archiva-parent" ),
613                       storage.listProjects( TEST_REPO_ID, "org.apache.archiva", ALL ) );
614         assertEquals( Arrays.asList( "maven-archiver", "maven-parent" ),
615                       storage.listProjects( TEST_REPO_ID, "org.apache.maven", ALL ) );
616         assertEquals( Collections.<String>emptyList(),
617                       storage.listProjects( TEST_REPO_ID, "org.apache.maven.plugins", ALL ) );
618         assertEquals( Arrays.asList( "maven-downloader", "maven-shared-components" ),
619                       storage.listProjects( TEST_REPO_ID, "org.apache.maven.shared", ALL ) );
620     }
621 
622     @Test
623     public void testGetProjectVersions()
624         throws Exception
625     {
626         assertEquals( Arrays.asList( "1.0-SNAPSHOT" ),
627                       storage.listProjectVersions( TEST_REPO_ID, "com.example.test", "incomplete-metadata", ALL ) );
628         assertEquals( Arrays.asList( "1.0-SNAPSHOT" ),
629                       storage.listProjectVersions( TEST_REPO_ID, "com.example.test", "malformed-metadata", ALL ) );
630         assertEquals( Arrays.asList( "1.0-SNAPSHOT" ),
631                       storage.listProjectVersions( TEST_REPO_ID, "com.example.test", "missing-metadata", ALL ) );
632         assertEquals( Arrays.asList( "1.0" ),
633                       storage.listProjectVersions( TEST_REPO_ID, "com.example.test", "invalid-pom", ALL ) );
634 
635         assertEquals( Arrays.asList( "4", "5-SNAPSHOT", "7" ),
636                       storage.listProjectVersions( TEST_REPO_ID, "org.apache", "apache", ALL ) );
637 
638         assertEquals( Arrays.asList( "1.2.1", "1.2.2" ),
639                       storage.listProjectVersions( TEST_REPO_ID, "org.apache.archiva", "archiva", ALL ) );
640         assertEquals( Arrays.asList( "1.2.1" ),
641                       storage.listProjectVersions( TEST_REPO_ID, "org.apache.archiva", "archiva-base", ALL ) );
642         assertEquals( Arrays.asList( "1.2.1" ),
643                       storage.listProjectVersions( TEST_REPO_ID, "org.apache.archiva", "archiva-common", ALL ) );
644         assertEquals( Arrays.asList( "1.2.1" ),
645                       storage.listProjectVersions( TEST_REPO_ID, "org.apache.archiva", "archiva-modules", ALL ) );
646         assertEquals( Arrays.asList( "3" ),
647                       storage.listProjectVersions( TEST_REPO_ID, "org.apache.archiva", "archiva-parent", ALL ) );
648 
649         assertEquals( Collections.<String>emptyList(),
650                       storage.listProjectVersions( TEST_REPO_ID, "org.apache.maven.shared", "maven-downloader", ALL ) );
651     }
652 
653     @Test
654     public void testGetArtifacts()
655         throws Exception
656     {
657         List<ArtifactMetadata> artifacts = new ArrayList<>( storage.readArtifactsMetadata(
658             new ReadMetadataRequest( TEST_REPO_ID, "org.codehaus.plexus", "plexus-spring", "1.2", ALL ) ) );
659         assertEquals( 3, artifacts.size() );
660         Collections.sort( artifacts, new Comparator<ArtifactMetadata>()
661         {
662             @Override
663             public int compare( ArtifactMetadata o1, ArtifactMetadata o2 )
664             {
665                 return o1.getId().compareTo( o2.getId() );
666             }
667         } );
668 
669         assertArtifact( artifacts.get( 0 ), "plexus-spring-1.2-sources.jar", 0, EMPTY_SHA1, EMPTY_MD5 );
670         assertArtifact( artifacts.get( 1 ), "plexus-spring-1.2.jar", 0, EMPTY_SHA1, EMPTY_MD5 );
671         assertArtifact( artifacts.get( 2 ), "plexus-spring-1.2.pom", 7407, "96b14cf880e384b2d15e8193c57b65c5420ca4c5",
672                         "f83aa25f016212a551a4b2249985effc" );
673     }
674 
675     @Test
676     public void testGetArtifactsFiltered()
677         throws Exception
678     {
679         ExcludesFilter<String> filter =
680             new ExcludesFilter<String>( Collections.singletonList( "plexus-spring-1.2.pom" ) );
681         List<ArtifactMetadata> artifacts = new ArrayList<>( storage.readArtifactsMetadata(
682             new ReadMetadataRequest( TEST_REPO_ID, "org.codehaus.plexus", "plexus-spring", "1.2", filter ) ) );
683         assertEquals( 2, artifacts.size() );
684         Collections.sort( artifacts, new Comparator<ArtifactMetadata>()
685         {
686             @Override
687             public int compare( ArtifactMetadata o1, ArtifactMetadata o2 )
688             {
689                 return o1.getId().compareTo( o2.getId() );
690             }
691         } );
692 
693         assertArtifact( artifacts.get( 0 ), "plexus-spring-1.2-sources.jar", 0, EMPTY_SHA1, EMPTY_MD5 );
694         assertArtifact( artifacts.get( 1 ), "plexus-spring-1.2.jar", 0, EMPTY_SHA1, EMPTY_MD5 );
695     }
696 
697     @Test
698     public void testGetArtifactsTimestampedSnapshots()
699         throws Exception
700     {
701         List<ArtifactMetadata> artifacts = new ArrayList<ArtifactMetadata>( storage.readArtifactsMetadata(
702             new ReadMetadataRequest( TEST_REPO_ID, "com.example.test", "missing-metadata", "1.0-SNAPSHOT", ALL ) ) );
703         assertEquals( 1, artifacts.size() );
704 
705         ArtifactMetadata artifact = artifacts.get( 0 );
706         assertEquals( "missing-metadata-1.0-20091101.112233-1.pom", artifact.getId() );
707         assertEquals( "com.example.test", artifact.getNamespace() );
708         assertEquals( "missing-metadata", artifact.getProject() );
709         assertEquals( "1.0-20091101.112233-1", artifact.getVersion() );
710         assertEquals( TEST_REPO_ID, artifact.getRepositoryId() );
711     }
712 
713     private void assertArtifact( ArtifactMetadata artifact, String id, int size, String sha1, String md5 )
714     {
715         assertEquals( id, artifact.getId() );
716         assertEquals( md5, artifact.getMd5() );
717         assertEquals( sha1, artifact.getSha1() );
718         assertEquals( size, artifact.getSize() );
719         assertEquals( "org.codehaus.plexus", artifact.getNamespace() );
720         assertEquals( "plexus-spring", artifact.getProject() );
721         assertEquals( "1.2", artifact.getVersion() );
722         assertEquals( TEST_REPO_ID, artifact.getRepositoryId() );
723     }
724 
725     private void assertMailingList( MailingList mailingList, String name, String archive, String post, String subscribe,
726                                     String unsubscribe, List<String> otherArchives, boolean allowPost )
727     {
728         assertEquals( archive, mailingList.getMainArchiveUrl() );
729         if ( allowPost )
730         {
731             assertEquals( post, mailingList.getPostAddress() );
732         }
733         else
734         {
735             assertNull( mailingList.getPostAddress() );
736         }
737         assertEquals( subscribe, mailingList.getSubscribeAddress() );
738         assertEquals( unsubscribe, mailingList.getUnsubscribeAddress() );
739         assertEquals( name, mailingList.getName() );
740         assertEquals( otherArchives, mailingList.getOtherArchives() );
741     }
742 
743     private void assertMailingList( String prefix, MailingList mailingList, String name, boolean allowPost,
744                                     String nabbleUrl )
745     {
746         List<String> otherArchives = new ArrayList<>();
747         otherArchives.add( "http://www.mail-archive.com/" + prefix + "@archiva.apache.org" );
748         if ( nabbleUrl != null )
749         {
750             otherArchives.add( nabbleUrl );
751         }
752         otherArchives.add( "http://markmail.org/list/org.apache.archiva." + prefix );
753         assertMailingList( mailingList, name, "http://mail-archives.apache.org/mod_mbox/archiva-" + prefix + "/",
754                            prefix + "@archiva.apache.org", prefix + "-subscribe@archiva.apache.org",
755                            prefix + "-unsubscribe@archiva.apache.org", otherArchives, allowPost );
756     }
757 
758     private void checkApacheLicense( ProjectVersionMetadata metadata )
759     {
760         assertEquals( Arrays.asList( new License( "The Apache Software License, Version 2.0",
761                                                   "http://www.apache.org/licenses/LICENSE-2.0.txt" ) ),
762                       metadata.getLicenses() );
763     }
764 
765     private void checkOrganizationApache( ProjectVersionMetadata metadata )
766     {
767         assertEquals( "The Apache Software Foundation", metadata.getOrganization().getName() );
768         assertEquals( "http://www.apache.org/", metadata.getOrganization().getUrl() );
769     }
770 
771     private void deleteTestArtifactWithParent( List<String> pathsToBeDeleted )
772         throws IOException
773     {
774         for ( String path : pathsToBeDeleted )
775         {
776             File dir = new File( FileUtil.getBasedir(), path );
777             FileUtils.deleteDirectory( dir );
778 
779             assertFalse( dir.exists() );
780         }
781         File dest = new File( FileUtil.getBasedir(), "target/test-repository/com/example/test/test-artifact-module-a" );
782         File parentPom =
783             new File( FileUtil.getBasedir(), "target/test-repository/com/example/test/test-artifact-parent" );
784         File rootPom = new File( FileUtil.getBasedir(), "target/test-repository/com/example/test/test-artifact-root" );
785 
786         FileUtils.deleteDirectory( dest );
787         FileUtils.deleteDirectory( parentPom );
788         FileUtils.deleteDirectory( rootPom );
789 
790         assertFalse( dest.exists() );
791         assertFalse( parentPom.exists() );
792         assertFalse( rootPom.exists() );
793     }
794 
795     private File copyTestArtifactWithParent( String srcPath, String destPath )
796         throws IOException
797     {
798         File src = new File( FileUtil.getBasedir(), srcPath );
799         File dest = new File( FileUtil.getBasedir(), destPath );
800 
801         FileUtils.copyDirectory( src, dest );
802         assertTrue( dest.exists() );
803         return dest;
804     }
805 
806 }