View Javadoc
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 }