com.persistent.winazureroles.WAServerConfiguration.java Source code

Java tutorial

Introduction

Here is the source code for com.persistent.winazureroles.WAServerConfiguration.java

Source

/**
 * Copyright (c) Microsoft Corporation
 * 
 * All rights reserved. 
 * 
 * MIT License
 * 
 * Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files 
 * (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, 
 * publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, 
 * subject to the following conditions:
 * 
 * The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
 * 
 * THE SOFTWARE IS PROVIDED *AS IS*, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 
 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR 
 * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH 
 * THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
 */
package com.persistent.winazureroles;

import java.io.File;
import java.net.MalformedURLException;
import java.net.URL;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

import org.eclipse.core.resources.IWorkspace;
import org.eclipse.core.resources.IWorkspaceRoot;
import org.eclipse.core.resources.ResourcesPlugin;
import org.eclipse.jface.dialogs.MessageDialog;
import org.eclipse.jface.viewers.ILabelProviderListener;
import org.eclipse.jface.viewers.IStructuredContentProvider;
import org.eclipse.jface.viewers.ITableLabelProvider;
import org.eclipse.jface.viewers.Viewer;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.FocusEvent;
import org.eclipse.swt.events.FocusListener;
import org.eclipse.swt.events.ModifyEvent;
import org.eclipse.swt.events.ModifyListener;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.events.SelectionListener;
import org.eclipse.swt.graphics.Image;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.widgets.Combo;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.TabFolder;
import org.eclipse.swt.widgets.TabItem;
import org.eclipse.ui.PlatformUI;
import org.eclipse.ui.dialogs.PropertyPage;

import com.interopbridges.tools.windowsazure.WARoleComponentCloudUploadMode;
import com.interopbridges.tools.windowsazure.WindowsAzureEndpoint;
import com.interopbridges.tools.windowsazure.WindowsAzureEndpointType;
import com.interopbridges.tools.windowsazure.WindowsAzureInvalidProjectOperationException;
import com.interopbridges.tools.windowsazure.WindowsAzurePackageType;
import com.interopbridges.tools.windowsazure.WindowsAzureProjectManager;
import com.interopbridges.tools.windowsazure.WindowsAzureRole;
import com.interopbridges.tools.windowsazure.WindowsAzureRoleComponent;
import com.interopbridges.tools.windowsazure.WindowsAzureRoleComponentImportMethod;
import com.microsoftopentechnologies.azurecommons.roleoperations.JdkSrvConfigUtilMethods;
import com.microsoftopentechnologies.azurecommons.roleoperations.WAServerConfUtilMethods;
import com.microsoftopentechnologies.azurecommons.util.WAEclipseHelperMethods;
import com.microsoftopentechnologies.wacommon.utils.PluginUtil;
import com.persistent.ui.projwizard.WAApplicationDialog;
import com.persistent.util.AppCmpntParam;
import com.persistent.util.JdkSrvConfig;
import com.persistent.util.JdkSrvConfigListener;
import com.persistent.util.ProjectNatureHelper;
import com.persistent.util.WAEclipseHelper;

import waeclipseplugin.Activator;

/**
 * Property page for Server Configuration.
 */
public class WAServerConfiguration extends PropertyPage {
    private WindowsAzureProjectManager waProjManager;
    private WindowsAzureRole windowsAzureRole;
    private ArrayList<AppCmpntParam> appList = new ArrayList<AppCmpntParam>();
    private File cmpntFile = new File(WAEclipseHelper.getTemplateFile(Messages.cmpntSetFlName));
    private IWorkspace workspace = ResourcesPlugin.getWorkspace();
    private IWorkspaceRoot root = workspace.getRoot();
    private ArrayList<String> fileToDel = new ArrayList<String>();
    private String finalSrvPath;
    private WindowsAzureRoleComponentImportMethod finalImpMethod;
    private String finalAsName;
    private String finalJdkPath;
    private boolean isPageDisplayed = false;
    private TabFolder folder;
    private TabItem jdkTab;
    private TabItem srvTab;
    private TabItem appTab;
    private final String auto = "auto";
    private int prevTabIndex;
    private static boolean accepted = false;
    private static boolean srvAccepted = false;
    private String jdkPrevName;
    private String srvPrevName;
    private final int HTTP_PORT = 80;
    private String tabToSelect = "";

    private void checkSDKPresenceAndEnable() {
        String sdkVersion = WindowsAzureProjectManager.getLatestAzureVersionForSA();
        if (sdkVersion == null || sdkVersion.isEmpty()) {
            if (!JdkSrvConfig.getJdkCheckBtn().getSelection()) {
                JdkSrvConfig.getJdkCheckBtn().setEnabled(false);
            }
            JdkSrvConfig.getTxtJdk().setEnabled(false);
            JdkSrvConfig.getBtnJdkLoc().setEnabled(false);
        }
    }

    public WAServerConfiguration() {
        super();
    }

    public WAServerConfiguration(String tabToSelect) {
        super();
        this.tabToSelect = tabToSelect;
    }

