diff --git a/pmd.xml b/pmd.xml index e6fbccdd95..339af7d5ac 100644 --- a/pmd.xml +++ b/pmd.xml @@ -71,7 +71,6 @@ - @@ -134,9 +133,6 @@ - - - @@ -160,7 +156,6 @@ - @@ -183,8 +178,6 @@ - - diff --git a/src/main/java/rx/BackpressureOverflow.java b/src/main/java/rx/BackpressureOverflow.java index 761a2c4a80..ebd98e1b82 100644 --- a/src/main/java/rx/BackpressureOverflow.java +++ b/src/main/java/rx/BackpressureOverflow.java @@ -24,6 +24,30 @@ @Experimental public final class BackpressureOverflow { + /** + * Signal a MissingBackressureException due to lack of requests. + */ + public static final BackpressureOverflow.Strategy ON_OVERFLOW_ERROR = Error.INSTANCE; + + /** + * By default, signal a MissingBackressureException due to lack of requests. + */ + public static final BackpressureOverflow.Strategy ON_OVERFLOW_DEFAULT = ON_OVERFLOW_ERROR; + + /** + * Drop the oldest value in the buffer. + */ + public static final BackpressureOverflow.Strategy ON_OVERFLOW_DROP_OLDEST = DropOldest.INSTANCE; + + /** + * Drop the latest value. + */ + public static final BackpressureOverflow.Strategy ON_OVERFLOW_DROP_LATEST = DropLatest.INSTANCE; + + /** + * Represents a callback called when a value is about to be dropped + * due to lack of downstream requests. + */ public interface Strategy { /** @@ -36,14 +60,6 @@ public interface Strategy { boolean mayAttemptDrop() throws MissingBackpressureException; } - public static final BackpressureOverflow.Strategy ON_OVERFLOW_DEFAULT = Error.INSTANCE; - - public static final BackpressureOverflow.Strategy ON_OVERFLOW_ERROR = Error.INSTANCE; - - public static final BackpressureOverflow.Strategy ON_OVERFLOW_DROP_OLDEST = DropOldest.INSTANCE; - - public static final BackpressureOverflow.Strategy ON_OVERFLOW_DROP_LATEST = DropLatest.INSTANCE; - /** * Drop oldest items from the buffer making room for newer ones. */ diff --git a/src/main/java/rx/Completable.java b/src/main/java/rx/Completable.java index e5f7c4a068..c4560cbede 100644 --- a/src/main/java/rx/Completable.java +++ b/src/main/java/rx/Completable.java @@ -38,6 +38,8 @@ */ @Experimental public class Completable { + /** The actual subscription action. */ + private final CompletableOnSubscribe onSubscribe; /** * Callback used for building deferred computations that takes a CompletableSubscriber. */ @@ -192,6 +194,22 @@ public void call(final CompletableSubscriber s) { final CompositeSubscription set = new CompositeSubscription(); s.onSubscribe(set); + Iterator it; + + try { + it = sources.iterator(); + } catch (Throwable e) { + s.onError(e); + return; + } + + if (it == null) { + s.onError(new NullPointerException("The iterator returned is null")); + return; + } + + boolean empty = true; + final AtomicBoolean once = new AtomicBoolean(); CompletableSubscriber inner = new CompletableSubscriber() { @@ -220,22 +238,6 @@ public void onSubscribe(Subscription d) { }; - Iterator it; - - try { - it = sources.iterator(); - } catch (Throwable e) { - s.onError(e); - return; - } - - if (it == null) { - s.onError(new NullPointerException("The iterator returned is null")); - return; - } - - boolean empty = true; - for (;;) { if (once.get() || set.isUnsubscribed()) { return; @@ -377,7 +379,7 @@ public static Completable create(CompletableOnSubscribe onSubscribe) { requireNonNull(onSubscribe); try { return new Completable(onSubscribe); - } catch (NullPointerException ex) { + } catch (NullPointerException ex) { // NOPMD throw ex; } catch (Throwable ex) { RxJavaHooks.onError(ex); @@ -849,7 +851,7 @@ public static Completable using(final Func0 resourceFunc0, return create(new CompletableOnSubscribe() { @Override public void call(final CompletableSubscriber s) { - final R resource; + final R resource; // NOPMD try { resource = resourceFunc0.call(); @@ -965,9 +967,6 @@ public void call() { }); } - /** The actual subscription action. */ - private final CompletableOnSubscribe onSubscribe; - /** * Constructs a Completable instance with the given onSubscribe callback. * @param onSubscribe the callback that will receive CompletableSubscribers when they subscribe, @@ -1550,7 +1549,7 @@ public void call(CompletableSubscriber s) { CompletableSubscriber sw = onLiftDecorated.call(s); unsafeSubscribe(sw); - } catch (NullPointerException ex) { + } catch (NullPointerException ex) { // NOPMD throw ex; } catch (Throwable ex) { throw toNpe(ex); @@ -2008,7 +2007,7 @@ public final void unsafeSubscribe(CompletableSubscriber s) { CompletableOnSubscribe onSubscribeDecorated = RxJavaHooks.onCompletableStart(this, this.onSubscribe); onSubscribeDecorated.call(s); - } catch (NullPointerException ex) { + } catch (NullPointerException ex) { // NOPMD throw ex; } catch (Throwable ex) { Exceptions.throwIfFatal(ex); @@ -2072,7 +2071,7 @@ public void onSubscribe(Subscription d) { } }); RxJavaHooks.onObservableReturn(s); - } catch (NullPointerException ex) { + } catch (NullPointerException ex) { // NOPMD throw ex; } catch (Throwable ex) { Exceptions.throwIfFatal(ex); diff --git a/src/main/java/rx/Notification.java b/src/main/java/rx/Notification.java index 71fb95c745..f1cfdab4ef 100644 --- a/src/main/java/rx/Notification.java +++ b/src/main/java/rx/Notification.java @@ -182,22 +182,27 @@ public enum Kind { @Override public String toString() { - StringBuilder str = new StringBuilder("[").append(super.toString()).append(" ").append(getKind()); - if (hasValue()) - str.append(" ").append(getValue()); - if (hasThrowable()) - str.append(" ").append(getThrowable().getMessage()); - str.append("]"); + StringBuilder str = new StringBuilder(64).append('[').append(super.toString()) + .append(' ').append(getKind()); + if (hasValue()) { + str.append(' ').append(getValue()); + } + if (hasThrowable()) { + str.append(' ').append(getThrowable().getMessage()); + } + str.append(']'); return str.toString(); } @Override public int hashCode() { int hash = getKind().hashCode(); - if (hasValue()) + if (hasValue()) { hash = hash * 31 + getValue().hashCode(); - if (hasThrowable()) + } + if (hasThrowable()) { hash = hash * 31 + getThrowable().hashCode(); + } return hash; } @@ -224,10 +229,6 @@ public boolean equals(Object obj) { return false; } - if (!(throwable == notification.throwable || (throwable != null && throwable.equals(notification.throwable)))) { - return false; - } - - return true; + return (throwable == notification.throwable || (throwable != null && throwable.equals(notification.throwable))); } } diff --git a/src/main/java/rx/Observable.java b/src/main/java/rx/Observable.java index 4507c4480f..4599edb5f4 100644 --- a/src/main/java/rx/Observable.java +++ b/src/main/java/rx/Observable.java @@ -9015,7 +9015,7 @@ public final Subscription unsafeSubscribe(Subscriber subscriber) { // TODO could the hook be the cause of the error in the on error handling. RxJavaHooks.onObservableError(r); // TODO why aren't we throwing the hook's return value. - throw r; + throw r; // NOPMD } return Subscriptions.unsubscribed(); } @@ -9112,7 +9112,7 @@ static Subscription subscribe(Subscriber subscriber, Observable takeFirst(Func1 predicate) { * @see ReactiveX operators documentation: TakeLast */ public final Observable takeLast(final int count) { - if (count == 0) + if (count == 0) { return ignoreElements(); - else if (count == 1 ) + } else if (count == 1) { return lift(OperatorTakeLastOne.instance()); - else + } else { return lift(new OperatorTakeLast(count)); + } } /** diff --git a/src/main/java/rx/Single.java b/src/main/java/rx/Single.java index 183f869fd0..c4c4e71881 100644 --- a/src/main/java/rx/Single.java +++ b/src/main/java/rx/Single.java @@ -619,7 +619,7 @@ public static Single fromCallable(final Callable func) { return create(new OnSubscribe() { @Override public void call(SingleSubscriber singleSubscriber) { - final T value; + T value; try { value = func.call(); @@ -1719,7 +1719,7 @@ public final Subscription unsafeSubscribe(Subscriber subscriber) { // TODO could the hook be the cause of the error in the on error handling. RxJavaHooks.onSingleError(r); // TODO why aren't we throwing the hook's return value. - throw r; + throw r; // NOPMD } return Subscriptions.unsubscribed(); } @@ -1829,7 +1829,7 @@ public final Subscription subscribe(Subscriber subscriber) { // TODO could the hook be the cause of the error in the on error handling. RxJavaHooks.onSingleError(r); // TODO why aren't we throwing the hook's return value. - throw r; + throw r; // NOPMD } return Subscriptions.empty(); } @@ -1875,7 +1875,7 @@ public final Subscription subscribe(final SingleSubscriber te) { @Override public void onCompleted() { - + // deliberately ignored } @Override @@ -2376,6 +2376,7 @@ public final Single doOnError(final Action1 onError) { Observer observer = new Observer() { @Override public void onCompleted() { + // deliberately ignored } @Override @@ -2385,6 +2386,7 @@ public void onError(Throwable e) { @Override public void onNext(T t) { + // deliberately ignored } }; @@ -2410,10 +2412,12 @@ public final Single doOnSuccess(final Action1 onSuccess) { Observer observer = new Observer() { @Override public void onCompleted() { + // deliberately ignored } @Override public void onError(Throwable e) { + // deliberately ignored } @Override @@ -2589,7 +2593,7 @@ public final Single doAfterTerminate(Action0 action) { */ @SuppressWarnings("unchecked") static Single[] iterableToArray(final Iterable> singlesIterable) { - final Single[] singlesArray; + Single[] singlesArray; int count; if (singlesIterable instanceof Collection) { diff --git a/src/main/java/rx/exceptions/AssemblyStackTraceException.java b/src/main/java/rx/exceptions/AssemblyStackTraceException.java index ee6a8be6a9..752e8aad87 100644 --- a/src/main/java/rx/exceptions/AssemblyStackTraceException.java +++ b/src/main/java/rx/exceptions/AssemblyStackTraceException.java @@ -46,7 +46,7 @@ public AssemblyStackTraceException(String message) { } @Override - public synchronized Throwable fillInStackTrace() { + public synchronized Throwable fillInStackTrace() { // NOPMD return this; } } diff --git a/src/main/java/rx/exceptions/CompositeException.java b/src/main/java/rx/exceptions/CompositeException.java index 310cfab8ae..d4af4c5350 100644 --- a/src/main/java/rx/exceptions/CompositeException.java +++ b/src/main/java/rx/exceptions/CompositeException.java @@ -41,15 +41,17 @@ public final class CompositeException extends RuntimeException { private final List exceptions; private final String message; + private Throwable cause; + /** * Constructs a CompositeException with the given prefix and error collection. * @param messagePrefix the prefix to use (actually unused) * @param errors the collection of errors * @deprecated please use {@link #CompositeException(Collection)} */ @Deprecated - public CompositeException(String messagePrefix, Collection errors) { + public CompositeException(String messagePrefix, Collection errors) { // NOPMD Set deDupedExceptions = new LinkedHashSet(); - List _exceptions = new ArrayList(); + List localExceptions = new ArrayList(); if (errors != null) { for (Throwable ex : errors) { if (ex instanceof CompositeException) { @@ -65,8 +67,8 @@ public CompositeException(String messagePrefix, Collection deDupedExceptions.add(new NullPointerException()); } - _exceptions.addAll(deDupedExceptions); - this.exceptions = Collections.unmodifiableList(_exceptions); + localExceptions.addAll(deDupedExceptions); + this.exceptions = Collections.unmodifiableList(localExceptions); this.message = exceptions.size() + " exceptions occurred. "; } @@ -81,7 +83,7 @@ public CompositeException(Collection errors) { @Experimental public CompositeException(Throwable... errors) { Set deDupedExceptions = new LinkedHashSet(); - List _exceptions = new ArrayList(); + List localExceptions = new ArrayList(); if (errors != null) { for (Throwable ex : errors) { if (ex instanceof CompositeException) { @@ -97,8 +99,8 @@ public CompositeException(Throwable... errors) { deDupedExceptions.add(new NullPointerException()); } - _exceptions.addAll(deDupedExceptions); - this.exceptions = Collections.unmodifiableList(_exceptions); + localExceptions.addAll(deDupedExceptions); + this.exceptions = Collections.unmodifiableList(localExceptions); this.message = exceptions.size() + " exceptions occurred. "; } @@ -116,16 +118,14 @@ public String getMessage() { return message; } - private Throwable cause = null; - @Override - public synchronized Throwable getCause() { + public synchronized Throwable getCause() { // NOPMD if (cause == null) { // we lazily generate this causal chain if this is called - CompositeExceptionCausalChain _cause = new CompositeExceptionCausalChain(); + CompositeExceptionCausalChain localCause = new CompositeExceptionCausalChain(); Set seenCauses = new HashSet(); - Throwable chain = _cause; + Throwable chain = localCause; for (Throwable e : exceptions) { if (seenCauses.contains(e)) { // already seen this outer Throwable so skip @@ -147,14 +147,14 @@ public synchronized Throwable getCause() { // we now have 'e' as the last in the chain try { chain.initCause(e); - } catch (Throwable t) { + } catch (Throwable t) { // NOPMD // ignore // the javadocs say that some Throwables (depending on how they're made) will never // let me call initCause without blowing up even if it returns null } chain = getRootCause(chain); } - cause = _cause; + cause = localCause; } return cause; } @@ -192,14 +192,14 @@ public void printStackTrace(PrintWriter s) { * stream to print to */ private void printStackTrace(PrintStreamOrWriter s) { - StringBuilder bldr = new StringBuilder(); - bldr.append(this).append("\n"); + StringBuilder bldr = new StringBuilder(128); + bldr.append(this).append('\n'); for (StackTraceElement myStackElement : getStackTrace()) { - bldr.append("\tat ").append(myStackElement).append("\n"); + bldr.append("\tat ").append(myStackElement).append('\n'); } int i = 1; for (Throwable ex : exceptions) { - bldr.append(" ComposedException ").append(i).append(" :").append("\n"); + bldr.append(" ComposedException ").append(i).append(" :\n"); appendStackTrace(bldr, ex, "\t"); i++; } @@ -209,9 +209,9 @@ private void printStackTrace(PrintStreamOrWriter s) { } private void appendStackTrace(StringBuilder bldr, Throwable ex, String prefix) { - bldr.append(prefix).append(ex).append("\n"); + bldr.append(prefix).append(ex).append('\n'); for (StackTraceElement stackElement : ex.getStackTrace()) { - bldr.append("\t\tat ").append(stackElement).append("\n"); + bldr.append("\t\tat ").append(stackElement).append('\n'); } if (ex.getCause() != null) { bldr.append("\tCaused by: "); @@ -219,7 +219,7 @@ private void appendStackTrace(StringBuilder bldr, Throwable ex, String prefix) { } } - private abstract static class PrintStreamOrWriter { + abstract static class PrintStreamOrWriter { /** Returns the object to be locked when using this StreamOrWriter */ abstract Object lock(); @@ -230,7 +230,7 @@ private abstract static class PrintStreamOrWriter { /** * Same abstraction and implementation as in JDK to allow PrintStream and PrintWriter to share implementation */ - private static class WrappedPrintStream extends PrintStreamOrWriter { + static final class WrappedPrintStream extends PrintStreamOrWriter { private final PrintStream printStream; WrappedPrintStream(PrintStream printStream) { @@ -248,7 +248,7 @@ void println(Object o) { } } - private static class WrappedPrintWriter extends PrintStreamOrWriter { + static final class WrappedPrintWriter extends PrintStreamOrWriter { private final PrintWriter printWriter; WrappedPrintWriter(PrintWriter printWriter) { @@ -268,7 +268,7 @@ void println(Object o) { /* package-private */final static class CompositeExceptionCausalChain extends RuntimeException { private static final long serialVersionUID = 3875212506787802066L; - /* package-private */static String MESSAGE = "Chain of Causes for CompositeException In Order Received =>"; + /* package-private */static final String MESSAGE = "Chain of Causes for CompositeException In Order Received =>"; @Override public String getMessage() { diff --git a/src/main/java/rx/exceptions/Exceptions.java b/src/main/java/rx/exceptions/Exceptions.java index f427018f53..1486012d2d 100644 --- a/src/main/java/rx/exceptions/Exceptions.java +++ b/src/main/java/rx/exceptions/Exceptions.java @@ -26,6 +26,9 @@ * manage fatal and regular exception delivery. */ public final class Exceptions { + + private static final int MAX_DEPTH = 25; + /** Utility class, no instances. */ private Exceptions() { throw new IllegalStateException("No instances!"); @@ -52,7 +55,7 @@ public static RuntimeException propagate(Throwable t) { } else if (t instanceof Error) { throw (Error) t; } else { - throw new RuntimeException(t); + throw new RuntimeException(t); // NOPMD } } /** @@ -96,8 +99,6 @@ else if (t instanceof StackOverflowError) { } } - private static final int MAX_DEPTH = 25; - /** * Adds a {@code Throwable} to a causality-chain of Throwables, as an additional cause (if it does not * already appear in the chain among the causes). @@ -126,7 +127,7 @@ public static void addCause(Throwable e, Throwable cause) { // we now have 'e' as the last in the chain try { e.initCause(cause); - } catch (Throwable t) { + } catch (Throwable t) { // NOPMD // ignore // the javadocs say that some Throwables (depending on how they're made) will never // let me call initCause without blowing up even if it returns null @@ -171,7 +172,7 @@ public static void throwIfAny(List exceptions) { } else if (t instanceof Error) { throw (Error) t; } else { - throw new RuntimeException(t); + throw new RuntimeException(t); // NOPMD } } throw new CompositeException(exceptions); diff --git a/src/main/java/rx/exceptions/MissingBackpressureException.java b/src/main/java/rx/exceptions/MissingBackpressureException.java index b113d6536c..3c11bc42d4 100644 --- a/src/main/java/rx/exceptions/MissingBackpressureException.java +++ b/src/main/java/rx/exceptions/MissingBackpressureException.java @@ -52,7 +52,7 @@ public class MissingBackpressureException extends Exception { * Constructs the exception without any custom message. */ public MissingBackpressureException() { - + super(); } /** diff --git a/src/main/java/rx/exceptions/OnErrorThrowable.java b/src/main/java/rx/exceptions/OnErrorThrowable.java index 2ef465141b..5f4ab73e8a 100644 --- a/src/main/java/rx/exceptions/OnErrorThrowable.java +++ b/src/main/java/rx/exceptions/OnErrorThrowable.java @@ -99,7 +99,7 @@ public static Throwable addValueAsLastCause(Throwable e, Object value) { e = new NullPointerException(); } Throwable lastCause = Exceptions.getFinalCause(e); - if (lastCause != null && lastCause instanceof OnNextValue) { + if (lastCause instanceof OnNextValue) { // purposefully using == for object reference check if (((OnNextValue) lastCause).getValue() == value) { // don't add another @@ -117,9 +117,11 @@ public static Throwable addValueAsLastCause(Throwable e, Object value) { public static class OnNextValue extends RuntimeException { private static final long serialVersionUID = -3454462756050397899L; + + private final Object value; // Lazy loaded singleton - private static final class Primitives { + static final class Primitives { static final Set> INSTANCE = create(); @@ -139,8 +141,6 @@ private static Set> create() { } } - private final Object value; - /** * Create an {@code OnNextValue} exception and include in its error message a string representation of * the item that was intended to be emitted at the time the exception was handled. diff --git a/src/main/java/rx/functions/Actions.java b/src/main/java/rx/functions/Actions.java index 877c1adbda..d204d16ebc 100644 --- a/src/main/java/rx/functions/Actions.java +++ b/src/main/java/rx/functions/Actions.java @@ -19,6 +19,9 @@ * Utility class for the Action interfaces. */ public final class Actions { + @SuppressWarnings("rawtypes") + private static final EmptyAction EMPTY_ACTION = new EmptyAction(); + private Actions() { throw new IllegalStateException("No instances!"); } @@ -28,10 +31,7 @@ public static EmptyAction implements + static final class EmptyAction implements Action0, Action1, Action2, @@ -43,51 +43,60 @@ private static final class EmptyAction imple Action8, Action9, ActionN { - EmptyAction() { - } @Override public void call() { + // deliberately no op } @Override public void call(T0 t1) { + // deliberately no op } @Override public void call(T0 t1, T1 t2) { + // deliberately no op } @Override public void call(T0 t1, T1 t2, T2 t3) { + // deliberately no op } @Override public void call(T0 t1, T1 t2, T2 t3, T3 t4) { + // deliberately no op } @Override public void call(T0 t1, T1 t2, T2 t3, T3 t4, T4 t5) { + // deliberately no op } @Override public void call(T0 t1, T1 t2, T2 t3, T3 t4, T4 t5, T5 t6) { + // deliberately no op } @Override public void call(T0 t1, T1 t2, T2 t3, T3 t4, T4 t5, T5 t6, T6 t7) { + // deliberately no op } @Override public void call(T0 t1, T1 t2, T2 t3, T3 t4, T4 t5, T5 t6, T6 t7, T7 t8) { + // deliberately no op } @Override public void call(T0 t1, T1 t2, T2 t3, T3 t4, T4 t5, T5 t6, T6 t7, T7 t8, T8 t9) { + // deliberately no op } @Override public void call(Object... args) { + // deliberately no op } } diff --git a/src/main/java/rx/functions/Functions.java b/src/main/java/rx/functions/Functions.java index b22df29204..24036ec498 100644 --- a/src/main/java/rx/functions/Functions.java +++ b/src/main/java/rx/functions/Functions.java @@ -34,7 +34,7 @@ public static FuncN fromFunc(final Func0 f) { @Override public R call(Object... args) { if (args.length != 0) { - throw new RuntimeException("Func0 expecting 0 arguments."); + throw new IllegalArgumentException("Func0 expecting 0 arguments."); } return f.call(); } @@ -58,7 +58,7 @@ public static FuncN fromFunc(final Func1 f) @Override public R call(Object... args) { if (args.length != 1) { - throw new RuntimeException("Func1 expecting 1 argument."); + throw new IllegalArgumentException("Func1 expecting 1 argument."); } return f.call((T0) args[0]); } @@ -83,7 +83,7 @@ public static FuncN fromFunc(final Func2 FuncN fromFunc(final Func3 FuncN fromFunc(final Func4 FuncN fromFunc(final Func5 FuncN fromFunc(final Func6 FuncN fromFunc(final Func7 FuncN fromFunc(final Func8< @Override public R call(Object... args) { if (args.length != 8) { - throw new RuntimeException("Func8 expecting 8 arguments."); + throw new IllegalArgumentException("Func8 expecting 8 arguments."); } return f.call((T0) args[0], (T1) args[1], (T2) args[2], (T3) args[3], (T4) args[4], (T5) args[5], (T6) args[6], (T7) args[7]); } @@ -286,7 +286,7 @@ public static FuncN fromFunc(final Fu @Override public R call(Object... args) { if (args.length != 9) { - throw new RuntimeException("Func9 expecting 9 arguments."); + throw new IllegalArgumentException("Func9 expecting 9 arguments."); } return f.call((T0) args[0], (T1) args[1], (T2) args[2], (T3) args[3], (T4) args[4], (T5) args[5], (T6) args[6], (T7) args[7], (T8) args[8]); } @@ -307,7 +307,7 @@ public static FuncN fromAction(final Action0 f) { @Override public Void call(Object... args) { if (args.length != 0) { - throw new RuntimeException("Action0 expecting 0 arguments."); + throw new IllegalArgumentException("Action0 expecting 0 arguments."); } f.call(); return null; @@ -331,7 +331,7 @@ public static FuncN fromAction(final Action1 f) { @Override public Void call(Object... args) { if (args.length != 1) { - throw new RuntimeException("Action1 expecting 1 argument."); + throw new IllegalArgumentException("Action1 expecting 1 argument."); } f.call((T0) args[0]); return null; @@ -356,7 +356,7 @@ public static FuncN fromAction(final Action2 FuncN fromAction(final Action3 extends Subscriber> value = new AtomicReference>(); + // iterator's notification + Notification iNotif; @Override public void onNext(Notification args) { @@ -81,9 +83,6 @@ public void onCompleted() { // not expected } - // iterator's notification - Notification iNotif; - @Override public boolean hasNext() { if (iNotif != null && iNotif.isOnError()) { diff --git a/src/main/java/rx/internal/operators/BlockingOperatorMostRecent.java b/src/main/java/rx/internal/operators/BlockingOperatorMostRecent.java index 3a55cf0cb7..507f1ee708 100644 --- a/src/main/java/rx/internal/operators/BlockingOperatorMostRecent.java +++ b/src/main/java/rx/internal/operators/BlockingOperatorMostRecent.java @@ -62,7 +62,7 @@ public Iterator iterator() { }; } - private static final class MostRecentObserver extends Subscriber { + static final class MostRecentObserver extends Subscriber { final NotificationLite nl = NotificationLite.instance(); volatile Object value; @@ -95,7 +95,7 @@ public Iterator getIterable() { /** * buffer to make sure that the state of the iterator doesn't change between calling hasNext() and next(). */ - private Object buf = null; + private Object buf; @Override public boolean hasNext() { @@ -107,10 +107,12 @@ public boolean hasNext() { public T next() { try { // if hasNext wasn't called before calling next. - if (buf == null) + if (buf == null) { buf = value; - if (nl.isCompleted(buf)) + } + if (nl.isCompleted(buf)) { throw new NoSuchElementException(); + } if (nl.isError(buf)) { throw Exceptions.propagate(nl.getError(buf)); } diff --git a/src/main/java/rx/internal/operators/BlockingOperatorNext.java b/src/main/java/rx/internal/operators/BlockingOperatorNext.java index 94820b4acf..236744ac31 100644 --- a/src/main/java/rx/internal/operators/BlockingOperatorNext.java +++ b/src/main/java/rx/internal/operators/BlockingOperatorNext.java @@ -64,8 +64,8 @@ public Iterator iterator() { private T next; private boolean hasNext = true; private boolean isNextConsumed = true; - private Throwable error = null; - private boolean started = false; + private Throwable error; + private boolean started; NextIterator(Observable items, NextObserver observer) { this.items = items; @@ -122,7 +122,7 @@ private boolean moveToNext() { observer.unsubscribe(); Thread.currentThread().interrupt(); error = e; - throw Exceptions.propagate(error); + throw Exceptions.propagate(e); } } @@ -147,13 +147,10 @@ public void remove() { } } - private static class NextObserver extends Subscriber> { + static final class NextObserver extends Subscriber> { private final BlockingQueue> buf = new ArrayBlockingQueue>(1); final AtomicInteger waiting = new AtomicInteger(); - NextObserver() { - } - @Override public void onCompleted() { // ignore diff --git a/src/main/java/rx/internal/operators/BlockingOperatorToFuture.java b/src/main/java/rx/internal/operators/BlockingOperatorToFuture.java index 20a2377472..ee43643fce 100644 --- a/src/main/java/rx/internal/operators/BlockingOperatorToFuture.java +++ b/src/main/java/rx/internal/operators/BlockingOperatorToFuture.java @@ -77,7 +77,7 @@ public void onNext(T v) { return new Future() { - private volatile boolean cancelled = false; + private volatile boolean cancelled; @Override public boolean cancel(boolean mayInterruptIfRunning) { diff --git a/src/main/java/rx/internal/operators/BufferUntilSubscriber.java b/src/main/java/rx/internal/operators/BufferUntilSubscriber.java index 2fcf60cf45..f97198ee28 100644 --- a/src/main/java/rx/internal/operators/BufferUntilSubscriber.java +++ b/src/main/java/rx/internal/operators/BufferUntilSubscriber.java @@ -48,6 +48,9 @@ * the type of the items to be buffered */ public final class BufferUntilSubscriber extends Subject { + final State state; + + private boolean forward; /** * Creates a default, unbounded buffering Subject instance. @@ -63,16 +66,17 @@ public static BufferUntilSubscriber create() { static final class State extends AtomicReference> { /** */ private static final long serialVersionUID = 8026705089538090368L; - boolean casObserverRef(Observer expected, Observer next) { - return compareAndSet(expected, next); - } final Object guard = new Object(); /* protected by guard */ - boolean emitting = false; + boolean emitting; final ConcurrentLinkedQueue buffer = new ConcurrentLinkedQueue(); final NotificationLite nl = NotificationLite.instance(); + + boolean casObserverRef(Observer expected, Observer next) { + return compareAndSet(expected, next); + } } static final class OnSubscribeAction implements OnSubscribe { @@ -123,9 +127,6 @@ public void call() { } } - final State state; - - private boolean forward = false; private BufferUntilSubscriber(State state) { super(new OnSubscribeAction(state)); @@ -194,17 +195,17 @@ public boolean hasObservers() { @Override public void onCompleted() { - + // deliberately no op } @Override public void onError(Throwable e) { - + // deliberately no op } @Override public void onNext(Object t) { - + // deliberately no op } }; diff --git a/src/main/java/rx/internal/operators/CompletableOnSubscribeMergeDelayErrorIterable.java b/src/main/java/rx/internal/operators/CompletableOnSubscribeMergeDelayErrorIterable.java index 9d2567135e..55583c85ad 100644 --- a/src/main/java/rx/internal/operators/CompletableOnSubscribeMergeDelayErrorIterable.java +++ b/src/main/java/rx/internal/operators/CompletableOnSubscribeMergeDelayErrorIterable.java @@ -34,9 +34,6 @@ public CompletableOnSubscribeMergeDelayErrorIterable(Iterable queue = new MpscLinkedQueue(); s.onSubscribe(set); @@ -53,7 +50,11 @@ public void call(final CompletableSubscriber s) { s.onError(new NullPointerException("The source iterator returned is null")); return; } + + final AtomicInteger wip = new AtomicInteger(1); + final Queue queue = new MpscLinkedQueue(); + for (;;) { if (set.isUnsubscribed()) { return; diff --git a/src/main/java/rx/internal/operators/CompletableOnSubscribeMergeIterable.java b/src/main/java/rx/internal/operators/CompletableOnSubscribeMergeIterable.java index fed111a6c7..9d09393bbe 100644 --- a/src/main/java/rx/internal/operators/CompletableOnSubscribeMergeIterable.java +++ b/src/main/java/rx/internal/operators/CompletableOnSubscribeMergeIterable.java @@ -34,9 +34,7 @@ public CompletableOnSubscribeMergeIterable(Iterable sourc @Override public void call(final CompletableSubscriber s) { final CompositeSubscription set = new CompositeSubscription(); - final AtomicInteger wip = new AtomicInteger(1); - final AtomicBoolean once = new AtomicBoolean(); - + s.onSubscribe(set); Iterator iterator; @@ -53,6 +51,9 @@ public void call(final CompletableSubscriber s) { return; } + final AtomicInteger wip = new AtomicInteger(1); + final AtomicBoolean once = new AtomicBoolean(); + for (;;) { if (set.isUnsubscribed()) { return; diff --git a/src/main/java/rx/internal/operators/EmptyObservableHolder.java b/src/main/java/rx/internal/operators/EmptyObservableHolder.java index 00f4e16f68..c9678db92d 100644 --- a/src/main/java/rx/internal/operators/EmptyObservableHolder.java +++ b/src/main/java/rx/internal/operators/EmptyObservableHolder.java @@ -26,7 +26,11 @@ public enum EmptyObservableHolder implements OnSubscribe { INSTANCE ; + + /** The singleton instance. */ + static final Observable EMPTY = Observable.create(INSTANCE); + /** * Returns a type-corrected singleton instance of the empty Observable. * @param the value type @@ -37,9 +41,6 @@ public static Observable instance() { return (Observable)EMPTY; } - /** The singleton instance. */ - static final Observable EMPTY = Observable.create(INSTANCE); - @Override public void call(Subscriber child) { child.onCompleted(); diff --git a/src/main/java/rx/internal/operators/NeverObservableHolder.java b/src/main/java/rx/internal/operators/NeverObservableHolder.java index 5114772872..4ffdc630d8 100644 --- a/src/main/java/rx/internal/operators/NeverObservableHolder.java +++ b/src/main/java/rx/internal/operators/NeverObservableHolder.java @@ -26,7 +26,10 @@ public enum NeverObservableHolder implements OnSubscribe { INSTANCE ; - + + /** The singleton instance. */ + static final Observable NEVER = Observable.create(INSTANCE); + /** * Returns a type-corrected singleton instance of the never Observable. * @param the value type @@ -37,10 +40,8 @@ public static Observable instance() { return (Observable)NEVER; } - /** The singleton instance. */ - static final Observable NEVER = Observable.create(INSTANCE); - @Override public void call(Subscriber child) { + // deliberately no op } } diff --git a/src/main/java/rx/internal/operators/NotificationLite.java b/src/main/java/rx/internal/operators/NotificationLite.java index 223d5299cd..7047553dc9 100644 --- a/src/main/java/rx/internal/operators/NotificationLite.java +++ b/src/main/java/rx/internal/operators/NotificationLite.java @@ -31,16 +31,16 @@ *

* It's implemented as a singleton to maintain some semblance of type safety that is completely non-existent. * - * @param - * @warn type param undescribed + * @param the element type */ public final class NotificationLite { - private NotificationLite() { - } - @SuppressWarnings("rawtypes") private static final NotificationLite INSTANCE = new NotificationLite(); + private NotificationLite() { + // singleton + } + /** * Gets the {@code NotificationLite} singleton. * @@ -70,7 +70,7 @@ public String toString() { } }; - private static class OnErrorSentinel implements Serializable { + static final class OnErrorSentinel implements Serializable { private static final long serialVersionUID = 3; final Throwable e; @@ -93,10 +93,11 @@ public String toString() { * @return the item, or a null token representing the item if the item is {@code null} */ public Object next(T t) { - if (t == null) + if (t == null) { return ON_NEXT_NULL_SENTINEL; - else + } else { return t; + } } /** @@ -207,15 +208,16 @@ public boolean isNext(Object n) { * {@code Kind.OnError}, or {@code Kind.OnNext} */ public Kind kind(Object n) { - if (n == null) + if (n == null) { throw new IllegalArgumentException("The lite notification can not be null"); - else if (n == ON_COMPLETED_SENTINEL) + } else if (n == ON_COMPLETED_SENTINEL) { return Kind.OnCompleted; - else if (n instanceof OnErrorSentinel) + } else if (n instanceof OnErrorSentinel) { return Kind.OnError; - else + } else { // value or ON_NEXT_NULL_SENTINEL but either way it's an OnNext return Kind.OnNext; + } } /** diff --git a/src/main/java/rx/internal/operators/OnSubscribeAmb.java b/src/main/java/rx/internal/operators/OnSubscribeAmb.java index 3b39357b07..f10e73396c 100644 --- a/src/main/java/rx/internal/operators/OnSubscribeAmb.java +++ b/src/main/java/rx/internal/operators/OnSubscribeAmb.java @@ -33,6 +33,9 @@ * @param the value type */ public final class OnSubscribeAmb implements OnSubscribe{ + //give default access instead of private as a micro-optimization + //for access from anonymous classes below + final Iterable> sources; /** * Given two {@link Observable}s, propagates the one that first emits an item. @@ -275,7 +278,7 @@ public static OnSubscribe amb(final Iterable(sources); } - private static final class AmbSubscriber extends Subscriber { + static final class AmbSubscriber extends Subscriber { private final Subscriber subscriber; private final Selection selection; @@ -338,7 +341,7 @@ private boolean isSelected() { } } - private static class Selection { + static final class Selection { final AtomicReference> choice = new AtomicReference>(); final Collection> ambSubscribers = new ConcurrentLinkedQueue>(); @@ -360,10 +363,6 @@ public void unsubscribeOthers(AmbSubscriber notThis) { } - //give default access instead of private as a micro-optimization - //for access from anonymous classes below - final Iterable> sources; - private OnSubscribeAmb(Iterable> sources) { this.sources = sources; } @@ -419,7 +418,7 @@ public void call() { @Override public void request(long n) { - final AmbSubscriber c; + AmbSubscriber c; if ((c = choice.get()) != null) { // propagate the request to that single Subscriber that won c.requestMore(n); diff --git a/src/main/java/rx/internal/operators/OnSubscribeCombineLatest.java b/src/main/java/rx/internal/operators/OnSubscribeCombineLatest.java index e9dac2d026..e7cb3a1251 100644 --- a/src/main/java/rx/internal/operators/OnSubscribeCombineLatest.java +++ b/src/main/java/rx/internal/operators/OnSubscribeCombineLatest.java @@ -245,10 +245,9 @@ void drain() { } long requestAmount = localRequested.get(); - boolean unbounded = requestAmount == Long.MAX_VALUE; long emitted = 0L; - while (requestAmount != 0L) { + while (emitted != requestAmount) { boolean d = done; @SuppressWarnings("unchecked") @@ -287,14 +286,11 @@ void drain() { cs.requestMore(1); - requestAmount--; - emitted--; + emitted++; } - if (emitted != 0L) { - if (!unbounded) { - localRequested.addAndGet(emitted); - } + if (emitted != 0L && requestAmount != Long.MAX_VALUE) { + BackpressureUtils.produced(localRequested, emitted); } missed = addAndGet(-missed); diff --git a/src/main/java/rx/internal/operators/OnSubscribeFromIterable.java b/src/main/java/rx/internal/operators/OnSubscribeFromIterable.java index 9ee3104f95..889cce2872 100644 --- a/src/main/java/rx/internal/operators/OnSubscribeFromIterable.java +++ b/src/main/java/rx/internal/operators/OnSubscribeFromIterable.java @@ -44,7 +44,7 @@ public OnSubscribeFromIterable(Iterable iterable) { @Override public void call(final Subscriber o) { - final Iterator it; + Iterator it; boolean b; try { diff --git a/src/main/java/rx/internal/operators/OnSubscribeGroupJoin.java b/src/main/java/rx/internal/operators/OnSubscribeGroupJoin.java index a8f13fb5e7..e677fb9bc3 100644 --- a/src/main/java/rx/internal/operators/OnSubscribeGroupJoin.java +++ b/src/main/java/rx/internal/operators/OnSubscribeGroupJoin.java @@ -38,11 +38,11 @@ * @param the result value type */ public final class OnSubscribeGroupJoin implements OnSubscribe { - protected final Observable left; - protected final Observable right; - protected final Func1> leftDuration; - protected final Func1> rightDuration; - protected final Func2, ? extends R> resultSelector; + final Observable left; + final Observable right; + final Func1> leftDuration; + final Func1> rightDuration; + final Func2, ? extends R> resultSelector; public OnSubscribeGroupJoin( Observable left, @@ -75,9 +75,9 @@ final class ResultManager implements Subscription { /** Guarded by guard. */ int rightIds; /** Guarded by guard. */ - final Map> leftMap = new HashMap>(); + final Map> leftMap = new HashMap>(); // NOPMD /** Guarded by guard. */ - final Map rightMap = new HashMap(); + final Map rightMap = new HashMap(); // NOPMD /** Guarded by guard. */ boolean leftDone; /** Guarded by guard. */ diff --git a/src/main/java/rx/internal/operators/OnSubscribeRange.java b/src/main/java/rx/internal/operators/OnSubscribeRange.java index 8f17303a2d..1a96c152c8 100644 --- a/src/main/java/rx/internal/operators/OnSubscribeRange.java +++ b/src/main/java/rx/internal/operators/OnSubscribeRange.java @@ -38,7 +38,7 @@ public void call(final Subscriber childSubscriber) { childSubscriber.setProducer(new RangeProducer(childSubscriber, startIndex, endIndex)); } - private static final class RangeProducer extends AtomicLong implements Producer { + static final class RangeProducer extends AtomicLong implements Producer { /** */ private static final long serialVersionUID = 4114392207069098388L; diff --git a/src/main/java/rx/internal/operators/OnSubscribeRedo.java b/src/main/java/rx/internal/operators/OnSubscribeRedo.java index d30ddc1343..c41b211558 100644 --- a/src/main/java/rx/internal/operators/OnSubscribeRedo.java +++ b/src/main/java/rx/internal/operators/OnSubscribeRedo.java @@ -53,6 +53,11 @@ import rx.subscriptions.SerialSubscription; public final class OnSubscribeRedo implements OnSubscribe { + final Observable source; + private final Func1>, ? extends Observable> controlHandlerFunction; + final boolean stopOnComplete; + final boolean stopOnError; + private final Scheduler scheduler; static final Func1>, Observable> REDO_INFINITE = new Func1>, Observable>() { @Override @@ -77,7 +82,7 @@ public RedoFinite(long count) { public Observable call(Observable> ts) { return ts.map(new Func1, Notification>() { - int num=0; + int num; @Override public Notification call(Notification terminalNotification) { @@ -111,10 +116,11 @@ public Observable> call(Observable call(Notification n, Notification term) { final int value = n.getValue(); - if (predicate.call(value, term.getThrowable())) + if (predicate.call(value, term.getThrowable())) { return Notification.createOnNext(value + 1); - else + } else { return (Notification) term; + } } }); } @@ -125,10 +131,12 @@ public static Observable retry(Observable source) { } public static Observable retry(Observable source, final long count) { - if (count < 0) + if (count < 0) { throw new IllegalArgumentException("count >= 0 expected"); - if (count == 0) + } + if (count == 0) { return source; + } return retry(source, new RedoFinite(count)); } @@ -156,8 +164,9 @@ public static Observable repeat(Observable source, final long count, S if(count == 0) { return Observable.empty(); } - if (count < 0) + if (count < 0) { throw new IllegalArgumentException("count >= 0 expected"); + } return repeat(source, new RedoFinite(count - 1), scheduler); } @@ -173,12 +182,6 @@ public static Observable redo(Observable source, Func1(source, notificationHandler, false, false, scheduler)); } - final Observable source; - private final Func1>, ? extends Observable> controlHandlerFunction; - final boolean stopOnComplete; - final boolean stopOnError; - private final Scheduler scheduler; - private OnSubscribeRedo(Observable source, Func1>, ? extends Observable> f, boolean stopOnComplete, boolean stopOnError, Scheduler scheduler) { this.source = source; @@ -362,8 +365,9 @@ public void request(final long n) { if (n > 0) { BackpressureUtils.getAndAddRequest(consumerCapacity, n); arbiter.request(n); - if (resumeBoundary.compareAndSet(true, false)) + if (resumeBoundary.compareAndSet(true, false)) { worker.schedule(subscribeToSource); + } } } }); diff --git a/src/main/java/rx/internal/operators/OnSubscribeSingle.java b/src/main/java/rx/internal/operators/OnSubscribeSingle.java index 7bfdcca511..90dc8d288e 100644 --- a/src/main/java/rx/internal/operators/OnSubscribeSingle.java +++ b/src/main/java/rx/internal/operators/OnSubscribeSingle.java @@ -38,9 +38,9 @@ public OnSubscribeSingle(Observable observable) { @Override public void call(final SingleSubscriber child) { Subscriber parent = new Subscriber() { - private boolean emittedTooMany = false; - private boolean itemEmitted = false; - private T emission = null; + private boolean emittedTooMany; + private boolean itemEmitted; + private T emission; @Override public void onStart() { diff --git a/src/main/java/rx/internal/operators/OnSubscribeUsing.java b/src/main/java/rx/internal/operators/OnSubscribeUsing.java index 352c699056..5b5a9259fb 100644 --- a/src/main/java/rx/internal/operators/OnSubscribeUsing.java +++ b/src/main/java/rx/internal/operators/OnSubscribeUsing.java @@ -58,7 +58,7 @@ public void call(final Subscriber subscriber) { // dispose on unsubscription subscriber.add(disposeOnceOnly); // create the observable - final Observable source; + Observable source; try { source = observableFactory @@ -77,7 +77,7 @@ public void call(final Subscriber subscriber) { return; } - final Observable observable; + Observable observable; // supplement with on termination disposal if requested if (disposeEagerly) { observable = source @@ -96,11 +96,12 @@ public void call(final Subscriber subscriber) { Throwable disposeError = dispose(disposeOnceOnly); Exceptions.throwIfFatal(e); Exceptions.throwIfFatal(disposeError); - if (disposeError != null) + if (disposeError != null) { subscriber.onError(new CompositeException(e, disposeError)); - else + } else { // propagate error subscriber.onError(e); + } } } catch (Throwable e) { // then propagate error @@ -117,7 +118,7 @@ private Throwable dispose(final Action0 disposeOnceOnly) { } } - private static final class DisposeAction extends AtomicBoolean implements Action0, + static final class DisposeAction extends AtomicBoolean implements Action0, Subscription { private static final long serialVersionUID = 4262875056400218316L; diff --git a/src/main/java/rx/internal/operators/OperatorAsObservable.java b/src/main/java/rx/internal/operators/OperatorAsObservable.java index 9cb9d8ac56..33671e8f2e 100644 --- a/src/main/java/rx/internal/operators/OperatorAsObservable.java +++ b/src/main/java/rx/internal/operators/OperatorAsObservable.java @@ -26,7 +26,7 @@ */ public final class OperatorAsObservable implements Operator { /** Lazy initialization via inner-class holder. */ - private static final class Holder { + static final class Holder { /** A singleton instance. */ static final OperatorAsObservable INSTANCE = new OperatorAsObservable(); } @@ -38,7 +38,10 @@ private static final class Holder { public static OperatorAsObservable instance() { return (OperatorAsObservable)Holder.INSTANCE; } - OperatorAsObservable() { } + OperatorAsObservable() { + // singleton + } + @Override public Subscriber call(Subscriber s) { return s; diff --git a/src/main/java/rx/internal/operators/OperatorDebounceWithTime.java b/src/main/java/rx/internal/operators/OperatorDebounceWithTime.java index f98639aff3..50c2418228 100644 --- a/src/main/java/rx/internal/operators/OperatorDebounceWithTime.java +++ b/src/main/java/rx/internal/operators/OperatorDebounceWithTime.java @@ -110,7 +110,7 @@ static final class DebounceState { /** Guarded by this. */ boolean emitting; - public synchronized int next(T value) { + public synchronized int next(T value) { // NOPMD this.value = value; this.hasValue = true; return ++index; @@ -173,7 +173,7 @@ public void emitAndComplete(Subscriber onNextAndComplete, Subscriber onErr } onNextAndComplete.onCompleted(); } - public synchronized void clear() { + public synchronized void clear() { // NOPMD ++index; value = null; hasValue = false; diff --git a/src/main/java/rx/internal/operators/OperatorDematerialize.java b/src/main/java/rx/internal/operators/OperatorDematerialize.java index 5fd8d7fdfa..23eea9f1e8 100644 --- a/src/main/java/rx/internal/operators/OperatorDematerialize.java +++ b/src/main/java/rx/internal/operators/OperatorDematerialize.java @@ -31,7 +31,7 @@ */ public final class OperatorDematerialize implements Operator> { /** Lazy initialization via inner-class holder. */ - private static final class Holder { + static final class Holder { /** A singleton instance. */ static final OperatorDematerialize INSTANCE = new OperatorDematerialize(); } @@ -42,7 +42,10 @@ private static final class Holder { public static OperatorDematerialize instance() { return Holder.INSTANCE; // using raw types because the type inference is not good enough } - OperatorDematerialize() { } + OperatorDematerialize() { + // singleton + } + @Override public Subscriber> call(final Subscriber child) { return new Subscriber>(child) { @@ -62,6 +65,9 @@ public void onNext(Notification t) { case OnCompleted: onCompleted(); break; + default: + onError(new IllegalArgumentException("Unsupported notification type: " + t)); + break; } } diff --git a/src/main/java/rx/internal/operators/OperatorDistinct.java b/src/main/java/rx/internal/operators/OperatorDistinct.java index a581b1b1e0..716353e272 100644 --- a/src/main/java/rx/internal/operators/OperatorDistinct.java +++ b/src/main/java/rx/internal/operators/OperatorDistinct.java @@ -32,7 +32,7 @@ public final class OperatorDistinct implements Operator { final Func1 keySelector; - private static class Holder { + static final class Holder { static final OperatorDistinct INSTANCE = new OperatorDistinct(UtilityFunctions.identity()); } diff --git a/src/main/java/rx/internal/operators/OperatorDistinctUntilChanged.java b/src/main/java/rx/internal/operators/OperatorDistinctUntilChanged.java index 43529df76f..9d75db915d 100644 --- a/src/main/java/rx/internal/operators/OperatorDistinctUntilChanged.java +++ b/src/main/java/rx/internal/operators/OperatorDistinctUntilChanged.java @@ -31,7 +31,7 @@ public final class OperatorDistinctUntilChanged implements Operator, final Func2 comparator; - private static class Holder { + static final class Holder { static final OperatorDistinctUntilChanged INSTANCE = new OperatorDistinctUntilChanged(UtilityFunctions.identity()); } @@ -72,14 +72,14 @@ public Subscriber call(final Subscriber child) { boolean hasPrevious; @Override public void onNext(T t) { - U currentKey = previousKey; - final U key; + U key; try { key = keySelector.call(t); } catch (Throwable e) { Exceptions.throwOrReport(e, child, t); return; } + U currentKey = previousKey; previousKey = key; if (hasPrevious) { diff --git a/src/main/java/rx/internal/operators/OperatorDoOnEach.java b/src/main/java/rx/internal/operators/OperatorDoOnEach.java index e0e71a2188..0e3034a425 100644 --- a/src/main/java/rx/internal/operators/OperatorDoOnEach.java +++ b/src/main/java/rx/internal/operators/OperatorDoOnEach.java @@ -36,7 +36,7 @@ public OperatorDoOnEach(Observer doOnEachObserver) { public Subscriber call(final Subscriber observer) { return new Subscriber(observer) { - private boolean done = false; + private boolean done; @Override public void onCompleted() { diff --git a/src/main/java/rx/internal/operators/OperatorDoOnRequest.java b/src/main/java/rx/internal/operators/OperatorDoOnRequest.java index d45e895b40..e59d1f04d5 100644 --- a/src/main/java/rx/internal/operators/OperatorDoOnRequest.java +++ b/src/main/java/rx/internal/operators/OperatorDoOnRequest.java @@ -53,7 +53,7 @@ public void request(long n) { return parent; } - private static final class ParentSubscriber extends Subscriber { + static final class ParentSubscriber extends Subscriber { private final Subscriber child; ParentSubscriber(Subscriber child) { diff --git a/src/main/java/rx/internal/operators/OperatorEagerConcatMap.java b/src/main/java/rx/internal/operators/OperatorEagerConcatMap.java index cfa46837b5..a779720396 100644 --- a/src/main/java/rx/internal/operators/OperatorEagerConcatMap.java +++ b/src/main/java/rx/internal/operators/OperatorEagerConcatMap.java @@ -73,7 +73,7 @@ static final class EagerOuterSubscriber extends Subscriber { final int bufferSize; final Subscriber actual; - final LinkedList> subscribers; + final Queue> subscribers; volatile boolean done; Throwable error; @@ -131,10 +131,12 @@ public void onNext(T t) { return; } - EagerInnerSubscriber inner = new EagerInnerSubscriber(this, bufferSize); if (cancelled) { return; } + + EagerInnerSubscriber inner = new EagerInnerSubscriber(this, bufferSize); + synchronized (subscribers) { if (cancelled) { return; @@ -202,7 +204,6 @@ void drain() { if (!empty) { long requestedAmount = requested.get(); long emittedAmount = 0L; - boolean unbounded = requestedAmount == Long.MAX_VALUE; Queue innerQueue = innerSubscriber.queue; boolean innerDone = false; @@ -235,7 +236,7 @@ void drain() { break; } - if (requestedAmount == 0L) { + if (requestedAmount == emittedAmount) { break; } @@ -248,16 +249,15 @@ void drain() { return; } - requestedAmount--; - emittedAmount--; + emittedAmount++; } if (emittedAmount != 0L) { - if (!unbounded) { - requested.addAndGet(emittedAmount); + if (requestedAmount != Long.MAX_VALUE) { + BackpressureUtils.produced(requested, emittedAmount); } if (!innerDone) { - innerSubscriber.requestMore(-emittedAmount); + innerSubscriber.requestMore(emittedAmount); } } diff --git a/src/main/java/rx/internal/operators/OperatorElementAt.java b/src/main/java/rx/internal/operators/OperatorElementAt.java index 6f79d6a285..3fa581b8d2 100644 --- a/src/main/java/rx/internal/operators/OperatorElementAt.java +++ b/src/main/java/rx/internal/operators/OperatorElementAt.java @@ -52,7 +52,7 @@ private OperatorElementAt(int index, T defaultValue, boolean hasDefault) { public Subscriber call(final Subscriber child) { Subscriber parent = new Subscriber() { - private int currentIndex = 0; + private int currentIndex; @Override public void onNext(T value) { diff --git a/src/main/java/rx/internal/operators/OperatorGroupBy.java b/src/main/java/rx/internal/operators/OperatorGroupBy.java index 4ed1a504f3..954b1ac6c5 100644 --- a/src/main/java/rx/internal/operators/OperatorGroupBy.java +++ b/src/main/java/rx/internal/operators/OperatorGroupBy.java @@ -266,10 +266,9 @@ void drain() { } long r = requested.get(); - boolean unbounded = r == Long.MAX_VALUE; long e = 0L; - while (r != 0) { + while (e != r) { boolean d = done; GroupedObservable t = q.poll(); @@ -286,15 +285,14 @@ void drain() { a.onNext(t); - r--; - e--; + e++; } if (e != 0L) { - if (!unbounded) { - requested.addAndGet(e); + if (r != Long.MAX_VALUE) { + BackpressureUtils.produced(requested, e); } - s.request(-e); + s.request(e); } missed = wip.addAndGet(-missed); @@ -334,14 +332,14 @@ boolean checkTerminated(boolean d, boolean empty, } static final class GroupedUnicast extends GroupedObservable { + final State state; + public static GroupedUnicast createWith(K key, int bufferSize, GroupBySubscriber parent, boolean delayError) { State state = new State(bufferSize, parent, key, delayError); return new GroupedUnicast(key, state); } - final State state; - protected GroupedUnicast(K key, State state) { super(key, state); this.state = state; @@ -381,7 +379,7 @@ static final class State extends AtomicInteger implements Producer, Subscr final AtomicBoolean once; - public State(int bufferSize, GroupBySubscriber parent, K key, boolean delayError) { + public State(int bufferSize, GroupBySubscriber parent, K key, boolean delayError) { // NOPMD this.queue = new ConcurrentLinkedQueue(); this.parent = parent; this.key = key; @@ -467,10 +465,9 @@ void drain() { } long r = requested.get(); - boolean unbounded = r == Long.MAX_VALUE; long e = 0; - while (r != 0L) { + while (e != r) { boolean d = done; Object v = q.poll(); boolean empty = v == null; @@ -485,15 +482,14 @@ void drain() { a.onNext(nl.getValue(v)); - r--; - e--; + e++; } if (e != 0L) { - if (!unbounded) { - requested.addAndGet(e); + if (r != Long.MAX_VALUE) { + BackpressureUtils.produced(requested, e); } - parent.s.request(-e); + parent.s.request(e); } } diff --git a/src/main/java/rx/internal/operators/OperatorIgnoreElements.java b/src/main/java/rx/internal/operators/OperatorIgnoreElements.java index 00098f85a2..b85fb54359 100644 --- a/src/main/java/rx/internal/operators/OperatorIgnoreElements.java +++ b/src/main/java/rx/internal/operators/OperatorIgnoreElements.java @@ -20,7 +20,7 @@ public class OperatorIgnoreElements implements Operator { - private static class Holder { + static final class Holder { static final OperatorIgnoreElements INSTANCE = new OperatorIgnoreElements(); } @@ -30,7 +30,7 @@ public static OperatorIgnoreElements instance() { } OperatorIgnoreElements() { - + // singleton } @Override diff --git a/src/main/java/rx/internal/operators/OperatorMapPair.java b/src/main/java/rx/internal/operators/OperatorMapPair.java index 5db9596b6b..a9733c7d88 100644 --- a/src/main/java/rx/internal/operators/OperatorMapPair.java +++ b/src/main/java/rx/internal/operators/OperatorMapPair.java @@ -34,6 +34,8 @@ * the type of items to be emitted by this {@code Operator} */ public final class OperatorMapPair implements Operator, T> { + final Func1> collectionSelector; + final Func2 resultSelector; /** * Creates the function that generates a {@code Observable} based on an item emitted by another {@code Observable}. @@ -54,9 +56,6 @@ public Observable call(T t1) { }; } - final Func1> collectionSelector; - final Func2 resultSelector; - public OperatorMapPair(final Func1> collectionSelector, final Func2 resultSelector) { this.collectionSelector = collectionSelector; this.resultSelector = resultSelector; diff --git a/src/main/java/rx/internal/operators/OperatorMaterialize.java b/src/main/java/rx/internal/operators/OperatorMaterialize.java index 4d01dadf39..aebecf5029 100644 --- a/src/main/java/rx/internal/operators/OperatorMaterialize.java +++ b/src/main/java/rx/internal/operators/OperatorMaterialize.java @@ -33,7 +33,7 @@ public final class OperatorMaterialize implements Operator, T> { /** Lazy initialization via inner-class holder. */ - private static final class Holder { + static final class Holder { /** A singleton instance. */ static final OperatorMaterialize INSTANCE = new OperatorMaterialize(); } @@ -48,6 +48,7 @@ public static OperatorMaterialize instance() { } OperatorMaterialize() { + // singleton instances } @Override @@ -65,16 +66,16 @@ public void request(long n) { return parent; } - private static class ParentSubscriber extends Subscriber { + static class ParentSubscriber extends Subscriber { private final Subscriber> child; private volatile Notification terminalNotification; // guarded by this - private boolean busy = false; + private boolean busy; // guarded by this - private boolean missed = false; + private boolean missed; private final AtomicLong requested = new AtomicLong(); diff --git a/src/main/java/rx/internal/operators/OperatorMerge.java b/src/main/java/rx/internal/operators/OperatorMerge.java index 3391d18cd8..71d74713bf 100644 --- a/src/main/java/rx/internal/operators/OperatorMerge.java +++ b/src/main/java/rx/internal/operators/OperatorMerge.java @@ -53,13 +53,16 @@ * the type of the items emitted by both the source and merged {@code Observable}s */ public final class OperatorMerge implements Operator> { + final boolean delayErrors; + final int maxConcurrent; + /** Lazy initialization via inner-class holder. */ - private static final class HolderNoDelay { + static final class HolderNoDelay { /** A singleton instance. */ static final OperatorMerge INSTANCE = new OperatorMerge(false, Integer.MAX_VALUE); } /** Lazy initialization via inner-class holder. */ - private static final class HolderDelayErrors { + static final class HolderDelayErrors { /** A singleton instance. */ static final OperatorMerge INSTANCE = new OperatorMerge(true, Integer.MAX_VALUE); } @@ -92,9 +95,6 @@ public static OperatorMerge instance(boolean delayErrors, int maxConcurre return new OperatorMerge(delayErrors, maxConcurrent); } - final boolean delayErrors; - final int maxConcurrent; - OperatorMerge(boolean delayErrors, int maxConcurrent) { this.delayErrors = delayErrors; this.maxConcurrent = maxConcurrent; @@ -824,7 +824,7 @@ static final class InnerSubscriber extends Subscriber { volatile boolean done; volatile RxRingBuffer queue; int outstanding; - static final int limit = RxRingBuffer.SIZE / 4; + static final int LIMIT = RxRingBuffer.SIZE / 4; public InnerSubscriber(MergeSubscriber parent, long id) { this.parent = parent; @@ -852,7 +852,7 @@ public void onCompleted() { } public void requestMore(long n) { int r = outstanding - (int)n; - if (r > limit) { + if (r > LIMIT) { outstanding = r; return; } diff --git a/src/main/java/rx/internal/operators/OperatorMulticast.java b/src/main/java/rx/internal/operators/OperatorMulticast.java index ee5551fcef..965b850f5d 100644 --- a/src/main/java/rx/internal/operators/OperatorMulticast.java +++ b/src/main/java/rx/internal/operators/OperatorMulticast.java @@ -104,8 +104,9 @@ public void call() { subscription = null; guardedSubscription = null; connectedSubject.set(null); - } else + } else { return; + } } if (s != null) { s.unsubscribe(); @@ -149,7 +150,8 @@ public void onCompleted() { synchronized (guard) { sub = subscription; } - if (sub != null) + if (sub != null) { ((Observable)source).subscribe(sub); + } } } \ No newline at end of file diff --git a/src/main/java/rx/internal/operators/OperatorObserveOn.java b/src/main/java/rx/internal/operators/OperatorObserveOn.java index 42fc5518ae..57145ec27a 100644 --- a/src/main/java/rx/internal/operators/OperatorObserveOn.java +++ b/src/main/java/rx/internal/operators/OperatorObserveOn.java @@ -89,7 +89,7 @@ public Subscriber call(Subscriber child) { } /** Observe through individual queue per observer. */ - private static final class ObserveOnSubscriber extends Subscriber implements Action0 { + static final class ObserveOnSubscriber extends Subscriber implements Action0 { final Subscriber child; final Scheduler.Worker recursiveScheduler; final NotificationLite on; diff --git a/src/main/java/rx/internal/operators/OperatorOnBackpressureBuffer.java b/src/main/java/rx/internal/operators/OperatorOnBackpressureBuffer.java index 04e6e81be9..8c14a70334 100644 --- a/src/main/java/rx/internal/operators/OperatorOnBackpressureBuffer.java +++ b/src/main/java/rx/internal/operators/OperatorOnBackpressureBuffer.java @@ -19,7 +19,6 @@ import java.util.concurrent.atomic.AtomicBoolean; import java.util.concurrent.atomic.AtomicLong; -import rx.BackpressureOverflow; import rx.Observable.Operator; import rx.Producer; import rx.Subscriber; @@ -34,9 +33,9 @@ public class OperatorOnBackpressureBuffer implements Operator { private final Long capacity; private final Action0 onOverflow; - private final BackpressureOverflow.Strategy overflowStrategy; + private final Strategy overflowStrategy; - private static class Holder { + static final class Holder { static final OperatorOnBackpressureBuffer INSTANCE = new OperatorOnBackpressureBuffer(); } @@ -80,7 +79,7 @@ public OperatorOnBackpressureBuffer(long capacity, Action0 onOverflow) { * @param overflowStrategy the {@code BackpressureOverflow.Strategy} to handle overflows, it must not be null. */ public OperatorOnBackpressureBuffer(long capacity, Action0 onOverflow, - BackpressureOverflow.Strategy overflowStrategy) { + Strategy overflowStrategy) { if (capacity <= 0) { throw new IllegalArgumentException("Buffer capacity must be > 0"); } @@ -107,7 +106,7 @@ public Subscriber call(final Subscriber child) { return parent; } - private static final class BufferSubscriber extends Subscriber implements BackpressureDrainManager.BackpressureQueueCallback { + static final class BufferSubscriber extends Subscriber implements BackpressureDrainManager.BackpressureQueueCallback { // TODO get a different queue implementation private final ConcurrentLinkedQueue queue = new ConcurrentLinkedQueue(); private final AtomicLong capacity; @@ -116,10 +115,10 @@ private static final class BufferSubscriber extends Subscriber implements private final BackpressureDrainManager manager; private final NotificationLite on = NotificationLite.instance(); private final Action0 onOverflow; - private final BackpressureOverflow.Strategy overflowStrategy; + private final Strategy overflowStrategy; public BufferSubscriber(final Subscriber child, Long capacity, Action0 onOverflow, - BackpressureOverflow.Strategy overflowStrategy) { + Strategy overflowStrategy) { this.child = child; this.capacity = capacity != null ? new AtomicLong(capacity) : null; this.onOverflow = onOverflow; diff --git a/src/main/java/rx/internal/operators/OperatorOnBackpressureDrop.java b/src/main/java/rx/internal/operators/OperatorOnBackpressureDrop.java index 98f4f9479d..63e13da125 100644 --- a/src/main/java/rx/internal/operators/OperatorOnBackpressureDrop.java +++ b/src/main/java/rx/internal/operators/OperatorOnBackpressureDrop.java @@ -25,8 +25,10 @@ public class OperatorOnBackpressureDrop implements Operator { + final Action1 onDrop; + /** Lazy initialization via inner-class holder. */ - private static final class Holder { + static final class Holder { /** A singleton instance. */ static final OperatorOnBackpressureDrop INSTANCE = new OperatorOnBackpressureDrop(); } @@ -40,8 +42,6 @@ public static OperatorOnBackpressureDrop instance() { return (OperatorOnBackpressureDrop)Holder.INSTANCE; } - final Action1 onDrop; - OperatorOnBackpressureDrop() { this(null); } diff --git a/src/main/java/rx/internal/operators/OperatorPublish.java b/src/main/java/rx/internal/operators/OperatorPublish.java index 1e5002e116..1d5781a39f 100644 --- a/src/main/java/rx/internal/operators/OperatorPublish.java +++ b/src/main/java/rx/internal/operators/OperatorPublish.java @@ -109,7 +109,7 @@ public void call(Subscriber child) { // setting the producer will trigger the first request to be considered by // the subscriber-to-source. child.setProducer(inner); - break; + break; // NOPMD } } }; @@ -194,7 +194,7 @@ public void connect(Action1 connection) { // if connect() was called concurrently, only one of them should actually // connect to the source doConnect = !ps.shouldConnect.get() && ps.shouldConnect.compareAndSet(false, true); - break; + break; // NOPMD } /* * Notify the callback that we have a (new) connection which it can unsubscribe diff --git a/src/main/java/rx/internal/operators/OperatorReplay.java b/src/main/java/rx/internal/operators/OperatorReplay.java index 84338b96f9..86774cbd39 100644 --- a/src/main/java/rx/internal/operators/OperatorReplay.java +++ b/src/main/java/rx/internal/operators/OperatorReplay.java @@ -210,7 +210,7 @@ public void call(Subscriber child) { // if there isn't one if (r == null) { // create a new subscriber to source - ReplaySubscriber u = new ReplaySubscriber(curr, bufferFactory.call()); + ReplaySubscriber u = new ReplaySubscriber(bufferFactory.call()); // perform extra initialization to avoid 'this' to escape during construction u.init(); // let's try setting it as the current subscriber-to-source @@ -239,7 +239,7 @@ public void call(Subscriber child) { // setting the producer will trigger the first request to be considered by // the subscriber-to-source. child.setProducer(inner); - break; + break; // NOPMD } } }; @@ -265,7 +265,7 @@ public void connect(Action1 connection) { // if there is none yet or the current has unsubscribed if (ps == null || ps.isUnsubscribed()) { // create a new subscriber-to-source - ReplaySubscriber u = new ReplaySubscriber(current, bufferFactory.call()); + ReplaySubscriber u = new ReplaySubscriber(bufferFactory.call()); // initialize out the constructor to avoid 'this' to escape u.init(); // try setting it as the current subscriber-to-source @@ -279,7 +279,7 @@ public void connect(Action1 connection) { // if connect() was called concurrently, only one of them should actually // connect to the source doConnect = !ps.shouldConnect.get() && ps.shouldConnect.compareAndSet(false, true); - break; + break; // NOPMD } /* * Notify the callback that we have a (new) connection which it can unsubscribe @@ -349,8 +349,7 @@ static final class ReplaySubscriber extends Subscriber implements Subscrip boolean coordinateAll; @SuppressWarnings("unchecked") - public ReplaySubscriber(AtomicReference> current, - ReplayBuffer buffer) { + public ReplaySubscriber(ReplayBuffer buffer) { this.buffer = buffer; this.nl = NotificationLite.instance(); @@ -880,10 +879,9 @@ public void replay(InnerProducer output) { int destIndex = destIndexObject != null ? destIndexObject : 0; long r = output.get(); - long r0 = r; long e = 0L; - while (r != 0L && destIndex < sourceIndex) { + while (e != r && destIndex < sourceIndex) { Object o = get(destIndex); try { if (nl.accept(output.child, o)) { @@ -901,12 +899,11 @@ public void replay(InnerProducer output) { return; } destIndex++; - r--; e++; } if (e != 0L) { output.index = destIndex; - if (r0 != Long.MAX_VALUE) { + if (r != Long.MAX_VALUE) { output.produced(e); } } @@ -1053,10 +1050,6 @@ public final void replay(InnerProducer output) { return; } - long r = output.get(); - boolean unbounded = r == Long.MAX_VALUE; - long e = 0L; - Node node = output.index(); if (node == null) { node = getInitialHead(); @@ -1073,7 +1066,10 @@ public final void replay(InnerProducer output) { return; } - while (r != 0) { + long r = output.get(); + long e = 0L; + + while (e != r) { Node v = node.get(); if (v != null) { Object o = leaveTransform(v.value); @@ -1092,7 +1088,6 @@ public final void replay(InnerProducer output) { return; } e++; - r--; node = v; } else { break; @@ -1104,7 +1099,7 @@ public final void replay(InnerProducer output) { if (e != 0L) { output.index = node; - if (!unbounded) { + if (r != Long.MAX_VALUE) { output.produced(e); } } @@ -1143,14 +1138,14 @@ Object leaveTransform(Object value) { * based on its current properties. */ void truncate() { - + // no op by default } /** * Override this method to truncate a terminated buffer * based on its properties (i.e., truncate but the very last node). */ void truncateFinal() { - + // no op by default } /* test */ final void collect(Collection output) { Node n = getInitialHead(); diff --git a/src/main/java/rx/internal/operators/OperatorScan.java b/src/main/java/rx/internal/operators/OperatorScan.java index 547edf5c1b..e386c6cb16 100644 --- a/src/main/java/rx/internal/operators/OperatorScan.java +++ b/src/main/java/rx/internal/operators/OperatorScan.java @@ -303,14 +303,13 @@ void emitLoop() { long r = requested.get(); for (;;) { - boolean max = r == Long.MAX_VALUE; boolean d = done; boolean empty = queue.isEmpty(); if (checkTerminated(d, empty, child)) { return; } long e = 0L; - while (r != 0L) { + while (e != r) { d = done; Object o = queue.poll(); empty = o == null; @@ -327,12 +326,11 @@ void emitLoop() { Exceptions.throwOrReport(ex, child, v); return; } - r--; - e--; + e++; } - if (e != 0 && !max) { - r = requested.addAndGet(e); + if (e != 0 && r != Long.MAX_VALUE) { + r = BackpressureUtils.produced(requested, e); } synchronized (this) { diff --git a/src/main/java/rx/internal/operators/OperatorSequenceEqual.java b/src/main/java/rx/internal/operators/OperatorSequenceEqual.java index 53deb16edf..05ad83bdc9 100644 --- a/src/main/java/rx/internal/operators/OperatorSequenceEqual.java +++ b/src/main/java/rx/internal/operators/OperatorSequenceEqual.java @@ -28,12 +28,14 @@ * {@code Observable}s emit sequences of items that are equivalent to each other. */ public final class OperatorSequenceEqual { + + /** NotificationLite doesn't work as zip uses it. */ + static final Object LOCAL_ONCOMPLETED = new Object(); + private OperatorSequenceEqual() { throw new IllegalStateException("No instances!"); } - /** NotificationLite doesn't work as zip uses it. */ - static final Object LOCAL_ONCOMPLETED = new Object(); static Observable materializeLite(Observable source) { return concat( source.map(new Func1() { diff --git a/src/main/java/rx/internal/operators/OperatorSerialize.java b/src/main/java/rx/internal/operators/OperatorSerialize.java index 9c313f450e..2ceada9b71 100644 --- a/src/main/java/rx/internal/operators/OperatorSerialize.java +++ b/src/main/java/rx/internal/operators/OperatorSerialize.java @@ -21,7 +21,7 @@ public final class OperatorSerialize implements Operator { /** Lazy initialization via inner-class holder. */ - private static final class Holder { + static final class Holder { /** A singleton instance. */ static final OperatorSerialize INSTANCE = new OperatorSerialize(); } @@ -33,7 +33,11 @@ private static final class Holder { public static OperatorSerialize instance() { return (OperatorSerialize)Holder.INSTANCE; } - OperatorSerialize() { } + + OperatorSerialize() { + // singleton + } + @Override public Subscriber call(final Subscriber s) { return new SerializedSubscriber(new Subscriber(s) { diff --git a/src/main/java/rx/internal/operators/OperatorSingle.java b/src/main/java/rx/internal/operators/OperatorSingle.java index 2ecdbfecb0..7984d06786 100644 --- a/src/main/java/rx/internal/operators/OperatorSingle.java +++ b/src/main/java/rx/internal/operators/OperatorSingle.java @@ -33,7 +33,7 @@ public final class OperatorSingle implements Operator { private final boolean hasDefaultValue; private final T defaultValue; - private static class Holder { + static final class Holder { final static OperatorSingle INSTANCE = new OperatorSingle(); } @@ -71,7 +71,7 @@ public Subscriber call(final Subscriber child) { return parent; } - private static final class ParentSubscriber extends Subscriber { + static final class ParentSubscriber extends Subscriber { private final Subscriber child; private final boolean hasDefaultValue; private final T defaultValue; diff --git a/src/main/java/rx/internal/operators/OperatorSkip.java b/src/main/java/rx/internal/operators/OperatorSkip.java index 6b06fe47b4..cdd0511075 100644 --- a/src/main/java/rx/internal/operators/OperatorSkip.java +++ b/src/main/java/rx/internal/operators/OperatorSkip.java @@ -42,7 +42,7 @@ public OperatorSkip(int n) { public Subscriber call(final Subscriber child) { return new Subscriber(child) { - int skipped = 0; + int skipped; @Override public void onCompleted() { diff --git a/src/main/java/rx/internal/operators/OperatorSkipWhile.java b/src/main/java/rx/internal/operators/OperatorSkipWhile.java index b62e7f24a5..328c2a7b4b 100644 --- a/src/main/java/rx/internal/operators/OperatorSkipWhile.java +++ b/src/main/java/rx/internal/operators/OperatorSkipWhile.java @@ -42,7 +42,7 @@ public void onNext(T t) { if (!skipping) { child.onNext(t); } else { - final boolean skip; + boolean skip; try { skip = predicate.call(t, index++); } catch (Throwable e) { diff --git a/src/main/java/rx/internal/operators/OperatorSwitch.java b/src/main/java/rx/internal/operators/OperatorSwitch.java index c76e3008c9..8c8be1dbec 100644 --- a/src/main/java/rx/internal/operators/OperatorSwitch.java +++ b/src/main/java/rx/internal/operators/OperatorSwitch.java @@ -37,13 +37,14 @@ * @param the value type */ public final class OperatorSwitch implements Operator> { + final boolean delayError; /** Lazy initialization via inner-class holder. */ - private static final class Holder { + static final class Holder { /** A singleton instance. */ static final OperatorSwitch INSTANCE = new OperatorSwitch(false); } /** Lazy initialization via inner-class holder. */ - private static final class HolderDelayError { + static final class HolderDelayError { /** A singleton instance. */ static final OperatorSwitch INSTANCE = new OperatorSwitch(true); } @@ -61,8 +62,6 @@ public static OperatorSwitch instance(boolean delayError) { return (OperatorSwitch)Holder.INSTANCE; } - final boolean delayError; - OperatorSwitch(boolean delayError) { this.delayError = delayError; } @@ -75,7 +74,7 @@ public Subscriber> call(final Subscriber extends Subscriber> { + static final class SwitchSubscriber extends Subscriber> { final Subscriber child; final SerialSubscription ssub; final boolean delayError; @@ -267,7 +266,6 @@ void childRequested(long n) { } void drain() { - boolean localMainDone = mainDone; boolean localInnerActive; long localRequested; Throwable localError; @@ -288,6 +286,7 @@ void drain() { final SpscLinkedArrayQueue localQueue = queue; final AtomicLong localIndex = index; final Subscriber localChild = child; + boolean localMainDone = mainDone; for (;;) { diff --git a/src/main/java/rx/internal/operators/OperatorSwitchIfEmpty.java b/src/main/java/rx/internal/operators/OperatorSwitchIfEmpty.java index 40b44289b7..890f18cebf 100644 --- a/src/main/java/rx/internal/operators/OperatorSwitchIfEmpty.java +++ b/src/main/java/rx/internal/operators/OperatorSwitchIfEmpty.java @@ -44,7 +44,7 @@ public Subscriber call(Subscriber child) { return parent; } - private static final class ParentSubscriber extends Subscriber { + static final class ParentSubscriber extends Subscriber { private boolean empty = true; private final Subscriber child; @@ -92,7 +92,7 @@ public void onNext(T t) { } } - private static final class AlternateSubscriber extends Subscriber { + static final class AlternateSubscriber extends Subscriber { private final ProducerArbiter arbiter; private final Subscriber child; diff --git a/src/main/java/rx/internal/operators/OperatorTake.java b/src/main/java/rx/internal/operators/OperatorTake.java index d08c5a3b92..c8b600acfc 100644 --- a/src/main/java/rx/internal/operators/OperatorTake.java +++ b/src/main/java/rx/internal/operators/OperatorTake.java @@ -104,9 +104,9 @@ public void request(long n) { while (true) { long r = requested.get(); long c = Math.min(n, limit - r); - if (c == 0) + if (c == 0) { break; - else if (requested.compareAndSet(r, r + c)) { + } else if (requested.compareAndSet(r, r + c)) { producer.request(c); break; } diff --git a/src/main/java/rx/internal/operators/OperatorTakeLastOne.java b/src/main/java/rx/internal/operators/OperatorTakeLastOne.java index 2c20f2a465..a1ab397ba5 100644 --- a/src/main/java/rx/internal/operators/OperatorTakeLastOne.java +++ b/src/main/java/rx/internal/operators/OperatorTakeLastOne.java @@ -25,7 +25,7 @@ public class OperatorTakeLastOne implements Operator { - private static class Holder { + static final class Holder { static final OperatorTakeLastOne INSTANCE = new OperatorTakeLastOne(); } @@ -35,7 +35,7 @@ public static OperatorTakeLastOne instance() { } OperatorTakeLastOne() { - + // singleton } @Override @@ -52,7 +52,7 @@ public void request(long n) { return parent; } - private static class ParentSubscriber extends Subscriber { + static final class ParentSubscriber extends Subscriber { private final static int NOT_REQUESTED_NOT_COMPLETED = 0; private final static int NOT_REQUESTED_COMPLETED = 1; @@ -109,9 +109,10 @@ void requestMore(long n) { emit(); return; } - } else + } else { // already requested so we exit return; + } } } } @@ -141,9 +142,10 @@ public void onCompleted() { emit(); return; } - } else + } else { // already completed so we exit return; + } } } @@ -171,8 +173,9 @@ private void emit() { return; } } - if (!isUnsubscribed()) + if (!isUnsubscribed()) { child.onCompleted(); + } } @Override diff --git a/src/main/java/rx/internal/operators/OperatorTakeUntilPredicate.java b/src/main/java/rx/internal/operators/OperatorTakeUntilPredicate.java index 8ed22f9108..0b19f2e051 100644 --- a/src/main/java/rx/internal/operators/OperatorTakeUntilPredicate.java +++ b/src/main/java/rx/internal/operators/OperatorTakeUntilPredicate.java @@ -27,10 +27,30 @@ * @param the value type */ public final class OperatorTakeUntilPredicate implements Operator { + final Func1 stopPredicate; + + public OperatorTakeUntilPredicate(final Func1 stopPredicate) { + this.stopPredicate = stopPredicate; + } + + @Override + public Subscriber call(final Subscriber child) { + final ParentSubscriber parent = new ParentSubscriber(child); + child.add(parent); // don't unsubscribe downstream + child.setProducer(new Producer() { + @Override + public void request(long n) { + parent.downstreamRequest(n); + } + }); + + return parent; + } + /** Subscriber returned to the upstream. */ - private final class ParentSubscriber extends Subscriber { + final class ParentSubscriber extends Subscriber { private final Subscriber child; - private boolean done = false; + private boolean done; ParentSubscriber(Subscriber child) { this.child = child; @@ -73,25 +93,4 @@ void downstreamRequest(long n) { request(n); } } - - final Func1 stopPredicate; - - public OperatorTakeUntilPredicate(final Func1 stopPredicate) { - this.stopPredicate = stopPredicate; - } - - @Override - public Subscriber call(final Subscriber child) { - final ParentSubscriber parent = new ParentSubscriber(child); - child.add(parent); // don't unsubscribe downstream - child.setProducer(new Producer() { - @Override - public void request(long n) { - parent.downstreamRequest(n); - } - }); - - return parent; - } - } diff --git a/src/main/java/rx/internal/operators/OperatorTakeWhile.java b/src/main/java/rx/internal/operators/OperatorTakeWhile.java index 2a5fdc5bc0..c444627819 100644 --- a/src/main/java/rx/internal/operators/OperatorTakeWhile.java +++ b/src/main/java/rx/internal/operators/OperatorTakeWhile.java @@ -48,9 +48,9 @@ public OperatorTakeWhile(Func2 predicate) { public Subscriber call(final Subscriber subscriber) { Subscriber s = new Subscriber(subscriber, false) { - private int counter = 0; + private int counter; - private boolean done = false; + private boolean done; @Override public void onNext(T t) { diff --git a/src/main/java/rx/internal/operators/OperatorThrottleFirst.java b/src/main/java/rx/internal/operators/OperatorThrottleFirst.java index 906b207856..b7a368578b 100644 --- a/src/main/java/rx/internal/operators/OperatorThrottleFirst.java +++ b/src/main/java/rx/internal/operators/OperatorThrottleFirst.java @@ -38,7 +38,7 @@ public OperatorThrottleFirst(long windowDuration, TimeUnit unit, Scheduler sched public Subscriber call(final Subscriber subscriber) { return new Subscriber(subscriber) { - private long lastOnNext = 0; + private long lastOnNext; @Override public void onStart() { diff --git a/src/main/java/rx/internal/operators/OperatorTimeoutBase.java b/src/main/java/rx/internal/operators/OperatorTimeoutBase.java index 823831bc3a..d2fcc2a0ef 100644 --- a/src/main/java/rx/internal/operators/OperatorTimeoutBase.java +++ b/src/main/java/rx/internal/operators/OperatorTimeoutBase.java @@ -25,6 +25,10 @@ import rx.subscriptions.SerialSubscription; class OperatorTimeoutBase implements Operator { + final FirstTimeoutStub firstTimeoutStub; + final TimeoutStub timeoutStub; + final Observable other; + final Scheduler scheduler; /** * Set up the timeout action on the first value. @@ -44,11 +48,6 @@ class OperatorTimeoutBase implements Operator { Func4, Long, T, Scheduler.Worker, Subscription> { } - final FirstTimeoutStub firstTimeoutStub; - final TimeoutStub timeoutStub; - final Observable other; - final Scheduler scheduler; - /* package-private */OperatorTimeoutBase(FirstTimeoutStub firstTimeoutStub, TimeoutStub timeoutStub, Observable other, Scheduler scheduler) { this.firstTimeoutStub = firstTimeoutStub; this.timeoutStub = timeoutStub; diff --git a/src/main/java/rx/internal/operators/OperatorToMap.java b/src/main/java/rx/internal/operators/OperatorToMap.java index aa82c49cc4..725340982a 100644 --- a/src/main/java/rx/internal/operators/OperatorToMap.java +++ b/src/main/java/rx/internal/operators/OperatorToMap.java @@ -37,6 +37,12 @@ */ public final class OperatorToMap implements Operator, T> { + final Func1 keySelector; + + final Func1 valueSelector; + + private final Func0> mapFactory; + /** * The default map factory. * @param the key type @@ -49,14 +55,6 @@ public Map call() { } } - - final Func1 keySelector; - - final Func1 valueSelector; - - private final Func0> mapFactory; - - /** * ToMap with key selector, value selector and default HashMap factory. * @param keySelector the function extracting the map-key from the main value diff --git a/src/main/java/rx/internal/operators/OperatorToMultimap.java b/src/main/java/rx/internal/operators/OperatorToMultimap.java index fe753fee95..10e1cbb373 100644 --- a/src/main/java/rx/internal/operators/OperatorToMultimap.java +++ b/src/main/java/rx/internal/operators/OperatorToMultimap.java @@ -39,6 +39,12 @@ * @param the multimap-value type */ public final class OperatorToMultimap implements Operator>, T> { + + final Func1 keySelector; + final Func1 valueSelector; + private final Func0>> mapFactory; + final Func1> collectionFactory; + /** * The default multimap factory returning a HashMap. * @param the key type @@ -65,11 +71,6 @@ public Collection call(K t1) { } } - final Func1 keySelector; - final Func1 valueSelector; - private final Func0>> mapFactory; - final Func1> collectionFactory; - /** * ToMultimap with key selector, custom value selector, * default HashMap factory and default ArrayList collection factory. diff --git a/src/main/java/rx/internal/operators/OperatorToObservableList.java b/src/main/java/rx/internal/operators/OperatorToObservableList.java index 518a9a37c1..bde9947eaa 100644 --- a/src/main/java/rx/internal/operators/OperatorToObservableList.java +++ b/src/main/java/rx/internal/operators/OperatorToObservableList.java @@ -39,7 +39,7 @@ */ public final class OperatorToObservableList implements Operator, T> { /** Lazy initialization via inner-class holder. */ - private static final class Holder { + static final class Holder { /** A singleton instance. */ static final OperatorToObservableList INSTANCE = new OperatorToObservableList(); } @@ -51,13 +51,16 @@ private static final class Holder { public static OperatorToObservableList instance() { return (OperatorToObservableList)Holder.INSTANCE; } - OperatorToObservableList() { } + OperatorToObservableList() { + // singleton + } + @Override public Subscriber call(final Subscriber> o) { final SingleDelayedProducer> producer = new SingleDelayedProducer>(o); Subscriber result = new Subscriber() { - boolean completed = false; + boolean completed; List list = new LinkedList(); @Override diff --git a/src/main/java/rx/internal/operators/OperatorToObservableSortedList.java b/src/main/java/rx/internal/operators/OperatorToObservableSortedList.java index ab74e44f17..72c1536a22 100644 --- a/src/main/java/rx/internal/operators/OperatorToObservableSortedList.java +++ b/src/main/java/rx/internal/operators/OperatorToObservableSortedList.java @@ -36,6 +36,9 @@ public final class OperatorToObservableSortedList implements Operator, T> { final Comparator sortFunction; final int initialCapacity; + // raw because we want to support Object for this default + @SuppressWarnings("rawtypes") + private static final Comparator DEFAULT_SORT_FUNCTION = new DefaultComparableFunction(); @SuppressWarnings("unchecked") public OperatorToObservableSortedList(int initialCapacity) { @@ -100,13 +103,8 @@ public void onNext(T value) { child.setProducer(producer); return result; } - // raw because we want to support Object for this default - @SuppressWarnings("rawtypes") - private static Comparator DEFAULT_SORT_FUNCTION = new DefaultComparableFunction(); - private static class DefaultComparableFunction implements Comparator { - DefaultComparableFunction() { - } + static final class DefaultComparableFunction implements Comparator { // unchecked because we want to support Object for this default @SuppressWarnings("unchecked") diff --git a/src/main/java/rx/internal/operators/OperatorWindowWithObservable.java b/src/main/java/rx/internal/operators/OperatorWindowWithObservable.java index 6d7324bf9f..616e644c8c 100644 --- a/src/main/java/rx/internal/operators/OperatorWindowWithObservable.java +++ b/src/main/java/rx/internal/operators/OperatorWindowWithObservable.java @@ -33,6 +33,10 @@ */ public final class OperatorWindowWithObservable implements Operator, T> { final Observable other; + /** Indicate the current subject should complete and a new subject be emitted. */ + static final Object NEXT_SUBJECT = new Object(); + /** For error and completion indication. */ + static final NotificationLite NL = NotificationLite.instance(); public OperatorWindowWithObservable(final Observable other) { this.other = other; @@ -42,7 +46,7 @@ public OperatorWindowWithObservable(final Observable other) { public Subscriber call(Subscriber> child) { SourceSubscriber sub = new SourceSubscriber(child); - BoundarySubscriber bs = new BoundarySubscriber(child, sub); + BoundarySubscriber bs = new BoundarySubscriber(sub); child.add(sub); child.add(bs); @@ -53,10 +57,6 @@ public Subscriber call(Subscriber> child) { return sub; } - /** Indicate the current subject should complete and a new subject be emitted. */ - static final Object NEXT_SUBJECT = new Object(); - /** For error and completion indication. */ - static final NotificationLite nl = NotificationLite.instance(); /** Observes the source. */ static final class SourceSubscriber extends Subscriber { final Subscriber> child; @@ -132,11 +132,11 @@ void drain(List queue) { if (o == NEXT_SUBJECT) { replaceSubject(); } else - if (nl.isError(o)) { - error(nl.getError(o)); + if (NL.isError(o)) { + error(NL.getError(o)); break; } else - if (nl.isCompleted(o)) { + if (NL.isCompleted(o)) { complete(); break; } else { @@ -170,7 +170,7 @@ void emitValue(T t) { public void onError(Throwable e) { synchronized (guard) { if (emitting) { - queue = Collections.singletonList(nl.error(e)); + queue = Collections.singletonList(NL.error(e)); return; } queue = null; @@ -187,7 +187,7 @@ public void onCompleted() { if (queue == null) { queue = new ArrayList(); } - queue.add(nl.completed()); + queue.add(NL.completed()); return; } localQueue = queue; @@ -269,7 +269,7 @@ void error(Throwable e) { /** Observes the boundary. */ static final class BoundarySubscriber extends Subscriber { final SourceSubscriber sub; - public BoundarySubscriber(Subscriber child, SourceSubscriber sub) { + public BoundarySubscriber(SourceSubscriber sub) { this.sub = sub; } diff --git a/src/main/java/rx/internal/operators/OperatorWindowWithObservableFactory.java b/src/main/java/rx/internal/operators/OperatorWindowWithObservableFactory.java index 9dbfed2bb7..80f6a95080 100644 --- a/src/main/java/rx/internal/operators/OperatorWindowWithObservableFactory.java +++ b/src/main/java/rx/internal/operators/OperatorWindowWithObservableFactory.java @@ -36,6 +36,11 @@ public final class OperatorWindowWithObservableFactory implements Operator, T> { final Func0> otherFactory; + /** Indicate the current subject should complete and a new subject be emitted. */ + static final Object NEXT_SUBJECT = new Object(); + /** For error and completion indication. */ + static final NotificationLite NL = NotificationLite.instance(); + public OperatorWindowWithObservableFactory(Func0> otherFactory) { this.otherFactory = otherFactory; } @@ -51,10 +56,6 @@ public Subscriber call(Subscriber> child) { return sub; } - /** Indicate the current subject should complete and a new subject be emitted. */ - static final Object NEXT_SUBJECT = new Object(); - /** For error and completion indication. */ - static final NotificationLite nl = NotificationLite.instance(); /** Observes the source. */ static final class SourceSubscriber extends Subscriber { final Subscriber> child; @@ -138,11 +139,11 @@ void drain(List queue) { if (o == NEXT_SUBJECT) { replaceSubject(); } else - if (nl.isError(o)) { - error(nl.getError(o)); + if (NL.isError(o)) { + error(NL.getError(o)); break; } else - if (nl.isCompleted(o)) { + if (NL.isCompleted(o)) { complete(); break; } else { @@ -173,7 +174,7 @@ void createNewWindow() { return; } - BoundarySubscriber bs = new BoundarySubscriber(child, this); + BoundarySubscriber bs = new BoundarySubscriber(this); ssub.set(bs); other.unsafeSubscribe(bs); } @@ -188,7 +189,7 @@ void emitValue(T t) { public void onError(Throwable e) { synchronized (guard) { if (emitting) { - queue = Collections.singletonList(nl.error(e)); + queue = Collections.singletonList(NL.error(e)); return; } queue = null; @@ -205,7 +206,7 @@ public void onCompleted() { if (queue == null) { queue = new ArrayList(); } - queue.add(nl.completed()); + queue.add(NL.completed()); return; } localQueue = queue; @@ -288,7 +289,7 @@ void error(Throwable e) { static final class BoundarySubscriber extends Subscriber { final SourceSubscriber sub; boolean done; - public BoundarySubscriber(Subscriber child, SourceSubscriber sub) { + public BoundarySubscriber(SourceSubscriber sub) { this.sub = sub; } diff --git a/src/main/java/rx/internal/operators/OperatorWindowWithStartEndObservable.java b/src/main/java/rx/internal/operators/OperatorWindowWithStartEndObservable.java index 28a6fffc21..bc6b601f34 100644 --- a/src/main/java/rx/internal/operators/OperatorWindowWithStartEndObservable.java +++ b/src/main/java/rx/internal/operators/OperatorWindowWithStartEndObservable.java @@ -196,7 +196,7 @@ public void onNext(V t) { @Override public void onError(Throwable e) { - + SourceSubscriber.this.onError(e); } @Override diff --git a/src/main/java/rx/internal/operators/OperatorWindowWithTime.java b/src/main/java/rx/internal/operators/OperatorWindowWithTime.java index 8ea74a3e1a..beacce2cdf 100644 --- a/src/main/java/rx/internal/operators/OperatorWindowWithTime.java +++ b/src/main/java/rx/internal/operators/OperatorWindowWithTime.java @@ -46,6 +46,11 @@ public final class OperatorWindowWithTime implements Operator, final TimeUnit unit; final Scheduler scheduler; final int size; + /** Indicate the current subject should complete and a new subject be emitted. */ + static final Object NEXT_SUBJECT = new Object(); + /** For error and completion indication. */ + static final NotificationLite NL = NotificationLite.instance(); + public OperatorWindowWithTime(long timespan, long timeshift, TimeUnit unit, int size, Scheduler scheduler) { this.timespan = timespan; @@ -73,11 +78,6 @@ public Subscriber call(Subscriber> child) { s.scheduleChunk(); return s; } - /** Indicate the current subject should complete and a new subject be emitted. */ - static final Object NEXT_SUBJECT = new Object(); - /** For error and completion indication. */ - static final NotificationLite nl = NotificationLite.instance(); - /** The immutable windowing state with one subject. */ static final class State { final Observer consumer; @@ -187,11 +187,11 @@ boolean drain(List queue) { return false; } } else - if (nl.isError(o)) { - error(nl.getError(o)); + if (NL.isError(o)) { + error(NL.getError(o)); break; } else - if (nl.isCompleted(o)) { + if (NL.isCompleted(o)) { complete(); break; } else { @@ -244,7 +244,7 @@ public void onError(Throwable e) { synchronized (guard) { if (emitting) { // drop any queued action and terminate asap - queue = Collections.singletonList(nl.error(e)); + queue = Collections.singletonList(NL.error(e)); return; } queue = null; @@ -278,7 +278,7 @@ public void onCompleted() { if (queue == null) { queue = new ArrayList(); } - queue.add(nl.completed()); + queue.add(NL.completed()); return; } localQueue = queue; diff --git a/src/main/java/rx/internal/operators/OperatorWithLatestFromMany.java b/src/main/java/rx/internal/operators/OperatorWithLatestFromMany.java index 91c390e63d..8339eabf58 100644 --- a/src/main/java/rx/internal/operators/OperatorWithLatestFromMany.java +++ b/src/main/java/rx/internal/operators/OperatorWithLatestFromMany.java @@ -68,7 +68,6 @@ public void call(Subscriber t) { for (int i = 0; i < n; i++) { - Observable o = sources[i]; if (serial.isUnsubscribed()) { return; } @@ -76,6 +75,7 @@ public void call(Subscriber t) { WithLatestOtherSubscriber inner = new WithLatestOtherSubscriber(parent, i + 1); parent.add(inner); + Observable o = sources[i]; o.unsafeSubscribe(inner); } diff --git a/src/main/java/rx/internal/operators/OperatorZip.java b/src/main/java/rx/internal/operators/OperatorZip.java index 6f1280b3c3..805642e9a6 100644 --- a/src/main/java/rx/internal/operators/OperatorZip.java +++ b/src/main/java/rx/internal/operators/OperatorZip.java @@ -120,20 +120,20 @@ public Subscriber call(final Subscriber child) } @SuppressWarnings("rawtypes") - private final class ZipSubscriber extends Subscriber { + final class ZipSubscriber extends Subscriber { final Subscriber child; final Zip zipper; final ZipProducer producer; + boolean started; + public ZipSubscriber(Subscriber child, Zip zipper, ZipProducer producer) { this.child = child; this.zipper = zipper; this.producer = producer; } - boolean started = false; - @Override public void onCompleted() { if (!started) { @@ -159,10 +159,11 @@ public void onNext(Observable[] observables) { } - private static final class ZipProducer extends AtomicLong implements Producer { + static final class ZipProducer extends AtomicLong implements Producer { /** */ private static final long serialVersionUID = -1216676403723546796L; - private Zip zipper; + + final Zip zipper; public ZipProducer(Zip zipper) { this.zipper = zipper; @@ -186,7 +187,7 @@ static final class Zip extends AtomicLong { private final CompositeSubscription childSubscription = new CompositeSubscription(); static final int THRESHOLD = (int) (RxRingBuffer.SIZE * 0.7); - int emitted = 0; // not volatile/synchronized as accessed inside COUNTER_UPDATER block + int emitted; // not volatile/synchronized as accessed inside COUNTER_UPDATER block /* initialized when started in `start` */ private volatile Object[] subscribers; diff --git a/src/main/java/rx/internal/operators/SingleOnSubscribeUsing.java b/src/main/java/rx/internal/operators/SingleOnSubscribeUsing.java index 9d7319724c..d56a0693b8 100644 --- a/src/main/java/rx/internal/operators/SingleOnSubscribeUsing.java +++ b/src/main/java/rx/internal/operators/SingleOnSubscribeUsing.java @@ -46,7 +46,7 @@ public SingleOnSubscribeUsing(Func0 resourceFactory, @Override public void call(final SingleSubscriber child) { - final Resource resource; + final Resource resource; // NOPMD try { resource = resourceFactory.call(); diff --git a/src/main/java/rx/internal/operators/SingleOperatorOnErrorResumeNext.java b/src/main/java/rx/internal/operators/SingleOperatorOnErrorResumeNext.java index 393a72dfdd..3868c2d80d 100644 --- a/src/main/java/rx/internal/operators/SingleOperatorOnErrorResumeNext.java +++ b/src/main/java/rx/internal/operators/SingleOperatorOnErrorResumeNext.java @@ -21,7 +21,7 @@ import rx.exceptions.Exceptions; import rx.functions.Func1; -public class SingleOperatorOnErrorResumeNext implements Single.OnSubscribe { +public final class SingleOperatorOnErrorResumeNext implements Single.OnSubscribe { private final Single originalSingle; private final Func1> resumeFunctionInCaseOfError; diff --git a/src/main/java/rx/internal/operators/SingleOperatorZip.java b/src/main/java/rx/internal/operators/SingleOperatorZip.java index 93afe523d3..7622ec600e 100644 --- a/src/main/java/rx/internal/operators/SingleOperatorZip.java +++ b/src/main/java/rx/internal/operators/SingleOperatorZip.java @@ -25,8 +25,13 @@ import rx.plugins.RxJavaHooks; import rx.subscriptions.CompositeSubscription; -public class SingleOperatorZip { +public final class SingleOperatorZip { + /** Utility class. */ + private SingleOperatorZip() { + throw new IllegalStateException("No instances!"); + } + public static Single zip(final Single[] singles, final FuncN zipper) { return Single.create(new Single.OnSubscribe() { @Override diff --git a/src/main/java/rx/internal/producers/ProducerArbiter.java b/src/main/java/rx/internal/producers/ProducerArbiter.java index b23904103e..ca4d220d1b 100644 --- a/src/main/java/rx/internal/producers/ProducerArbiter.java +++ b/src/main/java/rx/internal/producers/ProducerArbiter.java @@ -33,7 +33,7 @@ public final class ProducerArbiter implements Producer { static final Producer NULL_PRODUCER = new Producer() { @Override public void request(long n) { - + // deliberately ignored } }; diff --git a/src/main/java/rx/internal/producers/ProducerObserverArbiter.java b/src/main/java/rx/internal/producers/ProducerObserverArbiter.java index 985352a3f4..46e86ba123 100644 --- a/src/main/java/rx/internal/producers/ProducerObserverArbiter.java +++ b/src/main/java/rx/internal/producers/ProducerObserverArbiter.java @@ -49,7 +49,7 @@ public final class ProducerObserverArbiter implements Producer, Observer { static final Producer NULL_PRODUCER = new Producer() { @Override public void request(long n) { - + // deliberately ignored } }; diff --git a/src/main/java/rx/internal/producers/SingleDelayedProducer.java b/src/main/java/rx/internal/producers/SingleDelayedProducer.java index 12403fe21b..3b3f17bcd0 100644 --- a/src/main/java/rx/internal/producers/SingleDelayedProducer.java +++ b/src/main/java/rx/internal/producers/SingleDelayedProducer.java @@ -67,7 +67,7 @@ public void request(long n) { emit(child, value); } } - return; + return; // NOPMD } } @@ -85,7 +85,7 @@ public void setValue(T value) { emit(child, value); } } - return; + return; // NOPMD } } /** diff --git a/src/main/java/rx/internal/producers/SingleProducer.java b/src/main/java/rx/internal/producers/SingleProducer.java index 337d815d91..51baf52547 100644 --- a/src/main/java/rx/internal/producers/SingleProducer.java +++ b/src/main/java/rx/internal/producers/SingleProducer.java @@ -55,11 +55,11 @@ public void request(long n) { if (compareAndSet(false, true)) { // avoid re-reading the instance fields final Subscriber c = child; - T v = value; // eagerly check for unsubscription if (c.isUnsubscribed()) { return; } + T v = value; // emit the value try { c.onNext(v); diff --git a/src/main/java/rx/internal/schedulers/CachedThreadScheduler.java b/src/main/java/rx/internal/schedulers/CachedThreadScheduler.java index c1655f0aa3..2443400c48 100644 --- a/src/main/java/rx/internal/schedulers/CachedThreadScheduler.java +++ b/src/main/java/rx/internal/schedulers/CachedThreadScheduler.java @@ -28,12 +28,22 @@ public final class CachedThreadScheduler extends Scheduler implements SchedulerL private static final TimeUnit KEEP_ALIVE_UNIT = TimeUnit.SECONDS; static final ThreadWorker SHUTDOWN_THREADWORKER; + + static final CachedWorkerPool NONE; + + final ThreadFactory threadFactory; + + final AtomicReference pool; + static { SHUTDOWN_THREADWORKER = new ThreadWorker(RxThreadFactory.NONE); SHUTDOWN_THREADWORKER.unsubscribe(); + + NONE = new CachedWorkerPool(null, 0, null); + NONE.shutdown(); } - private static final class CachedWorkerPool { + static final class CachedWorkerPool { private final ThreadFactory threadFactory; private final long keepAliveTime; private final ConcurrentLinkedQueue expiringWorkerQueue; @@ -131,15 +141,6 @@ void shutdown() { } } - final ThreadFactory threadFactory; - final AtomicReference pool; - - static final CachedWorkerPool NONE; - static { - NONE = new CachedWorkerPool(null, 0, null); - NONE.shutdown(); - } - public CachedThreadScheduler(ThreadFactory threadFactory) { this.threadFactory = threadFactory; this.pool = new AtomicReference(NONE); @@ -173,7 +174,7 @@ public Worker createWorker() { return new EventLoopWorker(pool.get()); } - private static final class EventLoopWorker extends Scheduler.Worker { + static final class EventLoopWorker extends Scheduler.Worker { private final CompositeSubscription innerSubscription = new CompositeSubscription(); private final CachedWorkerPool pool; private final ThreadWorker threadWorker; @@ -226,7 +227,7 @@ public void call() { } } - private static final class ThreadWorker extends NewThreadWorker { + static final class ThreadWorker extends NewThreadWorker { private long expirationTime; ThreadWorker(ThreadFactory threadFactory) { diff --git a/src/main/java/rx/internal/schedulers/EventLoopsScheduler.java b/src/main/java/rx/internal/schedulers/EventLoopsScheduler.java index fb813412db..4caf2e3218 100644 --- a/src/main/java/rx/internal/schedulers/EventLoopsScheduler.java +++ b/src/main/java/rx/internal/schedulers/EventLoopsScheduler.java @@ -48,7 +48,14 @@ public final class EventLoopsScheduler extends Scheduler implements SchedulerLif SHUTDOWN_WORKER = new PoolWorker(RxThreadFactory.NONE); SHUTDOWN_WORKER.unsubscribe(); } + + /** This will indicate no pool is active. */ + static final FixedSchedulerPool NONE = new FixedSchedulerPool(null, 0); + + final ThreadFactory threadFactory; + final AtomicReference pool; + static final class FixedSchedulerPool { final int cores; @@ -79,11 +86,6 @@ public void shutdown() { } } } - /** This will indicate no pool is active. */ - static final FixedSchedulerPool NONE = new FixedSchedulerPool(null, 0); - - final ThreadFactory threadFactory; - final AtomicReference pool; /** * Create a scheduler with pool size equal to the available processor @@ -134,7 +136,7 @@ public Subscription scheduleDirect(Action0 action) { return pw.scheduleActual(action, -1, TimeUnit.NANOSECONDS); } - private static class EventLoopWorker extends Scheduler.Worker { + static final class EventLoopWorker extends Scheduler.Worker { private final SubscriptionList serial = new SubscriptionList(); private final CompositeSubscription timed = new CompositeSubscription(); private final SubscriptionList both = new SubscriptionList(serial, timed); diff --git a/src/main/java/rx/internal/schedulers/ImmediateScheduler.java b/src/main/java/rx/internal/schedulers/ImmediateScheduler.java index c3dd7a6f85..7b0b2df045 100644 --- a/src/main/java/rx/internal/schedulers/ImmediateScheduler.java +++ b/src/main/java/rx/internal/schedulers/ImmediateScheduler.java @@ -30,6 +30,7 @@ public final class ImmediateScheduler extends Scheduler { public static final ImmediateScheduler INSTANCE = new ImmediateScheduler(); private ImmediateScheduler() { + // the class is singleton } @Override @@ -41,9 +42,6 @@ private class InnerImmediateScheduler extends Scheduler.Worker implements Subscr final BooleanSubscription innerSubscription = new BooleanSubscription(); - InnerImmediateScheduler() { - } - @Override public Subscription schedule(Action0 action, long delayTime, TimeUnit unit) { // since we are executing immediately on this thread we must cause this thread to sleep diff --git a/src/main/java/rx/internal/schedulers/NewThreadWorker.java b/src/main/java/rx/internal/schedulers/NewThreadWorker.java index 6521aadf46..25517124be 100644 --- a/src/main/java/rx/internal/schedulers/NewThreadWorker.java +++ b/src/main/java/rx/internal/schedulers/NewThreadWorker.java @@ -15,7 +15,7 @@ */ package rx.internal.schedulers; -import java.lang.reflect.Method; +import java.lang.reflect.*; import java.util.Iterator; import java.util.concurrent.*; import java.util.concurrent.atomic.AtomicReference; @@ -45,6 +45,17 @@ public class NewThreadWorker extends Scheduler.Worker implements Subscription { public static final int PURGE_FREQUENCY; private static final ConcurrentHashMap EXECUTORS; private static final AtomicReference PURGE; + /** + * Improves performance of {@link #tryEnableCancelPolicy(ScheduledExecutorService)}. + * Also, it works even for inheritance: {@link Method} of base class can be invoked on the instance of child class. + */ + private static volatile Object cachedSetRemoveOnCancelPolicyMethod; + + /** + * Possible value of {@link #cachedSetRemoveOnCancelPolicyMethod} which means that cancel policy is not supported. + */ + private static final Object SET_REMOVE_ON_CANCEL_POLICY_METHOD_NOT_SUPPORTED = new Object(); + static { EXECUTORS = new ConcurrentHashMap(); PURGE = new AtomicReference(); @@ -115,17 +126,6 @@ static void purgeExecutors() { } } - /** - * Improves performance of {@link #tryEnableCancelPolicy(ScheduledExecutorService)}. - * Also, it works even for inheritance: {@link Method} of base class can be invoked on the instance of child class. - */ - private static volatile Object cachedSetRemoveOnCancelPolicyMethod; - - /** - * Possible value of {@link #cachedSetRemoveOnCancelPolicyMethod} which means that cancel policy is not supported. - */ - private static final Object SET_REMOVE_ON_CANCEL_POLICY_METHOD_NOT_SUPPORTED = new Object(); - /** * Tries to enable the Java 7+ setRemoveOnCancelPolicy. *

{@code public} visibility reason: called from other package(s) within RxJava. @@ -135,10 +135,10 @@ static void purgeExecutors() { * @return true if the policy was successfully enabled */ public static boolean tryEnableCancelPolicy(ScheduledExecutorService executor) { - if (SHOULD_TRY_ENABLE_CANCEL_POLICY) { + if (SHOULD_TRY_ENABLE_CANCEL_POLICY) { // NOPMD final boolean isInstanceOfScheduledThreadPoolExecutor = executor instanceof ScheduledThreadPoolExecutor; - final Method methodToCall; + Method methodToCall; if (isInstanceOfScheduledThreadPoolExecutor) { final Object localSetRemoveOnCancelPolicyMethod = cachedSetRemoveOnCancelPolicyMethod; @@ -166,7 +166,11 @@ public static boolean tryEnableCancelPolicy(ScheduledExecutorService executor) { try { methodToCall.invoke(executor, true); return true; - } catch (Exception e) { + } catch (InvocationTargetException e) { + RxJavaHooks.onError(e); + } catch (IllegalAccessException e) { + RxJavaHooks.onError(e); + } catch (IllegalArgumentException e) { RxJavaHooks.onError(e); } } diff --git a/src/main/java/rx/internal/schedulers/ScheduledAction.java b/src/main/java/rx/internal/schedulers/ScheduledAction.java index 6ba16beaee..51db03e250 100644 --- a/src/main/java/rx/internal/schedulers/ScheduledAction.java +++ b/src/main/java/rx/internal/schedulers/ScheduledAction.java @@ -53,21 +53,20 @@ public void run() { try { lazySet(Thread.currentThread()); action.call(); + } catch (OnErrorNotImplementedException e) { + signalError(new IllegalStateException("Exception thrown on Scheduler.Worker thread. Add `onError` handling.", e)); } catch (Throwable e) { - // nothing to do but print a System error as this is fatal and there is nowhere else to throw this - IllegalStateException ie = null; - if (e instanceof OnErrorNotImplementedException) { - ie = new IllegalStateException("Exception thrown on Scheduler.Worker thread. Add `onError` handling.", e); - } else { - ie = new IllegalStateException("Fatal Exception thrown on Scheduler.Worker thread.", e); - } - RxJavaHooks.onError(ie); - Thread thread = Thread.currentThread(); - thread.getUncaughtExceptionHandler().uncaughtException(thread, ie); + signalError(new IllegalStateException("Fatal Exception thrown on Scheduler.Worker thread.", e)); } finally { unsubscribe(); } } + + void signalError(Throwable ie) { + RxJavaHooks.onError(ie); + Thread thread = Thread.currentThread(); + thread.getUncaughtExceptionHandler().uncaughtException(thread, ie); + } @Override public boolean isUnsubscribed() { @@ -128,7 +127,7 @@ public void addParent(SubscriptionList parent) { * prevent unnecessary self-interrupting if the unsubscription * happens from the same thread. */ - private final class FutureCompleter implements Subscription { + final class FutureCompleter implements Subscription { private final Future f; FutureCompleter(Future f) { @@ -150,7 +149,7 @@ public boolean isUnsubscribed() { } /** Remove a child subscription from a composite when unsubscribing. */ - private static final class Remover extends AtomicBoolean implements Subscription { + static final class Remover extends AtomicBoolean implements Subscription { /** */ private static final long serialVersionUID = 247232374289553518L; final ScheduledAction s; @@ -175,7 +174,7 @@ public void unsubscribe() { } /** Remove a child subscription from a composite when unsubscribing. */ - private static final class Remover2 extends AtomicBoolean implements Subscription { + static final class Remover2 extends AtomicBoolean implements Subscription { /** */ private static final long serialVersionUID = 247232374289553518L; final ScheduledAction s; diff --git a/src/main/java/rx/internal/schedulers/SleepingAction.java b/src/main/java/rx/internal/schedulers/SleepingAction.java index e3bdeb16ba..ef39676e0f 100644 --- a/src/main/java/rx/internal/schedulers/SleepingAction.java +++ b/src/main/java/rx/internal/schedulers/SleepingAction.java @@ -16,6 +16,7 @@ package rx.internal.schedulers; import rx.Scheduler; +import rx.exceptions.Exceptions; import rx.functions.Action0; /* package */class SleepingAction implements Action0 { @@ -41,7 +42,7 @@ public void call() { Thread.sleep(delay); } catch (InterruptedException e) { Thread.currentThread().interrupt(); - throw new RuntimeException(e); + Exceptions.propagate(e); } } diff --git a/src/main/java/rx/internal/schedulers/TrampolineScheduler.java b/src/main/java/rx/internal/schedulers/TrampolineScheduler.java index 94fea1964a..fb03dcb58d 100644 --- a/src/main/java/rx/internal/schedulers/TrampolineScheduler.java +++ b/src/main/java/rx/internal/schedulers/TrampolineScheduler.java @@ -40,16 +40,13 @@ public Worker createWorker() { private TrampolineScheduler() { } - private static class InnerCurrentThreadScheduler extends Scheduler.Worker implements Subscription { + static final class InnerCurrentThreadScheduler extends Scheduler.Worker implements Subscription { final AtomicInteger counter = new AtomicInteger(); final PriorityBlockingQueue queue = new PriorityBlockingQueue(); private final BooleanSubscription innerSubscription = new BooleanSubscription(); private final AtomicInteger wip = new AtomicInteger(); - InnerCurrentThreadScheduler() { - } - @Override public Subscription schedule(Action0 action) { return enqueue(action, now()); @@ -102,7 +99,7 @@ public boolean isUnsubscribed() { } - private static final class TimedAction implements Comparable { + static final class TimedAction implements Comparable { final Action0 action; final Long execTime; final int count; // In case if time between enqueueing took less than 1ms diff --git a/src/main/java/rx/internal/util/BackpressureDrainManager.java b/src/main/java/rx/internal/util/BackpressureDrainManager.java index 08bb3beb58..b2f9555fbc 100644 --- a/src/main/java/rx/internal/util/BackpressureDrainManager.java +++ b/src/main/java/rx/internal/util/BackpressureDrainManager.java @@ -31,6 +31,15 @@ public final class BackpressureDrainManager extends AtomicLong implements Producer { /** */ private static final long serialVersionUID = 2826241102729529449L; + /** Indicates if one is in emitting phase, guarded by this. */ + boolean emitting; + /** Indicates a terminal state. */ + volatile boolean terminated; + /** Indicates an error state, barrier is provided via terminated. */ + Throwable exception; + /** The callbacks to manage the drain. */ + final BackpressureQueueCallback actual; + /** * Interface representing the minimal callbacks required * to operate the drain part of a backpressure system. @@ -65,14 +74,6 @@ public interface BackpressureQueueCallback { void complete(Throwable exception); } - /** Indicates if one is in emitting phase, guarded by this. */ - protected boolean emitting; - /** Indicates a terminal state. */ - protected volatile boolean terminated; - /** Indicates an error state, barrier is provided via terminated. */ - protected Throwable exception; - /** The callbacks to manage the drain. */ - protected final BackpressureQueueCallback actual; /** * Constructs a backpressure drain manager with 0 requestedCount, * no terminal event and not emitting. @@ -85,14 +86,14 @@ public BackpressureDrainManager(BackpressureQueueCallback actual) { * Checks if a terminal state has been reached. * @return true if a terminal state has been reached */ - public final boolean isTerminated() { + public boolean isTerminated() { return terminated; } /** * Move into a terminal state. * Call drain() anytime after. */ - public final void terminate() { + public void terminate() { terminated = true; } /** @@ -102,7 +103,7 @@ public final void terminate() { * element emission. * @param error the exception to deliver */ - public final void terminate(Throwable error) { + public void terminate(Throwable error) { if (!terminated) { exception = error; terminated = true; @@ -111,7 +112,7 @@ public final void terminate(Throwable error) { /** * Move into a terminal state and drain. */ - public final void terminateAndDrain() { + public void terminateAndDrain() { terminated = true; drain(); } @@ -121,7 +122,7 @@ public final void terminateAndDrain() { * element emission. * @param error the exception to deliver */ - public final void terminateAndDrain(Throwable error) { + public void terminateAndDrain(Throwable error) { if (!terminated) { exception = error; terminated = true; @@ -129,7 +130,7 @@ public final void terminateAndDrain(Throwable error) { } } @Override - public final void request(long n) { + public void request(long n) { if (n == 0) { return; } @@ -163,8 +164,7 @@ public final void request(long n) { * Try to drain the "queued" elements and terminal events * by considering the available and requested event counts. */ - public final void drain() { - long n; + public void drain() { boolean term; synchronized (this) { if (emitting) { @@ -173,7 +173,7 @@ public final void drain() { emitting = true; term = terminated; } - n = get(); + long n = get(); boolean skipFinal = false; try { BackpressureQueueCallback a = actual; diff --git a/src/main/java/rx/internal/util/BlockingUtils.java b/src/main/java/rx/internal/util/BlockingUtils.java index 951e49c83d..17b0143e52 100644 --- a/src/main/java/rx/internal/util/BlockingUtils.java +++ b/src/main/java/rx/internal/util/BlockingUtils.java @@ -53,7 +53,7 @@ public static void awaitForComplete(CountDownLatch latch, Subscription subscript // for more information see https://github.com/ReactiveX/RxJava/pull/147#issuecomment-13624780 Thread.currentThread().interrupt(); // using Runtime so it is not checked - throw new RuntimeException("Interrupted while waiting for subscription to complete.", e); + throw new IllegalStateException("Interrupted while waiting for subscription to complete.", e); } } } diff --git a/src/main/java/rx/internal/util/FrontPadding.java b/src/main/java/rx/internal/util/FrontPadding.java deleted file mode 100644 index 972315440d..0000000000 --- a/src/main/java/rx/internal/util/FrontPadding.java +++ /dev/null @@ -1,31 +0,0 @@ -/** - * Copyright 2014 Netflix, Inc. - * - * Licensed under the Apache License, Version 2.0 (the "License"); you may not - * use this file except in compliance with the License. You may obtain a copy of - * the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the - * License for the specific language governing permissions and limitations under - * the License. - */ -package rx.internal.util; - -import java.io.Serializable; - -/** - * Padding up to 128 bytes at the front. - * Based on netty's implementation - */ -abstract class FrontPadding implements Serializable { - /** */ - private static final long serialVersionUID = -596356687591714352L; - /** Padding. */ - public transient long p1, p2, p3, p4, p5, p6; // 48 bytes (header is 16 bytes) - /** Padding. */ - public transient long p8, p9, p10, p11, p12, p13, p14, p15; // 64 bytes -} \ No newline at end of file diff --git a/src/main/java/rx/internal/util/IndexedRingBuffer.java b/src/main/java/rx/internal/util/IndexedRingBuffer.java index d434662866..d5fc2f2e0b 100644 --- a/src/main/java/rx/internal/util/IndexedRingBuffer.java +++ b/src/main/java/rx/internal/util/IndexedRingBuffer.java @@ -47,6 +47,10 @@ * @param */ public final class IndexedRingBuffer implements Subscription { + private final ElementSection elements = new ElementSection(); + private final IndexSection removed = new IndexSection(); + /* package for unit testing */final AtomicInteger index = new AtomicInteger(); + /* package for unit testing */final AtomicInteger removedIndex = new AtomicInteger(); private static final ObjectPool> POOL = new ObjectPool>() { @@ -57,16 +61,10 @@ protected IndexedRingBuffer createObject() { }; - @SuppressWarnings("unchecked") - public static IndexedRingBuffer getInstance() { - return (IndexedRingBuffer) POOL.borrowObject(); - } + static int defaultSize = 256; + + /* package for unit testing */static final int SIZE; - private final ElementSection elements = new ElementSection(); - private final IndexSection removed = new IndexSection(); - /* package for unit testing */final AtomicInteger index = new AtomicInteger(); - /* package for unit testing */final AtomicInteger removedIndex = new AtomicInteger(); - // default size of ring buffer /** * Set at 256 ... Android defaults far smaller which likely will never hit the use cases that require the higher buffers. @@ -238,25 +236,29 @@ public static IndexedRingBuffer getInstance() { * * } */ - static int _size = 256; static { // lower default for Android (https://github.com/ReactiveX/RxJava/issues/1820) if (PlatformDependent.isAndroid()) { - _size = 8; + defaultSize = 8; } // possible system property for overriding String sizeFromProperty = System.getProperty("rx.indexed-ring-buffer.size"); // also see RxRingBuffer if (sizeFromProperty != null) { try { - _size = Integer.parseInt(sizeFromProperty); - } catch (Exception e) { - System.err.println("Failed to set 'rx.indexed-ring-buffer.size' with value " + sizeFromProperty + " => " + e.getMessage()); + defaultSize = Integer.parseInt(sizeFromProperty); + } catch (NumberFormatException e) { + System.err.println("Failed to set 'rx.indexed-ring-buffer.size' with value " + sizeFromProperty + " => " + e.getMessage()); // NOPMD } } + + SIZE = defaultSize; } - /* package for unit testing */static final int SIZE = _size; + @SuppressWarnings("unchecked") + public static IndexedRingBuffer getInstance() { + return (IndexedRingBuffer) POOL.borrowObject(); + } /** * This resets the arrays, nulls out references and returns it to the pool. @@ -291,6 +293,7 @@ public void unsubscribe() { } IndexedRingBuffer() { + // nothing to do } /** @@ -355,7 +358,7 @@ private ElementSection getElementSection(int index) { return a; } - private synchronized int getIndexForAdd() { + private synchronized int getIndexForAdd() { // NOPMD /* * Synchronized as I haven't yet figured out a way to do this in an atomic way that doesn't involve object allocation */ @@ -384,7 +387,7 @@ private synchronized int getIndexForAdd() { * * @return */ - private synchronized int getIndexFromPreviouslyRemoved() { + private synchronized int getIndexFromPreviouslyRemoved() { // NOPMD /* * Synchronized as I haven't yet figured out a way to do this in an atomic way that doesn't involve object allocation */ @@ -404,7 +407,7 @@ private synchronized int getIndexFromPreviouslyRemoved() { } } - private synchronized void pushRemovedIndex(int elementIndex) { + private synchronized void pushRemovedIndex(int elementIndex) { // NOPMD /* * Synchronized as I haven't yet figured out a way to do this in an atomic way that doesn't involve object allocation */ @@ -483,13 +486,10 @@ private int forEach(Func1 action, int startIndex, int endInd return realIndex; } - private static class ElementSection { + static final class ElementSection { final AtomicReferenceArray array = new AtomicReferenceArray(SIZE); final AtomicReference> next = new AtomicReference>(); - ElementSection() { - } - ElementSection getNext() { if (next.get() != null) { return next.get(); @@ -506,12 +506,11 @@ ElementSection getNext() { } } - private static class IndexSection { + static class IndexSection { private final AtomicIntegerArray unsafeArray = new AtomicIntegerArray(SIZE); - IndexSection() { - } + private final AtomicReference _next = new AtomicReference(); public int getAndSet(int expected, int newValue) { return unsafeArray.getAndSet(expected, newValue); @@ -521,8 +520,6 @@ public void set(int i, int elementIndex) { unsafeArray.set(i, elementIndex); } - private final AtomicReference _next = new AtomicReference(); - IndexSection getNext() { if (_next.get() != null) { return _next.get(); diff --git a/src/main/java/rx/internal/util/InternalObservableUtils.java b/src/main/java/rx/internal/util/InternalObservableUtils.java index 0a72b2fd6d..5b4478fd2c 100644 --- a/src/main/java/rx/internal/util/InternalObservableUtils.java +++ b/src/main/java/rx/internal/util/InternalObservableUtils.java @@ -32,12 +32,36 @@ */ public enum InternalObservableUtils { ; + /** + * A BiFunction that expects a long as its first parameter and returns +1. + */ + public static final PlusOneLongFunc2 LONG_COUNTER = new PlusOneLongFunc2(); + + /** + * A bifunction comparing two objects via null-safe equals. + */ + public static final ObjectEqualsFunc2 OBJECT_EQUALS = new ObjectEqualsFunc2(); + /** + * A function that converts a List of Observables into an array of Observables. + */ + public static final ToArrayFunc1 TO_ARRAY = new ToArrayFunc1(); + static final ReturnsVoidFunc1 RETURNS_VOID = new ReturnsVoidFunc1(); + /** * A BiFunction that expects an integer as its first parameter and returns +1. */ public static final PlusOneFunc2 COUNTER = new PlusOneFunc2(); + static final NotificationErrorExtractor ERROR_EXTRACTOR = new NotificationErrorExtractor(); + + /** + * Throws an OnErrorNotImplementedException when called. + */ + public static final Action1 ERROR_NOT_IMPLEMENTED = new ErrorNotImplementedAction(); + + public static final Operator IS_EMPTY = new OperatorAny(UtilityFunctions.alwaysTrue(), true); + static final class PlusOneFunc2 implements Func2 { @Override public Integer call(Integer count, Object o) { @@ -45,11 +69,6 @@ public Integer call(Integer count, Object o) { } } - /** - * A BiFunction that expects a long as its first parameter and returns +1. - */ - public static final PlusOneLongFunc2 LONG_COUNTER = new PlusOneLongFunc2(); - static final class PlusOneLongFunc2 implements Func2 { @Override public Long call(Long count, Object o) { @@ -57,11 +76,6 @@ public Long call(Long count, Object o) { } } - /** - * A bifunction comparing two objects via null-safe equals. - */ - public static final ObjectEqualsFunc2 OBJECT_EQUALS = new ObjectEqualsFunc2(); - static final class ObjectEqualsFunc2 implements Func2 { @Override public Boolean call(Object first, Object second) { @@ -69,11 +83,6 @@ public Boolean call(Object first, Object second) { } } - /** - * A function that converts a List of Observables into an array of Observables. - */ - public static final ToArrayFunc1 TO_ARRAY = new ToArrayFunc1(); - static final class ToArrayFunc1 implements Func1>, Observable[]> { @Override public Observable[] call(List> o) { @@ -151,8 +160,6 @@ public Observable call(Observable> notifications) { } }; - static final ReturnsVoidFunc1 RETURNS_VOID = new ReturnsVoidFunc1(); - static final class ReturnsVoidFunc1 implements Func1 { @Override public Void call(Object t) { @@ -217,8 +224,6 @@ public Observable call(Observable> notifications) { } } - static final NotificationErrorExtractor ERROR_EXTRACTOR = new NotificationErrorExtractor(); - static final class NotificationErrorExtractor implements Func1, Throwable> { @Override public Throwable call(Notification t) { @@ -236,7 +241,7 @@ public static Func0> createReplaySupplier(final Obs return new ReplaySupplierNoParams(source); } - private static final class ReplaySupplierNoParams implements Func0> { + static final class ReplaySupplierNoParams implements Func0> { private final Observable source; private ReplaySupplierNoParams(Observable source) { @@ -375,11 +380,6 @@ public R call(R state, T value) { } } - /** - * Throws an OnErrorNotImplementedException when called. - */ - public static final Action1 ERROR_NOT_IMPLEMENTED = new ErrorNotImplementedAction(); - static final class ErrorNotImplementedAction implements Action1 { @Override public void call(Throwable t) { @@ -387,5 +387,4 @@ public void call(Throwable t) { } } - public static final Operator IS_EMPTY = new OperatorAny(UtilityFunctions.alwaysTrue(), true); } diff --git a/src/main/java/rx/internal/util/LinkedArrayList.java b/src/main/java/rx/internal/util/LinkedArrayList.java index fb4ae68cc2..35f5254eeb 100644 --- a/src/main/java/rx/internal/util/LinkedArrayList.java +++ b/src/main/java/rx/internal/util/LinkedArrayList.java @@ -80,14 +80,14 @@ public void add(Object o) { * @return the head object array */ public Object[] head() { - return head; + return head; // NOPMD } /** * Returns the tail buffer segment or null if the list is empty. * @return the tail object array */ public Object[] tail() { - return tail; + return tail; // NOPMD } /** * Returns the total size of the list. diff --git a/src/main/java/rx/internal/util/ObjectPool.java b/src/main/java/rx/internal/util/ObjectPool.java index 35da79335a..7b22a3e122 100644 --- a/src/main/java/rx/internal/util/ObjectPool.java +++ b/src/main/java/rx/internal/util/ObjectPool.java @@ -33,7 +33,7 @@ public abstract class ObjectPool implements SchedulerLifecycle { private final AtomicReference> periodicTask; public ObjectPool() { - this(0, 0, 67); + this(0, 0, 67); // NOPMD } /** diff --git a/src/main/java/rx/internal/util/OpenHashSet.java b/src/main/java/rx/internal/util/OpenHashSet.java index 1e79fdd4c1..7115b43519 100644 --- a/src/main/java/rx/internal/util/OpenHashSet.java +++ b/src/main/java/rx/internal/util/OpenHashSet.java @@ -40,6 +40,7 @@ public final class OpenHashSet { int size; int maxSize; T[] keys; + private static final int INT_PHI = 0x9E3779B9; public OpenHashSet() { this(16, 0.75f); @@ -172,7 +173,7 @@ void rehash() { for (int j = size; j-- != 0; ) { - while (a[--i] == null); + while (a[--i] == null); // NOPMD int pos = mix(a[i].hashCode()) & m; if (b[pos] != null) { for (;;) { @@ -190,8 +191,6 @@ void rehash() { this.keys = b; } - private static final int INT_PHI = 0x9E3779B9; - static int mix(int x) { final int h = x * INT_PHI; return h ^ (h >>> 16); @@ -206,6 +205,6 @@ public boolean isEmpty() { * @return the raw array of values of this set */ public T[] values() { - return keys; + return keys; // NOPMD } } diff --git a/src/main/java/rx/internal/util/PlatformDependent.java b/src/main/java/rx/internal/util/PlatformDependent.java index 2aa5f7e184..e1a28c8a08 100644 --- a/src/main/java/rx/internal/util/PlatformDependent.java +++ b/src/main/java/rx/internal/util/PlatformDependent.java @@ -34,6 +34,11 @@ public final class PlatformDependent { private static final boolean IS_ANDROID = ANDROID_API_VERSION != ANDROID_API_VERSION_IS_NOT_ANDROID; + /** Utility class. */ + private PlatformDependent() { + throw new IllegalStateException("No instances!"); + } + /** * Returns {@code true} if and only if the current platform is Android. * @return {@code true} if and only if the current platform is Android @@ -65,7 +70,7 @@ private static int resolveAndroidApiVersion() { .forName("android.os.Build$VERSION", true, getSystemClassLoader()) .getField("SDK_INT") .get(null); - } catch (Exception e) { + } catch (Exception e) { // NOPMD // Can not resolve version of Android API, maybe current platform is not Android // or API of resolving current Version of Android API has changed in some release of Android return ANDROID_API_VERSION_IS_NOT_ANDROID; diff --git a/src/main/java/rx/internal/util/RxJavaPluginUtils.java b/src/main/java/rx/internal/util/RxJavaPluginUtils.java index 4e459130e5..e54eb1fd69 100644 --- a/src/main/java/rx/internal/util/RxJavaPluginUtils.java +++ b/src/main/java/rx/internal/util/RxJavaPluginUtils.java @@ -19,6 +19,11 @@ public final class RxJavaPluginUtils { + /** Utility class. */ + private RxJavaPluginUtils() { + throw new IllegalStateException("No instances!"); + } + public static void handleException(Throwable e) { try { RxJavaHooks.onError(e); @@ -33,8 +38,8 @@ private static void handlePluginException(Throwable pluginException) { * Since the plugin should never throw this is a safety net * and will complain loudly to System.err so it gets fixed. */ - System.err.println("RxJavaErrorHandler threw an Exception. It shouldn't. => " + pluginException.getMessage()); - pluginException.printStackTrace(); + System.err.println("RxJavaErrorHandler threw an Exception. It shouldn't. => " + pluginException.getMessage()); // NOPMD + pluginException.printStackTrace(); // NOPMD } } diff --git a/src/main/java/rx/internal/util/RxRingBuffer.java b/src/main/java/rx/internal/util/RxRingBuffer.java index 5f35c7f6e5..b2104f811d 100644 --- a/src/main/java/rx/internal/util/RxRingBuffer.java +++ b/src/main/java/rx/internal/util/RxRingBuffer.java @@ -32,22 +32,6 @@ */ public class RxRingBuffer implements Subscription { - public static RxRingBuffer getSpscInstance() { - if (UnsafeAccess.isUnsafeAvailable()) { - return new RxRingBuffer(SPSC_POOL, SIZE); - } else { - return new RxRingBuffer(); - } - } - - public static RxRingBuffer getSpmcInstance() { - if (UnsafeAccess.isUnsafeAvailable()) { - return new RxRingBuffer(SPMC_POOL, SIZE); - } else { - return new RxRingBuffer(); - } - } - /** * Queue implementation testing that led to current choices of data structures: * @@ -141,7 +125,7 @@ public static RxRingBuffer getSpmcInstance() { * } */ - private static final NotificationLite on = NotificationLite.instance(); + private static final NotificationLite ON = NotificationLite.instance(); private Queue queue; @@ -257,27 +241,27 @@ public static RxRingBuffer getSpmcInstance() { * r.o.OperatorObserveOnPerf.observeOnNewThread 1000000 thrpt 5 1.173 0.100 ops/s * } */ - static int _size = 128; + static int defaultSize = 128; static { // lower default for Android (https://github.com/ReactiveX/RxJava/issues/1820) if (PlatformDependent.isAndroid()) { - _size = 16; + defaultSize = 16; } // possible system property for overriding String sizeFromProperty = System.getProperty("rx.ring-buffer.size"); // also see IndexedRingBuffer if (sizeFromProperty != null) { try { - _size = Integer.parseInt(sizeFromProperty); - } catch (Exception e) { - System.err.println("Failed to set 'rx.buffer.size' with value " + sizeFromProperty + " => " + e.getMessage()); + defaultSize = Integer.parseInt(sizeFromProperty); + } catch (NumberFormatException e) { + System.err.println("Failed to set 'rx.buffer.size' with value " + sizeFromProperty + " => " + e.getMessage()); // NOPMD } } } - public static final int SIZE = _size; + public static final int SIZE = defaultSize; /* Public so Schedulers can manage the lifecycle of the inner worker. */ - public static ObjectPool> SPSC_POOL = new ObjectPool>() { + public static final ObjectPool> SPSC_POOL = new ObjectPool>() { @Override protected SpscArrayQueue createObject() { @@ -287,7 +271,7 @@ protected SpscArrayQueue createObject() { }; /* Public so Schedulers can manage the lifecycle of the inner worker. */ - public static ObjectPool> SPMC_POOL = new ObjectPool>() { + public static final ObjectPool> SPMC_POOL = new ObjectPool>() { @Override protected SpmcArrayQueue createObject() { @@ -295,7 +279,23 @@ protected SpmcArrayQueue createObject() { } }; - + + public static RxRingBuffer getSpscInstance() { + if (UnsafeAccess.isUnsafeAvailable()) { + return new RxRingBuffer(SPSC_POOL, SIZE); + } else { + return new RxRingBuffer(); + } + } + + public static RxRingBuffer getSpmcInstance() { + if (UnsafeAccess.isUnsafeAvailable()) { + return new RxRingBuffer(SPMC_POOL, SIZE); + } else { + return new RxRingBuffer(); + } + } + private RxRingBuffer(Queue queue, int size) { this.queue = queue; this.pool = null; @@ -308,7 +308,7 @@ private RxRingBuffer(ObjectPool> pool, int size) { this.size = size; } - public synchronized void release() { + public synchronized void release() { // NOPMD Queue q = queue; ObjectPool> p = pool; if (p != null && q != null) { @@ -339,7 +339,7 @@ public void onNext(Object o) throws MissingBackpressureException { synchronized (this) { Queue q = queue; if (q != null) { - mbe = !q.offer(on.next(o)); + mbe = !q.offer(ON.next(o)); } else { iae = true; } @@ -356,14 +356,14 @@ public void onNext(Object o) throws MissingBackpressureException { public void onCompleted() { // we ignore terminal events if we already have one if (terminalState == null) { - terminalState = on.completed(); + terminalState = ON.completed(); } } public void onError(Throwable t) { // we ignore terminal events if we already have one if (terminalState == null) { - terminalState = on.error(t); + terminalState = ON.error(t); } } @@ -429,24 +429,24 @@ public Object peek() { } public boolean isCompleted(Object o) { - return on.isCompleted(o); + return ON.isCompleted(o); } public boolean isError(Object o) { - return on.isError(o); + return ON.isError(o); } public Object getValue(Object o) { - return on.getValue(o); + return ON.getValue(o); } @SuppressWarnings({ "unchecked", "rawtypes" }) public boolean accept(Object o, Observer child) { - return on.accept(child, o); + return ON.accept(child, o); } public Throwable asError(Object o) { - return on.getError(o); + return ON.getError(o); } @Override diff --git a/src/main/java/rx/internal/util/ScalarSynchronousObservable.java b/src/main/java/rx/internal/util/ScalarSynchronousObservable.java index 8c56935596..af2f102021 100644 --- a/src/main/java/rx/internal/util/ScalarSynchronousObservable.java +++ b/src/main/java/rx/internal/util/ScalarSynchronousObservable.java @@ -34,6 +34,9 @@ * @param the value type */ public final class ScalarSynchronousObservable extends Observable { + /** The constant scalar value to emit on request. */ + final T t; + /** * Indicates that the Producer used by this Observable should be fully * threadsafe. It is possible, but unlikely that multiple concurrent @@ -69,9 +72,6 @@ public static ScalarSynchronousObservable create(T t) { return new ScalarSynchronousObservable(t); } - /** The constant scalar value to emit on request. */ - final T t; - protected ScalarSynchronousObservable(final T t) { super(RxJavaHooks.onCreate(new JustOnSubscribe(t))); this.t = t; @@ -93,7 +93,7 @@ public T get() { * @return the new observable */ public Observable scalarScheduleOn(final Scheduler scheduler) { - final Func1 onSchedule; + Func1 onSchedule; if (scheduler instanceof EventLoopsScheduler) { final EventLoopsScheduler els = (EventLoopsScheduler) scheduler; onSchedule = new Func1() { diff --git a/src/main/java/rx/internal/util/ScalarSynchronousSingle.java b/src/main/java/rx/internal/util/ScalarSynchronousSingle.java index 83b7d456a1..2a0844ca28 100644 --- a/src/main/java/rx/internal/util/ScalarSynchronousSingle.java +++ b/src/main/java/rx/internal/util/ScalarSynchronousSingle.java @@ -26,12 +26,12 @@ public final class ScalarSynchronousSingle extends Single { - public static final ScalarSynchronousSingle create(T t) { + final T value; + + public static ScalarSynchronousSingle create(T t) { return new ScalarSynchronousSingle(t); } - final T value; - protected ScalarSynchronousSingle(final T t) { super(new OnSubscribe() { @@ -136,6 +136,7 @@ public void call(final SingleSubscriber child) { Subscriber subscriber = new Subscriber() { @Override public void onCompleted() { + // deliberately ignored } @Override diff --git a/src/main/java/rx/internal/util/SubscriptionList.java b/src/main/java/rx/internal/util/SubscriptionList.java index 6f6f391dde..c5dc85d388 100644 --- a/src/main/java/rx/internal/util/SubscriptionList.java +++ b/src/main/java/rx/internal/util/SubscriptionList.java @@ -27,16 +27,28 @@ */ public final class SubscriptionList implements Subscription { - private LinkedList subscriptions; + private List subscriptions; private volatile boolean unsubscribed; + /** + * Constructs an empty SubscriptionList. + */ public SubscriptionList() { + // nothing to do } + /** + * Constructs a SubscriptionList with the given initial child subscriptions. + * @param subscriptions the array of subscriptions to start with + */ public SubscriptionList(final Subscription... subscriptions) { this.subscriptions = new LinkedList(Arrays.asList(subscriptions)); } + /** + * Constructs a SubscriptionList with the given initial child subscription. + * @param s the initial subscription instance + */ public SubscriptionList(Subscription s) { this.subscriptions = new LinkedList(); this.subscriptions.add(s); @@ -62,7 +74,7 @@ public void add(final Subscription s) { if (!unsubscribed) { synchronized (this) { if (!unsubscribed) { - LinkedList subs = subscriptions; + List subs = subscriptions; if (subs == null) { subs = new LinkedList(); subscriptions = subs; @@ -80,7 +92,7 @@ public void remove(final Subscription s) { if (!unsubscribed) { boolean unsubscribe = false; synchronized (this) { - LinkedList subs = subscriptions; + List subs = subscriptions; if (unsubscribed || subs == null) { return; } diff --git a/src/main/java/rx/internal/util/SynchronizedQueue.java b/src/main/java/rx/internal/util/SynchronizedQueue.java index 8f0c4a7372..5b0795aef6 100644 --- a/src/main/java/rx/internal/util/SynchronizedQueue.java +++ b/src/main/java/rx/internal/util/SynchronizedQueue.java @@ -25,9 +25,9 @@ * * @param */ -public class SynchronizedQueue implements Queue { +public class SynchronizedQueue implements Queue, Cloneable { - private final LinkedList list = new LinkedList(); + private final Queue list = new LinkedList(); private final int size; public SynchronizedQueue() { @@ -39,62 +39,62 @@ public SynchronizedQueue(int size) { } @Override - public synchronized boolean isEmpty() { + public synchronized boolean isEmpty() { // NOPMD return list.isEmpty(); } @Override - public synchronized boolean contains(Object o) { + public synchronized boolean contains(Object o) { // NOPMD return list.contains(o); } @Override - public synchronized Iterator iterator() { + public synchronized Iterator iterator() { // NOPMD return list.iterator(); } @Override - public synchronized int size() { + public synchronized int size() { // NOPMD return list.size(); } @Override - public synchronized boolean add(T e) { + public synchronized boolean add(T e) { // NOPMD return list.add(e); } @Override - public synchronized boolean remove(Object o) { + public synchronized boolean remove(Object o) { // NOPMD return list.remove(o); } @Override - public synchronized boolean containsAll(Collection c) { + public synchronized boolean containsAll(Collection c) { // NOPMD return list.containsAll(c); } @Override - public synchronized boolean addAll(Collection c) { + public synchronized boolean addAll(Collection c) { // NOPMD return list.addAll(c); } @Override - public synchronized boolean removeAll(Collection c) { + public synchronized boolean removeAll(Collection c) { // NOPMD return list.removeAll(c); } @Override - public synchronized boolean retainAll(Collection c) { + public synchronized boolean retainAll(Collection c) { // NOPMD return list.retainAll(c); } @Override - public synchronized void clear() { + public synchronized void clear() { // NOPMD list.clear(); } @Override - public synchronized String toString() { + public synchronized String toString() { // NOPMD return list.toString(); } @@ -105,43 +105,48 @@ public int hashCode() { @Override public boolean equals(Object obj) { - if (this == obj) + if (this == obj) { return true; - if (obj == null) + } + if (obj == null) { return false; - if (getClass() != obj.getClass()) + } + if (getClass() != obj.getClass()) { return false; + } SynchronizedQueue other = (SynchronizedQueue) obj; if (list == null) { - if (other.list != null) + if (other.list != null) { return false; - } else if (!list.equals(other.list)) + } + } else if (!list.equals(other.list)) { return false; + } return true; } @Override - public synchronized T peek() { + public synchronized T peek() { // NOPMD return list.peek(); } @Override - public synchronized T element() { + public synchronized T element() { // NOPMD return list.element(); } @Override - public synchronized T poll() { + public synchronized T poll() { // NOPMD return list.poll(); } @Override - public synchronized T remove() { + public synchronized T remove() { // NOPMD return list.remove(); } @Override - public synchronized boolean offer(T e) { + public synchronized boolean offer(T e) { // NOPMD if (size > -1 && list.size() + 1 > size) { return false; } @@ -149,19 +154,19 @@ public synchronized boolean offer(T e) { } @Override - public synchronized Object clone() { + public synchronized Object clone() { // NOPMD SynchronizedQueue q = new SynchronizedQueue(size); q.addAll(list); return q; } @Override - public synchronized Object[] toArray() { + public synchronized Object[] toArray() { // NOPMD return list.toArray(); } @Override - public synchronized R[] toArray(R[] a) { + public synchronized R[] toArray(R[] a) { // NOPMD return list.toArray(a); } diff --git a/src/main/java/rx/internal/util/SynchronizedSubscription.java b/src/main/java/rx/internal/util/SynchronizedSubscription.java deleted file mode 100644 index d8c1c9944f..0000000000 --- a/src/main/java/rx/internal/util/SynchronizedSubscription.java +++ /dev/null @@ -1,35 +0,0 @@ -/** - * Copyright 2014 Netflix, Inc. - * - * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in - * compliance with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software distributed under the License is - * distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See - * the License for the specific language governing permissions and limitations under the License. - */ -package rx.internal.util; - -import rx.Subscription; - -public class SynchronizedSubscription implements Subscription { - - private final Subscription s; - - public SynchronizedSubscription(Subscription s) { - this.s = s; - } - - @Override - public synchronized void unsubscribe() { - s.unsubscribe(); - } - - @Override - public synchronized boolean isUnsubscribed() { - return s.isUnsubscribed(); - } - -} diff --git a/src/main/java/rx/internal/util/UtilityFunctions.java b/src/main/java/rx/internal/util/UtilityFunctions.java index 5fe24cb75a..adf2c2c011 100644 --- a/src/main/java/rx/internal/util/UtilityFunctions.java +++ b/src/main/java/rx/internal/util/UtilityFunctions.java @@ -28,7 +28,14 @@ * Utility functions for internal use that we don't want part of the public API. */ public final class UtilityFunctions { + @SuppressWarnings("rawtypes") + private static final NullFunction NULL_FUNCTION = new NullFunction(); + /** Utility class. */ + private UtilityFunctions() { + throw new IllegalStateException("No instances!"); + } + /** * Returns a function that always returns {@code true}. * @@ -103,10 +110,7 @@ public static NullFunction implements + static final class NullFunction implements Func0, Func1, Func2, @@ -118,8 +122,6 @@ private static final class NullFunction, Func9, FuncN { - NullFunction() { - } @Override public R call() { diff --git a/src/main/java/rx/internal/util/atomic/AtomicReferenceArrayQueue.java b/src/main/java/rx/internal/util/atomic/AtomicReferenceArrayQueue.java index f7594ba20a..33d45b011b 100644 --- a/src/main/java/rx/internal/util/atomic/AtomicReferenceArrayQueue.java +++ b/src/main/java/rx/internal/util/atomic/AtomicReferenceArrayQueue.java @@ -36,8 +36,7 @@ public Iterator iterator() { @Override public void clear() { // we have to test isEmpty because of the weaker poll() guarantee - while (poll() != null || !isEmpty()) - ; + while (poll() != null || !isEmpty()) ; // NOPMD } protected final int calcElementOffset(long index, int mask) { return (int)index & mask; diff --git a/src/main/java/rx/internal/util/atomic/BaseLinkedAtomicQueue.java b/src/main/java/rx/internal/util/atomic/BaseLinkedAtomicQueue.java index 3775f550bf..e9bc346d32 100644 --- a/src/main/java/rx/internal/util/atomic/BaseLinkedAtomicQueue.java +++ b/src/main/java/rx/internal/util/atomic/BaseLinkedAtomicQueue.java @@ -70,7 +70,7 @@ public final int size() { // must chase the nodes all the way to the producer node, but there's no need to chase a moving target. while (chaserNode != producerNode && size < Integer.MAX_VALUE) { LinkedQueueNode next; - while((next = chaserNode.lvNext()) == null); + while((next = chaserNode.lvNext()) == null); // NOPMD chaserNode = next; size++; } diff --git a/src/main/java/rx/internal/util/atomic/LinkedQueueNode.java b/src/main/java/rx/internal/util/atomic/LinkedQueueNode.java index d687460c64..719f04e828 100644 --- a/src/main/java/rx/internal/util/atomic/LinkedQueueNode.java +++ b/src/main/java/rx/internal/util/atomic/LinkedQueueNode.java @@ -24,7 +24,9 @@ public final class LinkedQueueNode extends AtomicReference private E value; public LinkedQueueNode() { + // no initial value } + public LinkedQueueNode(E val) { spValue(val); } diff --git a/src/main/java/rx/internal/util/atomic/MpscLinkedAtomicQueue.java b/src/main/java/rx/internal/util/atomic/MpscLinkedAtomicQueue.java index 31f54bd5ce..b4ef15f91b 100644 --- a/src/main/java/rx/internal/util/atomic/MpscLinkedAtomicQueue.java +++ b/src/main/java/rx/internal/util/atomic/MpscLinkedAtomicQueue.java @@ -55,7 +55,7 @@ public MpscLinkedAtomicQueue() { * @see java.util.Queue#offer(java.lang.Object) */ @Override - public final boolean offer(final E nextValue) { + public boolean offer(final E nextValue) { if (nextValue == null) { throw new NullPointerException("null elements not allowed"); } @@ -83,7 +83,7 @@ public final boolean offer(final E nextValue) { * @see java.util.Queue#poll() */ @Override - public final E poll() { + public E poll() { LinkedQueueNode currConsumerNode = lpConsumerNode(); // don't load twice, it's alright LinkedQueueNode nextNode = currConsumerNode.lvNext(); if (nextNode != null) { @@ -94,7 +94,7 @@ public final E poll() { } else if (currConsumerNode != lvProducerNode()) { // spin, we are no longer wait free - while((nextNode = currConsumerNode.lvNext()) == null); + while((nextNode = currConsumerNode.lvNext()) == null); // NOPMD // got the next node... // we have to null out the value because we are going to hang on to the node @@ -106,7 +106,7 @@ else if (currConsumerNode != lvProducerNode()) { } @Override - public final E peek() { + public E peek() { LinkedQueueNode currConsumerNode = lpConsumerNode(); // don't load twice, it's alright LinkedQueueNode nextNode = currConsumerNode.lvNext(); if (nextNode != null) { @@ -114,7 +114,7 @@ public final E peek() { } else if (currConsumerNode != lvProducerNode()) { // spin, we are no longer wait free - while((nextNode = currConsumerNode.lvNext()) == null); + while((nextNode = currConsumerNode.lvNext()) == null); // NOPMD // got the next node... return nextNode.lpValue(); } diff --git a/src/main/java/rx/internal/util/atomic/SpscAtomicArrayQueue.java b/src/main/java/rx/internal/util/atomic/SpscAtomicArrayQueue.java index 6240a5f156..03ec839c07 100644 --- a/src/main/java/rx/internal/util/atomic/SpscAtomicArrayQueue.java +++ b/src/main/java/rx/internal/util/atomic/SpscAtomicArrayQueue.java @@ -35,7 +35,7 @@ public final class SpscAtomicArrayQueue extends AtomicReferenceArrayQueue { private static final Integer MAX_LOOK_AHEAD_STEP = Integer.getInteger("jctools.spsc.max.lookahead.step", 4096); final AtomicLong producerIndex; - protected long producerLookAhead; + long producerLookAhead; final AtomicLong consumerIndex; final int lookAheadStep; public SpscAtomicArrayQueue(int capacity) { diff --git a/src/main/java/rx/internal/util/atomic/SpscExactAtomicArrayQueue.java b/src/main/java/rx/internal/util/atomic/SpscExactAtomicArrayQueue.java index 53f9b719ce..e0d41b21a0 100644 --- a/src/main/java/rx/internal/util/atomic/SpscExactAtomicArrayQueue.java +++ b/src/main/java/rx/internal/util/atomic/SpscExactAtomicArrayQueue.java @@ -82,7 +82,7 @@ public T peek() { } @Override public void clear() { - while (poll() != null || !isEmpty()); + while (poll() != null || !isEmpty()); // NOPMD } @Override public boolean isEmpty() { diff --git a/src/main/java/rx/internal/util/atomic/SpscLinkedArrayQueue.java b/src/main/java/rx/internal/util/atomic/SpscLinkedArrayQueue.java index 4e4943dfcb..a37326f09d 100644 --- a/src/main/java/rx/internal/util/atomic/SpscLinkedArrayQueue.java +++ b/src/main/java/rx/internal/util/atomic/SpscLinkedArrayQueue.java @@ -35,14 +35,15 @@ */ public final class SpscLinkedArrayQueue implements Queue { static final int MAX_LOOK_AHEAD_STEP = Integer.getInteger("jctools.spsc.max.lookahead.step", 4096); - protected final AtomicLong producerIndex; - protected int producerLookAheadStep; - protected long producerLookAhead; - protected int producerMask; - protected AtomicReferenceArray producerBuffer; - protected int consumerMask; - protected AtomicReferenceArray consumerBuffer; - protected final AtomicLong consumerIndex; + final AtomicLong producerIndex; + int producerLookAheadStep; + long producerLookAhead; + int producerMask; + AtomicReferenceArray producerBuffer; + int consumerMask; + AtomicReferenceArray consumerBuffer; + final AtomicLong consumerIndex; + private static final Object HAS_NEXT = new Object(); public SpscLinkedArrayQueue(final int bufferSize) { @@ -65,7 +66,7 @@ public SpscLinkedArrayQueue(final int bufferSize) { * This implementation is correct for single producer thread use only. */ @Override - public final boolean offer(final T e) { + public boolean offer(final T e) { // local load of field to avoid repeated loads after volatile reads final AtomicReferenceArray buffer = producerBuffer; final long index = lpProducerIndex(); @@ -122,7 +123,7 @@ private AtomicReferenceArray lvNext(AtomicReferenceArray curr) { */ @SuppressWarnings("unchecked") @Override - public final T poll() { + public T poll() { // local load of field to avoid repeated loads after volatile reads final AtomicReferenceArray buffer = consumerBuffer; final long index = lpConsumerIndex(); @@ -162,7 +163,7 @@ private T newBufferPoll(AtomicReferenceArray nextBuffer, final long inde */ @SuppressWarnings("unchecked") @Override - public final T peek() { + public T peek() { final AtomicReferenceArray buffer = consumerBuffer; final long index = lpConsumerIndex(); final int mask = consumerMask; @@ -177,7 +178,7 @@ public final T peek() { @Override public void clear() { - while (poll() != null || !isEmpty()); + while (poll() != null || !isEmpty()); // NOPMD } @SuppressWarnings("unchecked") @@ -188,7 +189,7 @@ private T newBufferPeek(AtomicReferenceArray nextBuffer, final long inde } @Override - public final int size() { + public int size() { /* * It is possible for a thread to be interrupted or reschedule between the read of the producer and * consumer indices, therefore protection is required to ensure size is within valid range. In the @@ -254,7 +255,7 @@ private static Object lvElement(AtomicReferenceArray buffer, int off } @Override - public final Iterator iterator() { + public Iterator iterator() { throw new UnsupportedOperationException(); } diff --git a/src/main/java/rx/internal/util/atomic/SpscUnboundedAtomicArrayQueue.java b/src/main/java/rx/internal/util/atomic/SpscUnboundedAtomicArrayQueue.java index 728591794e..017b0a8245 100644 --- a/src/main/java/rx/internal/util/atomic/SpscUnboundedAtomicArrayQueue.java +++ b/src/main/java/rx/internal/util/atomic/SpscUnboundedAtomicArrayQueue.java @@ -33,12 +33,12 @@ public final class SpscUnboundedAtomicArrayQueue implements Queue { static final int MAX_LOOK_AHEAD_STEP = Integer.getInteger("jctools.spsc.max.lookahead.step", 4096); final AtomicLong producerIndex; - protected int producerLookAheadStep; - protected long producerLookAhead; - protected int producerMask; - protected AtomicReferenceArray producerBuffer; - protected int consumerMask; - protected AtomicReferenceArray consumerBuffer; + int producerLookAheadStep; + long producerLookAhead; + int producerMask; + AtomicReferenceArray producerBuffer; + int consumerMask; + AtomicReferenceArray consumerBuffer; final AtomicLong consumerIndex; private static final Object HAS_NEXT = new Object(); @@ -63,7 +63,7 @@ public SpscUnboundedAtomicArrayQueue(final int bufferSize) { * This implementation is correct for single producer thread use only. */ @Override - public final boolean offer(final T e) { + public boolean offer(final T e) { if (e == null) { throw new NullPointerException(); } @@ -123,7 +123,7 @@ private AtomicReferenceArray lvNext(AtomicReferenceArray curr) { */ @SuppressWarnings("unchecked") @Override - public final T poll() { + public T poll() { // local load of field to avoid repeated loads after volatile reads final AtomicReferenceArray buffer = consumerBuffer; final long index = lpConsumerIndex(); @@ -163,7 +163,7 @@ private T newBufferPoll(AtomicReferenceArray nextBuffer, final long inde */ @SuppressWarnings("unchecked") @Override - public final T peek() { + public T peek() { final AtomicReferenceArray buffer = consumerBuffer; final long index = lpConsumerIndex(); final int mask = consumerMask; @@ -178,7 +178,7 @@ public final T peek() { @Override public void clear() { - while (poll() != null || !isEmpty()); + while (poll() != null || !isEmpty()); // NOPMD } @SuppressWarnings("unchecked") @@ -189,7 +189,7 @@ private T newBufferPeek(AtomicReferenceArray nextBuffer, final long inde } @Override - public final int size() { + public int size() { /* * It is possible for a thread to be interrupted or reschedule between the read of the producer and * consumer indices, therefore protection is required to ensure size is within valid range. In the @@ -255,7 +255,7 @@ private static Object lvElement(AtomicReferenceArray buffer, int off } @Override - public final Iterator iterator() { + public Iterator iterator() { throw new UnsupportedOperationException(); } diff --git a/src/main/java/rx/internal/util/unsafe/BaseLinkedQueue.java b/src/main/java/rx/internal/util/unsafe/BaseLinkedQueue.java index 05bcb798fb..8a5c600421 100644 --- a/src/main/java/rx/internal/util/unsafe/BaseLinkedQueue.java +++ b/src/main/java/rx/internal/util/unsafe/BaseLinkedQueue.java @@ -102,7 +102,7 @@ public final int size() { // must chase the nodes all the way to the producer node, but there's no need to chase a moving target. while (chaserNode != producerNode && size < Integer.MAX_VALUE) { LinkedQueueNode next; - while((next = chaserNode.lvNext()) == null); + while((next = chaserNode.lvNext()) == null); // NOPMD chaserNode = next; size++; } diff --git a/src/main/java/rx/internal/util/unsafe/ConcurrentCircularArrayQueue.java b/src/main/java/rx/internal/util/unsafe/ConcurrentCircularArrayQueue.java index a8b9990b56..06e90da3ea 100644 --- a/src/main/java/rx/internal/util/unsafe/ConcurrentCircularArrayQueue.java +++ b/src/main/java/rx/internal/util/unsafe/ConcurrentCircularArrayQueue.java @@ -180,7 +180,6 @@ public Iterator iterator() { @Override public void clear() { // we have to test isEmpty because of the weaker poll() guarantee - while (poll() != null || !isEmpty()) - ; + while (poll() != null || !isEmpty()) ; // NOPMD } } diff --git a/src/main/java/rx/internal/util/unsafe/MpscLinkedQueue.java b/src/main/java/rx/internal/util/unsafe/MpscLinkedQueue.java index 2607c3a023..11e034e85c 100644 --- a/src/main/java/rx/internal/util/unsafe/MpscLinkedQueue.java +++ b/src/main/java/rx/internal/util/unsafe/MpscLinkedQueue.java @@ -42,7 +42,7 @@ public MpscLinkedQueue() { } @SuppressWarnings("unchecked") - protected final LinkedQueueNode xchgProducerNode(LinkedQueueNode newVal) { + protected LinkedQueueNode xchgProducerNode(LinkedQueueNode newVal) { Object oldVal; do { oldVal = producerNode; @@ -67,7 +67,7 @@ protected final LinkedQueueNode xchgProducerNode(LinkedQueueNode newVal) { * @see java.util.Queue#offer(java.lang.Object) */ @Override - public final boolean offer(final E nextValue) { + public boolean offer(final E nextValue) { if (nextValue == null) { throw new NullPointerException("null elements not allowed"); } @@ -96,7 +96,7 @@ public final boolean offer(final E nextValue) { * @see java.util.Queue#poll() */ @Override - public final E poll() { + public E poll() { LinkedQueueNode currConsumerNode = lpConsumerNode(); // don't load twice, it's alright LinkedQueueNode nextNode = currConsumerNode.lvNext(); if (nextNode != null) { @@ -107,7 +107,7 @@ public final E poll() { } else if (currConsumerNode != lvProducerNode()) { // spin, we are no longer wait free - while((nextNode = currConsumerNode.lvNext()) == null); + while((nextNode = currConsumerNode.lvNext()) == null); // NOPMD // got the next node... // we have to null out the value because we are going to hang on to the node @@ -119,7 +119,7 @@ else if (currConsumerNode != lvProducerNode()) { } @Override - public final E peek() { + public E peek() { LinkedQueueNode currConsumerNode = consumerNode; // don't load twice, it's alright LinkedQueueNode nextNode = currConsumerNode.lvNext(); if (nextNode != null) { @@ -127,7 +127,7 @@ public final E peek() { } else if (currConsumerNode != lvProducerNode()) { // spin, we are no longer wait free - while((nextNode = currConsumerNode.lvNext()) == null); + while((nextNode = currConsumerNode.lvNext()) == null); // NOPMD // got the next node... return nextNode.lpValue(); } diff --git a/src/main/java/rx/internal/util/unsafe/QueueProgressIndicators.java b/src/main/java/rx/internal/util/unsafe/QueueProgressIndicators.java index 185f0bd612..f75152e161 100644 --- a/src/main/java/rx/internal/util/unsafe/QueueProgressIndicators.java +++ b/src/main/java/rx/internal/util/unsafe/QueueProgressIndicators.java @@ -37,7 +37,7 @@ public interface QueueProgressIndicators { * * @return the current value of the producer progress index */ - public long currentProducerIndex(); + long currentProducerIndex(); /** * This method has no concurrent visibility semantics. The value returned may be negative. Under normal @@ -50,5 +50,5 @@ public interface QueueProgressIndicators { * * @return the current value of the consumer progress index */ - public long currentConsumerIndex(); + long currentConsumerIndex(); } \ No newline at end of file diff --git a/src/main/java/rx/internal/util/unsafe/SpmcArrayQueue.java b/src/main/java/rx/internal/util/unsafe/SpmcArrayQueue.java index 8a4251872d..cdd029ade1 100644 --- a/src/main/java/rx/internal/util/unsafe/SpmcArrayQueue.java +++ b/src/main/java/rx/internal/util/unsafe/SpmcArrayQueue.java @@ -129,7 +129,7 @@ public boolean offer(final E e) { } else { // spin wait for slot to clear, buggers wait freedom - while(null != lvElement(lb, offset)); + while(null != lvElement(lb, offset)); // NOPMD } } spElement(lb, offset, e); diff --git a/src/main/java/rx/internal/util/unsafe/SpscUnboundedArrayQueue.java b/src/main/java/rx/internal/util/unsafe/SpscUnboundedArrayQueue.java index 6175bab455..dc353e0ae7 100644 --- a/src/main/java/rx/internal/util/unsafe/SpscUnboundedArrayQueue.java +++ b/src/main/java/rx/internal/util/unsafe/SpscUnboundedArrayQueue.java @@ -69,13 +69,17 @@ public class SpscUnboundedArrayQueue extends SpscUnboundedArrayQueueConsumerF Field iField = SpscUnboundedArrayQueueProducerFields.class.getDeclaredField("producerIndex"); P_INDEX_OFFSET = UNSAFE.objectFieldOffset(iField); } catch (NoSuchFieldException e) { - throw new RuntimeException(e); + InternalError ex = new InternalError(); + ex.initCause(e); + throw ex; } try { Field iField = SpscUnboundedArrayQueueConsumerField.class.getDeclaredField("consumerIndex"); C_INDEX_OFFSET = UNSAFE.objectFieldOffset(iField); } catch (NoSuchFieldException e) { - throw new RuntimeException(e); + InternalError ex = new InternalError(); + ex.initCause(e); + throw ex; } } diff --git a/src/main/java/rx/internal/util/unsafe/UnsafeAccess.java b/src/main/java/rx/internal/util/unsafe/UnsafeAccess.java index 076112982f..fd3fd447a2 100644 --- a/src/main/java/rx/internal/util/unsafe/UnsafeAccess.java +++ b/src/main/java/rx/internal/util/unsafe/UnsafeAccess.java @@ -27,14 +27,15 @@ * {@code rx.unsafe-disable}. */ public final class UnsafeAccess { - private UnsafeAccess() { - throw new IllegalStateException("No instances!"); - } public static final Unsafe UNSAFE; private static final boolean DISABLED_BY_USER = System.getProperty("rx.unsafe-disable") != null; + private UnsafeAccess() { + throw new IllegalStateException("No instances!"); + } + static { Unsafe u = null; try { @@ -47,7 +48,7 @@ private UnsafeAccess() { Field field = Unsafe.class.getDeclaredField("theUnsafe"); field.setAccessible(true); u = (Unsafe) field.get(null); - } catch (Throwable e) { + } catch (Throwable e) { // NOPMD // do nothing, hasUnsafe() will return false } UNSAFE = u; @@ -65,8 +66,9 @@ public static int getAndIncrementInt(Object obj, long offset) { for (;;) { int current = UNSAFE.getIntVolatile(obj, offset); int next = current + 1; - if (UNSAFE.compareAndSwapInt(obj, offset, current, next)) + if (UNSAFE.compareAndSwapInt(obj, offset, current, next)) { return current; + } } } @@ -74,16 +76,18 @@ public static int getAndAddInt(Object obj, long offset, int n) { for (;;) { int current = UNSAFE.getIntVolatile(obj, offset); int next = current + n; - if (UNSAFE.compareAndSwapInt(obj, offset, current, next)) + if (UNSAFE.compareAndSwapInt(obj, offset, current, next)) { return current; + } } } public static int getAndSetInt(Object obj, long offset, int newValue) { for (;;) { int current = UNSAFE.getIntVolatile(obj, offset); - if (UNSAFE.compareAndSwapInt(obj, offset, current, newValue)) + if (UNSAFE.compareAndSwapInt(obj, offset, current, newValue)) { return current; + } } } diff --git a/src/main/java/rx/observables/AsyncOnSubscribe.java b/src/main/java/rx/observables/AsyncOnSubscribe.java index a32175fd9c..d1394d7547 100644 --- a/src/main/java/rx/observables/AsyncOnSubscribe.java +++ b/src/main/java/rx/observables/AsyncOnSubscribe.java @@ -94,7 +94,7 @@ public abstract class AsyncOnSubscribe implements OnSubscribe { * {@link #next(Object, long, Observer)} or unsubscribing. */ protected void onUnsubscribe(S state) { - + // default behavior is no-op } /** @@ -269,7 +269,7 @@ public void call(Void t) { * @param * the type of compatible Subscribers */ - private static final class AsyncOnSubscribeImpl extends AsyncOnSubscribe { + static final class AsyncOnSubscribeImpl extends AsyncOnSubscribe { private final Func0 generator; private final Func3>, ? extends S> next; private final Action1 onUnsubscribe; @@ -304,8 +304,9 @@ protected S next(S state, long requested, Observer> obse @Override protected void onUnsubscribe(S state) { - if (onUnsubscribe != null) + if (onUnsubscribe != null) { onUnsubscribe.call(state); + } } } @@ -586,8 +587,9 @@ public void onNext(final Observable t) { throw new IllegalStateException("onNext called multiple times!"); } onNextCalled = true; - if (hasTerminated) + if (hasTerminated) { return; + } subscribeBufferToObservable(t); } @@ -631,12 +633,12 @@ public void call() { } static final class UnicastSubject extends Observableimplements Observer { + private final State state; + public static UnicastSubject create() { return new UnicastSubject(new State()); } - private State state; - protected UnicastSubject(final State state) { super(state); this.state = state; diff --git a/src/main/java/rx/observables/BlockingObservable.java b/src/main/java/rx/observables/BlockingObservable.java index 53991409af..e9db68f358 100644 --- a/src/main/java/rx/observables/BlockingObservable.java +++ b/src/main/java/rx/observables/BlockingObservable.java @@ -23,7 +23,7 @@ import rx.Observable; import rx.Observer; import rx.annotations.Experimental; -import rx.exceptions.OnErrorNotImplementedException; +import rx.exceptions.*; import rx.functions.*; import rx.internal.operators.*; import rx.internal.util.BlockingUtils; @@ -53,6 +53,15 @@ public final class BlockingObservable { private final Observable o; + /** Constant to indicate the onStart method should be called. */ + static final Object ON_START = new Object(); + + /** Constant indicating the setProducer method should be called. */ + static final Object SET_PRODUCER = new Object(); + + /** Indicates an unsubscription happened */ + static final Object UNSUBSCRIBE = new Object(); + private BlockingObservable(Observable o) { this.o = o; } @@ -129,11 +138,7 @@ public void onNext(T args) { BlockingUtils.awaitForComplete(latch, subscription); if (exceptionFromOnError.get() != null) { - if (exceptionFromOnError.get() instanceof RuntimeException) { - throw (RuntimeException) exceptionFromOnError.get(); - } else { - throw new RuntimeException(exceptionFromOnError.get()); - } + Exceptions.propagate(exceptionFromOnError.get()); } } @@ -457,11 +462,7 @@ public void onNext(final T item) { BlockingUtils.awaitForComplete(latch, subscription); if (returnException.get() != null) { - if (returnException.get() instanceof RuntimeException) { - throw (RuntimeException) returnException.get(); - } else { - throw new RuntimeException(returnException.get()); - } + Exceptions.propagate(returnException.get()); } return returnItem.get(); @@ -478,7 +479,7 @@ public void subscribe() { Subscription s = ((Observable)o).subscribe(new Subscriber() { @Override public void onNext(T t) { - + // deliberately ignored } @Override public void onError(Throwable e) { @@ -495,11 +496,7 @@ public void onCompleted() { BlockingUtils.awaitForComplete(cdl, s); Throwable e = error[0]; if (e != null) { - if (e instanceof RuntimeException) { - throw (RuntimeException)e; - } else { - throw new RuntimeException(e); - } + Exceptions.propagate(e); } } @@ -546,15 +543,6 @@ public void onCompleted() { } } - /** Constant to indicate the onStart method should be called. */ - static final Object ON_START = new Object(); - - /** Constant indicating the setProducer method should be called. */ - static final Object SET_PRODUCER = new Object(); - - /** Indicates an unsubscription happened */ - static final Object UNSUBSCRIBE = new Object(); - /** * Subscribes to the source and calls the Subscriber methods on the current thread. *

diff --git a/src/main/java/rx/observables/SyncOnSubscribe.java b/src/main/java/rx/observables/SyncOnSubscribe.java index 34745fb118..6876b1ef31 100644 --- a/src/main/java/rx/observables/SyncOnSubscribe.java +++ b/src/main/java/rx/observables/SyncOnSubscribe.java @@ -105,7 +105,7 @@ public final void call(final Subscriber subscriber) { * {@link #next(Object, Observer) next(S, Observer<T>)} before unsubscribe. */ protected void onUnsubscribe(S state) { - + // default behavior is no-op } /** @@ -279,7 +279,7 @@ public void call(Void t) { * @param * the type of compatible Subscribers */ - private static final class SyncOnSubscribeImpl extends SyncOnSubscribe { + static final class SyncOnSubscribeImpl extends SyncOnSubscribe { private final Func0 generator; private final Func2, ? extends S> next; private final Action1 onUnsubscribe; @@ -314,8 +314,9 @@ protected S next(S state, Observer observer) { @Override protected void onUnsubscribe(S state) { - if (onUnsubscribe != null) + if (onUnsubscribe != null) { onUnsubscribe.call(state); + } } } @@ -325,7 +326,7 @@ protected void onUnsubscribe(S state) { * @param * the type of compatible Subscribers */ - private static class SubscriptionProducer + static final class SubscriptionProducer extends AtomicLong implements Producer, Subscription, Observer { /** */ private static final long serialVersionUID = -3736864024352728072L; @@ -355,11 +356,12 @@ public void unsubscribe() { doUnsubscribe(); return; } - else if (compareAndSet(requestCount, -2L)) + else if (compareAndSet(requestCount, -2L)) { // the loop is iterating concurrently // need to check if requestCount == -1 // and unsub if so after loop iteration return; + } } } @@ -440,12 +442,14 @@ private void slowPath(long n) { if (tryUnsubscribe()) { return; } - if (onNextCalled) + if (onNextCalled) { numRemaining--; + } } while (numRemaining != 0L); numRequested = addAndGet(-numRequested); - if (numRequested <= 0L) + if (numRequested <= 0L) { break; + } } // catches cases where unsubscribe is called before decrementing atomic request count tryUnsubscribe(); diff --git a/src/main/java/rx/observers/AsyncCompletableSubscriber.java b/src/main/java/rx/observers/AsyncCompletableSubscriber.java index d61585e4fa..67ebf8a283 100644 --- a/src/main/java/rx/observers/AsyncCompletableSubscriber.java +++ b/src/main/java/rx/observers/AsyncCompletableSubscriber.java @@ -58,6 +58,10 @@ */ @Experimental public abstract class AsyncCompletableSubscriber implements CompletableSubscriber, Subscription { + /** + * Indicates the unsubscribed state. + */ + static final Unsubscribed UNSUBSCRIBED = new Unsubscribed(); /** * Holds onto a deferred subscription and allows asynchronous cancellation before the call @@ -81,6 +85,7 @@ public final void onSubscribe(Subscription d) { * Called before the first onSubscribe() call succeeds. */ protected void onStart() { + // default behavior is no op } @Override @@ -107,11 +112,6 @@ public final void unsubscribe() { } - /** - * Indicates the unsubscribed state. - */ - static final Unsubscribed UNSUBSCRIBED = new Unsubscribed(); - static final class Unsubscribed implements Subscription { @Override diff --git a/src/main/java/rx/observers/SafeSubscriber.java b/src/main/java/rx/observers/SafeSubscriber.java index e2df6ffe96..78a39e78f2 100644 --- a/src/main/java/rx/observers/SafeSubscriber.java +++ b/src/main/java/rx/observers/SafeSubscriber.java @@ -64,7 +64,7 @@ public class SafeSubscriber extends Subscriber { private final Subscriber actual; - boolean done = false; + boolean done; public SafeSubscriber(Subscriber actual) { super(actual); @@ -88,7 +88,7 @@ public void onCompleted() { Exceptions.throwIfFatal(e); RxJavaPluginUtils.handleException(e); throw new OnCompletedFailedException(e.getMessage(), e); - } finally { + } finally { // NOPMD try { // Similarly to onError if failure occurs in unsubscribe then Rx contract is broken // and we throw an UnsubscribeFailureException. @@ -151,51 +151,49 @@ public void onNext(T args) { * * @see the report of this bug */ - protected void _onError(Throwable e) { + protected void _onError(Throwable e) { // NOPMD RxJavaPluginUtils.handleException(e); try { actual.onError(e); + } catch (OnErrorNotImplementedException e2) { // NOPMD + /* + * onError isn't implemented so throw + * + * https://github.com/ReactiveX/RxJava/issues/198 + * + * Rx Design Guidelines 5.2 + * + * "when calling the Subscribe method that only has an onNext argument, the OnError behavior + * will be to rethrow the exception on the thread that the message comes out from the observable + * sequence. The OnCompleted behavior in this case is to do nothing." + */ + try { + unsubscribe(); + } catch (Throwable unsubscribeException) { + RxJavaPluginUtils.handleException(unsubscribeException); + throw new OnErrorNotImplementedException("Observer.onError not implemented and error while unsubscribing.", new CompositeException(Arrays.asList(e, unsubscribeException))); // NOPMD + } + throw e2; } catch (Throwable e2) { - if (e2 instanceof OnErrorNotImplementedException) { - /* - * onError isn't implemented so throw - * - * https://github.com/ReactiveX/RxJava/issues/198 - * - * Rx Design Guidelines 5.2 - * - * "when calling the Subscribe method that only has an onNext argument, the OnError behavior - * will be to rethrow the exception on the thread that the message comes out from the observable - * sequence. The OnCompleted behavior in this case is to do nothing." - */ - try { - unsubscribe(); - } catch (Throwable unsubscribeException) { - RxJavaPluginUtils.handleException(unsubscribeException); - throw new RuntimeException("Observer.onError not implemented and error while unsubscribing.", new CompositeException(Arrays.asList(e, unsubscribeException))); - } - throw (OnErrorNotImplementedException) e2; - } else { - /* - * throw since the Rx contract is broken if onError failed - * - * https://github.com/ReactiveX/RxJava/issues/198 - */ - RxJavaPluginUtils.handleException(e2); - try { - unsubscribe(); - } catch (Throwable unsubscribeException) { - RxJavaPluginUtils.handleException(unsubscribeException); - throw new OnErrorFailedException("Error occurred when trying to propagate error to Observer.onError and during unsubscription.", new CompositeException(Arrays.asList(e, e2, unsubscribeException))); - } - - throw new OnErrorFailedException("Error occurred when trying to propagate error to Observer.onError", new CompositeException(Arrays.asList(e, e2))); + /* + * throw since the Rx contract is broken if onError failed + * + * https://github.com/ReactiveX/RxJava/issues/198 + */ + RxJavaPluginUtils.handleException(e2); + try { + unsubscribe(); + } catch (Throwable unsubscribeException) { + RxJavaPluginUtils.handleException(unsubscribeException); + throw new OnErrorFailedException("Error occurred when trying to propagate error to Observer.onError and during unsubscription.", new CompositeException(Arrays.asList(e, e2, unsubscribeException))); } + + throw new OnErrorFailedException("Error occurred when trying to propagate error to Observer.onError", new CompositeException(Arrays.asList(e, e2))); } // if we did not throw above we will unsubscribe here, if onError failed then unsubscribe happens in the catch try { unsubscribe(); - } catch (RuntimeException unsubscribeException) { + } catch (Throwable unsubscribeException) { RxJavaPluginUtils.handleException(unsubscribeException); throw new OnErrorFailedException(unsubscribeException); } diff --git a/src/main/java/rx/observers/TestObserver.java b/src/main/java/rx/observers/TestObserver.java index fa7d19dd61..b46cbd8941 100644 --- a/src/main/java/rx/observers/TestObserver.java +++ b/src/main/java/rx/observers/TestObserver.java @@ -30,9 +30,9 @@ public class TestObserver implements Observer { private final Observer delegate; - private final ArrayList onNextEvents = new ArrayList(); - private final ArrayList onErrorEvents = new ArrayList(); - private final ArrayList> onCompletedEvents = new ArrayList>(); + private final List onNextEvents = new ArrayList(); + private final List onErrorEvents = new ArrayList(); + private final List> onCompletedEvents = new ArrayList>(); public TestObserver(Observer delegate) { this.delegate = delegate; @@ -160,7 +160,7 @@ public void assertTerminalEvent() { assertionError("Received both an onError and onCompleted. Should be one or the other."); } - if (onCompletedEvents.size() == 0 && onErrorEvents.size() == 0) { + if (onCompletedEvents.isEmpty() && onErrorEvents.isEmpty()) { assertionError("No terminal events received."); } } @@ -173,17 +173,16 @@ public void assertTerminalEvent() { final void assertionError(String message) { StringBuilder b = new StringBuilder(message.length() + 32); - b.append(message); + b.append(message) + .append(" ("); - - b.append(" ("); int c = onCompletedEvents.size(); - b.append(c); - b.append(" completion"); + b.append(c) + .append(" completion"); if (c != 1) { - b.append("s"); + b.append('s'); } - b.append(")"); + b.append(')'); if (!onErrorEvents.isEmpty()) { int size = onErrorEvents.size(); @@ -191,9 +190,9 @@ final void assertionError(String message) { .append(size) .append(" error"); if (size != 1) { - b.append("s"); + b.append('s'); } - b.append(")"); + b.append(')'); } AssertionError ae = new AssertionError(b.toString()); @@ -208,21 +207,21 @@ final void assertionError(String message) { } // do nothing ... including swallowing errors - private static Observer INERT = new Observer() { + private static final Observer INERT = new Observer() { @Override public void onCompleted() { - + // deliberately ignored } @Override public void onError(Throwable e) { - + // deliberately ignored } @Override public void onNext(Object t) { - + // deliberately ignored } }; diff --git a/src/main/java/rx/observers/TestSubscriber.java b/src/main/java/rx/observers/TestSubscriber.java index ce973fe861..c40593af55 100644 --- a/src/main/java/rx/observers/TestSubscriber.java +++ b/src/main/java/rx/observers/TestSubscriber.java @@ -383,7 +383,7 @@ public void assertTerminalEvent() { assertionError("Received both an onError and onCompleted. Should be one or the other."); } - if (completions == 0 && errors.size() == 0) { + if (completions == 0 && errors.isEmpty()) { assertionError("No terminal events received."); } } @@ -408,7 +408,7 @@ public void assertUnsubscribed() { */ public void assertNoErrors() { List onErrorEvents = getOnErrorEvents(); - if (onErrorEvents.size() > 0) { + if (!onErrorEvents.isEmpty()) { assertionError("Unexpected onError events"); } } @@ -425,7 +425,7 @@ public void awaitTerminalEvent() { try { latch.await(); } catch (InterruptedException e) { - throw new RuntimeException("Interrupted", e); + throw new IllegalStateException("Interrupted", e); } } @@ -444,7 +444,7 @@ public void awaitTerminalEvent(long timeout, TimeUnit unit) { try { latch.await(timeout, unit); } catch (InterruptedException e) { - throw new RuntimeException("Interrupted", e); + throw new IllegalStateException("Interrupted", e); } } @@ -524,7 +524,7 @@ public void assertNotCompleted() { */ public void assertError(Class clazz) { List err = errors; - if (err.size() == 0) { + if (err.isEmpty()) { assertionError("No errors"); } else if (err.size() > 1) { @@ -549,7 +549,7 @@ public void assertError(Class clazz) { */ public void assertError(Throwable throwable) { List err = errors; - if (err.size() == 0) { + if (err.isEmpty()) { assertionError("No errors"); } else if (err.size() > 1) { @@ -569,7 +569,7 @@ public void assertError(Throwable throwable) { public void assertNoTerminalEvent() { List err = errors; int s = completions; - if (err.size() > 0 || s > 0) { + if (!err.isEmpty() || s > 0) { if (err.isEmpty()) { assertionError("Found " + err.size() + " errors and " + s + " completion events instead of none"); } else @@ -638,17 +638,16 @@ public void assertValue(T value) { final void assertionError(String message) { StringBuilder b = new StringBuilder(message.length() + 32); - b.append(message); + b.append(message) + .append(" ("); - - b.append(" ("); int c = completions; - b.append(c); - b.append(" completion"); + b.append(c) + .append(" completion"); if (c != 1) { - b.append("s"); + b.append('s'); } - b.append(")"); + b.append(')'); if (!errors.isEmpty()) { int size = errors.size(); @@ -656,9 +655,9 @@ final void assertionError(String message) { .append(size) .append(" error"); if (size != 1) { - b.append("s"); + b.append('s'); } - b.append(")"); + b.append(')'); } AssertionError ae = new AssertionError(b.toString()); diff --git a/src/main/java/rx/plugins/RxJavaCompletableExecutionHook.java b/src/main/java/rx/plugins/RxJavaCompletableExecutionHook.java index 287289242d..7faf996724 100644 --- a/src/main/java/rx/plugins/RxJavaCompletableExecutionHook.java +++ b/src/main/java/rx/plugins/RxJavaCompletableExecutionHook.java @@ -38,7 +38,7 @@ * @since (if this graduates from Experimental/Beta to supported, replace this parenthetical with the release number) */ @Experimental -public abstract class RxJavaCompletableExecutionHook { +public abstract class RxJavaCompletableExecutionHook { // NOPMD /** * Invoked during the construction by {@link Completable#create(Completable.CompletableOnSubscribe)} *

diff --git a/src/main/java/rx/plugins/RxJavaErrorHandler.java b/src/main/java/rx/plugins/RxJavaErrorHandler.java index 8107fab457..f6ca781d1b 100644 --- a/src/main/java/rx/plugins/RxJavaErrorHandler.java +++ b/src/main/java/rx/plugins/RxJavaErrorHandler.java @@ -31,7 +31,9 @@ * See {@link RxJavaPlugins} or the RxJava GitHub Wiki for information on configuring plugins: https://github.com/ReactiveX/RxJava/wiki/Plugins. */ -public abstract class RxJavaErrorHandler { +public abstract class RxJavaErrorHandler { // NOPMD + + protected static final String ERROR_IN_RENDERING_SUFFIX = ".errorRendering"; /** * Receives all {@code Exception}s from an {@link Observable} passed to @@ -48,8 +50,6 @@ public void handleError(Throwable e) { // do nothing by default } - protected static final String ERROR_IN_RENDERING_SUFFIX = ".errorRendering"; - /** * Receives items causing {@code OnErrorThrowable.OnNextValue} and gives a chance to choose the String * representation of the item in the {@code OnNextValue} stacktrace rendering. Returns {@code null} if this diff --git a/src/main/java/rx/plugins/RxJavaHooks.java b/src/main/java/rx/plugins/RxJavaHooks.java index a5b621ea19..34f58a4947 100644 --- a/src/main/java/rx/plugins/RxJavaHooks.java +++ b/src/main/java/rx/plugins/RxJavaHooks.java @@ -33,11 +33,6 @@ */ @Experimental public final class RxJavaHooks { - /** Utility class. */ - private RxJavaHooks() { - throw new IllegalStateException("No instances!"); - } - /** * Prevents changing the hook callbacks when set to true. */ @@ -77,7 +72,13 @@ private RxJavaHooks() { static { init(); } + + /** Utility class. */ + private RxJavaHooks() { + throw new IllegalStateException("No instances!"); + } + /** * Initialize the hooks via delegating to RxJavaPlugins. */ diff --git a/src/main/java/rx/plugins/RxJavaObservableExecutionHook.java b/src/main/java/rx/plugins/RxJavaObservableExecutionHook.java index 8c08851ed5..7996e1f3e9 100644 --- a/src/main/java/rx/plugins/RxJavaObservableExecutionHook.java +++ b/src/main/java/rx/plugins/RxJavaObservableExecutionHook.java @@ -39,7 +39,7 @@ * worker threads. * */ -public abstract class RxJavaObservableExecutionHook { +public abstract class RxJavaObservableExecutionHook { // NOPMD /** * Invoked during the construction by {@link Observable#create(OnSubscribe)} *

diff --git a/src/main/java/rx/plugins/RxJavaObservableExecutionHookDefault.java b/src/main/java/rx/plugins/RxJavaObservableExecutionHookDefault.java index 43dde33a26..f8cfa5e4f5 100644 --- a/src/main/java/rx/plugins/RxJavaObservableExecutionHookDefault.java +++ b/src/main/java/rx/plugins/RxJavaObservableExecutionHookDefault.java @@ -18,10 +18,15 @@ /** * Default no-op implementation of {@link RxJavaObservableExecutionHook} */ -/* package */class RxJavaObservableExecutionHookDefault extends RxJavaObservableExecutionHook { +/* package */final class RxJavaObservableExecutionHookDefault extends RxJavaObservableExecutionHook { - private static RxJavaObservableExecutionHookDefault INSTANCE = new RxJavaObservableExecutionHookDefault(); + private static final RxJavaObservableExecutionHookDefault INSTANCE = new RxJavaObservableExecutionHookDefault(); + /** Utility class. */ + private RxJavaObservableExecutionHookDefault() { + + } + public static RxJavaObservableExecutionHook getInstance() { return INSTANCE; } diff --git a/src/main/java/rx/plugins/RxJavaPlugins.java b/src/main/java/rx/plugins/RxJavaPlugins.java index 9271a42ce2..184b4fdb1d 100644 --- a/src/main/java/rx/plugins/RxJavaPlugins.java +++ b/src/main/java/rx/plugins/RxJavaPlugins.java @@ -58,6 +58,9 @@ public class RxJavaPlugins { private final AtomicReference completableExecutionHook = new AtomicReference(); private final AtomicReference schedulersHook = new AtomicReference(); + static final RxJavaErrorHandler DEFAULT_ERROR_HANDLER = new RxJavaErrorHandler() { + }; + /** * Retrieves the single {@code RxJavaPlugins} instance. * @@ -71,7 +74,7 @@ public static RxJavaPlugins getInstance() { } /* package accessible for unit tests */RxJavaPlugins() { - + // nothing to do } /** @@ -91,9 +94,6 @@ public void reset() { INSTANCE.schedulersHook.set(null); } - static final RxJavaErrorHandler DEFAULT_ERROR_HANDLER = new RxJavaErrorHandler() { - }; - /** * Retrieves an instance of {@link RxJavaErrorHandler} to use based on order of precedence as defined in * {@link RxJavaPlugins} class header. @@ -277,14 +277,14 @@ public void registerCompletableExecutionHook(RxJavaCompletableExecutionHook impl * System.getProperties as it will never get called in normal operations. */ - final String pluginPrefix = "rxjava.plugin."; + String pluginPrefix = "rxjava.plugin."; String defaultKey = pluginPrefix + classSimpleName + ".implementation"; String implementingClass = props.getProperty(defaultKey); if (implementingClass == null) { - final String classSuffix = ".class"; - final String implSuffix = ".impl"; + String classSuffix = ".class"; + String implSuffix = ".impl"; for (Map.Entry e : props.entrySet()) { String key = e.getKey().toString(); @@ -299,7 +299,7 @@ public void registerCompletableExecutionHook(RxJavaCompletableExecutionHook impl implementingClass = props.getProperty(implKey); if (implementingClass == null) { - throw new RuntimeException("Implementing class declaration for " + classSimpleName + " missing: " + implKey); + throw new IllegalStateException("Implementing class declaration for " + classSimpleName + " missing: " + implKey); } break; @@ -315,13 +315,13 @@ public void registerCompletableExecutionHook(RxJavaCompletableExecutionHook impl cls = cls.asSubclass(pluginClass); return cls.newInstance(); } catch (ClassCastException e) { - throw new RuntimeException(classSimpleName + " implementation is not an instance of " + classSimpleName + ": " + implementingClass); + throw new IllegalStateException(classSimpleName + " implementation is not an instance of " + classSimpleName + ": " + implementingClass, e); } catch (ClassNotFoundException e) { - throw new RuntimeException(classSimpleName + " implementation class not found: " + implementingClass, e); + throw new IllegalStateException(classSimpleName + " implementation class not found: " + implementingClass, e); } catch (InstantiationException e) { - throw new RuntimeException(classSimpleName + " implementation not able to be instantiated: " + implementingClass, e); + throw new IllegalStateException(classSimpleName + " implementation not able to be instantiated: " + implementingClass, e); } catch (IllegalAccessException e) { - throw new RuntimeException(classSimpleName + " implementation not able to be accessed: " + implementingClass, e); + throw new IllegalStateException(classSimpleName + " implementation not able to be accessed: " + implementingClass, e); } } diff --git a/src/main/java/rx/plugins/RxJavaSchedulersHook.java b/src/main/java/rx/plugins/RxJavaSchedulersHook.java index a8158e2f5e..cc1675f322 100644 --- a/src/main/java/rx/plugins/RxJavaSchedulersHook.java +++ b/src/main/java/rx/plugins/RxJavaSchedulersHook.java @@ -42,6 +42,8 @@ */ public class RxJavaSchedulersHook { + private final static RxJavaSchedulersHook DEFAULT_INSTANCE = new RxJavaSchedulersHook(); + /** * Create an instance of the default {@link Scheduler} used for {@link Schedulers#computation()}. * @return the created Scheduler instance @@ -59,7 +61,9 @@ public static Scheduler createComputationScheduler() { */ @Experimental public static Scheduler createComputationScheduler(ThreadFactory threadFactory) { - if (threadFactory == null) throw new NullPointerException("threadFactory == null"); + if (threadFactory == null) { + throw new NullPointerException("threadFactory == null"); + } return new EventLoopsScheduler(threadFactory); } @@ -80,7 +84,9 @@ public static Scheduler createIoScheduler() { */ @Experimental public static Scheduler createIoScheduler(ThreadFactory threadFactory) { - if (threadFactory == null) throw new NullPointerException("threadFactory == null"); + if (threadFactory == null) { + throw new NullPointerException("threadFactory == null"); + } return new CachedThreadScheduler(threadFactory); } @@ -101,16 +107,12 @@ public static Scheduler createNewThreadScheduler() { */ @Experimental public static Scheduler createNewThreadScheduler(ThreadFactory threadFactory) { - if (threadFactory == null) throw new NullPointerException("threadFactory == null"); + if (threadFactory == null) { + throw new NullPointerException("threadFactory == null"); + } return new NewThreadScheduler(threadFactory); } - protected RxJavaSchedulersHook() { - - } - - private final static RxJavaSchedulersHook DEFAULT_INSTANCE = new RxJavaSchedulersHook(); - /** * Scheduler to return from {@link rx.schedulers.Schedulers#computation()} or null if default should be * used. diff --git a/src/main/java/rx/plugins/RxJavaSingleExecutionHook.java b/src/main/java/rx/plugins/RxJavaSingleExecutionHook.java index 4e023f615e..809a968f6b 100644 --- a/src/main/java/rx/plugins/RxJavaSingleExecutionHook.java +++ b/src/main/java/rx/plugins/RxJavaSingleExecutionHook.java @@ -38,7 +38,7 @@ * worker threads. * */ -public abstract class RxJavaSingleExecutionHook { +public abstract class RxJavaSingleExecutionHook { // NOPMD /** * Invoked during the construction by {@link Single#create(Single.OnSubscribe)} *

diff --git a/src/main/java/rx/plugins/RxJavaSingleExecutionHookDefault.java b/src/main/java/rx/plugins/RxJavaSingleExecutionHookDefault.java index 60a382589f..dd09ecfc79 100644 --- a/src/main/java/rx/plugins/RxJavaSingleExecutionHookDefault.java +++ b/src/main/java/rx/plugins/RxJavaSingleExecutionHookDefault.java @@ -18,10 +18,16 @@ /** * Default no-op implementation of {@link RxJavaSingleExecutionHook} */ -class RxJavaSingleExecutionHookDefault extends RxJavaSingleExecutionHook { +final class RxJavaSingleExecutionHookDefault extends RxJavaSingleExecutionHook { private static final RxJavaSingleExecutionHookDefault INSTANCE = new RxJavaSingleExecutionHookDefault(); + /** + * Utility class. + */ + private RxJavaSingleExecutionHookDefault() { + } + public static RxJavaSingleExecutionHook getInstance() { return INSTANCE; } diff --git a/src/main/java/rx/schedulers/ImmediateScheduler.java b/src/main/java/rx/schedulers/ImmediateScheduler.java index 2696859987..a187a5aa51 100644 --- a/src/main/java/rx/schedulers/ImmediateScheduler.java +++ b/src/main/java/rx/schedulers/ImmediateScheduler.java @@ -22,7 +22,7 @@ */ @Deprecated // Class was part of public API. -public final class ImmediateScheduler extends Scheduler { +public final class ImmediateScheduler extends Scheduler { // NOPMD private ImmediateScheduler() { throw new AssertionError(); } diff --git a/src/main/java/rx/schedulers/NewThreadScheduler.java b/src/main/java/rx/schedulers/NewThreadScheduler.java index fc709243f0..a8d3221d3d 100644 --- a/src/main/java/rx/schedulers/NewThreadScheduler.java +++ b/src/main/java/rx/schedulers/NewThreadScheduler.java @@ -22,7 +22,7 @@ */ @Deprecated // Class was part of public API. -public final class NewThreadScheduler extends Scheduler { +public final class NewThreadScheduler extends Scheduler { // NOPMD private NewThreadScheduler() { throw new AssertionError(); } diff --git a/src/main/java/rx/schedulers/Schedulers.java b/src/main/java/rx/schedulers/Schedulers.java index 6dc89f0178..5155dfb297 100644 --- a/src/main/java/rx/schedulers/Schedulers.java +++ b/src/main/java/rx/schedulers/Schedulers.java @@ -146,7 +146,7 @@ public static Scheduler io() { * * @return a {@code TestScheduler} meant for debugging */ - public static TestScheduler test() { + public static TestScheduler test() { // NOPMD return new TestScheduler(); } @@ -211,7 +211,7 @@ public static void shutdown() { /** * Start the instance-specific schedulers. */ - synchronized void startInstance() { + synchronized void startInstance() { // NOPMD if (computationScheduler instanceof SchedulerLifecycle) { ((SchedulerLifecycle) computationScheduler).start(); } @@ -226,7 +226,7 @@ synchronized void startInstance() { /** * Start the instance-specific schedulers. */ - synchronized void shutdownInstance() { + synchronized void shutdownInstance() { // NOPMD if (computationScheduler instanceof SchedulerLifecycle) { ((SchedulerLifecycle) computationScheduler).shutdown(); } diff --git a/src/main/java/rx/schedulers/TestScheduler.java b/src/main/java/rx/schedulers/TestScheduler.java index fec8bbcd75..b4d3b6e9af 100644 --- a/src/main/java/rx/schedulers/TestScheduler.java +++ b/src/main/java/rx/schedulers/TestScheduler.java @@ -32,9 +32,13 @@ */ public class TestScheduler extends Scheduler { final Queue queue = new PriorityQueue(11, new CompareActionsByTime()); - static long counter = 0; + + static long counter; + + // Storing time in nanoseconds internally. + long time; - private static final class TimedAction { + static final class TimedAction { final long time; final Action0 action; @@ -53,9 +57,7 @@ public String toString() { } } - private static class CompareActionsByTime implements Comparator { - CompareActionsByTime() { - } + static final class CompareActionsByTime implements Comparator { @Override public int compare(TimedAction action1, TimedAction action2) { @@ -67,9 +69,6 @@ public int compare(TimedAction action1, TimedAction action2) { } } - // Storing time in nanoseconds internally. - long time; - @Override public long now() { return TimeUnit.NANOSECONDS.toMillis(time); @@ -131,13 +130,10 @@ public Worker createWorker() { return new InnerTestScheduler(); } - private final class InnerTestScheduler extends Worker { + final class InnerTestScheduler extends Worker { private final BooleanSubscription s = new BooleanSubscription(); - InnerTestScheduler() { - } - @Override public void unsubscribe() { s.unsubscribe(); diff --git a/src/main/java/rx/schedulers/TimeInterval.java b/src/main/java/rx/schedulers/TimeInterval.java index 2123abaa0b..b5e7760c3d 100644 --- a/src/main/java/rx/schedulers/TimeInterval.java +++ b/src/main/java/rx/schedulers/TimeInterval.java @@ -61,7 +61,7 @@ public T getValue() { // The following methods are generated by eclipse automatically. @Override public int hashCode() { - final int prime = 31; + int prime = 31; int result = 1; result = prime * result @@ -72,20 +72,26 @@ public int hashCode() { @Override public boolean equals(Object obj) { - if (this == obj) + if (this == obj) { return true; - if (obj == null) + } + if (obj == null) { return false; - if (getClass() != obj.getClass()) + } + if (getClass() != obj.getClass()) { return false; + } TimeInterval other = (TimeInterval) obj; - if (intervalInMilliseconds != other.intervalInMilliseconds) + if (intervalInMilliseconds != other.intervalInMilliseconds) { return false; + } if (value == null) { - if (other.value != null) + if (other.value != null) { return false; - } else if (!value.equals(other.value)) + } + } else if (!value.equals(other.value)) { return false; + } return true; } diff --git a/src/main/java/rx/schedulers/Timestamped.java b/src/main/java/rx/schedulers/Timestamped.java index fee18b7976..f741ccbc4a 100644 --- a/src/main/java/rx/schedulers/Timestamped.java +++ b/src/main/java/rx/schedulers/Timestamped.java @@ -73,7 +73,7 @@ public boolean equals(Object obj) { @Override public int hashCode() { - final int prime = 31; + int prime = 31; int result = 1; result = prime * result + (int) (timestampMillis ^ (timestampMillis >>> 32)); result = prime * result + ((value == null) ? 0 : value.hashCode()); diff --git a/src/main/java/rx/schedulers/TrampolineScheduler.java b/src/main/java/rx/schedulers/TrampolineScheduler.java index bb28916123..d14e0d2cb8 100644 --- a/src/main/java/rx/schedulers/TrampolineScheduler.java +++ b/src/main/java/rx/schedulers/TrampolineScheduler.java @@ -22,7 +22,7 @@ */ @Deprecated // Class was part of public API. -public final class TrampolineScheduler extends Scheduler { +public final class TrampolineScheduler extends Scheduler { // NOPMD private TrampolineScheduler() { throw new AssertionError(); } diff --git a/src/main/java/rx/singles/BlockingSingle.java b/src/main/java/rx/singles/BlockingSingle.java index 1cd0605a33..2c14498b87 100644 --- a/src/main/java/rx/singles/BlockingSingle.java +++ b/src/main/java/rx/singles/BlockingSingle.java @@ -20,6 +20,7 @@ import rx.SingleSubscriber; import rx.Subscription; import rx.annotations.Experimental; +import rx.exceptions.Exceptions; import rx.internal.operators.BlockingOperatorToFuture; import rx.internal.util.BlockingUtils; @@ -35,9 +36,10 @@ * or {@link Single#toBlocking()}. * * @param the value type of the sequence + * @since (if this graduates from Experimental/Beta to supported, replace this parenthetical with the release number) */ @Experimental -public class BlockingSingle { +public final class BlockingSingle { private final Single single; private BlockingSingle(Single single) { @@ -88,10 +90,7 @@ public void onError(Throwable error) { BlockingUtils.awaitForComplete(latch, subscription); Throwable throwable = returnException.get(); if (throwable != null) { - if (throwable instanceof RuntimeException) { - throw (RuntimeException) throwable; - } - throw new RuntimeException(throwable); + throw Exceptions.propagate(throwable); } return returnItem.get(); } diff --git a/src/main/java/rx/subjects/AsyncSubject.java b/src/main/java/rx/subjects/AsyncSubject.java index 26057b6821..07a8440232 100644 --- a/src/main/java/rx/subjects/AsyncSubject.java +++ b/src/main/java/rx/subjects/AsyncSubject.java @@ -58,6 +58,9 @@ * the type of item expected to be observed by the Subject */ public final class AsyncSubject extends Subject { + final SubjectSubscriptionManager state; + volatile Object lastValue; + private final NotificationLite nl = NotificationLite.instance(); /** * Creates and returns a new {@code AsyncSubject}. @@ -84,10 +87,6 @@ public void call(SubjectObserver o) { return new AsyncSubject(state, state); } - final SubjectSubscriptionManager state; - volatile Object lastValue; - private final NotificationLite nl = NotificationLite.instance(); - protected AsyncSubject(OnSubscribe onSubscribe, SubjectSubscriptionManager state) { super(onSubscribe); this.state = state; diff --git a/src/main/java/rx/subjects/BehaviorSubject.java b/src/main/java/rx/subjects/BehaviorSubject.java index ad8bd448f6..1ed4892746 100644 --- a/src/main/java/rx/subjects/BehaviorSubject.java +++ b/src/main/java/rx/subjects/BehaviorSubject.java @@ -70,6 +70,11 @@ * the type of item expected to be observed by the Subject */ public final class BehaviorSubject extends Subject { + /** An empty array to trigger getValues() to return a new array. */ + private static final Object[] EMPTY_ARRAY = new Object[0]; + private final SubjectSubscriptionManager state; + private final NotificationLite nl = NotificationLite.instance(); + /** * Creates a {@link BehaviorSubject} without a default item. * @@ -111,9 +116,6 @@ public void call(SubjectObserver o) { return new BehaviorSubject(state, state); } - private final SubjectSubscriptionManager state; - private final NotificationLite nl = NotificationLite.instance(); - protected BehaviorSubject(OnSubscribe onSubscribe, SubjectSubscriptionManager state) { super(onSubscribe); this.state = state; @@ -255,9 +257,6 @@ public T[] getValues(T[] a) { return a; } - /** An empty array to trigger getValues() to return a new array. */ - private static final Object[] EMPTY_ARRAY = new Object[0]; - /** * Returns a snapshot of the currently buffered non-terminal events. *

The operation is threadsafe. diff --git a/src/main/java/rx/subjects/PublishSubject.java b/src/main/java/rx/subjects/PublishSubject.java index 42a4a18c7c..90fae91c00 100644 --- a/src/main/java/rx/subjects/PublishSubject.java +++ b/src/main/java/rx/subjects/PublishSubject.java @@ -50,6 +50,8 @@ * the type of items observed and emitted by the Subject */ public final class PublishSubject extends Subject { + final SubjectSubscriptionManager state; + private final NotificationLite nl = NotificationLite.instance(); /** * Creates and returns a new {@code PublishSubject}. @@ -70,9 +72,6 @@ public void call(SubjectObserver o) { return new PublishSubject(state, state); } - final SubjectSubscriptionManager state; - private final NotificationLite nl = NotificationLite.instance(); - protected PublishSubject(OnSubscribe onSubscribe, SubjectSubscriptionManager state) { super(onSubscribe); this.state = state; diff --git a/src/main/java/rx/subjects/ReplaySubject.java b/src/main/java/rx/subjects/ReplaySubject.java index a842baedbf..63d3001414 100644 --- a/src/main/java/rx/subjects/ReplaySubject.java +++ b/src/main/java/rx/subjects/ReplaySubject.java @@ -53,6 +53,10 @@ * the type of items observed and emitted by the Subject */ public final class ReplaySubject extends Subject { + /** The state storing the history and the references. */ + final ReplayState state; + /** An empty array to trigger getValues() to return a new array. */ + private static final Object[] EMPTY_ARRAY = new Object[0]; /** * Creates an unbounded replay subject. *

@@ -229,9 +233,6 @@ public static ReplaySubject createWithTimeAndSize(long time, TimeUnit uni return new ReplaySubject(state); } - /** The state storing the history and the references. */ - final ReplayState state; - ReplaySubject(ReplayState state) { super(state); this.state = state; @@ -321,9 +322,6 @@ public T[] getValues(T[] a) { return state.buffer.toArray(a); } - /** An empty array to trigger getValues() to return a new array. */ - private static final Object[] EMPTY_ARRAY = new Object[0]; - /** * Returns a snapshot of the currently buffered non-terminal events. *

The operation is threadsafe. diff --git a/src/main/java/rx/subjects/SubjectSubscriptionManager.java b/src/main/java/rx/subjects/SubjectSubscriptionManager.java index 215deb4936..53db3f3684 100644 --- a/src/main/java/rx/subjects/SubjectSubscriptionManager.java +++ b/src/main/java/rx/subjects/SubjectSubscriptionManager.java @@ -214,7 +214,7 @@ protected static final class SubjectObserver implements Observer { List queue; /* volatile */boolean fastPath; /** Indicate that the observer has caught up. */ - protected volatile boolean caughtUp; + volatile boolean caughtUp; /** Indicate where the observer is at replaying. */ private volatile Object index; public SubjectObserver(Subscriber actual) { @@ -238,7 +238,7 @@ public void onCompleted() { * @param n the NotificationLite value * @param nl the type-appropriate notification lite object */ - protected void emitNext(Object n, final NotificationLite nl) { + void emitNext(Object n, final NotificationLite nl) { if (!fastPath) { synchronized (this) { first = false; @@ -260,7 +260,7 @@ protected void emitNext(Object n, final NotificationLite nl) { * @param n the NotificationLite value * @param nl the type-appropriate notification lite object */ - protected void emitFirst(Object n, final NotificationLite nl) { + void emitFirst(Object n, final NotificationLite nl) { synchronized (this) { if (!first || emitting) { return; @@ -278,7 +278,7 @@ protected void emitFirst(Object n, final NotificationLite nl) { * @param current the current content to emit * @param nl the type-appropriate notification lite object */ - protected void emitLoop(List localQueue, Object current, final NotificationLite nl) { + void emitLoop(List localQueue, Object current, final NotificationLite nl) { boolean once = true; boolean skipFinal = false; try { @@ -315,14 +315,14 @@ protected void emitLoop(List localQueue, Object current, final Notificat * @param n the value to dispatch * @param nl the type-appropriate notification lite object */ - protected void accept(Object n, final NotificationLite nl) { + void accept(Object n, final NotificationLite nl) { if (n != null) { nl.accept(actual, n); } } /** @return the actual Observer. */ - protected Observer getActual() { + Observer getActual() { return actual; } /** diff --git a/src/main/java/rx/subjects/TestSubject.java b/src/main/java/rx/subjects/TestSubject.java index db57feedd4..579173a785 100644 --- a/src/main/java/rx/subjects/TestSubject.java +++ b/src/main/java/rx/subjects/TestSubject.java @@ -34,6 +34,9 @@ * the type of item observed by and emitted by the subject */ public final class TestSubject extends Subject { + private final SubjectSubscriptionManager state; + private final Scheduler.Worker innerScheduler; + /** * Creates and returns a new {@code TestSubject}. @@ -58,9 +61,6 @@ public void call(SubjectObserver o) { return new TestSubject(state, state, scheduler); } - private final SubjectSubscriptionManager state; - private final Scheduler.Worker innerScheduler; - protected TestSubject(OnSubscribe onSubscribe, SubjectSubscriptionManager state, TestScheduler scheduler) { super(onSubscribe); this.state = state; @@ -75,7 +75,7 @@ public void onCompleted() { onCompleted(0); } - void _onCompleted() { + void internalOnCompleted() { if (state.active) { for (SubjectObserver bo : state.terminate(NotificationLite.instance().completed())) { bo.onCompleted(); @@ -94,7 +94,7 @@ public void onCompleted(long delayTime) { @Override public void call() { - _onCompleted(); + internalOnCompleted(); } }, delayTime, TimeUnit.MILLISECONDS); @@ -108,7 +108,7 @@ public void onError(final Throwable e) { onError(e, 0); } - void _onError(final Throwable e) { + void internalOnError(final Throwable e) { if (state.active) { for (SubjectObserver bo : state.terminate(NotificationLite.instance().error(e))) { bo.onError(e); @@ -129,7 +129,7 @@ public void onError(final Throwable e, long delayTime) { @Override public void call() { - _onError(e); + internalOnError(e); } }, delayTime, TimeUnit.MILLISECONDS); @@ -143,7 +143,7 @@ public void onNext(T v) { onNext(v, 0); } - void _onNext(T v) { + void internalOnNext(T v) { for (Observer o : state.observers()) { o.onNext(v); } @@ -162,7 +162,7 @@ public void onNext(final T v, long delayTime) { @Override public void call() { - _onNext(v); + internalOnNext(v); } }, delayTime, TimeUnit.MILLISECONDS); diff --git a/src/main/java/rx/subjects/UnicastSubject.java b/src/main/java/rx/subjects/UnicastSubject.java index f401c364f1..57459d72d5 100644 --- a/src/main/java/rx/subjects/UnicastSubject.java +++ b/src/main/java/rx/subjects/UnicastSubject.java @@ -38,6 +38,8 @@ @Experimental public final class UnicastSubject extends Subject { + final State state; + /** * Constructs an empty UnicastSubject instance with the default capacity hint of 16 elements. * @@ -80,8 +82,6 @@ public static UnicastSubject create(int capacityHint, Action0 onTerminate return new UnicastSubject(state); } - final State state; - private UnicastSubject(State state) { super(state); this.state = state; diff --git a/src/main/java/rx/subscriptions/BooleanSubscription.java b/src/main/java/rx/subscriptions/BooleanSubscription.java index 9ba4100a66..3628e63f91 100644 --- a/src/main/java/rx/subscriptions/BooleanSubscription.java +++ b/src/main/java/rx/subscriptions/BooleanSubscription.java @@ -63,7 +63,7 @@ public boolean isUnsubscribed() { } @Override - public final void unsubscribe() { + public void unsubscribe() { Action0 action = actionRef.get(); if (action != EMPTY_ACTION) { action = actionRef.getAndSet(EMPTY_ACTION); @@ -76,7 +76,7 @@ public final void unsubscribe() { static final Action0 EMPTY_ACTION = new Action0() { @Override public void call() { - + // deliberately no-op } }; diff --git a/src/main/java/rx/subscriptions/CompositeSubscription.java b/src/main/java/rx/subscriptions/CompositeSubscription.java index 876a04a56b..6b111af15e 100644 --- a/src/main/java/rx/subscriptions/CompositeSubscription.java +++ b/src/main/java/rx/subscriptions/CompositeSubscription.java @@ -35,7 +35,11 @@ public final class CompositeSubscription implements Subscription { private Set subscriptions; private volatile boolean unsubscribed; + /** + * Constructs an empty Composite subscription. + */ public CompositeSubscription() { + // start empty } public CompositeSubscription(final Subscription... subscriptions) { diff --git a/src/main/java/rx/subscriptions/MultipleAssignmentSubscription.java b/src/main/java/rx/subscriptions/MultipleAssignmentSubscription.java index ec0ea7c6df..1418a5684c 100644 --- a/src/main/java/rx/subscriptions/MultipleAssignmentSubscription.java +++ b/src/main/java/rx/subscriptions/MultipleAssignmentSubscription.java @@ -28,7 +28,7 @@ public final class MultipleAssignmentSubscription implements Subscription { final AtomicReference state = new AtomicReference(new State(false, Subscriptions.empty())); - private static final class State { + static final class State { final boolean isUnsubscribed; final Subscription subscription; diff --git a/src/main/java/rx/subscriptions/RefCountSubscription.java b/src/main/java/rx/subscriptions/RefCountSubscription.java index 083b860f04..dbb38716b7 100644 --- a/src/main/java/rx/subscriptions/RefCountSubscription.java +++ b/src/main/java/rx/subscriptions/RefCountSubscription.java @@ -29,7 +29,7 @@ public final class RefCountSubscription implements Subscription { static final State EMPTY_STATE = new State(false, 0); final AtomicReference state = new AtomicReference(EMPTY_STATE); - private static final class State { + static final class State { final boolean isUnsubscribed; final int children; @@ -125,7 +125,7 @@ void unsubscribeAChild() { } /** The individual sub-subscriptions. */ - private static final class InnerSubscription extends AtomicInteger implements Subscription { + static final class InnerSubscription extends AtomicInteger implements Subscription { /** */ private static final long serialVersionUID = 7005765588239987643L; diff --git a/src/main/java/rx/subscriptions/SerialSubscription.java b/src/main/java/rx/subscriptions/SerialSubscription.java index f8aff9b67e..b06503f761 100644 --- a/src/main/java/rx/subscriptions/SerialSubscription.java +++ b/src/main/java/rx/subscriptions/SerialSubscription.java @@ -26,7 +26,7 @@ public final class SerialSubscription implements Subscription { final AtomicReference state = new AtomicReference(new State(false, Subscriptions.empty())); - private static final class State { + static final class State { final boolean isUnsubscribed; final Subscription subscription; diff --git a/src/main/java/rx/subscriptions/Subscriptions.java b/src/main/java/rx/subscriptions/Subscriptions.java index 64d941f13d..db11dfb87b 100644 --- a/src/main/java/rx/subscriptions/Subscriptions.java +++ b/src/main/java/rx/subscriptions/Subscriptions.java @@ -24,6 +24,11 @@ * Helper methods and utilities for creating and working with {@link Subscription} objects */ public final class Subscriptions { + /** + * A {@link Subscription} that does nothing when its unsubscribe method is called. + */ + private static final Unsubscribed UNSUBSCRIBED = new Unsubscribed(); + private Subscriptions() { throw new IllegalStateException("No instances!"); } @@ -85,7 +90,7 @@ public static Subscription from(final Future f) { } /** Naming classes helps with debugging. */ - private static final class FutureSubscription implements Subscription { + static final class FutureSubscription implements Subscription { final Future f; public FutureSubscription(Future f) { @@ -115,14 +120,11 @@ public static CompositeSubscription from(Subscription... subscriptions) { return new CompositeSubscription(subscriptions); } - /** - * A {@link Subscription} that does nothing when its unsubscribe method is called. - */ - private static final Unsubscribed UNSUBSCRIBED = new Unsubscribed(); /** Naming classes helps with debugging. */ static final class Unsubscribed implements Subscription { @Override public void unsubscribe() { + // deliberately ignored } @Override diff --git a/src/perf/java/rx/observables/SyncOnSubscribePerf.java b/src/perf/java/rx/observables/SyncOnSubscribePerf.java index 91882df8d0..f99a01a421 100644 --- a/src/perf/java/rx/observables/SyncOnSubscribePerf.java +++ b/src/perf/java/rx/observables/SyncOnSubscribePerf.java @@ -42,7 +42,7 @@ public static void main(String[] args) { SyncOnSubscribePerf perf = new SyncOnSubscribePerf(); perf.benchSyncOnSubscribe(singleInput); } - private static class generated { + static class generated { private static Blackhole _jmh_tryInit_() { return new Blackhole(); } diff --git a/src/test/java/rx/internal/operators/OperatorSubscribeOnTest.java b/src/test/java/rx/internal/operators/OperatorSubscribeOnTest.java index 0c72ebaf7a..7942214b0c 100644 --- a/src/test/java/rx/internal/operators/OperatorSubscribeOnTest.java +++ b/src/test/java/rx/internal/operators/OperatorSubscribeOnTest.java @@ -132,7 +132,7 @@ public Worker createWorker() { return new SlowInner(actual.createWorker()); } - private final class SlowInner extends Worker { + final class SlowInner extends Worker { private final Scheduler.Worker actualInner; diff --git a/src/test/java/rx/util/AssertObservableTest.java b/src/test/java/rx/util/AssertObservableTest.java index 5f9e9a0ac1..187735a332 100644 --- a/src/test/java/rx/util/AssertObservableTest.java +++ b/src/test/java/rx/util/AssertObservableTest.java @@ -15,7 +15,7 @@ */ package rx.util; -import org.junit.Test; +import org.junit.*; import rx.Observable; @@ -31,13 +31,23 @@ public void testPassNull() { AssertObservable.assertObservableEqualsBlocking("foo", null, null); } - @Test(expected = RuntimeException.class) + @Test public void testFailNotNull() { - AssertObservable.assertObservableEqualsBlocking("foo", Observable.just(1, 2), Observable.just(1)); + try { + AssertObservable.assertObservableEqualsBlocking("foo", Observable.just(1, 2), Observable.just(1)); + Assert.fail("Failed to throw"); + } catch (AssertionError expected) { + // expected + } } - @Test(expected = RuntimeException.class) + @Test public void testFailNull() { - AssertObservable.assertObservableEqualsBlocking("foo", Observable.just(1, 2), null); + try { + AssertObservable.assertObservableEqualsBlocking("foo", Observable.just(1, 2), null); + Assert.fail("Failed to throw"); + } catch (AssertionError expected) { + // expected + } } }