/**
* Copyright 2014 Microsoft Open Technologies Inc.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.microsoftopentechnologies.intellij.forms;
import com.intellij.openapi.application.ApplicationManager;
import com.intellij.openapi.project.Project;
import com.microsoftopentechnologies.intellij.helpers.UIHelper;
import com.microsoftopentechnologies.intellij.helpers.azure.AzureRestAPIManager;
import com.microsoftopentechnologies.intellij.model.CustomAPI;
import com.microsoftopentechnologies.intellij.model.CustomAPIPermissions;
import com.microsoftopentechnologies.intellij.model.PermissionItem;
import com.microsoftopentechnologies.intellij.model.PermissionType;
import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import java.util.ArrayList;
import java.util.List;
import java.util.UUID;
public class CustomAPIForm extends JDialog {
private JPanel mainPanel;
private JButton cancelButton;
private JButton createButton;
private JTextField tableNameTextField;
private JComboBox getPermissionComboBox;
private JComboBox postPermissionComboBox;
private JComboBox putPermissionComboBox;
private JComboBox patchPermissionComboBox;
private JComboBox deletePermissionComboBox;
private UUID subscriptionId;
private String serviceName;
private Project project;
private CustomAPI editingCustomAPI;
private Runnable afterSave;
private List<String> existingApiNames;
public Project getProject() {
return project;
}
public void setProject(Project project) {
this.project = project;
}
public void setSubscriptionId(UUID subscriptionId) {
this.subscriptionId = subscriptionId;
}
public void setServiceName(String serviceName) {
this.serviceName = serviceName;
}
public CustomAPIForm() {
final CustomAPIForm form = this;
this.setResizable(false);
this.setModal(true);
this.setTitle("Create new custom API");
this.setContentPane(mainPanel);
createButton.setEnabled(false);
final PermissionItem[] tablePermissions = PermissionItem.getTablePermissions();
getPermissionComboBox.setModel(new DefaultComboBoxModel(tablePermissions));
postPermissionComboBox.setModel(new DefaultComboBoxModel(tablePermissions));
putPermissionComboBox.setModel(new DefaultComboBoxModel(tablePermissions));
patchPermissionComboBox.setModel(new DefaultComboBoxModel(tablePermissions));
deletePermissionComboBox.setModel(new DefaultComboBoxModel(tablePermissions));
tableNameTextField.addKeyListener(new KeyAdapter() {
@Override
public void keyTyped(KeyEvent keyEvent) {
super.keyTyped(keyEvent);
createButton.setEnabled(!tableNameTextField.getText().isEmpty());
}
});
cancelButton.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent actionEvent) {
form.setVisible(false);
form.dispose();
}
});
createButton.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent actionEvent) {
ApplicationManager.getApplication().invokeLater(new Runnable() {
@Override
public void run() {
String apiName = tableNameTextField.getText().trim();
CustomAPIPermissions permissions = new CustomAPIPermissions();
permissions.setPatchPermission(((PermissionItem) patchPermissionComboBox.getSelectedItem()).getType());
permissions.setDeletePermission(((PermissionItem) deletePermissionComboBox.getSelectedItem()).getType());
permissions.setGetPermission(((PermissionItem) getPermissionComboBox.getSelectedItem()).getType());
permissions.setPostPermission(((PermissionItem) postPermissionComboBox.getSelectedItem()).getType());
permissions.setPutPermission(((PermissionItem) putPermissionComboBox.getSelectedItem()).getType());
try {
form.setCursor(Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR));
if(!apiName.matches("^[A-Za-z][A-Za-z0-9_]+")) {
form.setCursor(Cursor.getDefaultCursor());
JOptionPane.showMessageDialog(form, "Invalid api name. Api name must start with a letter, \n" +
"contain only letters, numbers, and undercores.", "Error creating the api", JOptionPane.ERROR_MESSAGE);
return;
}
if(existingApiNames == null) {
existingApiNames = new ArrayList<String>();
for (CustomAPI api : AzureRestAPIManager.getManager().getAPIList(subscriptionId, serviceName)) {
existingApiNames.add(api.getName().toLowerCase());
}
}
if(editingCustomAPI == null && existingApiNames.contains(apiName.toLowerCase())) {
form.setCursor(Cursor.getDefaultCursor());
JOptionPane.showMessageDialog(form, "Invalid API name. An API with that name already exists in this service.",
"Error creating the API", JOptionPane.ERROR_MESSAGE);
return;
}
if(editingCustomAPI == null) {
AzureRestAPIManager.getManager().createCustomAPI(subscriptionId, serviceName, apiName, permissions);
}
else {
AzureRestAPIManager.getManager().updateCustomAPI(subscriptionId, serviceName, apiName, permissions);
editingCustomAPI.setCustomAPIPermissions(permissions);
}
afterSave.run();
form.setCursor(Cursor.getDefaultCursor());
form.setVisible(false);
form.dispose();
} catch (Throwable e) {
form.setCursor(Cursor.getDefaultCursor());
UIHelper.showException("Error creating table", e);
}
}
});
}
});
}
private int permissionIndex(PermissionItem[] p, PermissionType pt) {
for(int i = 0;i < p.length;i++) {
if(p[i].getType() == pt)
return i;
}
return 0;
}
public void setEditingCustomAPI(CustomAPI editingCustomAPI) {
this.editingCustomAPI = editingCustomAPI;
this.setTitle(editingCustomAPI == null ? "Create new custom API" : "Edit custom API");
this.createButton.setText(editingCustomAPI == null ? "Create" : "Save");
this.tableNameTextField.setText(editingCustomAPI == null ? "" : editingCustomAPI.getName());
this.tableNameTextField.setEnabled(editingCustomAPI == null);
this.createButton.setEnabled(editingCustomAPI != null);
PermissionItem[] tablePermissions = PermissionItem.getTablePermissions();
if(editingCustomAPI != null) {
getPermissionComboBox.setSelectedIndex(permissionIndex(tablePermissions, editingCustomAPI.getCustomAPIPermissions().getGetPermission()));
deletePermissionComboBox.setSelectedIndex(permissionIndex(tablePermissions, editingCustomAPI.getCustomAPIPermissions().getDeletePermission()));
patchPermissionComboBox.setSelectedIndex(permissionIndex(tablePermissions, editingCustomAPI.getCustomAPIPermissions().getPatchPermission()));
postPermissionComboBox.setSelectedIndex(permissionIndex(tablePermissions, editingCustomAPI.getCustomAPIPermissions().getPostPermission()));
putPermissionComboBox.setSelectedIndex(permissionIndex(tablePermissions, editingCustomAPI.getCustomAPIPermissions().getPutPermission()));
}
}
public CustomAPI getEditingCustomAPI() {
return editingCustomAPI;
}
public void setAfterSave(Runnable editSaved) {
this.afterSave = editSaved;
}
}