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 }