rocks.inspectit.ui.rcp.preferences.page.CmrRepositoryPreferencePage.java Source code

Java tutorial

Introduction

Here is the source code for rocks.inspectit.ui.rcp.preferences.page.CmrRepositoryPreferencePage.java

Source

package rocks.inspectit.ui.rcp.preferences.page;

import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;

import org.apache.commons.collections.CollectionUtils;
import org.eclipse.jface.preference.PreferencePage;
import org.eclipse.jface.resource.ImageDescriptor;
import org.eclipse.jface.viewers.ArrayContentProvider;
import org.eclipse.jface.viewers.ColumnLabelProvider;
import org.eclipse.jface.viewers.ISelectionChangedListener;
import org.eclipse.jface.viewers.SelectionChangedEvent;
import org.eclipse.jface.viewers.StructuredSelection;
import org.eclipse.jface.viewers.TableViewer;
import org.eclipse.jface.viewers.TableViewerColumn;
import org.eclipse.jface.window.Window;
import org.eclipse.jface.wizard.WizardDialog;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.graphics.Image;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.Table;
import org.eclipse.ui.IWorkbench;
import org.eclipse.ui.IWorkbenchPreferencePage;

import rocks.inspectit.shared.all.cmr.model.PlatformIdent;
import rocks.inspectit.ui.rcp.InspectIT;
import rocks.inspectit.ui.rcp.InspectITImages;
import rocks.inspectit.ui.rcp.dialog.AddCmrRepositoryDefinitionDialog;
import rocks.inspectit.ui.rcp.preferences.PreferencesUtils;
import rocks.inspectit.ui.rcp.repository.CmrRepositoryChangeListener;
import rocks.inspectit.ui.rcp.repository.CmrRepositoryDefinition;
import rocks.inspectit.ui.rcp.repository.CmrRepositoryDefinition.OnlineStatus;
import rocks.inspectit.ui.rcp.repository.CmrRepositoryManager;
import rocks.inspectit.ui.rcp.util.SafeExecutor;
import rocks.inspectit.ui.rcp.wizard.ManageLabelWizard;

/**
 * Preference page for {@link CmrRepositoryDefinition} management.
 * <p>
 * <b>This class is not used at the moment. It's not confirmed that quality of the class in with the
 * standards, however, it can serve as an entry to future work regarding preferences.</b>
 *
 * @author Ivan Senic
 *
 */
