Skip to content

Commit d824897

Browse files
authored
Fixes for Connector#validate (google#944)
- Add a method validateForConnector called by AbstractSnowflakeConnector#validate. - Add Nonnull to the param of validate. - Make validateDateRange non-default. - Simplify some checks in validateDateRange to make it less nested.
1 parent 297e996 commit d824897

File tree

11 files changed

+74
-121
lines changed

11 files changed

+74
-121
lines changed

dumper/app/src/main/java/com/google/edwmigration/dumper/application/dumper/connector/Connector.java

Lines changed: 15 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,9 @@
1616
*/
1717
package com.google.edwmigration.dumper.application.dumper.connector;
1818

19-
import com.google.common.base.Preconditions;
19+
import static com.google.common.base.Preconditions.checkNotNull;
20+
import static com.google.common.base.Preconditions.checkState;
21+
2022
import com.google.edwmigration.dumper.application.dumper.ConnectorArguments;
2123
import com.google.edwmigration.dumper.application.dumper.handle.Handle;
2224
import com.google.edwmigration.dumper.application.dumper.task.Task;
@@ -50,25 +52,21 @@ default String getDescription() {
5052
* @param arguments cli params
5153
* @throws RuntimeException if incorrect set of arguments passed to the particular connector
5254
*/
53-
default void validate(ConnectorArguments arguments) {}
55+
default void validate(@Nonnull ConnectorArguments arguments) {}
5456

55-
default void validateDateRange(ConnectorArguments arguments) {
56-
ZonedDateTime startDate = arguments.getStartDate();
57-
ZonedDateTime endDate = arguments.getEndDate();
57+
static void validateDateRange(@Nonnull ConnectorArguments arguments) {
58+
ZonedDateTime start = arguments.getStartDate();
59+
ZonedDateTime end = arguments.getEndDate();
5860

59-
if (startDate != null) {
60-
Preconditions.checkNotNull(
61-
endDate, "End date must be specified with start date, but was null.");
62-
Preconditions.checkState(
63-
startDate.isBefore(endDate),
64-
"Start date [%s] must be before end date [%s].",
65-
startDate,
66-
endDate);
67-
} else {
68-
Preconditions.checkState(
69-
endDate == null,
70-
"End date can be specified only with start date, but start date was null.");
61+
if (start == null && end == null) {
62+
return;
7163
}
64+
checkNotNull(start, "End date can be specified only with start date, but start date was null.");
65+
// The assignment makes 'end' recognized as @Nonnull.
66+
end = checkNotNull(end, "End date must be specified with start date, but was null.");
67+
68+
String message = String.format("Start date [%s] must be before end date [%s].", start, end);
69+
checkState(end.isAfter(start), message);
7270
}
7371

7472
void addTasksTo(@Nonnull List<? super Task<?>> out, @Nonnull ConnectorArguments arguments)

dumper/app/src/main/java/com/google/edwmigration/dumper/application/dumper/connector/airflow/AirflowConnector.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717
package com.google.edwmigration.dumper.application.dumper.connector.airflow;
1818

1919
import static com.google.common.collect.ImmutableList.toImmutableList;
20+
import static com.google.edwmigration.dumper.application.dumper.connector.Connector.validateDateRange;
2021
import static com.google.edwmigration.dumper.application.dumper.connector.airflow.AirflowDatabaseDriverClasses.jdbcPrefixForClassName;
2122

2223
import com.google.auto.service.AutoService;
@@ -209,7 +210,7 @@ private static void addQueryTask(
209210
}
210211

211212
@Override
212-
public void validate(ConnectorArguments arguments) {
213+
public final void validate(@Nonnull ConnectorArguments arguments) {
213214
Preconditions.checkState(arguments.isAssessment(), "--assessment flag is required");
214215
Preconditions.checkState(
215216
arguments.getDriverPaths() != null && !arguments.getDriverPaths().isEmpty(),

dumper/app/src/main/java/com/google/edwmigration/dumper/application/dumper/connector/cloudera/manager/ClouderaManagerConnector.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616
*/
1717
package com.google.edwmigration.dumper.application.dumper.connector.cloudera.manager;
1818

19+
import static com.google.edwmigration.dumper.application.dumper.connector.Connector.validateDateRange;
1920
import static com.google.edwmigration.dumper.application.dumper.connector.cloudera.manager.AbstractClouderaTimeSeriesTask.TimeSeriesAggregation.DAILY;
2021
import static com.google.edwmigration.dumper.application.dumper.task.TaskCategory.OPTIONAL;
2122

@@ -129,7 +130,7 @@ public ClouderaManagerHandle open(@Nonnull ConnectorArguments arguments) throws
129130
}
130131

131132
@Override
132-
public void validate(ConnectorArguments arguments) {
133+
public final void validate(@Nonnull ConnectorArguments arguments) {
133134
String clouderaUri = arguments.getUri();
134135
Preconditions.checkNotNull(clouderaUri, "--url for Cloudera Manager API is required");
135136

dumper/app/src/main/java/com/google/edwmigration/dumper/application/dumper/connector/hadoop/oozie/OozieConnector.java

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,8 @@
1616
*/
1717
package com.google.edwmigration.dumper.application.dumper.connector.hadoop.oozie;
1818

19+
import static com.google.edwmigration.dumper.application.dumper.connector.Connector.validateDateRange;
20+
1921
import com.google.auto.service.AutoService;
2022
import com.google.common.annotations.VisibleForTesting;
2123
import com.google.common.base.Preconditions;
@@ -79,7 +81,7 @@ public String getDefaultFileName(boolean isAssessment, Clock clock) {
7981
}
8082

8183
@Override
82-
public void validate(ConnectorArguments arguments) {
84+
public final void validate(@Nonnull ConnectorArguments arguments) {
8385
Preconditions.checkState(arguments.isAssessment(), "--assessment flag is required");
8486

8587
validateDateRange(arguments);

dumper/app/src/main/java/com/google/edwmigration/dumper/application/dumper/connector/snowflake/AbstractSnowflakeConnector.java

Lines changed: 11 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -101,9 +101,7 @@ public Handle open(@Nonnull ConnectorArguments arguments)
101101
}
102102

103103
@Override
104-
public void validate(ConnectorArguments arguments) {
105-
super.validate(arguments);
106-
104+
public final void validate(@Nonnull ConnectorArguments arguments) {
107105
ArrayList<String> messages = new ArrayList<>();
108106
MetadataDumperUsageException exception = null;
109107

@@ -133,8 +131,18 @@ public void validate(ConnectorArguments arguments) {
133131
exception = new MetadataDumperUsageException(unsupportedFilter, messages);
134132
}
135133
removeDuplicateMessageAndThrow(exception);
134+
validateForConnector(arguments);
136135
}
137136

137+
/**
138+
* Called by {@link #validate} to perform connector-specific checks.
139+
*
140+
* <p>Subclasses should override this with logic to run after the common validation for Snowflake.
141+
*
142+
* @param arguments User-provided arguments of the Dumper run.
143+
*/
144+
protected abstract void validateForConnector(@Nonnull ConnectorArguments arguments);
145+
138146
private static void removeDuplicateMessageAndThrow(
139147
@Nullable MetadataDumperUsageException exception) {
140148
if (exception != null) {

dumper/app/src/main/java/com/google/edwmigration/dumper/application/dumper/connector/snowflake/SnowflakeLiteConnector.java

Lines changed: 1 addition & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -20,15 +20,12 @@
2020
import com.google.edwmigration.dumper.application.dumper.ConnectorArguments;
2121
import com.google.edwmigration.dumper.application.dumper.MetadataDumperUsageException;
2222
import com.google.edwmigration.dumper.application.dumper.connector.Connector;
23-
import com.google.edwmigration.dumper.application.dumper.handle.Handle;
2423
import com.google.edwmigration.dumper.application.dumper.task.DumpMetadataTask;
2524
import com.google.edwmigration.dumper.application.dumper.task.FormatTask;
2625
import com.google.edwmigration.dumper.application.dumper.task.Task;
2726
import com.google.edwmigration.dumper.application.dumper.utils.ArchiveNameUtil;
28-
import java.sql.SQLException;
2927
import java.time.Clock;
3028
import java.util.List;
31-
import java.util.Objects;
3229
import javax.annotation.Nonnull;
3330
import javax.annotation.Nullable;
3431
import javax.annotation.ParametersAreNonnullByDefault;
@@ -46,13 +43,6 @@ public SnowflakeLiteConnector() {
4643
super(NAME);
4744
}
4845

49-
@Override
50-
@Nonnull
51-
public Handle open(ConnectorArguments arguments)
52-
throws MetadataDumperUsageException, SQLException {
53-
return super.open(arguments);
54-
}
55-
5646
@Override
5747
@Nonnull
5848
public String getDefaultFileName(boolean isAssessment, @Nullable Clock clock) {
@@ -73,10 +63,7 @@ public final void addTasksTo(List<? super Task<?>> out, ConnectorArguments argum
7363
}
7464

7565
@Override
76-
public final void validate(@Nullable ConnectorArguments arguments) {
77-
super.validate(arguments);
78-
79-
Objects.requireNonNull(arguments);
66+
protected void validateForConnector(ConnectorArguments arguments) {
8067
if (!arguments.isAssessment()) {
8168
throw noAssessmentException();
8269
}

dumper/app/src/main/java/com/google/edwmigration/dumper/application/dumper/connector/snowflake/SnowflakeLogsConnector.java

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -161,9 +161,7 @@ private TaskDescription(
161161
}
162162

163163
@Override
164-
public final void validate(ConnectorArguments arguments) {
165-
super.validate(arguments);
166-
164+
protected final void validateForConnector(@Nonnull ConnectorArguments arguments) {
167165
if (arguments.isAssessment() && arguments.hasQueryLogEarliestTimestamp()) {
168166
throw unsupportedOption(ConnectorArguments.OPT_QUERY_LOG_EARLIEST_TIMESTAMP);
169167
}

dumper/app/src/main/java/com/google/edwmigration/dumper/application/dumper/connector/snowflake/SnowflakeMetadataConnector.java

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -129,6 +129,9 @@ public Iterable<ConnectorProperty> getPropertyConstants() {
129129
return builder.build();
130130
}
131131

132+
@Override
133+
protected final void validateForConnector(@Nonnull ConnectorArguments arguments) {}
134+
132135
private void addSqlTasksWithInfoSchemaFallback(
133136
@Nonnull List<? super Task<?>> out,
134137
@Nonnull Class<? extends Enum<?>> header,

dumper/app/src/test/java/com/google/edwmigration/dumper/application/dumper/connector/ConnectorTest.java

Lines changed: 19 additions & 58 deletions
Original file line numberDiff line numberDiff line change
@@ -16,101 +16,62 @@
1616
*/
1717
package com.google.edwmigration.dumper.application.dumper.connector;
1818

19+
import static com.google.edwmigration.dumper.application.dumper.connector.Connector.validateDateRange;
1920
import static org.junit.Assert.assertEquals;
2021
import static org.junit.Assert.assertThrows;
2122

2223
import com.google.edwmigration.dumper.application.dumper.ConnectorArguments;
23-
import com.google.edwmigration.dumper.application.dumper.handle.Handle;
24-
import com.google.edwmigration.dumper.application.dumper.task.Task;
25-
import java.time.Clock;
26-
import java.util.List;
27-
import javax.annotation.Nonnull;
2824
import org.junit.Test;
2925

3026
public class ConnectorTest {
31-
private final Connector connector = new EmptyConnector();
3227

3328
@Test
3429
public void validateDateRange_startDateAndEndDate_success() throws Exception {
35-
String argsStr = "--connector test --start-date=2001-02-20 --end-date=2001-02-25";
30+
ConnectorArguments args =
31+
new ConnectorArguments(
32+
"--connector", "test", "--start-date=2001-02-20", "--end-date=2001-02-25");
3633

3734
// Act
38-
connector.validateDateRange(toArgs(argsStr));
35+
validateDateRange(args);
3936
}
4037

4138
@Test
42-
public void validateDateRange_startDateAfterEndDate_throws() {
43-
String argsStr = "--connector test --start-date=2001-02-20 --end-date=2001-02-20";
39+
public void validateDateRange_startDateAfterEndDate_throws() throws Exception {
40+
ConnectorArguments args =
41+
new ConnectorArguments(
42+
"--connector", "test", "--start-date=2001-02-20", "--end-date=2001-02-20");
4443

4544
Exception exception =
46-
assertThrows(
47-
IllegalStateException.class, () -> connector.validateDateRange(toArgs(argsStr)));
45+
assertThrows(RuntimeException.class, () -> Connector.validateDateRange(args));
4846
assertEquals(
4947
"Start date [2001-02-20T00:00Z] must be before end date [2001-02-20T00:00Z].",
5048
exception.getMessage());
5149
}
5250

5351
@Test
54-
public void validateDateRange_endDateAlone_throws() {
55-
String argsStr = "--connector test --end-date=2001-02-20";
52+
public void validateDateRange_endDateAlone_throws() throws Exception {
53+
ConnectorArguments args =
54+
new ConnectorArguments("--connector", "test", "--end-date=2001-02-20");
5655

57-
Exception exception =
58-
assertThrows(
59-
IllegalStateException.class, () -> connector.validateDateRange(toArgs(argsStr)));
56+
Exception exception = assertThrows(RuntimeException.class, () -> validateDateRange(args));
6057
assertEquals(
6158
"End date can be specified only with start date, but start date was null.",
6259
exception.getMessage());
6360
}
6461

6562
@Test
66-
public void validateDateRange_startDateAlone_throws() {
67-
String argsStr = "--connector test --start-date=2001-02-20";
63+
public void validateDateRange_startDateAlone_throws() throws Exception {
64+
ConnectorArguments args =
65+
new ConnectorArguments("--connector", "test", "--start-date=2001-02-20");
6866

69-
Exception exception =
70-
assertThrows(RuntimeException.class, () -> connector.validateDateRange(toArgs(argsStr)));
67+
Exception exception = assertThrows(RuntimeException.class, () -> validateDateRange(args));
7168
assertEquals(
7269
"End date must be specified with start date, but was null.", exception.getMessage());
7370
}
7471

7572
@Test
7673
public void validateDateRange_requiredArgs_success() throws Exception {
7774
// Act
78-
connector.validateDateRange(toArgs("--connector test"));
79-
}
80-
81-
private static class EmptyConnector implements Connector {
82-
83-
@Nonnull
84-
@Override
85-
public String getName() {
86-
return null;
87-
}
88-
89-
@Nonnull
90-
@Override
91-
public String getDefaultFileName(boolean isAssessment, Clock clock) {
92-
return null;
93-
}
94-
95-
@Override
96-
public void addTasksTo(
97-
@Nonnull List<? super Task<?>> out, @Nonnull ConnectorArguments arguments)
98-
throws Exception {}
99-
100-
@Nonnull
101-
@Override
102-
public Handle open(@Nonnull ConnectorArguments arguments) throws Exception {
103-
return null;
104-
}
105-
106-
@Nonnull
107-
@Override
108-
public Iterable<ConnectorProperty> getPropertyConstants() {
109-
return null;
110-
}
111-
}
112-
113-
private static ConnectorArguments toArgs(String args) throws Exception {
114-
return new ConnectorArguments(args.split(" "));
75+
validateDateRange(new ConnectorArguments("--connector", "test"));
11576
}
11677
}

0 commit comments

Comments
 (0)