AsJpmsModule.java

/*-
 * #%L
 * io.earcam.instrumental.archive.jpms
 * %%
 * Copyright (C) 2018 earcam
 * %%
 * SPDX-License-Identifier: (BSD-3-Clause OR EPL-1.0 OR Apache-2.0 OR MIT)
 * 
 * You <b>must</b> choose to accept, in full - any individual or combination of 
 * the following licenses:
 * <ul>
 * 	<li><a href="https://opensource.org/licenses/BSD-3-Clause">BSD-3-Clause</a></li>
 * 	<li><a href="https://www.eclipse.org/legal/epl-v10.html">EPL-1.0</a></li>
 * 	<li><a href="https://www.apache.org/licenses/LICENSE-2.0">Apache-2.0</a></li>
 * 	<li><a href="https://opensource.org/licenses/MIT">MIT</a></li>
 * </ul>
 * #L%
 */
package io.earcam.instrumental.archive.jpms;

import java.util.function.Predicate;

import io.earcam.instrumental.archive.ArchiveConstruction;
import io.earcam.instrumental.archive.AsJarBuilder;
import io.earcam.instrumental.archive.jpms.auto.ClasspathModules;
import io.earcam.instrumental.archive.jpms.auto.JdkModules;
import io.earcam.instrumental.fluent.Fluent;

public interface AsJpmsModule extends AsJarBuilder<AsJpmsModule> {

	/**
	 * <p>
	 * asJpmsModule.
	 * </p>
	 *
	 * @return this builder
	 */
	@Fluent
	public static AsJpmsModule asJpmsModule()
	{
		return new DefaultAsJpmsModule();
	}


	public abstract AsJpmsModule named(String moduleName);


	public abstract AsJpmsModule versioned(String moduleVersion);


	/**
	 * <p>
	 * exporting... Composition of predicates is more powerful than regex or globs
	 * </p>
	 *
	 * @param predicate a {@link java.util.function.Predicate} object.
	 * @param onlyToModules a {@link java.lang.String} object.
	 * @see java.util.regex.Pattern#asPredicate()
	 * @see Predicate#and(Predicate)
	 * @see Predicate#or(Predicate)
	 * @see Predicate#negate()
	 * @see Predicate#and(Predicate)
	 * @see Predicate#or(Predicate)
	 * @see Predicate#negate()
	 * @see Predicate#and(Predicate)
	 * @see Predicate#or(Predicate)
	 * @see Predicate#negate()
	 * @return this builder
	 */
	public abstract AsJpmsModule exporting(Predicate<String> predicate, String... onlyToModules);


	/**
	 * <p>
	 * opening.
	 * </p>
	 *
	 * @param predicate a {@link java.util.function.Predicate} object.
	 * @param onlyToModules a {@link java.lang.String} object.
	 * @return this builder
	 */
	public abstract AsJpmsModule opening(Predicate<String> predicate, String... onlyToModules);


	/**
	 * <p>
	 * requiring.
	 * </p>
	 *
	 * @param moduleName a {@link java.lang.String} object.
	 * @return this builder
	 */
	public abstract AsJpmsModule requiring(String moduleName);


	/**
	 * <p>
	 * requiring.
	 * </p>
	 *
	 * @param moduleName a {@link java.lang.String} object.
	 * @param version a {@link java.lang.String} object.
	 * @return this builder
	 */
	public abstract AsJpmsModule requiring(String moduleName, String version);


	/**
	 * <p>
	 * using.
	 * </p>
	 *
	 * @param service a {@link java.lang.Class} object.
	 * @return this builder
	 */
	public abstract AsJpmsModule using(Class<?> service);


	/**
	 * <p>
	 * using.
	 * </p>
	 *
	 * @param service a {@link java.lang.String} object.
	 * @return this builder
	 */
	public abstract AsJpmsModule using(String service);


	/**
	 * <p>
	 * listingPackages.
	 * </p>
	 *
	 * @return this builder
	 */
	public abstract AsJpmsModule listingPackages();


	/**
	 * <p>
	 * Auto-require the JDK modules and classpaths.
	 * </p>
	 *
	 * @return this builder
	 * 
	 * @see #autoRequiringClasspath()
	 * @see #autoRequiringJdkModules()
	 */
	public default AsJpmsModule autoRequiring()
	{
		return autoRequiringJdkModules()
				.autoRequiringClasspath();
	}


	/**
	 * <p>
	 * Auto-require from all available class-paths (inc. module-paths).
	 * </p>
	 *
	 * @return this builder
	 */
	public abstract AsJpmsModule autoRequiringClasspath();


	/**
	 * <p>
	 * Auto-Require from the JDK's modules
	 * </p>
	 *
	 * @return this builder
	 */
	public abstract AsJpmsModule autoRequiringJdkModules();


	/**
	 * <p>
	 * Note: if you also want the default {@link PackageModuleMapper} ({@link JdkModules} and {@link ClasspathModules})
	 * then you must also invoke {@link #autoRequiring()} or add them manually here
	 * </p>
	 *
	 * @param mappers a {@link io.earcam.instrumental.archive.jpms.PackageModuleMapper} object.
	 * @return this builder
	 * 
	 * @see #autoRequiring()
	 */
	public abstract AsJpmsModule autoRequiring(PackageModuleMapper... mappers);


	/**
	 * <p>
	 * Note: if you also want the default {@link PackageModuleMapper} ({@link JdkModules} and {@link ClasspathModules})
	 * then you must also invoke {@link #autoRequiring()} or add them manually here
	 * </p>
	 *
	 * @param mappers a {@link java.lang.Iterable} object.
	 * @return this builder
	 * 
	 * @see #autoRequiring()
	 */
	public abstract AsJpmsModule autoRequiring(Iterable<PackageModuleMapper> mappers);


	/**
	 * Shorthand for {@code providingFromMetaInfServices(true)}
	 * 
	 * @return this builder
	 * 
	 * @see #providingFromMetaInfServices(boolean)
	 */
	public default AsJpmsModule providingFromMetaInfServices()
	{
		return providingFromMetaInfServices(true);
	}


	/**
	 * <p>
	 * This option enables support for scanning existing {@code META-INF/service/*} and
	 * adding any service implementations to the {@code module-info}'s {@code provides}
	 * entries.
	 * </p>
	 * <p>
	 * Use in conjunction with
	 * {@link ArchiveConstruction#sourcing(io.earcam.instrumental.archive.ArchiveResourceSource)}
	 * and e.g. {@link ArchiveConstruction#contentFrom(java.io.File)}
	 * </p>
	 * 
	 * @param enable true to enable, false to disable
	 * @return this builder
	 */
	public abstract AsJpmsModule providingFromMetaInfServices(boolean enable);
}