/** * 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.microsoftopentechnologies.intellij.helpers.UIHelper; import com.microsoftopentechnologies.intellij.helpers.azure.AzureRestAPIManager; import com.microsoftopentechnologies.intellij.model.Job; 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.text.SimpleDateFormat; import java.util.*; import java.util.List; import static java.lang.Integer.parseInt; public class JobForm extends JDialog { private JPanel mainPanel; private JButton saveButton; private JButton cancelButton; private JTextField jobNameTextField; private JRadioButton scheduledRadioButton; private JComboBox intervalUnitComboBox; private JFormattedTextField intervalFormattedTextField; private JRadioButton onDemandRadioButton; private JCheckBox enabledCheckBox; private JLabel onDemandLabel; private JLabel everyLabel; private UUID id; private String serviceName; private UUID subscriptionId; private List<String> existingJobNames; public void setAfterSave(Runnable afterSave) { this.afterSave = afterSave; } private Runnable afterSave; public JobForm() { final JobForm form = this; this.setContentPane(mainPanel); this.setModal(true); saveButton.setEnabled(false); ButtonGroup group = new ButtonGroup(); group.add(onDemandRadioButton); group.add(scheduledRadioButton); jobNameTextField.addKeyListener(new KeyAdapter() { @Override public void keyTyped(KeyEvent keyEvent) { super.keyTyped(keyEvent); saveButton.setEnabled(!jobNameTextField.getText().isEmpty()); } }); ActionListener radioActionListener = new ActionListener() { @Override public void actionPerformed(ActionEvent actionEvent) { setEnabledOptions(); } }; scheduledRadioButton.addActionListener(radioActionListener); onDemandRadioButton.addActionListener(radioActionListener); intervalUnitComboBox.setModel(new DefaultComboBoxModel(Job.getUnits())); scheduledRadioButton.setSelected(true); intervalFormattedTextField.setText("15"); setEnabledOptions(); intervalFormattedTextField.setInputVerifier(new InputVerifier() { @Override public boolean verify(JComponent jComponent) { if(jComponent instanceof JFormattedTextField) { JFormattedTextField field = (JFormattedTextField) jComponent; try { parseInt(field.getText()); } catch(NumberFormatException e) { return false; } return true; } return false; } }); saveButton.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent actionEvent) { try { form.setCursor(Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR)); String jobName = jobNameTextField.getText().trim(); int interval = onDemandRadioButton.isSelected() ? 0 : parseInt(intervalFormattedTextField.getText()); String unit = onDemandRadioButton.isSelected() ? "none" : Job.getUnits()[intervalUnitComboBox.getSelectedIndex()]; SimpleDateFormat ISO8601DATEFORMAT = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS'Z'", Locale.ENGLISH); String now = ISO8601DATEFORMAT.format(new Date()); if(!jobName.matches("^[A-Za-z][A-Za-z0-9_]+")) { form.setCursor(Cursor.getDefaultCursor()); JOptionPane.showMessageDialog(form, "Invalid service name. Job name must start with a letter, \n" + "contain only letters, numbers, and undercores.", "Error creating the job", JOptionPane.ERROR_MESSAGE); return; } if(id == null) { existingJobNames = new ArrayList<String>(); for (Job job : AzureRestAPIManager.getManager().listJobs(subscriptionId, serviceName)) { existingJobNames.add(job.getName().toLowerCase()); } if(existingJobNames.contains(jobName.toLowerCase())) { form.setCursor(Cursor.getDefaultCursor()); JOptionPane.showMessageDialog(form, "Invalid job name. A job with that name already exists in this service.", "Error creating the job", JOptionPane.ERROR_MESSAGE); return; } } if(id == null) AzureRestAPIManager.getManager().createJob(subscriptionId, serviceName, jobName, interval, unit, now); else { AzureRestAPIManager.getManager().updateJob(subscriptionId, serviceName, jobName, interval, unit, now, enabledCheckBox.isSelected()); } if(afterSave != null) afterSave.run(); form.setCursor(Cursor.getDefaultCursor()); form.setVisible(false); form.dispose(); } catch (Throwable ex) { form.setCursor(Cursor.getDefaultCursor()); UIHelper.showException("Error trying to save job", ex); } } }); cancelButton.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent actionEvent) { form.setVisible(false); form.dispose(); } }); } public void setJob(Job job) { jobNameTextField.setEnabled(false); enabledCheckBox.setEnabled(true); saveButton.setEnabled(true); id = job.getId(); jobNameTextField.setText(job.getName()); enabledCheckBox.setSelected(job.isEnabled()); if(job.getIntervalUnit() == null) { onDemandRadioButton.setSelected(true); } else { scheduledRadioButton.setSelected(true); intervalFormattedTextField.setText(String.valueOf(job.getIntervalPeriod())); int index = 0; String[] units = Job.getUnits(); for(int i = 0; i < units.length; i++) if(job.getIntervalUnit().equals(units[i])) index = i; intervalUnitComboBox.setSelectedIndex(index); } } public void setSubscriptionId(UUID subscriptionId) { this.subscriptionId = subscriptionId; } public void setServiceName(String serviceName) { this.serviceName = serviceName; } private void setEnabledOptions() { intervalFormattedTextField.setEnabled(scheduledRadioButton.isSelected()); intervalUnitComboBox.setEnabled(scheduledRadioButton.isSelected()); everyLabel.setEnabled(scheduledRadioButton.isSelected()); onDemandLabel.setEnabled(onDemandRadioButton.isSelected()); } public Job getEditingJob() { Job job = new Job(); job.setId(id); job.setName(jobNameTextField.getText()); job.setEnabled(enabledCheckBox.isSelected()); if(scheduledRadioButton.isSelected()) { job.setIntervalUnit(Job.getUnits()[intervalUnitComboBox.getSelectedIndex()]); job.setIntervalPeriod(parseInt(intervalFormattedTextField.getText())); } return job; } }