Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Introduce to integrate converter and validator #263

Merged
merged 2 commits into from
Mar 1, 2022
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
74 changes: 74 additions & 0 deletions app/src/main/java/org/astraea/argument/Argument.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,74 @@
package org.astraea.argument;

import com.beust.jcommander.JCommander;
import com.beust.jcommander.Parameter;
import com.beust.jcommander.ParameterException;
import com.beust.jcommander.UnixStyleUsageFormatter;
import java.io.*;
import java.util.Map;
import java.util.Properties;
import java.util.stream.Collectors;
import org.apache.kafka.clients.CommonClientConfigs;

/** This basic argument defines the common property used by all kafka clients. */
public abstract class Argument {

/**
* Side effect: parse args into toolArgument
*
* @param toolArgument An argument object that the user want.
* @param args Command line arguments that are put into main function.
*/
public static <T> T parse(T toolArgument, String[] args) {
JCommander jc = JCommander.newBuilder().addObject(toolArgument).build();
jc.setUsageFormatter(new UnixStyleUsageFormatter(jc));
try {
jc.parse(args);
} catch (ParameterException pe) {
var sb = new StringBuilder();
jc.getUsageFormatter().usage(sb);
throw new ParameterException(pe.getMessage() + "\n" + sb);
}
return toolArgument;
}

@Parameter(
names = {"--bootstrap.servers"},
description = "String: server to connect to",
validateWith = NonEmptyStringField.class,
required = true)
public String brokers;

/**
* @param propsFile file path containing the properties to be passed to kafka
* @return the kafka props consists of bootstrap servers and all props from file (if it is
* existent)
*/
Map<String, Object> properties(String propsFile) {
var props = new Properties();
if (propsFile != null) {
try (var input = new FileInputStream(propsFile)) {
props.load(input);
} catch (IOException e) {
throw new UncheckedIOException(e);
}
}
props.setProperty(CommonClientConfigs.BOOTSTRAP_SERVERS_CONFIG, brokers);
return props.entrySet().stream()
.collect(Collectors.toMap(e -> e.getKey().toString(), Map.Entry::getValue));
}

@Parameter(
names = {"--prop.file"},
description = "the file path containing the properties to be passed to kafka admin",
validateWith = NonEmptyStringField.class)
public String propFile;

/**
* @return the kafka props consists of bootstrap servers and all props from file (if it is
* existent)
*/
public Map<String, Object> props() {
return properties(propFile);
}
}
37 changes: 0 additions & 37 deletions app/src/main/java/org/astraea/argument/ArgumentUtil.java

This file was deleted.

38 changes: 0 additions & 38 deletions app/src/main/java/org/astraea/argument/BasicArgument.java

This file was deleted.

This file was deleted.

17 changes: 17 additions & 0 deletions app/src/main/java/org/astraea/argument/BooleanField.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
package org.astraea.argument;

import com.beust.jcommander.ParameterException;

public class BooleanField implements NonEmptyField<Boolean> {
@Override
public Boolean convert(String value) {
return Boolean.parseBoolean(value);
}

@Override
public void validate(String name, String value) throws ParameterException {
NonEmptyField.super.validate(name, value);
if (!("false".equalsIgnoreCase(value) || "true".equalsIgnoreCase(value)))
throw new ParameterException(value + " is not boolean type");
}
}
34 changes: 34 additions & 0 deletions app/src/main/java/org/astraea/argument/CompressionField.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
package org.astraea.argument;

import com.beust.jcommander.ParameterException;
import java.util.stream.Collectors;
import java.util.stream.Stream;
import org.apache.kafka.common.record.CompressionType;

public class CompressionField implements NonEmptyField<CompressionType> {
/**
* @param value Name of compression type. Accept lower-case name only ("none", "gzip", "snappy",
* "lz4", "zstd").
*/
@Override
public CompressionType convert(String value) {
try {
// `CompressionType#forName` accept lower-case name only.
return CompressionType.forName(value);
} catch (IllegalArgumentException e) {
throw new ParameterException(
"the "
+ value
+ " is unsupported. The supported algorithms are "
+ Stream.of(CompressionType.values())
.map(CompressionType::name)
.collect(Collectors.joining(",")));
}
}

@Override
public void validate(String name, String value) throws ParameterException {
NonEmptyField.super.validate(name, value);
convert(value);
}
}
Original file line number Diff line number Diff line change
@@ -1,7 +1,5 @@
package org.astraea.argument.converter;
package org.astraea.argument;

