Skip to content

Commit

Permalink
Merge pull request #937 from daspilker/JENKINS-38964
Browse files Browse the repository at this point in the history
[JENKINS-38964] handle Describables without Descriptor
  • Loading branch information
daspilker committed Oct 17, 2016
2 parents 361a1cc + 5e8af75 commit 46ba0c6
Show file tree
Hide file tree
Showing 4 changed files with 74 additions and 5 deletions.
5 changes: 3 additions & 2 deletions docs/Home.md
Expand Up @@ -43,8 +43,9 @@ Browse the Jenkins issue tracker to see any [open issues](https://issues.jenkins
([JENKINS-37418](https://issues.jenkins-ci.org/browse/JENKINS-37418))
* Allow `CredentialsBindingContext` to be extended
([#920](https://github.com/jenkinsci/job-dsl-plugin/pull/920))
* Fixed problem with embedded API viewer when a plugin is not available in the Update Center
([JENKINS-38456](https://issues.jenkins-ci.org/browse/JENKINS-38456))
* Fixed problem with embedded API viewer
([JENKINS-38456](https://issues.jenkins-ci.org/browse/JENKINS-38456),
[JENKINS-38964](https://issues.jenkins-ci.org/browse/JENKINS-38964))
* Support for the older versions of the [Git Plugin](https://wiki.jenkins-ci.org/display/JENKINS/Git+Plugin) is
deprecated, see [Migration](Migration#migrating-to-152)
* Support for the older versions of the [Multijob Plugin](https://wiki.jenkins-ci.org/display/JENKINS/Multijob+Plugin)
Expand Down
Expand Up @@ -52,7 +52,10 @@ class DescribableHelper {
* @see #uncapitalize(java.lang.Class)
*/
static Collection<DescribableModel> findDescribableModels(Collection<DescribableModel> models, String name) {
Collection<DescribableModel> result = models.findAll { SymbolLookup.get().find(getTypeForLookup(it), name) }
Collection<DescribableModel> result = models.findAll {
Class type = getTypeForLookup(it)
type == null ? null : SymbolLookup.get().find(type, name)
}
result ?: models.findAll { uncapitalize(it.type) == name }
}

Expand Down Expand Up @@ -147,7 +150,7 @@ class DescribableHelper {
}

private static Class getTypeForLookup(DescribableModel model) {
Describable.isAssignableFrom(model.type) ? Jenkins.instance.getDescriptorOrDie(model.type).class : model.type
Describable.isAssignableFrom(model.type) ? Jenkins.instance.getDescriptor(model.type)?.class : model.type
}

private static List<Descriptor> getDescriptors(Class<?> contextType) {
Expand Down Expand Up @@ -191,7 +194,7 @@ class DescribableHelper {
Map<String, DescribableModel> result = [:]
Set<String> duplicateSymbols = []
models.each { DescribableModel model ->
Symbol symbol = getTypeForLookup(model).getAnnotation(Symbol)
Symbol symbol = getTypeForLookup(model)?.getAnnotation(Symbol)
symbol?.value()?.each {
if (!duplicateSymbols.contains(it)) {
if (result.containsKey(it)) {
Expand Down
@@ -0,0 +1,12 @@
package javaposse.jobdsl.plugin.fixtures

import hudson.model.Job
import hudson.triggers.Trigger
import org.kohsuke.stapler.DataBoundConstructor

class InvalidTrigger extends Trigger<Job> {
@SuppressWarnings('UnnecessaryConstructor')
@DataBoundConstructor
InvalidTrigger() {
}
}
Expand Up @@ -20,13 +20,15 @@ import javaposse.jobdsl.plugin.fixtures.Foo
import javaposse.jobdsl.plugin.fixtures.FooTrigger
import javaposse.jobdsl.plugin.fixtures.IntegerTrigger
import javaposse.jobdsl.plugin.fixtures.InvalidContext
import javaposse.jobdsl.plugin.fixtures.InvalidTrigger
import javaposse.jobdsl.plugin.fixtures.SomeTrigger
import jenkins.triggers.ReverseBuildTrigger
import org.jenkinsci.plugins.structs.describable.DescribableModel
import org.junit.ClassRule
import org.jvnet.hudson.test.JenkinsRule
import spock.lang.Shared
import spock.lang.Specification
import javaposse.jobdsl.plugin.ExecuteDslScripts

class DescribableHelperSpec extends Specification {
@Shared
Expand Down Expand Up @@ -111,6 +113,45 @@ class DescribableHelperSpec extends Specification {
e.message.contains(Describable.name)
}

def 'find describable models for uncapitalized class name'() {
setup:
DescribableModel model = new DescribableModel(SCMTrigger)

when:
Collection<DescribableModel> models = DescribableHelper.findDescribableModels([model], 'scmTrigger')

then:
models != null
models.size() == 1
models.contains(model)
}

def 'find describable models for symbol'() {
setup:
DescribableModel model = new DescribableModel(ExecuteDslScripts)

when:
Collection<DescribableModel> models = DescribableHelper.findDescribableModels([model], 'jobDsl')

then:
models != null
models.size() == 1
models.contains(model)
}

def 'find describable models for Describable without Descriptor'() {
setup:
DescribableModel model = new DescribableModel(InvalidTrigger)

when:
Collection<DescribableModel> models = DescribableHelper.findDescribableModels([model], 'invalidTrigger')

then:
models != null
models.size() == 1
models.contains(model)
}

def 'is optional closure argument'() {
expect:
DescribableHelper.isOptionalClosureArgument()
Expand Down Expand Up @@ -193,6 +234,18 @@ class DescribableHelperSpec extends Specification {
models['integerTrigger'].type == IntegerTrigger
}

def 'models indexed by symbolic name for Describable without Descriptor'() {
given:
DescribableModel model = new DescribableModel(InvalidTrigger)

when:
Map<String, DescribableModel> models = DescribableHelper.findDescribableModels([model])

then:
models.size() == 1
models['invalidTrigger'].type == InvalidTrigger
}

def 'models indexed by symbolic name from context'() {
when:
Map<String, DescribableModel> models = DescribableHelper.findDescribableModels(TriggerContext)
Expand Down

0 comments on commit 46ba0c6

Please sign in to comment.