All Downloads are FREE. Search and download functionalities are using the official Maven repository.

org.jdeferred.impl.AbstractPromise Maven / Gradle / Ivy

There is a newer version: 1.2.6
Show newest version
/*
 * Copyright 2013 Ray Tsang
 * 
 * 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 org.jdeferred.impl;

import java.util.List;
import java.util.concurrent.CopyOnWriteArrayList;

import org.jdeferred.AlwaysCallback;
import org.jdeferred.DoneCallback;
import org.jdeferred.DoneFilter;
import org.jdeferred.DonePipe;
import org.jdeferred.FailCallback;
import org.jdeferred.FailFilter;
import org.jdeferred.FailPipe;
import org.jdeferred.ProgressCallback;
import org.jdeferred.ProgressFilter;
import org.jdeferred.ProgressPipe;
import org.jdeferred.Promise;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

/**
 *
 * @see Promise
 * @author Ray Tsang
 *
 */
public abstract class AbstractPromise implements Promise {
	final protected Logger log = LoggerFactory.getLogger(AbstractPromise.class);
	
	protected volatile State state = State.PENDING;

	protected final List> doneCallbacks = new CopyOnWriteArrayList>();
	protected final List> failCallbacks = new CopyOnWriteArrayList>();
	protected final List> progressCallbacks = new CopyOnWriteArrayList>();
	protected final List> alwaysCallbacks = new CopyOnWriteArrayList>();
	
	protected D resolveResult;
	protected F rejectResult;

	@Override
	public State state() {
		return state;
	}
	
	@Override
	public Promise done(DoneCallback callback) {
		synchronized (this) {
			doneCallbacks.add(callback);
			if (isResolved()) triggerDone(callback, resolveResult);
		}
		return this;
	}

	@Override
	public Promise fail(FailCallback callback) {
		synchronized (this) {
			failCallbacks.add(callback);
			if (isRejected()) triggerFail(callback, rejectResult);
		}
		return this;
	}
	
	@Override
	public Promise always(AlwaysCallback callback) {
		synchronized (this) {
			alwaysCallbacks.add(callback);
			if (!isPending()) triggerAlways(callback, state, resolveResult, rejectResult);
		}
		return this;
	}
	
	protected void triggerDone(D resolved) {
		for (DoneCallback callback : doneCallbacks) {
			try {
				triggerDone(callback, resolved);
			} catch (Exception e) {
				log.error("an uncaught exception occured in a DoneCallback", e);
			}
		}
	}
	
	protected void triggerDone(DoneCallback callback, D resolved) {
		callback.onDone(resolved);
	}
	
	protected void triggerFail(F rejected) {
		for (FailCallback callback : failCallbacks) {
			try {
				triggerFail(callback, rejected);
			} catch (Exception e) {
				log.error("an uncaught exception occured in a FailCallback", e);
			}
		}
	}
	
	protected void triggerFail(FailCallback callback, F rejected) {
		callback.onFail(rejected);
	}
	
	protected void triggerProgress(P progress) {
		for (ProgressCallback

callback : progressCallbacks) { try { triggerProgress(callback, progress); } catch (Exception e) { log.error("an uncaught exception occured in a ProgressCallback", e); } } } protected void triggerProgress(ProgressCallback

callback, P progress) { callback.onProgress(progress); } protected void triggerAlways(State state, D resolve, F reject) { for (AlwaysCallback callback : alwaysCallbacks) { try { triggerAlways(callback, state, resolve, reject); } catch (Exception e) { log.error("an uncaught exception occured in a AlwaysCallback", e); } } synchronized (this) { this.notifyAll(); } } protected void triggerAlways(AlwaysCallback callback, State state, D resolve, F reject) { callback.onAlways(state, resolve, reject); } @Override public Promise progress(ProgressCallback

callback) { progressCallbacks.add(callback); return this; } @Override public Promise then(DoneCallback callback) { return done(callback); } @Override public Promise then(DoneCallback doneCallback, FailCallback failCallback) { done(doneCallback); fail(failCallback); return this; } @Override public Promise then(DoneCallback doneCallback, FailCallback failCallback, ProgressCallback

progressCallback) { done(doneCallback); fail(failCallback); progress(progressCallback); return this; } @Override public Promise then( DoneFilter doneFilter) { return new FilteredPromise(this, doneFilter, null, null); } @Override public Promise then( DoneFilter doneFilter, FailFilter failFilter) { return new FilteredPromise(this, doneFilter, failFilter, null); } @Override public Promise then( DoneFilter doneFilter, FailFilter failFilter, ProgressFilter progressFilter) { return new FilteredPromise(this, doneFilter, failFilter, progressFilter); } @Override public Promise then( DonePipe doneFilter) { return new PipedPromise(this, doneFilter, null, null); } @Override public Promise then( DonePipe doneFilter, FailPipe failFilter) { return new PipedPromise(this, doneFilter, failFilter, null); } @Override public Promise then( DonePipe doneFilter, FailPipe failFilter, ProgressPipe progressFilter) { return new PipedPromise(this, doneFilter, failFilter, progressFilter); } @Override public boolean isPending() { return state == State.PENDING; } @Override public boolean isResolved() { return state == State.RESOLVED; } @Override public boolean isRejected() { return state == State.REJECTED; } public void waitSafely() throws InterruptedException { waitSafely(-1); } public void waitSafely(long timeout) throws InterruptedException { final long startTime = System.currentTimeMillis(); synchronized (this) { while (this.isPending()) { try { if (timeout <= 0) { wait(); } else { final long elapsed = (System.currentTimeMillis() - startTime); final long waitTime = timeout - elapsed; wait(waitTime); } } catch (InterruptedException e) { Thread.currentThread().interrupt(); throw e; } if (timeout > 0 && ((System.currentTimeMillis() - startTime) >= timeout)) { return; } else { continue; // keep looping } } } } }





© 2015 - 2025 Weber Informatics LLC | Privacy Policy