package bndtools.release.api;

import aQute.bnd.osgi.Jar;

/**
 * IReleaseParticipant contains methods for extending the release process The
 * methods are called in the following order: 1. preUpdateProjectVersions 2.
 * preRelease 3. preJarRelease 4. postJarRelease 5. postRelease
 */
public interface IReleaseParticipant {

	public enum Scope {
		PRE_UPDATE_VERSIONS,
		PRE_RELEASE,
		PRE_JAR_RELEASE,
		POST_JAR_RELEASE,
		POST_RELEASE
	}

	/**
	 * Gives a possibility to rank the registered IReleaseParticipants, are set
	 * in plugin.xml
	 */
	void setRanking(int ranking);

	/**
	 * @return the ranking
	 */
	int getRanking();

	/**
	 * Called just before the the '*.bnd' and 'packageinfo' files in the project
	 * are updated. Can be used to override the suggested versions in JarDiff's
	 *
	 * @param context
	 * @return if false, the release is canceled and postRelease is called with
	 *         success = false
	 */
	boolean preUpdateProjectVersions(ReleaseContext context);

	/**
	 * Called just before the build operation
	 *
	 * @param context
	 * @return if false, the release is canceled and postRelease is called with
	 *         success = false
	 */
	boolean preRelease(ReleaseContext context);

	/**
	 * Called after successful build and prior release to the specified
	 * RepsoitoryPlugin
	 *
	 * @param context
	 * @param jar
	 * @return if false, the release is canceled and postRelease is called with
	 *         success = false
	 */
	boolean preJarRelease(ReleaseContext context, Jar jar);

	/**
	 * Called after release to the specified RepsoitoryPlugin
	 *
	 * @param context
	 * @param jar
	 */
	void postJarRelease(ReleaseContext context, Jar jar);

	/**
	 * Always called at the end of the release
	 *
	 * @param context
	 * @param success All Jar's released successfully
	 */
	void postRelease(ReleaseContext context, boolean success);

}
