1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 package io.github.tonywasher.joceanus.themis.parser.project;
18
19 import io.github.tonywasher.joceanus.metis.field.MetisFieldItem;
20 import io.github.tonywasher.joceanus.metis.field.MetisFieldSet;
21 import io.github.tonywasher.joceanus.oceanus.base.OceanusException;
22 import io.github.tonywasher.joceanus.oceanus.format.OceanusDataFormatter;
23 import io.github.tonywasher.joceanus.tethys.api.thread.TethysUIThreadStatusReport;
24 import io.github.tonywasher.joceanus.themis.parser.base.ThemisChar;
25 import io.github.tonywasher.joceanus.themis.parser.base.ThemisDataResource;
26 import io.github.tonywasher.joceanus.themis.parser.base.ThemisParserDef;
27 import io.github.tonywasher.joceanus.themis.parser.maven.ThemisMavenPom;
28 import io.github.tonywasher.joceanus.themis.parser.mod.ThemisModModule;
29
30 import java.io.File;
31 import java.util.ArrayList;
32 import java.util.List;
33 import java.util.Objects;
34
35
36
37
38 public class ThemisModule
39 implements MetisFieldItem {
40
41
42
43 private static final MetisFieldSet<ThemisModule> FIELD_DEFS = MetisFieldSet.newFieldSet(ThemisModule.class);
44
45
46
47
48 static {
49 FIELD_DEFS.declareLocalField(ThemisDataResource.DATA_NAME, ThemisModule::getName);
50 FIELD_DEFS.declareLocalField(ThemisDataResource.DATA_PACKAGES, ThemisModule::getPackages);
51 }
52
53
54
55
56 private static final String MODULE_INFO = "module-info" + ThemisFile.SFX_JAVA;
57
58
59
60
61 private final String theName;
62
63
64
65
66 private final File theLocation;
67
68
69
70
71 private final List<ThemisPackage> thePackages;
72
73
74
75
76 private ThemisModModule theModuleInfo;
77
78
79
80
81
82
83 ThemisModule(final ThemisMavenPom pPom) {
84
85 thePackages = new ArrayList<>();
86
87
88 final File myLocation = pPom.getLocation();
89 theLocation = new File(myLocation, ThemisPackage.PATH_XTRA);
90 theName = myLocation.getName();
91
92
93 checkForPackage(theLocation, null);
94
95
96 for (String myXtra : pPom.getXtraDirs()) {
97 final File myXtraDir = new File(myLocation, myXtra);
98 checkForPackage(myXtraDir, null);
99 }
100 }
101
102 @Override
103 public MetisFieldSet<ThemisModule> getDataFieldSet() {
104 return FIELD_DEFS;
105 }
106
107 @Override
108 public String formatObject(final OceanusDataFormatter pFormatter) {
109 return toString();
110 }
111
112
113
114
115
116
117 public String getName() {
118 return theName;
119 }
120
121 @Override
122 public String toString() {
123 return getName();
124 }
125
126
127
128
129
130
131 public List<ThemisPackage> getPackages() {
132 return thePackages;
133 }
134
135
136
137
138
139
140 public ThemisModModule getModuleInfo() {
141 return theModuleInfo;
142 }
143
144
145
146
147
148
149
150 void checkForPackage(final File pLocation,
151 final String pPackage) {
152
153 boolean isPackage = false;
154
155
156 final File myLocation = pPackage == null
157 ? pLocation
158 : new File(pLocation, pPackage.replace(ThemisChar.PERIOD, ThemisChar.COMMENT));
159
160
161 for (File myFile : Objects.requireNonNull(myLocation.listFiles())) {
162
163 final String myName = myFile.getName();
164
165
166 if (myFile.isDirectory()) {
167 final String myPackage = pPackage == null
168 ? myName
169 : pPackage + ThemisChar.PERIOD + myName;
170 checkForPackage(pLocation, myPackage);
171 }
172
173
174 if (myName.endsWith(ThemisFile.SFX_JAVA)
175 && !MODULE_INFO.equals(myName)) {
176 isPackage = pPackage != null;
177 }
178 }
179
180
181 if (isPackage) {
182
183 thePackages.add(new ThemisPackage(pLocation, pPackage));
184 }
185 }
186
187
188
189
190
191
192
193 void parseJavaCode(final ThemisParserDef pParser) throws OceanusException {
194
195 final TethysUIThreadStatusReport myReport = pParser.getReporter();
196 myReport.setNumSteps(thePackages.size());
197
198
199 for (ThemisPackage myPackage : thePackages) {
200
201 myReport.setNextStep();
202 myPackage.parseJavaCode(pParser);
203 }
204
205
206 final File myModuleInfo = new File(theLocation, MODULE_INFO);
207 if (myModuleInfo.exists()) {
208 theModuleInfo = (ThemisModModule) pParser.parseModuleInfo(myModuleInfo);
209 }
210 }
211 }