Skip to content

Commit

Permalink
Merge pull request #15 from Jimilian/classpath
Browse files Browse the repository at this point in the history
Add posibility to add custom folders to classpath
  • Loading branch information
nickgrealy committed Apr 22, 2016
2 parents ee6f72a + 99e07b7 commit 252c241
Show file tree
Hide file tree
Showing 5 changed files with 102 additions and 38 deletions.
Expand Up @@ -12,6 +12,8 @@ import org.kohsuke.stapler.QueryParameter
import org.kohsuke.stapler.StaplerRequest
import org.kohsuke.stapler.export.ExportedBean

import java.lang.instrument.Instrumentation
import java.lang.reflect.Field
import java.util.concurrent.TimeUnit
import java.util.logging.Level
import java.util.logging.Logger
Expand Down Expand Up @@ -99,35 +101,12 @@ class GlobalEventsPlugin extends Plugin implements Describable<GlobalEventsPlugi
private boolean onJobFinalized = true;
private boolean onJobDeleted = true;
private int scheduleTime = 0;
private String classPath = null;

void setDisableSynchronization(boolean disableSynchronization) {
this.disableSynchronization = disableSynchronization
}

void setOnPluginStarted(boolean onPluginStarted) {
this.onPluginStarted = onPluginStarted
}

void setOnPluginStopped(boolean onPluginStopped) {
this.onPluginStopped = onPluginStopped
}

void setOnJobStarted(boolean onJobStarted) {
this.onJobStarted = onJobStarted
}

void setOnJobCompleted(boolean onJobCompleted) {
this.onJobCompleted = onJobCompleted
}

void setOnJobFinalized(boolean onJobFinalized) {
this.onJobFinalized = onJobFinalized
}

void setOnJobDeleted(boolean onJobDeleted) {
this.onJobDeleted = onJobDeleted
}

boolean getOnJobDeleted() {
return onJobDeleted
}
Expand Down Expand Up @@ -160,8 +139,13 @@ class GlobalEventsPlugin extends Plugin implements Describable<GlobalEventsPlugi
return scheduleTime
}