    @Override
    public String getTitle() {
        if (!isPageDisplayed) {
            return super.getTitle();
        }
        // Check JDK is already enabled or not
        // and if enabled show appropriate values on property page
        try {
            String jdkSrcPath = null;
            jdkSrcPath = windowsAzureRole.getJDKSourcePath();

            if (jdkSrcPath == null) {
                JdkSrvConfig.setEnableJDK(false);
                JdkSrvConfig.setEnableDlGrp(false, false);
            } else {
                if (jdkSrcPath.isEmpty()) {
                    JdkSrvConfig.setEnableJDK(false);
                } else {
                    JdkSrvConfig.setEnableJDK(true);
                    JdkSrvConfig.getTxtJdk().setText(jdkSrcPath);
                }
                String jdkName = windowsAzureRole.getJDKCloudName();
                // project may be using deprecated JDK, hence pass to method
                JdkSrvConfigListener.showThirdPartyJdkNames(true, jdkName);

                String jdkUrl = windowsAzureRole.getJDKCloudURL();
                // JDK download group
                if (jdkUrl != null && !jdkUrl.isEmpty()) {
                    // JDK auto upload option configured
                    if (JdkSrvConfigUtilMethods.isJDKAutoUploadPrevSelected(windowsAzureRole)) {
                        JdkSrvConfig.setEnableDlGrp(true, true);
                        // check for third party JDK
                        if (jdkName.isEmpty()) {
                            JdkSrvConfig.getAutoDlRdCldBtn().setSelection(true);
                        } else {
                            JdkSrvConfig.getAutoDlRdCldBtn().setSelection(false);
                            JdkSrvConfig.getThrdPrtJdkBtn().setSelection(true);
                            JdkSrvConfigListener.enableThirdPartyJdkCombo(true);
                            JdkSrvConfig.getThrdPrtJdkCmb().setText(jdkName);
                            /*
                             * License has already been accepted
                             * on wizard or property page previously.
                             */
                            accepted = true;
                            jdkPrevName = jdkName;
                        }
                    } else {
                        // JDK deploy option configured
                        JdkSrvConfig.getAutoDlRdCldBtn().setSelection(false);
                        JdkSrvConfig.getDlRdCldBtn().setSelection(true);
                        JdkSrvConfig.setEnableDlGrp(true, false);
                    }

                    // Update URL text box
                    if (jdkUrl.equalsIgnoreCase(auto)) {
                        jdkUrl = JdkSrvConfig.AUTO_TXT;
                    }
                    JdkSrvConfig.getTxtUrl().setText(jdkUrl);

                    // Update JAVA_HOME text box
                    if (waProjManager.getPackageType().equals(WindowsAzurePackageType.LOCAL)) {
                        JdkSrvConfig.getTxtJavaHome().setText(windowsAzureRole.getJDKCloudHome());
                    } else {
                        JdkSrvConfig.getTxtJavaHome().setText(windowsAzureRole.getRuntimeEnv(Messages.jvHome));
                    }

                    // Update note below JDK URL text box
                    if (jdkSrcPath.isEmpty()) {
                        JdkSrvConfig.getLblDlNoteUrl().setText(com.persistent.ui.projwizard.Messages.dlgDlNtLblUrl);
                    } else {
                        String dirName = new File(jdkSrcPath).getName();
                        JdkSrvConfig.getLblDlNoteUrl()
                                .setText(String.format(com.persistent.ui.projwizard.Messages.dlNtLblDir, dirName));
                    }

                    // Update storage account combo box.
                    String jdkKey = windowsAzureRole.getJDKCloudKey();
                    JdkSrvConfig.setCmbStrgAccJdk(
                            JdkSrvConfig.populateStrgNameAsPerKey(jdkKey, JdkSrvConfig.getCmbStrgAccJdk()));
                }
            }
            checkSDKPresenceAndEnable();
        } catch (WindowsAzureInvalidProjectOperationException e) {
            PluginUtil.displayErrorDialogAndLog(getShell(), Messages.jdkPathErrTtl, Messages.getJdkErrMsg, e);
        }
        // Check Server is already enabled or not
        // and if enabled show appropriate values on property page
        try {
            String srvName = windowsAzureRole.getServerName();
            if (srvName == null) {
                JdkSrvConfig.setEnableServer(false);
                JdkSrvConfig.setEnableDlGrpSrv(false, false);
                JdkSrvConfig.enableApplicationTab(false);
            } else {
                String srvSrcPath = windowsAzureRole.getServerSourcePath();
                String thirdServerName = windowsAzureRole.getServerCloudName();

                JdkSrvConfig.getSerCheckBtn().setSelection(true);
                JdkSrvConfig.setEnableServer(true);
                JdkSrvConfig.getComboServer().setText(srvName);
                JdkSrvConfig.getTxtDir().setText(srvSrcPath);
                JdkSrvConfig.enableApplicationTab(true);
                JdkSrvConfigListener.showThirdPartySrvNames(true, srvName, thirdServerName);

                // Server download group
                String srvUrl = windowsAzureRole.getServerCloudURL();
                if (srvUrl != null && !srvUrl.isEmpty()) {
                    // server auto upload option configured
                    if (JdkSrvConfigUtilMethods.isServerAutoUploadPrevSelected(windowsAzureRole)
                            || !thirdServerName.isEmpty()) {
                        if (thirdServerName.isEmpty()) {
                            JdkSrvConfig.getAutoDlRdCldBtnSrv().setSelection(true);
                        } else {
                            JdkSrvConfig.getThrdPrtSrvBtn().setSelection(true);
                            JdkSrvConfigListener.enableThirdPartySrvCombo(true);
                            srvAccepted = true;
                            srvPrevName = thirdServerName;
                        }
                        JdkSrvConfig.setEnableDlGrpSrv(true, true);
                        if (!thirdServerName.isEmpty()) {
                            JdkSrvConfig.getThrdPrtSrvCmb().setText(thirdServerName);
                        }
                    } else {
                        // server deploy option configured
                        JdkSrvConfig.getDlRdCldBtnSrv().setSelection(true);
                        JdkSrvConfig.setEnableDlGrpSrv(true, false);
                    }
                    if (srvUrl.equalsIgnoreCase(auto)) {
                        srvUrl = JdkSrvConfig.AUTO_TXT;
                    }
                    JdkSrvConfig.getTxtUrlSrv().setText(srvUrl);
                    // Update server home text box
                    if (waProjManager.getPackageType().equals(WindowsAzurePackageType.LOCAL)) {
                        JdkSrvConfig.getTxtHomeDir().setText(windowsAzureRole.getServerCloudHome());
                    } else {
                        JdkSrvConfig.getTxtHomeDir().setText(windowsAzureRole
                                .getRuntimeEnv(windowsAzureRole.getRuntimeEnvName(Messages.typeSrvHm)));
                    }
                    // Update note below Server URL text box
                    if (srvSrcPath.isEmpty()) {
                        JdkSrvConfig.getLblDlNoteUrlSrv()
                                .setText(com.persistent.ui.projwizard.Messages.dlgDlNtLblUrl);
                    } else {
                        String dirName = new File(srvSrcPath).getName();
                        JdkSrvConfig.getLblDlNoteUrlSrv()
                                .setText(String.format(com.persistent.ui.projwizard.Messages.dlNtLblDir, dirName));
                    }

                    String srvKey = windowsAzureRole.getServerCloudKey();
                    JdkSrvConfig.setCmbStrgAccSrv(
                            JdkSrvConfig.populateStrgNameAsPerKey(srvKey, JdkSrvConfig.getCmbStrgAccSrv()));
                    if (!thirdServerName.isEmpty()) {
                        String cldSrc = JdkSrvConfig.getThirdPartyServerCloudSrc();
                        // check if its latest server scenario then set storage account to (none)
                        if (!cldSrc.isEmpty() && Activator.IS_WINDOWS) {
                            /*
                             * org.eclipse.swt.widgets.Combo's setItem method
                             * behave weirdly on Linux eclipse.
                             * Hence use only on windows.
                             */
                            JdkSrvConfig.getCmbStrgAccSrv().setItem(0, "(none)");
                        }
                    }
                }
            }
            JdkSrvConfig.checkSDKPresenceAndEnableServer();
        } catch (WindowsAzureInvalidProjectOperationException e) {
            PluginUtil.displayErrorDialogAndLog(getShell(), Messages.srvErrTtl, Messages.getSrvBothErrMsg, e);
        }

        if (JdkSrvConfig.getJdkCheckBtn().getSelection() || JdkSrvConfig.getThrdPrtJdkBtn().getSelection()
                || JdkSrvConfig.getDlRdCldBtn().getSelection()) {
            JdkSrvConfig.getSerCheckBtn().setEnabled(true);
        }

        if (!JdkSrvConfig.getTxtDir().getText().isEmpty()) {
            JdkSrvConfigListener.enforceSameLocalCloudServer();
        }

        if (JdkSrvConfig.getTableViewer() != null) {
            JdkSrvConfig.getTableViewer().refresh();
        }

        if (tabToSelect.equalsIgnoreCase(Messages.dplDlgSerTxt)) {
            folder.setSelection(srvTab);
            prevTabIndex = 1;
        } else {
            folder.setSelection(jdkTab);
            prevTabIndex = 0;
        }
        handlePageComplete();
        return super.getTitle();
    }

    /**
     * Create Server Configuration page and buttons associated with it.
     *
     * @param parent : parent composite.
     * @return control
     */
    @Override
    protected Control createContents(Composite parent) {
        noDefaultAndApplyButton();
        PlatformUI.getWorkbench().getHelpSystem().setHelp(parent,
                "com.persistent.winazure.eclipseplugin." + "windows_azure_serverconfiguration_page");
        waProjManager = Activator.getDefault().getWaProjMgr();
        windowsAzureRole = Activator.getDefault().getWaRole();
        Activator.getDefault().setSaved(false);

        // Tab controls
        folder = new TabFolder(parent, SWT.NONE);

        GridData gridData = new GridData(GridData.FILL_BOTH);
        gridData.grabExcessHorizontalSpace = true;
        gridData.horizontalAlignment = SWT.FILL;
        folder.setLayoutData(gridData);

        // Tab for JDK
        jdkTab = new TabItem(folder, SWT.NONE);
        jdkTab.setText(Messages.dplDlgJDKGrp);
        jdkTab.setControl(createJDK(folder));

        // Tab for Server
        srvTab = new TabItem(folder, SWT.NONE);
        srvTab.setText(Messages.dplDlgSerTxt);
        srvTab.setControl(createServer(folder));

        // Tab for Application
        appTab = new TabItem(folder, SWT.NONE);
        appTab.setText(Messages.lblApp);
        appTab.setControl(createAppTblCmpnt(folder));

        folder.addSelectionListener(new SelectionListener() {

            @Override
            public void widgetDefaultSelected(SelectionEvent arg0) {
            }

            @Override
            public void widgetSelected(SelectionEvent arg0) {
                if (folder.getSelectionIndex() == 0) {
                    changeToJdkTab();
                } else if (folder.getSelectionIndex() == 1) {
                    changeToSrvTab();
                } else if (folder.getSelectionIndex() == 2) {
                    changeToAppTab();
                }
            }
        });

        isPageDisplayed = true;
        return folder;
    }

    private void changeToSrvTab() {
        if (displayLicenseAgreement()) {
            prevTabIndex = 1;
        } else {
            folder.setSelection(jdkTab);
            prevTabIndex = 0;
        }
    }

    private void changeToAppTab() {
        if (prevTabIndex == 0) {
            if (displayLicenseAgreement()) {
                prevTabIndex = 2;
            } else {
                folder.setSelection(jdkTab);
                prevTabIndex = 0;
            }
        } else if (prevTabIndex == 1) {
            // Server to App tab navigation
            if (displayServerLicenseAgreement()) {
                prevTabIndex = 2;
            } else {
                folder.setSelection(srvTab);
                prevTabIndex = 1;
            }
        }
    }

    private void changeToJdkTab() {
        if (displayServerLicenseAgreement()) {
            folder.setSelection(jdkTab);
            prevTabIndex = 0;
        } else {
            folder.setSelection(srvTab);
            prevTabIndex = 1;
        }
    }

    /**
     * Stores properties to remove JDK from approot
     * if JDK path is updated.
     * @throws WindowsAzureInvalidProjectOperationException
     */
    private void handleJdkDirRemoval() throws WindowsAzureInvalidProjectOperationException {
        // deleting JDK entry from approot
        String oldJdkPath = windowsAzureRole.getJDKSourcePath();
        if (oldJdkPath != null && !oldJdkPath.isEmpty() && !fileToDel.contains("jdk")) {
            fileToDel.add("jdk");
            WindowsAzureRoleComponent cmp = getPrevCmpnt(Messages.typeJdkDply);
            if (cmp != null) {
                finalJdkPath = cmp.getImportPath();
            }
        }
    }

