com.logicaldoc.gui.setup.client.Setup.java Source code

Java tutorial

Introduction

Here is the source code for com.logicaldoc.gui.setup.client.Setup.java

Source

package com.logicaldoc.gui.setup.client;

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

import com.google.gwt.core.client.EntryPoint;
import com.google.gwt.core.client.GWT;
import com.google.gwt.user.client.Window;
import com.google.gwt.user.client.rpc.AsyncCallback;
import com.google.gwt.user.client.ui.RootPanel;
import com.logicaldoc.gui.common.client.Constants;
import com.logicaldoc.gui.common.client.beans.GUIInfo;
import com.logicaldoc.gui.common.client.i18n.I18N;
import com.logicaldoc.gui.common.client.services.InfoService;
import com.logicaldoc.gui.common.client.services.InfoServiceAsync;
import com.logicaldoc.gui.common.client.util.ItemFactory;
import com.logicaldoc.gui.common.client.util.RequestInfo;
import com.logicaldoc.gui.common.client.util.Util;
import com.logicaldoc.gui.common.client.util.WindowUtils;
import com.logicaldoc.gui.setup.client.services.SetupService;
import com.logicaldoc.gui.setup.client.services.SetupServiceAsync;
import com.smartgwt.client.types.Alignment;
import com.smartgwt.client.util.BooleanCallback;
import com.smartgwt.client.util.SC;
import com.smartgwt.client.widgets.IButton;
import com.smartgwt.client.widgets.Label;
import com.smartgwt.client.widgets.events.ClickEvent;
import com.smartgwt.client.widgets.events.ClickHandler;
import com.smartgwt.client.widgets.form.DynamicForm;
import com.smartgwt.client.widgets.form.FormItemIfFunction;
import com.smartgwt.client.widgets.form.ValuesManager;
import com.smartgwt.client.widgets.form.fields.FormItem;
import com.smartgwt.client.widgets.form.fields.PasswordItem;
import com.smartgwt.client.widgets.form.fields.RadioGroupItem;
import com.smartgwt.client.widgets.form.fields.SelectItem;
import com.smartgwt.client.widgets.form.fields.TextItem;
import com.smartgwt.client.widgets.form.fields.events.ChangeEvent;
import com.smartgwt.client.widgets.form.fields.events.ChangeHandler;
import com.smartgwt.client.widgets.form.validator.RequiredIfFunction;
import com.smartgwt.client.widgets.form.validator.RequiredIfValidator;
import com.smartgwt.client.widgets.layout.VLayout;
import com.smartgwt.client.widgets.tab.Tab;
import com.smartgwt.client.widgets.tab.TabSet;

/**
 * The Setup entry point used for initial installation
 * 
 * @author Marco Meschieri - Logical Objects
 * @since 6.0
 */
public class Setup implements EntryPoint {

    private static final String EMBEDDED = "embedded";

    private static final String REG_EMAIL = "regEmail";

    private static final String REG_WEBSITE = "regWebsite";

    private static final String REG_ORGANIZATION = "regOrganization";

    private static final String REG_NAME = "regName";

    private static final String ORACLE = "Oracle";

    private static final String MYSQL = "MySQL";

    private static final String SQLSERVER = "MSSQL";

    private static final String POSTGRESQL = "PostgreSQL";

    private static final String REPOSITORY_FOLDER = "repositoryFolder";

    private static final String LANGUAGE = "language";

    private static final String DB_TYPE = "dbType";

    private static final String DB_ENGINE = "dbEngine";

    private static final String DB_PASSWORD = "dbPassword";

    private static final String DB_USERNAME = "dbUsername";

    private static final String DB_URL = "dbUrl";

    private static final String DB_DRIVER = "dbDriver";

    int step = 0;

    private IButton submit;

    private ValuesManager vm = new ValuesManager();

    private TabSet tabs;

    private Map<String, String[]> engines = new HashMap<String, String[]>();

    protected InfoServiceAsync infoService = (InfoServiceAsync) GWT.create(InfoService.class);

    @Override
    public void onModuleLoad() {
        // Setup the language for localization
        RequestInfo loc = WindowUtils.getRequestInfo();

        // Tries to capture locale parameter
        String lang;
        if (loc.getParameter(Constants.LOCALE) != null && !loc.getParameter(Constants.LOCALE).equals("")) {
            lang = loc.getParameter(Constants.LOCALE);
        } else {
            // First we initialize language values
            lang = Util.getBrowserLanguage();
        }
        I18N.setLocale(lang);

        // Get grid of scrollbars, and clear out the window's built-in margin,
        // because we want to take advantage of the entire client area.
        Window.enableScrolling(false);
        Window.setMargin("0px");

        infoService.getInfo(I18N.getLocale(), Constants.TENANT_DEFAULTNAME, new AsyncCallback<GUIInfo>() {
            @Override
            public void onFailure(Throwable error) {
                SC.warn(error.getMessage());
            }

            @Override
            public void onSuccess(GUIInfo info) {
                I18N.init(info);
                initGUI(info);
            }
        });

    }

