1 /*-
2 * #%L
3 * io.earcam.instrumental.module.jpms
4 * %%
5 * Copyright (C) 2018 earcam
6 * %%
7 * SPDX-License-Identifier: (BSD-3-Clause OR EPL-1.0 OR Apache-2.0 OR MIT)
8 *
9 * You <b>must</b> choose to accept, in full - any individual or combination of
10 * the following licenses:
11 * <ul>
12 * <li><a href="https://opensource.org/licenses/BSD-3-Clause">BSD-3-Clause</a></li>
13 * <li><a href="https://www.eclipse.org/legal/epl-v10.html">EPL-1.0</a></li>
14 * <li><a href="https://www.apache.org/licenses/LICENSE-2.0">Apache-2.0</a></li>
15 * <li><a href="https://opensource.org/licenses/MIT">MIT</a></li>
16 * </ul>
17 * #L%
18 */
19 package io.earcam.instrumental.module.jpms;
20
21 import static io.earcam.instrumental.module.jpms.Access.ACC_MANDATED;
22
23 import java.util.Set;
24 import java.util.SortedSet;
25
26 // TODO parse and build: annotations and import statements
27 /**
28 * ModuleInfo builder.
29 */
30 public interface ModuleInfoBuilder {
31
32 /**
33 * <p>
34 * named.
35 * </p>
36 *
37 * @param moduleName a {@link java.lang.String} object.
38 * @return a {@link io.earcam.instrumental.module.jpms.ModuleInfoBuilder} object.
39 */
40 public abstract ModuleInfoBuilder named(String moduleName);
41
42
43 /**
44 * <p>
45 * versioned.
46 * </p>
47 *
48 * @param moduleVersion a {@link java.lang.String} object.
49 * @return a {@link io.earcam.instrumental.module.jpms.ModuleInfoBuilder} object.
50 */
51 public abstract ModuleInfoBuilder versioned(String moduleVersion);
52
53
54 /**
55 * <p>
56 * withAccess.
57 * </p>
58 *
59 * @param accessFlags a int.
60 * @return a {@link io.earcam.instrumental.module.jpms.ModuleInfoBuilder} object.
61 */
62 public abstract ModuleInfoBuilder withAccess(int accessFlags);
63
64
65 /**
66 * <p>
67 * withAccess.
68 * </p>
69 *
70 * @param modifiers a {@link java.util.Set} object.
71 * @return a {@link io.earcam.instrumental.module.jpms.ModuleInfoBuilder} object.
72 */
73 public default ModuleInfoBuilder withAccess(Set<ModuleModifier> modifiers)
74 {
75 return withAccess(Access.access(modifiers));
76 }
77
78
79 /**
80 * <p>
81 * packaging.
82 * </p>
83 *
84 * @param paquet a {@link java.lang.CharSequence} object.
85 * @return a {@link io.earcam.instrumental.module.jpms.ModuleInfoBuilder} object.
86 */
87 public abstract ModuleInfoBuilder packaging(CharSequence paquet);
88
89
90 /**
91 * <p>
92 * packaging.
93 * </p>
94 *
95 * @param packages a {@link java.util.SortedSet} object.
96 * @return a {@link io.earcam.instrumental.module.jpms.ModuleInfoBuilder} object.
97 */
98 public default ModuleInfoBuilder packaging(SortedSet<CharSequence> packages)
99 {
100 packages.forEach(this::packaging);
101 return this;
102 }
103
104
105 /**
106 * <p>
107 * using.
108 * </p>
109 *
110 * @param serviceApi a {@link java.lang.String} object.
111 * @return a {@link io.earcam.instrumental.module.jpms.ModuleInfoBuilder} object.
112 */
113 public abstract ModuleInfoBuilder using(String serviceApi);
114
115
116 /**
117 * <p>
118 * using.
119 * </p>
120 *
121 * @param services a {@link java.util.SortedSet} object.
122 * @return a {@link io.earcam.instrumental.module.jpms.ModuleInfoBuilder} object.
123 */
124 public default ModuleInfoBuilder using(SortedSet<String> services)
125 {
126 services.forEach(this::using);
127 return this;
128 }
129
130
131 /**
132 * <p>
133 * providing.
134 * </p>
135 *
136 * @param contract a {@link java.lang.String} object.
137 * @param concretes a {@link java.lang.String} object.
138 * @return a {@link io.earcam.instrumental.module.jpms.ModuleInfoBuilder} object.
139 */
140 public abstract ModuleInfoBuilder providing(String contract, String... concretes);
141
142
143 /**
144 * <p>
145 * providing.
146 * </p>
147 *
148 * @param contract a {@link java.lang.String} object.
149 * @param concretes a {@link java.util.SortedSet} object.
150 * @return a {@link io.earcam.instrumental.module.jpms.ModuleInfoBuilder} object.
151 */
152 public default ModuleInfoBuilder providing(String contract, Set<String> concretes)
153 {
154 return providing(contract, concretes.toArray(new String[concretes.size()]));
155 }
156
157
158 /**
159 * <p>
160 * launching.
161 * </p>
162 *
163 * @param mainClass a {@link java.lang.String} object.
164 * @return a {@link io.earcam.instrumental.module.jpms.ModuleInfoBuilder} object.
165 */
166 public abstract ModuleInfoBuilder launching(String mainClass);
167
168
169 /**
170 * <p>
171 * requiring.
172 * </p>
173 *
174 * @param module a {@link java.lang.String} object.
175 * @param access a int.
176 * @param version a {@link java.lang.String} object.
177 * @return a {@link io.earcam.instrumental.module.jpms.ModuleInfoBuilder} object.
178 */
179 public abstract ModuleInfoBuilder requiring(String module, int access, String version);
180
181
182 /**
183 * <p>
184 * requiring.
185 * </p>
186 *
187 * @param module a {@link java.lang.String} object.
188 * @param modifiers a {@link java.util.Set} object.
189 * @param version a {@link java.lang.String} object.
190 * @return a {@link io.earcam.instrumental.module.jpms.ModuleInfoBuilder} object.
191 */
192 public default ModuleInfoBuilder requiring(String module, Set<RequireModifier> modifiers, String version)
193 {
194 return requiring(module, Access.access(modifiers), version);
195 }
196
197
198 /**
199 * <p>
200 * requiring.
201 * </p>
202 *
203 * @param module a {@link io.earcam.instrumental.module.jpms.ModuleInfo} object.
204 * @return a {@link io.earcam.instrumental.module.jpms.ModuleInfoBuilder} object.
205 */
206 public default ModuleInfoBuilder requiring(ModuleInfo module)
207 {
208 return requiring(module.name(), ACC_MANDATED, module.version());
209 }
210
211
212 /**
213 * <p>
214 * exporting.
215 * </p>
216 *
217 * @param paquet a {@link java.lang.String} object.
218 * @param access a int.
219 * @param modules a {@link java.lang.String} object.
220 * @return a {@link io.earcam.instrumental.module.jpms.ModuleInfoBuilder} object.
221 */
222 public abstract ModuleInfoBuilder exporting(String paquet, int access, String... modules);
223
224
225 /**
226 * <p>
227 * exporting.
228 * </p>
229 *
230 * @param paquet a {@link java.lang.String} object.
231 * @param modifiers a {@link java.util.Set} object.
232 * @param modules a {@link java.lang.String} object.
233 * @return a {@link io.earcam.instrumental.module.jpms.ModuleInfoBuilder} object.
234 */
235 public default ModuleInfoBuilder exporting(String paquet, Set<ExportModifier> modifiers, String... modules)
236 {
237 return exporting(paquet, Access.access(modifiers), modules);
238 }
239
240
241 /**
242 * <p>
243 * exporting.
244 * </p>
245 *
246 * @param paquet a {@link java.lang.String} object.
247 * @param modules a {@link java.lang.String} object.
248 * @return a {@link io.earcam.instrumental.module.jpms.ModuleInfoBuilder} object.
249 */
250 public default ModuleInfoBuilder exporting(String paquet, String... modules)
251 {
252 return exporting(paquet, ACC_MANDATED, modules);
253 }
254
255
256 /**
257 * <p>
258 * exporting.
259 * </p>
260 *
261 * @param paquet a {@link java.lang.String} object.
262 * @param modifiers a {@link java.util.Set} object.
263 * @param modules a {@link java.util.SortedSet} object.
264 * @return a {@link io.earcam.instrumental.module.jpms.ModuleInfoBuilder} object.
265 */
266 public default ModuleInfoBuilder exporting(String paquet, Set<ExportModifier> modifiers, SortedSet<String> modules)
267 {
268 return exporting(paquet, modifiers, modules.toArray(new String[modules.size()]));
269 }
270
271
272 /**
273 * <p>
274 * opening.
275 * </p>
276 *
277 * @param paquet a {@link java.lang.String} object.
278 * @param access a int.
279 * @param modules a {@link java.lang.String} object.
280 * @return a {@link io.earcam.instrumental.module.jpms.ModuleInfoBuilder} object.
281 */
282 public abstract ModuleInfoBuilder opening(String paquet, int access, String... modules);
283
284
285 /**
286 * <p>
287 * opening.
288 * </p>
289 *
290 * @param paquet a {@link java.lang.String} object.
291 * @param modifiers a {@link java.util.Set} object.
292 * @param modules a {@link java.lang.String} object.
293 * @return a {@link io.earcam.instrumental.module.jpms.ModuleInfoBuilder} object.
294 */
295 public default ModuleInfoBuilder opening(String paquet, Set<ExportModifier> modifiers, String... modules)
296 {
297 return opening(paquet, Access.access(modifiers), modules);
298 }
299
300
301 /**
302 * <p>
303 * opening.
304 * </p>
305 *
306 * @param paquet a {@link java.lang.String} object.
307 * @param modules a {@link java.lang.String} object.
308 * @return a {@link io.earcam.instrumental.module.jpms.ModuleInfoBuilder} object.
309 */
310 public default ModuleInfoBuilder opening(String paquet, String... modules)
311 {
312 return opening(paquet, ACC_MANDATED, modules);
313 }
314
315
316 /**
317 * <p>
318 * opening.
319 * </p>
320 *
321 * @param paquet a {@link java.lang.String} object.
322 * @param modifiers a {@link java.util.Set} object.
323 * @param modules a {@link java.util.SortedSet} object.
324 * @return a {@link io.earcam.instrumental.module.jpms.ModuleInfoBuilder} object.
325 */
326 public default ModuleInfoBuilder opening(String paquet, Set<ExportModifier> modifiers, SortedSet<String> modules)
327 {
328 return opening(paquet, modifiers, modules.toArray(new String[modules.size()]));
329 }
330
331
332 /**
333 * <p>
334 * construct.
335 * </p>
336 *
337 * @return a {@link io.earcam.instrumental.module.jpms.ModuleInfo} object.
338 */
339 public abstract ModuleInfo construct();
340 }