package rocks.inspectit.ui.rcp.handlers;
import java.io.IOException;
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.SubMonitor;
import org.eclipse.core.runtime.jobs.IJobChangeEvent;
import org.eclipse.core.runtime.jobs.Job;
import org.eclipse.core.runtime.jobs.JobChangeAdapter;
import org.eclipse.swt.widgets.Display;
import org.eclipse.ui.IViewPart;
import org.eclipse.ui.IWorkbenchPage;
import org.eclipse.ui.PartInitException;
import org.eclipse.ui.PlatformUI;
import org.eclipse.ui.handlers.HandlerUtil;
import rocks.inspectit.shared.all.exception.BusinessException;
import rocks.inspectit.shared.all.serializer.SerializationException;
import rocks.inspectit.shared.cs.storage.StorageData;
import rocks.inspectit.ui.rcp.InspectIT;
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.repository.RepositoryDefinition;
import rocks.inspectit.ui.rcp.storage.InspectITStorageManager;
import rocks.inspectit.ui.rcp.view.impl.DataExplorerView;
import rocks.inspectit.ui.rcp.view.impl.StorageManagerView;
/**
* This handler starts the storage finalization job, and when it is done opens the finalized storage
* in the {@link DataExplorerView}.
*
* @author Ivan Senic
*
*/
public class CloseAndShowStorageHandler extends CloseStorageHandler implements IHandler {
/**
* Command id.
*/
public static final String COMMAND = "rocks.inspectit.ui.rcp.commands.closeAndShowStorage";
/**
* Parameter id.
*/
public static final String STORAGE_DATA_PROVIDER = "rocks.inspectit.ui.rcp.commands.closeAndShowStorage.param";
/**
* {@inheritDoc}
*/
@Override
public Object execute(final ExecutionEvent event) throws ExecutionException {
IStorageDataProvider storageDataProvider = (IStorageDataProvider) HandlerUtil.getVariable(event, STORAGE_DATA_PROVIDER);
final StorageData storageData = storageDataProvider.getStorageData();
final CmrRepositoryDefinition cmrRepositoryDefinition = storageDataProvider.getCmrRepositoryDefinition();
if (cmrRepositoryDefinition.getOnlineStatus() != OnlineStatus.OFFLINE) {
FinalizeStorageJob finalizeStorageJob = new FinalizeStorageJob(storageData, cmrRepositoryDefinition);
finalizeStorageJob.schedule();
finalizeStorageJob.addJobChangeListener(new JobChangeAdapter() {
@Override
public void done(IJobChangeEvent jobEvent) {
Job mountStorageJob = new Job("Mounting Storage") {
@Override
protected IStatus run(IProgressMonitor monitor) {
SubMonitor subMonitor = SubMonitor.convert(monitor);
InspectITStorageManager storageManager = InspectIT.getDefault().getInspectITStorageManager();
RepositoryDefinition repositoryDefinition = null;
try {
storageManager.mountStorage(storageData, cmrRepositoryDefinition, subMonitor);
repositoryDefinition = storageManager.getStorageRepositoryDefinition(storageManager.getLocalDataForStorage(storageData));
} catch (BusinessException | SerializationException | IOException exception) {
return new Status(IStatus.ERROR, InspectIT.ID, "There was an exception trying to open the storage.", exception);
}
// find views
final IWorkbenchPage page = HandlerUtil.getActiveSite(event).getPage();
final RepositoryDefinition finalRepositoryDefinition = repositoryDefinition;
Display.getDefault().asyncExec(new Runnable() {
@Override
public void run() {
IViewPart dataExplorerView = page.findView(DataExplorerView.VIEW_ID);
IViewPart storageManagerView = page.findView(StorageManagerView.VIEW_ID);
if (dataExplorerView == null) {
try {
dataExplorerView = page.showView(DataExplorerView.VIEW_ID);
} catch (PartInitException e) {
return;
}
}
if (dataExplorerView instanceof DataExplorerView) {
PlatformUI.getWorkbench().getActiveWorkbenchWindow().getActivePage().activate(dataExplorerView);
((DataExplorerView) dataExplorerView).showRepository(finalRepositoryDefinition, null);
}
if (storageManagerView instanceof StorageManagerView) {
((StorageManagerView) storageManagerView).refresh(cmrRepositoryDefinition);
}
}
});
monitor.done();
return Status.OK_STATUS;
}
};
mountStorageJob.setUser(true);
mountStorageJob.schedule();
}
});
} else {
InspectIT.getDefault().createInfoDialog("Can not finalize storage, CMR repository is offline.", -1);
}
return null;
}
}