From ce26f0a390d2d8a986af775d96cb95f335f7fde9 Mon Sep 17 00:00:00 2001 From: Cristian Vrabie Date: Mon, 10 Feb 2014 22:47:49 +0000 Subject: [PATCH] Started to work on V2.0 --- README.md | 2 +- library/build.gradle | 2 + library/library.iml | 79 ---- .../deferredobject/AbstractPromise.java | 373 ++++++++++-------- .../deferredobject/AbstractSimplePromise.java | 17 + .../codeandmagic/deferredobject/Callback.java | 9 + .../deferredobject/CompleteCallback.java | 20 - .../deferredobject/DeferredObject.java | 74 +--- .../codeandmagic/deferredobject/Either.java | 23 ++ .../deferredobject/FlatMapTransformation.java | 9 + .../org/codeandmagic/deferredobject/Left.java | 40 ++ .../deferredobject/MapTransformation.java | 10 + .../deferredobject/MergedPromiseTracker.java | 80 ---- .../deferredobject/PipedPromise.java | 51 --- .../deferredobject/ProgressCallback.java | 20 - .../codeandmagic/deferredobject/Promise.java | 174 +++++--- .../deferredobject/PromiseProxy.java | 46 --- .../deferredobject/RejectCallback.java | 20 - .../deferredobject/ResolveCallback.java | 20 - .../codeandmagic/deferredobject/Right.java | 40 ++ .../deferredobject/SimplePromise.java | 13 + .../android/DeferredAsyncTask.java | 67 ---- .../android/DeferredHttpUrlConnection.java | 38 -- .../deferredobject/android/HttpProgress.java | 5 - .../deferredobject/merge/MergedPromise.java | 19 - .../deferredobject/merge/MergedPromise2.java | 30 -- .../deferredobject/merge/MergedPromise3.java | 29 -- .../deferredobject/merge/MergedPromise4.java | 30 -- .../deferredobject/merge/MergedPromise5.java | 31 -- .../deferredobject/merge/MergedPromiseN.java | 26 -- .../merge/MergedPromiseProgress.java | 26 -- .../merge/MergedPromiseReject.java | 25 -- .../merge/MergedPromiseResult2.java | 31 -- .../merge/MergedPromiseResult3.java | 27 -- .../merge/MergedPromiseResult4.java | 27 -- .../merge/MergedPromiseResult5.java | 27 -- .../pipe/PassThroughProgressFilter.java | 23 -- .../pipe/PassThroughRejectFilter.java | 23 -- .../pipe/PassThroughResolveFilter.java | 23 -- .../deferredobject/pipe/ProgressFilter.java | 20 - .../deferredobject/pipe/RejectFilter.java | 20 - .../deferredobject/pipe/ResolveFilter.java | 20 - .../deferredobject/pipe/ResolvePipe.java | 22 -- .../deferredobject/tests/CallbackTests.java | 27 ++ .../tests/DeferredObjectTest.java | 176 --------- .../tests/InspectableDeferredObject.java | 18 + .../tests/TransformationTests.java | 86 ++++ sample/sample.iml | 78 ---- .../deferredobject/MainActivity.java | 54 +-- 49 files changed, 674 insertions(+), 1476 deletions(-) delete mode 100644 library/library.iml create mode 100644 library/src/main/java/org/codeandmagic/deferredobject/AbstractSimplePromise.java create mode 100644 library/src/main/java/org/codeandmagic/deferredobject/Callback.java delete mode 100644 library/src/main/java/org/codeandmagic/deferredobject/CompleteCallback.java create mode 100644 library/src/main/java/org/codeandmagic/deferredobject/Either.java create mode 100644 library/src/main/java/org/codeandmagic/deferredobject/FlatMapTransformation.java create mode 100644 library/src/main/java/org/codeandmagic/deferredobject/Left.java create mode 100644 library/src/main/java/org/codeandmagic/deferredobject/MapTransformation.java delete mode 100644 library/src/main/java/org/codeandmagic/deferredobject/MergedPromiseTracker.java delete mode 100644 library/src/main/java/org/codeandmagic/deferredobject/PipedPromise.java delete mode 100644 library/src/main/java/org/codeandmagic/deferredobject/ProgressCallback.java delete mode 100644 library/src/main/java/org/codeandmagic/deferredobject/PromiseProxy.java delete mode 100644 library/src/main/java/org/codeandmagic/deferredobject/RejectCallback.java delete mode 100644 library/src/main/java/org/codeandmagic/deferredobject/ResolveCallback.java create mode 100644 library/src/main/java/org/codeandmagic/deferredobject/Right.java create mode 100644 library/src/main/java/org/codeandmagic/deferredobject/SimplePromise.java delete mode 100644 library/src/main/java/org/codeandmagic/deferredobject/android/DeferredAsyncTask.java delete mode 100644 library/src/main/java/org/codeandmagic/deferredobject/android/DeferredHttpUrlConnection.java delete mode 100644 library/src/main/java/org/codeandmagic/deferredobject/android/HttpProgress.java delete mode 100644 library/src/main/java/org/codeandmagic/deferredobject/merge/MergedPromise.java delete mode 100644 library/src/main/java/org/codeandmagic/deferredobject/merge/MergedPromise2.java delete mode 100644 library/src/main/java/org/codeandmagic/deferredobject/merge/MergedPromise3.java delete mode 100644 library/src/main/java/org/codeandmagic/deferredobject/merge/MergedPromise4.java delete mode 100644 library/src/main/java/org/codeandmagic/deferredobject/merge/MergedPromise5.java delete mode 100644 library/src/main/java/org/codeandmagic/deferredobject/merge/MergedPromiseN.java delete mode 100644 library/src/main/java/org/codeandmagic/deferredobject/merge/MergedPromiseProgress.java delete mode 100644 library/src/main/java/org/codeandmagic/deferredobject/merge/MergedPromiseReject.java delete mode 100644 library/src/main/java/org/codeandmagic/deferredobject/merge/MergedPromiseResult2.java delete mode 100644 library/src/main/java/org/codeandmagic/deferredobject/merge/MergedPromiseResult3.java delete mode 100644 library/src/main/java/org/codeandmagic/deferredobject/merge/MergedPromiseResult4.java delete mode 100644 library/src/main/java/org/codeandmagic/deferredobject/merge/MergedPromiseResult5.java delete mode 100644 library/src/main/java/org/codeandmagic/deferredobject/pipe/PassThroughProgressFilter.java delete mode 100644 library/src/main/java/org/codeandmagic/deferredobject/pipe/PassThroughRejectFilter.java delete mode 100644 library/src/main/java/org/codeandmagic/deferredobject/pipe/PassThroughResolveFilter.java delete mode 100644 library/src/main/java/org/codeandmagic/deferredobject/pipe/ProgressFilter.java delete mode 100644 library/src/main/java/org/codeandmagic/deferredobject/pipe/RejectFilter.java delete mode 100644 library/src/main/java/org/codeandmagic/deferredobject/pipe/ResolveFilter.java delete mode 100644 library/src/main/java/org/codeandmagic/deferredobject/pipe/ResolvePipe.java create mode 100644 library/src/test/java/org/codeandmagic/deferredobject/tests/CallbackTests.java delete mode 100644 library/src/test/java/org/codeandmagic/deferredobject/tests/DeferredObjectTest.java create mode 100644 library/src/test/java/org/codeandmagic/deferredobject/tests/InspectableDeferredObject.java create mode 100644 library/src/test/java/org/codeandmagic/deferredobject/tests/TransformationTests.java delete mode 100644 sample/sample.iml diff --git a/README.md b/README.md index 782ad6c..cca1983 100644 --- a/README.md +++ b/README.md @@ -33,7 +33,7 @@ Let's say you need to do something asynchronously like a HTTP request. You can w ``` java new DeferredAsyncTask() { - protected abstract Resolved doInBackground() throws Exception { + protected abstract Success doInBackground() throws Exception { //do your async code here } } diff --git a/library/build.gradle b/library/build.gradle index e0cd0ed..5bedc7e 100644 --- a/library/build.gradle +++ b/library/build.gradle @@ -19,6 +19,8 @@ dependencies { unitTestCompile files("$project.buildDir/classes/release") unitTestCompile 'junit:junit:4.11' + unitTestCompile 'org.mockito:mockito-all:1.9.5' + } android { diff --git a/library/library.iml b/library/library.iml deleted file mode 100644 index f178818..0000000 --- a/library/library.iml +++ /dev/null @@ -1,79 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/library/src/main/java/org/codeandmagic/deferredobject/AbstractPromise.java b/library/src/main/java/org/codeandmagic/deferredobject/AbstractPromise.java index 27175f0..42b806e 100644 --- a/library/src/main/java/org/codeandmagic/deferredobject/AbstractPromise.java +++ b/library/src/main/java/org/codeandmagic/deferredobject/AbstractPromise.java @@ -14,175 +14,216 @@ package org.codeandmagic.deferredobject; -import org.codeandmagic.deferredobject.pipe.*; - import java.util.List; import java.util.concurrent.CopyOnWriteArrayList; -/** User: cvrabie1 Date: 10/07/2012 */ -public class AbstractPromise implements Promise { - - /* - * The state of this Deferred Object - */ - private Promise.State state = State.PENDING; - /** - * The value or this deferred object if it has been resolved or null otherwise - */ - private Resolved resolved; - /** - * The rejection reason of this deferred object if it has been rejected or null otherwise - */ - private Rejected rejected; - - protected final List> resolveCallbacks = new CopyOnWriteArrayList>(); - protected final List> rejectedCallbacks = new CopyOnWriteArrayList>(); - protected final List> progressCallbacks = new CopyOnWriteArrayList>(); - protected final List> completeCallbacks = new CopyOnWriteArrayList>(); - - @Override - public Promise.State state() { - return state; - } - - @Override - public boolean isPending() { - return Promise.State.PENDING == state; - } - - @Override - public boolean isRejected() { - return Promise.State.REJECTED == state; - } - - @Override - public boolean isResolved() { - return Promise.State.RESOLVED == state; - } - - protected final void triggerResolved(){ - triggerCompleted(); - for(final ResolveCallback r : resolveCallbacks){ - r.onResolve(resolved); - } - } - - protected void resolve(final Resolved resolved){ - this.resolved = resolved; - this.state = Promise.State.RESOLVED; - triggerResolved(); - } - - protected final void triggerRejected(){ - triggerCompleted(); - for(final RejectCallback r : rejectedCallbacks){ - r.onReject(rejected); - } - } - - protected void reject(final Rejected rejected){ - this.rejected = rejected; - this.state = Promise.State.REJECTED; - triggerRejected(); - } - - protected final void triggerCompleted(){ - for(final CompleteCallback c : completeCallbacks){ - c.onComplete(isResolved() ? resolved : null, isRejected() ? rejected : null); - } - } - - protected void notify(final Progress progress){ - if(Promise.State.PENDING.compareTo(state) < 0) return; - for(final ProgressCallback p : progressCallbacks){ - p.onProgress(progress); - } - } - - @Override - public Promise then(ResolveCallback onResolve, - RejectCallback onReject, - ProgressCallback onProgress, - CompleteCallback onComplete) { - if(onResolve != null) resolveCallbacks.add(onResolve); - if(onReject != null) rejectedCallbacks.add(onReject); - if(onProgress != null) progressCallbacks.add(onProgress); - if(onComplete != null) completeCallbacks.add(onComplete); - - if(onComplete != null) if(!isPending()) onComplete.onComplete(resolved, rejected); - if(onResolve != null) if(isResolved()) onResolve.onResolve(resolved); - if(onReject != null) if(isRejected()) onReject.onReject(rejected); - - return this; - } - - @Override - public Promise then(ResolveCallback onResolve, - RejectCallback onReject, - ProgressCallback onProgress) { - return then(onResolve, onReject, onProgress, null); - } - - @Override - public Promise then(ResolveCallback onResolve) { - return then(onResolve, null, null); - } - - @Override - public Promise then(ResolveCallback onResolve, - RejectCallback onReject) { - return then(onResolve, onReject, null); - } - - @Override - public Promise done(ResolveCallback onResolve) { - return then(onResolve); - } - - @Override - public Promise fail(RejectCallback onReject) { - return then(null, onReject); - } - - @Override - public Promise progress(ProgressCallback onProgress) { - return then(null, null, onProgress); - } - - @Override - public Promise always(CompleteCallback onComplete) { - return then(null, null, null, onComplete); - } - - public Promise promise(){ - return this; - } - - @Override - public Promise - pipe(final ResolveFilter resolveFilter, final RejectFilter rejectFilter, final ProgressFilter progressFilter){ - return new PipedPromise( - this, resolveFilter, rejectFilter, progressFilter - ); - } - - @Override - public Promise pipe(ResolveFilter resolvedFilter) { - return pipe(resolvedFilter, new PassThroughRejectFilter(), new PassThroughProgressFilter()); - } - - @Override - public Promise - pipe(final ResolvePipe resolvePipe) { - final PromiseProxy lazyPromise = new PromiseProxy(); - this.done(new ResolveCallback() { - @Override - public void onResolve(Resolved resolved) { - lazyPromise.setProxiedPromise(resolvePipe.pipeResolved(resolved)); - } - }); - return lazyPromise; - } +/** + * User: cvrabie1 Date: 10/07/2012 + */ +public class AbstractPromise implements Promise { + + /* + * The state of this Deferred Object + */ + protected Promise.State state = State.PENDING; + /** + * The value or this deferred object if it has been result or null otherwise + */ + protected Success result; + /** + * The rejection reason of this deferred object if it has been failure or null otherwise + */ + protected Failure failure; + + protected final List> successCallbacks = new CopyOnWriteArrayList>(); + protected final List> failureCallbacks = new CopyOnWriteArrayList>(); + protected final List> progressCallbacks = new CopyOnWriteArrayList>(); + protected final List>> completeCallbacks = + new CopyOnWriteArrayList>>(); + + protected final void triggerSuccess() { + triggerCompleted(); + for (final Callback r : successCallbacks) { + r.onCallback(result); + } + } + + protected void success(final Success resolved) { + this.result = resolved; + this.state = State.SUCCESS; + triggerSuccess(); + } + + protected final void triggerFailure() { + triggerCompleted(); + for (final Callback r : failureCallbacks) { + r.onCallback(failure); + } + } + + protected void failure(final Failure failure) { + this.failure = failure; + this.state = State.FAILED; + triggerFailure(); + } + + protected final void triggerCompleted() { + for (final Callback> c : completeCallbacks) { + c.onCallback(isSuccess() ? new Right(result) : new Left(failure)); + } + } + + protected void progress(final Progress progress) { + if (Promise.State.PENDING.compareTo(state) < 0) return; + for (final Callback p : progressCallbacks) { + p.onCallback(progress); + } + } + + protected AbstractPromise newPromise() { + return new AbstractPromise(); + } + + protected final void complete(Either either) { + if (either.isLeft()) failure(either.getLeft()); + else success(either.getRight()); + } + + @Override + public Promise.State state() { + return state; + } + + @Override + public boolean isPending() { + return Promise.State.PENDING == state; + } + + @Override + public boolean isFailure() { + return State.FAILED == state; + } + + @Override + public boolean isSuccess() { + return State.SUCCESS == state; + } + + @Override + public Promise andThen(Callback onSuccess, Callback onFailure, + Callback onProgress) { + + if (onSuccess != null) successCallbacks.add(onSuccess); + if (onFailure != null) failureCallbacks.add(onFailure); + if (onProgress != null) progressCallbacks.add(onProgress); + + if (onSuccess != null) if (isSuccess()) onSuccess.onCallback(result); + if (onFailure != null) if (isFailure()) onFailure.onCallback(failure); + + return this; + } + + @Override + public Promise onSuccess(Callback onSuccess) { + return andThen(onSuccess, null, null); + } + @Override + public Promise onFailure(Callback onFailure) { + return andThen(null, onFailure, null); + } + + @Override + public Promise onProgress(Callback onProgress) { + return andThen(null, null, onProgress); + } + @Override + public Promise onComplete(Callback> onComplete) { + if (onComplete != null) completeCallbacks.add(onComplete); + if (onComplete != null) if (isSuccess() || isFailure()) + onComplete.onCallback(isSuccess() ? new Right(result) : new Left(failure)); + + return this; + } + + + @Override + public Promise + map(final MapTransformation transformSuccess, + final MapTransformation transformFailure, + final MapTransformation transformProgress) { + + final AbstractPromise promise = newPromise(); + + this.onSuccess(new Callback() { + @Override + public void onCallback(Success result) { + if (transformSuccess != null) { + promise.success(transformSuccess.transform(result)); + } else { + promise.success((Success2) result); + } + } + }).onFailure(new Callback() { + @Override + public void onCallback(Failure result) { + if (transformFailure != null) { + promise.failure(transformFailure.transform(result)); + } else { + promise.failure((Failure2) result); + } + } + }).onProgress(new Callback() { + @Override + public void onCallback(Progress result) { + if (transformProgress != null) { + promise.progress(transformProgress.transform(result)); + } else { + promise.progress((Progress2) result); + } + } + }); + + return promise; + } + + @Override + public Promise + map(MapTransformation transform) { + return map(transform, null, null); + } + + @Override + public Promise + map(MapTransformation transformSuccess, + MapTransformation transformFailure) { + return map(transformSuccess, transformFailure, null); + } + + @Override + public Promise + flatMap(final FlatMapTransformation transform) { + + final AbstractPromise promise = newPromise(); + + this.onSuccess(new Callback() { + @Override + public void onCallback(Success result) { + promise.complete(transform.transform(result)); + } + }).onFailure(new Callback() { + @Override + public void onCallback(Failure result) { + promise.failure(result); + } + }).onProgress(new Callback() { + @Override + public void onCallback(Progress result) { + promise.progress(result); + } + }); + + return promise; + } } diff --git a/library/src/main/java/org/codeandmagic/deferredobject/AbstractSimplePromise.java b/library/src/main/java/org/codeandmagic/deferredobject/AbstractSimplePromise.java new file mode 100644 index 0000000..f414fb3 --- /dev/null +++ b/library/src/main/java/org/codeandmagic/deferredobject/AbstractSimplePromise.java @@ -0,0 +1,17 @@ +package org.codeandmagic.deferredobject; + +/** + * Created by cristian on 10/02/2014. + */ +public class AbstractSimplePromise extends AbstractPromise implements SimplePromise { + + @Override + protected AbstractPromise newPromise() { + return (AbstractPromise) new AbstractSimplePromise(); + } + + @Override + public SimplePromise map(final MapTransformation transform) { + return (SimplePromise) super.map(transform); + } +} diff --git a/library/src/main/java/org/codeandmagic/deferredobject/Callback.java b/library/src/main/java/org/codeandmagic/deferredobject/Callback.java new file mode 100644 index 0000000..ed1c980 --- /dev/null +++ b/library/src/main/java/org/codeandmagic/deferredobject/Callback.java @@ -0,0 +1,9 @@ +package org.codeandmagic.deferredobject; + +/** + * Created by cristian on 10/02/2014. + */ +public interface Callback { + + void onCallback(final T result); +} diff --git a/library/src/main/java/org/codeandmagic/deferredobject/CompleteCallback.java b/library/src/main/java/org/codeandmagic/deferredobject/CompleteCallback.java deleted file mode 100644 index 7b5bff7..0000000 --- a/library/src/main/java/org/codeandmagic/deferredobject/CompleteCallback.java +++ /dev/null @@ -1,20 +0,0 @@ -/* - * Copyright 2012 Cristian Vrabie, Evelina Vrabie - * - * This file is part of android-deferred-object. - * - * android-deferred-object is free software: you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License - * as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. - * - * android-deferred-object is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License along with Foobar. If not, see . - */ - -package org.codeandmagic.deferredobject; - -/** User: cvrabie1 Date: 10/07/2012 */ -public interface CompleteCallback { - public void onComplete(final Resolved resolved, final Rejected rejected); -} diff --git a/library/src/main/java/org/codeandmagic/deferredobject/DeferredObject.java b/library/src/main/java/org/codeandmagic/deferredobject/DeferredObject.java index 78587be..d56254b 100644 --- a/library/src/main/java/org/codeandmagic/deferredobject/DeferredObject.java +++ b/library/src/main/java/org/codeandmagic/deferredobject/DeferredObject.java @@ -14,59 +14,23 @@ package org.codeandmagic.deferredobject; -import org.codeandmagic.deferredobject.merge.MergedPromise2; -import org.codeandmagic.deferredobject.merge.MergedPromise3; -import org.codeandmagic.deferredobject.merge.MergedPromise4; -import org.codeandmagic.deferredobject.merge.MergedPromise5; -import org.codeandmagic.deferredobject.merge.MergedPromiseN; -import org.codeandmagic.deferredobject.merge.MergedPromiseProgress; -import org.codeandmagic.deferredobject.merge.MergedPromiseReject; -import org.codeandmagic.deferredobject.merge.MergedPromiseResult2; -import org.codeandmagic.deferredobject.merge.MergedPromiseResult3; -import org.codeandmagic.deferredobject.merge.MergedPromiseResult4; -import org.codeandmagic.deferredobject.merge.MergedPromiseResult5; - -/** User: cvrabie1 Date: 09/07/2012 */ -public abstract class DeferredObject extends AbstractPromise { - - public static Promise, MergedPromiseReject, MergedPromiseProgress> - when( final Promise p1, final Promise p2){ - return new MergedPromise2, R1, R2>(p1, p2); - } - - public static Promise, MergedPromiseReject, MergedPromiseProgress> - when( final Promise p1, final Promise p2, final Promise p3){ - return new MergedPromise3, R1, R2, R3>(p1, p2, p3); - } - - public static Promise, MergedPromiseReject, MergedPromiseProgress> - when( final Promise p1, final Promise p2, final Promise p3, final Promise p4){ - return new MergedPromise4, R1, R2, R3, R4>(p1, p2, p3, - p4); - } - - public static Promise, MergedPromiseReject, MergedPromiseProgress> - when( final Promise p1, final Promise p2, final Promise p3, final Promise p4, final Promise p5){ - return new MergedPromise5, R1, R2, R3, R4, R5>(p1, - p2, p3, p4, p5); - } - - public static Promise when( final Promise[] promises ){ - return new MergedPromiseN(promises); - } - - @Override - public final void notify(Progress progress) { - super.notify(progress); - } - - @Override - public final void resolve(Resolved resolved) { - super.resolve(resolved); - } - - @Override - public final void reject(Rejected rejected) { - super.reject(rejected); - } +/** + * User: cvrabie1 Date: 09/07/2012 + */ +public abstract class DeferredObject extends AbstractPromise { + + @Override + public final void progress(Progress progress) { + super.progress(progress); + } + + @Override + public final void success(Success resolved) { + super.success(resolved); + } + + @Override + public final void failure(Failure failure) { + super.failure(failure); + } } diff --git a/library/src/main/java/org/codeandmagic/deferredobject/Either.java b/library/src/main/java/org/codeandmagic/deferredobject/Either.java new file mode 100644 index 0000000..abd4b3e --- /dev/null +++ b/library/src/main/java/org/codeandmagic/deferredobject/Either.java @@ -0,0 +1,23 @@ +package org.codeandmagic.deferredobject; + +/** + * Created by cristian on 10/02/2014. + */ +public abstract class Either { + + public boolean isLeft() { + return false; + } + + public T1 getLeft() { + return null; + } + + public boolean isRight() { + return false; + } + + public T2 getRight() { + return null; + } +} diff --git a/library/src/main/java/org/codeandmagic/deferredobject/FlatMapTransformation.java b/library/src/main/java/org/codeandmagic/deferredobject/FlatMapTransformation.java new file mode 100644 index 0000000..d14ba5c --- /dev/null +++ b/library/src/main/java/org/codeandmagic/deferredobject/FlatMapTransformation.java @@ -0,0 +1,9 @@ +package org.codeandmagic.deferredobject; + +/** + * Created by cristian on 10/02/2014. + */ +public interface FlatMapTransformation { + + Either transform(T1 value); +} diff --git a/library/src/main/java/org/codeandmagic/deferredobject/Left.java b/library/src/main/java/org/codeandmagic/deferredobject/Left.java new file mode 100644 index 0000000..752a9fb --- /dev/null +++ b/library/src/main/java/org/codeandmagic/deferredobject/Left.java @@ -0,0 +1,40 @@ +package org.codeandmagic.deferredobject; + +/** + * Created by cristian on 10/02/2014. + */ +public final class Left extends Either { + + private final T1 left; + + public Left(T1 left) { + this.left = left; + } + + @Override + public boolean isLeft() { + return true; + } + + @Override + public T1 getLeft() { + return left; + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + + Left left1 = (Left) o; + + if (left != null ? !left.equals(left1.left) : left1.left != null) return false; + + return true; + } + + @Override + public int hashCode() { + return left != null ? left.hashCode() : 0; + } +} diff --git a/library/src/main/java/org/codeandmagic/deferredobject/MapTransformation.java b/library/src/main/java/org/codeandmagic/deferredobject/MapTransformation.java new file mode 100644 index 0000000..5c55ee8 --- /dev/null +++ b/library/src/main/java/org/codeandmagic/deferredobject/MapTransformation.java @@ -0,0 +1,10 @@ +package org.codeandmagic.deferredobject; + +/** + * Created by cristian on 10/02/2014. + */ +public interface MapTransformation { + + T2 transform(T1 value); + +} \ No newline at end of file diff --git a/library/src/main/java/org/codeandmagic/deferredobject/MergedPromiseTracker.java b/library/src/main/java/org/codeandmagic/deferredobject/MergedPromiseTracker.java deleted file mode 100644 index bee09c9..0000000 --- a/library/src/main/java/org/codeandmagic/deferredobject/MergedPromiseTracker.java +++ /dev/null @@ -1,80 +0,0 @@ -/* - * Copyright 2012 Cristian Vrabie, Evelina Vrabie - * - * This file is part of android-deferred-object. - * - * android-deferred-object is free software: you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License - * as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. - * - * android-deferred-object is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License along with Foobar. If not, see . - */ - -package org.codeandmagic.deferredobject; - -import org.codeandmagic.deferredobject.merge.*; - -/** User: cvrabie1 Date: 10/07/2012 */ -public class MergedPromiseTracker{ - private final AbstractPromise mergedPromise; - private final Promise[] promises; - private final Object[] results; - private int done = 0; - - public MergedPromiseTracker(AbstractPromise mergedPromise, Promise... promises){ - this.mergedPromise = mergedPromise; - this.promises = promises; - this.results = new Object[promises.length]; - addListeners(); - } - - private synchronized boolean isDone(){ - return done == promises.length; - } - - private synchronized void done(int indx, Object result){ - results[indx] = result; - this.done ++; - mergedPromise.notify(new MergedPromiseProgress(this.done, promises.length)); - if(isDone()) mergedPromise.resolve(resolve()); - } - - private Resolved resolve() { - switch (promises.length){ - case 2: return (Resolved) new MergedPromiseResult2(results[0],results[1]); - case 3: return (Resolved) new MergedPromiseResult3(results[0],results[1],results[2]); - case 4: return (Resolved) new MergedPromiseResult4(results[0],results[1],results[2],results[3]); - case 5: return (Resolved) new MergedPromiseResult5(results[0],results[1],results[2],results[3],results[4]); - default: return (Resolved) results; - } - } - - private synchronized void fail(int indx, Object fail){ - mergedPromise.reject(new MergedPromiseReject(indx,fail)); - } - - private synchronized void addListeners(){ - int count = 0; - - for(Promise p : promises){ - final int indx = count++; - p.done(new ResolveCallback() { - @Override - public void onResolve(Object o) { - MergedPromiseTracker.this.done(indx,o); - } - }); - p.fail(new RejectCallback() { - @Override - public void onReject(Object o) { - MergedPromiseTracker.this.fail(indx,o); - } - }); - - } - } -} - - diff --git a/library/src/main/java/org/codeandmagic/deferredobject/PipedPromise.java b/library/src/main/java/org/codeandmagic/deferredobject/PipedPromise.java deleted file mode 100644 index 90f6d0e..0000000 --- a/library/src/main/java/org/codeandmagic/deferredobject/PipedPromise.java +++ /dev/null @@ -1,51 +0,0 @@ -/* - * Copyright 2012 Cristian Vrabie, Evelina Vrabie - * - * This file is part of android-deferred-object. - * - * android-deferred-object is free software: you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License - * as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. - * - * android-deferred-object is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License along with Foobar. If not, see . - */ - -package org.codeandmagic.deferredobject; - -import org.codeandmagic.deferredobject.pipe.ProgressFilter; -import org.codeandmagic.deferredobject.pipe.RejectFilter; -import org.codeandmagic.deferredobject.pipe.ResolveFilter; - -/** User: cvrabie1 Date: 09/07/2012 */ -public class PipedPromise - extends AbstractPromise { - - protected PipedPromise(final Promise pipedPromise, - final ResolveFilter resolvedFilter, - final RejectFilter rejectedFilter, - final ProgressFilter progressFilter - ){ - pipedPromise.done(new ResolveCallback() { - @Override - public void onResolve(Resolved1 resolved1) { - PipedPromise.this.resolve( resolvedFilter.filterResolved(resolved1) ); - } - }); - - pipedPromise.fail(new RejectCallback() { - @Override - public void onReject(Rejected1 rejected1) { - PipedPromise.this.reject( rejectedFilter.filterRejected(rejected1) ); - } - }); - - pipedPromise.progress(new ProgressCallback() { - @Override - public void onProgress(Progress1 progress1) { - PipedPromise.this.notify(progressFilter.filterProgress(progress1)); - } - }); - } -} diff --git a/library/src/main/java/org/codeandmagic/deferredobject/ProgressCallback.java b/library/src/main/java/org/codeandmagic/deferredobject/ProgressCallback.java deleted file mode 100644 index e208945..0000000 --- a/library/src/main/java/org/codeandmagic/deferredobject/ProgressCallback.java +++ /dev/null @@ -1,20 +0,0 @@ -/* - * Copyright 2012 Cristian Vrabie, Evelina Vrabie - * - * This file is part of android-deferred-object. - * - * android-deferred-object is free software: you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License - * as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. - * - * android-deferred-object is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License along with Foobar. If not, see . - */ - -package org.codeandmagic.deferredobject; - -/** User: cvrabie1 Date: 10/07/2012 */ -public interface ProgressCallback { - public void onProgress(final Progress progress); -} diff --git a/library/src/main/java/org/codeandmagic/deferredobject/Promise.java b/library/src/main/java/org/codeandmagic/deferredobject/Promise.java index 2e3d540..ee76a81 100644 --- a/library/src/main/java/org/codeandmagic/deferredobject/Promise.java +++ b/library/src/main/java/org/codeandmagic/deferredobject/Promise.java @@ -14,52 +14,130 @@ package org.codeandmagic.deferredobject; -import org.codeandmagic.deferredobject.pipe.ProgressFilter; -import org.codeandmagic.deferredobject.pipe.RejectFilter; -import org.codeandmagic.deferredobject.pipe.ResolveFilter; -import org.codeandmagic.deferredobject.pipe.ResolvePipe; - -/** User: cvrabie1 Date: 09/07/2012 */ -public interface Promise { - - public enum State { - PENDING, REJECTED, RESOLVED - } - - public State state(); - public boolean isPending(); - public boolean isRejected(); - public boolean isResolved(); - - public Promise then(final ResolveCallback onResolve); - - public Promise then(final ResolveCallback onResolve, final RejectCallback onReject); - - public Promise then(final ResolveCallback onResolve, final RejectCallback onReject, final ProgressCallback onProgress); - - public Promise then(final ResolveCallback onResolve, final RejectCallback onReject, final ProgressCallback onProgress, final CompleteCallback onComplete); - - public Promise always(final CompleteCallback onComplete); - - public Promise done(final ResolveCallback onResolve); - - public Promise fail(final RejectCallback onReject); - - public Promise progress(final ProgressCallback onProgress); - - - public Promise - pipe(final ResolveFilter resolveFilter, - final RejectFilter rejectFilter, - final ProgressFilter progressFilter); - - public Promise - pipe(final ResolvePipe resolvedPipe); - - public Promise - pipe(final ResolveFilter resolveFilter); - - - +/** + * User: cvrabie1 Date: 09/07/2012 + */ +public interface Promise { + + public enum State { + PENDING, FAILED, SUCCESS + } + + public State state(); + + public boolean isPending(); + + public boolean isFailure(); + + public boolean isSuccess(); + + /* -------------------------------------------------------------------------------------- */ + // Completion handlers + /* -------------------------------------------------------------------------------------- */ + + /** + * Called when the operation completes, either successfully or with an exception. + * + * @param onComplete + * @return + */ + public Promise onComplete(final Callback> onComplete); + + /** + * Called when the operation completes with success. + * + * @param onSuccess + * @return + */ + public Promise onSuccess(final Callback onSuccess); + + /** + * Called when the operation completes with a failure. + * + * @param onFailure + * @return + */ + public Promise onFailure(final Callback onFailure); + + /** + * Called when there is a progress update on the operation. + * + * @param onProgress + * @return + */ + public Promise onProgress(final Callback onProgress); + + + /** + * Registers callbacks for success, failure and progress. The Promise is left unchanged and can be + * chained. + * + * @param onSuccess + * @param onFailure + * @param onProgress + * @return + */ + public Promise andThen(Callback onSuccess, Callback onFailure, + Callback onProgress); + + /* -------------------------------------------------------------------------------------- */ + // Transformations + /* -------------------------------------------------------------------------------------- */ + + /** + * Creates a new Promise by applying a {@link MapTransformation} to + * the success result of this Promise. + * + * @param transform transforms Success into Success2 + * @param + * @return + */ + public Promise + map(final MapTransformation transform); + + /** + * Creates a new Promise by applying {@link MapTransformation}s to the success and + * failure results of this Promise. + * + * @param transformSuccess transformation between success types or null if you want it unchanged + * @param transformFailure transformation between failure types or null if you want it unchanged + * @param + * @param + * @return + */ + public Promise + map(final MapTransformation transformSuccess, + final MapTransformation transformFailure); + + /** + * Creates a new Promise by applying {@link MapTransformation}s to the success, failure + * and progress results of this Promise. + * + * @param transformSuccess transformation between success types or null if you want it unchanged + * @param transformFailure transformation between failure types or null if you want it unchanged + * @param transformProgress transformation between progress types or null if you want it unchanged + * @param + * @param + * @param + * @return + */ + public Promise + map(final MapTransformation transformSuccess, + final MapTransformation transformFailure, + final MapTransformation transformProgress); + + /** + * Creates a new Promise by applying a {@link org.codeandmagic.deferredobject.FlatMapTransformation}. + * By contrast to a {@link org.codeandmagic.deferredobject.MapTransformation}, this can transform a successful + * Promise into a failed one. + *

