All Downloads are FREE. Search and download functionalities are using the official Maven repository.

kalix.javasdk.testkit.impl.EventSourcedEntityEffectsRunner Maven / Gradle / Ivy

/*
 * Copyright 2024 Lightbend Inc.
 *
 * 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 kalix.javasdk.testkit.impl;

import kalix.javasdk.Metadata;
import kalix.javasdk.eventsourcedentity.CommandContext;
import kalix.javasdk.eventsourcedentity.EventSourcedEntity;
import kalix.javasdk.testkit.EventSourcedResult;
import java.util.Optional;
import java.util.List;
import java.util.ArrayList;
import java.util.function.Supplier;
import scala.jdk.javaapi.CollectionConverters;

/** Extended by generated code, not meant for user extension */
public abstract class EventSourcedEntityEffectsRunner {

  private EventSourcedEntity entity;
  private S _state;
  private List events = new ArrayList();

  public EventSourcedEntityEffectsRunner(EventSourcedEntity entity) {
    this.entity = entity;
    this._state = entity.emptyState();
  }

  /** @return The current state of the entity after applying the event */
  protected abstract S handleEvent(S state, E event);

  /** @return The current state of the entity */
  public S getState() {
    return _state;
  }

  /** @return All events emitted by command handlers of this entity up to now */
  public List getAllEvents() {
    return events;
  }

  /**
   * creates a command context to run the commands, then creates an event context to run the events,
   * and finally, creates a command context to run the side effects. It cleans each context after
   * each run.
   *
   * @return the result of the side effects
   */
  protected  EventSourcedResult interpretEffects(
      Supplier> effect, Metadata metadata) {
    var commandContext = new TestKitEventSourcedEntityCommandContext(metadata);
    EventSourcedEntity.Effect effectExecuted;
    try {
      entity._internalSetCommandContext(Optional.of(commandContext));
      entity._internalSetCurrentState(this._state);
      effectExecuted = effect.get();
      this.events.addAll(EventSourcedResultImpl.eventsOf(effectExecuted));
    } finally {
      entity._internalSetCommandContext(Optional.empty());
    }
    try {
      entity._internalSetEventContext(Optional.of(new TestKitEventSourcedEntityEventContext()));
      for (Object event : EventSourcedResultImpl.eventsOf(effectExecuted)) {
        this._state = handleEvent(this._state, (E) event);
        entity._internalSetCurrentState(this._state);
      }
    } finally {
      entity._internalSetEventContext(Optional.empty());
    }
    EventSourcedResult result;
    try {
      entity._internalSetCommandContext(Optional.of(commandContext));
      var secondaryEffect = EventSourcedResultImpl.secondaryEffectOf(effectExecuted, _state);
      result = new EventSourcedResultImpl<>(effectExecuted, _state, secondaryEffect);
    } finally {
      entity._internalSetCommandContext(Optional.empty());
    }
    return result;
  }
}




© 2015 - 2024 Weber Informatics LLC | Privacy Policy