com.mercatis.lighthouse3.ui.environment.base.adapters.RunnableWithProgressAndFuture.java Source code

Java tutorial

Introduction

Here is the source code for com.mercatis.lighthouse3.ui.environment.base.adapters.RunnableWithProgressAndFuture.java

Source

/*
 * Copyright 2011 mercatis Technologies AG
 * 
 * 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 com.mercatis.lighthouse3.ui.environment.base.adapters;

import java.lang.reflect.InvocationTargetException;
import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.ReentrantLock;

import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.jface.operation.IRunnableWithProgress;

public abstract class RunnableWithProgressAndFuture<V> implements IRunnableWithProgress {

    private final ReentrantLock lock = new ReentrantLock();

    private final Condition completeCondition = lock.newCondition();

    private boolean completed = false;

    private V future;

    public void run(IProgressMonitor monitor) throws InvocationTargetException, InterruptedException {
        lock.lock();
        try {
            runWithFuture(monitor);
            completed = true;
            completeCondition.signal();
        } finally {
            lock.unlock();
        }
    }

    public abstract void runWithFuture(IProgressMonitor monitor)
            throws InvocationTargetException, InterruptedException;

    /**
     * Returns the future (Blocking).
     * 
     * @return the Future
     * @throws InterruptedException
     */
    public V get() throws InterruptedException {
        lock.lock();
        try {
            while (!completed) {
                completeCondition.await();
            }
            return future;
        } finally {
            lock.unlock();
        }
    }

    protected void set(V result) {
        this.future = result;
    }

}