Skip to content

Commit ca68223

Browse files
committed
Move description logic from Arguments to Connector
1 parent 5def440 commit ca68223

File tree

3 files changed

+63
-48
lines changed

3 files changed

+63
-48
lines changed

dumper/app/src/main/java/com/google/edwmigration/dumper/application/dumper/ConnectorArguments.java

Lines changed: 5 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,6 @@
3030
import com.google.common.base.Strings;
3131
import com.google.common.collect.ImmutableList;
3232
import com.google.edwmigration.dumper.application.dumper.ZonedParser.DayOffset;
33-
import com.google.edwmigration.dumper.application.dumper.annotations.RespectsInput;
3433
import com.google.edwmigration.dumper.application.dumper.connector.Connector;
3534
import com.google.edwmigration.dumper.application.dumper.connector.ConnectorProperty;
3635
import com.google.edwmigration.dumper.application.dumper.connector.ConnectorPropertyWithDefault;
@@ -42,17 +41,11 @@
4241
import java.time.ZoneOffset;
4342
import java.time.ZonedDateTime;
4443
import java.time.temporal.ChronoUnit;
45-
import java.util.ArrayList;
4644
import java.util.Arrays;
47-
import java.util.Collection;
48-
import java.util.Collections;
4945
import java.util.Date;
50-
import java.util.HashMap;
5146
import java.util.HashSet;
5247
import java.util.List;
53-
import java.util.Map;
5448
import java.util.Optional;
55-
import java.util.Set;
5649
import java.util.function.Predicate;
5750
import java.util.stream.Collectors;
5851
import javax.annotation.CheckForNull;
@@ -62,7 +55,6 @@
6255
import joptsimple.OptionSpec;
6356
import org.apache.commons.lang3.BooleanUtils;
6457
import org.apache.commons.lang3.StringUtils;
65-
import org.springframework.core.annotation.AnnotationUtils;
6658

