package rocks.inspectit.ui.rcp.form; import java.text.DateFormat; import java.util.Date; import java.util.HashMap; import java.util.Map; import java.util.Map.Entry; 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.dialogs.PopupDialog; import org.eclipse.jface.viewers.ISelection; import org.eclipse.jface.viewers.ISelectionChangedListener; import org.eclipse.jface.viewers.SelectionChangedEvent; import org.eclipse.jface.viewers.StructuredSelection; import org.eclipse.swt.SWT; import org.eclipse.swt.graphics.Point; import org.eclipse.swt.layout.GridData; import org.eclipse.swt.layout.GridLayout; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Control; import org.eclipse.swt.widgets.Display; import org.eclipse.swt.widgets.Label; import org.eclipse.swt.widgets.ProgressBar; import org.eclipse.swt.widgets.Text; import org.eclipse.ui.forms.ManagedForm; import org.eclipse.ui.forms.events.HyperlinkAdapter; import org.eclipse.ui.forms.events.HyperlinkEvent; import org.eclipse.ui.forms.widgets.ExpandableComposite; import org.eclipse.ui.forms.widgets.FormText; import org.eclipse.ui.forms.widgets.FormToolkit; import org.eclipse.ui.forms.widgets.ScrolledForm; import org.eclipse.ui.forms.widgets.Section; import org.eclipse.ui.forms.widgets.TableWrapData; import org.eclipse.ui.forms.widgets.TableWrapLayout; import org.eclipse.ui.progress.UIJob; import rocks.inspectit.shared.all.communication.DefaultData; import rocks.inspectit.shared.all.communication.data.cmr.CmrStatusData; import rocks.inspectit.shared.all.externalservice.ExternalServiceStatus; import rocks.inspectit.shared.all.externalservice.ExternalServiceType; import rocks.inspectit.shared.all.util.ObjectUtils; import rocks.inspectit.shared.all.util.Pair; import rocks.inspectit.shared.cs.communication.data.cmr.RecordingData; 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.InspectITImages; import rocks.inspectit.ui.rcp.formatter.ImageFormatter; import rocks.inspectit.ui.rcp.formatter.NumberFormatter; import rocks.inspectit.ui.rcp.formatter.TextFormatter; import rocks.inspectit.ui.rcp.model.Component; import rocks.inspectit.ui.rcp.provider.ICmrRepositoryProvider; import rocks.inspectit.ui.rcp.repository.CmrRepositoryDefinition; import rocks.inspectit.ui.rcp.repository.CmrRepositoryDefinition.OnlineStatus; import rocks.inspectit.ui.rcp.util.SafeExecutor; /** * Class having a form for displaying the properties of a {@link CmrRepositoryDefinition}. * * @author Ivan Senic * */ public class CmrRepositoryPropertyForm implements ISelectionChangedListener { /** * Number of max characters displayed for CMR description. */ private static final int MAX_DESCRIPTION_LENGTH = 150; /** * {@link CmrRepositoryDefinition} to be displayed. */ private CmrRepositoryDefinition cmrRepositoryDefinition; /** * Current recording data. */ private RecordingData recordingData; /** * Job for recording end count-down. */ private final RecordCountdownJob recordCountdownJob = new RecordCountdownJob(); /** * Job for updating the CMR properties. */ private final UpdateCmrPropertiesJob updateCmrPropertiesJob = new UpdateCmrPropertiesJob(); private Composite mainComposite; // NOCHK private final FormToolkit toolkit; // NOCHK private final ManagedForm managedForm; // NOCHK private final ScrolledForm form; // NOCHK private Label address; // NOCHK private FormText description; // NOCHK private Label recordingIcon; // NOCHK private Label recordingStorage; // NOCHK private Label status; // NOCHK private Label bufferDate; // NOCHK private ProgressBar bufferBar; // NOCHK private ProgressBar recTimeBar; // NOCHK private Label recordingStatusIcon; // NOCHK private Label recordingLabel; // NOCHK private Label version; // NOCHK private Label bufferSize; // NOCHK private Label recTime; // NOCHK private Label spaceLeftLabel; // NOCHK private ProgressBar spaceLeftBar; // NOCHK private Label uptimeLabel; // NOCHK private Label databaseSizeLabel; // NOCHK /** * Map containing the labels of the external services. */ private Map<ExternalServiceType, Pair<Label, Label>> externalServiceLabelMap = new HashMap<>(); /** * Default constructor. * * @param parent * Parent composite. */ public CmrRepositoryPropertyForm(Composite parent) { this(parent, null); } /** * Secondary constructor. Set the displayed {@link CmrRepositoryDefinition}. * * @param parent * Parent composite. * @param cmrRepositoryDefinition * Displayed CMR. */ public CmrRepositoryPropertyForm(Composite parent, CmrRepositoryDefinition cmrRepositoryDefinition) { this.managedForm = new ManagedForm(parent); this.toolkit = managedForm.getToolkit(); this.form = managedForm.getForm(); this.cmrRepositoryDefinition = cmrRepositoryDefinition; initWidget(); } /** * Instantiate the widgets. */ private void initWidget() { Composite body = form.getBody(); body.setLayout(new TableWrapLayout()); managedForm.getToolkit().decorateFormHeading(form.getForm()); mainComposite = toolkit.createComposite(body, SWT.NONE); mainComposite.setLayout(new TableWrapLayout()); mainComposite.setLayoutData(new TableWrapData(TableWrapData.FILL_GRAB)); // START - General section Section generalSection = toolkit.createSection(mainComposite, ExpandableComposite.TITLE_BAR); generalSection.setText("General information"); Composite generalComposite = toolkit.createComposite(generalSection, SWT.NONE); TableWrapLayout tableWrapLayout = new TableWrapLayout(); tableWrapLayout.numColumns = 2; generalComposite.setLayout(tableWrapLayout); generalComposite.setLayoutData(new TableWrapData(TableWrapData.FILL)); toolkit.createLabel(generalComposite, "Address:"); address = toolkit.createLabel(generalComposite, null, SWT.WRAP); toolkit.createLabel(generalComposite, "Version:"); version = toolkit.createLabel(generalComposite, null, SWT.WRAP); toolkit.createLabel(generalComposite, "Description:"); description = toolkit.createFormText(generalComposite, true); description.setLayoutData(new TableWrapData(TableWrapData.FILL)); description.addHyperlinkListener(new HyperlinkAdapter() { @Override public void linkActivated(HyperlinkEvent e) { showCmrDescriptionBox(); } }); toolkit.createLabel(generalComposite, "Status:"); status = toolkit.createLabel(generalComposite, null, SWT.WRAP); toolkit.createLabel(generalComposite, "Uptime:"); uptimeLabel = toolkit.createLabel(generalComposite, null, SWT.WRAP); uptimeLabel.setToolTipText("Date started represents date/time on machine where CMR has been launched"); toolkit.createLabel(generalComposite, "Database size:"); databaseSizeLabel = toolkit.createLabel(generalComposite, null, SWT.WRAP); databaseSizeLabel.setToolTipText("Current size of the database on the CMR"); generalSection.setClient(generalComposite); generalSection.setLayout(new TableWrapLayout()); generalSection.setLayoutData(new TableWrapData(TableWrapData.FILL_GRAB)); // END - General section // START - External Service section Section externalServicesSection = toolkit.createSection(mainComposite, ExpandableComposite.TITLE_BAR); externalServicesSection.setText("External services"); Composite externalServicesSectionComposite = toolkit.createComposite(externalServicesSection, SWT.NONE); tableWrapLayout = new TableWrapLayout(); tableWrapLayout.numColumns = 2; externalServicesSectionComposite.setLayout(tableWrapLayout); externalServicesSectionComposite.setLayoutData(new TableWrapData(TableWrapData.FILL)); for (ExternalServiceType service : ExternalServiceType.values()) { toolkit.createLabel(externalServicesSectionComposite, service.getName() + ":"); Composite statusComposite = toolkit.createComposite(externalServicesSectionComposite); GridLayout statusLayout = new GridLayout(2, false); statusLayout.marginHeight = 0; statusLayout.marginWidth = 0; statusComposite.setLayout(statusLayout); Label iconLabel = toolkit.createLabel(statusComposite, null, SWT.WRAP); Label textLabel = toolkit.createLabel(statusComposite, null, SWT.WRAP); iconLabel.setImage(InspectIT.getDefault().getImage(InspectITImages.IMG_RECORD_GRAY)); textLabel.setText(""); externalServiceLabelMap.put(service, new Pair<>(iconLabel, textLabel)); } externalServicesSection.setClient(externalServicesSectionComposite); externalServicesSection.setLayout(new TableWrapLayout()); externalServicesSection.setLayoutData(new TableWrapData(TableWrapData.FILL_GRAB)); // END - External Service section // START - Buffer section Section bufferSection = toolkit.createSection(mainComposite, ExpandableComposite.TITLE_BAR); bufferSection.setText("Buffer status"); Composite bufferSectionComposite = toolkit.createComposite(bufferSection, SWT.NONE); tableWrapLayout = new TableWrapLayout(); tableWrapLayout.numColumns = 2; bufferSectionComposite.setLayout(tableWrapLayout); bufferSectionComposite.setLayoutData(new TableWrapData(TableWrapData.FILL)); toolkit.createLabel(bufferSectionComposite, "Data in buffer since:"); bufferDate = toolkit.createLabel(bufferSectionComposite, null, SWT.WRAP); toolkit.createLabel(bufferSectionComposite, "Buffer occupancy:"); bufferBar = new ProgressBar(bufferSectionComposite, SWT.SMOOTH); bufferBar.setLayoutData(new TableWrapData(TableWrapData.FILL_GRAB)); // help label toolkit.createLabel(bufferSectionComposite, null); bufferSize = toolkit.createLabel(bufferSectionComposite, null, SWT.CENTER); bufferSize.setLayoutData(new TableWrapData(TableWrapData.FILL_GRAB)); bufferSection.setClient(bufferSectionComposite); bufferSection.setLayout(new TableWrapLayout()); bufferSection.setLayoutData(new TableWrapData(TableWrapData.FILL_GRAB)); // END - Buffer section // START - Storage section Section storageSection = toolkit.createSection(mainComposite, ExpandableComposite.TITLE_BAR); storageSection.setText("Storage status"); Composite storageSectionComposite = toolkit.createComposite(storageSection, SWT.NONE); tableWrapLayout = new TableWrapLayout(); tableWrapLayout.numColumns = 2; storageSectionComposite.setLayout(tableWrapLayout); storageSectionComposite.setLayoutData(new TableWrapData(TableWrapData.FILL)); toolkit.createLabel(storageSectionComposite, "Storage space left:"); spaceLeftBar = new ProgressBar(storageSectionComposite, SWT.SMOOTH); spaceLeftBar.setLayoutData(new TableWrapData(TableWrapData.FILL_GRAB)); // help label toolkit.createLabel(storageSectionComposite, null); spaceLeftLabel = toolkit.createLabel(storageSectionComposite, null, SWT.CENTER); spaceLeftLabel.setLayoutData(new TableWrapData(TableWrapData.FILL_GRAB)); toolkit.createLabel(storageSectionComposite, "Recording:"); Composite recordingHelpComposite = toolkit.createComposite(storageSectionComposite); GridLayout gl = new GridLayout(2, false); gl.marginHeight = 0; gl.marginWidth = 0; recordingHelpComposite.setLayout(gl); recordingIcon = toolkit.createLabel(recordingHelpComposite, null, SWT.WRAP); recordingLabel = toolkit.createLabel(recordingHelpComposite, null, SWT.WRAP); toolkit.createLabel(storageSectionComposite, "Recording status:"); recordingStatusIcon = toolkit.createLabel(storageSectionComposite, null, SWT.NONE); toolkit.createLabel(storageSectionComposite, "Recording storage:"); recordingStorage = toolkit.createLabel(storageSectionComposite, null, SWT.WRAP); toolkit.createLabel(storageSectionComposite, "Recording time left:"); recTimeBar = new ProgressBar(storageSectionComposite, SWT.SMOOTH); recTimeBar.setVisible(false); recTimeBar.setLayoutData(new TableWrapData(TableWrapData.FILL_GRAB)); // help label toolkit.createLabel(storageSectionComposite, null); // recTime = toolkit.createLabel(storageSectionComposite, null, SWT.CENTER); recTime.setVisible(false); recTime.setLayoutData(new TableWrapData(TableWrapData.FILL_GRAB)); storageSection.setClient(storageSectionComposite); tableWrapLayout = new TableWrapLayout(); tableWrapLayout.numColumns = 2; storageSection.setLayout(tableWrapLayout); storageSection.setLayoutData(new TableWrapData(TableWrapData.FILL_GRAB)); // END - Storage section refreshData(); } /** * Sets layout data for the form. * * @param layoutData * LayoutData. */ public void setLayoutData(Object layoutData) { form.setLayoutData(layoutData); } /** * Refreshes the property form. */ public void refresh() { refreshData(); } /** * {@inheritDoc} */ @Override public void selectionChanged(SelectionChangedEvent event) { ISelection selection = event.getSelection(); if (!selection.isEmpty() && (selection instanceof StructuredSelection)) { StructuredSelection structuredSelection = (StructuredSelection) selection; Object firstElement = structuredSelection.getFirstElement(); if (!(firstElement instanceof Component)) { // it is possible that the PendingAdapterUpdate is in the selection because it // is still loading the agents return; } while (firstElement != null) { if (firstElement instanceof ICmrRepositoryProvider) { // NOPMD if (!ObjectUtils.equals(cmrRepositoryDefinition, ((ICmrRepositoryProvider) firstElement).getCmrRepositoryDefinition())) { cmrRepositoryDefinition = ((ICmrRepositoryProvider) firstElement).getCmrRepositoryDefinition(); refreshData(); } return; } firstElement = ((Component) firstElement).getParent(); } } if (null != cmrRepositoryDefinition) { cmrRepositoryDefinition = null; // NOPMD refreshData(); } } /** * Shows the description box. */ private void showCmrDescriptionBox() { int shellStyle = SWT.CLOSE | SWT.TITLE | SWT.BORDER | SWT.APPLICATION_MODAL | SWT.RESIZE; PopupDialog popupDialog = new PopupDialog(form.getShell(), shellStyle, true, false, false, false, false, "CMR description", "CMR description") { private static final int CURSOR_SIZE = 15; @Override protected Control createDialogArea(Composite parent) { Composite composite = (Composite) super.createDialogArea(parent); Text text = toolkit.createText(parent, null, SWT.MULTI | SWT.READ_ONLY | SWT.WRAP | SWT.H_SCROLL | SWT.V_SCROLL); GridData gd = new GridData(GridData.BEGINNING | GridData.FILL_BOTH); gd.horizontalIndent = 3; gd.verticalIndent = 3; text.setLayoutData(gd); text.setText(cmrRepositoryDefinition.getDescription()); return composite; } @Override protected Point getInitialLocation(Point initialSize) { // show popup relative to cursor Display display = getShell().getDisplay(); Point location = display.getCursorLocation(); location.x += CURSOR_SIZE; location.y += CURSOR_SIZE; return location; } @Override protected Point getInitialSize() { return new Point(400, 200); } }; popupDialog.open(); } /** * Refreshes the data on the view. */ private void refreshData() { // we only schedule if the cancel returns true // because cancel fails when job is currently in process if (updateCmrPropertiesJob.cancel()) { updateCmrPropertiesJob.schedule(); } } /** * Updates buffer data. * * @param cmrStatusData * Status data. */ private void updateCmrManagementData(CmrStatusData cmrStatusData) { boolean dataLoaded = false; if (null != cmrStatusData) { dataLoaded = true; // Transfer to MB right away double bufferMaxOccupancy = (double) cmrStatusData.getMaxBufferSize() / (1024 * 1024); double bufferCurrentOccupancy = (double) cmrStatusData.getCurrentBufferSize() / (1024 * 1024); bufferBar.setMaximum((int) Math.round(bufferMaxOccupancy)); bufferBar.setSelection((int) Math.round(bufferCurrentOccupancy)); int occupancy = (int) ((100 * Math.round(bufferCurrentOccupancy)) / Math.round(bufferMaxOccupancy)); String occMb = NumberFormatter.humanReadableByteCount(cmrStatusData.getCurrentBufferSize()); String maxMb = NumberFormatter.humanReadableByteCount(cmrStatusData.getMaxBufferSize()); String string = occupancy + "% (" + occMb + " / " + maxMb + ")"; bufferSize.setText(string); DefaultData oldestData = cmrStatusData.getBufferOldestElement(); if (null != oldestData) { bufferDate.setText(NumberFormatter.formatTime(oldestData.getTimeStamp().getTime())); } else { bufferDate.setText("-"); } // hard drive space data int spaceOccupancy = (int) ((100 * (double) cmrStatusData.getStorageDataSpaceLeft()) / cmrStatusData.getStorageMaxDataSpace()); StringBuilder spaceLeftStringBuilder = new StringBuilder(String.valueOf(spaceOccupancy)); spaceLeftStringBuilder.append("% ("); spaceLeftStringBuilder.append(NumberFormatter.humanReadableByteCount(cmrStatusData.getStorageDataSpaceLeft())); spaceLeftStringBuilder.append(" / "); spaceLeftStringBuilder.append(NumberFormatter.humanReadableByteCount(cmrStatusData.getStorageMaxDataSpace())); spaceLeftStringBuilder.append(')'); spaceLeftLabel.setText(spaceLeftStringBuilder.toString()); spaceLeftBar.setMaximum((int) (cmrStatusData.getStorageMaxDataSpace() / 1024 / 1024)); spaceLeftBar.setSelection((int) (cmrStatusData.getStorageDataSpaceLeft() / 1024 / 1024)); if (!cmrStatusData.isCanWriteMore()) { spaceLeftBar.setForeground(Display.getDefault().getSystemColor(SWT.COLOR_RED)); spaceLeftBar.setToolTipText("Space left is critically low and no write is possible anymore"); } else if (cmrStatusData.isWarnSpaceLeftActive()) { spaceLeftBar.setForeground(Display.getDefault().getSystemColor(SWT.COLOR_DARK_YELLOW)); spaceLeftBar.setToolTipText("Space left is reaching critical level"); } else { spaceLeftBar.setForeground(Display.getDefault().getSystemColor(SWT.COLOR_GREEN)); spaceLeftBar.setToolTipText("Enough space left"); } // uptime info long uptimeMillis = cmrStatusData.getUpTime(); Date started = cmrStatusData.getDateStarted(); StringBuilder uptimeText = new StringBuilder(NumberFormatter.humanReadableMillisCount(uptimeMillis, true)); uptimeText.append(" (started "); uptimeText.append(DateFormat.getDateTimeInstance(DateFormat.SHORT, DateFormat.SHORT).format(started)); uptimeText.append(')'); uptimeLabel.setText(uptimeText.toString()); // database info Long databaseSize = cmrStatusData.getDatabaseSize(); if (null != databaseSize) { databaseSizeLabel.setText(NumberFormatter.humanReadableByteCount(databaseSize.longValue())); } else { databaseSizeLabel.setText("n/a"); } // external services for (Entry<ExternalServiceType, Pair<Label, Label>> serviceEntry : externalServiceLabelMap.entrySet()) { ExternalServiceStatus serviceStatus = cmrStatusData.getExternalServiceStatusMap().get(serviceEntry.getKey()); if (serviceStatus == ExternalServiceStatus.CONNECTED) { serviceEntry.getValue().getFirst().setImage(InspectIT.getDefault().getImage(InspectITImages.IMG_RECORD_GREEN)); serviceEntry.getValue().getSecond().setText("Connected"); } else if (serviceStatus == ExternalServiceStatus.DISCONNECTED) { serviceEntry.getValue().getFirst().setImage(InspectIT.getDefault().getImage(InspectITImages.IMG_RECORD)); serviceEntry.getValue().getSecond().setText("Disconnected"); } else if (serviceStatus == ExternalServiceStatus.DISABLED) { serviceEntry.getValue().getFirst().setImage(InspectIT.getDefault().getImage(InspectITImages.IMG_RECORD_GRAY)); serviceEntry.getValue().getSecond().setText("Disabled"); } else if (serviceStatus == ExternalServiceStatus.UNKNOWN) { serviceEntry.getValue().getFirst().setImage(InspectIT.getDefault().getImage(InspectITImages.IMG_RECORD_YELLOW)); serviceEntry.getValue().getSecond().setText("Unknown status"); } } } if (!dataLoaded) { bufferDate.setText(""); bufferBar.setMaximum(Integer.MAX_VALUE); bufferBar.setSelection(0); bufferSize.setText(""); spaceLeftBar.setMaximum(Integer.MAX_VALUE); spaceLeftBar.setSelection(0); spaceLeftBar.setToolTipText(""); spaceLeftLabel.setText(""); uptimeLabel.setText(""); databaseSizeLabel.setText(""); for (Entry<ExternalServiceType, Pair<Label, Label>> serviceEntry : externalServiceLabelMap.entrySet()) { serviceEntry.getValue().getFirst().setImage(InspectIT.getDefault().getImage(InspectITImages.IMG_RECORD_GRAY)); serviceEntry.getValue().getSecond().setText(""); } } } /** * Updates recording data. * * @param recordingData * Recording information. */ private void updateRecordingData(RecordingData recordingData) { boolean countdownJobActive = false; boolean dataLoaded = false; recordingIcon.setImage(null); // recording information if (null != recordingData) { RecordingState recordingState = cmrRepositoryDefinition.getStorageService().getRecordingState(); if (recordingState == RecordingState.ON) { recordingIcon.setImage(InspectIT.getDefault().getImage(InspectITImages.IMG_RECORD)); recordingLabel.setText("Active"); } else if (recordingState == RecordingState.SCHEDULED) { recordingIcon.setImage(InspectIT.getDefault().getImage(InspectITImages.IMG_RECORD_SCHEDULED)); recordingLabel.setText("Scheduled @ " + DateFormat.getDateTimeInstance(DateFormat.SHORT, DateFormat.SHORT).format(recordingData.getRecordStartDate())); } // get the storage name StorageData storage = recordingData.getRecordingStorage(); if (null != storage) { recordingStorage.setText(storage.getName()); } else { recordingStorage.setText(""); } // check if the recording time is limited if (null != recordingData.getRecordEndDate()) { countdownJobActive = true; } else { recTimeBar.setVisible(false); recTime.setVisible(false); } // recording status stuff recordingStatusIcon.setImage(ImageFormatter.getWritingStatusImage(recordingData.getRecordingWritingStatus())); recordingStatusIcon.setToolTipText(TextFormatter.getWritingStatusText(recordingData.getRecordingWritingStatus())); dataLoaded = true; } else { recordingIcon.setImage(InspectIT.getDefault().getImage(InspectITImages.IMG_RECORD_GRAY)); } if (!dataLoaded) { recordingStorage.setText(""); recTimeBar.setVisible(false); recTime.setVisible(false); recordingStatusIcon.setImage(null); recordingStatusIcon.setToolTipText(""); recordingLabel.setText("Not Active"); } if (countdownJobActive) { recordCountdownJob.schedule(); } else { recordCountdownJob.cancel(); } } /** * * @return Returns if the form is disposed. */ public boolean isDisposed() { return form.isDisposed(); } /** * Disposes the for. */ public void dispose() { form.dispose(); recordCountdownJob.cancel(); } /** * Job for updating the information about the CMR. Job will perform all UI related work in UI * thread asynchronously. * * @author Ivan Senic * */ private class UpdateCmrPropertiesJob extends Job { /** * Default constructor. */ UpdateCmrPropertiesJob() { super("Updating CMR Properties.."); } /** * {@inheritDoc} */ @Override protected IStatus run(IProgressMonitor monitor) { final CmrRepositoryDefinition cmrRepositoryDefinition = CmrRepositoryPropertyForm.this.cmrRepositoryDefinition; if (cmrRepositoryDefinition != null) { final OnlineStatus onlineStatus = cmrRepositoryDefinition.getOnlineStatus(); final CmrStatusData cmrStatusData = (onlineStatus == OnlineStatus.ONLINE) ? cmrRepositoryDefinition.getCmrManagementService().getCmrStatusData() : null; // NOPMD recordingData = (onlineStatus == OnlineStatus.ONLINE) ? cmrRepositoryDefinition.getStorageService().getRecordingData() : null; // NOPMD SafeExecutor.asyncExec(new Runnable() { @Override public void run() { form.setBusy(true); form.setText(cmrRepositoryDefinition.getName()); form.setMessage(null, IMessageProvider.NONE); address.setText(cmrRepositoryDefinition.getIp() + ":" + cmrRepositoryDefinition.getPort()); version.setText(cmrRepositoryDefinition.getVersion()); String desc = cmrRepositoryDefinition.getDescription(); if (null != desc) { if (desc.length() > MAX_DESCRIPTION_LENGTH) { description.setText("<form><p>" + desc.substring(0, MAX_DESCRIPTION_LENGTH) + ".. <a href=\"More\">[More]</a></p></form>", true, false); } else { description.setText(desc, false, false); } } else { description.setText("", false, false); } status.setText(onlineStatus.toString()); if (onlineStatus == OnlineStatus.ONLINE) { form.setImage(InspectIT.getDefault().getImage(InspectITImages.IMG_SERVER_ONLINE_SMALL)); } else if (onlineStatus == OnlineStatus.CHECKING) { form.setImage(InspectIT.getDefault().getImage(InspectITImages.IMG_SERVER_REFRESH_SMALL)); } else { form.setImage(InspectIT.getDefault().getImage(InspectITImages.IMG_SERVER_OFFLINE_SMALL)); } updateRecordingData(recordingData); updateCmrManagementData(cmrStatusData); mainComposite.setVisible(true); form.getBody().layout(true, true); form.setBusy(false); } }, form, mainComposite); } else { Display.getDefault().asyncExec(new Runnable() { @Override public void run() { form.setBusy(true); form.setText(null); form.setMessage("Please select a CMR to see its properties.", IMessageProvider.INFORMATION); mainComposite.setVisible(false); updateRecordingData(null); updateCmrManagementData(null); mainComposite.setVisible(true); form.getBody().layout(true, true); form.setBusy(false); } }); } return Status.OK_STATUS; } } /** * Class for updating the recording count down. * * @author Ivan Senic * */ private class RecordCountdownJob extends UIJob { /** * Default constructor. */ RecordCountdownJob() { super("Update Recording Countdown"); setUser(false); } /** * {@inheritDoc} */ @Override public IStatus runInUIThread(IProgressMonitor monitor) { if ((null != recordingData) && !form.isDisposed()) { Date endDate = recordingData.getRecordEndDate(); Date startDate = recordingData.getRecordStartDate(); if ((null != endDate) && (null != startDate) && startDate.before(new Date())) { Date now = new Date(); long millisMore = endDate.getTime() - now.getTime(); if (millisMore > 0) { if (!recTimeBar.isVisible()) { recTimeBar.setVisible(true); } recTimeBar.setMaximum((int) (endDate.getTime() - startDate.getTime())); recTimeBar.setSelection((int) (recTimeBar.getMaximum() - (now.getTime() - startDate.getTime()))); if (!recTime.isVisible()) { recTime.setVisible(true); } String string; if (millisMore > 0) { string = NumberFormatter.humanReadableMillisCount(millisMore, false); } else { string = ""; } recTime.setText(string); } else { if (recTimeBar.isVisible()) { recTimeBar.setVisible(false); } if (recTime.isVisible()) { recTime.setVisible(false); } this.cancel(); refreshData(); } } } this.schedule(1000); return Status.OK_STATUS; } } }