From 57b0fa5b55acdd4bcfda4c5c1e7720bf8163c934 Mon Sep 17 00:00:00 2001 From: "Erik C. Thauvin" Date: Sun, 30 Apr 2023 14:27:22 -0700 Subject: [PATCH] Initial commit --- .gitignore | 57 ++++++ .idea/.gitignore | 3 + .idea/app.iml | 29 +++ .idea/bld.iml | 14 ++ .idea/codeStyles/codeStyleConfig.xml | 5 + .idea/copyright/Apache_License.xml | 6 + .idea/copyright/profiles_settings.xml | 3 + .idea/inspectionProfiles/Project_Default.xml | 8 + .idea/libraries/bld.xml | 17 ++ .idea/libraries/compile.xml | 13 ++ .idea/libraries/runtime.xml | 14 ++ .idea/libraries/test.xml | 14 ++ .idea/misc.xml | 34 ++++ .idea/modules.xml | 9 + .idea/runConfigurations/Run Tests.xml | 9 + .vscode/launch.json | 11 ++ .vscode/settings.json | 15 ++ LICENSE.txt | 176 +++++++++++++++++ bld | 2 + bld.bat | 4 + config/pmd.xml | 110 +++++++++++ lib/bld/bld-wrapper.jar | Bin 0 -> 25099 bytes lib/bld/bld-wrapper.properties | 6 + .../extension/JacocoReportOperationBuild.java | 93 +++++++++ .../bld/extension/JacocoReportOperation.java | 177 ++++++++++++++++++ .../extension/JacocoReportOperationTest.java | 31 +++ 26 files changed, 860 insertions(+) create mode 100644 .gitignore create mode 100644 .idea/.gitignore create mode 100644 .idea/app.iml create mode 100644 .idea/bld.iml create mode 100644 .idea/codeStyles/codeStyleConfig.xml create mode 100644 .idea/copyright/Apache_License.xml create mode 100644 .idea/copyright/profiles_settings.xml create mode 100644 .idea/inspectionProfiles/Project_Default.xml create mode 100644 .idea/libraries/bld.xml create mode 100644 .idea/libraries/compile.xml create mode 100644 .idea/libraries/runtime.xml create mode 100644 .idea/libraries/test.xml create mode 100644 .idea/misc.xml create mode 100644 .idea/modules.xml create mode 100644 .idea/runConfigurations/Run Tests.xml create mode 100644 .vscode/launch.json create mode 100644 .vscode/settings.json create mode 100644 LICENSE.txt create mode 100755 bld create mode 100644 bld.bat create mode 100644 config/pmd.xml create mode 100644 lib/bld/bld-wrapper.jar create mode 100644 lib/bld/bld-wrapper.properties create mode 100644 src/bld/java/rife/bld/extension/JacocoReportOperationBuild.java create mode 100644 src/main/java/rife/bld/extension/JacocoReportOperation.java create mode 100644 src/test/java/rife/bld/extension/JacocoReportOperationTest.java diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..a9d7499 --- /dev/null +++ b/.gitignore @@ -0,0 +1,57 @@ +.gradle +.DS_Store +build +lib/bld/** +lib/compile/** +lib/runtime/** +lib/standalone/** +lib/test/** +!bld-wrapper.jar +!bld-wrapper.properties + +# IDEA ignores + +# User-specific +.idea/**/workspace.xml +.idea/**/tasks.xml +.idea/**/usage.statistics.xml +.idea/**/dictionaries +.idea/**/shelf + +# AWS User-specific +.idea/**/aws.xml + +# Generated files +.idea/**/contentModel.xml + +# Sensitive or high-churn files +.idea/**/dataSources/ +.idea/**/dataSources.ids +.idea/**/dataSources.local.xml +.idea/**/sqlDataSources.xml +.idea/**/dynamic.xml +.idea/**/uiDesigner.xml +.idea/**/dbnavigator.xml + +# Gradle +.idea/**/gradle.xml + +# Mongo Explorer plugin +.idea/**/mongoSettings.xml + +# mpeltonen/sbt-idea plugin +.idea_modules/ + +# JIRA plugin +atlassian-ide-plugin.xml + +# Cursive Clojure plugin +.idea/replstate.xml + +# SonarLint plugin +.idea/sonarlint/ + +# Editor-based Rest Client +.idea/httpRequests + +local.properties diff --git a/.idea/.gitignore b/.idea/.gitignore new file mode 100644 index 0000000..26d3352 --- /dev/null +++ b/.idea/.gitignore @@ -0,0 +1,3 @@ +# Default ignored files +/shelf/ +/workspace.xml diff --git a/.idea/app.iml b/.idea/app.iml new file mode 100644 index 0000000..787b59b --- /dev/null +++ b/.idea/app.iml @@ -0,0 +1,29 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/bld.iml b/.idea/bld.iml new file mode 100644 index 0000000..e63e11e --- /dev/null +++ b/.idea/bld.iml @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/codeStyles/codeStyleConfig.xml b/.idea/codeStyles/codeStyleConfig.xml new file mode 100644 index 0000000..d91f848 --- /dev/null +++ b/.idea/codeStyles/codeStyleConfig.xml @@ -0,0 +1,5 @@ + + + + \ No newline at end of file diff --git a/.idea/copyright/Apache_License.xml b/.idea/copyright/Apache_License.xml new file mode 100644 index 0000000..206aa7d --- /dev/null +++ b/.idea/copyright/Apache_License.xml @@ -0,0 +1,6 @@ + + + + \ No newline at end of file diff --git a/.idea/copyright/profiles_settings.xml b/.idea/copyright/profiles_settings.xml new file mode 100644 index 0000000..f2907f1 --- /dev/null +++ b/.idea/copyright/profiles_settings.xml @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/.idea/inspectionProfiles/Project_Default.xml b/.idea/inspectionProfiles/Project_Default.xml new file mode 100644 index 0000000..1e01b48 --- /dev/null +++ b/.idea/inspectionProfiles/Project_Default.xml @@ -0,0 +1,8 @@ + + + + \ No newline at end of file diff --git a/.idea/libraries/bld.xml b/.idea/libraries/bld.xml new file mode 100644 index 0000000..7596927 --- /dev/null +++ b/.idea/libraries/bld.xml @@ -0,0 +1,17 @@ + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/compile.xml b/.idea/libraries/compile.xml new file mode 100644 index 0000000..9bd86aa --- /dev/null +++ b/.idea/libraries/compile.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/runtime.xml b/.idea/libraries/runtime.xml new file mode 100644 index 0000000..2ae5c4b --- /dev/null +++ b/.idea/libraries/runtime.xml @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/test.xml b/.idea/libraries/test.xml new file mode 100644 index 0000000..b80486a --- /dev/null +++ b/.idea/libraries/test.xml @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/misc.xml b/.idea/misc.xml new file mode 100644 index 0000000..3ce681f --- /dev/null +++ b/.idea/misc.xml @@ -0,0 +1,34 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/modules.xml b/.idea/modules.xml new file mode 100644 index 0000000..55adcb9 --- /dev/null +++ b/.idea/modules.xml @@ -0,0 +1,9 @@ + + + + + + + + + \ No newline at end of file diff --git a/.idea/runConfigurations/Run Tests.xml b/.idea/runConfigurations/Run Tests.xml new file mode 100644 index 0000000..1c87a6e --- /dev/null +++ b/.idea/runConfigurations/Run Tests.xml @@ -0,0 +1,9 @@ + + + + \ No newline at end of file diff --git a/.vscode/launch.json b/.vscode/launch.json new file mode 100644 index 0000000..99324ea --- /dev/null +++ b/.vscode/launch.json @@ -0,0 +1,11 @@ +{ + "version": "0.2.0", + "configurations": [ + { + "type": "java", + "name": "Run Tests", + "request": "launch", + "mainClass": "rife.bld.extension.JacocoReportOperationTest" + } + ] +} diff --git a/.vscode/settings.json b/.vscode/settings.json new file mode 100644 index 0000000..4fdc74b --- /dev/null +++ b/.vscode/settings.json @@ -0,0 +1,15 @@ +{ + "java.project.sourcePaths": [ + "src/main/java", + "src/main/resources", + "src/test/java", + "src/bld/java" + ], + "java.configuration.updateBuildConfiguration": "automatic", + "java.project.referencedLibraries": [ + "${HOME}/.rife2/dist/rife2-1.6.1.jar", + "lib/compile/*.jar", + "lib/runtime/*.jar", + "lib/test/*.jar" + ] +} diff --git a/LICENSE.txt b/LICENSE.txt new file mode 100644 index 0000000..23f75ac --- /dev/null +++ b/LICENSE.txt @@ -0,0 +1,176 @@ + Apache License + Version 2.0, January 2004 + https://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS \ No newline at end of file diff --git a/bld b/bld new file mode 100755 index 0000000..be387c0 --- /dev/null +++ b/bld @@ -0,0 +1,2 @@ +#!/usr/bin/env sh +java -jar "$(dirname "$0")/lib/bld/bld-wrapper.jar" "$0" --build rife.bld.extension.JacocoReportOperationBuild "$@" \ No newline at end of file diff --git a/bld.bat b/bld.bat new file mode 100644 index 0000000..e3a2664 --- /dev/null +++ b/bld.bat @@ -0,0 +1,4 @@ +@echo off +set DIRNAME=%~dp0 +if "%DIRNAME%" == "" set DIRNAME=. +java -jar "%DIRNAME%/lib/bld/bld-wrapper.jar" "%0" --build rife.bld.extension.JacocoReportOperationBuild %* \ No newline at end of file diff --git a/config/pmd.xml b/config/pmd.xml new file mode 100644 index 0000000..1039e40 --- /dev/null +++ b/config/pmd.xml @@ -0,0 +1,110 @@ + + + Erik's Ruleset + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/lib/bld/bld-wrapper.jar b/lib/bld/bld-wrapper.jar new file mode 100644 index 0000000000000000000000000000000000000000..86773aff8df6b1efa8d7b1ca2fc897475e9c555d GIT binary patch literal 25099 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 bX8P|JaCoCo reports. + * + * @author Erik C. Thauvin + * @since 1.0 + */ +public class JacocoReportOperation extends AbstractOperation { + private static final Logger LOGGER = Logger.getLogger(JacocoReportOperation.class.getName()); + private final List classFiles = new ArrayList<>(); + private final List execFiles = new ArrayList<>(); + private final List sourceFiles = new ArrayList<>(); + private File csv; + private String encoding; + private File html; + private String name; + private BaseProject project; + private boolean quiet = false; + private int tabWidth = 4; + private File xml; + + /** + * Set the locations of Java class files. + **/ + public JacocoReportOperation classFiles(ArrayList classFiles) { + this.classFiles.addAll(classFiles); + return this; + } + + /** + * Sets the location of the CSV report. + */ + public JacocoReportOperation csv(File cvs) { + this.csv = cvs; + return this; + } + + /** + * Sets the source file encoding. The platform encoding is used by default. + */ + public JacocoReportOperation encoding(String encoding) { + this.encoding = encoding; + return this; + } + + /** + * Sets a list of JaCoCo *.exec files to read. + **/ + public JacocoReportOperation execFiles(ArrayList execFiles) { + this.execFiles.addAll(execFiles); + return this; + } + + /** + * Performs the operation execution that can be wrapped by the {@code #executeOnce} call. + * + * @throws Exception when an exception occurs during the execution + * @since 1.5.10 + */ + @Override + + public void execute() throws Exception { + if (project == null && LOGGER.isLoggable(Level.SEVERE)) { + LOGGER.severe("A project must be specified."); + } else { + + if (execFiles.isEmpty()) { + if (LOGGER.isLoggable(Level.WARNING)) { + LOGGER.warning("No execution data files provided."); + } + } + + if (sourceFiles.isEmpty()) { + sourceFiles.addAll(project.mainSourceFiles()); + sourceFiles.addAll(project.testSourceFiles()); + } + + if (classFiles.isEmpty()) { + classFiles.addAll(getClassFiles(project.buildMainDirectory())); + classFiles.addAll(getClassFiles(project.buildTestDirectory())); + } + } + } + + private List getClassFiles(File directory) { + return FileUtils.getFileList(directory, Pattern.compile("^.*\\.class$"), null) + .stream().map(f -> new File(directory, f)).toList(); + } + + /** + * Configure the operation from a {@link BaseProject}. + */ + public JacocoReportOperation fromProject(BaseProject project) { + this.project = project; + return this; + } + + public String getMessage() { + return "Hello World!"; + } + + /** + * Sets the location of the HTML report. + */ + public JacocoReportOperation html(File html) { + this.html = html; + return this; + } + + /** + * Sets the name used for the report. + */ + public JacocoReportOperation name(String name) { + this.name = name; + return this; + } + + /** + * Suppresses all output. + */ + public JacocoReportOperation quiet(boolean quiet) { + this.quiet = quiet; + return this; + } + + /** + * Sets the locations of the source files. + **/ + public JacocoReportOperation sourceFiles(ArrayList sourceFiles) { + this.sourceFiles.addAll(sourceFiles); + return this; + } + + /** + * Sets the tab stop width for the source pages. Default is {@code 4}. + */ + public JacocoReportOperation tabWidth(int tabWitdh) { + this.tabWidth = tabWitdh; + return this; + } + + /** + * Sets the location of the XML report. + */ + public JacocoReportOperation xml(File xml) { + this.xml = xml; + return this; + } +} \ No newline at end of file diff --git a/src/test/java/rife/bld/extension/JacocoReportOperationTest.java b/src/test/java/rife/bld/extension/JacocoReportOperationTest.java new file mode 100644 index 0000000..f89f5a8 --- /dev/null +++ b/src/test/java/rife/bld/extension/JacocoReportOperationTest.java @@ -0,0 +1,31 @@ +/* + * Copyright 2023 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package rife.bld.extension; + +public class JacocoReportOperationTest { + void verifyHello() { + if (!"Hello World!".equals(new JacocoReportOperation().getMessage())) { + throw new AssertionError(); + } else { + System.out.println("Succeeded"); + } + } + + public static void main(String[] args) { + new JacocoReportOperationTest().verifyHello(); + } +} \ No newline at end of file