From 2b840ff3033c794b672fcc7c823c193bf57db5cb Mon Sep 17 00:00:00 2001 From: Darin Kelkhoff <93011140+darin-kelkhoff@users.noreply.github.com> Date: Mon, 8 Nov 2021 22:00:35 -0600 Subject: [PATCH 01/30] Initial commit --- .gitignore | 23 +++++++++++++++++++++++ README.md | 1 + 2 files changed, 24 insertions(+) create mode 100644 .gitignore create mode 100644 README.md diff --git a/.gitignore b/.gitignore new file mode 100644 index 00000000..a1c2a238 --- /dev/null +++ b/.gitignore @@ -0,0 +1,23 @@ +# Compiled class file +*.class + +# Log file +*.log + +# BlueJ files +*.ctxt + +# Mobile Tools for Java (J2ME) +.mtj.tmp/ + +# Package Files # +*.jar +*.war +*.nar +*.ear +*.zip +*.tar.gz +*.rar + +# virtual machine crash logs, see http://www.java.com/en/download/help/error_hotspot.xml +hs_err_pid* diff --git a/README.md b/README.md new file mode 100644 index 00000000..325aaf6f --- /dev/null +++ b/README.md @@ -0,0 +1 @@ +# qqq-sample-project \ No newline at end of file From 3b2646c04c37d017446638e465106412b3d6bcb8 Mon Sep 17 00:00:00 2001 From: Darin Kelkhoff Date: Mon, 8 Nov 2021 22:06:34 -0600 Subject: [PATCH 02/30] Initial code commit --- .gitignore | 7 + checkstyle.xml | 242 ++++++++++++++++++ pom.xml | 136 ++++++++++ .../com/kingsrook/sampleapp/SampleCli.java | 33 +++ .../sampleapp/SampleJavalinServer.java | 45 ++++ .../sampleapp/SampleMetaDataProvider.java | 96 +++++++ 6 files changed, 559 insertions(+) create mode 100644 checkstyle.xml create mode 100644 pom.xml create mode 100644 src/main/java/com/kingsrook/sampleapp/SampleCli.java create mode 100644 src/main/java/com/kingsrook/sampleapp/SampleJavalinServer.java create mode 100644 src/main/java/com/kingsrook/sampleapp/SampleMetaDataProvider.java diff --git a/.gitignore b/.gitignore index a1c2a238..39736a21 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,10 @@ +target/ +*.iml + + +############################################# +## Original contents from github template: ## +############################################# # Compiled class file *.class diff --git a/checkstyle.xml b/checkstyle.xml new file mode 100644 index 00000000..fadf2cda --- /dev/null +++ b/checkstyle.xml @@ -0,0 +1,242 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/pom.xml b/pom.xml new file mode 100644 index 00000000..4a6308f6 --- /dev/null +++ b/pom.xml @@ -0,0 +1,136 @@ + + + 4.0.0 + + com.kingsrook.qqq + qqq-sample-deployment + 0.0-SNAPSHOT + + + + + + + UTF-8 + UTF-8 + 17 + 17 + true + true + + + + + + com.kingsrook.qqq + qqq-backend-core + 0.0-SNAPSHOT + compile + + + com.kingsrook.qqq + qqq-backend-module-rdbms + 0.0-SNAPSHOT + compile + + + com.kingsrook.qqq + qqq-middleware-javalin + 0.0-SNAPSHOT + compile + + + com.kingsrook.qqq + qqq-middleware-picocli + 0.0-SNAPSHOT + compile + + + + + org.slf4j + slf4j-simple + 1.8.0-beta4 + + + + + org.apache.maven.plugins + maven-checkstyle-plugin + 3.1.2 + + + org.apache.logging.log4j + log4j-api + 2.14.1 + + + org.apache.logging.log4j + log4j-core + 2.14.1 + + + org.junit.jupiter + junit-jupiter-engine + 5.8.1 + test + + + + + + + + + + + org.apache.maven.plugins + maven-compiler-plugin + 3.8.1 + + -Xlint:unchecked + + + + org.apache.maven.plugins + maven-surefire-plugin + 3.0.0-M5 + + + org.apache.maven.plugins + maven-checkstyle-plugin + 3.1.2 + + + com.puppycrawl.tools + checkstyle + 9.0 + + + + + validate + validate + + checkstyle.xml + + UTF-8 + true + false + true + warning + **/target/generated-sources/*.* + + + + check + + + + + + + + diff --git a/src/main/java/com/kingsrook/sampleapp/SampleCli.java b/src/main/java/com/kingsrook/sampleapp/SampleCli.java new file mode 100644 index 00000000..3be09a5f --- /dev/null +++ b/src/main/java/com/kingsrook/sampleapp/SampleCli.java @@ -0,0 +1,33 @@ +package com.kingsrook.sampleapp; + + +import com.kingsrook.qqq.backend.core.model.metadata.QInstance; +import com.kingsrook.qqq.frontend.picocli.QPicoCliImplementation; + + +/******************************************************************************* + ** + *******************************************************************************/ +public class SampleCli +{ + /******************************************************************************* + ** + *******************************************************************************/ + public static void main(String[] args) + { + new SampleCli().run(args); + } + + + + /******************************************************************************* + ** + *******************************************************************************/ + private void run(String[] args) + { + QInstance qInstance = SampleMetaDataProvider.defineInstance(); + QPicoCliImplementation qPicoCliImplementation = new QPicoCliImplementation(qInstance); + int exitCode = qPicoCliImplementation.runCli("my-sample-cli", args); + System.exit(exitCode); + } +} diff --git a/src/main/java/com/kingsrook/sampleapp/SampleJavalinServer.java b/src/main/java/com/kingsrook/sampleapp/SampleJavalinServer.java new file mode 100644 index 00000000..c48e2f14 --- /dev/null +++ b/src/main/java/com/kingsrook/sampleapp/SampleJavalinServer.java @@ -0,0 +1,45 @@ +package com.kingsrook.sampleapp; + + +import com.kingsrook.qqq.backend.core.model.metadata.QInstance; +import com.kingsrook.qqq.backend.javalin.QJavalinImplementation; +import io.javalin.Javalin; +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; + + +/******************************************************************************* + ** + *******************************************************************************/ +public class SampleJavalinServer +{ + private static final Logger LOG = LogManager.getLogger(SampleJavalinServer.class); + + private static final int PORT = 8000; + + private QInstance qInstance; + + + /******************************************************************************* + ** + *******************************************************************************/ + public static void main(String[] args) + { + new SampleJavalinServer().startJavalinServer(); + } + + + + /******************************************************************************* + ** + *******************************************************************************/ + public void startJavalinServer() + { + qInstance = SampleMetaDataProvider.defineInstance(); + + QJavalinImplementation qJavalinImplementation = new QJavalinImplementation(qInstance); + Javalin service = Javalin.create().start(PORT); + service.routes(qJavalinImplementation.getRoutes()); + } + +} diff --git a/src/main/java/com/kingsrook/sampleapp/SampleMetaDataProvider.java b/src/main/java/com/kingsrook/sampleapp/SampleMetaDataProvider.java new file mode 100644 index 00000000..9802bb47 --- /dev/null +++ b/src/main/java/com/kingsrook/sampleapp/SampleMetaDataProvider.java @@ -0,0 +1,96 @@ +package com.kingsrook.sampleapp; + + +import com.kingsrook.qqq.backend.core.model.metadata.QBackendMetaData; +import com.kingsrook.qqq.backend.core.model.metadata.QFieldMetaData; +import com.kingsrook.qqq.backend.core.model.metadata.QFieldType; +import com.kingsrook.qqq.backend.core.model.metadata.QInstance; +import com.kingsrook.qqq.backend.core.model.metadata.QTableMetaData; + + +/******************************************************************************* + ** + *******************************************************************************/ +public class SampleMetaDataProvider +{ + private static final String BACKEND_NAME = "default"; + + + + /******************************************************************************* + ** + *******************************************************************************/ + public static QInstance defineInstance() + { + QInstance qInstance = new QInstance(); + qInstance.addBackend(SampleMetaDataProvider.defineBackend()); + qInstance.addTable(SampleMetaDataProvider.defineTableCarrier()); + qInstance.addTable(SampleMetaDataProvider.defineTablePerson()); + return (qInstance); + } + + + + /******************************************************************************* + ** + *******************************************************************************/ + public static QBackendMetaData defineBackend() + { + QBackendMetaData backend = new QBackendMetaData(); + backend.setName(BACKEND_NAME); + backend.setType("rdbms"); + backend.setValue("vendor", "mysql"); + backend.setValue("hostName", "127.0.0.1"); + backend.setValue("port", "3306"); + backend.setValue("databaseName", "opspath"); + backend.setValue("username", "root"); + backend.setValue("password", "8BNWyoav8s79oi}Lqk"); + return (backend); + } + + + + /******************************************************************************* + ** + *******************************************************************************/ + public static QTableMetaData defineTableCarrier() + { + QTableMetaData table = new QTableMetaData(); + table.setName("carrier"); + table.setBackendName(BACKEND_NAME); + table.setPrimaryKeyField("id"); + + table.addField(new QFieldMetaData("id", QFieldType.INTEGER)); + + table.addField(new QFieldMetaData("name", QFieldType.STRING)); + + table.addField(new QFieldMetaData("company_code", QFieldType.STRING) // todo enum + .withLabel("Company") + .withBackendName("comp_code")); + + table.addField(new QFieldMetaData("service_level", QFieldType.STRING)); // todo enum + + return (table); + } + + + + /******************************************************************************* + ** + *******************************************************************************/ + public static QTableMetaData defineTablePerson() + { + return new QTableMetaData() + .withName("person") + .withLabel("Person") + .withBackendName(BACKEND_NAME) + .withPrimaryKeyField("id") + .withField(new QFieldMetaData("id", QFieldType.INTEGER)) + .withField(new QFieldMetaData("createDate", QFieldType.DATE_TIME).withBackendName("create_date")) + .withField(new QFieldMetaData("modifyDate", QFieldType.DATE_TIME).withBackendName("modify_date")) + .withField(new QFieldMetaData("firstName", QFieldType.STRING).withBackendName("first_name")) + .withField(new QFieldMetaData("lastName", QFieldType.STRING).withBackendName("last_name")) + .withField(new QFieldMetaData("birthDate", QFieldType.DATE).withBackendName("birth_date")) + .withField(new QFieldMetaData("email", QFieldType.STRING)); + } +} From 7cc13fc0f9ee3eee8824c807e11487e65122921a Mon Sep 17 00:00:00 2001 From: Darin Kelkhoff <93011140+darin-kelkhoff@users.noreply.github.com> Date: Mon, 8 Nov 2021 22:07:58 -0600 Subject: [PATCH 03/30] Update README.md --- README.md | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 325aaf6f..200694e0 100644 --- a/README.md +++ b/README.md @@ -1 +1,6 @@ -# qqq-sample-project \ No newline at end of file +# qqq-sample-project +This repo serves as a sample or demo of how a client might deploy qqq. + +It defines the meta-data for a sample project (e.g., mysql credentials and table(s)). + +It has a Javalin (http) server, and a Pico-CLI - both very very thin, just basically loading up the pertinent qqq codes. From bfca6e1a5590145656dfa73c9223fe1ed1c2cb51 Mon Sep 17 00:00:00 2001 From: Darin Kelkhoff Date: Tue, 30 Nov 2021 18:10:46 -0600 Subject: [PATCH 04/30] Checkpoint (added CORS) --- .../com/kingsrook/sampleapp/SampleJavalinServer.java | 9 ++++++++- .../com/kingsrook/sampleapp/SampleMetaDataProvider.java | 2 +- 2 files changed, 9 insertions(+), 2 deletions(-) diff --git a/src/main/java/com/kingsrook/sampleapp/SampleJavalinServer.java b/src/main/java/com/kingsrook/sampleapp/SampleJavalinServer.java index c48e2f14..0763810c 100644 --- a/src/main/java/com/kingsrook/sampleapp/SampleJavalinServer.java +++ b/src/main/java/com/kingsrook/sampleapp/SampleJavalinServer.java @@ -20,6 +20,7 @@ public class SampleJavalinServer private QInstance qInstance; + /******************************************************************************* ** *******************************************************************************/ @@ -38,8 +39,14 @@ public class SampleJavalinServer qInstance = SampleMetaDataProvider.defineInstance(); QJavalinImplementation qJavalinImplementation = new QJavalinImplementation(qInstance); - Javalin service = Javalin.create().start(PORT); + Javalin service = Javalin.create(config -> + { + // todo - not all!! + config.enableCorsForAllOrigins(); + }).start(PORT); service.routes(qJavalinImplementation.getRoutes()); + service.after(ctx -> + ctx.res.setHeader("Access-Control-Allow-Origin", "http://localhost:3000")); } } diff --git a/src/main/java/com/kingsrook/sampleapp/SampleMetaDataProvider.java b/src/main/java/com/kingsrook/sampleapp/SampleMetaDataProvider.java index 9802bb47..9cc8a7ad 100644 --- a/src/main/java/com/kingsrook/sampleapp/SampleMetaDataProvider.java +++ b/src/main/java/com/kingsrook/sampleapp/SampleMetaDataProvider.java @@ -44,7 +44,7 @@ public class SampleMetaDataProvider backend.setValue("port", "3306"); backend.setValue("databaseName", "opspath"); backend.setValue("username", "root"); - backend.setValue("password", "8BNWyoav8s79oi}Lqk"); + backend.setValue("password", "8BNWyoav8s79oi}Lqk"); // todo - load securely return (backend); } From c6f6eee3bc626d92991c0cbc3fe0ec9cf44b48ae Mon Sep 17 00:00:00 2001 From: Darin Kelkhoff Date: Mon, 13 Dec 2021 22:09:25 -0600 Subject: [PATCH 05/30] Updating to log4j 2.15.0 for security patch --- pom.xml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/pom.xml b/pom.xml index 4a6308f6..30e4f105 100644 --- a/pom.xml +++ b/pom.xml @@ -5,7 +5,7 @@ 4.0.0 com.kingsrook.qqq - qqq-sample-deployment + qqq-sample-project 0.0-SNAPSHOT @@ -64,12 +64,12 @@ org.apache.logging.log4j log4j-api - 2.14.1 + 2.15.0 org.apache.logging.log4j log4j-core - 2.14.1 + 2.15.0 org.junit.jupiter From 8ce4924707e5defa2994a274c3e2ca85c7042e89 Mon Sep 17 00:00:00 2001 From: Darin Kelkhoff Date: Tue, 14 Dec 2021 18:42:14 -0600 Subject: [PATCH 06/30] Added copyright --- checkstyle.xml | 4 ++++ pom.xml | 4 ++++ src/main/java/com/kingsrook/sampleapp/SampleCli.java | 4 ++++ .../java/com/kingsrook/sampleapp/SampleJavalinServer.java | 4 ++++ .../java/com/kingsrook/sampleapp/SampleMetaDataProvider.java | 4 ++++ 5 files changed, 20 insertions(+) diff --git a/checkstyle.xml b/checkstyle.xml index fadf2cda..56a37ba1 100644 --- a/checkstyle.xml +++ b/checkstyle.xml @@ -1,4 +1,8 @@ + + diff --git a/pom.xml b/pom.xml index 30e4f105..39c0fb7b 100644 --- a/pom.xml +++ b/pom.xml @@ -1,4 +1,8 @@ + + diff --git a/src/main/java/com/kingsrook/sampleapp/SampleCli.java b/src/main/java/com/kingsrook/sampleapp/SampleCli.java index 3be09a5f..53d3b427 100644 --- a/src/main/java/com/kingsrook/sampleapp/SampleCli.java +++ b/src/main/java/com/kingsrook/sampleapp/SampleCli.java @@ -1,3 +1,7 @@ +/* + * Copyright © 2021-2021. Kingsrook LLC . All Rights Reserved. + */ + package com.kingsrook.sampleapp; diff --git a/src/main/java/com/kingsrook/sampleapp/SampleJavalinServer.java b/src/main/java/com/kingsrook/sampleapp/SampleJavalinServer.java index 0763810c..8687440a 100644 --- a/src/main/java/com/kingsrook/sampleapp/SampleJavalinServer.java +++ b/src/main/java/com/kingsrook/sampleapp/SampleJavalinServer.java @@ -1,3 +1,7 @@ +/* + * Copyright © 2021-2021. Kingsrook LLC . All Rights Reserved. + */ + package com.kingsrook.sampleapp; diff --git a/src/main/java/com/kingsrook/sampleapp/SampleMetaDataProvider.java b/src/main/java/com/kingsrook/sampleapp/SampleMetaDataProvider.java index 9cc8a7ad..970edf9b 100644 --- a/src/main/java/com/kingsrook/sampleapp/SampleMetaDataProvider.java +++ b/src/main/java/com/kingsrook/sampleapp/SampleMetaDataProvider.java @@ -1,3 +1,7 @@ +/* + * Copyright © 2021-2021. Kingsrook LLC . All Rights Reserved. + */ + package com.kingsrook.sampleapp; From c1d616f5fb3b0b05a742487b5f6d82f01b32cb1a Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 4 Jan 2022 16:56:17 +0000 Subject: [PATCH 07/30] Bump log4j-core from 2.15.0 to 2.17.1 Bumps log4j-core from 2.15.0 to 2.17.1. --- updated-dependencies: - dependency-name: org.apache.logging.log4j:log4j-core dependency-type: direct:production ... Signed-off-by: dependabot[bot] --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 39c0fb7b..98c98fc7 100644 --- a/pom.xml +++ b/pom.xml @@ -73,7 +73,7 @@ org.apache.logging.log4j log4j-core - 2.15.0 + 2.17.1 org.junit.jupiter From d5d7f1eb887ad85b84669774fdb6fc8173ced6f8 Mon Sep 17 00:00:00 2001 From: Darin Kelkhoff Date: Tue, 7 Jun 2022 16:52:35 -0500 Subject: [PATCH 08/30] QQQ-4 Applying AGPL Licence --- LICENSE | 619 ++++++++++++++++++ README.md | 20 + checkstyle.xml | 19 +- pom.xml | 19 +- .../com/kingsrook/sampleapp/SampleCli.java | 19 +- .../sampleapp/SampleJavalinServer.java | 19 +- .../sampleapp/SampleMetaDataProvider.java | 19 +- 7 files changed, 729 insertions(+), 5 deletions(-) create mode 100644 LICENSE diff --git a/LICENSE b/LICENSE new file mode 100644 index 00000000..ca9b0551 --- /dev/null +++ b/LICENSE @@ -0,0 +1,619 @@ + 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 diff --git a/README.md b/README.md index 200694e0..69ad7923 100644 --- a/README.md +++ b/README.md @@ -4,3 +4,23 @@ This repo serves as a sample or demo of how a client might deploy qqq. It defines the meta-data for a sample project (e.g., mysql credentials and table(s)). It has a Javalin (http) server, and a Pico-CLI - both very very thin, just basically loading up the pertinent qqq codes. + +## License +QQQ - Low-code Application Framework for Engineers. \ +Copyright (C) 2022. Kingsrook, LLC \ +651 N Broad St Ste 205 # 6917 | Middletown DE 19709 | United States \ +contact@kingsrook.com +https://github.com/Kingsrook/intellij-commentator-plugin + +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 . diff --git a/checkstyle.xml b/checkstyle.xml index 56a37ba1..a6a0d052 100644 --- a/checkstyle.xml +++ b/checkstyle.xml @@ -1,6 +1,23 @@ . All Rights Reserved. + * QQQ - Low-code Application Framework for Engineers. + * Copyright (C) 2021-2022. Kingsrook, LLC + * 651 N Broad St Ste 205 # 6917 | Middletown DE 19709 | United States + * contact@kingsrook.com + * https://github.com/Kingsrook/intellij-commentator-plugin + * + * 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 com.kingsrook.sampleapp; diff --git a/src/main/java/com/kingsrook/sampleapp/SampleJavalinServer.java b/src/main/java/com/kingsrook/sampleapp/SampleJavalinServer.java index 8687440a..5764545a 100644 --- a/src/main/java/com/kingsrook/sampleapp/SampleJavalinServer.java +++ b/src/main/java/com/kingsrook/sampleapp/SampleJavalinServer.java @@ -1,5 +1,22 @@ /* - * Copyright © 2021-2021. Kingsrook LLC . All Rights Reserved. + * QQQ - Low-code Application Framework for Engineers. + * Copyright (C) 2021-2022. Kingsrook, LLC + * 651 N Broad St Ste 205 # 6917 | Middletown DE 19709 | United States + * contact@kingsrook.com + * https://github.com/Kingsrook/intellij-commentator-plugin + * + * 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 com.kingsrook.sampleapp; diff --git a/src/main/java/com/kingsrook/sampleapp/SampleMetaDataProvider.java b/src/main/java/com/kingsrook/sampleapp/SampleMetaDataProvider.java index 970edf9b..e2dae0fe 100644 --- a/src/main/java/com/kingsrook/sampleapp/SampleMetaDataProvider.java +++ b/src/main/java/com/kingsrook/sampleapp/SampleMetaDataProvider.java @@ -1,5 +1,22 @@ /* - * Copyright © 2021-2021. Kingsrook LLC . All Rights Reserved. + * QQQ - Low-code Application Framework for Engineers. + * Copyright (C) 2021-2022. Kingsrook, LLC + * 651 N Broad St Ste 205 # 6917 | Middletown DE 19709 | United States + * contact@kingsrook.com + * https://github.com/Kingsrook/intellij-commentator-plugin + * + * 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 com.kingsrook.sampleapp; From e662c68eb008d44c8bf0f9e827a031de51aacf84 Mon Sep 17 00:00:00 2001 From: Darin Kelkhoff Date: Wed, 8 Jun 2022 09:08:07 -0500 Subject: [PATCH 09/30] Fixing github link in copyright --- checkstyle.xml | 2 +- pom.xml | 2 +- src/main/java/com/kingsrook/sampleapp/SampleCli.java | 2 +- src/main/java/com/kingsrook/sampleapp/SampleJavalinServer.java | 2 +- .../java/com/kingsrook/sampleapp/SampleMetaDataProvider.java | 2 +- 5 files changed, 5 insertions(+), 5 deletions(-) diff --git a/checkstyle.xml b/checkstyle.xml index a6a0d052..dbaa3479 100644 --- a/checkstyle.xml +++ b/checkstyle.xml @@ -4,7 +4,7 @@ ~ Copyright (C) 2021-2022. Kingsrook, LLC ~ 651 N Broad St Ste 205 # 6917 | Middletown DE 19709 | United States ~ contact@kingsrook.com - ~ https://github.com/Kingsrook/intellij-commentator-plugin + ~ https://github.com/Kingsrook/ ~ ~ This program is free software: you can redistribute it and/or modify ~ it under the terms of the GNU Affero General Public License as diff --git a/pom.xml b/pom.xml index c0c7730c..aed9a15d 100644 --- a/pom.xml +++ b/pom.xml @@ -4,7 +4,7 @@ ~ Copyright (C) 2021-2022. Kingsrook, LLC ~ 651 N Broad St Ste 205 # 6917 | Middletown DE 19709 | United States ~ contact@kingsrook.com - ~ https://github.com/Kingsrook/intellij-commentator-plugin + ~ https://github.com/Kingsrook/ ~ ~ This program is free software: you can redistribute it and/or modify ~ it under the terms of the GNU Affero General Public License as diff --git a/src/main/java/com/kingsrook/sampleapp/SampleCli.java b/src/main/java/com/kingsrook/sampleapp/SampleCli.java index 47693c13..8f2bece8 100644 --- a/src/main/java/com/kingsrook/sampleapp/SampleCli.java +++ b/src/main/java/com/kingsrook/sampleapp/SampleCli.java @@ -3,7 +3,7 @@ * Copyright (C) 2021-2022. Kingsrook, LLC * 651 N Broad St Ste 205 # 6917 | Middletown DE 19709 | United States * contact@kingsrook.com - * https://github.com/Kingsrook/intellij-commentator-plugin + * https://github.com/Kingsrook/ * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU Affero General Public License as diff --git a/src/main/java/com/kingsrook/sampleapp/SampleJavalinServer.java b/src/main/java/com/kingsrook/sampleapp/SampleJavalinServer.java index 5764545a..afe0fb8c 100644 --- a/src/main/java/com/kingsrook/sampleapp/SampleJavalinServer.java +++ b/src/main/java/com/kingsrook/sampleapp/SampleJavalinServer.java @@ -3,7 +3,7 @@ * Copyright (C) 2021-2022. Kingsrook, LLC * 651 N Broad St Ste 205 # 6917 | Middletown DE 19709 | United States * contact@kingsrook.com - * https://github.com/Kingsrook/intellij-commentator-plugin + * https://github.com/Kingsrook/ * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU Affero General Public License as diff --git a/src/main/java/com/kingsrook/sampleapp/SampleMetaDataProvider.java b/src/main/java/com/kingsrook/sampleapp/SampleMetaDataProvider.java index e2dae0fe..3e61d425 100644 --- a/src/main/java/com/kingsrook/sampleapp/SampleMetaDataProvider.java +++ b/src/main/java/com/kingsrook/sampleapp/SampleMetaDataProvider.java @@ -3,7 +3,7 @@ * Copyright (C) 2021-2022. Kingsrook, LLC * 651 N Broad St Ste 205 # 6917 | Middletown DE 19709 | United States * contact@kingsrook.com - * https://github.com/Kingsrook/intellij-commentator-plugin + * https://github.com/Kingsrook/ * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU Affero General Public License as From ac3996b452211dd7ac4604d9f79251094b9213e7 Mon Sep 17 00:00:00 2001 From: Darin Kelkhoff Date: Mon, 13 Jun 2022 15:51:45 -0500 Subject: [PATCH 10/30] Fixed github link in License --- README.md | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/README.md b/README.md index 69ad7923..49461c12 100644 --- a/README.md +++ b/README.md @@ -9,8 +9,7 @@ It has a Javalin (http) server, and a Pico-CLI - both very very thin, just basic QQQ - Low-code Application Framework for Engineers. \ Copyright (C) 2022. Kingsrook, LLC \ 651 N Broad St Ste 205 # 6917 | Middletown DE 19709 | United States \ -contact@kingsrook.com -https://github.com/Kingsrook/intellij-commentator-plugin +contact@kingsrook.com | https://github.com/Kingsrook/ This program is free software: you can redistribute it and/or modify it under the terms of the GNU Affero General Public License as From ccbc283300febdded1465b72f7f2ca02ed4945b1 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 13 Jun 2022 20:53:44 +0000 Subject: [PATCH 11/30] Bump log4j-api from 2.15.0 to 2.17.1 Bumps log4j-api from 2.15.0 to 2.17.1. --- updated-dependencies: - dependency-name: org.apache.logging.log4j:log4j-api dependency-type: direct:production ... Signed-off-by: dependabot[bot] --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index aed9a15d..be0bc717 100644 --- a/pom.xml +++ b/pom.xml @@ -85,7 +85,7 @@ org.apache.logging.log4j log4j-api - 2.15.0 + 2.17.1 org.apache.logging.log4j From 173a68a22c8178d018671dafbd0f7131808b1ff0 Mon Sep 17 00:00:00 2001 From: Darin Kelkhoff Date: Tue, 14 Jun 2022 11:36:50 -0500 Subject: [PATCH 12/30] Initial checkin --- .circleci/config.yml | 78 ++++++++++++++++++++++++++++++++++++++ .circleci/mvn-settings.xml | 9 +++++ 2 files changed, 87 insertions(+) create mode 100644 .circleci/config.yml create mode 100644 .circleci/mvn-settings.xml diff --git a/.circleci/config.yml b/.circleci/config.yml new file mode 100644 index 00000000..8eaa8e76 --- /dev/null +++ b/.circleci/config.yml @@ -0,0 +1,78 @@ +version: 2.1 + +executors: + java17: + docker: + - image: 'cimg/openjdk:17.0' + resource_class: small + +orbs: + slack: circleci/slack@4.10.1 + +commands: + run_maven: + parameters: + maven_subcommand: + default: test + type: string + steps: + - checkout + - restore_cache: + keys: + - v1-dependencies-{{ checksum "pom.xml" }} + - run: + name: Run Maven + command: | + mvn -s .circleci/mvn-settings.xml << parameters.maven_subcommand >> + - run: + name: Save test results + command: | + mkdir -p ~/test-results/junit/ + find . -type f -regex ".*/target/surefire-reports/.*xml" -exec cp {} ~/test-results/junit/ \; + when: always + - store_test_results: + path: ~/test-results + - save_cache: + paths: + - ~/.m2 + key: v1-dependencies-{{ checksum "pom.xml" }} + +jobs: + mvn_test: + executor: java17 + steps: + - run_maven: + maven_subcommand: test + - slack/notify: + event: fail + + mvn_deploy: + executor: java17 + steps: + - run_maven: + maven_subcommand: deploy + - slack/notify: + event: always + +workflows: + test_only: + jobs: + - mvn_test: + context: [ qqq-maven-registry-credentials, kingsrook-slack ] +## just doing mvn test for all branches in this repo at this time +## filters: +## branches: +## ignore: /dev/ +## tags: +## ignore: /version-.*/ +## +## deploy: +## jobs: +## - mvn_deploy: +## context: [ qqq-maven-registry-credentials, kingsrook-slack ] +## filters: +## branches: +## only: /dev/ +## tags: +## only: /version-.*/ +## diff --git a/.circleci/mvn-settings.xml b/.circleci/mvn-settings.xml new file mode 100644 index 00000000..b2a345f0 --- /dev/null +++ b/.circleci/mvn-settings.xml @@ -0,0 +1,9 @@ + + + + github-qqq-maven-registry + ${env.QQQ_MAVEN_REGISTRY_USERNAME} + ${env.QQQ_MAVEN_REGISTRY_PASSWORD} + + + From 9449c7a4f4df5ac0eade105cdfcca936aada4df7 Mon Sep 17 00:00:00 2001 From: Darin Kelkhoff Date: Tue, 14 Jun 2022 11:46:00 -0500 Subject: [PATCH 13/30] Update versions to 0.0.0-SNAPSHOT (both this and its deps); add repository and distributionManagement --- pom.xml | 26 +++++++++++++++++++++----- 1 file changed, 21 insertions(+), 5 deletions(-) diff --git a/pom.xml b/pom.xml index cee60706..b61486bc 100644 --- a/pom.xml +++ b/pom.xml @@ -27,7 +27,7 @@ com.kingsrook.qqq qqq-sample-project - 0.0-SNAPSHOT + 0.0.0-SNAPSHOT @@ -47,25 +47,25 @@ com.kingsrook.qqq qqq-backend-core - 0.0-SNAPSHOT + 0.0.0-SNAPSHOT compile com.kingsrook.qqq qqq-backend-module-rdbms - 0.0-SNAPSHOT + 0.0.0-SNAPSHOT compile com.kingsrook.qqq qqq-middleware-javalin - 0.0-SNAPSHOT + 0.0.0-SNAPSHOT compile com.kingsrook.qqq qqq-middleware-picocli - 0.0-SNAPSHOT + 0.0.0-SNAPSHOT compile @@ -154,4 +154,20 @@ + + + github-qqq-maven-registry + GitHub QQQ Maven Registry + https://maven.pkg.github.com/Kingsrook/qqq-maven-registry + + + + + + github-qqq-maven-registry + GitHub QQQ Maven Registry + https://maven.pkg.github.com/Kingsrook/qqq-maven-registry + + + From 2fb0574e0fcb31d072d607094cbb13124c8d48b1 Mon Sep 17 00:00:00 2001 From: Darin Kelkhoff Date: Tue, 14 Jun 2022 12:21:00 -0500 Subject: [PATCH 14/30] Remove slf4j; update log4j to 2.17.2 and junit to 5.8.2 --- pom.xml | 11 +++-------- 1 file changed, 3 insertions(+), 8 deletions(-) diff --git a/pom.xml b/pom.xml index b61486bc..6abc730d 100644 --- a/pom.xml +++ b/pom.xml @@ -70,11 +70,6 @@ - - org.slf4j - slf4j-simple - 1.8.0-beta4 - @@ -85,17 +80,17 @@ org.apache.logging.log4j log4j-api - 2.17.1 + 2.17.2 org.apache.logging.log4j log4j-core - 2.17.1 + 2.17.2 org.junit.jupiter junit-jupiter-engine - 5.8.1 + 5.8.2 test From de16533e421da3ef7e3a78cfb4edd1cd8fe62cf1 Mon Sep 17 00:00:00 2001 From: Darin Kelkhoff Date: Tue, 14 Jun 2022 12:21:26 -0500 Subject: [PATCH 15/30] Add fullyAnonymous authentication --- .../sampleapp/SampleMetaDataProvider.java | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/src/main/java/com/kingsrook/sampleapp/SampleMetaDataProvider.java b/src/main/java/com/kingsrook/sampleapp/SampleMetaDataProvider.java index 3e61d425..cf9bd2e3 100644 --- a/src/main/java/com/kingsrook/sampleapp/SampleMetaDataProvider.java +++ b/src/main/java/com/kingsrook/sampleapp/SampleMetaDataProvider.java @@ -22,6 +22,7 @@ package com.kingsrook.sampleapp; +import com.kingsrook.qqq.backend.core.model.metadata.QAuthenticationMetaData; import com.kingsrook.qqq.backend.core.model.metadata.QBackendMetaData; import com.kingsrook.qqq.backend.core.model.metadata.QFieldMetaData; import com.kingsrook.qqq.backend.core.model.metadata.QFieldType; @@ -44,6 +45,7 @@ public class SampleMetaDataProvider public static QInstance defineInstance() { QInstance qInstance = new QInstance(); + qInstance.setAuthentication(SampleMetaDataProvider.defineAuthentication()); qInstance.addBackend(SampleMetaDataProvider.defineBackend()); qInstance.addTable(SampleMetaDataProvider.defineTableCarrier()); qInstance.addTable(SampleMetaDataProvider.defineTablePerson()); @@ -52,6 +54,18 @@ public class SampleMetaDataProvider + /******************************************************************************* + ** + *******************************************************************************/ + private static QAuthenticationMetaData defineAuthentication() + { + return new QAuthenticationMetaData() + .withName("Anonymous") + .withType("fullyAnonymous"); + } + + + /******************************************************************************* ** *******************************************************************************/ From 5d99a5b613a673f4e571e07d683492627fd5d964 Mon Sep 17 00:00:00 2001 From: Darin Kelkhoff Date: Tue, 5 Jul 2022 13:42:44 -0500 Subject: [PATCH 16/30] Checkpoint - working with initial version 0.1.0-SNAPSHOT's --- .circleci/config.yml | 20 +-- .gitignore | 2 + checkstyle.xml | 4 +- pom.xml | 30 ++++- .../com/kingsrook/sampleapp/SampleCli.java | 17 ++- .../sampleapp/SampleJavalinServer.java | 27 ++-- .../sampleapp/SampleMetaDataProvider.java | 120 ++++++++++++++--- .../FedExInvoiceCSVSyntaxFixer.java | 46 +++++++ .../sampleapp/SampleMetaDataProviderTest.java | 126 ++++++++++++++++++ 9 files changed, 338 insertions(+), 54 deletions(-) create mode 100644 src/main/java/com/kingsrook/sampleapp/customizers/FedExInvoiceCSVSyntaxFixer.java create mode 100644 src/test/java/com/kingsrook/sampleapp/SampleMetaDataProviderTest.java diff --git a/.circleci/config.yml b/.circleci/config.yml index 8eaa8e76..0f486b7b 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -1,3 +1,5 @@ +## Deviations from qqq-java library standard circleci config: +## - In this project, we just always run a test, never a deploy (at this time). version: 2.1 executors: @@ -59,20 +61,4 @@ workflows: jobs: - mvn_test: context: [ qqq-maven-registry-credentials, kingsrook-slack ] -## just doing mvn test for all branches in this repo at this time -## filters: -## branches: -## ignore: /dev/ -## tags: -## ignore: /version-.*/ -## -## deploy: -## jobs: -## - mvn_deploy: -## context: [ qqq-maven-registry-credentials, kingsrook-slack ] -## filters: -## branches: -## only: /dev/ -## tags: -## only: /version-.*/ -## + diff --git a/.gitignore b/.gitignore index 39736a21..cb6506b2 100644 --- a/.gitignore +++ b/.gitignore @@ -28,3 +28,5 @@ target/ # virtual machine crash logs, see http://www.java.com/en/download/help/error_hotspot.xml hs_err_pid* + +.DS_Store diff --git a/checkstyle.xml b/checkstyle.xml index dbaa3479..76f872ed 100644 --- a/checkstyle.xml +++ b/checkstyle.xml @@ -46,6 +46,7 @@ --> + @@ -171,7 +172,7 @@ - + @@ -47,25 +47,31 @@ com.kingsrook.qqq qqq-backend-core - 0.0.0-SNAPSHOT + 0.1.0-SNAPSHOT compile com.kingsrook.qqq qqq-backend-module-rdbms - 0.0.0-SNAPSHOT + 0.1.0-SNAPSHOT + compile + + + com.kingsrook.qqq + qqq-backend-module-filesystem + 0.1.0-SNAPSHOT compile com.kingsrook.qqq qqq-middleware-javalin - 0.0.0-SNAPSHOT + 0.1.0-SNAPSHOT compile com.kingsrook.qqq qqq-middleware-picocli - 0.0.0-SNAPSHOT + 0.1.0-SNAPSHOT compile @@ -98,7 +104,19 @@ - + + maven-assembly-plugin + + + jar-with-dependencies + + + + com.kingsrook.sampleapp.SampleCli + + + + diff --git a/src/main/java/com/kingsrook/sampleapp/SampleCli.java b/src/main/java/com/kingsrook/sampleapp/SampleCli.java index 8f2bece8..b8f0d4ab 100644 --- a/src/main/java/com/kingsrook/sampleapp/SampleCli.java +++ b/src/main/java/com/kingsrook/sampleapp/SampleCli.java @@ -46,9 +46,18 @@ public class SampleCli *******************************************************************************/ private void run(String[] args) { - QInstance qInstance = SampleMetaDataProvider.defineInstance(); - QPicoCliImplementation qPicoCliImplementation = new QPicoCliImplementation(qInstance); - int exitCode = qPicoCliImplementation.runCli("my-sample-cli", args); - System.exit(exitCode); + try + { + QInstance qInstance = SampleMetaDataProvider.defineInstance(); + QPicoCliImplementation qPicoCliImplementation = new QPicoCliImplementation(qInstance); + int exitCode = qPicoCliImplementation.runCli("my-sample-cli", args); + System.exit(exitCode); + } + catch(Exception e) + { + e.printStackTrace(); + System.exit(-1); + } } + } diff --git a/src/main/java/com/kingsrook/sampleapp/SampleJavalinServer.java b/src/main/java/com/kingsrook/sampleapp/SampleJavalinServer.java index afe0fb8c..3a3406c0 100644 --- a/src/main/java/com/kingsrook/sampleapp/SampleJavalinServer.java +++ b/src/main/java/com/kingsrook/sampleapp/SampleJavalinServer.java @@ -57,17 +57,24 @@ public class SampleJavalinServer *******************************************************************************/ public void startJavalinServer() { - qInstance = SampleMetaDataProvider.defineInstance(); - - QJavalinImplementation qJavalinImplementation = new QJavalinImplementation(qInstance); - Javalin service = Javalin.create(config -> + try { - // todo - not all!! - config.enableCorsForAllOrigins(); - }).start(PORT); - service.routes(qJavalinImplementation.getRoutes()); - service.after(ctx -> - ctx.res.setHeader("Access-Control-Allow-Origin", "http://localhost:3000")); + qInstance = SampleMetaDataProvider.defineInstance(); + + QJavalinImplementation qJavalinImplementation = new QJavalinImplementation(qInstance); + Javalin service = Javalin.create(config -> + { + // todo - not all!! + config.enableCorsForAllOrigins(); + }).start(PORT); + service.routes(qJavalinImplementation.getRoutes()); + service.after(ctx -> + ctx.res.setHeader("Access-Control-Allow-Origin", "http://localhost:3000")); + } + catch(Exception e) + { + LOG.error("Failed to start javalin server. See stack trace for details.", e); + } } } diff --git a/src/main/java/com/kingsrook/sampleapp/SampleMetaDataProvider.java b/src/main/java/com/kingsrook/sampleapp/SampleMetaDataProvider.java index cf9bd2e3..4d834ad8 100644 --- a/src/main/java/com/kingsrook/sampleapp/SampleMetaDataProvider.java +++ b/src/main/java/com/kingsrook/sampleapp/SampleMetaDataProvider.java @@ -22,12 +22,28 @@ package com.kingsrook.sampleapp; +import java.util.List; +import com.kingsrook.qqq.backend.core.exceptions.QException; +import com.kingsrook.qqq.backend.core.interfaces.mock.MockBackendStep; import com.kingsrook.qqq.backend.core.model.metadata.QAuthenticationMetaData; import com.kingsrook.qqq.backend.core.model.metadata.QBackendMetaData; +import com.kingsrook.qqq.backend.core.model.metadata.QCodeReference; +import com.kingsrook.qqq.backend.core.model.metadata.QCodeType; +import com.kingsrook.qqq.backend.core.model.metadata.QCodeUsage; import com.kingsrook.qqq.backend.core.model.metadata.QFieldMetaData; import com.kingsrook.qqq.backend.core.model.metadata.QFieldType; import com.kingsrook.qqq.backend.core.model.metadata.QInstance; import com.kingsrook.qqq.backend.core.model.metadata.QTableMetaData; +import com.kingsrook.qqq.backend.core.model.metadata.processes.QBackendStepMetaData; +import com.kingsrook.qqq.backend.core.model.metadata.processes.QFunctionInputMetaData; +import com.kingsrook.qqq.backend.core.model.metadata.processes.QFunctionOutputMetaData; +import com.kingsrook.qqq.backend.core.model.metadata.processes.QProcessMetaData; +import com.kingsrook.qqq.backend.core.model.metadata.processes.QRecordListMetaData; +import com.kingsrook.qqq.backend.module.filesystem.base.model.metadata.Cardinality; +import com.kingsrook.qqq.backend.module.filesystem.base.model.metadata.RecordFormat; +import com.kingsrook.qqq.backend.module.filesystem.local.model.metadata.FilesystemBackendMetaData; +import com.kingsrook.qqq.backend.module.filesystem.local.model.metadata.FilesystemTableBackendDetails; +import com.kingsrook.qqq.backend.module.rdbms.model.metadata.RDBMSBackendMetaData; /******************************************************************************* @@ -35,20 +51,27 @@ import com.kingsrook.qqq.backend.core.model.metadata.QTableMetaData; *******************************************************************************/ public class SampleMetaDataProvider { - private static final String BACKEND_NAME = "default"; + public static final String MYSQL_BACKEND_NAME = "mysql"; + public static final String FILESYSTEM_BACKEND_NAME = "filesystem"; + public static final String PROCESS_NAME_GREET = "greet"; /******************************************************************************* ** *******************************************************************************/ - public static QInstance defineInstance() + public static QInstance defineInstance() throws QException { QInstance qInstance = new QInstance(); + qInstance.setAuthentication(SampleMetaDataProvider.defineAuthentication()); - qInstance.addBackend(SampleMetaDataProvider.defineBackend()); + qInstance.addBackend(SampleMetaDataProvider.defineMysqlBackend()); + qInstance.addBackend(SampleMetaDataProvider.defineFilesystemBackend()); qInstance.addTable(SampleMetaDataProvider.defineTableCarrier()); qInstance.addTable(SampleMetaDataProvider.defineTablePerson()); + qInstance.addTable(SampleMetaDataProvider.defineTableCityFile()); + qInstance.addProcess(SampleMetaDataProvider.defineProcessGreetPeople()); + return (qInstance); } @@ -69,18 +92,28 @@ public class SampleMetaDataProvider /******************************************************************************* ** *******************************************************************************/ - public static QBackendMetaData defineBackend() + public static QBackendMetaData defineMysqlBackend() { - QBackendMetaData backend = new QBackendMetaData(); - backend.setName(BACKEND_NAME); - backend.setType("rdbms"); - backend.setValue("vendor", "mysql"); - backend.setValue("hostName", "127.0.0.1"); - backend.setValue("port", "3306"); - backend.setValue("databaseName", "opspath"); - backend.setValue("username", "root"); - backend.setValue("password", "8BNWyoav8s79oi}Lqk"); // todo - load securely - return (backend); + return new RDBMSBackendMetaData() + .withVendor("mysql") + .withHostName("127.0.0.1") + .withPort(3306) + .withDatabaseName("sample_project") + .withUsername("root") + .withPassword("8BNWyoav8s79oi}Lqk") // todo - load securely + .withName(MYSQL_BACKEND_NAME); + } + + + + /******************************************************************************* + ** + *******************************************************************************/ + public static FilesystemBackendMetaData defineFilesystemBackend() + { + return new FilesystemBackendMetaData() + .withBasePath("/tmp/sample-filesystem") + .withName(FILESYSTEM_BACKEND_NAME); } @@ -92,7 +125,7 @@ public class SampleMetaDataProvider { QTableMetaData table = new QTableMetaData(); table.setName("carrier"); - table.setBackendName(BACKEND_NAME); + table.setBackendName(MYSQL_BACKEND_NAME); table.setPrimaryKeyField("id"); table.addField(new QFieldMetaData("id", QFieldType.INTEGER)); @@ -118,7 +151,7 @@ public class SampleMetaDataProvider return new QTableMetaData() .withName("person") .withLabel("Person") - .withBackendName(BACKEND_NAME) + .withBackendName(MYSQL_BACKEND_NAME) .withPrimaryKeyField("id") .withField(new QFieldMetaData("id", QFieldType.INTEGER)) .withField(new QFieldMetaData("createDate", QFieldType.DATE_TIME).withBackendName("create_date")) @@ -128,4 +161,59 @@ public class SampleMetaDataProvider .withField(new QFieldMetaData("birthDate", QFieldType.DATE).withBackendName("birth_date")) .withField(new QFieldMetaData("email", QFieldType.STRING)); } + + + + /******************************************************************************* + ** + *******************************************************************************/ + public static QTableMetaData defineTableCityFile() + { + return new QTableMetaData() + .withName("city") + .withLabel("Cities") + .withBackendName(FILESYSTEM_BACKEND_NAME) + .withPrimaryKeyField("id") + .withField(new QFieldMetaData("id", QFieldType.INTEGER)) + .withField(new QFieldMetaData("name", QFieldType.STRING)) + .withField(new QFieldMetaData("state", QFieldType.STRING)) // todo - state PVS. + .withBackendDetails(new FilesystemTableBackendDetails() + .withBasePath("cities") + .withCardinality(Cardinality.MANY) + .withRecordFormat(RecordFormat.CSV) + ); + } + + + + /******************************************************************************* + ** Define the 'greet people' process + *******************************************************************************/ + private static QProcessMetaData defineProcessGreetPeople() + { + return new QProcessMetaData() + .withName(PROCESS_NAME_GREET) + .withLabel("Greet People") + .withTableName("person") + .addStep(new QBackendStepMetaData() + .withName("prepare") + .withCode(new QCodeReference() + .withName(MockBackendStep.class.getName()) + .withCodeType(QCodeType.JAVA) + .withCodeUsage(QCodeUsage.FUNCTION)) // todo - needed, or implied in this context? + .withInputData(new QFunctionInputMetaData() + .withRecordListMetaData(new QRecordListMetaData().withTableName("person")) + .withFieldList(List.of( + new QFieldMetaData("greetingPrefix", QFieldType.STRING), + new QFieldMetaData("greetingSuffix", QFieldType.STRING) + ))) + .withOutputMetaData(new QFunctionOutputMetaData() + .withRecordListMetaData(new QRecordListMetaData() + .withTableName("person") + .addField(new QFieldMetaData("fullGreeting", QFieldType.STRING)) + ) + .withFieldList(List.of(new QFieldMetaData("outputMessage", QFieldType.STRING)))) + ); + } + } diff --git a/src/main/java/com/kingsrook/sampleapp/customizers/FedExInvoiceCSVSyntaxFixer.java b/src/main/java/com/kingsrook/sampleapp/customizers/FedExInvoiceCSVSyntaxFixer.java new file mode 100644 index 00000000..ec76b244 --- /dev/null +++ b/src/main/java/com/kingsrook/sampleapp/customizers/FedExInvoiceCSVSyntaxFixer.java @@ -0,0 +1,46 @@ +/* + * QQQ - Low-code Application Framework for Engineers. + * Copyright (C) 2021-2022. Kingsrook, LLC + * 651 N Broad St Ste 205 # 6917 | Middletown DE 19709 | United States + * contact@kingsrook.com + * https://github.com/Kingsrook/ + * + * 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 com.kingsrook.sampleapp.customizers; + + +import java.util.function.Function; + + +/******************************************************************************* + ** The fedex invoice files - they're CSV, but they have a handful of values + ** that we can't read, because they have an extra quote (") character within + ** a field. + ** + ** It always looks like: {"u + ** This function fixes it by stripping the " out of the middle, to just be: {u + *******************************************************************************/ +public class FedExInvoiceCSVSyntaxFixer implements Function +{ + /******************************************************************************* + ** + *******************************************************************************/ + @Override + public String apply(String s) + { + return (s.replaceAll("\\{\"u", "{u")); + } +} diff --git a/src/test/java/com/kingsrook/sampleapp/SampleMetaDataProviderTest.java b/src/test/java/com/kingsrook/sampleapp/SampleMetaDataProviderTest.java new file mode 100644 index 00000000..50317d14 --- /dev/null +++ b/src/test/java/com/kingsrook/sampleapp/SampleMetaDataProviderTest.java @@ -0,0 +1,126 @@ +/* + * QQQ - Low-code Application Framework for Engineers. + * Copyright (C) 2021-2022. Kingsrook, LLC + * 651 N Broad St Ste 205 # 6917 | Middletown DE 19709 | United States + * contact@kingsrook.com + * https://github.com/Kingsrook/ + * + * 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 com.kingsrook.sampleapp; + + +import java.io.File; +import java.io.IOException; +import java.util.UUID; +import com.kingsrook.qqq.backend.core.actions.QueryAction; +import com.kingsrook.qqq.backend.core.actions.RunProcessAction; +import com.kingsrook.qqq.backend.core.interfaces.mock.MockBackendStep; +import com.kingsrook.qqq.backend.core.model.actions.processes.RunProcessRequest; +import com.kingsrook.qqq.backend.core.model.actions.processes.RunProcessResult; +import com.kingsrook.qqq.backend.core.model.actions.query.QueryRequest; +import com.kingsrook.qqq.backend.core.model.actions.query.QueryResult; +import com.kingsrook.qqq.backend.core.model.metadata.QInstance; +import com.kingsrook.qqq.backend.core.model.metadata.QTableMetaData; +import com.kingsrook.qqq.backend.core.model.session.QSession; +import com.kingsrook.qqq.backend.module.filesystem.local.actions.FilesystemQueryAction; +import com.kingsrook.qqq.backend.module.filesystem.local.model.metadata.FilesystemTableBackendDetails; +import org.apache.commons.io.FileUtils; +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.Test; +import static org.junit.jupiter.api.Assertions.assertNotNull; +import static org.junit.jupiter.api.Assertions.assertNull; +import static org.junit.jupiter.api.Assertions.assertTrue; + + +/******************************************************************************* + ** + *******************************************************************************/ +class SampleMetaDataProviderTest +{ + + /******************************************************************************* + ** + *******************************************************************************/ + @Test + public void testCityFileTable() throws Exception + { + QTableMetaData fileTable = SampleMetaDataProvider.defineTableCityFile(); + File destinationFile = copyTestFileToRandomNameUnderTable(fileTable); + + try + { + QueryRequest queryRequest = new QueryRequest(); + queryRequest.setInstance(SampleMetaDataProvider.defineInstance()); + queryRequest.setTableName(fileTable.getName()); + + QueryResult queryResult = new FilesystemQueryAction().execute(queryRequest); + System.out.println(queryResult); + Assertions.assertEquals(3, queryResult.getRecords().size(), "Should load all records from the file"); + } + finally + { + destinationFile.delete(); + } + } + + + + private File copyTestFileToRandomNameUnderTable(QTableMetaData fedExTable) throws IOException + { + File destinationDir = new File(SampleMetaDataProvider.defineFilesystemBackend().getBasePath() + File.separator + + ((FilesystemTableBackendDetails) fedExTable.getBackendDetails()).getBasePath()); + destinationDir.mkdirs(); + File destinationFile = new File(destinationDir.getAbsolutePath() + File.separator + UUID.randomUUID()); + + FileUtils.writeStringToFile(destinationFile, """ + id,name,state + 1,Chester,IL + 2,Red Bud,IL + 3,Sparta,IL"""); + + return destinationFile; + } + + + + /******************************************************************************* + ** + *******************************************************************************/ + @Test + public void testGreetProcess() throws Exception + { + QInstance qInstance = SampleMetaDataProvider.defineInstance(); + QTableMetaData personTable = SampleMetaDataProvider.defineTablePerson(); + RunProcessRequest request = new RunProcessRequest(qInstance); + request.setSession(new QSession()); + request.setProcessName(SampleMetaDataProvider.PROCESS_NAME_GREET); + + QueryRequest queryRequest = new QueryRequest(qInstance); + queryRequest.setTableName(personTable.getName()); + queryRequest.setSession(new QSession()); + QueryResult queryResult = new QueryAction().execute(queryRequest); + + request.setRecords(queryResult.getRecords()); + request.addValue(MockBackendStep.FIELD_GREETING_PREFIX, "Hello"); + request.addValue(MockBackendStep.FIELD_GREETING_SUFFIX, "there"); + + RunProcessResult result = new RunProcessAction().execute(request); + assertNotNull(result); + assertNull(result.getError()); + assertTrue(result.getRecords().stream().allMatch(r -> r.getValues().containsKey("id")), "records should have an id, set by the process"); + } + +} \ No newline at end of file From 933cd2a6ed7a778101a5e238e0244ecdfe4fc43b Mon Sep 17 00:00:00 2001 From: Darin Kelkhoff Date: Tue, 5 Jul 2022 13:53:01 -0500 Subject: [PATCH 17/30] Reverting to 'Function' from 'BackendStep' (that's new in the 0.1 line) --- .../com/kingsrook/sampleapp/SampleMetaDataProvider.java | 8 ++++---- .../kingsrook/sampleapp/SampleMetaDataProviderTest.java | 5 ++--- 2 files changed, 6 insertions(+), 7 deletions(-) diff --git a/src/main/java/com/kingsrook/sampleapp/SampleMetaDataProvider.java b/src/main/java/com/kingsrook/sampleapp/SampleMetaDataProvider.java index 4d834ad8..8cee65c3 100644 --- a/src/main/java/com/kingsrook/sampleapp/SampleMetaDataProvider.java +++ b/src/main/java/com/kingsrook/sampleapp/SampleMetaDataProvider.java @@ -24,7 +24,7 @@ package com.kingsrook.sampleapp; import java.util.List; import com.kingsrook.qqq.backend.core.exceptions.QException; -import com.kingsrook.qqq.backend.core.interfaces.mock.MockBackendStep; +import com.kingsrook.qqq.backend.core.interfaces.mock.MockFunctionBody; import com.kingsrook.qqq.backend.core.model.metadata.QAuthenticationMetaData; import com.kingsrook.qqq.backend.core.model.metadata.QBackendMetaData; import com.kingsrook.qqq.backend.core.model.metadata.QCodeReference; @@ -34,8 +34,8 @@ import com.kingsrook.qqq.backend.core.model.metadata.QFieldMetaData; import com.kingsrook.qqq.backend.core.model.metadata.QFieldType; import com.kingsrook.qqq.backend.core.model.metadata.QInstance; import com.kingsrook.qqq.backend.core.model.metadata.QTableMetaData; -import com.kingsrook.qqq.backend.core.model.metadata.processes.QBackendStepMetaData; import com.kingsrook.qqq.backend.core.model.metadata.processes.QFunctionInputMetaData; +import com.kingsrook.qqq.backend.core.model.metadata.processes.QFunctionMetaData; import com.kingsrook.qqq.backend.core.model.metadata.processes.QFunctionOutputMetaData; import com.kingsrook.qqq.backend.core.model.metadata.processes.QProcessMetaData; import com.kingsrook.qqq.backend.core.model.metadata.processes.QRecordListMetaData; @@ -195,10 +195,10 @@ public class SampleMetaDataProvider .withName(PROCESS_NAME_GREET) .withLabel("Greet People") .withTableName("person") - .addStep(new QBackendStepMetaData() + .addFunction(new QFunctionMetaData() .withName("prepare") .withCode(new QCodeReference() - .withName(MockBackendStep.class.getName()) + .withName(MockFunctionBody.class.getName()) .withCodeType(QCodeType.JAVA) .withCodeUsage(QCodeUsage.FUNCTION)) // todo - needed, or implied in this context? .withInputData(new QFunctionInputMetaData() diff --git a/src/test/java/com/kingsrook/sampleapp/SampleMetaDataProviderTest.java b/src/test/java/com/kingsrook/sampleapp/SampleMetaDataProviderTest.java index 50317d14..097b9764 100644 --- a/src/test/java/com/kingsrook/sampleapp/SampleMetaDataProviderTest.java +++ b/src/test/java/com/kingsrook/sampleapp/SampleMetaDataProviderTest.java @@ -27,7 +27,6 @@ import java.io.IOException; import java.util.UUID; import com.kingsrook.qqq.backend.core.actions.QueryAction; import com.kingsrook.qqq.backend.core.actions.RunProcessAction; -import com.kingsrook.qqq.backend.core.interfaces.mock.MockBackendStep; import com.kingsrook.qqq.backend.core.model.actions.processes.RunProcessRequest; import com.kingsrook.qqq.backend.core.model.actions.processes.RunProcessResult; import com.kingsrook.qqq.backend.core.model.actions.query.QueryRequest; @@ -114,8 +113,8 @@ class SampleMetaDataProviderTest QueryResult queryResult = new QueryAction().execute(queryRequest); request.setRecords(queryResult.getRecords()); - request.addValue(MockBackendStep.FIELD_GREETING_PREFIX, "Hello"); - request.addValue(MockBackendStep.FIELD_GREETING_SUFFIX, "there"); + request.addValue("greetingPrefix", "Hello"); + request.addValue("greetingSuffix", "there"); RunProcessResult result = new RunProcessAction().execute(request); assertNotNull(result); From cab8a4b794704776445872b96ac983f11db85cd1 Mon Sep 17 00:00:00 2001 From: Darin Kelkhoff Date: Wed, 6 Jul 2022 13:57:48 -0500 Subject: [PATCH 18/30] QQQ-21 updated per updated backend-core - process function -> step renames --- .../sampleapp/SampleMetaDataProvider.java | 73 +++++++++++++++---- .../sampleapp/SampleMetaDataProviderTest.java | 5 +- 2 files changed, 62 insertions(+), 16 deletions(-) diff --git a/src/main/java/com/kingsrook/sampleapp/SampleMetaDataProvider.java b/src/main/java/com/kingsrook/sampleapp/SampleMetaDataProvider.java index 8cee65c3..dd8e3c2f 100644 --- a/src/main/java/com/kingsrook/sampleapp/SampleMetaDataProvider.java +++ b/src/main/java/com/kingsrook/sampleapp/SampleMetaDataProvider.java @@ -24,7 +24,7 @@ package com.kingsrook.sampleapp; import java.util.List; import com.kingsrook.qqq.backend.core.exceptions.QException; -import com.kingsrook.qqq.backend.core.interfaces.mock.MockFunctionBody; +import com.kingsrook.qqq.backend.core.interfaces.mock.MockBackendStep; import com.kingsrook.qqq.backend.core.model.metadata.QAuthenticationMetaData; import com.kingsrook.qqq.backend.core.model.metadata.QBackendMetaData; import com.kingsrook.qqq.backend.core.model.metadata.QCodeReference; @@ -34,8 +34,9 @@ import com.kingsrook.qqq.backend.core.model.metadata.QFieldMetaData; import com.kingsrook.qqq.backend.core.model.metadata.QFieldType; import com.kingsrook.qqq.backend.core.model.metadata.QInstance; import com.kingsrook.qqq.backend.core.model.metadata.QTableMetaData; +import com.kingsrook.qqq.backend.core.model.metadata.processes.QBackendStepMetaData; +import com.kingsrook.qqq.backend.core.model.metadata.processes.QFrontendStepMetaData; import com.kingsrook.qqq.backend.core.model.metadata.processes.QFunctionInputMetaData; -import com.kingsrook.qqq.backend.core.model.metadata.processes.QFunctionMetaData; import com.kingsrook.qqq.backend.core.model.metadata.processes.QFunctionOutputMetaData; import com.kingsrook.qqq.backend.core.model.metadata.processes.QProcessMetaData; import com.kingsrook.qqq.backend.core.model.metadata.processes.QRecordListMetaData; @@ -51,9 +52,10 @@ import com.kingsrook.qqq.backend.module.rdbms.model.metadata.RDBMSBackendMetaDat *******************************************************************************/ public class SampleMetaDataProvider { - public static final String MYSQL_BACKEND_NAME = "mysql"; - public static final String FILESYSTEM_BACKEND_NAME = "filesystem"; - public static final String PROCESS_NAME_GREET = "greet"; + public static final String MYSQL_BACKEND_NAME = "mysql"; + public static final String FILESYSTEM_BACKEND_NAME = "filesystem"; + public static final String PROCESS_NAME_GREET = "greet"; + public static final String PROCESS_NAME_GREET_INTERACTIVE = "greetInteractive"; @@ -64,13 +66,14 @@ public class SampleMetaDataProvider { QInstance qInstance = new QInstance(); - qInstance.setAuthentication(SampleMetaDataProvider.defineAuthentication()); - qInstance.addBackend(SampleMetaDataProvider.defineMysqlBackend()); - qInstance.addBackend(SampleMetaDataProvider.defineFilesystemBackend()); - qInstance.addTable(SampleMetaDataProvider.defineTableCarrier()); - qInstance.addTable(SampleMetaDataProvider.defineTablePerson()); - qInstance.addTable(SampleMetaDataProvider.defineTableCityFile()); - qInstance.addProcess(SampleMetaDataProvider.defineProcessGreetPeople()); + qInstance.setAuthentication(defineAuthentication()); + qInstance.addBackend(defineMysqlBackend()); + qInstance.addBackend(defineFilesystemBackend()); + qInstance.addTable(defineTableCarrier()); + qInstance.addTable(defineTablePerson()); + qInstance.addTable(defineTableCityFile()); + qInstance.addProcess(defineProcessGreetPeople()); + qInstance.addProcess(defineProcessGreetPeopleInteractive()); return (qInstance); } @@ -195,10 +198,10 @@ public class SampleMetaDataProvider .withName(PROCESS_NAME_GREET) .withLabel("Greet People") .withTableName("person") - .addFunction(new QFunctionMetaData() + .addStep(new QBackendStepMetaData() .withName("prepare") .withCode(new QCodeReference() - .withName(MockFunctionBody.class.getName()) + .withName(MockBackendStep.class.getName()) .withCodeType(QCodeType.JAVA) .withCodeUsage(QCodeUsage.FUNCTION)) // todo - needed, or implied in this context? .withInputData(new QFunctionInputMetaData() @@ -216,4 +219,46 @@ public class SampleMetaDataProvider ); } + + + /******************************************************************************* + ** Define an interactive version of the 'greet people' process + *******************************************************************************/ + private static QProcessMetaData defineProcessGreetPeopleInteractive() + { + return new QProcessMetaData() + .withName(PROCESS_NAME_GREET_INTERACTIVE) + .withTableName("person") + + .addStep(new QFrontendStepMetaData() + .withName("setup") + .withFormField(new QFieldMetaData("greetingPrefix", QFieldType.STRING)) + .withFormField(new QFieldMetaData("greetingSuffix", QFieldType.STRING)) + ) + + .addStep(new QBackendStepMetaData() + .withName("doWork") + .withCode(new QCodeReference() + .withName(MockBackendStep.class.getName()) + .withCodeType(QCodeType.JAVA) + .withCodeUsage(QCodeUsage.FUNCTION)) // todo - needed, or implied in this context? + .withInputData(new QFunctionInputMetaData() + .withRecordListMetaData(new QRecordListMetaData().withTableName("person")) + .withFieldList(List.of( + new QFieldMetaData("greetingPrefix", QFieldType.STRING), + new QFieldMetaData("greetingSuffix", QFieldType.STRING) + ))) + .withOutputMetaData(new QFunctionOutputMetaData() + .withRecordListMetaData(new QRecordListMetaData() + .withTableName("person") + .addField(new QFieldMetaData("fullGreeting", QFieldType.STRING)) + ) + .withFieldList(List.of(new QFieldMetaData("outputMessage", QFieldType.STRING)))) + ) + + .addStep(new QFrontendStepMetaData() + .withName("results") + .withFormField(new QFieldMetaData("outputMessage", QFieldType.STRING)) + ); + } } diff --git a/src/test/java/com/kingsrook/sampleapp/SampleMetaDataProviderTest.java b/src/test/java/com/kingsrook/sampleapp/SampleMetaDataProviderTest.java index 097b9764..50317d14 100644 --- a/src/test/java/com/kingsrook/sampleapp/SampleMetaDataProviderTest.java +++ b/src/test/java/com/kingsrook/sampleapp/SampleMetaDataProviderTest.java @@ -27,6 +27,7 @@ import java.io.IOException; import java.util.UUID; import com.kingsrook.qqq.backend.core.actions.QueryAction; import com.kingsrook.qqq.backend.core.actions.RunProcessAction; +import com.kingsrook.qqq.backend.core.interfaces.mock.MockBackendStep; import com.kingsrook.qqq.backend.core.model.actions.processes.RunProcessRequest; import com.kingsrook.qqq.backend.core.model.actions.processes.RunProcessResult; import com.kingsrook.qqq.backend.core.model.actions.query.QueryRequest; @@ -113,8 +114,8 @@ class SampleMetaDataProviderTest QueryResult queryResult = new QueryAction().execute(queryRequest); request.setRecords(queryResult.getRecords()); - request.addValue("greetingPrefix", "Hello"); - request.addValue("greetingSuffix", "there"); + request.addValue(MockBackendStep.FIELD_GREETING_PREFIX, "Hello"); + request.addValue(MockBackendStep.FIELD_GREETING_SUFFIX, "there"); RunProcessResult result = new RunProcessAction().execute(request); assertNotNull(result); From 251570128d6c997510b16e3da56247131d377b04 Mon Sep 17 00:00:00 2001 From: Tim Chamberlain Date: Wed, 6 Jul 2022 16:00:44 -0500 Subject: [PATCH 19/30] QQQ-21: Updates due to backend core changes --- .../kingsrook/sampleapp/SampleMetaDataProvider.java | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/src/main/java/com/kingsrook/sampleapp/SampleMetaDataProvider.java b/src/main/java/com/kingsrook/sampleapp/SampleMetaDataProvider.java index 8cee65c3..c9bf7022 100644 --- a/src/main/java/com/kingsrook/sampleapp/SampleMetaDataProvider.java +++ b/src/main/java/com/kingsrook/sampleapp/SampleMetaDataProvider.java @@ -24,7 +24,7 @@ package com.kingsrook.sampleapp; import java.util.List; import com.kingsrook.qqq.backend.core.exceptions.QException; -import com.kingsrook.qqq.backend.core.interfaces.mock.MockFunctionBody; +import com.kingsrook.qqq.backend.core.interfaces.mock.MockBackendStep; import com.kingsrook.qqq.backend.core.model.metadata.QAuthenticationMetaData; import com.kingsrook.qqq.backend.core.model.metadata.QBackendMetaData; import com.kingsrook.qqq.backend.core.model.metadata.QCodeReference; @@ -35,7 +35,7 @@ import com.kingsrook.qqq.backend.core.model.metadata.QFieldType; import com.kingsrook.qqq.backend.core.model.metadata.QInstance; import com.kingsrook.qqq.backend.core.model.metadata.QTableMetaData; import com.kingsrook.qqq.backend.core.model.metadata.processes.QFunctionInputMetaData; -import com.kingsrook.qqq.backend.core.model.metadata.processes.QFunctionMetaData; +import com.kingsrook.qqq.backend.core.model.metadata.processes.QBackendStepMetaData; import com.kingsrook.qqq.backend.core.model.metadata.processes.QFunctionOutputMetaData; import com.kingsrook.qqq.backend.core.model.metadata.processes.QProcessMetaData; import com.kingsrook.qqq.backend.core.model.metadata.processes.QRecordListMetaData; @@ -156,8 +156,8 @@ public class SampleMetaDataProvider .withField(new QFieldMetaData("id", QFieldType.INTEGER)) .withField(new QFieldMetaData("createDate", QFieldType.DATE_TIME).withBackendName("create_date")) .withField(new QFieldMetaData("modifyDate", QFieldType.DATE_TIME).withBackendName("modify_date")) - .withField(new QFieldMetaData("firstName", QFieldType.STRING).withBackendName("first_name")) - .withField(new QFieldMetaData("lastName", QFieldType.STRING).withBackendName("last_name")) + .withField(new QFieldMetaData("firstName", QFieldType.STRING).withBackendName("first_name").withIsRequired(true)) + .withField(new QFieldMetaData("lastName", QFieldType.STRING).withBackendName("last_name").withIsRequired(true)) .withField(new QFieldMetaData("birthDate", QFieldType.DATE).withBackendName("birth_date")) .withField(new QFieldMetaData("email", QFieldType.STRING)); } @@ -195,10 +195,10 @@ public class SampleMetaDataProvider .withName(PROCESS_NAME_GREET) .withLabel("Greet People") .withTableName("person") - .addFunction(new QFunctionMetaData() + .addStep(new QBackendStepMetaData() .withName("prepare") .withCode(new QCodeReference() - .withName(MockFunctionBody.class.getName()) + .withName(MockBackendStep.class.getName()) .withCodeType(QCodeType.JAVA) .withCodeUsage(QCodeUsage.FUNCTION)) // todo - needed, or implied in this context? .withInputData(new QFunctionInputMetaData() From 5f4124d3c1a6b5d01dccb43b96da5bb7dced9a0f Mon Sep 17 00:00:00 2001 From: Tim Chamberlain Date: Wed, 6 Jul 2022 16:15:19 -0500 Subject: [PATCH 20/30] QQQ-21: fixed import order --- .../kingsrook/sampleapp/SampleMetaDataProvider.java | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/main/java/com/kingsrook/sampleapp/SampleMetaDataProvider.java b/src/main/java/com/kingsrook/sampleapp/SampleMetaDataProvider.java index c9bf7022..eeb94553 100644 --- a/src/main/java/com/kingsrook/sampleapp/SampleMetaDataProvider.java +++ b/src/main/java/com/kingsrook/sampleapp/SampleMetaDataProvider.java @@ -34,8 +34,8 @@ import com.kingsrook.qqq.backend.core.model.metadata.QFieldMetaData; import com.kingsrook.qqq.backend.core.model.metadata.QFieldType; import com.kingsrook.qqq.backend.core.model.metadata.QInstance; import com.kingsrook.qqq.backend.core.model.metadata.QTableMetaData; -import com.kingsrook.qqq.backend.core.model.metadata.processes.QFunctionInputMetaData; import com.kingsrook.qqq.backend.core.model.metadata.processes.QBackendStepMetaData; +import com.kingsrook.qqq.backend.core.model.metadata.processes.QFunctionInputMetaData; import com.kingsrook.qqq.backend.core.model.metadata.processes.QFunctionOutputMetaData; import com.kingsrook.qqq.backend.core.model.metadata.processes.QProcessMetaData; import com.kingsrook.qqq.backend.core.model.metadata.processes.QRecordListMetaData; @@ -51,9 +51,9 @@ import com.kingsrook.qqq.backend.module.rdbms.model.metadata.RDBMSBackendMetaDat *******************************************************************************/ public class SampleMetaDataProvider { - public static final String MYSQL_BACKEND_NAME = "mysql"; + public static final String MYSQL_BACKEND_NAME = "mysql"; public static final String FILESYSTEM_BACKEND_NAME = "filesystem"; - public static final String PROCESS_NAME_GREET = "greet"; + public static final String PROCESS_NAME_GREET = "greet"; @@ -98,9 +98,9 @@ public class SampleMetaDataProvider .withVendor("mysql") .withHostName("127.0.0.1") .withPort(3306) - .withDatabaseName("sample_project") + .withDatabaseName("qqq") .withUsername("root") - .withPassword("8BNWyoav8s79oi}Lqk") // todo - load securely + .withPassword("") .withName(MYSQL_BACKEND_NAME); } From 67cec981e74b7a672675946fb4692e96f7152fbc Mon Sep 17 00:00:00 2001 From: Tim Chamberlain Date: Thu, 7 Jul 2022 14:51:10 -0500 Subject: [PATCH 21/30] QQQ-21: made required fields required on carrier --- .../com/kingsrook/sampleapp/SampleMetaDataProvider.java | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/src/main/java/com/kingsrook/sampleapp/SampleMetaDataProvider.java b/src/main/java/com/kingsrook/sampleapp/SampleMetaDataProvider.java index dd8e3c2f..ee5899cf 100644 --- a/src/main/java/com/kingsrook/sampleapp/SampleMetaDataProvider.java +++ b/src/main/java/com/kingsrook/sampleapp/SampleMetaDataProvider.java @@ -133,13 +133,16 @@ public class SampleMetaDataProvider table.addField(new QFieldMetaData("id", QFieldType.INTEGER)); - table.addField(new QFieldMetaData("name", QFieldType.STRING)); + table.addField(new QFieldMetaData("name", QFieldType.STRING) + .withIsRequired(true)); table.addField(new QFieldMetaData("company_code", QFieldType.STRING) // todo enum .withLabel("Company") + .withIsRequired(true) .withBackendName("comp_code")); - table.addField(new QFieldMetaData("service_level", QFieldType.STRING)); // todo enum + table.addField(new QFieldMetaData("service_level", QFieldType.STRING) + .withIsRequired(true)); // todo enum return (table); } From ba213e066704d55922cf0047b48777403ffa582b Mon Sep 17 00:00:00 2001 From: Darin Kelkhoff Date: Thu, 14 Jul 2022 10:32:33 -0500 Subject: [PATCH 22/30] Update for 0.2.0-SNAPSHOT --- checkstyle.xml | 2 +- pom.xml | 12 +- .../sampleapp/SampleMetaDataProvider.java | 261 +++++++++++++++++- .../sampleapp/SampleMetaDataProviderTest.java | 2 - 4 files changed, 258 insertions(+), 19 deletions(-) diff --git a/checkstyle.xml b/checkstyle.xml index 76f872ed..f5e7412d 100644 --- a/checkstyle.xml +++ b/checkstyle.xml @@ -181,8 +181,8 @@ --> - @@ -47,31 +47,31 @@ com.kingsrook.qqq qqq-backend-core - 0.1.0-SNAPSHOT + 0.2.0-SNAPSHOT compile com.kingsrook.qqq qqq-backend-module-rdbms - 0.1.0-SNAPSHOT + 0.2.0-SNAPSHOT compile com.kingsrook.qqq qqq-backend-module-filesystem - 0.1.0-SNAPSHOT + 0.2.0-SNAPSHOT compile com.kingsrook.qqq qqq-middleware-javalin - 0.1.0-SNAPSHOT + 0.2.0-SNAPSHOT compile com.kingsrook.qqq qqq-middleware-picocli - 0.1.0-SNAPSHOT + 0.2.0-SNAPSHOT compile diff --git a/src/main/java/com/kingsrook/sampleapp/SampleMetaDataProvider.java b/src/main/java/com/kingsrook/sampleapp/SampleMetaDataProvider.java index eeb94553..ff3e4fc8 100644 --- a/src/main/java/com/kingsrook/sampleapp/SampleMetaDataProvider.java +++ b/src/main/java/com/kingsrook/sampleapp/SampleMetaDataProvider.java @@ -24,7 +24,11 @@ package com.kingsrook.sampleapp; import java.util.List; import com.kingsrook.qqq.backend.core.exceptions.QException; +import com.kingsrook.qqq.backend.core.exceptions.QValueException; +import com.kingsrook.qqq.backend.core.interfaces.BackendStep; import com.kingsrook.qqq.backend.core.interfaces.mock.MockBackendStep; +import com.kingsrook.qqq.backend.core.model.actions.processes.RunBackendStepRequest; +import com.kingsrook.qqq.backend.core.model.actions.processes.RunBackendStepResult; import com.kingsrook.qqq.backend.core.model.metadata.QAuthenticationMetaData; import com.kingsrook.qqq.backend.core.model.metadata.QBackendMetaData; import com.kingsrook.qqq.backend.core.model.metadata.QCodeReference; @@ -35,10 +39,12 @@ import com.kingsrook.qqq.backend.core.model.metadata.QFieldType; import com.kingsrook.qqq.backend.core.model.metadata.QInstance; import com.kingsrook.qqq.backend.core.model.metadata.QTableMetaData; import com.kingsrook.qqq.backend.core.model.metadata.processes.QBackendStepMetaData; +import com.kingsrook.qqq.backend.core.model.metadata.processes.QFrontendStepMetaData; import com.kingsrook.qqq.backend.core.model.metadata.processes.QFunctionInputMetaData; import com.kingsrook.qqq.backend.core.model.metadata.processes.QFunctionOutputMetaData; import com.kingsrook.qqq.backend.core.model.metadata.processes.QProcessMetaData; import com.kingsrook.qqq.backend.core.model.metadata.processes.QRecordListMetaData; +import com.kingsrook.qqq.backend.core.processes.implementations.LoadInitialRecordsStep; import com.kingsrook.qqq.backend.module.filesystem.base.model.metadata.Cardinality; import com.kingsrook.qqq.backend.module.filesystem.base.model.metadata.RecordFormat; import com.kingsrook.qqq.backend.module.filesystem.local.model.metadata.FilesystemBackendMetaData; @@ -51,9 +57,20 @@ import com.kingsrook.qqq.backend.module.rdbms.model.metadata.RDBMSBackendMetaDat *******************************************************************************/ public class SampleMetaDataProvider { - public static final String MYSQL_BACKEND_NAME = "mysql"; + public static final String MYSQL_BACKEND_NAME = "mysql"; public static final String FILESYSTEM_BACKEND_NAME = "filesystem"; - public static final String PROCESS_NAME_GREET = "greet"; + + public static final String PROCESS_NAME_GREET = "greet"; + public static final String PROCESS_NAME_GREET_INTERACTIVE = "greetInteractive"; + public static final String PROCESS_NAME_SIMPLE_SLEEP = "simpleSleep"; + public static final String PROCESS_NAME_SIMPLE_THROW = "simpleThrow"; + public static final String PROCESS_NAME_SLEEP_INTERACTIVE = "sleepInteractive"; + + public static final String STEP_NAME_SLEEPER = "sleeper"; + public static final String STEP_NAME_THROWER = "thrower"; + + public static final String SCREEN_0 = "screen0"; + public static final String SCREEN_1 = "screen1"; @@ -64,13 +81,17 @@ public class SampleMetaDataProvider { QInstance qInstance = new QInstance(); - qInstance.setAuthentication(SampleMetaDataProvider.defineAuthentication()); - qInstance.addBackend(SampleMetaDataProvider.defineMysqlBackend()); - qInstance.addBackend(SampleMetaDataProvider.defineFilesystemBackend()); - qInstance.addTable(SampleMetaDataProvider.defineTableCarrier()); - qInstance.addTable(SampleMetaDataProvider.defineTablePerson()); - qInstance.addTable(SampleMetaDataProvider.defineTableCityFile()); - qInstance.addProcess(SampleMetaDataProvider.defineProcessGreetPeople()); + qInstance.setAuthentication(defineAuthentication()); + qInstance.addBackend(defineMysqlBackend()); + qInstance.addBackend(defineFilesystemBackend()); + qInstance.addTable(defineTableCarrier()); + qInstance.addTable(defineTablePerson()); + qInstance.addTable(defineTableCityFile()); + qInstance.addProcess(defineProcessGreetPeople()); + qInstance.addProcess(defineProcessGreetPeopleInteractive()); + qInstance.addProcess(defineProcessSimpleSleep()); + qInstance.addProcess(defineProcessScreenThenSleep()); + qInstance.addProcess(defineProcessSimpleThrow()); return (qInstance); } @@ -172,6 +193,7 @@ public class SampleMetaDataProvider return new QTableMetaData() .withName("city") .withLabel("Cities") + .withIsHidden(true) .withBackendName(FILESYSTEM_BACKEND_NAME) .withPrimaryKeyField("id") .withField(new QFieldMetaData("id", QFieldType.INTEGER)) @@ -195,12 +217,13 @@ public class SampleMetaDataProvider .withName(PROCESS_NAME_GREET) .withLabel("Greet People") .withTableName("person") + .withIsHidden(true) .addStep(new QBackendStepMetaData() .withName("prepare") .withCode(new QCodeReference() .withName(MockBackendStep.class.getName()) .withCodeType(QCodeType.JAVA) - .withCodeUsage(QCodeUsage.FUNCTION)) // todo - needed, or implied in this context? + .withCodeUsage(QCodeUsage.BACKEND_STEP)) // todo - needed, or implied in this context? .withInputData(new QFunctionInputMetaData() .withRecordListMetaData(new QRecordListMetaData().withTableName("person")) .withFieldList(List.of( @@ -216,4 +239,222 @@ public class SampleMetaDataProvider ); } + + + /******************************************************************************* + ** Define an interactive version of the 'greet people' process + *******************************************************************************/ + private static QProcessMetaData defineProcessGreetPeopleInteractive() + { + return new QProcessMetaData() + .withName(PROCESS_NAME_GREET_INTERACTIVE) + .withTableName("person") + + .addStep(LoadInitialRecordsStep.defineMetaData("person")) + + .addStep(new QFrontendStepMetaData() + .withName("setup") + .withFormField(new QFieldMetaData("greetingPrefix", QFieldType.STRING)) + .withFormField(new QFieldMetaData("greetingSuffix", QFieldType.STRING)) + ) + + .addStep(new QBackendStepMetaData() + .withName("doWork") + .withCode(new QCodeReference() + .withName(MockBackendStep.class.getName()) + .withCodeType(QCodeType.JAVA) + .withCodeUsage(QCodeUsage.BACKEND_STEP)) // todo - needed, or implied in this context? + .withInputData(new QFunctionInputMetaData() + .withRecordListMetaData(new QRecordListMetaData().withTableName("person")) + .withFieldList(List.of( + new QFieldMetaData("greetingPrefix", QFieldType.STRING), + new QFieldMetaData("greetingSuffix", QFieldType.STRING) + ))) + .withOutputMetaData(new QFunctionOutputMetaData() + .withRecordListMetaData(new QRecordListMetaData() + .withTableName("person") + .addField(new QFieldMetaData("fullGreeting", QFieldType.STRING)) + ) + .withFieldList(List.of(new QFieldMetaData("outputMessage", QFieldType.STRING)))) + ) + + .addStep(new QFrontendStepMetaData() + .withName("results") + .withViewField(new QFieldMetaData("noOfPeopleGreeted", QFieldType.INTEGER)) + .withViewField(new QFieldMetaData("outputMessage", QFieldType.STRING)) + .withRecordListField(new QFieldMetaData("id", QFieldType.INTEGER)) + .withRecordListField(new QFieldMetaData("firstName", QFieldType.STRING)) + // .withRecordListField(new QFieldMetaData(MockBackendStep.FIELD_MOCK_VALUE, QFieldType.STRING)) + .withRecordListField(new QFieldMetaData("greetingMessage", QFieldType.STRING)) + ); + } + + + + /******************************************************************************* + ** Define a process with just one step that sleeps + *******************************************************************************/ + private static QProcessMetaData defineProcessSimpleSleep() + { + return new QProcessMetaData() + .withName(PROCESS_NAME_SIMPLE_SLEEP) + .withIsHidden(true) + .addStep(SleeperStep.getMetaData()); + } + + + + /******************************************************************************* + ** Define a process with a screen, then a sleep step + *******************************************************************************/ + private static QProcessMetaData defineProcessScreenThenSleep() + { + return new QProcessMetaData() + .withName(PROCESS_NAME_SLEEP_INTERACTIVE) + .addStep(new QFrontendStepMetaData() + .withName(SCREEN_0) + .withFormField(new QFieldMetaData("outputMessage", QFieldType.STRING))) + .addStep(SleeperStep.getMetaData()) + .addStep(new QFrontendStepMetaData() + .withName(SCREEN_1) + .withFormField(new QFieldMetaData("outputMessage", QFieldType.STRING))); + } + + + + /******************************************************************************* + ** Define a process with just one step that sleeps and then throws + *******************************************************************************/ + private static QProcessMetaData defineProcessSimpleThrow() + { + return new QProcessMetaData() + .withName(PROCESS_NAME_SIMPLE_THROW) + .addStep(ThrowerStep.getMetaData()); + } + + + + /******************************************************************************* + ** Testing backend step - just sleeps however long you ask it to (or, throws if + ** you don't provide a number of seconds to sleep). + *******************************************************************************/ + public static class SleeperStep implements BackendStep + { + public static final String FIELD_SLEEP_MILLIS = "sleepMillis"; + + + + /******************************************************************************* + ** Execute the backend step - using the request as input, and the result as output. + ** + ******************************************************************************/ + @Override + public void run(RunBackendStepRequest runBackendStepRequest, RunBackendStepResult runBackendStepResult) throws QException + { + try + { + Thread.sleep(runBackendStepRequest.getValueInteger(FIELD_SLEEP_MILLIS)); + } + catch(InterruptedException e) + { + throw (new QException("Interrupted while sleeping...")); + } + } + + + + /******************************************************************************* + ** + *******************************************************************************/ + public static QBackendStepMetaData getMetaData() + { + return (new QBackendStepMetaData() + .withName(STEP_NAME_SLEEPER) + .withCode(new QCodeReference() + .withName(SleeperStep.class.getName()) + .withCodeType(QCodeType.JAVA) + .withCodeUsage(QCodeUsage.BACKEND_STEP)) + .withInputData(new QFunctionInputMetaData() + .addField(new QFieldMetaData(SleeperStep.FIELD_SLEEP_MILLIS, QFieldType.INTEGER)))); + } + } + + + + /******************************************************************************* + ** Testing backend step - just throws an exception after however long you ask it to sleep. + *******************************************************************************/ + public static class ThrowerStep implements BackendStep + { + public static final String FIELD_SLEEP_MILLIS = "sleepMillis"; + + + + /******************************************************************************* + ** Execute the backend step - using the request as input, and the result as output. + ** + ******************************************************************************/ + @Override + public void run(RunBackendStepRequest runBackendStepRequest, RunBackendStepResult runBackendStepResult) throws QException + { + int sleepMillis; + try + { + sleepMillis = runBackendStepRequest.getValueInteger(FIELD_SLEEP_MILLIS); + } + catch(QValueException qve) + { + sleepMillis = 50; + } + + try + { + Thread.sleep(sleepMillis); + } + catch(InterruptedException e) + { + throw (new QException("Interrupted while sleeping...")); + } + + throw (new QException("I always throw.")); + } + + + + /******************************************************************************* + ** + *******************************************************************************/ + public static QBackendStepMetaData getMetaData() + { + return (new QBackendStepMetaData() + .withName(STEP_NAME_THROWER) + .withCode(new QCodeReference() + .withName(ThrowerStep.class.getName()) + .withCodeType(QCodeType.JAVA) + .withCodeUsage(QCodeUsage.BACKEND_STEP)) + .withInputData(new QFunctionInputMetaData() + .addField(new QFieldMetaData(ThrowerStep.FIELD_SLEEP_MILLIS, QFieldType.INTEGER)))); + } + } + + + + public static class NoopBackendStep implements BackendStep + { + public NoopBackendStep() + { + + } + + + + @Override + public void run(RunBackendStepRequest runBackendStepRequest, RunBackendStepResult runBackendStepResult) throws QException + { + ////////// + // noop // + ////////// + } + } + } diff --git a/src/test/java/com/kingsrook/sampleapp/SampleMetaDataProviderTest.java b/src/test/java/com/kingsrook/sampleapp/SampleMetaDataProviderTest.java index 097b9764..dd2c13b6 100644 --- a/src/test/java/com/kingsrook/sampleapp/SampleMetaDataProviderTest.java +++ b/src/test/java/com/kingsrook/sampleapp/SampleMetaDataProviderTest.java @@ -40,7 +40,6 @@ import org.apache.commons.io.FileUtils; import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.Test; import static org.junit.jupiter.api.Assertions.assertNotNull; -import static org.junit.jupiter.api.Assertions.assertNull; import static org.junit.jupiter.api.Assertions.assertTrue; @@ -118,7 +117,6 @@ class SampleMetaDataProviderTest RunProcessResult result = new RunProcessAction().execute(request); assertNotNull(result); - assertNull(result.getError()); assertTrue(result.getRecords().stream().allMatch(r -> r.getValues().containsKey("id")), "records should have an id, set by the process"); } From cd691aa0c1c8f04f06d124299c87c54d7132d123 Mon Sep 17 00:00:00 2001 From: Darin Kelkhoff Date: Fri, 15 Jul 2022 09:36:33 -0500 Subject: [PATCH 23/30] Update qqq versions to 0.2.0-SNAPSHOT, with package reorg and request/result rename to input/output --- .../sampleapp/SampleMetaDataProvider.java | 32 +++++++------- .../sampleapp/SampleMetaDataProviderTest.java | 42 +++++++++---------- 2 files changed, 37 insertions(+), 37 deletions(-) diff --git a/src/main/java/com/kingsrook/sampleapp/SampleMetaDataProvider.java b/src/main/java/com/kingsrook/sampleapp/SampleMetaDataProvider.java index ff3e4fc8..4b9b34b0 100644 --- a/src/main/java/com/kingsrook/sampleapp/SampleMetaDataProvider.java +++ b/src/main/java/com/kingsrook/sampleapp/SampleMetaDataProvider.java @@ -25,26 +25,26 @@ package com.kingsrook.sampleapp; import java.util.List; import com.kingsrook.qqq.backend.core.exceptions.QException; import com.kingsrook.qqq.backend.core.exceptions.QValueException; -import com.kingsrook.qqq.backend.core.interfaces.BackendStep; -import com.kingsrook.qqq.backend.core.interfaces.mock.MockBackendStep; -import com.kingsrook.qqq.backend.core.model.actions.processes.RunBackendStepRequest; -import com.kingsrook.qqq.backend.core.model.actions.processes.RunBackendStepResult; +import com.kingsrook.qqq.backend.core.actions.processes.BackendStep; +import com.kingsrook.qqq.backend.core.processes.implementations.mock.MockBackendStep; +import com.kingsrook.qqq.backend.core.model.actions.processes.RunBackendStepInput; +import com.kingsrook.qqq.backend.core.model.actions.processes.RunBackendStepOutput; import com.kingsrook.qqq.backend.core.model.metadata.QAuthenticationMetaData; import com.kingsrook.qqq.backend.core.model.metadata.QBackendMetaData; -import com.kingsrook.qqq.backend.core.model.metadata.QCodeReference; -import com.kingsrook.qqq.backend.core.model.metadata.QCodeType; -import com.kingsrook.qqq.backend.core.model.metadata.QCodeUsage; -import com.kingsrook.qqq.backend.core.model.metadata.QFieldMetaData; -import com.kingsrook.qqq.backend.core.model.metadata.QFieldType; +import com.kingsrook.qqq.backend.core.model.metadata.code.QCodeReference; +import com.kingsrook.qqq.backend.core.model.metadata.code.QCodeType; +import com.kingsrook.qqq.backend.core.model.metadata.code.QCodeUsage; +import com.kingsrook.qqq.backend.core.model.metadata.fields.QFieldMetaData; +import com.kingsrook.qqq.backend.core.model.metadata.fields.QFieldType; import com.kingsrook.qqq.backend.core.model.metadata.QInstance; -import com.kingsrook.qqq.backend.core.model.metadata.QTableMetaData; +import com.kingsrook.qqq.backend.core.model.metadata.tables.QTableMetaData; import com.kingsrook.qqq.backend.core.model.metadata.processes.QBackendStepMetaData; import com.kingsrook.qqq.backend.core.model.metadata.processes.QFrontendStepMetaData; import com.kingsrook.qqq.backend.core.model.metadata.processes.QFunctionInputMetaData; import com.kingsrook.qqq.backend.core.model.metadata.processes.QFunctionOutputMetaData; import com.kingsrook.qqq.backend.core.model.metadata.processes.QProcessMetaData; import com.kingsrook.qqq.backend.core.model.metadata.processes.QRecordListMetaData; -import com.kingsrook.qqq.backend.core.processes.implementations.LoadInitialRecordsStep; +import com.kingsrook.qqq.backend.core.processes.implementations.general.LoadInitialRecordsStep; import com.kingsrook.qqq.backend.module.filesystem.base.model.metadata.Cardinality; import com.kingsrook.qqq.backend.module.filesystem.base.model.metadata.RecordFormat; import com.kingsrook.qqq.backend.module.filesystem.local.model.metadata.FilesystemBackendMetaData; @@ -349,11 +349,11 @@ public class SampleMetaDataProvider ** ******************************************************************************/ @Override - public void run(RunBackendStepRequest runBackendStepRequest, RunBackendStepResult runBackendStepResult) throws QException + public void run(RunBackendStepInput runBackendStepInput, RunBackendStepOutput runBackendStepOutput) throws QException { try { - Thread.sleep(runBackendStepRequest.getValueInteger(FIELD_SLEEP_MILLIS)); + Thread.sleep(runBackendStepInput.getValueInteger(FIELD_SLEEP_MILLIS)); } catch(InterruptedException e) { @@ -395,12 +395,12 @@ public class SampleMetaDataProvider ** ******************************************************************************/ @Override - public void run(RunBackendStepRequest runBackendStepRequest, RunBackendStepResult runBackendStepResult) throws QException + public void run(RunBackendStepInput runBackendStepInput, RunBackendStepOutput runBackendStepOutput) throws QException { int sleepMillis; try { - sleepMillis = runBackendStepRequest.getValueInteger(FIELD_SLEEP_MILLIS); + sleepMillis = runBackendStepInput.getValueInteger(FIELD_SLEEP_MILLIS); } catch(QValueException qve) { @@ -449,7 +449,7 @@ public class SampleMetaDataProvider @Override - public void run(RunBackendStepRequest runBackendStepRequest, RunBackendStepResult runBackendStepResult) throws QException + public void run(RunBackendStepInput runBackendStepInput, RunBackendStepOutput runBackendStepOutput) throws QException { ////////// // noop // diff --git a/src/test/java/com/kingsrook/sampleapp/SampleMetaDataProviderTest.java b/src/test/java/com/kingsrook/sampleapp/SampleMetaDataProviderTest.java index dd2c13b6..16b93823 100644 --- a/src/test/java/com/kingsrook/sampleapp/SampleMetaDataProviderTest.java +++ b/src/test/java/com/kingsrook/sampleapp/SampleMetaDataProviderTest.java @@ -25,14 +25,14 @@ package com.kingsrook.sampleapp; import java.io.File; import java.io.IOException; import java.util.UUID; -import com.kingsrook.qqq.backend.core.actions.QueryAction; -import com.kingsrook.qqq.backend.core.actions.RunProcessAction; -import com.kingsrook.qqq.backend.core.model.actions.processes.RunProcessRequest; -import com.kingsrook.qqq.backend.core.model.actions.processes.RunProcessResult; -import com.kingsrook.qqq.backend.core.model.actions.query.QueryRequest; -import com.kingsrook.qqq.backend.core.model.actions.query.QueryResult; +import com.kingsrook.qqq.backend.core.actions.tables.QueryAction; +import com.kingsrook.qqq.backend.core.actions.processes.RunProcessAction; +import com.kingsrook.qqq.backend.core.model.actions.processes.RunProcessInput; +import com.kingsrook.qqq.backend.core.model.actions.processes.RunProcessOutput; +import com.kingsrook.qqq.backend.core.model.actions.tables.query.QueryInput; +import com.kingsrook.qqq.backend.core.model.actions.tables.query.QueryOutput; import com.kingsrook.qqq.backend.core.model.metadata.QInstance; -import com.kingsrook.qqq.backend.core.model.metadata.QTableMetaData; +import com.kingsrook.qqq.backend.core.model.metadata.tables.QTableMetaData; import com.kingsrook.qqq.backend.core.model.session.QSession; import com.kingsrook.qqq.backend.module.filesystem.local.actions.FilesystemQueryAction; import com.kingsrook.qqq.backend.module.filesystem.local.model.metadata.FilesystemTableBackendDetails; @@ -60,13 +60,13 @@ class SampleMetaDataProviderTest try { - QueryRequest queryRequest = new QueryRequest(); - queryRequest.setInstance(SampleMetaDataProvider.defineInstance()); - queryRequest.setTableName(fileTable.getName()); + QueryInput queryInput = new QueryInput(); + queryInput.setInstance(SampleMetaDataProvider.defineInstance()); + queryInput.setTableName(fileTable.getName()); - QueryResult queryResult = new FilesystemQueryAction().execute(queryRequest); - System.out.println(queryResult); - Assertions.assertEquals(3, queryResult.getRecords().size(), "Should load all records from the file"); + QueryOutput queryOutput = new FilesystemQueryAction().execute(queryInput); + System.out.println(queryOutput); + Assertions.assertEquals(3, queryOutput.getRecords().size(), "Should load all records from the file"); } finally { @@ -101,21 +101,21 @@ class SampleMetaDataProviderTest public void testGreetProcess() throws Exception { QInstance qInstance = SampleMetaDataProvider.defineInstance(); - QTableMetaData personTable = SampleMetaDataProvider.defineTablePerson(); - RunProcessRequest request = new RunProcessRequest(qInstance); + QTableMetaData personTable = SampleMetaDataProvider.defineTablePerson(); + RunProcessInput request = new RunProcessInput(qInstance); request.setSession(new QSession()); request.setProcessName(SampleMetaDataProvider.PROCESS_NAME_GREET); - QueryRequest queryRequest = new QueryRequest(qInstance); - queryRequest.setTableName(personTable.getName()); - queryRequest.setSession(new QSession()); - QueryResult queryResult = new QueryAction().execute(queryRequest); + QueryInput queryInput = new QueryInput(qInstance); + queryInput.setTableName(personTable.getName()); + queryInput.setSession(new QSession()); + QueryOutput queryOutput = new QueryAction().execute(queryInput); - request.setRecords(queryResult.getRecords()); + request.setRecords(queryOutput.getRecords()); request.addValue("greetingPrefix", "Hello"); request.addValue("greetingSuffix", "there"); - RunProcessResult result = new RunProcessAction().execute(request); + RunProcessOutput result = new RunProcessAction().execute(request); assertNotNull(result); assertTrue(result.getRecords().stream().allMatch(r -> r.getValues().containsKey("id")), "records should have an id, set by the process"); } From a88bf1b30382e29e477a27eeefd668462f105295 Mon Sep 17 00:00:00 2001 From: Tim Chamberlain Date: Tue, 19 Jul 2022 18:30:20 -0500 Subject: [PATCH 24/30] QQQ-27: updated auth module from fully anonymous to Auth0 --- .../sampleapp/SampleMetaDataProvider.java | 21 ++++++++++++------- 1 file changed, 13 insertions(+), 8 deletions(-) diff --git a/src/main/java/com/kingsrook/sampleapp/SampleMetaDataProvider.java b/src/main/java/com/kingsrook/sampleapp/SampleMetaDataProvider.java index 4b9b34b0..0fe8b308 100644 --- a/src/main/java/com/kingsrook/sampleapp/SampleMetaDataProvider.java +++ b/src/main/java/com/kingsrook/sampleapp/SampleMetaDataProvider.java @@ -23,28 +23,29 @@ package com.kingsrook.sampleapp; import java.util.List; +import com.kingsrook.qqq.backend.core.actions.processes.BackendStep; import com.kingsrook.qqq.backend.core.exceptions.QException; import com.kingsrook.qqq.backend.core.exceptions.QValueException; -import com.kingsrook.qqq.backend.core.actions.processes.BackendStep; -import com.kingsrook.qqq.backend.core.processes.implementations.mock.MockBackendStep; import com.kingsrook.qqq.backend.core.model.actions.processes.RunBackendStepInput; import com.kingsrook.qqq.backend.core.model.actions.processes.RunBackendStepOutput; -import com.kingsrook.qqq.backend.core.model.metadata.QAuthenticationMetaData; import com.kingsrook.qqq.backend.core.model.metadata.QBackendMetaData; +import com.kingsrook.qqq.backend.core.model.metadata.QInstance; import com.kingsrook.qqq.backend.core.model.metadata.code.QCodeReference; import com.kingsrook.qqq.backend.core.model.metadata.code.QCodeType; import com.kingsrook.qqq.backend.core.model.metadata.code.QCodeUsage; import com.kingsrook.qqq.backend.core.model.metadata.fields.QFieldMetaData; import com.kingsrook.qqq.backend.core.model.metadata.fields.QFieldType; -import com.kingsrook.qqq.backend.core.model.metadata.QInstance; -import com.kingsrook.qqq.backend.core.model.metadata.tables.QTableMetaData; import com.kingsrook.qqq.backend.core.model.metadata.processes.QBackendStepMetaData; import com.kingsrook.qqq.backend.core.model.metadata.processes.QFrontendStepMetaData; import com.kingsrook.qqq.backend.core.model.metadata.processes.QFunctionInputMetaData; import com.kingsrook.qqq.backend.core.model.metadata.processes.QFunctionOutputMetaData; import com.kingsrook.qqq.backend.core.model.metadata.processes.QProcessMetaData; import com.kingsrook.qqq.backend.core.model.metadata.processes.QRecordListMetaData; +import com.kingsrook.qqq.backend.core.model.metadata.tables.QTableMetaData; +import com.kingsrook.qqq.backend.core.modules.authentication.metadata.Auth0AuthenticationMetaData; +import com.kingsrook.qqq.backend.core.modules.authentication.metadata.QAuthenticationMetaData; import com.kingsrook.qqq.backend.core.processes.implementations.general.LoadInitialRecordsStep; +import com.kingsrook.qqq.backend.core.processes.implementations.mock.MockBackendStep; import com.kingsrook.qqq.backend.module.filesystem.base.model.metadata.Cardinality; import com.kingsrook.qqq.backend.module.filesystem.base.model.metadata.RecordFormat; import com.kingsrook.qqq.backend.module.filesystem.local.model.metadata.FilesystemBackendMetaData; @@ -60,6 +61,10 @@ public class SampleMetaDataProvider public static final String MYSQL_BACKEND_NAME = "mysql"; public static final String FILESYSTEM_BACKEND_NAME = "filesystem"; + public static final String AUTH0_AUTHENTICATION_MODULE_NAME = "auth0"; + public static final String AUTH0_BASE_URL = "https://kingsrook.us.auth0.com/"; + + public static final String PROCESS_NAME_GREET = "greet"; public static final String PROCESS_NAME_GREET_INTERACTIVE = "greetInteractive"; public static final String PROCESS_NAME_SIMPLE_SLEEP = "simpleSleep"; @@ -103,9 +108,9 @@ public class SampleMetaDataProvider *******************************************************************************/ private static QAuthenticationMetaData defineAuthentication() { - return new QAuthenticationMetaData() - .withName("Anonymous") - .withType("fullyAnonymous"); + return (new Auth0AuthenticationMetaData() + .withBaseUrl(AUTH0_BASE_URL) + .withName(AUTH0_AUTHENTICATION_MODULE_NAME)); } From 5f12626c0cd75d0b3b84a5ddb5df7afc07b1bfe5 Mon Sep 17 00:00:00 2001 From: Darin Kelkhoff Date: Thu, 21 Jul 2022 09:29:52 -0500 Subject: [PATCH 25/30] Add jacoco coverage reporting --- .circleci/config.yml | 4 +- pom.xml | 88 ++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 91 insertions(+), 1 deletion(-) diff --git a/.circleci/config.yml b/.circleci/config.yml index 0f486b7b..a35d7951 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -26,6 +26,8 @@ commands: name: Run Maven command: | mvn -s .circleci/mvn-settings.xml << parameters.maven_subcommand >> + - store_artifacts: + path: target/site/jacoco - run: name: Save test results command: | @@ -44,7 +46,7 @@ jobs: executor: java17 steps: - run_maven: - maven_subcommand: test + maven_subcommand: verify - slack/notify: event: fail diff --git a/pom.xml b/pom.xml index bcf0dd8f..84b43049 100644 --- a/pom.xml +++ b/pom.xml @@ -40,6 +40,8 @@ 17 true true + true + 0.75 @@ -117,6 +119,11 @@ + + org.apache.maven.plugins + maven-resources-plugin + 3.2.0 + @@ -131,6 +138,9 @@ org.apache.maven.plugins maven-surefire-plugin 3.0.0-M5 + + @{jaCoCoArgLine} + org.apache.maven.plugins @@ -164,6 +174,84 @@ + + org.jacoco + jacoco-maven-plugin + 0.8.8 + + + pre-unit-test + + prepare-agent + + + jaCoCoArgLine + + + + unit-test-check + + check + + + + ${coverage.haltOnFailure} + + + BUNDLE + + + INSTRUCTION + COVEREDRATIO + ${coverage.instructionCoveredRatioMinimum} + + + + + + + + post-unit-test + verify + + report + + + + + + exec-maven-plugin + org.codehaus.mojo + 3.0.0 + + + test-coverage-summary + verify + + exec + + + sh + + -c + + /tmp/$$.headers +xpath -q -e '/html/body/table/tfoot/tr[1]/td/text()' target/site/jacoco/index.html > /tmp/$$.values +echo +echo "Jacoco coverage summary report:" +echo " See also target/site/jacoco/index.html" +echo " and https://www.jacoco.org/jacoco/trunk/doc/counters.html" +echo "------------------------------------------------------------" +paste /tmp/$$.headers /tmp/$$.values | tail +2 | awk -v FS='\t' '{printf("%-20s %s\n",$1,$2)}' +rm /tmp/$$.headers /tmp/$$.values + ]]> + + + + + + From c3d96ee502943956fb59a55d94ca5ec1ed8c17b6 Mon Sep 17 00:00:00 2001 From: Darin Kelkhoff Date: Thu, 21 Jul 2022 09:34:12 -0500 Subject: [PATCH 26/30] Cleanup for checkstyle, dead code --- .../sampleapp/SampleMetaDataProvider.java | 28 +++---------------- 1 file changed, 4 insertions(+), 24 deletions(-) diff --git a/src/main/java/com/kingsrook/sampleapp/SampleMetaDataProvider.java b/src/main/java/com/kingsrook/sampleapp/SampleMetaDataProvider.java index 4b9b34b0..1db799d6 100644 --- a/src/main/java/com/kingsrook/sampleapp/SampleMetaDataProvider.java +++ b/src/main/java/com/kingsrook/sampleapp/SampleMetaDataProvider.java @@ -23,28 +23,28 @@ package com.kingsrook.sampleapp; import java.util.List; +import com.kingsrook.qqq.backend.core.actions.processes.BackendStep; import com.kingsrook.qqq.backend.core.exceptions.QException; import com.kingsrook.qqq.backend.core.exceptions.QValueException; -import com.kingsrook.qqq.backend.core.actions.processes.BackendStep; -import com.kingsrook.qqq.backend.core.processes.implementations.mock.MockBackendStep; import com.kingsrook.qqq.backend.core.model.actions.processes.RunBackendStepInput; import com.kingsrook.qqq.backend.core.model.actions.processes.RunBackendStepOutput; import com.kingsrook.qqq.backend.core.model.metadata.QAuthenticationMetaData; import com.kingsrook.qqq.backend.core.model.metadata.QBackendMetaData; +import com.kingsrook.qqq.backend.core.model.metadata.QInstance; import com.kingsrook.qqq.backend.core.model.metadata.code.QCodeReference; import com.kingsrook.qqq.backend.core.model.metadata.code.QCodeType; import com.kingsrook.qqq.backend.core.model.metadata.code.QCodeUsage; import com.kingsrook.qqq.backend.core.model.metadata.fields.QFieldMetaData; import com.kingsrook.qqq.backend.core.model.metadata.fields.QFieldType; -import com.kingsrook.qqq.backend.core.model.metadata.QInstance; -import com.kingsrook.qqq.backend.core.model.metadata.tables.QTableMetaData; import com.kingsrook.qqq.backend.core.model.metadata.processes.QBackendStepMetaData; import com.kingsrook.qqq.backend.core.model.metadata.processes.QFrontendStepMetaData; import com.kingsrook.qqq.backend.core.model.metadata.processes.QFunctionInputMetaData; import com.kingsrook.qqq.backend.core.model.metadata.processes.QFunctionOutputMetaData; import com.kingsrook.qqq.backend.core.model.metadata.processes.QProcessMetaData; import com.kingsrook.qqq.backend.core.model.metadata.processes.QRecordListMetaData; +import com.kingsrook.qqq.backend.core.model.metadata.tables.QTableMetaData; import com.kingsrook.qqq.backend.core.processes.implementations.general.LoadInitialRecordsStep; +import com.kingsrook.qqq.backend.core.processes.implementations.mock.MockBackendStep; import com.kingsrook.qqq.backend.module.filesystem.base.model.metadata.Cardinality; import com.kingsrook.qqq.backend.module.filesystem.base.model.metadata.RecordFormat; import com.kingsrook.qqq.backend.module.filesystem.local.model.metadata.FilesystemBackendMetaData; @@ -437,24 +437,4 @@ public class SampleMetaDataProvider } } - - - public static class NoopBackendStep implements BackendStep - { - public NoopBackendStep() - { - - } - - - - @Override - public void run(RunBackendStepInput runBackendStepInput, RunBackendStepOutput runBackendStepOutput) throws QException - { - ////////// - // noop // - ////////// - } - } - } From 87852f0ad4cc3cf08a2642ea5db72f392e09347c Mon Sep 17 00:00:00 2001 From: Darin Kelkhoff Date: Thu, 21 Jul 2022 09:34:37 -0500 Subject: [PATCH 27/30] Remove input to greet-process that makes it throw --- .../com/kingsrook/sampleapp/SampleMetaDataProviderTest.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/test/java/com/kingsrook/sampleapp/SampleMetaDataProviderTest.java b/src/test/java/com/kingsrook/sampleapp/SampleMetaDataProviderTest.java index 16b93823..68c74649 100644 --- a/src/test/java/com/kingsrook/sampleapp/SampleMetaDataProviderTest.java +++ b/src/test/java/com/kingsrook/sampleapp/SampleMetaDataProviderTest.java @@ -113,7 +113,7 @@ class SampleMetaDataProviderTest request.setRecords(queryOutput.getRecords()); request.addValue("greetingPrefix", "Hello"); - request.addValue("greetingSuffix", "there"); + request.addValue("greetingSuffix", "sir"); RunProcessOutput result = new RunProcessAction().execute(request); assertNotNull(result); From 3cb3da9762e0f74441d288d3c839f6499003e563 Mon Sep 17 00:00:00 2001 From: Tim Chamberlain Date: Tue, 26 Jul 2022 10:17:21 -0500 Subject: [PATCH 28/30] QQQ-27: changed to use mock authentication --- .../com/kingsrook/sampleapp/SampleMetaDataProvider.java | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/main/java/com/kingsrook/sampleapp/SampleMetaDataProvider.java b/src/main/java/com/kingsrook/sampleapp/SampleMetaDataProvider.java index 197d44db..02ec55f7 100644 --- a/src/main/java/com/kingsrook/sampleapp/SampleMetaDataProvider.java +++ b/src/main/java/com/kingsrook/sampleapp/SampleMetaDataProvider.java @@ -28,6 +28,7 @@ import com.kingsrook.qqq.backend.core.exceptions.QException; import com.kingsrook.qqq.backend.core.exceptions.QValueException; import com.kingsrook.qqq.backend.core.model.actions.processes.RunBackendStepInput; import com.kingsrook.qqq.backend.core.model.actions.processes.RunBackendStepOutput; +import com.kingsrook.qqq.backend.core.model.metadata.QAuthenticationType; import com.kingsrook.qqq.backend.core.model.metadata.QBackendMetaData; import com.kingsrook.qqq.backend.core.model.metadata.QInstance; import com.kingsrook.qqq.backend.core.model.metadata.code.QCodeReference; @@ -42,7 +43,6 @@ import com.kingsrook.qqq.backend.core.model.metadata.processes.QFunctionOutputMe import com.kingsrook.qqq.backend.core.model.metadata.processes.QProcessMetaData; import com.kingsrook.qqq.backend.core.model.metadata.processes.QRecordListMetaData; import com.kingsrook.qqq.backend.core.model.metadata.tables.QTableMetaData; -import com.kingsrook.qqq.backend.core.modules.authentication.metadata.Auth0AuthenticationMetaData; import com.kingsrook.qqq.backend.core.modules.authentication.metadata.QAuthenticationMetaData; import com.kingsrook.qqq.backend.core.processes.implementations.general.LoadInitialRecordsStep; import com.kingsrook.qqq.backend.core.processes.implementations.mock.MockBackendStep; @@ -108,9 +108,9 @@ public class SampleMetaDataProvider *******************************************************************************/ private static QAuthenticationMetaData defineAuthentication() { - return (new Auth0AuthenticationMetaData() - .withBaseUrl(AUTH0_BASE_URL) - .withName(AUTH0_AUTHENTICATION_MODULE_NAME)); + return (new QAuthenticationMetaData() + .withName("mock") + .withType(QAuthenticationType.MOCK)); } From 2f6c094de839ca5d1cecd83a68994c8aa9bfb7bc Mon Sep 17 00:00:00 2001 From: Darin Kelkhoff Date: Tue, 26 Jul 2022 16:55:23 -0500 Subject: [PATCH 29/30] Update deps --- pom.xml | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/pom.xml b/pom.xml index 40e9acc7..06ff5538 100644 --- a/pom.xml +++ b/pom.xml @@ -49,27 +49,27 @@ com.kingsrook.qqq qqq-backend-core - 0.2.0-20220725.183211-13 + 0.2.0-20220726.214150-15 com.kingsrook.qqq qqq-backend-module-rdbms - 0.2.0-20220725.183409-11 + 0.2.0-20220726.214633-12 com.kingsrook.qqq qqq-backend-module-filesystem - 0.2.0-20220725.183815-7 + 0.2.0-20220726.215110-8 com.kingsrook.qqq qqq-middleware-javalin - 0.2.0-20220725.185458-5 + 0.2.0-20220726.215233-6 com.kingsrook.qqq qqq-middleware-picocli - 0.2.0-20220725.185021-4 + 0.2.0-20220726.215232-6 From 597d6ef519abfe3b6c9e9ed7d5c90608a3cc6c7c Mon Sep 17 00:00:00 2001 From: Tim Chamberlain Date: Wed, 27 Jul 2022 23:45:52 -0500 Subject: [PATCH 30/30] QQQ-27: gitignore .env updated to pull rdbms password from .env --- .gitignore | 1 + .../java/com/kingsrook/sampleapp/SampleMetaDataProvider.java | 4 +++- 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/.gitignore b/.gitignore index cb6506b2..e61508f0 100644 --- a/.gitignore +++ b/.gitignore @@ -1,5 +1,6 @@ target/ *.iml +.env ############################################# diff --git a/src/main/java/com/kingsrook/sampleapp/SampleMetaDataProvider.java b/src/main/java/com/kingsrook/sampleapp/SampleMetaDataProvider.java index 02ec55f7..b8f1020d 100644 --- a/src/main/java/com/kingsrook/sampleapp/SampleMetaDataProvider.java +++ b/src/main/java/com/kingsrook/sampleapp/SampleMetaDataProvider.java @@ -51,6 +51,7 @@ import com.kingsrook.qqq.backend.module.filesystem.base.model.metadata.RecordFor import com.kingsrook.qqq.backend.module.filesystem.local.model.metadata.FilesystemBackendMetaData; import com.kingsrook.qqq.backend.module.filesystem.local.model.metadata.FilesystemTableBackendDetails; import com.kingsrook.qqq.backend.module.rdbms.model.metadata.RDBMSBackendMetaData; +import io.github.cdimascio.dotenv.Dotenv; /******************************************************************************* @@ -120,13 +121,14 @@ public class SampleMetaDataProvider *******************************************************************************/ public static QBackendMetaData defineMysqlBackend() { + Dotenv dotenv = Dotenv.configure().load(); return new RDBMSBackendMetaData() .withVendor("mysql") .withHostName("127.0.0.1") .withPort(3306) .withDatabaseName("qqq") .withUsername("root") - .withPassword("8BNWyoav8s79oi}Lqk") + .withPassword(dotenv.get("RDBMS_PASSWORD")) .withName(MYSQL_BACKEND_NAME); }