/**
* AnalyzerBeans
* Copyright (C) 2014 Neopost - Customer Information Management
*
* This copyrighted material is made available to anyone wishing to use, modify,
* copy, or redistribute it subject to the terms and conditions of the GNU
* Lesser General Public License, as published by the Free Software Foundation.
*
* This program 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 this distribution; if not, write to:
* Free Software Foundation, Inc.
* 51 Franklin Street, Fifth Floor
* Boston, MA 02110-1301 USA
*/
package org.eobjects.analyzer.job.runner;
import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Queue;
import java.util.concurrent.TimeUnit;
import org.eobjects.analyzer.job.ComponentJob;
import org.eobjects.analyzer.job.concurrent.StatusAwareTaskListener;
import org.eobjects.analyzer.result.AbstractAnalysisResult;
import org.eobjects.analyzer.result.AnalyzerResult;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public final class AnalysisResultFutureImpl extends AbstractAnalysisResult implements AnalysisResultFuture {
private static final Logger logger = LoggerFactory.getLogger(AnalysisResultFutureImpl.class);
private final Queue<JobAndResult> _resultQueue;
private final ErrorAware _errorAware;
private final StatusAwareTaskListener _jobTaskListener;
private volatile boolean _done;
public AnalysisResultFutureImpl(Queue<JobAndResult> resultQueue, StatusAwareTaskListener jobCompletionListener,
ErrorAware errorAware) {
_resultQueue = resultQueue;
_jobTaskListener = jobCompletionListener;
_errorAware = errorAware;
_done = false;
}
@Override
public boolean isDone() {
if (!_done) {
_done = _jobTaskListener.isDone();
}
return _done;
}
@Override
public Date getCreationDate() {
return _jobTaskListener.getCompletionTime();
}
@Override
public void cancel() {
if (!_done) {
_jobTaskListener.onError(null, new AnalysisJobCancellation());
}
}
@Override
public void await(long timeout, TimeUnit timeUnit) {
if (!isDone()) {
try {
logger.debug("_closeCompletionListener.await({},{})", timeout, timeUnit);
_jobTaskListener.await(timeout, timeUnit);
} catch (InterruptedException e) {
logger.error("Unexpected error while retreiving results", e);
}
}
}
@Override
public void await() {
while (!isDone()) {
try {
logger.debug("_closeCompletionListener.await()");
_jobTaskListener.await();
} catch (Exception e) {
logger.error("Unexpected error while retreiving results", e);
}
}
}
@Override
public List<AnalyzerResult> getResults() throws IllegalStateException {
await();
if (isErrornous()) {
throw new AnalysisJobFailedException(getErrors());
}
ArrayList<JobAndResult> resultQueueCopy = new ArrayList<JobAndResult>(_resultQueue);
ArrayList<AnalyzerResult> result = new ArrayList<AnalyzerResult>(resultQueueCopy.size());
for (JobAndResult jobResult : resultQueueCopy) {
result.add(jobResult.getResult());
}
return result;
}
@Override
public AnalyzerResult getResult(ComponentJob componentJob) throws AnalysisJobFailedException {
await();
if (isErrornous()) {
throw new AnalysisJobFailedException(getErrors());
}
ArrayList<JobAndResult> resultQueueCopy = new ArrayList<JobAndResult>(_resultQueue);
for (JobAndResult jobResult : resultQueueCopy) {
if (jobResult.getJob().equals(componentJob)) {
return jobResult.getResult();
}
}
return null;
}
@Override
public Map<ComponentJob, AnalyzerResult> getResultMap() throws IllegalStateException {
await();
if (isErrornous()) {
throw new AnalysisJobFailedException(getErrors());
}
ArrayList<JobAndResult> resultQueueCopy = new ArrayList<JobAndResult>(_resultQueue);
Map<ComponentJob, AnalyzerResult> result = new HashMap<ComponentJob, AnalyzerResult>();
for (JobAndResult jobResult : resultQueueCopy) {
ComponentJob job = jobResult.getJob();
AnalyzerResult analyzerResult = jobResult.getResult();
result.put(job, analyzerResult);
}
return result;
}
@Override
public boolean isSuccessful() {
await();
return !_errorAware.isErrornous();
}
@Override
public List<Throwable> getErrors() {
return _errorAware.getErrors();
}
@Override
public boolean isErrornous() {
return !isSuccessful();
}
@Override
public JobStatus getStatus() {
if (isDone()) {
if (isSuccessful()) {
return JobStatus.SUCCESSFUL;
}
return JobStatus.ERRORNOUS;
}
if (!_errorAware.isErrornous()) {
return JobStatus.NOT_FINISHED;
}
return JobStatus.ERRORNOUS;
}
@Override
public boolean isCancelled() {
return _errorAware.isCancelled();
}
}