com.google.gerrit.client.account.MyIdentitiesScreen.java Source code

Java tutorial

Introduction

Here is the source code for com.google.gerrit.client.account.MyIdentitiesScreen.java

Source

// Copyright (C) 2008 The Android Open Source Project
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.

package com.google.gerrit.client.account;

import com.google.gerrit.client.Gerrit;
import com.google.gerrit.client.auth.openid.OpenIdUtil;
import com.google.gerrit.client.rpc.GerritCallback;
import com.google.gerrit.client.rpc.ScreenLoadCallback;
import com.google.gerrit.client.ui.FancyFlexTable;
import com.google.gerrit.common.auth.openid.OpenIdUrls;
import com.google.gerrit.reviewdb.client.AccountExternalId;
import com.google.gerrit.reviewdb.client.AuthType;
import com.google.gwt.event.dom.client.ClickEvent;
import com.google.gwt.event.dom.client.ClickHandler;
import com.google.gwt.event.logical.shared.ValueChangeEvent;
import com.google.gwt.event.logical.shared.ValueChangeHandler;
import com.google.gwt.user.client.History;
import com.google.gwt.user.client.Window.Location;
import com.google.gwt.user.client.ui.Button;
import com.google.gwt.user.client.ui.CheckBox;
import com.google.gwt.user.client.ui.FlexTable.FlexCellFormatter;

import java.util.Collections;
import java.util.Comparator;
import java.util.HashSet;
import java.util.List;
import java.util.Set;

public class MyIdentitiesScreen extends SettingsScreen {
    private IdTable identites;
    private Button deleteIdentity;

    @Override
    protected void onInitUI() {
        super.onInitUI();

        identites = new IdTable();
        add(identites);

        deleteIdentity = new Button(Util.C.buttonDeleteIdentity());
        deleteIdentity.setEnabled(false);
        deleteIdentity.addClickHandler(new ClickHandler() {
            @Override
            public void onClick(final ClickEvent event) {
                identites.deleteChecked();
            }
        });
        add(deleteIdentity);

        if (Gerrit.getConfig().getAuthType() == AuthType.OPENID) {
            Button linkIdentity = new Button(Util.C.buttonLinkIdentity());
            linkIdentity.addClickHandler(new ClickHandler() {
                @Override
                public void onClick(final ClickEvent event) {
                    Location.assign(Gerrit.loginRedirect(History.getToken()) + "?link");
                }
            });
            add(linkIdentity);
        }
    }

    @Override
    protected void onLoad() {
        super.onLoad();
        Util.ACCOUNT_SEC.myExternalIds(new ScreenLoadCallback<List<AccountExternalId>>(this) {
            public void preDisplay(final List<AccountExternalId> result) {
                identites.display(result);
            }
        });
    }

    private class IdTable extends FancyFlexTable<AccountExternalId> {
        private ValueChangeHandler<Boolean> updateDeleteHandler;

        IdTable() {
            table.setWidth("");
            table.setText(0, 2, Util.C.webIdStatus());
            table.setText(0, 3, Util.C.webIdEmail());
            table.setText(0, 4, Util.C.webIdIdentity());

            final FlexCellFormatter fmt = table.getFlexCellFormatter();
            fmt.addStyleName(0, 1, Gerrit.RESOURCES.css().iconHeader());
            fmt.addStyleName(0, 2, Gerrit.RESOURCES.css().dataHeader());
            fmt.addStyleName(0, 3, Gerrit.RESOURCES.css().dataHeader());
            fmt.addStyleName(0, 4, Gerrit.RESOURCES.css().dataHeader());

            updateDeleteHandler = new ValueChangeHandler<Boolean>() {
                @Override
                public void onValueChange(ValueChangeEvent<Boolean> event) {
                    updateDeleteButton();
                }
            };
        }