    private void handleServerDirRemoval() throws WindowsAzureInvalidProjectOperationException {
        String oldName = windowsAzureRole.getServerName();
        String oldPath = windowsAzureRole.getServerSourcePath();
        // Remove old server from approot
        if (oldName != null && oldPath != null && !oldPath.isEmpty() && !fileToDel.contains("srv")) {
            fileToDel.add("srv");
            WindowsAzureRoleComponent cmp = getPrevCmpnt(Messages.typeSrvDply);
            if (cmp != null) {
                finalSrvPath = cmp.getImportPath();
                finalImpMethod = cmp.getImportMethod();
                finalAsName = cmp.getDeployName();
            }
        }
    }

    /**
     * Creates the JDK component.
     *
     * @param parent Parent container
     * @return Control
     */
    private Control createJDK(Composite parent) {
        Control control = JdkSrvConfig.createJDKGrp(parent);

        // listener for JDK location text box.
        JdkSrvConfig.getTxtJdk().addFocusListener(new FocusListener() {
            @Override
            public void focusLost(FocusEvent arg0) {
                JdkSrvConfig.updateJDKDlNote();
                handlePageComplete();
            }

            @Override
            public void focusGained(FocusEvent arg0) {
            }
        });

        // Modify listener for JDK location text box.
        JdkSrvConfig.getTxtJdk().addModifyListener(new ModifyListener() {
            @Override
            public void modifyText(ModifyEvent arg0) {
                JdkSrvConfigListener.modifyJdkText();
                handlePageComplete();
            }
        });

        // listener for JDK check button.
        JdkSrvConfig.getJdkCheckBtn().addSelectionListener(new SelectionListener() {
            @Override
            public void widgetSelected(SelectionEvent arg0) {
                if (JdkSrvConfig.getJdkCheckBtn().getSelection()) {
                    // populate third party JDKs whose status in not deprecated
                    JdkSrvConfigListener.jdkChkBoxChecked("");
                } else {
                    JdkSrvConfigListener.jdkChkBoxUnChecked();
                }
                handlePageComplete();
            }

            @Override
            public void widgetDefaultSelected(SelectionEvent arg0) {
            }
        });

        // listener for JDK browse button.
        JdkSrvConfig.getBtnJdkLoc().addSelectionListener(new SelectionListener() {
            @Override
            public void widgetSelected(SelectionEvent arg0) {
                jdkBrowseBtnListener();
            }

            @Override
            public void widgetDefaultSelected(SelectionEvent arg0) {
            }
        });

        // JDK download group
        // listener for JDK deploy radio button.
        JdkSrvConfig.getDlRdCldBtn().addSelectionListener(new SelectionListener() {
            @Override
            public void widgetSelected(SelectionEvent arg0) {
                if (JdkSrvConfig.getDlRdCldBtn().getSelection()) {
                    if (!(JdkSrvConfig.getTxtUrl().isEnabled()
                            && WAEclipseHelperMethods.isBlobStorageUrl(JdkSrvConfig.getTxtUrl().getText()))) {
                        JdkSrvConfig.getTxtUrl().setText(JdkSrvConfig.getUrl(JdkSrvConfig.getCmbStrgAccJdk()));
                        JdkSrvConfigListener.jdkDeployBtnSelected();
                    }
                }
                handlePageComplete();
                accepted = false;
            }

            @Override
            public void widgetDefaultSelected(SelectionEvent arg0) {
            }
        });

        // listener for JDK auto upload radio button.
        JdkSrvConfig.getAutoDlRdCldBtn().addSelectionListener(new SelectionListener() {
            @Override
            public void widgetSelected(SelectionEvent arg0) {
                if (JdkSrvConfig.getAutoDlRdCldBtn().getSelection()) {
                    // auto upload radio button selected
                    JdkSrvConfigListener.configureAutoUploadJDKSettings();
                }
                handlePageComplete();
                accepted = false;
            }

            @Override
            public void widgetDefaultSelected(SelectionEvent arg0) {
            }
        });

        // listener for third party JDK radio button.
        JdkSrvConfig.getThrdPrtJdkBtn().addSelectionListener(new SelectionListener() {

            @Override
            public void widgetDefaultSelected(SelectionEvent arg0) {
            }

            @Override
            public void widgetSelected(SelectionEvent arg0) {
                /*
                 * Check if third party radio button
                 * is already selected
                 * and user is selecting same radio button again
                 * then do not do any thing.
                 */
                if (!JdkSrvConfig.getThrdPrtJdkCmb().isEnabled()) {
                    JdkSrvConfigListener.thirdPartyJdkBtnSelected();
                    jdkPrevName = JdkSrvConfig.getThrdPrtJdkCmb().getText();
                }
                JdkSrvConfig.getSerCheckBtn().setEnabled(true);
            }
        });

        // listener for JDK URL text.
        JdkSrvConfig.getTxtUrl().addModifyListener(new ModifyListener() {
            @Override
            public void modifyText(ModifyEvent arg0) {
                if (JdkSrvConfig.getAutoDlRdCldBtn().getSelection()
                        || JdkSrvConfig.getThrdPrtJdkBtn().getSelection()) {
                    handlePageComplete();
                    /*
                     * no need to do any checks if
                     * auto upload or third party JDK is selected
                     */
                    return;
                }
                JdkSrvConfigListener.modifyJdkUrlText();
                handlePageComplete();
            }
        });

        // listener for JAVA_HOME text box.
        JdkSrvConfig.getTxtJavaHome().addModifyListener(new ModifyListener() {
            @Override
            public void modifyText(ModifyEvent arg0) {
                handlePageComplete();
            }
        });

        // listener for Accounts link on JDK tab.
        JdkSrvConfig.getAccLinkJdk().addSelectionListener(new SelectionAdapter() {
            @Override
            public void widgetSelected(SelectionEvent event) {
                JdkSrvConfigListener.jdkAccLinkClicked();
                handlePageComplete();
            }
        });

        // listener for storage account combo box on JDK tab.
        JdkSrvConfig.getCmbStrgAccJdk().addSelectionListener(new SelectionListener() {

            @Override
            public void widgetSelected(SelectionEvent arg0) {
                JdkSrvConfig.updateJDKDlURL();
                handlePageComplete();
            }

            @Override
            public void widgetDefaultSelected(SelectionEvent arg0) {
            }
        });

        // listener for JDK customize link.
        JdkSrvConfig.getThrdPrtJdkLink().addSelectionListener(new SelectionListener() {
            @Override
            public void widgetSelected(SelectionEvent arg0) {
                JdkSrvConfig.custLinkListener(Messages.dplSerBtnTtl, Messages.dplSerBtnMsg, false, getShell(), null,
                        cmpntFile);
            }

            @Override
            public void widgetDefaultSelected(SelectionEvent arg0) {
            }
        });

        // listener for third party JDK combo box.
        JdkSrvConfig.getThrdPrtJdkCmb().addSelectionListener(new SelectionListener() {
            @Override
            public void widgetSelected(SelectionEvent arg0) {
                JdkSrvConfigListener.thirdPartyComboListener();
                /*
                 * If JDK name is changed by user then license
                 * has to be accepted again.
                 */
                String currentName = JdkSrvConfig.getThrdPrtJdkCmb().getText();
                if (!currentName.equalsIgnoreCase(jdkPrevName)) {
                    accepted = false;
                    jdkPrevName = currentName;
                }
            }

            @Override
            public void widgetDefaultSelected(SelectionEvent arg0) {
            }
        });
        return control;
    }

