diff --git a/.gitignore b/.gitignore index 6b468b62..316834ff 100644 --- a/.gitignore +++ b/.gitignore @@ -1 +1,8 @@ *.class +.vscode/* +.classpath +.project +.settings/* +dependency-reduced-pom.xml +target/* +.idea/* \ No newline at end of file diff --git a/.travis.yml b/.travis.yml new file mode 100644 index 00000000..dff5f3a5 --- /dev/null +++ b/.travis.yml @@ -0,0 +1 @@ +language: java diff --git a/Build_History/History.html b/Build_History/History.html new file mode 100644 index 00000000..1043d028 --- /dev/null +++ b/Build_History/History.html @@ -0,0 +1,54 @@ + + + + My build history + + + These are the URLs
+ https://api.github.com/repos/gzh0528/ci-server/statuses/cd578476aaae3f8d5c23d6ab2e87ef93601ef6e7
+ https://api.github.com/repos/gzh0528/ci-server/statuses/ee22fad706519f89b6bce12be35ff04c0f859be9
https://api.github.com/repos/DD2480-Group-15/ci-server/statuses/641ae048a4c1c83096d1031c3037ebf015a3b591

+
+
+
+

+ + + \ No newline at end of file diff --git a/Build_History/data.json b/Build_History/data.json new file mode 100644 index 00000000..2550e8a8 --- /dev/null +++ b/Build_History/data.json @@ -0,0 +1 @@ +[{"log":"[INFO] Scanning for projects...
[INFO]
[INFO] ----------------------< DD2480-Group-15:gs-maven >----------------------
[INFO] Building gs-maven 0.1.0
[INFO] --------------------------------[ jar ]---------------------------------
[INFO]
[INFO] --- maven-resources-plugin:2.6:resources (default-resources) @ gs-maven ---
[WARNING] Using platform encoding (UTF-8 actually) to copy filtered resources, i.e. build is platform dependent!
[INFO] skip non existing resourceDirectory /Users/zehuag/IdeaProjects/historymy/ci-server/cloned-repo/src/main/resources
[INFO]
[INFO] --- maven-compiler-plugin:3.1:compile (default-compile) @ gs-maven ---
[INFO] Changes detected - recompiling the module!
[WARNING] File encoding has not been set, using platform encoding UTF-8, i.e. build is platform dependent!
[INFO] Compiling 1 source file to /Users/zehuag/IdeaProjects/historymy/ci-server/cloned-repo/target/classes
[INFO]
[INFO] --- maven-resources-plugin:2.6:testResources (default-testResources) @ gs-maven ---
[WARNING] Using platform encoding (UTF-8 actually) to copy filtered resources, i.e. build is platform dependent!
[INFO] skip non existing resourceDirectory /Users/zehuag/IdeaProjects/historymy/ci-server/cloned-repo/src/test/resources
[INFO]
[INFO] --- maven-compiler-plugin:3.1:testCompile (default-testCompile) @ gs-maven ---
[INFO] Changes detected - recompiling the module!
[WARNING] File encoding has not been set, using platform encoding UTF-8, i.e. build is platform dependent!
[INFO] Compiling 1 source file to /Users/zehuag/IdeaProjects/historymy/ci-server/cloned-repo/target/test-classes
[INFO]
[INFO] --- maven-surefire-plugin:2.22.0:test (default-test) @ gs-maven ---
[INFO]
[INFO] -------------------------------------------------------
[INFO] T E S T S
[INFO] -------------------------------------------------------
[INFO] Running server.TestServer
Calling dummyFunction
[INFO] Tests run: 2, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.006 s - in server.TestServer
[INFO]
[INFO] Results:
[INFO]
[INFO] Tests run: 2, Failures: 0, Errors: 0, Skipped: 0
[INFO]
[INFO]
[INFO] --- maven-jar-plugin:2.4:jar (default-jar) @ gs-maven ---
[INFO] Building jar: /Users/zehuag/IdeaProjects/historymy/ci-server/cloned-repo/target/gs-maven-0.1.0.jar
[INFO]
[INFO] --- maven-shade-plugin:3.2.4:shade (default) @ gs-maven ---
[INFO] Including org.eclipse.jetty:jetty-server:jar:7.0.2.v20100331 in the shaded jar.
[INFO] Including javax.servlet:servlet-api:jar:2.5 in the shaded jar.
[INFO] Including org.eclipse.jetty:jetty-continuation:jar:7.0.2.v20100331 in the shaded jar.
[INFO] Including org.eclipse.jetty:jetty-http:jar:7.0.2.v20100331 in the shaded jar.
[INFO] Including org.eclipse.jetty:jetty-io:jar:7.0.2.v20100331 in the shaded jar.
[INFO] Including org.eclipse.jetty:jetty-util:jar:7.0.2.v20100331 in the shaded jar.
[INFO] Including org.json:json:jar:20201115 in the shaded jar.
[WARNING] gs-maven-0.1.0.jar, jetty-continuation-7.0.2.v20100331.jar, jetty-http-7.0.2.v20100331.jar, jetty-io-7.0.2.v20100331.jar, jetty-server-7.0.2.v20100331.jar, jetty-util-7.0.2.v20100331.jar, json-20201115.jar, servlet-api-2.5.jar define 1 overlapping resource:
[WARNING] - META-INF/MANIFEST.MF
[WARNING] jetty-continuation-7.0.2.v20100331.jar, jetty-http-7.0.2.v20100331.jar, jetty-io-7.0.2.v20100331.jar, jetty-server-7.0.2.v20100331.jar, jetty-util-7.0.2.v20100331.jar define 1 overlapping resource:
[WARNING] - about.html
[WARNING] maven-shade-plugin has detected that some class files are
[WARNING] present in two or more JARs. When this happens, only one
[WARNING] single version of the class is copied to the uber jar.
[WARNING] Usually this is not harmful and you can skip these warnings,
[WARNING] otherwise try to manually exclude artifacts based on
[WARNING] mvn dependency:tree -Ddetail=true and the above output.
[WARNING] See http://maven.apache.org/plugins/maven-shade-plugin/
[INFO] Replacing original artifact with shaded artifact.
[INFO] Replacing /Users/zehuag/IdeaProjects/historymy/ci-server/cloned-repo/target/gs-maven-0.1.0.jar with /Users/zehuag/IdeaProjects/historymy/ci-server/cloned-repo/target/gs-maven-0.1.0-shaded.jar
[INFO] Dependency-reduced POM written at: /Users/zehuag/IdeaProjects/historymy/ci-server/cloned-repo/dependency-reduced-pom.xml
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 2.660 s
[INFO] Finished at: 2021-02-17T18:52:54+01:00
[INFO] ------------------------------------------------------------------------
","SHA":"cd578476aaae3f8d5c23d6ab2e87ef93601ef6e7","Date":"2021-02-17T18:52:54+01:00"},{"log":"[INFO] Scanning for projects...
[INFO]
[INFO] ----------------------< DD2480-Group-15:gs-maven >----------------------
[INFO] Building gs-maven 0.1.0
[INFO] --------------------------------[ jar ]---------------------------------
[INFO]
[INFO] --- maven-resources-plugin:2.6:resources (default-resources) @ gs-maven ---
[WARNING] Using platform encoding (UTF-8 actually) to copy filtered resources, i.e. build is platform dependent!
[INFO] skip non existing resourceDirectory /Users/zehuag/IdeaProjects/historymy/ci-server/cloned-repo/src/main/resources
[INFO]
[INFO] --- maven-compiler-plugin:3.1:compile (default-compile) @ gs-maven ---
[INFO] Changes detected - recompiling the module!
[WARNING] File encoding has not been set, using platform encoding UTF-8, i.e. build is platform dependent!
[INFO] Compiling 1 source file to /Users/zehuag/IdeaProjects/historymy/ci-server/cloned-repo/target/classes
[INFO]
[INFO] --- maven-resources-plugin:2.6:testResources (default-testResources) @ gs-maven ---
[WARNING] Using platform encoding (UTF-8 actually) to copy filtered resources, i.e. build is platform dependent!
[INFO] skip non existing resourceDirectory /Users/zehuag/IdeaProjects/historymy/ci-server/cloned-repo/src/test/resources
[INFO]
[INFO] --- maven-compiler-plugin:3.1:testCompile (default-testCompile) @ gs-maven ---
[INFO] Changes detected - recompiling the module!
[WARNING] File encoding has not been set, using platform encoding UTF-8, i.e. build is platform dependent!
[INFO] Compiling 1 source file to /Users/zehuag/IdeaProjects/historymy/ci-server/cloned-repo/target/test-classes
[INFO]
[INFO] --- maven-surefire-plugin:2.22.0:test (default-test) @ gs-maven ---
[INFO]
[INFO] -------------------------------------------------------
[INFO] T E S T S
[INFO] -------------------------------------------------------
[INFO] Running server.TestServer
Calling dummyFunction
[INFO] Tests run: 2, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.007 s - in server.TestServer
[INFO]
[INFO] Results:
[INFO]
[INFO] Tests run: 2, Failures: 0, Errors: 0, Skipped: 0
[INFO]
[INFO]
[INFO] --- maven-jar-plugin:2.4:jar (default-jar) @ gs-maven ---
[INFO] Building jar: /Users/zehuag/IdeaProjects/historymy/ci-server/cloned-repo/target/gs-maven-0.1.0.jar
[INFO]
[INFO] --- maven-shade-plugin:3.2.4:shade (default) @ gs-maven ---
[INFO] Including org.eclipse.jetty:jetty-server:jar:7.0.2.v20100331 in the shaded jar.
[INFO] Including javax.servlet:servlet-api:jar:2.5 in the shaded jar.
[INFO] Including org.eclipse.jetty:jetty-continuation:jar:7.0.2.v20100331 in the shaded jar.
[INFO] Including org.eclipse.jetty:jetty-http:jar:7.0.2.v20100331 in the shaded jar.
[INFO] Including org.eclipse.jetty:jetty-io:jar:7.0.2.v20100331 in the shaded jar.
[INFO] Including org.eclipse.jetty:jetty-util:jar:7.0.2.v20100331 in the shaded jar.
[INFO] Including org.json:json:jar:20201115 in the shaded jar.
[WARNING] gs-maven-0.1.0.jar, jetty-continuation-7.0.2.v20100331.jar, jetty-http-7.0.2.v20100331.jar, jetty-io-7.0.2.v20100331.jar, jetty-server-7.0.2.v20100331.jar, jetty-util-7.0.2.v20100331.jar, json-20201115.jar, servlet-api-2.5.jar define 1 overlapping resource:
[WARNING] - META-INF/MANIFEST.MF
[WARNING] jetty-continuation-7.0.2.v20100331.jar, jetty-http-7.0.2.v20100331.jar, jetty-io-7.0.2.v20100331.jar, jetty-server-7.0.2.v20100331.jar, jetty-util-7.0.2.v20100331.jar define 1 overlapping resource:
[WARNING] - about.html
[WARNING] maven-shade-plugin has detected that some class files are
[WARNING] present in two or more JARs. When this happens, only one
[WARNING] single version of the class is copied to the uber jar.
[WARNING] Usually this is not harmful and you can skip these warnings,
[WARNING] otherwise try to manually exclude artifacts based on
[WARNING] mvn dependency:tree -Ddetail=true and the above output.
[WARNING] See http://maven.apache.org/plugins/maven-shade-plugin/
[INFO] Replacing original artifact with shaded artifact.
[INFO] Replacing /Users/zehuag/IdeaProjects/historymy/ci-server/cloned-repo/target/gs-maven-0.1.0.jar with /Users/zehuag/IdeaProjects/historymy/ci-server/cloned-repo/target/gs-maven-0.1.0-shaded.jar
[INFO] Dependency-reduced POM written at: /Users/zehuag/IdeaProjects/historymy/ci-server/cloned-repo/dependency-reduced-pom.xml
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 2.582 s
[INFO] Finished at: 2021-02-17T18:53:54+01:00
[INFO] ------------------------------------------------------------------------
","SHA":"ee22fad706519f89b6bce12be35ff04c0f859be9","Date":"2021-02-17T18:53:54+01:00"},{"log":"WARNING: An illegal reflective access operation has occurred
WARNING: Illegal reflective access by com.google.inject.internal.cglib.core.$ReflectUtils$1 (file:/usr/share/maven/lib/guice.jar) to method java.lang.ClassLoader.defineClass(java.lang.String,byte[],int,int,java.security.ProtectionDomain)
WARNING: Please consider reporting this to the maintainers of com.google.inject.internal.cglib.core.$ReflectUtils$1
WARNING: Use --illegal-access=warn to enable warnings of further illegal reflective access operations
WARNING: All illegal access operations will be denied in a future release
[\u001b[1;34mINFO\u001b[m] Scanning for projects...
[\u001b[1;33mWARNING\u001b[m]
[\u001b[1;33mWARNING\u001b[m] Some problems were encountered while building the effective model for DD2480-Group-15:gs-maven:jar:0.1.0
[\u001b[1;33mWARNING\u001b[m] 'build.plugins.plugin.version' for org.apache.maven.plugins:maven-compiler-plugin is missing. @ line 104, column 21
[\u001b[1;33mWARNING\u001b[m]
[\u001b[1;33mWARNING\u001b[m] It is highly recommended to fix these problems because they threaten the stability of your build.
[\u001b[1;33mWARNING\u001b[m]
[\u001b[1;33mWARNING\u001b[m] For this reason, future Maven versions might no longer support building such malformed projects.
[\u001b[1;33mWARNING\u001b[m]
[\u001b[1;34mINFO\u001b[m]
[\u001b[1;34mINFO\u001b[m] \u001b[1m----------------------< \u001b[0;36mDD2480-Group-15:gs-maven\u001b[0;1m >----------------------\u001b[m
[\u001b[1;34mINFO\u001b[m] \u001b[1mBuilding gs-maven 0.1.0\u001b[m
[\u001b[1;34mINFO\u001b[m] \u001b[1m--------------------------------[ jar ]---------------------------------\u001b[m
[\u001b[1;34mINFO\u001b[m]
[\u001b[1;34mINFO\u001b[m] \u001b[1m--- \u001b[0;32mmaven-resources-plugin:2.6:resources\u001b[m \u001b[1m(default-resources)\u001b[m @ \u001b[36mgs-maven\u001b[0;1m ---\u001b[m
[\u001b[1;33mWARNING\u001b[m] Using platform encoding (UTF-8 actually) to copy filtered resources, i.e. build is platform dependent!
[\u001b[1;34mINFO\u001b[m] skip non existing resourceDirectory /home/philip/kth-courses/se21/ci-server/cloned-repo/src/main/resources
[\u001b[1;34mINFO\u001b[m]
[\u001b[1;34mINFO\u001b[m] \u001b[1m--- \u001b[0;32mmaven-compiler-plugin:3.1:compile\u001b[m \u001b[1m(default-compile)\u001b[m @ \u001b[36mgs-maven\u001b[0;1m ---\u001b[m
[\u001b[1;34mINFO\u001b[m] Changes detected - recompiling the module!
[\u001b[1;33mWARNING\u001b[m] File encoding has not been set, using platform encoding UTF-8, i.e. build is platform dependent!
[\u001b[1;34mINFO\u001b[m] Compiling 1 source file to /home/philip/kth-courses/se21/ci-server/cloned-repo/target/classes
[\u001b[1;34mINFO\u001b[m]
[\u001b[1;34mINFO\u001b[m] \u001b[1m--- \u001b[0;32mmaven-resources-plugin:2.6:testResources\u001b[m \u001b[1m(default-testResources)\u001b[m @ \u001b[36mgs-maven\u001b[0;1m ---\u001b[m
[\u001b[1;33mWARNING\u001b[m] Using platform encoding (UTF-8 actually) to copy filtered resources, i.e. build is platform dependent!
[\u001b[1;34mINFO\u001b[m] skip non existing resourceDirectory /home/philip/kth-courses/se21/ci-server/cloned-repo/src/test/resources
[\u001b[1;34mINFO\u001b[m]
[\u001b[1;34mINFO\u001b[m] \u001b[1m--- \u001b[0;32mmaven-compiler-plugin:3.1:testCompile\u001b[m \u001b[1m(default-testCompile)\u001b[m @ \u001b[36mgs-maven\u001b[0;1m ---\u001b[m
[\u001b[1;34mINFO\u001b[m] Changes detected - recompiling the module!
[\u001b[1;33mWARNING\u001b[m] File encoding has not been set, using platform encoding UTF-8, i.e. build is platform dependent!
[\u001b[1;34mINFO\u001b[m] Compiling 1 source file to /home/philip/kth-courses/se21/ci-server/cloned-repo/target/test-classes
[\u001b[1;34mINFO\u001b[m]
[\u001b[1;34mINFO\u001b[m] \u001b[1m--- \u001b[0;32mmaven-surefire-plugin:2.22.0:test\u001b[m \u001b[1m(default-test)\u001b[m @ \u001b[36mgs-maven\u001b[0;1m ---\u001b[m
[\u001b[1;34mINFO\u001b[m]
[\u001b[1;34mINFO\u001b[m] -------------------------------------------------------
[\u001b[1;34mINFO\u001b[m] T E S T S
[\u001b[1;34mINFO\u001b[m] -------------------------------------------------------
[\u001b[1;34mINFO\u001b[m] Running server.\u001b[1mTestServer\u001b[m
Getting repository URL
[\u001b[1;34mINFO\u001b[m] \u001b[1;32mTests run: \u001b[0;1;32m3\u001b[m, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.036 s - in server.\u001b[1mTestServer\u001b[m
[\u001b[1;34mINFO\u001b[m]
[\u001b[1;34mINFO\u001b[m] Results:
[\u001b[1;34mINFO\u001b[m]
[\u001b[1;34mINFO\u001b[m] \u001b[1;32mTests run: 3, Failures: 0, Errors: 0, Skipped: 0\u001b[m
[\u001b[1;34mINFO\u001b[m]
[\u001b[1;34mINFO\u001b[m]
[\u001b[1;34mINFO\u001b[m] \u001b[1m--- \u001b[0;32mmaven-jar-plugin:2.4:jar\u001b[m \u001b[1m(default-jar)\u001b[m @ \u001b[36mgs-maven\u001b[0;1m ---\u001b[m
[\u001b[1;34mINFO\u001b[m] Building jar: /home/philip/kth-courses/se21/ci-server/cloned-repo/target/gs-maven-0.1.0.jar
[\u001b[1;34mINFO\u001b[m]
[\u001b[1;34mINFO\u001b[m] \u001b[1m--- \u001b[0;32mmaven-shade-plugin:3.2.4:shade\u001b[m \u001b[1m(default)\u001b[m @ \u001b[36mgs-maven\u001b[0;1m ---\u001b[m
[\u001b[1;34mINFO\u001b[m] Including org.eclipse.jetty:jetty-server:jar:7.0.2.v20100331 in the shaded jar.
[\u001b[1;34mINFO\u001b[m] Including javax.servlet:servlet-api:jar:2.5 in the shaded jar.
[\u001b[1;34mINFO\u001b[m] Including org.eclipse.jetty:jetty-continuation:jar:7.0.2.v20100331 in the shaded jar.
[\u001b[1;34mINFO\u001b[m] Including org.eclipse.jetty:jetty-http:jar:7.0.2.v20100331 in the shaded jar.
[\u001b[1;34mINFO\u001b[m] Including org.eclipse.jetty:jetty-io:jar:7.0.2.v20100331 in the shaded jar.
[\u001b[1;34mINFO\u001b[m] Including org.eclipse.jetty:jetty-util:jar:7.0.2.v20100331 in the shaded jar.
[\u001b[1;34mINFO\u001b[m] Including org.json:json:jar:20201115 in the shaded jar.
[\u001b[1;34mINFO\u001b[m] Including commons-io:commons-io:jar:2.6 in the shaded jar.
[\u001b[1;34mINFO\u001b[m] Including org.apache.httpcomponents:httpclient:jar:4.5.13 in the shaded jar.
[\u001b[1;34mINFO\u001b[m] Including org.apache.httpcomponents:httpcore:jar:4.4.13 in the shaded jar.
[\u001b[1;34mINFO\u001b[m] Including commons-logging:commons-logging:jar:1.2 in the shaded jar.
[\u001b[1;34mINFO\u001b[m] Including commons-codec:commons-codec:jar:1.11 in the shaded jar.
[\u001b[1;34mINFO\u001b[m] Including org.jsoup:jsoup:jar:1.10.2 in the shaded jar.
[\u001b[1;33mWARNING\u001b[m] commons-codec-1.11.jar, commons-io-2.6.jar, commons-logging-1.2.jar, gs-maven-0.1.0.jar, httpclient-4.5.13.jar, httpcore-4.4.13.jar, jetty-continuation-7.0.2.v20100331.jar, jetty-http-7.0.2.v20100331.jar, jetty-io-7.0.2.v20100331.jar, jetty-server-7.0.2.v20100331.jar, jetty-util-7.0.2.v20100331.jar, json-20201115.jar, jsoup-1.10.2.jar, servlet-api-2.5.jar define 1 overlapping resource:
[\u001b[1;33mWARNING\u001b[m] - META-INF/MANIFEST.MF
[\u001b[1;33mWARNING\u001b[m] jetty-continuation-7.0.2.v20100331.jar, jetty-http-7.0.2.v20100331.jar, jetty-io-7.0.2.v20100331.jar, jetty-server-7.0.2.v20100331.jar, jetty-util-7.0.2.v20100331.jar define 1 overlapping resource:
[\u001b[1;33mWARNING\u001b[m] - about.html
[\u001b[1;33mWARNING\u001b[m] commons-codec-1.11.jar, commons-io-2.6.jar, commons-logging-1.2.jar define 2 overlapping resources:
[\u001b[1;33mWARNING\u001b[m] - META-INF/LICENSE.txt
[\u001b[1;33mWARNING\u001b[m] - META-INF/NOTICE.txt
[\u001b[1;33mWARNING\u001b[m] httpclient-4.5.13.jar, httpcore-4.4.13.jar define 2 overlapping resources:
[\u001b[1;33mWARNING\u001b[m] - META-INF/DEPENDENCIES
[\u001b[1;33mWARNING\u001b[m] - META-INF/NOTICE
[\u001b[1;33mWARNING\u001b[m] httpclient-4.5.13.jar, httpcore-4.4.13.jar, jsoup-1.10.2.jar define 1 overlapping resource:
[\u001b[1;33mWARNING\u001b[m] - META-INF/LICENSE
[\u001b[1;33mWARNING\u001b[m] maven-shade-plugin has detected that some class files are
[\u001b[1;33mWARNING\u001b[m] present in two or more JARs. When this happens, only one
[\u001b[1;33mWARNING\u001b[m] single version of the class is copied to the uber jar.
[\u001b[1;33mWARNING\u001b[m] Usually this is not harmful and you can skip these warnings,
[\u001b[1;33mWARNING\u001b[m] otherwise try to manually exclude artifacts based on
[\u001b[1;33mWARNING\u001b[m] mvn dependency:tree -Ddetail=true and the above output.
[\u001b[1;33mWARNING\u001b[m] See http://maven.apache.org/plugins/maven-shade-plugin/
[\u001b[1;34mINFO\u001b[m] Replacing original artifact with shaded artifact.
[\u001b[1;34mINFO\u001b[m] Replacing /home/philip/kth-courses/se21/ci-server/cloned-repo/target/gs-maven-0.1.0.jar with /home/philip/kth-courses/se21/ci-server/cloned-repo/target/gs-maven-0.1.0-shaded.jar
[\u001b[1;34mINFO\u001b[m] Dependency-reduced POM written at: /home/philip/kth-courses/se21/ci-server/cloned-repo/dependency-reduced-pom.xml
[\u001b[1;34mINFO\u001b[m] \u001b[1m------------------------------------------------------------------------\u001b[m
[\u001b[1;34mINFO\u001b[m] \u001b[1;32mBUILD SUCCESS\u001b[m
[\u001b[1;34mINFO\u001b[m] \u001b[1m------------------------------------------------------------------------\u001b[m
[\u001b[1;34mINFO\u001b[m] Total time: 5.270 s
[\u001b[1;34mINFO\u001b[m] Finished at: 2021-02-17T21:20:36+01:00
[\u001b[1;34mINFO\u001b[m] \u001b[1m------------------------------------------------------------------------\u001b[m
","SHA":"641ae048a4c1c83096d1031c3037ebf015a3b591","Date":"2021-02-17T21:20:36+01:00"}] \ No newline at end of file diff --git a/ContinuousIntegrationServer.java b/ContinuousIntegrationServer.java deleted file mode 100644 index 9adb2ff0..00000000 --- a/ContinuousIntegrationServer.java +++ /dev/null @@ -1,45 +0,0 @@ -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; -import javax.servlet.ServletException; - -import java.io.IOException; - -import org.eclipse.jetty.server.Server; -import org.eclipse.jetty.server.Request; -import org.eclipse.jetty.server.handler.AbstractHandler; - -/** - Skeleton of a ContinuousIntegrationServer which acts as webhook - See the Jetty documentation for API documentation of those classes. -*/ -public class ContinuousIntegrationServer extends AbstractHandler -{ - public void handle(String target, - Request baseRequest, - HttpServletRequest request, - HttpServletResponse response) - throws IOException, ServletException - { - response.setContentType("text/html;charset=utf-8"); - response.setStatus(HttpServletResponse.SC_OK); - baseRequest.setHandled(true); - - System.out.println(target); - - // here you do all the continuous integration tasks - // for example - // 1st clone your repository - // 2nd compile the code - - response.getWriter().println("CI job done"); - } - - // used to start the CI server in command line - public static void main(String[] args) throws Exception - { - Server server = new Server(8080); - server.setHandler(new ContinuousIntegrationServer()); - server.start(); - server.join(); - } -} diff --git a/README.md b/README.md index e2848cfe..cece0516 100644 --- a/README.md +++ b/README.md @@ -1,52 +1,54 @@ -The smallest Java Continuous Integration server for Github +A small Java Continuous Integration server. =========================================================== +This is a simple server for Continuous Integration development. It is meant to be called as webhook by Github. The HTTP part of it is based on Jetty. Maven is used to build and test, and notifications to the repository are sent through the GitHub status API. The server keeps a history of the past builds and log files attached to them. -Here is a tiny CI server skeleton implemented in Java for educational purposes. It is meant to be called as webhook by Github. The HTTP part of it is based on Jetty. +## Contributions +**Philip Andersson (CSCphilp):** Maven handling, JSON handling, bug fixes, docs -We assume here that you have a standard Linux machine (eg with Ubuntu), with Java installed. +**Zehua Guo (gzh0528):** Cloning, building and testing the repository, Build History + +**Jonatan Yao Håkansson (jonte450):** Testing,Notifify function helped together with Kalle + +**Elisabet Lövkvist (SQUEEEE):** Documentation, code skeleton for server functions, tests + +**Kalle Meurman (Wizkas0):** Cloning the repo, sending notification to GitHub + +## How to run: +We assume here that you have a standard Linux machine (eg with Ubuntu), with Java and Maven installed. After checking out the repository, build it in the root directory using the following command: -We first checkout this repository: ``` -git clone https://github.com/monperrus/smallest-java-ci -cd smallest-java-ci +mvn package ``` -We then download the required dependencies: +Then start the server on your local machine: ``` -JETTY_VERSION=7.0.2.v20100331 -wget -U none https://repo1.maven.org/maven2/org/eclipse/jetty/aggregate/jetty-all/$JETTY_VERSION/jetty-all-$JETTY_VERSION.jar -wget -U none https://repo1.maven.org/maven2/javax/servlet/servlet-api/2.5/servlet-api-2.5.jar -#For linux users: -curl -LO --tlsv1 https://bin.equinox.io/c/4VmDzA7iaHb/ngrok-stable-linux-amd64.zip -unzip ngrok-stable-linux-amd64.zip -#For Mac user: -curl -LO --tlsv1 https://bin.equinox.io/c/4VmDzA7iaHb/ngrok-stable-darwin-386.zip -unzip ngrok-stable-darwin-386.zip +java -jar target/gs-maven-0.1.0.jar ``` +## Using Ngrok to connect the server to GitHub +The server can be made visible on the Internet by using [Ngrok](https://ngrok.com/). + +### Download Ngrok +First you need to download it: -We compile the skeleton the continuous integration server: ``` -javac -cp servlet-api-2.5.jar:jetty-all-$JETTY_VERSION.jar ContinuousIntegrationServer.java +curl -LO --tlsv1 https://bin.equinox.io/c/4VmDzA7iaHb/ngrok-stable-linux-amd64.zip +unzip ngrok-stable-linux-amd64.zip ``` +### Run Ngrok and connect to GitHub -We run the server on the machine, and we may make it visible on the Internet thanks to [Ngrok](https://ngrok.com/): +The public url can be found by running the following commnand in a separate terminal window to the one running the server (in the same folder as Ngrok was downloaded): ``` -# open a first terminal window -JETTY_VERSION=7.0.2.v20100331 -java -cp .:servlet-api-2.5.jar:jetty-all-$JETTY_VERSION.jar ContinuousIntegrationServer - # open a second terminal window # this gives you the public URL of your CI server to set in Github # copy-paste the forwarding URL "Forwarding http://8929b010.ngrok.io -> localhost:8080" # note that this url is short-lived, and is reset everytime you run ngrok ./ngrok http 8080 - ``` - -We configure our Github repository: +Copy the url looking like [number sequence].ngrok.io, then go to the GitHub repository you want to the server to monitor. * go to `Settings >> Webhooks`, click on `Add webhook`. -* paste the forwarding URL (eg `http://8929b010.ngrok.io`) in field `Payload URL`) and send click on `Add webhook`. In the simplest setting, nothing more is required. +* paste the forwarding URL (eg `http://8929b010.ngrok.io`) in field `Payload URL`) and send click on `Add webhook`. +* **Set the content type to application/json** We test that everything works: @@ -56,7 +58,7 @@ We test that everything works: * observe the result, in two ways: * locally: in the console of your first terminal window, observe the requested URL printed on the console * on github: go to `Settings >> Webhooks` in your repo, click on your newly created webhook, scroll down to "Recent Deliveries", click on the last delivery and the on the `Response tab`, you'll see the output of your server `CI job done` - * on ngrok: raise the terminal window with Ngrok, and you'll also the see URLs requested by Github + * on ngrok: raise the terminal window with Ngrok, and you'll also the see URLs requested by Github. We shutdown everything: @@ -65,4 +67,7 @@ We shutdown everything: * delete the webhook in the webhook configuration page. Notes: -* by default, Github delivers a `push` JSON payloard, documented here: , this information can be used to get interesting information about the commit that has just been pushed. +* by default, Github delivers a `push` JSON payload, documented here: , this information can be used to get interesting information about the commit that has just been pushed. + +### View history of past builds +The history data is stored in data.json. To see the history, you can click the html file called History.html in the Build_History folder. The html page contains a list of URLs. By clicking each of them, you will see the log of that build. diff --git a/docs/allclasses-index.html b/docs/allclasses-index.html new file mode 100644 index 00000000..a1268d09 --- /dev/null +++ b/docs/allclasses-index.html @@ -0,0 +1,101 @@ + + + + + +All Classes (gs-maven 0.1.0 API) + + + + + + + + + + + + + + +
+ +
+
+
+

All Classes

+
+
+ + + + + + + + + + + + + + +
Class Summary
ClassDescription
ContinuousIntegrationServer<BASE64Encoder,​BASE64Decoder> +
Skeleton of a ContinuousIntegrationServer which acts as webhook + See the Jetty documentation for API documentation of those classes.
+
+
+
+ +
+
+ + diff --git a/docs/allpackages-index.html b/docs/allpackages-index.html new file mode 100644 index 00000000..91cc5e13 --- /dev/null +++ b/docs/allpackages-index.html @@ -0,0 +1,98 @@ + + + + + +All Packages (gs-maven 0.1.0 API) + + + + + + + + + + + + + + +
+ +
+
+
+

All Packages

+
+
+ + + + + + + + + + + + + + +
Package Summary
PackageDescription
server 
+
+
+ +
+
+ + diff --git a/docs/constant-values.html b/docs/constant-values.html new file mode 100644 index 00000000..b3dec2bd --- /dev/null +++ b/docs/constant-values.html @@ -0,0 +1,84 @@ + + + + + +Constant Field Values (gs-maven 0.1.0 API) + + + + + + + + + + + + + + +
+ +
+
+
+

Constant Field Values

+
+

Contents

+
+
+
+ +
+
+ + diff --git a/docs/deprecated-list.html b/docs/deprecated-list.html new file mode 100644 index 00000000..b20d4adb --- /dev/null +++ b/docs/deprecated-list.html @@ -0,0 +1,82 @@ + + + + + +Deprecated List (gs-maven 0.1.0 API) + + + + + + + + + + + + + + +
+ +
+
+
+

Deprecated API

+

Contents

+
+
+ +
+
+ + diff --git a/docs/element-list b/docs/element-list new file mode 100644 index 00000000..254defdd --- /dev/null +++ b/docs/element-list @@ -0,0 +1 @@ +server diff --git a/docs/help-doc.html b/docs/help-doc.html new file mode 100644 index 00000000..0eb65b3f --- /dev/null +++ b/docs/help-doc.html @@ -0,0 +1,182 @@ + + + + + +API Help (gs-maven 0.1.0 API) + + + + + + + + + + + + + + +
+ +
+
+
+

How This API Document Is Organized

+
This API (Application Programming Interface) document has pages corresponding to the items in the navigation bar, described as follows.
+
+
+

Package

+

Each package has a page that contains a list of its classes and interfaces, with a summary for each. These pages may contain six categories:

+
    +
  • Interfaces
  • +
  • Classes
  • +
  • Enums
  • +
  • Exceptions
  • +
  • Errors
  • +
  • Annotation Types
  • +
+
+
+

Class or Interface

+

Each class, interface, nested class and nested interface has its own separate page. Each of these pages has three sections consisting of a class/interface description, summary tables, and detailed member descriptions:

+
    +
  • Class Inheritance Diagram
  • +
  • Direct Subclasses
  • +
  • All Known Subinterfaces
  • +
  • All Known Implementing Classes
  • +
  • Class or Interface Declaration
  • +
  • Class or Interface Description
  • +
+
+
    +
  • Nested Class Summary
  • +
  • Field Summary
  • +
  • Property Summary
  • +
  • Constructor Summary
  • +
  • Method Summary
  • +
+
+
    +
  • Field Details
  • +
  • Property Details
  • +
  • Constructor Details
  • +
  • Method Details
  • +
+

The summary entries are alphabetical, while the detailed descriptions are in the order they appear in the source code. This preserves the logical groupings established by the programmer.

+
+
+

Annotation Type

+

Each annotation type has its own separate page with the following sections:

+
    +
  • Annotation Type Declaration
  • +
  • Annotation Type Description
  • +
  • Required Element Summary
  • +
  • Optional Element Summary
  • +
  • Element Details
  • +
+
+
+

Enum

+

Each enum has its own separate page with the following sections:

+
    +
  • Enum Declaration
  • +
  • Enum Description
  • +
  • Enum Constant Summary
  • +
  • Enum Constant Details
  • +
+
+
+

Use

+

Each documented package, class and interface has its own Use page. This page describes what packages, classes, methods, constructors and fields use any part of the given class or package. Given a class or interface A, its "Use" page includes subclasses of A, fields declared as A, methods that return A, and methods and constructors with parameters of type A. You can access this page by first going to the package, class or interface, then clicking on the "Use" link in the navigation bar.

+
+
+

Tree (Class Hierarchy)

+

There is a Class Hierarchy page for all packages, plus a hierarchy for each package. Each hierarchy page contains a list of classes and a list of interfaces. Classes are organized by inheritance structure starting with java.lang.Object. Interfaces do not inherit from java.lang.Object.

+
    +
  • When viewing the Overview page, clicking on "Tree" displays the hierarchy for all packages.
  • +
  • When viewing a particular package, class or interface page, clicking on "Tree" displays the hierarchy for only that package.
  • +
+
+
+

Deprecated API

+

The Deprecated API page lists all of the API that have been deprecated. A deprecated API is not recommended for use, generally due to shortcomings, and a replacement API is usually given. Deprecated APIs may be removed in future implementations.

+
+
+

Index

+

The Index contains an alphabetic index of all classes, interfaces, constructors, methods, and fields, as well as lists of all packages and all classes.

+
+
+

Serialized Form

+

Each serializable or externalizable class has a description of its serialization fields and methods. This information is of interest to those who implement rather than use the API. While there is no link in the navigation bar, you can get to this information by going to any serialized class and clicking "Serialized Form" in the "See Also" section of the class description.

+
+
+

Constant Field Values

+

The Constant Field Values page lists the static final fields and their values.

+
+
+

Search

+

You can search for definitions of modules, packages, types, fields, methods, system properties and other terms defined in the API, using some or all of the name, optionally using "camel-case" abbreviations. For example:

+
    +
  • j.l.obj will match "java.lang.Object"
  • +
  • InpStr will match "java.io.InputStream"
  • +
  • HM.cK will match "java.util.HashMap.containsKey(Object)"
  • +
+

Refer to the Javadoc Search Specification for a full description of search features.

+
+
+This help file applies to API documentation generated by the standard doclet.
+ +
+
+ + diff --git a/docs/index-all.html b/docs/index-all.html new file mode 100644 index 00000000..822386f1 --- /dev/null +++ b/docs/index-all.html @@ -0,0 +1,152 @@ + + + + + +Index (gs-maven 0.1.0 API) + + + + + + + + + + + + + + +
+ +
+
+
+

Index

+
+B C G H J M S 
All Classes|All Packages +

B

+
+
buildAndTest(String, String) - Static method in class server.ContinuousIntegrationServer
+
+
Builds and tests a specified repository + if BUILD SUCCESS, the directory is deleted
+
+
+

C

+
+
cloneRepo(String) - Static method in class server.ContinuousIntegrationServer
+
+
Clones a repo into the directory ./cloned-repo
+
+
ContinuousIntegrationServer<BASE64Encoder,​BASE64Decoder> - Class in server
+
+
Skeleton of a ContinuousIntegrationServer which acts as webhook + See the Jetty documentation for API documentation of those classes.
+
+
ContinuousIntegrationServer() - Constructor for class server.ContinuousIntegrationServer
+
 
+
+

G

+
+
getJSON(BufferedReader) - Static method in class server.ContinuousIntegrationServer
+
+
Creates a JSON object from the body of a http POST request from a GitHub webhook.
+
+
getRepoURL(JSONObject) - Static method in class server.ContinuousIntegrationServer
+
+
Gets the GitHub repo url and recently pushed branch from the input json + and combine these to form a compatible string to use with the 'git clone' command.
+
+
getStatusUrl(JSONObject) - Static method in class server.ContinuousIntegrationServer
+
+
Gets url to the status of the latest commit in a given push
+
+
+

H

+
+
handle(String, Request, HttpServletRequest, HttpServletResponse) - Method in class server.ContinuousIntegrationServer
+
 
+
+

J

+
+
JS_HTML(int, String) - Static method in class server.ContinuousIntegrationServer
+
+
Update the HTML
+
+
JSOread(String, String, String) - Static method in class server.ContinuousIntegrationServer
+
+
Update the history JSON file.
+
+
+

M

+
+
main(String[]) - Static method in class server.ContinuousIntegrationServer
+
+
Main method.
+
+
+

S

+
+
server - package server
+
 
+
set_commit_status(String, String, int, String) - Static method in class server.ContinuousIntegrationServer
+
+
Sets status of a commit to one of the four possible values (error/pending/success/failure) with provided context and message
+
+
+B C G H J M S 
All Classes|All Packages
+ +
+
+ + diff --git a/docs/index.html b/docs/index.html new file mode 100644 index 00000000..1eaaa0f5 --- /dev/null +++ b/docs/index.html @@ -0,0 +1,26 @@ + + + + + +gs-maven 0.1.0 API + + + + + + + + + + +
+ +

server/package-summary.html

+
+ + diff --git a/docs/jquery-ui.overrides.css b/docs/jquery-ui.overrides.css new file mode 100644 index 00000000..1abff952 --- /dev/null +++ b/docs/jquery-ui.overrides.css @@ -0,0 +1,34 @@ +/* + * Copyright (c) 2020, Oracle and/or its affiliates. All rights reserved. + * ORACLE PROPRIETARY/CONFIDENTIAL. Use is subject to license terms. + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + */ + +.ui-state-active, +.ui-widget-content .ui-state-active, +.ui-widget-header .ui-state-active, +a.ui-button:active, +.ui-button:active, +.ui-button.ui-state-active:hover { + /* Overrides the color of selection used in jQuery UI */ + background: #F8981D; +} diff --git a/docs/member-search-index.js b/docs/member-search-index.js new file mode 100644 index 00000000..c13ad490 --- /dev/null +++ b/docs/member-search-index.js @@ -0,0 +1 @@ +memberSearchIndex = [{"p":"server","c":"ContinuousIntegrationServer","l":"buildAndTest(String, String)","u":"buildAndTest(java.lang.String,java.lang.String)"},{"p":"server","c":"ContinuousIntegrationServer","l":"cloneRepo(String)","u":"cloneRepo(java.lang.String)"},{"p":"server","c":"ContinuousIntegrationServer","l":"ContinuousIntegrationServer()","u":"%3Cinit%3E()"},{"p":"server","c":"ContinuousIntegrationServer","l":"getJSON(BufferedReader)","u":"getJSON(java.io.BufferedReader)"},{"p":"server","c":"ContinuousIntegrationServer","l":"getRepoURL(JSONObject)","u":"getRepoURL(org.json.JSONObject)"},{"p":"server","c":"ContinuousIntegrationServer","l":"getStatusUrl(JSONObject)","u":"getStatusUrl(org.json.JSONObject)"},{"p":"server","c":"ContinuousIntegrationServer","l":"handle(String, Request, HttpServletRequest, HttpServletResponse)","u":"handle(java.lang.String,org.eclipse.jetty.server.Request,javax.servlet.http.HttpServletRequest,javax.servlet.http.HttpServletResponse)"},{"p":"server","c":"ContinuousIntegrationServer","l":"JS_HTML(int, String)","u":"JS_HTML(int,java.lang.String)"},{"p":"server","c":"ContinuousIntegrationServer","l":"JSOread(String, String, String)","u":"JSOread(java.lang.String,java.lang.String,java.lang.String)"},{"p":"server","c":"ContinuousIntegrationServer","l":"main(String[])","u":"main(java.lang.String[])"},{"p":"server","c":"ContinuousIntegrationServer","l":"set_commit_status(String, String, int, String)","u":"set_commit_status(java.lang.String,java.lang.String,int,java.lang.String)"}];updateSearchResults(); \ No newline at end of file diff --git a/docs/module-search-index.js b/docs/module-search-index.js new file mode 100644 index 00000000..0d59754f --- /dev/null +++ b/docs/module-search-index.js @@ -0,0 +1 @@ +moduleSearchIndex = [];updateSearchResults(); \ No newline at end of file diff --git a/docs/overview-tree.html b/docs/overview-tree.html new file mode 100644 index 00000000..4e9aee67 --- /dev/null +++ b/docs/overview-tree.html @@ -0,0 +1,103 @@ + + + + + +Class Hierarchy (gs-maven 0.1.0 API) + + + + + + + + + + + + + + +
+ +
+
+
+

Hierarchy For All Packages

+Package Hierarchies: + +
+
+

Class Hierarchy

+
    +
  • java.lang.Object +
      +
    • org.eclipse.jetty.util.component.AbstractLifeCycle (implements org.eclipse.jetty.util.component.LifeCycle) +
        +
      • org.eclipse.jetty.server.handler.AbstractHandler (implements org.eclipse.jetty.server.Handler) + +
      • +
      +
    • +
    +
  • +
+
+
+ +
+
+ + diff --git a/docs/package-search-index.js b/docs/package-search-index.js new file mode 100644 index 00000000..b7b69ecd --- /dev/null +++ b/docs/package-search-index.js @@ -0,0 +1 @@ +packageSearchIndex = [{"l":"All Packages","u":"allpackages-index.html"},{"l":"server"}];updateSearchResults(); \ No newline at end of file diff --git a/docs/resources/glass.png b/docs/resources/glass.png new file mode 100644 index 00000000..a7f591f4 Binary files /dev/null and b/docs/resources/glass.png differ diff --git a/docs/resources/x.png b/docs/resources/x.png new file mode 100644 index 00000000..30548a75 Binary files /dev/null and b/docs/resources/x.png differ diff --git a/docs/script-dir/images/ui-bg_glass_55_fbf9ee_1x400.png b/docs/script-dir/images/ui-bg_glass_55_fbf9ee_1x400.png new file mode 100644 index 00000000..34abd18f Binary files /dev/null and b/docs/script-dir/images/ui-bg_glass_55_fbf9ee_1x400.png differ diff --git a/docs/script-dir/images/ui-bg_glass_65_dadada_1x400.png b/docs/script-dir/images/ui-bg_glass_65_dadada_1x400.png new file mode 100644 index 00000000..f058a938 Binary files /dev/null and b/docs/script-dir/images/ui-bg_glass_65_dadada_1x400.png differ diff --git a/docs/script-dir/images/ui-bg_glass_75_dadada_1x400.png b/docs/script-dir/images/ui-bg_glass_75_dadada_1x400.png new file mode 100644 index 00000000..2ce04c16 Binary files /dev/null and b/docs/script-dir/images/ui-bg_glass_75_dadada_1x400.png differ diff --git a/docs/script-dir/images/ui-bg_glass_75_e6e6e6_1x400.png b/docs/script-dir/images/ui-bg_glass_75_e6e6e6_1x400.png new file mode 100644 index 00000000..a90afb8b Binary files /dev/null and b/docs/script-dir/images/ui-bg_glass_75_e6e6e6_1x400.png differ diff --git a/docs/script-dir/images/ui-bg_glass_95_fef1ec_1x400.png b/docs/script-dir/images/ui-bg_glass_95_fef1ec_1x400.png new file mode 100644 index 00000000..dbe091f6 Binary files /dev/null and b/docs/script-dir/images/ui-bg_glass_95_fef1ec_1x400.png differ diff --git a/docs/script-dir/images/ui-bg_highlight-soft_75_cccccc_1x100.png b/docs/script-dir/images/ui-bg_highlight-soft_75_cccccc_1x100.png new file mode 100644 index 00000000..5dc3593e Binary files /dev/null and b/docs/script-dir/images/ui-bg_highlight-soft_75_cccccc_1x100.png differ diff --git a/docs/script-dir/images/ui-icons_222222_256x240.png b/docs/script-dir/images/ui-icons_222222_256x240.png new file mode 100644 index 00000000..e723e17c Binary files /dev/null and b/docs/script-dir/images/ui-icons_222222_256x240.png differ diff --git a/docs/script-dir/images/ui-icons_2e83ff_256x240.png b/docs/script-dir/images/ui-icons_2e83ff_256x240.png new file mode 100644 index 00000000..1f5f4975 Binary files /dev/null and b/docs/script-dir/images/ui-icons_2e83ff_256x240.png differ diff --git a/docs/script-dir/images/ui-icons_454545_256x240.png b/docs/script-dir/images/ui-icons_454545_256x240.png new file mode 100644 index 00000000..618f5b0c Binary files /dev/null and b/docs/script-dir/images/ui-icons_454545_256x240.png differ diff --git a/docs/script-dir/images/ui-icons_888888_256x240.png b/docs/script-dir/images/ui-icons_888888_256x240.png new file mode 100644 index 00000000..ee5e33f2 Binary files /dev/null and b/docs/script-dir/images/ui-icons_888888_256x240.png differ diff --git a/docs/script-dir/images/ui-icons_cd0a0a_256x240.png b/docs/script-dir/images/ui-icons_cd0a0a_256x240.png new file mode 100644 index 00000000..7e8ebc18 Binary files /dev/null and b/docs/script-dir/images/ui-icons_cd0a0a_256x240.png differ diff --git a/docs/script-dir/jquery-3.5.1.min.js b/docs/script-dir/jquery-3.5.1.min.js new file mode 100644 index 00000000..b0614034 --- /dev/null +++ b/docs/script-dir/jquery-3.5.1.min.js @@ -0,0 +1,2 @@ +/*! jQuery v3.5.1 | (c) JS Foundation and other contributors | jquery.org/license */ +!function(e,t){"use strict";"object"==typeof module&&"object"==typeof module.exports?module.exports=e.document?t(e,!0):function(e){if(!e.document)throw new Error("jQuery requires a window with a document");return t(e)}:t(e)}("undefined"!=typeof window?window:this,function(C,e){"use strict";var t=[],r=Object.getPrototypeOf,s=t.slice,g=t.flat?function(e){return t.flat.call(e)}:function(e){return t.concat.apply([],e)},u=t.push,i=t.indexOf,n={},o=n.toString,v=n.hasOwnProperty,a=v.toString,l=a.call(Object),y={},m=function(e){return"function"==typeof e&&"number"!=typeof e.nodeType},x=function(e){return null!=e&&e===e.window},E=C.document,c={type:!0,src:!0,nonce:!0,noModule:!0};function b(e,t,n){var r,i,o=(n=n||E).createElement("script");if(o.text=e,t)for(r in c)(i=t[r]||t.getAttribute&&t.getAttribute(r))&&o.setAttribute(r,i);n.head.appendChild(o).parentNode.removeChild(o)}function w(e){return null==e?e+"":"object"==typeof e||"function"==typeof e?n[o.call(e)]||"object":typeof e}var f="3.5.1",S=function(e,t){return new S.fn.init(e,t)};function p(e){var t=!!e&&"length"in e&&e.length,n=w(e);return!m(e)&&!x(e)&&("array"===n||0===t||"number"==typeof t&&0+~]|"+M+")"+M+"*"),U=new RegExp(M+"|>"),X=new RegExp(F),V=new RegExp("^"+I+"$"),G={ID:new RegExp("^#("+I+")"),CLASS:new RegExp("^\\.("+I+")"),TAG:new RegExp("^("+I+"|[*])"),ATTR:new RegExp("^"+W),PSEUDO:new RegExp("^"+F),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+M+"*(even|odd|(([+-]|)(\\d*)n|)"+M+"*(?:([+-]|)"+M+"*(\\d+)|))"+M+"*\\)|)","i"),bool:new RegExp("^(?:"+R+")$","i"),needsContext:new RegExp("^"+M+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+M+"*((?:-\\d)?\\d*)"+M+"*\\)|)(?=[^-]|$)","i")},Y=/HTML$/i,Q=/^(?:input|select|textarea|button)$/i,J=/^h\d$/i,K=/^[^{]+\{\s*\[native \w/,Z=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,ee=/[+~]/,te=new RegExp("\\\\[\\da-fA-F]{1,6}"+M+"?|\\\\([^\\r\\n\\f])","g"),ne=function(e,t){var n="0x"+e.slice(1)-65536;return t||(n<0?String.fromCharCode(n+65536):String.fromCharCode(n>>10|55296,1023&n|56320))},re=/([\0-\x1f\x7f]|^-?\d)|^-$|[^\0-\x1f\x7f-\uFFFF\w-]/g,ie=function(e,t){return t?"\0"===e?"\ufffd":e.slice(0,-1)+"\\"+e.charCodeAt(e.length-1).toString(16)+" ":"\\"+e},oe=function(){T()},ae=be(function(e){return!0===e.disabled&&"fieldset"===e.nodeName.toLowerCase()},{dir:"parentNode",next:"legend"});try{H.apply(t=O.call(p.childNodes),p.childNodes),t[p.childNodes.length].nodeType}catch(e){H={apply:t.length?function(e,t){L.apply(e,O.call(t))}:function(e,t){var n=e.length,r=0;while(e[n++]=t[r++]);e.length=n-1}}}function se(t,e,n,r){var i,o,a,s,u,l,c,f=e&&e.ownerDocument,p=e?e.nodeType:9;if(n=n||[],"string"!=typeof t||!t||1!==p&&9!==p&&11!==p)return n;if(!r&&(T(e),e=e||C,E)){if(11!==p&&(u=Z.exec(t)))if(i=u[1]){if(9===p){if(!(a=e.getElementById(i)))return n;if(a.id===i)return n.push(a),n}else if(f&&(a=f.getElementById(i))&&y(e,a)&&a.id===i)return n.push(a),n}else{if(u[2])return H.apply(n,e.getElementsByTagName(t)),n;if((i=u[3])&&d.getElementsByClassName&&e.getElementsByClassName)return H.apply(n,e.getElementsByClassName(i)),n}if(d.qsa&&!N[t+" "]&&(!v||!v.test(t))&&(1!==p||"object"!==e.nodeName.toLowerCase())){if(c=t,f=e,1===p&&(U.test(t)||z.test(t))){(f=ee.test(t)&&ye(e.parentNode)||e)===e&&d.scope||((s=e.getAttribute("id"))?s=s.replace(re,ie):e.setAttribute("id",s=S)),o=(l=h(t)).length;while(o--)l[o]=(s?"#"+s:":scope")+" "+xe(l[o]);c=l.join(",")}try{return H.apply(n,f.querySelectorAll(c)),n}catch(e){N(t,!0)}finally{s===S&&e.removeAttribute("id")}}}return g(t.replace($,"$1"),e,n,r)}function ue(){var r=[];return function e(t,n){return r.push(t+" ")>b.cacheLength&&delete e[r.shift()],e[t+" "]=n}}function le(e){return e[S]=!0,e}function ce(e){var t=C.createElement("fieldset");try{return!!e(t)}catch(e){return!1}finally{t.parentNode&&t.parentNode.removeChild(t),t=null}}function fe(e,t){var n=e.split("|"),r=n.length;while(r--)b.attrHandle[n[r]]=t}function pe(e,t){var n=t&&e,r=n&&1===e.nodeType&&1===t.nodeType&&e.sourceIndex-t.sourceIndex;if(r)return r;if(n)while(n=n.nextSibling)if(n===t)return-1;return e?1:-1}function de(t){return function(e){return"input"===e.nodeName.toLowerCase()&&e.type===t}}function he(n){return function(e){var t=e.nodeName.toLowerCase();return("input"===t||"button"===t)&&e.type===n}}function ge(t){return function(e){return"form"in e?e.parentNode&&!1===e.disabled?"label"in e?"label"in e.parentNode?e.parentNode.disabled===t:e.disabled===t:e.isDisabled===t||e.isDisabled!==!t&&ae(e)===t:e.disabled===t:"label"in e&&e.disabled===t}}function ve(a){return le(function(o){return o=+o,le(function(e,t){var n,r=a([],e.length,o),i=r.length;while(i--)e[n=r[i]]&&(e[n]=!(t[n]=e[n]))})})}function ye(e){return e&&"undefined"!=typeof e.getElementsByTagName&&e}for(e in d=se.support={},i=se.isXML=function(e){var t=e.namespaceURI,n=(e.ownerDocument||e).documentElement;return!Y.test(t||n&&n.nodeName||"HTML")},T=se.setDocument=function(e){var t,n,r=e?e.ownerDocument||e:p;return r!=C&&9===r.nodeType&&r.documentElement&&(a=(C=r).documentElement,E=!i(C),p!=C&&(n=C.defaultView)&&n.top!==n&&(n.addEventListener?n.addEventListener("unload",oe,!1):n.attachEvent&&n.attachEvent("onunload",oe)),d.scope=ce(function(e){return a.appendChild(e).appendChild(C.createElement("div")),"undefined"!=typeof e.querySelectorAll&&!e.querySelectorAll(":scope fieldset div").length}),d.attributes=ce(function(e){return e.className="i",!e.getAttribute("className")}),d.getElementsByTagName=ce(function(e){return e.appendChild(C.createComment("")),!e.getElementsByTagName("*").length}),d.getElementsByClassName=K.test(C.getElementsByClassName),d.getById=ce(function(e){return a.appendChild(e).id=S,!C.getElementsByName||!C.getElementsByName(S).length}),d.getById?(b.filter.ID=function(e){var t=e.replace(te,ne);return function(e){return e.getAttribute("id")===t}},b.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&E){var n=t.getElementById(e);return n?[n]:[]}}):(b.filter.ID=function(e){var n=e.replace(te,ne);return function(e){var t="undefined"!=typeof e.getAttributeNode&&e.getAttributeNode("id");return t&&t.value===n}},b.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&E){var n,r,i,o=t.getElementById(e);if(o){if((n=o.getAttributeNode("id"))&&n.value===e)return[o];i=t.getElementsByName(e),r=0;while(o=i[r++])if((n=o.getAttributeNode("id"))&&n.value===e)return[o]}return[]}}),b.find.TAG=d.getElementsByTagName?function(e,t){return"undefined"!=typeof t.getElementsByTagName?t.getElementsByTagName(e):d.qsa?t.querySelectorAll(e):void 0}:function(e,t){var n,r=[],i=0,o=t.getElementsByTagName(e);if("*"===e){while(n=o[i++])1===n.nodeType&&r.push(n);return r}return o},b.find.CLASS=d.getElementsByClassName&&function(e,t){if("undefined"!=typeof t.getElementsByClassName&&E)return t.getElementsByClassName(e)},s=[],v=[],(d.qsa=K.test(C.querySelectorAll))&&(ce(function(e){var t;a.appendChild(e).innerHTML="",e.querySelectorAll("[msallowcapture^='']").length&&v.push("[*^$]="+M+"*(?:''|\"\")"),e.querySelectorAll("[selected]").length||v.push("\\["+M+"*(?:value|"+R+")"),e.querySelectorAll("[id~="+S+"-]").length||v.push("~="),(t=C.createElement("input")).setAttribute("name",""),e.appendChild(t),e.querySelectorAll("[name='']").length||v.push("\\["+M+"*name"+M+"*="+M+"*(?:''|\"\")"),e.querySelectorAll(":checked").length||v.push(":checked"),e.querySelectorAll("a#"+S+"+*").length||v.push(".#.+[+~]"),e.querySelectorAll("\\\f"),v.push("[\\r\\n\\f]")}),ce(function(e){e.innerHTML="";var t=C.createElement("input");t.setAttribute("type","hidden"),e.appendChild(t).setAttribute("name","D"),e.querySelectorAll("[name=d]").length&&v.push("name"+M+"*[*^$|!~]?="),2!==e.querySelectorAll(":enabled").length&&v.push(":enabled",":disabled"),a.appendChild(e).disabled=!0,2!==e.querySelectorAll(":disabled").length&&v.push(":enabled",":disabled"),e.querySelectorAll("*,:x"),v.push(",.*:")})),(d.matchesSelector=K.test(c=a.matches||a.webkitMatchesSelector||a.mozMatchesSelector||a.oMatchesSelector||a.msMatchesSelector))&&ce(function(e){d.disconnectedMatch=c.call(e,"*"),c.call(e,"[s!='']:x"),s.push("!=",F)}),v=v.length&&new RegExp(v.join("|")),s=s.length&&new RegExp(s.join("|")),t=K.test(a.compareDocumentPosition),y=t||K.test(a.contains)?function(e,t){var n=9===e.nodeType?e.documentElement:e,r=t&&t.parentNode;return e===r||!(!r||1!==r.nodeType||!(n.contains?n.contains(r):e.compareDocumentPosition&&16&e.compareDocumentPosition(r)))}:function(e,t){if(t)while(t=t.parentNode)if(t===e)return!0;return!1},D=t?function(e,t){if(e===t)return l=!0,0;var n=!e.compareDocumentPosition-!t.compareDocumentPosition;return n||(1&(n=(e.ownerDocument||e)==(t.ownerDocument||t)?e.compareDocumentPosition(t):1)||!d.sortDetached&&t.compareDocumentPosition(e)===n?e==C||e.ownerDocument==p&&y(p,e)?-1:t==C||t.ownerDocument==p&&y(p,t)?1:u?P(u,e)-P(u,t):0:4&n?-1:1)}:function(e,t){if(e===t)return l=!0,0;var n,r=0,i=e.parentNode,o=t.parentNode,a=[e],s=[t];if(!i||!o)return e==C?-1:t==C?1:i?-1:o?1:u?P(u,e)-P(u,t):0;if(i===o)return pe(e,t);n=e;while(n=n.parentNode)a.unshift(n);n=t;while(n=n.parentNode)s.unshift(n);while(a[r]===s[r])r++;return r?pe(a[r],s[r]):a[r]==p?-1:s[r]==p?1:0}),C},se.matches=function(e,t){return se(e,null,null,t)},se.matchesSelector=function(e,t){if(T(e),d.matchesSelector&&E&&!N[t+" "]&&(!s||!s.test(t))&&(!v||!v.test(t)))try{var n=c.call(e,t);if(n||d.disconnectedMatch||e.document&&11!==e.document.nodeType)return n}catch(e){N(t,!0)}return 0":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(e){return e[1]=e[1].replace(te,ne),e[3]=(e[3]||e[4]||e[5]||"").replace(te,ne),"~="===e[2]&&(e[3]=" "+e[3]+" "),e.slice(0,4)},CHILD:function(e){return e[1]=e[1].toLowerCase(),"nth"===e[1].slice(0,3)?(e[3]||se.error(e[0]),e[4]=+(e[4]?e[5]+(e[6]||1):2*("even"===e[3]||"odd"===e[3])),e[5]=+(e[7]+e[8]||"odd"===e[3])):e[3]&&se.error(e[0]),e},PSEUDO:function(e){var t,n=!e[6]&&e[2];return G.CHILD.test(e[0])?null:(e[3]?e[2]=e[4]||e[5]||"":n&&X.test(n)&&(t=h(n,!0))&&(t=n.indexOf(")",n.length-t)-n.length)&&(e[0]=e[0].slice(0,t),e[2]=n.slice(0,t)),e.slice(0,3))}},filter:{TAG:function(e){var t=e.replace(te,ne).toLowerCase();return"*"===e?function(){return!0}:function(e){return e.nodeName&&e.nodeName.toLowerCase()===t}},CLASS:function(e){var t=m[e+" "];return t||(t=new RegExp("(^|"+M+")"+e+"("+M+"|$)"))&&m(e,function(e){return t.test("string"==typeof e.className&&e.className||"undefined"!=typeof e.getAttribute&&e.getAttribute("class")||"")})},ATTR:function(n,r,i){return function(e){var t=se.attr(e,n);return null==t?"!="===r:!r||(t+="","="===r?t===i:"!="===r?t!==i:"^="===r?i&&0===t.indexOf(i):"*="===r?i&&-1:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i;function D(e,n,r){return m(n)?S.grep(e,function(e,t){return!!n.call(e,t,e)!==r}):n.nodeType?S.grep(e,function(e){return e===n!==r}):"string"!=typeof n?S.grep(e,function(e){return-1)[^>]*|#([\w-]+))$/;(S.fn.init=function(e,t,n){var r,i;if(!e)return this;if(n=n||j,"string"==typeof e){if(!(r="<"===e[0]&&">"===e[e.length-1]&&3<=e.length?[null,e,null]:q.exec(e))||!r[1]&&t)return!t||t.jquery?(t||n).find(e):this.constructor(t).find(e);if(r[1]){if(t=t instanceof S?t[0]:t,S.merge(this,S.parseHTML(r[1],t&&t.nodeType?t.ownerDocument||t:E,!0)),N.test(r[1])&&S.isPlainObject(t))for(r in t)m(this[r])?this[r](t[r]):this.attr(r,t[r]);return this}return(i=E.getElementById(r[2]))&&(this[0]=i,this.length=1),this}return e.nodeType?(this[0]=e,this.length=1,this):m(e)?void 0!==n.ready?n.ready(e):e(S):S.makeArray(e,this)}).prototype=S.fn,j=S(E);var L=/^(?:parents|prev(?:Until|All))/,H={children:!0,contents:!0,next:!0,prev:!0};function O(e,t){while((e=e[t])&&1!==e.nodeType);return e}S.fn.extend({has:function(e){var t=S(e,this),n=t.length;return this.filter(function(){for(var e=0;e\x20\t\r\n\f]*)/i,he=/^$|^module$|\/(?:java|ecma)script/i;ce=E.createDocumentFragment().appendChild(E.createElement("div")),(fe=E.createElement("input")).setAttribute("type","radio"),fe.setAttribute("checked","checked"),fe.setAttribute("name","t"),ce.appendChild(fe),y.checkClone=ce.cloneNode(!0).cloneNode(!0).lastChild.checked,ce.innerHTML="",y.noCloneChecked=!!ce.cloneNode(!0).lastChild.defaultValue,ce.innerHTML="",y.option=!!ce.lastChild;var ge={thead:[1,"","
"],col:[2,"","
"],tr:[2,"","
"],td:[3,"","
"],_default:[0,"",""]};function ve(e,t){var n;return n="undefined"!=typeof e.getElementsByTagName?e.getElementsByTagName(t||"*"):"undefined"!=typeof e.querySelectorAll?e.querySelectorAll(t||"*"):[],void 0===t||t&&A(e,t)?S.merge([e],n):n}function ye(e,t){for(var n=0,r=e.length;n",""]);var me=/<|&#?\w+;/;function xe(e,t,n,r,i){for(var o,a,s,u,l,c,f=t.createDocumentFragment(),p=[],d=0,h=e.length;d\s*$/g;function qe(e,t){return A(e,"table")&&A(11!==t.nodeType?t:t.firstChild,"tr")&&S(e).children("tbody")[0]||e}function Le(e){return e.type=(null!==e.getAttribute("type"))+"/"+e.type,e}function He(e){return"true/"===(e.type||"").slice(0,5)?e.type=e.type.slice(5):e.removeAttribute("type"),e}function Oe(e,t){var n,r,i,o,a,s;if(1===t.nodeType){if(Y.hasData(e)&&(s=Y.get(e).events))for(i in Y.remove(t,"handle events"),s)for(n=0,r=s[i].length;n").attr(n.scriptAttrs||{}).prop({charset:n.scriptCharset,src:n.url}).on("load error",i=function(e){r.remove(),i=null,e&&t("error"===e.type?404:200,e.type)}),E.head.appendChild(r[0])},abort:function(){i&&i()}}});var Ut,Xt=[],Vt=/(=)\?(?=&|$)|\?\?/;S.ajaxSetup({jsonp:"callback",jsonpCallback:function(){var e=Xt.pop()||S.expando+"_"+Ct.guid++;return this[e]=!0,e}}),S.ajaxPrefilter("json jsonp",function(e,t,n){var r,i,o,a=!1!==e.jsonp&&(Vt.test(e.url)?"url":"string"==typeof e.data&&0===(e.contentType||"").indexOf("application/x-www-form-urlencoded")&&Vt.test(e.data)&&"data");if(a||"jsonp"===e.dataTypes[0])return r=e.jsonpCallback=m(e.jsonpCallback)?e.jsonpCallback():e.jsonpCallback,a?e[a]=e[a].replace(Vt,"$1"+r):!1!==e.jsonp&&(e.url+=(Et.test(e.url)?"&":"?")+e.jsonp+"="+r),e.converters["script json"]=function(){return o||S.error(r+" was not called"),o[0]},e.dataTypes[0]="json",i=C[r],C[r]=function(){o=arguments},n.always(function(){void 0===i?S(C).removeProp(r):C[r]=i,e[r]&&(e.jsonpCallback=t.jsonpCallback,Xt.push(r)),o&&m(i)&&i(o[0]),o=i=void 0}),"script"}),y.createHTMLDocument=((Ut=E.implementation.createHTMLDocument("").body).innerHTML="
",2===Ut.childNodes.length),S.parseHTML=function(e,t,n){return"string"!=typeof e?[]:("boolean"==typeof t&&(n=t,t=!1),t||(y.createHTMLDocument?((r=(t=E.implementation.createHTMLDocument("")).createElement("base")).href=E.location.href,t.head.appendChild(r)):t=E),o=!n&&[],(i=N.exec(e))?[t.createElement(i[1])]:(i=xe([e],t,o),o&&o.length&&S(o).remove(),S.merge([],i.childNodes)));var r,i,o},S.fn.load=function(e,t,n){var r,i,o,a=this,s=e.indexOf(" ");return-1").append(S.parseHTML(e)).find(r):e)}).always(n&&function(e,t){a.each(function(){n.apply(this,o||[e.responseText,t,e])})}),this},S.expr.pseudos.animated=function(t){return S.grep(S.timers,function(e){return t===e.elem}).length},S.offset={setOffset:function(e,t,n){var r,i,o,a,s,u,l=S.css(e,"position"),c=S(e),f={};"static"===l&&(e.style.position="relative"),s=c.offset(),o=S.css(e,"top"),u=S.css(e,"left"),("absolute"===l||"fixed"===l)&&-1<(o+u).indexOf("auto")?(a=(r=c.position()).top,i=r.left):(a=parseFloat(o)||0,i=parseFloat(u)||0),m(t)&&(t=t.call(e,n,S.extend({},s))),null!=t.top&&(f.top=t.top-s.top+a),null!=t.left&&(f.left=t.left-s.left+i),"using"in t?t.using.call(e,f):("number"==typeof f.top&&(f.top+="px"),"number"==typeof f.left&&(f.left+="px"),c.css(f))}},S.fn.extend({offset:function(t){if(arguments.length)return void 0===t?this:this.each(function(e){S.offset.setOffset(this,t,e)});var e,n,r=this[0];return r?r.getClientRects().length?(e=r.getBoundingClientRect(),n=r.ownerDocument.defaultView,{top:e.top+n.pageYOffset,left:e.left+n.pageXOffset}):{top:0,left:0}:void 0},position:function(){if(this[0]){var e,t,n,r=this[0],i={top:0,left:0};if("fixed"===S.css(r,"position"))t=r.getBoundingClientRect();else{t=this.offset(),n=r.ownerDocument,e=r.offsetParent||n.documentElement;while(e&&(e===n.body||e===n.documentElement)&&"static"===S.css(e,"position"))e=e.parentNode;e&&e!==r&&1===e.nodeType&&((i=S(e).offset()).top+=S.css(e,"borderTopWidth",!0),i.left+=S.css(e,"borderLeftWidth",!0))}return{top:t.top-i.top-S.css(r,"marginTop",!0),left:t.left-i.left-S.css(r,"marginLeft",!0)}}},offsetParent:function(){return this.map(function(){var e=this.offsetParent;while(e&&"static"===S.css(e,"position"))e=e.offsetParent;return e||re})}}),S.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(t,i){var o="pageYOffset"===i;S.fn[t]=function(e){return $(this,function(e,t,n){var r;if(x(e)?r=e:9===e.nodeType&&(r=e.defaultView),void 0===n)return r?r[i]:e[t];r?r.scrollTo(o?r.pageXOffset:n,o?n:r.pageYOffset):e[t]=n},t,e,arguments.length)}}),S.each(["top","left"],function(e,n){S.cssHooks[n]=$e(y.pixelPosition,function(e,t){if(t)return t=Be(e,n),Me.test(t)?S(e).position()[n]+"px":t})}),S.each({Height:"height",Width:"width"},function(a,s){S.each({padding:"inner"+a,content:s,"":"outer"+a},function(r,o){S.fn[o]=function(e,t){var n=arguments.length&&(r||"boolean"!=typeof e),i=r||(!0===e||!0===t?"margin":"border");return $(this,function(e,t,n){var r;return x(e)?0===o.indexOf("outer")?e["inner"+a]:e.document.documentElement["client"+a]:9===e.nodeType?(r=e.documentElement,Math.max(e.body["scroll"+a],r["scroll"+a],e.body["offset"+a],r["offset"+a],r["client"+a])):void 0===n?S.css(e,t,i):S.style(e,t,n,i)},s,n?e:void 0,n)}})}),S.each(["ajaxStart","ajaxStop","ajaxComplete","ajaxError","ajaxSuccess","ajaxSend"],function(e,t){S.fn[t]=function(e){return this.on(t,e)}}),S.fn.extend({bind:function(e,t,n){return this.on(e,null,t,n)},unbind:function(e,t){return this.off(e,null,t)},delegate:function(e,t,n,r){return this.on(t,e,n,r)},undelegate:function(e,t,n){return 1===arguments.length?this.off(e,"**"):this.off(t,e||"**",n)},hover:function(e,t){return this.mouseenter(e).mouseleave(t||e)}}),S.each("blur focus focusin focusout resize scroll click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup contextmenu".split(" "),function(e,n){S.fn[n]=function(e,t){return 0a;a++)for(s in o[a])n=o[a][s],o[a].hasOwnProperty(s)&&void 0!==n&&(e[s]=t.isPlainObject(n)?t.isPlainObject(e[s])?t.widget.extend({},e[s],n):t.widget.extend({},n):n);return e},t.widget.bridge=function(e,s){var n=s.prototype.widgetFullName||e;t.fn[e]=function(o){var a="string"==typeof o,r=i.call(arguments,1),l=this;return a?this.length||"instance"!==o?this.each(function(){var i,s=t.data(this,n);return"instance"===o?(l=s,!1):s?t.isFunction(s[o])&&"_"!==o.charAt(0)?(i=s[o].apply(s,r),i!==s&&void 0!==i?(l=i&&i.jquery?l.pushStack(i.get()):i,!1):void 0):t.error("no such method '"+o+"' for "+e+" widget instance"):t.error("cannot call methods on "+e+" prior to initialization; "+"attempted to call method '"+o+"'")}):l=void 0:(r.length&&(o=t.widget.extend.apply(null,[o].concat(r))),this.each(function(){var e=t.data(this,n);e?(e.option(o||{}),e._init&&e._init()):t.data(this,n,new s(o,this))})),l}},t.Widget=function(){},t.Widget._childConstructors=[],t.Widget.prototype={widgetName:"widget",widgetEventPrefix:"",defaultElement:"
",options:{classes:{},disabled:!1,create:null},_createWidget:function(i,s){s=t(s||this.defaultElement||this)[0],this.element=t(s),this.uuid=e++,this.eventNamespace="."+this.widgetName+this.uuid,this.bindings=t(),this.hoverable=t(),this.focusable=t(),this.classesElementLookup={},s!==this&&(t.data(s,this.widgetFullName,this),this._on(!0,this.element,{remove:function(t){t.target===s&&this.destroy()}}),this.document=t(s.style?s.ownerDocument:s.document||s),this.window=t(this.document[0].defaultView||this.document[0].parentWindow)),this.options=t.widget.extend({},this.options,this._getCreateOptions(),i),this._create(),this.options.disabled&&this._setOptionDisabled(this.options.disabled),this._trigger("create",null,this._getCreateEventData()),this._init()},_getCreateOptions:function(){return{}},_getCreateEventData:t.noop,_create:t.noop,_init:t.noop,destroy:function(){var e=this;this._destroy(),t.each(this.classesElementLookup,function(t,i){e._removeClass(i,t)}),this.element.off(this.eventNamespace).removeData(this.widgetFullName),this.widget().off(this.eventNamespace).removeAttr("aria-disabled"),this.bindings.off(this.eventNamespace)},_destroy:t.noop,widget:function(){return this.element},option:function(e,i){var s,n,o,a=e;if(0===arguments.length)return t.widget.extend({},this.options);if("string"==typeof e)if(a={},s=e.split("."),e=s.shift(),s.length){for(n=a[e]=t.widget.extend({},this.options[e]),o=0;s.length-1>o;o++)n[s[o]]=n[s[o]]||{},n=n[s[o]];if(e=s.pop(),1===arguments.length)return void 0===n[e]?null:n[e];n[e]=i}else{if(1===arguments.length)return void 0===this.options[e]?null:this.options[e];a[e]=i}return this._setOptions(a),this},_setOptions:function(t){var e;for(e in t)this._setOption(e,t[e]);return this},_setOption:function(t,e){return"classes"===t&&this._setOptionClasses(e),this.options[t]=e,"disabled"===t&&this._setOptionDisabled(e),this},_setOptionClasses:function(e){var i,s,n;for(i in e)n=this.classesElementLookup[i],e[i]!==this.options.classes[i]&&n&&n.length&&(s=t(n.get()),this._removeClass(n,i),s.addClass(this._classes({element:s,keys:i,classes:e,add:!0})))},_setOptionDisabled:function(t){this._toggleClass(this.widget(),this.widgetFullName+"-disabled",null,!!t),t&&(this._removeClass(this.hoverable,null,"ui-state-hover"),this._removeClass(this.focusable,null,"ui-state-focus"))},enable:function(){return this._setOptions({disabled:!1})},disable:function(){return this._setOptions({disabled:!0})},_classes:function(e){function i(i,o){var a,r;for(r=0;i.length>r;r++)a=n.classesElementLookup[i[r]]||t(),a=e.add?t(t.unique(a.get().concat(e.element.get()))):t(a.not(e.element).get()),n.classesElementLookup[i[r]]=a,s.push(i[r]),o&&e.classes[i[r]]&&s.push(e.classes[i[r]])}var s=[],n=this;return e=t.extend({element:this.element,classes:this.options.classes||{}},e),this._on(e.element,{remove:"_untrackClassesElement"}),e.keys&&i(e.keys.match(/\S+/g)||[],!0),e.extra&&i(e.extra.match(/\S+/g)||[]),s.join(" ")},_untrackClassesElement:function(e){var i=this;t.each(i.classesElementLookup,function(s,n){-1!==t.inArray(e.target,n)&&(i.classesElementLookup[s]=t(n.not(e.target).get()))})},_removeClass:function(t,e,i){return this._toggleClass(t,e,i,!1)},_addClass:function(t,e,i){return this._toggleClass(t,e,i,!0)},_toggleClass:function(t,e,i,s){s="boolean"==typeof s?s:i;var n="string"==typeof t||null===t,o={extra:n?e:i,keys:n?t:e,element:n?this.element:t,add:s};return o.element.toggleClass(this._classes(o),s),this},_on:function(e,i,s){var n,o=this;"boolean"!=typeof e&&(s=i,i=e,e=!1),s?(i=n=t(i),this.bindings=this.bindings.add(i)):(s=i,i=this.element,n=this.widget()),t.each(s,function(s,a){function r(){return e||o.options.disabled!==!0&&!t(this).hasClass("ui-state-disabled")?("string"==typeof a?o[a]:a).apply(o,arguments):void 0}"string"!=typeof a&&(r.guid=a.guid=a.guid||r.guid||t.guid++);var l=s.match(/^([\w:-]*)\s*(.*)$/),h=l[1]+o.eventNamespace,c=l[2];c?n.on(h,c,r):i.on(h,r)})},_off:function(e,i){i=(i||"").split(" ").join(this.eventNamespace+" ")+this.eventNamespace,e.off(i).off(i),this.bindings=t(this.bindings.not(e).get()),this.focusable=t(this.focusable.not(e).get()),this.hoverable=t(this.hoverable.not(e).get())},_delay:function(t,e){function i(){return("string"==typeof t?s[t]:t).apply(s,arguments)}var s=this;return setTimeout(i,e||0)},_hoverable:function(e){this.hoverable=this.hoverable.add(e),this._on(e,{mouseenter:function(e){this._addClass(t(e.currentTarget),null,"ui-state-hover")},mouseleave:function(e){this._removeClass(t(e.currentTarget),null,"ui-state-hover")}})},_focusable:function(e){this.focusable=this.focusable.add(e),this._on(e,{focusin:function(e){this._addClass(t(e.currentTarget),null,"ui-state-focus")},focusout:function(e){this._removeClass(t(e.currentTarget),null,"ui-state-focus")}})},_trigger:function(e,i,s){var n,o,a=this.options[e];if(s=s||{},i=t.Event(i),i.type=(e===this.widgetEventPrefix?e:this.widgetEventPrefix+e).toLowerCase(),i.target=this.element[0],o=i.originalEvent)for(n in o)n in i||(i[n]=o[n]);return this.element.trigger(i,s),!(t.isFunction(a)&&a.apply(this.element[0],[i].concat(s))===!1||i.isDefaultPrevented())}},t.each({show:"fadeIn",hide:"fadeOut"},function(e,i){t.Widget.prototype["_"+e]=function(s,n,o){"string"==typeof n&&(n={effect:n});var a,r=n?n===!0||"number"==typeof n?i:n.effect||i:e;n=n||{},"number"==typeof n&&(n={duration:n}),a=!t.isEmptyObject(n),n.complete=o,n.delay&&s.delay(n.delay),a&&t.effects&&t.effects.effect[r]?s[e](n):r!==e&&s[r]?s[r](n.duration,n.easing,o):s.queue(function(i){t(this)[e](),o&&o.call(s[0]),i()})}}),t.widget,function(){function e(t,e,i){return[parseFloat(t[0])*(u.test(t[0])?e/100:1),parseFloat(t[1])*(u.test(t[1])?i/100:1)]}function i(e,i){return parseInt(t.css(e,i),10)||0}function s(e){var i=e[0];return 9===i.nodeType?{width:e.width(),height:e.height(),offset:{top:0,left:0}}:t.isWindow(i)?{width:e.width(),height:e.height(),offset:{top:e.scrollTop(),left:e.scrollLeft()}}:i.preventDefault?{width:0,height:0,offset:{top:i.pageY,left:i.pageX}}:{width:e.outerWidth(),height:e.outerHeight(),offset:e.offset()}}var n,o=Math.max,a=Math.abs,r=/left|center|right/,l=/top|center|bottom/,h=/[\+\-]\d+(\.[\d]+)?%?/,c=/^\w+/,u=/%$/,d=t.fn.position;t.position={scrollbarWidth:function(){if(void 0!==n)return n;var e,i,s=t("
"),o=s.children()[0];return t("body").append(s),e=o.offsetWidth,s.css("overflow","scroll"),i=o.offsetWidth,e===i&&(i=s[0].clientWidth),s.remove(),n=e-i},getScrollInfo:function(e){var i=e.isWindow||e.isDocument?"":e.element.css("overflow-x"),s=e.isWindow||e.isDocument?"":e.element.css("overflow-y"),n="scroll"===i||"auto"===i&&e.widthi?"left":e>0?"right":"center",vertical:0>r?"top":s>0?"bottom":"middle"};h>p&&p>a(e+i)&&(u.horizontal="center"),c>f&&f>a(s+r)&&(u.vertical="middle"),u.important=o(a(e),a(i))>o(a(s),a(r))?"horizontal":"vertical",n.using.call(this,t,u)}),l.offset(t.extend(D,{using:r}))})},t.ui.position={fit:{left:function(t,e){var i,s=e.within,n=s.isWindow?s.scrollLeft:s.offset.left,a=s.width,r=t.left-e.collisionPosition.marginLeft,l=n-r,h=r+e.collisionWidth-a-n;e.collisionWidth>a?l>0&&0>=h?(i=t.left+l+e.collisionWidth-a-n,t.left+=l-i):t.left=h>0&&0>=l?n:l>h?n+a-e.collisionWidth:n:l>0?t.left+=l:h>0?t.left-=h:t.left=o(t.left-r,t.left)},top:function(t,e){var i,s=e.within,n=s.isWindow?s.scrollTop:s.offset.top,a=e.within.height,r=t.top-e.collisionPosition.marginTop,l=n-r,h=r+e.collisionHeight-a-n;e.collisionHeight>a?l>0&&0>=h?(i=t.top+l+e.collisionHeight-a-n,t.top+=l-i):t.top=h>0&&0>=l?n:l>h?n+a-e.collisionHeight:n:l>0?t.top+=l:h>0?t.top-=h:t.top=o(t.top-r,t.top)}},flip:{left:function(t,e){var i,s,n=e.within,o=n.offset.left+n.scrollLeft,r=n.width,l=n.isWindow?n.scrollLeft:n.offset.left,h=t.left-e.collisionPosition.marginLeft,c=h-l,u=h+e.collisionWidth-r-l,d="left"===e.my[0]?-e.elemWidth:"right"===e.my[0]?e.elemWidth:0,p="left"===e.at[0]?e.targetWidth:"right"===e.at[0]?-e.targetWidth:0,f=-2*e.offset[0];0>c?(i=t.left+d+p+f+e.collisionWidth-r-o,(0>i||a(c)>i)&&(t.left+=d+p+f)):u>0&&(s=t.left-e.collisionPosition.marginLeft+d+p+f-l,(s>0||u>a(s))&&(t.left+=d+p+f))},top:function(t,e){var i,s,n=e.within,o=n.offset.top+n.scrollTop,r=n.height,l=n.isWindow?n.scrollTop:n.offset.top,h=t.top-e.collisionPosition.marginTop,c=h-l,u=h+e.collisionHeight-r-l,d="top"===e.my[1],p=d?-e.elemHeight:"bottom"===e.my[1]?e.elemHeight:0,f="top"===e.at[1]?e.targetHeight:"bottom"===e.at[1]?-e.targetHeight:0,g=-2*e.offset[1];0>c?(s=t.top+p+f+g+e.collisionHeight-r-o,(0>s||a(c)>s)&&(t.top+=p+f+g)):u>0&&(i=t.top-e.collisionPosition.marginTop+p+f+g-l,(i>0||u>a(i))&&(t.top+=p+f+g))}},flipfit:{left:function(){t.ui.position.flip.left.apply(this,arguments),t.ui.position.fit.left.apply(this,arguments)},top:function(){t.ui.position.flip.top.apply(this,arguments),t.ui.position.fit.top.apply(this,arguments)}}}}(),t.ui.position,t.ui.keyCode={BACKSPACE:8,COMMA:188,DELETE:46,DOWN:40,END:35,ENTER:13,ESCAPE:27,HOME:36,LEFT:37,PAGE_DOWN:34,PAGE_UP:33,PERIOD:190,RIGHT:39,SPACE:32,TAB:9,UP:38},t.fn.extend({uniqueId:function(){var t=0;return function(){return this.each(function(){this.id||(this.id="ui-id-"+ ++t)})}}(),removeUniqueId:function(){return this.each(function(){/^ui-id-\d+$/.test(this.id)&&t(this).removeAttr("id")})}}),t.ui.safeActiveElement=function(t){var e;try{e=t.activeElement}catch(i){e=t.body}return e||(e=t.body),e.nodeName||(e=t.body),e},t.widget("ui.menu",{version:"1.12.1",defaultElement:"
    ",delay:300,options:{icons:{submenu:"ui-icon-caret-1-e"},items:"> *",menus:"ul",position:{my:"left top",at:"right top"},role:"menu",blur:null,focus:null,select:null},_create:function(){this.activeMenu=this.element,this.mouseHandled=!1,this.element.uniqueId().attr({role:this.options.role,tabIndex:0}),this._addClass("ui-menu","ui-widget ui-widget-content"),this._on({"mousedown .ui-menu-item":function(t){t.preventDefault()},"click .ui-menu-item":function(e){var i=t(e.target),s=t(t.ui.safeActiveElement(this.document[0]));!this.mouseHandled&&i.not(".ui-state-disabled").length&&(this.select(e),e.isPropagationStopped()||(this.mouseHandled=!0),i.has(".ui-menu").length?this.expand(e):!this.element.is(":focus")&&s.closest(".ui-menu").length&&(this.element.trigger("focus",[!0]),this.active&&1===this.active.parents(".ui-menu").length&&clearTimeout(this.timer)))},"mouseenter .ui-menu-item":function(e){if(!this.previousFilter){var i=t(e.target).closest(".ui-menu-item"),s=t(e.currentTarget);i[0]===s[0]&&(this._removeClass(s.siblings().children(".ui-state-active"),null,"ui-state-active"),this.focus(e,s))}},mouseleave:"collapseAll","mouseleave .ui-menu":"collapseAll",focus:function(t,e){var i=this.active||this.element.find(this.options.items).eq(0);e||this.focus(t,i)},blur:function(e){this._delay(function(){var i=!t.contains(this.element[0],t.ui.safeActiveElement(this.document[0]));i&&this.collapseAll(e)})},keydown:"_keydown"}),this.refresh(),this._on(this.document,{click:function(t){this._closeOnDocumentClick(t)&&this.collapseAll(t),this.mouseHandled=!1}})},_destroy:function(){var e=this.element.find(".ui-menu-item").removeAttr("role aria-disabled"),i=e.children(".ui-menu-item-wrapper").removeUniqueId().removeAttr("tabIndex role aria-haspopup");this.element.removeAttr("aria-activedescendant").find(".ui-menu").addBack().removeAttr("role aria-labelledby aria-expanded aria-hidden aria-disabled tabIndex").removeUniqueId().show(),i.children().each(function(){var e=t(this);e.data("ui-menu-submenu-caret")&&e.remove()})},_keydown:function(e){var i,s,n,o,a=!0;switch(e.keyCode){case t.ui.keyCode.PAGE_UP:this.previousPage(e);break;case t.ui.keyCode.PAGE_DOWN:this.nextPage(e);break;case t.ui.keyCode.HOME:this._move("first","first",e);break;case t.ui.keyCode.END:this._move("last","last",e);break;case t.ui.keyCode.UP:this.previous(e);break;case t.ui.keyCode.DOWN:this.next(e);break;case t.ui.keyCode.LEFT:this.collapse(e);break;case t.ui.keyCode.RIGHT:this.active&&!this.active.is(".ui-state-disabled")&&this.expand(e);break;case t.ui.keyCode.ENTER:case t.ui.keyCode.SPACE:this._activate(e);break;case t.ui.keyCode.ESCAPE:this.collapse(e);break;default:a=!1,s=this.previousFilter||"",o=!1,n=e.keyCode>=96&&105>=e.keyCode?""+(e.keyCode-96):String.fromCharCode(e.keyCode),clearTimeout(this.filterTimer),n===s?o=!0:n=s+n,i=this._filterMenuItems(n),i=o&&-1!==i.index(this.active.next())?this.active.nextAll(".ui-menu-item"):i,i.length||(n=String.fromCharCode(e.keyCode),i=this._filterMenuItems(n)),i.length?(this.focus(e,i),this.previousFilter=n,this.filterTimer=this._delay(function(){delete this.previousFilter},1e3)):delete this.previousFilter}a&&e.preventDefault()},_activate:function(t){this.active&&!this.active.is(".ui-state-disabled")&&(this.active.children("[aria-haspopup='true']").length?this.expand(t):this.select(t))},refresh:function(){var e,i,s,n,o,a=this,r=this.options.icons.submenu,l=this.element.find(this.options.menus);this._toggleClass("ui-menu-icons",null,!!this.element.find(".ui-icon").length),s=l.filter(":not(.ui-menu)").hide().attr({role:this.options.role,"aria-hidden":"true","aria-expanded":"false"}).each(function(){var e=t(this),i=e.prev(),s=t("").data("ui-menu-submenu-caret",!0);a._addClass(s,"ui-menu-icon","ui-icon "+r),i.attr("aria-haspopup","true").prepend(s),e.attr("aria-labelledby",i.attr("id"))}),this._addClass(s,"ui-menu","ui-widget ui-widget-content ui-front"),e=l.add(this.element),i=e.find(this.options.items),i.not(".ui-menu-item").each(function(){var e=t(this);a._isDivider(e)&&a._addClass(e,"ui-menu-divider","ui-widget-content")}),n=i.not(".ui-menu-item, .ui-menu-divider"),o=n.children().not(".ui-menu").uniqueId().attr({tabIndex:-1,role:this._itemRole()}),this._addClass(n,"ui-menu-item")._addClass(o,"ui-menu-item-wrapper"),i.filter(".ui-state-disabled").attr("aria-disabled","true"),this.active&&!t.contains(this.element[0],this.active[0])&&this.blur()},_itemRole:function(){return{menu:"menuitem",listbox:"option"}[this.options.role]},_setOption:function(t,e){if("icons"===t){var i=this.element.find(".ui-menu-icon");this._removeClass(i,null,this.options.icons.submenu)._addClass(i,null,e.submenu)}this._super(t,e)},_setOptionDisabled:function(t){this._super(t),this.element.attr("aria-disabled",t+""),this._toggleClass(null,"ui-state-disabled",!!t)},focus:function(t,e){var i,s,n;this.blur(t,t&&"focus"===t.type),this._scrollIntoView(e),this.active=e.first(),s=this.active.children(".ui-menu-item-wrapper"),this._addClass(s,null,"ui-state-active"),this.options.role&&this.element.attr("aria-activedescendant",s.attr("id")),n=this.active.parent().closest(".ui-menu-item").children(".ui-menu-item-wrapper"),this._addClass(n,null,"ui-state-active"),t&&"keydown"===t.type?this._close():this.timer=this._delay(function(){this._close()},this.delay),i=e.children(".ui-menu"),i.length&&t&&/^mouse/.test(t.type)&&this._startOpening(i),this.activeMenu=e.parent(),this._trigger("focus",t,{item:e})},_scrollIntoView:function(e){var i,s,n,o,a,r;this._hasScroll()&&(i=parseFloat(t.css(this.activeMenu[0],"borderTopWidth"))||0,s=parseFloat(t.css(this.activeMenu[0],"paddingTop"))||0,n=e.offset().top-this.activeMenu.offset().top-i-s,o=this.activeMenu.scrollTop(),a=this.activeMenu.height(),r=e.outerHeight(),0>n?this.activeMenu.scrollTop(o+n):n+r>a&&this.activeMenu.scrollTop(o+n-a+r))},blur:function(t,e){e||clearTimeout(this.timer),this.active&&(this._removeClass(this.active.children(".ui-menu-item-wrapper"),null,"ui-state-active"),this._trigger("blur",t,{item:this.active}),this.active=null)},_startOpening:function(t){clearTimeout(this.timer),"true"===t.attr("aria-hidden")&&(this.timer=this._delay(function(){this._close(),this._open(t)},this.delay))},_open:function(e){var i=t.extend({of:this.active},this.options.position);clearTimeout(this.timer),this.element.find(".ui-menu").not(e.parents(".ui-menu")).hide().attr("aria-hidden","true"),e.show().removeAttr("aria-hidden").attr("aria-expanded","true").position(i)},collapseAll:function(e,i){clearTimeout(this.timer),this.timer=this._delay(function(){var s=i?this.element:t(e&&e.target).closest(this.element.find(".ui-menu"));s.length||(s=this.element),this._close(s),this.blur(e),this._removeClass(s.find(".ui-state-active"),null,"ui-state-active"),this.activeMenu=s},this.delay)},_close:function(t){t||(t=this.active?this.active.parent():this.element),t.find(".ui-menu").hide().attr("aria-hidden","true").attr("aria-expanded","false")},_closeOnDocumentClick:function(e){return!t(e.target).closest(".ui-menu").length},_isDivider:function(t){return!/[^\-\u2014\u2013\s]/.test(t.text())},collapse:function(t){var e=this.active&&this.active.parent().closest(".ui-menu-item",this.element);e&&e.length&&(this._close(),this.focus(t,e))},expand:function(t){var e=this.active&&this.active.children(".ui-menu ").find(this.options.items).first();e&&e.length&&(this._open(e.parent()),this._delay(function(){this.focus(t,e)}))},next:function(t){this._move("next","first",t)},previous:function(t){this._move("prev","last",t)},isFirstItem:function(){return this.active&&!this.active.prevAll(".ui-menu-item").length},isLastItem:function(){return this.active&&!this.active.nextAll(".ui-menu-item").length},_move:function(t,e,i){var s;this.active&&(s="first"===t||"last"===t?this.active["first"===t?"prevAll":"nextAll"](".ui-menu-item").eq(-1):this.active[t+"All"](".ui-menu-item").eq(0)),s&&s.length&&this.active||(s=this.activeMenu.find(this.options.items)[e]()),this.focus(i,s)},nextPage:function(e){var i,s,n;return this.active?(this.isLastItem()||(this._hasScroll()?(s=this.active.offset().top,n=this.element.height(),this.active.nextAll(".ui-menu-item").each(function(){return i=t(this),0>i.offset().top-s-n}),this.focus(e,i)):this.focus(e,this.activeMenu.find(this.options.items)[this.active?"last":"first"]())),void 0):(this.next(e),void 0)},previousPage:function(e){var i,s,n;return this.active?(this.isFirstItem()||(this._hasScroll()?(s=this.active.offset().top,n=this.element.height(),this.active.prevAll(".ui-menu-item").each(function(){return i=t(this),i.offset().top-s+n>0}),this.focus(e,i)):this.focus(e,this.activeMenu.find(this.options.items).first())),void 0):(this.next(e),void 0)},_hasScroll:function(){return this.element.outerHeight()",options:{appendTo:null,autoFocus:!1,delay:300,minLength:1,position:{my:"left top",at:"left bottom",collision:"none"},source:null,change:null,close:null,focus:null,open:null,response:null,search:null,select:null},requestIndex:0,pending:0,_create:function(){var e,i,s,n=this.element[0].nodeName.toLowerCase(),o="textarea"===n,a="input"===n;this.isMultiLine=o||!a&&this._isContentEditable(this.element),this.valueMethod=this.element[o||a?"val":"text"],this.isNewMenu=!0,this._addClass("ui-autocomplete-input"),this.element.attr("autocomplete","off"),this._on(this.element,{keydown:function(n){if(this.element.prop("readOnly"))return e=!0,s=!0,i=!0,void 0;e=!1,s=!1,i=!1;var o=t.ui.keyCode;switch(n.keyCode){case o.PAGE_UP:e=!0,this._move("previousPage",n);break;case o.PAGE_DOWN:e=!0,this._move("nextPage",n);break;case o.UP:e=!0,this._keyEvent("previous",n);break;case o.DOWN:e=!0,this._keyEvent("next",n);break;case o.ENTER:this.menu.active&&(e=!0,n.preventDefault(),this.menu.select(n));break;case o.TAB:this.menu.active&&this.menu.select(n);break;case o.ESCAPE:this.menu.element.is(":visible")&&(this.isMultiLine||this._value(this.term),this.close(n),n.preventDefault());break;default:i=!0,this._searchTimeout(n)}},keypress:function(s){if(e)return e=!1,(!this.isMultiLine||this.menu.element.is(":visible"))&&s.preventDefault(),void 0;if(!i){var n=t.ui.keyCode;switch(s.keyCode){case n.PAGE_UP:this._move("previousPage",s);break;case n.PAGE_DOWN:this._move("nextPage",s);break;case n.UP:this._keyEvent("previous",s);break;case n.DOWN:this._keyEvent("next",s)}}},input:function(t){return s?(s=!1,t.preventDefault(),void 0):(this._searchTimeout(t),void 0)},focus:function(){this.selectedItem=null,this.previous=this._value()},blur:function(t){return this.cancelBlur?(delete this.cancelBlur,void 0):(clearTimeout(this.searching),this.close(t),this._change(t),void 0)}}),this._initSource(),this.menu=t("
      ").appendTo(this._appendTo()).menu({role:null}).hide().menu("instance"),this._addClass(this.menu.element,"ui-autocomplete","ui-front"),this._on(this.menu.element,{mousedown:function(e){e.preventDefault(),this.cancelBlur=!0,this._delay(function(){delete this.cancelBlur,this.element[0]!==t.ui.safeActiveElement(this.document[0])&&this.element.trigger("focus")})},menufocus:function(e,i){var s,n;return this.isNewMenu&&(this.isNewMenu=!1,e.originalEvent&&/^mouse/.test(e.originalEvent.type))?(this.menu.blur(),this.document.one("mousemove",function(){t(e.target).trigger(e.originalEvent)}),void 0):(n=i.item.data("ui-autocomplete-item"),!1!==this._trigger("focus",e,{item:n})&&e.originalEvent&&/^key/.test(e.originalEvent.type)&&this._value(n.value),s=i.item.attr("aria-label")||n.value,s&&t.trim(s).length&&(this.liveRegion.children().hide(),t("
      ").text(s).appendTo(this.liveRegion)),void 0)},menuselect:function(e,i){var s=i.item.data("ui-autocomplete-item"),n=this.previous;this.element[0]!==t.ui.safeActiveElement(this.document[0])&&(this.element.trigger("focus"),this.previous=n,this._delay(function(){this.previous=n,this.selectedItem=s})),!1!==this._trigger("select",e,{item:s})&&this._value(s.value),this.term=this._value(),this.close(e),this.selectedItem=s}}),this.liveRegion=t("
      ",{role:"status","aria-live":"assertive","aria-relevant":"additions"}).appendTo(this.document[0].body),this._addClass(this.liveRegion,null,"ui-helper-hidden-accessible"),this._on(this.window,{beforeunload:function(){this.element.removeAttr("autocomplete")}})},_destroy:function(){clearTimeout(this.searching),this.element.removeAttr("autocomplete"),this.menu.element.remove(),this.liveRegion.remove()},_setOption:function(t,e){this._super(t,e),"source"===t&&this._initSource(),"appendTo"===t&&this.menu.element.appendTo(this._appendTo()),"disabled"===t&&e&&this.xhr&&this.xhr.abort()},_isEventTargetInWidget:function(e){var i=this.menu.element[0];return e.target===this.element[0]||e.target===i||t.contains(i,e.target)},_closeOnClickOutside:function(t){this._isEventTargetInWidget(t)||this.close()},_appendTo:function(){var e=this.options.appendTo;return e&&(e=e.jquery||e.nodeType?t(e):this.document.find(e).eq(0)),e&&e[0]||(e=this.element.closest(".ui-front, dialog")),e.length||(e=this.document[0].body),e},_initSource:function(){var e,i,s=this;t.isArray(this.options.source)?(e=this.options.source,this.source=function(i,s){s(t.ui.autocomplete.filter(e,i.term))}):"string"==typeof this.options.source?(i=this.options.source,this.source=function(e,n){s.xhr&&s.xhr.abort(),s.xhr=t.ajax({url:i,data:e,dataType:"json",success:function(t){n(t)},error:function(){n([])}})}):this.source=this.options.source},_searchTimeout:function(t){clearTimeout(this.searching),this.searching=this._delay(function(){var e=this.term===this._value(),i=this.menu.element.is(":visible"),s=t.altKey||t.ctrlKey||t.metaKey||t.shiftKey;(!e||e&&!i&&!s)&&(this.selectedItem=null,this.search(null,t))},this.options.delay)},search:function(t,e){return t=null!=t?t:this._value(),this.term=this._value(),t.length").append(t("
      ").text(i.label)).appendTo(e)},_move:function(t,e){return this.menu.element.is(":visible")?this.menu.isFirstItem()&&/^previous/.test(t)||this.menu.isLastItem()&&/^next/.test(t)?(this.isMultiLine||this._value(this.term),this.menu.blur(),void 0):(this.menu[t](e),void 0):(this.search(null,e),void 0)},widget:function(){return this.menu.element},_value:function(){return this.valueMethod.apply(this.element,arguments)},_keyEvent:function(t,e){(!this.isMultiLine||this.menu.element.is(":visible"))&&(this._move(t,e),e.preventDefault())},_isContentEditable:function(t){if(!t.length)return!1;var e=t.prop("contentEditable");return"inherit"===e?this._isContentEditable(t.parent()):"true"===e}}),t.extend(t.ui.autocomplete,{escapeRegex:function(t){return t.replace(/[\-\[\]{}()*+?.,\\\^$|#\s]/g,"\\$&")},filter:function(e,i){var s=RegExp(t.ui.autocomplete.escapeRegex(i),"i");return t.grep(e,function(t){return s.test(t.label||t.value||t)})}}),t.widget("ui.autocomplete",t.ui.autocomplete,{options:{messages:{noResults:"No search results.",results:function(t){return t+(t>1?" results are":" result is")+" available, use up and down arrow keys to navigate."}}},__response:function(e){var i;this._superApply(arguments),this.options.disabled||this.cancelSearch||(i=e&&e.length?this.options.messages.results(e.length):this.options.messages.noResults,this.liveRegion.children().hide(),t("
      ").text(i).appendTo(this.liveRegion))}}),t.ui.autocomplete}); \ No newline at end of file diff --git a/docs/script-dir/jquery-ui.structure.min.css b/docs/script-dir/jquery-ui.structure.min.css new file mode 100644 index 00000000..e8808927 --- /dev/null +++ b/docs/script-dir/jquery-ui.structure.min.css @@ -0,0 +1,5 @@ +/*! jQuery UI - v1.12.1 - 2018-12-06 +* http://jqueryui.com +* Copyright jQuery Foundation and other contributors; Licensed MIT */ + +.ui-helper-hidden{display:none}.ui-helper-hidden-accessible{border:0;clip:rect(0 0 0 0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.ui-helper-reset{margin:0;padding:0;border:0;outline:0;line-height:1.3;text-decoration:none;font-size:100%;list-style:none}.ui-helper-clearfix:before,.ui-helper-clearfix:after{content:"";display:table;border-collapse:collapse}.ui-helper-clearfix:after{clear:both}.ui-helper-zfix{width:100%;height:100%;top:0;left:0;position:absolute;opacity:0;filter:Alpha(Opacity=0)}.ui-front{z-index:100}.ui-state-disabled{cursor:default!important;pointer-events:none}.ui-icon{display:inline-block;vertical-align:middle;margin-top:-.25em;position:relative;text-indent:-99999px;overflow:hidden;background-repeat:no-repeat}.ui-widget-icon-block{left:50%;margin-left:-8px;display:block}.ui-widget-overlay{position:fixed;top:0;left:0;width:100%;height:100%}.ui-autocomplete{position:absolute;top:0;left:0;cursor:default}.ui-menu{list-style:none;padding:0;margin:0;display:block;outline:0}.ui-menu .ui-menu{position:absolute}.ui-menu .ui-menu-item{margin:0;cursor:pointer;list-style-image:url("data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7")}.ui-menu .ui-menu-item-wrapper{position:relative;padding:3px 1em 3px .4em}.ui-menu .ui-menu-divider{margin:5px 0;height:0;font-size:0;line-height:0;border-width:1px 0 0 0}.ui-menu .ui-state-focus,.ui-menu .ui-state-active{margin:-1px}.ui-menu-icons{position:relative}.ui-menu-icons .ui-menu-item-wrapper{padding-left:2em}.ui-menu .ui-icon{position:absolute;top:0;bottom:0;left:.2em;margin:auto 0}.ui-menu .ui-menu-icon{left:auto;right:0} \ No newline at end of file diff --git a/docs/script.js b/docs/script.js new file mode 100644 index 00000000..bc21e459 --- /dev/null +++ b/docs/script.js @@ -0,0 +1,103 @@ +/* + * Copyright (c) 2013, 2020, Oracle and/or its affiliates. All rights reserved. + * ORACLE PROPRIETARY/CONFIDENTIAL. Use is subject to license terms. + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + */ + +var moduleSearchIndex; +var packageSearchIndex; +var typeSearchIndex; +var memberSearchIndex; +var tagSearchIndex; +function loadScripts(doc, tag) { + createElem(doc, tag, 'search.js'); + + createElem(doc, tag, 'module-search-index.js'); + createElem(doc, tag, 'package-search-index.js'); + createElem(doc, tag, 'type-search-index.js'); + createElem(doc, tag, 'member-search-index.js'); + createElem(doc, tag, 'tag-search-index.js'); +} + +function createElem(doc, tag, path) { + var script = doc.createElement(tag); + var scriptElement = doc.getElementsByTagName(tag)[0]; + script.src = pathtoroot + path; + scriptElement.parentNode.insertBefore(script, scriptElement); +} + +function show(type) { + count = 0; + for (var key in data) { + var row = document.getElementById(key); + if ((data[key] & type) !== 0) { + row.style.display = ''; + row.className = (count++ % 2) ? rowColor : altColor; + } + else + row.style.display = 'none'; + } + updateTabs(type); +} + +function updateTabs(type) { + var firstRow = document.getElementById(Object.keys(data)[0]); + var table = firstRow.closest('table'); + for (var value in tabs) { + var tab = document.getElementById(tabs[value][0]); + if (value == type) { + tab.className = activeTableTab; + tab.innerHTML = tabs[value][1]; + tab.setAttribute('aria-selected', true); + tab.setAttribute('tabindex',0); + table.setAttribute('aria-labelledby', tabs[value][0]); + } + else { + tab.className = tableTab; + tab.setAttribute('aria-selected', false); + tab.setAttribute('tabindex',-1); + tab.setAttribute('onclick', "show("+ value + ")"); + tab.innerHTML = tabs[value][1]; + } + } +} + +function switchTab(e) { + if (e.keyCode == 37 || e.keyCode == 38) { + $("[aria-selected=true]").prev().click().focus(); + e.preventDefault(); + } + if (e.keyCode == 39 || e.keyCode == 40) { + $("[aria-selected=true]").next().click().focus(); + e.preventDefault(); + } +} + +var updateSearchResults = function() {}; + +function indexFilesLoaded() { + return moduleSearchIndex + && packageSearchIndex + && typeSearchIndex + && memberSearchIndex + && tagSearchIndex; +} diff --git a/docs/search.js b/docs/search.js new file mode 100644 index 00000000..246cfd77 --- /dev/null +++ b/docs/search.js @@ -0,0 +1,378 @@ +/* + * Copyright (c) 2015, 2020, Oracle and/or its affiliates. All rights reserved. + * ORACLE PROPRIETARY/CONFIDENTIAL. Use is subject to license terms. + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + */ + +var noResult = {l: "No results found"}; +var loading = {l: "Loading search index..."}; +var catModules = "Modules"; +var catPackages = "Packages"; +var catTypes = "Types"; +var catMembers = "Members"; +var catSearchTags = "SearchTags"; +var highlight = "$&"; +var searchPattern = ""; +var RANKING_THRESHOLD = 2; +var NO_MATCH = 0xffff; +var MAX_RESULTS_PER_CATEGORY = 500; +var UNNAMED = ""; +function escapeHtml(str) { + return str.replace(//g, ">"); +} +function getHighlightedText(item, matcher) { + var escapedItem = escapeHtml(item); + return escapedItem.replace(matcher, highlight); +} +function getURLPrefix(ui) { + var urlPrefix=""; + var slash = "/"; + if (ui.item.category === catModules) { + return ui.item.l + slash; + } else if (ui.item.category === catPackages && ui.item.m) { + return ui.item.m + slash; + } else if (ui.item.category === catTypes || ui.item.category === catMembers) { + if (ui.item.m) { + urlPrefix = ui.item.m + slash; + } else { + $.each(packageSearchIndex, function(index, item) { + if (item.m && ui.item.p === item.l) { + urlPrefix = item.m + slash; + } + }); + } + return urlPrefix; + } + return urlPrefix; +} +function makeCamelCaseRegex(term) { + var pattern = ""; + var isWordToken = false; + term.replace(/,\s*/g, ", ").trim().split(/\s+/).forEach(function(w, index) { + if (index > 0) { + // whitespace between identifiers is significant + pattern += (isWordToken && /^\w/.test(w)) ? "\\s+" : "\\s*"; + } + var tokens = w.split(/(?=[A-Z,.()<>[\/])/); + for (var i = 0; i < tokens.length; i++) { + var s = tokens[i]; + if (s === "") { + continue; + } + pattern += $.ui.autocomplete.escapeRegex(s); + isWordToken = /\w$/.test(s); + if (isWordToken) { + pattern += "([a-z0-9_$<>\\[\\]]*?)"; + } + } + }); + return pattern; +} +function createMatcher(pattern, flags) { + var isCamelCase = /[A-Z]/.test(pattern); + return new RegExp(pattern, flags + (isCamelCase ? "" : "i")); +} +var watermark = 'Search'; +$(function() { + $("#search").val(''); + $("#search").prop("disabled", false); + $("#reset").prop("disabled", false); + $("#search").val(watermark).addClass('watermark'); + $("#search").blur(function() { + if ($(this).val().length == 0) { + $(this).val(watermark).addClass('watermark'); + } + }); + $("#search").on('click keydown paste', function() { + if ($(this).val() == watermark) { + $(this).val('').removeClass('watermark'); + } + }); + $("#reset").click(function() { + $("#search").val(''); + $("#search").focus(); + }); + $("#search").focus(); + $("#search")[0].setSelectionRange(0, 0); +}); +$.widget("custom.catcomplete", $.ui.autocomplete, { + _create: function() { + this._super(); + this.widget().menu("option", "items", "> :not(.ui-autocomplete-category)"); + }, + _renderMenu: function(ul, items) { + var rMenu = this; + var currentCategory = ""; + rMenu.menu.bindings = $(); + $.each(items, function(index, item) { + var li; + if (item.category && item.category !== currentCategory) { + ul.append("
    • " + item.category + "
    • "); + currentCategory = item.category; + } + li = rMenu._renderItemData(ul, item); + if (item.category) { + li.attr("aria-label", item.category + " : " + item.l); + li.attr("class", "result-item"); + } else { + li.attr("aria-label", item.l); + li.attr("class", "result-item"); + } + }); + }, + _renderItem: function(ul, item) { + var label = ""; + var matcher = createMatcher(escapeHtml(searchPattern), "g"); + if (item.category === catModules) { + label = getHighlightedText(item.l, matcher); + } else if (item.category === catPackages) { + label = getHighlightedText(item.l, matcher); + } else if (item.category === catTypes) { + label = (item.p && item.p !== UNNAMED) + ? getHighlightedText(item.p + "." + item.l, matcher) + : getHighlightedText(item.l, matcher); + } else if (item.category === catMembers) { + label = (item.p && item.p !== UNNAMED) + ? getHighlightedText(item.p + "." + item.c + "." + item.l, matcher) + : getHighlightedText(item.c + "." + item.l, matcher); + } else if (item.category === catSearchTags) { + label = getHighlightedText(item.l, matcher); + } else { + label = item.l; + } + var li = $("
    • ").appendTo(ul); + var div = $("
      ").appendTo(li); + if (item.category === catSearchTags) { + if (item.d) { + div.html(label + " (" + item.h + ")
      " + + item.d + "
      "); + } else { + div.html(label + " (" + item.h + ")"); + } + } else { + if (item.m) { + div.html(item.m + "/" + label); + } else { + div.html(label); + } + } + return li; + } +}); +function rankMatch(match, category) { + if (!match) { + return NO_MATCH; + } + var index = match.index; + var input = match.input; + var leftBoundaryMatch = 2; + var periferalMatch = 0; + var delta = 0; + // make sure match is anchored on a left word boundary + if (index === 0 || /\W/.test(input[index - 1]) || "_" === input[index - 1] || "_" === input[index]) { + leftBoundaryMatch = 0; + } else if (input[index] === input[index].toUpperCase() && !/^[A-Z0-9_$]+$/.test(input)) { + leftBoundaryMatch = 1; + } + var matchEnd = index + match[0].length; + var leftParen = input.indexOf("("); + // exclude peripheral matches + if (category !== catModules && category !== catSearchTags) { + var endOfName = leftParen > -1 ? leftParen : input.length; + var delim = category === catPackages ? "/" : "."; + if (leftParen > -1 && leftParen < index) { + periferalMatch += 2; + } else if (input.lastIndexOf(delim, endOfName) >= matchEnd) { + periferalMatch += 2; + } + } + for (var i = 1; i < match.length; i++) { + // lower ranking if parts of the name are missing + if (match[i]) + delta += match[i].length; + } + if (category === catTypes) { + // lower ranking if a type name contains unmatched camel-case parts + if (/[A-Z]/.test(input.substring(matchEnd))) + delta += 5; + if (/[A-Z]/.test(input.substring(0, index))) + delta += 5; + } + return leftBoundaryMatch + periferalMatch + (delta / 200); + +} +function doSearch(request, response) { + var result = []; + var newResults = []; + + searchPattern = makeCamelCaseRegex(request.term); + if (searchPattern === "") { + return this.close(); + } + var camelCaseMatcher = createMatcher(searchPattern, ""); + var boundaryMatcher = createMatcher("\\b" + searchPattern, ""); + + function concatResults(a1, a2) { + a2.sort(function(e1, e2) { + return e1.ranking - e2.ranking; + }); + a1 = a1.concat(a2.map(function(e) { return e.item; })); + a2.length = 0; + return a1; + } + + if (moduleSearchIndex) { + $.each(moduleSearchIndex, function(index, item) { + item.category = catModules; + var ranking = rankMatch(boundaryMatcher.exec(item.l), catModules); + if (ranking < RANKING_THRESHOLD) { + newResults.push({ ranking: ranking, item: item }); + } + return newResults.length < MAX_RESULTS_PER_CATEGORY; + }); + result = concatResults(result, newResults); + } + if (packageSearchIndex) { + $.each(packageSearchIndex, function(index, item) { + item.category = catPackages; + var name = (item.m && request.term.indexOf("/") > -1) + ? (item.m + "/" + item.l) + : item.l; + var ranking = rankMatch(boundaryMatcher.exec(name), catPackages); + if (ranking < RANKING_THRESHOLD) { + newResults.push({ ranking: ranking, item: item }); + } + return newResults.length < MAX_RESULTS_PER_CATEGORY; + }); + result = concatResults(result, newResults); + } + if (typeSearchIndex) { + $.each(typeSearchIndex, function(index, item) { + item.category = catTypes; + var name = request.term.indexOf(".") > -1 + ? item.p + "." + item.l + : item.l; + var ranking = rankMatch(camelCaseMatcher.exec(name), catTypes); + if (ranking < RANKING_THRESHOLD) { + newResults.push({ ranking: ranking, item: item }); + } + return newResults.length < MAX_RESULTS_PER_CATEGORY; + }); + result = concatResults(result, newResults); + } + if (memberSearchIndex) { + $.each(memberSearchIndex, function(index, item) { + item.category = catMembers; + var name = request.term.indexOf(".") > -1 + ? item.p + "." + item.c + "." + item.l + : item.l; + var ranking = rankMatch(camelCaseMatcher.exec(name), catMembers); + if (ranking < RANKING_THRESHOLD) { + newResults.push({ ranking: ranking, item: item }); + } + return newResults.length < MAX_RESULTS_PER_CATEGORY; + }); + result = concatResults(result, newResults); + } + if (tagSearchIndex) { + $.each(tagSearchIndex, function(index, item) { + item.category = catSearchTags; + var ranking = rankMatch(boundaryMatcher.exec(item.l), catSearchTags); + if (ranking < RANKING_THRESHOLD) { + newResults.push({ ranking: ranking, item: item }); + } + return newResults.length < MAX_RESULTS_PER_CATEGORY; + }); + result = concatResults(result, newResults); + } + if (!indexFilesLoaded()) { + updateSearchResults = function() { + doSearch(request, response); + } + result.unshift(loading); + } else { + updateSearchResults = function() {}; + } + response(result); +} +$(function() { + $("#search").catcomplete({ + minLength: 1, + delay: 300, + source: doSearch, + response: function(event, ui) { + if (!ui.content.length) { + ui.content.push(noResult); + } else { + $("#search").empty(); + } + }, + autoFocus: true, + focus: function(event, ui) { + return false; + }, + position: { + collision: "flip" + }, + select: function(event, ui) { + if (ui.item.category) { + var url = getURLPrefix(ui); + if (ui.item.category === catModules) { + url += "module-summary.html"; + } else if (ui.item.category === catPackages) { + if (ui.item.u) { + url = ui.item.u; + } else { + url += ui.item.l.replace(/\./g, '/') + "/package-summary.html"; + } + } else if (ui.item.category === catTypes) { + if (ui.item.u) { + url = ui.item.u; + } else if (ui.item.p === UNNAMED) { + url += ui.item.l + ".html"; + } else { + url += ui.item.p.replace(/\./g, '/') + "/" + ui.item.l + ".html"; + } + } else if (ui.item.category === catMembers) { + if (ui.item.p === UNNAMED) { + url += ui.item.c + ".html" + "#"; + } else { + url += ui.item.p.replace(/\./g, '/') + "/" + ui.item.c + ".html" + "#"; + } + if (ui.item.u) { + url += ui.item.u; + } else { + url += ui.item.l; + } + } else if (ui.item.category === catSearchTags) { + url += ui.item.u; + } + if (top !== window) { + parent.classFrame.location = pathtoroot + url; + } else { + window.location.href = pathtoroot + url; + } + $("#search").focus(); + } + } + }); +}); diff --git a/docs/server/ContinuousIntegrationServer.html b/docs/server/ContinuousIntegrationServer.html new file mode 100644 index 00000000..e6c4729f --- /dev/null +++ b/docs/server/ContinuousIntegrationServer.html @@ -0,0 +1,480 @@ + + + + + +ContinuousIntegrationServer (gs-maven 0.1.0 API) + + + + + + + + + + + + + + +
      + +
      +
      + +
      +
      Package server
      +

      Class ContinuousIntegrationServer<BASE64Encoder,​BASE64Decoder>

      +
      +
      java.lang.Object +
      org.eclipse.jetty.util.component.AbstractLifeCycle +
      org.eclipse.jetty.server.handler.AbstractHandler +
      server.ContinuousIntegrationServer<BASE64Encoder,​BASE64Decoder>
      +
      +
      +
      +
      +
      +
      All Implemented Interfaces:
      +
      org.eclipse.jetty.server.Handler, org.eclipse.jetty.util.component.LifeCycle
      +
      +
      +
      public class ContinuousIntegrationServer<BASE64Encoder,​BASE64Decoder>
      +extends org.eclipse.jetty.server.handler.AbstractHandler
      +
      Skeleton of a ContinuousIntegrationServer which acts as webhook + See the Jetty documentation for API documentation of those classes.
      +
      +
      +
        + +
      • +
        +

        Nested Class Summary

        +
        +

        Nested classes/interfaces inherited from interface org.eclipse.jetty.util.component.LifeCycle

        +org.eclipse.jetty.util.component.LifeCycle.Listener
        +
        +
      • + +
      • +
        +

        Field Summary

        +
        +

        Fields inherited from class org.eclipse.jetty.util.component.AbstractLifeCycle

        +_listeners, FAILED, RUNNING, STARTED, STARTING, STOPPED, STOPPING
        +
        +
      • + +
      • +
        +

        Constructor Summary

        +
        + + + + + + + + + + + + + + +
        Constructors
        ConstructorDescription
        ContinuousIntegrationServer() 
        +
        +
        +
      • + +
      • +
        +

        Method Summary

        +
        +
        +
        + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
        Modifier and TypeMethodDescription
        static String[]buildAndTest​(String path, +String url) +
        Builds and tests a specified repository + if BUILD SUCCESS, the directory is deleted
        +
        static StringcloneRepo​(String httpURL) +
        Clones a repo into the directory ./cloned-repo
        +
        static org.json.JSONObjectgetJSON​(BufferedReader br) +
        Creates a JSON object from the body of a http POST request from a GitHub webhook.
        +
        static StringgetRepoURL​(org.json.JSONObject json) +
        Gets the GitHub repo url and recently pushed branch from the input json + and combine these to form a compatible string to use with the 'git clone' command.
        +
        static StringgetStatusUrl​(org.json.JSONObject json) +
        Gets url to the status of the latest commit in a given push
        +
        voidhandle​(String target, +org.eclipse.jetty.server.Request baseRequest, +javax.servlet.http.HttpServletRequest request, +javax.servlet.http.HttpServletResponse response) 
        static voidJS_HTML​(int id, +String status_url) +
        Update the HTML
        +
        static intJSOread​(String Date, +String sha, +String log) +
        Update the history JSON file.
        +
        static voidmain​(String[] args) +
        Main method.
        +
        static Stringset_commit_status​(String token, +String status_url, +int state, +String message) +
        Sets status of a commit to one of the four possible values (error/pending/success/failure) with provided context and message
        +
        +
        +
        +
        +

        Methods inherited from class org.eclipse.jetty.server.handler.AbstractHandler

        +destroy, doStart, doStop, dump, dump, getServer, setServer, toString
        +
        +

        Methods inherited from class org.eclipse.jetty.util.component.AbstractLifeCycle

        +addLifeCycleListener, getState, isFailed, isRunning, isStarted, isStarting, isStopped, isStopping, removeLifeCycleListener, start, stop
        +
        +

        Methods inherited from class java.lang.Object

        +clone, equals, finalize, getClass, hashCode, notify, notifyAll, wait, wait, wait
        +
        +

        Methods inherited from interface org.eclipse.jetty.util.component.LifeCycle

        +addLifeCycleListener, isFailed, isRunning, isStarted, isStarting, isStopped, isStopping, removeLifeCycleListener, start, stop
        +
        +
      • +
      +
      +
      +
        + +
      • +
        +

        Constructor Details

        +
          +
        • +
          +

          ContinuousIntegrationServer

          +
          public ContinuousIntegrationServer()
          +
          +
        • +
        +
        +
      • + +
      • +
        +

        Method Details

        +
          +
        • +
          +

          handle

          +
          public void handle​(String target, +org.eclipse.jetty.server.Request baseRequest, +javax.servlet.http.HttpServletRequest request, +javax.servlet.http.HttpServletResponse response) + throws IOException, +javax.servlet.ServletException
          +
          +
          Throws:
          +
          IOException
          +
          javax.servlet.ServletException
          +
          +
          +
        • +
        • +
          +

          getJSON

          +
          public static org.json.JSONObject getJSON​(BufferedReader br) + throws IOException
          +
          Creates a JSON object from the body of a http POST request from a GitHub webhook.
          +
          +
          Parameters:
          +
          br - contains the body of a http POST request
          +
          Returns:
          +
          A JSON object containing the parameters from a GitHub webhook
          +
          Throws:
          +
          IOException
          +
          +
          +
        • +
        • +
          +

          getRepoURL

          +
          public static String getRepoURL​(org.json.JSONObject json)
          +
          Gets the GitHub repo url and recently pushed branch from the input json + and combine these to form a compatible string to use with the 'git clone' command.
          +
          +
          Parameters:
          +
          json - A JSON object containing the parameters from a GitHub webhook
          +
          Returns:
          +
          A string with the recently pushed branch and the GitHub repo url.
          +
          +
          +
        • +
        • +
          +

          getStatusUrl

          +
          public static String getStatusUrl​(org.json.JSONObject json)
          +
          Gets url to the status of the latest commit in a given push
          +
          +
          Parameters:
          +
          json - the JSON object of the commit
          +
          Returns:
          +
          url of the status
          +
          +
          +
        • +
        • +
          +

          cloneRepo

          +
          public static String cloneRepo​(String httpURL)
          +
          Clones a repo into the directory ./cloned-repo
          +
          +
          Parameters:
          +
          httpURL - the http url of the repo
          +
          Returns:
          +
          status of of how the cloning went
          +
          +
          +
        • +
        • +
          +

          buildAndTest

          +
          public static String[] buildAndTest​(String path, +String url)
          +
          Builds and tests a specified repository + if BUILD SUCCESS, the directory is deleted
          +
          +
          Parameters:
          +
          path - The path to the cloned repo that should be built and tested
          +
          url - Url to commit status
          +
          Returns:
          +
          Array of information about the build status
          +
          +
          +
        • +
        • +
          +

          set_commit_status

          +
          public static String set_commit_status​(String token, +String status_url, +int state, +String message)
          +
          Sets status of a commit to one of the four possible values (error/pending/success/failure) with provided context and message
          +
          +
          Parameters:
          +
          token - a token to access the repository
          +
          status_url - status url of the commit
          +
          state - state of the
          +
          message - the message to send to the commit
          +
          Returns:
          +
          "Successful 201" if status set was successful, "Unsucessful [responsecode]" if not
          +
          +
          +
        • +
        • +
          +

          JS_HTML

          +
          public static void JS_HTML​(int id, +String status_url)
          +
          Update the HTML
          +
          +
          Parameters:
          +
          id - the length of current history
          +
          status_url - the build url
          +
          +
          +
        • +
        • +
          +

          JSOread

          +
          public static int JSOread​(String Date, +String sha, +String log) + throws IOException
          +
          Update the history JSON file.
          +
          +
          Parameters:
          +
          Date -
          +
          sha -
          +
          log -
          +
          Returns:
          +
          return the length of current history
          +
          Throws:
          +
          IOException
          +
          +
          +
        • +
        • +
          +

          main

          +
          public static void main​(String[] args) + throws Exception
          +
          Main method. + Used to start the CI server in command line.
          +
          +
          Parameters:
          +
          args - Not used
          +
          Throws:
          +
          Exception
          +
          +
          +
        • +
        +
        +
      • +
      +
      + +
      + +
      +
      + + diff --git a/docs/server/class-use/ContinuousIntegrationServer.html b/docs/server/class-use/ContinuousIntegrationServer.html new file mode 100644 index 00000000..a4a4930a --- /dev/null +++ b/docs/server/class-use/ContinuousIntegrationServer.html @@ -0,0 +1,81 @@ + + + + + +Uses of Class server.ContinuousIntegrationServer (gs-maven 0.1.0 API) + + + + + + + + + + + + + + +
      + +
      +
      +
      +

      Uses of Class
      server.ContinuousIntegrationServer

      +
      +No usage of server.ContinuousIntegrationServer
      + +
      +
      + + diff --git a/docs/server/package-summary.html b/docs/server/package-summary.html new file mode 100644 index 00000000..b11c8a9a --- /dev/null +++ b/docs/server/package-summary.html @@ -0,0 +1,107 @@ + + + + + +server (gs-maven 0.1.0 API) + + + + + + + + + + + + + + +
      + +
      +
      +
      +

      Package server

      +
      +
      +
        +
      • +
        + + + + + + + + + + + + + + +
        Class Summary
        ClassDescription
        ContinuousIntegrationServer<BASE64Encoder,​BASE64Decoder> +
        Skeleton of a ContinuousIntegrationServer which acts as webhook + See the Jetty documentation for API documentation of those classes.
        +
        +
        +
      • +
      +
      +
      + +
      +
      + + diff --git a/docs/server/package-tree.html b/docs/server/package-tree.html new file mode 100644 index 00000000..0f7c2bf3 --- /dev/null +++ b/docs/server/package-tree.html @@ -0,0 +1,99 @@ + + + + + +server Class Hierarchy (gs-maven 0.1.0 API) + + + + + + + + + + + + + + +
      + +
      +
      +
      +

      Hierarchy For Package server

      +
      +
      +

      Class Hierarchy

      +
        +
      • java.lang.Object +
          +
        • org.eclipse.jetty.util.component.AbstractLifeCycle (implements org.eclipse.jetty.util.component.LifeCycle) +
            +
          • org.eclipse.jetty.server.handler.AbstractHandler (implements org.eclipse.jetty.server.Handler) + +
          • +
          +
        • +
        +
      • +
      +
      +
      + +
      +
      + + diff --git a/docs/server/package-use.html b/docs/server/package-use.html new file mode 100644 index 00000000..9111e47b --- /dev/null +++ b/docs/server/package-use.html @@ -0,0 +1,81 @@ + + + + + +Uses of Package server (gs-maven 0.1.0 API) + + + + + + + + + + + + + + +
      + +
      +
      +
      +

      Uses of Package
      server

      +
      +No usage of server
      + +
      +
      + + diff --git a/docs/stylesheet.css b/docs/stylesheet.css new file mode 100644 index 00000000..79a9d970 --- /dev/null +++ b/docs/stylesheet.css @@ -0,0 +1,792 @@ +/* + * Javadoc style sheet + */ + +@import url('resources/fonts/dejavu.css'); + +/* + * Styles for individual HTML elements. + * + * These are styles that are specific to individual HTML elements. Changing them affects the style of a particular + * HTML element throughout the page. + */ + +body { + background-color:#ffffff; + color:#353833; + font-family:'DejaVu Sans', Arial, Helvetica, sans-serif; + font-size:14px; + margin:0; + padding:0; + height:100%; + width:100%; +} +iframe { + margin:0; + padding:0; + height:100%; + width:100%; + overflow-y:scroll; + border:none; +} +a:link, a:visited { + text-decoration:none; + color:#4A6782; +} +a[href]:hover, a[href]:focus { + text-decoration:none; + color:#bb7a2a; +} +a[name] { + color:#353833; +} +pre { + font-family:'DejaVu Sans Mono', monospace; + font-size:14px; +} +h1 { + font-size:20px; +} +h2 { + font-size:18px; +} +h3 { + font-size:16px; +} +h4 { + font-size:13px; +} +h5 { + font-size:12px; +} +h6 { + font-size:11px; +} +ul { + list-style-type:disc; +} +code, tt { + font-family:'DejaVu Sans Mono', monospace; + font-size:14px; + padding-top:4px; + margin-top:8px; + line-height:1.4em; +} +dt code { + font-family:'DejaVu Sans Mono', monospace; + font-size:14px; + padding-top:4px; +} +table tr td dt code { + font-family:'DejaVu Sans Mono', monospace; + font-size:14px; + vertical-align:top; + padding-top:4px; +} +sup { + font-size:8px; +} +button { + font-family: 'DejaVu Sans', Arial, Helvetica, sans-serif; + font-size: 14px; +} +/* + * Styles for HTML generated by javadoc. + * + * These are style classes that are used by the standard doclet to generate HTML documentation. + */ + +/* + * Styles for document title and copyright. + */ +.clear { + clear:both; + height:0px; + overflow:hidden; +} +.about-language { + float:right; + padding:0px 21px; + font-size:11px; + z-index:200; + margin-top:-9px; +} +.legal-copy { + margin-left:.5em; +} +.tab { + background-color:#0066FF; + color:#ffffff; + padding:8px; + width:5em; + font-weight:bold; +} +/* + * Styles for navigation bar. + */ +@media screen { + .flex-box { + position:fixed; + display:flex; + flex-direction:column; + height: 100%; + width: 100%; + } + .flex-header { + flex: 0 0 auto; + } + .flex-content { + flex: 1 1 auto; + overflow-y: auto; + } +} +.top-nav { + background-color:#4D7A97; + color:#FFFFFF; + float:left; + padding:0; + width:100%; + clear:right; + height:2.8em; + padding-top:10px; + overflow:hidden; + font-size:12px; +} +.bottom-nav { + margin-top:10px; + background-color:#4D7A97; + color:#FFFFFF; + float:left; + padding:0; + width:100%; + clear:right; + height:2.8em; + padding-top:10px; + overflow:hidden; + font-size:12px; +} +.sub-nav { + background-color:#dee3e9; + float:left; + width:100%; + overflow:hidden; + font-size:12px; +} +.sub-nav div { + clear:left; + float:left; + padding:0 0 5px 6px; + text-transform:uppercase; +} +.sub-nav .nav-list { + padding-top:5px; +} +ul.nav-list, ul.sub-nav-list { + float:left; + margin:0 25px 0 0; + padding:0; +} +ul.nav-list li{ + list-style:none; + float:left; + padding: 5px 6px; + text-transform:uppercase; +} +.sub-nav .nav-list-search { + float:right; + margin:0 0 0 0; + padding:5px 6px; + clear:none; +} +.nav-list-search label { + position:relative; + right:-16px; +} +ul.sub-nav-list li { + list-style:none; + float:left; + padding-top:10px; +} +.top-nav a:link, .top-nav a:active, .top-nav a:visited, .bottom-nav a:link, .bottom-nav a:active, .bottom-nav a:visited { + color:#FFFFFF; + text-decoration:none; + text-transform:uppercase; +} +.top-nav a:hover, .bottom-nav a:hover { + text-decoration:none; + color:#bb7a2a; + text-transform:uppercase; +} +.nav-bar-cell1-rev { + background-color:#F8981D; + color:#253441; + margin: auto 5px; +} +.skip-nav { + position:absolute; + top:auto; + left:-9999px; + overflow:hidden; +} +/* + * Hide navigation links and search box in print layout + */ +@media print { + ul.nav-list, div.sub-nav { + display:none; + } +} +/* + * Styles for page header and footer. + */ +.title { + color:#2c4557; + margin:10px 0; +} +.sub-title { + margin:5px 0 0 0; +} +.header ul { + margin:0 0 15px 0; + padding:0; +} +.header ul li, .footer ul li { + list-style:none; + font-size:13px; +} +/* + * Styles for headings. + */ +body.class-declaration-page .summary h2, +body.class-declaration-page .details h2, +body.class-use-page h2, +body.module-declaration-page .block-list h2 { + font-style: italic; + padding:0; + margin:15px 0; +} +body.class-declaration-page .summary h3, +body.class-declaration-page .details h3, +body.class-declaration-page .summary .inherited-list h2 { + background-color:#dee3e9; + border:1px solid #d0d9e0; + margin:0 0 6px -8px; + padding:7px 5px; +} +/* + * Styles for page layout containers. + */ +main { + clear:both; + padding:10px 20px; + position:relative; +} +dl.notes > dt { + font-family: 'DejaVu Sans', Arial, Helvetica, sans-serif; + font-size:12px; + font-weight:bold; + margin:10px 0 0 0; + color:#4E4E4E; +} +dl.notes > dd { + margin:5px 0 10px 0px; + font-size:14px; + font-family:'DejaVu Serif', Georgia, "Times New Roman", Times, serif; +} +dl.name-value > dt { + margin-left:1px; + font-size:1.1em; + display:inline; + font-weight:bold; +} +dl.name-value > dd { + margin:0 0 0 1px; + font-size:1.1em; + display:inline; +} +/* + * Styles for lists. + */ +li.circle { + list-style:circle; +} +ul.horizontal li { + display:inline; + font-size:0.9em; +} +div.inheritance { + margin:0; + padding:0; +} +div.inheritance div.inheritance { + margin-left:2em; +} +ul.block-list, +ul.details-list, +ul.member-list, +ul.summary-list { + margin:10px 0 10px 0; + padding:0; +} +ul.block-list > li, +ul.details-list > li, +ul.member-list > li, +ul.summary-list > li { + list-style:none; + margin-bottom:15px; + line-height:1.4; +} +table tr td dl, table tr td dl dt, table tr td dl dd { + margin-top:0; + margin-bottom:1px; +} +/* + * Styles for tables. + */ +.overview-summary table, .member-summary table, .type-summary table, .use-summary table, .constants-summary table, .deprecated-summary table, +.requires-summary table, .packages-summary table, .provides-summary table, .uses-summary table, .system-properties-summary table { + width:100%; + border-spacing:0; + border-left:1px solid #EEE; + border-right:1px solid #EEE; + border-bottom:1px solid #EEE; +} +.overview-summary table, .member-summary table, .requires-summary table, .packages-summary table, +.provides-summary table, .uses-summary table, .system-properties-summary table { + padding:0px; +} +.overview-summary caption, .member-summary caption, .type-summary caption, +.use-summary caption, .constants-summary caption, .deprecated-summary caption, +.requires-summary caption, .packages-summary caption, .provides-summary caption, +.uses-summary caption, .system-properties-summary caption { + position:relative; + text-align:left; + background-repeat:no-repeat; + color:#253441; + font-weight:bold; + clear:none; + overflow:hidden; + padding:0px; + padding-top:10px; + padding-left:1px; + margin:0px; + white-space:pre; +} +.constants-summary caption a:link, .constants-summary caption a:visited, +.use-summary caption a:link, .use-summary caption a:visited { + color:#1f389c; +} +.overview-summary caption a:link, .member-summary caption a:link, .type-summary caption a:link, +.deprecated-summary caption a:link, +.requires-summary caption a:link, .packages-summary caption a:link, .provides-summary caption a:link, +.uses-summary caption a:link, +.overview-summary caption a:hover, .member-summary caption a:hover, .type-summary caption a:hover, +.use-summary caption a:hover, .constants-summary caption a:hover, .deprecated-summary caption a:hover, +.requires-summary caption a:hover, .packages-summary caption a:hover, .provides-summary caption a:hover, +.uses-summary caption a:hover, +.overview-summary caption a:active, .member-summary caption a:active, .type-summary caption a:active, +.use-summary caption a:active, .constants-summary caption a:active, .deprecated-summary caption a:active, +.requires-summary caption a:active, .packages-summary caption a:active, .provides-summary caption a:active, +.uses-summary caption a:active, +.overview-summary caption a:visited, .member-summary caption a:visited, .type-summary caption a:visited, +.deprecated-summary caption a:visited, +.requires-summary caption a:visited, .packages-summary caption a:visited, .provides-summary caption a:visited, +.uses-summary caption a:visited { + color:#FFFFFF; +} +.overview-summary caption span, .member-summary caption span, .type-summary caption span, +.use-summary caption span, .constants-summary caption span, .deprecated-summary caption span, +.requires-summary caption span, .packages-summary caption span, .provides-summary caption span, +.uses-summary caption span, .system-properties-summary caption span { + white-space:nowrap; + padding-top:5px; + padding-left:12px; + padding-right:12px; + padding-bottom:7px; + display:inline-block; + float:left; + background-color:#F8981D; + border: none; + height:16px; +} + +div.table-tabs > button { + border: none; + cursor: pointer; + padding: 5px 12px 7px 12px; + font-weight: bold; + margin-right: 3px; +} +div.table-tabs > button.active-table-tab { + background: #F8981D; + color: #253441; +} +div.table-tabs > button.table-tab { + background: #4D7A97; + color: #FFFFFF; +} + +.row-color th, +.alt-color th { + font-weight:normal; +} +.overview-summary td, .member-summary td, .type-summary td, +.use-summary td, .constants-summary td, .deprecated-summary td, +.requires-summary td, .packages-summary td, .provides-summary td, +.uses-summary td, .system-properties-summary td { + text-align:left; + padding:0px 0px 12px 10px; +} +th.col-first, th.col-second, th.col-last, th.col-constructor-name, th.col-deprecated-item-name, .use-summary th, +.constants-summary th, .packages-summary th, td.col-first, td.col-second, td.col-last, .use-summary td, +.constants-summary td, .system-properties-summary th { + vertical-align:top; + padding-right:0px; + padding-top:8px; + padding-bottom:3px; +} +th.col-first, th.col-second, th.col-last, th.col-constructor-name, th.col-deprecated-item-name, .constants-summary th, +.packages-summary th { + background:#dee3e9; + text-align:left; + padding:8px 3px 3px 7px; +} +td.col-first, th.col-first { + font-size:13px; +} +td.col-second, th.col-second, td.col-last, th.col-constructor-name, th.col-deprecated-item-name, th.col-last { + font-size:13px; +} +.constants-summary th, .packages-summary th { + font-size:13px; +} +.provides-summary th.col-first, .provides-summary th.col-last, .provides-summary td.col-first, +.provides-summary td.col-last { + white-space:normal; + font-size:13px; +} +.overview-summary td.col-first, .overview-summary th.col-first, +.requires-summary td.col-first, .requires-summary th.col-first, +.packages-summary td.col-first, .packages-summary td.col-second, .packages-summary th.col-first, .packages-summary th, +.uses-summary td.col-first, .uses-summary th.col-first, +.provides-summary td.col-first, .provides-summary th.col-first, +.member-summary td.col-first, .member-summary th.col-first, +.member-summary td.col-second, .member-summary th.col-second, .member-summary th.col-constructor-name, +.type-summary td.col-first, .type-summary th.col-first { + vertical-align:top; +} +.packages-summary th.col-last, .packages-summary td.col-last { + white-space:normal; +} +td.col-first a:link, td.col-first a:visited, +td.col-second a:link, td.col-second a:visited, +th.col-first a:link, th.col-first a:visited, +th.col-second a:link, th.col-second a:visited, +th.col-constructor-name a:link, th.col-constructor-name a:visited, +th.col-deprecated-item-name a:link, th.col-deprecated-item-name a:visited, +.constant-values-container td a:link, .constant-values-container td a:visited, +.all-classes-container td a:link, .all-classes-container td a:visited, +.all-packages-container td a:link, .all-packages-container td a:visited { + font-weight:bold; +} +.table-sub-heading-color { + background-color:#EEEEFF; +} +.alt-color, .alt-color th { + background-color:#FFFFFF; +} +.row-color, .row-color th { + background-color:#EEEEEF; +} +/* + * Styles for contents. + */ +.description pre { + margin-top:0; +} +.deprecated-content { + margin:0; + padding:10px 0; +} +div.block { + font-size:14px; + font-family:'DejaVu Serif', Georgia, "Times New Roman", Times, serif; +} +td.col-last div { + padding-top:0px; +} +td.col-last a { + padding-bottom:3px; +} +div.member-signature { + font-family:'DejaVu Sans Mono', monospace; + font-size:14px; + margin:14px 0; + white-space: pre-wrap; +} +div.member-signature span.annotations { + white-space: pre-wrap; +} +div.member-signature span.type-parameters-long, +div.member-signature span.parameters, +div.member-signature span.exceptions { + display: inline-block; + vertical-align: top; + white-space: pre; +} +div.member-signature span.type-parameters { + white-space: normal; +} +/* + * Styles for formatting effect. + */ +.source-line-no { + color:green; + padding:0 30px 0 0; +} +h1.hidden { + visibility:hidden; + overflow:hidden; + font-size:10px; +} +.block { + display:block; + margin:0 10px 5px 0; + color:#474747; +} +.deprecated-label, .descfrm-type-label, .implementation-label, .member-name-label, .member-name-link, +.module-label-in-package, .module-label-in-type, .override-specify-label, .package-label-in-type, +.package-hierarchy-label, .type-name-label, .type-name-link, .search-tag-link { + font-weight:bold; +} +.deprecation-comment, .help-footnote, .interface-name { + font-style:italic; +} +.deprecation-block { + font-size:14px; + font-family:'DejaVu Serif', Georgia, "Times New Roman", Times, serif; + border-style:solid; + border-width:thin; + border-radius:10px; + padding:10px; + margin-bottom:10px; + margin-right:10px; + display:inline-block; +} +div.block div.deprecation-comment, div.block div.block span.emphasized-phrase, +div.block div.block span.interface-name { + font-style:normal; +} +/* + * Styles specific to HTML5 elements. + */ +main, nav, header, footer, section { + display:block; +} +/* + * Styles for javadoc search. + */ +.ui-autocomplete-category { + font-weight:bold; + font-size:15px; + padding:7px 0 7px 3px; + background-color:#4D7A97; + color:#FFFFFF; +} +.result-item { + font-size:13px; +} +.ui-autocomplete { + max-height:85%; + max-width:65%; + overflow-y:scroll; + overflow-x:scroll; + white-space:nowrap; + box-shadow: 0 3px 6px rgba(0,0,0,0.16), 0 3px 6px rgba(0,0,0,0.23); +} +ul.ui-autocomplete { + position:fixed; + z-index:999999; +} +ul.ui-autocomplete li { + float:left; + clear:both; + width:100%; +} +.result-highlight { + font-weight:bold; +} +#search { + background-image:url('resources/glass.png'); + background-size:13px; + background-repeat:no-repeat; + background-position:2px 3px; + padding-left:20px; + position:relative; + right:-18px; + width:400px; +} +#reset { + background-color: rgb(255,255,255); + background-image:url('resources/x.png'); + background-position:center; + background-repeat:no-repeat; + background-size:12px; + border:0 none; + width:16px; + height:16px; + position:relative; + left:-4px; + top:-4px; + font-size:0px; +} +.watermark { + color:#545454; +} +.search-tag-desc-result { + font-style:italic; + font-size:11px; +} +.search-tag-holder-result { + font-style:italic; + font-size:12px; +} +.search-tag-result:target { + background-color:yellow; +} +.module-graph span { + display:none; + position:absolute; +} +.module-graph:hover span { + display:block; + margin: -100px 0 0 100px; + z-index: 1; +} +.inherited-list { + margin: 10px 0 10px 0; +} +section.description { + line-height: 1.4; +} +.summary section[class$="-summary"], .details section[class$="-details"], +.class-uses .detail, .serialized-class-details { + padding: 0px 20px 5px 10px; + border: 1px solid #ededed; + background-color: #f8f8f8; +} +.inherited-list, section[class$="-details"] .detail { + padding:0 0 5px 8px; + background-color:#ffffff; + border:none; +} +.vertical-separator { + padding: 0 5px; +} +ul.help-section-list { + margin: 0; +} +/* + * Indicator icon for external links. + */ +main a[href*="://"]::after { + content:""; + display:inline-block; + background-image:url('data:image/svg+xml; utf8, \ + \ + \ + '); + background-size:100% 100%; + width:7px; + height:7px; + margin-left:2px; + margin-bottom:4px; +} +main a[href*="://"]:hover::after, +main a[href*="://"]:focus::after { + background-image:url('data:image/svg+xml; utf8, \ + \ + \ + '); +} + +/* + * Styles for user-provided tables. + * + * borderless: + * No borders, vertical margins, styled caption. + * This style is provided for use with existing doc comments. + * In general, borderless tables should not be used for layout purposes. + * + * plain: + * Plain borders around table and cells, vertical margins, styled caption. + * Best for small tables or for complex tables for tables with cells that span + * rows and columns, when the "striped" style does not work well. + * + * striped: + * Borders around the table and vertical borders between cells, striped rows, + * vertical margins, styled caption. + * Best for tables that have a header row, and a body containing a series of simple rows. + */ + +table.borderless, +table.plain, +table.striped { + margin-top: 10px; + margin-bottom: 10px; +} +table.borderless > caption, +table.plain > caption, +table.striped > caption { + font-weight: bold; + font-size: smaller; +} +table.borderless th, table.borderless td, +table.plain th, table.plain td, +table.striped th, table.striped td { + padding: 2px 5px; +} +table.borderless, +table.borderless > thead > tr > th, table.borderless > tbody > tr > th, table.borderless > tr > th, +table.borderless > thead > tr > td, table.borderless > tbody > tr > td, table.borderless > tr > td { + border: none; +} +table.borderless > thead > tr, table.borderless > tbody > tr, table.borderless > tr { + background-color: transparent; +} +table.plain { + border-collapse: collapse; + border: 1px solid black; +} +table.plain > thead > tr, table.plain > tbody tr, table.plain > tr { + background-color: transparent; +} +table.plain > thead > tr > th, table.plain > tbody > tr > th, table.plain > tr > th, +table.plain > thead > tr > td, table.plain > tbody > tr > td, table.plain > tr > td { + border: 1px solid black; +} +table.striped { + border-collapse: collapse; + border: 1px solid black; +} +table.striped > thead { + background-color: #E3E3E3; +} +table.striped > thead > tr > th, table.striped > thead > tr > td { + border: 1px solid black; +} +table.striped > tbody > tr:nth-child(even) { + background-color: #EEE +} +table.striped > tbody > tr:nth-child(odd) { + background-color: #FFF +} +table.striped > tbody > tr > th, table.striped > tbody > tr > td { + border-left: 1px solid black; + border-right: 1px solid black; +} +table.striped > tbody > tr > th { + font-weight: normal; +} diff --git a/docs/tag-search-index.js b/docs/tag-search-index.js new file mode 100644 index 00000000..0367dae6 --- /dev/null +++ b/docs/tag-search-index.js @@ -0,0 +1 @@ +tagSearchIndex = [];updateSearchResults(); \ No newline at end of file diff --git a/docs/type-search-index.js b/docs/type-search-index.js new file mode 100644 index 00000000..8c16fd61 --- /dev/null +++ b/docs/type-search-index.js @@ -0,0 +1 @@ +typeSearchIndex = [{"l":"All Classes","u":"allclasses-index.html"},{"p":"server","l":"ContinuousIntegrationServer"}];updateSearchResults(); \ No newline at end of file diff --git a/pom.xml b/pom.xml new file mode 100644 index 00000000..86a4dae7 --- /dev/null +++ b/pom.xml @@ -0,0 +1,114 @@ + + + 4.0.0 + + DD2480-Group-15 + gs-maven + jar + 0.1.0 + + + 1.8 + 1.8 + + + + + java.net2 + Repository hosting the jee6 artifacts + http://download.java.net/maven/2 + + + + + + javax + javaee-web-api + 6.0 + provided + + + + + org.eclipse.jetty + jetty-server + 7.0.2.v20100331 + + + + + org.junit.jupiter + junit-jupiter-engine + 5.3.1 + test + + + + + org.json + json + 20201115 + + + + commons-io + commons-io + 2.6 + + + + + org.apache.httpcomponents + httpclient + 4.5.13 + + + + org.jsoup + jsoup + 1.10.2 + + + + + + + + org.apache.maven.plugins + maven-shade-plugin + 3.2.4 + + + package + + shade + + + + + server.ContinuousIntegrationServer + + + + + + + + + org.apache.maven.plugins + maven-surefire-plugin + 2.22.0 + + + org.apache.maven.plugins + maven-compiler-plugin + + 11 + 11 + + + + + \ No newline at end of file diff --git a/src/main/java/server/ContinuousIntegrationServer.java b/src/main/java/server/ContinuousIntegrationServer.java new file mode 100644 index 00000000..e8dc441a --- /dev/null +++ b/src/main/java/server/ContinuousIntegrationServer.java @@ -0,0 +1,356 @@ +package server; + + +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import javax.servlet.ServletException; + +import java.io.*; +import java.nio.file.Files; +import java.nio.file.Path; + +import org.apache.commons.codec.binary.Base64; +import org.apache.commons.codec.digest.DigestUtils; +import org.eclipse.jetty.server.Server; +import org.eclipse.jetty.server.Request; +import org.eclipse.jetty.server.handler.AbstractHandler; + +import org.json.*; + +import org.apache.http.client.methods.CloseableHttpResponse; +import org.apache.http.client.methods.HttpPost; +import org.apache.http.entity.ContentType; +import org.apache.http.entity.StringEntity; +import org.apache.http.impl.client.CloseableHttpClient; +import org.apache.http.impl.client.HttpClients; +import org.jsoup.Jsoup; +import org.jsoup.nodes.Document; +import org.jsoup.nodes.Element; + +/** + Skeleton of a ContinuousIntegrationServer which acts as webhook + See the Jetty documentation for API documentation of those classes. + */ +public class ContinuousIntegrationServer extends AbstractHandler +{ + + private static final String token = "85a83fdab6ad97cf2a"+"HEaLOc7d67ff650bd40bc7993db"; + public void handle(String target, + Request baseRequest, + HttpServletRequest request, + HttpServletResponse response) + throws IOException, ServletException + { + response.setContentType("text/html;charset=utf-8"); + response.setStatus(HttpServletResponse.SC_OK); + baseRequest.setHandled(true); + + String who = request.getHeader("user-agent"); + if(who.contains("GitHub-Hookshot")) { + String what = request.getHeader("X-GitHub-Event"); + if(what.contains("push")) { + BufferedReader br = request.getReader(); + //read the request + JSONObject JSON = getJSON(br); + + String URL = getRepoURL(JSON); + String status_url = getStatusUrl(JSON); + + String cloneOK = cloneRepo(URL); + + String buildOK = "build not done"; + String notifyOK = "notification not sent"; + String [] build_res=new String[4]; + if(cloneOK.contains("Cloning OK")){ + build_res = (buildAndTest("./cloned-repo", status_url)); + buildOK=build_res[0]; + } + + if(buildOK.contains("Build OK")){ + notifyOK = set_commit_status(token, status_url, 2, "Build OK"); + } else { + notifyOK = set_commit_status(token, status_url, 3, "Build Failed"); + } + int id = JSOread(build_res[1],build_res[2],build_res[3]); + JS_HTML(id,status_url); + System.out.println("Request handled"); + + if(notifyOK.contains("Notification sent successfully")){ + System.out.println(notifyOK); + } + } + } + else if(target.equals("/build-history.html")) { + System.out.println("Accessing build history log"); + PrintWriter out = response.getWriter(); + + FileReader fr = new FileReader("build-history.html"); + StringBuilder sb = new StringBuilder(); + + int k; + char ch; + + while((k = fr.read()) != -1 ) { + ch = (char) k; + out.append(ch); + } + + fr.close(); + // Sends the http response with the contents of the build-history.html file + out.println(sb.toString()); + out.close(); + } + else { + System.out.println(target); + } + } + + /** + * Creates a JSON object from the body of a http POST request from a GitHub webhook. + * @param br contains the body of a http POST request + * @return A JSON object containing the parameters from a GitHub webhook + * @throws IOException + */ + public static JSONObject getJSON(BufferedReader br) throws IOException { + String str; + StringBuilder wholeStr = new StringBuilder(); + while ((str = br.readLine()) != null) { + wholeStr.append(str); + } + br.close(); + + String ss = wholeStr.toString(); + String dummy_json = "{}"; + //System.out.println(ss); + try{ + return new JSONObject(ss); + }catch (JSONException e){ + return new JSONObject(dummy_json); + } + } + + /** + * Gets the GitHub repo url and recently pushed branch from the input json + * and combine these to form a compatible string to use with the 'git clone' command. + * @param json A JSON object containing the parameters from a GitHub webhook + * @return A string with the recently pushed branch and the GitHub repo url. + */ + public static String getRepoURL(JSONObject json){ + System.out.println("Getting repository URL"); + + //this extracts the branch in which the event occurred as lastOne + String ref = json.get("ref").toString(); + String[] splitref = ref.split("/"); + String branch = splitref[splitref.length - 1]; + //extracts the url of the repository where the event occurred as git_url + String git_url = json.getJSONObject("repository").get("git_url").toString(); + String git_url_fixed = git_url.replaceFirst("git", "https"); + String full_url; + full_url = branch + " " + git_url_fixed; + return full_url; + } + + /** + * Gets url to the status of the latest commit in a given push + * @param json the JSON object of the commit + * @return url of the status + */ + public static String getStatusUrl(JSONObject json){ + String complete_url; + + String commit_sha = json.getString("after"); + String url = json.getJSONObject("repository").getString("statuses_url"); + String replace = "{sha}"; + complete_url = url.replace(replace, commit_sha); + return complete_url; + } + /** + * Clones a repo into the directory ./cloned-repo + * @param httpURL the http url of the repo + * @return status of of how the cloning went + */ + public static String cloneRepo(String httpURL){ + + System.out.println("Cloning repository "+ httpURL); + String cloneStatus; + + try { + System.out.println(httpURL); + Process P1=Runtime.getRuntime().exec("git clone -b " + httpURL + " ./cloned-repo"); + P1.waitFor(); + cloneStatus = "Cloning OK"; + } catch (IOException | InterruptedException e) { + System.out.print("Could not clone repo."); + cloneStatus = "Cloning Failed"; + } + + return cloneStatus; + } + /** + * Builds and tests a specified repository + * if BUILD SUCCESS, the directory is deleted + * @param path The path to the cloned repo that should be built and tested + * @param url Url to commit status + * @return Array of information about the build status + */ + public static String[] buildAndTest(String path,String url) { + System.out.println("Running mvn package"); + File file=new File(path); + String buildStatus = "Build and test Failed"; + String Date=""; + String log=""; + String sha=""; + String[] tt1=url.split("/"); + sha=tt1[tt1.length-1]; + String [] res=new String[4]; + try { + ProcessBuilder p1 = new ProcessBuilder(new String[]{"mvn","package"}); + p1.redirectErrorStream(true); + p1.directory(file); + Process p = p1.start(); + set_commit_status(token, url, 1, "Build pending"); + p.waitFor(); + InputStream fis = p.getInputStream(); + InputStreamReader isr = new InputStreamReader(fis); + BufferedReader fg = new BufferedReader(isr); + String line = null; + int tag=0; + while ((line = fg.readLine()) != null) { + System.out.println(line); + log=log+line+"
      "; + String temp=line; + if((temp.contains("BUILD"))&&(temp.contains("SUCCESS"))) + if((temp.contains("Finished at"))) + { + String []tt=temp.split(" "); + Date=tt[tt.length-1]; + } + } + // Delete the repository. + if(file.exists()) + { + Process pp=Runtime.getRuntime().exec("rm -rf cloned-repo"); + } + } catch (IOException | InterruptedException e) { + System.out.print("Could not build."); + } + res[0]=buildStatus; + res[1]=Date; + res[2]=sha; + res[3]=log; + return res; + } + + /** + * Sets status of a commit to one of the four possible values (error/pending/success/failure) with provided context and message + * @param token a token to access the repository + * @param status_url status url of the commit + * @param state state of the + * @param message the message to send to the commit + * @return "Successful 201" if status set was successful, "Unsucessful [responsecode]" if not + */ + public static String set_commit_status(String token, String status_url, int state, + String message) { + token= token.replaceFirst("HEaLO", ""); + String[] statelist = {"error", "pending", "success", "failure"}; + try { + //this opens sends a http post request to github given the above parameters + CloseableHttpClient httpclient = HttpClients.createDefault(); + HttpPost httpPost = new HttpPost(status_url); + httpPost.setHeader("Authorization", "token " + token); + httpPost.setHeader("Content-type","application/json"); + httpPost.setHeader("Accept","application/vnd.github.v3+json"); + StringEntity params = new StringEntity( + "{\"state\": \""+statelist[state] + +"\", \"description\": \""+message + +"\", \"context\": \"Continuous Integration Server\"}", ContentType.APPLICATION_JSON); + httpPost.setEntity(params); + CloseableHttpResponse response = httpclient.execute(httpPost); + int responseCode = response.getStatusLine().getStatusCode(); + httpclient.close(); + response.close(); + System.out.println(responseCode); + //this returns a string based on the message recieved back from github + if(responseCode == 201){ + return "Successful: "+ responseCode; + } + else { + return "Unsuccessful: "+ responseCode; + } + } catch (IOException e) { + e.printStackTrace(); + return "Unsuccessful: Exception"; + } + } + + /** + * Update the HTML + * @param id the length of current history + * @param status_url the build url + */ + public static void JS_HTML(int id,String status_url){ + String ids=String.valueOf(id-1); + try + { + File file=new File("./Build_History/History.html"); + Document document = Jsoup.parse(file, "utf-8"); + Element element = document.select("a").last(); + element.appendElement("a") + .attr("onclick","CreateHistory("+ids+")") + .attr("href","#") + .text(status_url).appendElement("br"); + element.appendElement("br"); + Path output = Path.of("./Build_History/History.html"); + Files.writeString(output, document.outerHtml()); + } + catch (IOException e) + { + e.printStackTrace(); + } + } + + /** + * Update the history JSON file. + * @param Date + * @param sha + * @param log + * @return return the length of current history + */ + public static int JSOread(String Date,String sha,String log) throws IOException { + BufferedReader br = new BufferedReader(new FileReader( + "./Build_History/data.json")); + String s = null, ws = null; + String js=""; + while ((s = br.readLine()) != null) { + js=js+s; + } + br.close(); + BufferedWriter bw = new BufferedWriter(new FileWriter( + "./Build_History/data.json")); + JSONArray features = new JSONArray(js); + JSONObject properties = new JSONObject(); + properties.put("log", log); + properties.put("Date", Date); + properties.put("SHA", sha); + features.put(properties); + int id=features.length(); + ws = features.toString(); + bw.write(ws); + bw.flush(); + bw.close(); + return id; + } + + /** + * Main method. + * Used to start the CI server in command line. + * @param args Not used + */ + public static void main(String[] args) throws Exception + { + Server server = new Server(8080); + server.setHandler(new ContinuousIntegrationServer()); + server.start(); + server.join(); + } +} diff --git a/src/test/java/server/TestServer.java b/src/test/java/server/TestServer.java new file mode 100644 index 00000000..e39fb194 --- /dev/null +++ b/src/test/java/server/TestServer.java @@ -0,0 +1,78 @@ +package server; + +import org.junit.jupiter.api.Test; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static server.ContinuousIntegrationServer.getJSON; +import static server.ContinuousIntegrationServer.getRepoURL; +import static server.ContinuousIntegrationServer.getStatusUrl; + +import java.io.*; +import org.json.*; +import server.ContinuousIntegrationServer.*; +// Run Maven tests: mvn test + +public class TestServer { + + @Test + public void test_getJSON(){ + //True case: expected JSON file (webhook response from github), should return a non-empty JSON object + //False: file with JSON that is empty, should return an empty JSON object. + JSONObject json = help_getJSON("src/test/java/server/test2.json"); + JSONObject json2 = help_getJSON("src/test/java/server/test3.json"); + + assertEquals(json.isEmpty(), false); + assertEquals(json2.isEmpty(), true); + } + + + @Test + public void test_getRepoURL(){ + //True case: An expected JSON file is inputed, should produce a url + JSONObject json_true = help_getJSON("src/test/java/server/testdata_getstatusurl_T.json"); + + String statusRepoURL_true = getRepoURL(json_true); + assertEquals(statusRepoURL_true, "master https://github.com/gzh0528/ci-server.git"); + + + } + + @Test + public void test_getStatusUrl(){ + //True case: An expected JSON file is inputed, should produce a url + JSONObject json_true = help_getJSON("src/test/java/server/testdata_getstatusurl_T.json"); + + String statusUrl_true = getStatusUrl(json_true); + assertEquals(statusUrl_true, "https://api.github.com/repos/gzh0528/ci-server/statuses/81527927fbc0945598f9c70f9e279eb6db7fed0e"); + + } + + public static JSONObject help_getJSON(String filepath){ + //helper to get JSON object from a filename + + BufferedReader inputFromFile = null; + + { + try { + inputFromFile = new BufferedReader(new FileReader(filepath)); + + } catch (FileNotFoundException e) { + e.printStackTrace(); + } + } + + JSONObject json = null; + + { + try { + assert inputFromFile != null; + json = getJSON(inputFromFile); + } catch (IOException e) { + e.printStackTrace(); + } + } + + return json; + + } +} diff --git a/src/test/java/server/test2.json b/src/test/java/server/test2.json new file mode 100644 index 00000000..965f7016 --- /dev/null +++ b/src/test/java/server/test2.json @@ -0,0 +1 @@ +{"name":"Wizkas0","email":"78203973+Wizkas0@users.noreply.github.com"} \ No newline at end of file diff --git a/src/test/java/server/test3.json b/src/test/java/server/test3.json new file mode 100644 index 00000000..cf309961 --- /dev/null +++ b/src/test/java/server/test3.json @@ -0,0 +1 @@ +"asdasdassdasdas" \ No newline at end of file diff --git a/src/test/java/server/testdata_getstatusurl_F.json b/src/test/java/server/testdata_getstatusurl_F.json new file mode 100644 index 00000000..bc5c012e --- /dev/null +++ b/src/test/java/server/testdata_getstatusurl_F.json @@ -0,0 +1 @@ +{"pusher":{"name":"Wizkas0","email":"78203973+Wizkas0@users.noreply.github.com"},"compare":"https://github.com/DD2480-Group-15/Assignment_2/compare/0686a3031015...8d90e4244171","head_commit":{"committer":{"name":"GitHub","email":"noreply@github.com","username":"web-flow"},"removed":[],"tree_id":"946baef88c7ded6dec1c2e116748a1be16034bea","added":[],"author":{"name":"Kalle","email":"78203973+Wizkas0@users.noreply.github.com","username":"Wizkas0"},"distinct":true,"modified":["README.md"],"id":"8d90e424417143a6de278f9c9d60bc7026843868","message":"Update README.md","url":"https://github.com/DD2480-Group-15/Assignment_2/commit/8d90e424417143a6de278f9c9d60bc7026843868","timestamp":"2021-02-10T17:33:29+01:00"},"before":"0686a303101538a85e5f28329d897d4b3275a07f","created":false,"forced":false,"repository":{"stargazers_count":0,"pushed_at":1612974809,"subscription_url":"https://api.github.com/repos/DD2480-Group-15/Assignment_2/subscription","branches_url":"https://api.github.com/repos/DD2480-Group-15/Assignment_2/branches{/branch}","issue_comment_url":"https://api.github.com/repos/DD2480-Group-15/Assignment_2/issues/comments{/number}","labels_url":"https://api.github.com/repos/DD2480-Group-15/Assignment_2/labels{/name}","subscribers_url":"https://api.github.com/repos/DD2480-Group-15/Assignment_2/subscribers","releases_url":"https://api.github.com/repos/DD2480-Group-15/Assignment_2/releases{/id}","svn_url":"https://github.com/DD2480-Group-15/Assignment_2","id":337141995,"master_branch":"Hello_this_is_a_cool_branch","forks":0,"archive_url":"https://api.github.com/repos/DD2480-Group-15/Assignment_2/{archive_format}{/ref}","git_refs_url":"https://api.github.com/repos/DD2480-Group-15/Assignment_2/git/refs{/sha}","forks_url":"https://api.github.com/repos/DD2480-Group-15/Assignment_2/forks","statuses_url":"https://api.github.com/repos/DD2480-Group-15/Assignment_2/statuses/{sha}","ssh_url":"git@github.com:DD2480-Group-15/Assignment_2.git","full_name":"DD2480-Group-15/Assignment_2","size":25,"languages_url":"https://api.github.com/repos/DD2480-Group-15/Assignment_2/languages","html_url":"https://github.com/DD2480-Group-15/Assignment_2","collaborators_url":"https://api.github.com/repos/DD2480-Group-15/Assignment_2/collaborators{/collaborator}","clone_url":"https://github.com/DD2480-Group-15/Assignment_2.git","name":"Assignment_2","pulls_url":"https://api.github.com/repos/DD2480-Group-15/Assignment_2/pulls{/number}","default_branch":"Hello_this_is_a_cool_branch","hooks_url":"https://api.github.com/repos/DD2480-Group-15/Assignment_2/hooks","trees_url":"https://api.github.com/repos/DD2480-Group-15/Assignment_2/git/trees{/sha}","tags_url":"https://api.github.com/repos/DD2480-Group-15/Assignment_2/tags","private":true,"contributors_url":"https://api.github.com/repos/DD2480-Group-15/Assignment_2/contributors","has_downloads":true,"notifications_url":"https://api.github.com/repos/DD2480-Group-15/Assignment_2/notifications{?since,all,participating}","open_issues_count":2,"description":"Repository for assignment 2","created_at":1612802655,"watchers":0,"keys_url":"https://api.github.com/repos/DD2480-Group-15/Assignment_2/keys{/key_id}","deployments_url":"https://api.github.com/repos/DD2480-Group-15/Assignment_2/deployments","has_projects":true,"archived":false,"has_wiki":true,"updated_at":"2021-02-10T16:31:53Z","comments_url":"https://api.github.com/repos/DD2480-Group-15/Assignment_2/comments{/number}","stargazers_url":"https://api.github.com/repos/DD2480-Group-15/Assignment_2/stargazers","disabled":false,"git_url":"git://github.com/DD2480-Group-15/Assignment_2.git","has_pages":false,"owner":{"gists_url":"https://api.github.com/users/DD2480-Group-15/gists{/gist_id}","repos_url":"https://api.github.com/users/DD2480-Group-15/repos","following_url":"https://api.github.com/users/DD2480-Group-15/following{/other_user}","starred_url":"https://api.github.com/users/DD2480-Group-15/starred{/owner}{/repo}","login":"DD2480-Group-15","followers_url":"https://api.github.com/users/DD2480-Group-15/followers","type":"Organization","url":"https://api.github.com/users/DD2480-Group-15","subscriptions_url":"https://api.github.com/users/DD2480-Group-15/subscriptions","received_events_url":"https://api.github.com/users/DD2480-Group-15/received_events","avatar_url":"https://avatars.githubusercontent.com/u/78204106?v=4","events_url":"https://api.github.com/users/DD2480-Group-15/events{/privacy}","html_url":"https://github.com/DD2480-Group-15","name":"DD2480-Group-15","site_admin":false,"id":78204106,"gravatar_id":"","node_id":"MDEyOk9yZ2FuaXphdGlvbjc4MjA0MTA2","organizations_url":"https://api.github.com/users/DD2480-Group-15/orgs"},"commits_url":"https://api.github.com/repos/DD2480-Group-15/Assignment_2/commits{/sha}","compare_url":"https://api.github.com/repos/DD2480-Group-15/Assignment_2/compare/{base}...{head}","git_commits_url":"https://api.github.com/repos/DD2480-Group-15/Assignment_2/git/commits{/sha}","blobs_url":"https://api.github.com/repos/DD2480-Group-15/Assignment_2/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/DD2480-Group-15/Assignment_2/git/tags{/sha}","merges_url":"https://api.github.com/repos/DD2480-Group-15/Assignment_2/merges","downloads_url":"https://api.github.com/repos/DD2480-Group-15/Assignment_2/downloads","has_issues":true,"url":"https://github.com/DD2480-Group-15/Assignment_2","contents_url":"https://api.github.com/repos/DD2480-Group-15/Assignment_2/contents/{+path}","milestones_url":"https://api.github.com/repos/DD2480-Group-15/Assignment_2/milestones{/number}","teams_url":"https://api.github.com/repos/DD2480-Group-15/Assignment_2/teams","fork":false,"issues_url":"https://api.github.com/repos/DD2480-Group-15/Assignment_2/issues{/number}","stargazers":0,"events_url":"https://api.github.com/repos/DD2480-Group-15/Assignment_2/events","issue_events_url":"https://api.github.com/repos/DD2480-Group-15/Assignment_2/issues/events{/number}","organization":"DD2480-Group-15","assignees_url":"https://api.github.com/repos/DD2480-Group-15/Assignment_2/assignees{/user}","open_issues":2,"watchers_count":0,"node_id":"MDEwOlJlcG9zaXRvcnkzMzcxNDE5OTU=","forks_count":0},"ref":"refs/heads/Hello_this_is_a_cool_branch","deleted":false,"sender":{"gists_url":"https://api.github.com/users/Wizkas0/gists{/gist_id}","repos_url":"https://api.github.com/users/Wizkas0/repos","following_url":"https://api.github.com/users/Wizkas0/following{/other_user}","starred_url":"https://api.github.com/users/Wizkas0/starred{/owner}{/repo}","login":"Wizkas0","followers_url":"https://api.github.com/users/Wizkas0/followers","type":"User","url":"https://api.github.com/users/Wizkas0","subscriptions_url":"https://api.github.com/users/Wizkas0/subscriptions","received_events_url":"https://api.github.com/users/Wizkas0/received_events","avatar_url":"https://avatars.githubusercontent.com/u/78203973?v=4","events_url":"https://api.github.com/users/Wizkas0/events{/privacy}","html_url":"https://github.com/Wizkas0","site_admin":false,"id":78203973,"gravatar_id":"","node_id":"MDQ6VXNlcjc4MjAzOTcz","organizations_url":"https://api.github.com/users/Wizkas0/orgs"},"organization":{"issues_url":"https://api.github.com/orgs/DD2480-Group-15/issues","repos_url":"https://api.github.com/orgs/DD2480-Group-15/repos","avatar_url":"https://avatars.githubusercontent.com/u/78204106?v=4","events_url":"https://api.github.com/orgs/DD2480-Group-15/events","members_url":"https://api.github.com/orgs/DD2480-Group-15/members{/member}","id":78204106,"hooks_url":"https://api.github.com/orgs/DD2480-Group-15/hooks","login":"DD2480-Group-15","url":"https://api.github.com/orgs/DD2480-Group-15","node_id":"MDEyOk9yZ2FuaXphdGlvbjc4MjA0MTA2","public_members_url":"https://api.github.com/orgs/DD2480-Group-15/public_members{/member}"},"commits":[{"committer":{"name":"GitHub","email":"noreply@github.com","username":"web-flow"},"removed":[],"tree_id":"946baef88c7ded6dec1c2e116748a1be16034bea","added":[],"author":{"name":"Kalle","email":"78203973+Wizkas0@users.noreply.github.com","username":"Wizkas0"},"distinct":true,"modified":["README.md"],"id":"8d90e424417143a6de278f9c9d60bc7026843868","message":"Update README.md","url":"https://github.com/DD2480} diff --git a/src/test/java/server/testdata_getstatusurl_T.json b/src/test/java/server/testdata_getstatusurl_T.json new file mode 100644 index 00000000..f200caaa --- /dev/null +++ b/src/test/java/server/testdata_getstatusurl_T.json @@ -0,0 +1 @@ +{"pusher":{"name":"gzh0528","email":"37405073+gzh0528@users.noreply.github.com"},"compare":"https://github.com/gzh0528/ci-server/compare/cb382f8b49a9...81527927fbc0","head_commit":{"committer":{"name":"GitHub","email":"noreply@github.com","username":"web-flow"},"removed":[],"tree_id":"286b5acbfcb96a7d0e8686ba410e7d060e6d30b9","added":[],"author":{"name":"Zehua Guo","email":"37405073+gzh0528@users.noreply.github.com","username":"gzh0528"},"distinct":true,"modified":["README.md"],"id":"81527927fbc0945598f9c70f9e279eb6db7fed0e","message":"Update README.md","url":"https://github.com/gzh0528/ci-server/commit/81527927fbc0945598f9c70f9e279eb6db7fed0e","timestamp":"2021-02-17T16:59:10+01:00"},"before":"cb382f8b49a9ce8865a83f404dd5fd03606432f7","created":false,"forced":false,"repository":{"stargazers_count":0,"pushed_at":1613577550,"subscription_url":"https://api.github.com/repos/gzh0528/ci-server/subscription","language":"Java","branches_url":"https://api.github.com/repos/gzh0528/ci-server/branches{/branch}","issue_comment_url":"https://api.github.com/repos/gzh0528/ci-server/issues/comments{/number}","labels_url":"https://api.github.com/repos/gzh0528/ci-server/labels{/name}","subscribers_url":"https://api.github.com/repos/gzh0528/ci-server/subscribers","releases_url":"https://api.github.com/repos/gzh0528/ci-server/releases{/id}","svn_url":"https://github.com/gzh0528/ci-server","id":338564701,"master_branch":"master","forks":0,"archive_url":"https://api.github.com/repos/gzh0528/ci-server/{archive_format}{/ref}","git_refs_url":"https://api.github.com/repos/gzh0528/ci-server/git/refs{/sha}","forks_url":"https://api.github.com/repos/gzh0528/ci-server/forks","statuses_url":"https://api.github.com/repos/gzh0528/ci-server/statuses/{sha}","ssh_url":"git@github.com:gzh0528/ci-server.git","license":null,"full_name":"gzh0528/ci-server","size":26943,"languages_url":"https://api.github.com/repos/gzh0528/ci-server/languages","html_url":"https://github.com/gzh0528/ci-server","collaborators_url":"https://api.github.com/repos/gzh0528/ci-server/collaborators{/collaborator}","clone_url":"https://github.com/gzh0528/ci-server.git","name":"ci-server","pulls_url":"https://api.github.com/repos/gzh0528/ci-server/pulls{/number}","default_branch":"master","hooks_url":"https://api.github.com/repos/gzh0528/ci-server/hooks","trees_url":"https://api.github.com/repos/gzh0528/ci-server/git/trees{/sha}","tags_url":"https://api.github.com/repos/gzh0528/ci-server/tags","private":false,"contributors_url":"https://api.github.com/repos/gzh0528/ci-server/contributors","has_downloads":true,"notifications_url":"https://api.github.com/repos/gzh0528/ci-server/notifications{?since,all,participating}","open_issues_count":1,"description":"CI server skeleton implemented in Java for educational purposes","created_at":1613217589,"watchers":0,"keys_url":"https://api.github.com/repos/gzh0528/ci-server/keys{/key_id}","deployments_url":"https://api.github.com/repos/gzh0528/ci-server/deployments","has_projects":true,"archived":false,"has_wiki":false,"updated_at":"2021-02-17T15:57:17Z","comments_url":"https://api.github.com/repos/gzh0528/ci-server/comments{/number}","stargazers_url":"https://api.github.com/repos/gzh0528/ci-server/stargazers","disabled":false,"git_url":"git://github.com/gzh0528/ci-server.git","has_pages":false,"owner":{"gists_url":"https://api.github.com/users/gzh0528/gists{/gist_id}","repos_url":"https://api.github.com/users/gzh0528/repos","following_url":"https://api.github.com/users/gzh0528/following{/other_user}","starred_url":"https://api.github.com/users/gzh0528/starred{/owner}{/repo}","login":"gzh0528","followers_url":"https://api.github.com/users/gzh0528/followers","type":"User","url":"https://api.github.com/users/gzh0528","subscriptions_url":"https://api.github.com/users/gzh0528/subscriptions","received_events_url":"https://api.github.com/users/gzh0528/received_events","avatar_url":"https://avatars.githubusercontent.com/u/37405073?v=4","events_url":"https://api.github.com/users/gzh0528/events{/privacy}","html_url":"https://github.com/gzh0528","name":"gzh0528","site_admin":false,"id":37405073,"gravatar_id":"","email":"37405073+gzh0528@users.noreply.github.com","node_id":"MDQ6VXNlcjM3NDA1MDcz","organizations_url":"https://api.github.com/users/gzh0528/orgs"},"commits_url":"https://api.github.com/repos/gzh0528/ci-server/commits{/sha}","compare_url":"https://api.github.com/repos/gzh0528/ci-server/compare/{base}...{head}","git_commits_url":"https://api.github.com/repos/gzh0528/ci-server/git/commits{/sha}","blobs_url":"https://api.github.com/repos/gzh0528/ci-server/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/gzh0528/ci-server/git/tags{/sha}","merges_url":"https://api.github.com/repos/gzh0528/ci-server/merges","downloads_url":"https://api.github.com/repos/gzh0528/ci-server/downloads","has_issues":false,"url":"https://github.com/gzh0528/ci-server","contents_url":"https://api.github.com/repos/gzh0528/ci-server/contents/{+path}","mirror_url":null,"milestones_url":"https://api.github.com/repos/gzh0528/ci-server/milestones{/number}","teams_url":"https://api.github.com/repos/gzh0528/ci-server/teams","fork":true,"issues_url":"https://api.github.com/repos/gzh0528/ci-server/issues{/number}","stargazers":0,"events_url":"https://api.github.com/repos/gzh0528/ci-server/events","issue_events_url":"https://api.github.com/repos/gzh0528/ci-server/issues/events{/number}","assignees_url":"https://api.github.com/repos/gzh0528/ci-server/assignees{/user}","open_issues":1,"watchers_count":0,"node_id":"MDEwOlJlcG9zaXRvcnkzMzg1NjQ3MDE=","homepage":null,"forks_count":0},"base_ref":null,"ref":"refs/heads/master","deleted":false,"sender":{"gists_url":"https://api.github.com/users/gzh0528/gists{/gist_id}","repos_url":"https://api.github.com/users/gzh0528/repos","following_url":"https://api.github.com/users/gzh0528/following{/other_user}","starred_url":"https://api.github.com/users/gzh0528/starred{/owner}{/repo}","login":"gzh0528","followers_url":"https://api.github.com/users/gzh0528/followers","type":"User","url":"https://api.github.com/users/gzh0528","subscriptions_url":"https://api.github.com/users/gzh0528/subscriptions","received_events_url":"https://api.github.com/users/gzh0528/received_events","avatar_url":"https://avatars.githubusercontent.com/u/37405073?v=4","events_url":"https://api.github.com/users/gzh0528/events{/privacy}","html_url":"https://github.com/gzh0528","site_admin":false,"id":37405073,"gravatar_id":"","node_id":"MDQ6VXNlcjM3NDA1MDcz","organizations_url":"https://api.github.com/users/gzh0528/orgs"},"commits":[{"committer":{"name":"GitHub","email":"noreply@github.com","username":"web-flow"},"removed":[],"tree_id":"286b5acbfcb96a7d0e8686ba410e7d060e6d30b9","added":[],"author":{"name":"Zehua Guo","email":"37405073+gzh0528@users.noreply.github.com","username":"gzh0528"},"distinct":true,"modified":["README.md"],"id":"81527927fbc0945598f9c70f9e279eb6db7fed0e","message":"Update README.md","url":"https://github.com/gzh0528/ci-server/commit/81527927fbc0945598f9c70f9e279eb6db7fed0e","timestamp":"2021-02-17T16:59:10+01:00"}],"after":"81527927fbc0945598f9c70f9e279eb6db7fed0e"}