// Licensed to the Apache Software Foundation (ASF) under one
// or more contributor license agreements. See the NOTICE file
// distributed with this work for additional information
// regarding copyright ownership. The ASF licenses this file
// to you 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.apache.cloudstack.framework.jobs.impl;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.TimeoutException;
import org.apache.cloudstack.framework.jobs.AsyncJob;
import org.apache.cloudstack.framework.jobs.AsyncJobExecutionContext;
import org.apache.cloudstack.framework.jobs.Outcome;
import com.cloud.utils.Predicate;
public class OutcomeImpl<T> implements Outcome<T> {
protected AsyncJob _job;
protected Class<T> _clazz;
protected String[] _topics;
protected Predicate _predicate;
protected long _checkIntervalInMs;
protected T _result;
private static AsyncJobManagerImpl s_jobMgr;
public static void init(AsyncJobManagerImpl jobMgr) {
s_jobMgr = jobMgr;
}
public OutcomeImpl(Class<T> clazz, AsyncJob job, long checkIntervalInMs, Predicate predicate, String... topics) {
_clazz = clazz;
_job = job;
_topics = topics;
_predicate = predicate;
_checkIntervalInMs = checkIntervalInMs;
}
@Override
public AsyncJob getJob() {
// always reload job so that we retrieve the latest job result
AsyncJob job = s_jobMgr.getAsyncJob(_job.getId());
return job;
}
@Override
public boolean cancel(boolean mayInterruptIfRunning) {
return false;
}
@Override
public T get() throws InterruptedException, ExecutionException {
s_jobMgr.waitAndCheck(getJob(), _topics, _checkIntervalInMs, -1, _predicate);
try {
AsyncJobExecutionContext.getCurrentExecutionContext().disjoinJob(_job.getId());
} catch (Throwable e) {
throw new ExecutionException("Job task has trouble executing", e);
}
return retrieve();
}
@Override
public T get(long timeToWait, TimeUnit unit) throws InterruptedException, ExecutionException, TimeoutException {
s_jobMgr.waitAndCheck(getJob(), _topics, _checkIntervalInMs, unit.toMillis(timeToWait), _predicate);
try {
AsyncJobExecutionContext.getCurrentExecutionContext().disjoinJob(_job.getId());
} catch (Throwable e) {
throw new ExecutionException("Job task has trouble executing", e);
}
return retrieve();
}
/**
* This method can be overridden by children classes to retrieve the
* actual object.
*/
protected T retrieve() {
return _result;
}
protected Outcome<T> set(T result) {
_result = result;
return this;
}
@Override
public boolean isCancelled() {
// TODO Auto-generated method stub
return false;
}
@Override
public boolean isDone() {
// TODO Auto-generated method stub
return false;
}
@Override
public void execute(Task<T> task) {
// TODO Auto-generated method stub
}
@Override
public void execute(Task<T> task, long wait, TimeUnit unit) {
// TODO Auto-generated method stub
}
public Predicate getPredicate() {
return _predicate;
}
}