/*
* Copyright (c) MuleSoft, Inc. All rights reserved. http://www.mulesoft.com
* The software in this package is published under the terms of the CPAL v1.0
* license, a copy of which has been included with this distribution in the
* LICENSE.txt file.
*/
package org.mule.runtime.core.api.lifecycle;
import org.mule.runtime.api.lifecycle.LifecycleException;
/**
* The LifecycleManager is responsible for managing the different lifecycle phases of the server and managing the transitions
* between lifecycle phases.
*
* @since 3.0
*/
public interface LifecycleManager {
/**
* Applies lifecycle phase to a collection of objects.
*
* @param phase that phase to execute next
* @throws LifecycleException if the phase is not a valid transition of does not exist on this lifecycle manager
*/
void fireLifecycle(String phase) throws LifecycleException;
/**
* The current phase for the lifecycle manager. While in transition this will reflect the last completed phase not the currently
* executing phase, use {@link #getExecutingPhase()} to get the phase being executed.
*
* @return The current completed phase for the lifecycle manager
*/
String getCurrentPhase();
/**
* Returns the lifecycle phase being executed. This will be null if the lifecycle is not in transition
*
* @return the lifecycle phase being executed
*/
String getExecutingPhase();
/**
* Applies lifecycle phase to an object independent of the current lifecycle phase. All phases between the {@code startPhase}
* (not inclusive) and the {@code endPhase} will be executed.
*
* @param object the object to apply lifecycle to
* @param startPhase the lifecycle phase the object is currently in. Must not be null.
* @param toPhase the lifecycle phase to transition the object to. Must not be null.
* @throws LifecycleException if there is an exception while invoking lifecycle on the object
*/
void applyPhase(Object object, String startPhase, String toPhase) throws LifecycleException;
/**
* Successively applies all completed lifecycle phase to an object.
*
* @param object the object to which the lifecycle should be applied
* @throws LifecycleException if there is an error while applying lifecycle to the object
*/
void applyCompletedPhases(Object object) throws LifecycleException;
/**
* Reset the lifecycle manager state back to 'not in lifecycle' phase
*/
void reset();
/**
* Checks that a phase has completed
*
* @param phaseName the name of the pahse to check for
* @return true if that phase has completed, false if the phase has not completed, or currently processing or does not exist
*/
boolean isPhaseComplete(String phaseName);
/**
* Will check that the phase passed in is a valid next phase for this lifecycle manager. If the phase is not a valid next
* transition an exception will be thrown
*
* @param name The name of the lifecycle to validate as a valid next transition
* @throws IllegalStateException if the lifecycle name is not recognised or the phase is not valid for the current lifecycle
* state
*/
void checkPhase(String name) throws IllegalStateException;
/**
* Provides access to a state machine for this lifecycle manager. components in the registry can use this to assert lifecycle
* rather than managing thier own lifecycle state
*
* @return A state machine for this lifecycle manager
* @since 3.0
*/
LifecycleState getState();
boolean isDirectTransition(String phase);
}