/*
* Copyright (c) 2015 Paul Scherrer Institute. All rights reserved.
*/
import ch.psi.utils.swing.SwingUtils;
import ch.psi.utils.swing.SwingUtils.OptionResult;
import ch.psi.utils.swing.SwingUtils.OptionType;
import java.awt.Color;
import java.awt.Component;
import java.awt.Desktop;
import java.awt.Point;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.nio.charset.Charset;
import java.nio.charset.StandardCharsets;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.HashMap;
import java.util.Properties;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.swing.ImageIcon;
import javax.swing.JDialog;
import javax.swing.JPanel;
import javax.swing.event.HyperlinkEvent;
import javax.swing.event.HyperlinkListener;
import javax.swing.table.DefaultTableModel;
import org.apache.commons.io.FilenameUtils;
/**
*
* @author boccioli_m
*/
public class NewTest extends javax.swing.JPanel {
/**
* constants declarations
*/
public static Path TESTS_DEVICES_DEFAULT_DIR = Paths.get(".", "home", "script", "tests", "devices");
public static Path TESTS_TESTS_DEFAULT_DIR = Paths.get(".", "home", "script", "tests", "tests");
public static Path TESTS_CONFIG_DEFAULT_DIR = Paths.get(".", "home", "script", "tests", "config");
public static Path TEMPLATES_HELP_FILEPATH = Paths.get(".", "home", "script", "tests","templates","helpTemplate.html");
public static Path TEMPLATES_TESTSCRIPT_FILEPATH = Paths.get(".", "home", "script", "tests","templates","testTemplate.py");
public static Path TEMPLATES_TESTCONFIG_FILEPATH = Paths.get(".", "home", "script", "tests","templates","testTemplate.config");
public static Path TEMPLATES_DEVICECONFIG_FILEPATH = Paths.get(".", "home", "script", "tests","templates","deviceTemplate.config");
public static String TESTS_CONFIG_FILENAME = ".config";
public static String TESTS_HELP_FILENAME = "help.html";
public static String ALLOWED_CHARSET1 = "[a-z A-Z 0-9 . _ \\- \\[\\] () : , < > =]*"; //les restricted set of chars
public static String ALLOWED_CHARSET2 = "[a-z A-Z 0-9 . _ \\- \\[\\] ()]*"; //more restricted set of chars
public static String ALLOWED_CHARSET3 = "[a-zA-Z0-9._\\-]*"; //even more restricted set of chars
public static String NEW_TYPE_DEVICE = "Device";
public static String NEW_TYPE_TEST = "Test";
/**
* Creates new form TestingListDetails
*/
private String sType;
public NewTest() {
initComponents();
}
public NewTest(String hDetails) {
initComponents();
sType = hDetails;
fillComponents(sType);
}
/**
* This method is called from within the constructor to initialize the form.
* WARNING: Do NOT modify this code. The content of this method is always
* regenerated by the Form Editor.
*/
@SuppressWarnings("unchecked")
// //GEN-BEGIN:initComponents
private void initComponents() {
jPopupMenuTable = new javax.swing.JPopupMenu();
jMenuItemAddRow = new javax.swing.JMenuItem();
jMenuItemDeleteRow = new javax.swing.JMenuItem();
lblName = new javax.swing.JLabel();
lblSuite = new javax.swing.JLabel();
lblParams = new javax.swing.JLabel();
lblDescr = new javax.swing.JLabel();
lblContact = new javax.swing.JLabel();
txtTestName = new javax.swing.JTextField();
jComboBoxTestSuites = new javax.swing.JComboBox();
jScrollPane3 = new javax.swing.JScrollPane();
txtTestDescription = new javax.swing.JTextArea();
txtContactName = new javax.swing.JTextField();
jScrollPane1 = new javax.swing.JScrollPane();
jTableParams = new javax.swing.JTable();
jPanel1 = new javax.swing.JPanel();
jButtonGenerate = new javax.swing.JButton();
jMenuItemAddRow.setText("Add Row");
jMenuItemAddRow.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
jMenuItemAddRowActionPerformed(evt);
}
});
jPopupMenuTable.add(jMenuItemAddRow);
jMenuItemDeleteRow.setText("Delete Row");
jMenuItemDeleteRow.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
jMenuItemDeleteRowActionPerformed(evt);
}
});
jPopupMenuTable.add(jMenuItemDeleteRow);
lblName.setFont(new java.awt.Font("Tahoma", 0, 14)); // NOI18N
lblName.setText("Name *");
lblName.setToolTipText("Test Name");
lblSuite.setFont(new java.awt.Font("Tahoma", 0, 14)); // NOI18N
lblSuite.setText("Test Case/Suite *");
lblParams.setFont(new java.awt.Font("Tahoma", 0, 14)); // NOI18N
lblParams.setText("Test Parameters");
lblDescr.setFont(new java.awt.Font("Tahoma", 0, 14)); // NOI18N
lblDescr.setText("Description *");
lblContact.setFont(new java.awt.Font("Tahoma", 0, 14)); // NOI18N
lblContact.setText("Contact person *");
txtTestName.setFont(new java.awt.Font("Tahoma", 0, 14)); // NOI18N
txtTestName.setToolTipText("");
txtTestName.setMinimumSize(new java.awt.Dimension(30, 23));
txtTestName.setPreferredSize(new java.awt.Dimension(60, 23));
jComboBoxTestSuites.setFont(new java.awt.Font("Tahoma", 0, 14)); // NOI18N
jComboBoxTestSuites.setToolTipText("Select a Test Suite or add a new one");
jComboBoxTestSuites.setMinimumSize(new java.awt.Dimension(31, 26));
jComboBoxTestSuites.setPreferredSize(new java.awt.Dimension(31, 26));
jScrollPane3.setFont(new java.awt.Font("Tahoma", 0, 14)); // NOI18N
txtTestDescription.setColumns(20);
txtTestDescription.setFont(new java.awt.Font("Tahoma", 0, 14)); // NOI18N
txtTestDescription.setLineWrap(true);
txtTestDescription.setRows(5);
txtTestDescription.setToolTipText("Add here a detailed description");
jScrollPane3.setViewportView(txtTestDescription);
txtContactName.setFont(new java.awt.Font("Tahoma", 0, 14)); // NOI18N
txtContactName.setToolTipText("Write a user name");
jTableParams.setFont(new java.awt.Font("Tahoma", 0, 14)); // NOI18N
jTableParams.setModel(new javax.swing.table.DefaultTableModel(
new Object [][] {
},
new String [] {
"Parameter", "Value", "Description"
}
));
jTableParams.setColumnSelectionAllowed(true);
jTableParams.setDragEnabled(true);
jTableParams.setRowHeight(20);
jTableParams.getTableHeader().setReorderingAllowed(false);
jTableParams.addMouseListener(new java.awt.event.MouseAdapter() {
public void mouseClicked(java.awt.event.MouseEvent evt) {
jTableParamsMouseClicked(evt);
}
});
jScrollPane1.setViewportView(jTableParams);
jTableParams.getColumnModel().getSelectionModel().setSelectionMode(javax.swing.ListSelectionModel.SINGLE_SELECTION);
if (jTableParams.getColumnModel().getColumnCount() > 0) {
jTableParams.getColumnModel().getColumn(0).setMinWidth(150);
jTableParams.getColumnModel().getColumn(0).setPreferredWidth(150);
jTableParams.getColumnModel().getColumn(0).setMaxWidth(150);
jTableParams.getColumnModel().getColumn(1).setPreferredWidth(80);
jTableParams.getColumnModel().getColumn(1).setMaxWidth(100);
}
jButtonGenerate.setText("Generate");
jButtonGenerate.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
jButtonGenerateActionPerformed(evt);
}
});
javax.swing.GroupLayout jPanel1Layout = new javax.swing.GroupLayout(jPanel1);
jPanel1.setLayout(jPanel1Layout);
jPanel1Layout.setHorizontalGroup(
jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(jPanel1Layout.createSequentialGroup()
.addContainerGap(442, Short.MAX_VALUE)
.addComponent(jButtonGenerate, javax.swing.GroupLayout.PREFERRED_SIZE, 188, javax.swing.GroupLayout.PREFERRED_SIZE)
.addContainerGap())
);
jPanel1Layout.setVerticalGroup(
jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(jPanel1Layout.createSequentialGroup()
.addGap(0, 0, 0)
.addComponent(jButtonGenerate, javax.swing.GroupLayout.PREFERRED_SIZE, 33, javax.swing.GroupLayout.PREFERRED_SIZE)
.addContainerGap())
);
javax.swing.GroupLayout layout = new javax.swing.GroupLayout(this);
this.setLayout(layout);
layout.setHorizontalGroup(
layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(layout.createSequentialGroup()
.addContainerGap()
.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(layout.createSequentialGroup()
.addComponent(jPanel1, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
.addGap(1, 1, 1))
.addGroup(layout.createSequentialGroup()
.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(layout.createSequentialGroup()
.addComponent(lblParams)
.addGap(18, 18, 18)
.addComponent(jScrollPane1))
.addGroup(layout.createSequentialGroup()
.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addComponent(lblName)
.addComponent(lblSuite))
.addGap(0, 0, Short.MAX_VALUE)))
.addGap(12, 12, 12))
.addGroup(layout.createSequentialGroup()
.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addComponent(lblDescr)
.addComponent(lblContact))
.addGap(10, 10, 10)
.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addComponent(txtTestName, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
.addComponent(jComboBoxTestSuites, javax.swing.GroupLayout.Alignment.TRAILING, 0, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
.addComponent(jScrollPane3, javax.swing.GroupLayout.Alignment.TRAILING)
.addComponent(txtContactName))
.addGap(12, 12, 12))))
);
layout.setVerticalGroup(
layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(layout.createSequentialGroup()
.addContainerGap()
.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
.addComponent(lblName)
.addComponent(txtTestName, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
.addGap(18, 18, 18)
.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
.addComponent(lblSuite)
.addComponent(jComboBoxTestSuites, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
.addGap(18, 18, 18)
.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addComponent(jScrollPane3, javax.swing.GroupLayout.DEFAULT_SIZE, 81, Short.MAX_VALUE)
.addComponent(lblDescr))
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addComponent(txtContactName, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
.addComponent(lblContact))
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(layout.createSequentialGroup()
.addComponent(lblParams)
.addGap(0, 132, Short.MAX_VALUE))
.addComponent(jScrollPane1, javax.swing.GroupLayout.PREFERRED_SIZE, 0, Short.MAX_VALUE))
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
.addComponent(jPanel1, javax.swing.GroupLayout.PREFERRED_SIZE, 33, javax.swing.GroupLayout.PREFERRED_SIZE)
.addContainerGap())
);
}// //GEN-END:initComponents
private void jButtonGenerateActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jButtonGenerateActionPerformed
// TODO add your handling code here:
if(checkDataFields()){
generateTestFiles();
}
}//GEN-LAST:event_jButtonGenerateActionPerformed
private void jTableParamsMouseClicked(java.awt.event.MouseEvent evt) {//GEN-FIRST:event_jTableParamsMouseClicked
// TODO add your handling code here:
if(evt.getButton() == java.awt.event.MouseEvent.BUTTON3){
Point cursor = evt.getPoint();
int rowAtPoint = jTableParams.rowAtPoint(cursor);
jTableParams.setRowSelectionInterval(rowAtPoint, rowAtPoint);
jPopupMenuTable.show(jTableParams, evt.getX(), evt.getY());
}
}//GEN-LAST:event_jTableParamsMouseClicked
private void jMenuItemAddRowActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jMenuItemAddRowActionPerformed
// TODO add your handling code here:
DefaultTableModel model = (DefaultTableModel) jTableParams.getModel();
model.addRow(new Object[]{"", "", ""});
jTableParams.setModel(model);
}//GEN-LAST:event_jMenuItemAddRowActionPerformed
private void jMenuItemDeleteRowActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jMenuItemDeleteRowActionPerformed
// TODO add your handling code here:
int row = jTableParams.getSelectedRow();
if(row>=0 && row 2) {
mParameterAttributes = new HashMap();
mParameterAttributes.put("value", (Object) dsParameterAttributes[1]);
mParameterAttributes.put("description", dsParameterAttributes[2]);
//add parameter name and attributes (value + description)
mParameters.put(dsParameterAttributes[0], mParameterAttributes);
}
}
return mParameters;
}
/**
* Pick the items one by one from the table and build a HashMap.
* For details on the HashMap structure, see buildParametersMap()
* @return contains the test parameters.
*/
private HashMap getParametersFromTable(){
HashMap mParameters = new HashMap(); // contains name and attributes
HashMap mParameterAttributes = new HashMap(); //contians value and description
for(int row=0 ; row" + name + " " + description + "
\n" ;
}
}
success = replaceParameters(path,
new String[]{"$testName","$testDescription","$testParameters","$contactName"},
new String[]{sTestName,sTestDescription,sTestParameters,sContactName});
} catch (IOException ex) {
SwingUtils.showMessage(this, "generateTestHelp()", "Cannot create directory " + ex.toString());
Logger.getLogger(NewTest.class.getName()).log(Level.SEVERE, null, ex);
}
return success;
}
/**
* replace thetemplateparameters(usually starting with $) with real values
*
* @param path path of the file whose parameters must be replaced
* @param parameterNames array of template parameters names that must be searched in the file.
* the size must be equal to the size of parameterValues
* @param parameterValues array of template parameters values
* that must replace the template parameter names in the file.
* the size must be equal to the size of parameterNames
* @return
*/
public boolean replaceParameters(Path path,
String parameterNames[],
String parameterValues[]){
boolean success = false;
try {
//replace parameters in template
String content = new String(Files.readAllBytes(path));
for(int i=0 ; i