    /**
     * Creates the server components.
     *
     * @param parent Parent container
     * @return Control
     */
    private Control createServer(Composite parent) {
        Control control = JdkSrvConfig.createServerGrp(parent);
        // listener for Server check button.
        JdkSrvConfig.getSerCheckBtn().addSelectionListener(new SelectionListener() {
            @Override
            public void widgetSelected(SelectionEvent arg0) {
                if (JdkSrvConfig.getSerCheckBtn().getSelection()) {
                    JdkSrvConfigListener.srvChkBoxChecked();
                } else {
                    JdkSrvConfigListener.srvChkBoxUnChecked();
                }
                handlePageComplete();
            }

            @Override
            public void widgetDefaultSelected(SelectionEvent arg0) {
            }
        });

        // listener for Server location text box.
        JdkSrvConfig.getTxtDir().addFocusListener(new FocusListener() {
            private String oldTxt = "";

            @Override
            public void focusLost(FocusEvent arg0) {
                String path = null;
                File file = null;
                if (!JdkSrvConfig.getComboServer().getText().isEmpty()
                        && !JdkSrvConfig.getTxtDir().getText().equalsIgnoreCase(oldTxt)) {
                    path = JdkSrvConfig.getTxtDir().getText().trim();
                    file = new File(path);
                    if (file.exists() && file.isDirectory()) {
                        // Server auto-detection
                        String serverName = WAEclipseHelper.detectServer(file);
                        if (serverName != null) {
                            JdkSrvConfig.getComboServer().setText(serverName);
                        } else {
                            String srvComboTxt = JdkSrvConfig.getComboServer().getText();
                            if (srvComboTxt != null && !srvComboTxt.isEmpty()) {
                                serverName = srvComboTxt;
                            }
                        }
                    }
                }
                JdkSrvConfigListener.updateSrvDlNote();
            }

            @Override
            public void focusGained(FocusEvent arg0) {
                oldTxt = JdkSrvConfig.getTxtDir().getText();
            }
        });

        // Modify listener for Server location text box.
        JdkSrvConfig.getTxtDir().addModifyListener(new ModifyListener() {
            @Override
            public void modifyText(ModifyEvent arg0) {
                JdkSrvConfigListener.modifySrvText();
                handlePageComplete();
            }
        });

        // listener for Server browse button.
        JdkSrvConfig.getBtnSrvLoc().addSelectionListener(new SelectionListener() {
            @Override
            public void widgetSelected(SelectionEvent arg0) {
                serBrowseBtnListener();
                JdkSrvConfigListener.modifySrvText();
                JdkSrvConfigListener.enforceSameLocalCloudServer();
                if (JdkSrvConfig.getThrdPrtSrvBtn().getSelection()) {
                    String currentName = JdkSrvConfig.getThrdPrtSrvCmb().getText();
                    if (!currentName.equalsIgnoreCase(srvPrevName)) {
                        srvAccepted = false;
                        srvPrevName = currentName;
                    }
                }
            }

            @Override
            public void widgetDefaultSelected(SelectionEvent arg0) {
            }
        });

        try {
            String[] servList = WindowsAzureProjectManager.getServerTemplateNames(cmpntFile);
            Arrays.sort(servList);
            JdkSrvConfig.getComboServer().setItems(servList);
        } catch (WindowsAzureInvalidProjectOperationException e) {
            PluginUtil.displayErrorDialogAndLog(getShell(), Messages.srvErrTtl, Messages.getSrvNmErrMsg, e);
        }

        // listener for Server type combo box.
        JdkSrvConfig.getComboServer().addSelectionListener(new SelectionListener() {
            @Override
            public void widgetSelected(SelectionEvent arg0) {
                JdkSrvConfigListener.enforceSameLocalCloudServer();
                if (JdkSrvConfig.isSrvAutoUploadChecked()) {
                    JdkSrvConfig.updateServerHome(JdkSrvConfig.getTxtDir().getText());
                } else if (JdkSrvConfig.getThrdPrtSrvBtn().getSelection()) {
                    JdkSrvConfig.updateServerHomeForThirdParty();
                    String currentName = JdkSrvConfig.getThrdPrtSrvCmb().getText();
                    if (!currentName.equalsIgnoreCase(srvPrevName)) {
                        srvAccepted = false;
                        srvPrevName = currentName;
                    }
                } else if (JdkSrvConfig.isSrvDownloadChecked()) {
                    if (JdkSrvConfig.getTxtUrlSrv().getText().isEmpty()) {
                        JdkSrvConfig.updateServerHome(JdkSrvConfig.getTxtDir().getText());
                    } else {
                        JdkSrvConfigListener.modifySrvUrlText();
                    }
                }
                handlePageComplete();
            }

            @Override
            public void widgetDefaultSelected(SelectionEvent arg0) {
            }
        });
        // Modify listener for Server type combo box.
        JdkSrvConfig.getComboServer().addModifyListener(new ModifyListener() {
            @Override
            public void modifyText(ModifyEvent arg0) {
                handlePageComplete();
            }
        });

        // listener for Server customize link.
        JdkSrvConfig.getCustLink().addSelectionListener(new SelectionListener() {
            @Override
            public void widgetSelected(SelectionEvent arg0) {
                JdkSrvConfig.custLinkListener(Messages.dplSerBtnTtl, Messages.dplSerBtnMsg, false, getShell(), null,
                        cmpntFile);
            }

            @Override
            public void widgetDefaultSelected(SelectionEvent arg0) {
            }
        });

        JdkSrvConfig.getThrdPrtSrvLink().addSelectionListener(new SelectionListener() {
            @Override
            public void widgetSelected(SelectionEvent arg0) {
                JdkSrvConfig.custLinkListener(Messages.dplSerBtnTtl, Messages.dplSerBtnMsg, false, getShell(), null,
                        cmpntFile);
            }

            @Override
            public void widgetDefaultSelected(SelectionEvent arg0) {
            }
        });

        // Server download group
        // listener for Server deploy radio button.
        JdkSrvConfig.getDlRdCldBtnSrv().addSelectionListener(new SelectionListener() {
            @Override
            public void widgetSelected(SelectionEvent arg0) {
                if (JdkSrvConfig.getDlRdCldBtnSrv().getSelection()) {
                    if (!(JdkSrvConfig.getTxtUrlSrv().isEnabled()
                            && WAEclipseHelperMethods.isBlobStorageUrl(JdkSrvConfig.getTxtUrlSrv().getText()))) {
                        JdkSrvConfig.getTxtUrlSrv().setText(JdkSrvConfig.getUrl(JdkSrvConfig.getCmbStrgAccSrv()));
                        JdkSrvConfigListener.srvDeployBtnSelected();
                    }
                }
                handlePageComplete();
                srvAccepted = false;
            }

            @Override
            public void widgetDefaultSelected(SelectionEvent arg0) {
            }
        });

        // listener for Server auto radio button.
        JdkSrvConfig.getAutoDlRdCldBtnSrv().addSelectionListener(new SelectionListener() {
            @Override
            public void widgetSelected(SelectionEvent arg0) {
                if (JdkSrvConfig.getAutoDlRdCldBtnSrv().getSelection()) {
                    // server auto upload radio button selected
                    JdkSrvConfigListener.configureAutoUploadServerSettings();
                }
                handlePageComplete();
                srvAccepted = false;
            }

            @Override
            public void widgetDefaultSelected(SelectionEvent arg0) {
            }
        });

        // listener for third party server radio button.
        JdkSrvConfig.getThrdPrtSrvBtn().addSelectionListener(new SelectionListener() {

            @Override
            public void widgetDefaultSelected(SelectionEvent arg0) {
            }

            @Override
            public void widgetSelected(SelectionEvent arg0) {
                /*
                 * Check if third party radio button
                 * is already selected
                 * and user is selecting same radio button again
                 * then do not do any thing.
                 */
                if (!JdkSrvConfig.getThrdPrtSrvCmb().isEnabled()) {
                    JdkSrvConfigListener.thirdPartySrvBtnSelected();
                    srvPrevName = JdkSrvConfig.getThrdPrtSrvCmb().getText();
                }
            }
        });

        // listener for Server URL text box.
        JdkSrvConfig.getTxtUrlSrv().addModifyListener(new ModifyListener() {
            @Override
            public void modifyText(ModifyEvent arg0) {
                if (JdkSrvConfig.getAutoDlRdCldBtnSrv().getSelection()) {
                    handlePageComplete();
                    return;
                }
                JdkSrvConfigListener.modifySrvUrlText();
                handlePageComplete();
            }
        });

        // listener for server home directory text box.
        JdkSrvConfig.getTxtHomeDir().addModifyListener(new ModifyListener() {
            @Override
            public void modifyText(ModifyEvent arg0) {
                handlePageComplete();
            }
        });

        // listener for Accounts link on server tab.
        JdkSrvConfig.getAccLinkSrv().addSelectionListener(new SelectionAdapter() {
            @Override
            public void widgetSelected(SelectionEvent event) {
                JdkSrvConfigListener.srvAccLinkClicked();
                handlePageComplete();
            }
        });

        // listener for storage account combo box on server tab.
        JdkSrvConfig.getCmbStrgAccSrv().addSelectionListener(new SelectionListener() {

            @Override
            public void widgetSelected(SelectionEvent arg0) {
                JdkSrvConfig.updateServerDlURL();
                if (JdkSrvConfig.isSrvAutoUploadChecked()) {
                    JdkSrvConfig.updateServerHome(JdkSrvConfig.getTxtDir().getText());
                } else if (JdkSrvConfig.getThrdPrtSrvBtn().getSelection()) {
                    JdkSrvConfig.updateServerHomeForThirdParty();
                } else if (JdkSrvConfig.isSrvDownloadChecked()) {
                    String url = JdkSrvConfig.getTxtUrlSrv().getText().trim();
                    if (WAEclipseHelperMethods.isBlobStorageUrl(url) && url.endsWith(".zip")) {
                        url = url.substring(0, url.indexOf(".zip"));
                        JdkSrvConfig.updateServerHome(url);
                    } else {
                        JdkSrvConfig.updateServerHome("");
                    }
                }
                handlePageComplete();
            }

            @Override
            public void widgetDefaultSelected(SelectionEvent arg0) {
            }
        });

        // listener for third party JDK combo box.
        JdkSrvConfig.getThrdPrtSrvCmb().addSelectionListener(new SelectionListener() {
            @Override
            public void widgetSelected(SelectionEvent arg0) {
                JdkSrvConfigListener.thirdPartySrvComboListener();
                /*
                 * If server name is changed by user then license
                 * has to be accepted again.
                 */
                String currentName = JdkSrvConfig.getThrdPrtSrvCmb().getText();
                if (!currentName.equalsIgnoreCase(srvPrevName)) {
                    srvAccepted = false;
                    srvPrevName = currentName;
                }
            }

            @Override
            public void widgetDefaultSelected(SelectionEvent arg0) {
            }
        });

        return control;
    }

