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

com.github.chaosfirebolt.converter.api.initialization.BaseInitializationData Maven / Gradle / Ivy

package com.github.chaosfirebolt.converter.api.initialization;

import com.github.chaosfirebolt.converter.api.initialization.source.InputSource;
import com.github.chaosfirebolt.converter.api.initialization.transformation.Transformation;

/**
 * Provides the skeleton for {@link InitializationData} implementations.
 *
 * @param  input source type
 * @param  result type
 */
public non-sealed abstract class BaseInitializationData implements InitializationData {

  /**
   * The source of data.
   */
  private final InputSource inputSource;
  /**
   * Transforms the input data into the type required for initialization purposes.
   */
  private final Transformation transformation;
  /**
   * The input from {@link #inputSource}.
   */
  private I input;
  /**
   * The result after applying the {@link #transformation}.
   */
  private O output;

  /**
   * Constructs a new instance with provided {@link InputSource} and {@link Transformation}.
   *
   * @param inputSource    a data source
   * @param transformation transformation from input to type required for initialization
   */
  protected BaseInitializationData(InputSource inputSource, Transformation transformation) {
    this.inputSource = inputSource;
    this.transformation = transformation;
  }

  @Override
  public final O getData() {
    this.input = this.inputSource.getInputData();
    this.output = this.transformation.transform(this.input);
    return this.output;
  }

  @Override
  public final void cleanup() {
    this.doCleanup(this.input, this.output);
  }

  /**
   * Does the actual cleanup, if necessary.
   *
   * @param input  the input to be cleaned up
   * @param output the result to be cleaned up
   */
  protected abstract void doCleanup(I input, O output);
}