        void deleteChecked() {
            final HashSet<AccountExternalId.Key> keys = new HashSet<AccountExternalId.Key>();
            for (int row = 1; row < table.getRowCount(); row++) {
                final AccountExternalId k = getRowItem(row);
                if (k == null) {
                    continue;
                }
                final CheckBox cb = (CheckBox) table.getWidget(row, 1);
                if (cb == null) {
                    continue;
                }
                if (cb.getValue()) {
                    keys.add(k.getKey());
                }
            }
            if (keys.isEmpty()) {
                updateDeleteButton();
            } else {
                deleteIdentity.setEnabled(false);
                Util.ACCOUNT_SEC.deleteExternalIds(keys, new GerritCallback<Set<AccountExternalId.Key>>() {
                    public void onSuccess(final Set<AccountExternalId.Key> removed) {
                        for (int row = 1; row < table.getRowCount();) {
                            final AccountExternalId k = getRowItem(row);
                            if (k != null && removed.contains(k.getKey())) {
                                table.removeRow(row);
                            } else {
                                row++;
                            }
                        }
                        updateDeleteButton();
                    }

                    @Override
                    public void onFailure(Throwable caught) {
                        updateDeleteButton();
                        super.onFailure(caught);
                    }
                });
            }
        }

        void updateDeleteButton() {
            int off = 0;
            boolean on = false;
            for (int row = 1; row < table.getRowCount(); row++) {
                if (table.getWidget(row, 1) == null) {
                    off++;
                } else {
                    CheckBox sel = (CheckBox) table.getWidget(row, 1);
                    if (sel.getValue()) {
                        on = true;
                        break;
                    }
                }
            }
            deleteIdentity.setVisible(off < table.getRowCount() - 1);
            deleteIdentity.setEnabled(on);
        }

        void display(final List<AccountExternalId> result) {
            Collections.sort(result, new Comparator<AccountExternalId>() {
                @Override
                public int compare(AccountExternalId a, AccountExternalId b) {
                    return emailOf(a).compareTo(emailOf(b));
                }

                private String emailOf(final AccountExternalId a) {
                    return a.getEmailAddress() != null ? a.getEmailAddress() : "";
                }
            });

            while (1 < table.getRowCount())
                table.removeRow(table.getRowCount() - 1);

            for (final AccountExternalId k : result) {
                addOneId(k);
            }
            updateDeleteButton();
        }

        void addOneId(final AccountExternalId k) {
            if (k.isScheme(AccountExternalId.SCHEME_USERNAME)) {
                // Don't display the username as an identity here.
                return;
            }

            final FlexCellFormatter fmt = table.getFlexCellFormatter();
            final int row = table.getRowCount();
            table.insertRow(row);
            applyDataRowStyle(row);

            if (k.canDelete()) {
                final CheckBox sel = new CheckBox();
                sel.addValueChangeHandler(updateDeleteHandler);
                table.setWidget(row, 1, sel);
            } else {
                table.setText(row, 1, "");
            }
            if (k.isTrusted()) {
                table.setText(row, 2, "");
            } else {
                table.setText(row, 2, Util.C.untrustedProvider());
                fmt.addStyleName(row, 2, Gerrit.RESOURCES.css().identityUntrustedExternalId());
            }
            if (k.getEmailAddress() != null && k.getEmailAddress().length() > 0) {
                table.setText(row, 3, k.getEmailAddress());
            } else {
                table.setText(row, 3, "");
            }
            table.setText(row, 4, describe(k));

            fmt.addStyleName(row, 1, Gerrit.RESOURCES.css().iconCell());
            fmt.addStyleName(row, 2, Gerrit.RESOURCES.css().dataCell());
            fmt.addStyleName(row, 3, Gerrit.RESOURCES.css().dataCell());
            fmt.addStyleName(row, 4, Gerrit.RESOURCES.css().dataCell());

            setRowItem(row, k);
        }

        private String describe(final AccountExternalId k) {
            if (k.isScheme(AccountExternalId.SCHEME_GERRIT)) {
                // A local user identity should just be itself.
                //
                return k.getSchemeRest();

            } else if (k.isScheme(AccountExternalId.SCHEME_USERNAME)) {
                // A local user identity should just be itself.
                //
                return k.getSchemeRest();

            } else if (k.isScheme(AccountExternalId.SCHEME_MAILTO)) {
                // Describe a mailto address as just its email address, which
                // is already shown in the email address field.
                //
                return "";

            } else if (k.isScheme(OpenIdUrls.URL_GOOGLE)) {
                return OpenIdUtil.C.nameGoogle();

            } else if (k.isScheme(OpenIdUrls.URL_YAHOO)) {
                return OpenIdUtil.C.nameYahoo();

            } else if (k.isScheme(AccountExternalId.LEGACY_GAE)) {
                return OpenIdUtil.C.nameGoogle() + " (Imported from Google AppEngine)";

            } else {
                return k.getExternalId();
            }
        }
    }
}