    private void handleEndpointSettings(String srvName) {
        try {
            String srvPriPort = WindowsAzureProjectManager.getHttpPort(srvName, cmpntFile);
            // Check server's private port already used on role
            int count = 0;
            WindowsAzureEndpoint endptWithPort = null;
            for (WindowsAzureEndpoint endpoint : windowsAzureRole.getEndpoints()) {
                String priPort = endpoint.getPrivatePort();
                if (priPort != null && priPort.equalsIgnoreCase(srvPriPort)) {
                    count++;
                    endptWithPort = endpoint;
                }
            }

            if (count == 0) {
                // server's private port is not used
                WindowsAzureEndpoint sslEndpt = windowsAzureRole.getSslOffloadingInternalEndpoint();
                WindowsAzureEndpoint stickyEndpt = windowsAzureRole.getSessionAffinityInternalEndpoint();
                if (sslEndpt != null) {
                    sslEndpt.setPrivatePort(srvPriPort);
                } else if (stickyEndpt != null) {
                    stickyEndpt.setPrivatePort(srvPriPort);
                } else {
                    checkForHttpElseAddEndpt(srvPriPort);
                }
            } else if (count == 1
                    && endptWithPort.getEndPointType().equals(WindowsAzureEndpointType.InstanceInput)) {
                // one endpoint is using server's private port
                checkForHttpElseAddEndpt(srvPriPort);
            }
            /*
             * If two endpoints of type Input and InstanceInput
             * are using server's private port then don't do anything
             */
        } catch (WindowsAzureInvalidProjectOperationException e) {
            PluginUtil.displayErrorDialogAndLog(getShell(), Messages.srvErrTtl, Messages.errSrvPort, e);
        }
    }

    private void checkForHttpElseAddEndpt(String srvPriPort) {
        try {
            WindowsAzureEndpoint httpEndpt = WAEclipseHelperMethods.findEndpointWithPubPortWithAuto(HTTP_PORT,
                    windowsAzureRole);
            if (httpEndpt != null) {
                httpEndpt.setPrivatePort(srvPriPort);
            } else {
                WindowsAzureRole httpRole = WAEclipseHelperMethods.findRoleWithEndpntPubPort(HTTP_PORT,
                        waProjManager);
                if (httpRole != null) {
                    MessageDialog.openWarning(this.getShell(), com.persistent.util.Messages.cmhLblSrvCnfg,
                            String.format(Messages.srvPortWarn, httpRole.getName()));
                } else {
                    // create an endpoint
                    windowsAzureRole = WAServerConfUtilMethods.addEndpt(srvPriPort, windowsAzureRole);
                }
            }
        } catch (WindowsAzureInvalidProjectOperationException e) {
            PluginUtil.displayErrorDialogAndLog(getShell(), Messages.srvErrTtl, Messages.errSrvPort, e);
        }
    }

    /**
     * Creates the application table component.
     * @param parent : container
     * @return Control
     */
    private Control createAppTblCmpnt(Composite parent) {
        Control control = JdkSrvConfig.createAppTbl(parent);
        // set different height and width for server configuration page.
        GridData gridData = new GridData();
        gridData.heightHint = 380;
        gridData.horizontalIndent = 2;
        gridData.horizontalAlignment = SWT.FILL;
        gridData.grabExcessHorizontalSpace = true;
        JdkSrvConfig.getTblApp().setLayoutData(gridData);
        JdkSrvConfig.getColName().setWidth(400);

        JdkSrvConfig.getTableViewer().setContentProvider(new IStructuredContentProvider() {
            @Override
            public void inputChanged(Viewer arg0, Object arg1, Object arg2) {
            }

            @Override
            public void dispose() {
            }

            @Override
            public Object[] getElements(Object arg0) {
                List<WindowsAzureRoleComponent> srvApp1 = null;
                // Get previously added sever applications
                try {
                    srvApp1 = windowsAzureRole.getServerApplications();
                } catch (WindowsAzureInvalidProjectOperationException e) {
                    PluginUtil.displayErrorDialogAndLog(getShell(), Messages.srvErrTtl, Messages.getSrvAppErrMsg,
                            e);
                }
                /* Display existing server
                 * applications in Applications table
                 */
                ArrayList<String> appNames = new ArrayList<String>();
                for (int i = 0; i < srvApp1.size(); i++) {
                    WindowsAzureRoleComponent cmpnt = srvApp1.get(i);
                    appNames.add(cmpnt.getDeployName());
                }
                return (appNames.toArray());
            }
        });

        JdkSrvConfig.getTableViewer().setLabelProvider(new ITableLabelProvider() {

            @Override
            public void removeListener(ILabelProviderListener arg0) {

            }

            @Override
            public boolean isLabelProperty(Object arg0, String arg1) {
                return false;
            }

            @Override
            public void dispose() {

            }

            @Override
            public void addListener(ILabelProviderListener arg0) {

            }

            @Override
            public String getColumnText(Object element, int colIndex) {
                String result = "";
                if (colIndex == 0) {
                    result = element.toString();
                }
                return result;
            }

            @Override
            public Image getColumnImage(Object arg0, int arg1) {
                return null;
            }
        });

        try {
            JdkSrvConfig.getTableViewer().setInput(windowsAzureRole.getServerApplications());
        } catch (WindowsAzureInvalidProjectOperationException e) {
            PluginUtil.displayErrorDialogAndLog(getShell(), Messages.srvErrTtl, Messages.getSrvAppErrMsg, e);
        }

        // Add selection listener for Add Button
        JdkSrvConfig.getBtnAdd().addSelectionListener(new SelectionListener() {

            @Override
            public void widgetSelected(SelectionEvent arg0) {
                addButtonListener();
            }

            @Override
            public void widgetDefaultSelected(SelectionEvent arg0) {
            }
        });

        /* Enable remove button only when
         * entry from table is selected.
         */
        JdkSrvConfig.getTblApp().addSelectionListener(new SelectionListener() {

            @Override
            public void widgetSelected(SelectionEvent event) {
                JdkSrvConfig.getBtnRemove().setEnabled(true);
            }

            @Override
            public void widgetDefaultSelected(SelectionEvent event) {

            }
        });

        // Add selection listener for Remove Button
        JdkSrvConfig.getBtnRemove().addSelectionListener(new SelectionListener() {
            @Override
            public void widgetSelected(SelectionEvent arg0) {
                removeButtonListener();
            }

            @Override
            public void widgetDefaultSelected(SelectionEvent arg0) {

            }
        });
        return control;
    }

    @Override
    public boolean okToLeave() {
        boolean okToProceed = false;
        okToProceed = handlePageComplete();
        if (okToProceed) {
            /*
             * Check if third party JDK is selected
             * then license is accepted or not.
             */
            boolean tempAccepted = true;
            if (JdkSrvConfig.getThrdPrtJdkBtn().getSelection() && !accepted) {
                tempAccepted = JdkSrvConfig.createAccLicenseAggDlg(getShell(), true);
                accepted = tempAccepted;
            }
            if (tempAccepted) {
                okToProceed = configureJdkCloudDeployment();
            } else {
                okToProceed = false;
            }

            if (okToProceed) {
                if (JdkSrvConfig.getThrdPrtSrvBtn().getSelection() && !srvAccepted) {
                    tempAccepted = JdkSrvConfig.createAccLicenseAggDlg(getShell(), false);
                    srvAccepted = tempAccepted;
                }
                if (tempAccepted) {
                    okToProceed = configureSrvCloudDeployment();
                } else {
                    okToProceed = false;
                }
            }
        }
        boolean retVal = false;
        if (okToProceed) {
            retVal = super.okToLeave();
        }
        return retVal;
    }

