Uploaded image for project: 'Jenkins'
  1. Jenkins
  2. JENKINS-18930

Missing TestResultColumn() constructor

XMLWordPrintable

    • Icon: Bug Bug
    • Resolution: Fixed
    • Icon: Major Major
    • extra-columns-plugin
    • None
    • Groovy script

      Hi,

      I need to programmatically create some sectioned views (via groovy script to ease maintenance of hundreds of jobs on multiple projects/teams/views)
      I was previously using version 1.2 of the plugin with an old version of Jenkins. All was OK.

      Since we migrated to Jenkins 1.509.2 + plugin 1.10 my script doesn't work any more because of:
      "Failed to instantiate class jenkins.plugins.extracolumns.TestResultColumn from null"

      Looking at:
      hudson.model.Descriptor.newInstance(StaplerRequest req, JSONObject formData)
      showed it "return verifyNewInstance(clazz.newInstance());" where clazz is jenkins.plugins.extracolumns.TestResultColumn and can't instantiate a new instance as there is only one constructor that needs an int in parameter.

      It would be handy to add a no param constructor that set the int to a default value to be able to run column creation through their Descriptor and not have to add a specific case for TestResultColumn.

      This is a snippet of my groovy script:

      import hudson.DescriptorExtensionList
      import hudson.model.*
      import hudson.model.Descriptor.FormException
      import hudson.plugins.sectioned_view.*
      import hudson.util.*
      import hudson.views.*
      
      DEFAULT_COLUMNS = [
              BuildButtonColumn.class                                                 // OK
              ,com.robestone.hudson.compactcolumns.JobNameColumn.class                // OK
              ,LastDurationColumn.class                                               // OK
              ,jenkins.plugins.extracolumns.TestResultColumn.class                    // NOK
          ]
      
      println("Init our columns ...")
      myColumns = [];
      DescriptorExtensionList<ListViewColumn, Descriptor<ListViewColumn>> all = ListViewColumn.all();
      
      for (Class<? extends ListViewColumn> d: DEFAULT_COLUMNS) {
          Descriptor<ListViewColumn> des = all.find(d);
          if (des  != null) {
              println("Case " + d)
              switch(d) {
                  case jenkins.plugins.extracolumns.TestResultColumn.class:
                      println("descriptor = " + des)
                      println("descriptor.clazz = " + des.clazz)
                      println()
                      try {
                          clazzInst = d.newInstance()
                          println("+++Successfully run TestResultColumn.newInstance() = " + clazzInst)
                          myColumns.add(clazzInst);
                      } catch (Exception exp) {
                          println("!!!Exception while instantiating new TestResultColumn(): " + exp.getMessage())
                      }
                      try {
                          clazzInst0 = d.newInstance(0)
                          println("+++Successfully run new TestResultColumn.newInstance(0) = " + clazzInst0)
                          myColumns.add(clazzInst0);
                      } catch (Exception exp) {
                          println("!!!Exception while instantiating new TestResultColumn(0): " + exp.getMessage())
                      }
                      try {
                          tmp = des.newInstance(null,null)
                          myColumns.add(tmp);
                          println("+++Successfully run TestResultColumn.DescriptorImpl.newInstance(null, null) = " + tmp)
                      } catch (Error exp) {
                          println("!!!Error while TestResultColumn.DescriptorImpl.newInstance(null, null): " + exp.getMessage())
                      }
                  break
                  default:
                      myColumns.add(des.newInstance(null, null));
                  break
              }
          }
          else
          {
              println("No descriptior found for " + d)
          }
      }
      
      println("\nResulting columns ...")
      myColumns.each {println(it)}
      

      Give me your thoughts. Maybe there is another way to do this!

      Cheers,

      Greg

            fredg Fred G
            gnion Greg Nion
            Votes:
            0 Vote for this issue
            Watchers:
            3 Start watching this issue

              Created:
              Updated:
              Resolved: