org.jboss.tools.openshift.internal.ui.wizard.connection.ConnectionEditor.java Source code

Java tutorial

Introduction

Here is the source code for org.jboss.tools.openshift.internal.ui.wizard.connection.ConnectionEditor.java

Source

/*******************************************************************************
 * Copyright (c) 2015 Red Hat, Inc. Distributed under license by Red Hat, Inc.
 * All rights reserved. This program is made available under the terms of the
 * Eclipse Public License v1.0 which accompanies this distribution, and is
 * available at http://www.eclipse.org/legal/epl-v10.html
 * 
 * Contributors: Red Hat, Inc.
 ******************************************************************************/
package org.jboss.tools.openshift.internal.ui.wizard.connection;

import java.util.HashMap;
import java.util.Map;

import org.eclipse.core.databinding.Binding;
import org.eclipse.core.databinding.DataBindingContext;
import org.eclipse.core.databinding.beans.BeanProperties;
import org.eclipse.core.databinding.observable.value.IObservableValue;
import org.eclipse.core.databinding.validation.ValidationStatus;
import org.eclipse.jface.databinding.fieldassist.ControlDecorationSupport;
import org.eclipse.jface.databinding.viewers.ViewerProperties;
import org.eclipse.jface.layout.GridDataFactory;
import org.eclipse.jface.layout.GridLayoutFactory;
import org.eclipse.jface.viewers.ArrayContentProvider;
import org.eclipse.jface.viewers.ColumnLabelProvider;
import org.eclipse.jface.viewers.ComboViewer;
import org.eclipse.swt.SWT;
import org.eclipse.swt.widgets.Combo;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Label;
import org.jboss.tools.common.databinding.ObservablePojo;
import org.jboss.tools.common.ui.databinding.ValueBindingBuilder;
import org.jboss.tools.openshift.common.core.connection.IConnection;
import org.jboss.tools.openshift.core.connection.Connection;
import org.jboss.tools.openshift.core.connection.ConnectionFactory;
import org.jboss.tools.openshift.internal.common.ui.connection.BaseConnectionEditor;
import org.jboss.tools.openshift.internal.common.ui.connection.ConnectionWizardPageModel;
import org.jboss.tools.openshift.internal.common.ui.connection.ConnectionWizardPageModel.IConnectionAuthenticationProvider;
import org.jboss.tools.openshift.internal.common.ui.databinding.IsNotNullValidator;
import org.jboss.tools.openshift.internal.common.ui.databinding.RequiredControlDecorationUpdater;
import org.jboss.tools.openshift.internal.common.ui.detailviews.AbstractStackedDetailViews;
import org.jboss.tools.openshift.internal.common.ui.detailviews.AbstractStackedDetailViews.IDetailView;
import org.jboss.tools.openshift.internal.common.ui.utils.DataBindingUtils;

import com.openshift.restclient.authorization.IAuthorizationContext;

/**
 * Detail view used in the common Connection Wizard to
 * support establishing connections to 3 instance of OpenShift
 * 
 * @author Jeff Cantrill
 * @author Andre Dietisheim
 *
 */
public class ConnectionEditor extends BaseConnectionEditor {

    private static final String PROPERTY_SELECTED_DETAIL_VIEW = "selectedDetailView";

    private Map<String, IConnectionEditorDetailView> detailViews = new HashMap<>();
    private ConnectionEditorStackedDetailViews stackedViews;
    private DetailViewModel detailViewModel = new DetailViewModel();

    private ComboViewer authTypeViewer;
    private IObservableValue<Boolean> rememberTokenObservable;
    private IObservableValue<IDetailView> selectedDetailViewObservable;
    private IObservableValue<String> authSchemeObservable;
    private Binding selectedAuthTypeBinding;

    private class DetailViewModel extends ObservablePojo {
        private IConnectionEditorDetailView selectedDetailView;

        public IConnectionEditorDetailView getSelectedDetailView() {
            return this.selectedDetailView;
        }

        @SuppressWarnings("unused")
        public void setSelectedDetailView(IConnectionEditorDetailView view) {
            this.selectedDetailView = view;
        }

        public void setSelectedConnection(IConnection conn) {
            if (conn instanceof Connection) {
                Connection connection = (Connection) conn;
                selectedDetailViewObservable.setValue(detailViews.get(connection.getAuthScheme()));
            } else {
                rememberTokenObservable.setValue(Boolean.FALSE);
                selectedDetailViewObservable.setValue(detailViews.get(IAuthorizationContext.AUTHSCHEME_OAUTH));
            }

            setDetailViewsConnection(conn);
        }

        private void setDetailViewsConnection(IConnection conn) {
            for (IConnectionEditorDetailView view : detailViews.values()) {
                //reset all views
                view.setSelectedConnection(conn);
            }
        }
    }

    private class ConnectionEditorStackedDetailViews extends AbstractStackedDetailViews {

        public ConnectionEditorStackedDetailViews(IObservableValue<IDetailView> detailViewModel, Object context,
                Composite parent, DataBindingContext dbc) {
            super(detailViewModel, context, parent, dbc);
        }

