1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 package io.github.tonywasher.joceanus.themis.xanalysis.parser.proj;
18
19 import io.github.tonywasher.joceanus.oceanus.base.OceanusException;
20 import io.github.tonywasher.joceanus.themis.exc.ThemisIOException;
21 import io.github.tonywasher.joceanus.themis.xanalysis.parser.base.ThemisXAnalysisParserDef;
22 import io.github.tonywasher.joceanus.themis.xanalysis.parser.proj.ThemisXAnalysisMaven.ThemisXAnalysisMavenId;
23
24 import java.io.File;
25 import java.io.FileInputStream;
26 import java.io.IOException;
27 import java.io.InputStream;
28 import java.util.ArrayList;
29 import java.util.LinkedHashMap;
30 import java.util.List;
31 import java.util.Map;
32
33
34
35
36 public class ThemisXAnalysisProject {
37
38
39
40 private static final String CONSOLIDATION_ERROR = "Failed on consolidation Pass";
41
42
43
44
45 private final String theName;
46
47
48
49
50 private final File theLocation;
51
52
53
54
55 private final Map<ThemisXAnalysisMavenId, ThemisXAnalysisModule> theModules;
56
57
58
59
60 private final List<ThemisXAnalysisMavenId> theDependencies;
61
62
63
64
65
66
67
68 public ThemisXAnalysisProject(final File pLocation) throws OceanusException {
69
70 theLocation = pLocation;
71
72
73 theModules = new LinkedHashMap<>();
74 theDependencies = new ArrayList<>();
75
76
77 final ThemisXAnalysisMaven myPom = parseProjectFile(null, new File(theLocation, ThemisXAnalysisMaven.POM));
78 theName = myPom == null ? null : myPom.getMavenId().getArtifactId();
79
80
81 theDependencies.removeIf(theModules::containsKey);
82
83
84 final List<ThemisXAnalysisMavenId> myDependencies = new ArrayList<>(theDependencies);
85 for (ThemisXAnalysisMavenId myId : myDependencies) {
86 processDependency(myId);
87 }
88 }
89
90
91
92
93
94
95 private void processDependency(final ThemisXAnalysisMavenId pId) throws OceanusException {
96 final File myFile = pId.getMavenPomPath();
97
98 try (InputStream myInStream = new FileInputStream(myFile)) {
99
100 final ThemisXAnalysisMaven myPom = new ThemisXAnalysisMaven(null, myInStream);
101
102
103 for (final ThemisXAnalysisMavenId myDepId : myPom.getDependencies()) {
104 if (!theDependencies.contains(myDepId)) {
105 theDependencies.add(myDepId);
106 if (myDepId.getClassifier() == null) {
107 processDependency(myDepId);
108 }
109 }
110 }
111 } catch (IOException e) {
112 throw new ThemisIOException("Failed to parse pom file", e);
113 }
114 }
115
116
117
118
119
120
121 public String getName() {
122 return theName;
123 }
124
125
126
127
128
129
130 File getLocation() {
131 return theLocation;
132 }
133
134
135
136
137
138
139 public List<ThemisXAnalysisModule> getModules() {
140 return new ArrayList<>(theModules.values());
141 }
142
143
144
145
146
147
148 public List<ThemisXAnalysisMavenId> getDependencies() {
149 return theDependencies;
150 }
151
152 @Override
153 public String toString() {
154 return theName;
155 }
156
157
158
159
160
161
162
163
164
165 private ThemisXAnalysisMaven parseProjectFile(final ThemisXAnalysisMaven pParent,
166 final File pPom) throws OceanusException {
167
168 if (!pPom.exists()) {
169 return null;
170 }
171
172
173 try (InputStream myInStream = new FileInputStream(pPom)) {
174
175 final ThemisXAnalysisMaven myPom = new ThemisXAnalysisMaven(pParent, myInStream);
176
177
178 final File mySrc = new File(pPom.getParent(), ThemisXAnalysisModule.PATH_XTRA);
179 if (mySrc.exists()
180 && mySrc.isDirectory()) {
181
182 theModules.put(myPom.getMavenId(), new ThemisXAnalysisModule(new File(pPom.getParent()), myPom));
183
184
185 for (final ThemisXAnalysisMavenId myDepId : myPom.getDependencies()) {
186 if (!theDependencies.contains(myDepId)) {
187 theDependencies.add(myDepId);
188 }
189 }
190 }
191
192
193 for (final String myModuleName : myPom.getModules()) {
194
195 final File myModuleDir = new File(pPom.getParentFile(), myModuleName);
196
197
198 parseProjectFile(myPom, new File(myModuleDir, ThemisXAnalysisMaven.POM));
199 }
200
201
202 return myPom;
203
204
205 } catch (IOException e) {
206
207 throw new ThemisIOException("Failed to parse Project file", e);
208 }
209 }
210
211
212
213
214
215
216
217 public void parseJavaCode(final ThemisXAnalysisParserDef pParser) throws OceanusException {
218
219 for (ThemisXAnalysisModule myModule : theModules.values()) {
220
221 myModule.parseJavaCode(pParser);
222 }
223 }
224 }