package com.fernandocejas.frodo.internal.observable; import com.fernandocejas.frodo.internal.Counter; import com.fernandocejas.frodo.internal.MessageManager; import com.fernandocejas.frodo.internal.StopWatch; import com.fernandocejas.frodo.joinpoint.FrodoProceedingJoinPoint; import rx.Observable; import rx.functions.Action0; import rx.functions.Action1; @SuppressWarnings("unchecked") class LogStreamObservable extends LoggableObservable { LogStreamObservable(FrodoProceedingJoinPoint joinPoint, MessageManager messageManager, ObservableInfo observableInfo) { super(joinPoint, messageManager, observableInfo); } @Override <T> Observable<T> get(T type) throws Throwable { final StopWatch stopWatch = new StopWatch(); final Counter emittedItems = new Counter(joinPoint.getMethodName()); return ((Observable<T>) joinPoint.proceed()) .doOnSubscribe(new Action0() { @Override public void call() { stopWatch.start(); } }) .doOnNext(new Action1<T>() { @Override public void call(T value) { emittedItems.increment(); messageManager.printObservableOnNextWithValue(observableInfo, value); } }) .doOnError(new Action1<Throwable>() { @Override public void call(Throwable throwable) { messageManager.printObservableOnError(observableInfo, throwable); } }) .doOnTerminate(new Action0() { @Override public void call() { stopWatch.stop(); observableInfo.setTotalExecutionTime(stopWatch.getTotalTimeMillis()); observableInfo.setTotalEmittedItems(emittedItems.tally()); messageManager.printObservableItemTimeInfo(observableInfo); } }); } }