package org.ovirt.engine.core.bll.tasks;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Map;
import org.ovirt.engine.core.bll.tasks.interfaces.SPMTask;
import org.ovirt.engine.core.common.VdcObjectType;
import org.ovirt.engine.core.common.businessentities.AsyncTask;
import org.ovirt.engine.core.common.businessentities.AsyncTaskEntity;
import org.ovirt.engine.core.compat.Guid;
import org.ovirt.engine.core.compat.TransactionScopeOption;
import org.ovirt.engine.core.dal.dbbroker.DbFacade;
import org.ovirt.engine.core.dao.AsyncTaskDao;
import org.ovirt.engine.core.utils.transaction.TransactionSupport;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
/**
* Helper class for async tasks handling
*/
public class AsyncTaskUtils {
private static final Logger log = LoggerFactory.getLogger(AsyncTaskUtils.class);
/**
* Adds a task to DB or updates it if already exists in DB
*
* @param asyncTask
* task to be added or updated
*/
public static void addOrUpdateTaskInDB(final SPMTask asyncTask) {
try {
if (asyncTask.getParameters().getDbAsyncTask() != null) {
TransactionSupport.executeInScope(TransactionScopeOption.Required, () -> {
addOrUpdateTaskInDB(asyncTask.getParameters().getDbAsyncTask());
Map<Guid, VdcObjectType> entitiesMap = asyncTask.getEntitiesMap();
List<AsyncTaskEntity> asyncTaskEntities =
buildAsyncTaskEntities(asyncTask.getParameters().getDbAsyncTask().getTaskId(),
entitiesMap);
getAsyncTaskDao().insertAsyncTaskEntities(asyncTaskEntities);
return null;
});
}
} catch (RuntimeException e) {
log.error("Adding/Updating task '{}' to DataBase threw an exception: {}",
Guid.isNullOrEmpty(asyncTask.getVdsmTaskId()) ? asyncTask.getCommandId() : asyncTask.getVdsmTaskId(),
e.getMessage());
log.debug("Exception", e);
}
}
private static List<AsyncTaskEntity> buildAsyncTaskEntities(Guid taskId, Map<Guid, VdcObjectType> entitiesMap) {
if (entitiesMap == null) {
entitiesMap = Collections.emptyMap();
}
List<AsyncTaskEntity> results = new ArrayList<>(entitiesMap.size());
for (Map.Entry<Guid, VdcObjectType> entry : entitiesMap.entrySet()) {
results.add(new AsyncTaskEntity(taskId, entry.getValue(), entry.getKey()));
}
return results;
}
private static void addOrUpdateTaskInDB(AsyncTask asyncTask) {
CommandCoordinatorUtil.addOrUpdateTaskInDB(asyncTask);
}
private static AsyncTaskDao getAsyncTaskDao() {
return DbFacade.getInstance().getAsyncTaskDao();
}
}