    /**
     * Method will check every entry
     * server configuration page has valid value
     * or not. If invalid then will show proper error message.
     * @return
     */
    private boolean handlePageComplete() {
        boolean okToProceed = false;
        boolean isJdkValid = true;
        boolean isSrvValid = true;
        // Validation for JDK
        if (JdkSrvConfig.getJdkCheckBtn().getSelection()) {
            if (JdkSrvConfig.getTxtJdk().getText().isEmpty()) {
                isJdkValid = false;
                setErrorMessage(Messages.jdkPathErrMsg);
            } else {
                File file = new File(JdkSrvConfig.getTxtJdk().getText());
                if (!file.exists() || !file.isDirectory()) {
                    isJdkValid = false;
                    setErrorMessage(Messages.jdkPathErrMsg);
                }
            }
        }
        // JDK download group
        // cloud radio button selected
        if (isJdkValid) {
            if (JdkSrvConfig.getDlRdCldBtn().getSelection()) {
                // Validate JDK URL
                String jdkUrl = JdkSrvConfig.getTxtUrl().getText().trim();
                if (jdkUrl.isEmpty()) {
                    isJdkValid = false;
                    setErrorMessage(Messages.dlgDlUrlErrMsg);
                } else {
                    try {
                        new URL(jdkUrl);
                        if (WAEclipseHelperMethods.isBlobStorageUrl(jdkUrl)) {
                            String javaHome = JdkSrvConfig.getTxtJavaHome().getText().trim();
                            if (javaHome.isEmpty()) {
                                isJdkValid = false;
                                setErrorMessage(Messages.jvHomeErMsg);
                            } else {
                                /*
                                 * access key is optional,
                                 * so can be empty.
                                 */
                                isJdkValid = true;
                                setErrorMessage(null);
                            }
                        } else {
                            isJdkValid = false;
                            setErrorMessage(Messages.dlgDlUrlErrMsg);
                        }
                    } catch (MalformedURLException e) {
                        isJdkValid = false;
                        setErrorMessage(Messages.dlgDlUrlErrMsg);
                    }
                }
            }
            // No Validation needed if auto upload or third party
            // JDK is selected
            // local radio button selected
            else {
                isJdkValid = true;
                setErrorMessage(null);
            }
        }

        // Validation for Server
        if (isJdkValid && JdkSrvConfig.getSerCheckBtn().getSelection()) {
            if (JdkSrvConfig.getComboServer().getText().isEmpty()) {
                setErrorMessage(Messages.dplEmtSerMsg);
                isSrvValid = false;
            } else if (JdkSrvConfig.getAutoDlRdCldBtnSrv().getSelection()
                    && JdkSrvConfig.getTxtDir().getText().isEmpty()) {
                setErrorMessage(Messages.dplWrngSerMsg);
                isSrvValid = false;
            } else if (!JdkSrvConfig.getTxtDir().getText().isEmpty()
                    && !(new File(JdkSrvConfig.getTxtDir().getText()).exists())) {
                setErrorMessage(Messages.dplWrngSerMsg);
                isSrvValid = false;
            } else {
                // Server download group
                if (JdkSrvConfig.getDlRdCldBtnSrv().getSelection()) {
                    String srvUrl = JdkSrvConfig.getTxtUrlSrv().getText().trim();
                    if (srvUrl.isEmpty()) {
                        isSrvValid = false;
                        setErrorMessage(Messages.dlgDlUrlErrMsg);
                    } else {
                        try {
                            // Validate Server URL
                            new URL(srvUrl);
                            if (WAEclipseHelperMethods.isBlobStorageUrl(srvUrl)) {
                                String srvHome = JdkSrvConfig.getTxtHomeDir().getText().trim();
                                if (srvHome.isEmpty()) {
                                    isSrvValid = false;
                                    setErrorMessage(Messages.srvHomeErMsg);
                                } else {
                                    /*
                                     * access key is optional,
                                     * so can be empty.
                                     */
                                    isSrvValid = true;
                                    setErrorMessage(null);
                                }
                            } else {
                                isSrvValid = false;
                                setErrorMessage(Messages.dlgDlUrlErrMsg);
                            }
                        } catch (MalformedURLException e) {
                            isSrvValid = false;
                            setErrorMessage(Messages.dlgDlUrlErrMsg);
                        }
                    }
                }
                // No validations if auto upload Server is selected
                // local radio button selected
                else {
                    isSrvValid = true;
                    setErrorMessage(null);
                }
            }
        }
        if (isJdkValid && isSrvValid) {
            setErrorMessage(null);
            okToProceed = true;
        }
        return okToProceed;
    }

    @Override
    public boolean performOk() {
        if (!isPageDisplayed) {
            return super.performOk();
        }
        boolean okToProceed = false;
        boolean isJdkValid = true;
        boolean isSrvValid = true;
        // Validation for JDK
        if (JdkSrvConfig.getJdkCheckBtn().getSelection()) {
            if (JdkSrvConfig.getTxtJdk().getText().isEmpty()) {
                isJdkValid = false;
                PluginUtil.displayErrorDialogAndLog(getShell(), Messages.jdkPathErrTtl, Messages.jdkPathErrMsg,
                        null);
            } else {
                File file = new File(JdkSrvConfig.getTxtJdk().getText());
                if (!file.exists() || !file.isDirectory()) {
                    isJdkValid = false;
                    PluginUtil.displayErrorDialogAndLog(getShell(), Messages.jdkPathErrTtl, Messages.jdkPathErrMsg,
                            null);
                }
            }
        }
        // JDK download group
        // If scenario is "No deployment" then no validation
        boolean isJdkNoDply = JdkSrvConfig.getAutoDlRdCldBtn().getSelection()
                && !JdkSrvConfig.getJdkCheckBtn().getSelection();
        if (isJdkValid) {
            if (!isJdkNoDply) {
                String jdkUrl = JdkSrvConfig.getTxtUrl().getText().trim();
                if (jdkUrl.isEmpty()) {
                    isJdkValid = false;
                    PluginUtil.displayErrorDialog(getShell(), Messages.dlgDlUrlErrTtl, Messages.dlgDlUrlErrMsg);
                } else {
                    Boolean isUrlValid = false;
                    // JDK auto upload or third party option selected.
                    if (JdkSrvConfig.getAutoDlRdCldBtn().getSelection()
                            || JdkSrvConfig.getThrdPrtJdkBtn().getSelection()) {
                        if (jdkUrl.equalsIgnoreCase(JdkSrvConfig.AUTO_TXT)) {
                            jdkUrl = auto;
                        }
                        isUrlValid = true;
                    } else {
                        // JDK cloud option selected
                        try {
                            new URL(jdkUrl);
                            if (WAEclipseHelperMethods.isBlobStorageUrl(jdkUrl)) {
                                isUrlValid = true;
                            } else {
                                PluginUtil.displayErrorDialog(getShell(), Messages.dlgDlUrlErrTtl,
                                        Messages.dlgDlUrlErrMsg);
                            }
                        } catch (MalformedURLException e) {
                            PluginUtil.displayErrorDialog(getShell(), Messages.dlgDlUrlErrTtl,
                                    Messages.dlgDlUrlErrMsg);
                        }
                    }
                    if (isUrlValid) {
                        String javaHome = JdkSrvConfig.getTxtJavaHome().getText().trim();
                        if (javaHome.isEmpty()) {
                            isJdkValid = false;
                            PluginUtil.displayErrorDialog(getShell(), Messages.genErrTitle, Messages.jvHomeErMsg);
                        } else {
                            boolean tempAccepted = true;
                            if (JdkSrvConfig.getThrdPrtJdkBtn().getSelection() && !accepted) {
                                tempAccepted = JdkSrvConfig.createAccLicenseAggDlg(getShell(), true);
                                accepted = tempAccepted;
                            }
                            if (tempAccepted) {
                                isJdkValid = configureJdkCloudDeployment();
                            } else {
                                isJdkValid = false;
                            }
                        }
                    } else {
                        isJdkValid = false;
                    }
                }
            } else {
                isJdkValid = configureJdkCloudDeployment();
            }
        }

        // Validation for Server
        if (isJdkValid) {
            if (JdkSrvConfig.getSerCheckBtn().getSelection()) {
                if (JdkSrvConfig.getComboServer().getText().isEmpty()) {
                    isSrvValid = false;
                    PluginUtil.displayErrorDialogAndLog(getShell(), Messages.srvErrTtl, Messages.dplEmtSerMsg,
                            null);
                } else if (JdkSrvConfig.getAutoDlRdCldBtnSrv().getSelection()
                        && JdkSrvConfig.getTxtDir().getText().isEmpty()) {
                    isSrvValid = false;
                    PluginUtil.displayErrorDialogAndLog(getShell(), Messages.srvErrTtl, Messages.dplWrngSerMsg,
                            null);
                } else if (!JdkSrvConfig.getTxtDir().getText().isEmpty()
                        && (!new File(JdkSrvConfig.getTxtDir().getText()).exists()
                                || !new File(JdkSrvConfig.getTxtDir().getText()).isAbsolute())) {
                    isSrvValid = false;
                    PluginUtil.displayErrorDialogAndLog(getShell(), Messages.srvErrTtl, Messages.dplWrngSerMsg,
                            null);
                } else {
                    // Validate Server URL
                    String srvUrl = JdkSrvConfig.getTxtUrlSrv().getText().trim();
                    if (srvUrl.isEmpty()) {
                        isSrvValid = false;
                        PluginUtil.displayErrorDialog(getShell(), Messages.dlgDlUrlErrTtl, Messages.dlgDlUrlErrMsg);
                    } else {
                        Boolean isSrvUrlValid = false;
                        // Server auto upload option selected.
                        if (JdkSrvConfig.getAutoDlRdCldBtnSrv().getSelection()
                                || JdkSrvConfig.getThrdPrtSrvBtn().getSelection()) {
                            if (srvUrl.equalsIgnoreCase(JdkSrvConfig.AUTO_TXT)) {
                                srvUrl = auto;
                            }
                            isSrvUrlValid = true;
                        } else {
                            // Server cloud option selected
                            try {
                                new URL(srvUrl);
                                if (WAEclipseHelperMethods.isBlobStorageUrl(srvUrl)) {
                                    isSrvUrlValid = true;
                                } else {
                                    PluginUtil.displayErrorDialog(getShell(), Messages.dlgDlUrlErrTtl,
                                            Messages.dlgDlUrlErrMsg);
                                }
                            } catch (MalformedURLException e) {
                                PluginUtil.displayErrorDialog(getShell(), Messages.dlgDlUrlErrTtl,
                                        Messages.dlgDlUrlErrMsg);
                            }
                        }
                        if (isSrvUrlValid) {
                            String srvHome = JdkSrvConfig.getTxtHomeDir().getText().trim();
                            if (srvHome.isEmpty()) {
                                isSrvValid = false;
                                PluginUtil.displayErrorDialog(getShell(), Messages.genErrTitle,
                                        Messages.srvHomeErMsg);
                            } else {
                                boolean tempAccepted = true;
                                if (JdkSrvConfig.getThrdPrtSrvBtn().getSelection() && !srvAccepted) {
                                    tempAccepted = JdkSrvConfig.createAccLicenseAggDlg(getShell(), false);
                                    srvAccepted = tempAccepted;
                                }
                                if (tempAccepted) {
                                    isSrvValid = configureSrvCloudDeployment();
                                } else {
                                    isSrvValid = false;
                                }
                            }
                        } else {
                            isSrvValid = false;
                        }
                    }
                }
            } else {
                isSrvValid = configureSrvCloudDeployment();
            }
        }

        if (isJdkValid && isSrvValid) {
            okToProceed = true;
            Activator.getDefault().setSaved(false);
        }
        if (okToProceed) {
            try {
                if (!Activator.getDefault().isSaved()) {
                    waProjManager.save();
                    /*
                     * Delete files from approot,
                     * whose entry from component table is removed.
                     */
                    if (!fileToDel.isEmpty()) {
                        for (int i = 0; i < fileToDel.size(); i++) {
                            String str = fileToDel.get(i);
                            if (str.equalsIgnoreCase("jdk")) {
                                deleteJdkDir();
                            } else if (str.equalsIgnoreCase("srv")) {
                                deleteServerFile();
                            } else {
                                File file = new File(str);
                                if (file.exists()) {
                                    file.delete();
                                }
                            }
                        }
                    }
                    fileToDel.clear();
                    Activator.getDefault().setSaved(true);
                }
                WAEclipseHelper.refreshWorkspace(Messages.rfrshErrTtl, Messages.rfrshErrMsg);
                okToProceed = super.performOk();
            } catch (WindowsAzureInvalidProjectOperationException e) {
                okToProceed = false;
                PluginUtil.displayErrorDialogAndLog(getShell(), Messages.adRolErrTitle,
                        Messages.adRolErrMsgBox1 + Messages.adRolErrMsgBox2, e);
            }
        }
        return okToProceed;
    }