    private void initGUI(final GUIInfo info) {
        WindowUtils.setTitle(info.getProductName() + " " + info.getRelease()
                + (info.getLicensee() != null ? " - " + I18N.message("licensedto") + ": " + info.getLicensee()
                        : ""));
        WindowUtils.setFavicon(info);

        // Prepare a value manager that will include all forms spanned in each
        // tab
        vm = new ValuesManager();

        // Create all the tabs each one for a specific setup step
        tabs = new TabSet();
        tabs.setWidth(500);
        tabs.setHeight(250);

        Tab registrationTab = setupRegistration(vm);
        Tab repositoryTab = setupRepository(vm);
        Tab databaseTab = setupDatabase(vm);
        tabs.setTabs(registrationTab, repositoryTab, databaseTab);

        // This is the button used to confirm each step
        submit = new IButton();
        submit.setTitle(I18N.message("next"));
        submit.addClickHandler(new ClickHandler() {
            public void onClick(ClickEvent event) {
                onSubmit(info);
            }
        });

        // Prepare the heading panel with Logo and Title
        // Prepare the logo image to be shown inside the login form
        Label header = new Label(I18N.message("setup"));
        header.setStyleName("setupHeader");
        header.setIcon(info.getLogoSrc());
        header.setIconWidth(205);
        header.setIconHeight(40);
        header.setHeight(45);

        // Prepare a panel to layout setup components
        VLayout layout = new VLayout();
        layout.setHeight(500);
        layout.setWidth(400);
        layout.setMembersMargin(5);
        layout.addMember(header);
        layout.addMember(tabs);
        layout.addMember(submit);

        // Panel for horizontal centering
        VLayout vPanel = new VLayout();
        vPanel.setDefaultLayoutAlign(Alignment.CENTER);
        vPanel.setWidth100();
        vPanel.setHeight(300);
        vPanel.addMember(layout);

        RootPanel.get().add(vPanel);

        // Remove the loading frame
        RootPanel.getBodyElement().removeChild(RootPanel.get("loadingWrapper").getElement());
    }

    /**
     * Prepares the repository form
     */
    private Tab setupRepository(final ValuesManager vm) {
        // Prepare the tab used to configure the repository where documents and
        // other data will be stored
        Tab repositoryTab = new Tab();
        repositoryTab.setTitle(I18N.message("repository"));

        final DynamicForm repositoryForm = new DynamicForm();
        repositoryForm.setID("repositoryForm");
        repositoryForm.setValuesManager(vm);
        TextItem repositoryItem = ItemFactory.newTextItem(REPOSITORY_FOLDER, "repofolder", null);
        repositoryItem.setWidth(200);
        repositoryItem.setRequired(true);
        repositoryItem.setWrapTitle(false);
        repositoryItem.setDefaultValue(getDefaultFolder());
        repositoryForm.setFields(repositoryItem);
        repositoryForm.setDisabled(true);

        repositoryTab.setPane(repositoryForm);
        return repositoryTab;
    }

