package rocks.inspectit.ui.rcp.wizard.page; import java.util.ArrayList; import java.util.Collections; import java.util.List; import java.util.Objects; import org.eclipse.core.runtime.Assert; 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.Combo; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Display; import org.eclipse.swt.widgets.Event; import org.eclipse.swt.widgets.Label; import org.eclipse.swt.widgets.Listener; import rocks.inspectit.shared.all.util.ObjectUtils; import rocks.inspectit.shared.cs.storage.LocalStorageData; import rocks.inspectit.shared.cs.storage.StorageData; import rocks.inspectit.ui.rcp.InspectIT; import rocks.inspectit.ui.rcp.composite.StorageInfoComposite; import rocks.inspectit.ui.rcp.repository.CmrRepositoryDefinition; import rocks.inspectit.ui.rcp.repository.CmrRepositoryDefinition.OnlineStatus; /** * Page for selecting CMR to upload storage to. * * @author Ivan Senic * */ public class UploadStorageWizardPage extends WizardPage { /** * Default page message. */ private static final String DEFAULT_MESSAGE = "Select CMR (Central Management Repository) to upload storage to"; /** * Local data to upload. */ private LocalStorageData localStorageData; /** * List of CMR repositories. */ private List<CmrRepositoryDefinition> cmrRepositories; /** * Combo that displays the CMRs. */ private Combo cmrRepositoryCombo; /** * If storage is already available on the CMR. */ private boolean alreadyAvailable; /** * Is there enough space on the CMR. */ private boolean enoughSpace; /** * Storages on selected repository. */ private List<StorageData> storagesOnRepository; /** * Space left on the selected repository. */ private long spaceLeftOnCmr; /** * Default constructor. * * @param localStorageData * Local data to upload. Must not be null. */ public UploadStorageWizardPage(LocalStorageData localStorageData) { super("Upload Storage"); Assert.isNotNull(localStorageData); this.localStorageData = localStorageData; this.cmrRepositories = new ArrayList<>(); this.cmrRepositories.addAll(InspectIT.getDefault().getCmrRepositoryManager().getCmrRepositoryDefinitions()); this.setTitle("Upload Storage"); this.setMessage(DEFAULT_MESSAGE); } /** * {@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("Upload CMR:"); cmrRepositoryCombo = new Combo(main, SWT.READ_ONLY); cmrRepositoryCombo.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, false)); for (CmrRepositoryDefinition cmrRepositoryDefinition : cmrRepositories) { cmrRepositoryCombo.add(cmrRepositoryDefinition.getName() + " (" + cmrRepositoryDefinition.getIp() + ":" + cmrRepositoryDefinition.getPort() + ")"); } StorageInfoComposite storageInfoComposite = new StorageInfoComposite(main, SWT.NONE, false, localStorageData); storageInfoComposite.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, false, 2, 1)); final Listener pageCompleteListener = new Listener() { @Override public void handleEvent(Event event) { boolean isPageComplete = isPageComplete(); setPageComplete(isPageComplete); if (event.widget.equals(cmrRepositoryCombo) && (cmrRepositoryCombo.getSelectionIndex() == -1)) { setMessage("Repository must be selected", IMessageProvider.ERROR); return; } else if (event.widget.equals(cmrRepositoryCombo) && (getCmrRepositoryDefinition().getOnlineStatus() == OnlineStatus.OFFLINE)) { setMessage("The selected repository is currently unavailable", IMessageProvider.ERROR); } else if (alreadyAvailable) { setMessage("The selected storage to upload is already available on the selected repository", IMessageProvider.ERROR); } else if (!enoughSpace) { setMessage("Insufficient storage space left on the selected repository", ERROR); } else { String cmrVersion = getCmrRepositoryDefinition().getVersion(); if (null == localStorageData.getCmrVersion()) { setMessage("Selected storage does not define CMR version. The storage might be unstable on the CMR version " + cmrVersion + ".", WARNING); } else if (!ObjectUtils.equals(localStorageData.getCmrVersion(), cmrVersion)) { setMessage("Selected storage has different CMR version than the current CMR version " + cmrVersion + ". The storage might be unstable.", WARNING); } else { setMessage(DEFAULT_MESSAGE); } } } }; Listener cmrComboListener = new Listener() { @Override public void handleEvent(final Event event) { final CmrRepositoryDefinition cmrRepositoryDefinition = getCmrRepositoryDefinition(); Job updateCmrData = new Job("Loading CMR Storage Data") { @Override protected IStatus run(IProgressMonitor monitor) { OnlineStatus onlineStatus = cmrRepositoryDefinition.getOnlineStatus(); if (onlineStatus != OnlineStatus.OFFLINE) { storagesOnRepository = cmrRepositoryDefinition.getStorageService().getExistingStorages(); spaceLeftOnCmr = cmrRepositoryDefinition.getCmrManagementService().getCmrStatusData().getStorageDataSpaceLeft(); } else { storagesOnRepository = Collections.emptyList(); spaceLeftOnCmr = 0; } Display.getDefault().asyncExec(new Runnable() { @Override public void run() { pageCompleteListener.handleEvent(event); } }); return Status.OK_STATUS; } }; updateCmrData.schedule(); } }; cmrRepositoryCombo.addListener(SWT.Selection, cmrComboListener); setControl(main); } /** * {@inheritDoc} */ @Override public boolean isPageComplete() { if (cmrRepositoryCombo.getSelectionIndex() == -1) { return false; } else if (getCmrRepositoryDefinition().getOnlineStatus() == OnlineStatus.OFFLINE) { return false; } for (StorageData storageData : storagesOnRepository) { if (Objects.equals(storageData.getId(), localStorageData.getId())) { alreadyAvailable = true; return false; } } alreadyAvailable = false; enoughSpace = spaceLeftOnCmr > localStorageData.getDiskSize(); if (!enoughSpace) { return false; } return true; } /** * @return Return selected CMR repository. */ public CmrRepositoryDefinition getCmrRepositoryDefinition() { if (cmrRepositoryCombo.getSelectionIndex() != -1) { return cmrRepositories.get(cmrRepositoryCombo.getSelectionIndex()); } return null; } }