1 package org.apache.maven.plugins.assembly.utils;
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22 import org.apache.maven.artifact.Artifact;
23 import org.apache.maven.project.MavenProject;
24 import org.codehaus.plexus.logging.Logger;
25
26 import javax.annotation.Nonnull;
27 import javax.annotation.Nullable;
28 import java.io.File;
29 import java.io.IOException;
30 import java.util.Collections;
31 import java.util.Iterator;
32 import java.util.LinkedHashSet;
33 import java.util.List;
34 import java.util.Set;
35
36
37
38
39 public final class ProjectUtils
40 {
41
42 private ProjectUtils()
43 {
44 }
45
46 @Nullable
47 public static String getClassifier( @Nonnull Artifact artifact )
48 {
49 String classifier = artifact.getClassifier();
50 if ( classifier != null && classifier.length() == 0 )
51 {
52 classifier = null;
53 }
54 return classifier;
55 }
56
57 @Nonnull
58 public static Set<MavenProject> getProjectModules( @Nonnull final MavenProject project,
59 @Nonnull final List<MavenProject> reactorProjects,
60 final boolean includeSubModules, @Nonnull final Logger logger )
61 throws IOException
62 {
63 final Set<MavenProject> singleParentSet = Collections.singleton( project );
64
65 final Set<MavenProject> moduleCandidates = new LinkedHashSet<>( reactorProjects );
66
67 final Set<MavenProject> modules = new LinkedHashSet<>();
68
69
70
71
72
73
74
75 modules.add( project );
76
77 int changed;
78
79 do
80 {
81 changed = 0;
82
83 for ( final Iterator<MavenProject> candidateIterator = moduleCandidates.iterator();
84 candidateIterator.hasNext(); )
85 {
86 final MavenProject moduleCandidate = candidateIterator.next();
87
88 if ( moduleCandidate.getFile() == null )
89 {
90 logger.warn(
91 "Cannot compute whether " + moduleCandidate.getId() + " is a module of: " + project.getId()
92 + "; it does not have an associated POM file on the local filesystem." );
93 continue;
94 }
95
96 Set<MavenProject> currentPotentialParents;
97 if ( includeSubModules )
98 {
99 currentPotentialParents = new LinkedHashSet<>( modules );
100 }
101 else
102 {
103 currentPotentialParents = singleParentSet;
104 }
105
106 for ( final MavenProject potentialParent : currentPotentialParents )
107 {
108 if ( potentialParent.getFile() == null )
109 {
110 logger.warn( "Cannot use: " + moduleCandidate.getId()
111 + " as a potential module-parent while computing the module set for: "
112 + project.getId()
113 + "; it does not have an associated POM file on the local filesystem." );
114 continue;
115 }
116
117
118
119
120 if ( projectContainsModule( potentialParent, moduleCandidate ) )
121 {
122
123
124 modules.add( moduleCandidate );
125
126
127
128 candidateIterator.remove();
129
130
131
132 changed++;
133
134
135 break;
136 }
137 }
138 }
139 }
140 while ( changed != 0 );
141
142
143
144
145 modules.remove( project );
146
147 return modules;
148 }
149
150 private static boolean projectContainsModule( @Nonnull final MavenProject mainProject,
151 @Nonnull final MavenProject moduleProject )
152 throws IOException
153 {
154 final List<String> modules = mainProject.getModules();
155 final File basedir = mainProject.getBasedir();
156
157 final File moduleFile = moduleProject.getFile().getCanonicalFile();
158
159 File moduleBasedir = moduleProject.getBasedir();
160
161 if ( moduleBasedir == null )
162 {
163 moduleBasedir = moduleFile.getParentFile();
164
165 if ( moduleBasedir == null )
166 {
167 moduleBasedir = new File( "." );
168 }
169 }
170
171 moduleBasedir = moduleBasedir.getCanonicalFile();
172
173 for ( final String moduleSubpath : modules )
174 {
175 final File moduleDir = new File( basedir, moduleSubpath ).getCanonicalFile();
176
177 if ( moduleDir.equals( moduleFile ) || moduleDir.equals( moduleBasedir ) )
178 {
179 return true;
180 }
181 }
182
183 return false;
184 }
185
186 }