6759
/** @author shevek */
6860
public class ConnectorArguments extends DefaultArguments {
@@ -596,57 +588,31 @@ public ConnectorArguments(@Nonnull String... args) throws IOException {
596588
super(args);
597589
}
598590

599-
@Nonnull
600-
private static Collection<InputDescriptor> getAcceptsInputs(@Nonnull Connector connector) {
601-
Map<String, InputDescriptor> tmp = new HashMap<>();
602-
Class<?> connectorType = connector.getClass();
603-
while (connectorType != null) {
604-
Set<RespectsInput> respectsInputs =
605-
AnnotationUtils.getDeclaredRepeatableAnnotations(connectorType, RespectsInput.class);
606-
for (RespectsInput respectsInput : respectsInputs) {
607-
InputDescriptor descriptor = new InputDescriptor(respectsInput);
608-
tmp.putIfAbsent(descriptor.getKey(), descriptor);
609-
}
610-
connectorType = connectorType.getSuperclass();
611-
}
612-
613-
List<InputDescriptor> out = new ArrayList<>(tmp.values());
614-
Collections.sort(out);
615-
return out;
616-
}
617-
618591
@Override
619592
protected void printHelpOn(@Nonnull PrintStream out, OptionSet o) throws IOException {
620593
out.append(HELP_INFO);
621594
super.printHelpOn(out, o);
622595

596+
ConnectorRepository repository = ConnectorRepository.getInstance();
623597
// if --connector <valid-connection> provided, print only that
624598
if (o.has(connectorNameOption)) {
625599
String helpOnConnector = o.valueOf(connectorNameOption);
626-
Connector connector = ConnectorRepository.getInstance().getByName(helpOnConnector);
600+
Connector connector = repository.getByName(helpOnConnector);
627601
if (connector != null) {
628602
out.append("\nSelected connector:\n");
629603
printConnectorHelp(out, connector);
630604
return;
631605
}
632606
}
633607
out.append("\nAvailable connectors:\n");
634-
for (Connector connector : ConnectorRepository.getInstance().getAllConnectors()) {
608+
for (Connector connector : repository.getAllConnectors()) {
635609
printConnectorHelp(out, connector);
636610
}
637611
}
638612

639-
private void printConnectorHelp(@Nonnull Appendable out, @Nonnull Connector connector)
613+
private static void printConnectorHelp(@Nonnull Appendable out, @Nonnull Connector connector)
640614
throws IOException {
641-
out.append("* " + connector.getName());
642-
String description = connector.getDescription();
643-
if (!description.isEmpty()) {
644-
out.append(" - " + description);
645-
}
646-
out.append("\n");
647-
for (InputDescriptor descriptor : getAcceptsInputs(connector)) {
648-
out.append(String.format("%8s%s\n", "", descriptor));
649-
}
615+
connector.printHelp(out);
650616
ConnectorProperties.printHelp(out, connector);
651617
}
652618

dumper/app/src/main/java/com/google/edwmigration/dumper/application/dumper/InputDescriptor.java

Lines changed: 12 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -17,14 +17,15 @@
1717
package com.google.edwmigration.dumper.application.dumper;
1818

1919
import static com.google.common.base.Strings.isNullOrEmpty;
20+
import static java.util.Comparator.comparing;
2021
import static java.util.stream.Collectors.joining;
2122

2223
import com.google.edwmigration.dumper.application.dumper.annotations.RespectsInput;
2324
import java.util.ArrayList;
2425
import java.util.Comparator;
2526
import javax.annotation.Nonnull;
2627

27-
final class InputDescriptor implements Comparable<InputDescriptor> {
28+
public final class InputDescriptor {
2829
private enum Category {
2930
ARGUMENT(1) {
3031
@Override
@@ -56,7 +57,7 @@ String getKey(@Nonnull RespectsInput annotation) {
5657

5758
private final RespectsInput annotation;
5859

59-
InputDescriptor(RespectsInput annotation) {
60+
public InputDescriptor(RespectsInput annotation) {
6061
this.annotation = annotation;
6162
}
6263

@@ -71,11 +72,9 @@ private Category getCategory() {
7172
return Category.OTHER;
7273
}
7374

74-
@Override
75-
public int compareTo(InputDescriptor o) {
76-
return Comparator.comparing(InputDescriptor::order)
77-
.thenComparing(el -> el.annotation.order())
78-
.compare(this, o);
75+
public static Comparator<InputDescriptor> comparator() {
76+
return comparing(InputDescriptor::categoryOrder)
77+
.thenComparing(InputDescriptor::annotationOrder);
7978
}
8079

8180
@Override
@@ -92,7 +91,7 @@ public String toString() {
9291
return buf.stream().filter(el -> !el.isEmpty()).collect(joining(" "));
9392
}
9493

95-
String getKey() {
94+
public String getKey() {
9695
return getCategory().getKey(annotation);
9796
}
9897

@@ -112,7 +111,11 @@ private String requiredHint(String value) {
112111
}
113112
}
114113

115-
private int order() {
114+
private int annotationOrder() {
115+
return annotation.order();
116+
}
117+
118+
private int categoryOrder() {
116119
return getCategory().order;
117120
}
118121
}

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

Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,13 +16,24 @@
1616
*/
1717
package com.google.edwmigration.dumper.application.dumper.connector;
1818

19+
import static org.springframework.core.annotation.AnnotationUtils.getDeclaredRepeatableAnnotations;
20+
21+
import autovalue.shaded.com.google.common.collect.ImmutableList;
1922
import com.google.common.base.Preconditions;
2023
import com.google.edwmigration.dumper.application.dumper.ConnectorArguments;
24+
import com.google.edwmigration.dumper.application.dumper.InputDescriptor;
25+
import com.google.edwmigration.dumper.application.dumper.annotations.RespectsInput;
2126
import com.google.edwmigration.dumper.application.dumper.handle.Handle;
2227
import com.google.edwmigration.dumper.application.dumper.task.Task;
28+
import java.io.IOException;
2329
import java.time.Clock;
2430
import java.time.ZonedDateTime;
31+
import java.util.ArrayList;
32+
import java.util.Collection;
33+
import java.util.HashMap;
2534
import java.util.List;
35+
import java.util.Map;
36+
import java.util.Set;
2637
import javax.annotation.Nonnull;
2738

2839
/** @author shevek */
@@ -79,4 +90,39 @@ void addTasksTo(@Nonnull List<? super Task<?>> out, @Nonnull ConnectorArguments
7990

8091
@Nonnull
8192
Iterable<ConnectorProperty> getPropertyConstants();
93+
94+
default void printHelp(@Nonnull Appendable out) throws IOException {
95+
out.append("* " + getName());
96+
String description = getDescription();
97+
if (!description.isEmpty()) {
98+
out.append(" - " + description);
99+
}
100+
out.append("\n");
101+
for (InputDescriptor descriptor : getAcceptsInputs(this)) {
102+
out.append(String.format("%8s%s\n", "", descriptor));
103+
}
104+
}
105+
106+
@Nonnull
107+
static Collection<InputDescriptor> getAcceptsInputs(@Nonnull Connector connector) {
108+
109+
ArrayList<Class<?>> classes = new ArrayList<>();
110+
for (Class<?> type = connector.getClass(); type != null; type = type.getSuperclass()) {
111+
classes.add(type);
112+
}
113+
114+
Map<String, InputDescriptor> map = new HashMap<>();
115+
for (Class<?> type : classes) {
116+
Set<RespectsInput> respectsInputs =
117+
getDeclaredRepeatableAnnotations(type, RespectsInput.class);
118+
for (RespectsInput item : respectsInputs) {
119+
InputDescriptor descriptor = new InputDescriptor(item);
120+
map.putIfAbsent(descriptor.getKey(), descriptor);
121+
}
122+
}
123+
124+
return map.values().stream()
125+
.sorted(InputDescriptor.comparator())
126+
.collect(ImmutableList.toImmutableList());
127+
}
82128
}

0 commit comments

Comments
 (0)