@Override public Type responseType() { return delegate.responseType(); } };
@Override public Object adapt(Call<Object> call) { // Delegate to get the normal Observable... Observable<?> o = delegate.adapt(call); // ...and change it to send notifications to the observer on the specified scheduler. return o.observeOn(scheduler); }
/** * Inspects the annotations on an interface method to construct a reusable service method that * speaks HTTP. This requires potentially-expensive reflection so it is best to build each service * method only once and reuse it. */ static <ResponseT, ReturnT> HttpServiceMethod<ResponseT, ReturnT> parseAnnotations( Retrofit retrofit, Method method, RequestFactory requestFactory) { CallAdapter<ResponseT, ReturnT> callAdapter = createCallAdapter(retrofit, method); Type responseType = callAdapter.responseType(); if (responseType == Response.class || responseType == okhttp3.Response.class) { throw methodError(method, "'" + Utils.getRawType(responseType).getName() + "' is not a valid response body type. Did you mean ResponseBody?"); } if (requestFactory.httpMethod.equals("HEAD") && !Void.class.equals(responseType)) { throw methodError(method, "HEAD method must use Void as response type."); } Converter<ResponseBody, ResponseT> responseConverter = createResponseConverter(retrofit, method, responseType); okhttp3.Call.Factory callFactory = retrofit.callFactory; return new HttpServiceMethod<>(requestFactory, callFactory, callAdapter, responseConverter); }
@Override ReturnT invoke(Object[] args) { return callAdapter.adapt( new OkHttpCall<>(requestFactory, args, callFactory, responseConverter)); } }
/** * Inspects the annotations on an interface method to construct a reusable service method that * speaks HTTP. This requires potentially-expensive reflection so it is best to build each service * method only once and reuse it. */ static <ResponseT, ReturnT> HttpServiceMethod<ResponseT, ReturnT> parseAnnotations( Retrofit retrofit, Method method, RequestFactory requestFactory) { CallAdapter<ResponseT, ReturnT> callAdapter = createCallAdapter(retrofit, method); Type responseType = callAdapter.responseType(); if (responseType == Response.class || responseType == okhttp3.Response.class) { throw methodError(method, "'" + Utils.getRawType(responseType).getName() + "' is not a valid response body type. Did you mean ResponseBody?"); } if (requestFactory.httpMethod.equals("HEAD") && !Void.class.equals(responseType)) { throw methodError(method, "HEAD method must use Void as response type."); } Converter<ResponseBody, ResponseT> responseConverter = createResponseConverter(retrofit, method, responseType); okhttp3.Call.Factory callFactory = retrofit.callFactory; return new HttpServiceMethod<>(requestFactory, callFactory, callAdapter, responseConverter); }
@Override public T invoke(Object proxy, Method method, Object[] args) throws Throwable { Type returnType = method.getGenericReturnType(); Annotation[] methodAnnotations = method.getAnnotations(); CallAdapter<R, T> callAdapter = (CallAdapter<R, T>) retrofit.callAdapter(returnType, methodAnnotations); return callAdapter.adapt(behaviorCall); } });
@Override public Type responseType() { return callAdapter.responseType(); }
@Override ReturnT invoke(Object[] args) { return callAdapter.adapt( new OkHttpCall<>(requestFactory, args, callFactory, responseConverter)); } }
@Override public Type responseType() { return wrapped.responseType(); }
@Override public <R> Single<?> adapt(Call<R> call) { Observable<?> observable = callAdapter.adapt(call); return observable.toSingle(); } };
@Override public Type responseType() { return delegate.responseType(); }
@SuppressWarnings("unchecked") @Override public <R> Observable<?> adapt(Call<R> call) { return ((Observable) wrapped.adapt(call)).onErrorResumeNext(new Func1<Throwable, Observable>() { @Override public Observable call(Throwable throwable) { return Observable.error(asRetrofitException(throwable)); } }); }
@Override public Type responseType() { return delegate.responseType(); }
@Override public T adapt(Call<R> call) { return delegate.adapt(new LoggingCall<>(logger, call)); } }
@Test public void responseType() { Type bodyClass = new TypeToken<LiveData<Resource<String>>>() {}.getType(); assertThat(factory.get(bodyClass, NO_ANNOTATIONS, retrofit).responseType()) .isEqualTo(new TypeToken<Resource<String>>() {}.getType()); Type bodyWildcard = new TypeToken<LiveData<Resource<? extends String>>>() {}.getType(); assertThat(factory.get(bodyWildcard, NO_ANNOTATIONS, retrofit).responseType()) .isEqualTo(new TypeToken<Resource<? extends String>>() {}.getType()); Type responseType = new TypeToken<LiveData<Response<Resource<String>>>>() {}.getType(); assertThat(factory.get(responseType, NO_ANNOTATIONS, retrofit).responseType()) .isEqualTo(new TypeToken<Response<Resource<String>>>() {}.getType()); Type responseTypeWildcard = new TypeToken<LiveData<Response<Resource<? extends String>>>>() {}.getType(); assertThat(factory.get(responseTypeWildcard, NO_ANNOTATIONS, retrofit).responseType()) .isEqualTo(new TypeToken<Response<Resource<? extends String>>>() {}.getType()); }
@Override public Object adapt(Call<R> call) { DefaultingCall<R> defaultingCall = new DefaultingCall<>(call, defaultValue); return delegate.adapt(defaultingCall); } }
@Test public void responseTypes() { Type oBodyClass = new TypeToken<Flux<String>>() {}.getType(); assertThat(factory.get(oBodyClass, NO_ANNOTATIONS, retrofit).responseType()) .isEqualTo(String.class); Type sBodyClass = new TypeToken<Mono<String>>() {}.getType(); assertThat(factory.get(sBodyClass, NO_ANNOTATIONS, retrofit).responseType()) .isEqualTo(String.class); assertThat(factory.get(oBodyWildcard, NO_ANNOTATIONS, retrofit).responseType()) .isEqualTo(String.class); Type sBodyWildcard = new TypeToken<Mono<? extends String>>() {}.getType(); assertThat(factory.get(sBodyWildcard, NO_ANNOTATIONS, retrofit).responseType()) .isEqualTo(String.class); assertThat(factory.get(oBodyGeneric, NO_ANNOTATIONS, retrofit).responseType()) .isEqualTo(new TypeToken<List<String>>() {}.getType()); Type sBodyGeneric = new TypeToken<Mono<List<String>>>() {}.getType(); assertThat(factory.get(sBodyGeneric, NO_ANNOTATIONS, retrofit).responseType()) .isEqualTo(new TypeToken<List<String>>() {}.getType()); assertThat(factory.get(oResponseClass, NO_ANNOTATIONS, retrofit).responseType()) .isEqualTo(String.class); Type sResponseClass = new TypeToken<Mono<Response<String>>>() {}.getType(); assertThat(factory.get(sResponseClass, NO_ANNOTATIONS, retrofit).responseType()) .isEqualTo(String.class); assertThat(factory.get(oResponseWildcard, NO_ANNOTATIONS, retrofit).responseType()) .isEqualTo(String.class); Type sResponseWildcard = new TypeToken<Mono<Response<? extends String>>>() {}.getType(); assertThat(factory.get(sResponseWildcard, NO_ANNOTATIONS, retrofit).responseType())
<T> T adapt(Method method, NetworkBehavior networkBehavior, Call<?> call) { try { Class<?> behaviorCallClass = Class.forName("retrofit2.mock.BehaviorCall"); Constructor<?> constructor = behaviorCallClass.getDeclaredConstructor(NetworkBehavior.class, ExecutorService.class, Call.class); constructor.setAccessible(true); Call<?> behaviorCall = (Call<?>) constructor.newInstance(networkBehavior, Executors.newCachedThreadPool(), call); return (T) retrofit .callAdapter(method.getGenericReturnType(), method.getAnnotations()) .adapt(behaviorCall); } catch (Exception e) { throw new RuntimeException(e); } }
Type oBodyClass = new TypeToken<Observable<String>>() { }.getType(); assertThat(factory.get(oBodyClass, NO_ANNOTATIONS, retrofit).responseType()) .isEqualTo(String.class); Type sBodyClass = new TypeToken<Single<String>>() { }.getType(); assertThat(factory.get(sBodyClass, NO_ANNOTATIONS, retrofit).responseType()) .isEqualTo(String.class); Type mBodyClass = new TypeToken<Maybe<String>>() { }.getType(); assertThat(factory.get(sBodyClass, NO_ANNOTATIONS, retrofit).responseType()) .isEqualTo(String.class); Type fBodyClass = new TypeToken<Flowable<String>>() { }.getType(); assertThat(factory.get(sBodyClass, NO_ANNOTATIONS, retrofit).responseType()) .isEqualTo(String.class); assertThat(factory.get(oBodyWildcard, NO_ANNOTATIONS, retrofit).responseType()) .isEqualTo(String.class); Type sBodyWildcard = new TypeToken<Single<? extends String>>() { }.getType(); assertThat(factory.get(sBodyWildcard, NO_ANNOTATIONS, retrofit).responseType()) .isEqualTo(String.class); Type mBodyWildcard = new TypeToken<Maybe<? extends String>>() { }.getType(); assertThat(factory.get(sBodyWildcard, NO_ANNOTATIONS, retrofit).responseType()) .isEqualTo(String.class); Type fBodyWildcard = new TypeToken<Flowable<? extends String>>() { }.getType();