package io.divolte.server.config; import java.time.Duration; import java.util.Optional; import javax.annotation.ParametersAreNonnullByDefault; import javax.annotation.ParametersAreNullableByDefault; import com.fasterxml.jackson.annotation.JsonCreator; import com.fasterxml.jackson.annotation.JsonProperty; import com.google.common.base.MoreObjects; @ParametersAreNonnullByDefault public class FileStrategyConfiguration { private static final String DEFAULT_SYNC_FILE_AFTER_RECORDS = "1000"; private static final String DEFAULT_SYNC_FILE_AFTER_DURATION = "30 seconds"; private static final String DEFAULT_WORKING_DIR = "/tmp"; private static final String DEFAULT_PUBLISH_DIR = "/tmp"; private static final String DEFAULT_ROLL_EVERY = "1 hour"; static final FileStrategyConfiguration DEFAULT_FILE_STRATEGY_CONFIGURATION = new FileStrategyConfiguration( DurationDeserializer.parseDuration(DEFAULT_ROLL_EVERY), Integer.parseInt(DEFAULT_SYNC_FILE_AFTER_RECORDS), DurationDeserializer.parseDuration(DEFAULT_SYNC_FILE_AFTER_DURATION), DEFAULT_WORKING_DIR, DEFAULT_PUBLISH_DIR); public final int syncFileAfterRecords; public final Duration syncFileAfterDuration; public final String workingDir; public final String publishDir; public final Duration rollEvery; @JsonCreator @ParametersAreNullableByDefault FileStrategyConfiguration(@JsonProperty(defaultValue=DEFAULT_ROLL_EVERY) final Duration rollEvery, @JsonProperty(defaultValue=DEFAULT_SYNC_FILE_AFTER_RECORDS) final Integer syncFileAfterRecords, @JsonProperty(defaultValue=DEFAULT_SYNC_FILE_AFTER_DURATION) final Duration syncFileAfterDuration, @JsonProperty(defaultValue=DEFAULT_WORKING_DIR) final String workingDir, @JsonProperty(defaultValue=DEFAULT_PUBLISH_DIR) final String publishDir) { // TODO: register a custom deserializer with Jackson that uses the defaultValue property from the annotation to fix this this.rollEvery = Optional.ofNullable(rollEvery).orElseGet(() -> DurationDeserializer.parseDuration(DEFAULT_ROLL_EVERY)); this.syncFileAfterRecords = Optional.ofNullable(syncFileAfterRecords).orElseGet(() -> Integer.valueOf(DEFAULT_SYNC_FILE_AFTER_RECORDS)); this.syncFileAfterDuration = Optional.ofNullable(syncFileAfterDuration).orElseGet(() -> DurationDeserializer.parseDuration(DEFAULT_SYNC_FILE_AFTER_DURATION)); this.workingDir = Optional.ofNullable(workingDir).orElse(DEFAULT_WORKING_DIR); this.publishDir = Optional.ofNullable(publishDir).orElse(DEFAULT_PUBLISH_DIR); } @Override public final String toString() { return MoreObjects.toStringHelper(this) .add("rollEvery", rollEvery) .add("syncFileAfterRecords", syncFileAfterRecords) .add("syncFileAfterDuration", syncFileAfterDuration) .add("workingDir", workingDir) .add("publishDir", publishDir).toString(); } }