void setScheduleTime(int scheduleTime) {
this.scheduleTime = scheduleTime
String getClassPath() {
return classPath
}

void setClassPath(String classPath) {
this.classPath = classPath
updateClasspath()
}

/**
Expand All @@ -171,9 +155,18 @@ class GlobalEventsPlugin extends Plugin implements Describable<GlobalEventsPlugi
DescriptorImpl(ClassLoader classLoader) {
load()
groovyClassLoader = new GroovyClassLoader(classLoader);
updateClasspath()
groovyScript = getScriptReadyToBeExecuted(getOnEventGroovyCode())
}

private updateClasspath() {
if (classPath !=null) {
for (String path : classPath.split(",")) {
groovyClassLoader.addClasspath(path.trim())
}
}
}

void putToContext(Object key, Object value) {
context.put(key, value);
}
Expand Down Expand Up @@ -211,16 +204,20 @@ class GlobalEventsPlugin extends Plugin implements Describable<GlobalEventsPlugi

@Override
boolean configure(StaplerRequest req, JSONObject formData) {
setOnEventGroovyCode(formData.getString("onEventGroovyCode"))
setOnPluginStarted(formData.getBoolean("onPluginStarted"))
setOnPluginStopped(formData.getBoolean("onPluginStopped"))
setOnJobStarted(formData.getBoolean("onJobStarted"))
setOnJobCompleted(formData.getBoolean("onJobCompleted"))
setOnJobFinalized(formData.getBoolean("onJobFinalized"))
setOnJobDeleted(formData.getBoolean("onJobDeleted"))
setDisableSynchronization(formData.getBoolean("disableSynchronization"))
setScheduleTime(formData.getInt("scheduleTime"))
onEventGroovyCode = formData.getString("onEventGroovyCode")
onPluginStarted = formData.getBoolean("onPluginStarted")
onPluginStopped = formData.getBoolean("onPluginStopped")
onJobStarted = formData.getBoolean("onJobStarted")
onJobCompleted = formData.getBoolean("onJobCompleted")
onJobFinalized = formData.getBoolean("onJobFinalized")
onJobDeleted = formData.getBoolean("onJobDeleted")
disableSynchronization = formData.getBoolean("disableSynchronization")
scheduleTime = formData.getInt("scheduleTime")
classPath = formData.getString("classPath")

updateClasspath()
groovyScript = getScriptReadyToBeExecuted(onEventGroovyCode)

save() // save configuration

if (scheduleTime > 0) {
Expand Down
Expand Up @@ -9,7 +9,6 @@
import javax.annotation.Nonnull;
import java.util.HashMap;
import java.util.logging.Logger;

/**
* Warning: This MUST stay a Java class, Groovy cannot compile (for some reason??).
*/
Expand Down
Expand Up @@ -60,6 +60,11 @@
<f:textbox field="scheduleTime" />
</f:entry>
</f:section>
<f:section title="Classpath">
<f:entry title="Path" description="Add comma-separated list of directories to classpath" field="classPath">
<f:textbox />
</f:entry>
</f:section>
</f:advanced>
</f:section>
</j:jelly>
@@ -0,0 +1,19 @@
<div>
If you have some complicated code and you don't want to store it in Jenkins configuration page,
you can easily extract it to groovy file, save in folder and add this folder to class path.

After that you will be able to import this class from your code.

Example:
<pre><code>
> cd /var/lib/jenkins
> mkdir groovy_scripts
> echo "class Constants { public static final int TIMEOUT = 10; }" > groovy_scripts/Constants.groovy
</code></pre>

Now you cad add <code>/var/lib/jenkins/groovy_scripts</code> folder to classpath and do something like this:
<pre><code>
import Constants
log.info Constants.TIMEOUT
</code></pre>
</div>
@@ -1,19 +1,28 @@
package org.jenkinsci.plugins.globalEventsPlugin

import org.apache.tools.ant.taskdefs.TempFile
import org.codehaus.groovy.control.MultipleCompilationErrorsException
import org.junit.Before
import org.junit.Rule
import org.junit.Test
import org.junit.rules.TemporaryFolder

import java.util.concurrent.Callable
import java.util.concurrent.ExecutorService
import java.util.concurrent.Executors
import java.util.concurrent.FutureTask

import static groovy.test.GroovyAssert.shouldFail

/**
* Created by nickgrealy@gmail.com.
*/
class GlobalEventsPluginTest {
private GlobalEventsPlugin.DescriptorImpl plugin
private LoggerTrap logger

GlobalEventsPlugin.DescriptorImpl plugin
LoggerTrap logger
@Rule
public TemporaryFolder folder= new TemporaryFolder();

@Before
void setup(){
Expand All @@ -32,6 +41,41 @@ class GlobalEventsPluginTest {
assert plugin.context == [success:true]
}

@Test
void testImportFromTwoNewClasses(){
File folder1 = folder.newFolder()
PrintWriter writer = new PrintWriter(folder1.absolutePath + "/Class1.groovy", "UTF-8");
writer.println("public class Class1 { public static int A = 1; }");
writer.close()

File folder2 = folder.newFolder()
writer = new PrintWriter(folder2.absolutePath + "/Class2.groovy", "UTF-8");
writer.println("public class Class2 { public static int A = 2; }");
writer.close()

writer = new PrintWriter(folder2.absolutePath + "/Class3.groovy", "UTF-8");
writer.println("public class Class3 { public static int A = 3; }");
writer.close()

plugin.setClassPath(folder1.absolutePath + " , " + folder2.absolutePath);
plugin.setOnEventGroovyCode("import Class1;" +
"import Class2;" +
"import Class3;" +
"context.c1 = Class1.A;" +
"context.c2 = Class2.A;" +
"context.c3 = Class3.A")
plugin.safeExecOnEventGroovyCode(logger, [:])

assert plugin.context == [c1: 1, c2: 2, c3: 3]
}

@Test
void testFailToImport(){
shouldFail MultipleCompilationErrorsException, {
plugin.setOnEventGroovyCode("import test.TestClass")
}
}

@Test
void testCounter(){
int expectedValue = 1000
Expand Down

0 comments on commit 252c241

Please sign in to comment.