Skip to content

Commit 792d877

Browse files
committed
start code cleanup
1 parent 8610d6f commit 792d877

33 files changed

+294
-124
lines changed

src/main/java/org/sourcelab/kafka/connect/apiclient/ApiClient.java

Lines changed: 58 additions & 40 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
import org.sourcelab.kafka.connect.apiclient.request.Request;
77
import org.sourcelab.kafka.connect.apiclient.request.RequestErrorResponse;
88
import org.sourcelab.kafka.connect.apiclient.request.delete.DeleteConnector;
9+
import org.sourcelab.kafka.connect.apiclient.request.dto.ConnectorDefinition;
910
import org.sourcelab.kafka.connect.apiclient.request.dto.ConnectorPlugin;
1011
import org.sourcelab.kafka.connect.apiclient.request.dto.ConnectorPluginConfigDefinition;
1112
import org.sourcelab.kafka.connect.apiclient.request.dto.ConnectorPluginConfigValidationResults;
@@ -20,7 +21,6 @@
2021
import org.sourcelab.kafka.connect.apiclient.request.get.GetConnectorTaskStatus;
2122
import org.sourcelab.kafka.connect.apiclient.request.get.GetConnectorTasks;
2223
import org.sourcelab.kafka.connect.apiclient.request.get.GetConnectors;
23-
import org.sourcelab.kafka.connect.apiclient.request.dto.ConnectorDefinition;
2424
import org.sourcelab.kafka.connect.apiclient.request.post.PostConnector;
2525
import org.sourcelab.kafka.connect.apiclient.request.post.PostConnectorRestart;
2626
import org.sourcelab.kafka.connect.apiclient.request.post.PostConnectorTaskRestart;
@@ -37,6 +37,11 @@
3737
import java.util.Collection;
3838
import java.util.Map;
3939

40+
/**
41+
* API Client for interacting with the Kafka-Connect Rest Endpoint.
42+
* Official Rest Endpoint documentation can be found here:
43+
* https://docs.confluent.io/current/connect/restapi.html
44+
*/
4045
public class ApiClient {
4146
private static final Logger logger = LoggerFactory.getLogger(ApiClient.class);
4247

@@ -76,49 +81,32 @@ public ApiClient(final Configuration configuration, final RestClient restClient)
7681
this.restClient = restClient;
7782
}
7883

79-
private <T> T submitRequest(final Request<T> request) {
80-
// Submit request
81-
final RestResponse restResponse = getRestClient().submitRequest(request);
82-
final int responseCode = restResponse.getHttpCode();
83-
String responseStr = restResponse.getResponseStr();
84-
85-
// If we have a valid response
86-
logger.info("Response: {}", restResponse);
87-
88-
// Check for invalid http status codes
89-
if (responseCode >= 200 && responseCode < 300) {
90-
// These response codes have no values
91-
if ((responseCode == 204 || responseCode == 205) && responseStr == null) {
92-
// Avoid NPE
93-
responseStr = "";
94-
}
95-
96-
try {
97-
return request.parseResponse(responseStr);
98-
} catch (final IOException exception) {
99-
throw new RuntimeException(exception.getMessage(), exception);
100-
}
101-
}
102-
103-
// Attempt to parse error response
104-
try {
105-
final RequestErrorResponse errorResponse = JacksonFactory.newInstance().readValue(responseStr, RequestErrorResponse.class);
106-
throw new InvalidRequestException(errorResponse.getMessage(), errorResponse.getErrorCode());
107-
} catch (IOException e) {
108-
// swallow
109-
}
110-
throw new InvalidRequestException("Invalid response from server: " + responseStr, restResponse.getHttpCode());
111-
112-
}
113-
84+
/**
85+
* Get a list of active connectors.
86+
* https://docs.confluent.io/current/connect/restapi.html#get--connectors
87+
*
88+
* @return Collection of connector names currently deployed.
89+
*/
11490
public Collection<String> getConnectors() {
11591
return submitRequest(new GetConnectors());
11692
}
11793

