/* * Copyright (c) 2015 Paul Scherrer Institute. All rights reserved. */ import ch.psi.pshell.ui.App; import ch.psi.pshell.ui.View; import ch.psi.utils.swing.SwingUtils; import ch.psi.utils.swing.SwingUtils.OptionResult; import ch.psi.utils.swing.SwingUtils.OptionType; 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.FileWriter; 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.Date; import java.util.HashMap; import java.util.Hashtable; import java.util.Properties; import java.util.logging.Level; import java.util.logging.Logger; import javax.naming.Context; import javax.naming.NamingEnumeration; import javax.naming.NamingException; import javax.naming.directory.Attributes; import javax.naming.directory.DirContext; import javax.naming.directory.InitialDirContext; import javax.naming.directory.SearchControls; import javax.naming.directory.SearchResult; import javax.naming.ldap.InitialLdapContext; import javax.naming.ldap.LdapContext; import javax.swing.table.DefaultTableModel; //import org.json.simple.JSONArray; //import org.json.simple.JSONObject; /** * * @author boccioli_m */ public class NewTest extends javax.swing.JPanel { /** * constants declarations */ public static String TESTS_ROOT_DIR = Paths.get(".", "home", "script", "tests").toString(); public static Path TESTS_DEVICES_DEFAULT_DIR = Paths.get(TESTS_ROOT_DIR, "devices"); public static Path TESTS_TESTS_DEFAULT_DIR = Paths.get(TESTS_ROOT_DIR, "tests"); public static Path TESTS_CONFIG_DEFAULT_DIR = Paths.get(TESTS_ROOT_DIR, "config"); public static Path TEMPLATES_HELP_FILEPATH = Paths.get(TESTS_ROOT_DIR, "templates","helpTemplate.html"); public static Path TEMPLATES_TESTSCRIPT_FILEPATH = Paths.get(TESTS_ROOT_DIR, "templates","testTemplate.py"); public static Path TEMPLATES_TESTCONFIG_FILEPATH = Paths.get(TESTS_ROOT_DIR, "templates","testTemplate.config"); public static Path TEMPLATES_DEVICECONFIG_FILEPATH = Paths.get(TESTS_ROOT_DIR, "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 VALUE_SEPARATOR = "&"; public static String PARAM_SEPARATOR = ";"; /** * enumeration of table column indexes */ public enum TypeOfNewFile { Test, Device; }; /** * Creates new form TestingListDetails */ private TypeOfNewFile sType; public NewTest() { initComponents(); } public NewTest(String hDetails) { initComponents(); if(hDetails.equals("Device")){ sType = TypeOfNewFile.Device; } else{ sType = TypeOfNewFile.Test; } 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 *"); lblContact.setToolTipText("Write here the user name of the person who can be contacted for any question concerning this test"); txtTestName.setFont(new java.awt.Font("Tahoma", 0, 14)); // NOI18N txtTestName.setToolTipText(""); txtTestName.setMinimumSize(new java.awt.Dimension(30, 26)); txtTestName.setPreferredSize(new java.awt.Dimension(60, 26)); txtTestName.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { txtTestNameActionPerformed(evt); } }); 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"); txtTestDescription.setWrapStyleWord(true); jScrollPane3.setViewportView(txtTestDescription); txtContactName.setFont(new java.awt.Font("Tahoma", 0, 14)); // NOI18N txtContactName.setToolTipText("Write here the user name of the person who can be contacted for any question concerning this test"); txtContactName.setMinimumSize(new java.awt.Dimension(6, 26)); txtContactName.setPreferredSize(new java.awt.Dimension(6, 26)); 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(100); jTableParams.getColumnModel().getColumn(1).setMaxWidth(200); } 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(javax.swing.GroupLayout.DEFAULT_SIZE, 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, javax.swing.GroupLayout.DEFAULT_SIZE, 549, Short.MAX_VALUE)) .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) .addGroup(layout.createSequentialGroup() .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)) .addGap(12, 12, 12)) .addGroup(layout.createSequentialGroup() .addComponent(txtContactName, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) .addContainerGap()))))) ); layout.setVerticalGroup( layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addGroup(layout.createSequentialGroup() .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addGroup(layout.createSequentialGroup() .addContainerGap() .addComponent(lblName)) .addComponent(txtTestName, javax.swing.GroupLayout.PREFERRED_SIZE, 30, javax.swing.GroupLayout.PREFERRED_SIZE)) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED) .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addComponent(lblSuite) .addComponent(jComboBoxTestSuites, javax.swing.GroupLayout.PREFERRED_SIZE, 30, javax.swing.GroupLayout.PREFERRED_SIZE)) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addComponent(jScrollPane3, javax.swing.GroupLayout.DEFAULT_SIZE, 126, Short.MAX_VALUE) .addComponent(lblDescr)) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING, false) .addGroup(layout.createSequentialGroup() .addComponent(lblContact) .addGap(29, 29, 29)) .addGroup(layout.createSequentialGroup() .addComponent(txtContactName, javax.swing.GroupLayout.PREFERRED_SIZE, 30, javax.swing.GroupLayout.PREFERRED_SIZE) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED))) .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addGroup(layout.createSequentialGroup() .addComponent(lblParams) .addGap(0, 171, 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" ; } } Attributes user = null; user = getUserInfo(sContactName); String contactTelephone = ""; String contactFirstName = sContactName; String contactSurname = ""; if (user != null){ contactTelephone = user.get("telephoneNumber").toString().replace("telephoneNumber: ", "").replace(" ", ""); contactTelephone = "Tel. " + contactTelephone.substring(contactTelephone.length()-4); contactFirstName = user.get("givenname").toString().replace("givenName: ", ""); contactSurname = user.get("sn").toString().replace("sn: ", ""); } success = replaceParameters(path, new String[]{"$testName","$testDescription","$testParameters","$contactUserName","$contactFirstName","$contactSurname","$contactTelephone"}, new String[]{sTestName,sTestDescription,sTestParameters,sContactName,contactFirstName,contactSurname,contactTelephone}); } 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 env = new Hashtable(); //this can be used to authenticate: env.put(Context.INITIAL_CONTEXT_FACTORY, "com.sun.jndi.ldap.LdapCtxFactory"); env.put(Context.SECURITY_AUTHENTICATION, "simple");//with "none" it does not seem to work. It works with "simple" but it needs a user name and password env.put(Context.SECURITY_PRINCIPAL, "PSICH\\"+userName);//input user & password for access to ldap env.put(Context.SECURITY_CREDENTIALS, password);//here I should write my password in clear!?!?!? env.put(Context.PROVIDER_URL, "ldap://d.psi.ch"); env.put(Context.REFERRAL, "follow"); ctx = new InitialLdapContext(env, null); //System.out.println("LDAP Connection: COMPLETE"); } catch (NamingException ex) { Logger.getLogger(NewTest.class.getName()).log(Level.SEVERE, null, ex); } return ctx; } private Attributes authenticateUser(String userName, LdapContext ctx, SearchControls searchControls) { System.out.println("*** " + userName + " ***"); Attributes attrs = null; try { NamingEnumeration answer = ctx.search("dc=d,dc=psi,dc=ch", "sAMAccountName=" + userName, searchControls); if (answer.hasMore()) { attrs = answer.next().getAttributes(); //System.out.println(attrs.get("givenname")); //System.out.println(attrs.get("sn")); //System.out.println(attrs.get("mail")); //System.out.println(attrs.get("telephoneNumber")); } else { System.out.println("Ldap user not found."); } } catch (Exception ex) { ex.printStackTrace(); } return attrs; } public Attributes authenticateUser(String userName, String password) { Attributes attrs = null; LdapContext ldapContext = getLdapContext(userName,password); SearchControls searchControls = getSearchControls(); attrs = authenticateUser(userName, ldapContext, searchControls); String tel = attrs.get("telephonenumber").toString().replace(" ", ""); tel = "Tel.: " + tel.substring(tel.length()-4); attrs.put("telephoneNumber",tel); return attrs; } private SearchControls getSearchControls() { SearchControls cons = new SearchControls(); cons.setSearchScope(SearchControls.SUBTREE_SCOPE); String[] attrIDs = {"sn", "givenname", "mail", "telephoneNumber"}; cons.setReturningAttributes(attrIDs); return cons; } } // Variables declaration - do not modify//GEN-BEGIN:variables private javax.swing.JButton jButtonGenerate; private javax.swing.JComboBox jComboBoxTestSuites; private javax.swing.JMenuItem jMenuItemAddRow; private javax.swing.JMenuItem jMenuItemDeleteRow; private javax.swing.JPanel jPanel1; private javax.swing.JPopupMenu jPopupMenuTable; private javax.swing.JScrollPane jScrollPane1; private javax.swing.JScrollPane jScrollPane3; private javax.swing.JTable jTableParams; private javax.swing.JLabel lblContact; private javax.swing.JLabel lblDescr; private javax.swing.JLabel lblName; private javax.swing.JLabel lblParams; private javax.swing.JLabel lblSuite; private javax.swing.JTextField txtContactName; private javax.swing.JTextArea txtTestDescription; private javax.swing.JTextField txtTestName; // End of variables declaration//GEN-END:variables }