+ * Example: a successful HTTP call can be transformed into a failed one if the JSON de-serialisation (expressed + * as a {@link org.codeandmagic.deferredobject.FlatMapTransformation}) throws an error. + * + * @param transform + * @param + * @return + */ + public Promise + flatMap(final FlatMapTransformation transform); } - diff --git a/library/src/main/java/org/codeandmagic/deferredobject/PromiseProxy.java b/library/src/main/java/org/codeandmagic/deferredobject/PromiseProxy.java deleted file mode 100644 index 78b70ea..0000000 --- a/library/src/main/java/org/codeandmagic/deferredobject/PromiseProxy.java +++ /dev/null @@ -1,46 +0,0 @@ -/* - * Copyright 2012 Cristian Vrabie, Evelina Vrabie - * - * This file is part of android-deferred-object. - * - * android-deferred-object is free software: you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License - * as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. - * - * android-deferred-object is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License along with Foobar. If not, see . - */ - -package org.codeandmagic.deferredobject; - -/** User: cvrabie1 Date: 12/07/2012 */ -public class PromiseProxy extends AbstractPromise{ - - private Promise proxiedPromise = null; - - public Promise getProxiedPromise() { - return proxiedPromise; - } - - public void setProxiedPromise(Promise proxiedPromise) { - this.proxiedPromise = proxiedPromise; - - proxiedPromise.then(new ResolveCallback() { - @Override - public void onResolve(Resolved resolved) { - PromiseProxy.this.resolve(resolved); - } - }, new RejectCallback() { - @Override - public void onReject(Rejected rejected) { - PromiseProxy.this.reject(rejected); - } - }, new ProgressCallback() { - @Override - public void onProgress(Progress progress) { - PromiseProxy.this.notify(progress); - } - }); - } -} diff --git a/library/src/main/java/org/codeandmagic/deferredobject/RejectCallback.java b/library/src/main/java/org/codeandmagic/deferredobject/RejectCallback.java deleted file mode 100644 index 266ec8b..0000000 --- a/library/src/main/java/org/codeandmagic/deferredobject/RejectCallback.java +++ /dev/null @@ -1,20 +0,0 @@ -/* - * Copyright 2012 Cristian Vrabie, Evelina Vrabie - * - * This file is part of android-deferred-object. - * - * android-deferred-object is free software: you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License - * as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. - * - * android-deferred-object is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License along with Foobar. If not, see . - */ - -package org.codeandmagic.deferredobject; - -/** User: cvrabie1 Date: 10/07/2012 */ -public interface RejectCallback { - public void onReject(final Rejected rejected); -} diff --git a/library/src/main/java/org/codeandmagic/deferredobject/ResolveCallback.java b/library/src/main/java/org/codeandmagic/deferredobject/ResolveCallback.java deleted file mode 100644 index 94699fb..0000000 --- a/library/src/main/java/org/codeandmagic/deferredobject/ResolveCallback.java +++ /dev/null @@ -1,20 +0,0 @@ -/* - * Copyright 2012 Cristian Vrabie, Evelina Vrabie - * - * This file is part of android-deferred-object. - * - * android-deferred-object is free software: you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License - * as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. - * - * android-deferred-object is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License along with Foobar. If not, see . - */ - -package org.codeandmagic.deferredobject; - -/** User: cvrabie1 Date: 10/07/2012 */ -public interface ResolveCallback { - public void onResolve(final Resolved resolved); -} diff --git a/library/src/main/java/org/codeandmagic/deferredobject/Right.java b/library/src/main/java/org/codeandmagic/deferredobject/Right.java new file mode 100644 index 0000000..6fcb1b0 --- /dev/null +++ b/library/src/main/java/org/codeandmagic/deferredobject/Right.java @@ -0,0 +1,40 @@ +package org.codeandmagic.deferredobject; + +/** + * Created by cristian on 10/02/2014. + */ +public final class Right extends Either { + + private final T2 right; + + public Right(T2 right) { + this.right = right; + } + + @Override + public boolean isRight() { + return true; + } + + @Override + public T2 getRight() { + return right; + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + + Right right1 = (Right) o; + + if (right != null ? !right.equals(right1.right) : right1.right != null) return false; + + return true; + } + + @Override + public int hashCode() { + return right != null ? right.hashCode() : 0; + } +} diff --git a/library/src/main/java/org/codeandmagic/deferredobject/SimplePromise.java b/library/src/main/java/org/codeandmagic/deferredobject/SimplePromise.java new file mode 100644 index 0000000..4c80e71 --- /dev/null +++ b/library/src/main/java/org/codeandmagic/deferredobject/SimplePromise.java @@ -0,0 +1,13 @@ +package org.codeandmagic.deferredobject; + +/** + * Simplified version of {@link org.codeandmagic.deferredobject.Promise} which returns a {@link java.lang.Throwable} + * in case of failure and has no support for progress. + * + * Created by cristian on 10/02/2014. + */ +public interface SimplePromise extends Promise { + + public SimplePromise map(MapTransformation transform); + +} diff --git a/library/src/main/java/org/codeandmagic/deferredobject/android/DeferredAsyncTask.java b/library/src/main/java/org/codeandmagic/deferredobject/android/DeferredAsyncTask.java deleted file mode 100644 index c659d11..0000000 --- a/library/src/main/java/org/codeandmagic/deferredobject/android/DeferredAsyncTask.java +++ /dev/null @@ -1,67 +0,0 @@ -package org.codeandmagic.deferredobject.android; - -import org.codeandmagic.deferredobject.AbstractPromise; - -import android.os.AsyncTask; - -public abstract class DeferredAsyncTask extends - AbstractPromise { - - public final AsyncTask task; - private Exception exception; - - public DeferredAsyncTask() { - task = new AsyncTask() { - - @Override - protected void onCancelled() { - DeferredAsyncTask.this.fail(null); - } - - @Override - protected void onPostExecute(Resolved resolved) { - if (null == resolved) DeferredAsyncTask.this - .reject(convertExceptionToFailure(exception)); - else { - final Rejected rejected = convertResultToFailure(resolved); - if (null == rejected) DeferredAsyncTask.this.resolve(resolved); - else DeferredAsyncTask.this.reject(rejected); - } - } - - @Override - protected void onProgressUpdate(Progress... progress) { - DeferredAsyncTask.this.notify(progress[0]); - } - - @Override - protected Resolved doInBackground(Void... params) { - try { - return DeferredAsyncTask.this.doInBackground(); - } - catch (Exception e) { - exception = e; - return null; - } - } - }.execute(); - } - - protected abstract Resolved doInBackground() throws Exception; - - protected Rejected convertResultToFailure(Resolved resolved) { - return null; - } - - protected Rejected convertExceptionToFailure(Exception exception) { - return null; - } - - public static class TaskException extends RuntimeException { - private static final long serialVersionUID = -4400838550293270727L; - - public TaskException(Throwable cause) { - super(cause); - } - } -} diff --git a/library/src/main/java/org/codeandmagic/deferredobject/android/DeferredHttpUrlConnection.java b/library/src/main/java/org/codeandmagic/deferredobject/android/DeferredHttpUrlConnection.java deleted file mode 100644 index 608a1cb..0000000 --- a/library/src/main/java/org/codeandmagic/deferredobject/android/DeferredHttpUrlConnection.java +++ /dev/null @@ -1,38 +0,0 @@ -package org.codeandmagic.deferredobject.android; - -import java.io.IOException; -import java.net.HttpURLConnection; -import java.net.URL; - -public class DeferredHttpUrlConnection extends - DeferredAsyncTask { - - private final URL url; - - public DeferredHttpUrlConnection(URL url) { - this.url = url; - } - - protected HttpURLConnection onPreExecute(HttpURLConnection connection) { - return connection; - } - - @Override - protected HttpURLConnection convertResultToFailure(HttpURLConnection resolved) { - try { - if (resolved.getResponseCode() >= 300) return resolved; - else return null; - } - catch (IOException e) { - return resolved; - } - } - - @Override - protected HttpURLConnection doInBackground() throws Exception { - final HttpURLConnection connection = onPreExecute((HttpURLConnection) url.openConnection()); - connection.getInputStream(); - return connection; - } - -} diff --git a/library/src/main/java/org/codeandmagic/deferredobject/android/HttpProgress.java b/library/src/main/java/org/codeandmagic/deferredobject/android/HttpProgress.java deleted file mode 100644 index 9712ac1..0000000 --- a/library/src/main/java/org/codeandmagic/deferredobject/android/HttpProgress.java +++ /dev/null @@ -1,5 +0,0 @@ -package org.codeandmagic.deferredobject.android; - -public class HttpProgress { - -} diff --git a/library/src/main/java/org/codeandmagic/deferredobject/merge/MergedPromise.java b/library/src/main/java/org/codeandmagic/deferredobject/merge/MergedPromise.java deleted file mode 100644 index 505c49b..0000000 --- a/library/src/main/java/org/codeandmagic/deferredobject/merge/MergedPromise.java +++ /dev/null @@ -1,19 +0,0 @@ -/* - * Copyright 2012 Cristian Vrabie, Evelina Vrabie - * - * This file is part of android-deferred-object. - * - * android-deferred-object is free software: you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License - * as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. - * - * android-deferred-object is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License along with Foobar. If not, see . - */ - -package org.codeandmagic.deferredobject.merge; - -/** User: cvrabie1 Date: 10/07/2012 */ -public interface MergedPromise { -} \ No newline at end of file diff --git a/library/src/main/java/org/codeandmagic/deferredobject/merge/MergedPromise2.java b/library/src/main/java/org/codeandmagic/deferredobject/merge/MergedPromise2.java deleted file mode 100644 index 1440548..0000000 --- a/library/src/main/java/org/codeandmagic/deferredobject/merge/MergedPromise2.java +++ /dev/null @@ -1,30 +0,0 @@ -/* - * Copyright 2012 Cristian Vrabie, Evelina Vrabie - * - * This file is part of android-deferred-object. - * - * android-deferred-object is free software: you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License - * as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. - * - * android-deferred-object is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License along with Foobar. If not, see . - */ - -package org.codeandmagic.deferredobject.merge; - -import org.codeandmagic.deferredobject.AbstractPromise; -import org.codeandmagic.deferredobject.MergedPromiseTracker; -import org.codeandmagic.deferredobject.Promise; - -/** User: cvrabie1 Date: 10/07/2012 */ -public class MergedPromise2, Resolved1,Resolved2> - extends AbstractPromise< T, MergedPromiseReject, MergedPromiseProgress> - implements MergedPromise{ - - public MergedPromise2( final Promise promise1, final Promise promise2){ - new MergedPromiseTracker(this, promise1, promise2); - } -} - diff --git a/library/src/main/java/org/codeandmagic/deferredobject/merge/MergedPromise3.java b/library/src/main/java/org/codeandmagic/deferredobject/merge/MergedPromise3.java deleted file mode 100644 index 543b848..0000000 --- a/library/src/main/java/org/codeandmagic/deferredobject/merge/MergedPromise3.java +++ /dev/null @@ -1,29 +0,0 @@ -/* - * Copyright 2012 Cristian Vrabie, Evelina Vrabie - * - * This file is part of android-deferred-object. - * - * android-deferred-object is free software: you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License - * as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. - * - * android-deferred-object is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License along with Foobar. If not, see . - */ - -package org.codeandmagic.deferredobject.merge; - -import org.codeandmagic.deferredobject.AbstractPromise; -import org.codeandmagic.deferredobject.MergedPromiseTracker; -import org.codeandmagic.deferredobject.Promise; - -/** User: cvrabie1 Date: 10/07/2012 */ -public class MergedPromise3, Resolved1,Resolved2, Resolved3> - extends AbstractPromise< T, MergedPromiseReject, MergedPromiseProgress> - implements MergedPromise{ - - public MergedPromise3( final Promise promise1, final Promise promise2, final Promise promise3){ - new MergedPromiseTracker(this, promise1, promise2, promise3); - } -} diff --git a/library/src/main/java/org/codeandmagic/deferredobject/merge/MergedPromise4.java b/library/src/main/java/org/codeandmagic/deferredobject/merge/MergedPromise4.java deleted file mode 100644 index 4cb97e6..0000000 --- a/library/src/main/java/org/codeandmagic/deferredobject/merge/MergedPromise4.java +++ /dev/null @@ -1,30 +0,0 @@ -/* - * Copyright 2012 Cristian Vrabie, Evelina Vrabie - * - * This file is part of android-deferred-object. - * - * android-deferred-object is free software: you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License - * as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. - * - * android-deferred-object is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License along with Foobar. If not, see . - */ - -package org.codeandmagic.deferredobject.merge; - -import org.codeandmagic.deferredobject.AbstractPromise; -import org.codeandmagic.deferredobject.MergedPromiseTracker; -import org.codeandmagic.deferredobject.Promise; - -/** User: cvrabie1 Date: 10/07/2012 */ -public class MergedPromise4, Resolved1,Resolved2, Resolved3, Resolved4> - extends AbstractPromise< T, MergedPromiseReject, MergedPromiseProgress> - implements MergedPromise{ - - public MergedPromise4( final Promise promise1, final Promise promise2, - final Promise promise3, final Promise promise4){ - new MergedPromiseTracker(this, promise1, promise2, promise3, promise4); - } -} diff --git a/library/src/main/java/org/codeandmagic/deferredobject/merge/MergedPromise5.java b/library/src/main/java/org/codeandmagic/deferredobject/merge/MergedPromise5.java deleted file mode 100644 index 8d95840..0000000 --- a/library/src/main/java/org/codeandmagic/deferredobject/merge/MergedPromise5.java +++ /dev/null @@ -1,31 +0,0 @@ -/* - * Copyright 2012 Cristian Vrabie, Evelina Vrabie - * - * This file is part of android-deferred-object. - * - * android-deferred-object is free software: you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License - * as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. - * - * android-deferred-object is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License along with Foobar. If not, see . - */ - -package org.codeandmagic.deferredobject.merge; - -import org.codeandmagic.deferredobject.AbstractPromise; -import org.codeandmagic.deferredobject.MergedPromiseTracker; -import org.codeandmagic.deferredobject.Promise; - -/** User: cvrabie1 Date: 10/07/2012 */ -public class MergedPromise5, - Resolved1,Resolved2, Resolved3, Resolved4, Resolved5> - extends AbstractPromise< T, MergedPromiseReject, MergedPromiseProgress> - implements MergedPromise{ - - public MergedPromise5( final Promise promise1, final Promise promise2, - final Promise promise3, final Promise promise4, final Promise promise5){ - new MergedPromiseTracker(this, promise1, promise2, promise3, promise4, promise5); - } -} diff --git a/library/src/main/java/org/codeandmagic/deferredobject/merge/MergedPromiseN.java b/library/src/main/java/org/codeandmagic/deferredobject/merge/MergedPromiseN.java deleted file mode 100644 index 662cb11..0000000 --- a/library/src/main/java/org/codeandmagic/deferredobject/merge/MergedPromiseN.java +++ /dev/null @@ -1,26 +0,0 @@ -/* - * Copyright 2012 Cristian Vrabie, Evelina Vrabie - * - * This file is part of android-deferred-object. - * - * android-deferred-object is free software: you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License - * as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. - * - * android-deferred-object is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License along with Foobar. If not, see . - */ - -package org.codeandmagic.deferredobject.merge; - -import org.codeandmagic.deferredobject.AbstractPromise; -import org.codeandmagic.deferredobject.MergedPromiseTracker; -import org.codeandmagic.deferredobject.Promise; - -/** User: cvrabie1 Date: 10/07/2012 */ -public class MergedPromiseN extends AbstractPromise implements MergedPromise{ - public MergedPromiseN( final Promise[] promises){ - new MergedPromiseTracker(this, promises); - } -} diff --git a/library/src/main/java/org/codeandmagic/deferredobject/merge/MergedPromiseProgress.java b/library/src/main/java/org/codeandmagic/deferredobject/merge/MergedPromiseProgress.java deleted file mode 100644 index 2ff881a..0000000 --- a/library/src/main/java/org/codeandmagic/deferredobject/merge/MergedPromiseProgress.java +++ /dev/null @@ -1,26 +0,0 @@ -/* - * Copyright 2012 Cristian Vrabie, Evelina Vrabie - * - * This file is part of android-deferred-object. - * - * android-deferred-object is free software: you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License - * as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. - * - * android-deferred-object is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License along with Foobar. If not, see . - */ - -package org.codeandmagic.deferredobject.merge; - -/** User: cvrabie1 Date: 10/07/2012 */ -public class MergedPromiseProgress { - public final int promisesFulfiled; - public final int totalPromises; - - public MergedPromiseProgress(final int promisesFulfiled, final int totalPromises){ - this.promisesFulfiled = promisesFulfiled; - this.totalPromises = totalPromises; - } -} diff --git a/library/src/main/java/org/codeandmagic/deferredobject/merge/MergedPromiseReject.java b/library/src/main/java/org/codeandmagic/deferredobject/merge/MergedPromiseReject.java deleted file mode 100644 index 0d7bb49..0000000 --- a/library/src/main/java/org/codeandmagic/deferredobject/merge/MergedPromiseReject.java +++ /dev/null @@ -1,25 +0,0 @@ -/* - * Copyright 2012 Cristian Vrabie, Evelina Vrabie - * - * This file is part of android-deferred-object. - * - * android-deferred-object is free software: you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License - * as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. - * - * android-deferred-object is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License along with Foobar. If not, see . - */ - -package org.codeandmagic.deferredobject.merge; - -/** User: cvrabie1 Date: 10/07/2012 */ -public class MergedPromiseReject{ - public final int index; - public final Object rejected; - public MergedPromiseReject(final int index, final Object rejected){ - this.index = index; - this.rejected = rejected; - } -} diff --git a/library/src/main/java/org/codeandmagic/deferredobject/merge/MergedPromiseResult2.java b/library/src/main/java/org/codeandmagic/deferredobject/merge/MergedPromiseResult2.java deleted file mode 100644 index c358b9a..0000000 --- a/library/src/main/java/org/codeandmagic/deferredobject/merge/MergedPromiseResult2.java +++ /dev/null @@ -1,31 +0,0 @@ -/* - * Copyright 2012 Cristian Vrabie, Evelina Vrabie - * - * This file is part of android-deferred-object. - * - * android-deferred-object is free software: you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License - * as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. - * - * android-deferred-object is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License along with Foobar. If not, see . - */ - -package org.codeandmagic.deferredobject.merge; - -/** User: cvrabie1 Date: 10/07/2012 */ -public class MergedPromiseResult2{ - public final R1 _1; - public final R2 _2; - public MergedPromiseResult2(R1 r1, R2 r2){ - _1 = r1; - _2 = r2; - } - public R1 first(){ - return _1; - } - public R2 second(){ - return _2; - } -} diff --git a/library/src/main/java/org/codeandmagic/deferredobject/merge/MergedPromiseResult3.java b/library/src/main/java/org/codeandmagic/deferredobject/merge/MergedPromiseResult3.java deleted file mode 100644 index 01a0b33..0000000 --- a/library/src/main/java/org/codeandmagic/deferredobject/merge/MergedPromiseResult3.java +++ /dev/null @@ -1,27 +0,0 @@ -/* - * Copyright 2012 Cristian Vrabie, Evelina Vrabie - * - * This file is part of android-deferred-object. - * - * android-deferred-object is free software: you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License - * as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. - * - * android-deferred-object is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License along with Foobar. If not, see . - */ - -package org.codeandmagic.deferredobject.merge; - -/** User: cvrabie1 Date: 10/07/2012 */ -public class MergedPromiseResult3 extends MergedPromiseResult2{ - public final R3 _3; - public MergedPromiseResult3(R1 r1, R2 r2, R3 r3){ - super(r1, r2); - _3 = r3; - } - public R3 third(){ - return _3; - } -} diff --git a/library/src/main/java/org/codeandmagic/deferredobject/merge/MergedPromiseResult4.java b/library/src/main/java/org/codeandmagic/deferredobject/merge/MergedPromiseResult4.java deleted file mode 100644 index b81a1bd..0000000 --- a/library/src/main/java/org/codeandmagic/deferredobject/merge/MergedPromiseResult4.java +++ /dev/null @@ -1,27 +0,0 @@ -/* - * Copyright 2012 Cristian Vrabie, Evelina Vrabie - * - * This file is part of android-deferred-object. - * - * android-deferred-object is free software: you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License - * as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. - * - * android-deferred-object is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License along with Foobar. If not, see . - */ - -package org.codeandmagic.deferredobject.merge; - -/** User: cvrabie1 Date: 10/07/2012 */ -public class MergedPromiseResult4 extends MergedPromiseResult3{ - public final R4 _4; - public MergedPromiseResult4(R1 r1, R2 r2, R3 r3, R4 r4){ - super(r1, r2, r3); - _4 = r4; - } - public R4 forth(){ - return _4; - } -} diff --git a/library/src/main/java/org/codeandmagic/deferredobject/merge/MergedPromiseResult5.java b/library/src/main/java/org/codeandmagic/deferredobject/merge/MergedPromiseResult5.java deleted file mode 100644 index 178cce3..0000000 --- a/library/src/main/java/org/codeandmagic/deferredobject/merge/MergedPromiseResult5.java +++ /dev/null @@ -1,27 +0,0 @@ -/* - * Copyright 2012 Cristian Vrabie, Evelina Vrabie - * - * This file is part of android-deferred-object. - * - * android-deferred-object is free software: you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License - * as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. - * - * android-deferred-object is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License along with Foobar. If not, see . - */ - -package org.codeandmagic.deferredobject.merge; - -/** User: cvrabie1 Date: 10/07/2012 */ -public class MergedPromiseResult5 extends MergedPromiseResult4{ - public final R5 _5; - public MergedPromiseResult5(R1 r1, R2 r2, R3 r3, R4 r4, R5 r5){ - super(r1, r2, r3, r4); - _5 = r5; - } - public R5 fifth(){ - return _5; - } -} diff --git a/library/src/main/java/org/codeandmagic/deferredobject/pipe/PassThroughProgressFilter.java b/library/src/main/java/org/codeandmagic/deferredobject/pipe/PassThroughProgressFilter.java deleted file mode 100644 index 2ca5ebe..0000000 --- a/library/src/main/java/org/codeandmagic/deferredobject/pipe/PassThroughProgressFilter.java +++ /dev/null @@ -1,23 +0,0 @@ -/* - * Copyright 2012 Cristian Vrabie, Evelina Vrabie - * - * This file is part of android-deferred-object. - * - * android-deferred-object is free software: you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License - * as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. - * - * android-deferred-object is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License along with Foobar. If not, see . - */ - -package org.codeandmagic.deferredobject.pipe; - -/** User: cvrabie1 Date: 10/07/2012 */ -public class PassThroughProgressFilter implements ProgressFilter { - @Override - public Progress filterProgress(Progress progress) { - return progress; - } -} diff --git a/library/src/main/java/org/codeandmagic/deferredobject/pipe/PassThroughRejectFilter.java b/library/src/main/java/org/codeandmagic/deferredobject/pipe/PassThroughRejectFilter.java deleted file mode 100644 index 489cd6a..0000000 --- a/library/src/main/java/org/codeandmagic/deferredobject/pipe/PassThroughRejectFilter.java +++ /dev/null @@ -1,23 +0,0 @@ -/* - * Copyright 2012 Cristian Vrabie, Evelina Vrabie - * - * This file is part of android-deferred-object. - * - * android-deferred-object is free software: you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License - * as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. - * - * android-deferred-object is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License along with Foobar. If not, see . - */ - -package org.codeandmagic.deferredobject.pipe; - -/** User: cvrabie1 Date: 10/07/2012 */ -public class PassThroughRejectFilter implements RejectFilter { - @Override - public Reject filterRejected(Reject rejected) { - return rejected; - } -} diff --git a/library/src/main/java/org/codeandmagic/deferredobject/pipe/PassThroughResolveFilter.java b/library/src/main/java/org/codeandmagic/deferredobject/pipe/PassThroughResolveFilter.java deleted file mode 100644 index 1145609..0000000 --- a/library/src/main/java/org/codeandmagic/deferredobject/pipe/PassThroughResolveFilter.java +++ /dev/null @@ -1,23 +0,0 @@ -/* - * Copyright 2012 Cristian Vrabie, Evelina Vrabie - * - * This file is part of android-deferred-object. - * - * android-deferred-object is free software: you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License - * as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. - * - * android-deferred-object is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License along with Foobar. If not, see . - */ - -package org.codeandmagic.deferredobject.pipe; - -/** User: cvrabie1 Date: 10/07/2012 */ -public class PassThroughResolveFilter implements ResolveFilter { - @Override - public Resolved filterResolved(Resolved resolved) { - return resolved; - } -} diff --git a/library/src/main/java/org/codeandmagic/deferredobject/pipe/ProgressFilter.java b/library/src/main/java/org/codeandmagic/deferredobject/pipe/ProgressFilter.java deleted file mode 100644 index 1861837..0000000 --- a/library/src/main/java/org/codeandmagic/deferredobject/pipe/ProgressFilter.java +++ /dev/null @@ -1,20 +0,0 @@ -/* - * Copyright 2012 Cristian Vrabie, Evelina Vrabie - * - * This file is part of android-deferred-object. - * - * android-deferred-object is free software: you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License - * as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. - * - * android-deferred-object is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License along with Foobar. If not, see . - */ - -package org.codeandmagic.deferredobject.pipe; - -/** User: cvrabie1 Date: 10/07/2012 */ -public interface ProgressFilter{ - public Progress2 filterProgress(Progress1 progress); -} diff --git a/library/src/main/java/org/codeandmagic/deferredobject/pipe/RejectFilter.java b/library/src/main/java/org/codeandmagic/deferredobject/pipe/RejectFilter.java deleted file mode 100644 index dc9705c..0000000 --- a/library/src/main/java/org/codeandmagic/deferredobject/pipe/RejectFilter.java +++ /dev/null @@ -1,20 +0,0 @@ -/* - * Copyright 2012 Cristian Vrabie, Evelina Vrabie - * - * This file is part of android-deferred-object. - * - * android-deferred-object is free software: you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License - * as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. - * - * android-deferred-object is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License along with Foobar. If not, see . - */ - -package org.codeandmagic.deferredobject.pipe; - -/** User: cvrabie1 Date: 10/07/2012 */ -public interface RejectFilter{ - public Rejected2 filterRejected(Rejected1 rejected); -} diff --git a/library/src/main/java/org/codeandmagic/deferredobject/pipe/ResolveFilter.java b/library/src/main/java/org/codeandmagic/deferredobject/pipe/ResolveFilter.java deleted file mode 100644 index 0e8e2ac..0000000 --- a/library/src/main/java/org/codeandmagic/deferredobject/pipe/ResolveFilter.java +++ /dev/null @@ -1,20 +0,0 @@ -/* - * Copyright 2012 Cristian Vrabie, Evelina Vrabie - * - * This file is part of android-deferred-object. - * - * android-deferred-object is free software: you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License - * as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. - * - * android-deferred-object is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License along with Foobar. If not, see . - */ - -package org.codeandmagic.deferredobject.pipe; - -/** User: cvrabie1 Date: 10/07/2012 */ -public interface ResolveFilter{ - public Resolved2 filterResolved(Resolved1 resolved); -} diff --git a/library/src/main/java/org/codeandmagic/deferredobject/pipe/ResolvePipe.java b/library/src/main/java/org/codeandmagic/deferredobject/pipe/ResolvePipe.java deleted file mode 100644 index c230964..0000000 --- a/library/src/main/java/org/codeandmagic/deferredobject/pipe/ResolvePipe.java +++ /dev/null @@ -1,22 +0,0 @@ -/* - * Copyright 2012 Cristian Vrabie, Evelina Vrabie - * - * This file is part of android-deferred-object. - * - * android-deferred-object is free software: you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License - * as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. - * - * android-deferred-object is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License along with Foobar. If not, see . - */ - -package org.codeandmagic.deferredobject.pipe; - -import org.codeandmagic.deferredobject.Promise; - -/** User: cvrabie1 Date: 12/07/2012 */ -public interface ResolvePipe { - public Promise pipeResolved(Resolved1 progress); -} diff --git a/library/src/test/java/org/codeandmagic/deferredobject/tests/CallbackTests.java b/library/src/test/java/org/codeandmagic/deferredobject/tests/CallbackTests.java new file mode 100644 index 0000000..83da692 --- /dev/null +++ b/library/src/test/java/org/codeandmagic/deferredobject/tests/CallbackTests.java @@ -0,0 +1,27 @@ +package org.codeandmagic.deferredobject.tests; + +import junit.framework.TestCase; +import org.codeandmagic.deferredobject.Callback; +import org.codeandmagic.deferredobject.Either; +import org.codeandmagic.deferredobject.Right; + +import static org.mockito.Mockito.*; + +/** + * Created by cristian on 10/02/2014. + */ +public class CallbackTests extends TestCase { + + public void testCallbacks() { + InspectableDeferredObject promise = new InspectableDeferredObject(); + Callback onSuccess = mock(Callback.class); + Callback> onComplete = mock(Callback.class); + + promise.onSuccess(onSuccess).onComplete(onComplete); + + promise.success(3); + + verify(onSuccess, only()).onCallback(3); + verify(onComplete, only()).onCallback(new Right(3)); + } +} diff --git a/library/src/test/java/org/codeandmagic/deferredobject/tests/DeferredObjectTest.java b/library/src/test/java/org/codeandmagic/deferredobject/tests/DeferredObjectTest.java deleted file mode 100644 index 3e5d4c6..0000000 --- a/library/src/test/java/org/codeandmagic/deferredobject/tests/DeferredObjectTest.java +++ /dev/null @@ -1,176 +0,0 @@ -package org.codeandmagic.deferredobject.tests; - -import junit.framework.TestCase; -import org.codeandmagic.deferredobject.*; -import org.codeandmagic.deferredobject.Promise.State; - -import java.util.List; - -public class DeferredObjectTest extends TestCase { - - public static class InspectableDeferred extends DeferredObject { - public List> rs() { - return resolveCallbacks; - } - - public int rsl() { - return resolveCallbacks.size(); - } - - public List> rj() { - return rejectedCallbacks; - } - - public int rjl() { - return rejectedCallbacks.size(); - } - - public List> pr() { - return progressCallbacks; - } - - public int prl() { - return progressCallbacks.size(); - } - - public List> co() { - return completeCallbacks; - } - - public int col() { - return completeCallbacks.size(); - } - } - - public static class InspectableResolveCallback implements ResolveCallback { - public int called = 0; - - @Override - public void onResolve(Object resolved) { - ++called; - } - } - - public static class InspectableRejectCallback implements RejectCallback { - public int called = 0; - - @Override - public void onReject(Object resolved) { - ++called; - } - } - - ; - - public static class InspectableProgressCallback implements ProgressCallback { - public int called = 0; - - @Override - public void onProgress(Object progress) { - ++called; - } - } - - public static class InspectableCompleteCallback implements CompleteCallback { - public int called = 0; - - @Override - public void onComplete(Object resolved, Object rejected) { - ++called; - } - } - - InspectableDeferred def = new InspectableDeferred(); - InspectableResolveCallback rs1 = new InspectableResolveCallback(); - InspectableResolveCallback rs2 = new InspectableResolveCallback(); - InspectableRejectCallback rj1 = new InspectableRejectCallback(); - InspectableCompleteCallback co1 = new InspectableCompleteCallback(); - InspectableProgressCallback pr1 = new InspectableProgressCallback(); - - public void testResolvedCallbackAdd() { - assertEquals(0, def.rsl()); - - def.done(rs1); - assertEquals(1, def.rsl()); - assertEquals(def.rs().get(0), rs1); - - def.done(rs2); - assertEquals(2, def.rsl()); - assertEquals(def.rs().get(1), rs2); - } - - public void testRejectedCallbackAdd() { - def.fail(rj1); - assertEquals(1, def.rjl()); - } - - public void testProgressCallbackAdd() { - def.progress(pr1); - assertEquals(1, def.prl()); - } - - public void testCompleteCallbackAdd() { - def.always(co1); - assertEquals(1, def.col()); - } - - public void testThenCallbackAdd() { - def.then(rs1, rj1, pr1, co1); - def.then(rs2); - assertEquals(2, def.rsl()); - assertEquals(1, def.rjl()); - assertEquals(1, def.prl()); - assertEquals(1, def.col()); - } - - public void testDoneTrigger() { - def.done(rs1).done(rs2).always(co1).fail(rj1).progress(pr1); - def.resolve(new Object()); - assertEquals(State.RESOLVED, def.state()); - assertEquals(1, rs1.called); - assertEquals(1, rs2.called); - assertEquals(1, co1.called); - assertEquals(0, rj1.called); - assertEquals(0, pr1.called); - } - - public void testRejectTrigger() { - def.done(rs1).done(rs2).always(co1).fail(rj1).progress(pr1); - def.reject(new Object()); - assertEquals(State.REJECTED, def.state()); - assertEquals(0, rs1.called); - assertEquals(0, rs2.called); - assertEquals(1, co1.called); - assertEquals(1, rj1.called); - assertEquals(0, pr1.called); - } - - public void testProgressTrigger() { - def.done(rs1).done(rs2).always(co1).fail(rj1).progress(pr1); - def.notify(new Object()); - assertEquals(State.PENDING, def.state()); - assertEquals(0, rs1.called); - assertEquals(0, rs2.called); - assertEquals(0, co1.called); - assertEquals(0, rj1.called); - assertEquals(1, pr1.called); - } - - public void testBindAfterResolve() { - assertEquals(State.PENDING, def.state()); - def.resolve(new Object()); - assertEquals(State.RESOLVED, def.state()); - def.done(rs1); - assertEquals(1, rs1.called); //the callback gets called even if the deferred was resolved before the bind - assertEquals(0, rs2.called); - def.done(rs2); - assertEquals(1, rs1.called); //each callback gets called only once - assertEquals(1, rs2.called); - assertEquals(0, co1.called); - def.always(co1); - assertEquals(1, co1.called); - assertEquals(1, rs1.called); //each callback gets called only once - assertEquals(1, rs2.called); - } - -} diff --git a/library/src/test/java/org/codeandmagic/deferredobject/tests/InspectableDeferredObject.java b/library/src/test/java/org/codeandmagic/deferredobject/tests/InspectableDeferredObject.java new file mode 100644 index 0000000..cb53af3 --- /dev/null +++ b/library/src/test/java/org/codeandmagic/deferredobject/tests/InspectableDeferredObject.java @@ -0,0 +1,18 @@ +package org.codeandmagic.deferredobject.tests; + +import org.codeandmagic.deferredobject.DeferredObject; + +/** + * Created by cristian on 10/02/2014. + */ +public class InspectableDeferredObject extends DeferredObject { + + + public Success getSuccess() { + return result; + } + + public Failure getFailure() { + return failure; + } +} diff --git a/library/src/test/java/org/codeandmagic/deferredobject/tests/TransformationTests.java b/library/src/test/java/org/codeandmagic/deferredobject/tests/TransformationTests.java new file mode 100644 index 0000000..2a3977e --- /dev/null +++ b/library/src/test/java/org/codeandmagic/deferredobject/tests/TransformationTests.java @@ -0,0 +1,86 @@ +package org.codeandmagic.deferredobject.tests; + +import junit.framework.TestCase; +import org.codeandmagic.deferredobject.*; + +import static org.mockito.Mockito.*; + +/** + * Created by cristian on 10/02/2014. + */ +public class TransformationTests extends TestCase { + + private MapTransformation intToString = new MapTransformation() { + @Override + public String transform(Integer success) { + return (success * 2) + "!"; + } + }; + + private FlatMapTransformation stringToInt = new FlatMapTransformation() { + @Override + public Either transform(String value) { + try { + return new Right(Integer.parseInt(value)); + } catch (NumberFormatException e) { + return new Left(e); + } + } + }; + + public void testMapSuccess() { + InspectableDeferredObject promise = new InspectableDeferredObject(); + Promise promise2 = promise.map(intToString); + + Callback callback = mock(Callback.class); + promise2.onSuccess(callback); + + assertFalse(promise2.isSuccess()); + + promise.success(1); + + assertTrue(promise2.isSuccess()); + verify(callback, only()).onCallback("2!"); + } + + public void testMapFailure() { + InspectableDeferredObject promise = new InspectableDeferredObject(); + Promise promise2 = promise.map(intToString); + + Callback onSuccess = mock(Callback.class); + Callback onFailure = mock(Callback.class); + Callback> onComplete = mock(Callback.class); + promise2.onSuccess(onSuccess).onFailure(onFailure).onComplete(onComplete); + + assertFalse(promise2.isSuccess()); + + promise.failure(new Exception()); + + assertFalse(promise2.isSuccess()); + verify(onSuccess, never()).onCallback(anyString()); + verify(onFailure, only()).onCallback(any(Throwable.class)); + verify(onComplete, only()).onCallback(any(Either.class)); + assertTrue(promise2.isFailure()); + } + + public void testFlatMap() { + InspectableDeferredObject promise = new InspectableDeferredObject(); + Promise promise2 = promise.flatMap(stringToInt); + + Callback onSuccess = mock(Callback.class); + Callback onFailure = mock(Callback.class); + Callback> onComplete = mock(Callback.class); + promise2.onSuccess(onSuccess).onFailure(onFailure).onComplete(onComplete); + + assertFalse(promise2.isSuccess()); + + // 'abc' is not convertible to Integer + promise.success("abc"); + + assertFalse(promise2.isSuccess()); + verify(onSuccess, never()).onCallback(anyInt()); + verify(onFailure, only()).onCallback(any(Throwable.class)); + verify(onComplete, only()).onCallback(any(Either.class)); + assertTrue(promise2.isFailure()); + } +} diff --git a/sample/sample.iml b/sample/sample.iml deleted file mode 100644 index 3a022b9..0000000 --- a/sample/sample.iml +++ /dev/null @@ -1,78 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/sample/src/main/java/org/codeandmagic/deferredobject/MainActivity.java b/sample/src/main/java/org/codeandmagic/deferredobject/MainActivity.java index 011ac1b..23aa038 100644 --- a/sample/src/main/java/org/codeandmagic/deferredobject/MainActivity.java +++ b/sample/src/main/java/org/codeandmagic/deferredobject/MainActivity.java @@ -87,22 +87,22 @@ void download(HttpURLConnection connection) { } out = new BufferedOutputStream(new FileOutputStream(path)); final byte[] buf = new byte[1024]; - downloadPromise.notify(0f); + downloadPromise.progress(0f); int read = 0; while ((read = in.read(buf)) > 0) { downloaded += read; out.write(buf); if (length > 0){ float percent = ((float)downloaded*100)/length; - downloadPromise.notify(percent); + downloadPromise.progress(percent); } } out.flush(); - downloadPromise.notify(100f); - downloadPromise.resolve(path.getAbsolutePath()); + downloadPromise.progress(100f); + downloadPromise.success(path.getAbsolutePath()); } catch (IOException e) { e.printStackTrace(); - downloadPromise.reject(e); + downloadPromise.failure(e); } finally { if (in != null) try { in.close(); @@ -171,24 +171,24 @@ private void startTasks() throws MalformedURLException { Promise task1 = new DeferredHttpUrlConnection(new URL(EARTH)) .pipe(downloadFilter("earth.jpg")) - .progress(progressReporter(progress1)) - .done(successReporter(progress1)) - .fail(failReporter("task 1")); + .onProgress(progressReporter(progress1)) + .onSuccess(successReporter(progress1)) + .onFailure(failReporter("task 1")); Promise task2 = new DeferredHttpUrlConnection(new URL(MARS)) .pipe(downloadFilter("mars.png")) - .progress(progressReporter(progress2)) - .done(successReporter(progress2)) - .fail(failReporter("task 2")); + .onProgress(progressReporter(progress2)) + .onSuccess(successReporter(progress2)) + .onFailure(failReporter("task 2")); Promise task3 = new DeferredHttpUrlConnection(new URL(VENUS)) .pipe(downloadFilter("venus.jpg")) - .progress(progressReporter(progress3)) - .done(successReporter(progress3)) - .fail(failReporter("task 3")); + .onProgress(progressReporter(progress3)) + .onSuccess(successReporter(progress3)) + .onFailure(failReporter("task 3")); DeferredObject.when(task1, task2, task3) - .done(new ResolveCallback>() { + .onSuccess(new ResolveCallback>() { @Override public void onResolve(MergedPromiseResult3 stringStringStringMergedPromiseResult3) { runOnUiThread(new Runnable() { @@ -199,18 +199,18 @@ public void run() { } }); } - }).fail(new RejectCallback() { - @Override - public void onReject(MergedPromiseReject mergedPromiseReject) { - runOnUiThread(new Runnable() { - @Override - public void run() { - start.setText(R.string.failure); - start.setEnabled(true); - } - }); - } - }); + }).onFailure(new RejectCallback() { + @Override + public void onReject(MergedPromiseReject mergedPromiseReject) { + runOnUiThread(new Runnable() { + @Override + public void run() { + start.setText(R.string.failure); + start.setEnabled(true); + } + }); + } + }); } private void done(TextView progress) {