    /**
     * Method configures cloud deployment for JDK
     * by saving URL, key and cloud method.
     * @param jdkUrl
     * @param javaHome
     * @return
     */
    private boolean configureJdkCloudDeployment() {
        boolean isValid = true;
        Combo jdkCmb = JdkSrvConfig.getCmbStrgAccJdk();
        String jdkPath = JdkSrvConfig.getTxtJdk().getText().trim();
        String jdkUrl = JdkSrvConfig.getTxtUrl().getText().trim();
        String javaHome = JdkSrvConfig.getTxtJavaHome().getText().trim();
        String jdkName = JdkSrvConfig.getThrdPrtJdkCmb().getText();
        try {
            handleJdkDirRemoval();
            handleServerDirRemoval();

            windowsAzureRole = WAServerConfUtilMethods.removeJavaHomeSettings(windowsAzureRole, waProjManager);
            windowsAzureRole.setJDKCloudName(null);
            windowsAzureRole.setJDKSourcePath(null, cmpntFile, "");

            if (!(!JdkSrvConfig.getJdkCheckBtn().getSelection()
                    && JdkSrvConfig.getAutoDlRdCldBtn().getSelection())) {
                if (JdkSrvConfig.getThrdPrtJdkBtn().getSelection()) {
                    windowsAzureRole.setJDKSourcePath(jdkPath, cmpntFile, jdkName);
                } else {
                    windowsAzureRole.setJDKSourcePath(jdkPath, cmpntFile, "");
                }
                // JDK download group
                // By default auto upload will be selected.
                if (JdkSrvConfig.getAutoDlRdCldBtn().getSelection()
                        || JdkSrvConfig.getThrdPrtJdkBtn().getSelection()) {
                    if (jdkUrl.equalsIgnoreCase(JdkSrvConfig.AUTO_TXT)) {
                        jdkUrl = auto;
                    }
                    if (JdkSrvConfig.getThrdPrtJdkBtn().getSelection()) {
                        windowsAzureRole.setJDKCloudName(jdkName);
                    }
                    windowsAzureRole.setJDKCloudUploadMode(WARoleComponentCloudUploadMode.auto);
                }
                windowsAzureRole.setJDKCloudURL(jdkUrl);
                windowsAzureRole.setJDKCloudKey(JdkSrvConfig.getAccessKey(jdkCmb));
                updateJavaHomeAsPerPackageType(javaHome);
            }
        } catch (WindowsAzureInvalidProjectOperationException e) {
            isValid = false;
            PluginUtil.displayErrorDialogAndLog(getShell(), Messages.genErrTitle, Messages.urlKeySetErrMsg, e);
        }
        return isValid;
    }

    /**
     * Method configures cloud deployment for server
     * by saving URL, key and cloud method.
     * @param srvUrl
     * @param srvHome
     * @return
     */
    private boolean configureSrvCloudDeployment() {
        boolean isValid = true;
        Combo srvCmb = JdkSrvConfig.getCmbStrgAccSrv();
        String srvPath = JdkSrvConfig.getTxtDir().getText();
        String srvUrl = JdkSrvConfig.getTxtUrlSrv().getText();
        String srvHome = JdkSrvConfig.getTxtHomeDir().getText();
        String srvName = JdkSrvConfig.getServerName();
        try {
            windowsAzureRole = WAServerConfUtilMethods.removeServerHomeSettings(windowsAzureRole, waProjManager);
            windowsAzureRole.setServerCloudName(null);
            windowsAzureRole.setServer(null, "", cmpntFile);

            if (JdkSrvConfig.getSerCheckBtn().getSelection()) {
                if (!srvName.isEmpty()) {
                    // if its latest server scenario, then don't set cloudkey
                    // it should be public download
                    boolean setKey = true;
                    handleEndpointSettings(srvName);
                    windowsAzureRole.setServer(srvName, srvPath, cmpntFile);
                    // JDK download group
                    // By default auto upload will be selected.
                    if (JdkSrvConfig.getAutoDlRdCldBtnSrv().getSelection()
                            || JdkSrvConfig.getThrdPrtSrvBtn().getSelection()) {
                        if (srvUrl.equalsIgnoreCase(JdkSrvConfig.AUTO_TXT)) {
                            srvUrl = auto;
                        }
                        if (JdkSrvConfig.getThrdPrtSrvBtn().getSelection()) {
                            String altSrcUrl = JdkSrvConfig.getServerCloudAltSource();
                            if (altSrcUrl.isEmpty()) {
                                setKey = false;
                            } else {
                                windowsAzureRole.setServerCldAltSrc(altSrcUrl);
                                windowsAzureRole.setServerCloudUploadMode(WARoleComponentCloudUploadMode.auto);
                            }
                            windowsAzureRole.setServerCloudName(JdkSrvConfig.getThrdPrtSrvCmb().getText());
                            windowsAzureRole.setServerCloudValue(srvHome);
                        } else {
                            windowsAzureRole.setServerCloudUploadMode(WARoleComponentCloudUploadMode.auto);
                        }
                    }
                    windowsAzureRole.setServerCloudURL(srvUrl);
                    if (setKey) {
                        windowsAzureRole.setServerCloudKey(JdkSrvConfig.getAccessKey(srvCmb));
                    }
                    updateServerHomeAsPerPackageType(srvHome);
                }
            }
        } catch (WindowsAzureInvalidProjectOperationException e) {
            isValid = false;
            PluginUtil.displayErrorDialogAndLog(getShell(), Messages.genErrTitle, Messages.urlKeySetErMsgSrv, e);
        }
        return isValid;
    }

    /**
     * Listener for browse button it is used in file system button.
     * It will open the file system location.
     */
    private void jdkBrowseBtnListener() {
        JdkSrvConfig.utilJdkBrowseBtnListener();
    }

    /**
     * Listener for browse button it is used in file system button.
     * It will open the file system location.
     */
    private void serBrowseBtnListener() {
        JdkSrvConfig.utilSerBrowseBtnListener();
    }

