content: /**
   * Licensed under the Apache License, Version 2.0 (the "License");
   * you may not use this file except in compliance with the License.
   * You may obtain a copy of the License at
   *
   *     http://www.apache.org/licenses/LICENSE-2.0
   *
   * Unless required by applicable law or agreed to in writing, software
   * distributed under the License is distributed on an "AS IS" BASIS,
   * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
   * See the License for the specific language governing permissions and
   * limitations under the License.
   */
  package org.apache.aurora.scheduler.state;
  
  import java.util.Objects;
  
  import com.google.common.base.MoreObjects;
  import com.google.common.base.Preconditions;
  import com.google.common.collect.ImmutableSet;
  
  import static org.apache.aurora.scheduler.state.StateChangeResult.ILLEGAL_WITH_SIDE_EFFECTS;
  import static org.apache.aurora.scheduler.state.StateChangeResult.SUCCESS;
  
  /**
   * The actions that should be performed in response to a state transition attempt.
   *
   * {@see TaskStateMachine}
   */
  public class TransitionResult {
    private final StateChangeResult result;
    private final ImmutableSet<SideEffect> sideEffects;
  
    /**
     * Creates a transition result with the given side effects.
     *
     * @param result Transition attempt result.
     * @param sideEffects Actions that must be performed in response to the state transition.
     */
    public TransitionResult(StateChangeResult result, ImmutableSet<SideEffect> sideEffects) {
      this.result = result;
      this.sideEffects = Objects.requireNonNull(sideEffects);
      if (!this.sideEffects.isEmpty()) {
        Preconditions.checkArgument(
            result == SUCCESS || result == ILLEGAL_WITH_SIDE_EFFECTS,
            "Invalid transition result for a non-empty set of side effects");
      }
    }
  
    public StateChangeResult getResult() {
      return result;
    }
  
    public ImmutableSet<SideEffect> getSideEffects() {
      return sideEffects;
    }
  
    @Override
    public boolean equals(Object o) {
      if (!(o instanceof TransitionResult)) {
        return false;
      }
  
      TransitionResult other = (TransitionResult) o;
      return Objects.equals(result, other.result)
          && Objects.equals(sideEffects, other.sideEffects);
    }
  
    @Override
    public int hashCode() {
      return Objects.hash(result, sideEffects);
    }
  
    @Override
    public String toString() {
      return MoreObjects.toStringHelper(this)
          .add("result", result)
          .add("sideEffects", sideEffects)
          .toString();
    }
  }
  