Skip to content

Commit

Permalink
[FEATURE] Enable Generic HTTP Actions in Java Client
Browse files Browse the repository at this point in the history
Signed-off-by: Andriy Redko <[email protected]>
Signed-off-by: Andriy Redko <[email protected]>
Signed-off-by: Andriy Redko <[email protected]>
  • Loading branch information
reta committed Apr 1, 2024
1 parent 3a14bdc commit e42154e
Show file tree
Hide file tree
Showing 14 changed files with 682 additions and 16 deletions.
1 change: 1 addition & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -34,6 +34,7 @@ This section is for maintaining a changelog for all breaking changes for the cli
## [Unreleased 2.x]

### Added
- [FEATURE] Enable Generic HTTP Actions in Java Client ([#910](https://github.com/opensearch-project/opensearch-java/pull/910))

### Dependencies
- Bumps `io.github.classgraph:classgraph` from 4.8.161 to 4.8.165
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -123,6 +123,7 @@
import org.opensearch.client.opensearch.core.pit.ListAllPitResponse;
import org.opensearch.client.opensearch.dangling_indices.OpenSearchDanglingIndicesClient;
import org.opensearch.client.opensearch.features.OpenSearchFeaturesClient;
import org.opensearch.client.opensearch.generic.OpenSearchGenericClient;
import org.opensearch.client.opensearch.indices.OpenSearchIndicesClient;
import org.opensearch.client.opensearch.ingest.OpenSearchIngestClient;
import org.opensearch.client.opensearch.nodes.OpenSearchNodesClient;
Expand Down Expand Up @@ -155,6 +156,9 @@ public OpenSearchClient withTransportOptions(@Nullable TransportOptions transpor
}

// ----- Child clients
public OpenSearchGenericClient generic() {
return new OpenSearchGenericClient(this.transport, this.transportOptions);
}

public OpenSearchCatClient cat() {
return new OpenSearchCatClient(this.transport, this.transportOptions);
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,45 @@
/*
* SPDX-License-Identifier: Apache-2.0
*
* The OpenSearch Contributors require contributions made to
* this file be licensed under the Apache-2.0 license or a
* compatible open source license.
*/

package org.opensearch.client.opensearch.generic;

import jakarta.json.stream.JsonGenerator;
import jakarta.json.stream.JsonParser;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import org.opensearch.client.ApiClient;
import org.opensearch.client.json.JsonpMapper;

public final class GenericBodies {
private static final String APPLICATION_JSON = "application/json; charset=UTF-8";

private GenericBodies() {}

public static <C> C json(GenericBody body, Class<C> clazz, ApiClient<?, ?> client) {
return json(body, clazz, client._transport().jsonpMapper());
}

public static <C> GenericBody json(C value, ApiClient<?, ?> client) throws IOException {
return json(value, client._transport().jsonpMapper());
}

public static <C> C json(GenericBody body, Class<C> clazz, JsonpMapper jsonpMapper) {
try (JsonParser parser = jsonpMapper.jsonProvider().createParser(body.body())) {
return jsonpMapper.deserialize(parser, clazz);
}
}

public static <C> GenericBody json(C value, JsonpMapper jsonpMapper) throws IOException {
try (ByteArrayOutputStream baos = new ByteArrayOutputStream()) {
try (JsonGenerator generator = jsonpMapper.jsonProvider().createGenerator(baos)) {
jsonpMapper.serialize(value, generator);
return GenericBody.from(baos.toByteArray(), APPLICATION_JSON);
}
}
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,64 @@
/*
* SPDX-License-Identifier: Apache-2.0
*
* The OpenSearch Contributors require contributions made to
* this file be licensed under the Apache-2.0 license or a
* compatible open source license.
*/

package org.opensearch.client.opensearch.generic;

import java.io.IOException;
import java.io.InputStream;
import javax.annotation.Nullable;

/**
* Generic HTTP request / response body. It is responsibility of the caller to close the body instance
* explicitly (or through {@link GenericResponse} instance) to release all associated streams.
*/
public interface GenericBody extends AutoCloseable {
/**
* Constructs the generic response body out of {@link InputStream} with assumed content type
* @param body response body stream
* @param contentType content type
* @return generic response body instance
*/
static @Nullable GenericBody from(@Nullable final InputStream body, @Nullable final String contentType) {
if (body == null) {
return null;
} else {
return new GenericInputStreamBody(body, contentType);
}
}

/**
* Constructs the generic response body out of {@link InputStream} with assumed content type
* @param body response body stream
* @param contentType content type
* @return generic response body instance
*/
static @Nullable GenericBody from(@Nullable final byte[] body, @Nullable final String contentType) {
if (body == null) {
return null;
} else {
return new GenericByteArrayBody(body, contentType);
}
}

/**
* Content type of this body
* @return content type
*/
String contentType();

/**
* Gets the body as {@link InputStream}
* @return
*/
InputStream body();

/**
* Releases all resources associated with this body stream.
*/
void close() throws IOException;
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,42 @@
/*
* SPDX-License-Identifier: Apache-2.0
*
* The OpenSearch Contributors require contributions made to
* this file be licensed under the Apache-2.0 license or a
* compatible open source license.
*/

package org.opensearch.client.opensearch.generic;

import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.io.InputStream;
import javax.annotation.Nullable;

/**
* The HTTP request / response body that uses {@link byte[]}
*/
class GenericByteArrayBody implements GenericBody {
private final InputStream in;
private final String contentType;

GenericByteArrayBody(final byte[] bytes, @Nullable final String contentType) {
this.in = new ByteArrayInputStream(bytes);
this.contentType = contentType;
}

@Override
public String contentType() {
return contentType;
}

@Override
public InputStream body() {
return in;
}

@Override
public void close() throws IOException {
in.close();
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,54 @@
/*
* SPDX-License-Identifier: Apache-2.0
*
* The OpenSearch Contributors require contributions made to
* this file be licensed under the Apache-2.0 license or a
* compatible open source license.
*/

package org.opensearch.client.opensearch.generic;

import java.io.InputStream;
import java.util.List;
import java.util.Map.Entry;
import org.opensearch.client.transport.RawEndpoint;

/**
* Generic endpoint instance
*/
class GenericEndpoint implements RawEndpoint<GenericRequest, GenericResponse> {
private final GenericRequest request;

public GenericEndpoint(GenericRequest request) {
this.request = request;
}

@Override
public String method(GenericRequest request) {
return request.getMethod();
}

@Override
public String requestUrl(GenericRequest request) {
return request.getEndpoint();
}

@Override
public boolean hasRequestBody() {
return request.getBody().isPresent();
}

@Override
public GenericResponse responseDeserializer(
String uri,
String method,
String protocol,
int status,
String reason,
List<Entry<String, String>> headers,
String contentType,
InputStream body
) {
return new GenericResponse(uri, protocol, method, status, reason, headers, GenericBody.from(body, contentType));
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,41 @@
/*
* SPDX-License-Identifier: Apache-2.0
*
* The OpenSearch Contributors require contributions made to
* this file be licensed under the Apache-2.0 license or a
* compatible open source license.
*/

package org.opensearch.client.opensearch.generic;

import java.io.IOException;
import java.io.InputStream;
import javax.annotation.Nullable;

/**
* The HTTP request / response body that uses {@link InputStream}
*/
class GenericInputStreamBody implements GenericBody {
private final InputStream in;
private final String contentType;

GenericInputStreamBody(final InputStream in, @Nullable final String contentType) {
this.in = in;
this.contentType = contentType;
}

@Override
public String contentType() {
return contentType;
}

@Override
public InputStream body() {
return in;
}

@Override
public void close() throws IOException {
in.close();
}
}
Loading

0 comments on commit e42154e

Please sign in to comment.