    /**
     * To Add the application to the application list.
     * @param src : import source location
     * @param name : import as name
     * @param method : import method
     */
    public void addToAppList(String src, String name, String method) {
        AppCmpntParam param = new AppCmpntParam();
        param.setImpSrc(src);
        param.setImpAs(name);
        param.setImpMethod(method);
        appList.add(param);
    }

    /**
     * @return list of added application AsNames
     * which is to be set in application table.
     */
    public ArrayList<String> getAppsAsNames() {
        ArrayList<String> list = new ArrayList<String>();
        for (int i = 0; i < appList.size(); i++) {
            list.add(appList.get(i).getImpAs());
        }
        return list;
    }

    /**
     * @return appList
     */
    public ArrayList<AppCmpntParam> getAppsList() {
        return appList;
    }

    /**
     * Add Application button listener.
     */
    private void addButtonListener() {
        WAApplicationDialog dialog = new WAApplicationDialog(getShell(), null, windowsAzureRole, this);
        dialog.open();
        List<WindowsAzureRoleComponent> srvApp = null;
        try {
            if (!getAppsAsNames().isEmpty()) {
                AppCmpntParam app = getAppsList().get(getAppsList().size() - 1);
                String impSrc = app.getImpSrc();
                String impAs = app.getImpAs();

                try {
                    srvApp = windowsAzureRole.getServerApplications();
                } catch (WindowsAzureInvalidProjectOperationException e) {
                    PluginUtil.displayErrorDialogAndLog(getShell(), Messages.srvErrTtl, Messages.getSrvAppErrMsg,
                            e);
                }
                String approotPathSubStr = String.format("%s%s%s%s", WAEclipseHelper.getSelectedProject().getName(),
                        File.separator, windowsAzureRole.getName(), Messages.approot);
                boolean needCldAttr = true;
                if (impSrc.contains(approotPathSubStr)) {
                    needCldAttr = false;
                }
                if (srvApp.size() == 0) {
                    windowsAzureRole.addServerApplication(impSrc, impAs, app.getImpMethod(), cmpntFile,
                            needCldAttr);
                } else {
                    boolean isExist = false;
                    for (int i = 0; i < srvApp.size(); i++) {
                        WindowsAzureRoleComponent c = srvApp.get(i);
                        if (impAs.equalsIgnoreCase(c.getDeployName())
                                && impSrc.equalsIgnoreCase(c.getImportPath())) {
                            isExist = true;
                            break;
                        }
                    }
                    if (!isExist) {
                        windowsAzureRole.addServerApplication(impSrc, impAs, app.getImpMethod(), cmpntFile,
                                needCldAttr);
                    }
                }
            }
            JdkSrvConfig.getTableViewer().refresh();
        } catch (WindowsAzureInvalidProjectOperationException e) {
            PluginUtil.displayErrorDialogAndLog(getShell(), Messages.srvErrTtl, Messages.addSrvAppErrMsg, e);
        }
    }

    /**
     * Remove application button listener.
     */
    private void removeButtonListener() {
        int selIndex = JdkSrvConfig.getTableViewer().getTable().getSelectionIndex();
        if (selIndex > -1) {
            try {
                boolean choice = MessageDialog.openQuestion(getShell(), Messages.appRmvTtl, Messages.appRmvMsg);
                if (choice) {
                    String cmpntName = JdkSrvConfig.getTableViewer().getTable().getItem(selIndex).getText()
                            .toString();
                    String cmpntPath = String.format("%s%s%s%s%s",
                            root.getProject(waProjManager.getProjectName()).getLocation(), File.separator,
                            windowsAzureRole.getName(), Messages.approot, cmpntName);
                    windowsAzureRole.removeServerApplication(cmpntName);
                    if (!fileToDel.contains(cmpntPath)) {
                        fileToDel.add(cmpntPath);
                    }
                    JdkSrvConfig.getTableViewer().refresh();
                    JdkSrvConfigListener.disableRemoveButton();
                }
            } catch (Exception e) {
                PluginUtil.displayErrorDialogAndLog(getShell(), Messages.srvErrTtl, Messages.rmvSrvAppErrMsg, e);
            }
        }
    }

    /**
     * To delete jdk directory which is present inside approot
     * if JDK source path is modified.
     */
    private void deleteJdkDir() {
        String jdkPath = "";
        try {
            String jdkDirName = new File(finalJdkPath).getName();
            jdkPath = String.format("%s%s%s%s%s", root.getProject(waProjManager.getProjectName()).getLocation(),
                    File.separator, windowsAzureRole.getName(), Messages.approot, jdkDirName);
        } catch (WindowsAzureInvalidProjectOperationException e1) {
            PluginUtil.displayErrorDialogAndLog(getShell(), Messages.jdkPathErrTtl, Messages.jdkDirErrMsg, e1);
        }
        File jdkFile = new File(jdkPath);
        if (jdkFile.exists()) {
            WAEclipseHelperMethods.deleteDirectory(jdkFile);
            WAEclipseHelper.refreshWorkspace(Messages.rfrshErrTtl, Messages.rfrshErrMsg);
        }
    }

    /**
     *  To delete zip file or directory of
     *  server which is present inside approot
     *  if server name or source path is modified.
     */
    private void deleteServerFile() {
        File srvFile = null;
        try {
            srvFile = new File(
                    String.format("%s%s%s%s%s", root.getProject(waProjManager.getProjectName()).getLocation(),
                            File.separator, windowsAzureRole.getName(), Messages.approot,
                            ProjectNatureHelper.getAsName(finalSrvPath, finalImpMethod, finalAsName)));
        } catch (WindowsAzureInvalidProjectOperationException e) {
            PluginUtil.displayErrorDialogAndLog(getShell(), Messages.genErrTitle, Messages.srvFileErr, e);
        }
        if (srvFile.exists()) {
            if (srvFile.isFile()) {
                srvFile.delete();
            } else if (srvFile.isDirectory()) {
                WAEclipseHelperMethods.deleteDirectory(srvFile);
            }
            WAEclipseHelper.refreshWorkspace(Messages.rfrshErrTtl, Messages.rfrshErrMsg);
        }
    }

    /**
     * Method returns component object according to component type.
     * If component not present then returns NULL.
     * @param cmpntType
     * @return WindowsAzureRoleComponent
     */
    private WindowsAzureRoleComponent getPrevCmpnt(String cmpntType) {
        WindowsAzureRoleComponent cmp = null;
        try {
            cmp = WAServerConfUtilMethods.getPrevCmpnt(cmpntType, windowsAzureRole);
        } catch (WindowsAzureInvalidProjectOperationException e) {
            PluginUtil.displayErrorDialogAndLog(getShell(), Messages.cmpntSetErrTtl, Messages.cmpntgetErrMsg, e);
        }
        return cmp;
    }

    /**
     * Method updates java home,
     * according to current package type.
     * Method will get called when user click
     * on OK button or tries to navigate to other page.
     * @param javaHome
     */
    private void updateJavaHomeAsPerPackageType(String javaHome) {
        try {
            windowsAzureRole = WAServerConfUtilMethods.updateJavaHome(javaHome, windowsAzureRole, waProjManager,
                    JdkSrvConfig.getTxtJdk().getText().trim(), cmpntFile);
        } catch (Exception e) {
            PluginUtil.displayErrorDialogAndLog(getShell(), Messages.genErrTitle, Messages.jvHomeErr, e);
        }
    }

    /**
     * Method updates server home,
     * according to current package type.
     * Method will get called when user click
     * on OK button or tries to navigate to other page.
     * @param srvHome
     */
    private void updateServerHomeAsPerPackageType(String srvHome) {
        try {
            windowsAzureRole = WAServerConfUtilMethods.updateServerHome(srvHome, windowsAzureRole, waProjManager,
                    JdkSrvConfig.getTxtDir().getText().trim(), JdkSrvConfig.getServerName(), cmpntFile);
        } catch (Exception e) {
            PluginUtil.displayErrorDialogAndLog(getShell(), Messages.genErrTitle, Messages.srvHomeErr, e);
        }
    }

    /**
     * If user is trying to move from JDK tab
     * and third party JDK is selected
     * but license is not accepted till now
     * then show license agreement dialog.
     * @return boolean
     * true : license accepted
     * false : license not accepted
     */
    private boolean displayLicenseAgreement() {
        boolean temp = true;
        if (prevTabIndex == 0 && JdkSrvConfig.getThrdPrtJdkBtn().getSelection() && !accepted) {
            temp = JdkSrvConfig.createAccLicenseAggDlg(getShell(), true);
            accepted = temp;
        }
        return temp;
    }

    private boolean displayServerLicenseAgreement() {
        boolean temp = true;
        if (prevTabIndex == 1 && JdkSrvConfig.getThrdPrtSrvBtn().getSelection() && !srvAccepted) {
            temp = JdkSrvConfig.createAccLicenseAggDlg(getShell(), false);
            srvAccepted = temp;
        }
        return temp;
    }
}