94+
/**
95+
* Get information about the connector.
96+
* https://docs.confluent.io/current/connect/restapi.html#get--connectors-(string-name)
97+
* @param connectorName Name of connector.
98+
* @return Connector details.
99+
*/
118100
public ConnectorDefinition getConnector(final String connectorName) {
119101
return submitRequest(new GetConnector(connectorName));
120102
}
121103

104+
/**
105+
* Get the configuration for the connector.
106+
* https://docs.confluent.io/current/connect/restapi.html#get--connectors-(string-name)-config
107+
* @param connectorName Name of connector.
108+
* @return Configuration for connector.
109+
*/
122110
public Map<String, String> getConnectorConfig(final String connectorName) {
123111
return submitRequest(new GetConnectorConfig(connectorName));
124112
}
@@ -260,10 +248,40 @@ public ConnectorPluginConfigValidationResults validateConnectorPluginConfig(fina
260248
);
261249
}
262250

263-
/**
264-
* package protected for access in tests.
265-
* @return Rest Client.
266-
*/
251+
private <T> T submitRequest(final Request<T> request) {
252+
// Submit request
253+
final RestResponse restResponse = getRestClient().submitRequest(request);
254+
final int responseCode = restResponse.getHttpCode();
255+
String responseStr = restResponse.getResponseStr();
256+
257+
// If we have a valid response
258+
logger.info("Response: {}", restResponse);
259+
260+
// Check for invalid http status codes
261+
if (responseCode >= 200 && responseCode < 300) {
262+
// These response codes have no values
263+
if ((responseCode == 204 || responseCode == 205) && responseStr == null) {
264+
// Avoid NPE
265+
responseStr = "";
266+
}
267+
268+
try {
269+
return request.parseResponse(responseStr);
270+
} catch (final IOException exception) {
271+
throw new RuntimeException(exception.getMessage(), exception);
272+
}
273+
}
274+
275+
// Attempt to parse error response
276+
try {
277+
final RequestErrorResponse errorResponse = JacksonFactory.newInstance().readValue(responseStr, RequestErrorResponse.class);
278+
throw new InvalidRequestException(errorResponse.getMessage(), errorResponse.getErrorCode());
279+
} catch (IOException e) {
280+
// swallow
281+
}
282+
throw new InvalidRequestException("Invalid response from server: " + responseStr, restResponse.getHttpCode());
283+
}
284+
267285
private RestClient getRestClient() {
268286
// If we haven't initialized.
269287
if (!isInitialized) {

src/main/java/org/sourcelab/kafka/connect/apiclient/request/JacksonFactory.java

Lines changed: 1 addition & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -3,16 +3,11 @@
33
import com.fasterxml.jackson.databind.DeserializationFeature;
44
import com.fasterxml.jackson.databind.ObjectMapper;
55
import com.fasterxml.jackson.databind.PropertyNamingStrategy;
6-
import com.fasterxml.jackson.dataformat.xml.JacksonXmlModule;
7-
import com.fasterxml.jackson.dataformat.xml.XmlMapper;
8-
import com.fasterxml.jackson.datatype.joda.JodaModule;
9-
10-
import java.text.SimpleDateFormat;
116

127
/**
138
* Creates properly configured Jackson XML Mapper instances.
149
*/
15-
public class JacksonFactory {
10+
public final class JacksonFactory {
1611

1712
/**
1813
* Holds our jackson singleton mapper. ObjectMapper is defined as being

src/main/java/org/sourcelab/kafka/connect/apiclient/request/Request.java

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,10 @@
11
package org.sourcelab.kafka.connect.apiclient.request;
22

33
import java.io.IOException;
4-
import java.util.Collection;
5-
import java.util.Map;
64

75
/**
86
* Interface for all Requests to implement.
7+
* @param <T> return type of request.
98
*/
109
public interface Request<T> {
1110

@@ -24,5 +23,11 @@ public interface Request<T> {
2423
*/
2524
Object getRequestBody();
2625

26+
/**
27+
* Parse the rest service's response into a concrete object.
28+
* @param responseStr The servers response in string format.
29+
* @return A concrete object representing the result.
30+
* @throws IOException on parsing errors.
31+
*/
2732
T parseResponse(final String responseStr) throws IOException;
2833
}

src/main/java/org/sourcelab/kafka/connect/apiclient/request/RequestErrorResponse.java

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,10 @@
11
package org.sourcelab.kafka.connect.apiclient.request;
22

3-
public class RequestErrorResponse {
4-
private int errorCode;
3+
/**
4+
* Represents an error response from the rest service.
5+
*/
6+
public final class RequestErrorResponse {
7+
private int errorCode = 0;
58
private String message;
69

710
public int getErrorCode() {

src/main/java/org/sourcelab/kafka/connect/apiclient/request/RequestMethod.java

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,8 @@
11
package org.sourcelab.kafka.connect.apiclient.request;
22

3+
/**
4+
* Represents the possible request types.
5+
*/
36
public enum RequestMethod {
47
DELETE,
58
GET,

src/main/java/org/sourcelab/kafka/connect/apiclient/request/delete/DeleteConnector.java

Lines changed: 15 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,20 +1,29 @@
11
package org.sourcelab.kafka.connect.apiclient.request.delete;
22

33
import com.sun.xml.internal.rngom.util.Uri;
4-
import org.sourcelab.kafka.connect.apiclient.request.delete.DeleteRequest;
54

65
import java.io.IOException;
76

8-
public class DeleteConnector implements DeleteRequest<Boolean> {
9-
private final String name;
7+
/**
8+
* Defines a request to delete a connector.
9+
*/
10+
public final class DeleteConnector implements DeleteRequest<Boolean> {
11+
private final String connectorName;
1012

11-
public DeleteConnector(final String name) {
12-
this.name = name;
13+
/**
14+
* Constructor.
15+
* @param connectorName Name of the connector.
16+
*/
17+
public DeleteConnector(final String connectorName) {
18+
if (connectorName == null) {
19+
throw new NullPointerException("connectorName parameter may not be null!");
20+
}
21+
this.connectorName = connectorName;
1322
}
1423

1524
@Override
1625
public String getApiEndpoint() {
17-
return "/connectors/" + Uri.escapeDisallowedChars(name);
26+
return "/connectors/" + Uri.escapeDisallowedChars(connectorName);
1827
}
1928

2029
@Override

src/main/java/org/sourcelab/kafka/connect/apiclient/request/delete/DeleteRequest.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,10 @@
33
import org.sourcelab.kafka.connect.apiclient.request.Request;
44
import org.sourcelab.kafka.connect.apiclient.request.RequestMethod;
55

6+
/**
7+
* Defines interface for DELETE requests.
8+
* @param <T> Defines the return type of the request.
9+
*/
610
public interface DeleteRequest<T> extends Request<T> {
711
@Override
812
default RequestMethod getRequestMethod() {

src/main/java/org/sourcelab/kafka/connect/apiclient/request/dto/ConnectorDefinition.java

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,10 @@
33
import java.util.List;
44
import java.util.Map;
55

6-
public class ConnectorDefinition {
6+
/**
7+
* Represents a Connector.
8+
*/
9+
public final class ConnectorDefinition {
710
private String name;
811
private String type;
912
private Map<String, String> config;
@@ -35,7 +38,10 @@ public String toString() {
3538
+ '}';
3639
}
3740

38-
private static class TaskDefinition {
41+
/**
42+
* Represents a Task.
43+
*/
44+
private static final class TaskDefinition {
3945
private String connector;
4046
private int task;
4147

src/main/java/org/sourcelab/kafka/connect/apiclient/request/dto/ConnectorPlugin.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55
/**
66
* Represents details about a Connector Plugin.
77
*/
8-
public class ConnectorPlugin {
8+
public final class ConnectorPlugin {
99
@JsonAlias("class")
1010
private String className;
1111
private String type;

src/main/java/org/sourcelab/kafka/connect/apiclient/request/dto/ConnectorPluginConfigDefinition.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77
/**
88
* Defines a Connector Plugin Configuration.
99
*/
10-
public class ConnectorPluginConfigDefinition {
10+
public final class ConnectorPluginConfigDefinition {
1111
private final String name;
1212
private final Map<String, String> config;
1313

0 commit comments

Comments
 (0)