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

Enable to use AsyncInvoker in Rx client #4283

Merged
merged 1 commit into from
Oct 21, 2019
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
Original file line number Diff line number Diff line change
@@ -0,0 +1,111 @@
/*
* Copyright (c) 2019 Oracle and/or its affiliates. All rights reserved.
*
* This program and the accompanying materials are made available under the
* terms of the Eclipse Public License v. 2.0, which is available at
* http://www.eclipse.org/legal/epl-2.0.
*
* This Source Code may also be made available under the following Secondary
* Licenses when the conditions for such availability set forth in the
* Eclipse Public License v. 2.0 are satisfied: GNU General Public License,
* version 2 with the GNU Classpath Exception, which is available at
* https://www.gnu.org/software/classpath/license.html.
*
* SPDX-License-Identifier: EPL-2.0 OR GPL-2.0 WITH Classpath-exception-2.0
*/

package org.glassfish.jersey.client;

import javax.ws.rs.client.Entity;
import javax.ws.rs.core.GenericType;

/* package */ abstract class AbstractNonSyncInvoker<T> {

public T get() {
return method("GET");
}

public <R> T get(final Class<R> responseType) {
return method("GET", responseType);
}

public <R> T get(final GenericType<R> responseType) {
return method("GET", responseType);
}

public T put(final Entity<?> entity) {
return method("PUT", entity);
}

public <R> T put(final Entity<?> entity, final Class<R> clazz) {
return method("PUT", entity, clazz);
}

public <R> T put(final Entity<?> entity, final GenericType<R> type) {
return method("PUT", entity, type);
}

public T post(final Entity<?> entity) {
return method("POST", entity);
}

public <R> T post(final Entity<?> entity, final Class<R> clazz) {
return method("POST", entity, clazz);
}

public <R> T post(final Entity<?> entity, final GenericType<R> type) {
return method("POST", entity, type);
}

public T delete() {
return method("DELETE");
}

public <R> T delete(final Class<R> responseType) {
return method("DELETE", responseType);
}

public <R> T delete(final GenericType<R> responseType) {
return method("DELETE", responseType);
}

public T head() {
return method("HEAD");
}

public T options() {
return method("OPTIONS");
}

public <R> T options(final Class<R> responseType) {
return method("OPTIONS", responseType);
}

public <R> T options(final GenericType<R> responseType) {
return method("OPTIONS", responseType);
}

public T trace() {
return method("TRACE");
}

public <R> T trace(final Class<R> responseType) {
return method("TRACE", responseType);
}

public <R> T trace(final GenericType<R> responseType) {
return method("TRACE", responseType);
}

public abstract T method(final String name);

public abstract <R> T method(final String name, final Class<R> responseType);

public abstract <R> T method(final String name, final GenericType<R> responseType);

public abstract T method(final String name, final Entity<?> entity);

public abstract <R> T method(final String name, final Entity<?> entity, final Class<R> responseType);

public abstract <R> T method(final String name, final Entity<?> entity, final GenericType<R> responseType);
}
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
/*
* Copyright (c) 2017, 2018 Oracle and/or its affiliates. All rights reserved.
* Copyright (c) 2017, 2019 Oracle and/or its affiliates. All rights reserved.
*
* This program and the accompanying materials are made available under the
* terms of the Eclipse Public License v. 2.0, which is available at
Expand All @@ -16,6 +16,8 @@

package org.glassfish.jersey.client;

import org.glassfish.jersey.client.internal.LocalizationMessages;

import java.util.concurrent.ExecutorService;

import javax.ws.rs.client.Entity;
Expand All @@ -25,7 +27,7 @@
import javax.ws.rs.core.Response;

/**
* Default implementation of {@link javax.ws.rs.client.rx.RxInvoker reactive invoker}. Extensions of this class are
* Default implementation of {@link javax.ws.rs.client.RxInvoker reactive invoker}. Extensions of this class are
* supposed to implement {@link #method(String, Entity, Class)} and
* {@link #method(String, Entity, GenericType)} methods to which implementations of the rest
* of the methods from the contract delegate to.
Expand All @@ -35,16 +37,15 @@
* @author Michal Gajdos
* @since 2.26
*/
public abstract class AbstractRxInvoker<T> implements RxInvoker<T> {
public abstract class AbstractRxInvoker<T> extends AbstractNonSyncInvoker<T> implements RxInvoker<T> {

private final SyncInvoker syncInvoker;
private final ExecutorService executorService;
private final SyncInvoker syncInvoker;

public AbstractRxInvoker(final SyncInvoker syncInvoker, final ExecutorService executor) {
if (syncInvoker == null) {
throw new IllegalArgumentException("Invocation builder cannot be null.");
throw new IllegalArgumentException(LocalizationMessages.NULL_INVOCATION_BUILDER());
}

this.syncInvoker = syncInvoker;
this.executorService = executor;
}
Expand All @@ -67,101 +68,6 @@ protected ExecutorService getExecutorService() {
return executorService;
}

@Override
public T get() {
return method("GET");
}

@Override
public <R> T get(final Class<R> responseType) {
return method("GET", responseType);
}

@Override
public <R> T get(final GenericType<R> responseType) {
return method("GET", responseType);
}

@Override
public T put(final Entity<?> entity) {
return method("PUT", entity);
}

@Override
public <R> T put(final Entity<?> entity, final Class<R> clazz) {
return method("PUT", entity, clazz);
}

@Override
public <R> T put(final Entity<?> entity, final GenericType<R> type) {
return method("PUT", entity, type);
}

@Override
public T post(final Entity<?> entity) {
return method("POST", entity);
}

@Override
public <R> T post(final Entity<?> entity, final Class<R> clazz) {
return method("POST", entity, clazz);
}

@Override
public <R> T post(final Entity<?> entity, final GenericType<R> type) {
return method("POST", entity, type);
}

@Override
public T delete() {
return method("DELETE");
}

@Override
public <R> T delete(final Class<R> responseType) {
return method("DELETE", responseType);
}

@Override
public <R> T delete(final GenericType<R> responseType) {
return method("DELETE", responseType);
}

@Override
public T head() {
return method("HEAD");
}

@Override
public T options() {
return method("OPTIONS");
}

@Override
public <R> T options(final Class<R> responseType) {
return method("OPTIONS", responseType);
}

@Override
public <R> T options(final GenericType<R> responseType) {
return method("OPTIONS", responseType);
}

@Override
public T trace() {
return method("TRACE");
}

@Override
public <R> T trace(final Class<R> responseType) {
return method("TRACE", responseType);
}

@Override
public <R> T trace(final GenericType<R> responseType) {
return method("TRACE", responseType);
}

@Override
public T method(final String name) {
return method(name, Response.class);
Expand All @@ -181,4 +87,5 @@ public <R> T method(final String name, final GenericType<R> responseType) {
public T method(final String name, final Entity<?> entity) {
return method(name, entity, Response.class);
}

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,74 @@
/*
* Copyright (c) 2019 Oracle and/or its affiliates. All rights reserved.
*
* This program and the accompanying materials are made available under the
* terms of the Eclipse Public License v. 2.0, which is available at
* http://www.eclipse.org/legal/epl-2.0.
*
* This Source Code may also be made available under the following Secondary
* Licenses when the conditions for such availability set forth in the
* Eclipse Public License v. 2.0 are satisfied: GNU General Public License,
* version 2 with the GNU Classpath Exception, which is available at
* https://www.gnu.org/software/classpath/license.html.
*
* SPDX-License-Identifier: EPL-2.0 OR GPL-2.0 WITH Classpath-exception-2.0
*/

package org.glassfish.jersey.client;

import javax.ws.rs.client.AsyncInvoker;
import javax.ws.rs.client.Entity;
import javax.ws.rs.client.InvocationCallback;
import javax.ws.rs.core.GenericType;
import javax.ws.rs.core.Response;
import java.util.concurrent.CompletableFuture;

/*package*/ abstract class CompletableFutureAsyncInvoker
extends AbstractNonSyncInvoker<CompletableFuture> implements AsyncInvoker {
@Override
public <R> CompletableFuture<R> get(InvocationCallback<R> callback) {
return method("GET", callback);
}

@Override
public <R> CompletableFuture<R> put(Entity<?> entity, InvocationCallback<R> callback) {
return method("PUT", entity, callback);
}

@Override
public <R> CompletableFuture<R> post(Entity<?> entity, InvocationCallback<R> callback) {
return method("POST", entity, callback);
}

@Override
public <R> CompletableFuture<R> delete(InvocationCallback<R> callback) {
return method("DELETE", callback);
}

@Override
public CompletableFuture<Response> head(InvocationCallback<Response> callback) {
return method("HEAD", callback);
}

@Override
public <R> CompletableFuture<R> options(InvocationCallback<R> callback) {
return method("OPTIONS", callback);
}

@Override
public <R> CompletableFuture<R> trace(InvocationCallback<R> callback) {
return method("TRACE", callback);
}

@Override
public abstract <R> CompletableFuture<R> method(String name, InvocationCallback<R> callback);

@Override
public abstract <R> CompletableFuture<R> method(String name, Entity<?> entity, InvocationCallback<R> callback);

@Override
public abstract <R> CompletableFuture method(String name, Entity<?> entity, Class<R> responseType);

@Override
public abstract <R> CompletableFuture method(String name, Entity<?> entity, GenericType<R> responseType);
}
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
/*
* Copyright (c) 2017, 2018 Oracle and/or its affiliates. All rights reserved.
* Copyright (c) 2017, 2019 Oracle and/or its affiliates. All rights reserved.
*
* This program and the accompanying materials are made available under the
* terms of the Eclipse Public License v. 2.0, which is available at
Expand All @@ -16,42 +16,20 @@

package org.glassfish.jersey.client;

import java.util.concurrent.CompletableFuture;
import java.util.concurrent.CompletionStage;
import java.util.concurrent.ExecutorService;

import javax.ws.rs.client.CompletionStageRxInvoker;
import javax.ws.rs.client.Entity;
import javax.ws.rs.client.Invocation;
import javax.ws.rs.core.GenericType;

/**
* Implementation of Reactive Invoker for {@code CompletionStage}.
*
* This class allows for using {@link javax.ws.rs.client.InvocationCallback} in
* {@link javax.ws.rs.client.Invocation.Builder#rx(Class) Invocation.Builder.rx(JerseyCompletionStageRxInvoker.class)}
* requests.
*
* @author Michal Gajdos
* @since 2.26
*/
public class JerseyCompletionStageRxInvoker extends AbstractRxInvoker<CompletionStage> implements CompletionStageRxInvoker {

JerseyCompletionStageRxInvoker(Invocation.Builder builder, ExecutorService executor) {
super(builder, executor);
}

@Override
public <T> CompletionStage<T> method(final String name, final Entity<?> entity, final Class<T> responseType) {
final ExecutorService executorService = getExecutorService();

return executorService == null
? CompletableFuture.supplyAsync(() -> getSyncInvoker().method(name, entity, responseType))
: CompletableFuture.supplyAsync(() -> getSyncInvoker().method(name, entity, responseType), executorService);
}

@Override
public <T> CompletionStage<T> method(final String name, final Entity<?> entity, final GenericType<T> responseType) {
final ExecutorService executorService = getExecutorService();

return executorService == null
? CompletableFuture.supplyAsync(() -> getSyncInvoker().method(name, entity, responseType))
: CompletableFuture.supplyAsync(() -> getSyncInvoker().method(name, entity, responseType), executorService);
public class JerseyCompletionStageRxInvoker extends JerseyInvocation.AsyncInvoker implements CompletionStageRxInvoker {
JerseyCompletionStageRxInvoker(JerseyInvocation.Builder builder) {
super(builder);
}
}
}
Loading