diff --git a/.gitattributes b/.gitattributes new file mode 100644 index 0000000..3b41682 --- /dev/null +++ b/.gitattributes @@ -0,0 +1,2 @@ +/mvnw text eol=lf +*.cmd text eol=crlf diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..549e00a --- /dev/null +++ b/.gitignore @@ -0,0 +1,33 @@ +HELP.md +target/ +!.mvn/wrapper/maven-wrapper.jar +!**/src/main/**/target/ +!**/src/test/**/target/ + +### STS ### +.apt_generated +.classpath +.factorypath +.project +.settings +.springBeans +.sts4-cache + +### IntelliJ IDEA ### +.idea +*.iws +*.iml +*.ipr + +### NetBeans ### +/nbproject/private/ +/nbbuild/ +/dist/ +/nbdist/ +/.nb-gradle/ +build/ +!**/src/main/**/build/ +!**/src/test/**/build/ + +### VS Code ### +.vscode/ diff --git a/.metadata/.lock b/.metadata/.lock new file mode 100644 index 0000000..e69de29 diff --git a/.metadata/.lock_info b/.metadata/.lock_info new file mode 100644 index 0000000..a9f9b2b --- /dev/null +++ b/.metadata/.lock_info @@ -0,0 +1,4 @@ +#Thu Jan 23 15:22:40 IST 2025 +host=DESKTOP-28FDSKV +process-id=24364 +user=Admin diff --git a/.metadata/.log b/.metadata/.log new file mode 100644 index 0000000..821559a --- /dev/null +++ b/.metadata/.log @@ -0,0 +1,33 @@ +!SESSION 2025-01-23 15:22:04.521 ----------------------------------------------- +eclipse.buildId=4.34.0.202411281622 +java.version=21.0.5 +java.vendor=Eclipse Adoptium +BootLoader constants: OS=win32, ARCH=x86_64, WS=win32, NL=en_US +Framework arguments: -product org.springframework.boot.ide.branding.sts4 +Command-line arguments: -os win32 -ws win32 -arch x86_64 -product org.springframework.boot.ide.branding.sts4 + +!ENTRY ch.qos.logback.classic 1 0 2025-01-23 15:22:09.229 +!MESSAGE Activated before the state location was initialized. Retry after the state location is initialized. + +!ENTRY ch.qos.logback.classic 1 0 2025-01-23 15:22:41.314 +!MESSAGE Logback config file: C:\Users\Admin\Desktop\inbound-user-service\.metadata\.plugins\org.eclipse.m2e.logback\logback.2.7.0.20241001-1350.xml + +!ENTRY org.eclipse.ui 2 0 2025-01-23 15:22:42.359 +!MESSAGE Warnings while parsing the commands from the 'org.eclipse.ui.commands' and 'org.eclipse.ui.actionDefinitions' extension points. +!SUBENTRY 1 org.eclipse.ui 2 0 2025-01-23 15:22:42.359 +!MESSAGE Commands should really have a category: plug-in='org.springframework.tooling.boot.ls', id='spring.initializr.addStarters', categoryId='org.eclipse.lsp4e.commandCategory' + +!ENTRY org.eclipse.ui 2 0 2025-01-23 15:22:43.054 +!MESSAGE Warnings while parsing the commands from the 'org.eclipse.ui.commands' and 'org.eclipse.ui.actionDefinitions' extension points. +!SUBENTRY 1 org.eclipse.ui 2 0 2025-01-23 15:22:43.054 +!MESSAGE Commands should really have a category: plug-in='org.springframework.tooling.boot.ls', id='spring.initializr.addStarters', categoryId='org.eclipse.lsp4e.commandCategory' + +!ENTRY org.eclipse.mylyn.tasks.ui 2 0 2025-01-23 15:22:49.112 +!MESSAGE No search provider was registered. Tasks search is not available. + +!ENTRY org.eclipse.egit.ui 2 0 2025-01-23 15:22:51.519 +!MESSAGE Warning: The environment variable HOME is not set. The following directory will be used to store the Git +user global configuration and to define the default location to store repositories: 'C:\Users\Admin'. If this is +not correct please set the HOME environment variable and restart Eclipse. Otherwise Git for Windows and +EGit might behave differently since they see different configuration options. +This warning can be switched off on the Team > Git > Confirmations and Warnings preference page. diff --git a/.metadata/.mylyn/repositories.xml.zip b/.metadata/.mylyn/repositories.xml.zip new file mode 100644 index 0000000..683b37c Binary files /dev/null and b/.metadata/.mylyn/repositories.xml.zip differ diff --git a/.metadata/.plugins/org.eclipse.buildship.core/gradle/versions.json b/.metadata/.plugins/org.eclipse.buildship.core/gradle/versions.json new file mode 100644 index 0000000..2db25b7 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.buildship.core/gradle/versions.json @@ -0,0 +1,5844 @@ +[ { + "version" : "8.13-20250123003013+0000", + "buildTime" : "20250123003013+0000", + "current" : false, + "snapshot" : true, + "nightly" : true, + "releaseNightly" : false, + "activeRc" : false, + "rcFor" : "", + "milestoneFor" : "", + "broken" : false, + "downloadUrl" : "https://services.gradle.org/distributions-snapshots/gradle-8.13-20250123003013+0000-bin.zip", + "checksumUrl" : "https://services.gradle.org/distributions-snapshots/gradle-8.13-20250123003013+0000-bin.zip.sha256", + "wrapperChecksumUrl" : "https://services.gradle.org/distributions-snapshots/gradle-8.13-20250123003013+0000-wrapper.jar.sha256" +}, { + "version" : "8.12.1-20250122012838+0000", + "buildTime" : "20250122012838+0000", + "current" : false, + "snapshot" : true, + "nightly" : false, + "releaseNightly" : true, + "activeRc" : false, + "rcFor" : "", + "milestoneFor" : "", + "broken" : false, + "downloadUrl" : "https://services.gradle.org/distributions-snapshots/gradle-8.12.1-20250122012838+0000-bin.zip", + "checksumUrl" : "https://services.gradle.org/distributions-snapshots/gradle-8.12.1-20250122012838+0000-bin.zip.sha256", + "wrapperChecksumUrl" : "https://services.gradle.org/distributions-snapshots/gradle-8.12.1-20250122012838+0000-wrapper.jar.sha256" +}, { + "version" : "8.13-milestone-3", + "buildTime" : "20250121164636+0000", + "current" : false, + "snapshot" : false, + "nightly" : false, + "releaseNightly" : false, + "activeRc" : false, + "rcFor" : "", + "milestoneFor" : "8.13", + "broken" : false, + "downloadUrl" : "https://services.gradle.org/distributions/gradle-8.13-milestone-3-bin.zip", + "checksumUrl" : "https://services.gradle.org/distributions/gradle-8.13-milestone-3-bin.zip.sha256", + "wrapperChecksumUrl" : "https://services.gradle.org/distributions/gradle-8.13-milestone-3-wrapper.jar.sha256" +}, { + "version" : "8.12.1-milestone-1", + "buildTime" : "20250121110021+0000", + "current" : false, + "snapshot" : false, + "nightly" : false, + "releaseNightly" : false, + "activeRc" : false, + "rcFor" : "", + "milestoneFor" : "8.12.1", + "broken" : false, + "downloadUrl" : "https://services.gradle.org/distributions/gradle-8.12.1-milestone-1-bin.zip", + "checksumUrl" : "https://services.gradle.org/distributions/gradle-8.12.1-milestone-1-bin.zip.sha256", + "wrapperChecksumUrl" : "https://services.gradle.org/distributions/gradle-8.12.1-milestone-1-wrapper.jar.sha256" +}, { + "version" : "8.13-milestone-2", + "buildTime" : "20250110085439+0000", + "current" : false, + "snapshot" : false, + "nightly" : false, + "releaseNightly" : false, + "activeRc" : false, + "rcFor" : "", + "milestoneFor" : "8.13", + "broken" : false, + "downloadUrl" : "https://services.gradle.org/distributions/gradle-8.13-milestone-2-bin.zip", + "checksumUrl" : "https://services.gradle.org/distributions/gradle-8.13-milestone-2-bin.zip.sha256", + "wrapperChecksumUrl" : "https://services.gradle.org/distributions/gradle-8.13-milestone-2-wrapper.jar.sha256" +}, { + "version" : "8.13-milestone-1", + "buildTime" : "20250109202014+0000", + "current" : false, + "snapshot" : false, + "nightly" : false, + "releaseNightly" : false, + "activeRc" : false, + "rcFor" : "", + "milestoneFor" : "8.13", + "broken" : false, + "downloadUrl" : "https://services.gradle.org/distributions/gradle-8.13-milestone-1-bin.zip", + "checksumUrl" : "https://services.gradle.org/distributions/gradle-8.13-milestone-1-bin.zip.sha256", + "wrapperChecksumUrl" : "https://services.gradle.org/distributions/gradle-8.13-milestone-1-wrapper.jar.sha256" +}, { + "version" : "8.12", + "buildTime" : "20241220154653+0000", + "current" : true, + "snapshot" : false, + "nightly" : false, + "releaseNightly" : false, + "activeRc" : false, + "rcFor" : "", + "milestoneFor" : "", + "broken" : false, + "downloadUrl" : "https://services.gradle.org/distributions/gradle-8.12-bin.zip", + "checksumUrl" : "https://services.gradle.org/distributions/gradle-8.12-bin.zip.sha256", + "wrapperChecksumUrl" : "https://services.gradle.org/distributions/gradle-8.12-wrapper.jar.sha256" +}, { + "version" : "8.12-rc-2", + "buildTime" : "20241217162852+0000", + "current" : false, + "snapshot" : false, + "nightly" : false, + "releaseNightly" : false, + "activeRc" : false, + "rcFor" : "8.12", + "milestoneFor" : "", + "broken" : false, + "downloadUrl" : "https://services.gradle.org/distributions/gradle-8.12-rc-2-bin.zip", + "checksumUrl" : "https://services.gradle.org/distributions/gradle-8.12-rc-2-bin.zip.sha256", + "wrapperChecksumUrl" : "https://services.gradle.org/distributions/gradle-8.12-rc-2-wrapper.jar.sha256" +}, { + "version" : "8.12-rc-1", + "buildTime" : "20241212152352+0000", + "current" : false, + "snapshot" : false, + "nightly" : false, + "releaseNightly" : false, + "activeRc" : false, + "rcFor" : "8.12", + "milestoneFor" : "", + "broken" : false, + "downloadUrl" : "https://services.gradle.org/distributions/gradle-8.12-rc-1-bin.zip", + "checksumUrl" : "https://services.gradle.org/distributions/gradle-8.12-rc-1-bin.zip.sha256", + "wrapperChecksumUrl" : "https://services.gradle.org/distributions/gradle-8.12-rc-1-wrapper.jar.sha256" +}, { + "version" : "8.11.1", + "buildTime" : "20241120165646+0000", + "current" : false, + "snapshot" : false, + "nightly" : false, + "releaseNightly" : false, + "activeRc" : false, + "rcFor" : "", + "milestoneFor" : "", + "broken" : false, + "downloadUrl" : "https://services.gradle.org/distributions/gradle-8.11.1-bin.zip", + "checksumUrl" : "https://services.gradle.org/distributions/gradle-8.11.1-bin.zip.sha256", + "wrapperChecksumUrl" : "https://services.gradle.org/distributions/gradle-8.11.1-wrapper.jar.sha256" +}, { + "version" : "8.11", + "buildTime" : "20241111135801+0000", + "current" : false, + "snapshot" : false, + "nightly" : false, + "releaseNightly" : false, + "activeRc" : false, + "rcFor" : "", + "milestoneFor" : "", + "broken" : false, + "downloadUrl" : "https://services.gradle.org/distributions/gradle-8.11-bin.zip", + "checksumUrl" : "https://services.gradle.org/distributions/gradle-8.11-bin.zip.sha256", + "wrapperChecksumUrl" : "https://services.gradle.org/distributions/gradle-8.11-wrapper.jar.sha256" +}, { + "version" : "8.11-rc-3", + "buildTime" : "20241107134628+0000", + "current" : false, + "snapshot" : false, + "nightly" : false, + "releaseNightly" : false, + "activeRc" : false, + "rcFor" : "8.11", + "milestoneFor" : "", + "broken" : false, + "downloadUrl" : "https://services.gradle.org/distributions/gradle-8.11-rc-3-bin.zip", + "checksumUrl" : "https://services.gradle.org/distributions/gradle-8.11-rc-3-bin.zip.sha256", + "wrapperChecksumUrl" : "https://services.gradle.org/distributions/gradle-8.11-rc-3-wrapper.jar.sha256" +}, { + "version" : "8.11-rc-2", + "buildTime" : "20241031150259+0000", + "current" : false, + "snapshot" : false, + "nightly" : false, + "releaseNightly" : false, + "activeRc" : false, + "rcFor" : "8.11", + "milestoneFor" : "", + "broken" : false, + "downloadUrl" : "https://services.gradle.org/distributions/gradle-8.11-rc-2-bin.zip", + "checksumUrl" : "https://services.gradle.org/distributions/gradle-8.11-rc-2-bin.zip.sha256", + "wrapperChecksumUrl" : "https://services.gradle.org/distributions/gradle-8.11-rc-2-wrapper.jar.sha256" +}, { + "version" : "8.11-rc-1", + "buildTime" : "20241017104024+0000", + "current" : false, + "snapshot" : false, + "nightly" : false, + "releaseNightly" : false, + "activeRc" : false, + "rcFor" : "8.11", + "milestoneFor" : "", + "broken" : false, + "downloadUrl" : "https://services.gradle.org/distributions/gradle-8.11-rc-1-bin.zip", + "checksumUrl" : "https://services.gradle.org/distributions/gradle-8.11-rc-1-bin.zip.sha256", + "wrapperChecksumUrl" : "https://services.gradle.org/distributions/gradle-8.11-rc-1-wrapper.jar.sha256" +}, { + "version" : "8.11-milestone-1", + "buildTime" : "20241006083426+0000", + "current" : false, + "snapshot" : false, + "nightly" : false, + "releaseNightly" : false, + "activeRc" : false, + "rcFor" : "", + "milestoneFor" : "8.11", + "broken" : false, + "downloadUrl" : "https://services.gradle.org/distributions/gradle-8.11-milestone-1-bin.zip", + "checksumUrl" : "https://services.gradle.org/distributions/gradle-8.11-milestone-1-bin.zip.sha256", + "wrapperChecksumUrl" : "https://services.gradle.org/distributions/gradle-8.11-milestone-1-wrapper.jar.sha256" +}, { + "version" : "8.10.2", + "buildTime" : "20240923212839+0000", + "current" : false, + "snapshot" : false, + "nightly" : false, + "releaseNightly" : false, + "activeRc" : false, + "rcFor" : "", + "milestoneFor" : "", + "broken" : false, + "downloadUrl" : "https://services.gradle.org/distributions/gradle-8.10.2-bin.zip", + "checksumUrl" : "https://services.gradle.org/distributions/gradle-8.10.2-bin.zip.sha256", + "wrapperChecksumUrl" : "https://services.gradle.org/distributions/gradle-8.10.2-wrapper.jar.sha256" +}, { + "version" : "8.10.2-milestone-1", + "buildTime" : "20240919234735+0000", + "current" : false, + "snapshot" : false, + "nightly" : false, + "releaseNightly" : false, + "activeRc" : false, + "rcFor" : "", + "milestoneFor" : "8.10.2", + "broken" : false, + "downloadUrl" : "https://services.gradle.org/distributions/gradle-8.10.2-milestone-1-bin.zip", + "checksumUrl" : "https://services.gradle.org/distributions/gradle-8.10.2-milestone-1-bin.zip.sha256", + "wrapperChecksumUrl" : "https://services.gradle.org/distributions/gradle-8.10.2-milestone-1-wrapper.jar.sha256" +}, { + "version" : "8.10.1", + "buildTime" : "20240909074256+0000", + "current" : false, + "snapshot" : false, + "nightly" : false, + "releaseNightly" : false, + "activeRc" : false, + "rcFor" : "", + "milestoneFor" : "", + "broken" : false, + "downloadUrl" : "https://services.gradle.org/distributions/gradle-8.10.1-bin.zip", + "checksumUrl" : "https://services.gradle.org/distributions/gradle-8.10.1-bin.zip.sha256", + "wrapperChecksumUrl" : "https://services.gradle.org/distributions/gradle-8.10.1-wrapper.jar.sha256" +}, { + "version" : "8.10", + "buildTime" : "20240814110745+0000", + "current" : false, + "snapshot" : false, + "nightly" : false, + "releaseNightly" : false, + "activeRc" : false, + "rcFor" : "", + "milestoneFor" : "", + "broken" : false, + "downloadUrl" : "https://services.gradle.org/distributions/gradle-8.10-bin.zip", + "checksumUrl" : "https://services.gradle.org/distributions/gradle-8.10-bin.zip.sha256", + "wrapperChecksumUrl" : "https://services.gradle.org/distributions/gradle-8.10-wrapper.jar.sha256" +}, { + "version" : "8.10-rc-1", + "buildTime" : "20240808060755+0000", + "current" : false, + "snapshot" : false, + "nightly" : false, + "releaseNightly" : false, + "activeRc" : false, + "rcFor" : "8.10", + "milestoneFor" : "", + "broken" : false, + "downloadUrl" : "https://services.gradle.org/distributions/gradle-8.10-rc-1-bin.zip", + "checksumUrl" : "https://services.gradle.org/distributions/gradle-8.10-rc-1-bin.zip.sha256", + "wrapperChecksumUrl" : "https://services.gradle.org/distributions/gradle-8.10-rc-1-wrapper.jar.sha256" +}, { + "version" : "8.9", + "buildTime" : "20240711143741+0000", + "current" : false, + "snapshot" : false, + "nightly" : false, + "releaseNightly" : false, + "activeRc" : false, + "rcFor" : "", + "milestoneFor" : "", + "broken" : false, + "downloadUrl" : "https://services.gradle.org/distributions/gradle-8.9-bin.zip", + "checksumUrl" : "https://services.gradle.org/distributions/gradle-8.9-bin.zip.sha256", + "wrapperChecksumUrl" : "https://services.gradle.org/distributions/gradle-8.9-wrapper.jar.sha256" +}, { + "version" : "8.9-rc-2", + "buildTime" : "20240705153825+0000", + "current" : false, + "snapshot" : false, + "nightly" : false, + "releaseNightly" : false, + "activeRc" : false, + "rcFor" : "8.9", + "milestoneFor" : "", + "broken" : false, + "downloadUrl" : "https://services.gradle.org/distributions/gradle-8.9-rc-2-bin.zip", + "checksumUrl" : "https://services.gradle.org/distributions/gradle-8.9-rc-2-bin.zip.sha256", + "wrapperChecksumUrl" : "https://services.gradle.org/distributions/gradle-8.9-rc-2-wrapper.jar.sha256" +}, { + "version" : "8.9-rc-1", + "buildTime" : "20240621131308+0000", + "current" : false, + "snapshot" : false, + "nightly" : false, + "releaseNightly" : false, + "activeRc" : false, + "rcFor" : "8.9", + "milestoneFor" : "", + "broken" : false, + "downloadUrl" : "https://services.gradle.org/distributions/gradle-8.9-rc-1-bin.zip", + "checksumUrl" : "https://services.gradle.org/distributions/gradle-8.9-rc-1-bin.zip.sha256", + "wrapperChecksumUrl" : "https://services.gradle.org/distributions/gradle-8.9-rc-1-wrapper.jar.sha256" +}, { + "version" : "8.8", + "buildTime" : "20240531214656+0000", + "current" : false, + "snapshot" : false, + "nightly" : false, + "releaseNightly" : false, + "activeRc" : false, + "rcFor" : "", + "milestoneFor" : "", + "broken" : false, + "downloadUrl" : "https://services.gradle.org/distributions/gradle-8.8-bin.zip", + "checksumUrl" : "https://services.gradle.org/distributions/gradle-8.8-bin.zip.sha256", + "wrapperChecksumUrl" : "https://services.gradle.org/distributions/gradle-8.8-wrapper.jar.sha256" +}, { + "version" : "8.8-rc-2", + "buildTime" : "20240527070937+0000", + "current" : false, + "snapshot" : false, + "nightly" : false, + "releaseNightly" : false, + "activeRc" : false, + "rcFor" : "8.8", + "milestoneFor" : "", + "broken" : false, + "downloadUrl" : "https://services.gradle.org/distributions/gradle-8.8-rc-2-bin.zip", + "checksumUrl" : "https://services.gradle.org/distributions/gradle-8.8-rc-2-bin.zip.sha256", + "wrapperChecksumUrl" : "https://services.gradle.org/distributions/gradle-8.8-rc-2-wrapper.jar.sha256" +}, { + "version" : "8.8-rc-1", + "buildTime" : "20240426151958+0000", + "current" : false, + "snapshot" : false, + "nightly" : false, + "releaseNightly" : false, + "activeRc" : false, + "rcFor" : "8.8", + "milestoneFor" : "", + "broken" : false, + "downloadUrl" : "https://services.gradle.org/distributions/gradle-8.8-rc-1-bin.zip", + "checksumUrl" : "https://services.gradle.org/distributions/gradle-8.8-rc-1-bin.zip.sha256", + "wrapperChecksumUrl" : "https://services.gradle.org/distributions/gradle-8.8-rc-1-wrapper.jar.sha256" +}, { + "version" : "8.7", + "buildTime" : "20240322155246+0000", + "current" : false, + "snapshot" : false, + "nightly" : false, + "releaseNightly" : false, + "activeRc" : false, + "rcFor" : "", + "milestoneFor" : "", + "broken" : false, + "downloadUrl" : "https://services.gradle.org/distributions/gradle-8.7-bin.zip", + "checksumUrl" : "https://services.gradle.org/distributions/gradle-8.7-bin.zip.sha256", + "wrapperChecksumUrl" : "https://services.gradle.org/distributions/gradle-8.7-wrapper.jar.sha256" +}, { + "version" : "8.7-rc-4", + "buildTime" : "20240320140334+0000", + "current" : false, + "snapshot" : false, + "nightly" : false, + "releaseNightly" : false, + "activeRc" : false, + "rcFor" : "8.7", + "milestoneFor" : "", + "broken" : false, + "downloadUrl" : "https://services.gradle.org/distributions/gradle-8.7-rc-4-bin.zip", + "checksumUrl" : "https://services.gradle.org/distributions/gradle-8.7-rc-4-bin.zip.sha256", + "wrapperChecksumUrl" : "https://services.gradle.org/distributions/gradle-8.7-rc-4-wrapper.jar.sha256" +}, { + "version" : "8.7-rc-3", + "buildTime" : "20240311171310+0000", + "current" : false, + "snapshot" : false, + "nightly" : false, + "releaseNightly" : false, + "activeRc" : false, + "rcFor" : "8.7", + "milestoneFor" : "", + "broken" : false, + "downloadUrl" : "https://services.gradle.org/distributions/gradle-8.7-rc-3-bin.zip", + "checksumUrl" : "https://services.gradle.org/distributions/gradle-8.7-rc-3-bin.zip.sha256", + "wrapperChecksumUrl" : "https://services.gradle.org/distributions/gradle-8.7-rc-3-wrapper.jar.sha256" +}, { + "version" : "8.7-rc-2", + "buildTime" : "20240229125337+0000", + "current" : false, + "snapshot" : false, + "nightly" : false, + "releaseNightly" : false, + "activeRc" : false, + "rcFor" : "8.7", + "milestoneFor" : "", + "broken" : false, + "downloadUrl" : "https://services.gradle.org/distributions/gradle-8.7-rc-2-bin.zip", + "checksumUrl" : "https://services.gradle.org/distributions/gradle-8.7-rc-2-bin.zip.sha256", + "wrapperChecksumUrl" : "https://services.gradle.org/distributions/gradle-8.7-rc-2-wrapper.jar.sha256" +}, { + "version" : "8.7-rc-1", + "buildTime" : "20240222213949+0000", + "current" : false, + "snapshot" : false, + "nightly" : false, + "releaseNightly" : false, + "activeRc" : false, + "rcFor" : "8.7", + "milestoneFor" : "", + "broken" : false, + "downloadUrl" : "https://services.gradle.org/distributions/gradle-8.7-rc-1-bin.zip", + "checksumUrl" : "https://services.gradle.org/distributions/gradle-8.7-rc-1-bin.zip.sha256", + "wrapperChecksumUrl" : "https://services.gradle.org/distributions/gradle-8.7-rc-1-wrapper.jar.sha256" +}, { + "version" : "7.6.4", + "buildTime" : "20240205142918+0000", + "current" : false, + "snapshot" : false, + "nightly" : false, + "releaseNightly" : false, + "activeRc" : false, + "rcFor" : "", + "milestoneFor" : "", + "broken" : false, + "downloadUrl" : "https://services.gradle.org/distributions/gradle-7.6.4-bin.zip", + "checksumUrl" : "https://services.gradle.org/distributions/gradle-7.6.4-bin.zip.sha256", + "wrapperChecksumUrl" : "https://services.gradle.org/distributions/gradle-7.6.4-wrapper.jar.sha256" +}, { + "version" : "8.6", + "buildTime" : "20240202164716+0000", + "current" : false, + "snapshot" : false, + "nightly" : false, + "releaseNightly" : false, + "activeRc" : false, + "rcFor" : "", + "milestoneFor" : "", + "broken" : false, + "downloadUrl" : "https://services.gradle.org/distributions/gradle-8.6-bin.zip", + "checksumUrl" : "https://services.gradle.org/distributions/gradle-8.6-bin.zip.sha256", + "wrapperChecksumUrl" : "https://services.gradle.org/distributions/gradle-8.6-wrapper.jar.sha256" +}, { + "version" : "8.6-rc-4", + "buildTime" : "20240131130628+0000", + "current" : false, + "snapshot" : false, + "nightly" : false, + "releaseNightly" : false, + "activeRc" : false, + "rcFor" : "8.6", + "milestoneFor" : "", + "broken" : false, + "downloadUrl" : "https://services.gradle.org/distributions/gradle-8.6-rc-4-bin.zip", + "checksumUrl" : "https://services.gradle.org/distributions/gradle-8.6-rc-4-bin.zip.sha256", + "wrapperChecksumUrl" : "https://services.gradle.org/distributions/gradle-8.6-rc-4-wrapper.jar.sha256" +}, { + "version" : "8.6-rc-3", + "buildTime" : "20240123150619+0000", + "current" : false, + "snapshot" : false, + "nightly" : false, + "releaseNightly" : false, + "activeRc" : false, + "rcFor" : "8.6", + "milestoneFor" : "", + "broken" : false, + "downloadUrl" : "https://services.gradle.org/distributions/gradle-8.6-rc-3-bin.zip", + "checksumUrl" : "https://services.gradle.org/distributions/gradle-8.6-rc-3-bin.zip.sha256", + "wrapperChecksumUrl" : "https://services.gradle.org/distributions/gradle-8.6-rc-3-wrapper.jar.sha256" +}, { + "version" : "8.6-rc-2", + "buildTime" : "20240112144903+0000", + "current" : false, + "snapshot" : false, + "nightly" : false, + "releaseNightly" : false, + "activeRc" : false, + "rcFor" : "8.6", + "milestoneFor" : "", + "broken" : false, + "downloadUrl" : "https://services.gradle.org/distributions/gradle-8.6-rc-2-bin.zip", + "checksumUrl" : "https://services.gradle.org/distributions/gradle-8.6-rc-2-bin.zip.sha256", + "wrapperChecksumUrl" : "https://services.gradle.org/distributions/gradle-8.6-rc-2-wrapper.jar.sha256" +}, { + "version" : "8.6-rc-1", + "buildTime" : "20231228064048+0000", + "current" : false, + "snapshot" : false, + "nightly" : false, + "releaseNightly" : false, + "activeRc" : false, + "rcFor" : "8.6", + "milestoneFor" : "", + "broken" : false, + "downloadUrl" : "https://services.gradle.org/distributions/gradle-8.6-rc-1-bin.zip", + "checksumUrl" : "https://services.gradle.org/distributions/gradle-8.6-rc-1-bin.zip.sha256", + "wrapperChecksumUrl" : "https://services.gradle.org/distributions/gradle-8.6-rc-1-wrapper.jar.sha256" +}, { + "version" : "8.6-milestone-1", + "buildTime" : "20231208093905+0000", + "current" : false, + "snapshot" : false, + "nightly" : false, + "releaseNightly" : false, + "activeRc" : false, + "rcFor" : "", + "milestoneFor" : "8.6", + "broken" : false, + "downloadUrl" : "https://services.gradle.org/distributions/gradle-8.6-milestone-1-bin.zip", + "checksumUrl" : "https://services.gradle.org/distributions/gradle-8.6-milestone-1-bin.zip.sha256", + "wrapperChecksumUrl" : "https://services.gradle.org/distributions/gradle-8.6-milestone-1-wrapper.jar.sha256" +}, { + "version" : "8.5", + "buildTime" : "20231129140857+0000", + "current" : false, + "snapshot" : false, + "nightly" : false, + "releaseNightly" : false, + "activeRc" : false, + "rcFor" : "", + "milestoneFor" : "", + "broken" : false, + "downloadUrl" : "https://services.gradle.org/distributions/gradle-8.5-bin.zip", + "checksumUrl" : "https://services.gradle.org/distributions/gradle-8.5-bin.zip.sha256", + "wrapperChecksumUrl" : "https://services.gradle.org/distributions/gradle-8.5-wrapper.jar.sha256" +}, { + "version" : "8.5-rc-4", + "buildTime" : "20231124091900+0000", + "current" : false, + "snapshot" : false, + "nightly" : false, + "releaseNightly" : false, + "activeRc" : false, + "rcFor" : "8.5", + "milestoneFor" : "", + "broken" : false, + "downloadUrl" : "https://services.gradle.org/distributions/gradle-8.5-rc-4-bin.zip", + "checksumUrl" : "https://services.gradle.org/distributions/gradle-8.5-rc-4-bin.zip.sha256", + "wrapperChecksumUrl" : "https://services.gradle.org/distributions/gradle-8.5-rc-4-wrapper.jar.sha256" +}, { + "version" : "8.5-rc-3", + "buildTime" : "20231117134310+0000", + "current" : false, + "snapshot" : false, + "nightly" : false, + "releaseNightly" : false, + "activeRc" : false, + "rcFor" : "8.5", + "milestoneFor" : "", + "broken" : false, + "downloadUrl" : "https://services.gradle.org/distributions/gradle-8.5-rc-3-bin.zip", + "checksumUrl" : "https://services.gradle.org/distributions/gradle-8.5-rc-3-bin.zip.sha256", + "wrapperChecksumUrl" : "https://services.gradle.org/distributions/gradle-8.5-rc-3-wrapper.jar.sha256" +}, { + "version" : "8.5-rc-2", + "buildTime" : "20231114141630+0000", + "current" : false, + "snapshot" : false, + "nightly" : false, + "releaseNightly" : false, + "activeRc" : false, + "rcFor" : "8.5", + "milestoneFor" : "", + "broken" : false, + "downloadUrl" : "https://services.gradle.org/distributions/gradle-8.5-rc-2-bin.zip", + "checksumUrl" : "https://services.gradle.org/distributions/gradle-8.5-rc-2-bin.zip.sha256", + "wrapperChecksumUrl" : "https://services.gradle.org/distributions/gradle-8.5-rc-2-wrapper.jar.sha256" +}, { + "version" : "8.5-rc-1", + "buildTime" : "20231107155056+0000", + "current" : false, + "snapshot" : false, + "nightly" : false, + "releaseNightly" : false, + "activeRc" : false, + "rcFor" : "8.5", + "milestoneFor" : "", + "broken" : false, + "downloadUrl" : "https://services.gradle.org/distributions/gradle-8.5-rc-1-bin.zip", + "checksumUrl" : "https://services.gradle.org/distributions/gradle-8.5-rc-1-bin.zip.sha256", + "wrapperChecksumUrl" : "https://services.gradle.org/distributions/gradle-8.5-rc-1-wrapper.jar.sha256" +}, { + "version" : "8.4", + "buildTime" : "20231004205213+0000", + "current" : false, + "snapshot" : false, + "nightly" : false, + "releaseNightly" : false, + "activeRc" : false, + "rcFor" : "", + "milestoneFor" : "", + "broken" : false, + "downloadUrl" : "https://services.gradle.org/distributions/gradle-8.4-bin.zip", + "checksumUrl" : "https://services.gradle.org/distributions/gradle-8.4-bin.zip.sha256", + "wrapperChecksumUrl" : "https://services.gradle.org/distributions/gradle-8.4-wrapper.jar.sha256" +}, { + "version" : "7.6.3", + "buildTime" : "20231004155947+0000", + "current" : false, + "snapshot" : false, + "nightly" : false, + "releaseNightly" : false, + "activeRc" : false, + "rcFor" : "", + "milestoneFor" : "", + "broken" : false, + "downloadUrl" : "https://services.gradle.org/distributions/gradle-7.6.3-bin.zip", + "checksumUrl" : "https://services.gradle.org/distributions/gradle-7.6.3-bin.zip.sha256", + "wrapperChecksumUrl" : "https://services.gradle.org/distributions/gradle-7.6.3-wrapper.jar.sha256" +}, { + "version" : "8.4-rc-3", + "buildTime" : "20230929135700+0000", + "current" : false, + "snapshot" : false, + "nightly" : false, + "releaseNightly" : false, + "activeRc" : false, + "rcFor" : "8.4", + "milestoneFor" : "", + "broken" : false, + "downloadUrl" : "https://services.gradle.org/distributions/gradle-8.4-rc-3-bin.zip", + "checksumUrl" : "https://services.gradle.org/distributions/gradle-8.4-rc-3-bin.zip.sha256", + "wrapperChecksumUrl" : "https://services.gradle.org/distributions/gradle-8.4-rc-3-wrapper.jar.sha256" +}, { + "version" : "8.4-rc-2", + "buildTime" : "20230926114721+0000", + "current" : false, + "snapshot" : false, + "nightly" : false, + "releaseNightly" : false, + "activeRc" : false, + "rcFor" : "8.4", + "milestoneFor" : "", + "broken" : false, + "downloadUrl" : "https://services.gradle.org/distributions/gradle-8.4-rc-2-bin.zip", + "checksumUrl" : "https://services.gradle.org/distributions/gradle-8.4-rc-2-bin.zip.sha256", + "wrapperChecksumUrl" : "https://services.gradle.org/distributions/gradle-8.4-rc-2-wrapper.jar.sha256" +}, { + "version" : "8.4-rc-1", + "buildTime" : "20230920065917+0000", + "current" : false, + "snapshot" : false, + "nightly" : false, + "releaseNightly" : false, + "activeRc" : false, + "rcFor" : "8.4", + "milestoneFor" : "", + "broken" : false, + "downloadUrl" : "https://services.gradle.org/distributions/gradle-8.4-rc-1-bin.zip", + "checksumUrl" : "https://services.gradle.org/distributions/gradle-8.4-rc-1-bin.zip.sha256", + "wrapperChecksumUrl" : "https://services.gradle.org/distributions/gradle-8.4-rc-1-wrapper.jar.sha256" +}, { + "version" : "8.3", + "buildTime" : "20230817070647+0000", + "current" : false, + "snapshot" : false, + "nightly" : false, + "releaseNightly" : false, + "activeRc" : false, + "rcFor" : "", + "milestoneFor" : "", + "broken" : false, + "downloadUrl" : "https://services.gradle.org/distributions/gradle-8.3-bin.zip", + "checksumUrl" : "https://services.gradle.org/distributions/gradle-8.3-bin.zip.sha256", + "wrapperChecksumUrl" : "https://services.gradle.org/distributions/gradle-8.3-wrapper.jar.sha256" +}, { + "version" : "8.3-rc-4", + "buildTime" : "20230814082841+0000", + "current" : false, + "snapshot" : false, + "nightly" : false, + "releaseNightly" : false, + "activeRc" : false, + "rcFor" : "8.3", + "milestoneFor" : "", + "broken" : false, + "downloadUrl" : "https://services.gradle.org/distributions/gradle-8.3-rc-4-bin.zip", + "checksumUrl" : "https://services.gradle.org/distributions/gradle-8.3-rc-4-bin.zip.sha256", + "wrapperChecksumUrl" : "https://services.gradle.org/distributions/gradle-8.3-rc-4-wrapper.jar.sha256" +}, { + "version" : "8.3-rc-3", + "buildTime" : "20230802172145+0000", + "current" : false, + "snapshot" : false, + "nightly" : false, + "releaseNightly" : false, + "activeRc" : false, + "rcFor" : "8.3", + "milestoneFor" : "", + "broken" : false, + "downloadUrl" : "https://services.gradle.org/distributions/gradle-8.3-rc-3-bin.zip", + "checksumUrl" : "https://services.gradle.org/distributions/gradle-8.3-rc-3-bin.zip.sha256", + "wrapperChecksumUrl" : "https://services.gradle.org/distributions/gradle-8.3-rc-3-wrapper.jar.sha256" +}, { + "version" : "8.3-rc-2", + "buildTime" : "20230726152039+0000", + "current" : false, + "snapshot" : false, + "nightly" : false, + "releaseNightly" : false, + "activeRc" : false, + "rcFor" : "8.3", + "milestoneFor" : "", + "broken" : false, + "downloadUrl" : "https://services.gradle.org/distributions/gradle-8.3-rc-2-bin.zip", + "checksumUrl" : "https://services.gradle.org/distributions/gradle-8.3-rc-2-bin.zip.sha256", + "wrapperChecksumUrl" : "https://services.gradle.org/distributions/gradle-8.3-rc-2-wrapper.jar.sha256" +}, { + "version" : "8.3-rc-1", + "buildTime" : "20230719075404+0000", + "current" : false, + "snapshot" : false, + "nightly" : false, + "releaseNightly" : false, + "activeRc" : false, + "rcFor" : "8.3", + "milestoneFor" : "", + "broken" : false, + "downloadUrl" : "https://services.gradle.org/distributions/gradle-8.3-rc-1-bin.zip", + "checksumUrl" : "https://services.gradle.org/distributions/gradle-8.3-rc-1-bin.zip.sha256", + "wrapperChecksumUrl" : "https://services.gradle.org/distributions/gradle-8.3-rc-1-wrapper.jar.sha256" +}, { + "version" : "8.2.1", + "buildTime" : "20230710121235+0000", + "current" : false, + "snapshot" : false, + "nightly" : false, + "releaseNightly" : false, + "activeRc" : false, + "rcFor" : "", + "milestoneFor" : "", + "broken" : false, + "downloadUrl" : "https://services.gradle.org/distributions/gradle-8.2.1-bin.zip", + "checksumUrl" : "https://services.gradle.org/distributions/gradle-8.2.1-bin.zip.sha256", + "wrapperChecksumUrl" : "https://services.gradle.org/distributions/gradle-8.2.1-wrapper.jar.sha256" +}, { + "version" : "8.2", + "buildTime" : "20230630180230+0000", + "current" : false, + "snapshot" : false, + "nightly" : false, + "releaseNightly" : false, + "activeRc" : false, + "rcFor" : "", + "milestoneFor" : "", + "broken" : false, + "downloadUrl" : "https://services.gradle.org/distributions/gradle-8.2-bin.zip", + "checksumUrl" : "https://services.gradle.org/distributions/gradle-8.2-bin.zip.sha256", + "wrapperChecksumUrl" : "https://services.gradle.org/distributions/gradle-8.2-wrapper.jar.sha256" +}, { + "version" : "7.6.2", + "buildTime" : "20230630154251+0000", + "current" : false, + "snapshot" : false, + "nightly" : false, + "releaseNightly" : false, + "activeRc" : false, + "rcFor" : "", + "milestoneFor" : "", + "broken" : false, + "downloadUrl" : "https://services.gradle.org/distributions/gradle-7.6.2-bin.zip", + "checksumUrl" : "https://services.gradle.org/distributions/gradle-7.6.2-bin.zip.sha256", + "wrapperChecksumUrl" : "https://services.gradle.org/distributions/gradle-7.6.2-wrapper.jar.sha256" +}, { + "version" : "8.2-rc-3", + "buildTime" : "20230628070204+0000", + "current" : false, + "snapshot" : false, + "nightly" : false, + "releaseNightly" : false, + "activeRc" : false, + "rcFor" : "8.2", + "milestoneFor" : "", + "broken" : false, + "downloadUrl" : "https://services.gradle.org/distributions/gradle-8.2-rc-3-bin.zip", + "checksumUrl" : "https://services.gradle.org/distributions/gradle-8.2-rc-3-bin.zip.sha256", + "wrapperChecksumUrl" : "https://services.gradle.org/distributions/gradle-8.2-rc-3-wrapper.jar.sha256" +}, { + "version" : "8.2-rc-2", + "buildTime" : "20230606183136+0000", + "current" : false, + "snapshot" : false, + "nightly" : false, + "releaseNightly" : false, + "activeRc" : false, + "rcFor" : "8.2", + "milestoneFor" : "", + "broken" : false, + "downloadUrl" : "https://services.gradle.org/distributions/gradle-8.2-rc-2-bin.zip", + "checksumUrl" : "https://services.gradle.org/distributions/gradle-8.2-rc-2-bin.zip.sha256", + "wrapperChecksumUrl" : "https://services.gradle.org/distributions/gradle-8.2-rc-2-wrapper.jar.sha256" +}, { + "version" : "8.2-rc-1", + "buildTime" : "20230531181205+0000", + "current" : false, + "snapshot" : false, + "nightly" : false, + "releaseNightly" : false, + "activeRc" : false, + "rcFor" : "8.2", + "milestoneFor" : "", + "broken" : false, + "downloadUrl" : "https://services.gradle.org/distributions/gradle-8.2-rc-1-bin.zip", + "checksumUrl" : "https://services.gradle.org/distributions/gradle-8.2-rc-1-bin.zip.sha256", + "wrapperChecksumUrl" : "https://services.gradle.org/distributions/gradle-8.2-rc-1-wrapper.jar.sha256" +}, { + "version" : "8.2-milestone-1", + "buildTime" : "20230426164225+0000", + "current" : false, + "snapshot" : false, + "nightly" : false, + "releaseNightly" : false, + "activeRc" : false, + "rcFor" : "", + "milestoneFor" : "8.2", + "broken" : false, + "downloadUrl" : "https://services.gradle.org/distributions/gradle-8.2-milestone-1-bin.zip", + "checksumUrl" : "https://services.gradle.org/distributions/gradle-8.2-milestone-1-bin.zip.sha256", + "wrapperChecksumUrl" : "https://services.gradle.org/distributions/gradle-8.2-milestone-1-wrapper.jar.sha256" +}, { + "version" : "8.1.1", + "buildTime" : "20230421123126+0000", + "current" : false, + "snapshot" : false, + "nightly" : false, + "releaseNightly" : false, + "activeRc" : false, + "rcFor" : "", + "milestoneFor" : "", + "broken" : false, + "downloadUrl" : "https://services.gradle.org/distributions/gradle-8.1.1-bin.zip", + "checksumUrl" : "https://services.gradle.org/distributions/gradle-8.1.1-bin.zip.sha256", + "wrapperChecksumUrl" : "https://services.gradle.org/distributions/gradle-8.1.1-wrapper.jar.sha256" +}, { + "version" : "8.1", + "buildTime" : "20230412120745+0000", + "current" : false, + "snapshot" : false, + "nightly" : false, + "releaseNightly" : false, + "activeRc" : false, + "rcFor" : "", + "milestoneFor" : "", + "broken" : false, + "downloadUrl" : "https://services.gradle.org/distributions/gradle-8.1-bin.zip", + "checksumUrl" : "https://services.gradle.org/distributions/gradle-8.1-bin.zip.sha256", + "wrapperChecksumUrl" : "https://services.gradle.org/distributions/gradle-8.1-wrapper.jar.sha256" +}, { + "version" : "8.1-rc-4", + "buildTime" : "20230411093751+0000", + "current" : false, + "snapshot" : false, + "nightly" : false, + "releaseNightly" : false, + "activeRc" : false, + "rcFor" : "8.1", + "milestoneFor" : "", + "broken" : false, + "downloadUrl" : "https://services.gradle.org/distributions/gradle-8.1-rc-4-bin.zip", + "checksumUrl" : "https://services.gradle.org/distributions/gradle-8.1-rc-4-bin.zip.sha256", + "wrapperChecksumUrl" : "https://services.gradle.org/distributions/gradle-8.1-rc-4-wrapper.jar.sha256" +}, { + "version" : "8.1-rc-3", + "buildTime" : "20230404095841+0000", + "current" : false, + "snapshot" : false, + "nightly" : false, + "releaseNightly" : false, + "activeRc" : false, + "rcFor" : "8.1", + "milestoneFor" : "", + "broken" : false, + "downloadUrl" : "https://services.gradle.org/distributions/gradle-8.1-rc-3-bin.zip", + "checksumUrl" : "https://services.gradle.org/distributions/gradle-8.1-rc-3-bin.zip.sha256", + "wrapperChecksumUrl" : "https://services.gradle.org/distributions/gradle-8.1-rc-3-wrapper.jar.sha256" +}, { + "version" : "8.1-rc-2", + "buildTime" : "20230329080943+0000", + "current" : false, + "snapshot" : false, + "nightly" : false, + "releaseNightly" : false, + "activeRc" : false, + "rcFor" : "8.1", + "milestoneFor" : "", + "broken" : false, + "downloadUrl" : "https://services.gradle.org/distributions/gradle-8.1-rc-2-bin.zip", + "checksumUrl" : "https://services.gradle.org/distributions/gradle-8.1-rc-2-bin.zip.sha256", + "wrapperChecksumUrl" : "https://services.gradle.org/distributions/gradle-8.1-rc-2-wrapper.jar.sha256" +}, { + "version" : "8.1-rc-1", + "buildTime" : "20230320143921+0000", + "current" : false, + "snapshot" : false, + "nightly" : false, + "releaseNightly" : false, + "activeRc" : false, + "rcFor" : "8.1", + "milestoneFor" : "", + "broken" : false, + "downloadUrl" : "https://services.gradle.org/distributions/gradle-8.1-rc-1-bin.zip", + "checksumUrl" : "https://services.gradle.org/distributions/gradle-8.1-rc-1-bin.zip.sha256", + "wrapperChecksumUrl" : "https://services.gradle.org/distributions/gradle-8.1-rc-1-wrapper.jar.sha256" +}, { + "version" : "8.0.2", + "buildTime" : "20230303164137+0000", + "current" : false, + "snapshot" : false, + "nightly" : false, + "releaseNightly" : false, + "activeRc" : false, + "rcFor" : "", + "milestoneFor" : "", + "broken" : false, + "downloadUrl" : "https://services.gradle.org/distributions/gradle-8.0.2-bin.zip", + "checksumUrl" : "https://services.gradle.org/distributions/gradle-8.0.2-bin.zip.sha256", + "wrapperChecksumUrl" : "https://services.gradle.org/distributions/gradle-8.0.2-wrapper.jar.sha256" +}, { + "version" : "7.6.1", + "buildTime" : "20230224135442+0000", + "current" : false, + "snapshot" : false, + "nightly" : false, + "releaseNightly" : false, + "activeRc" : false, + "rcFor" : "", + "milestoneFor" : "", + "broken" : false, + "downloadUrl" : "https://services.gradle.org/distributions/gradle-7.6.1-bin.zip", + "checksumUrl" : "https://services.gradle.org/distributions/gradle-7.6.1-bin.zip.sha256", + "wrapperChecksumUrl" : "https://services.gradle.org/distributions/gradle-7.6.1-wrapper.jar.sha256" +}, { + "version" : "6.9.4", + "buildTime" : "20230222084312+0000", + "current" : false, + "snapshot" : false, + "nightly" : false, + "releaseNightly" : false, + "activeRc" : false, + "rcFor" : "", + "milestoneFor" : "", + "broken" : false, + "downloadUrl" : "https://services.gradle.org/distributions/gradle-6.9.4-bin.zip", + "checksumUrl" : "https://services.gradle.org/distributions/gradle-6.9.4-bin.zip.sha256", + "wrapperChecksumUrl" : "https://services.gradle.org/distributions/gradle-6.9.4-wrapper.jar.sha256" +}, { + "version" : "8.0.1", + "buildTime" : "20230217200948+0000", + "current" : false, + "snapshot" : false, + "nightly" : false, + "releaseNightly" : false, + "activeRc" : false, + "rcFor" : "", + "milestoneFor" : "", + "broken" : false, + "downloadUrl" : "https://services.gradle.org/distributions/gradle-8.0.1-bin.zip", + "checksumUrl" : "https://services.gradle.org/distributions/gradle-8.0.1-bin.zip.sha256", + "wrapperChecksumUrl" : "https://services.gradle.org/distributions/gradle-8.0.1-wrapper.jar.sha256" +}, { + "version" : "8.0", + "buildTime" : "20230213131521+0000", + "current" : false, + "snapshot" : false, + "nightly" : false, + "releaseNightly" : false, + "activeRc" : false, + "rcFor" : "", + "milestoneFor" : "", + "broken" : false, + "downloadUrl" : "https://services.gradle.org/distributions/gradle-8.0-bin.zip", + "checksumUrl" : "https://services.gradle.org/distributions/gradle-8.0-bin.zip.sha256", + "wrapperChecksumUrl" : "https://services.gradle.org/distributions/gradle-8.0-wrapper.jar.sha256" +}, { + "version" : "8.0-rc-5", + "buildTime" : "20230209233943+0000", + "current" : false, + "snapshot" : false, + "nightly" : false, + "releaseNightly" : false, + "activeRc" : false, + "rcFor" : "8.0", + "milestoneFor" : "", + "broken" : false, + "downloadUrl" : "https://services.gradle.org/distributions/gradle-8.0-rc-5-bin.zip", + "checksumUrl" : "https://services.gradle.org/distributions/gradle-8.0-rc-5-bin.zip.sha256", + "wrapperChecksumUrl" : "https://services.gradle.org/distributions/gradle-8.0-rc-5-wrapper.jar.sha256" +}, { + "version" : "8.0-rc-4", + "buildTime" : "20230209172637+0000", + "current" : false, + "snapshot" : false, + "nightly" : false, + "releaseNightly" : false, + "activeRc" : false, + "rcFor" : "8.0", + "milestoneFor" : "", + "broken" : false, + "downloadUrl" : "https://services.gradle.org/distributions/gradle-8.0-rc-4-bin.zip", + "checksumUrl" : "https://services.gradle.org/distributions/gradle-8.0-rc-4-bin.zip.sha256", + "wrapperChecksumUrl" : "https://services.gradle.org/distributions/gradle-8.0-rc-4-wrapper.jar.sha256" +}, { + "version" : "8.0-rc-3", + "buildTime" : "20230206094910+0000", + "current" : false, + "snapshot" : false, + "nightly" : false, + "releaseNightly" : false, + "activeRc" : false, + "rcFor" : "8.0", + "milestoneFor" : "", + "broken" : false, + "downloadUrl" : "https://services.gradle.org/distributions/gradle-8.0-rc-3-bin.zip", + "checksumUrl" : "https://services.gradle.org/distributions/gradle-8.0-rc-3-bin.zip.sha256", + "wrapperChecksumUrl" : "https://services.gradle.org/distributions/gradle-8.0-rc-3-wrapper.jar.sha256" +}, { + "version" : "8.0-rc-2", + "buildTime" : "20230117102518+0000", + "current" : false, + "snapshot" : false, + "nightly" : false, + "releaseNightly" : false, + "activeRc" : false, + "rcFor" : "8.0", + "milestoneFor" : "", + "broken" : false, + "downloadUrl" : "https://services.gradle.org/distributions/gradle-8.0-rc-2-bin.zip", + "checksumUrl" : "https://services.gradle.org/distributions/gradle-8.0-rc-2-bin.zip.sha256", + "wrapperChecksumUrl" : "https://services.gradle.org/distributions/gradle-8.0-rc-2-wrapper.jar.sha256" +}, { + "version" : "8.0-rc-1", + "buildTime" : "20221229123250+0000", + "current" : false, + "snapshot" : false, + "nightly" : false, + "releaseNightly" : false, + "activeRc" : false, + "rcFor" : "8.0", + "milestoneFor" : "", + "broken" : false, + "downloadUrl" : "https://services.gradle.org/distributions/gradle-8.0-rc-1-bin.zip", + "checksumUrl" : "https://services.gradle.org/distributions/gradle-8.0-rc-1-bin.zip.sha256", + "wrapperChecksumUrl" : "https://services.gradle.org/distributions/gradle-8.0-rc-1-wrapper.jar.sha256" +}, { + "version" : "8.0-milestone-6", + "buildTime" : "20221220081158+0000", + "current" : false, + "snapshot" : false, + "nightly" : false, + "releaseNightly" : false, + "activeRc" : false, + "rcFor" : "", + "milestoneFor" : "8.0", + "broken" : false, + "downloadUrl" : "https://services.gradle.org/distributions/gradle-8.0-milestone-6-bin.zip", + "checksumUrl" : "https://services.gradle.org/distributions/gradle-8.0-milestone-6-bin.zip.sha256", + "wrapperChecksumUrl" : "https://services.gradle.org/distributions/gradle-8.0-milestone-6-wrapper.jar.sha256" +}, { + "version" : "8.0-milestone-5", + "buildTime" : "20221208181122+0000", + "current" : false, + "snapshot" : false, + "nightly" : false, + "releaseNightly" : false, + "activeRc" : false, + "rcFor" : "", + "milestoneFor" : "8.0", + "broken" : false, + "downloadUrl" : "https://services.gradle.org/distributions/gradle-8.0-milestone-5-bin.zip", + "checksumUrl" : "https://services.gradle.org/distributions/gradle-8.0-milestone-5-bin.zip.sha256", + "wrapperChecksumUrl" : "https://services.gradle.org/distributions/gradle-8.0-milestone-5-wrapper.jar.sha256" +}, { + "version" : "8.0-milestone-4", + "buildTime" : "20221201090656+0000", + "current" : false, + "snapshot" : false, + "nightly" : false, + "releaseNightly" : false, + "activeRc" : false, + "rcFor" : "", + "milestoneFor" : "8.0", + "broken" : false, + "downloadUrl" : "https://services.gradle.org/distributions/gradle-8.0-milestone-4-bin.zip", + "checksumUrl" : "https://services.gradle.org/distributions/gradle-8.0-milestone-4-bin.zip.sha256", + "wrapperChecksumUrl" : "https://services.gradle.org/distributions/gradle-8.0-milestone-4-wrapper.jar.sha256" +}, { + "version" : "7.6", + "buildTime" : "20221125133510+0000", + "current" : false, + "snapshot" : false, + "nightly" : false, + "releaseNightly" : false, + "activeRc" : false, + "rcFor" : "", + "milestoneFor" : "", + "broken" : false, + "downloadUrl" : "https://services.gradle.org/distributions/gradle-7.6-bin.zip", + "checksumUrl" : "https://services.gradle.org/distributions/gradle-7.6-bin.zip.sha256", + "wrapperChecksumUrl" : "https://services.gradle.org/distributions/gradle-7.6-wrapper.jar.sha256" +}, { + "version" : "7.6-rc-4", + "buildTime" : "20221122094210+0000", + "current" : false, + "snapshot" : false, + "nightly" : false, + "releaseNightly" : false, + "activeRc" : false, + "rcFor" : "7.6", + "milestoneFor" : "", + "broken" : false, + "downloadUrl" : "https://services.gradle.org/distributions/gradle-7.6-rc-4-bin.zip", + "checksumUrl" : "https://services.gradle.org/distributions/gradle-7.6-rc-4-bin.zip.sha256", + "wrapperChecksumUrl" : "https://services.gradle.org/distributions/gradle-7.6-rc-4-wrapper.jar.sha256" +}, { + "version" : "7.6-rc-3", + "buildTime" : "20221111142340+0000", + "current" : false, + "snapshot" : false, + "nightly" : false, + "releaseNightly" : false, + "activeRc" : false, + "rcFor" : "7.6", + "milestoneFor" : "", + "broken" : false, + "downloadUrl" : "https://services.gradle.org/distributions/gradle-7.6-rc-3-bin.zip", + "checksumUrl" : "https://services.gradle.org/distributions/gradle-7.6-rc-3-bin.zip.sha256", + "wrapperChecksumUrl" : "https://services.gradle.org/distributions/gradle-7.6-rc-3-wrapper.jar.sha256" +}, { + "version" : "7.6-rc-2", + "buildTime" : "20221108130606+0000", + "current" : false, + "snapshot" : false, + "nightly" : false, + "releaseNightly" : false, + "activeRc" : false, + "rcFor" : "7.6", + "milestoneFor" : "", + "broken" : false, + "downloadUrl" : "https://services.gradle.org/distributions/gradle-7.6-rc-2-bin.zip", + "checksumUrl" : "https://services.gradle.org/distributions/gradle-7.6-rc-2-bin.zip.sha256", + "wrapperChecksumUrl" : "https://services.gradle.org/distributions/gradle-7.6-rc-2-wrapper.jar.sha256" +}, { + "version" : "8.0-milestone-3", + "buildTime" : "20221028140616+0000", + "current" : false, + "snapshot" : false, + "nightly" : false, + "releaseNightly" : false, + "activeRc" : false, + "rcFor" : "", + "milestoneFor" : "8.0", + "broken" : false, + "downloadUrl" : "https://services.gradle.org/distributions/gradle-8.0-milestone-3-bin.zip", + "checksumUrl" : "https://services.gradle.org/distributions/gradle-8.0-milestone-3-bin.zip.sha256", + "wrapperChecksumUrl" : "https://services.gradle.org/distributions/gradle-8.0-milestone-3-wrapper.jar.sha256" +}, { + "version" : "7.6-rc-1", + "buildTime" : "20221028075211+0000", + "current" : false, + "snapshot" : false, + "nightly" : false, + "releaseNightly" : false, + "activeRc" : false, + "rcFor" : "7.6", + "milestoneFor" : "", + "broken" : false, + "downloadUrl" : "https://services.gradle.org/distributions/gradle-7.6-rc-1-bin.zip", + "checksumUrl" : "https://services.gradle.org/distributions/gradle-7.6-rc-1-bin.zip.sha256", + "wrapperChecksumUrl" : "https://services.gradle.org/distributions/gradle-7.6-rc-1-wrapper.jar.sha256" +}, { + "version" : "6.9.3", + "buildTime" : "20221017074402+0000", + "current" : false, + "snapshot" : false, + "nightly" : false, + "releaseNightly" : false, + "activeRc" : false, + "rcFor" : "", + "milestoneFor" : "", + "broken" : false, + "downloadUrl" : "https://services.gradle.org/distributions/gradle-6.9.3-bin.zip", + "checksumUrl" : "https://services.gradle.org/distributions/gradle-6.9.3-bin.zip.sha256", + "wrapperChecksumUrl" : "https://services.gradle.org/distributions/gradle-6.9.3-wrapper.jar.sha256" +}, { + "version" : "8.0-milestone-2", + "buildTime" : "20221009102113+0000", + "current" : false, + "snapshot" : false, + "nightly" : false, + "releaseNightly" : false, + "activeRc" : false, + "rcFor" : "", + "milestoneFor" : "8.0", + "broken" : false, + "downloadUrl" : "https://services.gradle.org/distributions/gradle-8.0-milestone-2-bin.zip", + "checksumUrl" : "https://services.gradle.org/distributions/gradle-8.0-milestone-2-bin.zip.sha256", + "wrapperChecksumUrl" : "https://services.gradle.org/distributions/gradle-8.0-milestone-2-wrapper.jar.sha256" +}, { + "version" : "8.0-milestone-1", + "buildTime" : "20220923110128+0000", + "current" : false, + "snapshot" : false, + "nightly" : false, + "releaseNightly" : false, + "activeRc" : false, + "rcFor" : "", + "milestoneFor" : "8.0", + "broken" : false, + "downloadUrl" : "https://services.gradle.org/distributions/gradle-8.0-milestone-1-bin.zip", + "checksumUrl" : "https://services.gradle.org/distributions/gradle-8.0-milestone-1-bin.zip.sha256", + "wrapperChecksumUrl" : "https://services.gradle.org/distributions/gradle-8.0-milestone-1-wrapper.jar.sha256" +}, { + "version" : "7.6-milestone-1", + "buildTime" : "20220923093944+0000", + "current" : false, + "snapshot" : false, + "nightly" : false, + "releaseNightly" : false, + "activeRc" : false, + "rcFor" : "", + "milestoneFor" : "7.6", + "broken" : false, + "downloadUrl" : "https://services.gradle.org/distributions/gradle-7.6-milestone-1-bin.zip", + "checksumUrl" : "https://services.gradle.org/distributions/gradle-7.6-milestone-1-bin.zip.sha256", + "wrapperChecksumUrl" : "https://services.gradle.org/distributions/gradle-7.6-milestone-1-wrapper.jar.sha256" +}, { + "version" : "7.5.1", + "buildTime" : "20220805211756+0000", + "current" : false, + "snapshot" : false, + "nightly" : false, + "releaseNightly" : false, + "activeRc" : false, + "rcFor" : "", + "milestoneFor" : "", + "broken" : false, + "downloadUrl" : "https://services.gradle.org/distributions/gradle-7.5.1-bin.zip", + "checksumUrl" : "https://services.gradle.org/distributions/gradle-7.5.1-bin.zip.sha256", + "wrapperChecksumUrl" : "https://services.gradle.org/distributions/gradle-7.5.1-wrapper.jar.sha256" +}, { + "version" : "7.5", + "buildTime" : "20220714124815+0000", + "current" : false, + "snapshot" : false, + "nightly" : false, + "releaseNightly" : false, + "activeRc" : false, + "rcFor" : "", + "milestoneFor" : "", + "broken" : false, + "downloadUrl" : "https://services.gradle.org/distributions/gradle-7.5-bin.zip", + "checksumUrl" : "https://services.gradle.org/distributions/gradle-7.5-bin.zip.sha256", + "wrapperChecksumUrl" : "https://services.gradle.org/distributions/gradle-7.5-wrapper.jar.sha256" +}, { + "version" : "7.5-rc-5", + "buildTime" : "20220712114039+0000", + "current" : false, + "snapshot" : false, + "nightly" : false, + "releaseNightly" : false, + "activeRc" : false, + "rcFor" : "7.5", + "milestoneFor" : "", + "broken" : false, + "downloadUrl" : "https://services.gradle.org/distributions/gradle-7.5-rc-5-bin.zip", + "checksumUrl" : "https://services.gradle.org/distributions/gradle-7.5-rc-5-bin.zip.sha256", + "wrapperChecksumUrl" : "https://services.gradle.org/distributions/gradle-7.5-rc-5-wrapper.jar.sha256" +}, { + "version" : "7.5-rc-4", + "buildTime" : "20220706171202+0000", + "current" : false, + "snapshot" : false, + "nightly" : false, + "releaseNightly" : false, + "activeRc" : false, + "rcFor" : "7.5", + "milestoneFor" : "", + "broken" : false, + "downloadUrl" : "https://services.gradle.org/distributions/gradle-7.5-rc-4-bin.zip", + "checksumUrl" : "https://services.gradle.org/distributions/gradle-7.5-rc-4-bin.zip.sha256", + "wrapperChecksumUrl" : "https://services.gradle.org/distributions/gradle-7.5-rc-4-wrapper.jar.sha256" +}, { + "version" : "7.5-rc-3", + "buildTime" : "20220629120328+0000", + "current" : false, + "snapshot" : false, + "nightly" : false, + "releaseNightly" : false, + "activeRc" : false, + "rcFor" : "7.5", + "milestoneFor" : "", + "broken" : false, + "downloadUrl" : "https://services.gradle.org/distributions/gradle-7.5-rc-3-bin.zip", + "checksumUrl" : "https://services.gradle.org/distributions/gradle-7.5-rc-3-bin.zip.sha256", + "wrapperChecksumUrl" : "https://services.gradle.org/distributions/gradle-7.5-rc-3-wrapper.jar.sha256" +}, { + "version" : "7.5-rc-2", + "buildTime" : "20220610165005+0000", + "current" : false, + "snapshot" : false, + "nightly" : false, + "releaseNightly" : false, + "activeRc" : false, + "rcFor" : "7.5", + "milestoneFor" : "", + "broken" : false, + "downloadUrl" : "https://services.gradle.org/distributions/gradle-7.5-rc-2-bin.zip", + "checksumUrl" : "https://services.gradle.org/distributions/gradle-7.5-rc-2-bin.zip.sha256", + "wrapperChecksumUrl" : "https://services.gradle.org/distributions/gradle-7.5-rc-2-wrapper.jar.sha256" +}, { + "version" : "7.5-rc-1", + "buildTime" : "20220512190923+0000", + "current" : false, + "snapshot" : false, + "nightly" : false, + "releaseNightly" : false, + "activeRc" : false, + "rcFor" : "7.5", + "milestoneFor" : "", + "broken" : false, + "downloadUrl" : "https://services.gradle.org/distributions/gradle-7.5-rc-1-bin.zip", + "checksumUrl" : "https://services.gradle.org/distributions/gradle-7.5-rc-1-bin.zip.sha256", + "wrapperChecksumUrl" : "https://services.gradle.org/distributions/gradle-7.5-rc-1-wrapper.jar.sha256" +}, { + "version" : "7.4.2", + "buildTime" : "20220331152529+0000", + "current" : false, + "snapshot" : false, + "nightly" : false, + "releaseNightly" : false, + "activeRc" : false, + "rcFor" : "", + "milestoneFor" : "", + "broken" : false, + "downloadUrl" : "https://services.gradle.org/distributions/gradle-7.4.2-bin.zip", + "checksumUrl" : "https://services.gradle.org/distributions/gradle-7.4.2-bin.zip.sha256", + "wrapperChecksumUrl" : "https://services.gradle.org/distributions/gradle-7.4.2-wrapper.jar.sha256" +}, { + "version" : "7.4.1", + "buildTime" : "20220309150447+0000", + "current" : false, + "snapshot" : false, + "nightly" : false, + "releaseNightly" : false, + "activeRc" : false, + "rcFor" : "", + "milestoneFor" : "", + "broken" : false, + "downloadUrl" : "https://services.gradle.org/distributions/gradle-7.4.1-bin.zip", + "checksumUrl" : "https://services.gradle.org/distributions/gradle-7.4.1-bin.zip.sha256", + "wrapperChecksumUrl" : "https://services.gradle.org/distributions/gradle-7.4.1-wrapper.jar.sha256" +}, { + "version" : "7.4", + "buildTime" : "20220208095838+0000", + "current" : false, + "snapshot" : false, + "nightly" : false, + "releaseNightly" : false, + "activeRc" : false, + "rcFor" : "", + "milestoneFor" : "", + "broken" : false, + "downloadUrl" : "https://services.gradle.org/distributions/gradle-7.4-bin.zip", + "checksumUrl" : "https://services.gradle.org/distributions/gradle-7.4-bin.zip.sha256", + "wrapperChecksumUrl" : "https://services.gradle.org/distributions/gradle-7.4-wrapper.jar.sha256" +}, { + "version" : "7.4-rc-2", + "buildTime" : "20220202150044+0000", + "current" : false, + "snapshot" : false, + "nightly" : false, + "releaseNightly" : false, + "activeRc" : false, + "rcFor" : "7.4", + "milestoneFor" : "", + "broken" : false, + "downloadUrl" : "https://services.gradle.org/distributions/gradle-7.4-rc-2-bin.zip", + "checksumUrl" : "https://services.gradle.org/distributions/gradle-7.4-rc-2-bin.zip.sha256", + "wrapperChecksumUrl" : "https://services.gradle.org/distributions/gradle-7.4-rc-2-wrapper.jar.sha256" +}, { + "version" : "7.4-rc-1", + "buildTime" : "20220117201507+0000", + "current" : false, + "snapshot" : false, + "nightly" : false, + "releaseNightly" : false, + "activeRc" : false, + "rcFor" : "7.4", + "milestoneFor" : "", + "broken" : false, + "downloadUrl" : "https://services.gradle.org/distributions/gradle-7.4-rc-1-bin.zip", + "checksumUrl" : "https://services.gradle.org/distributions/gradle-7.4-rc-1-bin.zip.sha256", + "wrapperChecksumUrl" : "https://services.gradle.org/distributions/gradle-7.4-rc-1-wrapper.jar.sha256" +}, { + "version" : "7.3.3", + "buildTime" : "20211222123754+0000", + "current" : false, + "snapshot" : false, + "nightly" : false, + "releaseNightly" : false, + "activeRc" : false, + "rcFor" : "", + "milestoneFor" : "", + "broken" : false, + "downloadUrl" : "https://services.gradle.org/distributions/gradle-7.3.3-bin.zip", + "checksumUrl" : "https://services.gradle.org/distributions/gradle-7.3.3-bin.zip.sha256", + "wrapperChecksumUrl" : "https://services.gradle.org/distributions/gradle-7.3.3-wrapper.jar.sha256" +}, { + "version" : "7.3.3-rc-1", + "buildTime" : "20211222090657+0000", + "current" : false, + "snapshot" : false, + "nightly" : false, + "releaseNightly" : false, + "activeRc" : false, + "rcFor" : "7.3.3", + "milestoneFor" : "", + "broken" : false, + "downloadUrl" : "https://services.gradle.org/distributions/gradle-7.3.3-rc-1-bin.zip", + "checksumUrl" : "https://services.gradle.org/distributions/gradle-7.3.3-rc-1-bin.zip.sha256", + "wrapperChecksumUrl" : "https://services.gradle.org/distributions/gradle-7.3.3-rc-1-wrapper.jar.sha256" +}, { + "version" : "6.9.2", + "buildTime" : "20211221172537+0000", + "current" : false, + "snapshot" : false, + "nightly" : false, + "releaseNightly" : false, + "activeRc" : false, + "rcFor" : "", + "milestoneFor" : "", + "broken" : false, + "downloadUrl" : "https://services.gradle.org/distributions/gradle-6.9.2-bin.zip", + "checksumUrl" : "https://services.gradle.org/distributions/gradle-6.9.2-bin.zip.sha256", + "wrapperChecksumUrl" : "https://services.gradle.org/distributions/gradle-6.9.2-wrapper.jar.sha256" +}, { + "version" : "7.3.2", + "buildTime" : "20211215112231+0000", + "current" : false, + "snapshot" : false, + "nightly" : false, + "releaseNightly" : false, + "activeRc" : false, + "rcFor" : "", + "milestoneFor" : "", + "broken" : false, + "downloadUrl" : "https://services.gradle.org/distributions/gradle-7.3.2-bin.zip", + "checksumUrl" : "https://services.gradle.org/distributions/gradle-7.3.2-bin.zip.sha256", + "wrapperChecksumUrl" : "https://services.gradle.org/distributions/gradle-7.3.2-wrapper.jar.sha256" +}, { + "version" : "7.3.1", + "buildTime" : "20211201154220+0000", + "current" : false, + "snapshot" : false, + "nightly" : false, + "releaseNightly" : false, + "activeRc" : false, + "rcFor" : "", + "milestoneFor" : "", + "broken" : false, + "downloadUrl" : "https://services.gradle.org/distributions/gradle-7.3.1-bin.zip", + "checksumUrl" : "https://services.gradle.org/distributions/gradle-7.3.1-bin.zip.sha256", + "wrapperChecksumUrl" : "https://services.gradle.org/distributions/gradle-7.3.1-wrapper.jar.sha256" +}, { + "version" : "7.3", + "buildTime" : "20211109204036+0000", + "current" : false, + "snapshot" : false, + "nightly" : false, + "releaseNightly" : false, + "activeRc" : false, + "rcFor" : "", + "milestoneFor" : "", + "broken" : false, + "downloadUrl" : "https://services.gradle.org/distributions/gradle-7.3-bin.zip", + "checksumUrl" : "https://services.gradle.org/distributions/gradle-7.3-bin.zip.sha256", + "wrapperChecksumUrl" : "https://services.gradle.org/distributions/gradle-7.3-wrapper.jar.sha256" +}, { + "version" : "7.3-rc-5", + "buildTime" : "20211105184337+0000", + "current" : false, + "snapshot" : false, + "nightly" : false, + "releaseNightly" : false, + "activeRc" : false, + "rcFor" : "7.3", + "milestoneFor" : "", + "broken" : false, + "downloadUrl" : "https://services.gradle.org/distributions/gradle-7.3-rc-5-bin.zip", + "checksumUrl" : "https://services.gradle.org/distributions/gradle-7.3-rc-5-bin.zip.sha256", + "wrapperChecksumUrl" : "https://services.gradle.org/distributions/gradle-7.3-rc-5-wrapper.jar.sha256" +}, { + "version" : "7.3-rc-4", + "buildTime" : "20211105160540+0000", + "current" : false, + "snapshot" : false, + "nightly" : false, + "releaseNightly" : false, + "activeRc" : false, + "rcFor" : "7.3", + "milestoneFor" : "", + "broken" : false, + "downloadUrl" : "https://services.gradle.org/distributions/gradle-7.3-rc-4-bin.zip", + "checksumUrl" : "https://services.gradle.org/distributions/gradle-7.3-rc-4-bin.zip.sha256", + "wrapperChecksumUrl" : "https://services.gradle.org/distributions/gradle-7.3-rc-4-wrapper.jar.sha256" +}, { + "version" : "7.3-rc-3", + "buildTime" : "20211026162420+0000", + "current" : false, + "snapshot" : false, + "nightly" : false, + "releaseNightly" : false, + "activeRc" : false, + "rcFor" : "7.3", + "milestoneFor" : "", + "broken" : false, + "downloadUrl" : "https://services.gradle.org/distributions/gradle-7.3-rc-3-bin.zip", + "checksumUrl" : "https://services.gradle.org/distributions/gradle-7.3-rc-3-bin.zip.sha256", + "wrapperChecksumUrl" : "https://services.gradle.org/distributions/gradle-7.3-rc-3-wrapper.jar.sha256" +}, { + "version" : "7.3-rc-2", + "buildTime" : "20211020220023+0000", + "current" : false, + "snapshot" : false, + "nightly" : false, + "releaseNightly" : false, + "activeRc" : false, + "rcFor" : "7.3", + "milestoneFor" : "", + "broken" : false, + "downloadUrl" : "https://services.gradle.org/distributions/gradle-7.3-rc-2-bin.zip", + "checksumUrl" : "https://services.gradle.org/distributions/gradle-7.3-rc-2-bin.zip.sha256", + "wrapperChecksumUrl" : "https://services.gradle.org/distributions/gradle-7.3-rc-2-wrapper.jar.sha256" +}, { + "version" : "7.3-rc-1", + "buildTime" : "20211012072418+0000", + "current" : false, + "snapshot" : false, + "nightly" : false, + "releaseNightly" : false, + "activeRc" : false, + "rcFor" : "7.3", + "milestoneFor" : "", + "broken" : false, + "downloadUrl" : "https://services.gradle.org/distributions/gradle-7.3-rc-1-bin.zip", + "checksumUrl" : "https://services.gradle.org/distributions/gradle-7.3-rc-1-bin.zip.sha256", + "wrapperChecksumUrl" : "https://services.gradle.org/distributions/gradle-7.3-rc-1-wrapper.jar.sha256" +}, { + "version" : "6.9.1", + "buildTime" : "20210820111518+0000", + "current" : false, + "snapshot" : false, + "nightly" : false, + "releaseNightly" : false, + "activeRc" : false, + "rcFor" : "", + "milestoneFor" : "", + "broken" : false, + "downloadUrl" : "https://services.gradle.org/distributions/gradle-6.9.1-bin.zip", + "checksumUrl" : "https://services.gradle.org/distributions/gradle-6.9.1-bin.zip.sha256", + "wrapperChecksumUrl" : "https://services.gradle.org/distributions/gradle-6.9.1-wrapper.jar.sha256" +}, { + "version" : "7.2", + "buildTime" : "20210817095903+0000", + "current" : false, + "snapshot" : false, + "nightly" : false, + "releaseNightly" : false, + "activeRc" : false, + "rcFor" : "", + "milestoneFor" : "", + "broken" : false, + "downloadUrl" : "https://services.gradle.org/distributions/gradle-7.2-bin.zip", + "checksumUrl" : "https://services.gradle.org/distributions/gradle-7.2-bin.zip.sha256", + "wrapperChecksumUrl" : "https://services.gradle.org/distributions/gradle-7.2-wrapper.jar.sha256" +}, { + "version" : "7.2-rc-3", + "buildTime" : "20210812075909+0000", + "current" : false, + "snapshot" : false, + "nightly" : false, + "releaseNightly" : false, + "activeRc" : false, + "rcFor" : "7.2", + "milestoneFor" : "", + "broken" : false, + "downloadUrl" : "https://services.gradle.org/distributions/gradle-7.2-rc-3-bin.zip", + "checksumUrl" : "https://services.gradle.org/distributions/gradle-7.2-rc-3-bin.zip.sha256", + "wrapperChecksumUrl" : "https://services.gradle.org/distributions/gradle-7.2-rc-3-wrapper.jar.sha256" +}, { + "version" : "7.2-rc-2", + "buildTime" : "20210805122137+0000", + "current" : false, + "snapshot" : false, + "nightly" : false, + "releaseNightly" : false, + "activeRc" : false, + "rcFor" : "7.2", + "milestoneFor" : "", + "broken" : false, + "downloadUrl" : "https://services.gradle.org/distributions/gradle-7.2-rc-2-bin.zip", + "checksumUrl" : "https://services.gradle.org/distributions/gradle-7.2-rc-2-bin.zip.sha256", + "wrapperChecksumUrl" : "https://services.gradle.org/distributions/gradle-7.2-rc-2-wrapper.jar.sha256" +}, { + "version" : "7.2-rc-1", + "buildTime" : "20210729075128+0000", + "current" : false, + "snapshot" : false, + "nightly" : false, + "releaseNightly" : false, + "activeRc" : false, + "rcFor" : "7.2", + "milestoneFor" : "", + "broken" : false, + "downloadUrl" : "https://services.gradle.org/distributions/gradle-7.2-rc-1-bin.zip", + "checksumUrl" : "https://services.gradle.org/distributions/gradle-7.2-rc-1-bin.zip.sha256", + "wrapperChecksumUrl" : "https://services.gradle.org/distributions/gradle-7.2-rc-1-wrapper.jar.sha256" +}, { + "version" : "7.1.1", + "buildTime" : "20210702121643+0000", + "current" : false, + "snapshot" : false, + "nightly" : false, + "releaseNightly" : false, + "activeRc" : false, + "rcFor" : "", + "milestoneFor" : "", + "broken" : false, + "downloadUrl" : "https://services.gradle.org/distributions/gradle-7.1.1-bin.zip", + "checksumUrl" : "https://services.gradle.org/distributions/gradle-7.1.1-bin.zip.sha256", + "wrapperChecksumUrl" : "https://services.gradle.org/distributions/gradle-7.1.1-wrapper.jar.sha256" +}, { + "version" : "7.1", + "buildTime" : "20210614144726+0000", + "current" : false, + "snapshot" : false, + "nightly" : false, + "releaseNightly" : false, + "activeRc" : false, + "rcFor" : "", + "milestoneFor" : "", + "broken" : false, + "downloadUrl" : "https://services.gradle.org/distributions/gradle-7.1-bin.zip", + "checksumUrl" : "https://services.gradle.org/distributions/gradle-7.1-bin.zip.sha256", + "wrapperChecksumUrl" : "https://services.gradle.org/distributions/gradle-7.1-wrapper.jar.sha256" +}, { + "version" : "7.1-rc-2", + "buildTime" : "20210608153520+0000", + "current" : false, + "snapshot" : false, + "nightly" : false, + "releaseNightly" : false, + "activeRc" : false, + "rcFor" : "7.1", + "milestoneFor" : "", + "broken" : false, + "downloadUrl" : "https://services.gradle.org/distributions/gradle-7.1-rc-2-bin.zip", + "checksumUrl" : "https://services.gradle.org/distributions/gradle-7.1-rc-2-bin.zip.sha256", + "wrapperChecksumUrl" : "https://services.gradle.org/distributions/gradle-7.1-rc-2-wrapper.jar.sha256" +}, { + "version" : "7.1-rc-1", + "buildTime" : "20210531095845+0000", + "current" : false, + "snapshot" : false, + "nightly" : false, + "releaseNightly" : false, + "activeRc" : false, + "rcFor" : "7.1", + "milestoneFor" : "", + "broken" : false, + "downloadUrl" : "https://services.gradle.org/distributions/gradle-7.1-rc-1-bin.zip", + "checksumUrl" : "https://services.gradle.org/distributions/gradle-7.1-rc-1-bin.zip.sha256", + "wrapperChecksumUrl" : "https://services.gradle.org/distributions/gradle-7.1-rc-1-wrapper.jar.sha256" +}, { + "version" : "7.0.2", + "buildTime" : "20210514120231+0000", + "current" : false, + "snapshot" : false, + "nightly" : false, + "releaseNightly" : false, + "activeRc" : false, + "rcFor" : "", + "milestoneFor" : "", + "broken" : false, + "downloadUrl" : "https://services.gradle.org/distributions/gradle-7.0.2-bin.zip", + "checksumUrl" : "https://services.gradle.org/distributions/gradle-7.0.2-bin.zip.sha256", + "wrapperChecksumUrl" : "https://services.gradle.org/distributions/gradle-7.0.2-wrapper.jar.sha256" +}, { + "version" : "7.0.1", + "buildTime" : "20210510160858+0000", + "current" : false, + "snapshot" : false, + "nightly" : false, + "releaseNightly" : false, + "activeRc" : false, + "rcFor" : "", + "milestoneFor" : "", + "broken" : false, + "downloadUrl" : "https://services.gradle.org/distributions/gradle-7.0.1-bin.zip", + "checksumUrl" : "https://services.gradle.org/distributions/gradle-7.0.1-bin.zip.sha256", + "wrapperChecksumUrl" : "https://services.gradle.org/distributions/gradle-7.0.1-wrapper.jar.sha256" +}, { + "version" : "6.9", + "buildTime" : "20210507072853+0000", + "current" : false, + "snapshot" : false, + "nightly" : false, + "releaseNightly" : false, + "activeRc" : false, + "rcFor" : "", + "milestoneFor" : "", + "broken" : false, + "downloadUrl" : "https://services.gradle.org/distributions/gradle-6.9-bin.zip", + "checksumUrl" : "https://services.gradle.org/distributions/gradle-6.9-bin.zip.sha256", + "wrapperChecksumUrl" : "https://services.gradle.org/distributions/gradle-6.9-wrapper.jar.sha256" +}, { + "version" : "6.9-rc-2", + "buildTime" : "20210505141217+0000", + "current" : false, + "snapshot" : false, + "nightly" : false, + "releaseNightly" : false, + "activeRc" : false, + "rcFor" : "6.9", + "milestoneFor" : "", + "broken" : false, + "downloadUrl" : "https://services.gradle.org/distributions/gradle-6.9-rc-2-bin.zip", + "checksumUrl" : "https://services.gradle.org/distributions/gradle-6.9-rc-2-bin.zip.sha256", + "wrapperChecksumUrl" : "https://services.gradle.org/distributions/gradle-6.9-rc-2-wrapper.jar.sha256" +}, { + "version" : "6.9-rc-1", + "buildTime" : "20210427125445+0000", + "current" : false, + "snapshot" : false, + "nightly" : false, + "releaseNightly" : false, + "activeRc" : false, + "rcFor" : "6.9", + "milestoneFor" : "", + "broken" : false, + "downloadUrl" : "https://services.gradle.org/distributions/gradle-6.9-rc-1-bin.zip", + "checksumUrl" : "https://services.gradle.org/distributions/gradle-6.9-rc-1-bin.zip.sha256", + "wrapperChecksumUrl" : "https://services.gradle.org/distributions/gradle-6.9-rc-1-wrapper.jar.sha256" +}, { + "version" : "7.0", + "buildTime" : "20210409222731+0000", + "current" : false, + "snapshot" : false, + "nightly" : false, + "releaseNightly" : false, + "activeRc" : false, + "rcFor" : "", + "milestoneFor" : "", + "broken" : false, + "downloadUrl" : "https://services.gradle.org/distributions/gradle-7.0-bin.zip", + "checksumUrl" : "https://services.gradle.org/distributions/gradle-7.0-bin.zip.sha256", + "wrapperChecksumUrl" : "https://services.gradle.org/distributions/gradle-7.0-wrapper.jar.sha256" +}, { + "version" : "7.0-rc-2", + "buildTime" : "20210401212639+0000", + "current" : false, + "snapshot" : false, + "nightly" : false, + "releaseNightly" : false, + "activeRc" : false, + "rcFor" : "7.0", + "milestoneFor" : "", + "broken" : false, + "downloadUrl" : "https://services.gradle.org/distributions/gradle-7.0-rc-2-bin.zip", + "checksumUrl" : "https://services.gradle.org/distributions/gradle-7.0-rc-2-bin.zip.sha256", + "wrapperChecksumUrl" : "https://services.gradle.org/distributions/gradle-7.0-rc-2-wrapper.jar.sha256" +}, { + "version" : "7.0-rc-1", + "buildTime" : "20210323010230+0000", + "current" : false, + "snapshot" : false, + "nightly" : false, + "releaseNightly" : false, + "activeRc" : false, + "rcFor" : "7.0", + "milestoneFor" : "", + "broken" : false, + "downloadUrl" : "https://services.gradle.org/distributions/gradle-7.0-rc-1-bin.zip", + "checksumUrl" : "https://services.gradle.org/distributions/gradle-7.0-rc-1-bin.zip.sha256", + "wrapperChecksumUrl" : "https://services.gradle.org/distributions/gradle-7.0-rc-1-wrapper.jar.sha256" +}, { + "version" : "7.0-milestone-3", + "buildTime" : "20210313010321+0000", + "current" : false, + "snapshot" : false, + "nightly" : false, + "releaseNightly" : false, + "activeRc" : false, + "rcFor" : "", + "milestoneFor" : "7.0", + "broken" : false, + "downloadUrl" : "https://services.gradle.org/distributions/gradle-7.0-milestone-3-bin.zip", + "checksumUrl" : "https://services.gradle.org/distributions/gradle-7.0-milestone-3-bin.zip.sha256", + "wrapperChecksumUrl" : "https://services.gradle.org/distributions/gradle-7.0-milestone-3-wrapper.jar.sha256" +}, { + "version" : "7.0-milestone-2", + "buildTime" : "20210223230254+0000", + "current" : false, + "snapshot" : false, + "nightly" : false, + "releaseNightly" : false, + "activeRc" : false, + "rcFor" : "", + "milestoneFor" : "7.0", + "broken" : false, + "downloadUrl" : "https://services.gradle.org/distributions/gradle-7.0-milestone-2-bin.zip", + "checksumUrl" : "https://services.gradle.org/distributions/gradle-7.0-milestone-2-bin.zip.sha256", + "wrapperChecksumUrl" : "https://services.gradle.org/distributions/gradle-7.0-milestone-2-wrapper.jar.sha256" +}, { + "version" : "6.8.3", + "buildTime" : "20210222161328+0000", + "current" : false, + "snapshot" : false, + "nightly" : false, + "releaseNightly" : false, + "activeRc" : false, + "rcFor" : "", + "milestoneFor" : "", + "broken" : false, + "downloadUrl" : "https://services.gradle.org/distributions/gradle-6.8.3-bin.zip", + "checksumUrl" : "https://services.gradle.org/distributions/gradle-6.8.3-bin.zip.sha256", + "wrapperChecksumUrl" : "https://services.gradle.org/distributions/gradle-6.8.3-wrapper.jar.sha256" +}, { + "version" : "6.8.2", + "buildTime" : "20210205125300+0000", + "current" : false, + "snapshot" : false, + "nightly" : false, + "releaseNightly" : false, + "activeRc" : false, + "rcFor" : "", + "milestoneFor" : "", + "broken" : false, + "downloadUrl" : "https://services.gradle.org/distributions/gradle-6.8.2-bin.zip", + "checksumUrl" : "https://services.gradle.org/distributions/gradle-6.8.2-bin.zip.sha256", + "wrapperChecksumUrl" : "https://services.gradle.org/distributions/gradle-6.8.2-wrapper.jar.sha256" +}, { + "version" : "7.0-milestone-1", + "buildTime" : "20210203220023+0000", + "current" : false, + "snapshot" : false, + "nightly" : false, + "releaseNightly" : false, + "activeRc" : false, + "rcFor" : "", + "milestoneFor" : "7.0", + "broken" : false, + "downloadUrl" : "https://services.gradle.org/distributions/gradle-7.0-milestone-1-bin.zip", + "checksumUrl" : "https://services.gradle.org/distributions/gradle-7.0-milestone-1-bin.zip.sha256", + "wrapperChecksumUrl" : "https://services.gradle.org/distributions/gradle-7.0-milestone-1-wrapper.jar.sha256" +}, { + "version" : "6.8.1", + "buildTime" : "20210122132008+0000", + "current" : false, + "snapshot" : false, + "nightly" : false, + "releaseNightly" : false, + "activeRc" : false, + "rcFor" : "", + "milestoneFor" : "", + "broken" : false, + "downloadUrl" : "https://services.gradle.org/distributions/gradle-6.8.1-bin.zip", + "checksumUrl" : "https://services.gradle.org/distributions/gradle-6.8.1-bin.zip.sha256", + "wrapperChecksumUrl" : "https://services.gradle.org/distributions/gradle-6.8.1-wrapper.jar.sha256" +}, { + "version" : "6.8", + "buildTime" : "20210108163846+0000", + "current" : false, + "snapshot" : false, + "nightly" : false, + "releaseNightly" : false, + "activeRc" : false, + "rcFor" : "", + "milestoneFor" : "", + "broken" : false, + "downloadUrl" : "https://services.gradle.org/distributions/gradle-6.8-bin.zip", + "checksumUrl" : "https://services.gradle.org/distributions/gradle-6.8-bin.zip.sha256", + "wrapperChecksumUrl" : "https://services.gradle.org/distributions/gradle-6.8-wrapper.jar.sha256" +}, { + "version" : "6.8-rc-5", + "buildTime" : "20210104202203+0000", + "current" : false, + "snapshot" : false, + "nightly" : false, + "releaseNightly" : false, + "activeRc" : false, + "rcFor" : "6.8", + "milestoneFor" : "", + "broken" : false, + "downloadUrl" : "https://services.gradle.org/distributions/gradle-6.8-rc-5-bin.zip", + "checksumUrl" : "https://services.gradle.org/distributions/gradle-6.8-rc-5-bin.zip.sha256", + "wrapperChecksumUrl" : "https://services.gradle.org/distributions/gradle-6.8-rc-5-wrapper.jar.sha256" +}, { + "version" : "6.8-rc-4", + "buildTime" : "20201222084410+0000", + "current" : false, + "snapshot" : false, + "nightly" : false, + "releaseNightly" : false, + "activeRc" : false, + "rcFor" : "6.8", + "milestoneFor" : "", + "broken" : false, + "downloadUrl" : "https://services.gradle.org/distributions/gradle-6.8-rc-4-bin.zip", + "checksumUrl" : "https://services.gradle.org/distributions/gradle-6.8-rc-4-bin.zip.sha256", + "wrapperChecksumUrl" : "https://services.gradle.org/distributions/gradle-6.8-rc-4-wrapper.jar.sha256" +}, { + "version" : "6.8-rc-3", + "buildTime" : "20201217142452+0000", + "current" : false, + "snapshot" : false, + "nightly" : false, + "releaseNightly" : false, + "activeRc" : false, + "rcFor" : "6.8", + "milestoneFor" : "", + "broken" : false, + "downloadUrl" : "https://services.gradle.org/distributions/gradle-6.8-rc-3-bin.zip", + "checksumUrl" : "https://services.gradle.org/distributions/gradle-6.8-rc-3-bin.zip.sha256", + "wrapperChecksumUrl" : "https://services.gradle.org/distributions/gradle-6.8-rc-3-wrapper.jar.sha256" +}, { + "version" : "6.8-rc-1", + "buildTime" : "20201126092543+0000", + "current" : false, + "snapshot" : false, + "nightly" : false, + "releaseNightly" : false, + "activeRc" : false, + "rcFor" : "6.8", + "milestoneFor" : "", + "broken" : false, + "downloadUrl" : "https://services.gradle.org/distributions/gradle-6.8-rc-1-bin.zip", + "checksumUrl" : "https://services.gradle.org/distributions/gradle-6.8-rc-1-bin.zip.sha256", + "wrapperChecksumUrl" : "https://services.gradle.org/distributions/gradle-6.8-rc-1-wrapper.jar.sha256" +}, { + "version" : "6.7.1", + "buildTime" : "20201116170924+0000", + "current" : false, + "snapshot" : false, + "nightly" : false, + "releaseNightly" : false, + "activeRc" : false, + "rcFor" : "", + "milestoneFor" : "", + "broken" : false, + "downloadUrl" : "https://services.gradle.org/distributions/gradle-6.7.1-bin.zip", + "checksumUrl" : "https://services.gradle.org/distributions/gradle-6.7.1-bin.zip.sha256", + "wrapperChecksumUrl" : "https://services.gradle.org/distributions/gradle-6.7.1-wrapper.jar.sha256" +}, { + "version" : "6.8-milestone-3", + "buildTime" : "20201115200053+0000", + "current" : false, + "snapshot" : false, + "nightly" : false, + "releaseNightly" : false, + "activeRc" : false, + "rcFor" : "", + "milestoneFor" : "6.8", + "broken" : false, + "downloadUrl" : "https://services.gradle.org/distributions/gradle-6.8-milestone-3-bin.zip", + "checksumUrl" : "https://services.gradle.org/distributions/gradle-6.8-milestone-3-bin.zip.sha256", + "wrapperChecksumUrl" : "https://services.gradle.org/distributions/gradle-6.8-milestone-3-wrapper.jar.sha256" +}, { + "version" : "6.8-milestone-2", + "buildTime" : "20201028055518+0000", + "current" : false, + "snapshot" : false, + "nightly" : false, + "releaseNightly" : false, + "activeRc" : false, + "rcFor" : "", + "milestoneFor" : "6.8", + "broken" : false, + "downloadUrl" : "https://services.gradle.org/distributions/gradle-6.8-milestone-2-bin.zip", + "checksumUrl" : "https://services.gradle.org/distributions/gradle-6.8-milestone-2-bin.zip.sha256", + "wrapperChecksumUrl" : "https://services.gradle.org/distributions/gradle-6.8-milestone-2-wrapper.jar.sha256" +}, { + "version" : "6.7", + "buildTime" : "20201014161312+0000", + "current" : false, + "snapshot" : false, + "nightly" : false, + "releaseNightly" : false, + "activeRc" : false, + "rcFor" : "", + "milestoneFor" : "", + "broken" : false, + "downloadUrl" : "https://services.gradle.org/distributions/gradle-6.7-bin.zip", + "checksumUrl" : "https://services.gradle.org/distributions/gradle-6.7-bin.zip.sha256", + "wrapperChecksumUrl" : "https://services.gradle.org/distributions/gradle-6.7-wrapper.jar.sha256" +}, { + "version" : "6.8-milestone-1", + "buildTime" : "20201013065906+0000", + "current" : false, + "snapshot" : false, + "nightly" : false, + "releaseNightly" : false, + "activeRc" : false, + "rcFor" : "", + "milestoneFor" : "6.8", + "broken" : false, + "downloadUrl" : "https://services.gradle.org/distributions/gradle-6.8-milestone-1-bin.zip", + "checksumUrl" : "https://services.gradle.org/distributions/gradle-6.8-milestone-1-bin.zip.sha256", + "wrapperChecksumUrl" : "https://services.gradle.org/distributions/gradle-6.8-milestone-1-wrapper.jar.sha256" +}, { + "version" : "6.7-rc-5", + "buildTime" : "20201012190940+0000", + "current" : false, + "snapshot" : false, + "nightly" : false, + "releaseNightly" : false, + "activeRc" : false, + "rcFor" : "6.7", + "milestoneFor" : "", + "broken" : false, + "downloadUrl" : "https://services.gradle.org/distributions/gradle-6.7-rc-5-bin.zip", + "checksumUrl" : "https://services.gradle.org/distributions/gradle-6.7-rc-5-bin.zip.sha256", + "wrapperChecksumUrl" : "https://services.gradle.org/distributions/gradle-6.7-rc-5-wrapper.jar.sha256" +}, { + "version" : "6.7-rc-4", + "buildTime" : "20201008165738+0000", + "current" : false, + "snapshot" : false, + "nightly" : false, + "releaseNightly" : false, + "activeRc" : false, + "rcFor" : "6.7", + "milestoneFor" : "", + "broken" : false, + "downloadUrl" : "https://services.gradle.org/distributions/gradle-6.7-rc-4-bin.zip", + "checksumUrl" : "https://services.gradle.org/distributions/gradle-6.7-rc-4-bin.zip.sha256", + "wrapperChecksumUrl" : "https://services.gradle.org/distributions/gradle-6.7-rc-4-wrapper.jar.sha256" +}, { + "version" : "6.7-rc-3", + "buildTime" : "20200930191651+0000", + "current" : false, + "snapshot" : false, + "nightly" : false, + "releaseNightly" : false, + "activeRc" : false, + "rcFor" : "6.7", + "milestoneFor" : "", + "broken" : false, + "downloadUrl" : "https://services.gradle.org/distributions/gradle-6.7-rc-3-bin.zip", + "checksumUrl" : "https://services.gradle.org/distributions/gradle-6.7-rc-3-bin.zip.sha256", + "wrapperChecksumUrl" : "https://services.gradle.org/distributions/gradle-6.7-rc-3-wrapper.jar.sha256" +}, { + "version" : "6.7-rc-2", + "buildTime" : "20200925201444+0000", + "current" : false, + "snapshot" : false, + "nightly" : false, + "releaseNightly" : false, + "activeRc" : false, + "rcFor" : "6.7", + "milestoneFor" : "", + "broken" : false, + "downloadUrl" : "https://services.gradle.org/distributions/gradle-6.7-rc-2-bin.zip", + "checksumUrl" : "https://services.gradle.org/distributions/gradle-6.7-rc-2-bin.zip.sha256", + "wrapperChecksumUrl" : "https://services.gradle.org/distributions/gradle-6.7-rc-2-wrapper.jar.sha256" +}, { + "version" : "6.7-rc-1", + "buildTime" : "20200911161705+0000", + "current" : false, + "snapshot" : false, + "nightly" : false, + "releaseNightly" : false, + "activeRc" : false, + "rcFor" : "6.7", + "milestoneFor" : "", + "broken" : false, + "downloadUrl" : "https://services.gradle.org/distributions/gradle-6.7-rc-1-bin.zip", + "checksumUrl" : "https://services.gradle.org/distributions/gradle-6.7-rc-1-bin.zip.sha256", + "wrapperChecksumUrl" : "https://services.gradle.org/distributions/gradle-6.7-rc-1-wrapper.jar.sha256" +}, { + "version" : "6.6.1", + "buildTime" : "20200825162912+0000", + "current" : false, + "snapshot" : false, + "nightly" : false, + "releaseNightly" : false, + "activeRc" : false, + "rcFor" : "", + "milestoneFor" : "", + "broken" : false, + "downloadUrl" : "https://services.gradle.org/distributions/gradle-6.6.1-bin.zip", + "checksumUrl" : "https://services.gradle.org/distributions/gradle-6.6.1-bin.zip.sha256", + "wrapperChecksumUrl" : "https://services.gradle.org/distributions/gradle-6.6.1-wrapper.jar.sha256" +}, { + "version" : "6.6", + "buildTime" : "20200810220619+0000", + "current" : false, + "snapshot" : false, + "nightly" : false, + "releaseNightly" : false, + "activeRc" : false, + "rcFor" : "", + "milestoneFor" : "", + "broken" : false, + "downloadUrl" : "https://services.gradle.org/distributions/gradle-6.6-bin.zip", + "checksumUrl" : "https://services.gradle.org/distributions/gradle-6.6-bin.zip.sha256", + "wrapperChecksumUrl" : "https://services.gradle.org/distributions/gradle-6.6-wrapper.jar.sha256" +}, { + "version" : "6.6-rc-6", + "buildTime" : "20200805195744+0000", + "current" : false, + "snapshot" : false, + "nightly" : false, + "releaseNightly" : false, + "activeRc" : false, + "rcFor" : "6.6", + "milestoneFor" : "", + "broken" : false, + "downloadUrl" : "https://services.gradle.org/distributions/gradle-6.6-rc-6-bin.zip", + "checksumUrl" : "https://services.gradle.org/distributions/gradle-6.6-rc-6-bin.zip.sha256", + "wrapperChecksumUrl" : "https://services.gradle.org/distributions/gradle-6.6-rc-6-wrapper.jar.sha256" +}, { + "version" : "6.6-rc-5", + "buildTime" : "20200803185444+0000", + "current" : false, + "snapshot" : false, + "nightly" : false, + "releaseNightly" : false, + "activeRc" : false, + "rcFor" : "6.6", + "milestoneFor" : "", + "broken" : false, + "downloadUrl" : "https://services.gradle.org/distributions/gradle-6.6-rc-5-bin.zip", + "checksumUrl" : "https://services.gradle.org/distributions/gradle-6.6-rc-5-bin.zip.sha256", + "wrapperChecksumUrl" : "https://services.gradle.org/distributions/gradle-6.6-rc-5-wrapper.jar.sha256" +}, { + "version" : "6.6-rc-4", + "buildTime" : "20200730144824+0000", + "current" : false, + "snapshot" : false, + "nightly" : false, + "releaseNightly" : false, + "activeRc" : false, + "rcFor" : "6.6", + "milestoneFor" : "", + "broken" : false, + "downloadUrl" : "https://services.gradle.org/distributions/gradle-6.6-rc-4-bin.zip", + "checksumUrl" : "https://services.gradle.org/distributions/gradle-6.6-rc-4-bin.zip.sha256", + "wrapperChecksumUrl" : "https://services.gradle.org/distributions/gradle-6.6-rc-4-wrapper.jar.sha256" +}, { + "version" : "6.6-rc-3", + "buildTime" : "20200724140409+0000", + "current" : false, + "snapshot" : false, + "nightly" : false, + "releaseNightly" : false, + "activeRc" : false, + "rcFor" : "6.6", + "milestoneFor" : "", + "broken" : false, + "downloadUrl" : "https://services.gradle.org/distributions/gradle-6.6-rc-3-bin.zip", + "checksumUrl" : "https://services.gradle.org/distributions/gradle-6.6-rc-3-bin.zip.sha256", + "wrapperChecksumUrl" : "https://services.gradle.org/distributions/gradle-6.6-rc-3-wrapper.jar.sha256" +}, { + "version" : "6.6-rc-2", + "buildTime" : "20200720214344+0000", + "current" : false, + "snapshot" : false, + "nightly" : false, + "releaseNightly" : false, + "activeRc" : false, + "rcFor" : "6.6", + "milestoneFor" : "", + "broken" : false, + "downloadUrl" : "https://services.gradle.org/distributions/gradle-6.6-rc-2-bin.zip", + "checksumUrl" : "https://services.gradle.org/distributions/gradle-6.6-rc-2-bin.zip.sha256", + "wrapperChecksumUrl" : "https://services.gradle.org/distributions/gradle-6.6-rc-2-wrapper.jar.sha256" +}, { + "version" : "6.6-rc-1", + "buildTime" : "20200713135325+0000", + "current" : false, + "snapshot" : false, + "nightly" : false, + "releaseNightly" : false, + "activeRc" : false, + "rcFor" : "6.6", + "milestoneFor" : "", + "broken" : false, + "downloadUrl" : "https://services.gradle.org/distributions/gradle-6.6-rc-1-bin.zip", + "checksumUrl" : "https://services.gradle.org/distributions/gradle-6.6-rc-1-bin.zip.sha256", + "wrapperChecksumUrl" : "https://services.gradle.org/distributions/gradle-6.6-rc-1-wrapper.jar.sha256" +}, { + "version" : "6.6-milestone-3", + "buildTime" : "20200707160951+0000", + "current" : false, + "snapshot" : false, + "nightly" : false, + "releaseNightly" : false, + "activeRc" : false, + "rcFor" : "", + "milestoneFor" : "6.6", + "broken" : false, + "downloadUrl" : "https://services.gradle.org/distributions/gradle-6.6-milestone-3-bin.zip", + "checksumUrl" : "https://services.gradle.org/distributions/gradle-6.6-milestone-3-bin.zip.sha256", + "wrapperChecksumUrl" : "https://services.gradle.org/distributions/gradle-6.6-milestone-3-wrapper.jar.sha256" +}, { + "version" : "6.5.1", + "buildTime" : "20200630063247+0000", + "current" : false, + "snapshot" : false, + "nightly" : false, + "releaseNightly" : false, + "activeRc" : false, + "rcFor" : "", + "milestoneFor" : "", + "broken" : false, + "downloadUrl" : "https://services.gradle.org/distributions/gradle-6.5.1-bin.zip", + "checksumUrl" : "https://services.gradle.org/distributions/gradle-6.5.1-bin.zip.sha256", + "wrapperChecksumUrl" : "https://services.gradle.org/distributions/gradle-6.5.1-wrapper.jar.sha256" +}, { + "version" : "6.6-milestone-2", + "buildTime" : "20200623122834+0000", + "current" : false, + "snapshot" : false, + "nightly" : false, + "releaseNightly" : false, + "activeRc" : false, + "rcFor" : "", + "milestoneFor" : "6.6", + "broken" : false, + "downloadUrl" : "https://services.gradle.org/distributions/gradle-6.6-milestone-2-bin.zip", + "checksumUrl" : "https://services.gradle.org/distributions/gradle-6.6-milestone-2-bin.zip.sha256", + "wrapperChecksumUrl" : "https://services.gradle.org/distributions/gradle-6.6-milestone-2-wrapper.jar.sha256" +}, { + "version" : "6.6-milestone-1", + "buildTime" : "20200611202418+0000", + "current" : false, + "snapshot" : false, + "nightly" : false, + "releaseNightly" : false, + "activeRc" : false, + "rcFor" : "", + "milestoneFor" : "6.6", + "broken" : false, + "downloadUrl" : "https://services.gradle.org/distributions/gradle-6.6-milestone-1-bin.zip", + "checksumUrl" : "https://services.gradle.org/distributions/gradle-6.6-milestone-1-bin.zip.sha256", + "wrapperChecksumUrl" : "https://services.gradle.org/distributions/gradle-6.6-milestone-1-wrapper.jar.sha256" +}, { + "version" : "6.5", + "buildTime" : "20200602204621+0000", + "current" : false, + "snapshot" : false, + "nightly" : false, + "releaseNightly" : false, + "activeRc" : false, + "rcFor" : "", + "milestoneFor" : "", + "broken" : false, + "downloadUrl" : "https://services.gradle.org/distributions/gradle-6.5-bin.zip", + "checksumUrl" : "https://services.gradle.org/distributions/gradle-6.5-bin.zip.sha256", + "wrapperChecksumUrl" : "https://services.gradle.org/distributions/gradle-6.5-wrapper.jar.sha256" +}, { + "version" : "6.5-rc-1", + "buildTime" : "20200526200448+0000", + "current" : false, + "snapshot" : false, + "nightly" : false, + "releaseNightly" : false, + "activeRc" : false, + "rcFor" : "6.5", + "milestoneFor" : "", + "broken" : false, + "downloadUrl" : "https://services.gradle.org/distributions/gradle-6.5-rc-1-bin.zip", + "checksumUrl" : "https://services.gradle.org/distributions/gradle-6.5-rc-1-bin.zip.sha256", + "wrapperChecksumUrl" : "https://services.gradle.org/distributions/gradle-6.5-rc-1-wrapper.jar.sha256" +}, { + "version" : "6.4.1", + "buildTime" : "20200515194340+0000", + "current" : false, + "snapshot" : false, + "nightly" : false, + "releaseNightly" : false, + "activeRc" : false, + "rcFor" : "", + "milestoneFor" : "", + "broken" : false, + "downloadUrl" : "https://services.gradle.org/distributions/gradle-6.4.1-bin.zip", + "checksumUrl" : "https://services.gradle.org/distributions/gradle-6.4.1-bin.zip.sha256", + "wrapperChecksumUrl" : "https://services.gradle.org/distributions/gradle-6.4.1-wrapper.jar.sha256" +}, { + "version" : "6.5-milestone-2", + "buildTime" : "20200515094006+0000", + "current" : false, + "snapshot" : false, + "nightly" : false, + "releaseNightly" : false, + "activeRc" : false, + "rcFor" : "", + "milestoneFor" : "6.5", + "broken" : false, + "downloadUrl" : "https://services.gradle.org/distributions/gradle-6.5-milestone-2-bin.zip", + "checksumUrl" : "https://services.gradle.org/distributions/gradle-6.5-milestone-2-bin.zip.sha256", + "wrapperChecksumUrl" : "https://services.gradle.org/distributions/gradle-6.5-milestone-2-wrapper.jar.sha256" +}, { + "version" : "6.5-milestone-1", + "buildTime" : "20200507135506+0000", + "current" : false, + "snapshot" : false, + "nightly" : false, + "releaseNightly" : false, + "activeRc" : false, + "rcFor" : "", + "milestoneFor" : "6.5", + "broken" : false, + "downloadUrl" : "https://services.gradle.org/distributions/gradle-6.5-milestone-1-bin.zip", + "checksumUrl" : "https://services.gradle.org/distributions/gradle-6.5-milestone-1-bin.zip.sha256", + "wrapperChecksumUrl" : "https://services.gradle.org/distributions/gradle-6.5-milestone-1-wrapper.jar.sha256" +}, { + "version" : "6.4", + "buildTime" : "20200505191855+0000", + "current" : false, + "snapshot" : false, + "nightly" : false, + "releaseNightly" : false, + "activeRc" : false, + "rcFor" : "", + "milestoneFor" : "", + "broken" : false, + "downloadUrl" : "https://services.gradle.org/distributions/gradle-6.4-bin.zip", + "checksumUrl" : "https://services.gradle.org/distributions/gradle-6.4-bin.zip.sha256", + "wrapperChecksumUrl" : "https://services.gradle.org/distributions/gradle-6.4-wrapper.jar.sha256" +}, { + "version" : "6.4-rc-4", + "buildTime" : "20200430212330+0000", + "current" : false, + "snapshot" : false, + "nightly" : false, + "releaseNightly" : false, + "activeRc" : false, + "rcFor" : "6.4", + "milestoneFor" : "", + "broken" : false, + "downloadUrl" : "https://services.gradle.org/distributions/gradle-6.4-rc-4-bin.zip", + "checksumUrl" : "https://services.gradle.org/distributions/gradle-6.4-rc-4-bin.zip.sha256", + "wrapperChecksumUrl" : "https://services.gradle.org/distributions/gradle-6.4-rc-4-wrapper.jar.sha256" +}, { + "version" : "6.4-rc-3", + "buildTime" : "20200428190039+0000", + "current" : false, + "snapshot" : false, + "nightly" : false, + "releaseNightly" : false, + "activeRc" : false, + "rcFor" : "6.4", + "milestoneFor" : "", + "broken" : false, + "downloadUrl" : "https://services.gradle.org/distributions/gradle-6.4-rc-3-bin.zip", + "checksumUrl" : "https://services.gradle.org/distributions/gradle-6.4-rc-3-bin.zip.sha256", + "wrapperChecksumUrl" : "https://services.gradle.org/distributions/gradle-6.4-rc-3-wrapper.jar.sha256" +}, { + "version" : "6.4-rc-2", + "buildTime" : "20200422163205+0000", + "current" : false, + "snapshot" : false, + "nightly" : false, + "releaseNightly" : false, + "activeRc" : false, + "rcFor" : "6.4", + "milestoneFor" : "", + "broken" : false, + "downloadUrl" : "https://services.gradle.org/distributions/gradle-6.4-rc-2-bin.zip", + "checksumUrl" : "https://services.gradle.org/distributions/gradle-6.4-rc-2-bin.zip.sha256", + "wrapperChecksumUrl" : "https://services.gradle.org/distributions/gradle-6.4-rc-2-wrapper.jar.sha256" +}, { + "version" : "6.4-rc-1", + "buildTime" : "20200415202839+0000", + "current" : false, + "snapshot" : false, + "nightly" : false, + "releaseNightly" : false, + "activeRc" : false, + "rcFor" : "6.4", + "milestoneFor" : "", + "broken" : false, + "downloadUrl" : "https://services.gradle.org/distributions/gradle-6.4-rc-1-bin.zip", + "checksumUrl" : "https://services.gradle.org/distributions/gradle-6.4-rc-1-bin.zip.sha256", + "wrapperChecksumUrl" : "https://services.gradle.org/distributions/gradle-6.4-rc-1-wrapper.jar.sha256" +}, { + "version" : "6.3", + "buildTime" : "20200324195207+0000", + "current" : false, + "snapshot" : false, + "nightly" : false, + "releaseNightly" : false, + "activeRc" : false, + "rcFor" : "", + "milestoneFor" : "", + "broken" : false, + "downloadUrl" : "https://services.gradle.org/distributions/gradle-6.3-bin.zip", + "checksumUrl" : "https://services.gradle.org/distributions/gradle-6.3-bin.zip.sha256", + "wrapperChecksumUrl" : "https://services.gradle.org/distributions/gradle-6.3-wrapper.jar.sha256" +}, { + "version" : "6.3-rc-4", + "buildTime" : "20200320053945+0000", + "current" : false, + "snapshot" : false, + "nightly" : false, + "releaseNightly" : false, + "activeRc" : false, + "rcFor" : "6.3", + "milestoneFor" : "", + "broken" : false, + "downloadUrl" : "https://services.gradle.org/distributions/gradle-6.3-rc-4-bin.zip", + "checksumUrl" : "https://services.gradle.org/distributions/gradle-6.3-rc-4-bin.zip.sha256", + "wrapperChecksumUrl" : "https://services.gradle.org/distributions/gradle-6.3-rc-4-wrapper.jar.sha256" +}, { + "version" : "6.3-rc-3", + "buildTime" : "20200318152649+0000", + "current" : false, + "snapshot" : false, + "nightly" : false, + "releaseNightly" : false, + "activeRc" : false, + "rcFor" : "6.3", + "milestoneFor" : "", + "broken" : false, + "downloadUrl" : "https://services.gradle.org/distributions/gradle-6.3-rc-3-bin.zip", + "checksumUrl" : "https://services.gradle.org/distributions/gradle-6.3-rc-3-bin.zip.sha256", + "wrapperChecksumUrl" : "https://services.gradle.org/distributions/gradle-6.3-rc-3-wrapper.jar.sha256" +}, { + "version" : "6.3-rc-2", + "buildTime" : "20200317124036+0000", + "current" : false, + "snapshot" : false, + "nightly" : false, + "releaseNightly" : false, + "activeRc" : false, + "rcFor" : "6.3", + "milestoneFor" : "", + "broken" : false, + "downloadUrl" : "https://services.gradle.org/distributions/gradle-6.3-rc-2-bin.zip", + "checksumUrl" : "https://services.gradle.org/distributions/gradle-6.3-rc-2-bin.zip.sha256", + "wrapperChecksumUrl" : "https://services.gradle.org/distributions/gradle-6.3-rc-2-wrapper.jar.sha256" +}, { + "version" : "6.3-rc-1", + "buildTime" : "20200311214114+0000", + "current" : false, + "snapshot" : false, + "nightly" : false, + "releaseNightly" : false, + "activeRc" : false, + "rcFor" : "6.3", + "milestoneFor" : "", + "broken" : false, + "downloadUrl" : "https://services.gradle.org/distributions/gradle-6.3-rc-1-bin.zip", + "checksumUrl" : "https://services.gradle.org/distributions/gradle-6.3-rc-1-bin.zip.sha256", + "wrapperChecksumUrl" : "https://services.gradle.org/distributions/gradle-6.3-rc-1-wrapper.jar.sha256" +}, { + "version" : "6.2.2", + "buildTime" : "20200304084931+0000", + "current" : false, + "snapshot" : false, + "nightly" : false, + "releaseNightly" : false, + "activeRc" : false, + "rcFor" : "", + "milestoneFor" : "", + "broken" : false, + "downloadUrl" : "https://services.gradle.org/distributions/gradle-6.2.2-bin.zip", + "checksumUrl" : "https://services.gradle.org/distributions/gradle-6.2.2-bin.zip.sha256", + "wrapperChecksumUrl" : "https://services.gradle.org/distributions/gradle-6.2.2-wrapper.jar.sha256" +}, { + "version" : "6.2.1", + "buildTime" : "20200224202410+0000", + "current" : false, + "snapshot" : false, + "nightly" : false, + "releaseNightly" : false, + "activeRc" : false, + "rcFor" : "", + "milestoneFor" : "", + "broken" : false, + "downloadUrl" : "https://services.gradle.org/distributions/gradle-6.2.1-bin.zip", + "checksumUrl" : "https://services.gradle.org/distributions/gradle-6.2.1-bin.zip.sha256", + "wrapperChecksumUrl" : "https://services.gradle.org/distributions/gradle-6.2.1-wrapper.jar.sha256" +}, { + "version" : "6.2", + "buildTime" : "20200217083201+0000", + "current" : false, + "snapshot" : false, + "nightly" : false, + "releaseNightly" : false, + "activeRc" : false, + "rcFor" : "", + "milestoneFor" : "", + "broken" : false, + "downloadUrl" : "https://services.gradle.org/distributions/gradle-6.2-bin.zip", + "checksumUrl" : "https://services.gradle.org/distributions/gradle-6.2-bin.zip.sha256", + "wrapperChecksumUrl" : "https://services.gradle.org/distributions/gradle-6.2-wrapper.jar.sha256" +}, { + "version" : "6.2-rc-3", + "buildTime" : "20200213012914+0000", + "current" : false, + "snapshot" : false, + "nightly" : false, + "releaseNightly" : false, + "activeRc" : false, + "rcFor" : "6.2", + "milestoneFor" : "", + "broken" : false, + "downloadUrl" : "https://services.gradle.org/distributions/gradle-6.2-rc-3-bin.zip", + "checksumUrl" : "https://services.gradle.org/distributions/gradle-6.2-rc-3-bin.zip.sha256", + "wrapperChecksumUrl" : "https://services.gradle.org/distributions/gradle-6.2-rc-3-wrapper.jar.sha256" +}, { + "version" : "6.2-rc-2", + "buildTime" : "20200211221400+0000", + "current" : false, + "snapshot" : false, + "nightly" : false, + "releaseNightly" : false, + "activeRc" : false, + "rcFor" : "6.2", + "milestoneFor" : "", + "broken" : false, + "downloadUrl" : "https://services.gradle.org/distributions/gradle-6.2-rc-2-bin.zip", + "checksumUrl" : "https://services.gradle.org/distributions/gradle-6.2-rc-2-bin.zip.sha256", + "wrapperChecksumUrl" : "https://services.gradle.org/distributions/gradle-6.2-rc-2-wrapper.jar.sha256" +}, { + "version" : "6.2-rc-1", + "buildTime" : "20200203123003+0000", + "current" : false, + "snapshot" : false, + "nightly" : false, + "releaseNightly" : false, + "activeRc" : false, + "rcFor" : "6.2", + "milestoneFor" : "", + "broken" : false, + "downloadUrl" : "https://services.gradle.org/distributions/gradle-6.2-rc-1-bin.zip", + "checksumUrl" : "https://services.gradle.org/distributions/gradle-6.2-rc-1-bin.zip.sha256", + "wrapperChecksumUrl" : "https://services.gradle.org/distributions/gradle-6.2-rc-1-wrapper.jar.sha256" +}, { + "version" : "6.1.1", + "buildTime" : "20200124223024+0000", + "current" : false, + "snapshot" : false, + "nightly" : false, + "releaseNightly" : false, + "activeRc" : false, + "rcFor" : "", + "milestoneFor" : "", + "broken" : false, + "downloadUrl" : "https://services.gradle.org/distributions/gradle-6.1.1-bin.zip", + "checksumUrl" : "https://services.gradle.org/distributions/gradle-6.1.1-bin.zip.sha256", + "wrapperChecksumUrl" : "https://services.gradle.org/distributions/gradle-6.1.1-wrapper.jar.sha256" +}, { + "version" : "6.1", + "buildTime" : "20200115235646+0000", + "current" : false, + "snapshot" : false, + "nightly" : false, + "releaseNightly" : false, + "activeRc" : false, + "rcFor" : "", + "milestoneFor" : "", + "broken" : false, + "downloadUrl" : "https://services.gradle.org/distributions/gradle-6.1-bin.zip", + "checksumUrl" : "https://services.gradle.org/distributions/gradle-6.1-bin.zip.sha256", + "wrapperChecksumUrl" : "https://services.gradle.org/distributions/gradle-6.1-wrapper.jar.sha256" +}, { + "version" : "6.1-rc-3", + "buildTime" : "20200113162324+0000", + "current" : false, + "snapshot" : false, + "nightly" : false, + "releaseNightly" : false, + "activeRc" : false, + "rcFor" : "6.1", + "milestoneFor" : "", + "broken" : false, + "downloadUrl" : "https://services.gradle.org/distributions/gradle-6.1-rc-3-bin.zip", + "checksumUrl" : "https://services.gradle.org/distributions/gradle-6.1-rc-3-bin.zip.sha256", + "wrapperChecksumUrl" : "https://services.gradle.org/distributions/gradle-6.1-rc-3-wrapper.jar.sha256" +}, { + "version" : "6.1-rc-2", + "buildTime" : "20200107211705+0000", + "current" : false, + "snapshot" : false, + "nightly" : false, + "releaseNightly" : false, + "activeRc" : false, + "rcFor" : "6.1", + "milestoneFor" : "", + "broken" : false, + "downloadUrl" : "https://services.gradle.org/distributions/gradle-6.1-rc-2-bin.zip", + "checksumUrl" : "https://services.gradle.org/distributions/gradle-6.1-rc-2-bin.zip.sha256", + "wrapperChecksumUrl" : "https://services.gradle.org/distributions/gradle-6.1-rc-2-wrapper.jar.sha256" +}, { + "version" : "6.1-rc-1", + "buildTime" : "20191219215643+0000", + "current" : false, + "snapshot" : false, + "nightly" : false, + "releaseNightly" : false, + "activeRc" : false, + "rcFor" : "6.1", + "milestoneFor" : "", + "broken" : false, + "downloadUrl" : "https://services.gradle.org/distributions/gradle-6.1-rc-1-bin.zip", + "checksumUrl" : "https://services.gradle.org/distributions/gradle-6.1-rc-1-bin.zip.sha256", + "wrapperChecksumUrl" : "https://services.gradle.org/distributions/gradle-6.1-rc-1-wrapper.jar.sha256" +}, { + "version" : "6.1-milestone-3", + "buildTime" : "20191203141333+0000", + "current" : false, + "snapshot" : false, + "nightly" : false, + "releaseNightly" : false, + "activeRc" : false, + "rcFor" : "", + "milestoneFor" : "6.1", + "broken" : false, + "downloadUrl" : "https://services.gradle.org/distributions/gradle-6.1-milestone-3-bin.zip", + "checksumUrl" : "https://services.gradle.org/distributions/gradle-6.1-milestone-3-bin.zip.sha256", + "wrapperChecksumUrl" : "https://services.gradle.org/distributions/gradle-6.1-milestone-3-wrapper.jar.sha256" +}, { + "version" : "6.1-milestone-2", + "buildTime" : "20191128101755+0000", + "current" : false, + "snapshot" : false, + "nightly" : false, + "releaseNightly" : false, + "activeRc" : false, + "rcFor" : "", + "milestoneFor" : "6.1", + "broken" : false, + "downloadUrl" : "https://services.gradle.org/distributions/gradle-6.1-milestone-2-bin.zip", + "checksumUrl" : "https://services.gradle.org/distributions/gradle-6.1-milestone-2-bin.zip.sha256", + "wrapperChecksumUrl" : "https://services.gradle.org/distributions/gradle-6.1-milestone-2-wrapper.jar.sha256" +}, { + "version" : "6.1-milestone-1", + "buildTime" : "20191120132405+0000", + "current" : false, + "snapshot" : false, + "nightly" : false, + "releaseNightly" : false, + "activeRc" : false, + "rcFor" : "", + "milestoneFor" : "6.1", + "broken" : false, + "downloadUrl" : "https://services.gradle.org/distributions/gradle-6.1-milestone-1-bin.zip", + "checksumUrl" : "https://services.gradle.org/distributions/gradle-6.1-milestone-1-bin.zip.sha256", + "wrapperChecksumUrl" : "https://services.gradle.org/distributions/gradle-6.1-milestone-1-wrapper.jar.sha256" +}, { + "version" : "6.0.1", + "buildTime" : "20191118202501+0000", + "current" : false, + "snapshot" : false, + "nightly" : false, + "releaseNightly" : false, + "activeRc" : false, + "rcFor" : "", + "milestoneFor" : "", + "broken" : false, + "downloadUrl" : "https://services.gradle.org/distributions/gradle-6.0.1-bin.zip", + "checksumUrl" : "https://services.gradle.org/distributions/gradle-6.0.1-bin.zip.sha256", + "wrapperChecksumUrl" : "https://services.gradle.org/distributions/gradle-6.0.1-wrapper.jar.sha256" +}, { + "version" : "6.0", + "buildTime" : "20191108181212+0000", + "current" : false, + "snapshot" : false, + "nightly" : false, + "releaseNightly" : false, + "activeRc" : false, + "rcFor" : "", + "milestoneFor" : "", + "broken" : false, + "downloadUrl" : "https://services.gradle.org/distributions/gradle-6.0-bin.zip", + "checksumUrl" : "https://services.gradle.org/distributions/gradle-6.0-bin.zip.sha256", + "wrapperChecksumUrl" : "https://services.gradle.org/distributions/gradle-6.0-wrapper.jar.sha256" +}, { + "version" : "6.0-rc-3", + "buildTime" : "20191105175639+0000", + "current" : false, + "snapshot" : false, + "nightly" : false, + "releaseNightly" : false, + "activeRc" : false, + "rcFor" : "6.0", + "milestoneFor" : "", + "broken" : false, + "downloadUrl" : "https://services.gradle.org/distributions/gradle-6.0-rc-3-bin.zip", + "checksumUrl" : "https://services.gradle.org/distributions/gradle-6.0-rc-3-bin.zip.sha256", + "wrapperChecksumUrl" : "https://services.gradle.org/distributions/gradle-6.0-rc-3-wrapper.jar.sha256" +}, { + "version" : "5.6.4", + "buildTime" : "20191101204200+0000", + "current" : false, + "snapshot" : false, + "nightly" : false, + "releaseNightly" : false, + "activeRc" : false, + "rcFor" : "", + "milestoneFor" : "", + "broken" : false, + "downloadUrl" : "https://services.gradle.org/distributions/gradle-5.6.4-bin.zip", + "checksumUrl" : "https://services.gradle.org/distributions/gradle-5.6.4-bin.zip.sha256", + "wrapperChecksumUrl" : "https://services.gradle.org/distributions/gradle-5.6.4-wrapper.jar.sha256" +}, { + "version" : "6.0-rc-2", + "buildTime" : "20191030160321+0000", + "current" : false, + "snapshot" : false, + "nightly" : false, + "releaseNightly" : false, + "activeRc" : false, + "rcFor" : "6.0", + "milestoneFor" : "", + "broken" : false, + "downloadUrl" : "https://services.gradle.org/distributions/gradle-6.0-rc-2-bin.zip", + "checksumUrl" : "https://services.gradle.org/distributions/gradle-6.0-rc-2-bin.zip.sha256", + "wrapperChecksumUrl" : "https://services.gradle.org/distributions/gradle-6.0-rc-2-wrapper.jar.sha256" +}, { + "version" : "6.0-rc-1", + "buildTime" : "20191018192416+0000", + "current" : false, + "snapshot" : false, + "nightly" : false, + "releaseNightly" : false, + "activeRc" : false, + "rcFor" : "6.0", + "milestoneFor" : "", + "broken" : false, + "downloadUrl" : "https://services.gradle.org/distributions/gradle-6.0-rc-1-bin.zip", + "checksumUrl" : "https://services.gradle.org/distributions/gradle-6.0-rc-1-bin.zip.sha256", + "wrapperChecksumUrl" : "https://services.gradle.org/distributions/gradle-6.0-rc-1-wrapper.jar.sha256" +}, { + "version" : "5.6.3", + "buildTime" : "20191018002836+0000", + "current" : false, + "snapshot" : false, + "nightly" : false, + "releaseNightly" : false, + "activeRc" : false, + "rcFor" : "", + "milestoneFor" : "", + "broken" : false, + "downloadUrl" : "https://services.gradle.org/distributions/gradle-5.6.3-bin.zip", + "checksumUrl" : "https://services.gradle.org/distributions/gradle-5.6.3-bin.zip.sha256", + "wrapperChecksumUrl" : "https://services.gradle.org/distributions/gradle-5.6.3-wrapper.jar.sha256" +}, { + "version" : "5.6.2", + "buildTime" : "20190905161354+0000", + "current" : false, + "snapshot" : false, + "nightly" : false, + "releaseNightly" : false, + "activeRc" : false, + "rcFor" : "", + "milestoneFor" : "", + "broken" : false, + "downloadUrl" : "https://services.gradle.org/distributions/gradle-5.6.2-bin.zip", + "checksumUrl" : "https://services.gradle.org/distributions/gradle-5.6.2-bin.zip.sha256", + "wrapperChecksumUrl" : "https://services.gradle.org/distributions/gradle-5.6.2-wrapper.jar.sha256" +}, { + "version" : "5.6.1", + "buildTime" : "20190828024934+0000", + "current" : false, + "snapshot" : false, + "nightly" : false, + "releaseNightly" : false, + "activeRc" : false, + "rcFor" : "", + "milestoneFor" : "", + "broken" : false, + "downloadUrl" : "https://services.gradle.org/distributions/gradle-5.6.1-bin.zip", + "checksumUrl" : "https://services.gradle.org/distributions/gradle-5.6.1-bin.zip.sha256", + "wrapperChecksumUrl" : "https://services.gradle.org/distributions/gradle-5.6.1-wrapper.jar.sha256" +}, { + "version" : "5.6", + "buildTime" : "20190814210525+0000", + "current" : false, + "snapshot" : false, + "nightly" : false, + "releaseNightly" : false, + "activeRc" : false, + "rcFor" : "", + "milestoneFor" : "", + "broken" : false, + "downloadUrl" : "https://services.gradle.org/distributions/gradle-5.6-bin.zip", + "checksumUrl" : "https://services.gradle.org/distributions/gradle-5.6-bin.zip.sha256", + "wrapperChecksumUrl" : "https://services.gradle.org/distributions/gradle-5.6-wrapper.jar.sha256" +}, { + "version" : "5.6-rc-2", + "buildTime" : "20190807150342+0000", + "current" : false, + "snapshot" : false, + "nightly" : false, + "releaseNightly" : false, + "activeRc" : false, + "rcFor" : "5.6", + "milestoneFor" : "", + "broken" : false, + "downloadUrl" : "https://services.gradle.org/distributions/gradle-5.6-rc-2-bin.zip", + "checksumUrl" : "https://services.gradle.org/distributions/gradle-5.6-rc-2-bin.zip.sha256", + "wrapperChecksumUrl" : "https://services.gradle.org/distributions/gradle-5.6-rc-2-wrapper.jar.sha256" +}, { + "version" : "5.6-rc-1", + "buildTime" : "20190729112626+0000", + "current" : false, + "snapshot" : false, + "nightly" : false, + "releaseNightly" : false, + "activeRc" : false, + "rcFor" : "5.6", + "milestoneFor" : "", + "broken" : false, + "downloadUrl" : "https://services.gradle.org/distributions/gradle-5.6-rc-1-bin.zip", + "checksumUrl" : "https://services.gradle.org/distributions/gradle-5.6-rc-1-bin.zip.sha256", + "wrapperChecksumUrl" : "https://services.gradle.org/distributions/gradle-5.6-rc-1-wrapper.jar.sha256" +}, { + "version" : "5.5.1", + "buildTime" : "20190710203812+0000", + "current" : false, + "snapshot" : false, + "nightly" : false, + "releaseNightly" : false, + "activeRc" : false, + "rcFor" : "", + "milestoneFor" : "", + "broken" : false, + "downloadUrl" : "https://services.gradle.org/distributions/gradle-5.5.1-bin.zip", + "checksumUrl" : "https://services.gradle.org/distributions/gradle-5.5.1-bin.zip.sha256", + "wrapperChecksumUrl" : "https://services.gradle.org/distributions/gradle-5.5.1-wrapper.jar.sha256" +}, { + "version" : "5.5", + "buildTime" : "20190628173605+0000", + "current" : false, + "snapshot" : false, + "nightly" : false, + "releaseNightly" : false, + "activeRc" : false, + "rcFor" : "", + "milestoneFor" : "", + "broken" : false, + "downloadUrl" : "https://services.gradle.org/distributions/gradle-5.5-bin.zip", + "checksumUrl" : "https://services.gradle.org/distributions/gradle-5.5-bin.zip.sha256", + "wrapperChecksumUrl" : "https://services.gradle.org/distributions/gradle-5.5-wrapper.jar.sha256" +}, { + "version" : "5.5-rc-4", + "buildTime" : "20190624152432+0000", + "current" : false, + "snapshot" : false, + "nightly" : false, + "releaseNightly" : false, + "activeRc" : false, + "rcFor" : "5.5", + "milestoneFor" : "", + "broken" : false, + "downloadUrl" : "https://services.gradle.org/distributions/gradle-5.5-rc-4-bin.zip", + "checksumUrl" : "https://services.gradle.org/distributions/gradle-5.5-rc-4-bin.zip.sha256", + "wrapperChecksumUrl" : "https://services.gradle.org/distributions/gradle-5.5-rc-4-wrapper.jar.sha256" +}, { + "version" : "5.5-rc-3", + "buildTime" : "20190614231538+0000", + "current" : false, + "snapshot" : false, + "nightly" : false, + "releaseNightly" : false, + "activeRc" : false, + "rcFor" : "5.5", + "milestoneFor" : "", + "broken" : false, + "downloadUrl" : "https://services.gradle.org/distributions/gradle-5.5-rc-3-bin.zip", + "checksumUrl" : "https://services.gradle.org/distributions/gradle-5.5-rc-3-bin.zip.sha256", + "wrapperChecksumUrl" : "https://services.gradle.org/distributions/gradle-5.5-rc-3-wrapper.jar.sha256" +}, { + "version" : "5.5-rc-2", + "buildTime" : "20190607090657+0000", + "current" : false, + "snapshot" : false, + "nightly" : false, + "releaseNightly" : false, + "activeRc" : false, + "rcFor" : "5.5", + "milestoneFor" : "", + "broken" : false, + "downloadUrl" : "https://services.gradle.org/distributions/gradle-5.5-rc-2-bin.zip", + "checksumUrl" : "https://services.gradle.org/distributions/gradle-5.5-rc-2-bin.zip.sha256", + "wrapperChecksumUrl" : "https://services.gradle.org/distributions/gradle-5.5-rc-2-wrapper.jar.sha256" +}, { + "version" : "5.5-rc-1", + "buildTime" : "20190529115119+0000", + "current" : false, + "snapshot" : false, + "nightly" : false, + "releaseNightly" : false, + "activeRc" : false, + "rcFor" : "5.5", + "milestoneFor" : "", + "broken" : false, + "downloadUrl" : "https://services.gradle.org/distributions/gradle-5.5-rc-1-bin.zip", + "checksumUrl" : "https://services.gradle.org/distributions/gradle-5.5-rc-1-bin.zip.sha256", + "wrapperChecksumUrl" : "https://services.gradle.org/distributions/gradle-5.5-rc-1-wrapper.jar.sha256" +}, { + "version" : "5.4.1", + "buildTime" : "20190426081442+0000", + "current" : false, + "snapshot" : false, + "nightly" : false, + "releaseNightly" : false, + "activeRc" : false, + "rcFor" : "", + "milestoneFor" : "", + "broken" : false, + "downloadUrl" : "https://services.gradle.org/distributions/gradle-5.4.1-bin.zip", + "checksumUrl" : "https://services.gradle.org/distributions/gradle-5.4.1-bin.zip.sha256", + "wrapperChecksumUrl" : "https://services.gradle.org/distributions/gradle-5.4.1-wrapper.jar.sha256" +}, { + "version" : "5.4", + "buildTime" : "20190416024416+0000", + "current" : false, + "snapshot" : false, + "nightly" : false, + "releaseNightly" : false, + "activeRc" : false, + "rcFor" : "", + "milestoneFor" : "", + "broken" : false, + "downloadUrl" : "https://services.gradle.org/distributions/gradle-5.4-bin.zip", + "checksumUrl" : "https://services.gradle.org/distributions/gradle-5.4-bin.zip.sha256", + "wrapperChecksumUrl" : "https://services.gradle.org/distributions/gradle-5.4-wrapper.jar.sha256" +}, { + "version" : "5.4-rc-1", + "buildTime" : "20190410011532+0000", + "current" : false, + "snapshot" : false, + "nightly" : false, + "releaseNightly" : false, + "activeRc" : false, + "rcFor" : "5.4", + "milestoneFor" : "", + "broken" : false, + "downloadUrl" : "https://services.gradle.org/distributions/gradle-5.4-rc-1-bin.zip", + "checksumUrl" : "https://services.gradle.org/distributions/gradle-5.4-rc-1-bin.zip.sha256", + "wrapperChecksumUrl" : "https://services.gradle.org/distributions/gradle-5.4-rc-1-wrapper.jar.sha256" +}, { + "version" : "5.3.1", + "buildTime" : "20190328090923+0000", + "current" : false, + "snapshot" : false, + "nightly" : false, + "releaseNightly" : false, + "activeRc" : false, + "rcFor" : "", + "milestoneFor" : "", + "broken" : false, + "downloadUrl" : "https://services.gradle.org/distributions/gradle-5.3.1-bin.zip", + "checksumUrl" : "https://services.gradle.org/distributions/gradle-5.3.1-bin.zip.sha256", + "wrapperChecksumUrl" : "https://services.gradle.org/distributions/gradle-5.3.1-wrapper.jar.sha256" +}, { + "version" : "5.3", + "buildTime" : "20190320110329+0000", + "current" : false, + "snapshot" : false, + "nightly" : false, + "releaseNightly" : false, + "activeRc" : false, + "rcFor" : "", + "milestoneFor" : "", + "broken" : false, + "downloadUrl" : "https://services.gradle.org/distributions/gradle-5.3-bin.zip", + "checksumUrl" : "https://services.gradle.org/distributions/gradle-5.3-bin.zip.sha256", + "wrapperChecksumUrl" : "https://services.gradle.org/distributions/gradle-5.3-wrapper.jar.sha256" +}, { + "version" : "5.3-rc-3", + "buildTime" : "20190313202708+0000", + "current" : false, + "snapshot" : false, + "nightly" : false, + "releaseNightly" : false, + "activeRc" : false, + "rcFor" : "5.3", + "milestoneFor" : "", + "broken" : false, + "downloadUrl" : "https://services.gradle.org/distributions/gradle-5.3-rc-3-bin.zip", + "checksumUrl" : "https://services.gradle.org/distributions/gradle-5.3-rc-3-bin.zip.sha256", + "wrapperChecksumUrl" : "https://services.gradle.org/distributions/gradle-5.3-rc-3-wrapper.jar.sha256" +}, { + "version" : "5.3-rc-2", + "buildTime" : "20190311210726+0000", + "current" : false, + "snapshot" : false, + "nightly" : false, + "releaseNightly" : false, + "activeRc" : false, + "rcFor" : "5.3", + "milestoneFor" : "", + "broken" : false, + "downloadUrl" : "https://services.gradle.org/distributions/gradle-5.3-rc-2-bin.zip", + "checksumUrl" : "https://services.gradle.org/distributions/gradle-5.3-rc-2-bin.zip.sha256", + "wrapperChecksumUrl" : "https://services.gradle.org/distributions/gradle-5.3-rc-2-wrapper.jar.sha256" +}, { + "version" : "5.3-rc-1", + "buildTime" : "20190305205202+0000", + "current" : false, + "snapshot" : false, + "nightly" : false, + "releaseNightly" : false, + "activeRc" : false, + "rcFor" : "5.3", + "milestoneFor" : "", + "broken" : false, + "downloadUrl" : "https://services.gradle.org/distributions/gradle-5.3-rc-1-bin.zip", + "checksumUrl" : "https://services.gradle.org/distributions/gradle-5.3-rc-1-bin.zip.sha256", + "wrapperChecksumUrl" : "https://services.gradle.org/distributions/gradle-5.3-rc-1-wrapper.jar.sha256" +}, { + "version" : "5.2.1", + "buildTime" : "20190208190010+0000", + "current" : false, + "snapshot" : false, + "nightly" : false, + "releaseNightly" : false, + "activeRc" : false, + "rcFor" : "", + "milestoneFor" : "", + "broken" : false, + "downloadUrl" : "https://services.gradle.org/distributions/gradle-5.2.1-bin.zip", + "checksumUrl" : "https://services.gradle.org/distributions/gradle-5.2.1-bin.zip.sha256", + "wrapperChecksumUrl" : "https://services.gradle.org/distributions/gradle-5.2.1-wrapper.jar.sha256" +}, { + "version" : "5.2", + "buildTime" : "20190204111648+0000", + "current" : false, + "snapshot" : false, + "nightly" : false, + "releaseNightly" : false, + "activeRc" : false, + "rcFor" : "", + "milestoneFor" : "", + "broken" : false, + "downloadUrl" : "https://services.gradle.org/distributions/gradle-5.2-bin.zip", + "checksumUrl" : "https://services.gradle.org/distributions/gradle-5.2-bin.zip.sha256", + "wrapperChecksumUrl" : "https://services.gradle.org/distributions/gradle-5.2-wrapper.jar.sha256" +}, { + "version" : "5.2-rc-1", + "buildTime" : "20190128225604+0000", + "current" : false, + "snapshot" : false, + "nightly" : false, + "releaseNightly" : false, + "activeRc" : false, + "rcFor" : "5.2", + "milestoneFor" : "", + "broken" : false, + "downloadUrl" : "https://services.gradle.org/distributions/gradle-5.2-rc-1-bin.zip", + "checksumUrl" : "https://services.gradle.org/distributions/gradle-5.2-rc-1-bin.zip.sha256", + "wrapperChecksumUrl" : "https://services.gradle.org/distributions/gradle-5.2-rc-1-wrapper.jar.sha256" +}, { + "version" : "5.1.1", + "buildTime" : "20190110230502+0000", + "current" : false, + "snapshot" : false, + "nightly" : false, + "releaseNightly" : false, + "activeRc" : false, + "rcFor" : "", + "milestoneFor" : "", + "broken" : false, + "downloadUrl" : "https://services.gradle.org/distributions/gradle-5.1.1-bin.zip", + "checksumUrl" : "https://services.gradle.org/distributions/gradle-5.1.1-bin.zip.sha256", + "wrapperChecksumUrl" : "https://services.gradle.org/distributions/gradle-5.1.1-wrapper.jar.sha256" +}, { + "version" : "5.1", + "buildTime" : "20190102185747+0000", + "current" : false, + "snapshot" : false, + "nightly" : false, + "releaseNightly" : false, + "activeRc" : false, + "rcFor" : "", + "milestoneFor" : "", + "broken" : false, + "downloadUrl" : "https://services.gradle.org/distributions/gradle-5.1-bin.zip", + "checksumUrl" : "https://services.gradle.org/distributions/gradle-5.1-bin.zip.sha256", + "wrapperChecksumUrl" : "https://services.gradle.org/distributions/gradle-5.1-wrapper.jar.sha256" +}, { + "version" : "5.1-rc-3", + "buildTime" : "20181221230345+0000", + "current" : false, + "snapshot" : false, + "nightly" : false, + "releaseNightly" : false, + "activeRc" : false, + "rcFor" : "5.1", + "milestoneFor" : "", + "broken" : false, + "downloadUrl" : "https://services.gradle.org/distributions/gradle-5.1-rc-3-bin.zip", + "checksumUrl" : "https://services.gradle.org/distributions/gradle-5.1-rc-3-bin.zip.sha256", + "wrapperChecksumUrl" : "https://services.gradle.org/distributions/gradle-5.1-rc-3-wrapper.jar.sha256" +}, { + "version" : "5.1-rc-2", + "buildTime" : "20181217224201+0000", + "current" : false, + "snapshot" : false, + "nightly" : false, + "releaseNightly" : false, + "activeRc" : false, + "rcFor" : "5.1", + "milestoneFor" : "", + "broken" : false, + "downloadUrl" : "https://services.gradle.org/distributions/gradle-5.1-rc-2-bin.zip", + "checksumUrl" : "https://services.gradle.org/distributions/gradle-5.1-rc-2-bin.zip.sha256", + "wrapperChecksumUrl" : "https://services.gradle.org/distributions/gradle-5.1-rc-2-wrapper.jar.sha256" +}, { + "version" : "5.1-rc-1", + "buildTime" : "20181213060004+0000", + "current" : false, + "snapshot" : false, + "nightly" : false, + "releaseNightly" : false, + "activeRc" : false, + "rcFor" : "5.1", + "milestoneFor" : "", + "broken" : false, + "downloadUrl" : "https://services.gradle.org/distributions/gradle-5.1-rc-1-bin.zip", + "checksumUrl" : "https://services.gradle.org/distributions/gradle-5.1-rc-1-bin.zip.sha256", + "wrapperChecksumUrl" : "https://services.gradle.org/distributions/gradle-5.1-rc-1-wrapper.jar.sha256" +}, { + "version" : "4.10.3", + "buildTime" : "20181205005054+0000", + "current" : false, + "snapshot" : false, + "nightly" : false, + "releaseNightly" : false, + "activeRc" : false, + "rcFor" : "", + "milestoneFor" : "", + "broken" : false, + "downloadUrl" : "https://services.gradle.org/distributions/gradle-4.10.3-bin.zip", + "checksumUrl" : "https://services.gradle.org/distributions/gradle-4.10.3-bin.zip.sha256", + "wrapperChecksumUrl" : "https://services.gradle.org/distributions/gradle-4.10.3-wrapper.jar.sha256" +}, { + "version" : "5.1-milestone-1", + "buildTime" : "20181203174147+0000", + "current" : false, + "snapshot" : false, + "nightly" : false, + "releaseNightly" : false, + "activeRc" : false, + "rcFor" : "", + "milestoneFor" : "5.1", + "broken" : false, + "downloadUrl" : "https://services.gradle.org/distributions/gradle-5.1-milestone-1-bin.zip", + "checksumUrl" : "https://services.gradle.org/distributions/gradle-5.1-milestone-1-bin.zip.sha256", + "wrapperChecksumUrl" : "https://services.gradle.org/distributions/gradle-5.1-milestone-1-wrapper.jar.sha256" +}, { + "version" : "5.0", + "buildTime" : "20181126114843+0000", + "current" : false, + "snapshot" : false, + "nightly" : false, + "releaseNightly" : false, + "activeRc" : false, + "rcFor" : "", + "milestoneFor" : "", + "broken" : false, + "downloadUrl" : "https://services.gradle.org/distributions/gradle-5.0-bin.zip", + "checksumUrl" : "https://services.gradle.org/distributions/gradle-5.0-bin.zip.sha256", + "wrapperChecksumUrl" : "https://services.gradle.org/distributions/gradle-5.0-wrapper.jar.sha256" +}, { + "version" : "5.0-rc-5", + "buildTime" : "20181122195845+0000", + "current" : false, + "snapshot" : false, + "nightly" : false, + "releaseNightly" : false, + "activeRc" : false, + "rcFor" : "5.0", + "milestoneFor" : "", + "broken" : false, + "downloadUrl" : "https://services.gradle.org/distributions/gradle-5.0-rc-5-bin.zip", + "checksumUrl" : "https://services.gradle.org/distributions/gradle-5.0-rc-5-bin.zip.sha256" +}, { + "version" : "5.0-rc-4", + "buildTime" : "20181120092642+0000", + "current" : false, + "snapshot" : false, + "nightly" : false, + "releaseNightly" : false, + "activeRc" : false, + "rcFor" : "5.0", + "milestoneFor" : "", + "broken" : false, + "downloadUrl" : "https://services.gradle.org/distributions/gradle-5.0-rc-4-bin.zip", + "checksumUrl" : "https://services.gradle.org/distributions/gradle-5.0-rc-4-bin.zip.sha256" +}, { + "version" : "5.0-rc-3", + "buildTime" : "20181114160147+0000", + "current" : false, + "snapshot" : false, + "nightly" : false, + "releaseNightly" : false, + "activeRc" : false, + "rcFor" : "5.0", + "milestoneFor" : "", + "broken" : false, + "downloadUrl" : "https://services.gradle.org/distributions/gradle-5.0-rc-3-bin.zip", + "checksumUrl" : "https://services.gradle.org/distributions/gradle-5.0-rc-3-bin.zip.sha256" +}, { + "version" : "5.0-rc-2", + "buildTime" : "20181112080541+0000", + "current" : false, + "snapshot" : false, + "nightly" : false, + "releaseNightly" : false, + "activeRc" : false, + "rcFor" : "5.0", + "milestoneFor" : "", + "broken" : false, + "downloadUrl" : "https://services.gradle.org/distributions/gradle-5.0-rc-2-bin.zip", + "checksumUrl" : "https://services.gradle.org/distributions/gradle-5.0-rc-2-bin.zip.sha256" +}, { + "version" : "5.0-rc-1", + "buildTime" : "20181030135922+0000", + "current" : false, + "snapshot" : false, + "nightly" : false, + "releaseNightly" : false, + "activeRc" : false, + "rcFor" : "5.0", + "milestoneFor" : "", + "broken" : false, + "downloadUrl" : "https://services.gradle.org/distributions/gradle-5.0-rc-1-bin.zip", + "checksumUrl" : "https://services.gradle.org/distributions/gradle-5.0-rc-1-bin.zip.sha256" +}, { + "version" : "5.0-milestone-1", + "buildTime" : "20181002224615+0000", + "current" : false, + "snapshot" : false, + "nightly" : false, + "releaseNightly" : false, + "activeRc" : false, + "rcFor" : "", + "milestoneFor" : "5.0", + "broken" : false, + "downloadUrl" : "https://services.gradle.org/distributions/gradle-5.0-milestone-1-bin.zip", + "checksumUrl" : "https://services.gradle.org/distributions/gradle-5.0-milestone-1-bin.zip.sha256" +}, { + "version" : "4.10.2", + "buildTime" : "20180919181015+0000", + "current" : false, + "snapshot" : false, + "nightly" : false, + "releaseNightly" : false, + "activeRc" : false, + "rcFor" : "", + "milestoneFor" : "", + "broken" : false, + "downloadUrl" : "https://services.gradle.org/distributions/gradle-4.10.2-bin.zip", + "checksumUrl" : "https://services.gradle.org/distributions/gradle-4.10.2-bin.zip.sha256", + "wrapperChecksumUrl" : "https://services.gradle.org/distributions/gradle-4.10.2-wrapper.jar.sha256" +}, { + "version" : "4.10.1", + "buildTime" : "20180912113327+0000", + "current" : false, + "snapshot" : false, + "nightly" : false, + "releaseNightly" : false, + "activeRc" : false, + "rcFor" : "", + "milestoneFor" : "", + "broken" : false, + "downloadUrl" : "https://services.gradle.org/distributions/gradle-4.10.1-bin.zip", + "checksumUrl" : "https://services.gradle.org/distributions/gradle-4.10.1-bin.zip.sha256", + "wrapperChecksumUrl" : "https://services.gradle.org/distributions/gradle-4.10.1-wrapper.jar.sha256" +}, { + "version" : "4.10", + "buildTime" : "20180827183506+0000", + "current" : false, + "snapshot" : false, + "nightly" : false, + "releaseNightly" : false, + "activeRc" : false, + "rcFor" : "", + "milestoneFor" : "", + "broken" : false, + "downloadUrl" : "https://services.gradle.org/distributions/gradle-4.10-bin.zip", + "checksumUrl" : "https://services.gradle.org/distributions/gradle-4.10-bin.zip.sha256", + "wrapperChecksumUrl" : "https://services.gradle.org/distributions/gradle-4.10-wrapper.jar.sha256" +}, { + "version" : "4.10-rc-3", + "buildTime" : "20180823120756+0000", + "current" : false, + "snapshot" : false, + "nightly" : false, + "releaseNightly" : false, + "activeRc" : false, + "rcFor" : "4.10", + "milestoneFor" : "", + "broken" : false, + "downloadUrl" : "https://services.gradle.org/distributions/gradle-4.10-rc-3-bin.zip", + "checksumUrl" : "https://services.gradle.org/distributions/gradle-4.10-rc-3-bin.zip.sha256" +}, { + "version" : "4.10-rc-2", + "buildTime" : "20180814180001+0000", + "current" : false, + "snapshot" : false, + "nightly" : false, + "releaseNightly" : false, + "activeRc" : false, + "rcFor" : "4.10", + "milestoneFor" : "", + "broken" : false, + "downloadUrl" : "https://services.gradle.org/distributions/gradle-4.10-rc-2-bin.zip", + "checksumUrl" : "https://services.gradle.org/distributions/gradle-4.10-rc-2-bin.zip.sha256" +}, { + "version" : "4.10-rc-1", + "buildTime" : "20180809061937+0000", + "current" : false, + "snapshot" : false, + "nightly" : false, + "releaseNightly" : false, + "activeRc" : false, + "rcFor" : "4.10", + "milestoneFor" : "", + "broken" : false, + "downloadUrl" : "https://services.gradle.org/distributions/gradle-4.10-rc-1-bin.zip", + "checksumUrl" : "https://services.gradle.org/distributions/gradle-4.10-rc-1-bin.zip.sha256" +}, { + "version" : "4.9", + "buildTime" : "20180716081403+0000", + "current" : false, + "snapshot" : false, + "nightly" : false, + "releaseNightly" : false, + "activeRc" : false, + "rcFor" : "", + "milestoneFor" : "", + "broken" : false, + "downloadUrl" : "https://services.gradle.org/distributions/gradle-4.9-bin.zip", + "checksumUrl" : "https://services.gradle.org/distributions/gradle-4.9-bin.zip.sha256", + "wrapperChecksumUrl" : "https://services.gradle.org/distributions/gradle-4.9-wrapper.jar.sha256" +}, { + "version" : "4.9-rc-2", + "buildTime" : "20180711004640+0000", + "current" : false, + "snapshot" : false, + "nightly" : false, + "releaseNightly" : false, + "activeRc" : false, + "rcFor" : "4.9", + "milestoneFor" : "", + "broken" : false, + "downloadUrl" : "https://services.gradle.org/distributions/gradle-4.9-rc-2-bin.zip", + "checksumUrl" : "https://services.gradle.org/distributions/gradle-4.9-rc-2-bin.zip.sha256" +}, { + "version" : "4.9-rc-1", + "buildTime" : "20180703131446+0000", + "current" : false, + "snapshot" : false, + "nightly" : false, + "releaseNightly" : false, + "activeRc" : false, + "rcFor" : "4.9", + "milestoneFor" : "", + "broken" : false, + "downloadUrl" : "https://services.gradle.org/distributions/gradle-4.9-rc-1-bin.zip", + "checksumUrl" : "https://services.gradle.org/distributions/gradle-4.9-rc-1-bin.zip.sha256" +}, { + "version" : "4.8.1", + "buildTime" : "20180621075306+0000", + "current" : false, + "snapshot" : false, + "nightly" : false, + "releaseNightly" : false, + "activeRc" : false, + "rcFor" : "", + "milestoneFor" : "", + "broken" : false, + "downloadUrl" : "https://services.gradle.org/distributions/gradle-4.8.1-bin.zip", + "checksumUrl" : "https://services.gradle.org/distributions/gradle-4.8.1-bin.zip.sha256", + "wrapperChecksumUrl" : "https://services.gradle.org/distributions/gradle-4.8.1-wrapper.jar.sha256" +}, { + "version" : "4.8", + "buildTime" : "20180604103958+0000", + "current" : false, + "snapshot" : false, + "nightly" : false, + "releaseNightly" : false, + "activeRc" : false, + "rcFor" : "", + "milestoneFor" : "", + "broken" : false, + "downloadUrl" : "https://services.gradle.org/distributions/gradle-4.8-bin.zip", + "checksumUrl" : "https://services.gradle.org/distributions/gradle-4.8-bin.zip.sha256", + "wrapperChecksumUrl" : "https://services.gradle.org/distributions/gradle-4.8-wrapper.jar.sha256" +}, { + "version" : "4.8-rc-3", + "buildTime" : "20180531140436+0000", + "current" : false, + "snapshot" : false, + "nightly" : false, + "releaseNightly" : false, + "activeRc" : false, + "rcFor" : "4.8", + "milestoneFor" : "", + "broken" : false, + "downloadUrl" : "https://services.gradle.org/distributions/gradle-4.8-rc-3-bin.zip", + "checksumUrl" : "https://services.gradle.org/distributions/gradle-4.8-rc-3-bin.zip.sha256" +}, { + "version" : "4.8-rc-2", + "buildTime" : "20180524092821+0000", + "current" : false, + "snapshot" : false, + "nightly" : false, + "releaseNightly" : false, + "activeRc" : false, + "rcFor" : "4.8", + "milestoneFor" : "", + "broken" : false, + "downloadUrl" : "https://services.gradle.org/distributions/gradle-4.8-rc-2-bin.zip", + "checksumUrl" : "https://services.gradle.org/distributions/gradle-4.8-rc-2-bin.zip.sha256" +}, { + "version" : "4.8-rc-1", + "buildTime" : "20180515173233+0000", + "current" : false, + "snapshot" : false, + "nightly" : false, + "releaseNightly" : false, + "activeRc" : false, + "rcFor" : "4.8", + "milestoneFor" : "", + "broken" : false, + "downloadUrl" : "https://services.gradle.org/distributions/gradle-4.8-rc-1-bin.zip", + "checksumUrl" : "https://services.gradle.org/distributions/gradle-4.8-rc-1-bin.zip.sha256" +}, { + "version" : "4.7", + "buildTime" : "20180418090912+0000", + "current" : false, + "snapshot" : false, + "nightly" : false, + "releaseNightly" : false, + "activeRc" : false, + "rcFor" : "", + "milestoneFor" : "", + "broken" : false, + "downloadUrl" : "https://services.gradle.org/distributions/gradle-4.7-bin.zip", + "checksumUrl" : "https://services.gradle.org/distributions/gradle-4.7-bin.zip.sha256", + "wrapperChecksumUrl" : "https://services.gradle.org/distributions/gradle-4.7-wrapper.jar.sha256" +}, { + "version" : "4.7-rc-2", + "buildTime" : "20180413125323+0000", + "current" : false, + "snapshot" : false, + "nightly" : false, + "releaseNightly" : false, + "activeRc" : false, + "rcFor" : "4.7", + "milestoneFor" : "", + "broken" : false, + "downloadUrl" : "https://services.gradle.org/distributions/gradle-4.7-rc-2-bin.zip", + "checksumUrl" : "https://services.gradle.org/distributions/gradle-4.7-rc-2-bin.zip.sha256" +}, { + "version" : "4.7-rc-1", + "buildTime" : "20180403113602+0000", + "current" : false, + "snapshot" : false, + "nightly" : false, + "releaseNightly" : false, + "activeRc" : false, + "rcFor" : "4.7", + "milestoneFor" : "", + "broken" : false, + "downloadUrl" : "https://services.gradle.org/distributions/gradle-4.7-rc-1-bin.zip", + "checksumUrl" : "https://services.gradle.org/distributions/gradle-4.7-rc-1-bin.zip.sha256" +}, { + "version" : "4.6", + "buildTime" : "20180228133636+0000", + "current" : false, + "snapshot" : false, + "nightly" : false, + "releaseNightly" : false, + "activeRc" : false, + "rcFor" : "", + "milestoneFor" : "", + "broken" : false, + "downloadUrl" : "https://services.gradle.org/distributions/gradle-4.6-bin.zip", + "checksumUrl" : "https://services.gradle.org/distributions/gradle-4.6-bin.zip.sha256", + "wrapperChecksumUrl" : "https://services.gradle.org/distributions/gradle-4.6-wrapper.jar.sha256" +}, { + "version" : "4.6-rc-2", + "buildTime" : "20180221152842+0000", + "current" : false, + "snapshot" : false, + "nightly" : false, + "releaseNightly" : false, + "activeRc" : false, + "rcFor" : "4.6", + "milestoneFor" : "", + "broken" : false, + "downloadUrl" : "https://services.gradle.org/distributions/gradle-4.6-rc-2-bin.zip", + "checksumUrl" : "https://services.gradle.org/distributions/gradle-4.6-rc-2-bin.zip.sha256" +}, { + "version" : "4.6-rc-1", + "buildTime" : "20180216162807+0000", + "current" : false, + "snapshot" : false, + "nightly" : false, + "releaseNightly" : false, + "activeRc" : false, + "rcFor" : "4.6", + "milestoneFor" : "", + "broken" : false, + "downloadUrl" : "https://services.gradle.org/distributions/gradle-4.6-rc-1-bin.zip", + "checksumUrl" : "https://services.gradle.org/distributions/gradle-4.6-rc-1-bin.zip.sha256" +}, { + "version" : "4.5.1", + "buildTime" : "20180205132249+0000", + "current" : false, + "snapshot" : false, + "nightly" : false, + "releaseNightly" : false, + "activeRc" : false, + "rcFor" : "", + "milestoneFor" : "", + "broken" : false, + "downloadUrl" : "https://services.gradle.org/distributions/gradle-4.5.1-bin.zip", + "checksumUrl" : "https://services.gradle.org/distributions/gradle-4.5.1-bin.zip.sha256", + "wrapperChecksumUrl" : "https://services.gradle.org/distributions/gradle-4.5.1-wrapper.jar.sha256" +}, { + "version" : "4.5", + "buildTime" : "20180124170452+0000", + "current" : false, + "snapshot" : false, + "nightly" : false, + "releaseNightly" : false, + "activeRc" : false, + "rcFor" : "", + "milestoneFor" : "", + "broken" : false, + "downloadUrl" : "https://services.gradle.org/distributions/gradle-4.5-bin.zip", + "checksumUrl" : "https://services.gradle.org/distributions/gradle-4.5-bin.zip.sha256", + "wrapperChecksumUrl" : "https://services.gradle.org/distributions/gradle-4.5-wrapper.jar.sha256" +}, { + "version" : "4.5-rc-2", + "buildTime" : "20180122164244+0000", + "current" : false, + "snapshot" : false, + "nightly" : false, + "releaseNightly" : false, + "activeRc" : false, + "rcFor" : "4.5", + "milestoneFor" : "", + "broken" : false, + "downloadUrl" : "https://services.gradle.org/distributions/gradle-4.5-rc-2-bin.zip", + "checksumUrl" : "https://services.gradle.org/distributions/gradle-4.5-rc-2-bin.zip.sha256" +}, { + "version" : "4.5-rc-1", + "buildTime" : "20180109010527+0000", + "current" : false, + "snapshot" : false, + "nightly" : false, + "releaseNightly" : false, + "activeRc" : false, + "rcFor" : "4.5", + "milestoneFor" : "", + "broken" : false, + "downloadUrl" : "https://services.gradle.org/distributions/gradle-4.5-rc-1-bin.zip", + "checksumUrl" : "https://services.gradle.org/distributions/gradle-4.5-rc-1-bin.zip.sha256" +}, { + "version" : "4.4.1", + "buildTime" : "20171220154523+0000", + "current" : false, + "snapshot" : false, + "nightly" : false, + "releaseNightly" : false, + "activeRc" : false, + "rcFor" : "", + "milestoneFor" : "", + "broken" : false, + "downloadUrl" : "https://services.gradle.org/distributions/gradle-4.4.1-bin.zip", + "checksumUrl" : "https://services.gradle.org/distributions/gradle-4.4.1-bin.zip.sha256", + "wrapperChecksumUrl" : "https://services.gradle.org/distributions/gradle-4.4.1-wrapper.jar.sha256" +}, { + "version" : "4.4", + "buildTime" : "20171206090506+0000", + "current" : false, + "snapshot" : false, + "nightly" : false, + "releaseNightly" : false, + "activeRc" : false, + "rcFor" : "", + "milestoneFor" : "", + "broken" : false, + "downloadUrl" : "https://services.gradle.org/distributions/gradle-4.4-bin.zip", + "checksumUrl" : "https://services.gradle.org/distributions/gradle-4.4-bin.zip.sha256", + "wrapperChecksumUrl" : "https://services.gradle.org/distributions/gradle-4.4-wrapper.jar.sha256" +}, { + "version" : "4.4-rc-6", + "buildTime" : "20171204084815+0000", + "current" : false, + "snapshot" : false, + "nightly" : false, + "releaseNightly" : false, + "activeRc" : false, + "rcFor" : "4.4", + "milestoneFor" : "", + "broken" : false, + "downloadUrl" : "https://services.gradle.org/distributions/gradle-4.4-rc-6-bin.zip", + "checksumUrl" : "https://services.gradle.org/distributions/gradle-4.4-rc-6-bin.zip.sha256" +}, { + "version" : "4.4-rc-5", + "buildTime" : "20171130152137+0000", + "current" : false, + "snapshot" : false, + "nightly" : false, + "releaseNightly" : false, + "activeRc" : false, + "rcFor" : "4.4", + "milestoneFor" : "", + "broken" : false, + "downloadUrl" : "https://services.gradle.org/distributions/gradle-4.4-rc-5-bin.zip", + "checksumUrl" : "https://services.gradle.org/distributions/gradle-4.4-rc-5-bin.zip.sha256" +}, { + "version" : "4.4-rc-4", + "buildTime" : "20171128123659+0000", + "current" : false, + "snapshot" : false, + "nightly" : false, + "releaseNightly" : false, + "activeRc" : false, + "rcFor" : "4.4", + "milestoneFor" : "", + "broken" : false, + "downloadUrl" : "https://services.gradle.org/distributions/gradle-4.4-rc-4-bin.zip", + "checksumUrl" : "https://services.gradle.org/distributions/gradle-4.4-rc-4-bin.zip.sha256" +}, { + "version" : "4.4-rc-3", + "buildTime" : "20171127103138+0000", + "current" : false, + "snapshot" : false, + "nightly" : false, + "releaseNightly" : false, + "activeRc" : false, + "rcFor" : "4.4", + "milestoneFor" : "", + "broken" : false, + "downloadUrl" : "https://services.gradle.org/distributions/gradle-4.4-rc-3-bin.zip", + "checksumUrl" : "https://services.gradle.org/distributions/gradle-4.4-rc-3-bin.zip.sha256" +}, { + "version" : "4.4-rc-2", + "buildTime" : "20171124103528+0000", + "current" : false, + "snapshot" : false, + "nightly" : false, + "releaseNightly" : false, + "activeRc" : false, + "rcFor" : "4.4", + "milestoneFor" : "", + "broken" : false, + "downloadUrl" : "https://services.gradle.org/distributions/gradle-4.4-rc-2-bin.zip", + "checksumUrl" : "https://services.gradle.org/distributions/gradle-4.4-rc-2-bin.zip.sha256" +}, { + "version" : "4.4-rc-1", + "buildTime" : "20171121153105+0000", + "current" : false, + "snapshot" : false, + "nightly" : false, + "releaseNightly" : false, + "activeRc" : false, + "rcFor" : "4.4", + "milestoneFor" : "", + "broken" : false, + "downloadUrl" : "https://services.gradle.org/distributions/gradle-4.4-rc-1-bin.zip", + "checksumUrl" : "https://services.gradle.org/distributions/gradle-4.4-rc-1-bin.zip.sha256" +}, { + "version" : "4.3.1", + "buildTime" : "20171108085945+0000", + "current" : false, + "snapshot" : false, + "nightly" : false, + "releaseNightly" : false, + "activeRc" : false, + "rcFor" : "", + "milestoneFor" : "", + "broken" : false, + "downloadUrl" : "https://services.gradle.org/distributions/gradle-4.3.1-bin.zip", + "checksumUrl" : "https://services.gradle.org/distributions/gradle-4.3.1-bin.zip.sha256", + "wrapperChecksumUrl" : "https://services.gradle.org/distributions/gradle-4.3.1-wrapper.jar.sha256" +}, { + "version" : "4.3", + "buildTime" : "20171030154329+0000", + "current" : false, + "snapshot" : false, + "nightly" : false, + "releaseNightly" : false, + "activeRc" : false, + "rcFor" : "", + "milestoneFor" : "", + "broken" : false, + "downloadUrl" : "https://services.gradle.org/distributions/gradle-4.3-bin.zip", + "checksumUrl" : "https://services.gradle.org/distributions/gradle-4.3-bin.zip.sha256", + "wrapperChecksumUrl" : "https://services.gradle.org/distributions/gradle-4.3-wrapper.jar.sha256" +}, { + "version" : "4.3-rc-4", + "buildTime" : "20171026162557+0000", + "current" : false, + "snapshot" : false, + "nightly" : false, + "releaseNightly" : false, + "activeRc" : false, + "rcFor" : "4.3", + "milestoneFor" : "", + "broken" : false, + "downloadUrl" : "https://services.gradle.org/distributions/gradle-4.3-rc-4-bin.zip", + "checksumUrl" : "https://services.gradle.org/distributions/gradle-4.3-rc-4-bin.zip.sha256" +}, { + "version" : "4.3-rc-3", + "buildTime" : "20171024142633+0000", + "current" : false, + "snapshot" : false, + "nightly" : false, + "releaseNightly" : false, + "activeRc" : false, + "rcFor" : "4.3", + "milestoneFor" : "", + "broken" : false, + "downloadUrl" : "https://services.gradle.org/distributions/gradle-4.3-rc-3-bin.zip", + "checksumUrl" : "https://services.gradle.org/distributions/gradle-4.3-rc-3-bin.zip.sha256" +}, { + "version" : "4.3-rc-2", + "buildTime" : "20171018073714+0000", + "current" : false, + "snapshot" : false, + "nightly" : false, + "releaseNightly" : false, + "activeRc" : false, + "rcFor" : "4.3", + "milestoneFor" : "", + "broken" : false, + "downloadUrl" : "https://services.gradle.org/distributions/gradle-4.3-rc-2-bin.zip", + "checksumUrl" : "https://services.gradle.org/distributions/gradle-4.3-rc-2-bin.zip.sha256" +}, { + "version" : "4.3-rc-1", + "buildTime" : "20171012161416+0000", + "current" : false, + "snapshot" : false, + "nightly" : false, + "releaseNightly" : false, + "activeRc" : false, + "rcFor" : "4.3", + "milestoneFor" : "", + "broken" : false, + "downloadUrl" : "https://services.gradle.org/distributions/gradle-4.3-rc-1-bin.zip", + "checksumUrl" : "https://services.gradle.org/distributions/gradle-4.3-rc-1-bin.zip.sha256" +}, { + "version" : "4.2.1", + "buildTime" : "20171002153621+0000", + "current" : false, + "snapshot" : false, + "nightly" : false, + "releaseNightly" : false, + "activeRc" : false, + "rcFor" : "", + "milestoneFor" : "", + "broken" : false, + "downloadUrl" : "https://services.gradle.org/distributions/gradle-4.2.1-bin.zip", + "checksumUrl" : "https://services.gradle.org/distributions/gradle-4.2.1-bin.zip.sha256", + "wrapperChecksumUrl" : "https://services.gradle.org/distributions/gradle-4.2.1-wrapper.jar.sha256" +}, { + "version" : "4.2", + "buildTime" : "20170920144823+0000", + "current" : false, + "snapshot" : false, + "nightly" : false, + "releaseNightly" : false, + "activeRc" : false, + "rcFor" : "", + "milestoneFor" : "", + "broken" : false, + "downloadUrl" : "https://services.gradle.org/distributions/gradle-4.2-bin.zip", + "checksumUrl" : "https://services.gradle.org/distributions/gradle-4.2-bin.zip.sha256", + "wrapperChecksumUrl" : "https://services.gradle.org/distributions/gradle-4.2-wrapper.jar.sha256" +}, { + "version" : "4.2-rc-2", + "buildTime" : "20170913122310+0000", + "current" : false, + "snapshot" : false, + "nightly" : false, + "releaseNightly" : false, + "activeRc" : false, + "rcFor" : "4.2", + "milestoneFor" : "", + "broken" : false, + "downloadUrl" : "https://services.gradle.org/distributions/gradle-4.2-rc-2-bin.zip", + "checksumUrl" : "https://services.gradle.org/distributions/gradle-4.2-rc-2-bin.zip.sha256" +}, { + "version" : "4.2-rc-1", + "buildTime" : "20170907081216+0000", + "current" : false, + "snapshot" : false, + "nightly" : false, + "releaseNightly" : false, + "activeRc" : false, + "rcFor" : "4.2", + "milestoneFor" : "", + "broken" : false, + "downloadUrl" : "https://services.gradle.org/distributions/gradle-4.2-rc-1-bin.zip", + "checksumUrl" : "https://services.gradle.org/distributions/gradle-4.2-rc-1-bin.zip.sha256" +}, { + "version" : "4.1", + "buildTime" : "20170807143848+0000", + "current" : false, + "snapshot" : false, + "nightly" : false, + "releaseNightly" : false, + "activeRc" : false, + "rcFor" : "", + "milestoneFor" : "", + "broken" : false, + "downloadUrl" : "https://services.gradle.org/distributions/gradle-4.1-bin.zip", + "checksumUrl" : "https://services.gradle.org/distributions/gradle-4.1-bin.zip.sha256", + "wrapperChecksumUrl" : "https://services.gradle.org/distributions/gradle-4.1-wrapper.jar.sha256" +}, { + "version" : "4.1-rc-2", + "buildTime" : "20170731142943+0000", + "current" : false, + "snapshot" : false, + "nightly" : false, + "releaseNightly" : false, + "activeRc" : false, + "rcFor" : "4.1", + "milestoneFor" : "", + "broken" : false, + "downloadUrl" : "https://services.gradle.org/distributions/gradle-4.1-rc-2-bin.zip", + "checksumUrl" : "https://services.gradle.org/distributions/gradle-4.1-rc-2-bin.zip.sha256" +}, { + "version" : "4.0.2", + "buildTime" : "20170726161918+0000", + "current" : false, + "snapshot" : false, + "nightly" : false, + "releaseNightly" : false, + "activeRc" : false, + "rcFor" : "", + "milestoneFor" : "", + "broken" : false, + "downloadUrl" : "https://services.gradle.org/distributions/gradle-4.0.2-bin.zip", + "checksumUrl" : "https://services.gradle.org/distributions/gradle-4.0.2-bin.zip.sha256" +}, { + "version" : "4.1-rc-1", + "buildTime" : "20170720152215+0000", + "current" : false, + "snapshot" : false, + "nightly" : false, + "releaseNightly" : false, + "activeRc" : false, + "rcFor" : "4.1", + "milestoneFor" : "", + "broken" : false, + "downloadUrl" : "https://services.gradle.org/distributions/gradle-4.1-rc-1-bin.zip", + "checksumUrl" : "https://services.gradle.org/distributions/gradle-4.1-rc-1-bin.zip.sha256" +}, { + "version" : "4.0.1", + "buildTime" : "20170707140241+0000", + "current" : false, + "snapshot" : false, + "nightly" : false, + "releaseNightly" : false, + "activeRc" : false, + "rcFor" : "", + "milestoneFor" : "", + "broken" : false, + "downloadUrl" : "https://services.gradle.org/distributions/gradle-4.0.1-bin.zip", + "checksumUrl" : "https://services.gradle.org/distributions/gradle-4.0.1-bin.zip.sha256" +}, { + "version" : "4.1-milestone-1", + "buildTime" : "20170620170546+0000", + "current" : false, + "snapshot" : false, + "nightly" : false, + "releaseNightly" : false, + "activeRc" : false, + "rcFor" : "", + "milestoneFor" : "4.1", + "broken" : false, + "downloadUrl" : "https://services.gradle.org/distributions/gradle-4.1-milestone-1-bin.zip", + "checksumUrl" : "https://services.gradle.org/distributions/gradle-4.1-milestone-1-bin.zip.sha256" +}, { + "version" : "3.5.1", + "buildTime" : "20170616143627+0000", + "current" : false, + "snapshot" : false, + "nightly" : false, + "releaseNightly" : false, + "activeRc" : false, + "rcFor" : "", + "milestoneFor" : "", + "broken" : false, + "downloadUrl" : "https://services.gradle.org/distributions/gradle-3.5.1-bin.zip", + "checksumUrl" : "https://services.gradle.org/distributions/gradle-3.5.1-bin.zip.sha256" +}, { + "version" : "4.0", + "buildTime" : "20170614151108+0000", + "current" : false, + "snapshot" : false, + "nightly" : false, + "releaseNightly" : false, + "activeRc" : false, + "rcFor" : "", + "milestoneFor" : "", + "broken" : false, + "downloadUrl" : "https://services.gradle.org/distributions/gradle-4.0-bin.zip", + "checksumUrl" : "https://services.gradle.org/distributions/gradle-4.0-bin.zip.sha256" +}, { + "version" : "4.0-rc-3", + "buildTime" : "20170612150444+0000", + "current" : false, + "snapshot" : false, + "nightly" : false, + "releaseNightly" : false, + "activeRc" : false, + "rcFor" : "4.0", + "milestoneFor" : "", + "broken" : false, + "downloadUrl" : "https://services.gradle.org/distributions/gradle-4.0-rc-3-bin.zip", + "checksumUrl" : "https://services.gradle.org/distributions/gradle-4.0-rc-3-bin.zip.sha256" +}, { + "version" : "4.0-rc-2", + "buildTime" : "20170607152236+0000", + "current" : false, + "snapshot" : false, + "nightly" : false, + "releaseNightly" : false, + "activeRc" : false, + "rcFor" : "4.0", + "milestoneFor" : "", + "broken" : false, + "downloadUrl" : "https://services.gradle.org/distributions/gradle-4.0-rc-2-bin.zip", + "checksumUrl" : "https://services.gradle.org/distributions/gradle-4.0-rc-2-bin.zip.sha256" +}, { + "version" : "4.0-rc-1", + "buildTime" : "20170530162617+0000", + "current" : false, + "snapshot" : false, + "nightly" : false, + "releaseNightly" : false, + "activeRc" : false, + "rcFor" : "4.0", + "milestoneFor" : "", + "broken" : false, + "downloadUrl" : "https://services.gradle.org/distributions/gradle-4.0-rc-1-bin.zip", + "checksumUrl" : "https://services.gradle.org/distributions/gradle-4.0-rc-1-bin.zip.sha256" +}, { + "version" : "4.0-milestone-2", + "buildTime" : "20170517143324+0000", + "current" : false, + "snapshot" : false, + "nightly" : false, + "releaseNightly" : false, + "activeRc" : false, + "rcFor" : "", + "milestoneFor" : "4.0", + "broken" : false, + "downloadUrl" : "https://services.gradle.org/distributions/gradle-4.0-milestone-2-bin.zip", + "checksumUrl" : "https://services.gradle.org/distributions/gradle-4.0-milestone-2-bin.zip.sha256" +}, { + "version" : "4.0-milestone-1", + "buildTime" : "20170428074509+0000", + "current" : false, + "snapshot" : false, + "nightly" : false, + "releaseNightly" : false, + "activeRc" : false, + "rcFor" : "", + "milestoneFor" : "4.0", + "broken" : false, + "downloadUrl" : "https://services.gradle.org/distributions/gradle-4.0-milestone-1-bin.zip", + "checksumUrl" : "https://services.gradle.org/distributions/gradle-4.0-milestone-1-bin.zip.sha256" +}, { + "version" : "3.5", + "buildTime" : "20170410133725+0000", + "current" : false, + "snapshot" : false, + "nightly" : false, + "releaseNightly" : false, + "activeRc" : false, + "rcFor" : "", + "milestoneFor" : "", + "broken" : false, + "downloadUrl" : "https://services.gradle.org/distributions/gradle-3.5-bin.zip", + "checksumUrl" : "https://services.gradle.org/distributions/gradle-3.5-bin.zip.sha256" +}, { + "version" : "3.5-rc-3", + "buildTime" : "20170404150413+0000", + "current" : false, + "snapshot" : false, + "nightly" : false, + "releaseNightly" : false, + "activeRc" : false, + "rcFor" : "3.5", + "milestoneFor" : "", + "broken" : false, + "downloadUrl" : "https://services.gradle.org/distributions/gradle-3.5-rc-3-bin.zip", + "checksumUrl" : "https://services.gradle.org/distributions/gradle-3.5-rc-3-bin.zip.sha256" +}, { + "version" : "3.5-rc-2", + "buildTime" : "20170327155623+0000", + "current" : false, + "snapshot" : false, + "nightly" : false, + "releaseNightly" : false, + "activeRc" : false, + "rcFor" : "3.5", + "milestoneFor" : "", + "broken" : false, + "downloadUrl" : "https://services.gradle.org/distributions/gradle-3.5-rc-2-bin.zip", + "checksumUrl" : "https://services.gradle.org/distributions/gradle-3.5-rc-2-bin.zip.sha256" +}, { + "version" : "3.5-rc-1", + "buildTime" : "20170322151607+0000", + "current" : false, + "snapshot" : false, + "nightly" : false, + "releaseNightly" : false, + "activeRc" : false, + "rcFor" : "3.5", + "milestoneFor" : "", + "broken" : false, + "downloadUrl" : "https://services.gradle.org/distributions/gradle-3.5-rc-1-bin.zip", + "checksumUrl" : "https://services.gradle.org/distributions/gradle-3.5-rc-1-bin.zip.sha256" +}, { + "version" : "3.4.1", + "buildTime" : "20170303194541+0000", + "current" : false, + "snapshot" : false, + "nightly" : false, + "releaseNightly" : false, + "activeRc" : false, + "rcFor" : "", + "milestoneFor" : "", + "broken" : false, + "downloadUrl" : "https://services.gradle.org/distributions/gradle-3.4.1-bin.zip", + "checksumUrl" : "https://services.gradle.org/distributions/gradle-3.4.1-bin.zip.sha256" +}, { + "version" : "3.4", + "buildTime" : "20170220144926+0000", + "current" : false, + "snapshot" : false, + "nightly" : false, + "releaseNightly" : false, + "activeRc" : false, + "rcFor" : "", + "milestoneFor" : "", + "broken" : false, + "downloadUrl" : "https://services.gradle.org/distributions/gradle-3.4-bin.zip", + "checksumUrl" : "https://services.gradle.org/distributions/gradle-3.4-bin.zip.sha256" +}, { + "version" : "3.4-rc-3", + "buildTime" : "20170213145527+0000", + "current" : false, + "snapshot" : false, + "nightly" : false, + "releaseNightly" : false, + "activeRc" : false, + "rcFor" : "3.4", + "milestoneFor" : "", + "broken" : false, + "downloadUrl" : "https://services.gradle.org/distributions/gradle-3.4-rc-3-bin.zip", + "checksumUrl" : "https://services.gradle.org/distributions/gradle-3.4-rc-3-bin.zip.sha256" +}, { + "version" : "3.4-rc-2", + "buildTime" : "20170206211728+0000", + "current" : false, + "snapshot" : false, + "nightly" : false, + "releaseNightly" : false, + "activeRc" : false, + "rcFor" : "3.4", + "milestoneFor" : "", + "broken" : false, + "downloadUrl" : "https://services.gradle.org/distributions/gradle-3.4-rc-2-bin.zip", + "checksumUrl" : "https://services.gradle.org/distributions/gradle-3.4-rc-2-bin.zip.sha256" +}, { + "version" : "3.4-rc-1", + "buildTime" : "20170126154849+0000", + "current" : false, + "snapshot" : false, + "nightly" : false, + "releaseNightly" : false, + "activeRc" : false, + "rcFor" : "3.4", + "milestoneFor" : "", + "broken" : false, + "downloadUrl" : "https://services.gradle.org/distributions/gradle-3.4-rc-1-bin.zip", + "checksumUrl" : "https://services.gradle.org/distributions/gradle-3.4-rc-1-bin.zip.sha256" +}, { + "version" : "3.3", + "buildTime" : "20170103153104+0000", + "current" : false, + "snapshot" : false, + "nightly" : false, + "releaseNightly" : false, + "activeRc" : false, + "rcFor" : "", + "milestoneFor" : "", + "broken" : false, + "downloadUrl" : "https://services.gradle.org/distributions/gradle-3.3-bin.zip", + "checksumUrl" : "https://services.gradle.org/distributions/gradle-3.3-bin.zip.sha256" +}, { + "version" : "3.3-rc-1", + "buildTime" : "20161219160724+0000", + "current" : false, + "snapshot" : false, + "nightly" : false, + "releaseNightly" : false, + "activeRc" : false, + "rcFor" : "3.3", + "milestoneFor" : "", + "broken" : false, + "downloadUrl" : "https://services.gradle.org/distributions/gradle-3.3-rc-1-bin.zip", + "checksumUrl" : "https://services.gradle.org/distributions/gradle-3.3-rc-1-bin.zip.sha256" +}, { + "version" : "3.2.1", + "buildTime" : "20161122151954+0000", + "current" : false, + "snapshot" : false, + "nightly" : false, + "releaseNightly" : false, + "activeRc" : false, + "rcFor" : "", + "milestoneFor" : "", + "broken" : false, + "downloadUrl" : "https://services.gradle.org/distributions/gradle-3.2.1-bin.zip", + "checksumUrl" : "https://services.gradle.org/distributions/gradle-3.2.1-bin.zip.sha256", + "wrapperChecksumUrl" : "https://services.gradle.org/distributions/gradle-3.2.1-wrapper.jar.sha256" +}, { + "version" : "3.2", + "buildTime" : "20161114123259+0000", + "current" : false, + "snapshot" : false, + "nightly" : false, + "releaseNightly" : false, + "activeRc" : false, + "rcFor" : "", + "milestoneFor" : "", + "broken" : false, + "downloadUrl" : "https://services.gradle.org/distributions/gradle-3.2-bin.zip", + "checksumUrl" : "https://services.gradle.org/distributions/gradle-3.2-bin.zip.sha256", + "wrapperChecksumUrl" : "https://services.gradle.org/distributions/gradle-3.2-wrapper.jar.sha256" +}, { + "version" : "3.2-rc-3", + "buildTime" : "20161107153233+0000", + "current" : false, + "snapshot" : false, + "nightly" : false, + "releaseNightly" : false, + "activeRc" : false, + "rcFor" : "3.2", + "milestoneFor" : "", + "broken" : false, + "downloadUrl" : "https://services.gradle.org/distributions/gradle-3.2-rc-3-bin.zip", + "checksumUrl" : "https://services.gradle.org/distributions/gradle-3.2-rc-3-bin.zip.sha256" +}, { + "version" : "3.2-rc-2", + "buildTime" : "20161031160822+0000", + "current" : false, + "snapshot" : false, + "nightly" : false, + "releaseNightly" : false, + "activeRc" : false, + "rcFor" : "3.2", + "milestoneFor" : "", + "broken" : false, + "downloadUrl" : "https://services.gradle.org/distributions/gradle-3.2-rc-2-bin.zip", + "checksumUrl" : "https://services.gradle.org/distributions/gradle-3.2-rc-2-bin.zip.sha256" +}, { + "version" : "3.2-rc-1", + "buildTime" : "20161024194725+0000", + "current" : false, + "snapshot" : false, + "nightly" : false, + "releaseNightly" : false, + "activeRc" : false, + "rcFor" : "3.2", + "milestoneFor" : "", + "broken" : false, + "downloadUrl" : "https://services.gradle.org/distributions/gradle-3.2-rc-1-bin.zip", + "checksumUrl" : "https://services.gradle.org/distributions/gradle-3.2-rc-1-bin.zip.sha256" +}, { + "version" : "3.1", + "buildTime" : "20160919105353+0000", + "current" : false, + "snapshot" : false, + "nightly" : false, + "releaseNightly" : false, + "activeRc" : false, + "rcFor" : "", + "milestoneFor" : "", + "broken" : false, + "downloadUrl" : "https://services.gradle.org/distributions/gradle-3.1-bin.zip", + "checksumUrl" : "https://services.gradle.org/distributions/gradle-3.1-bin.zip.sha256", + "wrapperChecksumUrl" : "https://services.gradle.org/distributions/gradle-3.1-wrapper.jar.sha256" +}, { + "version" : "3.1-rc-1", + "buildTime" : "20160912123424+0000", + "current" : false, + "snapshot" : false, + "nightly" : false, + "releaseNightly" : false, + "activeRc" : false, + "rcFor" : "3.1", + "milestoneFor" : "", + "broken" : false, + "downloadUrl" : "https://services.gradle.org/distributions/gradle-3.1-rc-1-bin.zip", + "checksumUrl" : "https://services.gradle.org/distributions/gradle-3.1-rc-1-bin.zip.sha256" +}, { + "version" : "3.0", + "buildTime" : "20160815131501+0000", + "current" : false, + "snapshot" : false, + "nightly" : false, + "releaseNightly" : false, + "activeRc" : false, + "rcFor" : "", + "milestoneFor" : "", + "broken" : false, + "downloadUrl" : "https://services.gradle.org/distributions/gradle-3.0-bin.zip", + "checksumUrl" : "https://services.gradle.org/distributions/gradle-3.0-bin.zip.sha256", + "wrapperChecksumUrl" : "https://services.gradle.org/distributions/gradle-3.0-wrapper.jar.sha256" +}, { + "version" : "3.0-rc-2", + "buildTime" : "20160808133410+0000", + "current" : false, + "snapshot" : false, + "nightly" : false, + "releaseNightly" : false, + "activeRc" : false, + "rcFor" : "3.0", + "milestoneFor" : "", + "broken" : false, + "downloadUrl" : "https://services.gradle.org/distributions/gradle-3.0-rc-2-bin.zip", + "checksumUrl" : "https://services.gradle.org/distributions/gradle-3.0-rc-2-bin.zip.sha256" +}, { + "version" : "3.0-rc-1", + "buildTime" : "20160802061335+0000", + "current" : false, + "snapshot" : false, + "nightly" : false, + "releaseNightly" : false, + "activeRc" : false, + "rcFor" : "3.0", + "milestoneFor" : "", + "broken" : false, + "downloadUrl" : "https://services.gradle.org/distributions/gradle-3.0-rc-1-bin.zip", + "checksumUrl" : "https://services.gradle.org/distributions/gradle-3.0-rc-1-bin.zip.sha256" +}, { + "version" : "2.14.1", + "buildTime" : "20160718063837+0000", + "current" : false, + "snapshot" : false, + "nightly" : false, + "releaseNightly" : false, + "activeRc" : false, + "rcFor" : "", + "milestoneFor" : "", + "broken" : false, + "downloadUrl" : "https://services.gradle.org/distributions/gradle-2.14.1-bin.zip", + "checksumUrl" : "https://services.gradle.org/distributions/gradle-2.14.1-bin.zip.sha256", + "wrapperChecksumUrl" : "https://services.gradle.org/distributions/gradle-2.14.1-wrapper.jar.sha256" +}, { + "version" : "2.14.1-rc-2", + "buildTime" : "20160711105827+0000", + "current" : false, + "snapshot" : false, + "nightly" : false, + "releaseNightly" : false, + "activeRc" : false, + "rcFor" : "2.14.1", + "milestoneFor" : "", + "broken" : false, + "downloadUrl" : "https://services.gradle.org/distributions/gradle-2.14.1-rc-2-bin.zip", + "checksumUrl" : "https://services.gradle.org/distributions/gradle-2.14.1-rc-2-bin.zip.sha256" +}, { + "version" : "2.14.1-rc-1", + "buildTime" : "20160629051303+0000", + "current" : false, + "snapshot" : false, + "nightly" : false, + "releaseNightly" : false, + "activeRc" : false, + "rcFor" : "2.14.1", + "milestoneFor" : "", + "broken" : false, + "downloadUrl" : "https://services.gradle.org/distributions/gradle-2.14.1-rc-1-bin.zip", + "checksumUrl" : "https://services.gradle.org/distributions/gradle-2.14.1-rc-1-bin.zip.sha256" +}, { + "version" : "3.0-milestone-2", + "buildTime" : "20160621224128+0000", + "current" : false, + "snapshot" : false, + "nightly" : false, + "releaseNightly" : false, + "activeRc" : false, + "rcFor" : "", + "milestoneFor" : "3.0", + "broken" : false, + "downloadUrl" : "https://services.gradle.org/distributions/gradle-3.0-milestone-2-bin.zip", + "checksumUrl" : "https://services.gradle.org/distributions/gradle-3.0-milestone-2-bin.zip.sha256" +}, { + "version" : "2.14", + "buildTime" : "20160614071637+0000", + "current" : false, + "snapshot" : false, + "nightly" : false, + "releaseNightly" : false, + "activeRc" : false, + "rcFor" : "", + "milestoneFor" : "", + "broken" : false, + "downloadUrl" : "https://services.gradle.org/distributions/gradle-2.14-bin.zip", + "checksumUrl" : "https://services.gradle.org/distributions/gradle-2.14-bin.zip.sha256", + "wrapperChecksumUrl" : "https://services.gradle.org/distributions/gradle-2.14-wrapper.jar.sha256" +}, { + "version" : "2.14-rc-6", + "buildTime" : "20160610181946+0000", + "current" : false, + "snapshot" : false, + "nightly" : false, + "releaseNightly" : false, + "activeRc" : false, + "rcFor" : "2.14", + "milestoneFor" : "", + "broken" : false, + "downloadUrl" : "https://services.gradle.org/distributions/gradle-2.14-rc-6-bin.zip", + "checksumUrl" : "https://services.gradle.org/distributions/gradle-2.14-rc-6-bin.zip.sha256" +}, { + "version" : "3.0-milestone-1", + "buildTime" : "20160608013148+0000", + "current" : false, + "snapshot" : false, + "nightly" : false, + "releaseNightly" : false, + "activeRc" : false, + "rcFor" : "", + "milestoneFor" : "3.0", + "broken" : false, + "downloadUrl" : "https://services.gradle.org/distributions/gradle-3.0-milestone-1-bin.zip", + "checksumUrl" : "https://services.gradle.org/distributions/gradle-3.0-milestone-1-bin.zip.sha256" +}, { + "version" : "2.14-rc-5", + "buildTime" : "20160607135817+0000", + "current" : false, + "snapshot" : false, + "nightly" : false, + "releaseNightly" : false, + "activeRc" : false, + "rcFor" : "2.14", + "milestoneFor" : "", + "broken" : false, + "downloadUrl" : "https://services.gradle.org/distributions/gradle-2.14-rc-5-bin.zip", + "checksumUrl" : "https://services.gradle.org/distributions/gradle-2.14-rc-5-bin.zip.sha256" +}, { + "version" : "2.14-rc-4", + "buildTime" : "20160603110827+0000", + "current" : false, + "snapshot" : false, + "nightly" : false, + "releaseNightly" : false, + "activeRc" : false, + "rcFor" : "2.14", + "milestoneFor" : "", + "broken" : false, + "downloadUrl" : "https://services.gradle.org/distributions/gradle-2.14-rc-4-bin.zip", + "checksumUrl" : "https://services.gradle.org/distributions/gradle-2.14-rc-4-bin.zip.sha256" +}, { + "version" : "2.14-rc-3", + "buildTime" : "20160530112111+0000", + "current" : false, + "snapshot" : false, + "nightly" : false, + "releaseNightly" : false, + "activeRc" : false, + "rcFor" : "2.14", + "milestoneFor" : "", + "broken" : false, + "downloadUrl" : "https://services.gradle.org/distributions/gradle-2.14-rc-3-bin.zip", + "checksumUrl" : "https://services.gradle.org/distributions/gradle-2.14-rc-3-bin.zip.sha256" +}, { + "version" : "2.14-rc-2", + "buildTime" : "20160527175624+0000", + "current" : false, + "snapshot" : false, + "nightly" : false, + "releaseNightly" : false, + "activeRc" : false, + "rcFor" : "2.14", + "milestoneFor" : "", + "broken" : false, + "downloadUrl" : "https://services.gradle.org/distributions/gradle-2.14-rc-2-bin.zip", + "checksumUrl" : "https://services.gradle.org/distributions/gradle-2.14-rc-2-bin.zip.sha256" +}, { + "version" : "2.14-rc-1", + "buildTime" : "20160518093824+0000", + "current" : false, + "snapshot" : false, + "nightly" : false, + "releaseNightly" : false, + "activeRc" : false, + "rcFor" : "2.14", + "milestoneFor" : "", + "broken" : false, + "downloadUrl" : "https://services.gradle.org/distributions/gradle-2.14-rc-1-bin.zip", + "checksumUrl" : "https://services.gradle.org/distributions/gradle-2.14-rc-1-bin.zip.sha256" +}, { + "version" : "2.13", + "buildTime" : "20160425041010+0000", + "current" : false, + "snapshot" : false, + "nightly" : false, + "releaseNightly" : false, + "activeRc" : false, + "rcFor" : "", + "milestoneFor" : "", + "broken" : false, + "downloadUrl" : "https://services.gradle.org/distributions/gradle-2.13-bin.zip", + "checksumUrl" : "https://services.gradle.org/distributions/gradle-2.13-bin.zip.sha256", + "wrapperChecksumUrl" : "https://services.gradle.org/distributions/gradle-2.13-wrapper.jar.sha256" +}, { + "version" : "2.13-rc-2", + "buildTime" : "20160419145240+0000", + "current" : false, + "snapshot" : false, + "nightly" : false, + "releaseNightly" : false, + "activeRc" : false, + "rcFor" : "2.13", + "milestoneFor" : "", + "broken" : false, + "downloadUrl" : "https://services.gradle.org/distributions/gradle-2.13-rc-2-bin.zip", + "checksumUrl" : "https://services.gradle.org/distributions/gradle-2.13-rc-2-bin.zip.sha256" +}, { + "version" : "2.13-rc-1", + "buildTime" : "20160406110211+0000", + "current" : false, + "snapshot" : false, + "nightly" : false, + "releaseNightly" : false, + "activeRc" : false, + "rcFor" : "2.13", + "milestoneFor" : "", + "broken" : false, + "downloadUrl" : "https://services.gradle.org/distributions/gradle-2.13-rc-1-bin.zip", + "checksumUrl" : "https://services.gradle.org/distributions/gradle-2.13-rc-1-bin.zip.sha256" +}, { + "version" : "2.12", + "buildTime" : "20160314083203+0000", + "current" : false, + "snapshot" : false, + "nightly" : false, + "releaseNightly" : false, + "activeRc" : false, + "rcFor" : "", + "milestoneFor" : "", + "broken" : false, + "downloadUrl" : "https://services.gradle.org/distributions/gradle-2.12-bin.zip", + "checksumUrl" : "https://services.gradle.org/distributions/gradle-2.12-bin.zip.sha256", + "wrapperChecksumUrl" : "https://services.gradle.org/distributions/gradle-2.12-wrapper.jar.sha256" +}, { + "version" : "2.12-rc-1", + "buildTime" : "20160307174118+0000", + "current" : false, + "snapshot" : false, + "nightly" : false, + "releaseNightly" : false, + "activeRc" : false, + "rcFor" : "2.12", + "milestoneFor" : "", + "broken" : false, + "downloadUrl" : "https://services.gradle.org/distributions/gradle-2.12-rc-1-bin.zip", + "checksumUrl" : "https://services.gradle.org/distributions/gradle-2.12-rc-1-bin.zip.sha256" +}, { + "version" : "2.11", + "buildTime" : "20160208075916+0000", + "current" : false, + "snapshot" : false, + "nightly" : false, + "releaseNightly" : false, + "activeRc" : false, + "rcFor" : "", + "milestoneFor" : "", + "broken" : false, + "downloadUrl" : "https://services.gradle.org/distributions/gradle-2.11-bin.zip", + "checksumUrl" : "https://services.gradle.org/distributions/gradle-2.11-bin.zip.sha256", + "wrapperChecksumUrl" : "https://services.gradle.org/distributions/gradle-2.11-wrapper.jar.sha256" +}, { + "version" : "2.11-rc-3", + "buildTime" : "20160203190922+0000", + "current" : false, + "snapshot" : false, + "nightly" : false, + "releaseNightly" : false, + "activeRc" : false, + "rcFor" : "2.11", + "milestoneFor" : "", + "broken" : false, + "downloadUrl" : "https://services.gradle.org/distributions/gradle-2.11-rc-3-bin.zip", + "checksumUrl" : "https://services.gradle.org/distributions/gradle-2.11-rc-3-bin.zip.sha256" +}, { + "version" : "2.11-rc-2", + "buildTime" : "20160202162431+0000", + "current" : false, + "snapshot" : false, + "nightly" : false, + "releaseNightly" : false, + "activeRc" : false, + "rcFor" : "2.11", + "milestoneFor" : "", + "broken" : false, + "downloadUrl" : "https://services.gradle.org/distributions/gradle-2.11-rc-2-bin.zip", + "checksumUrl" : "https://services.gradle.org/distributions/gradle-2.11-rc-2-bin.zip.sha256" +}, { + "version" : "2.11-rc-1", + "buildTime" : "20160120084154+0000", + "current" : false, + "snapshot" : false, + "nightly" : false, + "releaseNightly" : false, + "activeRc" : false, + "rcFor" : "2.11", + "milestoneFor" : "", + "broken" : false, + "downloadUrl" : "https://services.gradle.org/distributions/gradle-2.11-rc-1-bin.zip", + "checksumUrl" : "https://services.gradle.org/distributions/gradle-2.11-rc-1-bin.zip.sha256" +}, { + "version" : "2.10", + "buildTime" : "20151221211504+0000", + "current" : false, + "snapshot" : false, + "nightly" : false, + "releaseNightly" : false, + "activeRc" : false, + "rcFor" : "", + "milestoneFor" : "", + "broken" : false, + "downloadUrl" : "https://services.gradle.org/distributions/gradle-2.10-bin.zip", + "checksumUrl" : "https://services.gradle.org/distributions/gradle-2.10-bin.zip.sha256", + "wrapperChecksumUrl" : "https://services.gradle.org/distributions/gradle-2.10-wrapper.jar.sha256" +}, { + "version" : "2.10-rc-2", + "buildTime" : "20151218164026+0000", + "current" : false, + "snapshot" : false, + "nightly" : false, + "releaseNightly" : false, + "activeRc" : false, + "rcFor" : "2.10", + "milestoneFor" : "", + "broken" : false, + "downloadUrl" : "https://services.gradle.org/distributions/gradle-2.10-rc-2-bin.zip", + "checksumUrl" : "https://services.gradle.org/distributions/gradle-2.10-rc-2-bin.zip.sha256" +}, { + "version" : "2.10-rc-1", + "buildTime" : "20151208224811+0000", + "current" : false, + "snapshot" : false, + "nightly" : false, + "releaseNightly" : false, + "activeRc" : false, + "rcFor" : "2.10", + "milestoneFor" : "", + "broken" : false, + "downloadUrl" : "https://services.gradle.org/distributions/gradle-2.10-rc-1-bin.zip", + "checksumUrl" : "https://services.gradle.org/distributions/gradle-2.10-rc-1-bin.zip.sha256" +}, { + "version" : "2.9", + "buildTime" : "20151117070217+0000", + "current" : false, + "snapshot" : false, + "nightly" : false, + "releaseNightly" : false, + "activeRc" : false, + "rcFor" : "", + "milestoneFor" : "", + "broken" : false, + "downloadUrl" : "https://services.gradle.org/distributions/gradle-2.9-bin.zip", + "checksumUrl" : "https://services.gradle.org/distributions/gradle-2.9-bin.zip.sha256", + "wrapperChecksumUrl" : "https://services.gradle.org/distributions/gradle-2.9-wrapper.jar.sha256" +}, { + "version" : "2.9-rc-1", + "buildTime" : "20151103230218+0000", + "current" : false, + "snapshot" : false, + "nightly" : false, + "releaseNightly" : false, + "activeRc" : false, + "rcFor" : "2.9", + "milestoneFor" : "", + "broken" : false, + "downloadUrl" : "https://services.gradle.org/distributions/gradle-2.9-rc-1-bin.zip", + "checksumUrl" : "https://services.gradle.org/distributions/gradle-2.9-rc-1-bin.zip.sha256" +}, { + "version" : "2.8", + "buildTime" : "20151020034636+0000", + "current" : false, + "snapshot" : false, + "nightly" : false, + "releaseNightly" : false, + "activeRc" : false, + "rcFor" : "", + "milestoneFor" : "", + "broken" : false, + "downloadUrl" : "https://services.gradle.org/distributions/gradle-2.8-bin.zip", + "checksumUrl" : "https://services.gradle.org/distributions/gradle-2.8-bin.zip.sha256", + "wrapperChecksumUrl" : "https://services.gradle.org/distributions/gradle-2.8-wrapper.jar.sha256" +}, { + "version" : "2.8-rc-2", + "buildTime" : "20151015124208+0000", + "current" : false, + "snapshot" : false, + "nightly" : false, + "releaseNightly" : false, + "activeRc" : false, + "rcFor" : "2.8", + "milestoneFor" : "", + "broken" : false, + "downloadUrl" : "https://services.gradle.org/distributions/gradle-2.8-rc-2-bin.zip", + "checksumUrl" : "https://services.gradle.org/distributions/gradle-2.8-rc-2-bin.zip.sha256" +}, { + "version" : "2.8-rc-1", + "buildTime" : "20150930171102+0000", + "current" : false, + "snapshot" : false, + "nightly" : false, + "releaseNightly" : false, + "activeRc" : false, + "rcFor" : "2.8", + "milestoneFor" : "", + "broken" : false, + "downloadUrl" : "https://services.gradle.org/distributions/gradle-2.8-rc-1-bin.zip", + "checksumUrl" : "https://services.gradle.org/distributions/gradle-2.8-rc-1-bin.zip.sha256" +}, { + "version" : "2.7", + "buildTime" : "20150914072616+0000", + "current" : false, + "snapshot" : false, + "nightly" : false, + "releaseNightly" : false, + "activeRc" : false, + "rcFor" : "", + "milestoneFor" : "", + "broken" : false, + "downloadUrl" : "https://services.gradle.org/distributions/gradle-2.7-bin.zip", + "checksumUrl" : "https://services.gradle.org/distributions/gradle-2.7-bin.zip.sha256", + "wrapperChecksumUrl" : "https://services.gradle.org/distributions/gradle-2.7-wrapper.jar.sha256" +}, { + "version" : "2.7-rc-2", + "buildTime" : "20150905140615+0000", + "current" : false, + "snapshot" : false, + "nightly" : false, + "releaseNightly" : false, + "activeRc" : false, + "rcFor" : "2.7", + "milestoneFor" : "", + "broken" : false, + "downloadUrl" : "https://services.gradle.org/distributions/gradle-2.7-rc-2-bin.zip", + "checksumUrl" : "https://services.gradle.org/distributions/gradle-2.7-rc-2-bin.zip.sha256" +}, { + "version" : "2.7-rc-1", + "buildTime" : "20150828140928+0000", + "current" : false, + "snapshot" : false, + "nightly" : false, + "releaseNightly" : false, + "activeRc" : false, + "rcFor" : "2.7", + "milestoneFor" : "", + "broken" : false, + "downloadUrl" : "https://services.gradle.org/distributions/gradle-2.7-rc-1-bin.zip", + "checksumUrl" : "https://services.gradle.org/distributions/gradle-2.7-rc-1-bin.zip.sha256" +}, { + "version" : "2.6", + "buildTime" : "20150810131506+0000", + "current" : false, + "snapshot" : false, + "nightly" : false, + "releaseNightly" : false, + "activeRc" : false, + "rcFor" : "", + "milestoneFor" : "", + "broken" : false, + "downloadUrl" : "https://services.gradle.org/distributions/gradle-2.6-bin.zip", + "checksumUrl" : "https://services.gradle.org/distributions/gradle-2.6-bin.zip.sha256", + "wrapperChecksumUrl" : "https://services.gradle.org/distributions/gradle-2.6-wrapper.jar.sha256" +}, { + "version" : "2.6-rc-2", + "buildTime" : "20150804104806+0000", + "current" : false, + "snapshot" : false, + "nightly" : false, + "releaseNightly" : false, + "activeRc" : false, + "rcFor" : "2.6", + "milestoneFor" : "", + "broken" : false, + "downloadUrl" : "https://services.gradle.org/distributions/gradle-2.6-rc-2-bin.zip", + "checksumUrl" : "https://services.gradle.org/distributions/gradle-2.6-rc-2-bin.zip.sha256" +}, { + "version" : "2.6-rc-1", + "buildTime" : "20150728171643+0000", + "current" : false, + "snapshot" : false, + "nightly" : false, + "releaseNightly" : false, + "activeRc" : false, + "rcFor" : "2.6", + "milestoneFor" : "", + "broken" : false, + "downloadUrl" : "https://services.gradle.org/distributions/gradle-2.6-rc-1-bin.zip", + "checksumUrl" : "https://services.gradle.org/distributions/gradle-2.6-rc-1-bin.zip.sha256" +}, { + "version" : "2.5", + "buildTime" : "20150708073837+0000", + "current" : false, + "snapshot" : false, + "nightly" : false, + "releaseNightly" : false, + "activeRc" : false, + "rcFor" : "", + "milestoneFor" : "", + "broken" : false, + "downloadUrl" : "https://services.gradle.org/distributions/gradle-2.5-bin.zip", + "checksumUrl" : "https://services.gradle.org/distributions/gradle-2.5-bin.zip.sha256", + "wrapperChecksumUrl" : "https://services.gradle.org/distributions/gradle-2.5-wrapper.jar.sha256" +}, { + "version" : "2.5-rc-2", + "buildTime" : "20150702151559+0000", + "current" : false, + "snapshot" : false, + "nightly" : false, + "releaseNightly" : false, + "activeRc" : false, + "rcFor" : "2.5", + "milestoneFor" : "", + "broken" : false, + "downloadUrl" : "https://services.gradle.org/distributions/gradle-2.5-rc-2-bin.zip", + "checksumUrl" : "https://services.gradle.org/distributions/gradle-2.5-rc-2-bin.zip.sha256" +}, { + "version" : "2.5-rc-1", + "buildTime" : "20150623180452+0000", + "current" : false, + "snapshot" : false, + "nightly" : false, + "releaseNightly" : false, + "activeRc" : false, + "rcFor" : "2.5", + "milestoneFor" : "", + "broken" : false, + "downloadUrl" : "https://services.gradle.org/distributions/gradle-2.5-rc-1-bin.zip", + "checksumUrl" : "https://services.gradle.org/distributions/gradle-2.5-rc-1-bin.zip.sha256" +}, { + "version" : "2.4", + "buildTime" : "20150505080924+0000", + "current" : false, + "snapshot" : false, + "nightly" : false, + "releaseNightly" : false, + "activeRc" : false, + "rcFor" : "", + "milestoneFor" : "", + "broken" : false, + "downloadUrl" : "https://services.gradle.org/distributions/gradle-2.4-bin.zip", + "checksumUrl" : "https://services.gradle.org/distributions/gradle-2.4-bin.zip.sha256", + "wrapperChecksumUrl" : "https://services.gradle.org/distributions/gradle-2.4-wrapper.jar.sha256" +}, { + "version" : "2.4-rc-2", + "buildTime" : "20150429045020+0000", + "current" : false, + "snapshot" : false, + "nightly" : false, + "releaseNightly" : false, + "activeRc" : false, + "rcFor" : "2.4", + "milestoneFor" : "", + "broken" : false, + "downloadUrl" : "https://services.gradle.org/distributions/gradle-2.4-rc-2-bin.zip", + "checksumUrl" : "https://services.gradle.org/distributions/gradle-2.4-rc-2-bin.zip.sha256" +}, { + "version" : "2.4-rc-1", + "buildTime" : "20150423031523+0000", + "current" : false, + "snapshot" : false, + "nightly" : false, + "releaseNightly" : false, + "activeRc" : false, + "rcFor" : "2.4", + "milestoneFor" : "", + "broken" : false, + "downloadUrl" : "https://services.gradle.org/distributions/gradle-2.4-rc-1-bin.zip", + "checksumUrl" : "https://services.gradle.org/distributions/gradle-2.4-rc-1-bin.zip.sha256" +}, { + "version" : "2.3", + "buildTime" : "20150216050933+0000", + "current" : false, + "snapshot" : false, + "nightly" : false, + "releaseNightly" : false, + "activeRc" : false, + "rcFor" : "", + "milestoneFor" : "", + "broken" : false, + "downloadUrl" : "https://services.gradle.org/distributions/gradle-2.3-bin.zip", + "checksumUrl" : "https://services.gradle.org/distributions/gradle-2.3-bin.zip.sha256", + "wrapperChecksumUrl" : "https://services.gradle.org/distributions/gradle-2.3-wrapper.jar.sha256" +}, { + "version" : "2.3-rc-4", + "buildTime" : "20150211163922+0000", + "current" : false, + "snapshot" : false, + "nightly" : false, + "releaseNightly" : false, + "activeRc" : false, + "rcFor" : "2.3", + "milestoneFor" : "", + "broken" : false, + "downloadUrl" : "https://services.gradle.org/distributions/gradle-2.3-rc-4-bin.zip", + "checksumUrl" : "https://services.gradle.org/distributions/gradle-2.3-rc-4-bin.zip.sha256" +}, { + "version" : "2.3-rc-3", + "buildTime" : "20150208183759+0000", + "current" : false, + "snapshot" : false, + "nightly" : false, + "releaseNightly" : false, + "activeRc" : false, + "rcFor" : "2.3", + "milestoneFor" : "", + "broken" : false, + "downloadUrl" : "https://services.gradle.org/distributions/gradle-2.3-rc-3-bin.zip", + "checksumUrl" : "https://services.gradle.org/distributions/gradle-2.3-rc-3-bin.zip.sha256" +}, { + "version" : "2.3-rc-2", + "buildTime" : "20150204105413+0000", + "current" : false, + "snapshot" : false, + "nightly" : false, + "releaseNightly" : false, + "activeRc" : false, + "rcFor" : "2.3", + "milestoneFor" : "", + "broken" : false, + "downloadUrl" : "https://services.gradle.org/distributions/gradle-2.3-rc-2-bin.zip", + "checksumUrl" : "https://services.gradle.org/distributions/gradle-2.3-rc-2-bin.zip.sha256" +}, { + "version" : "2.3-rc-1", + "buildTime" : "20150127140232+0000", + "current" : false, + "snapshot" : false, + "nightly" : false, + "releaseNightly" : false, + "activeRc" : false, + "rcFor" : "2.3", + "milestoneFor" : "", + "broken" : false, + "downloadUrl" : "https://services.gradle.org/distributions/gradle-2.3-rc-1-bin.zip", + "checksumUrl" : "https://services.gradle.org/distributions/gradle-2.3-rc-1-bin.zip.sha256" +}, { + "version" : "2.2.1", + "buildTime" : "20141124094535+0000", + "current" : false, + "snapshot" : false, + "nightly" : false, + "releaseNightly" : false, + "activeRc" : false, + "rcFor" : "", + "milestoneFor" : "", + "broken" : false, + "downloadUrl" : "https://services.gradle.org/distributions/gradle-2.2.1-bin.zip", + "checksumUrl" : "https://services.gradle.org/distributions/gradle-2.2.1-bin.zip.sha256", + "wrapperChecksumUrl" : "https://services.gradle.org/distributions/gradle-2.2.1-wrapper.jar.sha256" +}, { + "version" : "2.2.1-rc-1", + "buildTime" : "20141117101237+0000", + "current" : false, + "snapshot" : false, + "nightly" : false, + "releaseNightly" : false, + "activeRc" : false, + "rcFor" : "2.2.1", + "milestoneFor" : "", + "broken" : false, + "downloadUrl" : "https://services.gradle.org/distributions/gradle-2.2.1-rc-1-bin.zip", + "checksumUrl" : "https://services.gradle.org/distributions/gradle-2.2.1-rc-1-bin.zip.sha256" +}, { + "version" : "2.2", + "buildTime" : "20141110133144+0000", + "current" : false, + "snapshot" : false, + "nightly" : false, + "releaseNightly" : false, + "activeRc" : false, + "rcFor" : "", + "milestoneFor" : "", + "broken" : false, + "downloadUrl" : "https://services.gradle.org/distributions/gradle-2.2-bin.zip", + "checksumUrl" : "https://services.gradle.org/distributions/gradle-2.2-bin.zip.sha256", + "wrapperChecksumUrl" : "https://services.gradle.org/distributions/gradle-2.2-wrapper.jar.sha256" +}, { + "version" : "2.2-rc-2", + "buildTime" : "20141103170404+0000", + "current" : false, + "snapshot" : false, + "nightly" : false, + "releaseNightly" : false, + "activeRc" : false, + "rcFor" : "2.2", + "milestoneFor" : "", + "broken" : false, + "downloadUrl" : "https://services.gradle.org/distributions/gradle-2.2-rc-2-bin.zip", + "checksumUrl" : "https://services.gradle.org/distributions/gradle-2.2-rc-2-bin.zip.sha256" +}, { + "version" : "2.2-rc-1", + "buildTime" : "20141020163257+0000", + "current" : false, + "snapshot" : false, + "nightly" : false, + "releaseNightly" : false, + "activeRc" : false, + "rcFor" : "2.2", + "milestoneFor" : "", + "broken" : false, + "downloadUrl" : "https://services.gradle.org/distributions/gradle-2.2-rc-1-bin.zip", + "checksumUrl" : "https://services.gradle.org/distributions/gradle-2.2-rc-1-bin.zip.sha256" +}, { + "version" : "2.1", + "buildTime" : "20140908104039+0000", + "current" : false, + "snapshot" : false, + "nightly" : false, + "releaseNightly" : false, + "activeRc" : false, + "rcFor" : "", + "milestoneFor" : "", + "broken" : false, + "downloadUrl" : "https://services.gradle.org/distributions/gradle-2.1-bin.zip", + "checksumUrl" : "https://services.gradle.org/distributions/gradle-2.1-bin.zip.sha256", + "wrapperChecksumUrl" : "https://services.gradle.org/distributions/gradle-2.1-wrapper.jar.sha256" +}, { + "version" : "2.1-rc-4", + "buildTime" : "20140903092053+0000", + "current" : false, + "snapshot" : false, + "nightly" : false, + "releaseNightly" : false, + "activeRc" : false, + "rcFor" : "2.1", + "milestoneFor" : "", + "broken" : false, + "downloadUrl" : "https://services.gradle.org/distributions/gradle-2.1-rc-4-bin.zip", + "checksumUrl" : "https://services.gradle.org/distributions/gradle-2.1-rc-4-bin.zip.sha256" +}, { + "version" : "2.1-rc-3", + "buildTime" : "20140901103549+0000", + "current" : false, + "snapshot" : false, + "nightly" : false, + "releaseNightly" : false, + "activeRc" : false, + "rcFor" : "2.1", + "milestoneFor" : "", + "broken" : false, + "downloadUrl" : "https://services.gradle.org/distributions/gradle-2.1-rc-3-bin.zip", + "checksumUrl" : "https://services.gradle.org/distributions/gradle-2.1-rc-3-bin.zip.sha256" +}, { + "version" : "2.1-rc-2", + "buildTime" : "20140828023229+0000", + "current" : false, + "snapshot" : false, + "nightly" : false, + "releaseNightly" : false, + "activeRc" : false, + "rcFor" : "2.1", + "milestoneFor" : "", + "broken" : false, + "downloadUrl" : "https://services.gradle.org/distributions/gradle-2.1-rc-2-bin.zip", + "checksumUrl" : "https://services.gradle.org/distributions/gradle-2.1-rc-2-bin.zip.sha256" +}, { + "version" : "2.1-rc-1", + "buildTime" : "20140819194409+0000", + "current" : false, + "snapshot" : false, + "nightly" : false, + "releaseNightly" : false, + "activeRc" : false, + "rcFor" : "2.1", + "milestoneFor" : "", + "broken" : false, + "downloadUrl" : "https://services.gradle.org/distributions/gradle-2.1-rc-1-bin.zip", + "checksumUrl" : "https://services.gradle.org/distributions/gradle-2.1-rc-1-bin.zip.sha256" +}, { + "version" : "2.0", + "buildTime" : "20140701074534+0000", + "current" : false, + "snapshot" : false, + "nightly" : false, + "releaseNightly" : false, + "activeRc" : false, + "rcFor" : "", + "milestoneFor" : "", + "broken" : false, + "downloadUrl" : "https://services.gradle.org/distributions/gradle-2.0-bin.zip", + "checksumUrl" : "https://services.gradle.org/distributions/gradle-2.0-bin.zip.sha256", + "wrapperChecksumUrl" : "https://services.gradle.org/distributions/gradle-2.0-wrapper.jar.sha256" +}, { + "version" : "2.0-rc-2", + "buildTime" : "20140623080236+0000", + "current" : false, + "snapshot" : false, + "nightly" : false, + "releaseNightly" : false, + "activeRc" : false, + "rcFor" : "2.0", + "milestoneFor" : "", + "broken" : false, + "downloadUrl" : "https://services.gradle.org/distributions/gradle-2.0-rc-2-bin.zip", + "checksumUrl" : "https://services.gradle.org/distributions/gradle-2.0-rc-2-bin.zip.sha256" +}, { + "version" : "2.0-rc-1", + "buildTime" : "20140606070241+0000", + "current" : false, + "snapshot" : false, + "nightly" : false, + "releaseNightly" : false, + "activeRc" : false, + "rcFor" : "2.0", + "milestoneFor" : "", + "broken" : false, + "downloadUrl" : "https://services.gradle.org/distributions/gradle-2.0-rc-1-bin.zip", + "checksumUrl" : "https://services.gradle.org/distributions/gradle-2.0-rc-1-bin.zip.sha256" +}, { + "version" : "1.12", + "buildTime" : "20140429092431+0000", + "current" : false, + "snapshot" : false, + "nightly" : false, + "releaseNightly" : false, + "activeRc" : false, + "rcFor" : "", + "milestoneFor" : "", + "broken" : false, + "downloadUrl" : "https://services.gradle.org/distributions/gradle-1.12-bin.zip", + "checksumUrl" : "https://services.gradle.org/distributions/gradle-1.12-bin.zip.sha256", + "wrapperChecksumUrl" : "https://services.gradle.org/distributions/gradle-1.12-wrapper.jar.sha256" +}, { + "version" : "1.12-rc-2", + "buildTime" : "20140423112055+0000", + "current" : false, + "snapshot" : false, + "nightly" : false, + "releaseNightly" : false, + "activeRc" : false, + "rcFor" : "1.12", + "milestoneFor" : "", + "broken" : false, + "downloadUrl" : "https://services.gradle.org/distributions/gradle-1.12-rc-2-bin.zip", + "checksumUrl" : "https://services.gradle.org/distributions/gradle-1.12-rc-2-bin.zip.sha256" +}, { + "version" : "1.12-rc-1", + "buildTime" : "20140416084626+0000", + "current" : false, + "snapshot" : false, + "nightly" : false, + "releaseNightly" : false, + "activeRc" : false, + "rcFor" : "1.12", + "milestoneFor" : "", + "broken" : false, + "downloadUrl" : "https://services.gradle.org/distributions/gradle-1.12-rc-1-bin.zip", + "checksumUrl" : "https://services.gradle.org/distributions/gradle-1.12-rc-1-bin.zip.sha256" +}, { + "version" : "1.11", + "buildTime" : "20140211113439+0000", + "current" : false, + "snapshot" : false, + "nightly" : false, + "releaseNightly" : false, + "activeRc" : false, + "rcFor" : "", + "milestoneFor" : "", + "broken" : false, + "downloadUrl" : "https://services.gradle.org/distributions/gradle-1.11-bin.zip", + "checksumUrl" : "https://services.gradle.org/distributions/gradle-1.11-bin.zip.sha256", + "wrapperChecksumUrl" : "https://services.gradle.org/distributions/gradle-1.11-wrapper.jar.sha256" +}, { + "version" : "1.11-rc-1", + "buildTime" : "20140131033453+0000", + "current" : false, + "snapshot" : false, + "nightly" : false, + "releaseNightly" : false, + "activeRc" : false, + "rcFor" : "1.11", + "milestoneFor" : "", + "broken" : false, + "downloadUrl" : "https://services.gradle.org/distributions/gradle-1.11-rc-1-bin.zip", + "checksumUrl" : "https://services.gradle.org/distributions/gradle-1.11-rc-1-bin.zip.sha256" +}, { + "version" : "1.10", + "buildTime" : "20131217092815+0000", + "current" : false, + "snapshot" : false, + "nightly" : false, + "releaseNightly" : false, + "activeRc" : false, + "rcFor" : "", + "milestoneFor" : "", + "broken" : false, + "downloadUrl" : "https://services.gradle.org/distributions/gradle-1.10-bin.zip", + "checksumUrl" : "https://services.gradle.org/distributions/gradle-1.10-bin.zip.sha256", + "wrapperChecksumUrl" : "https://services.gradle.org/distributions/gradle-1.10-wrapper.jar.sha256" +}, { + "version" : "1.10-rc-2", + "buildTime" : "20131211105454+0000", + "current" : false, + "snapshot" : false, + "nightly" : false, + "releaseNightly" : false, + "activeRc" : false, + "rcFor" : "1.10", + "milestoneFor" : "", + "broken" : false, + "downloadUrl" : "https://services.gradle.org/distributions/gradle-1.10-rc-2-bin.zip", + "checksumUrl" : "https://services.gradle.org/distributions/gradle-1.10-rc-2-bin.zip.sha256" +}, { + "version" : "1.10-rc-1", + "buildTime" : "20131204154128+0000", + "current" : false, + "snapshot" : false, + "nightly" : false, + "releaseNightly" : false, + "activeRc" : false, + "rcFor" : "1.10", + "milestoneFor" : "", + "broken" : false, + "downloadUrl" : "https://services.gradle.org/distributions/gradle-1.10-rc-1-bin.zip", + "checksumUrl" : "https://services.gradle.org/distributions/gradle-1.10-rc-1-bin.zip.sha256" +}, { + "version" : "1.9", + "buildTime" : "20131119082002+0000", + "current" : false, + "snapshot" : false, + "nightly" : false, + "releaseNightly" : false, + "activeRc" : false, + "rcFor" : "", + "milestoneFor" : "", + "broken" : false, + "downloadUrl" : "https://services.gradle.org/distributions/gradle-1.9-bin.zip", + "checksumUrl" : "https://services.gradle.org/distributions/gradle-1.9-bin.zip.sha256", + "wrapperChecksumUrl" : "https://services.gradle.org/distributions/gradle-1.9-wrapper.jar.sha256" +}, { + "version" : "1.9-rc-4", + "buildTime" : "20131118093242+0000", + "current" : false, + "snapshot" : false, + "nightly" : false, + "releaseNightly" : false, + "activeRc" : false, + "rcFor" : "1.9", + "milestoneFor" : "", + "broken" : false, + "downloadUrl" : "https://services.gradle.org/distributions/gradle-1.9-rc-4-bin.zip", + "checksumUrl" : "https://services.gradle.org/distributions/gradle-1.9-rc-4-bin.zip.sha256" +}, { + "version" : "1.9-rc-3", + "buildTime" : "20131107122642+0000", + "current" : false, + "snapshot" : false, + "nightly" : false, + "releaseNightly" : false, + "activeRc" : false, + "rcFor" : "1.9", + "milestoneFor" : "", + "broken" : false, + "downloadUrl" : "https://services.gradle.org/distributions/gradle-1.9-rc-3-bin.zip", + "checksumUrl" : "https://services.gradle.org/distributions/gradle-1.9-rc-3-bin.zip.sha256" +}, { + "version" : "1.9-rc-2", + "buildTime" : "20131028093320+0000", + "current" : false, + "snapshot" : false, + "nightly" : false, + "releaseNightly" : false, + "activeRc" : false, + "rcFor" : "1.9", + "milestoneFor" : "", + "broken" : false, + "downloadUrl" : "https://services.gradle.org/distributions/gradle-1.9-rc-2-bin.zip", + "checksumUrl" : "https://services.gradle.org/distributions/gradle-1.9-rc-2-bin.zip.sha256" +}, { + "version" : "1.9-rc-1", + "buildTime" : "20131023094618+0000", + "current" : false, + "snapshot" : false, + "nightly" : false, + "releaseNightly" : false, + "activeRc" : false, + "rcFor" : "1.9", + "milestoneFor" : "", + "broken" : false, + "downloadUrl" : "https://services.gradle.org/distributions/gradle-1.9-rc-1-bin.zip", + "checksumUrl" : "https://services.gradle.org/distributions/gradle-1.9-rc-1-bin.zip.sha256" +}, { + "version" : "1.8", + "buildTime" : "20130924073233+0000", + "current" : false, + "snapshot" : false, + "nightly" : false, + "releaseNightly" : false, + "activeRc" : false, + "rcFor" : "", + "milestoneFor" : "", + "broken" : false, + "downloadUrl" : "https://services.gradle.org/distributions/gradle-1.8-bin.zip", + "checksumUrl" : "https://services.gradle.org/distributions/gradle-1.8-bin.zip.sha256", + "wrapperChecksumUrl" : "https://services.gradle.org/distributions/gradle-1.8-wrapper.jar.sha256" +}, { + "version" : "1.8-rc-2", + "buildTime" : "20130919053314+0000", + "current" : false, + "snapshot" : false, + "nightly" : false, + "releaseNightly" : false, + "activeRc" : false, + "rcFor" : "1.8", + "milestoneFor" : "", + "broken" : false, + "downloadUrl" : "https://services.gradle.org/distributions/gradle-1.8-rc-2-bin.zip", + "checksumUrl" : "https://services.gradle.org/distributions/gradle-1.8-rc-2-bin.zip.sha256" +}, { + "version" : "1.8-rc-1", + "buildTime" : "20130910130452+0000", + "current" : false, + "snapshot" : false, + "nightly" : false, + "releaseNightly" : false, + "activeRc" : false, + "rcFor" : "1.8", + "milestoneFor" : "", + "broken" : false, + "downloadUrl" : "https://services.gradle.org/distributions/gradle-1.8-rc-1-bin.zip", + "checksumUrl" : "https://services.gradle.org/distributions/gradle-1.8-rc-1-bin.zip.sha256" +}, { + "version" : "1.7", + "buildTime" : "20130806111956+0000", + "current" : false, + "snapshot" : false, + "nightly" : false, + "releaseNightly" : false, + "activeRc" : false, + "rcFor" : "", + "milestoneFor" : "", + "broken" : false, + "downloadUrl" : "https://services.gradle.org/distributions/gradle-1.7-bin.zip", + "checksumUrl" : "https://services.gradle.org/distributions/gradle-1.7-bin.zip.sha256", + "wrapperChecksumUrl" : "https://services.gradle.org/distributions/gradle-1.7-wrapper.jar.sha256" +}, { + "version" : "1.7-rc-2", + "buildTime" : "20130729120421+0000", + "current" : false, + "snapshot" : false, + "nightly" : false, + "releaseNightly" : false, + "activeRc" : false, + "rcFor" : "1.7", + "milestoneFor" : "", + "broken" : false, + "downloadUrl" : "https://services.gradle.org/distributions/gradle-1.7-rc-2-bin.zip", + "checksumUrl" : "https://services.gradle.org/distributions/gradle-1.7-rc-2-bin.zip.sha256" +}, { + "version" : "1.7-rc-1", + "buildTime" : "20130702145630+0000", + "current" : false, + "snapshot" : false, + "nightly" : false, + "releaseNightly" : false, + "activeRc" : false, + "rcFor" : "1.7", + "milestoneFor" : "", + "broken" : false, + "downloadUrl" : "https://services.gradle.org/distributions/gradle-1.7-rc-1-bin.zip", + "checksumUrl" : "https://services.gradle.org/distributions/gradle-1.7-rc-1-bin.zip.sha256" +}, { + "version" : "1.6", + "buildTime" : "20130507091214+0000", + "current" : false, + "snapshot" : false, + "nightly" : false, + "releaseNightly" : false, + "activeRc" : false, + "rcFor" : "", + "milestoneFor" : "", + "broken" : false, + "downloadUrl" : "https://services.gradle.org/distributions/gradle-1.6-bin.zip", + "checksumUrl" : "https://services.gradle.org/distributions/gradle-1.6-bin.zip.sha256", + "wrapperChecksumUrl" : "https://services.gradle.org/distributions/gradle-1.6-wrapper.jar.sha256" +}, { + "version" : "1.6-rc-1", + "buildTime" : "20130430131900+0000", + "current" : false, + "snapshot" : false, + "nightly" : false, + "releaseNightly" : false, + "activeRc" : false, + "rcFor" : "1.6", + "milestoneFor" : "", + "broken" : false, + "downloadUrl" : "https://services.gradle.org/distributions/gradle-1.6-rc-1-bin.zip", + "checksumUrl" : "https://services.gradle.org/distributions/gradle-1.6-rc-1-bin.zip.sha256" +}, { + "version" : "1.5", + "buildTime" : "20130327140935+0000", + "current" : false, + "snapshot" : false, + "nightly" : false, + "releaseNightly" : false, + "activeRc" : false, + "rcFor" : "", + "milestoneFor" : "", + "broken" : false, + "downloadUrl" : "https://services.gradle.org/distributions/gradle-1.5-bin.zip", + "checksumUrl" : "https://services.gradle.org/distributions/gradle-1.5-bin.zip.sha256", + "wrapperChecksumUrl" : "https://services.gradle.org/distributions/gradle-1.5-wrapper.jar.sha256" +}, { + "version" : "1.5-rc-3", + "buildTime" : "20130321155709+0000", + "current" : false, + "snapshot" : false, + "nightly" : false, + "releaseNightly" : false, + "activeRc" : false, + "rcFor" : "1.5", + "milestoneFor" : "", + "broken" : false, + "downloadUrl" : "https://services.gradle.org/distributions/gradle-1.5-rc-3-bin.zip", + "checksumUrl" : "https://services.gradle.org/distributions/gradle-1.5-rc-3-bin.zip.sha256" +}, { + "version" : "1.5-rc-2", + "buildTime" : "20130317011516+0000", + "current" : false, + "snapshot" : false, + "nightly" : false, + "releaseNightly" : false, + "activeRc" : false, + "rcFor" : "1.5", + "milestoneFor" : "", + "broken" : false, + "downloadUrl" : "https://services.gradle.org/distributions/gradle-1.5-rc-2-bin.zip", + "checksumUrl" : "https://services.gradle.org/distributions/gradle-1.5-rc-2-bin.zip.sha256" +}, { + "version" : "1.5-rc-1", + "buildTime" : "20130311120320+0000", + "current" : false, + "snapshot" : false, + "nightly" : false, + "releaseNightly" : false, + "activeRc" : false, + "rcFor" : "1.5", + "milestoneFor" : "", + "broken" : false, + "downloadUrl" : "https://services.gradle.org/distributions/gradle-1.5-rc-1-bin.zip", + "checksumUrl" : "https://services.gradle.org/distributions/gradle-1.5-rc-1-bin.zip.sha256" +}, { + "version" : "1.4", + "buildTime" : "20130128034246+0000", + "current" : false, + "snapshot" : false, + "nightly" : false, + "releaseNightly" : false, + "activeRc" : false, + "rcFor" : "", + "milestoneFor" : "", + "broken" : false, + "downloadUrl" : "https://services.gradle.org/distributions/gradle-1.4-bin.zip", + "checksumUrl" : "https://services.gradle.org/distributions/gradle-1.4-bin.zip.sha256", + "wrapperChecksumUrl" : "https://services.gradle.org/distributions/gradle-1.4-wrapper.jar.sha256" +}, { + "version" : "1.4-rc-3", + "buildTime" : "20130125035146+0000", + "current" : false, + "snapshot" : false, + "nightly" : false, + "releaseNightly" : false, + "activeRc" : false, + "rcFor" : "1.4", + "milestoneFor" : "", + "broken" : false, + "downloadUrl" : "https://services.gradle.org/distributions/gradle-1.4-rc-3-bin.zip", + "checksumUrl" : "https://services.gradle.org/distributions/gradle-1.4-rc-3-bin.zip.sha256" +}, { + "version" : "1.4-rc-2", + "buildTime" : "20130122030632+0000", + "current" : false, + "snapshot" : false, + "nightly" : false, + "releaseNightly" : false, + "activeRc" : false, + "rcFor" : "1.4", + "milestoneFor" : "", + "broken" : false, + "downloadUrl" : "https://services.gradle.org/distributions/gradle-1.4-rc-2-bin.zip", + "checksumUrl" : "https://services.gradle.org/distributions/gradle-1.4-rc-2-bin.zip.sha256" +}, { + "version" : "1.4-rc-1", + "buildTime" : "20130117001257+0000", + "current" : false, + "snapshot" : false, + "nightly" : false, + "releaseNightly" : false, + "activeRc" : false, + "rcFor" : "1.4", + "milestoneFor" : "", + "broken" : false, + "downloadUrl" : "https://services.gradle.org/distributions/gradle-1.4-rc-1-bin.zip", + "checksumUrl" : "https://services.gradle.org/distributions/gradle-1.4-rc-1-bin.zip.sha256" +}, { + "version" : "1.3", + "buildTime" : "20121120113738+0000", + "current" : false, + "snapshot" : false, + "nightly" : false, + "releaseNightly" : false, + "activeRc" : false, + "rcFor" : "", + "milestoneFor" : "", + "broken" : false, + "downloadUrl" : "https://services.gradle.org/distributions/gradle-1.3-bin.zip", + "checksumUrl" : "https://services.gradle.org/distributions/gradle-1.3-bin.zip.sha256", + "wrapperChecksumUrl" : "https://services.gradle.org/distributions/gradle-1.3-wrapper.jar.sha256" +}, { + "version" : "1.3-rc-2", + "buildTime" : "20121115155343+0000", + "current" : false, + "snapshot" : false, + "nightly" : false, + "releaseNightly" : false, + "activeRc" : false, + "rcFor" : "1.3", + "milestoneFor" : "", + "broken" : false, + "downloadUrl" : "https://services.gradle.org/distributions/gradle-1.3-rc-2-bin.zip", + "checksumUrl" : "https://services.gradle.org/distributions/gradle-1.3-rc-2-bin.zip.sha256" +}, { + "version" : "1.3-rc-1", + "buildTime" : "20121112135252+0000", + "current" : false, + "snapshot" : false, + "nightly" : false, + "releaseNightly" : false, + "activeRc" : false, + "rcFor" : "1.3", + "milestoneFor" : "", + "broken" : false, + "downloadUrl" : "https://services.gradle.org/distributions/gradle-1.3-rc-1-bin.zip", + "checksumUrl" : "https://services.gradle.org/distributions/gradle-1.3-rc-1-bin.zip.sha256" +}, { + "version" : "1.2", + "buildTime" : "20120912104602+0000", + "current" : false, + "snapshot" : false, + "nightly" : false, + "releaseNightly" : false, + "activeRc" : false, + "rcFor" : "", + "milestoneFor" : "", + "broken" : false, + "downloadUrl" : "https://services.gradle.org/distributions/gradle-1.2-bin.zip", + "checksumUrl" : "https://services.gradle.org/distributions/gradle-1.2-bin.zip.sha256", + "wrapperChecksumUrl" : "https://services.gradle.org/distributions/gradle-1.2-wrapper.jar.sha256" +}, { + "version" : "1.2-rc-1", + "buildTime" : "20120904174954+0000", + "current" : false, + "snapshot" : false, + "nightly" : false, + "releaseNightly" : false, + "activeRc" : false, + "rcFor" : "1.2", + "milestoneFor" : "", + "broken" : false, + "downloadUrl" : "https://services.gradle.org/distributions/gradle-1.2-rc-1-bin.zip", + "checksumUrl" : "https://services.gradle.org/distributions/gradle-1.2-rc-1-bin.zip.sha256" +}, { + "version" : "1.1", + "buildTime" : "20120731132432+0000", + "current" : false, + "snapshot" : false, + "nightly" : false, + "releaseNightly" : false, + "activeRc" : false, + "rcFor" : "", + "milestoneFor" : "", + "broken" : false, + "downloadUrl" : "https://services.gradle.org/distributions/gradle-1.1-bin.zip", + "checksumUrl" : "https://services.gradle.org/distributions/gradle-1.1-bin.zip.sha256", + "wrapperChecksumUrl" : "https://services.gradle.org/distributions/gradle-1.1-wrapper.jar.sha256" +}, { + "version" : "1.1-rc-2", + "buildTime" : "20120726075103+0000", + "current" : false, + "snapshot" : false, + "nightly" : false, + "releaseNightly" : false, + "activeRc" : false, + "rcFor" : "1.1", + "milestoneFor" : "", + "broken" : false, + "downloadUrl" : "https://services.gradle.org/distributions/gradle-1.1-rc-2-bin.zip", + "checksumUrl" : "https://services.gradle.org/distributions/gradle-1.1-rc-2-bin.zip.sha256" +}, { + "version" : "1.1-rc-1", + "buildTime" : "20120724134404+0000", + "current" : false, + "snapshot" : false, + "nightly" : false, + "releaseNightly" : false, + "activeRc" : false, + "rcFor" : "1.1", + "milestoneFor" : "", + "broken" : false, + "downloadUrl" : "https://services.gradle.org/distributions/gradle-1.1-rc-1-bin.zip", + "checksumUrl" : "https://services.gradle.org/distributions/gradle-1.1-rc-1-bin.zip.sha256" +}, { + "version" : "1.0", + "buildTime" : "20120612025621+0200", + "current" : false, + "snapshot" : false, + "nightly" : false, + "releaseNightly" : false, + "activeRc" : false, + "rcFor" : "", + "milestoneFor" : "", + "broken" : false, + "downloadUrl" : "https://services.gradle.org/distributions/gradle-1.0-bin.zip", + "checksumUrl" : "https://services.gradle.org/distributions/gradle-1.0-bin.zip.sha256", + "wrapperChecksumUrl" : "https://services.gradle.org/distributions/gradle-1.0-wrapper.jar.sha256" +}, { + "version" : "1.0-rc-3", + "buildTime" : "20120430015152+0200", + "current" : false, + "snapshot" : false, + "nightly" : false, + "releaseNightly" : false, + "activeRc" : false, + "rcFor" : "1.0", + "milestoneFor" : "", + "broken" : false, + "downloadUrl" : "https://services.gradle.org/distributions/gradle-1.0-rc-3-bin.zip", + "checksumUrl" : "https://services.gradle.org/distributions/gradle-1.0-rc-3-bin.zip.sha256" +}, { + "version" : "1.0-rc-2", + "buildTime" : "20120425015237+0200", + "current" : false, + "snapshot" : false, + "nightly" : false, + "releaseNightly" : false, + "activeRc" : false, + "rcFor" : "1.0", + "milestoneFor" : "", + "broken" : false, + "downloadUrl" : "https://services.gradle.org/distributions/gradle-1.0-rc-2-bin.zip", + "checksumUrl" : "https://services.gradle.org/distributions/gradle-1.0-rc-2-bin.zip.sha256" +}, { + "version" : "1.0-rc-1", + "buildTime" : "20120411121324+0100", + "current" : false, + "snapshot" : false, + "nightly" : false, + "releaseNightly" : false, + "activeRc" : false, + "rcFor" : "1.0", + "milestoneFor" : "", + "broken" : false, + "downloadUrl" : "https://services.gradle.org/distributions/gradle-1.0-rc-1-bin.zip", + "checksumUrl" : "https://services.gradle.org/distributions/gradle-1.0-rc-1-bin.zip.sha256" +}, { + "version" : "1.0-milestone-9", + "buildTime" : "20120313171009+0100", + "current" : false, + "snapshot" : false, + "nightly" : false, + "releaseNightly" : false, + "activeRc" : false, + "rcFor" : "", + "milestoneFor" : "", + "broken" : false, + "downloadUrl" : "https://services.gradle.org/distributions/gradle-1.0-milestone-9-bin.zip", + "checksumUrl" : "https://services.gradle.org/distributions/gradle-1.0-milestone-9-bin.zip.sha256" +}, { + "version" : "1.0-milestone-8a", + "buildTime" : "20120220185357+0100", + "current" : false, + "snapshot" : false, + "nightly" : false, + "releaseNightly" : false, + "activeRc" : false, + "rcFor" : "", + "milestoneFor" : "", + "broken" : false, + "downloadUrl" : "https://services.gradle.org/distributions/gradle-1.0-milestone-8a-bin.zip", + "checksumUrl" : "https://services.gradle.org/distributions/gradle-1.0-milestone-8a-bin.zip.sha256" +}, { + "version" : "1.0-milestone-8", + "buildTime" : "20120214022451+0100", + "current" : false, + "snapshot" : false, + "nightly" : false, + "releaseNightly" : false, + "activeRc" : false, + "rcFor" : "", + "milestoneFor" : "", + "broken" : false, + "downloadUrl" : "https://services.gradle.org/distributions/gradle-1.0-milestone-8-bin.zip", + "checksumUrl" : "https://services.gradle.org/distributions/gradle-1.0-milestone-8-bin.zip.sha256" +}, { + "version" : "1.0-milestone-7", + "buildTime" : "20120105102443+0000", + "current" : false, + "snapshot" : false, + "nightly" : false, + "releaseNightly" : false, + "activeRc" : false, + "rcFor" : "", + "milestoneFor" : "", + "broken" : false, + "downloadUrl" : "https://services.gradle.org/distributions/gradle-1.0-milestone-7-bin.zip", + "checksumUrl" : "https://services.gradle.org/distributions/gradle-1.0-milestone-7-bin.zip.sha256" +}, { + "version" : "1.0-milestone-6", + "buildTime" : "20111117065412+0100", + "current" : false, + "snapshot" : false, + "nightly" : false, + "releaseNightly" : false, + "activeRc" : false, + "rcFor" : "", + "milestoneFor" : "", + "broken" : false, + "downloadUrl" : "https://services.gradle.org/distributions/gradle-1.0-milestone-6-bin.zip", + "checksumUrl" : "https://services.gradle.org/distributions/gradle-1.0-milestone-6-bin.zip.sha256" +}, { + "version" : "1.0-milestone-5", + "buildTime" : "20111025055608+0200", + "current" : false, + "snapshot" : false, + "nightly" : false, + "releaseNightly" : false, + "activeRc" : false, + "rcFor" : "", + "milestoneFor" : "", + "broken" : false, + "downloadUrl" : "https://services.gradle.org/distributions/gradle-1.0-milestone-5-bin.zip", + "checksumUrl" : "https://services.gradle.org/distributions/gradle-1.0-milestone-5-bin.zip.sha256" +}, { + "version" : "1.0-milestone-4", + "buildTime" : "20110728103822+0200", + "current" : false, + "snapshot" : false, + "nightly" : false, + "releaseNightly" : false, + "activeRc" : false, + "rcFor" : "", + "milestoneFor" : "", + "broken" : true, + "downloadUrl" : "https://services.gradle.org/distributions/gradle-1.0-milestone-4-bin.zip", + "checksumUrl" : "https://services.gradle.org/distributions/gradle-1.0-milestone-4-bin.zip.sha256" +}, { + "version" : "1.0-milestone-3", + "buildTime" : "20110425174011+1000", + "current" : false, + "snapshot" : false, + "nightly" : false, + "releaseNightly" : false, + "activeRc" : false, + "rcFor" : "", + "milestoneFor" : "", + "broken" : false, + "downloadUrl" : "https://services.gradle.org/distributions/gradle-1.0-milestone-3-bin.zip", + "checksumUrl" : "https://services.gradle.org/distributions/gradle-1.0-milestone-3-bin.zip.sha256" +}, { + "version" : "1.0-milestone-2", + "buildTime" : "20110407163255+1000", + "current" : false, + "snapshot" : false, + "nightly" : false, + "releaseNightly" : false, + "activeRc" : false, + "rcFor" : "", + "milestoneFor" : "", + "broken" : false, + "downloadUrl" : "https://services.gradle.org/distributions/gradle-1.0-milestone-2-bin.zip", + "checksumUrl" : "https://services.gradle.org/distributions/gradle-1.0-milestone-2-bin.zip.sha256" +}, { + "version" : "1.0-milestone-1", + "buildTime" : "20110227141320+1100", + "current" : false, + "snapshot" : false, + "nightly" : false, + "releaseNightly" : false, + "activeRc" : false, + "rcFor" : "", + "milestoneFor" : "", + "broken" : false, + "downloadUrl" : "https://services.gradle.org/distributions/gradle-1.0-milestone-1-bin.zip", + "checksumUrl" : "https://services.gradle.org/distributions/gradle-1.0-milestone-1-bin.zip.sha256" +}, { + "version" : "0.9.2", + "buildTime" : "20110123133421+1100", + "current" : false, + "snapshot" : false, + "nightly" : false, + "releaseNightly" : false, + "activeRc" : false, + "rcFor" : "", + "milestoneFor" : "", + "broken" : false, + "downloadUrl" : "https://services.gradle.org/distributions/gradle-0.9.2-bin.zip", + "checksumUrl" : "https://services.gradle.org/distributions/gradle-0.9.2-bin.zip.sha256" +}, { + "version" : "0.9.1", + "buildTime" : "20110102114057+1100", + "current" : false, + "snapshot" : false, + "nightly" : false, + "releaseNightly" : false, + "activeRc" : false, + "rcFor" : "", + "milestoneFor" : "", + "broken" : false, + "downloadUrl" : "https://services.gradle.org/distributions/gradle-0.9.1-bin.zip", + "checksumUrl" : "https://services.gradle.org/distributions/gradle-0.9.1-bin.zip.sha256" +}, { + "version" : "0.9", + "buildTime" : "20101219125006+1100", + "current" : false, + "snapshot" : false, + "nightly" : false, + "releaseNightly" : false, + "activeRc" : false, + "rcFor" : "", + "milestoneFor" : "", + "broken" : false, + "downloadUrl" : "https://services.gradle.org/distributions/gradle-0.9-bin.zip", + "checksumUrl" : "https://services.gradle.org/distributions/gradle-0.9-bin.zip.sha256" +}, { + "version" : "0.9-rc-3", + "buildTime" : "20101120131750+1100", + "current" : false, + "snapshot" : false, + "nightly" : false, + "releaseNightly" : false, + "activeRc" : false, + "rcFor" : "0.9", + "milestoneFor" : "", + "broken" : false, + "downloadUrl" : "https://services.gradle.org/distributions/gradle-0.9-rc-3-bin.zip", + "checksumUrl" : "https://services.gradle.org/distributions/gradle-0.9-rc-3-bin.zip.sha256" +}, { + "version" : "0.9-rc-2", + "buildTime" : "20101027082405+1100", + "current" : false, + "snapshot" : false, + "nightly" : false, + "releaseNightly" : false, + "activeRc" : false, + "rcFor" : "0.9", + "milestoneFor" : "", + "broken" : false, + "downloadUrl" : "https://services.gradle.org/distributions/gradle-0.9-rc-2-bin.zip", + "checksumUrl" : "https://services.gradle.org/distributions/gradle-0.9-rc-2-bin.zip.sha256" +}, { + "version" : "0.9-rc-1", + "buildTime" : "20100804080433+1100", + "current" : false, + "snapshot" : false, + "nightly" : false, + "releaseNightly" : false, + "activeRc" : false, + "rcFor" : "0.9", + "milestoneFor" : "", + "broken" : false, + "downloadUrl" : "https://services.gradle.org/distributions/gradle-0.9-rc-1-bin.zip", + "checksumUrl" : "https://services.gradle.org/distributions/gradle-0.9-rc-1-bin.zip.sha256" +}, { + "version" : "0.8", + "buildTime" : "20090928140159+0200", + "current" : false, + "snapshot" : false, + "nightly" : false, + "releaseNightly" : false, + "activeRc" : false, + "rcFor" : "", + "milestoneFor" : "", + "broken" : false, + "downloadUrl" : "https://services.gradle.org/distributions/gradle-0.8-bin.zip", + "checksumUrl" : "https://services.gradle.org/distributions/gradle-0.8-bin.zip.sha256" +}, { + "version" : "0.7", + "buildTime" : "20090720085013+0200", + "current" : false, + "snapshot" : false, + "nightly" : false, + "releaseNightly" : false, + "activeRc" : false, + "rcFor" : "", + "milestoneFor" : "", + "broken" : false, + "downloadUrl" : "https://services.gradle.org/distributions/gradle-0.7-bin.zip", + "checksumUrl" : "https://services.gradle.org/distributions/gradle-0.7-bin.zip.sha256" +} ] \ No newline at end of file diff --git a/.metadata/.plugins/org.eclipse.core.resources/.projects/.org.eclipse.egit.core.cmp/.location b/.metadata/.plugins/org.eclipse.core.resources/.projects/.org.eclipse.egit.core.cmp/.location new file mode 100644 index 0000000..c6266f1 Binary files /dev/null and b/.metadata/.plugins/org.eclipse.core.resources/.projects/.org.eclipse.egit.core.cmp/.location differ diff --git a/.metadata/.plugins/org.eclipse.core.resources/.root/.indexes/history.version b/.metadata/.plugins/org.eclipse.core.resources/.root/.indexes/history.version new file mode 100644 index 0000000..25cb955 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.root/.indexes/history.version @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/.metadata/.plugins/org.eclipse.core.resources/.root/.indexes/properties.index b/.metadata/.plugins/org.eclipse.core.resources/.root/.indexes/properties.index new file mode 100644 index 0000000..d237251 Binary files /dev/null and b/.metadata/.plugins/org.eclipse.core.resources/.root/.indexes/properties.index differ diff --git a/.metadata/.plugins/org.eclipse.core.resources/.root/.indexes/properties.version b/.metadata/.plugins/org.eclipse.core.resources/.root/.indexes/properties.version new file mode 100644 index 0000000..6b2aaa7 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.root/.indexes/properties.version @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/.metadata/.plugins/org.eclipse.core.resources/.root/1.tree b/.metadata/.plugins/org.eclipse.core.resources/.root/1.tree new file mode 100644 index 0000000..dc3f5fe Binary files /dev/null and b/.metadata/.plugins/org.eclipse.core.resources/.root/1.tree differ diff --git a/.metadata/.plugins/org.eclipse.core.resources/.safetable/org.eclipse.core.resources b/.metadata/.plugins/org.eclipse.core.resources/.safetable/org.eclipse.core.resources new file mode 100644 index 0000000..8d6a544 Binary files /dev/null and b/.metadata/.plugins/org.eclipse.core.resources/.safetable/org.eclipse.core.resources differ diff --git a/.metadata/.plugins/org.eclipse.e4.workbench/workbench.xmi b/.metadata/.plugins/org.eclipse.e4.workbench/workbench.xmi new file mode 100644 index 0000000..2f14ba2 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.e4.workbench/workbench.xmi @@ -0,0 +1,2620 @@ + + + + activeSchemeId:org.eclipse.ui.defaultAcceleratorConfiguration + + + + + + + + topLevel + + + + + persp.actionSet:org.eclipse.mylyn.tasks.ui.navigation + persp.actionSet:org.eclipse.ui.cheatsheets.actionSet + persp.actionSet:org.eclipse.search.searchActionSet + persp.actionSet:org.eclipse.text.quicksearch.actionSet + persp.actionSet:org.eclipse.ui.edit.text.actionSet.annotationNavigation + persp.actionSet:org.eclipse.ui.edit.text.actionSet.navigation + persp.actionSet:org.eclipse.ui.edit.text.actionSet.convertLineDelimitersTo + persp.actionSet:org.eclipse.ui.externaltools.ExternalToolsSet + persp.actionSet:org.eclipse.ui.actionSet.keyBindings + persp.actionSet:org.eclipse.ui.actionSet.openFiles + persp.actionSet:org.springsource.ide.eclipse.commons.launch.actionSet + persp.actionSet:org.eclipse.debug.ui.launchActionSet + persp.actionSet:org.eclipse.jdt.ui.JavaActionSet + persp.actionSet:org.eclipse.jdt.ui.JavaElementCreationActionSet + persp.actionSet:org.eclipse.ui.NavigateActionSet + persp.viewSC:org.eclipse.jdt.ui.PackageExplorer + persp.viewSC:org.eclipse.jdt.ui.TypeHierarchy + persp.viewSC:org.eclipse.jdt.ui.SourceView + persp.viewSC:org.eclipse.jdt.ui.JavadocView + persp.viewSC:org.eclipse.search.ui.views.SearchView + persp.viewSC:org.eclipse.ui.console.ConsoleView + persp.viewSC:org.eclipse.ui.views.ContentOutline + persp.viewSC:org.eclipse.ui.views.ProblemView + persp.viewSC:org.eclipse.ui.views.TaskList + persp.viewSC:org.eclipse.ui.views.ProgressView + persp.viewSC:org.eclipse.ui.navigator.ProjectExplorer + persp.viewSC:org.eclipse.ui.texteditor.TemplatesView + persp.viewSC:org.eclipse.pde.runtime.LogView + persp.newWizSC:org.eclipse.jdt.ui.wizards.JavaProjectWizard + persp.newWizSC:org.eclipse.jdt.ui.wizards.NewPackageCreationWizard + persp.newWizSC:org.eclipse.jdt.ui.wizards.NewClassCreationWizard + persp.newWizSC:org.eclipse.jdt.ui.wizards.NewInterfaceCreationWizard + persp.newWizSC:org.eclipse.jdt.ui.wizards.NewEnumCreationWizard + persp.newWizSC:org.eclipse.jdt.ui.wizards.NewRecordCreationWizard + persp.newWizSC:org.eclipse.jdt.ui.wizards.NewAnnotationCreationWizard + persp.newWizSC:org.eclipse.jdt.ui.wizards.NewSourceFolderCreationWizard + persp.newWizSC:org.eclipse.jdt.ui.wizards.NewSnippetFileCreationWizard + persp.newWizSC:org.eclipse.jdt.ui.wizards.NewJavaWorkingSetWizard + persp.newWizSC:org.eclipse.ui.wizards.new.folder + persp.newWizSC:org.eclipse.ui.wizards.new.file + persp.newWizSC:org.eclipse.ui.editors.wizards.UntitledTextFileWizard + persp.perspSC:org.eclipse.jdt.ui.JavaBrowsingPerspective + persp.perspSC:org.eclipse.debug.ui.DebugPerspective + persp.editorOnboardingImageUri:platform:/plugin/org.eclipse.jdt.ui/$nl$/icons/full/onboarding_jperspective.png + persp.editorOnboardingText:Open a file or drop files here to open them. + persp.showIn:org.eclipse.jdt.ui.PackageExplorer + persp.showIn:org.eclipse.team.ui.GenericHistoryView + persp.showIn:org.eclipse.ui.navigator.ProjectExplorer + persp.editorOnboardingCommand:Find Actions$$$Ctrl+3 + persp.editorOnboardingCommand:Show Key Assist$$$Ctrl+Shift+L + persp.editorOnboardingCommand:New$$$Ctrl+N + persp.editorOnboardingCommand:Open Type$$$Ctrl+Shift+T + persp.viewSC:org.eclipse.mylyn.tasks.ui.views.tasks + persp.newWizSC:org.eclipse.mylyn.tasks.ui.wizards.new.repository.task + persp.actionSet:org.eclipse.debug.ui.breakpointActionSet + persp.actionSet:org.eclipse.jdt.debug.ui.JDTDebugActionSet + persp.newWizSC:org.eclipse.jdt.junit.wizards.NewTestCaseCreationWizard + persp.actionSet:org.eclipse.jdt.junit.JUnitActionSet + persp.showIn:org.eclipse.egit.ui.RepositoriesView + persp.newWizSC:org.eclipse.m2e.core.wizards.Maven2ProjectWizard + persp.newWizSC:org.springsource.ide.eclipse.commons.gettingstarted.wizard.boot.NewSpringBootWizard + persp.newWizSC:org.springsource.ide.eclipse.gettingstarted.wizards.import.generic.newalias + persp.viewSC:org.eclipse.jdt.bcoview.views.BytecodeOutlineView + persp.viewSC:org.eclipse.tm.terminal.view.ui.TerminalsView + persp.showIn:org.eclipse.tm.terminal.view.ui.TerminalsView + persp.viewSC:org.eclipse.ant.ui.views.AntView + + + + + org.eclipse.e4.primaryNavigationStack + active + + View + categoryTag:Java + + + View + categoryTag:Java + + + View + categoryTag:General + + + View + categoryTag:Java + + + + + View + categoryTag:Other + + + + + + View + categoryTag:Git + + + + + + + + + + View + categoryTag:Mylyn + + + + org.eclipse.e4.secondaryNavigationStack + + View + categoryTag:General + + + View + categoryTag:General + + + View + categoryTag:General + + + View + categoryTag:Java + + + View + categoryTag:Ant + + + + + + org.eclipse.e4.secondaryDataStack + + View + categoryTag:General + + + View + categoryTag:Java + + + View + categoryTag:Java + + + View + categoryTag:General + + + View + categoryTag:General + + + View + categoryTag:General + + + View + categoryTag:General + + + View + categoryTag:Terminal + + + + + + + + + View + categoryTag:Help + + + View + categoryTag:General + + + View + categoryTag:Help + + + + + + + View + categoryTag:Help + + + + + View + categoryTag:General + + + + + View + categoryTag:Help + + + + EditorStack + org.eclipse.e4.primaryDataStack + + + + + + + View + categoryTag:Java + active + activeOnClose + + ViewMenu + menuContribution:menu + + + + + + + View + categoryTag:Java + + + + + View + categoryTag:General + + + + + + View + categoryTag:General + + ViewMenu + menuContribution:menu + + + + + + + View + categoryTag:Java + + + + + View + categoryTag:Java + + + + + View + categoryTag:General + + + + + View + categoryTag:General + + + + + View + categoryTag:General + + + + + View + categoryTag:General + + + + + + View + categoryTag:General + + ViewMenu + menuContribution:menu + + + + + + + View + categoryTag:General + + + + + View + categoryTag:General + + + + + + View + categoryTag:Mylyn + + ViewMenu + menuContribution:menu + + + + + + + View + categoryTag:Java + + + + + View + categoryTag:Git + + + + + View + categoryTag:Java + + + + + + View + categoryTag:Other + + ViewMenu + menuContribution:menu + + + + + + + View + categoryTag:Terminal + + + + + View + categoryTag:Ant + + + + toolbarSeparator + + + + Draggable + + + + toolbarSeparator + + + + Draggable + + + + + toolbarSeparator + + + + Draggable + + + Draggable + + + Draggable + + + toolbarSeparator + + + + Draggable + + + + toolbarSeparator + + + + toolbarSeparator + + + + Draggable + + + stretch + SHOW_RESTORE_MENU + + + Draggable + HIDEABLE + SHOW_RESTORE_MENU + + + + + stretch + + + Draggable + + + Draggable + + + + + + + + + + + + + + + + + + + + + + + + platform:win32 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + deleted + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + platform:win32 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Editor + removeOnHide + + + + + View + categoryTag:Ant + + + + + View + categoryTag:Gradle + + + + + View + categoryTag:Gradle + + + + + View + categoryTag:Debug + + + + + View + categoryTag:Debug + + + + + View + categoryTag:Debug + + + + + View + categoryTag:Debug + + + + + View + categoryTag:Debug + + + + + View + categoryTag:Debug + + + + + View + categoryTag:Debug + + + View + categoryTag:Debug + + + + + View + categoryTag:Git + + + + + View + categoryTag:Git + + + + + View + categoryTag:Git + + + + + View + categoryTag:Git + NoRestore + + + + + View + categoryTag:Git + + + + + View + categoryTag:Help + + + + + View + categoryTag:Java + + + + + View + categoryTag:Java + + + + + View + categoryTag:Debug + + + + + View + categoryTag:Java + + + + + View + categoryTag:Java + + + + + View + categoryTag:Java + + + + + View + categoryTag:Java Browsing + + + + + View + categoryTag:Java Browsing + + + + + View + categoryTag:Java Browsing + + + + + View + categoryTag:Java Browsing + + + + + View + categoryTag:Java + + + + + View + categoryTag:General + + + + + View + categoryTag:Java + + + + + View + categoryTag:Java + + + + + View + categoryTag:Docker + + + + + View + categoryTag:Docker + + + + + View + categoryTag:Docker + + + + + View + categoryTag:Docker + + + + + View + categoryTag:Language Servers + + + + + View + categoryTag:Language Servers + + + + + View + categoryTag:Language Servers + + + + + View + categoryTag:Maven + + + + + View + categoryTag:Maven + + + + + View + categoryTag:Maven + + + + + View + categoryTag:Mylyn + + + + + View + categoryTag:Mylyn + + + + + View + categoryTag:Mylyn + + + + + View + categoryTag:API Tools + + + + + View + categoryTag:OSGi + + + + + View + categoryTag:Plug-in Development + + + + + View + categoryTag:Plug-in Development + + + + + View + categoryTag:Plug-in Development + + + + + View + categoryTag:Plug-in Development + + + + + View + categoryTag:Plug-in Development + + + + + View + categoryTag:Plug-in Development + + + + + View + categoryTag:General + + + + + View + categoryTag:Version Control (Team) + + + + + View + categoryTag:Version Control (Team) + + + View + categoryTag:Help + + + + + View + categoryTag:Terminal + + + + + View + categoryTag:Other + + + + + View + categoryTag:General + + + + + View + categoryTag:General + + + + + View + categoryTag:Help + + + + + View + categoryTag:General + + + + + View + categoryTag:General + + + + + View + categoryTag:General + + + + + View + categoryTag:General + + + + + View + categoryTag:General + + + + + View + categoryTag:General + + + + + View + categoryTag:General + + + + + View + categoryTag:General + + + + + View + categoryTag:General + + + + + View + categoryTag:General + + + + + View + categoryTag:General + + + + + View + categoryTag:Debug + + + + + View + categoryTag:Server + + + + + View + categoryTag:Other + + + + + View + categoryTag:Other + + + + glue + move_after:PerspectiveSpacer + SHOW_RESTORE_MENU + + + move_after:Spacer Glue + HIDEABLE + SHOW_RESTORE_MENU + + + glue + move_after:SearchField + SHOW_RESTORE_MENU + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/.metadata/.plugins/org.eclipse.jdt.core/assumedExternalFilesCache b/.metadata/.plugins/org.eclipse.jdt.core/assumedExternalFilesCache new file mode 100644 index 0000000..593f470 Binary files /dev/null and b/.metadata/.plugins/org.eclipse.jdt.core/assumedExternalFilesCache differ diff --git a/.metadata/.plugins/org.eclipse.jdt.core/externalFilesCache b/.metadata/.plugins/org.eclipse.jdt.core/externalFilesCache new file mode 100644 index 0000000..593f470 Binary files /dev/null and b/.metadata/.plugins/org.eclipse.jdt.core/externalFilesCache differ diff --git a/.metadata/.plugins/org.eclipse.jdt.core/javaLikeNames.txt b/.metadata/.plugins/org.eclipse.jdt.core/javaLikeNames.txt new file mode 100644 index 0000000..8586397 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.jdt.core/javaLikeNames.txt @@ -0,0 +1 @@ +java \ No newline at end of file diff --git a/.metadata/.plugins/org.eclipse.jdt.core/nonChainingJarsCache b/.metadata/.plugins/org.eclipse.jdt.core/nonChainingJarsCache new file mode 100644 index 0000000..593f470 Binary files /dev/null and b/.metadata/.plugins/org.eclipse.jdt.core/nonChainingJarsCache differ diff --git a/.metadata/.plugins/org.eclipse.jdt.core/variablesAndContainers.dat b/.metadata/.plugins/org.eclipse.jdt.core/variablesAndContainers.dat new file mode 100644 index 0000000..3de398e Binary files /dev/null and b/.metadata/.plugins/org.eclipse.jdt.core/variablesAndContainers.dat differ diff --git a/.metadata/.plugins/org.eclipse.jdt.ui/OpenTypeHistory.xml b/.metadata/.plugins/org.eclipse.jdt.ui/OpenTypeHistory.xml new file mode 100644 index 0000000..a4ee3cb --- /dev/null +++ b/.metadata/.plugins/org.eclipse.jdt.ui/OpenTypeHistory.xml @@ -0,0 +1,2 @@ + + diff --git a/.metadata/.plugins/org.eclipse.jdt.ui/QualifiedTypeNameHistory.xml b/.metadata/.plugins/org.eclipse.jdt.ui/QualifiedTypeNameHistory.xml new file mode 100644 index 0000000..9e390f5 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.jdt.ui/QualifiedTypeNameHistory.xml @@ -0,0 +1,2 @@ + + diff --git a/.metadata/.plugins/org.eclipse.jdt.ui/dialog_settings.xml b/.metadata/.plugins/org.eclipse.jdt.ui/dialog_settings.xml new file mode 100644 index 0000000..9a7369c --- /dev/null +++ b/.metadata/.plugins/org.eclipse.jdt.ui/dialog_settings.xml @@ -0,0 +1,10 @@ + +
+
+ + + + + +
+
diff --git a/.metadata/.plugins/org.eclipse.m2e.core.ui/dialog_settings.xml b/.metadata/.plugins/org.eclipse.m2e.core.ui/dialog_settings.xml new file mode 100644 index 0000000..b8c2868 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.m2e.core.ui/dialog_settings.xml @@ -0,0 +1,15 @@ + +
+
+ + + + + + + + + + +
+
diff --git a/.metadata/.plugins/org.eclipse.m2e.core/workspaceState.ser b/.metadata/.plugins/org.eclipse.m2e.core/workspaceState.ser new file mode 100644 index 0000000..abbf8e5 Binary files /dev/null and b/.metadata/.plugins/org.eclipse.m2e.core/workspaceState.ser differ diff --git a/.metadata/.plugins/org.eclipse.m2e.logback/0.log b/.metadata/.plugins/org.eclipse.m2e.logback/0.log new file mode 100644 index 0000000..8005d2d --- /dev/null +++ b/.metadata/.plugins/org.eclipse.m2e.logback/0.log @@ -0,0 +1 @@ +2025-01-23 15:22:51,288 [Worker-2: Loading available Gradle versions] INFO o.e.b.c.i.u.g.PublishedGradleVersions - Gradle version information cache is not available. Remote download required. diff --git a/.metadata/.plugins/org.eclipse.m2e.logback/logback.2.7.0.20241001-1350.xml b/.metadata/.plugins/org.eclipse.m2e.logback/logback.2.7.0.20241001-1350.xml new file mode 100644 index 0000000..9effde7 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.m2e.logback/logback.2.7.0.20241001-1350.xml @@ -0,0 +1,41 @@ + + + + %date [%thread] %-5level %logger{35} - %msg%n + + + ${org.eclipse.m2e.log.console.threshold:-OFF} + + + + + ${org.eclipse.m2e.log.dir}/0.log + + ${org.eclipse.m2e.log.dir}/%i.log + 1 + 10 + + + 10MB + + + %date [%thread] %-5level %logger{35} - %msg%n + + + + + + WARN + + + + + + + + + + + + + diff --git a/.metadata/.plugins/org.eclipse.pde.core/.cache/clean-cache.properties b/.metadata/.plugins/org.eclipse.pde.core/.cache/clean-cache.properties new file mode 100644 index 0000000..db4d547 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.pde.core/.cache/clean-cache.properties @@ -0,0 +1,2 @@ +#Cached timestamps +#Thu Jan 23 15:23:11 IST 2025 diff --git a/.metadata/.plugins/org.eclipse.tips.ide/dialog_settings.xml b/.metadata/.plugins/org.eclipse.tips.ide/dialog_settings.xml new file mode 100644 index 0000000..5ca0b77 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.tips.ide/dialog_settings.xml @@ -0,0 +1,3 @@ + +
+
diff --git a/.metadata/.plugins/org.eclipse.ui.workbench/dialog_settings.xml b/.metadata/.plugins/org.eclipse.ui.workbench/dialog_settings.xml new file mode 100644 index 0000000..860e3dd --- /dev/null +++ b/.metadata/.plugins/org.eclipse.ui.workbench/dialog_settings.xml @@ -0,0 +1,7 @@ + +
+
+
+
+
+
diff --git a/.metadata/.plugins/org.eclipse.ui.workbench/workingsets.xml b/.metadata/.plugins/org.eclipse.ui.workbench/workingsets.xml new file mode 100644 index 0000000..e51d05c --- /dev/null +++ b/.metadata/.plugins/org.eclipse.ui.workbench/workingsets.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/.metadata/version.ini b/.metadata/version.ini new file mode 100644 index 0000000..b335982 --- /dev/null +++ b/.metadata/version.ini @@ -0,0 +1,3 @@ +#Thu Jan 23 15:22:40 IST 2025 +org.eclipse.core.runtime=2 +org.eclipse.platform=4.34.0.v20241120-1800 diff --git a/.mvn/wrapper/maven-wrapper.properties b/.mvn/wrapper/maven-wrapper.properties new file mode 100644 index 0000000..d58dfb7 --- /dev/null +++ b/.mvn/wrapper/maven-wrapper.properties @@ -0,0 +1,19 @@ +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. +wrapperVersion=3.3.2 +distributionType=only-script +distributionUrl=https://repo.maven.apache.org/maven2/org/apache/maven/apache-maven/3.9.9/apache-maven-3.9.9-bin.zip diff --git a/mvnw b/mvnw new file mode 100644 index 0000000..19529dd --- /dev/null +++ b/mvnw @@ -0,0 +1,259 @@ +#!/bin/sh +# ---------------------------------------------------------------------------- +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. +# ---------------------------------------------------------------------------- + +# ---------------------------------------------------------------------------- +# Apache Maven Wrapper startup batch script, version 3.3.2 +# +# Optional ENV vars +# ----------------- +# JAVA_HOME - location of a JDK home dir, required when download maven via java source +# MVNW_REPOURL - repo url base for downloading maven distribution +# MVNW_USERNAME/MVNW_PASSWORD - user and password for downloading maven +# MVNW_VERBOSE - true: enable verbose log; debug: trace the mvnw script; others: silence the output +# ---------------------------------------------------------------------------- + +set -euf +[ "${MVNW_VERBOSE-}" != debug ] || set -x + +# OS specific support. +native_path() { printf %s\\n "$1"; } +case "$(uname)" in +CYGWIN* | MINGW*) + [ -z "${JAVA_HOME-}" ] || JAVA_HOME="$(cygpath --unix "$JAVA_HOME")" + native_path() { cygpath --path --windows "$1"; } + ;; +esac + +# set JAVACMD and JAVACCMD +set_java_home() { + # For Cygwin and MinGW, ensure paths are in Unix format before anything is touched + if [ -n "${JAVA_HOME-}" ]; then + if [ -x "$JAVA_HOME/jre/sh/java" ]; then + # IBM's JDK on AIX uses strange locations for the executables + JAVACMD="$JAVA_HOME/jre/sh/java" + JAVACCMD="$JAVA_HOME/jre/sh/javac" + else + JAVACMD="$JAVA_HOME/bin/java" + JAVACCMD="$JAVA_HOME/bin/javac" + + if [ ! -x "$JAVACMD" ] || [ ! -x "$JAVACCMD" ]; then + echo "The JAVA_HOME environment variable is not defined correctly, so mvnw cannot run." >&2 + echo "JAVA_HOME is set to \"$JAVA_HOME\", but \"\$JAVA_HOME/bin/java\" or \"\$JAVA_HOME/bin/javac\" does not exist." >&2 + return 1 + fi + fi + else + JAVACMD="$( + 'set' +e + 'unset' -f command 2>/dev/null + 'command' -v java + )" || : + JAVACCMD="$( + 'set' +e + 'unset' -f command 2>/dev/null + 'command' -v javac + )" || : + + if [ ! -x "${JAVACMD-}" ] || [ ! -x "${JAVACCMD-}" ]; then + echo "The java/javac command does not exist in PATH nor is JAVA_HOME set, so mvnw cannot run." >&2 + return 1 + fi + fi +} + +# hash string like Java String::hashCode +hash_string() { + str="${1:-}" h=0 + while [ -n "$str" ]; do + char="${str%"${str#?}"}" + h=$(((h * 31 + $(LC_CTYPE=C printf %d "'$char")) % 4294967296)) + str="${str#?}" + done + printf %x\\n $h +} + +verbose() { :; } +[ "${MVNW_VERBOSE-}" != true ] || verbose() { printf %s\\n "${1-}"; } + +die() { + printf %s\\n "$1" >&2 + exit 1 +} + +trim() { + # MWRAPPER-139: + # Trims trailing and leading whitespace, carriage returns, tabs, and linefeeds. + # Needed for removing poorly interpreted newline sequences when running in more + # exotic environments such as mingw bash on Windows. + printf "%s" "${1}" | tr -d '[:space:]' +} + +# parse distributionUrl and optional distributionSha256Sum, requires .mvn/wrapper/maven-wrapper.properties +while IFS="=" read -r key value; do + case "${key-}" in + distributionUrl) distributionUrl=$(trim "${value-}") ;; + distributionSha256Sum) distributionSha256Sum=$(trim "${value-}") ;; + esac +done <"${0%/*}/.mvn/wrapper/maven-wrapper.properties" +[ -n "${distributionUrl-}" ] || die "cannot read distributionUrl property in ${0%/*}/.mvn/wrapper/maven-wrapper.properties" + +case "${distributionUrl##*/}" in +maven-mvnd-*bin.*) + MVN_CMD=mvnd.sh _MVNW_REPO_PATTERN=/maven/mvnd/ + case "${PROCESSOR_ARCHITECTURE-}${PROCESSOR_ARCHITEW6432-}:$(uname -a)" in + *AMD64:CYGWIN* | *AMD64:MINGW*) distributionPlatform=windows-amd64 ;; + :Darwin*x86_64) distributionPlatform=darwin-amd64 ;; + :Darwin*arm64) distributionPlatform=darwin-aarch64 ;; + :Linux*x86_64*) distributionPlatform=linux-amd64 ;; + *) + echo "Cannot detect native platform for mvnd on $(uname)-$(uname -m), use pure java version" >&2 + distributionPlatform=linux-amd64 + ;; + esac + distributionUrl="${distributionUrl%-bin.*}-$distributionPlatform.zip" + ;; +maven-mvnd-*) MVN_CMD=mvnd.sh _MVNW_REPO_PATTERN=/maven/mvnd/ ;; +*) MVN_CMD="mvn${0##*/mvnw}" _MVNW_REPO_PATTERN=/org/apache/maven/ ;; +esac + +# apply MVNW_REPOURL and calculate MAVEN_HOME +# maven home pattern: ~/.m2/wrapper/dists/{apache-maven-,maven-mvnd--}/ +[ -z "${MVNW_REPOURL-}" ] || distributionUrl="$MVNW_REPOURL$_MVNW_REPO_PATTERN${distributionUrl#*"$_MVNW_REPO_PATTERN"}" +distributionUrlName="${distributionUrl##*/}" +distributionUrlNameMain="${distributionUrlName%.*}" +distributionUrlNameMain="${distributionUrlNameMain%-bin}" +MAVEN_USER_HOME="${MAVEN_USER_HOME:-${HOME}/.m2}" +MAVEN_HOME="${MAVEN_USER_HOME}/wrapper/dists/${distributionUrlNameMain-}/$(hash_string "$distributionUrl")" + +exec_maven() { + unset MVNW_VERBOSE MVNW_USERNAME MVNW_PASSWORD MVNW_REPOURL || : + exec "$MAVEN_HOME/bin/$MVN_CMD" "$@" || die "cannot exec $MAVEN_HOME/bin/$MVN_CMD" +} + +if [ -d "$MAVEN_HOME" ]; then + verbose "found existing MAVEN_HOME at $MAVEN_HOME" + exec_maven "$@" +fi + +case "${distributionUrl-}" in +*?-bin.zip | *?maven-mvnd-?*-?*.zip) ;; +*) die "distributionUrl is not valid, must match *-bin.zip or maven-mvnd-*.zip, but found '${distributionUrl-}'" ;; +esac + +# prepare tmp dir +if TMP_DOWNLOAD_DIR="$(mktemp -d)" && [ -d "$TMP_DOWNLOAD_DIR" ]; then + clean() { rm -rf -- "$TMP_DOWNLOAD_DIR"; } + trap clean HUP INT TERM EXIT +else + die "cannot create temp dir" +fi + +mkdir -p -- "${MAVEN_HOME%/*}" + +# Download and Install Apache Maven +verbose "Couldn't find MAVEN_HOME, downloading and installing it ..." +verbose "Downloading from: $distributionUrl" +verbose "Downloading to: $TMP_DOWNLOAD_DIR/$distributionUrlName" + +# select .zip or .tar.gz +if ! command -v unzip >/dev/null; then + distributionUrl="${distributionUrl%.zip}.tar.gz" + distributionUrlName="${distributionUrl##*/}" +fi + +# verbose opt +__MVNW_QUIET_WGET=--quiet __MVNW_QUIET_CURL=--silent __MVNW_QUIET_UNZIP=-q __MVNW_QUIET_TAR='' +[ "${MVNW_VERBOSE-}" != true ] || __MVNW_QUIET_WGET='' __MVNW_QUIET_CURL='' __MVNW_QUIET_UNZIP='' __MVNW_QUIET_TAR=v + +# normalize http auth +case "${MVNW_PASSWORD:+has-password}" in +'') MVNW_USERNAME='' MVNW_PASSWORD='' ;; +has-password) [ -n "${MVNW_USERNAME-}" ] || MVNW_USERNAME='' MVNW_PASSWORD='' ;; +esac + +if [ -z "${MVNW_USERNAME-}" ] && command -v wget >/dev/null; then + verbose "Found wget ... using wget" + wget ${__MVNW_QUIET_WGET:+"$__MVNW_QUIET_WGET"} "$distributionUrl" -O "$TMP_DOWNLOAD_DIR/$distributionUrlName" || die "wget: Failed to fetch $distributionUrl" +elif [ -z "${MVNW_USERNAME-}" ] && command -v curl >/dev/null; then + verbose "Found curl ... using curl" + curl ${__MVNW_QUIET_CURL:+"$__MVNW_QUIET_CURL"} -f -L -o "$TMP_DOWNLOAD_DIR/$distributionUrlName" "$distributionUrl" || die "curl: Failed to fetch $distributionUrl" +elif set_java_home; then + verbose "Falling back to use Java to download" + javaSource="$TMP_DOWNLOAD_DIR/Downloader.java" + targetZip="$TMP_DOWNLOAD_DIR/$distributionUrlName" + cat >"$javaSource" <<-END + public class Downloader extends java.net.Authenticator + { + protected java.net.PasswordAuthentication getPasswordAuthentication() + { + return new java.net.PasswordAuthentication( System.getenv( "MVNW_USERNAME" ), System.getenv( "MVNW_PASSWORD" ).toCharArray() ); + } + public static void main( String[] args ) throws Exception + { + setDefault( new Downloader() ); + java.nio.file.Files.copy( java.net.URI.create( args[0] ).toURL().openStream(), java.nio.file.Paths.get( args[1] ).toAbsolutePath().normalize() ); + } + } + END + # For Cygwin/MinGW, switch paths to Windows format before running javac and java + verbose " - Compiling Downloader.java ..." + "$(native_path "$JAVACCMD")" "$(native_path "$javaSource")" || die "Failed to compile Downloader.java" + verbose " - Running Downloader.java ..." + "$(native_path "$JAVACMD")" -cp "$(native_path "$TMP_DOWNLOAD_DIR")" Downloader "$distributionUrl" "$(native_path "$targetZip")" +fi + +# If specified, validate the SHA-256 sum of the Maven distribution zip file +if [ -n "${distributionSha256Sum-}" ]; then + distributionSha256Result=false + if [ "$MVN_CMD" = mvnd.sh ]; then + echo "Checksum validation is not supported for maven-mvnd." >&2 + echo "Please disable validation by removing 'distributionSha256Sum' from your maven-wrapper.properties." >&2 + exit 1 + elif command -v sha256sum >/dev/null; then + if echo "$distributionSha256Sum $TMP_DOWNLOAD_DIR/$distributionUrlName" | sha256sum -c >/dev/null 2>&1; then + distributionSha256Result=true + fi + elif command -v shasum >/dev/null; then + if echo "$distributionSha256Sum $TMP_DOWNLOAD_DIR/$distributionUrlName" | shasum -a 256 -c >/dev/null 2>&1; then + distributionSha256Result=true + fi + else + echo "Checksum validation was requested but neither 'sha256sum' or 'shasum' are available." >&2 + echo "Please install either command, or disable validation by removing 'distributionSha256Sum' from your maven-wrapper.properties." >&2 + exit 1 + fi + if [ $distributionSha256Result = false ]; then + echo "Error: Failed to validate Maven distribution SHA-256, your Maven distribution might be compromised." >&2 + echo "If you updated your Maven version, you need to update the specified distributionSha256Sum property." >&2 + exit 1 + fi +fi + +# unzip and move +if command -v unzip >/dev/null; then + unzip ${__MVNW_QUIET_UNZIP:+"$__MVNW_QUIET_UNZIP"} "$TMP_DOWNLOAD_DIR/$distributionUrlName" -d "$TMP_DOWNLOAD_DIR" || die "failed to unzip" +else + tar xzf${__MVNW_QUIET_TAR:+"$__MVNW_QUIET_TAR"} "$TMP_DOWNLOAD_DIR/$distributionUrlName" -C "$TMP_DOWNLOAD_DIR" || die "failed to untar" +fi +printf %s\\n "$distributionUrl" >"$TMP_DOWNLOAD_DIR/$distributionUrlNameMain/mvnw.url" +mv -- "$TMP_DOWNLOAD_DIR/$distributionUrlNameMain" "$MAVEN_HOME" || [ -d "$MAVEN_HOME" ] || die "fail to move MAVEN_HOME" + +clean || : +exec_maven "$@" diff --git a/mvnw.cmd b/mvnw.cmd new file mode 100644 index 0000000..249bdf3 --- /dev/null +++ b/mvnw.cmd @@ -0,0 +1,149 @@ +<# : batch portion +@REM ---------------------------------------------------------------------------- +@REM Licensed to the Apache Software Foundation (ASF) under one +@REM or more contributor license agreements. See the NOTICE file +@REM distributed with this work for additional information +@REM regarding copyright ownership. The ASF licenses this file +@REM to you under the Apache License, Version 2.0 (the +@REM "License"); you may not use this file except in compliance +@REM with the License. You may obtain a copy of the License at +@REM +@REM http://www.apache.org/licenses/LICENSE-2.0 +@REM +@REM Unless required by applicable law or agreed to in writing, +@REM software distributed under the License is distributed on an +@REM "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +@REM KIND, either express or implied. See the License for the +@REM specific language governing permissions and limitations +@REM under the License. +@REM ---------------------------------------------------------------------------- + +@REM ---------------------------------------------------------------------------- +@REM Apache Maven Wrapper startup batch script, version 3.3.2 +@REM +@REM Optional ENV vars +@REM MVNW_REPOURL - repo url base for downloading maven distribution +@REM MVNW_USERNAME/MVNW_PASSWORD - user and password for downloading maven +@REM MVNW_VERBOSE - true: enable verbose log; others: silence the output +@REM ---------------------------------------------------------------------------- + +@IF "%__MVNW_ARG0_NAME__%"=="" (SET __MVNW_ARG0_NAME__=%~nx0) +@SET __MVNW_CMD__= +@SET __MVNW_ERROR__= +@SET __MVNW_PSMODULEP_SAVE=%PSModulePath% +@SET PSModulePath= +@FOR /F "usebackq tokens=1* delims==" %%A IN (`powershell -noprofile "& {$scriptDir='%~dp0'; $script='%__MVNW_ARG0_NAME__%'; icm -ScriptBlock ([Scriptblock]::Create((Get-Content -Raw '%~f0'))) -NoNewScope}"`) DO @( + IF "%%A"=="MVN_CMD" (set __MVNW_CMD__=%%B) ELSE IF "%%B"=="" (echo %%A) ELSE (echo %%A=%%B) +) +@SET PSModulePath=%__MVNW_PSMODULEP_SAVE% +@SET __MVNW_PSMODULEP_SAVE= +@SET __MVNW_ARG0_NAME__= +@SET MVNW_USERNAME= +@SET MVNW_PASSWORD= +@IF NOT "%__MVNW_CMD__%"=="" (%__MVNW_CMD__% %*) +@echo Cannot start maven from wrapper >&2 && exit /b 1 +@GOTO :EOF +: end batch / begin powershell #> + +$ErrorActionPreference = "Stop" +if ($env:MVNW_VERBOSE -eq "true") { + $VerbosePreference = "Continue" +} + +# calculate distributionUrl, requires .mvn/wrapper/maven-wrapper.properties +$distributionUrl = (Get-Content -Raw "$scriptDir/.mvn/wrapper/maven-wrapper.properties" | ConvertFrom-StringData).distributionUrl +if (!$distributionUrl) { + Write-Error "cannot read distributionUrl property in $scriptDir/.mvn/wrapper/maven-wrapper.properties" +} + +switch -wildcard -casesensitive ( $($distributionUrl -replace '^.*/','') ) { + "maven-mvnd-*" { + $USE_MVND = $true + $distributionUrl = $distributionUrl -replace '-bin\.[^.]*$',"-windows-amd64.zip" + $MVN_CMD = "mvnd.cmd" + break + } + default { + $USE_MVND = $false + $MVN_CMD = $script -replace '^mvnw','mvn' + break + } +} + +# apply MVNW_REPOURL and calculate MAVEN_HOME +# maven home pattern: ~/.m2/wrapper/dists/{apache-maven-,maven-mvnd--}/ +if ($env:MVNW_REPOURL) { + $MVNW_REPO_PATTERN = if ($USE_MVND) { "/org/apache/maven/" } else { "/maven/mvnd/" } + $distributionUrl = "$env:MVNW_REPOURL$MVNW_REPO_PATTERN$($distributionUrl -replace '^.*'+$MVNW_REPO_PATTERN,'')" +} +$distributionUrlName = $distributionUrl -replace '^.*/','' +$distributionUrlNameMain = $distributionUrlName -replace '\.[^.]*$','' -replace '-bin$','' +$MAVEN_HOME_PARENT = "$HOME/.m2/wrapper/dists/$distributionUrlNameMain" +if ($env:MAVEN_USER_HOME) { + $MAVEN_HOME_PARENT = "$env:MAVEN_USER_HOME/wrapper/dists/$distributionUrlNameMain" +} +$MAVEN_HOME_NAME = ([System.Security.Cryptography.MD5]::Create().ComputeHash([byte[]][char[]]$distributionUrl) | ForEach-Object {$_.ToString("x2")}) -join '' +$MAVEN_HOME = "$MAVEN_HOME_PARENT/$MAVEN_HOME_NAME" + +if (Test-Path -Path "$MAVEN_HOME" -PathType Container) { + Write-Verbose "found existing MAVEN_HOME at $MAVEN_HOME" + Write-Output "MVN_CMD=$MAVEN_HOME/bin/$MVN_CMD" + exit $? +} + +if (! $distributionUrlNameMain -or ($distributionUrlName -eq $distributionUrlNameMain)) { + Write-Error "distributionUrl is not valid, must end with *-bin.zip, but found $distributionUrl" +} + +# prepare tmp dir +$TMP_DOWNLOAD_DIR_HOLDER = New-TemporaryFile +$TMP_DOWNLOAD_DIR = New-Item -Itemtype Directory -Path "$TMP_DOWNLOAD_DIR_HOLDER.dir" +$TMP_DOWNLOAD_DIR_HOLDER.Delete() | Out-Null +trap { + if ($TMP_DOWNLOAD_DIR.Exists) { + try { Remove-Item $TMP_DOWNLOAD_DIR -Recurse -Force | Out-Null } + catch { Write-Warning "Cannot remove $TMP_DOWNLOAD_DIR" } + } +} + +New-Item -Itemtype Directory -Path "$MAVEN_HOME_PARENT" -Force | Out-Null + +# Download and Install Apache Maven +Write-Verbose "Couldn't find MAVEN_HOME, downloading and installing it ..." +Write-Verbose "Downloading from: $distributionUrl" +Write-Verbose "Downloading to: $TMP_DOWNLOAD_DIR/$distributionUrlName" + +$webclient = New-Object System.Net.WebClient +if ($env:MVNW_USERNAME -and $env:MVNW_PASSWORD) { + $webclient.Credentials = New-Object System.Net.NetworkCredential($env:MVNW_USERNAME, $env:MVNW_PASSWORD) +} +[Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12 +$webclient.DownloadFile($distributionUrl, "$TMP_DOWNLOAD_DIR/$distributionUrlName") | Out-Null + +# If specified, validate the SHA-256 sum of the Maven distribution zip file +$distributionSha256Sum = (Get-Content -Raw "$scriptDir/.mvn/wrapper/maven-wrapper.properties" | ConvertFrom-StringData).distributionSha256Sum +if ($distributionSha256Sum) { + if ($USE_MVND) { + Write-Error "Checksum validation is not supported for maven-mvnd. `nPlease disable validation by removing 'distributionSha256Sum' from your maven-wrapper.properties." + } + Import-Module $PSHOME\Modules\Microsoft.PowerShell.Utility -Function Get-FileHash + if ((Get-FileHash "$TMP_DOWNLOAD_DIR/$distributionUrlName" -Algorithm SHA256).Hash.ToLower() -ne $distributionSha256Sum) { + Write-Error "Error: Failed to validate Maven distribution SHA-256, your Maven distribution might be compromised. If you updated your Maven version, you need to update the specified distributionSha256Sum property." + } +} + +# unzip and move +Expand-Archive "$TMP_DOWNLOAD_DIR/$distributionUrlName" -DestinationPath "$TMP_DOWNLOAD_DIR" | Out-Null +Rename-Item -Path "$TMP_DOWNLOAD_DIR/$distributionUrlNameMain" -NewName $MAVEN_HOME_NAME | Out-Null +try { + Move-Item -Path "$TMP_DOWNLOAD_DIR/$MAVEN_HOME_NAME" -Destination $MAVEN_HOME_PARENT | Out-Null +} catch { + if (! (Test-Path -Path "$MAVEN_HOME" -PathType Container)) { + Write-Error "fail to move MAVEN_HOME" + } +} finally { + try { Remove-Item $TMP_DOWNLOAD_DIR -Recurse -Force | Out-Null } + catch { Write-Warning "Cannot remove $TMP_DOWNLOAD_DIR" } +} + +Write-Output "MVN_CMD=$MAVEN_HOME/bin/$MVN_CMD" diff --git a/pom.xml b/pom.xml new file mode 100644 index 0000000..a2ac341 --- /dev/null +++ b/pom.xml @@ -0,0 +1,135 @@ + + + 4.0.0 + + org.springframework.boot + spring-boot-starter-parent + 3.4.1 + + + com.sahyog.app.inbound + inbound-user-service + 0.0.1-SNAPSHOT + inbound-user-service + project user management services in Spring Boot + + + 17 + 2021.0.3 + + + + + + + + org.springframework.boot + spring-boot-starter-data-jpa + + + org.springframework.boot + spring-boot-starter-web + + + + org.springframework.boot + spring-boot-starter-validation + + + org.springframework.cloud + spring-cloud-starter-openfeign + + + org.springframework.boot + spring-boot-starter-webflux + + + org.springframework.boot + spring-boot-starter-test + test + + + org.springframework.boot + spring-boot-devtools + runtime + true + + + javax.validation + validation-api + 2.0.1.Final + + + + + + + com.mysql + mysql-connector-j + runtime + + + + org.projectlombok + lombok + true + + + com.google.code.gson + gson + + + org.codehaus.jettison + jettison + 1.4.1 + + + net.sf.dozer + dozer + 5.5.1 + + + + + + + + org.springframework.cloud + spring-cloud-dependencies + ${spring-cloud.version} + pom + import + + + + + + + + org.springframework.boot + spring-boot-maven-plugin + + + paketobuildpacks/builder-jammy-base:latest + + + + org.projectlombok + lombok + + + + + + + + \ No newline at end of file diff --git a/src/main/java/com/sahyog/app/inbound/user/InboundUserServiceApplication.java b/src/main/java/com/sahyog/app/inbound/user/InboundUserServiceApplication.java new file mode 100644 index 0000000..6cd9f09 --- /dev/null +++ b/src/main/java/com/sahyog/app/inbound/user/InboundUserServiceApplication.java @@ -0,0 +1,13 @@ +package com.sahyog.app.inbound.user; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; + +@SpringBootApplication +public class InboundUserServiceApplication { + + public static void main(String[] args) { + SpringApplication.run(InboundUserServiceApplication.class, args); + } + +} diff --git a/src/main/java/com/sahyog/app/inbound/user/config/CorsConfig.java b/src/main/java/com/sahyog/app/inbound/user/config/CorsConfig.java new file mode 100644 index 0000000..809a32e --- /dev/null +++ b/src/main/java/com/sahyog/app/inbound/user/config/CorsConfig.java @@ -0,0 +1,18 @@ +package com.sahyog.app.inbound.user.config; + +import org.springframework.web.servlet.config.annotation.CorsRegistry; +import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; +import org.springframework.context.annotation.Configuration; + +@Configuration +public class CorsConfig implements WebMvcConfigurer { + + @Override + public void addCorsMappings(CorsRegistry registry) { + registry.addMapping("/**") // Allow CORS for all paths + .allowedOrigins("*") // Allow requests from all origins + .allowedMethods("GET", "POST", "PUT", "DELETE", "OPTIONS", "PATCH") // Allow specific HTTP methods + .allowedHeaders("*") // Allow all headers + .allowCredentials(false); // Disable credentials for wildcard origins + } +} \ No newline at end of file diff --git a/src/main/java/com/sahyog/app/inbound/user/controller/MaterialMasterController.java b/src/main/java/com/sahyog/app/inbound/user/controller/MaterialMasterController.java new file mode 100644 index 0000000..9638303 --- /dev/null +++ b/src/main/java/com/sahyog/app/inbound/user/controller/MaterialMasterController.java @@ -0,0 +1,143 @@ +package com.sahyog.app.inbound.user.controller; + +import java.util.List; +import java.util.Map; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.data.domain.Page; +import org.springframework.data.domain.PageRequest; +import org.springframework.data.domain.Pageable; +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.RestController; +import com.sahyog.app.inbound.user.dto.MaterialMasterDTO; +import com.sahyog.app.inbound.user.enums.Status; +import com.sahyog.app.inbound.user.model.Response; +import com.sahyog.app.inbound.user.model.User; +import com.sahyog.app.inbound.user.service.MaterialMasterService; +import jakarta.validation.Valid; + + +@RestController +@RequestMapping("/api/materials") +public class MaterialMasterController { + + private static final Logger log = LoggerFactory.getLogger(MaterialMasterController.class); + + @Autowired + private MaterialMasterService materialMasterService; + + // Process Material endpoint + @PostMapping("/process") + public Response>> processMaterial( + @RequestBody @Valid List dtos) { + log.info("Received request to process materials with {} DTOs", dtos.size()); + + try { + User currentUser = getCurrentUser(); // Fetch the current logged-in user + log.debug("Current user: {}", currentUser); + + // Call the service method and get the response + Response>> response = materialMasterService.processMaterial(dtos, currentUser); + + log.info("Processed materials successfully"); + return response; + } catch (Exception e) { + log.error("Error occurred while processing materials: {}", e.getMessage(), e); + return Response.error("Failed to process materials"); + } + } + + private User getCurrentUser() { + // Replace this with actual logic to fetch the current user + User user = new User(); + user.setUserId(1); // Example user ID + log.debug("Fetched current user: {}", user); + return user; + } + + @GetMapping("/getAll") + public Response> getAllMaterials() { + log.info("Fetching all materials"); + + try { + List materials = materialMasterService.getAllMaterials(); + log.info("Fetched {} materials successfully", materials.size()); + return Response.success(materials).withMessage("Fetched all materials successfully."); + } catch (Exception e) { + log.error("Error fetching all materials: {}", e.getMessage(), e); + return Response.error("Failed to fetch all materials"); + } + } + + @GetMapping("/getByPlantIdAndMaterialId") + public Response getMaterialByPlantIdAndMaterialId( + @RequestParam("plantId") Short plantId, + @RequestParam("materialId") Short materialId) { + log.info("Fetching material with plantId: {} and materialId: {}", plantId, materialId); + + try { + MaterialMasterDTO material = materialMasterService.getMaterialByPlantIdAndMaterialId(plantId, materialId); + log.info("Fetched material successfully for plantId: {} and materialId: {}", plantId, materialId); + return Response.success(material).withMessage("Fetched material successfully."); + } catch (Exception e) { + log.error("Error fetching material for plantId: {} and materialId: {}", plantId, materialId, e); + return Response.error("Failed to fetch material"); + } + } + + @GetMapping("/getAllWithFilter") + public Response> getMaterialsWithFilters( + @RequestParam(required = false) String materialCode, + @RequestParam(required = false) String materialGroup, + @RequestParam(required = false) String materialGroupDesc, + @RequestParam(required = false) Status status, + @RequestParam(defaultValue = "0") int page, + @RequestParam(defaultValue = "5") int size) { + log.info("Fetching materials with filters: materialCode={}, materialGroup={}, materialGroupDesc={}, status={}", + materialCode, materialGroup, materialGroupDesc, status); + + try { + Pageable pageable = PageRequest.of(page, size); + Page materials = materialMasterService.getMaterialsWithFilters( + materialCode, materialGroup, materialGroupDesc, status, pageable); + + log.info("Fetched {} materials successfully with filters", materials.getTotalElements()); + return Response.success(materials).withMessage("Fetched materials successfully."); + } catch (Exception e) { + log.error("Error fetching materials with filters", e); + return Response.error("Failed to fetch materials with filters"); + } + } + + @PostMapping("/materialdetails") + public ResponseEntity>>> getMaterialDetails( + @RequestBody Map req, Pageable pageable) { + log.info("Fetching material details with request: {}", req); + + try { + // Call the service to fetch material details + Page> materialDetails = materialMasterService.getMaterialDetails(req, pageable); + + // Check if the result is empty and respond accordingly + if (materialDetails.isEmpty()) { + log.warn("No material details found for the provided filters: {}", req); + return ResponseEntity.ok(new Response<>(204, "No material details found for the provided filters.", materialDetails)); + } + + log.info("Fetched material details successfully"); + return ResponseEntity.ok(new Response<>(200, "Material details fetched successfully.", materialDetails)); + } catch (Exception e) { + log.error("Error fetching material details", e); + return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).body( + new Response<>(500, "An error occurred while fetching material details. Please try again later.", null) + ); + } + } +} diff --git a/src/main/java/com/sahyog/app/inbound/user/controller/PlantMasterController.java b/src/main/java/com/sahyog/app/inbound/user/controller/PlantMasterController.java new file mode 100644 index 0000000..be0604c --- /dev/null +++ b/src/main/java/com/sahyog/app/inbound/user/controller/PlantMasterController.java @@ -0,0 +1,154 @@ +package com.sahyog.app.inbound.user.controller; + +import java.util.List; +import java.util.Map; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.data.domain.Page; +import org.springframework.data.domain.PageRequest; +import org.springframework.data.domain.Pageable; +import org.springframework.data.domain.Sort; +import org.springframework.data.web.PageableDefault; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PatchMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.RestController; + +import com.sahyog.app.inbound.user.dto.PlantDTO; +import com.sahyog.app.inbound.user.dto.PlantMasterDTO; +import com.sahyog.app.inbound.user.enums.Status; +import com.sahyog.app.inbound.user.model.Response; +import com.sahyog.app.inbound.user.model.User; +import com.sahyog.app.inbound.user.service.PlantMasterService; + +import jakarta.validation.Valid; +@RestController +@RequestMapping("/api/plant") +public class PlantMasterController { + + private static final Logger log = LoggerFactory.getLogger(PlantMasterController.class); + + @Autowired + private PlantMasterService plantMasterService; + + @PostMapping("/create") + public Response>> processPlant(@RequestBody List dtos) { + log.info("Received request to process Plant DTOs: {}", dtos); + + try { + User currentUser = getCurrentUser(); + log.debug("Current user: {}", currentUser); + + // Call the service method and log the response + Response>> response = plantMasterService.processPlant(dtos, currentUser); + log.info("Successfully processed Plant DTOs. Response: {}", response); + + return response; + } catch (Exception e) { + log.error("Error occurred while processing Plant DTOs: {}", e.getMessage(), e); + return Response.error(500, "Failed to process Plant DTOs"); + } + } + + private User getCurrentUser() { + log.debug("Fetching current user..."); + User user = new User(); + user.setUserId(1); // Example user ID + log.debug("Fetched current user: {}", user); + return user; + } + + @GetMapping("/get") + public Response> getPlantsByStatus(@RequestParam(value = "status", required = false) String status) { + log.info("Received request to fetch plants by status: {}", status); + + try { + List plants; + + if (status == null || status.equalsIgnoreCase("B")) { + log.info("Fetching all plants as no specific status is provided"); + plants = plantMasterService.getAllPlants(); + } else { + log.info("Fetching plants with status: {}", status); + plants = plantMasterService.getPlantsByStatus(Status.valueOf(status.toUpperCase())); + } + + log.info("Successfully fetched plants. Count: {}", plants.size()); + return Response.success(plants).withMessage("Fetched plants successfully."); + } catch (Exception e) { + log.error("Error occurred while fetching plants: {}", e.getMessage(), e); + return Response.error(500, "Failed to fetch plants"); + } + } + + @GetMapping("/getAllAndPlantWithStatusPagination") + public Response> getPlantsWithPagination( + @RequestParam(defaultValue = "0") int pageNumber, + @RequestParam(defaultValue = "10") int pageSize, + @RequestParam(value = "status", required = false) List statusFilters) { + + log.info("Received request for paginated plants. Page: {}, Size: {}, Status Filters: {}", pageNumber, pageSize, statusFilters); + + try { + Pageable pageable = PageRequest.of(pageNumber, pageSize, Sort.by(Sort.Direction.DESC, "lastUpdatedOn")); + + Page plants; + if (statusFilters == null || statusFilters.isEmpty()) { + log.info("Fetching all plants with pagination"); + plants = plantMasterService.getAllPlantsWithPagination(pageable); + } else { + log.info("Fetching plants with filters: {} and pagination", statusFilters); + plants = plantMasterService.getPlantsByStatusWithPagination(statusFilters, pageable); + } + + log.info("Successfully fetched {} plants with pagination", plants.getTotalElements()); + return Response.success(plants).withMessage("Fetched plants successfully."); + } catch (Exception e) { + log.error("Error occurred while fetching plants with pagination: {}", e.getMessage(), e); + return Response.error(500, "Failed to fetch paginated plants"); + } + } + + @PatchMapping("/updateStatus") + public Response updatePlantStatus( + @RequestParam(value = "plantId", required = false) Short plantId, + @RequestParam(value = "plantCode", required = false) String plantCode, + @RequestParam("status") String status) { + + log.info("Received request to update plant status. PlantId: {}, PlantCode: {}, Status: {}", plantId, plantCode, status); + + try { + // Validate input + if (!status.equalsIgnoreCase("A") && !status.equalsIgnoreCase("I")) { + log.warn("Invalid status provided: {}", status); + throw new IllegalArgumentException("Invalid status. Only 'A' (ACTIVE) or 'I' (INACTIVE) are allowed."); + } + + if (plantId == null && plantCode == null) { + log.warn("Neither 'plantId' nor 'plantCode' was provided."); + throw new IllegalArgumentException("Either 'plantId' or 'plantCode' must be provided."); + } + + User currentUser = getCurrentUser(); + log.debug("Current user for status update: {}", currentUser); + + // Call the service method + PlantDTO updatedPlant = plantMasterService.updatePlantStatus(plantId, plantCode, Status.valueOf(status.toUpperCase()), currentUser); + log.info("Successfully updated plant status. Updated Plant: {}", updatedPlant); + + return Response.success(updatedPlant).withMessage("Plant status updated successfully."); + } catch (IllegalArgumentException e) { + log.error("Validation error while updating plant status: {}", e.getMessage()); + return Response.error(400, e.getMessage()); + } catch (Exception e) { + log.error("Error occurred while updating plant status: {}", e.getMessage(), e); + return Response.error(500, "Failed to update plant status"); + } + } +} diff --git a/src/main/java/com/sahyog/app/inbound/user/controller/RoleController.java b/src/main/java/com/sahyog/app/inbound/user/controller/RoleController.java new file mode 100644 index 0000000..e7c11ea --- /dev/null +++ b/src/main/java/com/sahyog/app/inbound/user/controller/RoleController.java @@ -0,0 +1,85 @@ +package com.sahyog.app.inbound.user.controller; + +import java.util.List; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.DeleteMapping; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.PutMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import com.sahyog.app.inbound.user.dto.RoleDTO; +import com.sahyog.app.inbound.user.exception.RoleAlreadyExistsException; +import com.sahyog.app.inbound.user.model.Role; +import com.sahyog.app.inbound.user.service.RoleService; + +@RestController +@RequestMapping("/api/roles") +public class RoleController { + + private static final Logger log = LoggerFactory.getLogger(RoleController.class); + + @Autowired + private RoleService roleService; + +// @GetMapping("/user-type/{userTypeId}") +// public ResponseEntity> getRolesByUserTypeId(@PathVariable short userTypeId) { +// log.info("Fetching roles for userTypeId: {}", userTypeId); +// List roles = roleService.getRolesByUserTypeId(userTypeId); +// return ResponseEntity.ok(roles); +// } + + // Create Role +// @PostMapping +// public ResponseEntity createRole(@RequestBody RoleDTO roleDTO) { +// Role createdRole = roleService.createRole(roleDTO); +// return ResponseEntity.status(HttpStatus.CREATED).body(createdRole); +// } +// +// // Get Roles by UserTypeId +// @GetMapping("/userType/{userTypeId}") +// public ResponseEntity> getRolesByUserTypeId(@PathVariable int userTypeId) { +// List roles = roleService.getRolesByUserTypeId(userTypeId); +// return ResponseEntity.ok(roles); +// } +// +// +// // Get All Roles +// @GetMapping +// public ResponseEntity> getAllRoles() { +// List roles = roleService.getAllRoles(); +// return ResponseEntity.ok(roles); +// } +// +// // Get Role by ID +// @GetMapping("/{roleId}") +// public ResponseEntity getRoleById(@PathVariable int roleId) { +// Role role = roleService.getRoleById(roleId); +// return ResponseEntity.ok(role); +// } +// +// // Update Role +// @PutMapping("/{roleId}") +// public ResponseEntity updateRole(@PathVariable int roleId, @RequestBody RoleDTO roleDTO) { +// Role updatedRole = roleService.updateRole(roleId, roleDTO); +// return ResponseEntity.ok(updatedRole); +// } +// +// // Delete Role +// @DeleteMapping("/{roleId}") +// public ResponseEntity deleteRole(@PathVariable int roleId) { +// roleService.deleteRole(roleId); +// return ResponseEntity.noContent().build(); +// } +// + +} + diff --git a/src/main/java/com/sahyog/app/inbound/user/controller/TransporterController.java b/src/main/java/com/sahyog/app/inbound/user/controller/TransporterController.java new file mode 100644 index 0000000..f4cdab3 --- /dev/null +++ b/src/main/java/com/sahyog/app/inbound/user/controller/TransporterController.java @@ -0,0 +1,139 @@ +package com.sahyog.app.inbound.user.controller; + + +import java.util.List; +import java.util.Map; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.data.domain.Page; +import org.springframework.data.domain.PageRequest; +import org.springframework.data.domain.Pageable; +import org.springframework.data.domain.Sort; +import org.springframework.http.HttpStatus; +import org.springframework.http.MediaType; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.RestController; +import com.sahyog.app.inbound.user.dto.TransporterMasterDto; +import com.sahyog.app.inbound.user.dto.TransporterResponse; +import com.sahyog.app.inbound.user.service.TransporterService; +import jakarta.validation.Valid; +import com.sahyog.app.inbound.user.model.Response; + + +@RestController +@RequestMapping("/transporter") +public class TransporterController { + + private static final Logger log = LoggerFactory.getLogger(TransporterController.class); + + @Autowired + private TransporterService transporterService; + + + @PostMapping(value = "/addUpdateTransporters", consumes = MediaType.APPLICATION_JSON_VALUE, produces = MediaType.APPLICATION_JSON_VALUE) + public ResponseEntity> createOrUpdateTransporters(@Valid @RequestBody List transporterRequestDtos) { + log.info("Received request to process {} transporters.", transporterRequestDtos.size()); + + try { + Response>> response = transporterService.processTransporters(transporterRequestDtos); + + if (response.getStatus() == 200 || response.getStatus() == 201) { + log.info("Transporters processed successfully. Status: {}", response.getStatus()); + } else if (response.getStatus() == 207) { + log.warn("Partial success in processing transporters: {}", response.getMessage()); + } else { + log.error("Failed to process transporters. Status: {}, Message: {}", response.getStatus(), response.getMessage()); + } + + return ResponseEntity.status(response.getStatus()).body(response); + } catch (Exception e) { + log.error("Unexpected error occurred while processing transporters.", e); + return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).body( + new Response<>(500, "Failed to process transporters due to an internal error.", null) + ); + } + } + + @GetMapping("/getAllTransporters") + public Response> getAllTransporters( + @RequestParam(value = "pageNumber", defaultValue = "0") int pageNumber, + @RequestParam(value = "pageSize", defaultValue = "5") int pageSize, + @RequestParam(value = "sortDirection", defaultValue = "DESC") String sortDirection, + @RequestParam(value = "supplier_code", required = false) String supplierCode, + @RequestParam(value = "transporter_name", required = false) String transporterName, + @RequestParam(value = "supplier_account_group", required = false) String supplierAccountGroup, + @RequestParam(value = "state", required = false) String state, + @RequestParam(value = "bp_grouping", required = false) String bpGrouping) { + + log.info("Fetching all transporters with filters: supplierCode={}, transporterName={}, supplierAccountGroup={}, state={}, bpGrouping={}", + supplierCode, transporterName, supplierAccountGroup, state, bpGrouping); + + Sort.Direction direction = Sort.Direction.fromString(sortDirection); + Pageable pageable = PageRequest.of(pageNumber, pageSize, Sort.by(direction, "lastUpdatedOn")); + + try { + Page transporters = transporterService.getTransportersWithFilters( + supplierCode, transporterName, supplierAccountGroup, state, bpGrouping, pageable); + + log.info("Successfully fetched {} transporters with pagination.", transporters.getTotalElements()); + return Response.success(transporters).withMessage("Transporters fetched successfully."); + } catch (Exception e) { + log.error("Error occurred while fetching transporters with filters.", e); + return Response.error(HttpStatus.INTERNAL_SERVER_ERROR.value(), "Failed to fetch transporters. Please try again later."); + } + } + + @PostMapping("/transporterdetails") + public ResponseEntity>>> getTransporterDetails( + @RequestBody Map req, Pageable pageable) { + log.info("Received request to fetch transporter details with filters: {} and pagination: {}", req, pageable); + + try { + Page> transporterDetails = transporterService.getTransporterDetails(req, pageable); + + if (transporterDetails.isEmpty()) { + log.info("No transporter details found for the provided filters."); + return ResponseEntity.ok(new Response<>(204, "No transporter details found for the provided filters.", transporterDetails)); + } + + log.info("Successfully fetched {} transporter details.", transporterDetails.getTotalElements()); + return ResponseEntity.ok(new Response<>(200, "Transporter details fetched successfully.", transporterDetails)); + } catch (Exception e) { + log.error("Error fetching transporter details.", e); + return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).body( + new Response<>(500, "An error occurred while fetching transporter details. Please try again later.", null) + ); + } + } + + + @GetMapping("/dropdown") + public ResponseEntity>> getDropDownValues() { + try { + // Fetch dropdown values from the service + Map dropDownValues = transporterService.getDropDownValues(); + + // Check if an error occurred in the service layer + if (dropDownValues.containsKey("error")) { + return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR) + .body(new Response<>(500, "Failed to fetch dropdown values.", null)); + } + + // Return successful response + return ResponseEntity.ok(new Response<>(200, "Dropdown values fetched successfully.", dropDownValues)); + + } catch (Exception e) { + // Log the exception and return a generic error response + log.error("Error while fetching dropdown values: {}", e.getMessage()); + return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR) + .body(new Response<>(500, "An error occurred while fetching dropdown values.", null)); + } + } +} diff --git a/src/main/java/com/sahyog/app/inbound/user/controller/UserController.java b/src/main/java/com/sahyog/app/inbound/user/controller/UserController.java new file mode 100644 index 0000000..47a1121 --- /dev/null +++ b/src/main/java/com/sahyog/app/inbound/user/controller/UserController.java @@ -0,0 +1,225 @@ +package com.sahyog.app.inbound.user.controller; + +import com.sahyog.app.inbound.user.dto.UserDTO; +import com.sahyog.app.inbound.user.dto.UserUpdateDTO; +import com.sahyog.app.inbound.user.exception.UserAlreadyExistsException; +import com.sahyog.app.inbound.user.exception.UserNotFoundException; +import com.sahyog.app.inbound.user.model.Response; +import com.sahyog.app.inbound.user.model.User; +import com.sahyog.app.inbound.user.service.UserService; +import org.springframework.data.domain.Sort; + +import java.util.Collections; +import java.util.List; +import java.util.Map; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.data.domain.Page; +import org.springframework.data.domain.PageRequest; +import org.springframework.data.domain.Pageable; +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.*; +@RestController +@RequestMapping("/api/users") +public class UserController { + + private static final Logger log = LoggerFactory.getLogger(UserController.class); + + @Autowired + private UserService userService; + + @PostMapping("/createUser") + public ResponseEntity>>> createInternalUsers(@RequestBody List userDTOs) { + log.info("Received request to create/update users: {}", userDTOs); + try { + Response>> response = userService.createInternalUsers(userDTOs); + log.info("Users created/updated successfully. Response: {}", response); + return ResponseEntity.status(HttpStatus.CREATED).body(response); + } catch (UserAlreadyExistsException e) { + log.warn("UserAlreadyExistsException occurred: {}", e.getMessage()); + return ResponseEntity.status(HttpStatus.CONFLICT) + .body(Response.error(409, "Error: " + e.getMessage()).withData(Collections.emptyList())); + } catch (RuntimeException e) { + log.error("RuntimeException occurred: {}", e.getMessage(), e); + return ResponseEntity.status(HttpStatus.BAD_REQUEST) + .body(Response.error(400, "Error: " + e.getMessage()).withData(Collections.emptyList())); + } catch (Exception e) { + log.error("Unexpected error occurred: {}", e.getMessage(), e); + return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR) + .body(Response.error(500, "An unexpected error occurred").withData(Collections.emptyList())); + } + } + + @PutMapping("/update") + public ResponseEntity>> updateUser( + @RequestParam(required = false) String userEmpTransCode, + @RequestBody UserUpdateDTO userUpdateDTO) { + log.info("Received request to update user with employeeTransCode: {} or email: {}", userEmpTransCode, userUpdateDTO.getEmailId()); + + // Validate input + if ((userEmpTransCode == null || userEmpTransCode.isEmpty()) && + (userUpdateDTO.getEmailId() == null || userUpdateDTO.getEmailId().isEmpty())) { + log.warn("Invalid request: Either employeeTransCode or email must be provided."); + return ResponseEntity.status(HttpStatus.BAD_REQUEST) + .body(Response.error(400, "Either employeeTransCode or email must be provided.")); + } + + try { + // Call the service to handle the update + Response> response = userService.updateUser(userEmpTransCode, userUpdateDTO); + log.info("User updated successfully. Response: {}", response); + return ResponseEntity.status(HttpStatus.OK).body(response); + + } catch (UserNotFoundException e) { + log.warn("User not found: {}", e.getMessage()); + return ResponseEntity.status(HttpStatus.NOT_FOUND) + .body(Response.error(404, e.getMessage())); + + } catch (IllegalArgumentException e) { + log.warn("Invalid input: {}", e.getMessage()); + return ResponseEntity.status(HttpStatus.BAD_REQUEST) + .body(Response.error(400, e.getMessage())); + + } catch (Exception e) { + log.error("Unexpected error occurred while updating user: {}", e.getMessage(), e); + return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR) + .body(Response.error(500, "An unexpected error occurred: " + e.getMessage())); + } + } + + + +// @PutMapping("/update") +// public ResponseEntity updateUser(@RequestParam String userEmpTransCode, +// @RequestBody UserUpdateDTO userUpdateDTO) { +// log.info("Received request to update user with userEmpTransCode: {}", userEmpTransCode); +// if (userEmpTransCode == null || userEmpTransCode.isEmpty()) { +// log.warn("Invalid request: userEmpTransCode is null or empty"); +// return ResponseEntity.status(HttpStatus.BAD_REQUEST) +// .body("userEmpTransCode must be provided."); +// } +// ResponseEntity response = userService.updateUser(userEmpTransCode, userUpdateDTO); +// log.info("User updated successfully with userEmpTransCode: {}", userEmpTransCode); +// return response; +// } + + @GetMapping("/getallUserWithPagination") + public ResponseEntity> getAllUsers( + @RequestParam(defaultValue = "0") int pageNumber, + @RequestParam(defaultValue = "10") int pageSize) { + log.info("Fetching all users with page: {} and size: {}", pageNumber, pageSize); + + Pageable pageable = PageRequest.of(pageNumber, pageSize, Sort.by(Sort.Direction.DESC, "lastUpdatedOn")); + + Page users = userService.getAllUsers(pageable); + + log.info("Fetched {} users", users.getTotalElements()); + return ResponseEntity.ok(users); + } + + @GetMapping("/ActiveOrInactive") + public ResponseEntity> getUsersByActive_Inactive(@RequestParam List status) { + log.info("Fetching users by status: {}", status); + List users = userService.getUsersByActive_Inactive(status); + log.info("Fetched {} users for statuses: {}", users.size(), status); + return ResponseEntity.ok(users); + } + + @GetMapping("/getAllAndUserWithStatus") + public Response> getUsersByStatus( + @RequestParam(value = "status", required = false) List status) { + + log.info("Fetching users with status filters: {}", status); + + List users; + + if (status == null || status.isEmpty()) { + log.info("Fetching all users as no status filter was provided"); + users = userService.getAllUsers(); // Fetch all users + } else { + log.info("Fetching users filtered by status: {}", status); + users = userService.getUsersByStatus(status); // Fetch users by status + } + + log.info("Successfully fetched {} users", users.size()); + return Response.success(users).withMessage("Fetched users successfully."); + } + + @GetMapping("/getAllAndUserWithStatusPagination") + public Response> getUsersWithPagination( + @RequestParam(defaultValue = "0") int pageNumber, + @RequestParam(defaultValue = "10") int pageSize, + @RequestParam(value = "status", required = false) String status) { + + log.info("Fetching users with pagination. Page: {}, Size: {}, Status filter: {}", pageNumber, pageSize, status); + + Pageable pageable = PageRequest.of(pageNumber, pageSize, Sort.by(Sort.Direction.DESC, "lastUpdatedOn")); + + Page users; + if (status == null || status.isEmpty()) { + log.info("Fetching all users with pagination"); + users = userService.getAllUsersWithPagination(pageable); + } else { + log.info("Fetching users with status filter and pagination"); + users = userService.getUsersByStatusWithPagination(status, pageable); + } + + log.info("Successfully fetched {} users with pagination", users.getTotalElements()); + return Response.success(users).withMessage("Fetched users successfully."); + } + + @PostMapping("/userdetails") + public ResponseEntity>>> getUserDetails( + @RequestBody Map req, Pageable pageable) { + log.info("Received request to fetch user details with filters: {}", req); + try { + // Call the service to fetch user details + Page> userDetails = userService.getUserDetails(req, pageable); + + // Check if the result is empty and respond accordingly + if (userDetails.isEmpty()) { + log.info("No user details found for the provided filters."); + return ResponseEntity.ok(new Response<>(204,"No User details found for the provided filters.", userDetails)); + } + + // Return success response with transporter details + log.info("Successfully fetched user details."); + return ResponseEntity.ok(new Response<>(200,"User details fetched successfully.",userDetails)); + } catch (Exception e) { + // Log the exception + log.error("Error fetching user details.", e); + + // Return error response + return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).body( + new Response<>(500, "An error occurred while fetching user details. Please try again later.", null) + ); + } + } + + @GetMapping("/userdropdown") + public ResponseEntity>> getDropDownValues() { + try { + // Fetch dropdown values from the service + Map dropDownValues = userService.getDropDownValues(); + + // Check if an error occurred in the service layer + if (dropDownValues.containsKey("error")) { + return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR) + .body(new Response<>(500, "Failed to fetch dropdown values.", null)); + } + + // Return successful response + return ResponseEntity.ok(new Response<>(200, "Dropdown values fetched successfully.", dropDownValues)); + + } catch (Exception e) { + // Log the exception and return a generic error response + log.error("Error while fetching dropdown values: {}", e.getMessage()); + return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR) + .body(new Response<>(500, "An error occurred while fetching dropdown values.", null)); + } + } +} + diff --git a/src/main/java/com/sahyog/app/inbound/user/controller/UserPlantController.java b/src/main/java/com/sahyog/app/inbound/user/controller/UserPlantController.java new file mode 100644 index 0000000..aaed50b --- /dev/null +++ b/src/main/java/com/sahyog/app/inbound/user/controller/UserPlantController.java @@ -0,0 +1,186 @@ +package com.sahyog.app.inbound.user.controller; + +import java.util.Collections; +import java.util.List; +import java.util.Map; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import com.sahyog.app.inbound.user.dto.AssignPlantsRequestDTO; +import com.sahyog.app.inbound.user.dto.AssignRolesRequestDTO; +import com.sahyog.app.inbound.user.dto.PlantMasterDTO; +import com.sahyog.app.inbound.user.dto.RoleDTO; +import com.sahyog.app.inbound.user.dto.UserRequestDTO; +import com.sahyog.app.inbound.user.model.Response; +import com.sahyog.app.inbound.user.service.UserPlantService; +import com.sahyog.app.inbound.user.service.UserRoleService; + +@RestController +@RequestMapping("/userplant") +public class UserPlantController { + + private static final Logger log = LoggerFactory.getLogger(UserPlantController.class); + + @Autowired + private UserPlantService userPlantService; + + @PostMapping("/fetchPlants") + public ResponseEntity>> getAllPlantsAndAssignedPlants(@RequestBody UserRequestDTO userRequestDTO) { + String email = userRequestDTO.getEmail(); + String employeeTransCode = userRequestDTO.getEmployeeTransCode(); + + try { + // Fetch all plants and assigned plants + List plantsWithAssignmentInfo = userPlantService.getAllPlantsWithAssignmentInfo(email, employeeTransCode); + + if (plantsWithAssignmentInfo.isEmpty()) { + log.debug("No plants available or assigned for email: {} and employeeTransCode: {}", email, employeeTransCode); + return ResponseEntity.status(HttpStatus.NOT_FOUND) + .body(new Response<>(404, "No plants found for the given user.", Collections.emptyList())); + } + + return ResponseEntity.ok(new Response<>(200, "Plants fetched successfully.", plantsWithAssignmentInfo)); + } catch (Exception e) { + log.error("Error while fetching plants: {}", e.getMessage()); + return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR) + .body(new Response<>(500, "An error occurred while fetching plants.", null)); + } + } + + @PostMapping("/assignPlants") + public ResponseEntity> assignPlantsToUser(@RequestBody AssignPlantsRequestDTO requestDTO) { + String email = requestDTO.getEmail(); + String employeeTransCode = requestDTO.getEmployeeTransCode(); + List selectedPlantIds = requestDTO.getSelectedPlantIds(); + int createdBy = requestDTO.getCreatedBy(); + int lastUpdatedBy = requestDTO.getLastUpdatedBy(); + + try { + // Call the service to assign selected plants + boolean isAssigned = userPlantService.assignSelectedPlantsToUser( + email, + employeeTransCode, + selectedPlantIds, + createdBy, + lastUpdatedBy + ); + + if (!isAssigned) { + log.debug("Failed to assign plants to user with email: {} and employeeTransCode: {}", email, employeeTransCode); + return ResponseEntity.status(HttpStatus.BAD_REQUEST) + .body(new Response<>(400, "Failed to assign plants.", "No changes were made.")); + } + + return ResponseEntity.ok(new Response<>(200, "Plants assigned successfully.", "Operation successful.")); + } catch (Exception e) { + log.error("Error while assigning plants: {}", e.getMessage()); + return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR) + .body(new Response<>(500, "An error occurred while assigning plants.", null)); + } + } + + @GetMapping("/userplant_dropdown") + public ResponseEntity>> getDropDownValues() { + try { + // Fetch dropdown values from the service + Map dropDownValues = userPlantService.getDropDownValues(); + + if (dropDownValues.containsKey("error")) { + return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR) + .body(new Response<>(500, "Failed to fetch dropdown values.", null)); + } + + return ResponseEntity.ok(new Response<>(200, "Dropdown values fetched successfully.", dropDownValues)); + } catch (Exception e) { + log.error("Error while fetching dropdown values: {}", e.getMessage()); + return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR) + .body(new Response<>(500, "An error occurred while fetching dropdown values.", null)); + } + } +} + + + +//@RestController +//@RequestMapping("/userplant") +//public class UserPlantController { +// +// +// private static final Logger log = LoggerFactory.getLogger(UserPlantController.class); +// +// @Autowired +// private UserPlantService userPlantService; +// +// @PostMapping("/fetchPlants") +// public ResponseEntity> getAllPlantsAndAssignedPlants(@RequestBody UserRequestDTO userRequestDTO) { +// String email = userRequestDTO.getEmail(); +// String employeeTransCode = userRequestDTO.getEmployeeTransCode(); +// +// // Fetch all plants and assigned plants +// List plantsWithAssignmentInfo = userPlantService.getAllPlantsWithAssignmentInfo(email, employeeTransCode); +// +// if (plantsWithAssignmentInfo.isEmpty()) { +// log.debug("No plants available or assigned for email: {} and employeeTransCode: {}", email, employeeTransCode); +// return ResponseEntity.status(HttpStatus.NOT_FOUND).body(Collections.emptyList()); +// } +// +// return ResponseEntity.ok(plantsWithAssignmentInfo); +// } +// +// @PostMapping("/assignPlants") +// public ResponseEntity assignPlantsToUser(@RequestBody AssignPlantsRequestDTO requestDTO) { +// String email = requestDTO.getEmail(); +// String employeeTransCode = requestDTO.getEmployeeTransCode(); +// List selectedPlantIds = requestDTO.getSelectedPlantIds(); +// int createdBy = requestDTO.getCreatedBy(); +// int lastUpdatedBy = requestDTO.getLastUpdatedBy(); +// // Call the service to assign selected plants +// boolean isAssigned = userPlantService.assignSelectedPlantsToUser( +// email, +// employeeTransCode, +// selectedPlantIds, +// createdBy, +// lastUpdatedBy +// ); +// +// if (!isAssigned) { +// log.debug("Failed to assign plants to user with email: {} and employeeTransCode: {}", email, employeeTransCode); +// return ResponseEntity.status(HttpStatus.BAD_REQUEST).body("Failed to assign plants."); +// } +// +// return ResponseEntity.ok("Plants assigned successfully."); +// } +// +// +// @GetMapping("userplant_dropdown") +// public ResponseEntity>> getDropDownValues() { +// try { +// // Fetch dropdown values from the service +// Map dropDownValues = userPlantService.getDropDownValues(); +// +// // Check if an error occurred in the service layer +// if (dropDownValues.containsKey("error")) { +// return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR) +// .body(new Response<>(500, "Failed to fetch dropdown values.", null)); +// } +// +// // Return successful response +// return ResponseEntity.ok(new Response<>(200, "Dropdown values fetched successfully.", dropDownValues)); +// +// } catch (Exception e) { +// // Log the exception and return a generic error response +// log.error("Error while fetching dropdown values: {}", e.getMessage()); +// return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR) +// .body(new Response<>(500, "An error occurred while fetching dropdown values.", null)); +// } +// } +//} diff --git a/src/main/java/com/sahyog/app/inbound/user/controller/UserRoleController.java b/src/main/java/com/sahyog/app/inbound/user/controller/UserRoleController.java new file mode 100644 index 0000000..b79b44d --- /dev/null +++ b/src/main/java/com/sahyog/app/inbound/user/controller/UserRoleController.java @@ -0,0 +1,165 @@ +package com.sahyog.app.inbound.user.controller; + +import com.sahyog.app.inbound.user.dto.AssignRolesRequestDTO; +import com.sahyog.app.inbound.user.dto.RoleDTO; +import com.sahyog.app.inbound.user.dto.UserRequestDTO; +import com.sahyog.app.inbound.user.model.Response; +import com.sahyog.app.inbound.user.service.UserRoleService; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.*; + +import java.util.Collections; +import java.util.List; +import java.util.Map; + +@RestController +@RequestMapping("/api/user-roles") +public class UserRoleController { + + private static final Logger log = LoggerFactory.getLogger(UserRoleController.class); + + @Autowired + private UserRoleService userRoleService; + + @PostMapping("/fetchRoles") + public ResponseEntity>> getAllRolesAndAssignedRoles(@RequestBody UserRequestDTO userRequestDTO) { + try { + String email = userRequestDTO.getEmail(); + String employeeTransCode = userRequestDTO.getEmployeeTransCode(); + + List rolesWithAssignmentInfo = userRoleService.getAllRolesWithAssignmentInfo(email, employeeTransCode); + + if (rolesWithAssignmentInfo.isEmpty()) { + log.debug("No roles available or assigned for email: {} and employeeTransCode: {}", email, employeeTransCode); + return ResponseEntity.status(HttpStatus.NOT_FOUND) + .body(new Response<>(404, "No roles found for the given user.", Collections.emptyList())); + } + + return ResponseEntity.ok(new Response<>(200, "Roles fetched successfully.", rolesWithAssignmentInfo)); + } catch (Exception e) { + log.error("Error while fetching roles: {}", e.getMessage()); + return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR) + .body(new Response<>(500, "An error occurred while fetching roles.", null)); + } + } + + @PostMapping("/assignRoles") + public ResponseEntity> assignRolesToUser(@RequestBody AssignRolesRequestDTO requestDTO) { + try { + String email = requestDTO.getEmail(); + String employeeTransCode = requestDTO.getEmployeeTransCode(); + List selectedRoleIds = requestDTO.getSelectedRoleIds(); + int createdBy = requestDTO.getCreatedBy(); + int lastUpdatedBy = requestDTO.getLastUpdatedBy(); + + boolean success = userRoleService.assignSelectedRolesToUser(email, employeeTransCode, selectedRoleIds, createdBy, lastUpdatedBy); + + if (success) { + return ResponseEntity.ok(new Response<>(200, "Roles assigned successfully.", "Success")); + } else { + log.debug("Roles assignment failed for email: {} and employeeTransCode: {}", email, employeeTransCode); + return ResponseEntity.status(HttpStatus.NOT_FOUND) + .body(new Response<>(404, "User not found or no changes were made to roles.", "Failure")); + } + } catch (Exception e) { + log.error("Error while assigning roles: {}", e.getMessage()); + return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR) + .body(new Response<>(500, "An error occurred while assigning roles.", null)); + } + } + + @GetMapping("/userrole_dropdown") + public ResponseEntity>> getDropDownValues() { + try { + // Fetch dropdown values from the service + Map dropDownValues = userRoleService.getDropDownValues(); + + // Check if an error occurred in the service layer + if (dropDownValues.containsKey("error")) { + return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR) + .body(new Response<>(500, "Failed to fetch dropdown values.", null)); + } + + // Return successful response + return ResponseEntity.ok(new Response<>(200, "Dropdown values fetched successfully.", dropDownValues)); + } catch (Exception e) { + log.error("Error while fetching dropdown values: {}", e.getMessage()); + return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR) + .body(new Response<>(500, "An error occurred while fetching dropdown values.", null)); + } + } +} + + + + +//@RestController +//@RequestMapping("/api/user-roles") +//public class UserRoleController { +// +// private static final Logger log = LoggerFactory.getLogger(UserRoleController.class); +// +// @Autowired +// private UserRoleService userRoleService; +// +// @PostMapping("/fetchRoles") +// public ResponseEntity> getAllRolesAndAssignedRoles(@RequestBody UserRequestDTO userRequestDTO) { +// String email = userRequestDTO.getEmail(); +// String employeeTransCode = userRequestDTO.getEmployeeTransCode(); +// +// List rolesWithAssignmentInfo = userRoleService.getAllRolesWithAssignmentInfo(email, employeeTransCode); +// +// if (rolesWithAssignmentInfo.isEmpty()) { +// log.debug("No roles available or assigned for email: {} and employeeTransCode: {}", email, employeeTransCode); +// return ResponseEntity.status(HttpStatus.NOT_FOUND).body(Collections.emptyList()); +// } +// +// return ResponseEntity.ok(rolesWithAssignmentInfo); +// } +// +// @PostMapping("/assignRoles") +// public ResponseEntity assignRolesToUser(@RequestBody AssignRolesRequestDTO requestDTO) { +// String email = requestDTO.getEmail(); +// String employeeTransCode = requestDTO.getEmployeeTransCode(); +// List selectedRoleIds = requestDTO.getSelectedRoleIds(); +// int createdBy = requestDTO.getCreatedBy(); +// int lastUpdatedBy = requestDTO.getLastUpdatedBy(); +// +// boolean success = userRoleService.assignSelectedRolesToUser(email, employeeTransCode, selectedRoleIds, createdBy, lastUpdatedBy); +// +// if (success) { +// return ResponseEntity.ok("Roles assigned successfully."); +// } else { +// log.debug("Roles assignment failed for email: {} and employeeTransCode: {}", email, employeeTransCode); +// return ResponseEntity.status(HttpStatus.NOT_FOUND).body("User not found or roles could not be assigned."); +// } +// } +// +// @GetMapping("userrole_dropdown") +// public ResponseEntity>> getDropDownValues() { +// try { +// // Fetch dropdown values from the service +// Map dropDownValues = userRoleService.getDropDownValues(); +// +// // Check if an error occurred in the service layer +// if (dropDownValues.containsKey("error")) { +// return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR) +// .body(new Response<>(500, "Failed to fetch dropdown values.", null)); +// } +// +// // Return successful response +// return ResponseEntity.ok(new Response<>(200, "Dropdown values fetched successfully.", dropDownValues)); +// +// } catch (Exception e) { +// // Log the exception and return a generic error response +// log.error("Error while fetching dropdown values: {}", e.getMessage()); +// return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR) +// .body(new Response<>(500, "An error occurred while fetching dropdown values.", null)); +// } +// } +//} diff --git a/src/main/java/com/sahyog/app/inbound/user/controller/UserTypeController.java b/src/main/java/com/sahyog/app/inbound/user/controller/UserTypeController.java new file mode 100644 index 0000000..95741c4 --- /dev/null +++ b/src/main/java/com/sahyog/app/inbound/user/controller/UserTypeController.java @@ -0,0 +1,147 @@ +package com.sahyog.app.inbound.user.controller; + +import java.util.Collections; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.data.domain.Page; +import org.springframework.data.domain.Pageable; +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PatchMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.PutMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.RestController; + +import com.sahyog.app.inbound.user.dto.UserTypeDTO; +import com.sahyog.app.inbound.user.model.Response; +import com.sahyog.app.inbound.user.model.UserType; +import com.sahyog.app.inbound.user.model.UserType1; +import com.sahyog.app.inbound.user.service.UserTypeService; + + + @RestController + @RequestMapping("/api/user-types") + public class UserTypeController { + + private static final Logger log = LoggerFactory.getLogger(UserTypeController.class); + + @Autowired + private UserTypeService userTypeService; + + + @PostMapping("/createUserType") + public ResponseEntity>>> createUserType(@RequestBody UserTypeDTO userTypeDTO) { + log.info("Received request to create/update user type: {}", userTypeDTO); + + try { + Response>> response = userTypeService.createUserType(userTypeDTO); + log.info("User Type created/updated successfully. Response: {}", response); + return ResponseEntity.status(HttpStatus.CREATED).body(response); + } catch (Exception e) { + log.error("Error occurred while processing user type creation: {}", e.getMessage(), e); + return ResponseEntity.status(HttpStatus.BAD_REQUEST) + .body(Response.error(400, "Error: " + e.getMessage()).withData(Collections.emptyList())); + } + } + +// public ResponseEntity createUserType(@RequestBody @Valid UserTypeDTO userTypeDTO) +// @PostMapping("/create") +// public ResponseEntity createUserType(@RequestBody UserType1 userTypeDTO) { +// log.info("123Received payload: {}", userTypeDTO); +// log.info("line 40"); +// UserType createdUserType = userTypeService.createUserType(userTypeDTO); +// return ResponseEntity.status(HttpStatus.CREATED).body(createdUserType); +// } + +// @PostMapping("/create") +// public String createUserType(@RequestBody Map req) { +// System.out.println("line 46"); +// log.info("Received payload: {}", req); +// return "data found"; +//// UserType createdUserType = userTypeService.createUserType(userTypeDTO); +//// return ResponseEntity.status(HttpStatus.CREATED).body(createdUserType); +// } + + @PostMapping("/usertypedetails") + public ResponseEntity>>> getUsertypeDetails( + @RequestBody Map req, Pageable pageable) { + log.info("Received request to fetch usertype details with filters: {} and pagination: {}", req, pageable); + + // Handle the service call to fetch usertype details + try { + Page> usertypeDetails = userTypeService.getUsertypeDetails(req, pageable); + + if (usertypeDetails.isEmpty()) { + return ResponseEntity.ok(new Response<>(204, "No usertype details found", usertypeDetails)); + } + return ResponseEntity.ok(new Response<>(200, "Usertype details fetched successfully", usertypeDetails)); + + } catch (Exception e) { + log.error("Error fetching usertype details.", e); + return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).body( + new Response<>(500, "An error occurred while fetching usertype details.", null) + ); + } + } + @GetMapping("/{userTypeId}") + public ResponseEntity> getUserTypeById(@PathVariable short userTypeId) { + log.info("Fetching user type with ID: {}", userTypeId); + + try { + UserType userType = userTypeService.getUserTypeById(userTypeId); + return ResponseEntity.ok(Response.success(userType)); + } catch (RuntimeException e) { + return ResponseEntity.status(HttpStatus.NOT_FOUND) + .body(Response.error(404, "Error: " + e.getMessage())); + } + } + + @PatchMapping("/update-status/{userTypeId}") + public ResponseEntity> updateUserTypeStatus(@PathVariable short userTypeId) { + try { + userTypeService.updateUserTypeStatus(userTypeId); + return ResponseEntity.ok(Response.success("UserType status updated successfully.")); + } catch (RuntimeException e) { + return ResponseEntity.status(HttpStatus.NOT_FOUND) + .body(Response.error(404, "Error: " + e.getMessage())); + } catch (Exception e) { + return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR) + .body(Response.error(500, "An unexpected error occurred: " + e.getMessage())); + } + } + + @GetMapping("usertype_dropdown") + public ResponseEntity>> getDropDownValues() { + try { + // Fetch dropdown values from the service + Map dropDownValues = userTypeService.getDropDownValues(); + + // Check if an error occurred in the service layer + if (dropDownValues.containsKey("error")) { + return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR) + .body(new Response<>(500, "Failed to fetch dropdown values.", null)); + } + + // Return successful response + return ResponseEntity.ok(new Response<>(200, "Dropdown values fetched successfully.", dropDownValues)); + + } catch (Exception e) { + // Log the exception and return a generic error response + log.error("Error while fetching dropdown values: {}", e.getMessage()); + return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR) + .body(new Response<>(500, "An error occurred while fetching dropdown values.", null)); + } + } + + } \ No newline at end of file diff --git a/src/main/java/com/sahyog/app/inbound/user/dto/AssignPlantsRequestDTO.java b/src/main/java/com/sahyog/app/inbound/user/dto/AssignPlantsRequestDTO.java new file mode 100644 index 0000000..8d93a14 --- /dev/null +++ b/src/main/java/com/sahyog/app/inbound/user/dto/AssignPlantsRequestDTO.java @@ -0,0 +1,23 @@ +package com.sahyog.app.inbound.user.dto; + +import java.util.List; + +import lombok.AllArgsConstructor; +import lombok.Getter; +import lombok.NoArgsConstructor; +import lombok.Setter; +import lombok.ToString; +@Getter +@Setter +@NoArgsConstructor +@AllArgsConstructor +@ToString +public class AssignPlantsRequestDTO { + + private String email; + private String employeeTransCode; + private List selectedPlantIds; // List of role IDs selected by the user + private int createdBy; + private int lastUpdatedBy; + +} diff --git a/src/main/java/com/sahyog/app/inbound/user/dto/AssignRolesRequestDTO.java b/src/main/java/com/sahyog/app/inbound/user/dto/AssignRolesRequestDTO.java new file mode 100644 index 0000000..9d8a075 --- /dev/null +++ b/src/main/java/com/sahyog/app/inbound/user/dto/AssignRolesRequestDTO.java @@ -0,0 +1,25 @@ +package com.sahyog.app.inbound.user.dto; + +import java.util.List; + +import lombok.AllArgsConstructor; +import lombok.Getter; +import lombok.NoArgsConstructor; +import lombok.Setter; +import lombok.ToString; + +@Getter +@Setter +@NoArgsConstructor +@AllArgsConstructor +@ToString +public class AssignRolesRequestDTO { + + private String email; + private String employeeTransCode; + private List selectedRoleIds; + private int createdBy; + private int lastUpdatedBy; // List of role IDs selected by the user + + +} diff --git a/src/main/java/com/sahyog/app/inbound/user/dto/MaterialMasterDTO.java b/src/main/java/com/sahyog/app/inbound/user/dto/MaterialMasterDTO.java new file mode 100644 index 0000000..b198f1e --- /dev/null +++ b/src/main/java/com/sahyog/app/inbound/user/dto/MaterialMasterDTO.java @@ -0,0 +1,28 @@ +package com.sahyog.app.inbound.user.dto; + +import com.sahyog.app.inbound.user.enums.Status; + +import lombok.AllArgsConstructor; +import lombok.Getter; +import lombok.NoArgsConstructor; +import lombok.Setter; +import lombok.ToString; + +@Getter +@Setter +@AllArgsConstructor +@NoArgsConstructor +@ToString +public class MaterialMasterDTO { + + private Integer materialId; + private String materialCode; + private String materialDescription; + private String materialGroup; + private String materialGroupDesc; + private int plantId; + private Status status; + private int createdBy; + private int lastUpdatedBy; + +} diff --git a/src/main/java/com/sahyog/app/inbound/user/dto/PlantDTO.java b/src/main/java/com/sahyog/app/inbound/user/dto/PlantDTO.java new file mode 100644 index 0000000..62e3572 --- /dev/null +++ b/src/main/java/com/sahyog/app/inbound/user/dto/PlantDTO.java @@ -0,0 +1,30 @@ +package com.sahyog.app.inbound.user.dto; + +import java.math.BigDecimal; + +import com.sahyog.app.inbound.user.enums.Status; + +import lombok.AllArgsConstructor; +import lombok.Getter; +import lombok.NoArgsConstructor; +import lombok.Setter; +import lombok.ToString; +@Getter +@Setter +@AllArgsConstructor +@NoArgsConstructor +@ToString +public class PlantDTO { + + private Short plantId; + private String plantCode; + private String plantDesc; + private String plantPan; + private String plantGst; + private BigDecimal plantGstRate; + private String addedChannel; + private Status status; + private int createdBy; + private int lastUpdatedBy; + +} diff --git a/src/main/java/com/sahyog/app/inbound/user/dto/PlantMasterDTO.java b/src/main/java/com/sahyog/app/inbound/user/dto/PlantMasterDTO.java new file mode 100644 index 0000000..974a309 --- /dev/null +++ b/src/main/java/com/sahyog/app/inbound/user/dto/PlantMasterDTO.java @@ -0,0 +1,35 @@ +package com.sahyog.app.inbound.user.dto; + +import java.math.BigDecimal; + +import com.sahyog.app.inbound.user.enums.Status; + +import lombok.AllArgsConstructor; +import lombok.Getter; +import lombok.NoArgsConstructor; +import lombok.Setter; +import lombok.ToString; + + +@Getter +@Setter +@NoArgsConstructor +@AllArgsConstructor +@ToString +public class PlantMasterDTO { + private Short plantId; + private String plantCode; + private String plantDesc; + private String plantPan; + private String plantGst; + private BigDecimal plantGstRate; + private String addedChannel; + private Status status; + private Integer createdBy; + private Integer lastUpdatedBy; + + // Field to indicate if the plant is assigned to the user + private boolean assigned; + + // Getters and Setters +} diff --git a/src/main/java/com/sahyog/app/inbound/user/dto/RoleDTO.java b/src/main/java/com/sahyog/app/inbound/user/dto/RoleDTO.java new file mode 100644 index 0000000..ca464a5 --- /dev/null +++ b/src/main/java/com/sahyog/app/inbound/user/dto/RoleDTO.java @@ -0,0 +1,33 @@ +package com.sahyog.app.inbound.user.dto; + + +import com.sahyog.app.inbound.user.model.User; +import com.sahyog.app.inbound.user.model.UserType; + +import jakarta.persistence.Column; +import jakarta.persistence.FetchType; +import jakarta.persistence.JoinColumn; +import jakarta.persistence.ManyToOne; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.Getter; +import lombok.NoArgsConstructor; +import lombok.Setter; +import lombok.ToString; + +@Getter +@Setter +@NoArgsConstructor +@AllArgsConstructor +@ToString +@Data +public class RoleDTO { + private int roleId; + private String roleName; + private String roleDescription; + private short userTypeId; + private String status; + private int createdBy; + private int lastUpdatedBy; + private boolean assigned; +} diff --git a/src/main/java/com/sahyog/app/inbound/user/dto/TransporterMasterDto.java b/src/main/java/com/sahyog/app/inbound/user/dto/TransporterMasterDto.java new file mode 100644 index 0000000..07f7cb0 --- /dev/null +++ b/src/main/java/com/sahyog/app/inbound/user/dto/TransporterMasterDto.java @@ -0,0 +1,52 @@ +package com.sahyog.app.inbound.user.dto; + +import java.time.LocalDate; +import java.time.LocalDateTime; +import lombok.Getter; +import lombok.Setter; +import lombok.ToString; + +@Getter +@Setter +@ToString +public class TransporterMasterDto { + private int transporterId; + private short plantId; + private String plantCode; + private int userId; + private String supplierCode; + private String bpGrouping; + private String transporterCode; + private String supplierAccountGroup; + private String transporterName; + private String transporterFirstName; + private String transporterMiddleName; + private String transporterLastName; + private String legalEntity; + private String permanentAccountNumber; + private String street; + private String houseNumber; + private String district; + private String differentCity; + private String postalCode; + private String city; + private String country; + private String state; + private String mobileNumber; + private String emailId; + private String gstn; + private String taxRegime; + private String shortCode; + private LocalDate createdDate; + private LocalDate updationDate; + private String taxCodeDesc; + private int taxRate; + private String status; + private int createdBy; + private int lastUpdatedBy; + private LocalDateTime lastUpdatedOn; + + public TransporterMasterDto() { + + } +} \ No newline at end of file diff --git a/src/main/java/com/sahyog/app/inbound/user/dto/TransporterResponse.java b/src/main/java/com/sahyog/app/inbound/user/dto/TransporterResponse.java new file mode 100644 index 0000000..d14aec5 --- /dev/null +++ b/src/main/java/com/sahyog/app/inbound/user/dto/TransporterResponse.java @@ -0,0 +1,38 @@ +package com.sahyog.app.inbound.user.dto; + +import java.math.BigDecimal; + +import lombok.AllArgsConstructor; +import lombok.Getter; +import lombok.NoArgsConstructor; +import lombok.Setter; +import lombok.ToString; +@Getter +@Setter +@AllArgsConstructor +@NoArgsConstructor +@ToString +public class TransporterResponse { + private String supplierCode; + private String transporterName; + private String supplierAccountGroup; + private String state; + private String bpGrouping; + private String legalEntity; + private String permanentAccountNumber; + private String street; + private String houseNumber; + private String district; + private String differentCity; + private String postalCode; + private String city; + private String country; + private String mobileNumber; + private String emailId; + private String gstn; + private String taxRegime; + private String shortCode; + private String status; + private String taxCodeDesc; + private int taxRate; +} diff --git a/src/main/java/com/sahyog/app/inbound/user/dto/TransporterUpdateDTO.java b/src/main/java/com/sahyog/app/inbound/user/dto/TransporterUpdateDTO.java new file mode 100644 index 0000000..a58feef --- /dev/null +++ b/src/main/java/com/sahyog/app/inbound/user/dto/TransporterUpdateDTO.java @@ -0,0 +1,59 @@ +package com.sahyog.app.inbound.user.dto; + +import java.time.LocalDate; +import java.time.LocalDateTime; + +import com.sahyog.app.inbound.user.model.User; + +import lombok.AllArgsConstructor; +import lombok.Getter; +import lombok.NoArgsConstructor; +import lombok.Setter; +import lombok.ToString; + +@Getter +@Setter +@NoArgsConstructor +@AllArgsConstructor +@ToString +public class TransporterUpdateDTO { + private int transporterId; + private short plantId; + private String plantCode; + private int userId; + private String supplierCode; + private String bpGrouping; + private String transporterCode; + private String supplierAccountGroup; + private String transporterName; + private String transporterFirstName; + private String transporterMiddleName; + private String transporterLastName; + private String legalEntity; + private String permanentAccountNumber; + private String street; + private String houseNumber; + private String district; + private String differentCity; + private String postalCode; + private String city; + private String country; + private String state; + private String mobileNumber; + private String emailId; + private String gstn; + private String taxRegime; + private String shortCode; + private LocalDate createdDate; + private LocalDate updationDate; + private String taxCodeDesc; + private int taxRate; + private String status; + private int createdBy; + private int lastUpdatedBy; + private LocalDateTime lastUpdatedOn; + + + +} + diff --git a/src/main/java/com/sahyog/app/inbound/user/dto/UserDTO.java b/src/main/java/com/sahyog/app/inbound/user/dto/UserDTO.java new file mode 100644 index 0000000..4fa0fd3 --- /dev/null +++ b/src/main/java/com/sahyog/app/inbound/user/dto/UserDTO.java @@ -0,0 +1,44 @@ +package com.sahyog.app.inbound.user.dto; + +import java.time.LocalDateTime; + +import com.sahyog.app.inbound.user.enums.Status; +import com.sahyog.app.inbound.user.model.User; +import com.sahyog.app.inbound.user.model.UserType; + +import jakarta.persistence.Column; +import jakarta.persistence.Entity; +import jakarta.persistence.EnumType; +import jakarta.persistence.Enumerated; +import jakarta.persistence.FetchType; +import jakarta.persistence.GeneratedValue; +import jakarta.persistence.GenerationType; +import jakarta.persistence.Id; +import jakarta.persistence.JoinColumn; +import jakarta.persistence.ManyToOne; +import lombok.AllArgsConstructor; +import lombok.Getter; +import lombok.NoArgsConstructor; +import lombok.Setter; +import lombok.ToString; +@Getter +@Setter +@NoArgsConstructor +@AllArgsConstructor +@ToString +public class UserDTO { + private int userId; // + private short userTypeId; + private String userName; + private String firstName; + private String lastName; + private String email; + private String mobile; + private String employeeTransCode; + private String addedChannel; + private Status status; // Typically a char field like 'A' or 'I' + private int createdBy; // Self-reference for the creator + private int lastUpdatedBy; // Self-reference for the last updater +// private LocalDateTime lastUpdatedOn; +} + diff --git a/src/main/java/com/sahyog/app/inbound/user/dto/UserPlantDTO.java b/src/main/java/com/sahyog/app/inbound/user/dto/UserPlantDTO.java new file mode 100644 index 0000000..bf172a8 --- /dev/null +++ b/src/main/java/com/sahyog/app/inbound/user/dto/UserPlantDTO.java @@ -0,0 +1,41 @@ +package com.sahyog.app.inbound.user.dto; + +import com.sahyog.app.inbound.user.enums.Status; + +import jakarta.persistence.Column; +import jakarta.persistence.Entity; +import jakarta.persistence.EnumType; +import jakarta.persistence.Enumerated; +import jakarta.persistence.GeneratedValue; +import jakarta.persistence.GenerationType; +import jakarta.persistence.Id; +import jakarta.persistence.Table; +import lombok.AllArgsConstructor; +import lombok.Getter; +import lombok.NoArgsConstructor; +import lombok.Setter; +import lombok.ToString; + +@Getter +@Setter +@NoArgsConstructor +@AllArgsConstructor +@ToString +public class UserPlantDTO { + + + private int userPlantId; + + private int userId; + + private int plantId; + + private Status status; + + private boolean assigned; + + private int createdBy; + + private int lastUpdatedBy; + +} diff --git a/src/main/java/com/sahyog/app/inbound/user/dto/UserRequestDTO.java b/src/main/java/com/sahyog/app/inbound/user/dto/UserRequestDTO.java new file mode 100644 index 0000000..148c016 --- /dev/null +++ b/src/main/java/com/sahyog/app/inbound/user/dto/UserRequestDTO.java @@ -0,0 +1,18 @@ +package com.sahyog.app.inbound.user.dto; + +import lombok.AllArgsConstructor; +import lombok.Getter; +import lombok.NoArgsConstructor; +import lombok.Setter; +import lombok.ToString; + +@Getter +@Setter +@AllArgsConstructor +@NoArgsConstructor +@ToString +public class UserRequestDTO { + + private String email; + private String employeeTransCode; +} diff --git a/src/main/java/com/sahyog/app/inbound/user/dto/UserRoleDTO.java b/src/main/java/com/sahyog/app/inbound/user/dto/UserRoleDTO.java new file mode 100644 index 0000000..c8fc44e --- /dev/null +++ b/src/main/java/com/sahyog/app/inbound/user/dto/UserRoleDTO.java @@ -0,0 +1,27 @@ +package com.sahyog.app.inbound.user.dto; + +import com.sahyog.app.inbound.user.enums.Status; +import com.sahyog.app.inbound.user.model.Role; +import com.sahyog.app.inbound.user.model.User; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.Getter; +import lombok.NoArgsConstructor; +import lombok.Setter; +@Getter +@Setter +@NoArgsConstructor +@AllArgsConstructor +@Data +public class UserRoleDTO { + + private int userRoleId; + private int userId; + private int roleId; + private Status status; + private int createdBy; + private int lastUpdatedBy; + + +} diff --git a/src/main/java/com/sahyog/app/inbound/user/dto/UserTypeCreateDTO.java b/src/main/java/com/sahyog/app/inbound/user/dto/UserTypeCreateDTO.java new file mode 100644 index 0000000..a499a8f --- /dev/null +++ b/src/main/java/com/sahyog/app/inbound/user/dto/UserTypeCreateDTO.java @@ -0,0 +1,20 @@ +package com.sahyog.app.inbound.user.dto; + +import com.sahyog.app.inbound.user.enums.Status; + +import lombok.AllArgsConstructor; +import lombok.Getter; +import lombok.NoArgsConstructor; +import lombok.Setter; +import lombok.ToString; + +@Getter +@Setter +@AllArgsConstructor +@NoArgsConstructor +@ToString +public class UserTypeCreateDTO { + private String usertypeName; + private Status status; + +} diff --git a/src/main/java/com/sahyog/app/inbound/user/dto/UserTypeDTO.java b/src/main/java/com/sahyog/app/inbound/user/dto/UserTypeDTO.java new file mode 100644 index 0000000..a5aa80e --- /dev/null +++ b/src/main/java/com/sahyog/app/inbound/user/dto/UserTypeDTO.java @@ -0,0 +1,29 @@ +package com.sahyog.app.inbound.user.dto; + +import com.sahyog.app.inbound.user.enums.Status; + +import jakarta.persistence.Column; +import jakarta.persistence.FetchType; +import jakarta.persistence.JoinColumn; +import jakarta.persistence.ManyToOne; +import lombok.AllArgsConstructor; +import lombok.Getter; +import lombok.NoArgsConstructor; +import lombok.Setter; +import lombok.ToString; + +@Getter +@Setter +@NoArgsConstructor +@AllArgsConstructor +@ToString +public class UserTypeDTO { + + private String userTypeName; + private String status; // A or I + private int createdBy; + private int lastUpdatedBy; +} + + + diff --git a/src/main/java/com/sahyog/app/inbound/user/dto/UserUpdateDTO.java b/src/main/java/com/sahyog/app/inbound/user/dto/UserUpdateDTO.java new file mode 100644 index 0000000..6e147ea --- /dev/null +++ b/src/main/java/com/sahyog/app/inbound/user/dto/UserUpdateDTO.java @@ -0,0 +1,34 @@ +package com.sahyog.app.inbound.user.dto; + +import java.time.LocalDateTime; + +import com.sahyog.app.inbound.user.enums.Status; + +import lombok.AllArgsConstructor; +import lombok.Getter; +import lombok.NoArgsConstructor; +import lombok.Setter; +import lombok.ToString; + +@Getter +@Setter +@AllArgsConstructor +@NoArgsConstructor +@ToString +public class UserUpdateDTO { + private int userId; + private short userTypeId; + private String userName; + private String firstName; + private String middleName; + private String lastName; + private String emailId; + private String phoneNumber; + private String userEmpTransCode; + private String addedChannel; + private Status status; + private int createdBy; + private int lastUpdatedBy; + private LocalDateTime lastUpdatedOn; + +} diff --git a/src/main/java/com/sahyog/app/inbound/user/enums/RoleType.java b/src/main/java/com/sahyog/app/inbound/user/enums/RoleType.java new file mode 100644 index 0000000..71c021f --- /dev/null +++ b/src/main/java/com/sahyog/app/inbound/user/enums/RoleType.java @@ -0,0 +1,20 @@ +package com.sahyog.app.inbound.user.enums; + + + public enum RoleType { + ADMIN("Admin"), + GUEST("Guest"), + USER("User"), + MANAGER("Manager"); + + private final String name; + + RoleType(String name) { + this.name = name; + } + + public String getName() { + return name; + } + +} diff --git a/src/main/java/com/sahyog/app/inbound/user/enums/Status.java b/src/main/java/com/sahyog/app/inbound/user/enums/Status.java new file mode 100644 index 0000000..61eb1c4 --- /dev/null +++ b/src/main/java/com/sahyog/app/inbound/user/enums/Status.java @@ -0,0 +1,7 @@ +package com.sahyog.app.inbound.user.enums; + +public enum Status { + + A, + I +} diff --git a/src/main/java/com/sahyog/app/inbound/user/enums/UserType.java b/src/main/java/com/sahyog/app/inbound/user/enums/UserType.java new file mode 100644 index 0000000..5fc56b8 --- /dev/null +++ b/src/main/java/com/sahyog/app/inbound/user/enums/UserType.java @@ -0,0 +1,6 @@ +package com.sahyog.app.inbound.user.enums; + +public enum UserType { + INTERNAL, + TRANSPORTER +} diff --git a/src/main/java/com/sahyog/app/inbound/user/enums/UserTypeEnum.java b/src/main/java/com/sahyog/app/inbound/user/enums/UserTypeEnum.java new file mode 100644 index 0000000..b189fe3 --- /dev/null +++ b/src/main/java/com/sahyog/app/inbound/user/enums/UserTypeEnum.java @@ -0,0 +1,27 @@ +package com.sahyog.app.inbound.user.enums; + +public enum UserTypeEnum { + TRANSPORTER("Transporter"), + MIS("MIS"); + + private final String userTypeName; + + UserTypeEnum(String userTypeName) { + this.userTypeName = userTypeName; + } + + public String getUserTypeName() { + return userTypeName; + } + + // Method to get UserTypeEnum by userTypeName + public static UserTypeEnum fromString(String userTypeName) { + for (UserTypeEnum userType : values()) { + if (userType.getUserTypeName().equalsIgnoreCase(userTypeName)) { + return userType; + } + } + throw new IllegalArgumentException("No enum constant with name " + userTypeName); + } +} + diff --git a/src/main/java/com/sahyog/app/inbound/user/exception/CustomException.java b/src/main/java/com/sahyog/app/inbound/user/exception/CustomException.java new file mode 100644 index 0000000..38e8566 --- /dev/null +++ b/src/main/java/com/sahyog/app/inbound/user/exception/CustomException.java @@ -0,0 +1,14 @@ +package com.sahyog.app.inbound.user.exception; + +public class CustomException extends RuntimeException { + + public CustomException(String message) { + super(message); + } + + public CustomException(String message, Throwable cause) { + super(message, cause); + } + + +} \ No newline at end of file diff --git a/src/main/java/com/sahyog/app/inbound/user/exception/GlobalExceptionHandler.java b/src/main/java/com/sahyog/app/inbound/user/exception/GlobalExceptionHandler.java new file mode 100644 index 0000000..d901c49 --- /dev/null +++ b/src/main/java/com/sahyog/app/inbound/user/exception/GlobalExceptionHandler.java @@ -0,0 +1,128 @@ +package com.sahyog.app.inbound.user.exception; + +import java.util.HashMap; +import java.util.Map; +import java.util.stream.Collectors; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.ControllerAdvice; +import org.springframework.web.bind.annotation.ExceptionHandler; + +import com.sahyog.app.inbound.user.model.Response; + +import jakarta.validation.ConstraintViolation; +import jakarta.validation.ConstraintViolationException; +@ControllerAdvice +public class GlobalExceptionHandler { + + private static final Logger log = LoggerFactory.getLogger(GlobalExceptionHandler.class); + + @ExceptionHandler(RoleAlreadyExistsException.class) + public ResponseEntity handleRoleAlreadyExistsException(RoleAlreadyExistsException ex) { + log.error("RoleAlreadyExistsException occurred: {}", ex.getMessage(), ex); + return new ResponseEntity<>(ex.getMessage(), HttpStatus.CONFLICT); + } + + @ExceptionHandler(UserAlreadyExistsException.class) + public ResponseEntity handleUserAlreadyExistsException(UserAlreadyExistsException ex) { + log.error("UserAlreadyExistsException occurred: {}", ex.getMessage(), ex); + return ResponseEntity.status(HttpStatus.CONFLICT).body(ex.getMessage()); + } + + @ExceptionHandler(IllegalArgumentException.class) + public ResponseEntity handleIllegalArgumentException(IllegalArgumentException ex) { + log.warn("IllegalArgumentException occurred: {}", ex.getMessage(), ex); + return ResponseEntity.status(HttpStatus.BAD_REQUEST).body(ex.getMessage()); + } + + @ExceptionHandler(TransporterCreationException.class) + public ResponseEntity> handleTransporterCreationException(TransporterCreationException ex) { + log.error("Transporter creation error: {}", ex.getMessage()); + return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR) + .body(Response.error(500, ex.getMessage())); + } + + @ExceptionHandler(TransporterUpdateException.class) + public ResponseEntity> handleTransporterUpdateException(TransporterUpdateException ex) { + log.error("Transporter update error: {}", ex.getMessage()); + return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR) + .body(Response.error(500, ex.getMessage())); + } + + @ExceptionHandler(TransporterProcessingException.class) + public ResponseEntity> handleTransporterProcessingException(TransporterProcessingException ex) { + log.error("Transporter processing error: {}", ex.getMessage()); + return ResponseEntity.status(HttpStatus.PARTIAL_CONTENT) + .body(Response.error(207, ex.getMessage())); + } + + @ExceptionHandler(TransporterValidationException.class) + public ResponseEntity> handleTransporterValidationException(TransporterValidationException e) { + // Log the error and return a response + String errorMessage = e.getErrorMessage(); + log.error("Transporter validation error occurred for supplier code: {}", e.getSupplierCode(), e); + + return ResponseEntity.status(HttpStatus.BAD_REQUEST) + .body(Response.error(HttpStatus.BAD_REQUEST.value(), "Validation error") + .withMessage(errorMessage) + .withDetails("Please check the provided data.")); + } + + + @ExceptionHandler(ConstraintViolationException.class) + public ResponseEntity> handleConstraintViolationException(ConstraintViolationException e) { + // Extracting only the violation message (e.g., "Invalid PAN format") + String violations = e.getConstraintViolations().stream() + .map(violation -> violation.getMessage()) // Getting the violation message + .collect(Collectors.joining("; ")); // Joining multiple violations with a semicolon + + // Creating user-friendly error message and details + String errorMessage = "Validation failed: " + violations; + String errorDetails = "Please check the provided data. Violations: " + violations; + + // Return the response with status 400 (Bad Request) + Response response = Response.error(HttpStatus.BAD_REQUEST.value(), errorMessage) + .withMessage(errorMessage) + .withDetails(errorDetails); + + return ResponseEntity.status(HttpStatus.BAD_REQUEST) + .body(response); + } + + + @ExceptionHandler(Exception.class) + public ResponseEntity> handleGeneralException(Exception e) { + // Log the full exception + log.error("An unexpected error occurred: {}", e.getMessage(), e); + + // Get the root cause of the exception + Throwable rootCause = getRootCause(e); + + // Simplified error message based on the root cause + String errorMessage = "An unexpected error occurred: " + rootCause.getMessage(); + + // Simplified details (including root cause) + String errorDetails = "Please check the provided data or system configuration. Root cause: " + rootCause.getClass().getSimpleName() + ": " + rootCause.getMessage(); + + // Construct response with status 500 + Response response = Response.error(HttpStatus.INTERNAL_SERVER_ERROR.value(), errorMessage) + .withMessage(errorMessage) + .withDetails(errorDetails); + + return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR) + .body(response); + } + + + private Throwable getRootCause(Throwable throwable) { + Throwable rootCause = throwable; + while (rootCause.getCause() != null && rootCause != rootCause.getCause()) { + rootCause = rootCause.getCause(); + } + return rootCause; + } + +} diff --git a/src/main/java/com/sahyog/app/inbound/user/exception/RoleAlreadyExistsException.java b/src/main/java/com/sahyog/app/inbound/user/exception/RoleAlreadyExistsException.java new file mode 100644 index 0000000..3c0bd9b --- /dev/null +++ b/src/main/java/com/sahyog/app/inbound/user/exception/RoleAlreadyExistsException.java @@ -0,0 +1,7 @@ +package com.sahyog.app.inbound.user.exception; + +public class RoleAlreadyExistsException extends RuntimeException { + public RoleAlreadyExistsException(String message) { + super(message); + } +} diff --git a/src/main/java/com/sahyog/app/inbound/user/exception/RoleNotFoundException.java b/src/main/java/com/sahyog/app/inbound/user/exception/RoleNotFoundException.java new file mode 100644 index 0000000..5cb0d9a --- /dev/null +++ b/src/main/java/com/sahyog/app/inbound/user/exception/RoleNotFoundException.java @@ -0,0 +1,7 @@ +package com.sahyog.app.inbound.user.exception; + +public class RoleNotFoundException extends RuntimeException { + public RoleNotFoundException(String message) { + super(message); + } +} diff --git a/src/main/java/com/sahyog/app/inbound/user/exception/TransporterCreationException.java b/src/main/java/com/sahyog/app/inbound/user/exception/TransporterCreationException.java new file mode 100644 index 0000000..01fe67d --- /dev/null +++ b/src/main/java/com/sahyog/app/inbound/user/exception/TransporterCreationException.java @@ -0,0 +1,8 @@ +package com.sahyog.app.inbound.user.exception; + +public class TransporterCreationException extends TransporterProcessingException{ + + public TransporterCreationException(String message) { + super(message); + } +} diff --git a/src/main/java/com/sahyog/app/inbound/user/exception/TransporterProcessingException.java b/src/main/java/com/sahyog/app/inbound/user/exception/TransporterProcessingException.java new file mode 100644 index 0000000..873bc11 --- /dev/null +++ b/src/main/java/com/sahyog/app/inbound/user/exception/TransporterProcessingException.java @@ -0,0 +1,12 @@ +package com.sahyog.app.inbound.user.exception; + + +public class TransporterProcessingException extends RuntimeException { + public TransporterProcessingException(String message) { + super(message); + } + + public TransporterProcessingException(String message, Throwable cause) { + super(message, cause); + } +} \ No newline at end of file diff --git a/src/main/java/com/sahyog/app/inbound/user/exception/TransporterUpdateException.java b/src/main/java/com/sahyog/app/inbound/user/exception/TransporterUpdateException.java new file mode 100644 index 0000000..d312d3e --- /dev/null +++ b/src/main/java/com/sahyog/app/inbound/user/exception/TransporterUpdateException.java @@ -0,0 +1,7 @@ +package com.sahyog.app.inbound.user.exception; + +public class TransporterUpdateException extends TransporterProcessingException { + public TransporterUpdateException(String message) { + super(message); + } +} \ No newline at end of file diff --git a/src/main/java/com/sahyog/app/inbound/user/exception/TransporterValidationException.java b/src/main/java/com/sahyog/app/inbound/user/exception/TransporterValidationException.java new file mode 100644 index 0000000..596ab68 --- /dev/null +++ b/src/main/java/com/sahyog/app/inbound/user/exception/TransporterValidationException.java @@ -0,0 +1,21 @@ +package com.sahyog.app.inbound.user.exception; + +public class TransporterValidationException extends RuntimeException { + private String supplierCode; + private String errorMessage; + + public TransporterValidationException(String supplierCode, String errorMessage) { + super(errorMessage); + this.supplierCode = supplierCode; + this.errorMessage = errorMessage; + } + + public String getSupplierCode() { + return supplierCode; + } + + public String getErrorMessage() { + return errorMessage; + } +} + diff --git a/src/main/java/com/sahyog/app/inbound/user/exception/UserAlreadyExistsException.java b/src/main/java/com/sahyog/app/inbound/user/exception/UserAlreadyExistsException.java new file mode 100644 index 0000000..26e3f41 --- /dev/null +++ b/src/main/java/com/sahyog/app/inbound/user/exception/UserAlreadyExistsException.java @@ -0,0 +1,8 @@ +package com.sahyog.app.inbound.user.exception; + +public class UserAlreadyExistsException extends RuntimeException{ + public UserAlreadyExistsException(String message) { + super(message); + } + +} diff --git a/src/main/java/com/sahyog/app/inbound/user/exception/UserNotFoundException.java b/src/main/java/com/sahyog/app/inbound/user/exception/UserNotFoundException.java new file mode 100644 index 0000000..f49025f --- /dev/null +++ b/src/main/java/com/sahyog/app/inbound/user/exception/UserNotFoundException.java @@ -0,0 +1,8 @@ +package com.sahyog.app.inbound.user.exception; + + +public class UserNotFoundException extends RuntimeException { + public UserNotFoundException(String message) { + super(message); + } +} diff --git a/src/main/java/com/sahyog/app/inbound/user/filter/TransporterFilters.java b/src/main/java/com/sahyog/app/inbound/user/filter/TransporterFilters.java new file mode 100644 index 0000000..560792a --- /dev/null +++ b/src/main/java/com/sahyog/app/inbound/user/filter/TransporterFilters.java @@ -0,0 +1,34 @@ +package com.sahyog.app.inbound.user.filter; + +import org.springframework.data.jpa.domain.Specification; + +import com.sahyog.app.inbound.user.model.Transporter; + + +public class TransporterFilters { + + public static Specification filterBySupplierCode(String supplierCode) { + return (root, query, criteriaBuilder) -> + criteriaBuilder.equal(root.get("supplierCode"), supplierCode); + } + + public static Specification filterByTransporterName(String transporterName) { + return (root, query, criteriaBuilder) -> + criteriaBuilder.like(root.get("transporterName"), "%" + transporterName + "%"); + } + + public static Specification filterBySupplierAccountGroup(String supplierAccountGroup) { + return (root, query, criteriaBuilder) -> + criteriaBuilder.equal(root.get("supplierAccountGroup"), supplierAccountGroup); + } + + public static Specification filterByState(String state) { + return (root, query, criteriaBuilder) -> + criteriaBuilder.equal(root.get("state"), state); + } + + public static Specification filterByBpGrouping(String bpGrouping) { + return (root, query, criteriaBuilder) -> + criteriaBuilder.equal(root.get("bpGrouping"), bpGrouping); + } +} diff --git a/src/main/java/com/sahyog/app/inbound/user/mapper/MaterialMapper.java b/src/main/java/com/sahyog/app/inbound/user/mapper/MaterialMapper.java new file mode 100644 index 0000000..345a2d8 --- /dev/null +++ b/src/main/java/com/sahyog/app/inbound/user/mapper/MaterialMapper.java @@ -0,0 +1,48 @@ +package com.sahyog.app.inbound.user.mapper; + +import org.springframework.stereotype.Component; + +import com.sahyog.app.inbound.user.dto.MaterialMasterDTO; +import com.sahyog.app.inbound.user.enums.Status; +import com.sahyog.app.inbound.user.model.MaterialMaster; +import com.sahyog.app.inbound.user.model.User; + +@Component +public class MaterialMapper { + + public MaterialMaster toEntity(MaterialMasterDTO dto, User user) { + MaterialMaster material = new MaterialMaster(); +// material.setMaterialId(dto.getMaterialId()); + material.setMaterialCode(dto.getMaterialCode()); + material.setMaterialDescription(dto.getMaterialDescription()); + material.setMaterialGroup(dto.getMaterialGroup()); + material.setMaterialGroupDesc(dto.getMaterialGroupDesc()); + material.setPlantId(dto.getPlantId()); + material.setStatus(Status.A); + material.setCreatedBy(user.getUserId()); + material.setLastUpdatedBy(user.getUserId()); + return material; + } + + public void updateEntityFromDTO(MaterialMaster entity, MaterialMasterDTO dto, User user) { + entity.setMaterialCode(dto.getMaterialCode()); + entity.setMaterialDescription(dto.getMaterialDescription()); + entity.setMaterialGroup(dto.getMaterialGroup()); + entity.setMaterialGroupDesc(dto.getMaterialGroupDesc()); + entity.setPlantId(dto.getPlantId()); + entity.setStatus(Status.A); + entity.setLastUpdatedBy(user.getUserId()); + } + + public MaterialMasterDTO toDTO(MaterialMaster entity) { + MaterialMasterDTO dto = new MaterialMasterDTO(); + dto.setMaterialId(entity.getMaterialId()); + dto.setMaterialCode(entity.getMaterialCode()); + dto.setMaterialDescription(entity.getMaterialDescription()); + dto.setMaterialGroup(entity.getMaterialGroup()); + dto.setMaterialGroupDesc(entity.getMaterialGroupDesc()); + dto.setPlantId(entity.getPlantId()); + dto.setStatus(Status.A); + return dto; + } +} diff --git a/src/main/java/com/sahyog/app/inbound/user/mapper/PlantMapper.java b/src/main/java/com/sahyog/app/inbound/user/mapper/PlantMapper.java new file mode 100644 index 0000000..286211a --- /dev/null +++ b/src/main/java/com/sahyog/app/inbound/user/mapper/PlantMapper.java @@ -0,0 +1,53 @@ +package com.sahyog.app.inbound.user.mapper; + +import org.springframework.stereotype.Component; + +import com.sahyog.app.inbound.user.dto.PlantDTO; +import com.sahyog.app.inbound.user.dto.PlantMasterDTO; +import com.sahyog.app.inbound.user.enums.Status; +import com.sahyog.app.inbound.user.model.PlantMaster; +import com.sahyog.app.inbound.user.model.User; + +@Component +public class PlantMapper { + + public PlantMaster toEntity(PlantDTO dto, User user) { + PlantMaster plant = new PlantMaster(); + plant.setPlantCode(dto.getPlantCode()); + plant.setPlantDesc(dto.getPlantDesc()); + plant.setPlantPan(dto.getPlantPan()); + plant.setPlantGst(dto.getPlantGst()); + plant.setPlantGstRate(dto.getPlantGstRate()); + plant.setAddedChannel(dto.getAddedChannel()); + plant.setStatus(Status.A); + plant.setCreatedBy(user.getUserId()); + plant.setLastUpdatedBy(user.getUserId()); + return plant; + } + + public void updateEntityFromDTO(PlantMaster entity, PlantDTO dto, User user) { + entity.setPlantCode(dto.getPlantCode()); + entity.setPlantDesc(dto.getPlantDesc()); + entity.setPlantPan(dto.getPlantPan()); + entity.setPlantGst(dto.getPlantGst()); + entity.setPlantGstRate(dto.getPlantGstRate()); + entity.setAddedChannel(dto.getAddedChannel()); + entity.setStatus(Status.A); + entity.setLastUpdatedBy(user.getUserId()); + } + + public PlantDTO toDTO(PlantMaster plant) { + PlantDTO dto = new PlantDTO(); + dto.setPlantId(plant.getPlantId()); + dto.setPlantCode(plant.getPlantCode()); + dto.setPlantDesc(plant.getPlantDesc()); + dto.setPlantPan(plant.getPlantPan()); + dto.setPlantGst(plant.getPlantGst()); + dto.setPlantGstRate(plant.getPlantGstRate()); + dto.setAddedChannel(plant.getAddedChannel()); + dto.setStatus(plant.getStatus()); + dto.setCreatedBy(plant.getCreatedBy()); + dto.setLastUpdatedBy(plant.getLastUpdatedBy()); + return dto; + } +} diff --git a/src/main/java/com/sahyog/app/inbound/user/mapper/RoleMapper.java b/src/main/java/com/sahyog/app/inbound/user/mapper/RoleMapper.java new file mode 100644 index 0000000..39b35a3 --- /dev/null +++ b/src/main/java/com/sahyog/app/inbound/user/mapper/RoleMapper.java @@ -0,0 +1,29 @@ +package com.sahyog.app.inbound.user.mapper; + +import java.time.LocalDateTime; +import java.util.List; +import java.util.stream.Collectors; + +import org.springframework.stereotype.Component; + +import com.sahyog.app.inbound.user.dto.RoleDTO; +import com.sahyog.app.inbound.user.model.Role; +import com.sahyog.app.inbound.user.model.User; +import com.sahyog.app.inbound.user.model.UserType; + +@Component +public class RoleMapper { + +// public Role toEntity(RoleDTO roleDTO, short userTypeId, int createdBy, int lastUpdatedBy) { +// Role role = new Role(); +// role.setRoleName(roleDTO.getRoleName()); +// role.setRoleDescription(roleDTO.getRoleDescription()); +// role.setUserTypeId(roleDTO.getUserType()); +// role.setStatus(roleDTO.getStatus()); +// role.setCreatedBy(createdBy); +//// role.setLastUpdatedBy(lastUpdatedBy); +//// role.setCreatedOn(LocalDateTime.now()); +//// role.setLastUpdatedOn(LocalDateTime.now()); +// return role; +// } +} diff --git a/src/main/java/com/sahyog/app/inbound/user/mapper/TransporterMapper.java b/src/main/java/com/sahyog/app/inbound/user/mapper/TransporterMapper.java new file mode 100644 index 0000000..d605d21 --- /dev/null +++ b/src/main/java/com/sahyog/app/inbound/user/mapper/TransporterMapper.java @@ -0,0 +1,149 @@ +package com.sahyog.app.inbound.user.mapper; + +import java.time.LocalDateTime; +import java.util.Map; + +import org.springframework.stereotype.Component; + +import com.sahyog.app.inbound.user.dto.TransporterMasterDto; +import com.sahyog.app.inbound.user.dto.TransporterResponse; +import com.sahyog.app.inbound.user.dto.TransporterUpdateDTO; +import com.sahyog.app.inbound.user.model.Transporter; +import com.sahyog.app.inbound.user.model.User; + +@Component +public class TransporterMapper { + + + public Transporter toEntity(TransporterMasterDto dto, User user) { + Transporter transporter = new Transporter(); + transporter.setPlantId((short) 2); // Cast the integer to short + transporter.setSupplierCode(dto.getSupplierCode()); + transporter.setPlantCode(dto.getPlantCode()); + transporter.setTransporterCode(dto.getTransporterCode()); + transporter.setBpGrouping(dto.getBpGrouping()); + transporter.setSupplierAccountGroup(dto.getSupplierAccountGroup()); + transporter.setTransporterName(dto.getTransporterName()); + transporter.setTransporterFirstName(dto.getTransporterFirstName()); + transporter.setTransporterMiddleName(dto.getTransporterMiddleName()); + transporter.setTransporterLastName(dto.getTransporterLastName()); + transporter.setLegalEntity(dto.getLegalEntity()); + transporter.setPermanentAccountNumber(dto.getPermanentAccountNumber()); + transporter.setStreet(dto.getStreet()); + transporter.setHouseNumber(dto.getHouseNumber()); + transporter.setDistrict(dto.getDistrict()); + transporter.setDifferentCity(dto.getDifferentCity()); + transporter.setPostalCode(dto.getPostalCode()); + transporter.setCity(dto.getCity()); + transporter.setState(dto.getState()); + transporter.setCountry(dto.getCountry()); + transporter.setMobileNumber(dto.getMobileNumber()); + transporter.setEmailId(dto.getEmailId()); + transporter.setGstn(dto.getGstn()); + transporter.setTaxRegime(dto.getTaxRegime()); + transporter.setStatus(dto.getStatus()); + transporter.setShortCode(dto.getShortCode()); + transporter.setCreatedDate(dto.getCreatedDate()); + transporter.setUpdationDate(dto.getUpdationDate()); + transporter.setTaxCodeDesc(dto.getTaxCodeDesc()); + transporter.setTaxRate(dto.getTaxRate()); + transporter.setCreatedBy(user.getUserId()); + transporter.setLastUpdatedBy(user.getUserId()); + return transporter; + } + + public TransporterUpdateDTO toUpdateDTO(TransporterMasterDto dto, User user) { + TransporterUpdateDTO updateDTO = new TransporterUpdateDTO(); + updateDTO.setSupplierCode(dto.getSupplierCode()); + updateDTO.setPlantId((short) 2); // Cast the integer to short + updateDTO.setTransporterCode(dto.getTransporterCode()); + updateDTO.setPlantCode(dto.getPlantCode()); + updateDTO.setBpGrouping(dto.getBpGrouping()); + updateDTO.setSupplierAccountGroup(dto.getSupplierAccountGroup()); + updateDTO.setTransporterName(dto.getTransporterName()); + updateDTO.setTransporterFirstName(dto.getTransporterFirstName()); + updateDTO.setTransporterMiddleName(dto.getTransporterMiddleName()); + updateDTO.setTransporterLastName(dto.getTransporterLastName()); + updateDTO.setLegalEntity(dto.getLegalEntity()); + updateDTO.setPermanentAccountNumber(dto.getPermanentAccountNumber()); + updateDTO.setStreet(dto.getStreet()); + updateDTO.setHouseNumber(dto.getHouseNumber()); + updateDTO.setDistrict(dto.getDistrict()); + updateDTO.setDifferentCity(dto.getDifferentCity()); + updateDTO.setPostalCode(dto.getPostalCode()); + updateDTO.setCity(dto.getCity()); + updateDTO.setState(dto.getState()); + updateDTO.setCountry(dto.getCountry()); + updateDTO.setMobileNumber(dto.getMobileNumber()); + updateDTO.setEmailId(dto.getEmailId()); + updateDTO.setGstn(dto.getGstn()); + updateDTO.setTaxRegime(dto.getTaxRegime()); + updateDTO.setStatus(dto.getStatus()); + updateDTO.setShortCode(dto.getShortCode()); + updateDTO.setTaxCodeDesc(dto.getTaxCodeDesc()); + updateDTO.setTaxRate(dto.getTaxRate()); + updateDTO.setCreatedBy(user.getUserId()); + updateDTO.setLastUpdatedBy(user.getUserId()); + return updateDTO; + } + + public void updateEntityFromDTO(Transporter transporter, TransporterUpdateDTO dto) { + transporter.setPlantCode(dto.getPlantCode()); + transporter.setBpGrouping(dto.getBpGrouping()); + transporter.setTransporterCode(dto.getTransporterCode()); + transporter.setSupplierAccountGroup(dto.getSupplierAccountGroup()); + transporter.setTransporterName(dto.getTransporterName()); + transporter.setTransporterFirstName(dto.getTransporterFirstName()); + transporter.setTransporterMiddleName(dto.getTransporterMiddleName()); + transporter.setTransporterLastName(dto.getTransporterLastName()); + transporter.setLegalEntity(dto.getLegalEntity()); + transporter.setPermanentAccountNumber(dto.getPermanentAccountNumber()); + transporter.setStreet(dto.getStreet()); + transporter.setHouseNumber(dto.getHouseNumber()); + transporter.setDistrict(dto.getDistrict()); + transporter.setDifferentCity(dto.getDifferentCity()); + transporter.setPostalCode(dto.getPostalCode()); + transporter.setCity(dto.getCity()); + transporter.setState(dto.getState()); + transporter.setCountry(dto.getCountry()); + transporter.setMobileNumber(dto.getMobileNumber()); + transporter.setEmailId(dto.getEmailId()); + transporter.setGstn(dto.getGstn()); + transporter.setTaxRegime(dto.getTaxRegime()); + transporter.setStatus(dto.getStatus()); + transporter.setShortCode(dto.getShortCode()); + transporter.setTaxCodeDesc(dto.getTaxCodeDesc()); + transporter.setTaxRate(dto.getTaxRate()); + transporter.setLastUpdatedBy(dto.getLastUpdatedBy()); + transporter.setUpdationDate(dto.getUpdationDate()); + } + + + public TransporterResponse toResponse(Transporter transporter) { + TransporterResponse response = new TransporterResponse(); + response.setSupplierCode(transporter.getSupplierCode()); + response.setTransporterName(transporter.getTransporterName()); + response.setSupplierAccountGroup(transporter.getSupplierAccountGroup()); + response.setState(transporter.getState()); + response.setBpGrouping(transporter.getBpGrouping()); + response.setLegalEntity(transporter.getLegalEntity()); + response.setPermanentAccountNumber(transporter.getPermanentAccountNumber()); + response.setStreet(transporter.getStreet()); + response.setHouseNumber(transporter.getHouseNumber()); + response.setDistrict(transporter.getDistrict()); + response.setDifferentCity(transporter.getDifferentCity()); + response.setPostalCode(transporter.getPostalCode()); + response.setCity(transporter.getCity()); + response.setCountry(transporter.getCountry()); + response.setMobileNumber(transporter.getMobileNumber()); + response.setEmailId(transporter.getEmailId()); + response.setGstn(transporter.getGstn()); + response.setTaxRegime(transporter.getTaxRegime()); + response.setShortCode(transporter.getShortCode()); + response.setStatus(transporter.getStatus()); + response.setTaxCodeDesc(transporter.getTaxCodeDesc()); + response.setTaxRate(transporter.getTaxRate()); + return response; + } + +} diff --git a/src/main/java/com/sahyog/app/inbound/user/mapper/UserMapper.java b/src/main/java/com/sahyog/app/inbound/user/mapper/UserMapper.java new file mode 100644 index 0000000..31676dd --- /dev/null +++ b/src/main/java/com/sahyog/app/inbound/user/mapper/UserMapper.java @@ -0,0 +1,154 @@ +package com.sahyog.app.inbound.user.mapper; + +import java.time.LocalDateTime; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +import com.sahyog.app.inbound.user.dto.TransporterMasterDto; +import com.sahyog.app.inbound.user.dto.UserDTO; +import com.sahyog.app.inbound.user.dto.UserUpdateDTO; +import com.sahyog.app.inbound.user.enums.Status; +import com.sahyog.app.inbound.user.model.User; +import com.sahyog.app.inbound.user.model.UserType; +import com.sahyog.app.inbound.user.repository.UserTypeRepository; + +@Component +public class UserMapper { + + @Autowired + private UserTypeRepository userTypeRepository; + + public UserDTO toUserDTO(TransporterMasterDto dto) { + String usertypeName = "Transporter"; + UserType userType = userTypeRepository.findByUsertypeName(usertypeName); + if (userType == null) { + throw new IllegalStateException("UserType 'Transporter' not found"); + } + + UserDTO userDTO = new UserDTO(); + userDTO.setUserTypeId(userType.getUserTypeId()); + userDTO.setUserName(dto.getTransporterName()); + userDTO.setFirstName(dto.getTransporterFirstName()); + userDTO.setLastName(dto.getTransporterLastName()); + userDTO.setEmail(dto.getEmailId()); + userDTO.setMobile(dto.getMobileNumber()); + userDTO.setEmployeeTransCode(dto.getSupplierCode()); + userDTO.setAddedChannel("B"); + userDTO.setStatus(Status.A); + userDTO.setCreatedBy(dto.getCreatedBy()); + userDTO.setLastUpdatedBy(dto.getLastUpdatedBy()); +// userDTO.setLastUpdatedOn(LocalDateTime.now()); + + return userDTO; + } + + + + // Helper method to concatenate first, middle, and last name to create the userName + private String createUserName(String firstName, String lastName) { + StringBuilder userNameBuilder = new StringBuilder(); + + if (firstName != null && !firstName.isEmpty()) { + userNameBuilder.append(firstName); + } +// if (middleName != null && !middleName.isEmpty()) { +// userNameBuilder.append(" ").append(middleName); +// } + if (lastName != null && !lastName.isEmpty()) { + userNameBuilder.append(" ").append(lastName); + } + + return userNameBuilder.toString().trim(); + } + + // NEW: Method to map User entity to UserDTO + public UserDTO toDTO(User user) { + UserDTO userDTO = new UserDTO(); + userDTO.setUserId(user.getUserId()); + userDTO.setUserTypeId(user.getUserTypeId()); + userDTO.setUserName(createUserName(user.getFirstName(), user.getLastName())); + userDTO.setFirstName(user.getFirstName()); +// userDTO.setMiddleName(user.getMiddleName()); + userDTO.setLastName(user.getLastName()); + userDTO.setEmail(user.getEmail()); + userDTO.setMobile(user.getMobile()); + userDTO.setAddedChannel(user.getAddedChannel()); + userDTO.setStatus(user.getStatus()); + userDTO.setCreatedBy(user.getCreatedBy()); + userDTO.setLastUpdatedBy(user.getLastUpdatedBy()); + + return userDTO; + } + + // Method to update user details based on UserDTO + public void updateUserFromDTO(User existingUser, UserDTO userDTO) { + existingUser.setUserTypeId(userDTO.getUserTypeId()); + existingUser.setUserName(createUserName(userDTO.getFirstName(), userDTO.getLastName())); // Automatically create userName + existingUser.setFirstName(userDTO.getFirstName()); +// existingUser.setMiddleName(userDTO.getMiddleName()); + existingUser.setLastName(userDTO.getLastName()); + existingUser.setEmail(userDTO.getEmail()); + existingUser.setMobile(userDTO.getMobile()); + existingUser.setAddedChannel(userDTO.getAddedChannel()); + existingUser.setStatus(userDTO.getStatus()); + } + + // Method to update user details based on UserUpdateDTO + public void updateUserFromUpdateDTO(User existingUser, UserUpdateDTO userUpdateDTO) { + existingUser.setUserName(createUserName(userUpdateDTO.getFirstName(), userUpdateDTO.getLastName())); // Automatically create userName + existingUser.setFirstName(userUpdateDTO.getFirstName()); +// existingUser.setMiddleName(userUpdateDTO.getMiddleName()); + existingUser.setLastName(userUpdateDTO.getLastName()); + existingUser.setEmail(userUpdateDTO.getEmailId()); + existingUser.setMobile(userUpdateDTO.getPhoneNumber()); + existingUser.setAddedChannel(userUpdateDTO.getAddedChannel()); + existingUser.setStatus(userUpdateDTO.getStatus()); + } + + + + + +// +// // NEW: Method to map User entity to UserDTO +// public UserDTO toDTO(User user) { +// UserDTO userDTO = new UserDTO(); +// userDTO.setUserId(user.getUserId()); +// userDTO.setUserTypeId(user.getUserTypeId()); +// userDTO.setUserName(user.getUserName()); +// userDTO.setFirstName(user.getFirstName()); +// userDTO.setLastName(user.getLastName()); +// userDTO.setEmail(user.getEmail()); +// userDTO.setMobile(user.getMobile()); +// userDTO.setAddedChannel(user.getAddedChannel()); +// userDTO.setStatus(user.getStatus()); +// userDTO.setCreatedBy(user.getCreatedBy()); +// userDTO.setLastUpdatedBy(user.getLastUpdatedBy()); +//// userDTO.setLastUpdatedOn(LocalDateTime.now()); +// +// return userDTO; +// } +// +// +// public void updateUserFromDTO(User existingUser, UserDTO userDTO) { +// existingUser.setUserTypeId(userDTO.getUserTypeId()); +// existingUser.setUserName(userDTO.getUserName()); +// existingUser.setFirstName(userDTO.getFirstName()); +// existingUser.setLastName(userDTO.getLastName()); +// existingUser.setEmail(userDTO.getEmail()); +// existingUser.setMobile(userDTO.getMobile()); +// existingUser.setAddedChannel(userDTO.getAddedChannel()); +// existingUser.setStatus(userDTO.getStatus()); +// } +// +// public void updateUserFromUpdateDTO(User existingUser, UserUpdateDTO userUpdateDTO) { +// existingUser.setUserName(userUpdateDTO.getUserName()); +// existingUser.setFirstName(userUpdateDTO.getFirstName()); +// existingUser.setLastName(userUpdateDTO.getLastName()); +// existingUser.setEmail(userUpdateDTO.getEmailId()); +// existingUser.setMobile(userUpdateDTO.getPhoneNumber()); +// existingUser.setAddedChannel(userUpdateDTO.getAddedChannel()); +// existingUser.setStatus(userUpdateDTO.getStatus()); +// } +} diff --git a/src/main/java/com/sahyog/app/inbound/user/mapper/UserTypeMapper.java b/src/main/java/com/sahyog/app/inbound/user/mapper/UserTypeMapper.java new file mode 100644 index 0000000..19e9d1f --- /dev/null +++ b/src/main/java/com/sahyog/app/inbound/user/mapper/UserTypeMapper.java @@ -0,0 +1,24 @@ +package com.sahyog.app.inbound.user.mapper; + +import java.time.LocalDateTime; + +import org.springframework.stereotype.Component; + +import com.sahyog.app.inbound.user.dto.UserTypeCreateDTO; +import com.sahyog.app.inbound.user.model.UserType; + +@Component +public class UserTypeMapper { + + public UserType toEntity(UserTypeCreateDTO userTypeCreateDTO, int createdBy) { + UserType userType = new UserType(); + userType.setUsertypeName(userTypeCreateDTO.getUsertypeName()); + userType.setStatus(userTypeCreateDTO.getStatus()); + userType.setDescription(userType.getDescription()); +// userType.setCreatedBy(createdBy); +// userType.setLastUpdatedBy(createdBy); +// userType.s(LocalDateTime.now()); +// userType.setLastUpdatedOn(LocalDateTime.now()); + return userType; + } +} diff --git a/src/main/java/com/sahyog/app/inbound/user/model/MaterialMaster.java b/src/main/java/com/sahyog/app/inbound/user/model/MaterialMaster.java new file mode 100644 index 0000000..ce0b98f --- /dev/null +++ b/src/main/java/com/sahyog/app/inbound/user/model/MaterialMaster.java @@ -0,0 +1,59 @@ +package com.sahyog.app.inbound.user.model; + +import jakarta.persistence.*; +import lombok.AllArgsConstructor; +import lombok.Getter; +import lombok.NoArgsConstructor; +import lombok.Setter; +import lombok.ToString; + +import java.sql.Timestamp; + +import com.sahyog.app.inbound.user.enums.Status; + +@Getter +@Setter +@NoArgsConstructor +@AllArgsConstructor +@ToString +@Entity +@Table(name = "materialmaster") +public class MaterialMaster { + + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + @Column(name = "material_id", nullable = false, updatable = false) + private int materialId; + + @Column(name = "material_code", length = 40, nullable = false) + private String materialCode; + + @Column(name = "material_description", length = 60, nullable = false) + private String materialDescription; + + @Column(name = "material_group", length = 30) + private String materialGroup; + + @Column(name = "material_group_desc", length = 40) + private String materialGroupDesc; + + @Column(name = "plant_id", nullable = false) + private int plantId; + + @Enumerated(EnumType.STRING) + @Column(name = "status", length = 1, nullable = false) + private Status status; + +// @Column(name = "created_on", nullable = false, updatable = false) +// private Timestamp createdOn; + + @Column(name = "created_by", nullable = false) + private int createdBy; + +// @Column(name = "last_updated_on", nullable = false) +// private Timestamp lastUpdatedOn; + + @Column(name = "last_updated_by", nullable = false) + private int lastUpdatedBy; + +} diff --git a/src/main/java/com/sahyog/app/inbound/user/model/PlantMaster.java b/src/main/java/com/sahyog/app/inbound/user/model/PlantMaster.java new file mode 100644 index 0000000..714b557 --- /dev/null +++ b/src/main/java/com/sahyog/app/inbound/user/model/PlantMaster.java @@ -0,0 +1,83 @@ +package com.sahyog.app.inbound.user.model; + +import java.math.BigDecimal; +import java.time.LocalDateTime; + +import com.sahyog.app.inbound.user.enums.Status; + +import jakarta.persistence.Column; +import jakarta.persistence.Entity; +import jakarta.persistence.EnumType; +import jakarta.persistence.Enumerated; +import jakarta.persistence.GeneratedValue; +import jakarta.persistence.GenerationType; +import jakarta.persistence.Id; +import jakarta.persistence.Table; +import jakarta.validation.constraints.DecimalMin; +import jakarta.validation.constraints.Digits; +import jakarta.validation.constraints.NotNull; +import jakarta.validation.constraints.Pattern; +import jakarta.validation.constraints.Size; +import lombok.AllArgsConstructor; +import lombok.Getter; +import lombok.NoArgsConstructor; +import lombok.Setter; +import lombok.ToString; +@Getter +@Setter +@NoArgsConstructor +@AllArgsConstructor +@ToString +@Entity +@Table(name="plantmaster") +public class PlantMaster { + + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + @Column(name = "plant_id", nullable = false, updatable = false) + private Short plantId; + + @NotNull(message = "Plant code cannot be null") + @Size(min = 4, max = 4, message = "Plant code must be exactly 4 characters") + @Column(name = "plant_code", nullable = false, length = 4, unique = true) + private String plantCode; + + @Size(max = 30, message = "Plant description cannot exceed 30 characters") + @Column(name = "plant_desc", length = 30) + private String plantDesc; + + @Size(max = 30, message = "Plant PAN cannot exceed 30 characters") + @Column(name = "plant_pan", length = 30) + private String plantPan; + + @Size(max = 30, message = "Plant GST cannot exceed 30 characters") + @Column(name = "plant_gst", length = 30) + private String plantGst; + + @NotNull(message = "Plant GST rate cannot be null") + @DecimalMin(value = "0.00", inclusive = false, message = "Plant GST rate must be greater than 0") + @Digits(integer = 9, fraction = 2, message = "Plant GST rate must be a valid decimal with 2 decimal places") + @Column(name = "plant_gst_rate", nullable = false, precision = 11, scale = 2) + private BigDecimal plantGstRate; + + @NotNull(message = "Added channel cannot be null") + @Pattern(regexp = "^[A-Za-z0-9]{1}$", message = "Added channel must be a single alphanumeric character") + @Column(name = "added_channel", nullable = false, length = 1) + private String addedChannel; + + @NotNull(message = "Status cannot be null") + @Enumerated(EnumType.STRING) + @Column(name = "status", nullable = false, length = 1) + private Status status; + + @NotNull(message = "Created by cannot be null") + @Column(name = "created_by", nullable = false) + private int createdBy; + + @NotNull(message = "Last updated by cannot be null") + @Column(name = "last_updated_by", nullable = false) + private int lastUpdatedBy; + + @Column(name="last_updated_on") + private LocalDateTime lastUpdatedOn = LocalDateTime.now(); +} diff --git a/src/main/java/com/sahyog/app/inbound/user/model/Response.java b/src/main/java/com/sahyog/app/inbound/user/model/Response.java new file mode 100644 index 0000000..bbca64d --- /dev/null +++ b/src/main/java/com/sahyog/app/inbound/user/model/Response.java @@ -0,0 +1,80 @@ +package com.sahyog.app.inbound.user.model; + +import java.time.Instant; +import java.time.LocalDateTime; +import java.util.List; +import java.util.Map; + +import lombok.AllArgsConstructor; +import lombok.Getter; +import lombok.NoArgsConstructor; +import lombok.Setter; +import lombok.ToString; +import java.time.LocalDateTime; +@Getter +@Setter +@AllArgsConstructor +@NoArgsConstructor +@ToString +public class Response { + private int status; + private String message; +// private String details; // Additional field for error details + private T data; + private String timestamp; // Use String for ISO 8601 format + + // Custom constructor for success with data + public Response(int statusCode, String message, T data) { + this.status = statusCode; + this.message = message; + this.data = data; + this.timestamp = LocalDateTime.now().toString(); // ISO format timestamp + } + + // Custom constructor for messages without data + public Response(int statusCode, String message) { + this(statusCode, message, null); + } + + // Generic method to create success responses with data + public static Response success(T data) { + return new Response<>(200, "Success", data); + } + + // Generic method to create error responses with details + public static Response error(int statusCode, String message) { + return new Response<>(statusCode, message, null); + } + + // Method to update the message dynamically + public Response withMessage(String message) { + this.message = message; + return this; + } + + // Method to update the details dynamically + public Response withDetails(String details) { +// this.details = details; + return this; + } + + // Updated withData() method to accept List> as data + public Response>> withData(List> data) { + this.data = (T) data; // Cast data to type T + return (Response>>) this; // Ensure the return type matches + } + + // Generic method to create error responses with default status code + public static Response error(String message) { + return new Response<>(500, message, null); // Default status code to 500 + } + + public static Response>> failure(String message, List> userResponseData) { + Response>> response = new Response<>(); +// response.setStatus("failure"); + response.setMessage(message); + response.setData(userResponseData); + return response; + } + +} diff --git a/src/main/java/com/sahyog/app/inbound/user/model/Role.java b/src/main/java/com/sahyog/app/inbound/user/model/Role.java new file mode 100644 index 0000000..162b456 --- /dev/null +++ b/src/main/java/com/sahyog/app/inbound/user/model/Role.java @@ -0,0 +1,74 @@ +package com.sahyog.app.inbound.user.model; + +import java.time.LocalDateTime; + +import com.sahyog.app.inbound.user.enums.RoleType; +import com.sahyog.app.inbound.user.enums.Status; + +import jakarta.persistence.Column; +import jakarta.persistence.Entity; +import jakarta.persistence.EnumType; +import jakarta.persistence.Enumerated; +import jakarta.persistence.FetchType; +import jakarta.persistence.GeneratedValue; +import jakarta.persistence.GenerationType; +import jakarta.persistence.Id; +import jakarta.persistence.JoinColumn; +import jakarta.persistence.ManyToOne; +import jakarta.persistence.Table; +import jakarta.validation.constraints.Min; +import jakarta.validation.constraints.NotNull; +import jakarta.validation.constraints.Size; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.Getter; +import lombok.NoArgsConstructor; +import lombok.Setter; +import lombok.ToString; +@Getter +@Setter +@NoArgsConstructor +@AllArgsConstructor +@Entity +@Table(name = "rolemaster", indexes = { +// @Index(name = "uk_role_name", columnList = "role_name", unique = true), +// @Index(name = "idx_role_status", columnList = "status") +}) +public class Role { + + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + @Column(name = "role_id", nullable = false, updatable = false) + private short roleId; + + @NotNull(message = "Role name cannot be null") + @Size(min = 1, max = 30, message = "Role name must be between 1 and 30 characters") + @Column(name = "role_name", length = 30, nullable = false) + private String roleName; + + @NotNull(message = "Role description cannot be null") + @Size(min = 1, max = 50, message = "Role description must be between 1 and 50 characters") + @Column(name = "rode_description", length = 50, nullable = false) + private String roleDescription; + + @NotNull(message = "User type ID cannot be null") + @Min(value = 1, message = "User type ID must be a positive integer") + @Column(name = "usertype_id", nullable = false) + private short userTypeId; + + @NotNull(message = "Status cannot be null") + @Enumerated(EnumType.STRING) + @Column(name = "status", length = 1, nullable = false) + private Status status; + + @NotNull(message = "Created by cannot be null") + @Min(value = 1, message = "Created by must be a positive integer") + @Column(name = "created_by", nullable = false) + private int createdBy; + + @NotNull(message = "Last updated by cannot be null") + @Min(value = 1, message = "Last updated by must be a positive integer") + @Column(name = "last_updated_by", nullable = false) + private int lastUpdatedBy; + +} \ No newline at end of file diff --git a/src/main/java/com/sahyog/app/inbound/user/model/Transporter.java b/src/main/java/com/sahyog/app/inbound/user/model/Transporter.java new file mode 100644 index 0000000..ea40afa --- /dev/null +++ b/src/main/java/com/sahyog/app/inbound/user/model/Transporter.java @@ -0,0 +1,186 @@ +package com.sahyog.app.inbound.user.model; + + +import jakarta.persistence.*; + +import jakarta.validation.constraints.Email; +import jakarta.validation.constraints.Max; +import jakarta.validation.constraints.Min; +import jakarta.validation.constraints.NotNull; +import jakarta.validation.constraints.Pattern; +import jakarta.validation.constraints.Positive; +import jakarta.validation.constraints.Size; +import lombok.AllArgsConstructor; +import lombok.Getter; +import lombok.NoArgsConstructor; +import lombok.Setter; +import lombok.ToString; + +import java.time.LocalDate; +import java.time.LocalDateTime; + +@Setter +@Getter +@NoArgsConstructor +@AllArgsConstructor +@ToString +@Entity +@Table(name = "transportermaster", indexes = { + @Index(name = "idx_supplier_code", columnList = "supplier_code"), + @Index(name = "idx_transporter_status", columnList = "status"), + @Index(name = "idx_transporter_plant_code", columnList = "plant_code") +}) +public class Transporter { + + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + @Column(name = "transporter_id", nullable = false, updatable = false) + private int transporterId; + + @Column(name = "plant_id", nullable = false) + @NotNull(message = "Plant ID cannot be null") + private short plantId; + + @Column(name = "plant_code", length = 4, nullable = false) + @NotNull(message = "Plant code cannot be null") + @Size(min = 4, max = 4, message = "Plant code must be exactly 4 characters") + private String plantCode; + + @Column(name="user_id") + @Positive(message = "User ID must be a positive number") + private int userId; + + @Column(name = "BP_GROUPING") + @Size(max = 255, message = "BP Grouping cannot exceed 255 characters") + private String bpGrouping; + + @Column(name = "transporter_code", length = 20) + @Size(max = 20, message = "Transporter code cannot exceed 20 characters") + private String transporterCode; + + @Column(name = "supplier_code", length = 20) + @Size(max = 20, message = "Supplier code cannot exceed 20 characters") + private String supplierCode; + + @Column(name = "supplier_account_group", length = 20) + @Size(max = 20, message = "Supplier account group cannot exceed 20 characters") + private String supplierAccountGroup; + + @Column(name = "transporter_name", length = 100, nullable = false) + @NotNull(message = "Transporter name cannot be null") + @Size(max = 100, message = "Transporter name cannot exceed 100 characters") + private String transporterName; + + @Column(name = "transporter_fname", length = 40, nullable = false) + @NotNull(message = "First name cannot be null") + @Size(max = 40, message = "First name cannot exceed 40 characters") + private String transporterFirstName; + + @Column(name = "transporter_mname", length = 30, nullable = false) + @NotNull(message = "Middle name cannot be null") + @Size(max = 30, message = "Middle name cannot exceed 30 characters") + private String transporterMiddleName; + + @Column(name = "transporter_lname", length = 30, nullable = false) + @NotNull(message = "Last name cannot be null") + @Size(max = 30, message = "Last name cannot exceed 30 characters") + private String transporterLastName; + + + @Column(name = "legal_entity", length = 100) + @Size(max = 100, message = "Legal entity cannot exceed 100 characters") + private String legalEntity; + + @Column(name = "permanent_account_number", length = 10) + @Pattern(regexp = "[A-Z]{5}[0-9]{4}[A-Z]{1}", message = "Invalid PAN format") + private String permanentAccountNumber; + + + @Column(name = "street", length = 40) + @Size(max = 40, message = "Street cannot exceed 40 characters") + private String street; + + @Column(name = "house_number", length = 10) + @Size(max = 10, message = "House number cannot exceed 10 characters") + private String houseNumber; + + @Column(name = "district", length = 40) + @Size(max = 40, message = "District cannot exceed 40 characters") + private String district; + + @Column(name = "different_city", length = 40) + @Size(max = 40, message = "City cannot exceed 40 characters") + private String differentCity; + + @Column(name = "postal_code", length = 10) + @Pattern(regexp = "\\d{5,10}", message = "Postal code must be between 5 to 10 digits") + private String postalCode; + + @Column(name = "city", length = 40) + @Size(max = 40, message = "City cannot exceed 40 characters") + private String city; + + @Column(name = "country", length = 40) + @Size(max = 40, message = "Country cannot exceed 40 characters") + private String country; + + @Column(name = "state", length = 40) + @Size(max = 40, message = "State cannot exceed 40 characters") + private String state; + + @Column(name = "mobile_number", length = 10) + @Pattern(regexp = "\\d{10}", message = "Mobile number must be exactly 10 digits") + private String mobileNumber; + + @Column(name = "email_id", length = 50) + @Email(message = "Invalid email format") + @Size(max = 50, message = "Email cannot exceed 50 characters") + private String emailId; + + @Column(name = "gstn", length = 40) + @Size(max = 40, message = "GSTN cannot exceed 40 characters") + private String gstn; + + @Column(name = "tax_regime", length = 10) + @Size(max = 10, message = "Tax regime cannot exceed 10 characters") + private String taxRegime; + + @Column(name = "short_code", length = 40) + @Size(max = 40, message = "Short code cannot exceed 40 characters") + private String shortCode; + + + @Column(name = "created_date") + private LocalDate createdDate; + + @Column(name = "updation_date") + private LocalDate updationDate; + + @Column(name = "tax_code_desc") + @Size(max = 255, message = "Tax code description cannot exceed 255 characters") + private String taxCodeDesc; + + @Column(name = "tax_rate") + @Min(value = 0, message = "Tax rate cannot be negative") + @Max(value = 100, message = "Tax rate cannot exceed 100") + private int taxRate; + + @Column(name = "status", length = 1, nullable = false) + @NotNull(message = "Status cannot be null") + @Pattern(regexp = "[AI]", message = "Status must be 'A' (Active) or 'I' (Inactive)") + private String status; + + @Column(name = "created_by", nullable = false) + @NotNull(message = "Created by cannot be null") + private int createdBy; + + @Column(name = "last_updated_by", nullable = false) + @NotNull(message = "Last updated by cannot be null") + private int lastUpdatedBy; + + @Column(name = "last_updated_on", nullable = false) + private LocalDateTime lastUpdatedOn = LocalDateTime.now(); + + +} + diff --git a/src/main/java/com/sahyog/app/inbound/user/model/User.java b/src/main/java/com/sahyog/app/inbound/user/model/User.java new file mode 100644 index 0000000..e08a327 --- /dev/null +++ b/src/main/java/com/sahyog/app/inbound/user/model/User.java @@ -0,0 +1,102 @@ +package com.sahyog.app.inbound.user.model; + +import jakarta.persistence.*; +import jakarta.validation.constraints.Email; +import jakarta.validation.constraints.Min; +import jakarta.validation.constraints.NotNull; +import jakarta.validation.constraints.Size; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.Getter; +import lombok.NoArgsConstructor; +import lombok.Setter; +import lombok.ToString; + +import java.time.LocalDateTime; + +import org.hibernate.annotations.CreationTimestamp; +import org.hibernate.annotations.UpdateTimestamp; + +import com.sahyog.app.inbound.user.enums.Status; + + +@Getter +@Setter +@NoArgsConstructor +@AllArgsConstructor +@ToString +@Entity +@Table(name = "usermaster") +public class User { + + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + @Column(name = "user_id", nullable = false, updatable = false) + private int userId; + + @NotNull(message = "User type ID cannot be null") + @Min(value = 1, message = "User type ID must be a positive integer") + @Column(name = "usertype_id", nullable = false) + private short userTypeId; + + @NotNull(message = "Username cannot be null") + @Size(min = 1, max = 80, message = "Username must be between 1 and 80 characters") + @Column(name = "user_name", length = 80, nullable = false) + private String userName; + + @NotNull(message = "First name cannot be null") + @Size(min = 1, max = 40, message = "First name must be between 1 and 40 characters") + @Column(name = "user_fname", length = 40, nullable = false) + private String firstName; + + @Size(max = 40, message = "Last name must not exceed 40 characters") + @Column(name = "user_lname", length = 40) + private String lastName; + + @NotNull(message = "Email cannot be null") + @Email(message = "Email should be valid") + @Size(max = 40, message = "Email must not exceed 40 characters") + @Column(name = "user_email", length = 40, nullable = false, unique = true) + private String email; + + @Size(max = 10, message = "Mobile number must not exceed 10 characters") + @Column(name = "user_mobile", length = 10) + private String mobile; + + @Size(max = 20, message = "Employee transaction code must not exceed 20 characters") + @Column(name = "user_emp_trans_code", length = 20) + private String employeeTransCode; + + @NotNull(message = "Added channel cannot be null") + @Size(min = 1, max = 1, message = "Added channel must be exactly 1 character") + @Column(name = "user_added_channel", length = 1, nullable = false) + private String addedChannel; + + @NotNull(message = "Status cannot be null") + @Enumerated(EnumType.STRING) + @Column(name = "status", length = 1, nullable = false) + private Status status; + + @NotNull(message = "Created by cannot be null") + @Min(value = 1, message = "Created by must be a positive integer") + @Column(name = "created_by", nullable = false) + private int createdBy; + +// @Column(name="created_on") +// private LocalDateTime createdOn; + + @NotNull(message = "Last updated by cannot be null") + @Min(value = 1, message = "Last updated by must be a positive integer") + @Column(name = "last_updated_by", nullable = false) + private int lastUpdatedBy; + + @Column(name = "last_updated_on", nullable = false) + private LocalDateTime lastUpdatedOn = LocalDateTime.now(); + + + + + +} + + diff --git a/src/main/java/com/sahyog/app/inbound/user/model/UserPlant.java b/src/main/java/com/sahyog/app/inbound/user/model/UserPlant.java new file mode 100644 index 0000000..cf7679c --- /dev/null +++ b/src/main/java/com/sahyog/app/inbound/user/model/UserPlant.java @@ -0,0 +1,56 @@ +package com.sahyog.app.inbound.user.model; + +import com.sahyog.app.inbound.user.enums.Status; + +import jakarta.persistence.Column; +import jakarta.persistence.Entity; +import jakarta.persistence.EnumType; +import jakarta.persistence.Enumerated; +import jakarta.persistence.GeneratedValue; +import jakarta.persistence.GenerationType; +import jakarta.persistence.Id; +import jakarta.persistence.Table; +import jakarta.validation.constraints.Min; +import jakarta.validation.constraints.NotNull; +import lombok.AllArgsConstructor; +import lombok.Getter; +import lombok.NoArgsConstructor; +import lombok.Setter; +@Getter +@Setter +@NoArgsConstructor +@AllArgsConstructor +@Entity +@Table(name="userplant") +public class UserPlant { + + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + @Column(name = "userplant_id", nullable = false, updatable = false) + private int userPlantId; + + @NotNull(message = "User ID cannot be null") + @Min(value = 1, message = "User ID must be a positive integer") + @Column(name = "user_id", nullable = false) + private int userId; + + @NotNull(message = "Plant ID cannot be null") + @Min(value = 1, message = "Plant ID must be a positive integer") + @Column(name = "plant_id", nullable = false) + private int plantId; + + @NotNull(message = "Status cannot be null") + @Enumerated(EnumType.STRING) + @Column(name = "status", length = 1, nullable = false) + private Status status; + + @NotNull(message = "Created by cannot be null") + @Min(value = 1, message = "Created by must be a positive integer") + @Column(name = "created_by", nullable = false) + private int createdBy; + + @NotNull(message = "Last updated by cannot be null") + @Min(value = 1, message = "Last updated by must be a positive integer") + @Column(name = "last_updated_by", nullable = false) + private int lastUpdatedBy; +} diff --git a/src/main/java/com/sahyog/app/inbound/user/model/UserRole.java b/src/main/java/com/sahyog/app/inbound/user/model/UserRole.java new file mode 100644 index 0000000..0611184 --- /dev/null +++ b/src/main/java/com/sahyog/app/inbound/user/model/UserRole.java @@ -0,0 +1,45 @@ +package com.sahyog.app.inbound.user.model; + + +import jakarta.persistence.*; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.Getter; +import lombok.NoArgsConstructor; +import lombok.Setter; +import lombok.ToString; +import lombok.AllArgsConstructor; +import lombok.Getter; +import lombok.NoArgsConstructor; +import lombok.Setter; +import java.time.LocalDateTime; + +import com.sahyog.app.inbound.user.enums.Status; +@Getter +@Setter +@NoArgsConstructor +@AllArgsConstructor +@Entity +@Table(name = "userrole") +public class UserRole { + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + @Column(name = "userrole_id") + private int userRoleId; + + @Column(name = "user_id") + private int userId; + + @Column(name = "role_id") + private int roleId; + + @Enumerated(EnumType.STRING) + @Column(name = "status", length = 1, nullable = false) + private Status status; + + @Column(name = "created_by", nullable = false) + private int createdBy; + + @Column(name = "last_updated_by", nullable = false) + private int lastUpdatedBy; +} diff --git a/src/main/java/com/sahyog/app/inbound/user/model/UserType.java b/src/main/java/com/sahyog/app/inbound/user/model/UserType.java new file mode 100644 index 0000000..ea95379 --- /dev/null +++ b/src/main/java/com/sahyog/app/inbound/user/model/UserType.java @@ -0,0 +1,62 @@ +package com.sahyog.app.inbound.user.model; + +import com.sahyog.app.inbound.user.enums.Status; + +import jakarta.persistence.Column; +import jakarta.persistence.Entity; +import jakarta.persistence.EnumType; +import jakarta.persistence.Enumerated; +import jakarta.persistence.FetchType; +import jakarta.persistence.GeneratedValue; +import jakarta.persistence.GenerationType; +import jakarta.persistence.Id; +import jakarta.persistence.JoinColumn; +import jakarta.persistence.ManyToOne; +import jakarta.persistence.Table; +import jakarta.persistence.UniqueConstraint; +import jakarta.validation.constraints.Min; +import jakarta.validation.constraints.NotNull; +import jakarta.validation.constraints.Size; +import lombok.AllArgsConstructor; +import lombok.Getter; +import lombok.NoArgsConstructor; +import lombok.Setter; +import lombok.ToString; + +@Getter +@Setter +@NoArgsConstructor +@AllArgsConstructor +@Entity +@Table(name = "usertypemaster") +public class UserType { + + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + @Column(name = "usertype_id", nullable = false, updatable = false) + private short userTypeId; + + @NotNull(message = "User type name cannot be null") + @Size(max = 255, message = "User type name must be less than or equal to 255 characters") + @Column(name = "usertype_name", length = 255, unique = true, nullable = false) + private String usertypeName; + + @Size(max = 255, message = "User type description must be less than or equal to 255 characters") + @Column(name = "usertype_description", length = 255) + private String description; + + @Enumerated(EnumType.STRING) + @Column(name = "status", length = 1, nullable = true) + private Status status; + + @NotNull(message = "Created by cannot be null") + @Min(value = 1, message = "Created by must be a positive integer") + @Column(name = "created_by", nullable = false) + private int createdBy; + + @NotNull(message = "Last updated by cannot be null") + @Min(value = 1, message = "Last updated by must be a positive integer") + @Column(name = "last_updated_by", nullable = false) + private int lastUpdatedBy; + +} \ No newline at end of file diff --git a/src/main/java/com/sahyog/app/inbound/user/model/UserType1.java b/src/main/java/com/sahyog/app/inbound/user/model/UserType1.java new file mode 100644 index 0000000..6903967 --- /dev/null +++ b/src/main/java/com/sahyog/app/inbound/user/model/UserType1.java @@ -0,0 +1,65 @@ +package com.sahyog.app.inbound.user.model; + +public class UserType1 { + + private short userTypeId; + private String usertypeName; + private String description; + private String status; + private int createdBy; + private int lastUpdatedBy; + public short getUserTypeId() { + return userTypeId; + } + public void setUserTypeId(short userTypeId) { + this.userTypeId = userTypeId; + } + public String getUsertypeName() { + return usertypeName; + } + public void setUsertypeName(String usertypeName) { + this.usertypeName = usertypeName; + } + public String getDescription() { + return description; + } + public void setDescription(String description) { + this.description = description; + } + public String getStatus() { + return status; + } + public void setStatus(String status) { + this.status = status; + } + public int getCreatedBy() { + return createdBy; + } + public void setCreatedBy(int createdBy) { + this.createdBy = createdBy; + } + public int getLastUpdatedBy() { + return lastUpdatedBy; + } + public void setLastUpdatedBy(int lastUpdatedBy) { + this.lastUpdatedBy = lastUpdatedBy; + } + public UserType1(short userTypeId, String usertypeName, String description, String status, int createdBy, + int lastUpdatedBy) { + super(); + this.userTypeId = userTypeId; + this.usertypeName = usertypeName; + this.description = description; + this.status = status; + this.createdBy = createdBy; + this.lastUpdatedBy = lastUpdatedBy; + } + @Override + public String toString() { + return "UserType1 [userTypeId=" + userTypeId + ", usertypeName=" + usertypeName + ", description=" + description + + ", status=" + status + ", createdBy=" + createdBy + ", lastUpdatedBy=" + lastUpdatedBy + "]"; + } + + + +} diff --git a/src/main/java/com/sahyog/app/inbound/user/repository/MaterialMasterRepository.java b/src/main/java/com/sahyog/app/inbound/user/repository/MaterialMasterRepository.java new file mode 100644 index 0000000..501c584 --- /dev/null +++ b/src/main/java/com/sahyog/app/inbound/user/repository/MaterialMasterRepository.java @@ -0,0 +1,16 @@ +package com.sahyog.app.inbound.user.repository; + +import java.util.Optional; + +import org.springframework.data.jpa.repository.JpaRepository; + +import com.sahyog.app.inbound.user.model.MaterialMaster; + +public interface MaterialMasterRepository extends JpaRepository { + + + Optional findByPlantIdAndMaterialCode(int plantId, String materialCode); + + Optional findByPlantIdAndMaterialId(Short plantId, Short materialId); + +} diff --git a/src/main/java/com/sahyog/app/inbound/user/repository/PlantRepository.java b/src/main/java/com/sahyog/app/inbound/user/repository/PlantRepository.java new file mode 100644 index 0000000..5b6fefb --- /dev/null +++ b/src/main/java/com/sahyog/app/inbound/user/repository/PlantRepository.java @@ -0,0 +1,32 @@ +package com.sahyog.app.inbound.user.repository; + +import java.util.List; +import java.util.Optional; + +import org.springframework.data.domain.Page; +import org.springframework.data.domain.Pageable; +import org.springframework.data.jpa.repository.JpaRepository; + +import com.sahyog.app.inbound.user.enums.Status; +import com.sahyog.app.inbound.user.model.PlantMaster; + +public interface PlantRepository extends JpaRepository{ + + List findAll(); + + Optional findByPlantCode(String plantCode); + + // Non-paginated query to fetch plants by status + List findByStatus(Status status); + + // Paginated query to fetch plants by status + Page findByStatus(Status status, Pageable pageable); + + // Paginated query to fetch all plants + Page findAll(Pageable pageable); + + Page findByStatusIn(List statuses, Pageable pageable); + + + +} diff --git a/src/main/java/com/sahyog/app/inbound/user/repository/RoleRepository.java b/src/main/java/com/sahyog/app/inbound/user/repository/RoleRepository.java new file mode 100644 index 0000000..ffda8c8 --- /dev/null +++ b/src/main/java/com/sahyog/app/inbound/user/repository/RoleRepository.java @@ -0,0 +1,14 @@ +package com.sahyog.app.inbound.user.repository; + +import java.util.List; +import java.util.Optional; + +import org.springframework.data.jpa.repository.JpaRepository; + +import com.sahyog.app.inbound.user.model.Role; + +public interface RoleRepository extends JpaRepository { + + List findByUserTypeId(short userTypeId); + +} diff --git a/src/main/java/com/sahyog/app/inbound/user/repository/TransporterRepository.java b/src/main/java/com/sahyog/app/inbound/user/repository/TransporterRepository.java new file mode 100644 index 0000000..2c48bc5 --- /dev/null +++ b/src/main/java/com/sahyog/app/inbound/user/repository/TransporterRepository.java @@ -0,0 +1,27 @@ +package com.sahyog.app.inbound.user.repository; + + +import java.util.List; +import java.util.Optional; + +import org.springframework.data.domain.Page; +import org.springframework.data.domain.Pageable; +import org.springframework.data.jpa.domain.Specification; +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.data.jpa.repository.JpaSpecificationExecutor; +import org.springframework.data.jpa.repository.Query; +import org.springframework.stereotype.Repository; + +import com.sahyog.app.inbound.user.model.Transporter; + + +@Repository +public interface TransporterRepository extends JpaRepository { + + Optional findBySupplierCode(String supplierCode); + + Page findAll(Specification specification, Pageable pageable); + + + +} diff --git a/src/main/java/com/sahyog/app/inbound/user/repository/UserPlantRepository.java b/src/main/java/com/sahyog/app/inbound/user/repository/UserPlantRepository.java new file mode 100644 index 0000000..86ef584 --- /dev/null +++ b/src/main/java/com/sahyog/app/inbound/user/repository/UserPlantRepository.java @@ -0,0 +1,29 @@ +package com.sahyog.app.inbound.user.repository; + +import java.util.List; + +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.data.jpa.repository.Modifying; +import org.springframework.data.jpa.repository.Query; + +import com.sahyog.app.inbound.user.model.UserPlant; + +import feign.Param; +import jakarta.transaction.Transactional; + +public interface UserPlantRepository extends JpaRepository{ + + // Fetch UserPlants by userId + List findByUserId(int userId); + + @Query("SELECT up.plantId FROM UserPlant up WHERE up.userId = :userId") + List findPlantIdsByUserId(@Param("userId") int userId); + + // Delete UserPlants by userId and plantIds + @Transactional + @Modifying + @Query("DELETE FROM UserPlant up WHERE up.userId = :userId AND up.plantId IN :plantIds") + void deleteByUserIdAndPlantIds(@Param("userId") int userId, @Param("plantIds") List plantIds); + + +} diff --git a/src/main/java/com/sahyog/app/inbound/user/repository/UserRepository.java b/src/main/java/com/sahyog/app/inbound/user/repository/UserRepository.java new file mode 100644 index 0000000..bab4810 --- /dev/null +++ b/src/main/java/com/sahyog/app/inbound/user/repository/UserRepository.java @@ -0,0 +1,59 @@ +package com.sahyog.app.inbound.user.repository; + +import java.sql.Timestamp; +import java.util.List; +import java.util.Optional; + +import org.springframework.data.domain.Page; +import org.springframework.data.domain.Pageable; +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.data.jpa.repository.Query; +import org.springframework.stereotype.Repository; + +import com.sahyog.app.inbound.user.dto.UserDTO; +import com.sahyog.app.inbound.user.enums.Status; +import com.sahyog.app.inbound.user.model.User; + +import feign.Param; + +@Repository +public interface UserRepository extends JpaRepository { + + + + User findByUserTypeId(short userTypeId); + + Page findByStatus(Status status, Pageable pageable); + + User findByEmployeeTransCode(String employeeTransCode); + + Optional findByEmailAndEmployeeTransCode(String email, String employeeTransCode); + + Page findByStatusIn(List statuses, Pageable pageable); + + List findByStatusIn(List statuses); + + @Query(value = "SELECT * FROM users WHERE last_updated_on = :lastUpdatedOn", nativeQuery = true) + List findUsersByLastUpdatedOn(@Param("lastUpdatedOn") Timestamp lastUpdatedOn); + + @Query(value = "SELECT * FROM users WHERE status = :status ORDER BY last_updated_on DESC", nativeQuery = true) + Page findUsersByStatusWithPagination(@Param("status") String status, Pageable pageable); + + User findByEmail(String email); + + User findByEmployeeTransCodeOrEmail(String employeeTransCode, String email); + +// @Query("SELECT new com.example.dto.UserDTO(u.userId, u.userName, u.firstName, u.lastName, u.email, u.mobile, u.employeeTransCode, u.addedChannel, u.status, u.createdBy, u.lastUpdatedBy, ut.userTypeName) " + +// "FROM User u JOIN u.userType ut " + +// "WHERE (:userTypeName IS NULL OR ut.userTypeName = :userTypeName) " + +// "AND (:email IS NULL OR u.email = :email) " + +// "AND (:employeeTransCode IS NULL OR u.employeeTransCode = :employeeTransCode) " + +// "AND (:status IS NULL OR u.status = :status)") +// Page findUsersWithFilters(@Param("userTypeName") String userTypeName, +// @Param("email") String email, +// @Param("employeeTransCode") String employeeTransCode, +// @Param("status") Status status, Pageable pageable); + + + +} diff --git a/src/main/java/com/sahyog/app/inbound/user/repository/UserRoleRepository.java b/src/main/java/com/sahyog/app/inbound/user/repository/UserRoleRepository.java new file mode 100644 index 0000000..80d4fb3 --- /dev/null +++ b/src/main/java/com/sahyog/app/inbound/user/repository/UserRoleRepository.java @@ -0,0 +1,34 @@ +package com.sahyog.app.inbound.user.repository; + +import java.util.List; +import java.util.Optional; + +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.data.jpa.repository.Modifying; +import org.springframework.data.jpa.repository.Query; +import org.springframework.stereotype.Repository; + +import com.sahyog.app.inbound.user.model.UserRole; + +import feign.Param; +import jakarta.transaction.Transactional; + +@Repository +public interface UserRoleRepository extends JpaRepository { + +// @Query(value = "SELECT ur.userrole_id, ur.status, ur.user_id FROM userrole ur WHERE ur.user_id = :userId AND ur.role_id = :roleId", nativeQuery = true) + Optional findByUserIdAndRoleId(@Param("userId") int userId, @Param("roleId") int roleId); + + @Transactional + @Modifying + @Query("DELETE FROM UserRole ur WHERE ur.userId = :userId AND ur.roleId IN :roleIds") + void deleteByUserIdAndRoleIds(@Param("userId") int userId, @Param("roleIds") List roleIds); + + List findByUserId(int userId); + + @Query("SELECT ur.roleId FROM UserRole ur WHERE ur.userId = :userId") + List findRoleIdsByUserId(@Param("userId") int userId); + +// List findRoleIdsByUserId(int userId); +} + diff --git a/src/main/java/com/sahyog/app/inbound/user/repository/UserTypeRepository.java b/src/main/java/com/sahyog/app/inbound/user/repository/UserTypeRepository.java new file mode 100644 index 0000000..6999b46 --- /dev/null +++ b/src/main/java/com/sahyog/app/inbound/user/repository/UserTypeRepository.java @@ -0,0 +1,20 @@ +package com.sahyog.app.inbound.user.repository; + +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.data.jpa.repository.Query; +import org.springframework.stereotype.Repository; + +import com.sahyog.app.inbound.user.model.UserType; + +import feign.Param; + +@Repository +public interface UserTypeRepository extends JpaRepository { + +// @Query("SELECT u FROM usertypemaster1 WHERE LOWER(usertype_name) = LOWER(:usertypeName)") + UserType findByUsertypeName(@Param("usertypeName") String usertypeName); +// UserType findByUsertypeName(String usertypeName); // Correct the method name + + + +} diff --git a/src/main/java/com/sahyog/app/inbound/user/service/MaterialMasterService.java b/src/main/java/com/sahyog/app/inbound/user/service/MaterialMasterService.java new file mode 100644 index 0000000..ec0ea2b --- /dev/null +++ b/src/main/java/com/sahyog/app/inbound/user/service/MaterialMasterService.java @@ -0,0 +1,28 @@ +package com.sahyog.app.inbound.user.service; + +import java.util.List; +import java.util.Map; +import org.springframework.data.domain.Page; +import org.springframework.data.domain.Pageable; + +import com.sahyog.app.inbound.user.dto.MaterialMasterDTO; +import com.sahyog.app.inbound.user.enums.Status; +import com.sahyog.app.inbound.user.model.Response; +import com.sahyog.app.inbound.user.model.User; + +import jakarta.validation.Valid; + +public interface MaterialMasterService { + + Response>> processMaterial(@Valid List dtos, User currentUser); + + List getAllMaterials(); + + MaterialMasterDTO getMaterialByPlantIdAndMaterialId(Short plantId, Short materialId); + + Page getMaterialsWithFilters(String materialCode, String materialGroup, String materialGroupDesc, + Status status, org.springframework.data.domain.Pageable pageable); + + Page> getMaterialDetails(Map req, Pageable pageable); + +} diff --git a/src/main/java/com/sahyog/app/inbound/user/service/PlantMasterService.java b/src/main/java/com/sahyog/app/inbound/user/service/PlantMasterService.java new file mode 100644 index 0000000..1fef6bb --- /dev/null +++ b/src/main/java/com/sahyog/app/inbound/user/service/PlantMasterService.java @@ -0,0 +1,33 @@ +package com.sahyog.app.inbound.user.service; + +import java.util.List; +import java.util.Map; + +import org.springframework.data.domain.Page; +import org.springframework.data.domain.Pageable; + +import com.sahyog.app.inbound.user.dto.PlantDTO; +import com.sahyog.app.inbound.user.dto.PlantMasterDTO; +import com.sahyog.app.inbound.user.enums.Status; +import com.sahyog.app.inbound.user.model.Response; +import com.sahyog.app.inbound.user.model.User; + +import jakarta.validation.Valid; + +public interface PlantMasterService { + + Response>> processPlant(@Valid List dtos, User currentUser); + + List getPlantsByStatus(Status valueOf); + + PlantDTO updatePlantStatus(Short plantId, String plantCode, Status valueOf, User currentUser); + +// Page getPlantsByStatus(Status valueOf, Pageable pageable); + + Page getAllPlantsWithPagination(Pageable pageable); + + List getAllPlants(); + + Page getPlantsByStatusWithPagination(List statusFilters, Pageable pageable); + +} diff --git a/src/main/java/com/sahyog/app/inbound/user/service/RoleService.java b/src/main/java/com/sahyog/app/inbound/user/service/RoleService.java new file mode 100644 index 0000000..09e9fc8 --- /dev/null +++ b/src/main/java/com/sahyog/app/inbound/user/service/RoleService.java @@ -0,0 +1,26 @@ +package com.sahyog.app.inbound.user.service; + +import java.util.List; + +import com.sahyog.app.inbound.user.dto.RoleDTO; +import com.sahyog.app.inbound.user.model.Role; + +public interface RoleService { + +// Role createRole(RoleDTO roleDTO); +// +// List getAllRoles(); +// +// Role getRoleById(int id); +// +// Role updateRole(int id, RoleDTO roleDTO); +// +// void deleteRole(int id); +// +// List getRolesByUserTypeId(int userTypeId); + +// List getRolesByUserTypeId(int userTypeId); + + + +} diff --git a/src/main/java/com/sahyog/app/inbound/user/service/TransporterService.java b/src/main/java/com/sahyog/app/inbound/user/service/TransporterService.java new file mode 100644 index 0000000..5ab7357 --- /dev/null +++ b/src/main/java/com/sahyog/app/inbound/user/service/TransporterService.java @@ -0,0 +1,34 @@ +package com.sahyog.app.inbound.user.service; + +import java.util.List; +import java.util.Map; + +import org.springframework.data.domain.Page; +import org.springframework.data.domain.Pageable; +import org.springframework.http.ResponseEntity; + +import com.sahyog.app.inbound.user.dto.TransporterMasterDto; +import com.sahyog.app.inbound.user.dto.TransporterResponse; +import com.sahyog.app.inbound.user.dto.TransporterUpdateDTO; +import com.sahyog.app.inbound.user.model.Response; + + +public interface TransporterService { + + Response>> processTransporters(List transporterMasterDtos); + + boolean updateTransporters(List transporterUpdateDTOList); + + Page getTransportersWithFilters(String supplierCode, String transporterName, + String supplierAccountGroup, String state, String bpGrouping, Pageable pageable); + + Page> getTransporterDetails(Map req, Pageable pageable); + + Map getDropDownValues(); + + + + + + +} diff --git a/src/main/java/com/sahyog/app/inbound/user/service/UserPlantService.java b/src/main/java/com/sahyog/app/inbound/user/service/UserPlantService.java new file mode 100644 index 0000000..b4cfcf0 --- /dev/null +++ b/src/main/java/com/sahyog/app/inbound/user/service/UserPlantService.java @@ -0,0 +1,21 @@ +package com.sahyog.app.inbound.user.service; + +import java.util.List; +import java.util.Map; + +import com.sahyog.app.inbound.user.dto.PlantMasterDTO; + +public interface UserPlantService { + + List getAllPlantsWithAssignmentInfo(String email, String employeeTransCode); + +// boolean assignSelectedUserPlantsToUser(String email, String employeeTransCode, List selectedUserPlantIds); + +// boolean assignSelectedPlantsToUser(String email, String employeeTransCode, List selectedPlantIds); + + boolean assignSelectedPlantsToUser(String email, String employeeTransCode, List selectedPlantIds, + int createdBy, int lastUpdatedBy); + + Map getDropDownValues(); + +} diff --git a/src/main/java/com/sahyog/app/inbound/user/service/UserRoleService.java b/src/main/java/com/sahyog/app/inbound/user/service/UserRoleService.java new file mode 100644 index 0000000..7b22e5d --- /dev/null +++ b/src/main/java/com/sahyog/app/inbound/user/service/UserRoleService.java @@ -0,0 +1,21 @@ +package com.sahyog.app.inbound.user.service; + +import java.util.List; +import java.util.Map; + +import com.sahyog.app.inbound.user.dto.RoleDTO; + +public interface UserRoleService { + + // Assign roles to a user based on userId and userTypeId + void assignRolesToUser(int userId, short userTypeId); + + // Assign selected roles to a user based on email, employeeTransCode, and selected role IDs + boolean assignSelectedRolesToUser(String email, String employeeTransCode, List selectedRoleIds, + int createdBy, int lastUpdatedBy); + + // Fetch all roles and assigned roles for a user based on email and employeeTransCode + List getAllRolesWithAssignmentInfo(String email, String employeeTransCode); + + Map getDropDownValues(); +} diff --git a/src/main/java/com/sahyog/app/inbound/user/service/UserService.java b/src/main/java/com/sahyog/app/inbound/user/service/UserService.java new file mode 100644 index 0000000..d4104c8 --- /dev/null +++ b/src/main/java/com/sahyog/app/inbound/user/service/UserService.java @@ -0,0 +1,66 @@ +package com.sahyog.app.inbound.user.service; + + +import java.util.List; +import java.util.Map; +import java.util.Optional; + +import org.springframework.data.domain.Page; +import org.springframework.data.domain.Pageable; +import org.springframework.http.ResponseEntity; + +import com.sahyog.app.inbound.user.dto.UserDTO; +import com.sahyog.app.inbound.user.dto.UserUpdateDTO; +import com.sahyog.app.inbound.user.enums.Status; +import com.sahyog.app.inbound.user.model.Response; +import com.sahyog.app.inbound.user.model.User; + +public interface UserService { + + +// List createUsers(List userDTOs); + +// ResponseEntity updateUser(String userEmpTransCode, UserUpdateDTO userUpdateDTO); + +// List getActiveUsers(); + +// List getUsersByStatus(List status); + + Response>> createInternalUsers(List userDTOs); + +// Page getAllUsers(int page, int size); + + Response>> createUsers(List userDTOs); + +// ResponseEntity updateUser(String employeeTransCode, UserUpdateDTO userUpdateDTO); + + List getAllUsers(); + + List getUsersByStatus(List status); + + Page getAllUsersWithPagination(Pageable pageable); + + Page getUsersByStatusWithPagination(String status, Pageable pageable); + + Page getAllUsers(Pageable pageable); + +// List getActiveUsers(); + + List getUsersByActive_Inactive(List status); + + Page> getUserDetails(Map req, Pageable pageable); + + Response> updateUser(String userEmpTransCode, UserUpdateDTO userUpdateDTO); + + Map getDropDownValues(); + + +// Page getUsersWithFilters(String userTypeName, String email, String employeeTransCode, Status status, +// Pageable pageable); + + + + + + +} diff --git a/src/main/java/com/sahyog/app/inbound/user/service/UserTypeService.java b/src/main/java/com/sahyog/app/inbound/user/service/UserTypeService.java new file mode 100644 index 0000000..7ab61c9 --- /dev/null +++ b/src/main/java/com/sahyog/app/inbound/user/service/UserTypeService.java @@ -0,0 +1,30 @@ +package com.sahyog.app.inbound.user.service; + +import java.util.List; +import java.util.Map; + +import org.springframework.data.domain.Page; +import org.springframework.data.domain.Pageable; + +import com.sahyog.app.inbound.user.dto.UserTypeDTO; +import com.sahyog.app.inbound.user.model.Response; +import com.sahyog.app.inbound.user.model.UserType; +import com.sahyog.app.inbound.user.model.UserType1; + +public interface UserTypeService { + +// List getAllUserTypes(int page, int size); +// + UserType getUserTypeById(short id); +// +//// UserType updateUserType(Long id, UserType userTypeDetails); +// + void updateUserTypeStatus(short userTypeId); +// +// UserType createUserType(UserType1 userTypeDTO); + Response>> createUserType(UserTypeDTO userTypeDTO); + Page> getUsertypeDetails(Map req, Pageable pageable); + Map getDropDownValues(); + + +} diff --git a/src/main/java/com/sahyog/app/inbound/user/serviceImpl/MaterialMasterServiceImpl.java b/src/main/java/com/sahyog/app/inbound/user/serviceImpl/MaterialMasterServiceImpl.java new file mode 100644 index 0000000..77a8837 --- /dev/null +++ b/src/main/java/com/sahyog/app/inbound/user/serviceImpl/MaterialMasterServiceImpl.java @@ -0,0 +1,236 @@ +package com.sahyog.app.inbound.user.serviceImpl; + +import java.util.ArrayList; +import java.util.List; +import java.util.Map; +import java.util.Optional; +import java.util.stream.Collectors; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.dao.DataAccessException; +import org.springframework.data.domain.Page; +import org.springframework.data.domain.PageImpl; +import org.springframework.stereotype.Service; +import org.springframework.data.domain.Pageable; +import org.springframework.data.jpa.domain.Specification; +import org.springframework.jdbc.core.JdbcTemplate; + +import com.sahyog.app.inbound.user.dto.MaterialMasterDTO; +import com.sahyog.app.inbound.user.enums.Status; +import com.sahyog.app.inbound.user.mapper.MaterialMapper; +import com.sahyog.app.inbound.user.model.MaterialMaster; +import com.sahyog.app.inbound.user.model.Response; +import com.sahyog.app.inbound.user.model.User; +import com.sahyog.app.inbound.user.repository.MaterialMasterRepository; +import com.sahyog.app.inbound.user.service.MaterialMasterService; +import com.sahyog.app.inbound.user.utils.MaterialProcessingHelper; + +import jakarta.persistence.EntityNotFoundException; +import jakarta.persistence.criteria.Predicate; +import jakarta.transaction.Transactional; +import jakarta.validation.ConstraintViolationException; +import jakarta.validation.Valid; +@Service +public class MaterialMasterServiceImpl implements MaterialMasterService { + + @Autowired + private MaterialMasterRepository materialMasterRepository; + + @Autowired + private MaterialMapper materialMapper; + + @Autowired + private JdbcTemplate temp; + + private static final Logger log = LoggerFactory.getLogger(MaterialMasterServiceImpl.class); + + @Transactional + @Override + public Response>> processMaterial(@Valid List dtos, User currentUser) { + log.info("Processing materials for user: {}", currentUser.getUserName()); + + List> materialDataList = new ArrayList<>(); + List createdMaterials = new ArrayList<>(); + List updatedMaterials = new ArrayList<>(); + List failedMaterials = new ArrayList<>(); + + for (MaterialMasterDTO dto : dtos) { + try { + log.debug("Processing material with code: {}", dto.getMaterialCode()); + Optional existingMaterial = materialMasterRepository + .findByPlantIdAndMaterialCode(dto.getPlantId(), dto.getMaterialCode()); + + if (existingMaterial.isPresent()) { + MaterialMaster material = existingMaterial.get(); + log.debug("Updating existing material: {}", material.getMaterialCode()); + materialMapper.updateEntityFromDTO(material, dto, currentUser); + materialMasterRepository.save(material); + updatedMaterials.add(dto.getMaterialCode()); + MaterialProcessingHelper.addMaterialData(materialDataList, "update", material); + } else { + log.debug("Creating new material with code: {}", dto.getMaterialCode()); + MaterialMaster material = materialMapper.toEntity(dto, currentUser); + materialMasterRepository.save(material); + createdMaterials.add(dto.getMaterialCode()); + MaterialProcessingHelper.addMaterialData(materialDataList, "create", material); + } + } catch (ConstraintViolationException e) { + log.error("Validation error while processing material with code {}: {}", dto.getMaterialCode(), e.getMessage()); + failedMaterials.add(dto.getMaterialCode()); + MaterialProcessingHelper.addMaterialData(materialDataList, "error", null); + return MaterialProcessingHelper.buildErrorResponse(failedMaterials, "Validation error: " + e.getMessage()); + } catch (DataAccessException e) { + log.error("Database error while processing material with code {}: {}", dto.getMaterialCode(), e.getMessage()); + failedMaterials.add(dto.getMaterialCode()); + MaterialProcessingHelper.addMaterialData(materialDataList, "error", null); + return MaterialProcessingHelper.buildErrorResponse(failedMaterials, "Database error: " + e.getMessage()); + } catch (Exception e) { + log.error("Unexpected error while processing material with code {}: {}", dto.getMaterialCode(), e.getMessage()); + failedMaterials.add(dto.getMaterialCode()); + MaterialProcessingHelper.addMaterialData(materialDataList, "error", null); + return MaterialProcessingHelper.buildErrorResponse(failedMaterials, "Failed to process material: " + e.getMessage()); + } + } + + log.info("Material processing completed. Created: {}, Updated: {}, Failed: {}", createdMaterials.size(), updatedMaterials.size(), failedMaterials.size()); + return MaterialProcessingHelper.buildResponse(createdMaterials, updatedMaterials, failedMaterials, materialDataList); + } + + @Override + public List getAllMaterials() { + log.info("Fetching all materials"); + List materials = materialMasterRepository.findAll(); + return materials.stream().map(materialMapper::toDTO).collect(Collectors.toList()); + } + + @Override + public MaterialMasterDTO getMaterialByPlantIdAndMaterialId(Short plantId, Short materialId) { + log.info("Fetching material with plantId: {} and materialId: {}", plantId, materialId); + MaterialMaster material = materialMasterRepository.findByPlantIdAndMaterialId(plantId, materialId) + .orElseThrow(() -> new EntityNotFoundException("Material not found with plantId: " + plantId + " and materialId: " + materialId)); + return materialMapper.toDTO(material); + } + + @Override + public Page getMaterialsWithFilters(String materialCode, String materialGroup, + String materialGroupDesc, Status status, Pageable pageable) { + log.info("Fetching materials with filters - materialCode: {}, materialGroup: {}, materialGroupDesc: {}, status: {}", materialCode, materialGroup, materialGroupDesc, status); + + Specification specification = (root, query, criteriaBuilder) -> { + List predicates = new ArrayList<>(); + + if (materialCode != null && !materialCode.isEmpty()) { + predicates.add(criteriaBuilder.equal(root.get("materialCode"), materialCode)); + } + if (materialGroup != null && !materialGroup.isEmpty()) { + predicates.add(criteriaBuilder.equal(root.get("materialGroup"), materialGroup)); + } + if (materialGroupDesc != null && !materialGroupDesc.isEmpty()) { + predicates.add(criteriaBuilder.like(root.get("materialGroupDesc"), "%" + materialGroupDesc + "%")); + } + if (status != null) { + predicates.add(criteriaBuilder.equal(root.get("status"), status)); + } + + return criteriaBuilder.and(predicates.toArray(new Predicate[0])); + }; + + Page materials = materialMasterRepository.findAll(pageable); + log.debug("Found {} materials with the applied filters", materials.getTotalElements()); + return materials.map(materialMapper::toDTO); + } + + @Override + public Page> getMaterialDetails(Map req, Pageable pageable) { + log.info("Fetching material details with filters: {}", req); + StringBuffer materialQuery = new StringBuffer( + "SELECT m.material_id, m.material_code, m.material_description, m.material_group, m.material_group_desc, " + + "m.plant_id, p.plant_code, m.status, m.created_on, m.last_updated_on, m.created_by, m.last_updated_by " + + "FROM materialmaster m " + + "JOIN plantmaster p ON m.plant_id = p.plant_id " + + "WHERE 1=1 "); + + StringBuffer materialCountQuery = new StringBuffer( + "SELECT COUNT(*) FROM materialmaster m " + + "JOIN plantmaster p ON m.plant_id = p.plant_id " + + "WHERE 1=1 "); + + try { + if (req.containsKey("plantCode") && req.get("plantCode") != null && !req.get("plantCode").toString().isEmpty()) { + log.debug("Adding filter for plantCode: {}", req.get("plantCode")); + materialQuery.append(" AND p.plant_code = '").append(req.get("plantCode").toString()).append("'"); + materialCountQuery.append(" AND p.plant_code = '").append(req.get("plantCode").toString()).append("'"); + } + + if (req.containsKey("materialCode") && req.get("materialCode") != null && !req.get("materialCode").toString().isEmpty()) { + log.debug("Adding filter for materialCode: {}", req.get("materialCode")); + materialQuery.append(" AND m.material_code = '").append(req.get("materialCode").toString()).append("'"); + materialCountQuery.append(" AND m.material_code = '").append(req.get("materialCode").toString()).append("'"); + } + + materialQuery.append(" ORDER BY ").append(pageable.getSort().toString().replace(":", " ")).append(" LIMIT ") + .append(pageable.getPageSize()).append(" OFFSET ").append(pageable.getOffset()); + + List> result = temp.queryForList(materialQuery.toString()); + Long totalCount = temp.queryForObject(materialCountQuery.toString(), Long.class); + + log.info("Material details fetched successfully. Total records: {}", totalCount); + return new PageImpl<>(result, pageable, totalCount); + } catch (Exception e) { + log.error("Error while fetching material details: {}", e.getMessage()); + return Page.empty(); + } + } +} + + +// +// @Override +// public Page> getMaterialDetails(Map req, Pageable pageable) { +// StringBuffer materialQuery = new StringBuffer( +// "SELECT `material_id`, `material_code`, `material_description`, `material_group`, `material_group_desc`, " + +// "`plant_id`, `status`, `created_on`, `last_updated_on`, `created_by`, `last_updated_by`, " + +// "FROM `materialmaster` WHERE 1=1 "); +// StringBuffer materialCountQuery = new StringBuffer("SELECT COUNT(*) FROM `materialmaster` WHERE 1=1 "); +// +// try { +// // Add filters dynamically +// if (req.containsKey("plantCode") && req.get("plantCode") != null && !req.get("plantCode").toString().isEmpty()) { +// transporterQuery.append(" AND `plant_id`='").append(req.get("plantCode").toString()).append("'"); +// transporterCountQuery.append(" AND `plant_id`='").append(req.get("plantCode").toString()).append("'"); +// } +// if (req.containsKey("supplierName") && req.get("supplierName") != null && !req.get("supplierName").toString().isEmpty()) { +// transporterQuery.append(" AND `transporter_name`='").append(req.get("supplierName").toString()).append("'"); +// transporterCountQuery.append(" AND `transporter_name`='").append(req.get("supplierName").toString()).append("'"); +// } +// if (req.containsKey("suplierAccountGroup") && req.get("suplierAccountGroup") != null && !req.get("suplierAccountGroup").toString().isEmpty()) { +// transporterQuery.append(" AND `supplier_account_group`='").append(req.get("suplierAccountGroup").toString()).append("'"); +// transporterCountQuery.append(" AND `supplier_account_group`='").append(req.get("suplierAccountGroup").toString()).append("'"); +// } +// if (req.containsKey("state") && req.get("state") != null && !req.get("state").toString().isEmpty()) { +// transporterQuery.append(" AND `state`='").append(req.get("state").toString()).append("'"); +// transporterCountQuery.append(" AND `state`='").append(req.get("state").toString()).append("'"); +// } +// if (req.containsKey("bpGroup") && req.get("bpGroup") != null && !req.get("bpGroup").toString().isEmpty()) { +// transporterQuery.append(" AND `bp_grouping`='").append(req.get("bpGroup").toString()).append("'"); +// transporterCountQuery.append(" AND `bp_grouping`='").append(req.get("bpGroup").toString()).append("'"); +// } +// +// // Add pagination and sorting +// transporterQuery.append(" ORDER BY ").append(pageable.getSort().toString().replace(":", " ")).append(" LIMIT ") +// .append(pageable.getPageSize()).append(" OFFSET ").append(pageable.getOffset()); +// +// // Execute the queries +// List> result = temp.queryForList(transporterQuery.toString()); +// Long totalCount = temp.queryForObject(transporterCountQuery.toString(), Long.class); +// +// // Return the paginated result +// return new PageImpl<>(result, pageable, totalCount); +// +// } catch (Exception e) { +// log.error("Error while fetching transporter details: {}", e.getMessage()); +// return Page.empty(); +// } +// } diff --git a/src/main/java/com/sahyog/app/inbound/user/serviceImpl/PlantMasterServiceImpl.java b/src/main/java/com/sahyog/app/inbound/user/serviceImpl/PlantMasterServiceImpl.java new file mode 100644 index 0000000..c3545bd --- /dev/null +++ b/src/main/java/com/sahyog/app/inbound/user/serviceImpl/PlantMasterServiceImpl.java @@ -0,0 +1,168 @@ +package com.sahyog.app.inbound.user.serviceImpl; + +import java.util.ArrayList; +import java.util.List; +import java.util.Map; +import java.util.Optional; +import java.util.stream.Collectors; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.dao.DataAccessException; +import org.springframework.data.domain.Page; +import org.springframework.data.domain.Pageable; +import org.springframework.stereotype.Service; + +import com.sahyog.app.inbound.user.dto.PlantDTO; +import com.sahyog.app.inbound.user.enums.Status; +import com.sahyog.app.inbound.user.mapper.PlantMapper; +import com.sahyog.app.inbound.user.model.PlantMaster; +import com.sahyog.app.inbound.user.model.Response; +import com.sahyog.app.inbound.user.model.User; +import com.sahyog.app.inbound.user.repository.PlantRepository; +import com.sahyog.app.inbound.user.service.PlantMasterService; +import com.sahyog.app.inbound.user.utils.PlantProcessingHelper; + +import jakarta.persistence.EntityNotFoundException; +import jakarta.transaction.Transactional; +import jakarta.validation.ConstraintViolationException; +import jakarta.validation.Valid; +@Service +public class PlantMasterServiceImpl implements PlantMasterService { + + private static final Logger log = LoggerFactory.getLogger(PlantMasterServiceImpl.class); + + @Autowired + private PlantRepository plantMasterRepository; + + @Autowired + private PlantMapper plantMapper; + + @Transactional + @Override + public Response>> processPlant(@Valid List dtos, User currentUser) { + log.info("Starting processing of Plant DTOs: {} by User: {}", dtos, currentUser); + + List> plantDataList = new ArrayList<>(); + List createdPlants = new ArrayList<>(); + List updatedPlants = new ArrayList<>(); + List failedPlants = new ArrayList<>(); + + for (PlantDTO dto : dtos) { + log.debug("Processing Plant DTO: {}", dto); + try { + Optional existingPlant = plantMasterRepository.findByPlantCode(dto.getPlantCode()); + + if (existingPlant.isPresent()) { + // Update existing plant + PlantMaster plant = existingPlant.get(); + plantMapper.updateEntityFromDTO(plant, dto, currentUser); + plantMasterRepository.save(plant); + updatedPlants.add(dto.getPlantCode()); + PlantProcessingHelper.addPlantData(plantDataList, "update", plant); + log.info("Updated existing plant with Plant Code: {}", dto.getPlantCode()); + } else { + // Create a new plant + PlantMaster plant = plantMapper.toEntity(dto, currentUser); + plantMasterRepository.save(plant); + createdPlants.add(dto.getPlantCode()); + PlantProcessingHelper.addPlantData(plantDataList, "create", plant); + log.info("Created new plant with Plant Code: {}", dto.getPlantCode()); + } + } catch (ConstraintViolationException e) { + failedPlants.add(dto.getPlantCode()); + PlantProcessingHelper.addPlantData(plantDataList, "error", null); + log.error("Constraint violation while processing Plant Code: {}. Error: {}", dto.getPlantCode(), e.getMessage(), e); + } catch (DataAccessException e) { + failedPlants.add(dto.getPlantCode()); + PlantProcessingHelper.addPlantData(plantDataList, "error", null); + log.error("Data access error while processing Plant Code: {}. Error: {}", dto.getPlantCode(), e.getMessage(), e); + } catch (Exception e) { + failedPlants.add(dto.getPlantCode()); + PlantProcessingHelper.addPlantData(plantDataList, "error", null); + log.error("Unexpected error while processing Plant Code: {}. Error: {}", dto.getPlantCode(), e.getMessage(), e); + } + } + + if (!failedPlants.isEmpty()) { + log.warn("Processing completed with failures for Plant Codes: {}", failedPlants); + return PlantProcessingHelper.buildErrorResponse(failedPlants, "Some plants failed to process."); + } + + log.info("Successfully processed all Plant DTOs. Created: {}, Updated: {}", createdPlants, updatedPlants); + return new Response<>(200, "Processed successfully", plantDataList); + } + + @Override + public List getAllPlants() { + log.info("Fetching all plants from the database."); + List plants = plantMasterRepository.findAll(); + log.info("Fetched {} plants from the database.", plants.size()); + return plants.stream().map(plantMapper::toDTO).collect(Collectors.toList()); + } + + @Override + public List getPlantsByStatus(Status status) { + log.info("Fetching plants with status: {}", status); + List plants = plantMasterRepository.findByStatus(status); + log.info("Fetched {} plants with status: {}", plants.size(), status); + return plants.stream().map(plantMapper::toDTO).collect(Collectors.toList()); + } + + @Override + public Page getAllPlantsWithPagination(Pageable pageable) { + log.info("Fetching paginated plants. Pageable: {}", pageable); + Page plants = plantMasterRepository.findAll(pageable); + log.info("Fetched {} plants with pagination.", plants.getTotalElements()); + return plants.map(plantMapper::toDTO); + } + + @Override + public Page getPlantsByStatusWithPagination(List statusFilters, Pageable pageable) { + log.info("Fetching paginated plants with status filters: {} and Pageable: {}", statusFilters, pageable); + + List statuses = statusFilters.stream() + .map(status -> Status.valueOf(status.toUpperCase())) + .collect(Collectors.toList()); + + Page plants = plantMasterRepository.findByStatusIn(statuses, pageable); + log.info("Fetched {} plants with status filters: {} and pagination.", plants.getTotalElements(), statuses); + return plants.map(plantMapper::toDTO); + } + + @Override + @Transactional + public PlantDTO updatePlantStatus(Short plantId, String plantCode, Status status, User currentUser) { + log.info("Updating plant status. PlantId: {}, PlantCode: {}, Status: {}", plantId, plantCode, status); + + try { + PlantMaster plant; + + if (plantId != null) { + log.debug("Fetching plant by ID: {}", plantId); + plant = plantMasterRepository.findById(plantId) + .orElseThrow(() -> new EntityNotFoundException("Plant not found with ID: " + plantId)); + } else { + log.debug("Fetching plant by Code: {}", plantCode); + plant = plantMasterRepository.findByPlantCode(plantCode) + .orElseThrow(() -> new EntityNotFoundException("Plant not found with code: " + plantCode)); + } + + // Update the status and save + plant.setStatus(status); + plant.setLastUpdatedBy(currentUser.getUserId()); + PlantMaster updatedPlant = plantMasterRepository.save(plant); + + log.info("Successfully updated plant status. Updated Plant: {}", updatedPlant); + return plantMapper.toDTO(updatedPlant); + } catch (EntityNotFoundException e) { + log.error("Error updating plant status. Message: {}", e.getMessage(), e); + throw e; + } catch (Exception e) { + log.error("Unexpected error while updating plant status. Message: {}", e.getMessage(), e); + throw new RuntimeException("Failed to update plant status", e); + } + } +} + diff --git a/src/main/java/com/sahyog/app/inbound/user/serviceImpl/RoleServiceImpl.java b/src/main/java/com/sahyog/app/inbound/user/serviceImpl/RoleServiceImpl.java new file mode 100644 index 0000000..bd0fc9a --- /dev/null +++ b/src/main/java/com/sahyog/app/inbound/user/serviceImpl/RoleServiceImpl.java @@ -0,0 +1,113 @@ +package com.sahyog.app.inbound.user.serviceImpl; + + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import com.sahyog.app.inbound.user.dto.RoleDTO; +import com.sahyog.app.inbound.user.mapper.RoleMapper; +import com.sahyog.app.inbound.user.model.Role; +import com.sahyog.app.inbound.user.model.User; +import com.sahyog.app.inbound.user.model.UserType; +import com.sahyog.app.inbound.user.repository.RoleRepository; +import com.sahyog.app.inbound.user.repository.UserRepository; +import com.sahyog.app.inbound.user.repository.UserRoleRepository; +import com.sahyog.app.inbound.user.repository.UserTypeRepository; +import com.sahyog.app.inbound.user.service.RoleService; + +import java.time.LocalDateTime; +import java.util.List; +import java.util.stream.Collectors; +@Service +public class RoleServiceImpl implements RoleService { + + @Autowired + private RoleRepository roleRepository; + + @Autowired + private RoleMapper roleMapper; + + @Autowired + private UserRepository userRepository; + + @Autowired + private UserRoleRepository userRoleRepository; + + @Autowired + private UserTypeRepository userTypeRepository; +// +// @Override +// public List getRolesByUserTypeId(int userTypeId) { +// List roles = roleRepository.findByUserTypeId(userTypeId); +// return roleMapper.mapToDTOList(roles); +// } + + +// @Override +// public Role createRole(RoleDTO roleDTO) { +// UserType userType = userTypeRepository.findById(roleDTO.getUserType().getUserTypeId()) +// .orElseThrow(() -> new IllegalArgumentException("Invalid UserType ID")); +// User createdBy = userRepository.findById(roleDTO.getCreatedBy().getUserId()) +// .orElseThrow(() -> new IllegalArgumentException("Invalid CreatedBy User ID")); +// User lastUpdatedBy = userRepository.findById(roleDTO.getLastUpdatedBy().getUserId()) +// .orElseThrow(() -> new IllegalArgumentException("Invalid LastUpdatedBy User ID")); +// +// Role role = roleMapper.toEntity(roleDTO, userType, createdBy, lastUpdatedBy); +// return roleRepository.save(role); +// } +// +// @Override +// public List getRolesByUserTypeId(int userTypeId) { +// return roleRepository.findByUserTypeId(userTypeId); +// } +// +// +// @Override +// public List getAllRoles() { +// return roleRepository.findAll(); +// } +// +// +// @Override +// public Role getRoleById(int id) { +// return roleRepository.findById(id) +// .orElseThrow(() -> new IllegalArgumentException("Role not found")); +// } +// +// +// @Override +// public Role updateRole(int id, RoleDTO roleDTO) { +// Role existingRole = roleRepository.findById(id) +// .orElseThrow(() -> new IllegalArgumentException("Role not found")); +// +// UserType userType = userTypeRepository.findById(roleDTO.getUserType().getUserTypeId() +// ) +// .orElseThrow(() -> new IllegalArgumentException("Invalid UserType ID")); +// User createdBy = userRepository.findById(roleDTO.getCreatedBy().getUserId()) +// .orElseThrow(() -> new IllegalArgumentException("Invalid CreatedBy User ID")); +// User lastUpdatedBy = userRepository.findById(roleDTO.getLastUpdatedBy().getUserId()) +// .orElseThrow(() -> new IllegalArgumentException("Invalid LastUpdatedBy User ID")); +// +// existingRole.setRoleName(roleDTO.getRoleName()); +// existingRole.setRoleDescription(roleDTO.getRoleDescription()); +// existingRole.setUserType(userType); +// existingRole.setStatus(roleDTO.getStatus()); +// existingRole.setLastUpdatedBy(lastUpdatedBy); +//// existingRole.setLastUpdatedOn(LocalDateTime.now()); +// +// return roleRepository.save(existingRole); +// } +// +// +// @Override +// public void deleteRole(int id) { +// Role role = roleRepository.findById(id) +// .orElseThrow(() -> new IllegalArgumentException("Role not found")); +// roleRepository.delete(role); +// } +// + + + + +} \ No newline at end of file diff --git a/src/main/java/com/sahyog/app/inbound/user/serviceImpl/TransporterServiceImpl.java b/src/main/java/com/sahyog/app/inbound/user/serviceImpl/TransporterServiceImpl.java new file mode 100644 index 0000000..c3b13ab --- /dev/null +++ b/src/main/java/com/sahyog/app/inbound/user/serviceImpl/TransporterServiceImpl.java @@ -0,0 +1,352 @@ +package com.sahyog.app.inbound.user.serviceImpl; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Optional; +import java.util.stream.Collectors; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.data.domain.Page; +import org.springframework.data.domain.PageImpl; +import org.springframework.data.domain.Pageable; +import org.springframework.data.jpa.domain.Specification; +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; +import org.springframework.jdbc.core.JdbcTemplate; +import org.springframework.stereotype.Service; + +import com.sahyog.app.inbound.user.dto.TransporterMasterDto; +import com.sahyog.app.inbound.user.dto.TransporterResponse; +import com.sahyog.app.inbound.user.dto.TransporterUpdateDTO; +import com.sahyog.app.inbound.user.dto.UserDTO; +import com.sahyog.app.inbound.user.exception.TransporterProcessingException; +import com.sahyog.app.inbound.user.exception.TransporterValidationException; +import com.sahyog.app.inbound.user.filter.TransporterFilters; +import com.sahyog.app.inbound.user.mapper.TransporterMapper; +import com.sahyog.app.inbound.user.mapper.UserMapper; +import com.sahyog.app.inbound.user.model.Response; +import com.sahyog.app.inbound.user.model.Transporter; +import com.sahyog.app.inbound.user.model.User; +import com.sahyog.app.inbound.user.model.UserType; +import com.sahyog.app.inbound.user.repository.TransporterRepository; +import com.sahyog.app.inbound.user.repository.UserRepository; +import com.sahyog.app.inbound.user.repository.UserTypeRepository; +import com.sahyog.app.inbound.user.service.TransporterService; +import com.sahyog.app.inbound.user.service.UserService; +import com.sahyog.app.inbound.user.utils.TransporterProcessingHelper; + +import jakarta.transaction.Transactional; +import jakarta.validation.ConstraintViolationException; + +@Service +public class TransporterServiceImpl implements TransporterService { + + private static final Logger log = LoggerFactory.getLogger(TransporterServiceImpl.class); + + @Autowired + private TransporterRepository transporterRepository; + + @Autowired + private UserService userService; + + @Autowired + private UserRepository userRepository; + + @Autowired + private UserTypeRepository userTypeRepository; + + @Autowired + private TransporterMapper transporterMapper; + + @Autowired + private UserMapper userMapper; + + @Autowired + JdbcTemplate temp; + + @Transactional + @Override + public Response>> processTransporters(List transporterMasterDtos) { + log.info("Processing {} transporter records.", transporterMasterDtos.size()); + + User user = fetchUserByUserTypeName("INTGUSER"); + log.debug("Fetched user with userTypeName 'INTGUSER': {}", user); + + List> transporterDataList = new ArrayList<>(); + List createdTransporters = new ArrayList<>(); + List updatedTransporters = new ArrayList<>(); + List failedSuppliers = new ArrayList<>(); + + try { + // Handling creation of users first + Map supplierToUserIdMap = mapSupplierToUserIds( + transporterMasterDtos, + userService.createUsers( + transporterMasterDtos.stream() + .map(userMapper::toUserDTO) + .collect(Collectors.toList()) + ) + ); + log.debug("Mapped suppliers to user IDs: {}", supplierToUserIdMap); + + for (TransporterMasterDto dto : transporterMasterDtos) { + log.debug("Processing transporter: {}", dto); + processTransporter(dto, supplierToUserIdMap, user, createdTransporters, updatedTransporters, transporterDataList, failedSuppliers); + } + + log.info("Transporter processing completed successfully."); + return TransporterProcessingHelper.buildResponse(createdTransporters, updatedTransporters, failedSuppliers, transporterDataList); + + } catch (ConstraintViolationException e) { + log.error("Validation error occurred during processing transporter records.", e); + return Response.>>error(400, "Validation error: " + e.getMessage()); + } catch (TransporterValidationException e) { + log.error("Validation error occurred for supplier code: {}", e.getSupplierCode(), e); + return Response.>>error(400, e.getErrorMessage()); + } catch (Exception e) { + log.error("Error processing transporter records.", e); + return Response.>>error(500, "Error processing transporter records."); + } + } + + private void processTransporter( + TransporterMasterDto dto, + Map supplierToUserIdMap, + User user, + List createdTransporters, + List updatedTransporters, + List> transporterDataList, + List failedSuppliers + ) { + try { + int userId = supplierToUserIdMap.get(dto.getSupplierCode()); + Optional existingTransporter = transporterRepository.findBySupplierCode(dto.getSupplierCode()); + + if (existingTransporter.isPresent()) { + log.debug("Transporter with supplier code {} exists. Updating...", dto.getSupplierCode()); + updateExistingTransporter(dto, user, userId); + updatedTransporters.add(dto.getSupplierCode()); + TransporterProcessingHelper.addTransporterData(transporterDataList, "Updated", existingTransporter.get()); + } else { + log.debug("Transporter with supplier code {} does not exist. Creating new transporter...", dto.getSupplierCode()); + Transporter transporter = transporterMapper.toEntity(dto, user); + transporter.setUserId(userId); + transporter = transporterRepository.save(transporter); + createdTransporters.add(dto.getSupplierCode()); + TransporterProcessingHelper.addTransporterData(transporterDataList, "Created", transporter); + } + } catch (ConstraintViolationException e) { + TransporterProcessingHelper.handleValidationException(dto, e); + } catch (Exception e) { + log.error("Failed to process supplier code: {}", dto.getSupplierCode(), e); + failedSuppliers.add(dto.getSupplierCode()); + } + } + + private User fetchUserByUserTypeName(String usertypeName) { + log.debug("Fetching user by usertype_name: {}", usertypeName); + + UserType userType = userTypeRepository.findByUsertypeName(usertypeName); + if (userType == null) { + log.error("UserType '{}' not found.", usertypeName); + throw new IllegalStateException("UserType '" + usertypeName + "' not found."); + } + + User user = userRepository.findByUserTypeId(userType.getUserTypeId()); + if (user == null) { + log.error("No user found for userTypeId: {}", userType.getUserTypeId()); + throw new IllegalStateException("No user found for userTypeId: " + userType.getUserTypeId()); + } + + log.debug("Found user: {}", user); + return user; + } + + private Map mapSupplierToUserIds(List dtos, Response>> userIdsResponse) { + log.debug("Mapping suppliers to user IDs..."); + + Map supplierToUserIdMap = new HashMap<>(); + List> userIds = userIdsResponse.getData(); + + if (userIds == null || userIds.size() != dtos.size()) { + log.error("Mismatch between DTOs and user IDs or invalid data in the response."); + throw new IllegalArgumentException("Mismatch between DTOs and user IDs or invalid data in the response."); + } + + for (int i = 0; i < dtos.size(); i++) { + String supplierCode = dtos.get(i).getSupplierCode(); + Integer userId = (Integer) userIds.get(i).get("userId"); + supplierToUserIdMap.put(supplierCode, userId); + } + + log.debug("Mapped supplier codes to user IDs: {}", supplierToUserIdMap); + return supplierToUserIdMap; + } + + private void updateExistingTransporter(TransporterMasterDto dto, User user, int userId) { + log.debug("Updating transporter for supplier code: {}", dto.getSupplierCode()); + TransporterUpdateDTO updateDTO = transporterMapper.toUpdateDTO(dto, user); + updateDTO.setUserId(userId); + boolean updated = updateTransporters(List.of(updateDTO)); + if (!updated) { + log.error("Failed to update transporter with supplier code: {}", dto.getSupplierCode()); + throw new TransporterProcessingException("Failed to update transporter with supplier code: " + dto.getSupplierCode()); + } + } + + @Transactional + @Override + public boolean updateTransporters(List transporterUpdateDTOList) { + log.debug("Updating transporters..."); + + boolean allUpdatesSuccessful = true; + + for (TransporterUpdateDTO dto : transporterUpdateDTOList) { + Optional existingTransporterOpt = transporterRepository.findBySupplierCode(dto.getSupplierCode()); + + if (existingTransporterOpt.isPresent()) { + log.debug("Transporter with supplier code {} found. Applying update...", dto.getSupplierCode()); + Transporter transporter = existingTransporterOpt.get(); + transporterMapper.updateEntityFromDTO(transporter, dto); + transporterRepository.save(transporter); + } else { + log.warn("Transporter with supplier code {} not found. Skipping update.", dto.getSupplierCode()); + allUpdatesSuccessful = false; + } + } + + log.debug("Transporter updates completed."); + return allUpdatesSuccessful; + } + + @Override + public Page getTransportersWithFilters(String supplierCode, String transporterName, + String supplierAccountGroup, String state, String bpGrouping, Pageable pageable) { + + log.debug("Fetching transporters with filters: supplierCode={}, transporterName={}, supplierAccountGroup={}, state={}, bpGrouping={}", + supplierCode, transporterName, supplierAccountGroup, state, bpGrouping); + + Specification specification = Specification.where(null); + + if (supplierCode != null && !supplierCode.trim().isEmpty()) { + specification = specification.and(TransporterFilters.filterBySupplierCode(supplierCode)); + } + if (transporterName != null && !transporterName.trim().isEmpty()) { + specification = specification.and(TransporterFilters.filterByTransporterName(transporterName)); + } + if (supplierAccountGroup != null && !supplierAccountGroup.trim().isEmpty()) { + specification = specification.and(TransporterFilters.filterBySupplierAccountGroup(supplierAccountGroup)); + } + if (state != null && !state.trim().isEmpty()) { + specification = specification.and(TransporterFilters.filterByState(state)); + } + if (bpGrouping != null && !bpGrouping.trim().isEmpty()) { + specification = specification.and(TransporterFilters.filterByBpGrouping(bpGrouping)); + } + + Page transportersPage = transporterRepository.findAll(specification, pageable); + return transportersPage.map(transporterMapper::toResponse); + } + + + @Override + public Page> getTransporterDetails(Map req, Pageable pageable) { + StringBuffer transporterQuery = new StringBuffer( + "SELECT `supplier_code`, `transporter_name`, `supplier_account_group`, `state`, `bp_grouping`, " + + "`legal_entity`, `permanent_account_number`, `street`, `house_number`, `district`, `different_city`, " + + "`postal_code`, `city`, `country`, `state`, `mobile_number`, `email_id`, `gstn`, `tax_regime`, " + + "`short_code`, `status`, `tax_code_desc`, `tax_rate` " + + "FROM `transportermaster` WHERE 1=1 "); + StringBuffer transporterCountQuery = new StringBuffer("SELECT COUNT(*) FROM `transportermaster` WHERE 1=1 "); + + try { + // Add filters dynamically + if (req.containsKey("supplierCode") && req.get("supplierCode") != null && !req.get("supplierCode").toString().isEmpty()) { + log.debug("Adding filter for supplierCode: {}", req.get("supplierCode")); + transporterQuery.append(" AND `supplier_code`='").append(req.get("supplierCode").toString()).append("'"); + transporterCountQuery.append(" AND `supplier_code`='").append(req.get("supplierCode").toString()).append("'"); + } + if (req.containsKey("supplierName") && req.get("supplierName") != null && !req.get("supplierName").toString().isEmpty()) { + log.debug("Adding filter for supplierName: {}", req.get("supplierName")); + transporterQuery.append(" AND `transporter_name`='").append(req.get("supplierName").toString()).append("'"); + transporterCountQuery.append(" AND `transporter_name`='").append(req.get("supplierName").toString()).append("'"); + } + if (req.containsKey("suplierAccountGroup") && req.get("suplierAccountGroup") != null && !req.get("suplierAccountGroup").toString().isEmpty()) { + log.debug("Adding filter for suplierAccountGroup: {}", req.get("suplierAccountGroup")); + transporterQuery.append(" AND `supplier_account_group`='").append(req.get("suplierAccountGroup").toString()).append("'"); + transporterCountQuery.append(" AND `supplier_account_group`='").append(req.get("suplierAccountGroup").toString()).append("'"); + } + if (req.containsKey("state") && req.get("state") != null && !req.get("state").toString().isEmpty()) { + log.debug("Adding filter for state: {}", req.get("state")); + transporterQuery.append(" AND `state`='").append(req.get("state").toString()).append("'"); + transporterCountQuery.append(" AND `state`='").append(req.get("state").toString()).append("'"); + } + if (req.containsKey("bpGroup") && req.get("bpGroup") != null && !req.get("bpGroup").toString().isEmpty()) { + log.debug("Adding filter for bpGroup: {}", req.get("bpGroup")); + transporterQuery.append(" AND `bp_grouping`='").append(req.get("bpGroup").toString()).append("'"); + transporterCountQuery.append(" AND `bp_grouping`='").append(req.get("bpGroup").toString()).append("'"); + } + + // Log the final query before execution + log.debug("Executing query: {}", transporterQuery.toString()); + log.debug("Executing count query: {}", transporterCountQuery.toString()); + + // Add pagination and sorting + transporterQuery.append(" ORDER BY ").append(pageable.getSort().toString().replace(":", " ")).append(" LIMIT ") + .append(pageable.getPageSize()).append(" OFFSET ").append(pageable.getOffset()); + + // Execute the queries + List> result = temp.queryForList(transporterQuery.toString()); + Long totalCount = temp.queryForObject(transporterCountQuery.toString(), Long.class); + + // Log the result count + log.debug("Fetched {} results from the database.", result.size()); + log.debug("Total count: {}", totalCount); + + // Return the paginated result + return new PageImpl<>(result, pageable, totalCount); + + } catch (Exception e) { + log.error("Error while fetching transporter details: {}", e.getMessage(), e); + return Page.empty(); + } + } + + + @Override + public Map getDropDownValues() { + Map response = new HashMap<>(); + try { + // Fetch distinct dropdown values + List supplierCodes = temp.queryForList("SELECT DISTINCT `supplier_code` FROM `transportermaster`", String.class); + List supplierNames = temp.queryForList("SELECT DISTINCT `transporter_name` FROM `transportermaster`", String.class); + List suplierAccountGroup = temp.queryForList("SELECT DISTINCT `supplier_account_group` FROM `transportermaster`", String.class); + List state = temp.queryForList("SELECT DISTINCT `state` FROM `transportermaster`", String.class); + List bpGroup = temp.queryForList("SELECT DISTINCT `bp_grouping` FROM `transportermaster`", String.class); + List status = temp.queryForList("SELECT DISTINCT `status` FROM `transportermaster`", String.class); + + // Map values to keys + response.put("supplierCodes", supplierCodes); + response.put("supplierNames", supplierNames); + response.put("suplierAccountGroup", suplierAccountGroup); + response.put("state", state); + response.put("bpGroup", bpGroup); + response.put("status", status); + + + + } catch (Exception e) { + log.error("Error while fetching dropdown values: {}", e.getMessage()); + response.put("error", "Failed to fetch dropdown values"); + } + + return response; + } + + + +} diff --git a/src/main/java/com/sahyog/app/inbound/user/serviceImpl/UserPlantServiceImpl.java b/src/main/java/com/sahyog/app/inbound/user/serviceImpl/UserPlantServiceImpl.java new file mode 100644 index 0000000..3e242ac --- /dev/null +++ b/src/main/java/com/sahyog/app/inbound/user/serviceImpl/UserPlantServiceImpl.java @@ -0,0 +1,163 @@ +package com.sahyog.app.inbound.user.serviceImpl; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Optional; +import java.util.stream.Collectors; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.jdbc.core.JdbcTemplate; +import org.springframework.stereotype.Service; + +import com.sahyog.app.inbound.user.dto.PlantMasterDTO; +import com.sahyog.app.inbound.user.dto.RoleDTO; +import com.sahyog.app.inbound.user.enums.Status; +import com.sahyog.app.inbound.user.model.PlantMaster; +import com.sahyog.app.inbound.user.model.Role; +import com.sahyog.app.inbound.user.model.User; +import com.sahyog.app.inbound.user.model.UserPlant; +import com.sahyog.app.inbound.user.repository.PlantRepository; +import com.sahyog.app.inbound.user.repository.UserPlantRepository; +import com.sahyog.app.inbound.user.repository.UserRepository; +import com.sahyog.app.inbound.user.service.UserPlantService; + +import jakarta.transaction.Transactional; +@Service +public class UserPlantServiceImpl implements UserPlantService{ + + + private static final Logger log = LoggerFactory.getLogger(UserPlantServiceImpl.class); + + @Autowired + private UserRepository userRepository; + + @Autowired + private PlantRepository plantRepository; + + @Autowired + private UserPlantRepository userPlantRepository; + + @Autowired + JdbcTemplate temp; + + @Override + public List getAllPlantsWithAssignmentInfo(String email, String employeeTransCode) { + // Fetch user based on email and employeeTransCode + Optional userOpt = userRepository.findByEmailAndEmployeeTransCode(email, employeeTransCode); + + if (!userOpt.isPresent()) { + log.debug("User not found for email: {} and employeeTransCode: {}", email, employeeTransCode); + return Collections.emptyList(); + } + + User user = userOpt.get(); + int userId = user.getUserId(); + + // Fetch all plants + List allPlants = plantRepository.findAll(); + + // Fetch assigned plant IDs for the user and ensure it's non-null + List assignedPlantIds = userPlantRepository.findPlantIdsByUserId(userId); + final List finalAssignedPlantIds = (assignedPlantIds != null) ? assignedPlantIds : Collections.emptyList(); + + // Map plants to PlantMasterDTO with assigned status + return allPlants.stream() + .map(plant -> new PlantMasterDTO( + plant.getPlantId(), + plant.getPlantCode(), + plant.getPlantDesc(), + plant.getPlantPan(), + plant.getPlantGst(), + plant.getPlantGstRate(), + plant.getAddedChannel(), + plant.getStatus(), + plant.getCreatedBy(), + plant.getLastUpdatedBy(), + finalAssignedPlantIds.contains(plant.getPlantId()) // Check assignment + )) + .collect(Collectors.toList()); + } + + + @Override + @Transactional + public boolean assignSelectedPlantsToUser(String email, String employeeTransCode, List selectedPlantIds, int createdBy, int lastUpdatedBy) { + // Fetch user based on email and employeeTransCode + Optional userOpt = userRepository.findByEmailAndEmployeeTransCode(email, employeeTransCode); + + if (!userOpt.isPresent()) { + log.debug("User not found for email: {} and employeeTransCode: {}", email, employeeTransCode); + return false; // Return false if user is not found + } + + User user = userOpt.get(); + int userId = user.getUserId(); + + // Fetch assigned plant IDs for the user + List assignedPlantIds = userPlantRepository.findPlantIdsByUserId(userId); + + // Handle null case for assigned plants (in case no plants are assigned yet) + List currentAssignedPlantIds = (assignedPlantIds != null) ? assignedPlantIds : new ArrayList<>(); + if (assignedPlantIds == null) { + log.debug("No plants assigned to user with userId: {}", userId); + } + + // Identify plants to delete (unchecked plants) + List plantsToDelete = currentAssignedPlantIds.stream() + .filter(plantId -> !selectedPlantIds.contains(plantId)) + .collect(Collectors.toList()); + + // Identify plants to assign (newly checked plants) + List plantsToAssign = selectedPlantIds.stream() + .filter(plantId -> !currentAssignedPlantIds.contains(plantId)) + .collect(Collectors.toList()); + + // Delete unchecked plants from the userplant table + if (!plantsToDelete.isEmpty()) { + userPlantRepository.deleteByUserIdAndPlantIds(userId, plantsToDelete); + log.debug("Deleted plants {} for user {}", plantsToDelete, userId); + } + + // Assign newly selected plants + for (Integer plantId : plantsToAssign) { + UserPlant newUserPlant = new UserPlant(); + newUserPlant.setUserId(userId); + newUserPlant.setPlantId(plantId); + newUserPlant.setStatus(Status.A); // Set status as active + newUserPlant.setCreatedBy(createdBy); + newUserPlant.setLastUpdatedBy(lastUpdatedBy); + + // Save the new UserPlant entity + userPlantRepository.save(newUserPlant); + log.debug("Assigned plant {} to user {}", plantId, userId); + } + + return true; + } + + + @Override + public Map getDropDownValues() { + Map response = new HashMap<>(); + try { + // Fetch distinct dropdown values + List employeeCodes = temp.queryForList("SELECT DISTINCT `user_emp_trans_code` FROM `usermaster`", String.class); + List userEmails = temp.queryForList("SELECT DISTINCT `user_email` FROM `usermaster`", String.class); + + // Map values to keys + response.put("employeeCodes", employeeCodes); + response.put("userEmails", userEmails); + + } catch (Exception e) { + log.error("Error while fetching dropdown values: {}", e.getMessage()); + response.put("error", "Failed to fetch dropdown values"); + } + + return response; + } +} diff --git a/src/main/java/com/sahyog/app/inbound/user/serviceImpl/UserRoleServiceImpl.java b/src/main/java/com/sahyog/app/inbound/user/serviceImpl/UserRoleServiceImpl.java new file mode 100644 index 0000000..b7669bc --- /dev/null +++ b/src/main/java/com/sahyog/app/inbound/user/serviceImpl/UserRoleServiceImpl.java @@ -0,0 +1,215 @@ +package com.sahyog.app.inbound.user.serviceImpl; + +import java.util.Collections; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Optional; +import java.util.stream.Collectors; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.jdbc.core.JdbcTemplate; +import org.springframework.stereotype.Service; + +import com.sahyog.app.inbound.user.dto.RoleDTO; +import com.sahyog.app.inbound.user.enums.Status; +import com.sahyog.app.inbound.user.model.Role; +import com.sahyog.app.inbound.user.model.User; +import com.sahyog.app.inbound.user.model.UserRole; +import com.sahyog.app.inbound.user.repository.RoleRepository; +import com.sahyog.app.inbound.user.repository.UserRepository; +import com.sahyog.app.inbound.user.repository.UserRoleRepository; +import com.sahyog.app.inbound.user.service.UserRoleService; + +import jakarta.transaction.Transactional; + +@Service +public class UserRoleServiceImpl implements UserRoleService { + + private static final Logger log = LoggerFactory.getLogger(UserRoleServiceImpl.class); + + @Autowired + private UserRoleRepository userRoleRepository; + + @Autowired + private UserRepository userRepository; + + @Autowired + private RoleRepository roleRepository; + + @Autowired + JdbcTemplate temp; + + private int loggedInUserId = 1; // Static logged-in user ID for demonstration (should be dynamic in production) + @Override + @Transactional + public void assignRolesToUser(int userId, short userTypeId) { + // Fetch the roles associated with the given userTypeId + List roles = roleRepository.findByUserTypeId(userTypeId); + + // Check if roles are found for the given userTypeId + if (roles.isEmpty()) { + log.debug("No roles found for userTypeId: {}", userTypeId); + return; // Exit if no roles are found + } + + // Pass the roles directly to the createUserRole method + createUserRole(userId, roles); + } + + @Transactional + public void createUserRole(int userId, List roles) { + // User ID of the logged-in user (this would be fetched dynamically in a real-world scenario) + + // Loop over the roles and assign them to the user + for (Role role : roles) { + // Check if the user already has this role assigned + Optional existingUserRole = userRoleRepository.findByUserIdAndRoleId(userId, role.getRoleId()); + + + if (existingUserRole.isPresent()) { + log.debug("User {} already has role {} assigned.", userId, role.getRoleId()); + continue; // Skip assigning this role if it's already assigned + } + + // Create a new UserRole entity + UserRole newUserRole = new UserRole(); + newUserRole.setUserId(userId); + newUserRole.setRoleId(role.getRoleId()); + newUserRole.setStatus(Status.A); // Set status as active + newUserRole.setCreatedBy(loggedInUserId); + newUserRole.setLastUpdatedBy(loggedInUserId); // Set the logged-in user as the updater + + // Save the new UserRole entity to the repository (database) + userRoleRepository.save(newUserRole); + log.debug("Assigned role {} to user {}", role.getRoleId(), userId); + } + } + @Override + public List getAllRolesWithAssignmentInfo(String email, String employeeTransCode) { + Optional userOpt = userRepository.findByEmailAndEmployeeTransCode(email, employeeTransCode); + + if (!userOpt.isPresent()) { + log.debug("User not found for email: {} and employeeTransCode: {}", email, employeeTransCode); + return Collections.emptyList(); + } + + User user = userOpt.get(); + int userId = user.getUserId(); + + List allRoles = roleRepository.findAll(); + List assignedRoleIds = userRoleRepository.findRoleIdsByUserId(userId); + + return allRoles.stream() + .map(role -> new RoleDTO( + role.getRoleId(), + role.getRoleName(), + role.getRoleDescription(), + role.getUserTypeId(), + role.getStatus().toString(), + role.getCreatedBy(), + role.getLastUpdatedBy(), + assignedRoleIds.contains(role.getRoleId()) + )) + .collect(Collectors.toList()); + } + + @Override + @Transactional + public boolean assignSelectedRolesToUser(String email, String employeeTransCode, List selectedRoleIds, int createdBy, int lastUpdatedBy) { + + // Fetch user based on email and employeeTransCode + Optional userOpt = userRepository.findByEmailAndEmployeeTransCode(email, employeeTransCode); + + if (!userOpt.isPresent()) { + log.debug("User not found for email: {} and employeeTransCode: {}", email, employeeTransCode); + return false; // Return false if user is not found + } + + User user = userOpt.get(); + // Fetch assigned role IDs for the user + List existingRoleIds = getExistingRoleIds(user.getUserId()); + + // Identify roles to delete (unchecked roles) + List rolesToDelete = getRolesToDelete(existingRoleIds, selectedRoleIds); + + // Identify roles to assign (newly checked roles) + List rolesToAssign = getRolesToAssign(existingRoleIds, selectedRoleIds); + + // Delete unchecked roles from the userrole table + if (!rolesToDelete.isEmpty()) { + deleteRolesForUser(user.getUserId(), rolesToDelete); + } + + if (!rolesToAssign.isEmpty()) { + assignRolesToUser(user, rolesToAssign, createdBy, lastUpdatedBy); + } + + if (rolesToAssign.isEmpty() && rolesToDelete.isEmpty()) { + log.debug("No changes made to roles for user {}", user.getUserId()); + return false; + } + + return true; + } + + private List getExistingRoleIds(int userId) { + return userRoleRepository.findByUserId(userId).stream() + .map(UserRole::getRoleId) + .collect(Collectors.toList()); + } + + private List getRolesToDelete(List existingRoleIds, List selectedRoleIds) { + return existingRoleIds.stream() + .filter(roleId -> !selectedRoleIds.contains(roleId)) + .collect(Collectors.toList()); + } + + private List getRolesToAssign(List existingRoleIds, List selectedRoleIds) { + return selectedRoleIds.stream() + .filter(roleId -> !existingRoleIds.contains(roleId)) + .collect(Collectors.toList()); + } + + private void deleteRolesForUser(int userId, List rolesToDelete) { + userRoleRepository.deleteByUserIdAndRoleIds(userId, rolesToDelete); + log.debug("Deleted roles {} for user {}", rolesToDelete, userId); + } + + private void assignRolesToUser(User user, List rolesToAssign, int createdBy, int lastUpdatedBy) { + rolesToAssign.forEach(roleId -> { + UserRole newUserRole = new UserRole(); + newUserRole.setUserId(user.getUserId()); + newUserRole.setRoleId(roleId); + newUserRole.setStatus(Status.A); + newUserRole.setCreatedBy(createdBy); + newUserRole.setLastUpdatedBy(lastUpdatedBy); + + userRoleRepository.save(newUserRole); + log.debug("Assigned role {} to user {}", roleId, user.getUserId()); + }); + } + + + @Override + public Map getDropDownValues() { + Map response = new HashMap<>(); + try { + // Fetch distinct dropdown values + List employeeCodes = temp.queryForList("SELECT DISTINCT `user_emp_trans_code` FROM `usermaster`", String.class); + List userEmails = temp.queryForList("SELECT DISTINCT `user_email` FROM `usermaster`", String.class); + + // Map values to keys + response.put("employeeCodes", employeeCodes); + response.put("userEmails", userEmails); + + } catch (Exception e) { + log.error("Error while fetching dropdown values: {}", e.getMessage()); + response.put("error", "Failed to fetch dropdown values"); + } + + return response; + } +} diff --git a/src/main/java/com/sahyog/app/inbound/user/serviceImpl/UserServiceImpl.java b/src/main/java/com/sahyog/app/inbound/user/serviceImpl/UserServiceImpl.java new file mode 100644 index 0000000..8d2d5e1 --- /dev/null +++ b/src/main/java/com/sahyog/app/inbound/user/serviceImpl/UserServiceImpl.java @@ -0,0 +1,664 @@ +package com.sahyog.app.inbound.user.serviceImpl; + +import java.time.LocalDateTime; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.data.domain.Page; +import org.springframework.data.domain.PageImpl; +import org.springframework.data.domain.PageRequest; +import org.springframework.data.domain.Pageable; +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; +import org.springframework.jdbc.core.JdbcTemplate; +import org.springframework.stereotype.Service; + +import com.sahyog.app.inbound.user.dto.UserDTO; +import com.sahyog.app.inbound.user.dto.UserTypeDTO; +import com.sahyog.app.inbound.user.dto.UserUpdateDTO; +import com.sahyog.app.inbound.user.enums.Status; +import com.sahyog.app.inbound.user.exception.UserAlreadyExistsException; +import com.sahyog.app.inbound.user.exception.UserNotFoundException; +import com.sahyog.app.inbound.user.mapper.UserMapper; +import com.sahyog.app.inbound.user.model.Response; +import com.sahyog.app.inbound.user.model.User; +import com.sahyog.app.inbound.user.model.UserType; +import com.sahyog.app.inbound.user.repository.UserRepository; +import com.sahyog.app.inbound.user.repository.UserTypeRepository; +import com.sahyog.app.inbound.user.service.UserRoleService; +import com.sahyog.app.inbound.user.service.UserService; +import com.sahyog.app.inbound.user.utils.UserProcessingHelper; + +import jakarta.persistence.EntityNotFoundException; +import jakarta.transaction.Transactional; + +@Service +@Transactional +public class UserServiceImpl implements UserService { + + private static final Logger log = LoggerFactory.getLogger(UserServiceImpl.class); + + @Autowired + private UserRepository userRepository; + + @Autowired + private UserRoleService userRoleService; + + @Autowired + private UserTypeRepository userTypeRepository; + + @Autowired + private UserMapper userMapper; + + @Autowired + JdbcTemplate temp; + + @Override + public Response>> createUsers(List userDTOs) { + log.info("Creating or updating users: {}", userDTOs); + + List> userResponseData = new ArrayList<>(); + List failedEmployeeTransCodes = new ArrayList<>(); + int loggedInUserId = getLoggedInUserId(); + + for (UserDTO userDTO : userDTOs) { + log.debug("Processing user DTO: {}", userDTO); + + try { + User existingUser = userRepository.findByEmployeeTransCodeOrEmail( + userDTO.getEmployeeTransCode(), + userDTO.getEmail() + ); + if (existingUser != null) { + log.info("User already exists with EmpTransCode: {} and Email: {}. Updating user.", userDTO.getEmployeeTransCode(), userDTO.getEmail()); + + // Update existing user using UserMapper + userMapper.updateUserFromDTO(existingUser, userDTO); + existingUser.setLastUpdatedBy(loggedInUserId); // Set logged-in user as last updater + User updatedUser = userRepository.save(existingUser); + + log.info("User updated successfully with ID: {}", updatedUser.getUserId()); + userResponseData.add(Map.of( + "employeeTransCode", userDTO.getEmployeeTransCode(), + "userId", updatedUser.getUserId(), + "action", "Updated" + )); + } else { + log.info("Creating new user for EmpTransCode: {}", userDTO.getEmployeeTransCode()); + User newUser = createUser(userDTO, loggedInUserId); + User savedUser = userRepository.save(newUser); + + // Assign roles to the newly created user + userRoleService.assignRolesToUser(savedUser.getUserId(), savedUser.getUserTypeId()); + + log.info("User created successfully with ID: {}", savedUser.getUserId()); + userResponseData.add(Map.of( + "employeeTransCode", userDTO.getEmployeeTransCode(), + "userId", savedUser.getUserId(), + "action", "Created" + )); + } + } catch (Exception e) { + log.error("Error processing user with EmpTransCode: {}", userDTO.getEmployeeTransCode(), e); + failedEmployeeTransCodes.add(userDTO.getEmployeeTransCode()); + } + } + + // Constructing the response message + String message = "User creation/update process completed. "; + long createdCount = userResponseData.stream().filter(data -> "Created".equals(data.get("action"))).count(); + long updatedCount = userResponseData.stream().filter(data -> "Updated".equals(data.get("action"))).count(); + long skippedCount = userResponseData.stream().filter(data -> "Skipped".equals(data.get("action"))).count(); + + if (createdCount > 0) { + message += createdCount + " user(s) created. "; + } + if (updatedCount > 0) { + message += updatedCount + " user(s) updated. "; + } + if (skippedCount > 0) { + message += skippedCount + " user(s) skipped. "; + } + if (!failedEmployeeTransCodes.isEmpty()) { + message += "Failed to process users with EmpTransCodes: " + String.join(", ", failedEmployeeTransCodes); + } + + // Returning the response + return Response.success(userResponseData).withMessage(message); + } + + + @Transactional + @Override + public Response>> createInternalUsers(List userDTOs) { + log.info("Starting creation of internal users. Total users to process: {}", userDTOs.size()); + + // Lists to hold the details of processed users + List> userDataList = new ArrayList<>(); + List createdUsers = new ArrayList<>(); + List updatedUsers = new ArrayList<>(); + List failedUsers = new ArrayList<>(); + int loggedInUserId = getLoggedInUserId(); + + for (UserDTO userDTO : userDTOs) { + log.debug("Processing UserDTO: {}", userDTO); + + try { + // Check if the userTypeId is 1 or 2 + if (userDTO.getUserTypeId() == 1 || userDTO.getUserTypeId() == 2) { + // If userTypeId is 1 or 2, do not create or update the user + log.info("User with userTypeId {} is of type Admin or INTGUSER. Skipping user creation or update.", + userDTO.getUserTypeId()); + failedUsers.add(userDTO.getEmployeeTransCode() != null ? userDTO.getEmployeeTransCode() : userDTO.getEmail()); + addUserData(userDataList, "skip", null); + continue; // Skip the rest of the logic for this user + } + + // For userTypeId other than 1 or 2, check if user already exists by employeeTransCode or email + User existingUser = userRepository.findByEmployeeTransCode(userDTO.getEmployeeTransCode()); + if (existingUser == null) { + existingUser = userRepository.findByEmail(userDTO.getEmail()); + } + + if (existingUser != null) { + // If user exists, update user details + log.info("User with EmpTransCode {} or Email {} already exists. Updating details.", + userDTO.getEmployeeTransCode(), userDTO.getEmail()); + updateExistingUser(existingUser, userDTO, loggedInUserId); + updatedUsers.add(existingUser.getEmployeeTransCode()); + addUserData(userDataList, "update", existingUser); + log.info("User updated successfully with ID: {}", existingUser.getUserId()); + } else { + // Create a new user + User newUser = createUser(userDTO, loggedInUserId); + User savedUser = userRepository.save(newUser); + createdUsers.add(savedUser.getEmployeeTransCode()); + addUserData(userDataList, "create", savedUser); + log.info("User created successfully with ID: {} and EmpTransCode: {}", + savedUser.getUserId(), userDTO.getEmployeeTransCode()); + } + } catch (Exception e) { + // Handle any errors during processing + log.error("Error occurred while processing user with EmpTransCode: {} or Email: {}", + userDTO.getEmployeeTransCode(), userDTO.getEmail(), e); + failedUsers.add(userDTO.getEmployeeTransCode() != null ? userDTO.getEmployeeTransCode() : userDTO.getEmail()); + addUserData(userDataList, "error", null); + } + } + + // Build and return the final response + return UserProcessingHelper.buildResponse(createdUsers, updatedUsers, failedUsers, userDataList); + } + + + private void addUserData(List> userDataList, String action, User user) { + Map userData = new HashMap<>(); + userData.put("action", action); + if (user != null) { + userData.put("userId", user.getUserId()); + userData.put("employeeTransCode", user.getEmployeeTransCode()); + userData.put("email", user.getEmail()); + } else { + userData.put("userId", "N/A"); + userData.put("employeeTransCode", "N/A"); + userData.put("email", "N/A"); + } + userDataList.add(userData); + } + + +// @Override +// public ResponseEntity updateUser(String employeeTransCode, UserUpdateDTO userUpdateDTO) { +// log.info("Updating user with EmpTransCode: {}", employeeTransCode); +// +// User existingUser = userRepository.findByEmployeeTransCode(employeeTransCode); +// if (existingUser == null) { +// log.warn("No user found with EmpTransCode: {}", employeeTransCode); +// return ResponseEntity.status(HttpStatus.NOT_FOUND) +// .body("User not found with userEmpTransCode: " + employeeTransCode); +// } +// +// try { +// // Reuse common update logic +// updateExistingUser(existingUser, userUpdateDTO, getLoggedInUserId()); +// log.info("User updated successfully: {}", existingUser); +// return ResponseEntity.status(HttpStatus.OK).body("User updated successfully."); +// } catch (Exception e) { +// log.error("Error updating user with EmpTransCode: {}", employeeTransCode, e); +// return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).body("Error updating user."); +// } +// } + @Transactional + @Override + public Response> updateUser(String employeeTransCode, UserUpdateDTO userUpdateDTO) { + log.info("Updating user with employeeTransCode: {} or email: {}", employeeTransCode, userUpdateDTO.getEmailId()); + + try { + // Validate input + if (userUpdateDTO == null) { + throw new IllegalArgumentException("UserUpdateDTO cannot be null."); + } + + if ((employeeTransCode == null || employeeTransCode.isEmpty()) && + (userUpdateDTO.getEmailId() == null || userUpdateDTO.getEmailId().isEmpty())) { + throw new IllegalArgumentException("Either employeeTransCode or email must be provided."); + } + + // Fetch user by employeeTransCode or email + User existingUser = userRepository.findByEmployeeTransCodeOrEmail(employeeTransCode, userUpdateDTO.getEmailId()); + + if (existingUser == null) { + throw new UserNotFoundException("User not found with provided employeeTransCode or email."); + } + + // Skip update for userTypeId 1 (Admin) or 2 (INTGUSER) + if (existingUser.getUserTypeId() == 1 || existingUser.getUserTypeId() == 2) { + log.info("Skipping update for user with userTypeId 1 (Admin) or 2 (INTGUSER): {}", existingUser); + + Map responseData = Map.of( + "action", "skip", + "userId", existingUser.getUserId(), + "employeeTransCode", existingUser.getEmployeeTransCode(), + "email", existingUser.getEmail() + ); + + return Response.success(responseData) + .withMessage("Updates for users with userTypeId 1 (Admin) or 2 (INTGUSER) are not allowed."); + } + + // Update user details + updateExistingUser(existingUser, userUpdateDTO, getLoggedInUserId()); + + Map responseData = Map.of( + "action", "update", + "userId", existingUser.getUserId(), + "employeeTransCode", existingUser.getEmployeeTransCode(), + "email", existingUser.getEmail() + ); + + log.info("User updated successfully: {}", existingUser); + return Response.success(responseData) + .withMessage("User updated successfully."); + + } catch (IllegalArgumentException e) { + log.error("Validation error: {}", e.getMessage()); + throw e; + + } catch (Exception e) { + log.error("Unexpected error occurred: {}", e.getMessage(), e); + throw new RuntimeException("Failed to update user: " + e.getMessage()); + } + } + + + + + private void updateExistingUser(User existingUser, Object userDTO, int loggedInUserId) { + if (userDTO instanceof UserDTO) { + userMapper.updateUserFromDTO(existingUser, (UserDTO) userDTO); + } else if (userDTO instanceof UserUpdateDTO) { + userMapper.updateUserFromUpdateDTO(existingUser, (UserUpdateDTO) userDTO); + } else { + throw new IllegalArgumentException("Invalid DTO type provided for update"); + } + + existingUser.setLastUpdatedBy(loggedInUserId); + existingUser.setLastUpdatedOn(LocalDateTime.now()); + userRepository.save(existingUser); + } + + + + private User fetchUserByUserTypeName(String usertypeName) { + log.debug("Fetching user by UserTypeName: {}", usertypeName); + + UserType userType = userTypeRepository.findByUsertypeName(usertypeName); + if (userType == null) { + log.error("UserType not found: {}", usertypeName); + throw new IllegalStateException("UserType '" + usertypeName + "' not found"); + } + + short userTypeId = userType.getUserTypeId(); + User user = userRepository.findByUserTypeId(userTypeId); + if (user == null) { + log.error("No user found for UserTypeId: {}", userTypeId); + throw new IllegalStateException("No user found for userTypeId: " + userTypeId); + } + + log.debug("User fetched: {}", user); + return user; + } + + private User createUser(UserDTO userDTO, int loggedInUserId) { + User newUser = new User(); + newUser.setUserName(userDTO.getUserName()); + newUser.setFirstName(userDTO.getFirstName()); + newUser.setLastName(userDTO.getLastName()); + newUser.setUserTypeId(userDTO.getUserTypeId()); + newUser.setMobile(userDTO.getMobile()); + newUser.setEmployeeTransCode(userDTO.getEmployeeTransCode()); + newUser.setEmail(userDTO.getEmail()); + newUser.setStatus(Status.A); // Active status + newUser.setAddedChannel(userDTO.getAddedChannel()); +// newUser.setCreatedDate(LocalDateTime.now()); +// newUser.setUpdationDate(LocalDateTime.now()); + + if ("F".equalsIgnoreCase(userDTO.getAddedChannel())) { + newUser.setCreatedBy(loggedInUserId); + newUser.setLastUpdatedBy(loggedInUserId); + } else { + User integrationUser = fetchUserByUserTypeName("INTGUSER"); + newUser.setCreatedBy(integrationUser.getUserId()); + newUser.setLastUpdatedBy(integrationUser.getUserId()); + } + return newUser; + } + + + @Override + public List getUsersByActive_Inactive(List statusFilters) { + log.info("Fetching users by status: {}", statusFilters); + + List statuses = statusFilters.stream() + .map(status -> Status.valueOf(status.toUpperCase())) + .collect(Collectors.toList()); + + List users = userRepository.findByStatusIn(statuses); + log.info("Found {} users for statuses: {}", users.size(), statuses); + return users; + } + + @Override + public Page getAllUsers(Pageable pageable) { + log.info("Fetching all users with pagination - Page: {}, Size: {}, Sort: {}", + pageable.getPageNumber(), pageable.getPageSize(), pageable.getSort()); + + Page users = userRepository.findAll(pageable); + + log.info("Fetched {} users on page {}", users.getTotalElements(), pageable.getPageNumber()); + return users; + } + + + + + private int getLoggedInUserId() { + // Replace with the actual logic to fetch the logged-in user's ID + int userId = 1; // Example fallback + log.debug("Logged-in user ID: {}", userId); + return userId; + } + + + // Non-paginated method to get all users + @Override + public List getAllUsers() { + log.info("Fetching all users from the repository"); + + List users = userRepository.findAll(); + log.info("Fetched {} users from the database", users.size()); + + return users.stream() + .map(userMapper::toDTO) + .collect(Collectors.toList()); + } + + // Non-paginated method to get users by status + @Override + public List getUsersByStatus(List statusFilters) { + log.info("Fetching users by status filters: {}", statusFilters); + + List statuses = statusFilters.stream() + .map(status -> Status.valueOf(status.toUpperCase())) + .collect(Collectors.toList()); + + List users = userRepository.findByStatusIn(statuses); + log.info("Fetched {} users from the database with statuses: {}", users.size(), statuses); + + return users.stream() + .map(userMapper::toDTO) + .collect(Collectors.toList()); + } + + // Paginated method to get all users + @Override + public Page getAllUsersWithPagination(Pageable pageable) { + log.info("Fetching paginated users with Pageable: {}", pageable); + + Page users = userRepository.findAll(pageable); + log.info("Fetched {} users with pagination from the database", users.getTotalElements()); + + return users.map(userMapper::toDTO); + } + + // Paginated method to get users by status + @Override + public Page getUsersByStatusWithPagination(String status, Pageable pageable) { + log.info("Fetching paginated users with status filter: {} and Pageable: {}", status, pageable); + + // Convert the status string to the Status enum + Status statusEnum = Status.valueOf(status.toUpperCase()); + + // Query users by the status enum value + Page users = userRepository.findByStatus(statusEnum, pageable); + log.info("Fetched {} users with status filter and pagination from the database", users.getTotalElements()); + + return users.map(userMapper::toDTO); + } + + + @Override + public Page> getUserDetails(Map req, Pageable pageable) { + StringBuffer userQuery = new StringBuffer( + "SELECT u.user_id, u.usertype_id, ut.usertype_name, u.user_name, u.user_fname, u.user_lname, " + + "u.user_email, u.user_mobile, u.user_emp_trans_code, u.user_added_channel, u.status, u.created_on, " + + "u.created_by, u.last_updated_on, u.last_updated_by " + + "FROM usermaster u " + + "JOIN usertypemaster ut ON u.usertype_id = ut.usertype_id " + + "WHERE 1=1 "); + + StringBuffer userCountQuery = new StringBuffer( + "SELECT COUNT(*) FROM usermaster u " + + "JOIN usertypemaster ut ON u.usertype_id = ut.usertype_id " + + "WHERE 1=1 "); + + try { + // Add filters dynamically + if (req.containsKey("userName") && req.get("userName") != null && !req.get("userName").toString().isEmpty()) { + userQuery.append(" AND u.user_name = '").append(req.get("userName").toString()).append("'"); + userCountQuery.append(" AND u.user_name = '").append(req.get("userName").toString()).append("'"); + } + if (req.containsKey("Email") && req.get("Email") != null && !req.get("Email").toString().isEmpty()) { + userQuery.append(" AND u.user_email = '").append(req.get("Email").toString()).append("'"); + userCountQuery.append(" AND u.user_email = '").append(req.get("Email").toString()).append("'"); + } + if (req.containsKey("userTypeName") && req.get("userTypeName") != null && !req.get("userTypeName").toString().isEmpty()) { + userQuery.append(" AND ut.usertype_name = '").append(req.get("userTypeName").toString()).append("'"); + userCountQuery.append(" AND ut.usertype_name = '").append(req.get("userTypeName").toString()).append("'"); + } + if (req.containsKey("status") && req.get("status") != null && !req.get("status").toString().isEmpty()) { + userQuery.append(" AND u.status = '").append(req.get("status").toString()).append("'"); + userCountQuery.append(" AND u.status = '").append(req.get("status").toString()).append("'"); + } + if (req.containsKey("EmployeeTransCode") && req.get("EmployeeTransCode") != null && !req.get("EmployeeTransCode").toString().isEmpty()) { + userQuery.append(" AND u.user_emp_trans_code = '").append(req.get("EmployeeTransCode").toString()).append("'"); + userCountQuery.append(" AND u.user_emp_trans_code = '").append(req.get("EmployeeTransCode").toString()).append("'"); + } + + // Add sorting and pagination to the data query + userQuery.append(" ORDER BY ").append(pageable.getSort().toString().replace(":", " ")); + userQuery.append(" LIMIT ").append(pageable.getPageSize()).append(" OFFSET ").append(pageable.getOffset()); + + // Execute queries + List> result = temp.queryForList(userQuery.toString()); + Long totalCount = temp.queryForObject(userCountQuery.toString(), Long.class); + + // Return the paginated result + return new PageImpl<>(result, pageable, totalCount); + + } catch (Exception e) { + log.error("Error while fetching user details: {}", e.getMessage()); + return Page.empty(); + } + } + + @Override + public Map getDropDownValues() { + Map response = new HashMap<>(); + try { + // Fetch distinct dropdown values + List userNames = temp.queryForList("SELECT DISTINCT `user_name` FROM `usermaster`", String.class); + List userEmails = temp.queryForList("SELECT DISTINCT `user_email` FROM `usermaster`", String.class); + List usertypeNames = temp.queryForList("SELECT DISTINCT `usertype_name` FROM `usertypemaster`", String.class); + List employeeTransCodes = temp.queryForList("SELECT DISTINCT `user_emp_trans_code` FROM `usermaster`", String.class); + List status = temp.queryForList("SELECT DISTINCT `status` FROM `usermaster`", String.class); + + // Map values to keys + response.put("userNames", userNames); + response.put("userEmails", userEmails); + response.put("usertypeNames", usertypeNames); + response.put("employeeTransCodes", employeeTransCodes); + response.put("status", status); + + } catch (Exception e) { + log.error("Error while fetching dropdown values: {}", e.getMessage()); + response.put("error", "Failed to fetch dropdown values"); + } + + return response; + } + + + + + + +// @Transactional +// @Override +// public Response>> createInternalUsers(List userDTOs) { +// log.info("Starting creation of internal users. Total users to process: {}", userDTOs.size()); +// +// // Lists to hold the details of processed users +// List> userDataList = new ArrayList<>(); +// List createdUsers = new ArrayList<>(); +// List updatedUsers = new ArrayList<>(); +// List failedUsers = new ArrayList<>(); +// int loggedInUserId = getLoggedInUserId(); +// +// for (UserDTO userDTO : userDTOs) { +// log.debug("Processing UserDTO: {}", userDTO); +// +// try { +// // Check if the user already exists by employeeTransCode or email +// User existingUser = userRepository.findByEmployeeTransCode(userDTO.getEmployeeTransCode()); +// if (existingUser == null) { +// existingUser = userRepository.findByEmail(userDTO.getEmail()); +// } +// +// if (existingUser != null) { +// // Update existing user +// log.info("User with EmpTransCode {} or Email {} already exists. Updating details.", +// userDTO.getEmployeeTransCode(), userDTO.getEmail()); +// updateExistingUser(existingUser, userDTO, loggedInUserId); +// updatedUsers.add(existingUser.getEmployeeTransCode()); +// addUserData(userDataList, "update", existingUser); +// log.info("User updated successfully with ID: {}", existingUser.getUserId()); +// } else { +// // Create a new user +// User newUser = createUser(userDTO, loggedInUserId); +// User savedUser = userRepository.save(newUser); +// createdUsers.add(savedUser.getEmployeeTransCode()); +// addUserData(userDataList, "create", savedUser); +// log.info("User created successfully with ID: {} and EmpTransCode: {}", +// savedUser.getUserId(), userDTO.getEmployeeTransCode()); +// } +// } catch (Exception e) { +// // Handle any errors during processing +// log.error("Error occurred while processing user with EmpTransCode: {} or Email: {}", +// userDTO.getEmployeeTransCode(), userDTO.getEmail(), e); +// failedUsers.add(userDTO.getEmployeeTransCode() != null ? userDTO.getEmployeeTransCode() : userDTO.getEmail()); +// addUserData(userDataList, "error", null); +// } +// } +// +// // Build and return the final response +// return UserProcessingHelper.buildResponse(createdUsers, updatedUsers, failedUsers, userDataList); +// } + + + +// @Override +// public List getActiveUsers() { +// log.info("Fetching all active users"); +// List activeUsers = userRepository.findByStatus(Status.A); +// log.info("Found {} active users", activeUsers.size()); +// return activeUsers; +// } + + + +// @Override +// public Page> getUserDetails(Map req, Pageable pageable) { +// StringBuffer userQuery = new StringBuffer( +// "SELECT `user_id`, `usertype_id`, `user_name`, `user_fname`, `user_lname`, " + +// "`user_email`, `user_mobile`, `user_emp_trans_code`, `user_added_channel`, `status`, `created_on`, " + +// "`created_by`, `last_updated_on`, `last_updated_by` " + +// "FROM `usermaster` WHERE 1=1 "); +// StringBuffer userCountQuery = new StringBuffer("SELECT COUNT(*) FROM `usermaster` WHERE 1=1 "); +// +// try { +// // Add filters dynamically +// if (req.containsKey("userName") && req.get("userName") != null && !req.get("userName").toString().isEmpty()) { +// userQuery.append(" AND `user_name`='").append(req.get("userName").toString()).append("'"); +// userCountQuery.append(" AND `user_name`='").append(req.get("userName").toString()).append("'"); +// } +// if (req.containsKey("Email") && req.get("Email") != null && !req.get("Email").toString().isEmpty()) { +// userQuery.append(" AND `user_email`='").append(req.get("Email").toString()).append("'"); +// userCountQuery.append(" AND `user_email`='").append(req.get("Email").toString()).append("'"); +// } +// if (req.containsKey("userTypeName") && req.get("userTypeName") != null && !req.get("userTypeName").toString().isEmpty()) { +// userQuery.append(" AND `usertype_id`='").append(req.get("userTypeName").toString()).append("'"); +// userCountQuery.append(" AND `usertype_id`='").append(req.get("userTypeName").toString()).append("'"); +// } +// if (req.containsKey("status") && req.get("status") != null && !req.get("status").toString().isEmpty()) { +// userQuery.append(" AND `status`='").append(req.get("status").toString()).append("'"); +// userCountQuery.append(" AND `status`='").append(req.get("status").toString()).append("'"); +// } +// if (req.containsKey("EmployeeTransCode") && req.get("EmployeeTransCode") != null && !req.get("EmployeeTransCode").toString().isEmpty()) { +// userQuery.append(" AND `user_emp_trans_code`='").append(req.get("EmployeeTransCode").toString()).append("'"); +// userCountQuery.append(" AND `user_emp_trans_code`='").append(req.get("EmployeeTransCode").toString()).append("'"); +// } +// +// // Add sorting and pagination to the data query +// userQuery.append(" ORDER BY ").append(pageable.getSort().toString().replace(":", " ")); +// userQuery.append(" LIMIT ").append(pageable.getPageSize()).append(" OFFSET ").append(pageable.getOffset()); +// +// // Execute queries +// List> result = temp.queryForList(userQuery.toString()); +// Long totalCount = temp.queryForObject(userCountQuery.toString(), Long.class); +// +// // Return the paginated result +// return new PageImpl<>(result, pageable, totalCount); +// +// } catch (Exception e) { +// log.error("Error while fetching user details: {}", e.getMessage()); +// return Page.empty(); +// } +// } + + + + +// @Override +// public Page getUsersWithFilters(String userTypeName, String email, String employeeTransCode, Status status, Pageable pageable) { +// return userRepository.findUsersWithFilters(userTypeName, email, employeeTransCode, status, pageable); +// } + + +} diff --git a/src/main/java/com/sahyog/app/inbound/user/serviceImpl/UserTypeServiceImpl.java b/src/main/java/com/sahyog/app/inbound/user/serviceImpl/UserTypeServiceImpl.java new file mode 100644 index 0000000..472bdae --- /dev/null +++ b/src/main/java/com/sahyog/app/inbound/user/serviceImpl/UserTypeServiceImpl.java @@ -0,0 +1,237 @@ +package com.sahyog.app.inbound.user.serviceImpl; + +import java.time.LocalDateTime; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Optional; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.data.domain.Page; +import org.springframework.data.domain.PageImpl; +import org.springframework.data.domain.PageRequest; +import org.springframework.data.domain.Pageable; +import org.springframework.data.domain.Sort; +import org.springframework.jdbc.core.JdbcTemplate; +import org.springframework.stereotype.Service; + +import com.sahyog.app.inbound.user.dto.UserTypeDTO; +import com.sahyog.app.inbound.user.enums.Status; +import com.sahyog.app.inbound.user.exception.CustomException; +import com.sahyog.app.inbound.user.model.Response; +import com.sahyog.app.inbound.user.model.UserType; +import com.sahyog.app.inbound.user.model.UserType1; +import com.sahyog.app.inbound.user.repository.UserTypeRepository; +import com.sahyog.app.inbound.user.service.UserTypeService; + +import jakarta.transaction.Transactional; + + +@Service +public class UserTypeServiceImpl implements UserTypeService { + + Logger log = LoggerFactory.getLogger(UserTypeServiceImpl.class); + + int loggedInUserId = getLoggedInUserId(); + + @Autowired + private UserTypeRepository userTypeRepository; + @Autowired + JdbcTemplate temp; + + + @Transactional + @Override + public Response>> createUserType(UserTypeDTO userTypeDTO) { + log.info("Processing UserType creation/update: {}", userTypeDTO); + + // Check if the UserType already exists by name + UserType existingUserType = userTypeRepository.findByUsertypeName(userTypeDTO.getUserTypeName()); + + // If it exists, update the status + if (existingUserType != null) { + existingUserType.setStatus(Status.valueOf(userTypeDTO.getStatus())); + existingUserType.setLastUpdatedBy(userTypeDTO.getLastUpdatedBy()); + userTypeRepository.save(existingUserType); + + return buildResponse("updated", existingUserType); + } else { + // If it does not exist, create a new UserType + UserType newUserType = new UserType(); + newUserType.setUsertypeName(userTypeDTO.getUserTypeName()); + newUserType.setStatus(Status.valueOf(userTypeDTO.getStatus())); + newUserType.setCreatedBy(userTypeDTO.getCreatedBy()); + newUserType.setLastUpdatedBy(userTypeDTO.getCreatedBy()); + userTypeRepository.save(newUserType); + + return buildResponse("created", newUserType); + } + } + + private Response>> buildResponse(String action, UserType userType) { + List> data = new ArrayList<>(); + Map userTypeData = new HashMap<>(); + userTypeData.put("userTypeName", userType.getUsertypeName()); + userTypeData.put("status", userType.getStatus()); + userTypeData.put("action", action); + + data.add(userTypeData); + return Response.success(data); + } + + + + + + @Override + public Page> getUsertypeDetails(Map req, Pageable pageable) { + StringBuffer usertypeQuery = new StringBuffer( + "SELECT `usertype_id`, `usertype_name`, `usertype_description`, `status`, `created_on`, " + + "`created_by`, `last_updated_on`, `last_updated_by`" + + "FROM `usertypemaster` WHERE 1=1 "); + StringBuffer usertypeCountQuery = new StringBuffer("SELECT COUNT(*) FROM `usertypemaster` WHERE 1=1 "); + + try { + // Add filters dynamically + if (req.containsKey("usertypename") && req.get("usertypename") != null && !req.get("usertypename").toString().isEmpty()) { + log.debug("Adding filter for supplierCode: {}", req.get("usertypename")); + usertypeQuery.append(" AND `usertype_name`='").append(req.get("usertypename").toString()).append("'"); + usertypeCountQuery.append(" AND `usertype_name`='").append(req.get("usertypename").toString()).append("'"); + } + if (req.containsKey("status") && req.get("status") != null && !req.get("status").toString().isEmpty()) { + log.debug("Adding filter for supplierName: {}", req.get("status")); + usertypeQuery.append(" AND `status`='").append(req.get("status").toString()).append("'"); + usertypeCountQuery.append(" AND `status`='").append(req.get("status").toString()).append("'"); + } + if (req.containsKey("userTypeId") && req.get("userTypeId") != null && !req.get("userTypeId").toString().isEmpty()) { + log.debug("Adding filter for suplierAccountGroup: {}", req.get("userTypeId")); + usertypeQuery.append(" AND `usertype_id`='").append(req.get("userTypeId").toString()).append("'"); + usertypeCountQuery.append(" AND `usertype_id`='").append(req.get("userTypeId").toString()).append("'"); + } + + + // Log the final query before execution + log.debug("Executing query: {}", usertypeQuery.toString()); + log.debug("Executing count query: {}", usertypeCountQuery.toString()); + + // Add pagination and sorting + usertypeQuery.append(" ORDER BY ").append(pageable.getSort().toString().replace(":", " ")).append(" LIMIT ") + .append(pageable.getPageSize()).append(" OFFSET ").append(pageable.getOffset()); + + // Execute the queries + List> result = temp.queryForList(usertypeQuery.toString()); + Long totalCount = temp.queryForObject(usertypeCountQuery.toString(), Long.class); + + // Log the result count + log.debug("Fetched {} results from the database.", result.size()); + log.debug("Total count: {}", totalCount); + + // Return the paginated result + return new PageImpl<>(result, pageable, totalCount); + + } catch (Exception e) { + log.error("Error while fetching usertype details: {}", e.getMessage(), e); + return Page.empty(); + } + } + + + private int getLoggedInUserId() { + // TODO Auto-generated method stub + return 1; + } + + @Override + public UserType getUserTypeById(short userTypeId) { + return userTypeRepository.findById(userTypeId) + .orElseThrow(() -> new RuntimeException("User type not found with ID: " + userTypeId)); + } + + + + @Override + public void updateUserTypeStatus(short userTypeId) { + // Retrieve the UserType by ID + Optional userTypeOptional = userTypeRepository.findById(userTypeId); + + if (userTypeOptional.isPresent()) { + UserType userType = userTypeOptional.get(); + + // Toggle the status + if (userType.getStatus() == Status.A) { + userType.setStatus(Status.I); + } else if (userType.getStatus() == Status.I) { + userType.setStatus(Status.A); + } + userType.setLastUpdatedBy(loggedInUserId); // Retrieve logged-in user ID appropriately + + // Save the updated UserType + userTypeRepository.save(userType); + } else { + throw new RuntimeException("UserType with ID " + userTypeId + " not found."); + } + } + +// @Override +// public UserType createUserType(UserType1 userTypeDTO) { +// +// +// logger.info("Starting createUserType method. Input UserTypeDTO: {}", userTypeDTO); +// +// try { +// UserType newUserType = new UserType(); +//// newUserType.setUsertypeName("Akash"); +//// newUserType.setDescription("Dummy"); +//// newUserType.setStatus(Status.A); +//// newUserType.setCreatedBy(1); +//// newUserType.setLastUpdatedBy(1); +// newUserType.setUsertypeName(userTypeDTO.getUsertypeName()); +// newUserType.setDescription(userTypeDTO.getDescription()); +// newUserType.setStatus(Status.A); +// newUserType.setCreatedBy(1); +// newUserType.setLastUpdatedBy(1); +// +// UserType savedUserType = userTypeRepository.save(newUserType); +// +// logger.info("UserType created successfully with ID: {}", savedUserType.getUserTypeId()); +// return savedUserType; +// } catch (Exception e) { +// logger.error("Error occurred while creating UserType: {}", e.getMessage(), e); +// throw new RuntimeException("Failed to create UserType", e); +// } +// } + + + + @Override + public Map getDropDownValues() { + Map response = new HashMap<>(); + try { + // Fetch distinct dropdown values + List usertypeName = temp.queryForList("SELECT DISTINCT `usertype_name` FROM `usertypemaster`", String.class); + List status = temp.queryForList("SELECT DISTINCT `status` FROM `usertypemaster`", String.class); + + // Map values to keys + response.put("usertypeName", usertypeName); + response.put("status", status); + + + + } catch (Exception e) { + log.error("Error while fetching dropdown values: {}", e.getMessage()); + response.put("error", "Failed to fetch dropdown values"); + } + + return response; + } + + + + + + + +} \ No newline at end of file diff --git a/src/main/java/com/sahyog/app/inbound/user/utils/MaterialProcessingHelper.java b/src/main/java/com/sahyog/app/inbound/user/utils/MaterialProcessingHelper.java new file mode 100644 index 0000000..364049c --- /dev/null +++ b/src/main/java/com/sahyog/app/inbound/user/utils/MaterialProcessingHelper.java @@ -0,0 +1,62 @@ +package com.sahyog.app.inbound.user.utils; + +import java.util.Collections; +import java.util.List; +import java.util.Map; + +import com.sahyog.app.inbound.user.model.MaterialMaster; +import com.sahyog.app.inbound.user.model.Response; +import java.util.Collections; +import java.util.List; +import java.util.Map; + +public class MaterialProcessingHelper { + + // Method to build the success response + public static Response>> buildResponse( + List createdMaterials, + List updatedMaterials, + List failedMaterials, + List> materialDataList + ) { + StringBuilder message = new StringBuilder("Processing completed. "); + if (!createdMaterials.isEmpty()) { + message.append(createdMaterials.size()).append(" material(s) created. "); + } + if (!updatedMaterials.isEmpty()) { + message.append(updatedMaterials.size()).append(" material(s) updated. "); + } + if (!failedMaterials.isEmpty()) { + message.append("Failed to process the following materials: ").append(String.join(", ", failedMaterials)); + } + + return Response.success(materialDataList).withMessage(message.toString()); + } + + // Method to build the error response + public static Response>> buildErrorResponse( + List failedMaterials, + String errorMessage + ) { + StringBuilder message = new StringBuilder("Processing failed. "); + if (!failedMaterials.isEmpty()) { + message.append("Failed to process the following materials: ") + .append(String.join(", ", failedMaterials)); + } + if (errorMessage != null && !errorMessage.isEmpty()) { + message.append(" Error: ").append(errorMessage); + } + + // Return error response with an empty list + return Response.error(400, message.toString()).withData(Collections.emptyList()); + } + + // Helper method to add material data to the list + public static void addMaterialData(List> materialDataList, String action, MaterialMaster material) { + materialDataList.add(Map.of( + "action", action, + "materialCode", material.getMaterialCode(), + "plantId", material.getPlantId() + )); + } +} diff --git a/src/main/java/com/sahyog/app/inbound/user/utils/PlantProcessingHelper.java b/src/main/java/com/sahyog/app/inbound/user/utils/PlantProcessingHelper.java new file mode 100644 index 0000000..e57c74a --- /dev/null +++ b/src/main/java/com/sahyog/app/inbound/user/utils/PlantProcessingHelper.java @@ -0,0 +1,65 @@ +package com.sahyog.app.inbound.user.utils; + +import java.util.Collections; +import java.util.List; +import java.util.Map; + +import com.sahyog.app.inbound.user.model.PlantMaster; +import com.sahyog.app.inbound.user.model.Response; +public class PlantProcessingHelper { + + // Helper method to add plant data to the list + public static void addPlantData(List> plantDataList, String action, PlantMaster plant) { + if (plant != null) { + plantDataList.add(Map.of( + "action", action, + "plantCode", plant.getPlantCode(), + "plantDesc", plant.getPlantDesc() + )); + } else { + plantDataList.add(Map.of( + "action", action, + "error", "Failed to process plant" + )); + } + } + + // Method to build the success response + public static Response>> buildResponse( + List createdPlants, + List updatedPlants, + List failedPlants, + List> plantDataList + ) { + StringBuilder message = new StringBuilder("Processing completed. "); + if (!createdPlants.isEmpty()) { + message.append(createdPlants.size()).append(" plant(s) created. "); + } + if (!updatedPlants.isEmpty()) { + message.append(updatedPlants.size()).append(" plant(s) updated. "); + } + if (!failedPlants.isEmpty()) { + message.append("Failed to process the following plants: ").append(String.join(", ", failedPlants)); + } + + return Response.success(plantDataList).withMessage(message.toString()); + } + + // Method to build the error response + public static Response>> buildErrorResponse( + List failedPlants, + String errorMessage + ) { + StringBuilder message = new StringBuilder("Processing failed. "); + if (!failedPlants.isEmpty()) { + message.append("Failed to process the following plants: ") + .append(String.join(", ", failedPlants)); + } + if (errorMessage != null && !errorMessage.isEmpty()) { + message.append(" Error: ").append(errorMessage); + } + + // Return error response with an empty list + return Response.error(400, message.toString()).withData(Collections.emptyList()); + } +} diff --git a/src/main/java/com/sahyog/app/inbound/user/utils/TransporterProcessingHelper.java b/src/main/java/com/sahyog/app/inbound/user/utils/TransporterProcessingHelper.java new file mode 100644 index 0000000..9579300 --- /dev/null +++ b/src/main/java/com/sahyog/app/inbound/user/utils/TransporterProcessingHelper.java @@ -0,0 +1,52 @@ +package com.sahyog.app.inbound.user.utils; + +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; + +import com.sahyog.app.inbound.user.dto.TransporterMasterDto; +import com.sahyog.app.inbound.user.exception.TransporterValidationException; +import com.sahyog.app.inbound.user.model.Response; +import com.sahyog.app.inbound.user.model.Transporter; + +import jakarta.validation.ConstraintViolationException; + +public class TransporterProcessingHelper { + + // Method to add transporter data to the list + public static void addTransporterData(List> transporterDataList, String action, Transporter transporter) { + transporterDataList.add(Map.of( + "action", action, + "supplierCode", transporter.getSupplierCode(), + "transporterCode", transporter.getTransporterCode() + )); + } + + public static void handleValidationException(TransporterMasterDto dto, ConstraintViolationException e) { + String violations = e.getConstraintViolations().stream() + .map(violation -> String.format("Property '%s': %s", violation.getPropertyPath(), violation.getMessage())) + .collect(Collectors.joining("; ")); + throw new TransporterValidationException(dto.getSupplierCode(), String.format("Supplier code: %s. Violations: %s", dto.getSupplierCode(), violations)); + } + + + // Method to build a response message based on the processed transporters + public static Response>> buildResponse( + List createdTransporters, + List updatedTransporters, + List failedSuppliers, + List> transporterDataList + ) { + StringBuilder message = new StringBuilder("Processing completed. "); + if (!createdTransporters.isEmpty()) { + message.append(createdTransporters.size()).append(" transporter(s) created. "); + } + if (!updatedTransporters.isEmpty()) { + message.append(updatedTransporters.size()).append(" transporter(s) updated. "); + } + if (!failedSuppliers.isEmpty()) { + message.append("Failed to process the following suppliers: ").append(String.join(", ", failedSuppliers)); + } + return Response.success(transporterDataList).withMessage(message.toString()); + } +} diff --git a/src/main/java/com/sahyog/app/inbound/user/utils/UserConstants.java b/src/main/java/com/sahyog/app/inbound/user/utils/UserConstants.java new file mode 100644 index 0000000..0978203 --- /dev/null +++ b/src/main/java/com/sahyog/app/inbound/user/utils/UserConstants.java @@ -0,0 +1,12 @@ +package com.sahyog.app.inbound.user.utils; + +import com.sahyog.app.inbound.user.enums.Status; + +public class UserConstants { + public static final String INTEGRATION_USER_TYPE = "INTGUSER"; + public static final String DEFAULT_ADDED_CHANNEL = "B"; + public static final int DEFAULT_LOGGED_IN_USER_ID = 1; + public static final String CHANNEL_F = "F"; + public static final Status ACTIVE_STATUS = Status.A; + +} diff --git a/src/main/java/com/sahyog/app/inbound/user/utils/UserProcessingHelper.java b/src/main/java/com/sahyog/app/inbound/user/utils/UserProcessingHelper.java new file mode 100644 index 0000000..b47a44c --- /dev/null +++ b/src/main/java/com/sahyog/app/inbound/user/utils/UserProcessingHelper.java @@ -0,0 +1,45 @@ +package com.sahyog.app.inbound.user.utils; + +import java.util.Collections; +import java.util.List; +import java.util.Map; + +import com.sahyog.app.inbound.user.model.Response; + +public class UserProcessingHelper { + + public static Response>> buildResponse( + List createdUsers, + List updatedUsers, + List failedUsers, + List> userDataList + ) { + StringBuilder message = new StringBuilder("User processing completed. "); + if (!createdUsers.isEmpty()) { + message.append(createdUsers.size()).append(" user(s) created. "); + } + if (!updatedUsers.isEmpty()) { + message.append(updatedUsers.size()).append(" user(s) updated. "); + } + if (!failedUsers.isEmpty()) { + message.append("Failed to process the following users: ").append(String.join(", ", failedUsers)); + } + + return Response.success(userDataList).withMessage(message.toString()); + } + + public static Response>> buildErrorResponse( + List failedUsers, + String errorMessage + ) { + StringBuilder message = new StringBuilder("User processing failed. "); + if (!failedUsers.isEmpty()) { + message.append("Failed to process the following users: ").append(String.join(", ", failedUsers)); + } + if (errorMessage != null && !errorMessage.isEmpty()) { + message.append(" Error: ").append(errorMessage); + } + + return Response.error(400, message.toString()).withData(Collections.emptyList()); + } +} diff --git a/src/main/resources/application.properties b/src/main/resources/application.properties new file mode 100644 index 0000000..93681c4 --- /dev/null +++ b/src/main/resources/application.properties @@ -0,0 +1,59 @@ +spring.application.name=inbound-user-service + +server.port=9090 +# =============================== +# Database Configuration +# =============================== +spring.datasource.url=jdbc:mysql://localhost:3306/usermanagement?allowPublicKeyRetrieval=true&useSSL=false + +#spring.datasource.url=jdbc:mysql://localhost:3306/inbound_user_service?useSSL=false&serverTimezone=UTC +spring.datasource.username=root +spring.datasource.password=root +spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver +spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.MySQL8Dialect + + +# JPA / Hibernate Settings +spring.jpa.hibernate.ddl-auto=update +spring.jpa.show-sql=true +spring.jpa.properties.hibernate.format_sql=true +spring.jpa.properties.hibernate.use_sql_comments=true + +# Batch Processing (Optional for better performance with bulk inserts/updates) +spring.jpa.properties.hibernate.jdbc.batch_size=20 +spring.jpa.properties.hibernate.order_inserts=true +spring.jpa.properties.hibernate.order_updates=true + +# =============================== +# Logging Configuration +# =============================== +logging.level.root=INFO +logging.level.com.sahyog=DEBUG +logging.level.org.hibernate.SQL=DEBUG +logging.level.org.hibernate.type.descriptor.sql.BasicBinder=TRACE + +# Log file output +logging.file.name=/var/log/inbound-user-service/user_service.log # Change path as needed + +# Log rotation settings +logging.logback.rollingpolicy.file-name-pattern=/var/log/inbound-user-service/user_service.%d{yyyy-MM-dd}.%i.log.gz +logging.logback.rollingpolicy.max-file-size=10MB +logging.logback.rollingpolicy.total-size-cap=1GB +logging.logback.rollingpolicy.max-history=7 + +# =============================== +# HikariCP (Connection Pool) Configuration +# =============================== +spring.datasource.hikari.maximum-pool-size=10 +spring.datasource.hikari.minimum-idle=5 +spring.datasource.hikari.idle-timeout=30000 +spring.datasource.hikari.max-lifetime=1800000 +spring.datasource.hikari.connection-timeout=30000 +spring.datasource.hikari.pool-name=HikariPool + +# =============================== +# Additional Configurations +# =============================== +# Management endpoints +management.endpoints.web.exposure.include=health,info +management.endpoint.health.show-details=always diff --git a/src/test/java/com/shayog/app/inbound/user/InboundUserServiceApplicationTests.java b/src/test/java/com/shayog/app/inbound/user/InboundUserServiceApplicationTests.java new file mode 100644 index 0000000..394b644 --- /dev/null +++ b/src/test/java/com/shayog/app/inbound/user/InboundUserServiceApplicationTests.java @@ -0,0 +1,15 @@ +package com.shayog.app.inbound.user; + +import org.junit.jupiter.api.Test; +import org.springframework.boot.SpringBootConfiguration; +import org.springframework.boot.test.context.SpringBootTest; + +@SpringBootTest +@SpringBootConfiguration +class InboundUserServiceApplicationTests { + + @Test + void contextLoads() { + } + +}