import com.beust.jcommander.IParameterValidator;
import com.beust.jcommander.IStringConverter;
import com.beust.jcommander.ParameterException;
import java.time.Duration;
import java.util.regex.Matcher;
Expand Down Expand Up @@ -42,7 +40,7 @@
* <li><b>(doesn't work)</b> {@code "0.5" to {@code Duration.ofMillis(500)}}
* </ul>
*/
public class DurationConverter implements IStringConverter<Duration>, IParameterValidator {
public class DurationField implements Field<Duration> {

static final Pattern TIME_PATTERN =
Pattern.compile("^(?<value>[0-9]+)(?<unit>days|day|h|m|s|ms|us|ns|)$");
Expand Down
21 changes: 21 additions & 0 deletions app/src/main/java/org/astraea/argument/Field.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
package org.astraea.argument;

import com.beust.jcommander.IParameterValidator;
import com.beust.jcommander.IStringConverter;
import com.beust.jcommander.ParameterException;

public interface Field<T> extends IStringConverter<T>, IParameterValidator {

/** @return an object of type T created from the parameter value. */
@Override
T convert(String value);

/**
* Validate the parameter.
*
* @param name The name of the parameter (e.g. "-host").
* @param value The value of the parameter that we need to validate
* @throws ParameterException Thrown if the value of the parameter is invalid.
*/
void validate(String name, String value) throws ParameterException;
}
12 changes: 12 additions & 0 deletions app/src/main/java/org/astraea/argument/IntegerSetField.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
package org.astraea.argument;

import java.util.Set;
import java.util.stream.Collectors;
import java.util.stream.Stream;

public class IntegerSetField implements SetField<Integer> {
@Override
public Set<Integer> convert(String value) {
return Stream.of(value.split(SEPARATOR)).map(Integer::valueOf).collect(Collectors.toSet());
}
}
12 changes: 12 additions & 0 deletions app/src/main/java/org/astraea/argument/NonEmptyField.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
package org.astraea.argument;

import com.beust.jcommander.ParameterException;

public interface NonEmptyField<T> extends Field<T> {

@Override
default void validate(String name, String value) throws ParameterException {
if (value == null || value.isBlank())
throw new ParameterException(name + " should not be empty.");
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
package org.astraea.argument;

public class NonEmptyStringField implements NonEmptyField<String> {
@Override
public String convert(String value) {
return value;
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
package org.astraea.argument;

public class NonNegativeDoubleField implements PositiveNumberField<Double> {
@Override
public Double convert(String value) {
return Double.parseDouble(value);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
package org.astraea.argument;

public class NonNegativeIntegerField implements PositiveNumberField<Integer> {
@Override
public Integer convert(String value) {
return Integer.parseInt(value);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
package org.astraea.argument;

public class NonNegativeLongField implements PositiveNumberField<Long> {
@Override
public Long convert(String value) {
return Long.parseLong(value);
}
}
12 changes: 12 additions & 0 deletions app/src/main/java/org/astraea/argument/NonNegativeNumberField.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
package org.astraea.argument;

import com.beust.jcommander.ParameterException;

public interface NonNegativeNumberField<T extends Number> extends NonEmptyField<T> {

@Override
default void validate(String name, String value) throws ParameterException {
NonEmptyField.super.validate(name, value);
if (Long.parseLong(value) < 0) throw new ParameterException(name + " should not be negative.");
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
package org.astraea.argument;

public class NonNegativeShortField implements PositiveNumberField<Short> {
@Override
public Short convert(String value) {
return Short.parseShort(value);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
package org.astraea.argument;

public class PositiveDoubleField implements PositiveNumberField<Double> {
@Override
public Double convert(String value) {
return Double.parseDouble(value);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
package org.astraea.argument;

public class PositiveIntegerField implements PositiveNumberField<Integer> {
@Override
public Integer convert(String value) {
return Integer.parseInt(value);
}
}
8 changes: 8 additions & 0 deletions app/src/main/java/org/astraea/argument/PositiveLongField.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
package org.astraea.argument;

public class PositiveLongField implements PositiveNumberField<Long> {
@Override
public Long convert(String value) {
return Long.parseLong(value);
}
}
11 changes: 11 additions & 0 deletions app/src/main/java/org/astraea/argument/PositiveNumberField.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
package org.astraea.argument;

import com.beust.jcommander.ParameterException;

public interface PositiveNumberField<T extends Number> extends Field<T> {

@Override
default void validate(String name, String value) throws ParameterException {
if (Long.parseLong(value) <= 0) throw new ParameterException(name + " should be positive.");
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
package org.astraea.argument;

public class PositiveShortField implements PositiveNumberField<Short> {
@Override
public Short convert(String value) {
return Short.parseShort(value);
}
}
Loading