1   package org.apache.maven.shared.repository;
2   
3   import org.apache.maven.artifact.Artifact;
4   import org.apache.maven.artifact.factory.ArtifactFactory;
5   import org.apache.maven.artifact.metadata.ArtifactMetadataSource;
6   import org.apache.maven.artifact.repository.ArtifactRepository;
7   import org.apache.maven.artifact.repository.ArtifactRepositoryFactory;
8   import org.apache.maven.artifact.repository.layout.ArtifactRepositoryLayout;
9   import org.apache.maven.artifact.resolver.ArtifactResolver;
10  import org.apache.maven.model.Profile;
11  import org.apache.maven.model.Repository;
12  import org.apache.maven.model.RepositoryPolicy;
13  import org.apache.maven.profiles.DefaultProfileManager;
14  import org.apache.maven.profiles.ProfileManager;
15  import org.apache.maven.project.MavenProject;
16  import org.apache.maven.project.MavenProjectBuilder;
17  import org.apache.maven.project.ProjectBuildingException;
18  import org.apache.maven.project.artifact.InvalidDependencyVersionException;
19  import org.apache.maven.shared.repository.model.DefaultRepositoryInfo;
20  import org.codehaus.plexus.PlexusTestCase;
21  
22  import java.io.File;
23  import java.io.IOException;
24  import java.net.URL;
25  import java.net.URLDecoder;
26  import java.util.Collections;
27  
28  public class DefaultRepositoryAssemblerTest
29      extends PlexusTestCase
30  {
31  
32      private MavenProjectBuilder projectBuilder;
33  
34      private ArtifactRepositoryLayout defaultLayout;
35  
36      private ArtifactRepositoryFactory repoFactory;
37  
38      private ArtifactFactory artifactFactory;
39  
40      private ArtifactRepository localRepository;
41  
42      private ArtifactResolver artifactResolver;
43  
44      private ArtifactMetadataSource metadataSource;
45  
46      private DefaultProfileManager profileManager;
47  
48      protected void setUp()
49          throws Exception
50      {
51          super.setUp();
52  
53          projectBuilder = (MavenProjectBuilder) lookup( MavenProjectBuilder.class.getName() );
54  
55          defaultLayout = (ArtifactRepositoryLayout) lookup( ArtifactRepositoryLayout.class.getName(), "default" );
56          repoFactory = (ArtifactRepositoryFactory) lookup( ArtifactRepositoryFactory.class.getName() );
57          artifactFactory = (ArtifactFactory) lookup( ArtifactFactory.class.getName() );
58          artifactResolver = (ArtifactResolver) lookup( ArtifactResolver.class.getName() );
59          metadataSource = (ArtifactMetadataSource) lookup( ArtifactMetadataSource.class.getName() );
60  
61          File localRepo = new File( getBasedir(), "target/local-repository" );
62  
63          localRepository = repoFactory.createArtifactRepository( "local", localRepo.getAbsolutePath(), defaultLayout,
64                                                                  null, null );
65  
66      }
67  
68      private MavenProject getProject( String projectResource, String parentGroupId, String parentArtifactId,
69                                       String parentVersion, boolean preCacheParent )
70          throws ProjectBuildingException, IOException, InvalidDependencyVersionException
71      {
72          ClassLoader cloader = Thread.currentThread().getContextClassLoader();
73          URL res = cloader.getResource( "projects/" + projectResource );
74  
75          File projectFile = new File( URLDecoder.decode( res.getPath(), "UTF-8" ) ).getAbsoluteFile();
76  
77          if ( preCacheParent )
78          {
79              // pre-load the parent model...this is a hack!
80              Artifact parentArtifact = artifactFactory.createParentArtifact( parentGroupId, parentArtifactId,
81                                                                              parentVersion );
82              projectBuilder.buildFromRepository( parentArtifact, Collections.EMPTY_LIST, localRepository );
83          }
84  
85          MavenProject project = projectBuilder.build( projectFile, localRepository, getProfileManager() );
86  
87          project.setDependencyArtifacts( project.createArtifacts( artifactFactory, null, null ) );
88  
89          return project;
90      }
91  
92      private ProfileManager getProfileManager()
93          throws IOException
94      {
95          if ( profileManager == null )
96          {
97              File repoDir = getTestRemoteRepositoryBasedir();
98  
99              Profile profile = new Profile();
100             Repository repo = new Repository();
101             repo.setId( "test.repo" );
102             repo.setUrl( repoDir.toURL().toExternalForm() );
103 
104             repo.setReleases( new RepositoryPolicy() );
105             repo.setSnapshots( new RepositoryPolicy() );
106 
107             profile.addRepository( repo );
108 
109             profileManager = new DefaultProfileManager( getContainer() );
110             profileManager.addProfile( profile );
111             profileManager.explicitlyActivate( "test.repo" );
112         }
113 
114         return profileManager;
115     }
116 
117     private File getTestRemoteRepositoryBasedir()
118         throws IOException
119     {
120         ClassLoader cloader = Thread.currentThread().getContextClassLoader();
121         URL res = cloader.getResource( "marker.txt" );
122 
123         File markerFile = new File( URLDecoder.decode( res.getPath(), "UTF-8" ) );
124         markerFile = markerFile.getCanonicalFile();
125 
126         File repoDir = new File( markerFile.getParentFile(), "remote-repository" );
127 
128         return repoDir;
129     }
130 
131     public void test_MASSEMBLY_210_projectParentIsIncludedInRepository()
132         throws ProjectBuildingException, RepositoryAssemblyException, IOException, InvalidDependencyVersionException
133     {
134         File repoDir = getTestRemoteRepositoryBasedir();
135 
136         ArtifactRepository localRepository = repoFactory.createArtifactRepository( "local", repoDir.getAbsoluteFile()
137                                                                                                    .toURL()
138                                                                                                    .toExternalForm(),
139                                                                                    defaultLayout, null, null );
140 
141         MavenProject project = getProject( "massembly-210-direct-parent/pom.xml", "massembly.210", "parent",
142                                            "1.0-SNAPSHOT", true );
143 
144         TestRepositoryBuilderConfigSource cs = new TestRepositoryBuilderConfigSource();
145         cs.setProject( project );
146         cs.setLocalRepository( localRepository );
147 
148         DefaultRepositoryAssembler assembler = new DefaultRepositoryAssembler( artifactFactory, artifactResolver,
149                                                                                defaultLayout, repoFactory,
150                                                                                metadataSource, projectBuilder );
151 
152         File repositoryDirectory = new File( getBasedir(), "target/test-repositories/massembly-210-direct-parent" );
153 
154         DefaultRepositoryInfo repoInfo = new DefaultRepositoryInfo();
155 
156         assembler.buildRemoteRepository( repositoryDirectory, repoInfo, cs );
157 
158         File parentFile = new File( repositoryDirectory, "massembly/210/parent/1.0-SNAPSHOT/parent-1.0-SNAPSHOT.pom" );
159 
160         assertTrue( parentFile.exists() );
161     }
162 
163     public void test_MASSEMBLY_210_projectParentIsNotInRepository()
164         throws ProjectBuildingException, RepositoryAssemblyException, IOException, InvalidDependencyVersionException
165     {
166         File repoDir = getTestRemoteRepositoryBasedir();
167 
168         ArtifactRepository localRepository = repoFactory.createArtifactRepository( "local", repoDir.getAbsoluteFile()
169                                                                                                    .toURL()
170                                                                                                    .toExternalForm(),
171                                                                                    defaultLayout, null, null );
172 
173         MavenProject project = getProject( "massembly-210-direct-parent-on-fs/project/pom.xml", null, null, null, false );
174 
175         TestRepositoryBuilderConfigSource cs = new TestRepositoryBuilderConfigSource();
176         cs.setProject( project );
177         cs.setLocalRepository( localRepository );
178 
179         DefaultRepositoryAssembler assembler = new DefaultRepositoryAssembler( artifactFactory, artifactResolver,
180                                                                                defaultLayout, repoFactory,
181                                                                                metadataSource, projectBuilder );
182 
183         File repositoryDirectory = new File( getBasedir(), "target/test-repositories/massembly-210-direct-parent-on-fs" );
184 
185         DefaultRepositoryInfo repoInfo = new DefaultRepositoryInfo();
186 
187         assembler.buildRemoteRepository( repositoryDirectory, repoInfo, cs );
188 
189         File parentFile = new File( repositoryDirectory,
190                                     "massembly/210/parent-on-fs/1.0-SNAPSHOT/parent-on-fs-1.0-SNAPSHOT.pom" );
191 
192         assertTrue( parentFile.exists() );
193     }
194 
195     public void test_MASSEMBLY_218_projectDependencyWithClassifier()
196         throws ProjectBuildingException, RepositoryAssemblyException, IOException, InvalidDependencyVersionException
197     {
198         File repoDir = getTestRemoteRepositoryBasedir();
199 
200         ArtifactRepository localRepository = repoFactory.createArtifactRepository( "local", repoDir.getAbsoluteFile()
201                                                                                                    .toURL()
202                                                                                                    .toExternalForm(),
203                                                                                    defaultLayout, null, null );
204 
205         MavenProject project = getProject( "massembly-210-direct-parent-on-fs/project/pom.xml", null, null, null, false );
206 
207         TestRepositoryBuilderConfigSource cs = new TestRepositoryBuilderConfigSource();
208         cs.setProject( project );
209         cs.setLocalRepository( localRepository );
210 
211         DefaultRepositoryAssembler assembler = new DefaultRepositoryAssembler( artifactFactory, artifactResolver,
212                                                                                defaultLayout, repoFactory,
213                                                                                metadataSource, projectBuilder );
214 
215         File repositoryDirectory = new File( getBasedir(), "target/test-repositories/massembly-210-direct-parent-on-fs" );
216 
217         DefaultRepositoryInfo repoInfo = new DefaultRepositoryInfo();
218 
219         assembler.buildRemoteRepository( repositoryDirectory, repoInfo, cs );
220 
221         File parentFile = new File( repositoryDirectory,
222                                     "massembly/210/parent-on-fs/1.0-SNAPSHOT/parent-on-fs-1.0-SNAPSHOT.pom" );
223 
224         assertTrue( parentFile.exists() );
225     }
226 }