        @Override
        protected IDetailView[] getDetailViews() {
            return detailViews.values().toArray(new IConnectionEditorDetailView[detailViews.size()]);
        }

    }

    @Override
    public Composite createControls(Composite parent, ConnectionWizardPageModel pageModel, DataBindingContext dbc) {
        Composite composite = setControl(new Composite(parent, SWT.None));
        GridLayoutFactory.fillDefaults().numColumns(2).margins(10, 10).spacing(10, 10).applyTo(composite);

        this.selectedDetailViewObservable = BeanProperties
                .value(PROPERTY_SELECTED_DETAIL_VIEW, IConnectionEditorDetailView.class).observe(detailViewModel);
        this.authSchemeObservable = BeanProperties.value("authScheme", String.class).observe(detailViewModel);
        //detail views
        OAuthDetailView oAuthDetailView = new OAuthDetailView(wizardPage.getWizard(), pageModel, changeListener,
                pageModel.getContext(), authSchemeObservable);
        detailViews.put(IAuthorizationContext.AUTHSCHEME_OAUTH, oAuthDetailView);
        detailViews.put(IAuthorizationContext.AUTHSCHEME_BASIC,
                new BasicAuthenticationDetailView(pageModel, changeListener, pageModel.getContext()));
        rememberTokenObservable = oAuthDetailView.getRememberTokenObservable();

        // auth type
        Label authTypeLabel = new Label(composite, SWT.NONE);
        authTypeLabel.setText("Protocol:");
        GridDataFactory.fillDefaults().align(SWT.LEFT, SWT.CENTER).applyTo(authTypeLabel);
        Combo authTypeCombo = new Combo(composite, SWT.DEFAULT);
        GridDataFactory.fillDefaults().align(SWT.LEFT, SWT.CENTER).grab(true, false).applyTo(authTypeCombo);
        this.authTypeViewer = new ComboViewer(authTypeCombo);
        authTypeViewer.setContentProvider(ArrayContentProvider.getInstance());
        authTypeViewer.setLabelProvider(new ColumnLabelProvider() {
            @Override
            public String getText(Object element) {
                return element.toString();
            }
        });
        authTypeViewer.setInput(detailViews.values());

        //connection detail views
        final Composite detailsContainer = new Composite(composite, SWT.None);
        GridDataFactory.fillDefaults().align(SWT.FILL, SWT.FILL).span(3, 1).applyTo(detailsContainer);
        stackedViews = new ConnectionEditorStackedDetailViews(selectedDetailViewObservable, pageModel,
                detailsContainer, dbc);
        stackedViews.createControls(false);

        return composite;
    }

    @Override
    public void onVisible(IObservableValue detailViewModelObservable, ConnectionWizardPageModel pageModel,
            DataBindingContext dbc) {
        bindWidgetsToInternalModel(dbc);
        detailViewModel.setSelectedConnection(pageModel.getSelectedConnection());
    }

    @Override
    public void onInVisible(IObservableValue detailViewModelObservable, DataBindingContext dbc) {
        detailViewModel.getSelectedDetailView().onInVisible(detailViewModelObservable, dbc);
        disposeBindings();
    }

    private void bindWidgetsToInternalModel(DataBindingContext dbc) {
        //auth protocol
        this.selectedAuthTypeBinding = ValueBindingBuilder
                .bind(ViewerProperties.singleSelection().observe(authTypeViewer))
                .validatingAfterGet(
                        new IsNotNullValidator(ValidationStatus.cancel("Please select an authorization protocol.")))
                .to(selectedDetailViewObservable).in(dbc);
        ControlDecorationSupport.create(selectedAuthTypeBinding, SWT.LEFT | SWT.TOP, null,
                new RequiredControlDecorationUpdater());

    }

    @Override
    public void onInVisible(IObservableValue detailsViewModelObservable, ConnectionWizardPageModel pageModel,
            DataBindingContext dbc) {
        detailViewModel.getSelectedDetailView().onInVisible(detailsViewModelObservable, dbc);
        disposeBindings();
    }

    private void disposeBindings() {
        DataBindingUtils.dispose(selectedAuthTypeBinding);
        for (IDetailView view : stackedViews.getDetailViews()) {
            view.dispose();
        }

    }

    @Override
    protected void onSelectedConnectionChanged(IObservableValue selectedConnection) {
        IConnection conn = (IConnection) selectedConnection.getValue();
        detailViewModel.setSelectedConnection(conn);
    }

    @Override
    public boolean isViewFor(Object object) {
        return object instanceof ConnectionFactory;
    }

    private IConnectionEditorDetailView getDetailView() {
        return detailViewModel.getSelectedDetailView();
    }

    @Override
    protected IConnectionAuthenticationProvider createConnectionAuthenticationProvider(
            ConnectionWizardPageModel pageModel) {
        return new ConnectionAuthenticationProviderProxy();
    }

    private class ConnectionAuthenticationProviderProxy implements IConnectionAuthenticationProvider {
        @Override
        public IConnection update(IConnection connection) {
            return getDetailView().getConnectionAuthenticationProvider().update(connection);
        }

    }

}