com.microsoft.intellij.ui.azureroles.CacheDialog.java Source code

Java tutorial

Introduction

Here is the source code for com.microsoft.intellij.ui.azureroles.CacheDialog.java

Source

/**
 * Copyright (c) Microsoft Corporation
 * <p/>
 * All rights reserved.
 * <p/>
 * MIT License
 * <p/>
 * 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:
 * <p/>
 * The above copyright notice and this permission notice shall be included in all copies or substantial portions of
 * the Software.
 * <p/>
 * 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.microsoft.intellij.ui.azureroles;

import com.intellij.openapi.ui.DialogWrapper;
import com.intellij.openapi.ui.Messages;
import com.intellij.openapi.ui.TitlePanel;
import com.interopbridges.tools.windowsazure.WindowsAzureCacheExpirationPolicy;
import com.interopbridges.tools.windowsazure.WindowsAzureInvalidProjectOperationException;
import com.interopbridges.tools.windowsazure.WindowsAzureNamedCache;
import com.interopbridges.tools.windowsazure.WindowsAzureRole;
import com.microsoft.intellij.util.PluginUtil;
import com.microsoftopentechnologies.azurecommons.exception.AzureCommonsException;
import com.microsoftopentechnologies.azurecommons.roleoperations.CacheDialogUtilMethods;
import org.jetbrains.annotations.Nullable;

import javax.swing.*;
import java.awt.event.ItemEvent;
import java.awt.event.ItemListener;
import java.util.Map;

import static com.microsoft.intellij.ui.messages.AzureBundle.message;

public class CacheDialog extends DialogWrapper {
    /**
     * Cache expiration policies.
     */
    private static String[] arrType = { message("expPolNvrExp"), message("expPolAbs"), message("expPolSlWn") };

    private JPanel contentPane;
    private JTextField txtCacheName;
    private JTextField txtPortNum;
    private JComboBox comboExpPolicy;
    private JTextField txtMinLive;
    private JCheckBox backupCheck;

    private WindowsAzureRole waRole;
    private Map<String, WindowsAzureNamedCache> cacheMap;
    private boolean isEdit;
    private String cacheName;

    public CacheDialog(WindowsAzureRole waRole, Map<String, WindowsAzureNamedCache> cacheMap, String key,
            boolean isEdit) {
        super(true);
        this.waRole = waRole;
        this.cacheMap = cacheMap;
        this.cacheName = key;
        this.isEdit = isEdit;
        setTitle(message("cacheTtl"));
        if (isEdit) {
            populateData();
        }
        init();
    }

    protected void init() {
        comboExpPolicy.setModel(new DefaultComboBoxModel(arrType));
        comboExpPolicy.setSelectedItem(arrType[1]);
        comboExpPolicy.addItemListener(createComboExpPolicyListener());
        backupCheck.addItemListener(createBackupCheckListener());
        super.init();
    }

    /**
     * Populates the cache name and value text fields with the corresponding
     * attributes of named cache resource selected for editing.
     */
    private void populateData() {
        try {
            WindowsAzureNamedCache cache = cacheMap.get(cacheName);
            txtCacheName.setText(cache.getName());
            /*
             * Disable cache name text box if default cache
            * is selected for editing
            * as renaming default cache is not allowed.
            */
            if (cache.getName().equalsIgnoreCase(message("dfltCachName"))) {
                txtCacheName.setEnabled(false);
            }
            txtPortNum.setText(cache.getEndpoint().getPrivatePort());
            comboExpPolicy.setSelectedItem(CacheDialogUtilMethods.getExpPolStr(cache));
            /*
             * Check if expiration policy is NEVER_EXPIRES
            * then disable minutes to live text box
            * and set value to N/A
            */
            if (cache.getExpirationPolicy().equals(WindowsAzureCacheExpirationPolicy.NEVER_EXPIRES)) {
                txtMinLive.setText(message("dlgDbgNA"));
                txtMinLive.setEnabled(false);
            } else {
                txtMinLive.setText(Integer.toString(cache.getMinutesToLive()));
            }
            backupCheck.setSelected(cache.getBackups());
        } catch (WindowsAzureInvalidProjectOperationException e) {
            PluginUtil.displayErrorDialogAndLog(message("cachErrTtl"), message("cachGetErMsg"), e);
        }
    }

    private ItemListener createComboExpPolicyListener() {
        return new ItemListener() {
            @Override
            public void itemStateChanged(ItemEvent e) {
                /*
                * Check if expiration policy is NEVER_EXPIRES
                * then disable minutes to live text box
                * and set value to N/A
                * else enable text box
                * and set value to default i.e 10
                */
                if (comboExpPolicy.getSelectedItem().equals(message("expPolNvrExp"))) {
                    txtMinLive.setText(message("dlgDbgNA"));
                    txtMinLive.setEnabled(false);
                } else {
                    txtMinLive.setEnabled(true);
                    txtMinLive.setText("");
                }
            }
        };
    }

    private ItemListener createBackupCheckListener() {
        return new ItemListener() {
            @Override
            public void itemStateChanged(ItemEvent e) {
                /*
                * If user selects backup option
                * then check virtual machine instances > 2
                * otherwise give warning
                */
                if (backupCheck.isSelected()) {
                    int vmCnt = 0;
                    try {
                        vmCnt = Integer.parseInt(waRole.getInstances());
                    } catch (Exception ex) {
                        PluginUtil.displayErrorDialogAndLog(message("genErrTitle"), message("vmInstGetErMsg"), ex);
                    }
                    if (vmCnt < 2) {
                        /*
                         * If virtual machine instances < 2
                         * then make back up check-box unchecked.
                         */
                        backupCheck.setSelected(false);
                        Messages.showWarningDialog(message("backWarnMsg"), message("backWarnTtl"));
                    }
                }
            }
        };
    }

    @Nullable
    @Override
    protected JComponent createCenterPanel() {
        return contentPane;
    }

    protected JComponent createTitlePane() {
        return new TitlePanel(message("cachTxt"), message("cachMsg"));
    }

    public String getCacheName() {
        return cacheName;
    }

    protected void doOKAction() {
        boolean okToProceed;
        String cachNameTxt = txtCacheName.getText().trim();
        String port = txtPortNum.getText().trim();
        String mtl = txtMinLive.getText().trim();
        try {
            // Check values for all fields are specified
            if (!txtCacheName.getText().equals("") && !txtPortNum.getText().equals("")
                    && !txtMinLive.getText().equals("")) {
                /*
                 * Check if expiration policy is NEVER_EXPIRES
                 * then only validate cache name and port number
                 * else all three fields
                 * name, port, minutes to live.
                 */
                if (comboExpPolicy.getSelectedItem().equals(message("expPolNvrExp"))) {
                    okToProceed = isValidName(cachNameTxt) && validatePort(port);
                } else {
                    okToProceed = isValidName(cachNameTxt) && validatePort(port) && validateMtl(mtl);
                }
            } else {
                okToProceed = false;
                PluginUtil.displayErrorDialog(message("cachErrTtl"), message("cachSpcfyAll"));
            }
            if (okToProceed) {
                // Edit case
                if (isEdit) {
                    WindowsAzureNamedCache namedCache = cacheMap.get(cacheName);
                    /*
                     * If cache name is edited
                     * then set name to newer value.
                     */
                    if (!namedCache.getName().equals(cachNameTxt)) {
                        namedCache.setName(cachNameTxt);
                        cacheName = cachNameTxt;
                    }
                    namedCache.getEndpoint().setPrivatePort(port);
                    setCacheAttributes(namedCache);
                } else {
                    cacheName = cachNameTxt;
                    WindowsAzureNamedCache namedCache = waRole.addNamedCache(cachNameTxt, Integer.parseInt(port));
                    setCacheAttributes(namedCache);
                }
                super.doOKAction();
            }
        } catch (Exception e) {
            PluginUtil.displayErrorDialog(message("cachErrTtl"), message("cachSetErrMsg"));
        }
    }

    /**
     * Validates the name of cache.
     *
     * @param name
     * @return Boolean
     */
    private Boolean isValidName(String name) {
        boolean retVal = true;
        try {
            retVal = CacheDialogUtilMethods.isValidName(name, cacheMap, isEdit, cacheName);
        } catch (AzureCommonsException e) {
            retVal = false;
            PluginUtil.displayErrorDialog(message("genErrTitle"), e.getMessage());
        }
        return retVal;
    }

    /**
     * Validates the Minutes to live attribute of named cache.
     * Value must be numeric and should be at least 0
     *
     * @param minToLive
     * @return Boolean
     */
    private Boolean validateMtl(String minToLive) {
        Boolean isVallidMtl = CacheDialogUtilMethods.validateMtl(minToLive);
        if (!isVallidMtl) {
            PluginUtil.displayErrorDialog(message("cachMtlErrTtl"), message("cachMtlErrMsg"));
        }
        return isVallidMtl;
    }

    /**
     * Validates the port number of named cache.
     * Positive integer between 1 to 65535 is allowed.
     *
     * @param port
     * @return Boolean
     */
    private Boolean validatePort(String port) {
        Boolean isValidPortRng = false;
        try {
            isValidPortRng = CacheDialogUtilMethods.validatePort(port, cacheMap, cacheName, isEdit,
                    txtCacheName.getText(), waRole);
        } catch (AzureCommonsException e) {
            PluginUtil.displayErrorDialog(message("genErrTitle"), e.getMessage());
        }
        return isValidPortRng;
    }

    /**
     * Function sets values of named cache attributes
     * like backup option, expiration policy and minutes to live.
     *
     * @param namedCache
     */
    private void setCacheAttributes(WindowsAzureNamedCache namedCache) {
        String expPolCmbTxt = (String) comboExpPolicy.getSelectedItem();
        /*
         * Mapping of expiration policies shown on UI
         * to actual values stored in project manager object
         */
        WindowsAzureCacheExpirationPolicy expPol = CacheDialogUtilMethods.getExpPolObject(expPolCmbTxt);
        try {
            CacheDialogUtilMethods.setCacheAttributes(namedCache, expPolCmbTxt, backupCheck.isSelected(), expPol,
                    txtMinLive.getText().trim());
        } catch (Exception e) {
            PluginUtil.displayErrorDialog(message("cachErrTtl"), message("cachSetErrMsg"));
        }
    }

    @Override
    protected String getHelpId() {
        return "windows_azure_cache_dialog";
    }
}