/**
* 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.options.BaseConfigurable;
import com.intellij.openapi.options.Configurable;
import com.intellij.openapi.options.ConfigurationException;
import com.intellij.openapi.options.SearchableConfigurable;
import com.intellij.openapi.project.Project;
import com.intellij.openapi.ui.Messages;
import com.interopbridges.tools.windowsazure.*;
import com.microsoft.intellij.util.PluginUtil;
import com.microsoftopentechnologies.azurecommons.model.RoleAndEndpoint;
import com.microsoftopentechnologies.azurecommons.roleoperations.WARDebuggingUtilMethods;
import org.jetbrains.annotations.Nls;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import javax.swing.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.ItemEvent;
import java.awt.event.ItemListener;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import static com.microsoft.intellij.AzurePlugin.log;
import static com.microsoft.intellij.ui.messages.AzureBundle.message;
public class DebuggingPanel extends BaseConfigurable implements SearchableConfigurable, Configurable.NoScroll {
private JPanel contentPane;
private JCheckBox debugCheck;
private JLabel lblDebugEndPoint;
private JComboBox comboEndPoint;
private JCheckBox jvmCheck;
private JButton createDebug;
private Project project;
private WindowsAzureProjectManager waProjManager;
private WindowsAzureRole waRole;
private WindowsAzureEndpoint dbgSelEndpoint;
private boolean isDebugChecked;
private Map<String, String> debugMap = new HashMap<String, String>();
private boolean childOk;
public DebuggingPanel(Project project, WindowsAzureProjectManager waProjManager, WindowsAzureRole waRole) {
this.project = project;
this.waProjManager = waProjManager;
this.waRole = waRole;
init();
}
private void init() {
try {
WindowsAzureEndpoint endPt = waRole.getDebuggingEndpoint();
if (endPt == null) {
debugCheck.setSelected(false);
comboEndPoint.removeAllItems(); // todo: ???
makeAllDisable();
} else {
populateEndPointList();
comboEndPoint.setSelectedItem(String.format(message("dbgEndPtStr"), endPt.getName(), endPt.getPort(), endPt.getPrivatePort()));
}
} catch (Exception e) {
PluginUtil.displayErrorDialogAndLog(message("adRolErrTitle"), message("dlgDbgErr"), e);
}
isDebugChecked = false;
try {
isDebugChecked = waRole.getDebuggingEndpoint() != null;
} catch (Exception ex) {
//As getTitle() is also showing the error message if any exception
//occurs in role.getDebuggingEndpoint(), so only logging
//the exception. getTitle() gets called every time this page is
//selected but createContents() is called only once while creating
//the page.
log(message("dlgDbgErr"), ex);
}
debugCheck.setSelected(isDebugChecked);
debugCheck.addItemListener(createDebugCheckListener());
try {
populateEndPointList();
} catch (WindowsAzureInvalidProjectOperationException e1) {
PluginUtil.displayErrorDialogAndLog(message("adRolErrTitle"), message("dlgDbgErr"), e1);
}
comboEndPoint.addItemListener(createComboEndPointListener());
try {
if (isDebugChecked) {
jvmCheck.setSelected(waRole.getStartSuspended());
} else {
jvmCheck.setSelected(false);
}
} catch (WindowsAzureInvalidProjectOperationException e2) {
PluginUtil.displayErrorDialogAndLog(message("adRolErrTitle"), message("dlgDbgErr"), e2);
}
jvmCheck.addItemListener(createJvmCheckListener());
createDebug.addActionListener(createCreateDebugListener());
try {
if (isDebugChecked) {
WindowsAzureEndpoint endPt = waRole.getDebuggingEndpoint();
comboEndPoint.setSelectedItem(String.format(message("dbgEndPtStr"), endPt.getName(), endPt.getPort(), endPt.getPrivatePort()));
} else {
makeAllDisable();
}
} catch (WindowsAzureInvalidProjectOperationException e1) {
PluginUtil.displayErrorDialogAndLog(message("adRolErrTitle"), message("dlgDbgErr"), e1);
}
if (debugCheck.isSelected() && comboEndPoint.getSelectedItem().equals("")) {
// setValid(false);
}
}
private ItemListener createDebugCheckListener() {
return new ItemListener() {
@Override
public void itemStateChanged(ItemEvent e) {
debugOptionStatus();
}
};
}
private ItemListener createComboEndPointListener() {
return new ItemListener() {
@Override
public void itemStateChanged(ItemEvent e) {
try {
if (debugCheck.isSelected()) {
dbgSelEndpoint = WARDebuggingUtilMethods.getDebugSelectedEndpoint(waRole, (String) comboEndPoint.getSelectedItem());
waRole.setDebuggingEndpoint(dbgSelEndpoint);
myModified = true;
waRole.setStartSuspended(jvmCheck.isSelected());
}
} catch (WindowsAzureInvalidProjectOperationException ex) {
PluginUtil.displayErrorDialogAndLog(message("adRolErrTitle"), message("adRolErrMsgBox1") + message("adRolErrMsgBox2"), ex);
}
}
};
}
private ItemListener createJvmCheckListener() {
return new ItemListener() {
@Override
public void itemStateChanged(ItemEvent e) {
try {
waRole.setStartSuspended(jvmCheck.isSelected());
myModified = true;
} catch (WindowsAzureInvalidProjectOperationException ex) {
PluginUtil.displayErrorDialogAndLog(message("adRolErrTitle"), message("dlgDbgErr"), ex);
}
}
};
}
private ActionListener createCreateDebugListener() {
return new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
DebugConfigurationDialog dialog = null;
try {
dialog = new DebugConfigurationDialog(project, waRole, WARDebuggingUtilMethods.getDebugSelectedEndpoint(waRole, (String) comboEndPoint.getSelectedItem()), debugMap);
dialog.show();
childOk = dialog.isOK();
} catch (WindowsAzureInvalidProjectOperationException ex) {
PluginUtil.displayErrorDialogAndLog(message("adRolErrTitle"), message("dlgDbgErr"), ex);
}
}
};
}
/**
* This method sets the status of debug option
* based on the user input.If user checks the debug check box
* first time then it will add a debugging end point otherwise it will
* prompt the user for removal of associated end point for debugging if
* user already has some debug end point associated and unchecked
* the debug check box.
*/
private void debugOptionStatus() {
if (debugCheck.isSelected()) {
makeDebugEnable();
try {
waRole.setDebuggingEndpoint(dbgSelEndpoint);
waRole.setStartSuspended(jvmCheck.isSelected());
} catch (WindowsAzureInvalidProjectOperationException e1) {
PluginUtil.displayErrorDialogAndLog(message("adRolErrTitle"), message("dlgDbgErr"), e1);
}
} else {
if (isDebugChecked && !"".equals(comboEndPoint.getSelectedItem())) {
String msg = String.format("%s%s", message("dlgDbgEdPtAscMsg"), comboEndPoint.getSelectedItem());
int choice = Messages.showOkCancelDialog(msg, message("dlgDbgEndPtErrTtl"), Messages.getQuestionIcon());
if (choice == Messages.OK) {
removeDebugAssociatedEndpoint();
} else {
makeAllDisable();
try {
waRole.setDebuggingEndpoint(null);
} catch (WindowsAzureInvalidProjectOperationException e) {
PluginUtil.displayErrorDialogAndLog(message("adRolErrTitle"), message("dlgDbgErr"), e);
}
}
} else {
removeDebugAssociatedEndpoint();
}
}
}
/**
* This method removed the associated debug end point
* if debug check box get unchecked.
*/
private void removeDebugAssociatedEndpoint() {
List<WindowsAzureEndpoint> endpointsList;
try {
endpointsList = new ArrayList<WindowsAzureEndpoint>(waRole.getEndpoints());
for (WindowsAzureEndpoint endpoint : endpointsList) {
if (((String) comboEndPoint.getSelectedItem())
.equalsIgnoreCase(String.format(message("dbgEndPtStr"), endpoint.getName(), endpoint.getPort(), endpoint.getPrivatePort()))) {
endpoint.delete();
}
}
comboEndPoint.removeAllItems();
// comboEndPoint.setText("");
makeAllDisable();
waRole.setDebuggingEndpoint(null);
} catch (WindowsAzureInvalidProjectOperationException e) {
PluginUtil.displayErrorDialogAndLog(message("adRolErrTitle"), message("dlgDbgErr"), e);
}
}
/**
* This method populates the endpoint list
* every time we made any changes in the endpoint list.
*
* @throws com.interopbridges.tools.windowsazure.WindowsAzureInvalidProjectOperationException
*/
private void populateEndPointList() throws WindowsAzureInvalidProjectOperationException {
List<WindowsAzureEndpoint> endpointsList;
endpointsList = new ArrayList<WindowsAzureEndpoint>(waRole.getEndpoints());
comboEndPoint.removeAll();
for (WindowsAzureEndpoint endpoint : endpointsList) {
if (((endpoint.getEndPointType().equals(WindowsAzureEndpointType.Input) && endpoint.getPrivatePort() != null)
|| endpoint.getEndPointType().equals(WindowsAzureEndpointType.InstanceInput))
&& !endpoint.equals(waRole.getSessionAffinityInputEndpoint()) && !endpoint.equals(waRole.getSslOffloadingInputEndpoint())) {
comboEndPoint.addItem(String.format(message("dbgEndPtStr"), endpoint.getName(), endpoint.getPort(), endpoint.getPrivatePort()));
}
}
}
/**
* This method enables all the control on UI
* if Debug is enabled.
*/
private void makeDebugEnable() {
try {
createDebug.setEnabled(true);
comboEndPoint.setEnabled(true);
jvmCheck.setEnabled(true);
lblDebugEndPoint.setEnabled(true);
RoleAndEndpoint obj = WARDebuggingUtilMethods.getDebuggingEndpoint(waRole, waProjManager);
waRole = obj.getRole();
WindowsAzureEndpoint endpt = obj.getEndPt();
populateEndPointList();
comboEndPoint.setSelectedItem(String.format(message("dbgEndPtStr"), endpt.getName(), endpt.getPort(), endpt.getPrivatePort()));
dbgSelEndpoint = endpt;
} catch (WindowsAzureInvalidProjectOperationException e) {
PluginUtil.displayErrorDialogAndLog(message("adRolErrTitle"), message("dlgDbgErr"), e);
}
}
/**
* This method disables all the control on UI
* if Debug is disabled.
*/
private void makeAllDisable() {
createDebug.setEnabled(false);
comboEndPoint.setEnabled(false);
jvmCheck.setEnabled(false);
lblDebugEndPoint.setEnabled(false);
}
@NotNull
@Override
public String getId() {
return getDisplayName();
}
@Nullable
@Override
public Runnable enableSearch(String option) {
return null;
}
@Nls
@Override
public String getDisplayName() {
return message("cmhLblDbg");
}
@Nullable
@Override
public String getHelpTopic() {
return "windows_azure_debug_page";
}
@Nullable
@Override
public JComponent createComponent() {
return contentPane;
}
@Override
public void apply() throws ConfigurationException {
//check for child window's OK button was pressed or not
//if not then we do not need to create a debug configuration otherwise
//we do need to create debug configuration based on the user
//selected options.
if (childOk) {
String emuCheck = debugMap.get(message("dlgDbgEmuChkd"));
String cloudCheck = debugMap.get(message("dlgDbgCldChkd"));
if (emuCheck != null && emuCheck.equals("true")) {
// todo!!!
// createLaunchConfig(
// debugMap.get(Messages.dlgDbgEmuConf),
// debugMap.get(Messages.dlgDbgEmuProj),
// debugMap.get(Messages.dlgDbgEmuHost),
// debugMap.get(Messages.dlgDbgEmuPort));
}
if (cloudCheck != null && cloudCheck.equals("true")) {
// createLaunchConfig(
// debugMap.get(Messages.dlgDbgCldConf),
// debugMap.get(Messages.dlgDbgCldProj),
// debugMap.get(Messages.dlgDbgCldHost),
// debugMap.get(Messages.dlgDbgCldPort));
}
}
boolean okToProceed = true;
try {
waProjManager.save();
} catch (WindowsAzureInvalidProjectOperationException e) {
PluginUtil.displayErrorDialogAndLog(message("adRolErrTitle"), message("adRolErrMsgBox1") + message("adRolErrMsgBox2"), e);
throw new ConfigurationException(message("adRolErrMsgBox1") + message("adRolErrMsgBox2"), message("adRolErrTitle"));
}
myModified = false;
}
@Override
public void reset() {
myModified = false;
}
@Override
public void disposeUIResources() {
}
}