package rocks.inspectit.ui.rcp.handlers;
import org.eclipse.core.commands.AbstractHandler;
import org.eclipse.core.commands.ExecutionEvent;
import org.eclipse.core.commands.ExecutionException;
import org.eclipse.core.commands.IHandler;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.Status;
import org.eclipse.core.runtime.jobs.Job;
import org.eclipse.jface.viewers.ISelection;
import org.eclipse.jface.viewers.StructuredSelection;
import org.eclipse.swt.SWT;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.MessageBox;
import org.eclipse.ui.IViewPart;
import org.eclipse.ui.PlatformUI;
import org.eclipse.ui.handlers.HandlerUtil;
import org.eclipse.ui.progress.IProgressConstants;
import rocks.inspectit.shared.all.exception.BusinessException;
import rocks.inspectit.shared.cs.storage.StorageData;
import rocks.inspectit.ui.rcp.InspectIT;
import rocks.inspectit.ui.rcp.InspectITImages;
import rocks.inspectit.ui.rcp.provider.IStorageDataProvider;
import rocks.inspectit.ui.rcp.repository.CmrRepositoryDefinition;
import rocks.inspectit.ui.rcp.repository.CmrRepositoryDefinition.OnlineStatus;
import rocks.inspectit.ui.rcp.view.impl.StorageManagerView;
/**
* Tries to close the list of storages given through the storage leaf.
*
* @author Ivan Senic
*
*/
public class CloseStorageHandler extends AbstractHandler implements IHandler {
/**
* {@inheritDoc}
*/
@Override
public Object execute(final ExecutionEvent event) throws ExecutionException {
final ISelection selection = HandlerUtil.getCurrentSelection(event);
if (selection instanceof StructuredSelection) {
Object firstElement = ((StructuredSelection) selection).getFirstElement();
if (firstElement instanceof IStorageDataProvider) {
StorageData storageData = ((IStorageDataProvider) firstElement).getStorageData();
CmrRepositoryDefinition cmrRepositoryDefinition = ((IStorageDataProvider) firstElement).getCmrRepositoryDefinition();
MessageBox confirmFinalization = new MessageBox(HandlerUtil.getActiveShell(event), SWT.OK | SWT.CANCEL | SWT.ICON_QUESTION);
confirmFinalization.setText("Confirm Finalization");
confirmFinalization.setMessage(
"Are you sure you want to finalize the selected storage? Writing will not be possible after finalization. Note that finalization process will wait for all ongoing writing tasks to be finished.");
if (SWT.OK == confirmFinalization.open()) {
FinalizeStorageJob finalizeStorageJob = new FinalizeStorageJob(storageData, cmrRepositoryDefinition);
finalizeStorageJob.schedule();
}
}
}
return null;
}
/**
* Finalize storage job class. Starts the finalization and provides information about the amount
* of tasks left before finalization can be done.
*
* @author Ivan Senic
*
*/
protected static class FinalizeStorageJob extends Job {
/**
* Amount of milliseconds job will check for the amount of writing tasks left.
*/
private static final long TASKS_CHECK_SLEEP_TIME = 1000;
/**
* Storage to finalize.
*/
private StorageData storageData;
/**
* CMR where storage is located.
*/
private CmrRepositoryDefinition cmrRepositoryDefinition;
/**
*
* @param storageData
* Storage to finalize.
* @param cmrRepositoryDefinition
* CMR where storage is located.
*/
public FinalizeStorageJob(StorageData storageData, CmrRepositoryDefinition cmrRepositoryDefinition) {
super("Finalizing storage " + storageData);
this.storageData = storageData;
this.cmrRepositoryDefinition = cmrRepositoryDefinition;
setUser(true);
setProperty(IProgressConstants.ICON_PROPERTY, InspectIT.getDefault().getImageDescriptor(InspectITImages.IMG_STORAGE_FINALIZE));
}
/**
* {@inheritDoc}
*/
@Override
protected IStatus run(IProgressMonitor monitor) {
// cancel if CMR is not online
if (cmrRepositoryDefinition.getOnlineStatus() == OnlineStatus.OFFLINE) {
return Status.CANCEL_STATUS;
}
// get the number of tasks
int totalTasks = (int) cmrRepositoryDefinition.getStorageService().getStorageQueuedWriteTaskCount(storageData);
String taskName;
if (totalTasks > 0) {
taskName = "Waiting for " + totalTasks + " writing tasks to finish and finalizing storage '" + storageData.getName() + "'";
} else {
taskName = "Finalizing storage '" + storageData + "'";
}
monitor.beginTask(taskName, totalTasks + 1);
Job executeFinalization = new Job("Execute finalization") {
@Override
protected IStatus run(IProgressMonitor monitor) {
try {
cmrRepositoryDefinition.getStorageService().closeStorage(storageData);
return Status.OK_STATUS;
} catch (final BusinessException e) {
return new Status(IStatus.ERROR, InspectIT.ID, "Selected storage " + storageData + " could not be finalized.", e);
}
}
};
executeFinalization.setUser(false);
executeFinalization.schedule();
// regulate the processed task count
while (executeFinalization.getState() != Job.NONE) {
try {
Thread.sleep(TASKS_CHECK_SLEEP_TIME);
} catch (InterruptedException e) {
Thread.interrupted();
}
if (executeFinalization.getState() == Job.NONE) {
monitor.worked(totalTasks);
} else {
int newLeftTasks = (int) cmrRepositoryDefinition.getStorageService().getStorageQueuedWriteTaskCount(storageData);
monitor.worked(totalTasks - newLeftTasks);
totalTasks = newLeftTasks;
}
}
// add one task for finalization
monitor.worked(1);
monitor.done();
// refresh the storage manager
Display.getDefault().asyncExec(new Runnable() {
@Override
public void run() {
IViewPart viewPart = PlatformUI.getWorkbench().getActiveWorkbenchWindow().getActivePage().findView(StorageManagerView.VIEW_ID);
if (viewPart instanceof StorageManagerView) {
((StorageManagerView) viewPart).refresh(cmrRepositoryDefinition);
}
}
});
return Status.OK_STATUS;
}
}
}