private Object getReturnType(ProxyTranslator.Translation translation, Reply reply) { if (translation.requiredDetailedResponse()) { return reply; } else { return reply.getData(); } }
@VisibleForTesting Observable<Object> getMethodImplementation(final ProxyTranslator.Translation translation) { return Observable.just( cache.retrieve( translation.getKey(), translation.getDynamicKey(), useExpiredDataIfLoaderNotAvailable)) .map( new Func1<Record, Observable<Reply>>() { @Override public Observable<Reply> call(final Record record) { if (record != null && !translation.invalidator().invalidate()) return Observable.just(new Reply(record.getData(), record.getSource())); return translation .getLoaderObservable() .map( new Func1() { @Override public Reply call(Object data) { if (data == null && useExpiredDataIfLoaderNotAvailable && record != null) { return new Reply(record.getData(), record.getSource()); } if (translation.invalidator() instanceof InvalidatorDynamicKey) { InvalidatorDynamicKey invalidatorDynamicKey = (InvalidatorDynamicKey) translation.invalidator(); if (invalidatorDynamicKey.invalidate()) cache.clearDynamicKey( translation.getKey(), invalidatorDynamicKey.dynamicKey().toString()); } else if (translation.invalidator().invalidate()) { cache.clear(translation.getKey()); } if (data == null) throw new RuntimeException( Locale.NOT_DATA_RETURN_WHEN_CALLING_OBSERVABLE_LOADER + " " + translation.getKey()); cache.save( translation.getKey(), translation.getDynamicKey(), data, translation.getLifeTimeMillis()); return new Reply(data, Source.CLOUD); } }); } }) .flatMap( new Func1<Observable<Reply>, Observable<Object>>() { @Override public Observable<Object> call(Observable<Reply> responseObservable) { return responseObservable.map( new Func1<Reply, Object>() { @Override public Object call(Reply reply) { return getReturnType(translation, reply); } }); } }); }