/* * Copyright (c) 2012-2015 iWave Software LLC * All Rights Reserved */ package com.emc.sa.service.vipr.tasks; import com.emc.vipr.client.Task; import com.emc.vipr.client.Tasks; import com.emc.vipr.client.exceptions.ServiceErrorsException; public abstract class LongRunningTasks<T> extends ViPRExecutionTask<Tasks<T>> { private boolean waitFor; private long timeout = -1; private int maxErrorDisplay = -1; public void setMaxErrorDisplay(int maxErrorDisplay) { this.maxErrorDisplay = maxErrorDisplay; } public boolean isWaitFor() { return waitFor; } public void setWaitFor(boolean waitFor) { this.waitFor = waitFor; } public long getTimeout() { return timeout; } public void setTimeout(long timeout) { this.timeout = timeout; } @Override public final Tasks<T> executeTask() throws Exception { Tasks<T> tasks = doExecute(); for (Task<T> task : tasks.getTasks()) { addOrderIdTag(task.getTaskResource().getId()); if (waitFor) { info("Waiting for task to complete: %s on resource: %s", task.getOpId(), task.getResourceId()); } } if (waitFor) { try { tasks.waitFor(timeout); } catch (ServiceErrorsException e) { if (maxErrorDisplay > 0 && e.getServiceErrors().size() > maxErrorDisplay) { throw new ServiceErrorsException(e.getServiceErrors().subList(0, maxErrorDisplay)); } else { throw e; } } } return tasks; } protected abstract Tasks<T> doExecute() throws Exception; }