package rocks.inspectit.ui.rcp.wizard.page; import java.util.ArrayList; import java.util.List; import java.util.Objects; import org.apache.commons.lang.StringUtils; 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.Composite; import org.eclipse.swt.widgets.Event; import org.eclipse.swt.widgets.Label; import org.eclipse.swt.widgets.Listener; import org.eclipse.swt.widgets.Text; import rocks.inspectit.ui.rcp.InspectIT; import rocks.inspectit.ui.rcp.repository.CmrRepositoryDefinition; /** * Wizard page for definition of the new or existing {@link CmrRepositoryDefinition}. * * @author Ivan Senic * */ public class DefineCmrWizardPage extends WizardPage { /** * Default page message. */ private static final String DEFAULT_MESSAGE = "Define the information for the CMR Repository"; /** * Name tex box. */ private Text nameBox; /** * IP tex box. */ private Text ipBox; /** * Port tex box. */ private Text portBox; /** * Description box. */ private Text descriptionBox; /** * Repository to edit if edit mode is on. */ private final CmrRepositoryDefinition cmrRepositoryDefinition; /** * List of existing repositories to check if the same one already exists. */ private final List<CmrRepositoryDefinition> existingRepositories; /** * Default constructor. * * @param title * title for the wizard page */ public DefineCmrWizardPage(String title) { this(title, null); } /** * Secondary constructor for editing existing CMR. * * @param title * title for the wizard page * @param cmrRepositoryDefinition * {@link CmrRepositoryDefinition} to edit * */ public DefineCmrWizardPage(String title, CmrRepositoryDefinition cmrRepositoryDefinition) { super(title); this.setTitle(title); this.setMessage(DEFAULT_MESSAGE); this.cmrRepositoryDefinition = cmrRepositoryDefinition; this.existingRepositories = new ArrayList<>(InspectIT.getDefault().getCmrRepositoryManager().getCmrRepositoryDefinitions()); if (null != cmrRepositoryDefinition) { this.existingRepositories.remove(cmrRepositoryDefinition); } } /** * {@inheritDoc} */ @Override public void createControl(Composite parent) { final Composite main = new Composite(parent, SWT.NONE); main.setLayout(new GridLayout(4, false)); Label nameLabel = new Label(main, SWT.LEFT); nameLabel.setText("Server name:"); nameBox = new Text(main, SWT.BORDER); nameBox.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, false, 3, 1)); Label ipLabel = new Label(main, SWT.LEFT); ipLabel.setText("IP Address:"); ipBox = new Text(main, SWT.BORDER); ipBox.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, false)); ipBox.setText(CmrRepositoryDefinition.DEFAULT_IP); Label portLabel = new Label(main, SWT.LEFT); portLabel.setText("Port:"); portBox = new Text(main, SWT.BORDER | SWT.RIGHT); GridData gd = new GridData(SWT.FILL, SWT.FILL, false, false); portBox.setLayoutData(gd); portBox.setText(String.valueOf(CmrRepositoryDefinition.DEFAULT_PORT)); portBox.setTextLimit(5); portBox.addListener(SWT.Modify, new Listener() { @Override public void handleEvent(Event event) { if (portBox.getText().length() > String.valueOf(CmrRepositoryDefinition.DEFAULT_PORT).length()) { main.layout(); } } }); Label descLabel = new Label(main, SWT.LEFT); descLabel.setText("Description:"); descLabel.setLayoutData(new GridData(SWT.FILL, SWT.TOP, false, false)); descriptionBox = new Text(main, SWT.BORDER | SWT.MULTI | SWT.V_SCROLL | SWT.WRAP); gd = new GridData(SWT.FILL, SWT.FILL, true, true, 3, 1); gd.widthHint = 300; descriptionBox.setLayoutData(gd); Listener pageCompletionListener = new Listener() { @Override public void handleEvent(Event event) { setPageComplete(isPageComplete()); setPageMessage(); } }; nameBox.addListener(SWT.Modify, pageCompletionListener); ipBox.addListener(SWT.Modify, pageCompletionListener); portBox.addListener(SWT.Modify, pageCompletionListener); if (null != cmrRepositoryDefinition) { nameBox.setText(cmrRepositoryDefinition.getName()); ipBox.setText(cmrRepositoryDefinition.getIp()); portBox.setText(String.valueOf(cmrRepositoryDefinition.getPort())); descriptionBox.setText(StringUtils.defaultString(cmrRepositoryDefinition.getDescription())); } setControl(main); } /** * {@inheritDoc} */ @Override public boolean canFlipToNextPage() { return isPageComplete(); } /** * {@inheritDoc} */ @Override public boolean isPageComplete() { if (nameBox.getText().isEmpty()) { return false; } if (ipBox.getText().trim().isEmpty()) { return false; } if (portBox.getText().trim().isEmpty()) { return false; } else { try { Integer.parseInt(portBox.getText().trim()); } catch (NumberFormatException e) { return false; } } String ip = ipBox.getText().trim(); int port = Integer.parseInt(portBox.getText().trim()); for (CmrRepositoryDefinition cmrRepositoryDefinition : existingRepositories) { if (Objects.equals(ip, cmrRepositoryDefinition.getIp()) && (port == cmrRepositoryDefinition.getPort())) { return false; } } return true; } /** * @return Returns the defined {@link CmrRepositoryDefinition}. */ public CmrRepositoryDefinition getCmrRepositoryDefinition() { CmrRepositoryDefinition cmrRepositoryDefinition = new CmrRepositoryDefinition(ipBox.getText().trim(), Integer.parseInt(portBox.getText()), nameBox.getText().trim()); if (!descriptionBox.getText().trim().isEmpty()) { cmrRepositoryDefinition.setDescription(descriptionBox.getText().trim()); } else { cmrRepositoryDefinition.setDescription(""); } return cmrRepositoryDefinition; } /** * Sets the message based on the page selections. */ private void setPageMessage() { if (nameBox.getText().isEmpty()) { setMessage("No value for the CMR name entered", ERROR); return; } if (ipBox.getText().trim().isEmpty()) { setMessage("No value for the CMR IP address entered", ERROR); return; } if (portBox.getText().trim().isEmpty()) { setMessage("No value for the CMR port entered", ERROR); return; } else { try { Integer.parseInt(portBox.getText().trim()); } catch (NumberFormatException e) { setMessage("The port is not in a valid number format", ERROR); return; } } String ip = ipBox.getText().trim(); int port = Integer.parseInt(portBox.getText().trim()); for (CmrRepositoryDefinition cmrRepositoryDefinition : existingRepositories) { if (Objects.equals(ip, cmrRepositoryDefinition.getIp()) && (port == cmrRepositoryDefinition.getPort())) { setMessage("The repository with given IP address and port already exists", ERROR); return; } } setMessage(DEFAULT_MESSAGE); } }