    /**
     * Prepares the database tab
     */
    private Tab setupDatabase(final ValuesManager vm) {
        // Prepare the map with all database engines
        engines.put(MYSQL,
                new String[] { "MySQL", "com.mysql.jdbc.Driver",
                        "jdbc:mysql://<server>[,<failoverhost>][<:3306>]/<database>",
                        "org.hibernate.dialect.MySQLDialect", "SELECT 1" });
        engines.put(POSTGRESQL,
                new String[] { "PostgreSQL", "org.postgresql.Driver",
                        "jdbc:postgresql:[<//server>[<:5432>/]]<database>",
                        "org.hibernate.dialect.PostgreSQLDialect", "SELECT 1" });
        engines.put(ORACLE,
                new String[] { "Oracle", "oracle.jdbc.driver.OracleDriver",
                        "jdbc:oracle:thin:@<server>[<:1521>]:<sid>", "org.hibernate.dialect.Oracle10gDialect",
                        "SELECT 1 FROM DUAL" });
        engines.put(SQLSERVER,
                new String[] { "SQL Server", "net.sourceforge.jtds.jdbc.Driver",
                        "jdbc:jtds:sqlserver://<server>[:<1433>]/<database>;instance=<instance>",
                        "org.hibernate.dialect.SQLServerDialect", "SELECT 1" });

        Tab databaseTab = new Tab();
        databaseTab.setTitle(I18N.message("database"));

        final DynamicForm databaseForm = new DynamicForm();
        databaseForm.setWidth(450);
        databaseForm.setID("database");
        databaseForm.setValuesManager(vm);
        databaseForm.setDisabled(true);

        RadioGroupItem dbType = new RadioGroupItem();
        dbType.setName(DB_TYPE);
        dbType.setWrapTitle(false);
        dbType.setRequired(true);
        dbType.setVertical(false);
        dbType.setValueMap(I18N.message(EMBEDDED), I18N.message("external"));
        dbType.setValue(I18N.message(EMBEDDED));
        dbType.setRedrawOnChange(true);
        dbType.setTitle(I18N.message("dbtype"));

        // The database engine, if the External db was chosen
        SelectItem dbEngine = new SelectItem();
        dbEngine.setTitle(I18N.message("dbengine"));
        dbEngine.setWrapTitle(false);
        dbEngine.setVisible(false);
        dbEngine.setName(DB_ENGINE);
        LinkedHashMap<String, String> valueMap = new LinkedHashMap<String, String>();
        for (String engine : engines.keySet()) {
            valueMap.put(engine, engines.get(engine)[0]);
        }
        dbEngine.setValueMap(valueMap);
        dbEngine.setValue(MYSQL);
        dbEngine.setShowIfCondition(new FormItemIfFunction() {
            public boolean execute(FormItem item, Object value, DynamicForm form) {
                return !I18N.message(EMBEDDED).equals(databaseForm.getValue(DB_TYPE));
            }
        });
        RequiredIfValidator ifValidator = new RequiredIfValidator();
        ifValidator.setExpression(new RequiredIfFunction() {
            public boolean execute(FormItem formItem, Object value) {
                return !I18N.message(EMBEDDED).equals(databaseForm.getValue(DB_TYPE));
            }
        });
        dbEngine.setValidators(ifValidator);
        dbEngine.addChangeHandler(new ChangeHandler() {
            public void onChange(ChangeEvent event) {
                String selectedItem = (String) event.getValue();
                databaseForm.getField(DB_DRIVER).setValue(engines.get(selectedItem)[1]);
                databaseForm.getField(DB_URL).setValue(engines.get(selectedItem)[2]);
            }
        });

        // The driver for the external DB
        TextItem dbDriver = ItemFactory.newTextItem(DB_DRIVER, "driverclass", null);
        dbDriver.setVisible(false);
        dbDriver.setWrapTitle(false);
        dbDriver.setShowIfCondition(new FormItemIfFunction() {
            public boolean execute(FormItem item, Object value, DynamicForm form) {
                return !I18N.message(EMBEDDED).equals(databaseForm.getValue(DB_TYPE));
            }
        });
        dbDriver.setValidators(ifValidator);
        dbDriver.setValue("com.mysql.jdbc.Driver");

        // The connection URL to external DB
        TextItem dbUrl = ItemFactory.newTextItem(DB_URL, "connectionurl", null);
        dbUrl.setWidth(200);
        dbUrl.setVisible(false);
        dbUrl.setWrapTitle(false);
        dbUrl.setShowIfCondition(new FormItemIfFunction() {
            public boolean execute(FormItem item, Object value, DynamicForm form) {
                return !I18N.message(EMBEDDED).equals(databaseForm.getValue(DB_TYPE));
            }
        });
        dbUrl.setValidators(ifValidator);
        dbUrl.setValue("jdbc:mysql://<server>[,<failoverhost>][<:3306>]/<database>");

        // The username to access the external DB
        TextItem dbUsername = ItemFactory.newTextItem(DB_USERNAME, "username", null);
        dbUsername.setVisible(false);
        dbUsername.setWrapTitle(false);
        dbUsername.setShowIfCondition(new FormItemIfFunction() {
            public boolean execute(FormItem item, Object value, DynamicForm form) {
                return !I18N.message(EMBEDDED).equals(databaseForm.getValue(DB_TYPE));
            }
        });

        // The password to access the external DB
        PasswordItem dbPassword = new PasswordItem();
        dbPassword.setVisible(false);
        dbPassword.setTitle(I18N.message("password"));
        dbPassword.setName(DB_PASSWORD);
        dbPassword.setWrapTitle(false);
        dbPassword.setShowIfCondition(new FormItemIfFunction() {
            public boolean execute(FormItem item, Object value, DynamicForm form) {
                return !I18N.message(EMBEDDED).equals(databaseForm.getValue(DB_TYPE));
            }
        });

        databaseForm.setFields(dbType, dbEngine, dbDriver, dbUrl, dbUsername, dbPassword);
        databaseTab.setPane(databaseForm);
        return databaseTab;
    }

