From f47dd66d88b983cf3b5d2fdc7c9f6b683610ae1f Mon Sep 17 00:00:00 2001 From: JeremyStarTM Date: Sat, 8 Jun 2024 15:33:03 +0200 Subject: [PATCH] Initial commit --- .gitignore | 43 ++ .idea/workspace.xml | 105 +++ LICENSE | 661 ++++++++++++++++++ README.md | 51 ++ base/build.gradle | 33 + base/gradle | 1 + base/gradlew | 1 + base/gradlew.bat | 1 + .../staropensource/sosengine/base/Engine.java | 162 +++++ .../sosengine/base/EngineConfiguration.java | 268 +++++++ .../sosengine/base/classes/LoggerImpl.java | 65 ++ .../sosengine/base/classes/Placeholder.java | 51 ++ .../sosengine/base/classes/package-info.java | 25 + .../sosengine/base/data/package-info.java | 25 + .../base/data/placeholders/DateDay.java | 55 ++ .../base/data/placeholders/DateMonth.java | 55 ++ .../base/data/placeholders/DateYear.java | 55 ++ .../placeholders/EngineDependencyJansi.java | 53 ++ .../EngineDependencyJetbrainsAnnotations.java | 53 ++ .../placeholders/EngineDependencyLombok.java | 53 ++ .../data/placeholders/EnginePluginLombok.java | 53 ++ .../data/placeholders/EnginePluginShadow.java | 53 ++ .../base/data/placeholders/EngineVersion.java | 52 ++ .../data/placeholders/EngineVersionFork.java | 53 ++ .../data/placeholders/EngineVersionType.java | 53 ++ .../EngineVersionTyperelease.java | 53 ++ .../placeholders/EngineVersionVersion.java | 53 ++ .../base/data/placeholders/JvmArguments.java | 68 ++ .../placeholders/JvmImplementationName.java | 52 ++ .../placeholders/JvmImplementationVendor.java | 52 ++ .../JvmImplementationVersion.java | 52 ++ .../base/data/placeholders/JvmUptime.java | 52 ++ .../base/data/placeholders/JvmVersion.java | 52 ++ .../base/data/placeholders/TimeEpoch.java | 54 ++ .../base/data/placeholders/TimeHour.java | 55 ++ .../base/data/placeholders/TimeMinute.java | 55 ++ .../base/data/placeholders/TimeSecond.java | 55 ++ .../base/data/placeholders/TimeZone.java | 54 ++ .../base/data/placeholders/package-info.java | 27 + .../sosengine/base/logging/CrashHandler.java | 216 ++++++ .../base/logging/DefaultLoggerImpl.java | 75 ++ .../sosengine/base/logging/Logger.java | 208 ++++++ .../base/logging/LoggerInstance.java | 140 ++++ .../sosengine/base/logging/package-info.java | 28 + .../crashhandler/IssuerClass.java | 63 ++ .../crashhandler/IssuerCodePart.java | 63 ++ .../placeholders/crashhandler/IssuerInfo.java | 66 ++ .../crashhandler/IssuerMessage.java | 62 ++ .../crashhandler/IssuerPackage.java | 63 ++ .../placeholders/crashhandler/IssuerPath.java | 63 ++ .../placeholders/crashhandler/Stacktrace.java | 70 ++ .../crashhandler/package-info.java | 26 + .../logging/placeholders/logger/LogClass.java | 63 ++ .../placeholders/logger/LogCodePart.java | 63 ++ .../placeholders/logger/LogColorPrimary.java | 74 ++ .../logger/LogColorSecondary.java | 70 ++ .../logging/placeholders/logger/LogInfo.java | 65 ++ .../logging/placeholders/logger/LogLevel.java | 71 ++ .../placeholders/logger/LogMessage.java | 62 ++ .../placeholders/logger/LogPackage.java | 63 ++ .../logging/placeholders/logger/LogPath.java | 63 ++ .../placeholders/logger/package-info.java | 26 + .../logging/placeholders/package-info.java | 26 + .../sosengine/base/package-info.java | 28 + .../sosengine/base/types/CodePart.java | 52 ++ .../sosengine/base/types/LogIssuer.java | 127 ++++ .../sosengine/base/types/LogLevel.java | 78 +++ .../sosengine/base/types/VersionType.java | 59 ++ .../sosengine/base/types/package-info.java | 25 + .../sosengine/base/utility/BuildInfo.java | 221 ++++++ .../base/utility/JvmInformation.java | 105 +++ .../sosengine/base/utility/Miscellaneous.java | 50 ++ .../base/utility/PlaceholderEngine.java | 152 ++++ .../base/utility/PropertyParser.java | 295 ++++++++ .../base/utility/ShortcodeConverter.java | 255 +++++++ .../base/utility/StackTraceParser.java | 80 +++ .../sosengine/base/utility/package-info.java | 26 + .../sosengine/package-info.java | 25 + base/src/main/javadoc/overview.html | 30 + base/src/main/resources/gradle.properties | 1 + gradle.properties | 17 + gradle/wrapper/gradle-wrapper.jar | Bin 0 -> 43453 bytes gradle/wrapper/gradle-wrapper.properties | 7 + gradlew | 249 +++++++ gradlew.bat | 92 +++ settings.gradle | 4 + testapp/build.gradle | 57 ++ testapp/gradle | 1 + testapp/gradlew | 1 + testapp/gradlew.bat | 1 + .../sosengine/testapp/Main.java | 103 +++ 91 files changed, 6744 insertions(+) create mode 100644 .gitignore create mode 100644 .idea/workspace.xml create mode 100644 LICENSE create mode 100644 README.md create mode 100644 base/build.gradle create mode 120000 base/gradle create mode 120000 base/gradlew create mode 120000 base/gradlew.bat create mode 100644 base/src/main/java/de/staropensource/sosengine/base/Engine.java create mode 100644 base/src/main/java/de/staropensource/sosengine/base/EngineConfiguration.java create mode 100644 base/src/main/java/de/staropensource/sosengine/base/classes/LoggerImpl.java create mode 100644 base/src/main/java/de/staropensource/sosengine/base/classes/Placeholder.java create mode 100644 base/src/main/java/de/staropensource/sosengine/base/classes/package-info.java create mode 100644 base/src/main/java/de/staropensource/sosengine/base/data/package-info.java create mode 100644 base/src/main/java/de/staropensource/sosengine/base/data/placeholders/DateDay.java create mode 100644 base/src/main/java/de/staropensource/sosengine/base/data/placeholders/DateMonth.java create mode 100644 base/src/main/java/de/staropensource/sosengine/base/data/placeholders/DateYear.java create mode 100644 base/src/main/java/de/staropensource/sosengine/base/data/placeholders/EngineDependencyJansi.java create mode 100644 base/src/main/java/de/staropensource/sosengine/base/data/placeholders/EngineDependencyJetbrainsAnnotations.java create mode 100644 base/src/main/java/de/staropensource/sosengine/base/data/placeholders/EngineDependencyLombok.java create mode 100644 base/src/main/java/de/staropensource/sosengine/base/data/placeholders/EnginePluginLombok.java create mode 100644 base/src/main/java/de/staropensource/sosengine/base/data/placeholders/EnginePluginShadow.java create mode 100644 base/src/main/java/de/staropensource/sosengine/base/data/placeholders/EngineVersion.java create mode 100644 base/src/main/java/de/staropensource/sosengine/base/data/placeholders/EngineVersionFork.java create mode 100644 base/src/main/java/de/staropensource/sosengine/base/data/placeholders/EngineVersionType.java create mode 100644 base/src/main/java/de/staropensource/sosengine/base/data/placeholders/EngineVersionTyperelease.java create mode 100644 base/src/main/java/de/staropensource/sosengine/base/data/placeholders/EngineVersionVersion.java create mode 100644 base/src/main/java/de/staropensource/sosengine/base/data/placeholders/JvmArguments.java create mode 100644 base/src/main/java/de/staropensource/sosengine/base/data/placeholders/JvmImplementationName.java create mode 100644 base/src/main/java/de/staropensource/sosengine/base/data/placeholders/JvmImplementationVendor.java create mode 100644 base/src/main/java/de/staropensource/sosengine/base/data/placeholders/JvmImplementationVersion.java create mode 100644 base/src/main/java/de/staropensource/sosengine/base/data/placeholders/JvmUptime.java create mode 100644 base/src/main/java/de/staropensource/sosengine/base/data/placeholders/JvmVersion.java create mode 100644 base/src/main/java/de/staropensource/sosengine/base/data/placeholders/TimeEpoch.java create mode 100644 base/src/main/java/de/staropensource/sosengine/base/data/placeholders/TimeHour.java create mode 100644 base/src/main/java/de/staropensource/sosengine/base/data/placeholders/TimeMinute.java create mode 100644 base/src/main/java/de/staropensource/sosengine/base/data/placeholders/TimeSecond.java create mode 100644 base/src/main/java/de/staropensource/sosengine/base/data/placeholders/TimeZone.java create mode 100644 base/src/main/java/de/staropensource/sosengine/base/data/placeholders/package-info.java create mode 100644 base/src/main/java/de/staropensource/sosengine/base/logging/CrashHandler.java create mode 100644 base/src/main/java/de/staropensource/sosengine/base/logging/DefaultLoggerImpl.java create mode 100644 base/src/main/java/de/staropensource/sosengine/base/logging/Logger.java create mode 100644 base/src/main/java/de/staropensource/sosengine/base/logging/LoggerInstance.java create mode 100644 base/src/main/java/de/staropensource/sosengine/base/logging/package-info.java create mode 100644 base/src/main/java/de/staropensource/sosengine/base/logging/placeholders/crashhandler/IssuerClass.java create mode 100644 base/src/main/java/de/staropensource/sosengine/base/logging/placeholders/crashhandler/IssuerCodePart.java create mode 100644 base/src/main/java/de/staropensource/sosengine/base/logging/placeholders/crashhandler/IssuerInfo.java create mode 100644 base/src/main/java/de/staropensource/sosengine/base/logging/placeholders/crashhandler/IssuerMessage.java create mode 100644 base/src/main/java/de/staropensource/sosengine/base/logging/placeholders/crashhandler/IssuerPackage.java create mode 100644 base/src/main/java/de/staropensource/sosengine/base/logging/placeholders/crashhandler/IssuerPath.java create mode 100644 base/src/main/java/de/staropensource/sosengine/base/logging/placeholders/crashhandler/Stacktrace.java create mode 100644 base/src/main/java/de/staropensource/sosengine/base/logging/placeholders/crashhandler/package-info.java create mode 100644 base/src/main/java/de/staropensource/sosengine/base/logging/placeholders/logger/LogClass.java create mode 100644 base/src/main/java/de/staropensource/sosengine/base/logging/placeholders/logger/LogCodePart.java create mode 100644 base/src/main/java/de/staropensource/sosengine/base/logging/placeholders/logger/LogColorPrimary.java create mode 100644 base/src/main/java/de/staropensource/sosengine/base/logging/placeholders/logger/LogColorSecondary.java create mode 100644 base/src/main/java/de/staropensource/sosengine/base/logging/placeholders/logger/LogInfo.java create mode 100644 base/src/main/java/de/staropensource/sosengine/base/logging/placeholders/logger/LogLevel.java create mode 100644 base/src/main/java/de/staropensource/sosengine/base/logging/placeholders/logger/LogMessage.java create mode 100644 base/src/main/java/de/staropensource/sosengine/base/logging/placeholders/logger/LogPackage.java create mode 100644 base/src/main/java/de/staropensource/sosengine/base/logging/placeholders/logger/LogPath.java create mode 100644 base/src/main/java/de/staropensource/sosengine/base/logging/placeholders/logger/package-info.java create mode 100644 base/src/main/java/de/staropensource/sosengine/base/logging/placeholders/package-info.java create mode 100644 base/src/main/java/de/staropensource/sosengine/base/package-info.java create mode 100644 base/src/main/java/de/staropensource/sosengine/base/types/CodePart.java create mode 100644 base/src/main/java/de/staropensource/sosengine/base/types/LogIssuer.java create mode 100644 base/src/main/java/de/staropensource/sosengine/base/types/LogLevel.java create mode 100644 base/src/main/java/de/staropensource/sosengine/base/types/VersionType.java create mode 100644 base/src/main/java/de/staropensource/sosengine/base/types/package-info.java create mode 100644 base/src/main/java/de/staropensource/sosengine/base/utility/BuildInfo.java create mode 100644 base/src/main/java/de/staropensource/sosengine/base/utility/JvmInformation.java create mode 100644 base/src/main/java/de/staropensource/sosengine/base/utility/Miscellaneous.java create mode 100644 base/src/main/java/de/staropensource/sosengine/base/utility/PlaceholderEngine.java create mode 100644 base/src/main/java/de/staropensource/sosengine/base/utility/PropertyParser.java create mode 100644 base/src/main/java/de/staropensource/sosengine/base/utility/ShortcodeConverter.java create mode 100644 base/src/main/java/de/staropensource/sosengine/base/utility/StackTraceParser.java create mode 100644 base/src/main/java/de/staropensource/sosengine/base/utility/package-info.java create mode 100644 base/src/main/java/de/staropensource/sosengine/package-info.java create mode 100644 base/src/main/javadoc/overview.html create mode 120000 base/src/main/resources/gradle.properties create mode 100644 gradle.properties create mode 100644 gradle/wrapper/gradle-wrapper.jar create mode 100644 gradle/wrapper/gradle-wrapper.properties create mode 100755 gradlew create mode 100644 gradlew.bat create mode 100644 settings.gradle create mode 100644 testapp/build.gradle create mode 120000 testapp/gradle create mode 120000 testapp/gradlew create mode 120000 testapp/gradlew.bat create mode 100644 testapp/src/main/java/de/staropensource/sosengine/testapp/Main.java diff --git a/.gitignore b/.gitignore new file mode 100644 index 00000000..a160a9e3 --- /dev/null +++ b/.gitignore @@ -0,0 +1,43 @@ +### Gradle ### +.gradle +build/ +!gradle/wrapper/gradle-wrapper.jar +!**/src/main/**/build/ +!**/src/test/**/build/ + +### IntelliJ IDEA ### +.idea/modules.xml +.idea/jarRepositories.xml +.idea/compiler.xml +.idea/libraries/ +*.iws +*.iml +*.ipr +out/ +!**/src/main/**/out/ +!**/src/test/**/out/ + +### Eclipse ### +.apt_generated +.classpath +.factorypath +.project +.settings +.springBeans +.sts4-cache +bin/ +!**/src/main/**/bin/ +!**/src/test/**/bin/ + +### NetBeans ### +/nbproject/private/ +/nbbuild/ +/dist/ +/nbdist/ +/.nb-gradle/ + +### VS Code ### +.vscode/ + +### Mac OS ### +.DS_Store diff --git a/.idea/workspace.xml b/.idea/workspace.xml new file mode 100644 index 00000000..c7584f84 --- /dev/null +++ b/.idea/workspace.xml @@ -0,0 +1,105 @@ + + + + + + + + + true + true + false + false + + + + + + + + true + true + false + false + + + + + + + + true + true + false + false + + + + + + + + true + true + false + false + + + + + + + + + + + + + + + diff --git a/LICENSE b/LICENSE new file mode 100644 index 00000000..be3f7b28 --- /dev/null +++ b/LICENSE @@ -0,0 +1,661 @@ + GNU AFFERO GENERAL PUBLIC LICENSE + Version 3, 19 November 2007 + + Copyright (C) 2007 Free Software Foundation, Inc. + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The GNU Affero General Public License is a free, copyleft license for +software and other kinds of works, specifically designed to ensure +cooperation with the community in the case of network server software. + + The licenses for most software and other practical works are designed +to take away your freedom to share and change the works. By contrast, +our General Public Licenses are intended to guarantee your freedom to +share and change all versions of a program--to make sure it remains free +software for all its users. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +them if you wish), that you receive source code or can get it if you +want it, that you can change the software or use pieces of it in new +free programs, and that you know you can do these things. + + Developers that use our General Public Licenses protect your rights +with two steps: (1) assert copyright on the software, and (2) offer +you this License which gives you legal permission to copy, distribute +and/or modify the software. + + A secondary benefit of defending all users' freedom is that +improvements made in alternate versions of the program, if they +receive widespread use, become available for other developers to +incorporate. Many developers of free software are heartened and +encouraged by the resulting cooperation. However, in the case of +software used on network servers, this result may fail to come about. +The GNU General Public License permits making a modified version and +letting the public access it on a server without ever releasing its +source code to the public. + + The GNU Affero General Public License is designed specifically to +ensure that, in such cases, the modified source code becomes available +to the community. It requires the operator of a network server to +provide the source code of the modified version running there to the +users of that server. Therefore, public use of a modified version, on +a publicly accessible server, gives the public access to the source +code of the modified version. + + An older license, called the Affero General Public License and +published by Affero, was designed to accomplish similar goals. This is +a different license, not a version of the Affero GPL, but Affero has +released a new version of the Affero GPL which permits relicensing under +this license. + + The precise terms and conditions for copying, distribution and +modification follow. + + TERMS AND CONDITIONS + + 0. Definitions. + + "This License" refers to version 3 of the GNU Affero General Public License. + + "Copyright" also means copyright-like laws that apply to other kinds of +works, such as semiconductor masks. + + "The Program" refers to any copyrightable work licensed under this +License. Each licensee is addressed as "you". "Licensees" and +"recipients" may be individuals or organizations. + + To "modify" a work means to copy from or adapt all or part of the work +in a fashion requiring copyright permission, other than the making of an +exact copy. The resulting work is called a "modified version" of the +earlier work or a work "based on" the earlier work. + + A "covered work" means either the unmodified Program or a work based +on the Program. + + To "propagate" a work means to do anything with it that, without +permission, would make you directly or secondarily liable for +infringement under applicable copyright law, except executing it on a +computer or modifying a private copy. Propagation includes copying, +distribution (with or without modification), making available to the +public, and in some countries other activities as well. + + To "convey" a work means any kind of propagation that enables other +parties to make or receive copies. Mere interaction with a user through +a computer network, with no transfer of a copy, is not conveying. + + An interactive user interface displays "Appropriate Legal Notices" +to the extent that it includes a convenient and prominently visible +feature that (1) displays an appropriate copyright notice, and (2) +tells the user that there is no warranty for the work (except to the +extent that warranties are provided), that licensees may convey the +work under this License, and how to view a copy of this License. If +the interface presents a list of user commands or options, such as a +menu, a prominent item in the list meets this criterion. + + 1. Source Code. + + The "source code" for a work means the preferred form of the work +for making modifications to it. "Object code" means any non-source +form of a work. + + A "Standard Interface" means an interface that either is an official +standard defined by a recognized standards body, or, in the case of +interfaces specified for a particular programming language, one that +is widely used among developers working in that language. + + The "System Libraries" of an executable work include anything, other +than the work as a whole, that (a) is included in the normal form of +packaging a Major Component, but which is not part of that Major +Component, and (b) serves only to enable use of the work with that +Major Component, or to implement a Standard Interface for which an +implementation is available to the public in source code form. A +"Major Component", in this context, means a major essential component +(kernel, window system, and so on) of the specific operating system +(if any) on which the executable work runs, or a compiler used to +produce the work, or an object code interpreter used to run it. + + The "Corresponding Source" for a work in object code form means all +the source code needed to generate, install, and (for an executable +work) run the object code and to modify the work, including scripts to +control those activities. However, it does not include the work's +System Libraries, or general-purpose tools or generally available free +programs which are used unmodified in performing those activities but +which are not part of the work. For example, Corresponding Source +includes interface definition files associated with source files for +the work, and the source code for shared libraries and dynamically +linked subprograms that the work is specifically designed to require, +such as by intimate data communication or control flow between those +subprograms and other parts of the work. + + The Corresponding Source need not include anything that users +can regenerate automatically from other parts of the Corresponding +Source. + + The Corresponding Source for a work in source code form is that +same work. + + 2. Basic Permissions. + + All rights granted under this License are granted for the term of +copyright on the Program, and are irrevocable provided the stated +conditions are met. This License explicitly affirms your unlimited +permission to run the unmodified Program. The output from running a +covered work is covered by this License only if the output, given its +content, constitutes a covered work. This License acknowledges your +rights of fair use or other equivalent, as provided by copyright law. + + You may make, run and propagate covered works that you do not +convey, without conditions so long as your license otherwise remains +in force. You may convey covered works to others for the sole purpose +of having them make modifications exclusively for you, or provide you +with facilities for running those works, provided that you comply with +the terms of this License in conveying all material for which you do +not control copyright. Those thus making or running the covered works +for you must do so exclusively on your behalf, under your direction +and control, on terms that prohibit them from making any copies of +your copyrighted material outside their relationship with you. + + Conveying under any other circumstances is permitted solely under +the conditions stated below. Sublicensing is not allowed; section 10 +makes it unnecessary. + + 3. Protecting Users' Legal Rights From Anti-Circumvention Law. + + No covered work shall be deemed part of an effective technological +measure under any applicable law fulfilling obligations under article +11 of the WIPO copyright treaty adopted on 20 December 1996, or +similar laws prohibiting or restricting circumvention of such +measures. + + When you convey a covered work, you waive any legal power to forbid +circumvention of technological measures to the extent such circumvention +is effected by exercising rights under this License with respect to +the covered work, and you disclaim any intention to limit operation or +modification of the work as a means of enforcing, against the work's +users, your or third parties' legal rights to forbid circumvention of +technological measures. + + 4. Conveying Verbatim Copies. + + You may convey verbatim copies of the Program's source code as you +receive it, in any medium, provided that you conspicuously and +appropriately publish on each copy an appropriate copyright notice; +keep intact all notices stating that this License and any +non-permissive terms added in accord with section 7 apply to the code; +keep intact all notices of the absence of any warranty; and give all +recipients a copy of this License along with the Program. + + You may charge any price or no price for each copy that you convey, +and you may offer support or warranty protection for a fee. + + 5. Conveying Modified Source Versions. + + You may convey a work based on the Program, or the modifications to +produce it from the Program, in the form of source code under the +terms of section 4, provided that you also meet all of these conditions: + + a) The work must carry prominent notices stating that you modified + it, and giving a relevant date. + + b) The work must carry prominent notices stating that it is + released under this License and any conditions added under section + 7. This requirement modifies the requirement in section 4 to + "keep intact all notices". + + c) You must license the entire work, as a whole, under this + License to anyone who comes into possession of a copy. This + License will therefore apply, along with any applicable section 7 + additional terms, to the whole of the work, and all its parts, + regardless of how they are packaged. This License gives no + permission to license the work in any other way, but it does not + invalidate such permission if you have separately received it. + + d) If the work has interactive user interfaces, each must display + Appropriate Legal Notices; however, if the Program has interactive + interfaces that do not display Appropriate Legal Notices, your + work need not make them do so. + + A compilation of a covered work with other separate and independent +works, which are not by their nature extensions of the covered work, +and which are not combined with it such as to form a larger program, +in or on a volume of a storage or distribution medium, is called an +"aggregate" if the compilation and its resulting copyright are not +used to limit the access or legal rights of the compilation's users +beyond what the individual works permit. Inclusion of a covered work +in an aggregate does not cause this License to apply to the other +parts of the aggregate. + + 6. Conveying Non-Source Forms. + + You may convey a covered work in object code form under the terms +of sections 4 and 5, provided that you also convey the +machine-readable Corresponding Source under the terms of this License, +in one of these ways: + + a) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by the + Corresponding Source fixed on a durable physical medium + customarily used for software interchange. + + b) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by a + written offer, valid for at least three years and valid for as + long as you offer spare parts or customer support for that product + model, to give anyone who possesses the object code either (1) a + copy of the Corresponding Source for all the software in the + product that is covered by this License, on a durable physical + medium customarily used for software interchange, for a price no + more than your reasonable cost of physically performing this + conveying of source, or (2) access to copy the + Corresponding Source from a network server at no charge. + + c) Convey individual copies of the object code with a copy of the + written offer to provide the Corresponding Source. This + alternative is allowed only occasionally and noncommercially, and + only if you received the object code with such an offer, in accord + with subsection 6b. + + d) Convey the object code by offering access from a designated + place (gratis or for a charge), and offer equivalent access to the + Corresponding Source in the same way through the same place at no + further charge. You need not require recipients to copy the + Corresponding Source along with the object code. If the place to + copy the object code is a network server, the Corresponding Source + may be on a different server (operated by you or a third party) + that supports equivalent copying facilities, provided you maintain + clear directions next to the object code saying where to find the + Corresponding Source. Regardless of what server hosts the + Corresponding Source, you remain obligated to ensure that it is + available for as long as needed to satisfy these requirements. + + e) Convey the object code using peer-to-peer transmission, provided + you inform other peers where the object code and Corresponding + Source of the work are being offered to the general public at no + charge under subsection 6d. + + A separable portion of the object code, whose source code is excluded +from the Corresponding Source as a System Library, need not be +included in conveying the object code work. + + A "User Product" is either (1) a "consumer product", which means any +tangible personal property which is normally used for personal, family, +or household purposes, or (2) anything designed or sold for incorporation +into a dwelling. In determining whether a product is a consumer product, +doubtful cases shall be resolved in favor of coverage. For a particular +product received by a particular user, "normally used" refers to a +typical or common use of that class of product, regardless of the status +of the particular user or of the way in which the particular user +actually uses, or expects or is expected to use, the product. A product +is a consumer product regardless of whether the product has substantial +commercial, industrial or non-consumer uses, unless such uses represent +the only significant mode of use of the product. + + "Installation Information" for a User Product means any methods, +procedures, authorization keys, or other information required to install +and execute modified versions of a covered work in that User Product from +a modified version of its Corresponding Source. The information must +suffice to ensure that the continued functioning of the modified object +code is in no case prevented or interfered with solely because +modification has been made. + + If you convey an object code work under this section in, or with, or +specifically for use in, a User Product, and the conveying occurs as +part of a transaction in which the right of possession and use of the +User Product is transferred to the recipient in perpetuity or for a +fixed term (regardless of how the transaction is characterized), the +Corresponding Source conveyed under this section must be accompanied +by the Installation Information. But this requirement does not apply +if neither you nor any third party retains the ability to install +modified object code on the User Product (for example, the work has +been installed in ROM). + + The requirement to provide Installation Information does not include a +requirement to continue to provide support service, warranty, or updates +for a work that has been modified or installed by the recipient, or for +the User Product in which it has been modified or installed. Access to a +network may be denied when the modification itself materially and +adversely affects the operation of the network or violates the rules and +protocols for communication across the network. + + Corresponding Source conveyed, and Installation Information provided, +in accord with this section must be in a format that is publicly +documented (and with an implementation available to the public in +source code form), and must require no special password or key for +unpacking, reading or copying. + + 7. Additional Terms. + + "Additional permissions" are terms that supplement the terms of this +License by making exceptions from one or more of its conditions. +Additional permissions that are applicable to the entire Program shall +be treated as though they were included in this License, to the extent +that they are valid under applicable law. If additional permissions +apply only to part of the Program, that part may be used separately +under those permissions, but the entire Program remains governed by +this License without regard to the additional permissions. + + When you convey a copy of a covered work, you may at your option +remove any additional permissions from that copy, or from any part of +it. (Additional permissions may be written to require their own +removal in certain cases when you modify the work.) You may place +additional permissions on material, added by you to a covered work, +for which you have or can give appropriate copyright permission. + + Notwithstanding any other provision of this License, for material you +add to a covered work, you may (if authorized by the copyright holders of +that material) supplement the terms of this License with terms: + + a) Disclaiming warranty or limiting liability differently from the + terms of sections 15 and 16 of this License; or + + b) Requiring preservation of specified reasonable legal notices or + author attributions in that material or in the Appropriate Legal + Notices displayed by works containing it; or + + c) Prohibiting misrepresentation of the origin of that material, or + requiring that modified versions of such material be marked in + reasonable ways as different from the original version; or + + d) Limiting the use for publicity purposes of names of licensors or + authors of the material; or + + e) Declining to grant rights under trademark law for use of some + trade names, trademarks, or service marks; or + + f) Requiring indemnification of licensors and authors of that + material by anyone who conveys the material (or modified versions of + it) with contractual assumptions of liability to the recipient, for + any liability that these contractual assumptions directly impose on + those licensors and authors. + + All other non-permissive additional terms are considered "further +restrictions" within the meaning of section 10. If the Program as you +received it, or any part of it, contains a notice stating that it is +governed by this License along with a term that is a further +restriction, you may remove that term. If a license document contains +a further restriction but permits relicensing or conveying under this +License, you may add to a covered work material governed by the terms +of that license document, provided that the further restriction does +not survive such relicensing or conveying. + + If you add terms to a covered work in accord with this section, you +must place, in the relevant source files, a statement of the +additional terms that apply to those files, or a notice indicating +where to find the applicable terms. + + Additional terms, permissive or non-permissive, may be stated in the +form of a separately written license, or stated as exceptions; +the above requirements apply either way. + + 8. Termination. + + You may not propagate or modify a covered work except as expressly +provided under this License. Any attempt otherwise to propagate or +modify it is void, and will automatically terminate your rights under +this License (including any patent licenses granted under the third +paragraph of section 11). + + However, if you cease all violation of this License, then your +license from a particular copyright holder is reinstated (a) +provisionally, unless and until the copyright holder explicitly and +finally terminates your license, and (b) permanently, if the copyright +holder fails to notify you of the violation by some reasonable means +prior to 60 days after the cessation. + + Moreover, your license from a particular copyright holder is +reinstated permanently if the copyright holder notifies you of the +violation by some reasonable means, this is the first time you have +received notice of violation of this License (for any work) from that +copyright holder, and you cure the violation prior to 30 days after +your receipt of the notice. + + Termination of your rights under this section does not terminate the +licenses of parties who have received copies or rights from you under +this License. If your rights have been terminated and not permanently +reinstated, you do not qualify to receive new licenses for the same +material under section 10. + + 9. Acceptance Not Required for Having Copies. + + You are not required to accept this License in order to receive or +run a copy of the Program. Ancillary propagation of a covered work +occurring solely as a consequence of using peer-to-peer transmission +to receive a copy likewise does not require acceptance. However, +nothing other than this License grants you permission to propagate or +modify any covered work. These actions infringe copyright if you do +not accept this License. Therefore, by modifying or propagating a +covered work, you indicate your acceptance of this License to do so. + + 10. Automatic Licensing of Downstream Recipients. + + Each time you convey a covered work, the recipient automatically +receives a license from the original licensors, to run, modify and +propagate that work, subject to this License. You are not responsible +for enforcing compliance by third parties with this License. + + An "entity transaction" is a transaction transferring control of an +organization, or substantially all assets of one, or subdividing an +organization, or merging organizations. If propagation of a covered +work results from an entity transaction, each party to that +transaction who receives a copy of the work also receives whatever +licenses to the work the party's predecessor in interest had or could +give under the previous paragraph, plus a right to possession of the +Corresponding Source of the work from the predecessor in interest, if +the predecessor has it or can get it with reasonable efforts. + + You may not impose any further restrictions on the exercise of the +rights granted or affirmed under this License. For example, you may +not impose a license fee, royalty, or other charge for exercise of +rights granted under this License, and you may not initiate litigation +(including a cross-claim or counterclaim in a lawsuit) alleging that +any patent claim is infringed by making, using, selling, offering for +sale, or importing the Program or any portion of it. + + 11. Patents. + + A "contributor" is a copyright holder who authorizes use under this +License of the Program or a work on which the Program is based. The +work thus licensed is called the contributor's "contributor version". + + A contributor's "essential patent claims" are all patent claims +owned or controlled by the contributor, whether already acquired or +hereafter acquired, that would be infringed by some manner, permitted +by this License, of making, using, or selling its contributor version, +but do not include claims that would be infringed only as a +consequence of further modification of the contributor version. For +purposes of this definition, "control" includes the right to grant +patent sublicenses in a manner consistent with the requirements of +this License. + + Each contributor grants you a non-exclusive, worldwide, royalty-free +patent license under the contributor's essential patent claims, to +make, use, sell, offer for sale, import and otherwise run, modify and +propagate the contents of its contributor version. + + In the following three paragraphs, a "patent license" is any express +agreement or commitment, however denominated, not to enforce a patent +(such as an express permission to practice a patent or covenant not to +sue for patent infringement). To "grant" such a patent license to a +party means to make such an agreement or commitment not to enforce a +patent against the party. + + If you convey a covered work, knowingly relying on a patent license, +and the Corresponding Source of the work is not available for anyone +to copy, free of charge and under the terms of this License, through a +publicly available network server or other readily accessible means, +then you must either (1) cause the Corresponding Source to be so +available, or (2) arrange to deprive yourself of the benefit of the +patent license for this particular work, or (3) arrange, in a manner +consistent with the requirements of this License, to extend the patent +license to downstream recipients. "Knowingly relying" means you have +actual knowledge that, but for the patent license, your conveying the +covered work in a country, or your recipient's use of the covered work +in a country, would infringe one or more identifiable patents in that +country that you have reason to believe are valid. + + If, pursuant to or in connection with a single transaction or +arrangement, you convey, or propagate by procuring conveyance of, a +covered work, and grant a patent license to some of the parties +receiving the covered work authorizing them to use, propagate, modify +or convey a specific copy of the covered work, then the patent license +you grant is automatically extended to all recipients of the covered +work and works based on it. + + A patent license is "discriminatory" if it does not include within +the scope of its coverage, prohibits the exercise of, or is +conditioned on the non-exercise of one or more of the rights that are +specifically granted under this License. You may not convey a covered +work if you are a party to an arrangement with a third party that is +in the business of distributing software, under which you make payment +to the third party based on the extent of your activity of conveying +the work, and under which the third party grants, to any of the +parties who would receive the covered work from you, a discriminatory +patent license (a) in connection with copies of the covered work +conveyed by you (or copies made from those copies), or (b) primarily +for and in connection with specific products or compilations that +contain the covered work, unless you entered into that arrangement, +or that patent license was granted, prior to 28 March 2007. + + Nothing in this License shall be construed as excluding or limiting +any implied license or other defenses to infringement that may +otherwise be available to you under applicable patent law. + + 12. No Surrender of Others' Freedom. + + If conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot convey a +covered work so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you may +not convey it at all. For example, if you agree to terms that obligate you +to collect a royalty for further conveying from those to whom you convey +the Program, the only way you could satisfy both those terms and this +License would be to refrain entirely from conveying the Program. + + 13. Remote Network Interaction; Use with the GNU General Public License. + + Notwithstanding any other provision of this License, if you modify the +Program, your modified version must prominently offer all users +interacting with it remotely through a computer network (if your version +supports such interaction) an opportunity to receive the Corresponding +Source of your version by providing access to the Corresponding Source +from a network server at no charge, through some standard or customary +means of facilitating copying of software. This Corresponding Source +shall include the Corresponding Source for any work covered by version 3 +of the GNU General Public License that is incorporated pursuant to the +following paragraph. + + Notwithstanding any other provision of this License, you have +permission to link or combine any covered work with a work licensed +under version 3 of the GNU General Public License into a single +combined work, and to convey the resulting work. The terms of this +License will continue to apply to the part which is the covered work, +but the work with which it is combined will remain governed by version +3 of the GNU General Public License. + + 14. Revised Versions of this License. + + The Free Software Foundation may publish revised and/or new versions of +the GNU Affero General Public License from time to time. Such new versions +will be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + + Each version is given a distinguishing version number. If the +Program specifies that a certain numbered version of the GNU Affero General +Public License "or any later version" applies to it, you have the +option of following the terms and conditions either of that numbered +version or of any later version published by the Free Software +Foundation. If the Program does not specify a version number of the +GNU Affero General Public License, you may choose any version ever published +by the Free Software Foundation. + + If the Program specifies that a proxy can decide which future +versions of the GNU Affero General Public License can be used, that proxy's +public statement of acceptance of a version permanently authorizes you +to choose that version for the Program. + + Later license versions may give you additional or different +permissions. However, no additional obligations are imposed on any +author or copyright holder as a result of your choosing to follow a +later version. + + 15. Disclaimer of Warranty. + + THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY +APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT +HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY +OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, +THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM +IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF +ALL NECESSARY SERVICING, REPAIR OR CORRECTION. + + 16. Limitation of Liability. + + IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS +THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY +GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE +USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF +DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD +PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), +EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF +SUCH DAMAGES. + + 17. Interpretation of Sections 15 and 16. + + If the disclaimer of warranty and limitation of liability provided +above cannot be given local legal effect according to their terms, +reviewing courts shall apply local law that most closely approximates +an absolute waiver of all civil liability in connection with the +Program, unless a warranty or assumption of liability accompanies a +copy of the Program in return for a fee. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Programs + + If you develop a new program, and you want it to be of the greatest +possible use to the public, the best way to achieve this is to make it +free software which everyone can redistribute and change under these terms. + + To do so, attach the following notices to the program. It is safest +to attach them to the start of each source file to most effectively +state the exclusion of warranty; and each file should have at least +the "copyright" line and a pointer to where the full notice is found. + + + Copyright (C) + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU Affero General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU Affero General Public License for more details. + + You should have received a copy of the GNU Affero General Public License + along with this program. If not, see . + +Also add information on how to contact you by electronic and paper mail. + + If your software can interact with users remotely through a computer +network, you should also make sure that it provides a way for users to +get its source. For example, if your program is a web application, its +interface could display a "Source" link that leads users to an archive +of the code. There are many ways you could offer source, and different +solutions will be better for different programs; see section 13 for the +specific requirements. + + You should also get your employer (if you work as a programmer) or school, +if any, to sign a "copyright disclaimer" for the program, if necessary. +For more information on this, and how to apply and follow the GNU AGPL, see +. diff --git a/README.md b/README.md new file mode 100644 index 00000000..8fd4280f --- /dev/null +++ b/README.md @@ -0,0 +1,51 @@ +# StarOpenSource Engine +The StarOpenSource engine (or sos!engine for short) is a modular, extensible and easy to use Java game and application engine. + +## Index +- [About](#about) + - [About the engine](#about-the-engine) + - [About the repository](#about-the-repository) + - [Priorities](#priorities) +- [Documentation](#documentation) +- [Contributing](#contributing) + - [Requirements](#requirements) + - [What IDE to use?](#what-ide-to-use) + - [Code style](#code-style) + - [Read this before creating a pull request](#read-this-before-creating-a-pull-request) + - [Making your first contribution](#making-your-first-contribution) + +## About +### About the engine +The sos!engine is a modular and extensible framework for building applications and games, written in the Java programming language. +The engine consists of various subsystems, each separate and responsible for only one thing. The engine also houses various useful utilities and classes making development fun, while being lightweight. +### About the repository +The sos!engine repository is a monorepo, consisting of the core engine, official subsystems and their documentation. +### Priorities +- modular +- small & lightweight +- fast +- [do one thing and do it well](https://en.wikipedia.org/wiki/Unix_philosophy) (subsystems) +- have as few dependencies as possible + +## Documentation +The official documentation for the StarOpenSource Engine is not yet available and won't be until we hit v1-rc0. +You can however [visit the Javadocs](https://jd.engine.staropensource.de). + +## Contributing +### Requirements +You need the following things to be able to contribute to the StarOpenSource Engine: +- knowledge of Java +- (basic) knowledge of the engine +### What IDE to use? +We use and recommend using [IntelliJ IDEA Community Edition](https://github.com/JetBrains/intellij-community) for development because it is flexible, extendable, customizable, provides good completions and error detection. It's also open source. +### Code style +We recommend looking at existing classes. +### Read this before creating a pull request +Before creating a pull request, make sure you've +- created tests for the functionality you added, changed or removed (if applicable), +- tested your changes, +- made sure that everything works, +- is compatible with other code in the monorepo, and +- is compatible with other applications. If not, tell us in your pull request description. +### Making your first contribution +TODO (probably) until v1-rc0 diff --git a/base/build.gradle b/base/build.gradle new file mode 100644 index 00000000..6daa8bd3 --- /dev/null +++ b/base/build.gradle @@ -0,0 +1,33 @@ +plugins { + id 'java' + id "io.freefair.lombok" version "${pluginLombok}" +} + +group = project.group +version = project.versioningVersion + "-" + project.versioningType + project.versioningTyperelease + project.versioningFork + +repositories { + mavenCentral() +} + +dependencies { + // Lombok + compileOnly 'org.projectlombok:lombok:' + project.dependencyLombok + annotationProcessor 'org.projectlombok:lombok:' + project.dependencyLombok + + // JetBrains annotations + compileOnly 'org.jetbrains:annotations:' + project.dependencyJetbrainsAnnotations + + // ANSI support + implementation 'org.fusesource.jansi:jansi:' + project.dependencyJansi +} + +javadoc.options { + setMemberLevel(JavadocMemberLevel.PUBLIC) + setOverview("src/main/javadoc/overview.html") + setLocale("en_US"); + setJFlags([ + // Force Javadoc to use English translations + "-Duser.language=en_US" + ]) +} diff --git a/base/gradle b/base/gradle new file mode 120000 index 00000000..3337596a --- /dev/null +++ b/base/gradle @@ -0,0 +1 @@ +../gradle \ No newline at end of file diff --git a/base/gradlew b/base/gradlew new file mode 120000 index 00000000..502f5a2d --- /dev/null +++ b/base/gradlew @@ -0,0 +1 @@ +../gradlew \ No newline at end of file diff --git a/base/gradlew.bat b/base/gradlew.bat new file mode 120000 index 00000000..28401328 --- /dev/null +++ b/base/gradlew.bat @@ -0,0 +1 @@ +../gradlew.bat \ No newline at end of file diff --git a/base/src/main/java/de/staropensource/sosengine/base/Engine.java b/base/src/main/java/de/staropensource/sosengine/base/Engine.java new file mode 100644 index 00000000..1ea872c6 --- /dev/null +++ b/base/src/main/java/de/staropensource/sosengine/base/Engine.java @@ -0,0 +1,162 @@ +/* + STAROPENSOURCE ENGINE SOURCE FILE + Copyright (c) 2024 The StarOpenSource Engine Contributors + Licensed under the GNU Affero General Public License v3 + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU Affero General Public License as + published by the Free Software Foundation, either version 3 of the + License, or (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU Affero General Public License for more details. + + You should have received a copy of the GNU Affero General Public License + along with this program. If not, see . + */ + +package de.staropensource.sosengine.base; + +import de.staropensource.sosengine.base.logging.CrashHandler; +import de.staropensource.sosengine.base.logging.LoggerInstance; +import de.staropensource.sosengine.base.types.CodePart; +import de.staropensource.sosengine.base.types.LogIssuer; +import de.staropensource.sosengine.base.utility.*; +import lombok.Getter; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +import java.util.LinkedHashMap; +import java.util.Map; + +/** + * sos!engine management object.
+ * It is responsible for the base engine initialization. + * + * @see EngineConfiguration + * @since 1-alpha0 + */ +@SuppressWarnings({ "unused", "JavadocDeclaration", "JavadocBlankLines" }) +public class Engine { + /** + * Instance. + * + * @since 1-alpha0 + * + * -- GETTER -- + * Returns the {@link Engine} instance. + * + * @return {@link Engine} instance unless uninitialized + * @since 1-alpha0 + */ + @Nullable + @Getter + private static Engine instance = null; + + /** + * Logger instance. + * + * @see LoggerInstance + * @since 1-alpha0 + */ + @NotNull + private final LoggerInstance logger; + + /** + * Constructor, initializes the StarOpenSource Engine. + * + * @since 1-alpha0 + */ + public Engine() { + // Check if sos!engine is already loaded + if (instance == null) + instance = this; + else { + instance.logger.crash("sos!engine tried to initialize twice"); + //noinspection DataFlowIssue + logger = null; + return; + } + + // Startup time measurement + long initTime = System.currentTimeMillis(); + + // Initialize EngineConfiguration and load it + new EngineConfiguration(); + EngineConfiguration.getInstance().loadConfiguration(); + + // Initialize classes + // Sorted in rough order of dependence + new BuildInfo(); + new PlaceholderEngine(); + new ShortcodeConverter(); + + // Populate crash content + populateCrashContent(); + + // Initialize variables + logger = new LoggerInstance(new LogIssuer(getClass(), CodePart.ENGINE)); + + // Startup time measurement + initTime = System.currentTimeMillis() - initTime; + + // Print finish message + logger.info("Initialized sos!engine v%engine_version% in " + initTime + "ms"); + } + + /** + * This method populates the Crash Handler's content with the default set of content. + * + * @see CrashHandler#getCrashContent() + * @since 1-alpha0 + */ + @SuppressWarnings("ExtractMethodRecommender") + private void populateCrashContent() { + // Issuer + Map crashContentIssuer = new LinkedHashMap<>(); + crashContentIssuer.put("Code part", "%issuer_code_part%"); + crashContentIssuer.put("Classpath", "%issuer_path%"); + crashContentIssuer.put("Additional information", "%issuer_info%"); + crashContentIssuer.put("Message", "%issuer_message%"); + + // Engine -> Dependencies + Map crashContentEngineDependencies = new LinkedHashMap<>(); + crashContentEngineDependencies.put("Lombok", "%engine_dependency_lombok%"); + crashContentEngineDependencies.put("Jetbrains Annotations", "%engine_dependency_jetbrains_annotations%"); + crashContentEngineDependencies.put("Jansi", "%engine_dependency_jansi%"); + // Engine -> Plugins + Map crashContentEnginePlugins = new LinkedHashMap<>(); + crashContentEnginePlugins.put("Shadow", "%engine_plugin_shadow%"); + crashContentEnginePlugins.put("Lombok", "%engine_plugin_lombok%"); + // Engine -> * + Map crashContentEngine = new LinkedHashMap<>(); + crashContentEngine.put("Version", "%engine_version%"); + crashContentEngine.put("Dependencies", crashContentEngineDependencies); + crashContentEngine.put("Plugins", crashContentEnginePlugins); + + // JVM -> Implementation + Map crashContentJvmImplementation = new LinkedHashMap<>(); + crashContentJvmImplementation.put("Name", "%jvm_implementation_name%"); + crashContentJvmImplementation.put("Version", "%jvm_implementation_version%"); + crashContentJvmImplementation.put("Vendor", "%jvm_implementation_vendor%"); + // JVM -> * + Map crashContentJvm = new LinkedHashMap<>(); + crashContentJvm.put("Java Version", "%jvm_java%"); + crashContentJvm.put("Implementation", crashContentJvmImplementation); + crashContentJvm.put("Arguments", "%jvm_arguments%"); + + // Operating system + Map crashContentOS = new LinkedHashMap<>(); + crashContentOS.put("Time", "%time_hour%:%time_minute%:%time_second% (%time_zone%, UNIX Epoch: %time_epoch%)"); + crashContentOS.put("Date", "%date_day%.%date_month%.%date_year%"); + + // Add to crash handler + CrashHandler.getCrashContent().put("Issuer", crashContentIssuer); + CrashHandler.getCrashContent().put("Engine", crashContentEngine); + CrashHandler.getCrashContent().put("Java Virtual Machine", crashContentJvm); + CrashHandler.getCrashContent().put("Operating system", crashContentOS); + CrashHandler.getCrashContent().put("Stacktrace", "%stacktrace%"); + } +} diff --git a/base/src/main/java/de/staropensource/sosengine/base/EngineConfiguration.java b/base/src/main/java/de/staropensource/sosengine/base/EngineConfiguration.java new file mode 100644 index 00000000..37c4a66c --- /dev/null +++ b/base/src/main/java/de/staropensource/sosengine/base/EngineConfiguration.java @@ -0,0 +1,268 @@ +/* + STAROPENSOURCE ENGINE SOURCE FILE + Copyright (c) 2024 The StarOpenSource Engine Contributors + Licensed under the GNU Affero General Public License v3 + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU Affero General Public License as + published by the Free Software Foundation, either version 3 of the + License, or (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU Affero General Public License for more details. + + You should have received a copy of the GNU Affero General Public License + along with this program. If not, see . + */ + +package de.staropensource.sosengine.base; + +import de.staropensource.sosengine.base.logging.Logger; +import de.staropensource.sosengine.base.types.CodePart; +import de.staropensource.sosengine.base.types.LogIssuer; +import de.staropensource.sosengine.base.types.LogLevel; +import de.staropensource.sosengine.base.utility.PropertyParser; +import lombok.Getter; + +import java.util.Properties; + +/** + * Provides the engine configuration for all classes in a centralized place. + * + * @since 1-alpha0 + */ +@SuppressWarnings({ "unused", "JavadocDeclaration", "JavadocBlankLines" }) +@Getter +public class EngineConfiguration { + /** + * Instance. + * + * @since 1-alpha0 + * + * -- GETTER -- + * Returns the {@link EngineConfiguration} instance. + * + * @return {@link EngineConfiguration} instance + * @since 1-alpha0 + */ + @Getter + private static EngineConfiguration instance; + + /** + * Defines the group every property must start with to be recognized as an engine configuration setting. + * + * @since 1-alpha0 + * + * -- GETTER -- + * Returns the group every property must start with to be recognized as an engine configuration setting. + * + * @return the property group + * @since 1-alpha0 + */ + @Getter + private static final String group = "sosengine.base."; + + /** + * If enabled, allows for unintentional behaviour and excess logging.
+ * Unless you want to debug or work on a sensitive part of the engine, don't enable this! + * + * @since 1-alpha0 + * + * -- GETTER -- + * Gets the value for {@code debug}. + * + * @return variable value + * @see EngineConfiguration#debug + * @since 1-alpha0 + */ + private boolean debug; + + /** + * If enabled, very verbose messages about the {@link de.staropensource.sosengine.base.utility.ShortcodeConverter}'s internals will be printed.
+ * Don't enable unless you have knowledge about the {@link de.staropensource.sosengine.base.utility.ShortcodeConverter} and want to work on it. + * + * @see de.staropensource.sosengine.base.utility.ShortcodeConverter + * @since 1-alpha0 + * + * -- GETTER -- + * Gets the value for {@code debugShortcodeConverter}. + * + * @return variable value + * @see EngineConfiguration#debugShortcodeConverter + * @since 1-alpha0 + */ + private boolean debugShortcodeConverter; + + /** + * If enabled, invalid shortcodes will be logged in {@link de.staropensource.sosengine.base.utility.ShortcodeConverter}. + * The message will be printed as a silent warning. + * + * @see de.staropensource.sosengine.base.utility.ShortcodeConverter + * @since 1-alpha0 + * + * -- GETTER -- + * Gets the value for {@code errorShortcodeConverter}. + * + * @return variable value + * @see EngineConfiguration#errorShortcodeConverter + * @since 1-alpha0 + */ + private boolean errorShortcodeConverter; + + /** + * Determines which logger levels are allowed. + * + * @see Logger + * @since 1-alpha0 + * + * -- GETTER -- + * Gets the value for {@code loggerLevel}. + * + * @return variable value + * @see EngineConfiguration#loggerLevel + * @since 1-alpha0 + */ + private LogLevel loggerLevel; + + /** + * Contains the logging template. + * + * @see Logger + * @see de.staropensource.sosengine.base.data.placeholders Global placeholder list + * @see de.staropensource.sosengine.base.logging.placeholders.logger Logger placeholder list + * @since 1-alpha0 + * + * -- GETTER -- + * Gets the value for {@code loggerTemplate} + * + * @return variable value + * @see EngineConfiguration#loggerTemplate + * @since 1-alpha0 + */ + private String loggerTemplate; + + /** + * If enabled, the JVM will immediately shutdown. This will prevent shutdown hooks from executing.
+ * Note: This will also prevent Jansi from removing temporary native libraries at shutdown. + * + * @see de.staropensource.sosengine.base.logging.CrashHandler + * @since 1-alpha0 + * + * -- GETTER -- + * Gets the value for {@code loggerImmediateShutdown}. + * + * @return variable value + * @see EngineConfiguration#loggerImmediateShutdown + * @since 1-alpha0 + */ + private boolean loggerImmediateShutdown; + + /** + * If enabled, will force the {@link Logger} and {@link de.staropensource.sosengine.base.logging.CrashHandler} to use the standard output. + * + * @since 1-alpha0 + * + * -- GETTER -- + * Gets the value for {@code loggerForceStandardOutput}. + * + * @return variable value + * @see EngineConfiguration#loggerForceStandardOutput + * @since 1-alpha0 + */ + private boolean loggerForceStandardOutput; + + /** + * Constructor. + * + * @see Engine + * @since 1-alpha0 + */ + public EngineConfiguration() { + // Only allow one instance + if (instance == null) + instance = this; + else + Logger.crash(new LogIssuer(getClass(), CodePart.ENGINE), "Tried reinitializing " + getClass().getName() + " twice"); + + loadDefaultConfiguration(); + } + + /** + * Loads the engine configuration from the specified {@link java.util.Properties}.
+ * Unless you want to allow configuration overriding, resetting the configuration using {@code loadDefaultConfiguration()} is advised. + * + * @param properties the {@link Properties} object + * @see EngineConfiguration#loadDefaultConfiguration() + * @since 1-alpha0 + */ + public void loadConfiguration(Properties properties) { + // Define variables + PropertyParser parser = new PropertyParser(properties); + + for (String property : properties.stringPropertyNames()) { + // Check if property name starts with "de.staropensource.sosengine.base." + if (!property.startsWith(group)) continue; + + // Skip to important stuff + property = property.substring(group.length()); + + // Match settings + try { + switch (property) { + case "debug" -> debug = parser.getBoolean(group + property); + case "debugShortcodeConverter" -> debugShortcodeConverter = parser.getBoolean(group + property); + + case "errorShortcodeConverter" -> errorShortcodeConverter = parser.getBoolean(group + property); + + case "loggerLevel" -> { + try { + loggerLevel = LogLevel.valueOf(parser.getString(group + property).toUpperCase()); + } catch (IllegalArgumentException ignored) { + System.out.println("Logger level " + parser.getString(group + property) + " is not valid"); + } + } + case "loggerTemplate" -> loggerTemplate = parser.getString(group + property); + case "loggerImmediateShutdown" -> loggerImmediateShutdown = parser.getBoolean(group + property); + case "loggerForceStandardOutput" -> loggerForceStandardOutput = parser.getBoolean(group + property); + } + } catch (NullPointerException ignored) {} + } + + // Disable all debug options if 'debug' is disabled + if (!debug) { + debugShortcodeConverter = false; + } + } + + /** + * Loads the engine configuration from the system properties. + * + * @see EngineConfiguration#loadConfiguration(Properties) + * @see System#getProperties() + * @since 1-alpha0 + */ + public void loadConfiguration() { + loadConfiguration(System.getProperties()); + } + + /** + * Loads the default engine configuration. + * + * @see EngineConfiguration#loadConfiguration() + * @see EngineConfiguration#loadConfiguration(Properties) + * @since 1-alpha0 + */ + public void loadDefaultConfiguration() { + debug = false; + debugShortcodeConverter = false; + + errorShortcodeConverter = true; + + loggerLevel = LogLevel.INFORMATIONAL; + loggerTemplate = "%log_color_primary%[%time_hour%:%time_minute%:%time_second%] [%log_level% %log_path%%log_info%] %log_color_secondary%%log_message%"; + loggerImmediateShutdown = false; + loggerForceStandardOutput = false; + } +} diff --git a/base/src/main/java/de/staropensource/sosengine/base/classes/LoggerImpl.java b/base/src/main/java/de/staropensource/sosengine/base/classes/LoggerImpl.java new file mode 100644 index 00000000..f89543ce --- /dev/null +++ b/base/src/main/java/de/staropensource/sosengine/base/classes/LoggerImpl.java @@ -0,0 +1,65 @@ +/* + STAROPENSOURCE ENGINE SOURCE FILE + Copyright (c) 2024 The StarOpenSource Engine Contributors + Licensed under the GNU Affero General Public License v3 + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU Affero General Public License as + published by the Free Software Foundation, either version 3 of the + License, or (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU Affero General Public License for more details. + + You should have received a copy of the GNU Affero General Public License + along with this program. If not, see . + */ + +package de.staropensource.sosengine.base.classes; + +import de.staropensource.sosengine.base.types.LogIssuer; +import de.staropensource.sosengine.base.types.LogLevel; +import org.jetbrains.annotations.NotNull; + +/** + * Interface for implementing custom logger implementations, called by {@link de.staropensource.sosengine.base.logging.Logger}. + * + * @see de.staropensource.sosengine.base.logging.Logger + * @since 1-alpha0 + */ +@SuppressWarnings({ "unused" }) +public interface LoggerImpl { + /** + * Run before placeholders are replaced. + * + * @param level log level + * @param logIssuer log issuer + * @param message log message + * @return new log message + * @since 1-alpha0 + */ + String prePlaceholder(@NotNull LogLevel level, @NotNull LogIssuer logIssuer, @NotNull String message); + + /** + * Run after placeholders are replaced. + * + * @param level log level + * @param logIssuer log issuer + * @param message log message + * @return new log message + * @since 1-alpha0 + */ + String postPlaceholder(@NotNull LogLevel level, @NotNull LogIssuer logIssuer, @NotNull String message); + + /** + * Responsible for printing the finalized log message. + * + * @param level log level + * @param logIssuer log issuer + * @param message finalized log message + * @since 1-alpha0 + */ + void print(@NotNull LogLevel level, @NotNull LogIssuer logIssuer, @NotNull String message); +} diff --git a/base/src/main/java/de/staropensource/sosengine/base/classes/Placeholder.java b/base/src/main/java/de/staropensource/sosengine/base/classes/Placeholder.java new file mode 100644 index 00000000..bbf2cf3c --- /dev/null +++ b/base/src/main/java/de/staropensource/sosengine/base/classes/Placeholder.java @@ -0,0 +1,51 @@ +/* + STAROPENSOURCE ENGINE SOURCE FILE + Copyright (c) 2024 The StarOpenSource Engine Contributors + Licensed under the GNU Affero General Public License v3 + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU Affero General Public License as + published by the Free Software Foundation, either version 3 of the + License, or (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU Affero General Public License for more details. + + You should have received a copy of the GNU Affero General Public License + along with this program. If not, see . + */ + +package de.staropensource.sosengine.base.classes; + +import de.staropensource.sosengine.base.utility.PlaceholderEngine; +import org.jetbrains.annotations.NotNull; + +/** + * Interface for implementing placeholders. + * + * @see PlaceholderEngine + * @since 1-alpha0 + */ +@SuppressWarnings({ "unused" }) +public interface Placeholder { + /** + * Returns the placeholder's name. + * + * @return the placeholder name + * @since 1-alpha0 + */ + @NotNull + String getName(); + + /** + * Replaces the placeholder with it's appropriate content. + * + * @param text the text to process + * @return the processed text + * @since 1-alpha0 + */ + @NotNull + String replace(@NotNull String text); +} diff --git a/base/src/main/java/de/staropensource/sosengine/base/classes/package-info.java b/base/src/main/java/de/staropensource/sosengine/base/classes/package-info.java new file mode 100644 index 00000000..672191c7 --- /dev/null +++ b/base/src/main/java/de/staropensource/sosengine/base/classes/package-info.java @@ -0,0 +1,25 @@ +/* + STAROPENSOURCE ENGINE SOURCE FILE + Copyright (c) 2024 The StarOpenSource Engine Contributors + Licensed under the GNU Affero General Public License v3 + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU Affero General Public License as + published by the Free Software Foundation, either version 3 of the + License, or (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU Affero General Public License for more details. + + You should have received a copy of the GNU Affero General Public License + along with this program. If not, see . + */ + +/** + * Contains various interfaces. + * + * @since 1-alpha0 + */ +package de.staropensource.sosengine.base.classes; diff --git a/base/src/main/java/de/staropensource/sosengine/base/data/package-info.java b/base/src/main/java/de/staropensource/sosengine/base/data/package-info.java new file mode 100644 index 00000000..5f85d23f --- /dev/null +++ b/base/src/main/java/de/staropensource/sosengine/base/data/package-info.java @@ -0,0 +1,25 @@ +/* + STAROPENSOURCE ENGINE SOURCE FILE + Copyright (c) 2024 The StarOpenSource Engine Contributors + Licensed under the GNU Affero General Public License v3 + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU Affero General Public License as + published by the Free Software Foundation, either version 3 of the + License, or (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU Affero General Public License for more details. + + You should have received a copy of the GNU Affero General Public License + along with this program. If not, see . + */ + +/** + * Contains various packages with tiny classes that provide or process information. + * + * @since 1-alpha0 + */ +package de.staropensource.sosengine.base.data; diff --git a/base/src/main/java/de/staropensource/sosengine/base/data/placeholders/DateDay.java b/base/src/main/java/de/staropensource/sosengine/base/data/placeholders/DateDay.java new file mode 100644 index 00000000..5200f083 --- /dev/null +++ b/base/src/main/java/de/staropensource/sosengine/base/data/placeholders/DateDay.java @@ -0,0 +1,55 @@ +/* + STAROPENSOURCE ENGINE SOURCE FILE + Copyright (c) 2024 The StarOpenSource Engine Contributors + Licensed under the GNU Affero General Public License v3 + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU Affero General Public License as + published by the Free Software Foundation, either version 3 of the + License, or (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU Affero General Public License for more details. + + You should have received a copy of the GNU Affero General Public License + along with this program. If not, see . + */ + +package de.staropensource.sosengine.base.data.placeholders; + +import de.staropensource.sosengine.base.classes.Placeholder; +import de.staropensource.sosengine.base.utility.Miscellaneous; +import org.jetbrains.annotations.NotNull; + +import java.util.Calendar; + +/** + * Implements the {@code date_day} placeholder. + * + * @see Placeholder + * @since 1-alpha0 + */ +@SuppressWarnings({ "unused" }) +public class DateDay implements Placeholder { + /** + * Constructor. + * + * @since 1-alpha0 + */ + public DateDay() {} + + /** {@inheritDoc} */ + @NotNull + public String getName() { + return "date_day"; + } + + /** {@inheritDoc} */ + @NotNull + @Override + public String replace(@NotNull String text) { + return text.replace("%" + getName() + "%", Miscellaneous.padNumbers(Calendar.getInstance().get(Calendar.DAY_OF_MONTH), 2)); + } +} diff --git a/base/src/main/java/de/staropensource/sosengine/base/data/placeholders/DateMonth.java b/base/src/main/java/de/staropensource/sosengine/base/data/placeholders/DateMonth.java new file mode 100644 index 00000000..01a2228b --- /dev/null +++ b/base/src/main/java/de/staropensource/sosengine/base/data/placeholders/DateMonth.java @@ -0,0 +1,55 @@ +/* + STAROPENSOURCE ENGINE SOURCE FILE + Copyright (c) 2024 The StarOpenSource Engine Contributors + Licensed under the GNU Affero General Public License v3 + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU Affero General Public License as + published by the Free Software Foundation, either version 3 of the + License, or (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU Affero General Public License for more details. + + You should have received a copy of the GNU Affero General Public License + along with this program. If not, see . + */ + +package de.staropensource.sosengine.base.data.placeholders; + +import de.staropensource.sosengine.base.classes.Placeholder; +import de.staropensource.sosengine.base.utility.Miscellaneous; +import org.jetbrains.annotations.NotNull; + +import java.util.Calendar; + +/** + * Implements the {@code date_month} placeholder. + * + * @see Placeholder + * @since 1-alpha0 + */ +@SuppressWarnings({ "unused" }) +public class DateMonth implements Placeholder { + /** + * Constructor. + * + * @since 1-alpha0 + */ + public DateMonth() {} + + /** {@inheritDoc} */ + @NotNull + public String getName() { + return "date_month"; + } + + /** {@inheritDoc} */ + @NotNull + @Override + public String replace(@NotNull String text) { + return text.replace("%" + getName() + "%", Miscellaneous.padNumbers(Calendar.getInstance().get(Calendar.MONTH), 2)); + } +} diff --git a/base/src/main/java/de/staropensource/sosengine/base/data/placeholders/DateYear.java b/base/src/main/java/de/staropensource/sosengine/base/data/placeholders/DateYear.java new file mode 100644 index 00000000..1b069478 --- /dev/null +++ b/base/src/main/java/de/staropensource/sosengine/base/data/placeholders/DateYear.java @@ -0,0 +1,55 @@ +/* + STAROPENSOURCE ENGINE SOURCE FILE + Copyright (c) 2024 The StarOpenSource Engine Contributors + Licensed under the GNU Affero General Public License v3 + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU Affero General Public License as + published by the Free Software Foundation, either version 3 of the + License, or (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU Affero General Public License for more details. + + You should have received a copy of the GNU Affero General Public License + along with this program. If not, see . + */ + +package de.staropensource.sosengine.base.data.placeholders; + +import de.staropensource.sosengine.base.classes.Placeholder; +import de.staropensource.sosengine.base.utility.Miscellaneous; +import org.jetbrains.annotations.NotNull; + +import java.util.Calendar; + +/** + * Implements the {@code date_year} placeholder. + * + * @see Placeholder + * @since 1-alpha0 + */ +@SuppressWarnings({ "unused" }) +public class DateYear implements Placeholder { + /** + * Constructor. + * + * @since 1-alpha0 + */ + public DateYear() {} + + /** {@inheritDoc} */ + @NotNull + public String getName() { + return "date_year"; + } + + /** {@inheritDoc} */ + @NotNull + @Override + public String replace(@NotNull String text) { + return text.replace("%" + getName() + "%", Miscellaneous.padNumbers(Calendar.getInstance().get(Calendar.YEAR), 4)); + } +} diff --git a/base/src/main/java/de/staropensource/sosengine/base/data/placeholders/EngineDependencyJansi.java b/base/src/main/java/de/staropensource/sosengine/base/data/placeholders/EngineDependencyJansi.java new file mode 100644 index 00000000..5d93c3d1 --- /dev/null +++ b/base/src/main/java/de/staropensource/sosengine/base/data/placeholders/EngineDependencyJansi.java @@ -0,0 +1,53 @@ +/* + STAROPENSOURCE ENGINE SOURCE FILE + Copyright (c) 2024 The StarOpenSource Engine Contributors + Licensed under the GNU Affero General Public License v3 + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU Affero General Public License as + published by the Free Software Foundation, either version 3 of the + License, or (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU Affero General Public License for more details. + + You should have received a copy of the GNU Affero General Public License + along with this program. If not, see . + */ + +package de.staropensource.sosengine.base.data.placeholders; + +import de.staropensource.sosengine.base.classes.Placeholder; +import de.staropensource.sosengine.base.utility.BuildInfo; +import org.jetbrains.annotations.NotNull; + +/** + * Implements the {@code engine_dependency_jansi} placeholder. + * + * @see Placeholder + * @since 1-alpha0 + */ +@SuppressWarnings({ "unused" }) +public class EngineDependencyJansi implements Placeholder { + /** + * Constructor. + * + * @since 1-alpha0 + */ + public EngineDependencyJansi() {} + + /** {@inheritDoc} */ + @NotNull + public String getName() { + return "engine_dependency_jansi"; + } + + /** {@inheritDoc} */ + @NotNull + @Override + public String replace(@NotNull String text) { + return text.replace("%" + getName() + "%", BuildInfo.getInstance().getDependencyJansi()); + } +} diff --git a/base/src/main/java/de/staropensource/sosengine/base/data/placeholders/EngineDependencyJetbrainsAnnotations.java b/base/src/main/java/de/staropensource/sosengine/base/data/placeholders/EngineDependencyJetbrainsAnnotations.java new file mode 100644 index 00000000..c40ac1c8 --- /dev/null +++ b/base/src/main/java/de/staropensource/sosengine/base/data/placeholders/EngineDependencyJetbrainsAnnotations.java @@ -0,0 +1,53 @@ +/* + STAROPENSOURCE ENGINE SOURCE FILE + Copyright (c) 2024 The StarOpenSource Engine Contributors + Licensed under the GNU Affero General Public License v3 + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU Affero General Public License as + published by the Free Software Foundation, either version 3 of the + License, or (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU Affero General Public License for more details. + + You should have received a copy of the GNU Affero General Public License + along with this program. If not, see . + */ + +package de.staropensource.sosengine.base.data.placeholders; + +import de.staropensource.sosengine.base.classes.Placeholder; +import de.staropensource.sosengine.base.utility.BuildInfo; +import org.jetbrains.annotations.NotNull; + +/** + * Implements the {@code engine_dependency_jetbrains_annotations} placeholder. + * + * @since 1-alpha0 + * @see Placeholder + */ +@SuppressWarnings({ "unused" }) +public class EngineDependencyJetbrainsAnnotations implements Placeholder { + /** + * Constructor. + * + * @since 1-alpha0 + */ + public EngineDependencyJetbrainsAnnotations() {} + + /** {@inheritDoc} */ + @NotNull + public String getName() { + return "engine_dependency_jetbrains_annotations"; + } + + /** {@inheritDoc} */ + @NotNull + @Override + public String replace(@NotNull String text) { + return text.replace("%" + getName() + "%", BuildInfo.getInstance().getDependencyJetbrainsAnnotations()); + } +} diff --git a/base/src/main/java/de/staropensource/sosengine/base/data/placeholders/EngineDependencyLombok.java b/base/src/main/java/de/staropensource/sosengine/base/data/placeholders/EngineDependencyLombok.java new file mode 100644 index 00000000..c866906b --- /dev/null +++ b/base/src/main/java/de/staropensource/sosengine/base/data/placeholders/EngineDependencyLombok.java @@ -0,0 +1,53 @@ +/* + STAROPENSOURCE ENGINE SOURCE FILE + Copyright (c) 2024 The StarOpenSource Engine Contributors + Licensed under the GNU Affero General Public License v3 + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU Affero General Public License as + published by the Free Software Foundation, either version 3 of the + License, or (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU Affero General Public License for more details. + + You should have received a copy of the GNU Affero General Public License + along with this program. If not, see . + */ + +package de.staropensource.sosengine.base.data.placeholders; + +import de.staropensource.sosengine.base.classes.Placeholder; +import de.staropensource.sosengine.base.utility.BuildInfo; +import org.jetbrains.annotations.NotNull; + +/** + * Implements the {@code engine_dependency_lombok} placeholder. + * + * @see Placeholder + * @since 1-alpha0 + */ +@SuppressWarnings({ "unused" }) +public class EngineDependencyLombok implements Placeholder { + /** + * Constructor. + * + * @since 1-alpha0 + */ + public EngineDependencyLombok() {} + + /** {@inheritDoc} */ + @NotNull + public String getName() { + return "engine_dependency_lombok"; + } + + /** {@inheritDoc} */ + @NotNull + @Override + public String replace(@NotNull String text) { + return text.replace("%" + getName() + "%", BuildInfo.getInstance().getDependencyLombok()); + } +} diff --git a/base/src/main/java/de/staropensource/sosengine/base/data/placeholders/EnginePluginLombok.java b/base/src/main/java/de/staropensource/sosengine/base/data/placeholders/EnginePluginLombok.java new file mode 100644 index 00000000..e856dfa5 --- /dev/null +++ b/base/src/main/java/de/staropensource/sosengine/base/data/placeholders/EnginePluginLombok.java @@ -0,0 +1,53 @@ +/* + STAROPENSOURCE ENGINE SOURCE FILE + Copyright (c) 2024 The StarOpenSource Engine Contributors + Licensed under the GNU Affero General Public License v3 + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU Affero General Public License as + published by the Free Software Foundation, either version 3 of the + License, or (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU Affero General Public License for more details. + + You should have received a copy of the GNU Affero General Public License + along with this program. If not, see . + */ + +package de.staropensource.sosengine.base.data.placeholders; + +import de.staropensource.sosengine.base.classes.Placeholder; +import de.staropensource.sosengine.base.utility.BuildInfo; +import org.jetbrains.annotations.NotNull; + +/** + * Implements the {@code engine_plugin_lombok} placeholder. + * + * @see Placeholder + * @since 1-alpha0 + */ +@SuppressWarnings({ "unused" }) +public class EnginePluginLombok implements Placeholder { + /** + * Constructor. + * + * @since 1-alpha0 + */ + public EnginePluginLombok() {} + + /** {@inheritDoc} */ + @NotNull + public String getName() { + return "engine_plugin_lombok"; + } + + /** {@inheritDoc} */ + @NotNull + @Override + public String replace(@NotNull String text) { + return text.replace("%" + getName() + "%", BuildInfo.getInstance().getPluginLombok()); + } +} diff --git a/base/src/main/java/de/staropensource/sosengine/base/data/placeholders/EnginePluginShadow.java b/base/src/main/java/de/staropensource/sosengine/base/data/placeholders/EnginePluginShadow.java new file mode 100644 index 00000000..707f3eb2 --- /dev/null +++ b/base/src/main/java/de/staropensource/sosengine/base/data/placeholders/EnginePluginShadow.java @@ -0,0 +1,53 @@ +/* + STAROPENSOURCE ENGINE SOURCE FILE + Copyright (c) 2024 The StarOpenSource Engine Contributors + Licensed under the GNU Affero General Public License v3 + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU Affero General Public License as + published by the Free Software Foundation, either version 3 of the + License, or (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU Affero General Public License for more details. + + You should have received a copy of the GNU Affero General Public License + along with this program. If not, see . + */ + +package de.staropensource.sosengine.base.data.placeholders; + +import de.staropensource.sosengine.base.classes.Placeholder; +import de.staropensource.sosengine.base.utility.BuildInfo; +import org.jetbrains.annotations.NotNull; + +/** + * Implements the {@code engine_plugin_shadow} placeholder. + * + * @see Placeholder + * @since 1-alpha0 + */ +@SuppressWarnings({ "unused" }) +public class EnginePluginShadow implements Placeholder { + /** + * Constructor. + * + * @since 1-alpha0 + */ + public EnginePluginShadow() {} + + /** {@inheritDoc} */ + @NotNull + public String getName() { + return "engine_plugin_shadow"; + } + + /** {@inheritDoc} */ + @NotNull + @Override + public String replace(@NotNull String text) { + return text.replace("%" + getName() + "%", BuildInfo.getInstance().getPluginShadow()); + } +} diff --git a/base/src/main/java/de/staropensource/sosengine/base/data/placeholders/EngineVersion.java b/base/src/main/java/de/staropensource/sosengine/base/data/placeholders/EngineVersion.java new file mode 100644 index 00000000..68c691c4 --- /dev/null +++ b/base/src/main/java/de/staropensource/sosengine/base/data/placeholders/EngineVersion.java @@ -0,0 +1,52 @@ +/* + STAROPENSOURCE ENGINE SOURCE FILE + Copyright (c) 2024 The StarOpenSource Engine Contributors + Licensed under the GNU Affero General Public License v3 + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU Affero General Public License as + published by the Free Software Foundation, either version 3 of the + License, or (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU Affero General Public License for more details. + + You should have received a copy of the GNU Affero General Public License + along with this program. If not, see . + */ + +package de.staropensource.sosengine.base.data.placeholders; + +import de.staropensource.sosengine.base.classes.Placeholder; +import org.jetbrains.annotations.NotNull; + +/** + * Implements the {@code engine_version} placeholder. + * + * @see Placeholder + * @since 1-alpha0 + */ +@SuppressWarnings({ "unused" }) +public class EngineVersion implements Placeholder { + /** + * Constructor. + * + * @since 1-alpha0 + */ + public EngineVersion() {} + + /** {@inheritDoc} */ + @NotNull + public String getName() { + return "engine_version"; + } + + /** {@inheritDoc} */ + @NotNull + @Override + public String replace(@NotNull String text) { + return text.replace("%" + getName() + "%", "%engine_version_version%-%engine_version_type%%engine_version_typerelease%%engine_version_fork%"); + } +} diff --git a/base/src/main/java/de/staropensource/sosengine/base/data/placeholders/EngineVersionFork.java b/base/src/main/java/de/staropensource/sosengine/base/data/placeholders/EngineVersionFork.java new file mode 100644 index 00000000..059d1e08 --- /dev/null +++ b/base/src/main/java/de/staropensource/sosengine/base/data/placeholders/EngineVersionFork.java @@ -0,0 +1,53 @@ +/* + STAROPENSOURCE ENGINE SOURCE FILE + Copyright (c) 2024 The StarOpenSource Engine Contributors + Licensed under the GNU Affero General Public License v3 + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU Affero General Public License as + published by the Free Software Foundation, either version 3 of the + License, or (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU Affero General Public License for more details. + + You should have received a copy of the GNU Affero General Public License + along with this program. If not, see . + */ + +package de.staropensource.sosengine.base.data.placeholders; + +import de.staropensource.sosengine.base.classes.Placeholder; +import de.staropensource.sosengine.base.utility.BuildInfo; +import org.jetbrains.annotations.NotNull; + +/** + * Implements the {@code engine_version_fork} placeholder. + * + * @see Placeholder + * @since 1-alpha0 + */ +@SuppressWarnings({ "unused" }) +public class EngineVersionFork implements Placeholder { + /** + * Constructor. + * + * @since 1-alpha0 + */ + public EngineVersionFork() {} + + /** {@inheritDoc} */ + @NotNull + public String getName() { + return "engine_version_fork"; + } + + /** {@inheritDoc} */ + @NotNull + @Override + public String replace(@NotNull String text) { + return text.replace("%" + getName() + "%", BuildInfo.getInstance().getVersioningFork()); + } +} diff --git a/base/src/main/java/de/staropensource/sosengine/base/data/placeholders/EngineVersionType.java b/base/src/main/java/de/staropensource/sosengine/base/data/placeholders/EngineVersionType.java new file mode 100644 index 00000000..3be15967 --- /dev/null +++ b/base/src/main/java/de/staropensource/sosengine/base/data/placeholders/EngineVersionType.java @@ -0,0 +1,53 @@ +/* + STAROPENSOURCE ENGINE SOURCE FILE + Copyright (c) 2024 The StarOpenSource Engine Contributors + Licensed under the GNU Affero General Public License v3 + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU Affero General Public License as + published by the Free Software Foundation, either version 3 of the + License, or (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU Affero General Public License for more details. + + You should have received a copy of the GNU Affero General Public License + along with this program. If not, see . + */ + +package de.staropensource.sosengine.base.data.placeholders; + +import de.staropensource.sosengine.base.classes.Placeholder; +import de.staropensource.sosengine.base.utility.BuildInfo; +import org.jetbrains.annotations.NotNull; + +/** + * Implements the {@code engine_version_type} placeholder. + * + * @see Placeholder + * @since 1-alpha0 + */ +@SuppressWarnings({ "unused" }) +public class EngineVersionType implements Placeholder { + /** + * Constructor. + * + * @since 1-alpha0 + */ + public EngineVersionType() {} + + /** {@inheritDoc} */ + @NotNull + public String getName() { + return "engine_version_type"; + } + + /** {@inheritDoc} */ + @NotNull + @Override + public String replace(@NotNull String text) { + return text.replace("%" + getName() + "%", BuildInfo.getInstance().getVersioningType().name().toLowerCase()); + } +} diff --git a/base/src/main/java/de/staropensource/sosengine/base/data/placeholders/EngineVersionTyperelease.java b/base/src/main/java/de/staropensource/sosengine/base/data/placeholders/EngineVersionTyperelease.java new file mode 100644 index 00000000..e8ffcc0e --- /dev/null +++ b/base/src/main/java/de/staropensource/sosengine/base/data/placeholders/EngineVersionTyperelease.java @@ -0,0 +1,53 @@ +/* + STAROPENSOURCE ENGINE SOURCE FILE + Copyright (c) 2024 The StarOpenSource Engine Contributors + Licensed under the GNU Affero General Public License v3 + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU Affero General Public License as + published by the Free Software Foundation, either version 3 of the + License, or (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU Affero General Public License for more details. + + You should have received a copy of the GNU Affero General Public License + along with this program. If not, see . + */ + +package de.staropensource.sosengine.base.data.placeholders; + +import de.staropensource.sosengine.base.classes.Placeholder; +import de.staropensource.sosengine.base.utility.BuildInfo; +import org.jetbrains.annotations.NotNull; + +/** + * Implements the {@code engine_version_typerelease} placeholder. + * + * @see Placeholder + * @since 1-alpha0 + */ +@SuppressWarnings({ "unused" }) +public class EngineVersionTyperelease implements Placeholder { + /** + * Constructor. + * + * @since 1-alpha0 + */ + public EngineVersionTyperelease() {} + + /** {@inheritDoc} */ + @NotNull + public String getName() { + return "engine_version_typerelease"; + } + + /** {@inheritDoc} */ + @NotNull + @Override + public String replace(@NotNull String text) { + return text.replace("%" + getName() + "%", String.valueOf(BuildInfo.getInstance().getVersioningTyperelease())); + } +} diff --git a/base/src/main/java/de/staropensource/sosengine/base/data/placeholders/EngineVersionVersion.java b/base/src/main/java/de/staropensource/sosengine/base/data/placeholders/EngineVersionVersion.java new file mode 100644 index 00000000..e9c8a731 --- /dev/null +++ b/base/src/main/java/de/staropensource/sosengine/base/data/placeholders/EngineVersionVersion.java @@ -0,0 +1,53 @@ +/* + STAROPENSOURCE ENGINE SOURCE FILE + Copyright (c) 2024 The StarOpenSource Engine Contributors + Licensed under the GNU Affero General Public License v3 + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU Affero General Public License as + published by the Free Software Foundation, either version 3 of the + License, or (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU Affero General Public License for more details. + + You should have received a copy of the GNU Affero General Public License + along with this program. If not, see . + */ + +package de.staropensource.sosengine.base.data.placeholders; + +import de.staropensource.sosengine.base.classes.Placeholder; +import de.staropensource.sosengine.base.utility.BuildInfo; +import org.jetbrains.annotations.NotNull; + +/** + * Implements the {@code engine_version_version} placeholder. + * + * @see Placeholder + * @since 1-alpha0 + */ +@SuppressWarnings({ "unused" }) +public class EngineVersionVersion implements Placeholder { + /** + * Constructor. + * + * @since 1-alpha0 + */ + public EngineVersionVersion() {} + + /** {@inheritDoc} */ + @NotNull + public String getName() { + return "engine_version_version"; + } + + /** {@inheritDoc} */ + @NotNull + @Override + public String replace(@NotNull String text) { + return text.replace("%" + getName() + "%", String.valueOf(BuildInfo.getInstance().getVersioningVersion())); + } +} diff --git a/base/src/main/java/de/staropensource/sosengine/base/data/placeholders/JvmArguments.java b/base/src/main/java/de/staropensource/sosengine/base/data/placeholders/JvmArguments.java new file mode 100644 index 00000000..4123d50a --- /dev/null +++ b/base/src/main/java/de/staropensource/sosengine/base/data/placeholders/JvmArguments.java @@ -0,0 +1,68 @@ +/* + STAROPENSOURCE ENGINE SOURCE FILE + Copyright (c) 2024 The StarOpenSource Engine Contributors + Licensed under the GNU Affero General Public License v3 + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU Affero General Public License as + published by the Free Software Foundation, either version 3 of the + License, or (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU Affero General Public License for more details. + + You should have received a copy of the GNU Affero General Public License + along with this program. If not, see . + */ + +package de.staropensource.sosengine.base.data.placeholders; + +import de.staropensource.sosengine.base.classes.Placeholder; +import de.staropensource.sosengine.base.utility.JvmInformation; +import org.jetbrains.annotations.NotNull; + +/** + * Implements the {@code jvm_arguments} placeholder. + * + * @see Placeholder + * @since 1-alpha0 + */ +@SuppressWarnings({ "unused" }) +public class JvmArguments implements Placeholder { + /** + * Constructor. + * + * @since 1-alpha0 + */ + public JvmArguments() {} + + /** {@inheritDoc} */ + @Override + public @NotNull String getName() { + return "jvm_arguments"; + } + + /** {@inheritDoc} */ + @Override + public @NotNull String replace(@NotNull String text) { + StringBuilder arguments = new StringBuilder(); + + for (String argument : JvmInformation.getArguments()) { + if (!arguments.isEmpty()) arguments.append(" "); + + arguments + .append("\"") + .append( + argument + .replace("\\", "\\\\") + .replace("\n", "\\n") + .replace("\"", "\\\"") + ) + .append("\""); + } + + return text.replace("%" + getName() + "%", arguments.toString()); + } +} diff --git a/base/src/main/java/de/staropensource/sosengine/base/data/placeholders/JvmImplementationName.java b/base/src/main/java/de/staropensource/sosengine/base/data/placeholders/JvmImplementationName.java new file mode 100644 index 00000000..e1615bf5 --- /dev/null +++ b/base/src/main/java/de/staropensource/sosengine/base/data/placeholders/JvmImplementationName.java @@ -0,0 +1,52 @@ +/* + STAROPENSOURCE ENGINE SOURCE FILE + Copyright (c) 2024 The StarOpenSource Engine Contributors + Licensed under the GNU Affero General Public License v3 + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU Affero General Public License as + published by the Free Software Foundation, either version 3 of the + License, or (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU Affero General Public License for more details. + + You should have received a copy of the GNU Affero General Public License + along with this program. If not, see . + */ + +package de.staropensource.sosengine.base.data.placeholders; + +import de.staropensource.sosengine.base.classes.Placeholder; +import de.staropensource.sosengine.base.utility.JvmInformation; +import org.jetbrains.annotations.NotNull; + +/** + * Implements the {@code jvm_implementation_name} placeholder. + * + * @see Placeholder + * @since 1-alpha0 + */ +@SuppressWarnings({ "unused" }) +public class JvmImplementationName implements Placeholder { + /** + * Constructor. + * + * @since 1-alpha0 + */ + public JvmImplementationName() {} + + /** {@inheritDoc} */ + @Override + public @NotNull String getName() { + return "jvm_implementation_name"; + } + + /** {@inheritDoc} */ + @Override + public @NotNull String replace(@NotNull String text) { + return text.replace("%" + getName() + "%", JvmInformation.getImplementationName()); + } +} diff --git a/base/src/main/java/de/staropensource/sosengine/base/data/placeholders/JvmImplementationVendor.java b/base/src/main/java/de/staropensource/sosengine/base/data/placeholders/JvmImplementationVendor.java new file mode 100644 index 00000000..b0fcec10 --- /dev/null +++ b/base/src/main/java/de/staropensource/sosengine/base/data/placeholders/JvmImplementationVendor.java @@ -0,0 +1,52 @@ +/* + STAROPENSOURCE ENGINE SOURCE FILE + Copyright (c) 2024 The StarOpenSource Engine Contributors + Licensed under the GNU Affero General Public License v3 + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU Affero General Public License as + published by the Free Software Foundation, either version 3 of the + License, or (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU Affero General Public License for more details. + + You should have received a copy of the GNU Affero General Public License + along with this program. If not, see . + */ + +package de.staropensource.sosengine.base.data.placeholders; + +import de.staropensource.sosengine.base.classes.Placeholder; +import de.staropensource.sosengine.base.utility.JvmInformation; +import org.jetbrains.annotations.NotNull; + +/** + * Implements the {@code jvm_implementation_vendor} placeholder. + * + * @see Placeholder + * @since 1-alpha0 + */ +@SuppressWarnings({ "unused" }) +public class JvmImplementationVendor implements Placeholder { + /** + * Constructor. + * + * @since 1-alpha0 + */ + public JvmImplementationVendor() {} + + /** {@inheritDoc} */ + @Override + public @NotNull String getName() { + return "jvm_implementation_vendor"; + } + + /** {@inheritDoc} */ + @Override + public @NotNull String replace(@NotNull String text) { + return text.replace("%" + getName() + "%", JvmInformation.getImplementationVendor()); + } +} diff --git a/base/src/main/java/de/staropensource/sosengine/base/data/placeholders/JvmImplementationVersion.java b/base/src/main/java/de/staropensource/sosengine/base/data/placeholders/JvmImplementationVersion.java new file mode 100644 index 00000000..7e5fd006 --- /dev/null +++ b/base/src/main/java/de/staropensource/sosengine/base/data/placeholders/JvmImplementationVersion.java @@ -0,0 +1,52 @@ +/* + STAROPENSOURCE ENGINE SOURCE FILE + Copyright (c) 2024 The StarOpenSource Engine Contributors + Licensed under the GNU Affero General Public License v3 + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU Affero General Public License as + published by the Free Software Foundation, either version 3 of the + License, or (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU Affero General Public License for more details. + + You should have received a copy of the GNU Affero General Public License + along with this program. If not, see . + */ + +package de.staropensource.sosengine.base.data.placeholders; + +import de.staropensource.sosengine.base.classes.Placeholder; +import de.staropensource.sosengine.base.utility.JvmInformation; +import org.jetbrains.annotations.NotNull; + +/** + * Implements the {@code jvm_implementation_version} placeholder. + * + * @see Placeholder + * @since 1-alpha0 + */ +@SuppressWarnings({ "unused" }) +public class JvmImplementationVersion implements Placeholder { + /** + * Constructor. + * + * @since 1-alpha0 + */ + public JvmImplementationVersion() {} + + /** {@inheritDoc} */ + @Override + public @NotNull String getName() { + return "jvm_implementation_version"; + } + + /** {@inheritDoc} */ + @Override + public @NotNull String replace(@NotNull String text) { + return text.replace("%" + getName() + "%", JvmInformation.getImplementationVersion()); + } +} diff --git a/base/src/main/java/de/staropensource/sosengine/base/data/placeholders/JvmUptime.java b/base/src/main/java/de/staropensource/sosengine/base/data/placeholders/JvmUptime.java new file mode 100644 index 00000000..746a80e7 --- /dev/null +++ b/base/src/main/java/de/staropensource/sosengine/base/data/placeholders/JvmUptime.java @@ -0,0 +1,52 @@ +/* + STAROPENSOURCE ENGINE SOURCE FILE + Copyright (c) 2024 The StarOpenSource Engine Contributors + Licensed under the GNU Affero General Public License v3 + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU Affero General Public License as + published by the Free Software Foundation, either version 3 of the + License, or (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU Affero General Public License for more details. + + You should have received a copy of the GNU Affero General Public License + along with this program. If not, see . + */ + +package de.staropensource.sosengine.base.data.placeholders; + +import de.staropensource.sosengine.base.classes.Placeholder; +import de.staropensource.sosengine.base.utility.JvmInformation; +import org.jetbrains.annotations.NotNull; + +/** + * Implements the {@code jvm_uptime} placeholder. + * + * @see Placeholder + * @since 1-alpha0 + */ +@SuppressWarnings({ "unused" }) +public class JvmUptime implements Placeholder { + /** + * Constructor. + * + * @since 1-alpha0 + */ + public JvmUptime() {} + + /** {@inheritDoc} */ + @Override + public @NotNull String getName() { + return "jvm_uptime"; + } + + /** {@inheritDoc} */ + @Override + public @NotNull String replace(@NotNull String text) { + return text.replace("%" + getName() + "%", String.valueOf(JvmInformation.getUptime())); + } +} diff --git a/base/src/main/java/de/staropensource/sosengine/base/data/placeholders/JvmVersion.java b/base/src/main/java/de/staropensource/sosengine/base/data/placeholders/JvmVersion.java new file mode 100644 index 00000000..e0bd8eea --- /dev/null +++ b/base/src/main/java/de/staropensource/sosengine/base/data/placeholders/JvmVersion.java @@ -0,0 +1,52 @@ +/* + STAROPENSOURCE ENGINE SOURCE FILE + Copyright (c) 2024 The StarOpenSource Engine Contributors + Licensed under the GNU Affero General Public License v3 + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU Affero General Public License as + published by the Free Software Foundation, either version 3 of the + License, or (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU Affero General Public License for more details. + + You should have received a copy of the GNU Affero General Public License + along with this program. If not, see . + */ + +package de.staropensource.sosengine.base.data.placeholders; + +import de.staropensource.sosengine.base.classes.Placeholder; +import de.staropensource.sosengine.base.utility.JvmInformation; +import org.jetbrains.annotations.NotNull; + +/** + * Implements the {@code jvm_java} placeholder. + * + * @see Placeholder + * @since 1-alpha0 + */ +@SuppressWarnings({ "unused" }) +public class JvmVersion implements Placeholder { + /** + * Constructor. + * + * @since 1-alpha0 + */ + public JvmVersion() {} + + /** {@inheritDoc} */ + @Override + public @NotNull String getName() { + return "jvm_java"; + } + + /** {@inheritDoc} */ + @Override + public @NotNull String replace(@NotNull String text) { + return text.replace("%" + getName() + "%", String.valueOf(JvmInformation.getJavaVersion())); + } +} diff --git a/base/src/main/java/de/staropensource/sosengine/base/data/placeholders/TimeEpoch.java b/base/src/main/java/de/staropensource/sosengine/base/data/placeholders/TimeEpoch.java new file mode 100644 index 00000000..75f27627 --- /dev/null +++ b/base/src/main/java/de/staropensource/sosengine/base/data/placeholders/TimeEpoch.java @@ -0,0 +1,54 @@ +/* + STAROPENSOURCE ENGINE SOURCE FILE + Copyright (c) 2024 The StarOpenSource Engine Contributors + Licensed under the GNU Affero General Public License v3 + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU Affero General Public License as + published by the Free Software Foundation, either version 3 of the + License, or (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU Affero General Public License for more details. + + You should have received a copy of the GNU Affero General Public License + along with this program. If not, see . + */ + +package de.staropensource.sosengine.base.data.placeholders; + +import de.staropensource.sosengine.base.classes.Placeholder; +import de.staropensource.sosengine.base.utility.Miscellaneous; +import org.jetbrains.annotations.NotNull; + +/** + * Implements the {@code time_epoch} placeholder. + * + * @see Placeholder + * + * @since 1-alpha0 + */ +@SuppressWarnings({ "unused" }) +public class TimeEpoch implements Placeholder { + /** + * Constructor. + * + * @since 1-alpha0 + */ + public TimeEpoch() {} + + /** {@inheritDoc} */ + @NotNull + public String getName() { + return "time_epoch"; + } + + /** {@inheritDoc} */ + @NotNull + @Override + public String replace(@NotNull String text) { + return text.replace("%" + getName() + "%", Miscellaneous.padNumbers(System.currentTimeMillis(), String.valueOf(Long.MAX_VALUE).length())); + } +} diff --git a/base/src/main/java/de/staropensource/sosengine/base/data/placeholders/TimeHour.java b/base/src/main/java/de/staropensource/sosengine/base/data/placeholders/TimeHour.java new file mode 100644 index 00000000..41e1fca4 --- /dev/null +++ b/base/src/main/java/de/staropensource/sosengine/base/data/placeholders/TimeHour.java @@ -0,0 +1,55 @@ +/* + STAROPENSOURCE ENGINE SOURCE FILE + Copyright (c) 2024 The StarOpenSource Engine Contributors + Licensed under the GNU Affero General Public License v3 + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU Affero General Public License as + published by the Free Software Foundation, either version 3 of the + License, or (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU Affero General Public License for more details. + + You should have received a copy of the GNU Affero General Public License + along with this program. If not, see . + */ + +package de.staropensource.sosengine.base.data.placeholders; + +import de.staropensource.sosengine.base.classes.Placeholder; +import de.staropensource.sosengine.base.utility.Miscellaneous; +import org.jetbrains.annotations.NotNull; + +import java.util.Calendar; + +/** + * Implements the {@code time_hour} placeholder. + * + * @see Placeholder + * @since 1-alpha0 + */ +@SuppressWarnings({ "unused" }) +public class TimeHour implements Placeholder { + /** + * Constructor. + * + * @since 1-alpha0 + */ + public TimeHour() {} + + /** {@inheritDoc} */ + @NotNull + public String getName() { + return "time_hour"; + } + + /** {@inheritDoc} */ + @NotNull + @Override + public String replace(@NotNull String text) { + return text.replace("%" + getName() + "%", Miscellaneous.padNumbers(Calendar.getInstance().get(Calendar.HOUR_OF_DAY), 2)); + } +} diff --git a/base/src/main/java/de/staropensource/sosengine/base/data/placeholders/TimeMinute.java b/base/src/main/java/de/staropensource/sosengine/base/data/placeholders/TimeMinute.java new file mode 100644 index 00000000..776cf844 --- /dev/null +++ b/base/src/main/java/de/staropensource/sosengine/base/data/placeholders/TimeMinute.java @@ -0,0 +1,55 @@ +/* + STAROPENSOURCE ENGINE SOURCE FILE + Copyright (c) 2024 The StarOpenSource Engine Contributors + Licensed under the GNU Affero General Public License v3 + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU Affero General Public License as + published by the Free Software Foundation, either version 3 of the + License, or (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU Affero General Public License for more details. + + You should have received a copy of the GNU Affero General Public License + along with this program. If not, see . + */ + +package de.staropensource.sosengine.base.data.placeholders; + +import de.staropensource.sosengine.base.classes.Placeholder; +import de.staropensource.sosengine.base.utility.Miscellaneous; +import org.jetbrains.annotations.NotNull; + +import java.util.Calendar; + +/** + * Implements the {@code time_minute} placeholder. + * + * @see Placeholder + * @since 1-alpha0 + */ +@SuppressWarnings({ "unused" }) +public class TimeMinute implements Placeholder { + /** + * Constructor. + * + * @since 1-alpha0 + */ + public TimeMinute() {} + + /** {@inheritDoc} */ + @NotNull + public String getName() { + return "time_minute"; + } + + /** {@inheritDoc} */ + @NotNull + @Override + public String replace(@NotNull String text) { + return text.replace("%" + getName() + "%", Miscellaneous.padNumbers(Calendar.getInstance().get(Calendar.MINUTE), 2)); + } +} diff --git a/base/src/main/java/de/staropensource/sosengine/base/data/placeholders/TimeSecond.java b/base/src/main/java/de/staropensource/sosengine/base/data/placeholders/TimeSecond.java new file mode 100644 index 00000000..8c433d8f --- /dev/null +++ b/base/src/main/java/de/staropensource/sosengine/base/data/placeholders/TimeSecond.java @@ -0,0 +1,55 @@ +/* + STAROPENSOURCE ENGINE SOURCE FILE + Copyright (c) 2024 The StarOpenSource Engine Contributors + Licensed under the GNU Affero General Public License v3 + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU Affero General Public License as + published by the Free Software Foundation, either version 3 of the + License, or (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU Affero General Public License for more details. + + You should have received a copy of the GNU Affero General Public License + along with this program. If not, see . + */ + +package de.staropensource.sosengine.base.data.placeholders; + +import de.staropensource.sosengine.base.classes.Placeholder; +import de.staropensource.sosengine.base.utility.Miscellaneous; +import org.jetbrains.annotations.NotNull; + +import java.util.Calendar; + +/** + * Implements the {@code time_second} placeholder. + * + * @see Placeholder + * @since 1-alpha0 + */ +@SuppressWarnings({ "unused" }) +public class TimeSecond implements Placeholder { + /** + * Constructor. + * + * @since 1-alpha0 + */ + public TimeSecond() {} + + /** {@inheritDoc} */ + @NotNull + public String getName() { + return "time_second"; + } + + /** {@inheritDoc} */ + @NotNull + @Override + public String replace(@NotNull String text) { + return text.replace("%" + getName() + "%", Miscellaneous.padNumbers(Calendar.getInstance().get(Calendar.SECOND), 2)); + } +} diff --git a/base/src/main/java/de/staropensource/sosengine/base/data/placeholders/TimeZone.java b/base/src/main/java/de/staropensource/sosengine/base/data/placeholders/TimeZone.java new file mode 100644 index 00000000..f17b9d5f --- /dev/null +++ b/base/src/main/java/de/staropensource/sosengine/base/data/placeholders/TimeZone.java @@ -0,0 +1,54 @@ +/* + STAROPENSOURCE ENGINE SOURCE FILE + Copyright (c) 2024 The StarOpenSource Engine Contributors + Licensed under the GNU Affero General Public License v3 + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU Affero General Public License as + published by the Free Software Foundation, either version 3 of the + License, or (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU Affero General Public License for more details. + + You should have received a copy of the GNU Affero General Public License + along with this program. If not, see . + */ + +package de.staropensource.sosengine.base.data.placeholders; + +import de.staropensource.sosengine.base.classes.Placeholder; +import org.jetbrains.annotations.NotNull; + +import java.util.Locale; + +/** + * Implements the {@code time_zone} placeholder. + * + * @see Placeholder + * @since 1-alpha0 + */ +@SuppressWarnings({ "unused" }) +public class TimeZone implements Placeholder { + /** + * Constructor. + * + * @since 1-alpha0 + */ + public TimeZone() {} + + /** {@inheritDoc} */ + @NotNull + public String getName() { + return "time_zone"; + } + + /** {@inheritDoc} */ + @NotNull + @Override + public String replace(@NotNull String text) { + return text.replace("%" + getName() + "%", java.util.TimeZone.getDefault().getDisplayName(false, java.util.TimeZone.SHORT, Locale.US)); + } +} diff --git a/base/src/main/java/de/staropensource/sosengine/base/data/placeholders/package-info.java b/base/src/main/java/de/staropensource/sosengine/base/data/placeholders/package-info.java new file mode 100644 index 00000000..ec907e32 --- /dev/null +++ b/base/src/main/java/de/staropensource/sosengine/base/data/placeholders/package-info.java @@ -0,0 +1,27 @@ +/* + STAROPENSOURCE ENGINE SOURCE FILE + Copyright (c) 2024 The StarOpenSource Engine Contributors + Licensed under the GNU Affero General Public License v3 + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU Affero General Public License as + published by the Free Software Foundation, either version 3 of the + License, or (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU Affero General Public License for more details. + + You should have received a copy of the GNU Affero General Public License + along with this program. If not, see . + */ + +/** + * Contains all built-in placeholders used in {@link de.staropensource.sosengine.base.utility.PlaceholderEngine}. + * + * @see de.staropensource.sosengine.base.utility.PlaceholderEngine + * @see de.staropensource.sosengine.base.classes.Placeholder + * @since 1-alpha0 + */ +package de.staropensource.sosengine.base.data.placeholders; diff --git a/base/src/main/java/de/staropensource/sosengine/base/logging/CrashHandler.java b/base/src/main/java/de/staropensource/sosengine/base/logging/CrashHandler.java new file mode 100644 index 00000000..31e8b414 --- /dev/null +++ b/base/src/main/java/de/staropensource/sosengine/base/logging/CrashHandler.java @@ -0,0 +1,216 @@ +/* + STAROPENSOURCE ENGINE SOURCE FILE + Copyright (c) 2024 The StarOpenSource Engine Contributors + Licensed under the GNU Affero General Public License v3 + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU Affero General Public License as + published by the Free Software Foundation, either version 3 of the + License, or (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU Affero General Public License for more details. + + You should have received a copy of the GNU Affero General Public License + along with this program. If not, see . + */ + +package de.staropensource.sosengine.base.logging; + +import de.staropensource.sosengine.base.EngineConfiguration; +import de.staropensource.sosengine.base.classes.Placeholder; +import de.staropensource.sosengine.base.logging.placeholders.crashhandler.*; +import de.staropensource.sosengine.base.types.LogIssuer; +import de.staropensource.sosengine.base.types.LogLevel; +import de.staropensource.sosengine.base.utility.PlaceholderEngine; +import lombok.Getter; +import lombok.Setter; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +import java.util.*; + +/** + * Handles engine and application crashes. + * + * @see Logger + * @see LoggerInstance + * @see LogIssuer + * @since 1-alpha0 + */ +@SuppressWarnings({ "unused", "JavadocDeclaration", "JavadocBlankLines" }) +public class CrashHandler { + /** + * Hopefully {@code false} :) + * + * @since 1-alpha0 + * + * -- GETTER -- + * Hopefully {@code false} :) + * + * @return if the engine is in a crashed state + * @since 1-alpha0 + */ + private static boolean crashed = false; + + /** + * Contains the template used to print a crash report. + * + * @since 1-alpha0 + * + * -- GETTER -- + * Gets the template used to print a crash report. + * + * @return crash report template + * @since 1-alpha0 + * + * -- SETTER -- + * Sets the template used to print a crash report. + * + * @param crashTemplate new crash template + * @since 1-alpha0 + */ + @Getter + @Setter + private static String crashTemplate = """ + +------------------------ + sos!engine crash +------------------------ +%content% + +------------------------ + sos!engine crash +------------------------ +"""; + + /** + * Contains nested {@link LinkedHashMap}s that contain the content printed at the time of a crash. + * + * @since 1-alpha0 + * + * -- GETTER -- + * Returns the nested {@link LinkedHashMap}s that contain the content printed at the time of a crash. + * + * @return crash content + * @since 1-alpha0 + */ + @Getter + private static final LinkedHashMap crashContent = new LinkedHashMap<>(); + + /** + * Constructor. + * + * @since 1-alpha0 + */ + public CrashHandler() {} + + /** + * Handles a crash. + * + * @param logIssuer information about the class that caused the crash + * @param message crash error detail + * @param exception simply to provide stacktrace and further insight into the crash, can be set to {@code null} + * @since 1-alpha0 + */ + public static void handleCrash(@NotNull LogIssuer logIssuer, @NotNull String message, @Nullable Exception exception) { + crashed = true; + String base = crashTemplate; + + // Convert crashContent to String and replace %content% in crashTemplate with the result + base = base.replace("%content%", processCrashContent()); // This is so simple we don't need the PlaceholderEngine to do it for us + + // Execute LoggerImpl#prePlaceholder + base = Logger.getLoggerImplementation().prePlaceholder(LogLevel.CRASH, logIssuer, base); + + // Create list of temporary placeholders + List temporaryPlaceholders = new ArrayList<>(); + temporaryPlaceholders.add(new IssuerMessage(message)); // log_message is out of order to allow for placeholder usage + + // issuer_* + temporaryPlaceholders.add(new IssuerClass(logIssuer)); + temporaryPlaceholders.add(new IssuerCodePart(logIssuer)); + temporaryPlaceholders.add(new IssuerInfo(logIssuer)); + temporaryPlaceholders.add(new IssuerPackage(logIssuer)); + temporaryPlaceholders.add(new IssuerPath(logIssuer)); + // etc + temporaryPlaceholders.add(new Stacktrace(exception)); + + // Replace placeholders + base = PlaceholderEngine.getInstance().process(base, temporaryPlaceholders); + + // Execute LoggerImpl#postPlaceholder + base = Logger.getLoggerImplementation().postPlaceholder(LogLevel.CRASH, logIssuer, base); + + // Print log message + Logger.getLoggerImplementation().print(LogLevel.CRASH, logIssuer, base); + + // Shutdown JVM + if (EngineConfiguration.getInstance().isLoggerImmediateShutdown()) + Runtime.getRuntime().halt(69); + else + Runtime.getRuntime().exit(69); + } + + /** + * Internal method for generating the crash message content. Do not call. + * + * @param map the {@link LinkedHashMap} to process + * @param indentationSize the indentation level + * @return crash content string + * @see CrashHandler#processCrashContent() + * @since 1-alpha0 + */ + /* + Note: This entire method causes a compilation warning as we are using "unchecked or unsecure operations". + We can safely ignore this as this method + 1. checks data types as best as it can, and + 2. only works on a String and not on a File or something which could cause damage. + */ + @NotNull + private static String processCrashContent(@NotNull LinkedHashMap map, int indentationSize) { + StringBuilder content = new StringBuilder(); + + for (Object key : map.keySet()) { + if (!(key instanceof String)) + // Invalid content key, skip + continue; + + if (!(map.get(key) instanceof LinkedHashMap || map.get(key) instanceof String)) + // Invalid content value, skip + continue; + + if (!content.isEmpty()) + content.append("\n"); + + if (map.get(key) instanceof String) { + if (indentationSize == 0) content.append("\n"); + else content.append(" ".repeat(indentationSize)).append("-> "); + content.append(key).append(": ").append(map.get(key)); + } else { + if (indentationSize == 0) content.append("\n"); + else content.append(" ".repeat(indentationSize)).append("-> "); + content.append(key).append("\n"); + + // We are the types in this function already + //noinspection unchecked + content.append(processCrashContent((LinkedHashMap) map.get(key), indentationSize + 1)); + } + + } + + return content.toString(); + } + + /** + * Generates the content for a crash report. Processes {@code crashContent} and spits out a String. + * + * @return crash content string + * @since 1-alpha0 + */ + public static String processCrashContent() { + return processCrashContent(crashContent, 0); + } +} diff --git a/base/src/main/java/de/staropensource/sosengine/base/logging/DefaultLoggerImpl.java b/base/src/main/java/de/staropensource/sosengine/base/logging/DefaultLoggerImpl.java new file mode 100644 index 00000000..d4fc959a --- /dev/null +++ b/base/src/main/java/de/staropensource/sosengine/base/logging/DefaultLoggerImpl.java @@ -0,0 +1,75 @@ +/* + STAROPENSOURCE ENGINE SOURCE FILE + Copyright (c) 2024 The StarOpenSource Engine Contributors + Licensed under the GNU Affero General Public License v3 + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU Affero General Public License as + published by the Free Software Foundation, either version 3 of the + License, or (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU Affero General Public License for more details. + + You should have received a copy of the GNU Affero General Public License + along with this program. If not, see . + */ + +package de.staropensource.sosengine.base.logging; + +import de.staropensource.sosengine.base.EngineConfiguration; +import de.staropensource.sosengine.base.classes.LoggerImpl; +import de.staropensource.sosengine.base.types.LogIssuer; +import de.staropensource.sosengine.base.types.LogLevel; +import de.staropensource.sosengine.base.utility.ShortcodeConverter; +import org.fusesource.jansi.Ansi; +import org.fusesource.jansi.AnsiConsole; +import org.jetbrains.annotations.NotNull; + +/** + * The default logger implementation for the StarOpenSource Engine. + * + * @see Logger + * @see LoggerImpl + * @since 1-alpha0 + */ +public class DefaultLoggerImpl implements LoggerImpl { + /** + * Constructor. + * + * @since 1-alpha0 + */ + public DefaultLoggerImpl() {} + + /** {@inheritDoc} */ + @Override + public String prePlaceholder(@NotNull LogLevel level, @NotNull LogIssuer logIssuer, @NotNull String message) { + // No modifications necessary + return message; + } + + /** {@inheritDoc} */ + @Override + public String postPlaceholder(@NotNull LogLevel level, @NotNull LogIssuer logIssuer, @NotNull String message) { + // No modifications necessary + return message; + } + + /** {@inheritDoc} */ + @Override + public void print(@NotNull LogLevel level, @NotNull LogIssuer logIssuer, @NotNull String message) { + // Convert to Ansi + Ansi output = ShortcodeConverter.getInstance().process(message, true); + + // Print message + if (level == LogLevel.ERROR || level == LogLevel.CRASH) + if (EngineConfiguration.getInstance().isLoggerForceStandardOutput()) + AnsiConsole.out().println(output); + else + AnsiConsole.err().println(output); + else + AnsiConsole.out().println(output); + } +} diff --git a/base/src/main/java/de/staropensource/sosengine/base/logging/Logger.java b/base/src/main/java/de/staropensource/sosengine/base/logging/Logger.java new file mode 100644 index 00000000..20e01243 --- /dev/null +++ b/base/src/main/java/de/staropensource/sosengine/base/logging/Logger.java @@ -0,0 +1,208 @@ +/* + STAROPENSOURCE ENGINE SOURCE FILE + Copyright (c) 2024 The StarOpenSource Engine Contributors + Licensed under the GNU Affero General Public License v3 + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU Affero General Public License as + published by the Free Software Foundation, either version 3 of the + License, or (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU Affero General Public License for more details. + + You should have received a copy of the GNU Affero General Public License + along with this program. If not, see . + */ + +package de.staropensource.sosengine.base.logging; + +import de.staropensource.sosengine.base.EngineConfiguration; +import de.staropensource.sosengine.base.classes.LoggerImpl; +import de.staropensource.sosengine.base.classes.Placeholder; +import de.staropensource.sosengine.base.logging.placeholders.logger.*; +import de.staropensource.sosengine.base.types.LogIssuer; +import de.staropensource.sosengine.base.types.LogLevel; +import de.staropensource.sosengine.base.utility.PlaceholderEngine; +import lombok.Getter; +import lombok.Setter; +import org.jetbrains.annotations.NotNull; + +import java.util.ArrayList; +import java.util.List; + +/** + * Provides the engine's logging infrastructure except for the {@link CrashHandler}. + * + * @see CrashHandler + * @see LoggerInstance + * @see LogIssuer + * @see LogLevel + */ +@SuppressWarnings({ "unused", "JavadocDeclaration" }) +public class Logger { + /** + * Refers to the active {@link LoggerImpl} that is used to process and print log messages. + * + * @see LoggerImpl + * @since 1-alpha0 + * + * -- GETTER -- + * Returns the active {@link LoggerImpl}. + * + * @return active {@link LoggerImpl} + * @see LoggerImpl + * @since 1-alpha0 + * + * -- SETTER -- + * Sets the active {@link LoggerImpl}. + * + * @param loggerImplementation the new active {@link LoggerImpl} + * @see LoggerImpl + * @since 1-alpha0 + */ + @NotNull + @Getter + @Setter + private static LoggerImpl loggerImplementation = new DefaultLoggerImpl(); + + /** + * Constructor. + * + * @since 1-alpha0 + */ + public Logger() {} + + /** + * Handler for all log messages. + * + * @param level log level + * @param logIssuer log issuer + * @param message log message + * @since 1-alpha0 + */ + private static void log(@NotNull LogLevel level, @NotNull LogIssuer logIssuer, @NotNull String message) { + // Check if level is allowed + if (level.compareTo(EngineConfiguration.getInstance().getLoggerLevel()) < 0) + return; + + // Template for now, final log message later + String base = EngineConfiguration.getInstance().getLoggerTemplate(); + + // Execute LoggerImpl#prePlaceholder + base = loggerImplementation.prePlaceholder(level, logIssuer, base); + + // Create list of temporary placeholders + List temporaryPlaceholders = new ArrayList<>(); + temporaryPlaceholders.add(new LogMessage(message)); // log_message is out of order to allow for placeholder usage + + temporaryPlaceholders.add(new LogColorPrimary(level)); + temporaryPlaceholders.add(new LogColorSecondary(level)); + temporaryPlaceholders.add(new LogClass(logIssuer)); + temporaryPlaceholders.add(new LogColorPrimary(level)); + temporaryPlaceholders.add(new LogInfo(logIssuer)); + temporaryPlaceholders.add(new de.staropensource.sosengine.base.logging.placeholders.logger.LogLevel(level)); + temporaryPlaceholders.add(new LogPackage(logIssuer)); + temporaryPlaceholders.add(new LogPath(logIssuer)); + + // Replace placeholders + base = PlaceholderEngine.getInstance().process(base, temporaryPlaceholders); + + // Execute LoggerImpl#postPlaceholder + base = loggerImplementation.postPlaceholder(level, logIssuer, base); + + // Print log message + loggerImplementation.print(level, logIssuer, base); + } + + /** + * Prints a diagnostic message. + * + * @param logIssuer issuing class + * @param message diagnostic message + * @since 1-alpha0 + */ + public static void diag(@NotNull LogIssuer logIssuer, @NotNull String message) { + log(LogLevel.DIAGNOSTIC, logIssuer, message); + } + + /** + * Prints a verbose message. + * + * @param logIssuer issuing class + * @param message verbose message + * @since 1-alpha0 + */ + public static void verb(@NotNull LogIssuer logIssuer, @NotNull String message) { + log(LogLevel.VERBOSE, logIssuer, message); + } + + /** + * Prints a silent warning message. + * + * @param logIssuer issuing class + * @param message silent warning message + * @since 1-alpha0 + */ + public static void sarn(@NotNull LogIssuer logIssuer, @NotNull String message) { + log(LogLevel.SILENT_WARNING, logIssuer, message); + } + + /** + * Prints an informational message. + * + * @param logIssuer issuing class + * @param message informational message + * @since 1-alpha0 + */ + public static void info(@NotNull LogIssuer logIssuer, @NotNull String message) { + log(LogLevel.INFORMATIONAL, logIssuer, message); + } + + /** + * Prints a warning message. + * + * @param logIssuer issuing class + * @param message warning message + * @since 1-alpha0 + */ + public static void warn(@NotNull LogIssuer logIssuer, @NotNull String message) { + log(LogLevel.WARNING, logIssuer, message); + } + + /** + * Prints an error message. + * + * @param logIssuer issuing class + * @param message error message + * @since 1-alpha0 + */ + public static void error(@NotNull LogIssuer logIssuer, @NotNull String message) { + log(LogLevel.ERROR, logIssuer, message); + } + + /** + * Crashes the entire engine. + * + * @param logIssuer issuing class + * @param message diagnostic message + * @param exception the exception that caused this crash + * @since 1-alpha0 + */ + public static void crash(@NotNull LogIssuer logIssuer, @NotNull String message, @NotNull Exception exception) { + CrashHandler.handleCrash(logIssuer, message, exception); + } + + /** + * Crashes the entire engine. + * + * @param logIssuer issuing class + * @param message diagnostic message + * @since 1-alpha0 + */ + public static void crash(@NotNull LogIssuer logIssuer, @NotNull String message) { + CrashHandler.handleCrash(logIssuer, message, null); + } +} diff --git a/base/src/main/java/de/staropensource/sosengine/base/logging/LoggerInstance.java b/base/src/main/java/de/staropensource/sosengine/base/logging/LoggerInstance.java new file mode 100644 index 00000000..75c5ac2c --- /dev/null +++ b/base/src/main/java/de/staropensource/sosengine/base/logging/LoggerInstance.java @@ -0,0 +1,140 @@ +/* + STAROPENSOURCE ENGINE SOURCE FILE + Copyright (c) 2024 The StarOpenSource Engine Contributors + Licensed under the GNU Affero General Public License v3 + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU Affero General Public License as + published by the Free Software Foundation, either version 3 of the + License, or (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU Affero General Public License for more details. + + You should have received a copy of the GNU Affero General Public License + along with this program. If not, see . + */ + +package de.staropensource.sosengine.base.logging; + +import de.staropensource.sosengine.base.types.LogIssuer; +import lombok.Getter; +import org.jetbrains.annotations.NotNull; + +/** + * Removes the need to add {@code getClass()} to all calls to {@link Logger}. + * + * @since 1-alpha0 + */ +@SuppressWarnings({ "unused", "JavadocDeclaration", "JavadocBlankLines" }) +@Getter +public class LoggerInstance { + /** + * Contains the class that this {@link LoggerInstance} belongs to. + * + * @since 1-alpha0 + * + * -- GETTER -- + * Returns the class that this {@link LoggerInstance} belongs to. + * + * @return the parent class + * @since 1-alpha0 + */ + @NotNull + private final LogIssuer logIssuer; + + /** + * Constructor. + * + * @param logIssuer information about the parent class + * @since 1-alpha0 + */ + public LoggerInstance(@NotNull LogIssuer logIssuer) { + this.logIssuer = logIssuer; + } + + /** + * Prints a diagnostic message. + * + * @param message the diagnostic message + * @since 1-alpha0 + */ + public void diag(@NotNull String message) { + Logger.diag(logIssuer, message); + } + + /** + * Prints a verbose message. + * + * @param message the verbose message + * @since 1-alpha0 + */ + public void verb(@NotNull String message) { + Logger.verb(logIssuer, message); + } + + /** + * Prints a silent warning message. + * + * @param message the silent warning message + * @since 1-alpha0 + */ + public void sarn(@NotNull String message) { + Logger.sarn(logIssuer, message); + } + + /** + * Prints an informational message. + * + * @param message the informational message + * @since 1-alpha0 + */ + public void info(@NotNull String message) { + Logger.info(logIssuer, message); + } + + /** + * Prints a warning message. + * + * @param message the warning message + * @since 1-alpha0 + */ + public void warn(@NotNull String message) { + Logger.warn(logIssuer, message); + } + + /** + * Prints an error message. + * + * @param message the error message + * @since 1-alpha0 + */ + public void error(@NotNull String message) { + Logger.error(logIssuer, message); + } + + /** + * Crashes the entire engine. + * + * @param message the diagnostic message + * @param exception the exception that caused this crash + * @see CrashHandler + * @since 1-alpha0 + */ + public void crash(@NotNull String message, @NotNull Exception exception) { + Logger.crash(logIssuer, message, exception); + } + + /** + * Crashes the entire engine. + * + * @param message the diagnostic message + * @see CrashHandler + * @since 1-alpha0 + */ + public void crash(@NotNull String message) { + Logger.crash(logIssuer, message); + } +} diff --git a/base/src/main/java/de/staropensource/sosengine/base/logging/package-info.java b/base/src/main/java/de/staropensource/sosengine/base/logging/package-info.java new file mode 100644 index 00000000..c56f27cb --- /dev/null +++ b/base/src/main/java/de/staropensource/sosengine/base/logging/package-info.java @@ -0,0 +1,28 @@ +/* + STAROPENSOURCE ENGINE SOURCE FILE + Copyright (c) 2024 The StarOpenSource Engine Contributors + Licensed under the GNU Affero General Public License v3 + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU Affero General Public License as + published by the Free Software Foundation, either version 3 of the + License, or (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU Affero General Public License for more details. + + You should have received a copy of the GNU Affero General Public License + along with this program. If not, see . + */ + +/** + * Contains sos!engine's logging infrastructure. + * + * @see de.staropensource.sosengine.base.logging.Logger + * @see de.staropensource.sosengine.base.logging.LoggerInstance + * @see de.staropensource.sosengine.base.logging.CrashHandler + * @since 1-alpha0 + */ +package de.staropensource.sosengine.base.logging; diff --git a/base/src/main/java/de/staropensource/sosengine/base/logging/placeholders/crashhandler/IssuerClass.java b/base/src/main/java/de/staropensource/sosengine/base/logging/placeholders/crashhandler/IssuerClass.java new file mode 100644 index 00000000..2f9b2b8e --- /dev/null +++ b/base/src/main/java/de/staropensource/sosengine/base/logging/placeholders/crashhandler/IssuerClass.java @@ -0,0 +1,63 @@ +/* + STAROPENSOURCE ENGINE SOURCE FILE + Copyright (c) 2024 The StarOpenSource Engine Contributors + Licensed under the GNU Affero General Public License v3 + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU Affero General Public License as + published by the Free Software Foundation, either version 3 of the + License, or (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU Affero General Public License for more details. + + You should have received a copy of the GNU Affero General Public License + along with this program. If not, see . + */ + +package de.staropensource.sosengine.base.logging.placeholders.crashhandler; + +import de.staropensource.sosengine.base.classes.Placeholder; +import de.staropensource.sosengine.base.types.LogIssuer; +import org.jetbrains.annotations.NotNull; + +/** + * Implements the {@code issuer_class} placeholder. + * + * @see Placeholder + * @since 1-alpha0 + */ +@SuppressWarnings({ "unused" }) +public class IssuerClass implements Placeholder { + /** + * The {@link LogIssuer} to use. + * + * @since 1-alpha0 + */ + @NotNull + private final LogIssuer logIssuer; + + /** + * Constructor. + * + * @param logIssuer the {@link LogIssuer} to use + * @since 1-alpha0 + */ + public IssuerClass(@NotNull LogIssuer logIssuer) { + this.logIssuer = logIssuer; + } + + /** {@inheritDoc} */ + @Override + public @NotNull String getName() { + return "issuer_class"; + } + + /** {@inheritDoc} */ + @Override + public @NotNull String replace(@NotNull String text) { + return text.replace("%" + getName() + "%", logIssuer.getClazz().getName().replace(logIssuer.getClazz().getPackageName() + ".", "")); + } +} diff --git a/base/src/main/java/de/staropensource/sosengine/base/logging/placeholders/crashhandler/IssuerCodePart.java b/base/src/main/java/de/staropensource/sosengine/base/logging/placeholders/crashhandler/IssuerCodePart.java new file mode 100644 index 00000000..bfab6241 --- /dev/null +++ b/base/src/main/java/de/staropensource/sosengine/base/logging/placeholders/crashhandler/IssuerCodePart.java @@ -0,0 +1,63 @@ +/* + STAROPENSOURCE ENGINE SOURCE FILE + Copyright (c) 2024 The StarOpenSource Engine Contributors + Licensed under the GNU Affero General Public License v3 + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU Affero General Public License as + published by the Free Software Foundation, either version 3 of the + License, or (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU Affero General Public License for more details. + + You should have received a copy of the GNU Affero General Public License + along with this program. If not, see . + */ + +package de.staropensource.sosengine.base.logging.placeholders.crashhandler; + +import de.staropensource.sosengine.base.classes.Placeholder; +import de.staropensource.sosengine.base.types.LogIssuer; +import org.jetbrains.annotations.NotNull; + +/** + * Implements the {@code issuer_code_part} placeholder. + * + * @see Placeholder + * @since 1-alpha0 + */ +@SuppressWarnings({ "unused" }) +public class IssuerCodePart implements Placeholder { + /** + * The {@link LogIssuer} to use. + * + * @since 1-alpha0 + */ + @NotNull + private final LogIssuer logIssuer; + + /** + * Constructor. + * + * @param logIssuer the {@link LogIssuer} to use + * @since 1-alpha0 + */ + public IssuerCodePart(@NotNull LogIssuer logIssuer) { + this.logIssuer = logIssuer; + } + + /** {@inheritDoc} */ + @Override + public @NotNull String getName() { + return "issuer_code_part"; + } + + /** {@inheritDoc} */ + @Override + public @NotNull String replace(@NotNull String text) { + return text.replace("%" + getName() + "%", logIssuer.getCodePart().name()); + } +} diff --git a/base/src/main/java/de/staropensource/sosengine/base/logging/placeholders/crashhandler/IssuerInfo.java b/base/src/main/java/de/staropensource/sosengine/base/logging/placeholders/crashhandler/IssuerInfo.java new file mode 100644 index 00000000..8b809fa7 --- /dev/null +++ b/base/src/main/java/de/staropensource/sosengine/base/logging/placeholders/crashhandler/IssuerInfo.java @@ -0,0 +1,66 @@ +/* + STAROPENSOURCE ENGINE SOURCE FILE + Copyright (c) 2024 The StarOpenSource Engine Contributors + Licensed under the GNU Affero General Public License v3 + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU Affero General Public License as + published by the Free Software Foundation, either version 3 of the + License, or (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU Affero General Public License for more details. + + You should have received a copy of the GNU Affero General Public License + along with this program. If not, see . + */ + +package de.staropensource.sosengine.base.logging.placeholders.crashhandler; + +import de.staropensource.sosengine.base.classes.Placeholder; +import de.staropensource.sosengine.base.types.LogIssuer; +import org.jetbrains.annotations.NotNull; + +/** + * Implements the {@code issuer_info} placeholder. + * + * @see Placeholder + * @since 1-alpha0 + */ +@SuppressWarnings({ "unused" }) +public class IssuerInfo implements Placeholder { + /** + * The {@link LogIssuer} to use. + * + * @since 1-alpha0 + */ + @NotNull + private final LogIssuer logIssuer; + + /** + * Constructor. + * + * @param logIssuer the {@link LogIssuer} to use + * @since 1-alpha0 + */ + public IssuerInfo(@NotNull LogIssuer logIssuer) { + this.logIssuer = logIssuer; + } + + /** {@inheritDoc} */ + @Override + public @NotNull String getName() { + return "issuer_info"; + } + + /** {@inheritDoc} */ + @Override + public @NotNull String replace(@NotNull String text) { + if (logIssuer.getAdditionalInformation() == null) + return text.replace("%" + getName() + "%", ""); + else + return text.replace("%" + getName() + "%", logIssuer.getAdditionalInformation()); + } +} diff --git a/base/src/main/java/de/staropensource/sosengine/base/logging/placeholders/crashhandler/IssuerMessage.java b/base/src/main/java/de/staropensource/sosengine/base/logging/placeholders/crashhandler/IssuerMessage.java new file mode 100644 index 00000000..de7b14bf --- /dev/null +++ b/base/src/main/java/de/staropensource/sosengine/base/logging/placeholders/crashhandler/IssuerMessage.java @@ -0,0 +1,62 @@ +/* + STAROPENSOURCE ENGINE SOURCE FILE + Copyright (c) 2024 The StarOpenSource Engine Contributors + Licensed under the GNU Affero General Public License v3 + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU Affero General Public License as + published by the Free Software Foundation, either version 3 of the + License, or (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU Affero General Public License for more details. + + You should have received a copy of the GNU Affero General Public License + along with this program. If not, see . + */ + +package de.staropensource.sosengine.base.logging.placeholders.crashhandler; + +import de.staropensource.sosengine.base.classes.Placeholder; +import org.jetbrains.annotations.NotNull; + +/** + * Implements the {@code issuer_message} placeholder. + * + * @see Placeholder + * @since 1-alpha0 + */ +@SuppressWarnings({ "unused" }) +public class IssuerMessage implements Placeholder { + /** + * The message to use. + * + * @since 1-alpha0 + */ + @NotNull + private final String message; + + /** + * Constructor. + * + * @param message the message to use + * @since 1-alpha0 + */ + public IssuerMessage(@NotNull String message) { + this.message = message; + } + + /** {@inheritDoc} */ + @Override + public @NotNull String getName() { + return "issuer_message"; + } + + /** {@inheritDoc} */ + @Override + public @NotNull String replace(@NotNull String text) { + return text.replace("%" + getName() + "%", message); + } +} diff --git a/base/src/main/java/de/staropensource/sosengine/base/logging/placeholders/crashhandler/IssuerPackage.java b/base/src/main/java/de/staropensource/sosengine/base/logging/placeholders/crashhandler/IssuerPackage.java new file mode 100644 index 00000000..b5dd81f8 --- /dev/null +++ b/base/src/main/java/de/staropensource/sosengine/base/logging/placeholders/crashhandler/IssuerPackage.java @@ -0,0 +1,63 @@ +/* + STAROPENSOURCE ENGINE SOURCE FILE + Copyright (c) 2024 The StarOpenSource Engine Contributors + Licensed under the GNU Affero General Public License v3 + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU Affero General Public License as + published by the Free Software Foundation, either version 3 of the + License, or (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU Affero General Public License for more details. + + You should have received a copy of the GNU Affero General Public License + along with this program. If not, see . + */ + +package de.staropensource.sosengine.base.logging.placeholders.crashhandler; + +import de.staropensource.sosengine.base.classes.Placeholder; +import de.staropensource.sosengine.base.types.LogIssuer; +import org.jetbrains.annotations.NotNull; + +/** + * Implements the {@code issuer_package} placeholder. + * + * @see Placeholder + * @since 1-alpha0 + */ +@SuppressWarnings({ "unused" }) +public class IssuerPackage implements Placeholder { + /** + * The {@link LogIssuer} to use. + * + * @since 1-alpha0 + */ + @NotNull + private final LogIssuer logIssuer; + + /** + * Constructor. + * + * @param logIssuer the {@link LogIssuer} to use + * @since 1-alpha0 + */ + public IssuerPackage(@NotNull LogIssuer logIssuer) { + this.logIssuer = logIssuer; + } + + /** {@inheritDoc} */ + @Override + public @NotNull String getName() { + return "issuer_package"; + } + + /** {@inheritDoc} */ + @Override + public @NotNull String replace(@NotNull String text) { + return text.replace("%" + getName() + "%", logIssuer.getClazz().getPackageName()); + } +} diff --git a/base/src/main/java/de/staropensource/sosengine/base/logging/placeholders/crashhandler/IssuerPath.java b/base/src/main/java/de/staropensource/sosengine/base/logging/placeholders/crashhandler/IssuerPath.java new file mode 100644 index 00000000..cef3712f --- /dev/null +++ b/base/src/main/java/de/staropensource/sosengine/base/logging/placeholders/crashhandler/IssuerPath.java @@ -0,0 +1,63 @@ +/* + STAROPENSOURCE ENGINE SOURCE FILE + Copyright (c) 2024 The StarOpenSource Engine Contributors + Licensed under the GNU Affero General Public License v3 + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU Affero General Public License as + published by the Free Software Foundation, either version 3 of the + License, or (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU Affero General Public License for more details. + + You should have received a copy of the GNU Affero General Public License + along with this program. If not, see . + */ + +package de.staropensource.sosengine.base.logging.placeholders.crashhandler; + +import de.staropensource.sosengine.base.classes.Placeholder; +import de.staropensource.sosengine.base.types.LogIssuer; +import org.jetbrains.annotations.NotNull; + +/** + * Implements the {@code issuer_path} placeholder. + * + * @see Placeholder + * @since 1-alpha0 + */ +@SuppressWarnings({ "unused" }) +public class IssuerPath implements Placeholder { + /** + * The {@link LogIssuer} to use. + * + * @since 1-alpha0 + */ + @NotNull + private final LogIssuer logIssuer; + + /** + * Constructor. + * + * @param logIssuer the {@link LogIssuer} to use + * @since 1-alpha0 + */ + public IssuerPath(@NotNull LogIssuer logIssuer) { + this.logIssuer = logIssuer; + } + + /** {@inheritDoc} */ + @Override + public @NotNull String getName() { + return "issuer_path"; + } + + /** {@inheritDoc} */ + @Override + public @NotNull String replace(@NotNull String text) { + return text.replace("%" + getName() + "%", logIssuer.getClazz().getName()); + } +} diff --git a/base/src/main/java/de/staropensource/sosengine/base/logging/placeholders/crashhandler/Stacktrace.java b/base/src/main/java/de/staropensource/sosengine/base/logging/placeholders/crashhandler/Stacktrace.java new file mode 100644 index 00000000..7a030633 --- /dev/null +++ b/base/src/main/java/de/staropensource/sosengine/base/logging/placeholders/crashhandler/Stacktrace.java @@ -0,0 +1,70 @@ +/* + STAROPENSOURCE ENGINE SOURCE FILE + Copyright (c) 2024 The StarOpenSource Engine Contributors + Licensed under the GNU Affero General Public License v3 + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU Affero General Public License as + published by the Free Software Foundation, either version 3 of the + License, or (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU Affero General Public License for more details. + + You should have received a copy of the GNU Affero General Public License + along with this program. If not, see . + */ + +package de.staropensource.sosengine.base.logging.placeholders.crashhandler; + +import de.staropensource.sosengine.base.classes.Placeholder; +import de.staropensource.sosengine.base.utility.StackTraceParser; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +/** + * Implements the {@code stacktrace} placeholder. + * + * @see Placeholder + * @since 1-alpha0 + */ +@SuppressWarnings({ "unused" }) +public class Stacktrace implements Placeholder { + /** + * The {@link Exception} to use. + * + * @since 1-alpha0 + */ + @Nullable + private final Exception exception; + + /** + * Constructor. + * + * @param exception the {@link Exception} to use + * @since 1-alpha0 + */ + public Stacktrace(@Nullable Exception exception) { + this.exception = exception; + } + + /** {@inheritDoc} */ + @Override + public @NotNull String getName() { + return "stacktrace"; + } + + /** {@inheritDoc} */ + @Override + public @NotNull String replace(@NotNull String text) { + if (exception == null) + return text.replace("%" + getName() + "%", "No stacktrace is available."); + else { + StackTraceParser stackTraceParser = new StackTraceParser(exception); + + return text.replace("%" + getName() + "%", stackTraceParser.getHeader() + "\n" + stackTraceParser.getStackTrace()); + } + } +} diff --git a/base/src/main/java/de/staropensource/sosengine/base/logging/placeholders/crashhandler/package-info.java b/base/src/main/java/de/staropensource/sosengine/base/logging/placeholders/crashhandler/package-info.java new file mode 100644 index 00000000..2e2a47a2 --- /dev/null +++ b/base/src/main/java/de/staropensource/sosengine/base/logging/placeholders/crashhandler/package-info.java @@ -0,0 +1,26 @@ +/* + STAROPENSOURCE ENGINE SOURCE FILE + Copyright (c) 2024 The StarOpenSource Engine Contributors + Licensed under the GNU Affero General Public License v3 + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU Affero General Public License as + published by the Free Software Foundation, either version 3 of the + License, or (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU Affero General Public License for more details. + + You should have received a copy of the GNU Affero General Public License + along with this program. If not, see . + */ + +/** + * Contains all placeholders used in the {@link de.staropensource.sosengine.base.logging.CrashHandler}. + * + * @see de.staropensource.sosengine.base.logging.CrashHandler + * @since 1-alpha0 + */ +package de.staropensource.sosengine.base.logging.placeholders.crashhandler; diff --git a/base/src/main/java/de/staropensource/sosengine/base/logging/placeholders/logger/LogClass.java b/base/src/main/java/de/staropensource/sosengine/base/logging/placeholders/logger/LogClass.java new file mode 100644 index 00000000..6fb7e080 --- /dev/null +++ b/base/src/main/java/de/staropensource/sosengine/base/logging/placeholders/logger/LogClass.java @@ -0,0 +1,63 @@ +/* + STAROPENSOURCE ENGINE SOURCE FILE + Copyright (c) 2024 The StarOpenSource Engine Contributors + Licensed under the GNU Affero General Public License v3 + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU Affero General Public License as + published by the Free Software Foundation, either version 3 of the + License, or (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU Affero General Public License for more details. + + You should have received a copy of the GNU Affero General Public License + along with this program. If not, see . + */ + +package de.staropensource.sosengine.base.logging.placeholders.logger; + +import de.staropensource.sosengine.base.classes.Placeholder; +import de.staropensource.sosengine.base.types.LogIssuer; +import org.jetbrains.annotations.NotNull; + +/** + * Implements the {@code log_class} placeholder. + * + * @see Placeholder + * @since 1-alpha0 + */ +@SuppressWarnings({ "unused" }) +public class LogClass implements Placeholder { + /** + * The {@link LogIssuer} to use. + * + * @since 1-alpha0 + */ + @NotNull + private final LogIssuer logIssuer; + + /** + * Constructor. + * + * @param logIssuer the {@link LogIssuer} to use + * @since 1-alpha0 + */ + public LogClass(@NotNull LogIssuer logIssuer) { + this.logIssuer = logIssuer; + } + + /** {@inheritDoc} */ + @Override + public @NotNull String getName() { + return "log_class"; + } + + /** {@inheritDoc} */ + @Override + public @NotNull String replace(@NotNull String text) { + return text.replace("%" + getName() + "%", logIssuer.getClazz().getName().replace(logIssuer.getClazz().getPackageName() + ".", "")); + } +} diff --git a/base/src/main/java/de/staropensource/sosengine/base/logging/placeholders/logger/LogCodePart.java b/base/src/main/java/de/staropensource/sosengine/base/logging/placeholders/logger/LogCodePart.java new file mode 100644 index 00000000..33609e83 --- /dev/null +++ b/base/src/main/java/de/staropensource/sosengine/base/logging/placeholders/logger/LogCodePart.java @@ -0,0 +1,63 @@ +/* + STAROPENSOURCE ENGINE SOURCE FILE + Copyright (c) 2024 The StarOpenSource Engine Contributors + Licensed under the GNU Affero General Public License v3 + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU Affero General Public License as + published by the Free Software Foundation, either version 3 of the + License, or (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU Affero General Public License for more details. + + You should have received a copy of the GNU Affero General Public License + along with this program. If not, see . + */ + +package de.staropensource.sosengine.base.logging.placeholders.logger; + +import de.staropensource.sosengine.base.classes.Placeholder; +import de.staropensource.sosengine.base.types.LogIssuer; +import org.jetbrains.annotations.NotNull; + +/** + * Implements the {@code log_code_part} placeholder. + * + * @see Placeholder + * @since 1-alpha0 + */ +@SuppressWarnings({ "unused" }) +public class LogCodePart implements Placeholder { + /** + * The {@link LogIssuer} to use. + * + * @since 1-alpha0 + */ + @NotNull + private final LogIssuer logIssuer; + + /** + * Constructor. + * + * @param logIssuer the {@link LogIssuer} to use + * @since 1-alpha0 + */ + public LogCodePart(@NotNull LogIssuer logIssuer) { + this.logIssuer = logIssuer; + } + + /** {@inheritDoc} */ + @Override + public @NotNull String getName() { + return "log_code_part"; + } + + /** {@inheritDoc} */ + @Override + public @NotNull String replace(@NotNull String text) { + return text.replace("%" + getName() + "%", logIssuer.getCodePart().name()); + } +} diff --git a/base/src/main/java/de/staropensource/sosengine/base/logging/placeholders/logger/LogColorPrimary.java b/base/src/main/java/de/staropensource/sosengine/base/logging/placeholders/logger/LogColorPrimary.java new file mode 100644 index 00000000..93c8382e --- /dev/null +++ b/base/src/main/java/de/staropensource/sosengine/base/logging/placeholders/logger/LogColorPrimary.java @@ -0,0 +1,74 @@ +/* + STAROPENSOURCE ENGINE SOURCE FILE + Copyright (c) 2024 The StarOpenSource Engine Contributors + Licensed under the GNU Affero General Public License v3 + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU Affero General Public License as + published by the Free Software Foundation, either version 3 of the + License, or (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU Affero General Public License for more details. + + You should have received a copy of the GNU Affero General Public License + along with this program. If not, see . + */ + +package de.staropensource.sosengine.base.logging.placeholders.logger; + +import de.staropensource.sosengine.base.classes.Placeholder; +import de.staropensource.sosengine.base.types.LogLevel; +import org.jetbrains.annotations.NotNull; + +/** + * Implements the {@code log_color_primary} placeholder. + * + * @see Placeholder + * @since 1-alpha0 + */ +@SuppressWarnings({ "unused" }) +public class LogColorPrimary implements Placeholder { + /** + * The {@link LogLevel} to use. + * + * @since 1-alpha0 + */ + @NotNull + private final LogLevel level; + + /** + * Constructor. + * + * @param level the {@link LogLevel} to use + * @since 1-alpha0 + */ + public LogColorPrimary(@NotNull LogLevel level) { + this.level = level; + } + + /** {@inheritDoc} */ + @Override + public @NotNull String getName() { + return "log_color_primary"; + } + + /** {@inheritDoc} */ + @Override + public @NotNull String replace(@NotNull String text) { + String color; + + switch (level) { + case DIAGNOSTIC, VERBOSE -> color = ""; + case SILENT_WARNING, WARNING -> color = ""; + case INFORMATIONAL -> color = ""; + case ERROR -> color = ""; + case CRASH -> color = "You should not be seeing this"; + default -> color = ""; + } + + return text.replace("%" + getName() + "%", color); + } +} diff --git a/base/src/main/java/de/staropensource/sosengine/base/logging/placeholders/logger/LogColorSecondary.java b/base/src/main/java/de/staropensource/sosengine/base/logging/placeholders/logger/LogColorSecondary.java new file mode 100644 index 00000000..d66def0c --- /dev/null +++ b/base/src/main/java/de/staropensource/sosengine/base/logging/placeholders/logger/LogColorSecondary.java @@ -0,0 +1,70 @@ +/* + STAROPENSOURCE ENGINE SOURCE FILE + Copyright (c) 2024 The StarOpenSource Engine Contributors + Licensed under the GNU Affero General Public License v3 + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU Affero General Public License as + published by the Free Software Foundation, either version 3 of the + License, or (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU Affero General Public License for more details. + + You should have received a copy of the GNU Affero General Public License + along with this program. If not, see . + */ + +package de.staropensource.sosengine.base.logging.placeholders.logger; + +import de.staropensource.sosengine.base.classes.Placeholder; +import de.staropensource.sosengine.base.types.LogLevel; +import org.jetbrains.annotations.NotNull; + +/** + * Implements the {@code log_color_secondary} placeholder. + * + * @see Placeholder + * @since 1-alpha0 + */ +@SuppressWarnings({ "unused" }) +public class LogColorSecondary implements Placeholder { + /** + * The {@link LogLevel} to use. + * + * @since 1-alpha0 + */ + @NotNull + private final LogLevel level; + + /** + * Constructor. + * + * @param level the {@link LogLevel} to use + * @since 1-alpha0 + */ + public LogColorSecondary(@NotNull LogLevel level) { + this.level = level; + } + + /** {@inheritDoc} */ + @Override + public @NotNull String getName() { + return "log_color_secondary"; + } + + /** {@inheritDoc} */ + @Override + public @NotNull String replace(@NotNull String text) { + String color; + + switch (level) { + case DIAGNOSTIC, SILENT_WARNING -> color = ""; + default -> color = ""; + } + + return text.replace("%" + getName() + "%", color); + } +} diff --git a/base/src/main/java/de/staropensource/sosengine/base/logging/placeholders/logger/LogInfo.java b/base/src/main/java/de/staropensource/sosengine/base/logging/placeholders/logger/LogInfo.java new file mode 100644 index 00000000..56e21c65 --- /dev/null +++ b/base/src/main/java/de/staropensource/sosengine/base/logging/placeholders/logger/LogInfo.java @@ -0,0 +1,65 @@ +/* + STAROPENSOURCE ENGINE SOURCE FILE + Copyright (c) 2024 The StarOpenSource Engine Contributors + Licensed under the GNU Affero General Public License v3 + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU Affero General Public License as + published by the Free Software Foundation, either version 3 of the + License, or (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU Affero General Public License for more details. + + You should have received a copy of the GNU Affero General Public License + along with this program. If not, see . + */ + +package de.staropensource.sosengine.base.logging.placeholders.logger; + +import de.staropensource.sosengine.base.classes.Placeholder; +import de.staropensource.sosengine.base.types.LogIssuer; +import org.jetbrains.annotations.NotNull; + +/** + * Implements the {@code log_info} placeholder. + * + * @see Placeholder + * @since 1-alpha0 + */ +@SuppressWarnings({ "unused" }) +public class LogInfo implements Placeholder { + /** + * The {@link LogIssuer} to use + * + * @since 1-alpha0 + */ + @NotNull + private final LogIssuer logIssuer; + + /** + * Constructor. + * + * @param logIssuer the {@link LogIssuer} to use + * @since 1-alpha0 + */ + public LogInfo(@NotNull LogIssuer logIssuer) { + this.logIssuer = logIssuer; + } + + /** {@inheritDoc} */ + @Override + public @NotNull String getName() { + return "log_info"; + } + + /** {@inheritDoc} */ + @Override + public @NotNull String replace(@NotNull String text) { + if (logIssuer.getAdditionalInformation() != null) + return text.replace("%" + getName() + "%", "/" + logIssuer.getAdditionalInformation()); + return text.replace("%" + getName() + "%", ""); + } +} diff --git a/base/src/main/java/de/staropensource/sosengine/base/logging/placeholders/logger/LogLevel.java b/base/src/main/java/de/staropensource/sosengine/base/logging/placeholders/logger/LogLevel.java new file mode 100644 index 00000000..7e424cf8 --- /dev/null +++ b/base/src/main/java/de/staropensource/sosengine/base/logging/placeholders/logger/LogLevel.java @@ -0,0 +1,71 @@ +/* + STAROPENSOURCE ENGINE SOURCE FILE + Copyright (c) 2024 The StarOpenSource Engine Contributors + Licensed under the GNU Affero General Public License v3 + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU Affero General Public License as + published by the Free Software Foundation, either version 3 of the + License, or (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU Affero General Public License for more details. + + You should have received a copy of the GNU Affero General Public License + along with this program. If not, see . + */ + +package de.staropensource.sosengine.base.logging.placeholders.logger; + +import de.staropensource.sosengine.base.classes.Placeholder; +import org.jetbrains.annotations.NotNull; + +/** + * Implements the {@code log_level} placeholder. + * + * @see Placeholder + * @since 1-alpha0 + */ +@SuppressWarnings({ "unused" }) +public class LogLevel implements Placeholder { + /** + * The {@link de.staropensource.sosengine.base.types.LogLevel} to use. + * + * @since 1-alpha0 + */ + @NotNull + private final de.staropensource.sosengine.base.types.LogLevel level; + + /** + * Constructor. + * + * @param level the {@link de.staropensource.sosengine.base.types.LogLevel} to use + * @since 1-alpha0 + */ + public LogLevel(@NotNull de.staropensource.sosengine.base.types.LogLevel level) { + this.level = level; + } + + /** {@inheritDoc} */ + @Override + public @NotNull String getName() { + return "log_level"; + } + + /** {@inheritDoc} */ + @Override + public @NotNull String replace(@NotNull String text) { + String levelText; + + switch (level) { + case CRASH -> levelText = "CRSH"; + case ERROR -> levelText = "ERR!"; + case SILENT_WARNING -> levelText = "SARN"; + default -> levelText = level.name().substring(0, 4); + } + + return text.replace("%" + getName() + "%", levelText); + } +} diff --git a/base/src/main/java/de/staropensource/sosengine/base/logging/placeholders/logger/LogMessage.java b/base/src/main/java/de/staropensource/sosengine/base/logging/placeholders/logger/LogMessage.java new file mode 100644 index 00000000..fd972dd5 --- /dev/null +++ b/base/src/main/java/de/staropensource/sosengine/base/logging/placeholders/logger/LogMessage.java @@ -0,0 +1,62 @@ +/* + STAROPENSOURCE ENGINE SOURCE FILE + Copyright (c) 2024 The StarOpenSource Engine Contributors + Licensed under the GNU Affero General Public License v3 + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU Affero General Public License as + published by the Free Software Foundation, either version 3 of the + License, or (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU Affero General Public License for more details. + + You should have received a copy of the GNU Affero General Public License + along with this program. If not, see . + */ + +package de.staropensource.sosengine.base.logging.placeholders.logger; + +import de.staropensource.sosengine.base.classes.Placeholder; +import org.jetbrains.annotations.NotNull; + +/** + * Implements the {@code log_message} placeholder. + * + * @see Placeholder + * @since 1-alpha0 + */ +@SuppressWarnings({ "unused" }) +public class LogMessage implements Placeholder { + /** + * The message to use. + * + * @since 1-alpha0 + */ + @NotNull + private final String message; + + /** + * Constructor. + * + * @param message the message to use + * @since 1-alpha0 + */ + public LogMessage(@NotNull String message) { + this.message = message; + } + + /** {@inheritDoc} */ + @Override + public @NotNull String getName() { + return "log_message"; + } + + /** {@inheritDoc} */ + @Override + public @NotNull String replace(@NotNull String text) { + return text.replace("%" + getName() + "%", message); + } +} diff --git a/base/src/main/java/de/staropensource/sosengine/base/logging/placeholders/logger/LogPackage.java b/base/src/main/java/de/staropensource/sosengine/base/logging/placeholders/logger/LogPackage.java new file mode 100644 index 00000000..8a0698ce --- /dev/null +++ b/base/src/main/java/de/staropensource/sosengine/base/logging/placeholders/logger/LogPackage.java @@ -0,0 +1,63 @@ +/* + STAROPENSOURCE ENGINE SOURCE FILE + Copyright (c) 2024 The StarOpenSource Engine Contributors + Licensed under the GNU Affero General Public License v3 + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU Affero General Public License as + published by the Free Software Foundation, either version 3 of the + License, or (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU Affero General Public License for more details. + + You should have received a copy of the GNU Affero General Public License + along with this program. If not, see . + */ + +package de.staropensource.sosengine.base.logging.placeholders.logger; + +import de.staropensource.sosengine.base.classes.Placeholder; +import de.staropensource.sosengine.base.types.LogIssuer; +import org.jetbrains.annotations.NotNull; + +/** + * Implements the {@code log_package} placeholder. + * + * @see Placeholder + * @since 1-alpha0 + */ +@SuppressWarnings({ "unused" }) +public class LogPackage implements Placeholder { + /** + * The {@link LogIssuer} to use. + * + * @since 1-alpha0 + */ + @NotNull + private final LogIssuer logIssuer; + + /** + * Constructor. + * + * @param logIssuer the {@link LogIssuer} to use + * @since 1-alpha0 + */ + public LogPackage(@NotNull LogIssuer logIssuer) { + this.logIssuer = logIssuer; + } + + /** {@inheritDoc} */ + @Override + public @NotNull String getName() { + return "log_package"; + } + + /** {@inheritDoc} */ + @Override + public @NotNull String replace(@NotNull String text) { + return text.replace("%" + getName() + "%", logIssuer.getClazz().getPackageName()); + } +} diff --git a/base/src/main/java/de/staropensource/sosengine/base/logging/placeholders/logger/LogPath.java b/base/src/main/java/de/staropensource/sosengine/base/logging/placeholders/logger/LogPath.java new file mode 100644 index 00000000..8bb8ea4b --- /dev/null +++ b/base/src/main/java/de/staropensource/sosengine/base/logging/placeholders/logger/LogPath.java @@ -0,0 +1,63 @@ +/* + STAROPENSOURCE ENGINE SOURCE FILE + Copyright (c) 2024 The StarOpenSource Engine Contributors + Licensed under the GNU Affero General Public License v3 + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU Affero General Public License as + published by the Free Software Foundation, either version 3 of the + License, or (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU Affero General Public License for more details. + + You should have received a copy of the GNU Affero General Public License + along with this program. If not, see . + */ + +package de.staropensource.sosengine.base.logging.placeholders.logger; + +import de.staropensource.sosengine.base.classes.Placeholder; +import de.staropensource.sosengine.base.types.LogIssuer; +import org.jetbrains.annotations.NotNull; + +/** + * Implements the {@code log_path} placeholder. + * + * @see Placeholder + * @since 1-alpha0 + */ +@SuppressWarnings({ "unused" }) +public class LogPath implements Placeholder { + /** + * The {@link LogIssuer} to use. + * + * @since 1-alpha0 + */ + @NotNull + private final LogIssuer logIssuer; + + /** + * Constructor. + * + * @param logIssuer the {@link LogIssuer} to use + * @since 1-alpha0 + */ + public LogPath(@NotNull LogIssuer logIssuer) { + this.logIssuer = logIssuer; + } + + /** {@inheritDoc} */ + @Override + public @NotNull String getName() { + return "log_path"; + } + + /** {@inheritDoc} */ + @Override + public @NotNull String replace(@NotNull String text) { + return text.replace("%" + getName() + "%", logIssuer.getClazz().getName()); + } +} diff --git a/base/src/main/java/de/staropensource/sosengine/base/logging/placeholders/logger/package-info.java b/base/src/main/java/de/staropensource/sosengine/base/logging/placeholders/logger/package-info.java new file mode 100644 index 00000000..aaf34196 --- /dev/null +++ b/base/src/main/java/de/staropensource/sosengine/base/logging/placeholders/logger/package-info.java @@ -0,0 +1,26 @@ +/* + STAROPENSOURCE ENGINE SOURCE FILE + Copyright (c) 2024 The StarOpenSource Engine Contributors + Licensed under the GNU Affero General Public License v3 + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU Affero General Public License as + published by the Free Software Foundation, either version 3 of the + License, or (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU Affero General Public License for more details. + + You should have received a copy of the GNU Affero General Public License + along with this program. If not, see . + */ + +/** + * Contains all placeholders used in the {@link de.staropensource.sosengine.base.logging.Logger}. + * + * @see de.staropensource.sosengine.base.logging.Logger + * @since 1-alpha0 + */ +package de.staropensource.sosengine.base.logging.placeholders.logger; diff --git a/base/src/main/java/de/staropensource/sosengine/base/logging/placeholders/package-info.java b/base/src/main/java/de/staropensource/sosengine/base/logging/placeholders/package-info.java new file mode 100644 index 00000000..876e93f2 --- /dev/null +++ b/base/src/main/java/de/staropensource/sosengine/base/logging/placeholders/package-info.java @@ -0,0 +1,26 @@ +/* + STAROPENSOURCE ENGINE SOURCE FILE + Copyright (c) 2024 The StarOpenSource Engine Contributors + Licensed under the GNU Affero General Public License v3 + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU Affero General Public License as + published by the Free Software Foundation, either version 3 of the + License, or (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU Affero General Public License for more details. + + You should have received a copy of the GNU Affero General Public License + along with this program. If not, see . + */ + +/** + * Contains placeholders used by the {@link de.staropensource.sosengine.base.logging.Logger} or {@link de.staropensource.sosengine.base.logging.CrashHandler}. + * + * @see de.staropensource.sosengine.base.logging.Logger + * @see de.staropensource.sosengine.base.logging.CrashHandler + */ +package de.staropensource.sosengine.base.logging.placeholders; diff --git a/base/src/main/java/de/staropensource/sosengine/base/package-info.java b/base/src/main/java/de/staropensource/sosengine/base/package-info.java new file mode 100644 index 00000000..0e01367a --- /dev/null +++ b/base/src/main/java/de/staropensource/sosengine/base/package-info.java @@ -0,0 +1,28 @@ +/* + STAROPENSOURCE ENGINE SOURCE FILE + Copyright (c) 2024 The StarOpenSource Engine Contributors + Licensed under the GNU Affero General Public License v3 + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU Affero General Public License as + published by the Free Software Foundation, either version 3 of the + License, or (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU Affero General Public License for more details. + + You should have received a copy of the GNU Affero General Public License + along with this program. If not, see . + */ + +/** + * Contains the core engine code. + * + * @see de.staropensource.sosengine.base.Engine + * @since v1-alpha0 + * @author jeremystartm <jeremystartm@staropensource.de> + * @since 1-alpha0 + */ +package de.staropensource.sosengine.base; diff --git a/base/src/main/java/de/staropensource/sosengine/base/types/CodePart.java b/base/src/main/java/de/staropensource/sosengine/base/types/CodePart.java new file mode 100644 index 00000000..f7aca07d --- /dev/null +++ b/base/src/main/java/de/staropensource/sosengine/base/types/CodePart.java @@ -0,0 +1,52 @@ +/* + STAROPENSOURCE ENGINE SOURCE FILE + Copyright (c) 2024 The StarOpenSource Engine Contributors + Licensed under the GNU Affero General Public License v3 + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU Affero General Public License as + published by the Free Software Foundation, either version 3 of the + License, or (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU Affero General Public License for more details. + + You should have received a copy of the GNU Affero General Public License + along with this program. If not, see . + */ + +package de.staropensource.sosengine.base.types; + +/** + * Indicates whether the class belongs to the engine, application or modification. + * + * @see LogIssuer + * @see de.staropensource.sosengine.base.logging.Logger + * @see de.staropensource.sosengine.base.logging.CrashHandler + * @since 1-alpha0 + */ +@SuppressWarnings({ "unused" }) +public enum CodePart { + /** + * Indicates that the specified code or class belongs to the sos!engine. + * + * @since 1-alpha0 + */ + ENGINE, + + /** + * Indicates that the specified code or class belongs to the running application. + * + * @since 1-alpha0 + */ + APPLICATION, + + /** + * Indicates that the specified code or class belongs to a modification to the running application. + * + * @since 1-alpha0 + */ + MODIFICATION +} diff --git a/base/src/main/java/de/staropensource/sosengine/base/types/LogIssuer.java b/base/src/main/java/de/staropensource/sosengine/base/types/LogIssuer.java new file mode 100644 index 00000000..b6a2a0aa --- /dev/null +++ b/base/src/main/java/de/staropensource/sosengine/base/types/LogIssuer.java @@ -0,0 +1,127 @@ +/* + STAROPENSOURCE ENGINE SOURCE FILE + Copyright (c) 2024 The StarOpenSource Engine Contributors + Licensed under the GNU Affero General Public License v3 + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU Affero General Public License as + published by the Free Software Foundation, either version 3 of the + License, or (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU Affero General Public License for more details. + + You should have received a copy of the GNU Affero General Public License + along with this program. If not, see . + */ + +package de.staropensource.sosengine.base.types; + +import lombok.Getter; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +/** + * Used for identifying a log message's origin. + * + * @see de.staropensource.sosengine.base.logging.Logger + * @see de.staropensource.sosengine.base.logging.CrashHandler + * @since 1-alpha0 + */ +@SuppressWarnings({ "unused", "JavadocDeclaration", "JavadocBlankLines" }) +@Getter +public class LogIssuer { + /** + * Contains the issuing class. + * + * -- GETTER -- + * Returns the issuing class. + * + * @return the issuing class + * @since 1-alpha0 + */ + @NotNull + private final Class clazz; + + /** + * Contains additional information about the issuer. + * + * -- GETTER -- + * Returns additional information about the issuer. + * + * @return additional information about the issuer + * @since 1-alpha0 + */ + @Nullable + private final String additionalInformation; + + /** + * Indicates whether the class belongs to the engine, application or a modification. + * + * @see CodePart + * + * -- GETTER -- + * Returns the {@link CodePart} that indicates whether the class belongs to the engine, application or a modification. + * + * @return the {@link CodePart} + * @since 1-alpha0 + */ + @NotNull + private final CodePart codePart; + + /** + * Constructor. + * + * @param clazz the issuing class + * @param additionalInformation additional information about the issuer + * @param codePart identifies to which part of the program the class belongs to + * @since 1-alpha0 + */ + public LogIssuer(@NotNull Class clazz, @NotNull String additionalInformation, @NotNull CodePart codePart) { + this.clazz = clazz; + if (additionalInformation.isEmpty()) this.additionalInformation = null; + else this.additionalInformation = additionalInformation; + this.codePart = codePart; + } + + /** + * Constructor. + * + * @param clazz the issuing class + * @param additionalInformation additional information about the issuer + * @since 1-alpha0 + */ + public LogIssuer(@NotNull Class clazz, @NotNull String additionalInformation) { + this.clazz = clazz; + if (additionalInformation.isEmpty()) this.additionalInformation = null; + else this.additionalInformation = additionalInformation; + this.codePart = CodePart.APPLICATION; + } + + /** + * Constructor. + * + * @param clazz the issuing class + * @param codePart identifies to which part of the program the class belongs to + * @since 1-alpha0 + */ + public LogIssuer(@NotNull Class clazz, @NotNull CodePart codePart) { + this.clazz = clazz; + this.additionalInformation = null; + this.codePart = codePart; + } + + /** + * Constructor. + * + * @param clazz the issuing class + * @since 1-alpha0 + */ + public LogIssuer(@NotNull Class clazz) { + this.clazz = clazz; + this.additionalInformation = null; + this.codePart = CodePart.APPLICATION; + } +} diff --git a/base/src/main/java/de/staropensource/sosengine/base/types/LogLevel.java b/base/src/main/java/de/staropensource/sosengine/base/types/LogLevel.java new file mode 100644 index 00000000..c2b20169 --- /dev/null +++ b/base/src/main/java/de/staropensource/sosengine/base/types/LogLevel.java @@ -0,0 +1,78 @@ +/* + STAROPENSOURCE ENGINE SOURCE FILE + Copyright (c) 2024 The StarOpenSource Engine Contributors + Licensed under the GNU Affero General Public License v3 + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU Affero General Public License as + published by the Free Software Foundation, either version 3 of the + License, or (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU Affero General Public License for more details. + + You should have received a copy of the GNU Affero General Public License + along with this program. If not, see . + */ + +package de.staropensource.sosengine.base.types; + +/** + * Used for determining a log message's priority. + * + * @see de.staropensource.sosengine.base.logging.Logger + * @since 1-alpha0 + */ +@SuppressWarnings({ "unused" }) +public enum LogLevel { + /** + * Indicates that the log message is diagnostic and solely provides debugging information. It is not important. + * + * @since 1-alpha0 + */ + DIAGNOSTIC, + + /** + * Indicates that the log message contains more details about some action. It is not important but nice to have. + * + * @since 1-alpha0 + */ + VERBOSE, + + /** + * Indicates that an unimportant warning occurred. + * + * @since 1-alpha0 + */ + SILENT_WARNING, + + /** + * Indicates that the log message provides useful information and is important. + * + * @since 1-alpha0 + */ + INFORMATIONAL, + + /** + * Indicates that an important warning occurred. + * + * @since 1-alpha0 + */ + WARNING, + + /** + * Indicates that a non-fatal error occurred. + * + * @since 1-alpha0 + */ + ERROR, + + /** + * Indicates that a fatal error occurred. + * + * @since 1-alpha0 + */ + CRASH, +} diff --git a/base/src/main/java/de/staropensource/sosengine/base/types/VersionType.java b/base/src/main/java/de/staropensource/sosengine/base/types/VersionType.java new file mode 100644 index 00000000..935fdd06 --- /dev/null +++ b/base/src/main/java/de/staropensource/sosengine/base/types/VersionType.java @@ -0,0 +1,59 @@ +/* + STAROPENSOURCE ENGINE SOURCE FILE + Copyright (c) 2024 The StarOpenSource Engine Contributors + Licensed under the GNU Affero General Public License v3 + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU Affero General Public License as + published by the Free Software Foundation, either version 3 of the + License, or (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU Affero General Public License for more details. + + You should have received a copy of the GNU Affero General Public License + along with this program. If not, see . + */ + +package de.staropensource.sosengine.base.types; + +import de.staropensource.sosengine.base.utility.BuildInfo; + +/** + * Provides all available version types. + * + * @see BuildInfo#getVersioningType() + * @since 1-alpha0 + */ +@SuppressWarnings({ "unused" }) +public enum VersionType { + /** + * Indicates that the next version is in the early stages of development and is highly experimental. Behaviour may break at and time and may contain bugs and issues. + * + * @since 1-alpha0 + */ + ALPHA, + + /** + * Indicates that the next version is in development and is experimental. It may contain bugs and issues. + * + * @since 1-alpha0 + */ + BETA, + + /** + * Indicates that the application is nearing the next release. The application may be stable but needs to be tested before release. + * + * @since 1-alpha0 + */ + RELEASECANDIDATE, + + /** + * Should be used for tested, stable and working builds. + * + * @since 1-alpha0 + */ + RELEASE +} diff --git a/base/src/main/java/de/staropensource/sosengine/base/types/package-info.java b/base/src/main/java/de/staropensource/sosengine/base/types/package-info.java new file mode 100644 index 00000000..dc03e02b --- /dev/null +++ b/base/src/main/java/de/staropensource/sosengine/base/types/package-info.java @@ -0,0 +1,25 @@ +/* + STAROPENSOURCE ENGINE SOURCE FILE + Copyright (c) 2024 The StarOpenSource Engine Contributors + Licensed under the GNU Affero General Public License v3 + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU Affero General Public License as + published by the Free Software Foundation, either version 3 of the + License, or (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU Affero General Public License for more details. + + You should have received a copy of the GNU Affero General Public License + along with this program. If not, see . + */ + +/** + * Contains various data types using {@link java.lang.Enum}s and regular {@code Class}es. + * + * @since 1-alpha0 + */ +package de.staropensource.sosengine.base.types; diff --git a/base/src/main/java/de/staropensource/sosengine/base/utility/BuildInfo.java b/base/src/main/java/de/staropensource/sosengine/base/utility/BuildInfo.java new file mode 100644 index 00000000..60fdf8c2 --- /dev/null +++ b/base/src/main/java/de/staropensource/sosengine/base/utility/BuildInfo.java @@ -0,0 +1,221 @@ +/* + STAROPENSOURCE ENGINE SOURCE FILE + Copyright (c) 2024 The StarOpenSource Engine Contributors + Licensed under the GNU Affero General Public License v3 + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU Affero General Public License as + published by the Free Software Foundation, either version 3 of the + License, or (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU Affero General Public License for more details. + + You should have received a copy of the GNU Affero General Public License + along with this program. If not, see . + */ + +package de.staropensource.sosengine.base.utility; + +import de.staropensource.sosengine.base.logging.LoggerInstance; +import de.staropensource.sosengine.base.types.CodePart; +import de.staropensource.sosengine.base.types.LogIssuer; +import de.staropensource.sosengine.base.types.VersionType; +import lombok.Getter; + +import java.io.IOException; +import java.io.InputStream; +import java.util.Properties; + +/** + * Provides build information about the sos!engine. + */ +@SuppressWarnings({ "unused", "JavadocDeclaration", "JavadocBlankLines" }) +@Getter +public class BuildInfo { + /** + * Instance. + * + * @since 1-alpha0 + * + * -- GETTER -- + * Returns the {@link BuildInfo} instance. + * + * @return {@link BuildInfo} instance + * @since 1-alpha0 + */ + @Getter + private static BuildInfo instance; + + /** + * Provides the engine's version. + * + * @since 1-alpha0 + * + * -- GETTER -- + * Provides the engine's version. + * + * @return engine version + * @since 1-alpha0 + */ + private int versioningVersion; + + /** + * Provides the engine's version type. + * + * @since 1-alpha0 + * + * -- GETTER -- + * Provides the engine's version type. + * + * @return engine version type + * @since 1-alpha0 + */ + private VersionType versioningType; + + /** + * Provides the engine's type release. + * + * @since 1-alpha0 + * + * -- GETTER -- + * Provides the engine's type release. + * + * @return engine type release + * @since 1-alpha0 + */ + private int versioningTyperelease; + + /** + * Provides the engine's fork identifier.
+ * Likely empty. If not, it must be prefixed with a dash. + * + * @since 1-alpha0 + * + * -- GETTER -- + * Provides the engine's fork identifier.
+ * Likely empty. If not, it must be prefixed with a dash. + * + * @return engine fork identifier + * @since 1-alpha0 + */ + private String versioningFork; + + + /** + * Provides the version of the dependency {@code Lombok}. + * + * @since 1-alpha0 + * + * -- GETTER -- + * Provides the version of the dependency {@code Lombok}. + * + * @return Lombok dependency version + * @since 1-alpha0 + */ + private String dependencyLombok; + + /** + * Provides the version of the dependency {@code Jetbrains Annotations}. + * + * @since 1-alpha0 + * + * -- GETTER -- + * Provides the version of the dependency {@code Jetbrains Annotations}. + * + * @return Jetbrains Annotations dependency version + * @since 1-alpha0 + */ + private String dependencyJetbrainsAnnotations; + + /** + * Provides the version of the dependency {@code Jansi}. + * + * @since 1-alpha0 + * + * -- GETTER -- + * Provides the version of the dependency {@code Jansi}. + * + * @return Jansi dependency version + * @since 1-alpha0 + */ + private String dependencyJansi; + + /** + * Provides the version of the Gradle plugin {@code Shadow}. + * + * @since 1-alpha0 + * + * -- GETTER -- + * Provides the version of the Gradle plugin {@code Shadow}. + * + * @return Shadow plugin version + * @since 1-alpha0 + */ + private String pluginShadow; + + /** + * Provides the version of the Gradle plugin {@code Lombok}. + * + * @since 1-alpha0 + * + * -- GETTER -- + * Provides the version of the Gradle plugin {@code Lombok}. + * + * @return Lombok plugin version + * @since 1-alpha0 + */ + private String pluginLombok; + + /** + * Constructor. + * + * @since 1-alpha0 + */ + public BuildInfo() { + LoggerInstance logger = new LoggerInstance(new LogIssuer(getClass(), CodePart.ENGINE)); + + // Only allow one instance + if (instance == null) + instance = this; + else { + logger.crash("Tried reinitializing " + getClass().getName() + " twice"); + return; + } + + // Load properties from gradle.properties + Properties properties = new Properties(); + InputStream inputStream = this.getClass().getClassLoader().getResourceAsStream("gradle.properties"); + + if (inputStream == null) { + logger.crash("Unable to load build information: InputStream is null"); + return; + } + + try { + properties.load(inputStream); + inputStream.close(); + } catch (IOException exception) { + logger.crash("Unable to load build information: InputStream failed", exception); + return; + } + + // Create new PropertyParser + PropertyParser parser = new PropertyParser(properties); + + // Apply properties to fields + versioningVersion = parser.getInteger("versioningVersion", true); + versioningType = VersionType.valueOf(parser.getString("versioningType").toUpperCase()); + versioningTyperelease = parser.getInteger("versioningTyperelease", true); + versioningFork = parser.getString("versioningFork"); + + dependencyLombok = parser.getString("dependencyLombok"); + dependencyJetbrainsAnnotations = parser.getString("dependencyJetbrainsAnnotations"); + dependencyJansi = parser.getString("dependencyJansi"); + + pluginShadow = parser.getString("pluginShadow"); + pluginLombok = parser.getString("pluginLombok"); + } +} diff --git a/base/src/main/java/de/staropensource/sosengine/base/utility/JvmInformation.java b/base/src/main/java/de/staropensource/sosengine/base/utility/JvmInformation.java new file mode 100644 index 00000000..7cd95a26 --- /dev/null +++ b/base/src/main/java/de/staropensource/sosengine/base/utility/JvmInformation.java @@ -0,0 +1,105 @@ +/* + STAROPENSOURCE ENGINE SOURCE FILE + Copyright (c) 2024 The StarOpenSource Engine Contributors + Licensed under the GNU Affero General Public License v3 + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU Affero General Public License as + published by the Free Software Foundation, either version 3 of the + License, or (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU Affero General Public License for more details. + + You should have received a copy of the GNU Affero General Public License + along with this program. If not, see . + */ + +package de.staropensource.sosengine.base.utility; + +import java.lang.management.ManagementFactory; +import java.util.List; + +/** + * Provides information about the running Java Virtual Machine. + */ +@SuppressWarnings({ "unused" }) +public class JvmInformation { + /** + * Constructor. + * + * @since 1-alpha0 + */ + public JvmInformation() {} + + /** + * Returns the Java version this JVM implements. + * + * @return the Java version + * @since 1-alpha0 + */ + public static int getJavaVersion() { + String version = System.getProperty("java.version"); + + if (version.startsWith("1.")) + version = version.substring(2, 3); + else { + if (version.contains(".")) + version = version.substring(0, version.indexOf(".")); + } + + return Integer.parseInt(version); + } + + /** + * Returns the JVM implementation name. + * + * @return the JVM implementation name + * @since 1-alpha0 + */ + public static String getImplementationName() { + return ManagementFactory.getRuntimeMXBean().getVmName(); + } + + /** + * Returns the JVM implementation version. + * + * @return the JVM implementation version + * @since 1-alpha0 + */ + public static String getImplementationVersion() { + return ManagementFactory.getRuntimeMXBean().getVmVersion(); + } + + /** + * Returns the JVM implementation vendor. + * + * @return the JVM implementation vendor + * @since 1-alpha0 + */ + public static String getImplementationVendor() { + return ManagementFactory.getRuntimeMXBean().getVmVendor(); + } + + /** + * Returns the uptime of the JVM. + * + * @return uptime in milliseconds + * @since 1-alpha0 + */ + public static long getUptime() { + return ManagementFactory.getRuntimeMXBean().getUptime(); + } + + /** + * Returns the arguments passed to the JVM (not to the running program). + * + * @return the JVM arguments + * @since 1-alpha0 + */ + public static List getArguments() { + return ManagementFactory.getRuntimeMXBean().getInputArguments(); + } +} diff --git a/base/src/main/java/de/staropensource/sosengine/base/utility/Miscellaneous.java b/base/src/main/java/de/staropensource/sosengine/base/utility/Miscellaneous.java new file mode 100644 index 00000000..c9ac276a --- /dev/null +++ b/base/src/main/java/de/staropensource/sosengine/base/utility/Miscellaneous.java @@ -0,0 +1,50 @@ +/* + STAROPENSOURCE ENGINE SOURCE FILE + Copyright (c) 2024 The StarOpenSource Engine Contributors + Licensed under the GNU Affero General Public License v3 + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU Affero General Public License as + published by the Free Software Foundation, either version 3 of the + License, or (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU Affero General Public License for more details. + + You should have received a copy of the GNU Affero General Public License + along with this program. If not, see . + */ + +package de.staropensource.sosengine.base.utility; + +import org.jetbrains.annotations.NotNull; + +/** + * Contains smaller functions that don't fit into other utility classes. + * + * @since 1-alpha0 + */ +@SuppressWarnings({ "unused" }) +public class Miscellaneous { + /** + * Constructor. + * + * @since 1-alpha0 + */ + public Miscellaneous() {} + + /** + * Adds padding zeros to a number. + * + * @param number number + * @param length length + * @return the padded number + * @since 1-alpha0 + */ + @NotNull + public static String padNumbers(long number, int length) { + return String.format("%0" + length + "d", number); + } +} diff --git a/base/src/main/java/de/staropensource/sosengine/base/utility/PlaceholderEngine.java b/base/src/main/java/de/staropensource/sosengine/base/utility/PlaceholderEngine.java new file mode 100644 index 00000000..2df13f51 --- /dev/null +++ b/base/src/main/java/de/staropensource/sosengine/base/utility/PlaceholderEngine.java @@ -0,0 +1,152 @@ +/* + STAROPENSOURCE ENGINE SOURCE FILE + Copyright (c) 2024 The StarOpenSource Engine Contributors + Licensed under the GNU Affero General Public License v3 + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU Affero General Public License as + published by the Free Software Foundation, either version 3 of the + License, or (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU Affero General Public License for more details. + + You should have received a copy of the GNU Affero General Public License + along with this program. If not, see . + */ + +package de.staropensource.sosengine.base.utility; + +import de.staropensource.sosengine.base.classes.Placeholder; +import de.staropensource.sosengine.base.data.placeholders.*; +import de.staropensource.sosengine.base.logging.Logger; +import de.staropensource.sosengine.base.types.CodePart; +import de.staropensource.sosengine.base.types.LogIssuer; +import lombok.Getter; +import org.jetbrains.annotations.NotNull; + +import java.util.ArrayList; +import java.util.List; + +/** + * A modular and extensible placeholder engine. + * + * @see Placeholder + * @since 1-alpha0 + */ +@SuppressWarnings({ "unused", "JavadocDeclaration", "JavadocBlankLines" }) +public class PlaceholderEngine { + /** + * Instance. + * + * @since 1-alpha0 + * + * -- GETTER -- + * Returns the {@link PlaceholderEngine} instance. + * + * @return {@link PlaceholderEngine} instance + * @since 1-alpha0 + */ + @Getter + private static PlaceholderEngine instance; + + /** + * Contains all global placeholders. + * + * @see Placeholder + * @since 1-alpha0 + * -- GETTER -- + * Returns the list containing all global placeholders. + * + * @return list of all global placeholders + * @since 1-alpha0 + */ + @SuppressWarnings("FieldMayBeFinal") + @Getter + @NotNull + private List placeholders = new ArrayList<>(); + + /** + * Constructor. + * + * @since 1-alpha0 + */ + public PlaceholderEngine() { + // Only allow one instance + if (instance == null) + instance = this; + else { + Logger.crash(new LogIssuer(getClass(), CodePart.ENGINE), "Tried reinitializing " + getClass().getName() + " twice"); + return; + } + + // Add default placeholders. + // date_* + placeholders.add(new DateDay()); + placeholders.add(new DateMonth()); + placeholders.add(new DateYear()); + // engine_dependency_* + placeholders.add(new EngineDependencyLombok()); + placeholders.add(new EngineDependencyJetbrainsAnnotations()); + placeholders.add(new EngineDependencyJansi()); + // engine_plugin_* + placeholders.add(new EnginePluginLombok()); + placeholders.add(new EnginePluginShadow()); + // engine_version* + placeholders.add(new EngineVersion()); + placeholders.add(new EngineVersionVersion()); + placeholders.add(new EngineVersionType()); + placeholders.add(new EngineVersionTyperelease()); + placeholders.add(new EngineVersionFork()); + // jvm_* + placeholders.add(new JvmArguments()); + placeholders.add(new JvmVersion()); + // jvm_implementation_* + placeholders.add(new JvmImplementationName()); + placeholders.add(new JvmImplementationVendor()); + placeholders.add(new JvmImplementationVersion()); + // time_* + placeholders.add(new TimeEpoch()); + placeholders.add(new TimeHour()); + placeholders.add(new TimeMinute()); + placeholders.add(new TimeSecond()); + placeholders.add(new TimeZone()); + } + + /** + * Process all placeholders for a given {@code text}. + * + * @param text the text to process + * @param temporaryPlaceholders placeholders to process only for this run + * @return the processed text + * @since 1-alpha0 + */ + @NotNull + public String process(@NotNull String text, List temporaryPlaceholders) { + // Process temporary placeholders + for (Placeholder temporaryPlaceholder : temporaryPlaceholders) + if (text.contains("%" + temporaryPlaceholder.getName() + "%")) + text = temporaryPlaceholder.replace(text); + + // Process normal placeholders + for (Placeholder placeholder : placeholders) + if (text.contains("%" + placeholder.getName() + "%")) + text = placeholder.replace(text); + + return text; + } + + /** + * Process all placeholders for a given {@code text}. + * + * @param text the text to process + * @return the processed text + * @since 1-alpha0 + */ + @NotNull + public String process(@NotNull String text) { + return process(text, new ArrayList<>()); + } +} diff --git a/base/src/main/java/de/staropensource/sosengine/base/utility/PropertyParser.java b/base/src/main/java/de/staropensource/sosengine/base/utility/PropertyParser.java new file mode 100644 index 00000000..cdac7083 --- /dev/null +++ b/base/src/main/java/de/staropensource/sosengine/base/utility/PropertyParser.java @@ -0,0 +1,295 @@ +/* + STAROPENSOURCE ENGINE SOURCE FILE + Copyright (c) 2024 The StarOpenSource Engine Contributors + Licensed under the GNU Affero General Public License v3 + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU Affero General Public License as + published by the Free Software Foundation, either version 3 of the + License, or (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU Affero General Public License for more details. + + You should have received a copy of the GNU Affero General Public License + along with this program. If not, see . + */ + +package de.staropensource.sosengine.base.utility; + +import de.staropensource.sosengine.base.logging.LoggerInstance; +import de.staropensource.sosengine.base.types.LogIssuer; +import lombok.Getter; +import org.jetbrains.annotations.NotNull; + +import java.util.Properties; + +/** + * Allows parsing various data types against a set of {@link Properties}. + * + * @see Properties + * @since 1-alpha0 + */ +@SuppressWarnings({ "unused", "JavadocDeclaration" }) +@NotNull +public final class PropertyParser { + /** + * Instance providing access to the JVM-wide properties. + * + * @see System#getProperties() + * @since 1-alpha0 + * + * -- GETTER -- + * Returns a {@link Properties} instance providing access to the JVM-wide properties. + * + * @return {@link Properties} using the JVM-wide properties + * @see System#getProperties() + * @since 1-alpha0 + */ + @NotNull + @Getter + private static final PropertyParser instance = new PropertyParser(System.getProperties()); + /** + * The {@link Properties} in use by this instance. + * + * @see Properties + * @since 1-alpha0 + * + * -- GETTER -- + * Returns the {@link Properties} in use by this instance. + * + * @return the {@link Properties} in use by this instance + * @see Properties + * @since 1-alpha0 + */ + @Getter + private final @NotNull Properties properties; + + + /** + * Logger instance, + * + * @see LoggerInstance + * @since 1-alpha0 + */ + @NotNull + private final LoggerInstance logger; + + /** + * Constructor. + * + * @param properties the {@link Properties} to use + * @since 1-alpha0 + */ + public PropertyParser(@NotNull Properties properties) { + this.properties = properties; + this.logger = new LoggerInstance(new LogIssuer(getClass(), String.valueOf(properties.hashCode()))); + } + + /** + * Just returns the property value. + * + * @param name the property name + * @return a {@link String} + * @throws NullPointerException if the specified property does not exist + * @see String + * @since 1-alpha0 + */ + @NotNull + public String getString(@NotNull String name) throws NullPointerException { + if (properties.getProperty(name) == null) { + logger.sarn("Unable to get String from property '" + name + "': Property does not exist"); + throw new NullPointerException("Unable to get String from property '" + name + "': Property does not exist"); + } + return properties.getProperty(name); + } + + /** + * Parses a property as a {@link Boolean}. + * + * @param name the property name + * @return a {@link Boolean} + * @throws NullPointerException if the specified property does not exist + * @see Boolean + * @since 1-alpha0 + */ + @NotNull + public Boolean getBoolean(@NotNull String name) { + if (properties.getProperty(name) == null) { + logger.sarn("Unable to get Boolean from property '" + name + "': Property does not exist"); + throw new NullPointerException("Unable to get Boolean from property '" + name + "': Property does not exist"); + } + + switch (properties.getProperty(name)) { + case "1", "true", "yes", "y" -> { + return Boolean.TRUE; + } + case null, default -> { + return Boolean.FALSE; + } + } + } + + /** + * Parses a property as a {@link Byte}. + * + * @param name the property name + * @return a {@link Byte} + * @throws NullPointerException if the specified property does not exist + * @throws NumberFormatException if the specified property cannot be parsed as a {@link Byte} + * @see Byte + * @since 1-alpha0 + */ + @NotNull + public Byte getByte(@NotNull String name) throws NullPointerException, NumberFormatException { + if (properties.getProperty(name) == null) { + logger.sarn("Unable to get Byte from property '" + name + "': Property does not exist"); + throw new NullPointerException("Unable to get Byte from property '" + name + "': Property does not exist"); + } + + try { + return Byte.parseByte(properties.getProperty(name)); + } catch (NumberFormatException exception) { + logger.sarn("Unable to get Byte from property '" + name + "': String cannot be parsed as a Byte."); + throw exception; + } + } + + /** + * Parses a property as a {@link Short}. + * + * @param name the property name + * @return a {@link Short} + * @throws NullPointerException if the specified property does not exist + * @throws NumberFormatException if the specified property cannot be parsed as a {@link Short} + * @see Short + * @since 1-alpha0 + */ + @NotNull + public Short getShort(@NotNull String name) throws NumberFormatException { + if (properties.getProperty(name) == null) { + logger.sarn("Unable to get Short from property '" + name + "': Property does not exist"); + throw new NullPointerException("Unable to get Short from property '" + name + "': Property does not exist"); + } + + try { + return Short.parseShort(properties.getProperty(name)); + } catch (NumberFormatException exception) { + logger.sarn("Unable to get Short from property '" + name + "': String cannot be parsed as a Short."); + throw exception; + } + } + + /** + * Parses a property as an {@link Integer}. + * + * @param name the property name + * @param unsigned determines if the {@link Integer} is unsigned + * @return an {@link Integer} + * @throws NullPointerException if the specified property does not exist + * @throws NumberFormatException if the specified property cannot be parsed as an {@link Integer} + * @see Integer + * @since 1-alpha0 + */ + @NotNull + public Integer getInteger(@NotNull String name, boolean unsigned) throws NumberFormatException { + if (properties.getProperty(name) == null) { + logger.sarn("Unable to get Integer from property '" + name + "': Property does not exist"); + throw new NullPointerException("Unable to get Integer from property '" + name + "': Property does not exist"); + } + + try { + if (unsigned) + return Integer.parseUnsignedInt(properties.getProperty(name)); + else + return Integer.parseInt(properties.getProperty(name)); + } catch (NumberFormatException exception) { + logger.sarn("Unable to get Integer from property '" + name + "': String cannot be parsed as an Integer."); + throw exception; + } + } + + /** + * Parses a property as a {@link Long}. + * + * @param name the property name + * @param unsigned determines if the {@link Long} is unsigned + * @return a {@link Long} + * @throws NullPointerException if the specified property does not exist + * @throws NumberFormatException if the specified property cannot be parsed as an {@link Long} + * @see Long + * @since 1-alpha0 + */ + @NotNull + public Long getLong(@NotNull String name, boolean unsigned) throws NumberFormatException { + if (properties.getProperty(name) == null) { + logger.sarn("Unable to get Long from property '" + name + "': Property does not exist"); + throw new NullPointerException("Unable to get Long from property '" + name + "': Property does not exist"); + } + + try { + if (unsigned) + return Long.parseUnsignedLong(properties.getProperty(name)); + else + return Long.parseLong(properties.getProperty(name)); + } catch (NumberFormatException exception) { + logger.sarn("Unable to get Long from property '" + name + "': String cannot be parsed as a Long."); + throw exception; + } + } + + /** + * Parses a property as a {@link Float}. + * + * @param name the property name + * @return a {@link Float} + * @throws NullPointerException if the specified property does not exist + * @throws NumberFormatException if the specified property cannot be parsed as an {@link Float} + * @see Float + * @since 1-alpha0 + */ + @NotNull + public Float getFloat(@NotNull String name) throws NullPointerException, NumberFormatException { + if (properties.getProperty(name) == null) { + logger.sarn("Unable to get Float from property '" + name + "': Property does not exist"); + throw new NullPointerException("Unable to get Float from property '" + name + "': Property does not exist"); + } + + try { + return Float.parseFloat(properties.getProperty(name)); + } catch (NumberFormatException exception) { + logger.sarn("Unable to get Float from property '" + name + "': String cannot be parsed as a Float."); + throw exception; + } + } + + /** + * Parses a property as a {@link Double}. + * + * @param name the property name + * @return a {@link Double} + * @throws NullPointerException if the specified property does not exist + * @throws NumberFormatException if the specified property cannot be parsed as an {@link Double} + * @see Double + * @since 1-alpha0 + */ + @NotNull + public Double getDouble(@NotNull String name) throws NullPointerException, NumberFormatException { + if (properties.getProperty(name) == null) { + logger.sarn("Unable to get Double from property '" + name + "': Property does not exist"); + throw new NullPointerException("Unable to get Double from property '" + name + "': Property does not exist"); + } + + try { + return Double.parseDouble(properties.getProperty(name)); + } catch (NullPointerException exception) { + logger.sarn("Unable to get Double from property '" + name + "': String is null."); + throw exception; + } catch (NumberFormatException exception) { + logger.sarn("Unable to get Double from property '" + name + "': String cannot be parsed as a Double."); + throw exception; + } + } +} diff --git a/base/src/main/java/de/staropensource/sosengine/base/utility/ShortcodeConverter.java b/base/src/main/java/de/staropensource/sosengine/base/utility/ShortcodeConverter.java new file mode 100644 index 00000000..5bbf0a6c --- /dev/null +++ b/base/src/main/java/de/staropensource/sosengine/base/utility/ShortcodeConverter.java @@ -0,0 +1,255 @@ +/* + STAROPENSOURCE ENGINE SOURCE FILE + Copyright (c) 2024 The StarOpenSource Engine Contributors + Licensed under the GNU Affero General Public License v3 + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU Affero General Public License as + published by the Free Software Foundation, either version 3 of the + License, or (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU Affero General Public License for more details. + + You should have received a copy of the GNU Affero General Public License + along with this program. If not, see . + */ + +package de.staropensource.sosengine.base.utility; + +import de.staropensource.sosengine.base.EngineConfiguration; +import de.staropensource.sosengine.base.logging.Logger; +import de.staropensource.sosengine.base.logging.LoggerInstance; +import de.staropensource.sosengine.base.types.CodePart; +import de.staropensource.sosengine.base.types.LogIssuer; +import lombok.Getter; +import org.fusesource.jansi.Ansi; +import org.jetbrains.annotations.NotNull; + +/** + * Converts shortcodes like {@code } or {@code } into ANSI escape sequences.
+ * The following shortcodes are supported: {@code fg:, bg:, attr:, bold, italic, strikethrough, underline, blink, italic} + * + * @see Ansi + * @see Ansi.Color + * @see Ansi.Attribute + * @since 1-alpha0 + */ +@SuppressWarnings({ "unused", "JavadocDeclaration", "JavadocBlankLines" }) +public class ShortcodeConverter { + /** + * Instance. + * + * @since 1-alpha0 + * + * -- GETTER -- + * Returns the {@link ShortcodeConverter} instance. + * + * @return {@link ShortcodeConverter} instance + * @since 1-alpha0 + */ + @Getter + private static ShortcodeConverter instance; + + /** + * Logger instance. + * + * @see LoggerInstance + * @since 1-alpha0 + */ + private final LoggerInstance logger = new LoggerInstance(new LogIssuer(getClass())); + + /** + * Constructor. + * + * @since 1-alpha0 + */ + public ShortcodeConverter() { + // Only allow one instance + if (instance == null) + instance = this; + else { + Logger.crash(new LogIssuer(getClass(), CodePart.ENGINE), "Tried reinitializing " + getClass().getName() + " twice"); + } + } + + /** + * Converts shortcodes into ANSI escape sequences. + * + * @param text the text to process + * @param noErrors prevents printing tag/shortcode errors, overrides the engine configuration setting + * @return {@link Ansi} sequence + * @see EngineConfiguration#isErrorShortcodeConverter() + * @since 1-alpha0 + */ + @NotNull + public Ansi process(@NotNull String text, boolean noErrors) { + Ansi ansi = Ansi.ansi(); + boolean tagActive = false; + String part = ""; + + for (char character : text.toCharArray()) { + if (tagActive) { + if (character == '>') { + tagActive = false; + + // fg:* + if (part.startsWith("fg:")) { + // Print debug message + if (EngineConfiguration.getInstance().isDebugShortcodeConverter()) + try { + System.out.println("SCC textHash=" + text.hashCode() + " tag=fg data=" + part.substring(3).toUpperCase() + " enum=" + Ansi.Color.valueOf(part.substring(3).toUpperCase())); + } catch (IllegalArgumentException ignored) { + System.out.println("SCC textHash=" + text.hashCode() + " tag=fg data=" + part.substring(3).toUpperCase() + " enum="); + } + + // Convert text to 'Color' value and insert it on the foreground + try { + ansi.fg(Ansi.Color.valueOf(part.substring(3).toUpperCase())); + } catch (IllegalArgumentException ignored) {} + } + + // bg:* + else if (part.startsWith("bg:")) { + // Print debug message + if (EngineConfiguration.getInstance().isDebugShortcodeConverter()) + try { + System.out.println("SCC textHash=" + text.hashCode() + " tag=bg data=" + part.substring(3).toUpperCase() + " enum=" + Ansi.Color.valueOf(part.substring(3).toUpperCase())); + } catch (IllegalArgumentException ignored) { + System.out.println("SCC textHash=" + text.hashCode() + " tag=bg data=" + part.substring(3).toUpperCase() + " enum="); + } + + // Convert text to 'Color' value and insert it on the background + try { + ansi.bg(Ansi.Color.valueOf(part.substring(3).toUpperCase())); + } catch (IllegalArgumentException ignored) {} + } + + // attr:* + else if (part.startsWith("attr:")) { + // Print debug message + if (EngineConfiguration.getInstance().isDebugShortcodeConverter()) + try { + System.out.println("SCC textHash=" + text.hashCode() + " tag=attr data=" + part.substring(3).toUpperCase() + " enum=" + Ansi.Attribute.valueOf(part.substring(3).toUpperCase())); + } catch (IllegalArgumentException ignored) { + System.out.println("SCC textHash=" + text.hashCode() + " tag=attr data=" + part.substring(3).toUpperCase() + " enum="); + } + + // Convert text into 'Attribute' value and insert it + try { + ansi.a(Ansi.Attribute.valueOf(part.substring(3).toUpperCase())); + } catch (IllegalArgumentException ignored) {} + } + + // bold + else if (part.equals("bold")) { + // Print debug message + if (EngineConfiguration.getInstance().isDebugShortcodeConverter()) + System.out.println("SCC textHash=" + text.hashCode() + " tag=bold"); + + // Insert attribute + ansi.a(Ansi.Attribute.INTENSITY_BOLD); + } + + // italic + else if (part.equals("italic")) { + // Print debug message + if (EngineConfiguration.getInstance().isDebugShortcodeConverter()) + System.out.println("SCC textHash=" + text.hashCode() + " tag=italic"); + + // Insert attribute + ansi.a(Ansi.Attribute.ITALIC); + } + + // strikethrough + else if (part.equals("strikethrough")) { + // Print debug message + if (EngineConfiguration.getInstance().isDebugShortcodeConverter()) + System.out.println("SCC textHash=" + text.hashCode() + " tag=strikethrough"); + + // Insert attribute + ansi.a(Ansi.Attribute.STRIKETHROUGH_ON); + } + + // underline + else if (part.equals("underline")) { + // Print debug message + if (EngineConfiguration.getInstance().isDebugShortcodeConverter()) + System.out.println("SCC textHash=" + text.hashCode() + " tag=underline"); + + // Insert attribute + ansi.a(Ansi.Attribute.UNDERLINE); + } + + // blink + else if (part.equals("blink")) { + // Print debug message + if (EngineConfiguration.getInstance().isDebugShortcodeConverter()) + System.out.println("SCC textHash=" + text.hashCode() + " tag=blink"); + + // Insert attribute + ansi.a(Ansi.Attribute.BLINK_SLOW); + } + + // reset + else if (part.equals("reset")) { + // Print debug message + if (EngineConfiguration.getInstance().isDebugShortcodeConverter()) + System.out.println("SCC textHash=" + text.hashCode() + " tag=reset"); + + // Insert reset + ansi.reset(); + } + + // error case + else { + // Complain about invalid shortcode + if (EngineConfiguration.getInstance().isErrorShortcodeConverter()) + logger.sarn("Invalid shortcode: " + part); + + // Convert tag regular text + ansi.a("<" + part + ">"); + } + + // Reset part + part = ""; + } else + // Add character to part + //noinspection StringConcatenationInLoop // It bloats the code to do it with StringBuilder + part += character; + } else { + // Detect if character is start of tag + if (character == '<') { + // Insert previous text + ansi.a(part); + + // Prepare variables + part = ""; + tagActive = true; + } else + // Add character to part + //noinspection StringConcatenationInLoop // It bloats the code to do it with StringBuilder + part += character; + } + } + + // Insert remaining characters + ansi.a(part); + + return ansi; + } + + /** + * Converts shortcodes into ANSI escape sequences. + * + * @param text the text to process + * @return {@link Ansi} sequence + * @since 1-alpha0 + */ + @NotNull + public Ansi process(@NotNull String text) { + return process(text, false); + } +} diff --git a/base/src/main/java/de/staropensource/sosengine/base/utility/StackTraceParser.java b/base/src/main/java/de/staropensource/sosengine/base/utility/StackTraceParser.java new file mode 100644 index 00000000..bad06e62 --- /dev/null +++ b/base/src/main/java/de/staropensource/sosengine/base/utility/StackTraceParser.java @@ -0,0 +1,80 @@ +/* + STAROPENSOURCE ENGINE SOURCE FILE + Copyright (c) 2024 The StarOpenSource Engine Contributors + Licensed under the GNU Affero General Public License v3 + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU Affero General Public License as + published by the Free Software Foundation, either version 3 of the + License, or (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU Affero General Public License for more details. + + You should have received a copy of the GNU Affero General Public License + along with this program. If not, see . + */ + +package de.staropensource.sosengine.base.utility; + +import org.jetbrains.annotations.NotNull; + +/** + * Parses the {@link StackTraceElement}s of an {@link Exception} for use in {@link String}. + * + * @see Exception + * @since 1-alpha0 + */ +@SuppressWarnings({ "unused" }) +public final class StackTraceParser { + /** + * The exception to use. + * + * @see Exception + * @since 1-alpha0 + */ + private final @NotNull Exception exception; + + /** + * Constructor. + * + * @param exception the exception to use + * @since 1-alpha0 + */ + public StackTraceParser(@NotNull Exception exception) { + this.exception = exception; + } + + /** + * Returns the stack trace header.
+ * It looks like this: {@code Caused by java.lang.NullPointerException: This application can crash!} + * + * @return the stack trace header + * @since 1-alpha0 + */ + public String getHeader() { + if (exception.getMessage() == null) + return "Caused by: " + exception.getClass().getName(); + else + return "Caused by: " + exception.getClass().getName() + ": " + exception.getMessage(); + } + + /** + * Returns the stack trace. + * + * @return the stack trace + * @since 1-alpha0 + */ + public String getStackTrace() { + StringBuilder output = new StringBuilder(); + + for (StackTraceElement element : exception.getStackTrace()) { + if (!output.isEmpty()) output.append("\n"); + output.append("\tat ").append(element.toString()); + } + + return output.toString(); + } +} diff --git a/base/src/main/java/de/staropensource/sosengine/base/utility/package-info.java b/base/src/main/java/de/staropensource/sosengine/base/utility/package-info.java new file mode 100644 index 00000000..ed40aecd --- /dev/null +++ b/base/src/main/java/de/staropensource/sosengine/base/utility/package-info.java @@ -0,0 +1,26 @@ +/* + STAROPENSOURCE ENGINE SOURCE FILE + Copyright (c) 2024 The StarOpenSource Engine Contributors + Licensed under the GNU Affero General Public License v3 + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU Affero General Public License as + published by the Free Software Foundation, either version 3 of the + License, or (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU Affero General Public License for more details. + + You should have received a copy of the GNU Affero General Public License + along with this program. If not, see . + */ + +/** + * Provides various utility classes specifically made for one task. + * + * @see de.staropensource.sosengine.base.utility.Miscellaneous + * @since 1-alpha0 + */ +package de.staropensource.sosengine.base.utility; diff --git a/base/src/main/java/de/staropensource/sosengine/package-info.java b/base/src/main/java/de/staropensource/sosengine/package-info.java new file mode 100644 index 00000000..9a602167 --- /dev/null +++ b/base/src/main/java/de/staropensource/sosengine/package-info.java @@ -0,0 +1,25 @@ +/* + STAROPENSOURCE ENGINE SOURCE FILE + Copyright (c) 2024 The StarOpenSource Engine Contributors + Licensed under the GNU Affero General Public License v3 + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU Affero General Public License as + published by the Free Software Foundation, either version 3 of the + License, or (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU Affero General Public License for more details. + + You should have received a copy of the GNU Affero General Public License + along with this program. If not, see . + */ + +/** + * Contains the code for the sos!engine, it's subsystems as well as official modules. + * + * @since 1-alpha0 + */ +package de.staropensource.sosengine; diff --git a/base/src/main/javadoc/overview.html b/base/src/main/javadoc/overview.html new file mode 100644 index 00000000..bda59c5c --- /dev/null +++ b/base/src/main/javadoc/overview.html @@ -0,0 +1,30 @@ + + +

Welcome to the sos!engine documentation!
+ You are currently in the documentation for the base subsystem, the core of the engine.

+

The most interesting parts for developers wanting to use the engine are:

+
    +
  • {@link de.staropensource.sosengine.base.Engine} (main engine object)
  • +
  • {@link de.staropensource.sosengine.base.EngineConfiguration} (engine configuration)
  • +
  • stuff in {@link de.staropensource.sosengine.base.utility}
  • +
  • {@link de.staropensource.sosengine.base.classes.Placeholder} (for implementing custom placeholders)
  • +
  • {@link de.staropensource.sosengine.base.utility.PlaceholderEngine} (for adding those custom placeholders)
  • +
+ diff --git a/base/src/main/resources/gradle.properties b/base/src/main/resources/gradle.properties new file mode 120000 index 00000000..bc5f9c2e --- /dev/null +++ b/base/src/main/resources/gradle.properties @@ -0,0 +1 @@ +../../../../gradle.properties \ No newline at end of file diff --git a/gradle.properties b/gradle.properties new file mode 100644 index 00000000..281ae35a --- /dev/null +++ b/gradle.properties @@ -0,0 +1,17 @@ +# Versioning +versioningVersion=1 +versioningType=alpha +versioningTyperelease=0 +versioningFork= + +# Dependencies +dependencyLombok=1.18.32 +dependencyJetbrainsAnnotations=24.1.0 +dependencyJansi=2.4.1 + +# Plugins +pluginShadow=8.1.1 +pluginLombok=8.6 + +# etc +group = de.staropensource.sosengine diff --git a/gradle/wrapper/gradle-wrapper.jar b/gradle/wrapper/gradle-wrapper.jar new file mode 100644 index 0000000000000000000000000000000000000000..e6441136f3d4ba8a0da8d277868979cfbc8ad796 GIT binary patch literal 43453 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 yu?e%!_ptzGB|8GrCfu%p?(_ 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
NnX)EH+Nua)3Y(c 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 '} + case $link in #( + /*) app_path=$link ;; #( + *) app_path=$APP_HOME$link ;; + esac +done + +# This is normally unused +# shellcheck disable=SC2034 +APP_BASE_NAME=${0##*/} +# Discard cd standard output in case $CDPATH is set (https://github.com/gradle/gradle/issues/25036) +APP_HOME=$( cd "${APP_HOME:-./}" > /dev/null && pwd -P ) || exit + +# Use the maximum available, or set MAX_FD != -1 to use that value. +MAX_FD=maximum + +warn () { + echo "$*" +} >&2 + +die () { + echo + echo "$*" + echo + exit 1 +} >&2 + +# OS specific support (must be 'true' or 'false'). +cygwin=false +msys=false +darwin=false +nonstop=false +case "$( uname )" in #( + CYGWIN* ) cygwin=true ;; #( + Darwin* ) darwin=true ;; #( + MSYS* | MINGW* ) msys=true ;; #( + NONSTOP* ) nonstop=true ;; +esac + +CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar + + +# Determine the Java command to use to start the JVM. +if [ -n "$JAVA_HOME" ] ; then + if [ -x "$JAVA_HOME/jre/sh/java" ] ; then + # IBM's JDK on AIX uses strange locations for the executables + JAVACMD=$JAVA_HOME/jre/sh/java + else + JAVACMD=$JAVA_HOME/bin/java + fi + if [ ! -x "$JAVACMD" ] ; then + die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME + +Please set the JAVA_HOME variable in your environment to match the +location of your Java installation." + fi +else + JAVACMD=java + if ! command -v java >/dev/null 2>&1 + then + die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. + +Please set the JAVA_HOME variable in your environment to match the +location of your Java installation." + fi +fi + +# Increase the maximum file descriptors if we can. +if ! "$cygwin" && ! "$darwin" && ! "$nonstop" ; then + case $MAX_FD in #( + max*) + # In POSIX sh, ulimit -H is undefined. That's why the result is checked to see if it worked. + # shellcheck disable=SC2039,SC3045 + MAX_FD=$( ulimit -H -n ) || + warn "Could not query maximum file descriptor limit" + esac + case $MAX_FD in #( + '' | soft) :;; #( + *) + # In POSIX sh, ulimit -n is undefined. That's why the result is checked to see if it worked. + # shellcheck disable=SC2039,SC3045 + ulimit -n "$MAX_FD" || + warn "Could not set maximum file descriptor limit to $MAX_FD" + esac +fi + +# Collect all arguments for the java command, stacking in reverse order: +# * args from the command line +# * the main class name +# * -classpath +# * -D...appname settings +# * --module-path (only if needed) +# * DEFAULT_JVM_OPTS, JAVA_OPTS, and GRADLE_OPTS environment variables. + +# For Cygwin or MSYS, switch paths to Windows format before running java +if "$cygwin" || "$msys" ; then + APP_HOME=$( cygpath --path --mixed "$APP_HOME" ) + CLASSPATH=$( cygpath --path --mixed "$CLASSPATH" ) + + JAVACMD=$( cygpath --unix "$JAVACMD" ) + + # Now convert the arguments - kludge to limit ourselves to /bin/sh + for arg do + if + case $arg in #( + -*) false ;; # don't mess with options #( + /?*) t=${arg#/} t=/${t%%/*} # looks like a POSIX filepath + [ -e "$t" ] ;; #( + *) false ;; + esac + then + arg=$( cygpath --path --ignore --mixed "$arg" ) + fi + # Roll the args list around exactly as many times as the number of + # args, so each arg winds up back in the position where it started, but + # possibly modified. + # + # NB: a `for` loop captures its iteration list before it begins, so + # changing the positional parameters here affects neither the number of + # iterations, nor the values presented in `arg`. + shift # remove old arg + set -- "$@" "$arg" # push replacement arg + done +fi + + +# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"' + +# Collect all arguments for the java command: +# * DEFAULT_JVM_OPTS, JAVA_OPTS, JAVA_OPTS, and optsEnvironmentVar are not allowed to contain shell fragments, +# and any embedded shellness will be escaped. +# * For example: A user cannot expect ${Hostname} to be expanded, as it is an environment variable and will be +# treated as '${Hostname}' itself on the command line. + +set -- \ + "-Dorg.gradle.appname=$APP_BASE_NAME" \ + -classpath "$CLASSPATH" \ + org.gradle.wrapper.GradleWrapperMain \ + "$@" + +# Stop when "xargs" is not available. +if ! command -v xargs >/dev/null 2>&1 +then + die "xargs is not available" +fi + +# Use "xargs" to parse quoted args. +# +# With -n1 it outputs one arg per line, with the quotes and backslashes removed. +# +# In Bash we could simply go: +# +# readarray ARGS < <( xargs -n1 <<<"$var" ) && +# set -- "${ARGS[@]}" "$@" +# +# but POSIX shell has neither arrays nor command substitution, so instead we +# post-process each arg (as a line of input to sed) to backslash-escape any +# character that might be a shell metacharacter, then use eval to reverse +# that process (while maintaining the separation between arguments), and wrap +# the whole thing up as a single "set" statement. +# +# This will of course break if any of these variables contains a newline or +# an unmatched quote. +# + +eval "set -- $( + printf '%s\n' "$DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS" | + xargs -n1 | + sed ' s~[^-[:alnum:]+,./:=@_]~\\&~g; ' | + tr '\n' ' ' + )" '"$@"' + +exec "$JAVACMD" "$@" diff --git a/gradlew.bat b/gradlew.bat new file mode 100644 index 00000000..7101f8e4 --- /dev/null +++ b/gradlew.bat @@ -0,0 +1,92 @@ +@rem +@rem Copyright 2015 the original author or authors. +@rem +@rem Licensed under the Apache License, Version 2.0 (the "License"); +@rem you may not use this file except in compliance with the License. +@rem You may obtain a copy of the License at +@rem +@rem https://www.apache.org/licenses/LICENSE-2.0 +@rem +@rem Unless required by applicable law or agreed to in writing, software +@rem distributed under the License is distributed on an "AS IS" BASIS, +@rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +@rem See the License for the specific language governing permissions and +@rem limitations under the License. +@rem + +@if "%DEBUG%"=="" @echo off +@rem ########################################################################## +@rem +@rem Gradle startup script for Windows +@rem +@rem ########################################################################## + +@rem Set local scope for the variables with windows NT shell +if "%OS%"=="Windows_NT" setlocal + +set DIRNAME=%~dp0 +if "%DIRNAME%"=="" set DIRNAME=. +@rem This is normally unused +set APP_BASE_NAME=%~n0 +set APP_HOME=%DIRNAME% + +@rem Resolve any "." and ".." in APP_HOME to make it shorter. +for %%i in ("%APP_HOME%") do set APP_HOME=%%~fi + +@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +set DEFAULT_JVM_OPTS="-Xmx64m" "-Xms64m" + +@rem Find java.exe +if defined JAVA_HOME goto findJavaFromJavaHome + +set JAVA_EXE=java.exe +%JAVA_EXE% -version >NUL 2>&1 +if %ERRORLEVEL% equ 0 goto execute + +echo. 1>&2 +echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. 1>&2 +echo. 1>&2 +echo Please set the JAVA_HOME variable in your environment to match the 1>&2 +echo location of your Java installation. 1>&2 + +goto fail + +:findJavaFromJavaHome +set JAVA_HOME=%JAVA_HOME:"=% +set JAVA_EXE=%JAVA_HOME%/bin/java.exe + +if exist "%JAVA_EXE%" goto execute + +echo. 1>&2 +echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% 1>&2 +echo. 1>&2 +echo Please set the JAVA_HOME variable in your environment to match the 1>&2 +echo location of your Java installation. 1>&2 + +goto fail + +:execute +@rem Setup the command line + +set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar + + +@rem Execute Gradle +"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %* + +:end +@rem End local scope for the variables with windows NT shell +if %ERRORLEVEL% equ 0 goto mainEnd + +:fail +rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of +rem the _cmd.exe /c_ return code! +set EXIT_CODE=%ERRORLEVEL% +if %EXIT_CODE% equ 0 set EXIT_CODE=1 +if not ""=="%GRADLE_EXIT_CONSOLE%" exit %EXIT_CODE% +exit /b %EXIT_CODE% + +:mainEnd +if "%OS%"=="Windows_NT" endlocal + +:omega diff --git a/settings.gradle b/settings.gradle new file mode 100644 index 00000000..ff7f8f9d --- /dev/null +++ b/settings.gradle @@ -0,0 +1,4 @@ +rootProject.name = 'sosengine' + +include 'base' +include 'testapp' diff --git a/testapp/build.gradle b/testapp/build.gradle new file mode 100644 index 00000000..97d99a81 --- /dev/null +++ b/testapp/build.gradle @@ -0,0 +1,57 @@ +plugins { + id 'com.github.johnrengelman.shadow' version "${pluginShadow}" + id 'java' + id 'application' + id "io.freefair.lombok" version "${pluginLombok}" +} + +group = project.group +version = project.versioningVersion + "-" + project.versioningType + project.versioningTyperelease + project.versioningFork + +repositories { + mavenCentral() +} + +dependencies { + // Lombok + compileOnly 'org.projectlombok:lombok:' + project.dependencyLombok + annotationProcessor 'org.projectlombok:lombok:' + project.dependencyLombok + + // JetBrains annotations + compileOnly 'org.jetbrains:annotations:' + project.dependencyJetbrainsAnnotations + + // Project + implementation project(":base") +} + +javadoc.options { + setMemberLevel(JavadocMemberLevel.PUBLIC) + setOverview("src/main/javadoc/overview.html") + setLocale("en_US"); + setJFlags([ + // Force Javadoc to use English translations + "-Duser.language=en_US" + ]) +} + +jar { + manifest { + attributes( + 'Main-Class': 'de.staropensource.sosengine.testapp.Main' + ) + } +} + +application { + mainClass.set("de.staropensource.sosengine.testapp.Main") + applicationDefaultJvmArgs = [ + // Set log level to DIAGNOSTIC + "-Dsosengine.base.loggerLevel=diagnostic", + + // Force writing to standard output + "-Dsosengine.base.loggerForceStandardOutput=true", + + // Force Jansi to write escape sequences + "-Djansi.mode=force", + ] +} diff --git a/testapp/gradle b/testapp/gradle new file mode 120000 index 00000000..3337596a --- /dev/null +++ b/testapp/gradle @@ -0,0 +1 @@ +../gradle \ No newline at end of file diff --git a/testapp/gradlew b/testapp/gradlew new file mode 120000 index 00000000..502f5a2d --- /dev/null +++ b/testapp/gradlew @@ -0,0 +1 @@ +../gradlew \ No newline at end of file diff --git a/testapp/gradlew.bat b/testapp/gradlew.bat new file mode 120000 index 00000000..28401328 --- /dev/null +++ b/testapp/gradlew.bat @@ -0,0 +1 @@ +../gradlew.bat \ No newline at end of file diff --git a/testapp/src/main/java/de/staropensource/sosengine/testapp/Main.java b/testapp/src/main/java/de/staropensource/sosengine/testapp/Main.java new file mode 100644 index 00000000..be8e051e --- /dev/null +++ b/testapp/src/main/java/de/staropensource/sosengine/testapp/Main.java @@ -0,0 +1,103 @@ +/* + STAROPENSOURCE ENGINE SOURCE FILE + Copyright (c) 2024 The StarOpenSource Engine Contributors + Licensed under the GNU Affero General Public License v3 + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU Affero General Public License as + published by the Free Software Foundation, either version 3 of the + License, or (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU Affero General Public License for more details. + + You should have received a copy of the GNU Affero General Public License + along with this program. If not, see . + */ + +package de.staropensource.sosengine.testapp; + +import de.staropensource.sosengine.base.Engine; +import de.staropensource.sosengine.base.logging.LoggerInstance; +import de.staropensource.sosengine.base.types.LogIssuer; +import lombok.Getter; + +/** + * The initialization class for sos!engine's development application. + */ +@SuppressWarnings({ "unused", "JavadocDeclaration", "JavadocBlankLines" }) +public class Main { + /** + * Instance. + * + * -- GETTER -- + * Returns the {@link Main} instance. + * + * @return {@link Main} instance + */ + @Getter + private static final Main instance = new Main(); + + /** + * Reference to the main engine object. + * + * @see Engine + * + * -- GETTER -- + * Returns the main engine object. + * + * @return sos!engine object + * @see Engine + */ + @Getter + private Engine engine; + + /** + * Logger instance. + * + * @see LoggerInstance + */ + private final LoggerInstance logger = new LoggerInstance(new LogIssuer(getClass())); + + /** + * Constructor. + */ + public Main() {} + + /** + * The program's entrypoint. + * Calls {@code run()} after invocation. + * + * @see Main#run(String[]) + * @param args program's command line arguments + */ + public static void main(String[] args) { + getInstance().run(args); + } + + /** + * The program's entrypoint but not static. + * Here's where the "real magic" happens- + * + * @see Main#main(String[]) + * @param args program's command line arguments + */ + public void run(String[] args) { + // Initialize sos!engine + engine = new Engine(); + + // Say hello to the world! + logger.info("Hello world!"); + + // Test logger levels + logger.diag("Diagnostic message!"); + logger.verb("Verbose message!"); + logger.sarn("Silent warning message!"); + logger.info("Informational message!"); + logger.warn("Warning message!"); + logger.error("Error message!"); + logger.crash("Crash message!"); + } +}