package io.divolte.server.config; 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; import io.divolte.server.filesinks.FileFlushingPool; import io.divolte.server.filesinks.FileManager.FileManagerFactory; import io.divolte.server.filesinks.hdfs.HdfsFileManager; @ParametersAreNonnullByDefault public class HdfsSinkConfiguration extends FileSinkConfiguration { private static final String DEFAULT_REPLICATION = "3"; public final short replication; @JsonCreator @ParametersAreNullableByDefault HdfsSinkConfiguration(@JsonProperty(defaultValue=DEFAULT_REPLICATION) final Short replication, final FileStrategyConfiguration fileStrategy) { super(fileStrategy); // TODO: register a custom deserializer with Jackson that uses the defaultValue property from the annotation to fix this this.replication = Optional.ofNullable(replication).orElseGet(() -> Short.valueOf(DEFAULT_REPLICATION)); } @Override protected MoreObjects.ToStringHelper toStringHelper() { return super.toStringHelper() .add("replication", replication); } @Override public SinkFactory getFactory() { return (config, name, registry) -> { final FileManagerFactory fileManagerFactory = HdfsFileManager.newFactory(config, name, registry.getSchemaBySinkName(name)); fileManagerFactory.verifyFileSystemConfiguration(); return new FileFlushingPool(config, name, fileManagerFactory); }; } @Override public String getReadableType() { return "Hadoop FileSystem (HDFS)"; } }