public class CmrRepositoryPreferencePage extends PreferencePage
        implements IWorkbenchPreferencePage, CmrRepositoryChangeListener {

    /**
     * {@link CmrRepositoryManager}.
     */
    private CmrRepositoryManager cmrRepositoryManager;

    /**
     * Table with repositories.
     */
    private TableViewer tableViewer;

    /**
     * Add button.
     */
    private Button addButton;

    /**
     * Remove button.
     */
    private Button removeButton;

    /**
     * Refresh button.
     */
    private Button refreshButton;

    /**
     * Manage labels button.
     */
    private Button manageLabelsButton;

    /**
     * Input list to save changes until Apply or OK are fired.
     */
    private Map<CmrRepositoryDefinition, OnlineStatus> inputList;

    /**
     * Default constructor.
     */
    public CmrRepositoryPreferencePage() {
    }

    /**
     * Sec. constructor.
     *
     * @param title
     *            Title of preference page.
     */
    public CmrRepositoryPreferencePage(String title) {
        super(title);
    }

    /**
     * Third constructor.
     *
     * @param title
     *            Title of preference page.
     * @param image
     *            Image.
     */
    public CmrRepositoryPreferencePage(String title, ImageDescriptor image) {
        super(title, image);
    }

    /**
     * {@inheritDoc}
     */
    @Override
    public void init(IWorkbench workbench) {
        cmrRepositoryManager = InspectIT.getDefault().getCmrRepositoryManager();
        cmrRepositoryManager.addCmrRepositoryChangeListener(this);
        inputList = new ConcurrentHashMap<>();
        for (CmrRepositoryDefinition cmrRepositoryDefinition : cmrRepositoryManager.getCmrRepositoryDefinitions()) {
            inputList.put(cmrRepositoryDefinition, cmrRepositoryDefinition.getOnlineStatus());
        }
        noDefaultAndApplyButton();
    }

    /**
     * {@inheritDoc}
     */
    @Override
    protected Control createContents(Composite parent) {
        Composite mainComposite = new Composite(parent, SWT.INHERIT_DEFAULT);
        GridLayout layout = new GridLayout(2, false);
        layout.marginHeight = 0;
        layout.marginWidth = 0;
        mainComposite.setLayout(layout);

        Label info = new Label(mainComposite, SWT.NONE);
        info.setText("Add, remove and manage repositories");
        GridData labelGridData = new GridData(SWT.BEGINNING, SWT.BEGINNING, false, false);
        labelGridData.horizontalSpan = 2;
        info.setLayoutData(labelGridData);

        Table table = new Table(mainComposite,
                SWT.MULTI | SWT.FULL_SELECTION | SWT.BORDER | SWT.V_SCROLL | SWT.H_SCROLL | SWT.VIRTUAL);
        table.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));
        table.setHeaderVisible(true);
        table.setLinesVisible(true);

        tableViewer = new TableViewer(table);
        createColumns();
        tableViewer.setContentProvider(new ArrayContentProvider());
        tableViewer.setInput(inputList.keySet());

        tableViewer.addSelectionChangedListener(new ISelectionChangedListener() {
            @Override
            public void selectionChanged(SelectionChangedEvent event) {
                updateButtonsState();
            }
        });

        Composite buttonComposite = new Composite(mainComposite, SWT.INHERIT_DEFAULT);
        GridLayout buttonLayout = new GridLayout(1, true);
        buttonLayout.marginHeight = 0;
        buttonLayout.marginWidth = 0;
        buttonComposite.setLayout(buttonLayout);
        buttonComposite.setLayoutData(new GridData(SWT.RIGHT, SWT.TOP, false, false));

        addButton = new Button(buttonComposite, SWT.PUSH);
        addButton.setText("Add");
        addButton.setLayoutData(new GridData(SWT.FILL, SWT.TOP, true, false));
        addButton.addSelectionListener(new SelectionAdapter() {
            @Override
            public void widgetSelected(SelectionEvent e) {
                AddCmrRepositoryDefinitionDialog dialog = new AddCmrRepositoryDefinitionDialog(getShell());
                dialog.open();
                if ((dialog.getReturnCode() == Window.OK) && (null != dialog.getCmrRepositoryDefinition())) {
                    inputList.put(dialog.getCmrRepositoryDefinition(), OnlineStatus.OFFLINE);
                    cmrRepositoryManager.forceCmrRepositoryOnlineStatusUpdate(dialog.getCmrRepositoryDefinition());
                    tableViewer.refresh();
                }
            }
        });

        removeButton = new Button(buttonComposite, SWT.PUSH);
        removeButton.setText("Remove");
        removeButton.setLayoutData(new GridData(SWT.FILL, SWT.TOP, true, false));
        removeButton.setEnabled(false);
        removeButton.addSelectionListener(new SelectionAdapter() {
            @Override
            public void widgetSelected(SelectionEvent e) {
                StructuredSelection selection = (StructuredSelection) tableViewer.getSelection();
                for (Object selectedObject : selection.toArray()) {
                    if (selectedObject instanceof CmrRepositoryDefinition) {
                        inputList.remove(selectedObject);
                    }
                }
                tableViewer.refresh();
            }
        });

        refreshButton = new Button(buttonComposite, SWT.PUSH);
        refreshButton.setText("Refresh");
        refreshButton.setLayoutData(new GridData(SWT.FILL, SWT.TOP, true, false));
        refreshButton.addSelectionListener(new SelectionAdapter() {
            @Override
            public void widgetSelected(SelectionEvent e) {
                for (CmrRepositoryDefinition cmrRepositoryDefinition : inputList.keySet()) {
                    cmrRepositoryManager.forceCmrRepositoryOnlineStatusUpdate(cmrRepositoryDefinition);
                }
            }
        });

        manageLabelsButton = new Button(buttonComposite, SWT.PUSH);
        manageLabelsButton.setText("Manage Labels");
        manageLabelsButton.setLayoutData(new GridData(SWT.FILL, SWT.TOP, true, false));
        manageLabelsButton.setEnabled(false);
        manageLabelsButton.addSelectionListener(new SelectionAdapter() {
            @Override
            public void widgetSelected(SelectionEvent e) {
                StructuredSelection selection = (StructuredSelection) tableViewer.getSelection();
                for (Object selectedObject : selection.toArray()) {
                    if (selectedObject instanceof CmrRepositoryDefinition) {
                        ManageLabelWizard mlw = new ManageLabelWizard((CmrRepositoryDefinition) selectedObject);
                        WizardDialog wizardDialog = new WizardDialog(getShell(), mlw);
                        wizardDialog.open();
                    }
                }
            }
        });

        return mainComposite;
    }

    /**
     * {@inheritDoc}
     */
    @Override
    public boolean performOk() {
        saveChanges();
        return super.performOk();
    }

    @Override
    public void dispose() {
        super.dispose();
        cmrRepositoryManager.removeCmrRepositoryChangeListener(this);
    }

    /**
     * {@inheritDoc}
     * <p>
     * Does nothing.
     */
    @Override
    public void repositoryAdded(CmrRepositoryDefinition repositoryDefinition) {
    }

    /**
     * {@inheritDoc}
     * <p>
     * Does nothing.
     */
    @Override
    public void repositoryRemoved(CmrRepositoryDefinition repositoryDefinition) {
    }

    /**
     * {@inheritDoc}
     */
    @Override
    public void repositoryOnlineStatusUpdated(final CmrRepositoryDefinition repositoryDefinition,
            OnlineStatus oldStatus, OnlineStatus newStatus) {
        if ((newStatus != OnlineStatus.CHECKING) && inputList.containsKey(repositoryDefinition)) {
            OnlineStatus oldRegisteredStatus = inputList.get(repositoryDefinition);
            if (!oldRegisteredStatus.equals(newStatus)) {
                SafeExecutor.asyncExec(new Runnable() {
                    @Override
                    public void run() {
                        tableViewer.refresh(repositoryDefinition);
                        updateButtonsState();
                    }
                }, tableViewer.getTable(), removeButton, manageLabelsButton);
                inputList.put(repositoryDefinition, newStatus);
            }
        }
    }

    /**
     * {@inheritDoc}
     */
    @Override
    public void repositoryDataUpdated(final CmrRepositoryDefinition cmrRepositoryDefinition) {
        SafeExecutor.asyncExec(new Runnable() {
            @Override
            public void run() {
                tableViewer.refresh(cmrRepositoryDefinition);
            }
        }, tableViewer.getTable());
    }

    /**
     * {@inheritDoc}
     */
    @Override
    public void repositoryAgentDeleted(CmrRepositoryDefinition cmrRepositoryDefinition, PlatformIdent agent) {
    }

    /**
     * Updates the state of the remove and license info buttons depending on the current table
     * selection.
     */
    private void updateButtonsState() {
        StructuredSelection structuredSelection = (StructuredSelection) tableViewer.getSelection();
        if (structuredSelection.isEmpty()) {
            removeButton.setEnabled(false);
            manageLabelsButton.setEnabled(false);
        } else {
            removeButton.setEnabled(true);
            if ((structuredSelection.size() == 1)
                    && (((CmrRepositoryDefinition) structuredSelection.getFirstElement())
                            .getOnlineStatus() == OnlineStatus.ONLINE)) {
                manageLabelsButton.setEnabled(true);
            } else {
                manageLabelsButton.setEnabled(false);
            }
        }
    }

    /**
     * Save made changes.
     */
    private void saveChanges() {
        // do nothing if no changes are there
        if (!isDirty()) {
            return;
        }

        // add all new
        for (CmrRepositoryDefinition cmrRepositoryDefinition : inputList.keySet()) {
            if (!cmrRepositoryManager.getCmrRepositoryDefinitions().contains(cmrRepositoryDefinition)) {
                cmrRepositoryManager.addCmrRepositoryDefinition(cmrRepositoryDefinition);
            }
        }

        // remove all deleted
        List<CmrRepositoryDefinition> removeList = new ArrayList<>();
        for (CmrRepositoryDefinition cmrRepositoryDefinition : cmrRepositoryManager.getCmrRepositoryDefinitions()) {
            if (!inputList.keySet().contains(cmrRepositoryDefinition)) {
                removeList.add(cmrRepositoryDefinition);
            }
        }
        if (!removeList.isEmpty()) {
            for (CmrRepositoryDefinition cmrRepositoryDefinition : removeList) {
                cmrRepositoryManager.removeCmrRepositoryDefinition(cmrRepositoryDefinition);
            }
        }

        // save to local preferences
        savePreferences();
    }

    /**
     * Where there changes performed by user.
     *
     * @return Where there changes performed by user.
     */
    private boolean isDirty() {
        return !CollectionUtils.isEqualCollection(inputList.keySet(),
                cmrRepositoryManager.getCmrRepositoryDefinitions());
    }

    /**
     * Saves the changes to preference store.
     */
    private void savePreferences() {
        PreferencesUtils.saveCmrRepositoryDefinitions(cmrRepositoryManager.getCmrRepositoryDefinitions(), false);
    }

    /**
     * Creates columns for the table.
     */
    private void createColumns() {
        TableViewerColumn onlineColumn = new TableViewerColumn(tableViewer, SWT.NONE);
        onlineColumn.getColumn().setResizable(false);
        onlineColumn.getColumn().setWidth(24);
        onlineColumn.setLabelProvider(new ColumnLabelProvider() {

            @Override
            public Image getImage(Object element) {
                if (element instanceof CmrRepositoryDefinition) {
                    if (((CmrRepositoryDefinition) element).getOnlineStatus() == OnlineStatus.ONLINE) {
                        return InspectIT.getDefault().getImage(InspectITImages.IMG_SERVER_ONLINE_SMALL);
                    } else if (((CmrRepositoryDefinition) element).getOnlineStatus() == OnlineStatus.OFFLINE) {
                        return InspectIT.getDefault().getImage(InspectITImages.IMG_SERVER_OFFLINE_SMALL);
                    } else {
                        return InspectIT.getDefault().getImage(InspectITImages.IMG_SERVER_REFRESH_SMALL);
                    }
                }
                return null;
            }

            @Override
            public String getText(Object element) {
                return null;
            }

        });

        TableViewerColumn nameColumn = new TableViewerColumn(tableViewer, SWT.NONE);
        nameColumn.getColumn().setResizable(true);
        nameColumn.getColumn().setWidth(150);
        nameColumn.getColumn().setText("Name");
        nameColumn.setLabelProvider(new ColumnLabelProvider() {

            @Override
            public String getText(Object element) {
                if (element instanceof CmrRepositoryDefinition) {
                    return ((CmrRepositoryDefinition) element).getName();
                }
                return null;
            }
        });

        TableViewerColumn ipColumn = new TableViewerColumn(tableViewer, SWT.NONE);
        ipColumn.getColumn().setResizable(true);
        ipColumn.getColumn().setWidth(120);
        ipColumn.getColumn().setText("IP Address");
        ipColumn.setLabelProvider(new ColumnLabelProvider() {

            @Override
            public String getText(Object element) {
                if (element instanceof CmrRepositoryDefinition) {
                    return ((CmrRepositoryDefinition) element).getIp();
                }
                return null;
            }
        });

        TableViewerColumn portColumn = new TableViewerColumn(tableViewer, SWT.NONE);
        portColumn.getColumn().setResizable(true);
        portColumn.getColumn().setWidth(50);
        portColumn.getColumn().setText("Port");
        portColumn.setLabelProvider(new ColumnLabelProvider() {

            @Override
            public String getText(Object element) {
                if (element instanceof CmrRepositoryDefinition) {
                    return String.valueOf(((CmrRepositoryDefinition) element).getPort());
                }
                return null;
            }
        });

    }

}