package rocks.inspectit.ui.rcp.wizard.page;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
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.dialogs.IMessageProvider;
import org.eclipse.jface.wizard.WizardPage;
import org.eclipse.swt.SWT;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Combo;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Event;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.Listener;
import rocks.inspectit.shared.cs.storage.StorageData;
import rocks.inspectit.shared.cs.storage.recording.RecordingState;
import rocks.inspectit.ui.rcp.InspectIT;
import rocks.inspectit.ui.rcp.repository.CmrRepositoryDefinition;
import rocks.inspectit.ui.rcp.repository.CmrRepositoryDefinition.OnlineStatus;
import rocks.inspectit.ui.rcp.util.SafeExecutor;
/**
* Selection of existing storage.
*
* @author Ivan Senic
*
*/
public class SelectExistingStorageWizardPage extends WizardPage {
/**
* Default page message.
*/
private static final String DEFAULT_MESSAGE = "Select storage and repository where data will be stored";
/**
* List of available repositories.
*/
private final List<CmrRepositoryDefinition> cmrRepositories;
/**
* {@link CmrRepositoryDefinition} that should be initially selected.
*/
private CmrRepositoryDefinition proposedCmrRepositoryDefinition;
/**
* List of storages to be selected.
*/
private List<StorageData> storageList = new ArrayList<>();
/**
* Repository combo.
*/
private Combo cmrRepositoryCombo;
/**
* Storage selection.
*/
private org.eclipse.swt.widgets.List storageSelection;
/**
* If the recording check should be performed on the selected CMR.
*/
private boolean checkRecording;
/**
* Button for choosing if storage should be auto finalized.
*/
private Button autoFinalize;
/**
* Default constructor.
*/
public SelectExistingStorageWizardPage() {
super("Select Storage");
this.setTitle("Select Storage");
this.setMessage(DEFAULT_MESSAGE);
cmrRepositories = new ArrayList<>();
cmrRepositories.addAll(InspectIT.getDefault().getCmrRepositoryManager().getCmrRepositoryDefinitions());
}
/**
* Additional constructor to specify the {@link #checkRecording} value.
*
* @param checkRecording
* If the recording check should be performed on the selected CMR.
*/
public SelectExistingStorageWizardPage(boolean checkRecording) {
this();
this.checkRecording = checkRecording;
}
/**
* With this constructor the passed {@link CmrRepositoryDefinition} will be initially selected
* on the page.
*
* @param proposedCmrRepositoryDefinition
* {@link CmrRepositoryDefinition} that should be initially selected.
* @param checkRecording
* If the recording check should be performed on the selected CMR.
*/
public SelectExistingStorageWizardPage(CmrRepositoryDefinition proposedCmrRepositoryDefinition, boolean checkRecording) {
this();
this.proposedCmrRepositoryDefinition = proposedCmrRepositoryDefinition;
this.checkRecording = checkRecording;
}
/**
* {@inheritDoc}
*/
@Override
public void createControl(Composite parent) {
Composite main = new Composite(parent, SWT.NONE);
main.setLayout(new GridLayout(2, false));
Label cmrSelectLabel = new Label(main, SWT.LEFT);
cmrSelectLabel.setText("Repository:");
cmrRepositoryCombo = new Combo(main, SWT.READ_ONLY);
cmrRepositoryCombo.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, false));
Label storageLabel = new Label(main, SWT.TOP);
storageLabel.setText("Storage:");
storageLabel.setLayoutData(new GridData(SWT.FILL, SWT.TOP, false, false));
storageSelection = new org.eclipse.swt.widgets.List(main, SWT.BORDER | SWT.SINGLE | SWT.H_SCROLL | SWT.V_SCROLL);
storageSelection.setEnabled(false);
storageSelection.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));
new Label(main, SWT.LEFT);
autoFinalize = new Button(main, SWT.CHECK);
autoFinalize.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, false));
autoFinalize.setText("Auto-finalize storage");
autoFinalize.setToolTipText("If selected the storage will be automatically finalized after the action completes");
autoFinalize.setSelection(true);
final Listener pageCompletedListener = new Listener() {
@Override
public void handleEvent(Event event) {
setPageComplete(isPageComplete());
if (getSelectedRepository() == null) {
setMessage("Repository must be selected.", IMessageProvider.ERROR);
} else if (getSelectedRepository().getOnlineStatus() == OnlineStatus.OFFLINE) {
setMessage("Selected repository is currently offline.", IMessageProvider.ERROR);
} else if (checkRecording && (getSelectedRepository().getStorageService().getRecordingState() != RecordingState.OFF)) {
setMessage("Recording is already active on selected repository.", IMessageProvider.ERROR);
} else if (getSelectedStorageData() == null) {
setMessage("Storage must be selected.", IMessageProvider.ERROR);
} else {
setMessage(DEFAULT_MESSAGE);
}
}
};
cmrRepositoryCombo.addListener(SWT.Selection, new Listener() {
@Override
public void handleEvent(Event event) {
updateStorageList();
pageCompletedListener.handleEvent(event);
}
});
storageSelection.addListener(SWT.Selection, pageCompletedListener);
int i = 0;
int index = -1;
for (CmrRepositoryDefinition cmrRepositoryDefinition : cmrRepositories) {
cmrRepositoryCombo.add(cmrRepositoryDefinition.getName() + " (" + cmrRepositoryDefinition.getIp() + ":" + cmrRepositoryDefinition.getName() + ")");
if (cmrRepositoryDefinition.equals(proposedCmrRepositoryDefinition)) {
index = i;
}
i++;
}
if (index != -1) {
cmrRepositoryCombo.select(index);
cmrRepositoryCombo.setEnabled(false);
updateStorageList();
}
setControl(main);
}
/**
* @return Returns selected repository or null.
*/
public CmrRepositoryDefinition getSelectedRepository() {
if (cmrRepositoryCombo.getSelectionIndex() != -1) {
return cmrRepositories.get(cmrRepositoryCombo.getSelectionIndex());
}
return null;
}
/**
* @return Returns selected {@link StorageData}.
*/
public StorageData getSelectedStorageData() {
if (storageSelection.getSelectionIndex() != -1) {
return storageList.get(storageSelection.getSelectionIndex());
}
return null;
}
/**
* Returns if auto-finalize options is selected.
*
* @return Returns if auto-finalize options is selected.
*/
public boolean isAutoFinalize() {
return autoFinalize.getSelection();
}
/**
* {@inheritDoc}
*/
@Override
public boolean isPageComplete() {
if (getSelectedRepository() == null) {
return false;
} else if (getSelectedRepository().getOnlineStatus() == OnlineStatus.OFFLINE) {
return false;
} else if (checkRecording && (getSelectedRepository().getStorageService().getRecordingState() != RecordingState.OFF)) {
return false;
}
if (getSelectedStorageData() == null) {
return false;
}
return true;
}
/**
* Updates the storage list based on selected repository.
*/
private void updateStorageList() {
final CmrRepositoryDefinition cmrRepositoryDefinition = getSelectedRepository();
Job updateStoragesJob = new Job("Updating Storages") {
@Override
protected IStatus run(IProgressMonitor monitor) {
if ((null != cmrRepositoryDefinition) && (cmrRepositoryDefinition.getOnlineStatus() != OnlineStatus.OFFLINE)) {
storageList = cmrRepositoryDefinition.getStorageService().getOpenedStorages();
} else {
storageList = Collections.emptyList();
}
SafeExecutor.asyncExec(new Runnable() {
@Override
public void run() {
storageSelection.removeAll();
if ((null != cmrRepositoryDefinition) && (cmrRepositoryDefinition.getOnlineStatus() != OnlineStatus.OFFLINE)) {
if (storageList.isEmpty()) {
storageSelection.add("No open storage available for writing");
storageSelection.setEnabled(false);
} else {
for (StorageData storageData : storageList) {
storageSelection.add(storageData.getName());
}
storageSelection.setEnabled(true);
}
} else {
storageSelection.setEnabled(false);
}
}
}, storageSelection);
return Status.OK_STATUS;
}
};
updateStoragesJob.schedule();
}
}