Example #1
0
 private Object getReturnType(ProxyTranslator.Translation translation, Reply reply) {
   if (translation.requiredDetailedResponse()) {
     return reply;
   } else {
     return reply.getData();
   }
 }
Example #2
0
  @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);
                      }
                    });
              }
            });
  }