    /**
     * Prepares the registration form
     */
    private Tab setupRegistration(final ValuesManager vm) {
        Tab registrationTab = new Tab();
        registrationTab.setTitle(I18N.message("registration"));

        TextItem regName = ItemFactory.newTextItem(REG_NAME, "name", null);
        regName.setWrapTitle(false);

        TextItem regOrganization = ItemFactory.newTextItem(REG_ORGANIZATION, "organization", null);
        regOrganization.setWrapTitle(false);

        TextItem regWebsite = ItemFactory.newTextItem(REG_WEBSITE, "website", null);
        regWebsite.setWrapTitle(false);

        TextItem regEmail = ItemFactory.newEmailItem(REG_EMAIL, "email", false);
        regEmail.setWrapTitle(false);

        SelectItem languageItem = ItemFactory.newLanguageSelector(LANGUAGE, false, true);
        languageItem.setTitle(I18N.message("language"));
        languageItem.setRequired(true);

        final DynamicForm regForm = new DynamicForm();
        regForm.setID("regForm");
        regForm.setValuesManager(vm);
        regForm.setFields(languageItem, regName, regEmail, regOrganization, regWebsite);

        registrationTab.setPane(regForm);
        return registrationTab;
    }

    private void onSubmit(final GUIInfo info) {
        try {
            vm.validate();
            Tab tab = tabs.getSelectedTab();
            int tabIndex = tabs.getSelectedTabNumber();
            DynamicForm form = (DynamicForm) tab.getPane();
            if (form.hasErrors()) {

            } else {
                if (step == tabs.getTabs().length - 1) {
                    if (!vm.validate())
                        SC.warn("invalidfields");

                    SetupInfo data = new SetupInfo();
                    data.setDbDriver(vm.getValueAsString(DB_DRIVER));
                    data.setDbUrl(vm.getValueAsString(DB_URL));
                    data.setDbUsername(vm.getValueAsString(DB_USERNAME));
                    data.setDbPassword(vm.getValueAsString(DB_PASSWORD));
                    data.setDbEngine(vm.getValueAsString(DB_ENGINE));
                    data.setDbType(vm.getValueAsString(DB_TYPE));
                    data.setLanguage(vm.getValueAsString(LANGUAGE));
                    data.setRepositoryFolder(vm.getValueAsString(REPOSITORY_FOLDER));
                    data.setRegEmail(vm.getValueAsString(REG_EMAIL));
                    data.setRegName(vm.getValueAsString(REG_NAME));
                    data.setRegOrganization(vm.getValueAsString(REG_ORGANIZATION));
                    data.setRegWebsite(vm.getValueAsString(REG_WEBSITE));

                    if (I18N.message(EMBEDDED).equals(data.getDbType())) {
                        data.setDbEngine("hsqldb");
                        data.setDbDriver("org.hsqldb.jdbcDriver");
                        data.setDbUrl(
                                ("jdbc:hsqldb:" + data.getRepositoryFolder() + "/db/db").replaceAll("//", "/"));
                        data.setDbUsername("sa");
                        data.setDbPassword("");
                        data.setDbDialect("org.hibernate.dialect.HSQLDialect");
                        data.setDbValidationQuery("SELECT 1 FROM INFORMATION_SCHEMA.SYSTEM_USERS");
                    } else {
                        data.setDbDialect(engines.get(data.getDbEngine())[3]);
                        data.setDbValidationQuery(engines.get(data.getDbEngine())[4]);
                    }

                    SetupServiceAsync setupService = (SetupServiceAsync) GWT.create(SetupService.class);

                    setupService.setup(data, new AsyncCallback<Void>() {
                        @Override
                        public void onFailure(Throwable caught) {
                            SC.warn(caught.getMessage());
                            submit.setDisabled(false);
                        }

                        @Override
                        public void onSuccess(Void arg) {
                            SC.say(I18N.message("installationperformed"),
                                    I18N.message("installationend", info.getProductName()), new BooleanCallback() {
                                        @Override
                                        public void execute(Boolean value) {
                                            Util.redirect(Util.contextPath() + "frontend.jsp");
                                        }
                                    });
                            submit.setDisabled(false);
                        }
                    });
                    submit.setDisabled(true);
                } else {
                    // Go to the next tab and enable the contained panel
                    tabs.selectTab(tabIndex + 1);
                    tabs.getSelectedTab().getPane().setDisabled(false);
                    if (step < tabs.getSelectedTabNumber())
                        step++;
                    if (step == tabs.getTabs().length - 1)
                        submit.setTitle(I18N.message("setup"));
                }
            }
        } catch (Throwable e) {
            SC.warn("Error: " + e.getMessage());
        }
    }

    public static native String getDefaultFolder() /*-{
                                                   return $wnd.defaultFolder;
                                                   }-*/;
}