├── .asf.yaml ├── .github └── workflows │ ├── gradle.yml │ ├── publish.yml │ ├── release.yml │ └── rendersite.yml ├── .gitignore ├── LICENSE ├── README.md ├── assets ├── bgimages │ ├── 2015-03-01.jpg │ ├── 2016-04-01-1.jpg │ ├── 2016-04-01-2.jpg │ ├── 2016-04-13.jpg │ ├── 2016-04-27.jpg │ ├── 2016-04-28.jpg │ ├── 2016-05-26.jpg │ ├── 2016-05-28.jpg │ ├── 2016-05-31.jpg │ ├── 2016-06-02.jpg │ ├── 2016-06-07.jpg │ ├── 2016-06-26.jpg │ ├── 2016-07-06.jpg │ ├── 2016-07-22.jpg │ ├── 2016-08-01.jpg │ ├── 2016-08-31.jpg │ ├── 2016-09-12.jpg │ ├── 2016-09-28.jpg │ ├── 2016-10-03.jpg │ ├── 2016-11-01.jpg │ ├── 2016-11-10.jpg │ ├── 2016-11-14.jpg │ ├── 2016-12-14.jpg │ ├── 2017-01-20-1.jpg │ ├── 2017-01-20-2.jpg │ ├── 2017-01-20-3.jpg │ ├── 2017-01-20-4.jpg │ ├── 2017-03-27.jpg │ ├── 2017-04-02.jpg │ ├── 2017-04-12.jpg │ ├── 2017-05-09.jpg │ ├── 2017-06-27.jpg │ ├── 2017-06-28.jpg │ ├── 2017-07-12.jpg │ ├── 2017-07-26.jpg │ ├── 2017-10-30.jpg │ ├── 2017-11-09.jpg │ ├── 2017-11-21.jpg │ ├── 2017-11-30.jpg │ ├── 2017-12-05.jpg │ ├── 2018-02-08.jpg │ ├── 2018-02-09.jpg │ ├── 2018-03-02.jpg │ ├── 2018-03-09.jpg │ ├── 2018-04-05.jpg │ ├── 2018-04-06.jpg │ ├── 2018-05-18.jpg │ ├── 2018-05-24.jpg │ ├── 2018-06-15.jpg │ ├── 2018-06-22.jpg │ ├── 2018-08-22-1.jpg │ ├── 2018-08-22-2.jpg │ ├── 2018-09-23.jpg │ ├── 2018-10-02.jpg │ ├── 2018-10-12.jpg │ ├── 2019-01-07.jpg │ ├── 2019-01-30.jpg │ ├── 2019-02-19.jpg │ ├── 2019-03-27.jpg │ ├── 2019-05-24.jpg │ ├── 2019-05-30.jpg │ ├── 2019-06-18.jpg │ ├── 2019-07-11.jpg │ ├── 2019-08-27.jpg │ ├── 2019-12-20.jpg │ ├── 2020-09-10.jpg │ ├── 2020-10-01.jpg │ ├── 2020-10-16.jpg │ ├── 2020-10-26.jpg │ ├── grails-blog-index-1.png │ ├── grails-blog-index-2.png │ ├── grails-blog-index-3.png │ ├── grails-blog-index-4.png │ ├── grails-blog-index-5.png │ ├── grails-blog-index-6.png │ ├── grails-blog-index-security.png │ └── quickcast.jpg ├── files │ ├── support-docs │ │ └── grails-support-terms-and-conditions.pdf │ └── wrapper-issue7 │ │ ├── grails3 │ │ ├── grails-wrapper.jar │ │ └── grails-wrapper.jar.md5 │ │ └── grails4 │ │ ├── grails-wrapper.jar │ │ └── grails-wrapper.jar.md5 ├── fonts │ ├── archia-bold.eot │ ├── archia-bold.ttf │ ├── archia-bold.woff │ ├── archia-bold.woff2 │ ├── archia-light.eot │ ├── archia-light.ttf │ ├── archia-light.woff │ ├── archia-light.woff2 │ ├── archia-medium.eot │ ├── archia-medium.ttf │ ├── archia-medium.woff │ ├── archia-medium.woff2 │ ├── archia-regular.eot │ ├── archia-regular.ttf │ ├── archia-regular.woff │ ├── archia-regular.woff2 │ ├── archia-semibold.eot │ ├── archia-semibold.ttf │ ├── archia-semibold.woff │ ├── archia-semibold.woff2 │ ├── archia-thin.eot │ ├── archia-thin.ttf │ ├── archia-thin.woff │ ├── archia-thin.woff2 │ ├── roboto-light.eot │ ├── roboto-light.svg │ ├── roboto-light.ttf │ ├── roboto-light.woff │ ├── roboto-medium.eot │ ├── roboto-medium.svg │ ├── roboto-medium.ttf │ ├── roboto-medium.woff │ ├── roboto-regular.eot │ ├── roboto-regular.svg │ ├── roboto-regular.ttf │ └── roboto-regular.woff ├── images │ ├── advancedgrails.svg │ ├── async.svg │ ├── asynchronous.svg │ ├── banner.png │ ├── banner.svg │ ├── banners │ │ └── nominateyourggrailsrockstar.png │ ├── bg.png │ ├── bgtransparent.png │ ├── bintray.svg │ ├── books │ │ ├── Kousen-MJG.png │ │ ├── bbeckwith_cover.gif │ │ ├── bklein_cover.jpg │ │ ├── g2cook.jpg │ │ ├── gdsl.jpg │ │ ├── ggood.jpg │ │ ├── grails_3_step_by_step.png │ │ ├── grails_weissmann.png │ │ ├── grailsgood.png │ │ ├── grocher_jbrown_cover.jpg │ │ ├── gsmith2_cover150.jpg │ │ ├── pratical-grails-3-book-cover.png │ │ ├── regina.png │ │ └── vslg2.jpg │ ├── brinqa.png │ ├── bug.svg │ ├── buildstatus.svg │ ├── caret.png │ ├── cassandra.svg │ ├── chalices.svg │ ├── clippy.svg │ ├── communitysponsor.svg │ ├── confs │ │ ├── gr8confeu.png │ │ ├── gr8confus.png │ │ └── greach.png │ ├── corporatesponsor.svg │ ├── david-estes-2020-rock-star.png │ ├── develocity-logo.png │ ├── documentation.svg │ ├── download.svg │ ├── dsl.png │ ├── email.svg │ ├── eric_helgeson.png │ ├── favicon.ico │ ├── favicon.png │ ├── flatlearningcurve.png │ ├── foundation-logo-horizontal-orange.svg │ ├── foundation-og.png │ ├── github.svg │ ├── github_white.svg │ ├── githubstar.png │ ├── googlecloud.svg │ ├── gorm-pinned-icon.svg │ ├── gorm.png │ ├── gorm.svg │ ├── gorm_logo.sketch │ ├── gorm_logo.svg │ ├── gormfavicon.ico │ ├── gormfavicon.png │ ├── gormwhite.svg │ ├── graeme.png │ ├── grailaprrentice.svg │ ├── grails-foundation-orange.svg │ ├── grails-pinned-icon.svg │ ├── grails.png │ ├── grails_android.svg │ ├── grails_logo.svg │ ├── grailsangular.svg │ ├── grailsbanner.sketch │ ├── grailsdevops.svg │ ├── graphql.svg │ ├── groovy.png │ ├── groovy.svg │ ├── halloffame.sketch │ ├── hibernate.svg │ ├── idesupport.png │ ├── ios.svg │ ├── james-fredley-2025-rock-star.png │ ├── java.png │ ├── jeff_scott_brown.png │ ├── kenkousen.png │ ├── latestguides.svg │ ├── linkedin.svg │ ├── mongo.svg │ ├── neo4j.svg │ ├── oci-logo.svg │ ├── ocigrailsteam.png │ ├── olderversion.svg │ ├── opensource.svg │ ├── plugins.svg │ ├── profiles.sketch │ ├── profiles.svg │ ├── react.svg │ ├── relationaldb.svg │ ├── restapis.svg │ ├── ria.svg │ ├── rxjava.svg │ ├── scroll-up-icon.svg │ ├── scroll-up-icon2.svg │ ├── security.svg │ ├── slack.svg │ ├── slack_logo.svg │ ├── slack_orange.svg │ ├── small_github.svg │ ├── small_githubstar.svg │ ├── source.svg │ ├── sponsor │ │ ├── jet-brains-logo.svg │ │ ├── oci-horizontal.svg │ │ ├── oci-sponsor.png │ │ └── unity-foundation-logo.svg │ ├── springboot.svg │ ├── testimoniallogos.png │ ├── testing.svg │ ├── training.svg │ ├── unbenannt-1.svg │ ├── update.sketch │ ├── upgrade.svg │ ├── usergroup.svg │ ├── video.png │ ├── view.svg │ ├── views.svg │ ├── vue.svg │ ├── x-twitter.sketch │ ├── x-twitter.svg │ └── youtube.svg ├── javascripts │ ├── navigation.js │ ├── paginate.js │ ├── plugins-search.js │ ├── plugins.js │ ├── prism.js │ └── search.js └── stylesheets │ ├── foundation.css │ ├── paginate.css │ ├── plugin.css │ ├── prism.css │ ├── screen.css │ ├── support.css │ └── trademark-policy.css ├── build.gradle ├── buildSrc ├── build.gradle ├── settings.gradle └── src │ ├── main │ ├── groovy │ │ └── org │ │ │ └── grails │ │ │ ├── Content.groovy │ │ │ ├── ContentAndMetadata.groovy │ │ │ ├── HtmlMinutes.groovy │ │ │ ├── HtmlPost.groovy │ │ │ ├── MarkdownMinutes.groovy │ │ │ ├── MarkdownPost.groovy │ │ │ ├── MinutesMetadata.groovy │ │ │ ├── MinutesMetadataAdaptor.groovy │ │ │ ├── Page.groovy │ │ │ ├── PageElement.groovy │ │ │ ├── PostMetadata.groovy │ │ │ ├── PostMetadataAdapter.groovy │ │ │ ├── ReadFileUtils.groovy │ │ │ ├── documentation │ │ │ ├── DocumentationPage.groovy │ │ │ ├── GuideGroup.groovy │ │ │ ├── GuideGroupHtml.groovy │ │ │ ├── GuideGroupItem.groovy │ │ │ ├── ProfilesPage.groovy │ │ │ ├── SiteMap.groovy │ │ │ ├── Snapshot.groovy │ │ │ └── SoftwareVersion.groovy │ │ │ ├── events │ │ │ ├── Event.groovy │ │ │ ├── EventsPage.groovy │ │ │ └── GrailsAirtable.groovy │ │ │ ├── gradle │ │ │ ├── BlogTask.groovy │ │ │ ├── BuildGuidesTask.groovy │ │ │ ├── CopyAssetsTask.groovy │ │ │ ├── DocumentationTask.groovy │ │ │ ├── GrailsWebsitePlugin.groovy │ │ │ ├── GuidesTask.groovy │ │ │ ├── MinutesTask.groovy │ │ │ ├── PluginsTask.groovy │ │ │ ├── ProfilesTask.groovy │ │ │ ├── QuestionsTask.groovy │ │ │ ├── RenderSiteTask.groovy │ │ │ ├── SiteExtension.groovy │ │ │ └── SitemapTask.groovy │ │ │ ├── guides │ │ │ ├── Category.groovy │ │ │ ├── GrailsMajorVersion.groovy │ │ │ ├── GrailsVersionedGuide.groovy │ │ │ ├── Guide.groovy │ │ │ ├── GuidesFetcher.groovy │ │ │ ├── GuidesPage.groovy │ │ │ ├── MultiLanguageGuide.groovy │ │ │ ├── ProgrammingLanguage.groovy │ │ │ ├── SingleGuide.groovy │ │ │ ├── SingleLanguageGuide.groovy │ │ │ ├── TagUtils.groovy │ │ │ └── Training.groovy │ │ │ ├── plugin │ │ │ ├── Owner.groovy │ │ │ ├── Plugin.groovy │ │ │ └── PluginsPage.groovy │ │ │ ├── questions │ │ │ ├── Question.groovy │ │ │ ├── QuestionHtml.groovy │ │ │ └── QuestionsPage.groovy │ │ │ └── tags │ │ │ ├── Tag.groovy │ │ │ └── TagCloud.groovy │ ├── java │ │ └── org │ │ │ └── grails │ │ │ ├── airtable │ │ │ ├── AirtableApi.java │ │ │ ├── AirtableApiError.java │ │ │ ├── AirtableBaseApi.java │ │ │ ├── AirtableBaseConfiguration.java │ │ │ ├── AirtableBaseConfigurationProperties.java │ │ │ ├── AirtableClient.java │ │ │ ├── AirtableConfiguration.java │ │ │ ├── AirtableConfigurationProperties.java │ │ │ ├── AirtableError.java │ │ │ ├── AirtableFactory.java │ │ │ ├── CellFormat.java │ │ │ ├── Direction.java │ │ │ ├── Record.java │ │ │ ├── RecordList.java │ │ │ ├── Sort.java │ │ │ ├── TimeZone.java │ │ │ └── UserLocale.java │ │ │ └── markdown │ │ │ └── MarkdownUtil.java │ └── resources │ │ └── guidesuggestionform.html │ └── test │ └── groovy │ └── org │ └── grails │ ├── airtable │ ├── AirtableApiErrorSpec.groovy │ ├── AirtableBaseApiSpec.groovy │ ├── AirtableBaseConfigurationSpec.groovy │ ├── AirtableConfigurationSpec.groovy │ ├── AirtableErrorSpec.groovy │ ├── ApplicationContextSpecification.groovy │ ├── CellFormatSpec.groovy │ ├── ConfigurationFixture.groovy │ ├── DirectionSpec.groovy │ ├── Event.groovy │ ├── MicronautAirtable.groovy │ ├── RecordListSpec.groovy │ ├── RecordSpec.groovy │ ├── SortSpec.groovy │ ├── TimeZoneSpec.groovy │ └── UserLocaleSpec.groovy │ └── documentation │ └── SoftwareVersionSpec.groovy ├── conf ├── modules.yml ├── profiles.yml ├── questions.yml └── releases.yml ├── docs ├── mamp.png └── textexpander.png ├── gradle └── wrapper │ ├── gradle-wrapper.jar │ └── gradle-wrapper.properties ├── gradlew ├── gradlew.bat ├── minutes ├── 20210321-tab.md ├── 20211217-tab.md ├── 20220323-tab.md ├── 20220711-tab.md └── 20221128-tab.md ├── pages ├── casestudies │ ├── boosting-agility-with-grails.html │ ├── grails-case-study-enterprise-scale-application-development.html │ ├── grails-case-study-providing-a-comprehensive-solution-for-a-public-university.html │ ├── grails-increases-developer-productivity.html │ ├── increased-throughput-and-delivery-performance-with-grails.html │ └── index.html ├── community-code-of-conduct.html ├── community.html ├── download.html ├── foundation │ ├── index.html │ ├── sponsor-list.html │ ├── sponsorship.html │ └── thank-you.html ├── index.html ├── learning.html ├── legacy-plugins.html ├── privacy-policy.html ├── search.html ├── support.html └── trademark-policy.html ├── posts ├── 2015-03-01.md ├── 2016-04-01-1.md ├── 2016-04-01-2.md ├── 2016-04-13.md ├── 2016-04-27.md ├── 2016-04-28.md ├── 2016-05-26.md ├── 2016-05-28-img01.png ├── 2016-05-28-img02.png ├── 2016-05-28.md ├── 2016-05-31.md ├── 2016-06-02.md ├── 2016-06-07-img01.jpg ├── 2016-06-07-img02.jpg ├── 2016-06-07-img03.jpg ├── 2016-06-07-img04.jpg ├── 2016-06-07-img05.jpg ├── 2016-06-07.md ├── 2016-06-26-img01.jpg ├── 2016-06-26-img02.png ├── 2016-06-26-img03.jpg ├── 2016-06-26-img04.jpg ├── 2016-06-26-img05.png ├── 2016-06-26-img06.png ├── 2016-06-26-img07.png ├── 2016-06-26-img08.png ├── 2016-06-26-img09.png ├── 2016-06-26.md ├── 2016-07-06-img01.png ├── 2016-07-06-img02.png ├── 2016-07-06-img03.png ├── 2016-07-06-img04.png ├── 2016-07-06-img05.png ├── 2016-07-06-img06.png ├── 2016-07-06-img07.png ├── 2016-07-06-img08.png ├── 2016-07-06-img09.png ├── 2016-07-06-img10.png ├── 2016-07-06.md ├── 2016-07-22.md ├── 2016-08-01-img01.png ├── 2016-08-01-img02.jpg ├── 2016-08-01-img03.png ├── 2016-08-01-img04.jpg ├── 2016-08-01-img05.jpeg ├── 2016-08-01-img06.jpg ├── 2016-08-01-img07.jpeg ├── 2016-08-01-img08.jpeg ├── 2016-08-01-img09.jpeg ├── 2016-08-01-img10.jpeg ├── 2016-08-01-img11.jpeg ├── 2016-08-01-img12.jpeg ├── 2016-08-01-img13.jpeg ├── 2016-08-01-img14.png ├── 2016-08-01.md ├── 2016-08-31.md ├── 2016-09-12-img01.jpg ├── 2016-09-12-img02.jpg ├── 2016-09-12-img03.jpg ├── 2016-09-12.md ├── 2016-09-28.md ├── 2016-10-03-img01.png ├── 2016-10-03-img02.png ├── 2016-10-03-img03.png ├── 2016-10-03.md ├── 2016-11-01.md ├── 2016-11-10.md ├── 2016-11-14-img01.png ├── 2016-11-14-img02.png ├── 2016-11-14-img03.png ├── 2016-11-14.md ├── 2016-12-14-img01.jpg ├── 2016-12-14-img02.jpg ├── 2016-12-14-img03.jpg ├── 2016-12-14-img04.jpg ├── 2016-12-14-img05.jpg ├── 2016-12-14-img06.jpg ├── 2016-12-14-img07.jpg ├── 2016-12-14-img08.jpg ├── 2016-12-14.md ├── 2017-01-20-1.md ├── 2017-01-20-2.md ├── 2017-01-20-3.md ├── 2017-01-20-4.md ├── 2017-03-27.md ├── 2017-04-02.md ├── 2017-04-12.md ├── 2017-05-09.md ├── 2017-06-27.md ├── 2017-06-28.md ├── 2017-07-12.md ├── 2017-07-26.md ├── 2017-10-30.md ├── 2017-11-09.md ├── 2017-11-21.md ├── 2017-11-30-img01.png ├── 2017-11-30.md ├── 2017-12-05.md ├── 2018-02-08.md ├── 2018-02-09.md ├── 2018-03-02-img01.png ├── 2018-03-02-img02.png ├── 2018-03-02-img03.png ├── 2018-03-02-img04.png ├── 2018-03-02.md ├── 2018-03-06.md ├── 2018-03-09.md ├── 2018-04-05.md ├── 2018-04-06.md ├── 2018-05-18.md ├── 2018-05-24.md ├── 2018-06-15.md ├── 2018-06-22.md ├── 2018-08-22-1.md ├── 2018-08-22-2.md ├── 2018-09-23.md ├── 2018-10-02.md ├── 2018-10-12.md ├── 2019-01-07.md ├── 2019-01-30.md ├── 2019-02-19.md ├── 2019-03-27.md ├── 2019-05-24.md ├── 2019-05-30.md ├── 2019-06-18.md ├── 2019-07-11.md ├── 2019-08-27.md ├── 2019-12-20.md ├── 2020-09-10-grails-state-of-union.md ├── 2020-10-01-2gm-town-hall.md ├── 2020-10-16-2gm-town-hall-2020-q4.md ├── 2020-10-26-grails-foundation-announcement.md ├── 2021-01-22-grails-exciting-updates.md ├── 2021-02-05-2gm-town-hall-q1.md ├── 2021-02-12-alerts-regarding-bintray-sunset.md ├── 2021-03-22-gideon-hello-world.png ├── 2021-03-22-meet-the-new-mascot.md ├── 2021-04-07-img01.png ├── 2021-04-07-publish-grails-plugin-to-maven-central.md ├── 2021-05-21-2gm-town-hall-q2.md ├── 2021-06-10-grails-wrapper-update.md ├── 2021-07-20-call-for-productivity-tips.md ├── 2021-08-12-grails-5-rc1-release.md ├── 2021-08-25-groovy-4-webinar.md ├── 2021-09-02-grails-deep-dive.md ├── 2021-09-15-q3-town-hall-meeting-scheduled.md ├── 2021-09-17-groovy-4-webinar.md ├── 2021-09-24-q3-town-hall-meeting.md ├── 2021-10-08-developer-advocate-announced.md ├── 2021-10-11-grails-5-ga.md ├── 2021-11-11.md ├── 2021-11-23-db-migration-plugin-update.md ├── 2021-12-06-february-2022-training-announcement.md ├── 2021-12-14-log4j2-cve.md ├── 2021-12-15-grails-five-one.md ├── 2022-01-07-2gm-town-hall-q1.md ├── 2022-01-07-gradle-enterprise-tools-and-infrastructure-partner.md ├── 2022-03-31-grails-spring-rce.md ├── 2022-04-01-jetbrains-new-tools-and-infrastructure-partner.md ├── 2022-07-18-rce-vulnerability.md ├── 2022-09-28-static-binding-bug.md ├── 2022-11-22-ss-plugin-auth-cve.md ├── 2023-02-08-repository-maint.md ├── 2023-03-17-grails-foundation-joining-unity-foundation.md ├── 2023-03-29-grails-6-m2.md ├── 2023-05-27-grails-6-rc1.md ├── 2023-05-27-img0.gif ├── 2023-07-25-introducing-grails-6.md ├── 2023-08-03-introducing-new-grails-forge.md ├── 2023-08-25-introducing-grails-spring-security-core-6.md ├── 2023-08-25-thenewselectoption.png ├── 2023-09-11-new-grails-plugin-portal.png ├── 2023-09-11-the-new-grails-plugin-portal.md ├── 2023-11-14-introducing-grails-6_1_0.md ├── 2023-12-20-cve-data-binding-dos.md ├── 2024-06-07-grails-future.md ├── 2024-06-25-grails-seven-mvp.md ├── 2024-10-01-grails-community-contributions.md ├── 2024-10-03-introducing-grails-6-2-1.md ├── 2024-11-20-introducing-grails-6-2-2.md ├── 2024-12-23-grails-7-m1.md ├── 2025-01-02-grails-community-rockstar-fredley.md ├── 2025-01-03-introducing-grails-6-2-3.md └── 2025-03-05-grails-7-m3.md ├── publish.sh ├── release.sh ├── settings.gradle └── templates └── document.html /.asf.yaml: -------------------------------------------------------------------------------- 1 | github: 2 | description: "Apache Grails Website" 3 | homepage: https://grails.apache.org/ 4 | 5 | publish: 6 | whoami: asf-site 7 | -------------------------------------------------------------------------------- /.github/workflows/gradle.yml: -------------------------------------------------------------------------------- 1 | name: Java CI 2 | on: 3 | push: 4 | branches: 5 | - master 6 | pull_request: 7 | branches: 8 | - master 9 | jobs: 10 | build: 11 | runs-on: ubuntu-latest 12 | permissions: 13 | checks: write 14 | contents: read 15 | env: 16 | WORKSPACE: ${{ github.workspace }} 17 | GRADLE_OPTS: -Xmx1500m -Dfile.encoding=UTF-8 18 | steps: 19 | - uses: actions/checkout@v4 20 | - name: Set up JDK 21 | uses: actions/setup-java@v4 22 | with: 23 | distribution: liberica 24 | java-version: '11' 25 | - name: Setup Gradle 26 | uses: gradle/actions/setup-gradle@v4 27 | with: 28 | develocity-access-key: ${{ secrets.GRADLE_ENTERPRISE_ACCESS_KEY }} 29 | - name: Run Tests 30 | run: | 31 | (set -x; ./gradlew clean check --no-daemon) 32 | env: 33 | GRADLE_ENTERPRISE_BUILD_CACHE_NODE_USER: ${{ secrets.GRADLE_ENTERPRISE_BUILD_CACHE_NODE_USER }} 34 | GRADLE_ENTERPRISE_BUILD_CACHE_NODE_KEY: ${{ secrets.GRADLE_ENTERPRISE_BUILD_CACHE_NODE_KEY }} 35 | - name: Publish Test Report 36 | if: failure() 37 | uses: scacap/action-surefire-report@v1 38 | with: 39 | github_token: ${{ secrets.GITHUB_TOKEN }} 40 | report_paths: '**/build/test-results/test/TEST-*.xml' 41 | -------------------------------------------------------------------------------- /.github/workflows/release.yml: -------------------------------------------------------------------------------- 1 | name: Release 2 | on: 3 | workflow_dispatch: 4 | inputs: 5 | grails_version: 6 | description: 'Grails Version (eg: 4.0.10)' 7 | required: true 8 | jobs: 9 | release: 10 | runs-on: ubuntu-latest 11 | env: 12 | GIT_USER_NAME: grails-build 13 | GIT_USER_EMAIL: grails-build@users.noreply.github.com 14 | steps: 15 | - name: Checkout repository 16 | uses: actions/checkout@v4 17 | with: 18 | token: ${{ secrets.GITHUB_TOKEN }} 19 | - name: Run Release Script 20 | run: ./release.sh ${{ github.event.inputs.grails_version }} 21 | - name: Commit Release 22 | run: | 23 | git config user.name ${GIT_USER_NAME} 24 | git config user.email ${GIT_USER_EMAIL} 25 | git add conf/releases.yml 26 | git commit -m "Update conf/releases.yml" -m "Add ${RELEASE} to Grails Versions list" 27 | git push 28 | env: 29 | RELEASE: ${{ github.event.inputs.grails_version }} 30 | -------------------------------------------------------------------------------- /.github/workflows/rendersite.yml: -------------------------------------------------------------------------------- 1 | name: Render Site 2 | on: workflow_dispatch 3 | jobs: 4 | build: 5 | runs-on: ubuntu-latest 6 | steps: 7 | - uses: actions/checkout@v4 8 | - name: Set up JDK 11 9 | uses: actions/setup-java@v4 10 | with: 11 | java-version: '11' 12 | distribution: liberica 13 | - name: Setup Gradle 14 | uses: gradle/actions/setup-gradle@v4 15 | with: 16 | develocity-access-key: ${{ secrets.GRADLE_ENTERPRISE_ACCESS_KEY }} 17 | - name: Render HTML for Site 18 | run: ./gradlew renderSite 19 | env: 20 | GRADLE_ENTERPRISE_BUILD_CACHE_NODE_USER: ${{ secrets.GRADLE_ENTERPRISE_BUILD_CACHE_NODE_USER }} 21 | GRADLE_ENTERPRISE_BUILD_CACHE_NODE_KEY: ${{ secrets.GRADLE_ENTERPRISE_BUILD_CACHE_NODE_KEY }} 22 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | .idea 2 | *.iml 3 | *.ipr 4 | *.iws 5 | build 6 | .gradle 7 | .classpath 8 | atlassian-ide-plugin.xml 9 | .DS_Store 10 | .project 11 | .settings/ 12 | .vscode/ 13 | .nova 14 | -------------------------------------------------------------------------------- /assets/bgimages/2015-03-01.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apache/grails-static-website/b139c6e8add79c53bda3e38e109f3f51ac44107d/assets/bgimages/2015-03-01.jpg -------------------------------------------------------------------------------- /assets/bgimages/2016-04-01-1.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apache/grails-static-website/b139c6e8add79c53bda3e38e109f3f51ac44107d/assets/bgimages/2016-04-01-1.jpg -------------------------------------------------------------------------------- /assets/bgimages/2016-04-01-2.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apache/grails-static-website/b139c6e8add79c53bda3e38e109f3f51ac44107d/assets/bgimages/2016-04-01-2.jpg -------------------------------------------------------------------------------- /assets/bgimages/2016-04-13.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apache/grails-static-website/b139c6e8add79c53bda3e38e109f3f51ac44107d/assets/bgimages/2016-04-13.jpg -------------------------------------------------------------------------------- /assets/bgimages/2016-04-27.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apache/grails-static-website/b139c6e8add79c53bda3e38e109f3f51ac44107d/assets/bgimages/2016-04-27.jpg -------------------------------------------------------------------------------- /assets/bgimages/2016-04-28.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apache/grails-static-website/b139c6e8add79c53bda3e38e109f3f51ac44107d/assets/bgimages/2016-04-28.jpg -------------------------------------------------------------------------------- /assets/bgimages/2016-05-26.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apache/grails-static-website/b139c6e8add79c53bda3e38e109f3f51ac44107d/assets/bgimages/2016-05-26.jpg -------------------------------------------------------------------------------- /assets/bgimages/2016-05-28.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apache/grails-static-website/b139c6e8add79c53bda3e38e109f3f51ac44107d/assets/bgimages/2016-05-28.jpg -------------------------------------------------------------------------------- /assets/bgimages/2016-05-31.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apache/grails-static-website/b139c6e8add79c53bda3e38e109f3f51ac44107d/assets/bgimages/2016-05-31.jpg -------------------------------------------------------------------------------- /assets/bgimages/2016-06-02.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apache/grails-static-website/b139c6e8add79c53bda3e38e109f3f51ac44107d/assets/bgimages/2016-06-02.jpg -------------------------------------------------------------------------------- /assets/bgimages/2016-06-07.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apache/grails-static-website/b139c6e8add79c53bda3e38e109f3f51ac44107d/assets/bgimages/2016-06-07.jpg -------------------------------------------------------------------------------- /assets/bgimages/2016-06-26.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apache/grails-static-website/b139c6e8add79c53bda3e38e109f3f51ac44107d/assets/bgimages/2016-06-26.jpg -------------------------------------------------------------------------------- /assets/bgimages/2016-07-06.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apache/grails-static-website/b139c6e8add79c53bda3e38e109f3f51ac44107d/assets/bgimages/2016-07-06.jpg -------------------------------------------------------------------------------- /assets/bgimages/2016-07-22.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apache/grails-static-website/b139c6e8add79c53bda3e38e109f3f51ac44107d/assets/bgimages/2016-07-22.jpg -------------------------------------------------------------------------------- /assets/bgimages/2016-08-01.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apache/grails-static-website/b139c6e8add79c53bda3e38e109f3f51ac44107d/assets/bgimages/2016-08-01.jpg -------------------------------------------------------------------------------- /assets/bgimages/2016-08-31.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apache/grails-static-website/b139c6e8add79c53bda3e38e109f3f51ac44107d/assets/bgimages/2016-08-31.jpg -------------------------------------------------------------------------------- /assets/bgimages/2016-09-12.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apache/grails-static-website/b139c6e8add79c53bda3e38e109f3f51ac44107d/assets/bgimages/2016-09-12.jpg -------------------------------------------------------------------------------- /assets/bgimages/2016-09-28.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apache/grails-static-website/b139c6e8add79c53bda3e38e109f3f51ac44107d/assets/bgimages/2016-09-28.jpg -------------------------------------------------------------------------------- /assets/bgimages/2016-10-03.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apache/grails-static-website/b139c6e8add79c53bda3e38e109f3f51ac44107d/assets/bgimages/2016-10-03.jpg -------------------------------------------------------------------------------- /assets/bgimages/2016-11-01.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apache/grails-static-website/b139c6e8add79c53bda3e38e109f3f51ac44107d/assets/bgimages/2016-11-01.jpg -------------------------------------------------------------------------------- /assets/bgimages/2016-11-10.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apache/grails-static-website/b139c6e8add79c53bda3e38e109f3f51ac44107d/assets/bgimages/2016-11-10.jpg -------------------------------------------------------------------------------- /assets/bgimages/2016-11-14.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apache/grails-static-website/b139c6e8add79c53bda3e38e109f3f51ac44107d/assets/bgimages/2016-11-14.jpg -------------------------------------------------------------------------------- /assets/bgimages/2016-12-14.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apache/grails-static-website/b139c6e8add79c53bda3e38e109f3f51ac44107d/assets/bgimages/2016-12-14.jpg -------------------------------------------------------------------------------- /assets/bgimages/2017-01-20-1.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apache/grails-static-website/b139c6e8add79c53bda3e38e109f3f51ac44107d/assets/bgimages/2017-01-20-1.jpg -------------------------------------------------------------------------------- /assets/bgimages/2017-01-20-2.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apache/grails-static-website/b139c6e8add79c53bda3e38e109f3f51ac44107d/assets/bgimages/2017-01-20-2.jpg -------------------------------------------------------------------------------- /assets/bgimages/2017-01-20-3.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apache/grails-static-website/b139c6e8add79c53bda3e38e109f3f51ac44107d/assets/bgimages/2017-01-20-3.jpg -------------------------------------------------------------------------------- /assets/bgimages/2017-01-20-4.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apache/grails-static-website/b139c6e8add79c53bda3e38e109f3f51ac44107d/assets/bgimages/2017-01-20-4.jpg -------------------------------------------------------------------------------- /assets/bgimages/2017-03-27.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apache/grails-static-website/b139c6e8add79c53bda3e38e109f3f51ac44107d/assets/bgimages/2017-03-27.jpg -------------------------------------------------------------------------------- /assets/bgimages/2017-04-02.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apache/grails-static-website/b139c6e8add79c53bda3e38e109f3f51ac44107d/assets/bgimages/2017-04-02.jpg -------------------------------------------------------------------------------- /assets/bgimages/2017-04-12.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apache/grails-static-website/b139c6e8add79c53bda3e38e109f3f51ac44107d/assets/bgimages/2017-04-12.jpg -------------------------------------------------------------------------------- /assets/bgimages/2017-05-09.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apache/grails-static-website/b139c6e8add79c53bda3e38e109f3f51ac44107d/assets/bgimages/2017-05-09.jpg -------------------------------------------------------------------------------- /assets/bgimages/2017-06-27.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apache/grails-static-website/b139c6e8add79c53bda3e38e109f3f51ac44107d/assets/bgimages/2017-06-27.jpg -------------------------------------------------------------------------------- /assets/bgimages/2017-06-28.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apache/grails-static-website/b139c6e8add79c53bda3e38e109f3f51ac44107d/assets/bgimages/2017-06-28.jpg -------------------------------------------------------------------------------- /assets/bgimages/2017-07-12.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apache/grails-static-website/b139c6e8add79c53bda3e38e109f3f51ac44107d/assets/bgimages/2017-07-12.jpg -------------------------------------------------------------------------------- /assets/bgimages/2017-07-26.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apache/grails-static-website/b139c6e8add79c53bda3e38e109f3f51ac44107d/assets/bgimages/2017-07-26.jpg -------------------------------------------------------------------------------- /assets/bgimages/2017-10-30.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apache/grails-static-website/b139c6e8add79c53bda3e38e109f3f51ac44107d/assets/bgimages/2017-10-30.jpg -------------------------------------------------------------------------------- /assets/bgimages/2017-11-09.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apache/grails-static-website/b139c6e8add79c53bda3e38e109f3f51ac44107d/assets/bgimages/2017-11-09.jpg -------------------------------------------------------------------------------- /assets/bgimages/2017-11-21.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apache/grails-static-website/b139c6e8add79c53bda3e38e109f3f51ac44107d/assets/bgimages/2017-11-21.jpg -------------------------------------------------------------------------------- /assets/bgimages/2017-11-30.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apache/grails-static-website/b139c6e8add79c53bda3e38e109f3f51ac44107d/assets/bgimages/2017-11-30.jpg -------------------------------------------------------------------------------- /assets/bgimages/2017-12-05.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apache/grails-static-website/b139c6e8add79c53bda3e38e109f3f51ac44107d/assets/bgimages/2017-12-05.jpg -------------------------------------------------------------------------------- /assets/bgimages/2018-02-08.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apache/grails-static-website/b139c6e8add79c53bda3e38e109f3f51ac44107d/assets/bgimages/2018-02-08.jpg -------------------------------------------------------------------------------- /assets/bgimages/2018-02-09.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apache/grails-static-website/b139c6e8add79c53bda3e38e109f3f51ac44107d/assets/bgimages/2018-02-09.jpg -------------------------------------------------------------------------------- /assets/bgimages/2018-03-02.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apache/grails-static-website/b139c6e8add79c53bda3e38e109f3f51ac44107d/assets/bgimages/2018-03-02.jpg -------------------------------------------------------------------------------- /assets/bgimages/2018-03-09.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apache/grails-static-website/b139c6e8add79c53bda3e38e109f3f51ac44107d/assets/bgimages/2018-03-09.jpg -------------------------------------------------------------------------------- /assets/bgimages/2018-04-05.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apache/grails-static-website/b139c6e8add79c53bda3e38e109f3f51ac44107d/assets/bgimages/2018-04-05.jpg -------------------------------------------------------------------------------- /assets/bgimages/2018-04-06.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apache/grails-static-website/b139c6e8add79c53bda3e38e109f3f51ac44107d/assets/bgimages/2018-04-06.jpg -------------------------------------------------------------------------------- /assets/bgimages/2018-05-18.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apache/grails-static-website/b139c6e8add79c53bda3e38e109f3f51ac44107d/assets/bgimages/2018-05-18.jpg -------------------------------------------------------------------------------- /assets/bgimages/2018-05-24.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apache/grails-static-website/b139c6e8add79c53bda3e38e109f3f51ac44107d/assets/bgimages/2018-05-24.jpg -------------------------------------------------------------------------------- /assets/bgimages/2018-06-15.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apache/grails-static-website/b139c6e8add79c53bda3e38e109f3f51ac44107d/assets/bgimages/2018-06-15.jpg -------------------------------------------------------------------------------- /assets/bgimages/2018-06-22.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apache/grails-static-website/b139c6e8add79c53bda3e38e109f3f51ac44107d/assets/bgimages/2018-06-22.jpg -------------------------------------------------------------------------------- /assets/bgimages/2018-08-22-1.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apache/grails-static-website/b139c6e8add79c53bda3e38e109f3f51ac44107d/assets/bgimages/2018-08-22-1.jpg -------------------------------------------------------------------------------- /assets/bgimages/2018-08-22-2.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apache/grails-static-website/b139c6e8add79c53bda3e38e109f3f51ac44107d/assets/bgimages/2018-08-22-2.jpg -------------------------------------------------------------------------------- /assets/bgimages/2018-09-23.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apache/grails-static-website/b139c6e8add79c53bda3e38e109f3f51ac44107d/assets/bgimages/2018-09-23.jpg -------------------------------------------------------------------------------- /assets/bgimages/2018-10-02.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apache/grails-static-website/b139c6e8add79c53bda3e38e109f3f51ac44107d/assets/bgimages/2018-10-02.jpg -------------------------------------------------------------------------------- /assets/bgimages/2018-10-12.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apache/grails-static-website/b139c6e8add79c53bda3e38e109f3f51ac44107d/assets/bgimages/2018-10-12.jpg -------------------------------------------------------------------------------- /assets/bgimages/2019-01-07.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apache/grails-static-website/b139c6e8add79c53bda3e38e109f3f51ac44107d/assets/bgimages/2019-01-07.jpg -------------------------------------------------------------------------------- /assets/bgimages/2019-01-30.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apache/grails-static-website/b139c6e8add79c53bda3e38e109f3f51ac44107d/assets/bgimages/2019-01-30.jpg -------------------------------------------------------------------------------- /assets/bgimages/2019-02-19.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apache/grails-static-website/b139c6e8add79c53bda3e38e109f3f51ac44107d/assets/bgimages/2019-02-19.jpg -------------------------------------------------------------------------------- /assets/bgimages/2019-03-27.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apache/grails-static-website/b139c6e8add79c53bda3e38e109f3f51ac44107d/assets/bgimages/2019-03-27.jpg -------------------------------------------------------------------------------- /assets/bgimages/2019-05-24.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apache/grails-static-website/b139c6e8add79c53bda3e38e109f3f51ac44107d/assets/bgimages/2019-05-24.jpg -------------------------------------------------------------------------------- /assets/bgimages/2019-05-30.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apache/grails-static-website/b139c6e8add79c53bda3e38e109f3f51ac44107d/assets/bgimages/2019-05-30.jpg -------------------------------------------------------------------------------- /assets/bgimages/2019-06-18.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apache/grails-static-website/b139c6e8add79c53bda3e38e109f3f51ac44107d/assets/bgimages/2019-06-18.jpg -------------------------------------------------------------------------------- /assets/bgimages/2019-07-11.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apache/grails-static-website/b139c6e8add79c53bda3e38e109f3f51ac44107d/assets/bgimages/2019-07-11.jpg -------------------------------------------------------------------------------- /assets/bgimages/2019-08-27.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apache/grails-static-website/b139c6e8add79c53bda3e38e109f3f51ac44107d/assets/bgimages/2019-08-27.jpg -------------------------------------------------------------------------------- /assets/bgimages/2019-12-20.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apache/grails-static-website/b139c6e8add79c53bda3e38e109f3f51ac44107d/assets/bgimages/2019-12-20.jpg -------------------------------------------------------------------------------- /assets/bgimages/2020-09-10.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apache/grails-static-website/b139c6e8add79c53bda3e38e109f3f51ac44107d/assets/bgimages/2020-09-10.jpg -------------------------------------------------------------------------------- /assets/bgimages/2020-10-01.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apache/grails-static-website/b139c6e8add79c53bda3e38e109f3f51ac44107d/assets/bgimages/2020-10-01.jpg -------------------------------------------------------------------------------- /assets/bgimages/2020-10-16.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apache/grails-static-website/b139c6e8add79c53bda3e38e109f3f51ac44107d/assets/bgimages/2020-10-16.jpg -------------------------------------------------------------------------------- /assets/bgimages/2020-10-26.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apache/grails-static-website/b139c6e8add79c53bda3e38e109f3f51ac44107d/assets/bgimages/2020-10-26.jpg -------------------------------------------------------------------------------- /assets/bgimages/grails-blog-index-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apache/grails-static-website/b139c6e8add79c53bda3e38e109f3f51ac44107d/assets/bgimages/grails-blog-index-1.png -------------------------------------------------------------------------------- /assets/bgimages/grails-blog-index-2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apache/grails-static-website/b139c6e8add79c53bda3e38e109f3f51ac44107d/assets/bgimages/grails-blog-index-2.png -------------------------------------------------------------------------------- /assets/bgimages/grails-blog-index-3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apache/grails-static-website/b139c6e8add79c53bda3e38e109f3f51ac44107d/assets/bgimages/grails-blog-index-3.png -------------------------------------------------------------------------------- /assets/bgimages/grails-blog-index-4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apache/grails-static-website/b139c6e8add79c53bda3e38e109f3f51ac44107d/assets/bgimages/grails-blog-index-4.png -------------------------------------------------------------------------------- /assets/bgimages/grails-blog-index-5.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apache/grails-static-website/b139c6e8add79c53bda3e38e109f3f51ac44107d/assets/bgimages/grails-blog-index-5.png -------------------------------------------------------------------------------- /assets/bgimages/grails-blog-index-6.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apache/grails-static-website/b139c6e8add79c53bda3e38e109f3f51ac44107d/assets/bgimages/grails-blog-index-6.png -------------------------------------------------------------------------------- /assets/bgimages/grails-blog-index-security.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apache/grails-static-website/b139c6e8add79c53bda3e38e109f3f51ac44107d/assets/bgimages/grails-blog-index-security.png -------------------------------------------------------------------------------- /assets/bgimages/quickcast.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apache/grails-static-website/b139c6e8add79c53bda3e38e109f3f51ac44107d/assets/bgimages/quickcast.jpg -------------------------------------------------------------------------------- /assets/files/support-docs/grails-support-terms-and-conditions.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apache/grails-static-website/b139c6e8add79c53bda3e38e109f3f51ac44107d/assets/files/support-docs/grails-support-terms-and-conditions.pdf -------------------------------------------------------------------------------- /assets/files/wrapper-issue7/grails3/grails-wrapper.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apache/grails-static-website/b139c6e8add79c53bda3e38e109f3f51ac44107d/assets/files/wrapper-issue7/grails3/grails-wrapper.jar -------------------------------------------------------------------------------- /assets/files/wrapper-issue7/grails3/grails-wrapper.jar.md5: -------------------------------------------------------------------------------- 1 | 121f9336c8933a2ada9bd236d10fb876 grails-wrapper.jar 2 | -------------------------------------------------------------------------------- /assets/files/wrapper-issue7/grails4/grails-wrapper.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apache/grails-static-website/b139c6e8add79c53bda3e38e109f3f51ac44107d/assets/files/wrapper-issue7/grails4/grails-wrapper.jar -------------------------------------------------------------------------------- /assets/files/wrapper-issue7/grails4/grails-wrapper.jar.md5: -------------------------------------------------------------------------------- 1 | f41358fa6f48c8e84d50ca88702aed37 grails-wrapper.jar 2 | -------------------------------------------------------------------------------- /assets/fonts/archia-bold.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apache/grails-static-website/b139c6e8add79c53bda3e38e109f3f51ac44107d/assets/fonts/archia-bold.eot -------------------------------------------------------------------------------- /assets/fonts/archia-bold.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apache/grails-static-website/b139c6e8add79c53bda3e38e109f3f51ac44107d/assets/fonts/archia-bold.ttf -------------------------------------------------------------------------------- /assets/fonts/archia-bold.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apache/grails-static-website/b139c6e8add79c53bda3e38e109f3f51ac44107d/assets/fonts/archia-bold.woff -------------------------------------------------------------------------------- /assets/fonts/archia-bold.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apache/grails-static-website/b139c6e8add79c53bda3e38e109f3f51ac44107d/assets/fonts/archia-bold.woff2 -------------------------------------------------------------------------------- /assets/fonts/archia-light.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apache/grails-static-website/b139c6e8add79c53bda3e38e109f3f51ac44107d/assets/fonts/archia-light.eot -------------------------------------------------------------------------------- /assets/fonts/archia-light.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apache/grails-static-website/b139c6e8add79c53bda3e38e109f3f51ac44107d/assets/fonts/archia-light.ttf -------------------------------------------------------------------------------- /assets/fonts/archia-light.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apache/grails-static-website/b139c6e8add79c53bda3e38e109f3f51ac44107d/assets/fonts/archia-light.woff -------------------------------------------------------------------------------- /assets/fonts/archia-light.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apache/grails-static-website/b139c6e8add79c53bda3e38e109f3f51ac44107d/assets/fonts/archia-light.woff2 -------------------------------------------------------------------------------- /assets/fonts/archia-medium.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apache/grails-static-website/b139c6e8add79c53bda3e38e109f3f51ac44107d/assets/fonts/archia-medium.eot -------------------------------------------------------------------------------- /assets/fonts/archia-medium.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apache/grails-static-website/b139c6e8add79c53bda3e38e109f3f51ac44107d/assets/fonts/archia-medium.ttf -------------------------------------------------------------------------------- /assets/fonts/archia-medium.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apache/grails-static-website/b139c6e8add79c53bda3e38e109f3f51ac44107d/assets/fonts/archia-medium.woff -------------------------------------------------------------------------------- /assets/fonts/archia-medium.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apache/grails-static-website/b139c6e8add79c53bda3e38e109f3f51ac44107d/assets/fonts/archia-medium.woff2 -------------------------------------------------------------------------------- /assets/fonts/archia-regular.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apache/grails-static-website/b139c6e8add79c53bda3e38e109f3f51ac44107d/assets/fonts/archia-regular.eot -------------------------------------------------------------------------------- /assets/fonts/archia-regular.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apache/grails-static-website/b139c6e8add79c53bda3e38e109f3f51ac44107d/assets/fonts/archia-regular.ttf -------------------------------------------------------------------------------- /assets/fonts/archia-regular.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apache/grails-static-website/b139c6e8add79c53bda3e38e109f3f51ac44107d/assets/fonts/archia-regular.woff -------------------------------------------------------------------------------- /assets/fonts/archia-regular.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apache/grails-static-website/b139c6e8add79c53bda3e38e109f3f51ac44107d/assets/fonts/archia-regular.woff2 -------------------------------------------------------------------------------- /assets/fonts/archia-semibold.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apache/grails-static-website/b139c6e8add79c53bda3e38e109f3f51ac44107d/assets/fonts/archia-semibold.eot -------------------------------------------------------------------------------- /assets/fonts/archia-semibold.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apache/grails-static-website/b139c6e8add79c53bda3e38e109f3f51ac44107d/assets/fonts/archia-semibold.ttf -------------------------------------------------------------------------------- /assets/fonts/archia-semibold.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apache/grails-static-website/b139c6e8add79c53bda3e38e109f3f51ac44107d/assets/fonts/archia-semibold.woff -------------------------------------------------------------------------------- /assets/fonts/archia-semibold.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apache/grails-static-website/b139c6e8add79c53bda3e38e109f3f51ac44107d/assets/fonts/archia-semibold.woff2 -------------------------------------------------------------------------------- /assets/fonts/archia-thin.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apache/grails-static-website/b139c6e8add79c53bda3e38e109f3f51ac44107d/assets/fonts/archia-thin.eot -------------------------------------------------------------------------------- /assets/fonts/archia-thin.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apache/grails-static-website/b139c6e8add79c53bda3e38e109f3f51ac44107d/assets/fonts/archia-thin.ttf -------------------------------------------------------------------------------- /assets/fonts/archia-thin.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apache/grails-static-website/b139c6e8add79c53bda3e38e109f3f51ac44107d/assets/fonts/archia-thin.woff -------------------------------------------------------------------------------- /assets/fonts/archia-thin.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apache/grails-static-website/b139c6e8add79c53bda3e38e109f3f51ac44107d/assets/fonts/archia-thin.woff2 -------------------------------------------------------------------------------- /assets/fonts/roboto-light.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apache/grails-static-website/b139c6e8add79c53bda3e38e109f3f51ac44107d/assets/fonts/roboto-light.eot -------------------------------------------------------------------------------- /assets/fonts/roboto-light.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apache/grails-static-website/b139c6e8add79c53bda3e38e109f3f51ac44107d/assets/fonts/roboto-light.ttf -------------------------------------------------------------------------------- /assets/fonts/roboto-light.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apache/grails-static-website/b139c6e8add79c53bda3e38e109f3f51ac44107d/assets/fonts/roboto-light.woff -------------------------------------------------------------------------------- /assets/fonts/roboto-medium.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apache/grails-static-website/b139c6e8add79c53bda3e38e109f3f51ac44107d/assets/fonts/roboto-medium.eot -------------------------------------------------------------------------------- /assets/fonts/roboto-medium.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apache/grails-static-website/b139c6e8add79c53bda3e38e109f3f51ac44107d/assets/fonts/roboto-medium.ttf -------------------------------------------------------------------------------- /assets/fonts/roboto-medium.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apache/grails-static-website/b139c6e8add79c53bda3e38e109f3f51ac44107d/assets/fonts/roboto-medium.woff -------------------------------------------------------------------------------- /assets/fonts/roboto-regular.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apache/grails-static-website/b139c6e8add79c53bda3e38e109f3f51ac44107d/assets/fonts/roboto-regular.eot -------------------------------------------------------------------------------- /assets/fonts/roboto-regular.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apache/grails-static-website/b139c6e8add79c53bda3e38e109f3f51ac44107d/assets/fonts/roboto-regular.ttf -------------------------------------------------------------------------------- /assets/fonts/roboto-regular.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apache/grails-static-website/b139c6e8add79c53bda3e38e109f3f51ac44107d/assets/fonts/roboto-regular.woff -------------------------------------------------------------------------------- /assets/images/async.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 16 | 17 | 18 | 19 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | -------------------------------------------------------------------------------- /assets/images/asynchronous.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 6 | 7 | 8 | 9 | 10 | 11 | 13 | 14 | 15 | 16 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | -------------------------------------------------------------------------------- /assets/images/banner.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apache/grails-static-website/b139c6e8add79c53bda3e38e109f3f51ac44107d/assets/images/banner.png -------------------------------------------------------------------------------- /assets/images/banners/nominateyourggrailsrockstar.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apache/grails-static-website/b139c6e8add79c53bda3e38e109f3f51ac44107d/assets/images/banners/nominateyourggrailsrockstar.png -------------------------------------------------------------------------------- /assets/images/bg.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apache/grails-static-website/b139c6e8add79c53bda3e38e109f3f51ac44107d/assets/images/bg.png -------------------------------------------------------------------------------- /assets/images/bgtransparent.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apache/grails-static-website/b139c6e8add79c53bda3e38e109f3f51ac44107d/assets/images/bgtransparent.png -------------------------------------------------------------------------------- /assets/images/bintray.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | bintray 5 | Created with Sketch. 6 | 7 | 8 | 9 | 10 | -------------------------------------------------------------------------------- /assets/images/books/Kousen-MJG.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apache/grails-static-website/b139c6e8add79c53bda3e38e109f3f51ac44107d/assets/images/books/Kousen-MJG.png -------------------------------------------------------------------------------- /assets/images/books/bbeckwith_cover.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apache/grails-static-website/b139c6e8add79c53bda3e38e109f3f51ac44107d/assets/images/books/bbeckwith_cover.gif -------------------------------------------------------------------------------- /assets/images/books/bklein_cover.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apache/grails-static-website/b139c6e8add79c53bda3e38e109f3f51ac44107d/assets/images/books/bklein_cover.jpg -------------------------------------------------------------------------------- /assets/images/books/g2cook.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apache/grails-static-website/b139c6e8add79c53bda3e38e109f3f51ac44107d/assets/images/books/g2cook.jpg -------------------------------------------------------------------------------- /assets/images/books/gdsl.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apache/grails-static-website/b139c6e8add79c53bda3e38e109f3f51ac44107d/assets/images/books/gdsl.jpg -------------------------------------------------------------------------------- /assets/images/books/ggood.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apache/grails-static-website/b139c6e8add79c53bda3e38e109f3f51ac44107d/assets/images/books/ggood.jpg -------------------------------------------------------------------------------- /assets/images/books/grails_3_step_by_step.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apache/grails-static-website/b139c6e8add79c53bda3e38e109f3f51ac44107d/assets/images/books/grails_3_step_by_step.png -------------------------------------------------------------------------------- /assets/images/books/grails_weissmann.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apache/grails-static-website/b139c6e8add79c53bda3e38e109f3f51ac44107d/assets/images/books/grails_weissmann.png -------------------------------------------------------------------------------- /assets/images/books/grailsgood.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apache/grails-static-website/b139c6e8add79c53bda3e38e109f3f51ac44107d/assets/images/books/grailsgood.png -------------------------------------------------------------------------------- /assets/images/books/grocher_jbrown_cover.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apache/grails-static-website/b139c6e8add79c53bda3e38e109f3f51ac44107d/assets/images/books/grocher_jbrown_cover.jpg -------------------------------------------------------------------------------- /assets/images/books/gsmith2_cover150.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apache/grails-static-website/b139c6e8add79c53bda3e38e109f3f51ac44107d/assets/images/books/gsmith2_cover150.jpg -------------------------------------------------------------------------------- /assets/images/books/pratical-grails-3-book-cover.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apache/grails-static-website/b139c6e8add79c53bda3e38e109f3f51ac44107d/assets/images/books/pratical-grails-3-book-cover.png -------------------------------------------------------------------------------- /assets/images/books/regina.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apache/grails-static-website/b139c6e8add79c53bda3e38e109f3f51ac44107d/assets/images/books/regina.png -------------------------------------------------------------------------------- /assets/images/books/vslg2.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apache/grails-static-website/b139c6e8add79c53bda3e38e109f3f51ac44107d/assets/images/books/vslg2.jpg -------------------------------------------------------------------------------- /assets/images/brinqa.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apache/grails-static-website/b139c6e8add79c53bda3e38e109f3f51ac44107d/assets/images/brinqa.png -------------------------------------------------------------------------------- /assets/images/caret.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apache/grails-static-website/b139c6e8add79c53bda3e38e109f3f51ac44107d/assets/images/caret.png -------------------------------------------------------------------------------- /assets/images/clippy.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /assets/images/confs/gr8confeu.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apache/grails-static-website/b139c6e8add79c53bda3e38e109f3f51ac44107d/assets/images/confs/gr8confeu.png -------------------------------------------------------------------------------- /assets/images/confs/gr8confus.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apache/grails-static-website/b139c6e8add79c53bda3e38e109f3f51ac44107d/assets/images/confs/gr8confus.png -------------------------------------------------------------------------------- /assets/images/confs/greach.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apache/grails-static-website/b139c6e8add79c53bda3e38e109f3f51ac44107d/assets/images/confs/greach.png -------------------------------------------------------------------------------- /assets/images/david-estes-2020-rock-star.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apache/grails-static-website/b139c6e8add79c53bda3e38e109f3f51ac44107d/assets/images/david-estes-2020-rock-star.png -------------------------------------------------------------------------------- /assets/images/develocity-logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apache/grails-static-website/b139c6e8add79c53bda3e38e109f3f51ac44107d/assets/images/develocity-logo.png -------------------------------------------------------------------------------- /assets/images/documentation.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 6 | 7 | 8 | 9 | 10 | 18 | 19 | 20 | -------------------------------------------------------------------------------- /assets/images/download.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | download 5 | Created with Sketch. 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | -------------------------------------------------------------------------------- /assets/images/dsl.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apache/grails-static-website/b139c6e8add79c53bda3e38e109f3f51ac44107d/assets/images/dsl.png -------------------------------------------------------------------------------- /assets/images/eric_helgeson.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apache/grails-static-website/b139c6e8add79c53bda3e38e109f3f51ac44107d/assets/images/eric_helgeson.png -------------------------------------------------------------------------------- /assets/images/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apache/grails-static-website/b139c6e8add79c53bda3e38e109f3f51ac44107d/assets/images/favicon.ico -------------------------------------------------------------------------------- /assets/images/favicon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apache/grails-static-website/b139c6e8add79c53bda3e38e109f3f51ac44107d/assets/images/favicon.png -------------------------------------------------------------------------------- /assets/images/flatlearningcurve.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apache/grails-static-website/b139c6e8add79c53bda3e38e109f3f51ac44107d/assets/images/flatlearningcurve.png -------------------------------------------------------------------------------- /assets/images/foundation-og.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apache/grails-static-website/b139c6e8add79c53bda3e38e109f3f51ac44107d/assets/images/foundation-og.png -------------------------------------------------------------------------------- /assets/images/githubstar.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apache/grails-static-website/b139c6e8add79c53bda3e38e109f3f51ac44107d/assets/images/githubstar.png -------------------------------------------------------------------------------- /assets/images/gorm.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apache/grails-static-website/b139c6e8add79c53bda3e38e109f3f51ac44107d/assets/images/gorm.png -------------------------------------------------------------------------------- /assets/images/gorm_logo.sketch: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apache/grails-static-website/b139c6e8add79c53bda3e38e109f3f51ac44107d/assets/images/gorm_logo.sketch -------------------------------------------------------------------------------- /assets/images/gormfavicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apache/grails-static-website/b139c6e8add79c53bda3e38e109f3f51ac44107d/assets/images/gormfavicon.ico -------------------------------------------------------------------------------- /assets/images/gormfavicon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apache/grails-static-website/b139c6e8add79c53bda3e38e109f3f51ac44107d/assets/images/gormfavicon.png -------------------------------------------------------------------------------- /assets/images/graeme.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apache/grails-static-website/b139c6e8add79c53bda3e38e109f3f51ac44107d/assets/images/graeme.png -------------------------------------------------------------------------------- /assets/images/grails.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apache/grails-static-website/b139c6e8add79c53bda3e38e109f3f51ac44107d/assets/images/grails.png -------------------------------------------------------------------------------- /assets/images/grailsangular.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 15 | 16 | 17 | 18 | -------------------------------------------------------------------------------- /assets/images/grailsbanner.sketch: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apache/grails-static-website/b139c6e8add79c53bda3e38e109f3f51ac44107d/assets/images/grailsbanner.sketch -------------------------------------------------------------------------------- /assets/images/groovy.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apache/grails-static-website/b139c6e8add79c53bda3e38e109f3f51ac44107d/assets/images/groovy.png -------------------------------------------------------------------------------- /assets/images/halloffame.sketch: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apache/grails-static-website/b139c6e8add79c53bda3e38e109f3f51ac44107d/assets/images/halloffame.sketch -------------------------------------------------------------------------------- /assets/images/hibernate.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | hibernate 5 | Created with Sketch. 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | -------------------------------------------------------------------------------- /assets/images/idesupport.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apache/grails-static-website/b139c6e8add79c53bda3e38e109f3f51ac44107d/assets/images/idesupport.png -------------------------------------------------------------------------------- /assets/images/james-fredley-2025-rock-star.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apache/grails-static-website/b139c6e8add79c53bda3e38e109f3f51ac44107d/assets/images/james-fredley-2025-rock-star.png -------------------------------------------------------------------------------- /assets/images/java.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apache/grails-static-website/b139c6e8add79c53bda3e38e109f3f51ac44107d/assets/images/java.png -------------------------------------------------------------------------------- /assets/images/jeff_scott_brown.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apache/grails-static-website/b139c6e8add79c53bda3e38e109f3f51ac44107d/assets/images/jeff_scott_brown.png -------------------------------------------------------------------------------- /assets/images/kenkousen.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apache/grails-static-website/b139c6e8add79c53bda3e38e109f3f51ac44107d/assets/images/kenkousen.png -------------------------------------------------------------------------------- /assets/images/latestguides.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 6 | 7 | 11 | 15 | 16 | 17 | -------------------------------------------------------------------------------- /assets/images/linkedin.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 6 | 11 | 12 | -------------------------------------------------------------------------------- /assets/images/ocigrailsteam.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apache/grails-static-website/b139c6e8add79c53bda3e38e109f3f51ac44107d/assets/images/ocigrailsteam.png -------------------------------------------------------------------------------- /assets/images/profiles.sketch: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apache/grails-static-website/b139c6e8add79c53bda3e38e109f3f51ac44107d/assets/images/profiles.sketch -------------------------------------------------------------------------------- /assets/images/restapis.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | restapis 5 | Created with Sketch. 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | { 15 | 16 | 17 | { 18 | 19 | 20 | 21 | 22 | 23 | -------------------------------------------------------------------------------- /assets/images/scroll-up-icon.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | -------------------------------------------------------------------------------- /assets/images/scroll-up-icon2.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | -------------------------------------------------------------------------------- /assets/images/security.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | security 5 | Created with Sketch. 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | -------------------------------------------------------------------------------- /assets/images/source.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | source 5 | Created with Sketch. 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | -------------------------------------------------------------------------------- /assets/images/sponsor/oci-sponsor.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apache/grails-static-website/b139c6e8add79c53bda3e38e109f3f51ac44107d/assets/images/sponsor/oci-sponsor.png -------------------------------------------------------------------------------- /assets/images/testimoniallogos.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apache/grails-static-website/b139c6e8add79c53bda3e38e109f3f51ac44107d/assets/images/testimoniallogos.png -------------------------------------------------------------------------------- /assets/images/testing.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 6 | 7 | 8 | 9 | 12 | 13 | -------------------------------------------------------------------------------- /assets/images/update.sketch: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apache/grails-static-website/b139c6e8add79c53bda3e38e109f3f51ac44107d/assets/images/update.sketch -------------------------------------------------------------------------------- /assets/images/upgrade.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | upgrade 5 | Created with Sketch. 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | -------------------------------------------------------------------------------- /assets/images/video.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apache/grails-static-website/b139c6e8add79c53bda3e38e109f3f51ac44107d/assets/images/video.png -------------------------------------------------------------------------------- /assets/images/view.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 6 | 7 | 10 | 11 | -------------------------------------------------------------------------------- /assets/images/vue.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | vue 5 | Created with Sketch. 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | -------------------------------------------------------------------------------- /assets/images/x-twitter.sketch: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apache/grails-static-website/b139c6e8add79c53bda3e38e109f3f51ac44107d/assets/images/x-twitter.sketch -------------------------------------------------------------------------------- /assets/images/x-twitter.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | Group 4 | 5 | 6 | 7 | 10 | 11 | 12 | -------------------------------------------------------------------------------- /assets/javascripts/navigation.js: -------------------------------------------------------------------------------- 1 | function show(showId, hideId) { 2 | document.getElementById(showId).style.display = "block" 3 | document.getElementById(hideId).style.display = "none" 4 | } -------------------------------------------------------------------------------- /assets/javascripts/plugins.js: -------------------------------------------------------------------------------- 1 | let pluginsDiv; 2 | let defaultPluginList; 3 | let pluginsContainer; 4 | let queryInputOffsetTop = document.getElementById("query") 5 | let searchResultsDiv 6 | 7 | window.addEventListener("load", (event) => { 8 | searchResultsDiv = document.querySelector("div.searchresults") 9 | pluginsDiv = document.getElementsByClassName("allplugins"); 10 | pluginsContainer = document.querySelector("div.plugins"); 11 | if (queryInputOffsetTop !== null){ 12 | queryInputOffsetTop = queryInputOffsetTop.offsetTop; 13 | } 14 | if (pluginsDiv.length > 0 && pluginsDiv[0].display !== "none") { 15 | defaultPluginList = Array.from(pluginsDiv[0].getElementsByClassName("plugin")).slice(); 16 | paginate(defaultPluginList, max, pluginsContainer, paginationContainerClass); 17 | } 18 | }) 19 | -------------------------------------------------------------------------------- /assets/stylesheets/paginate.css: -------------------------------------------------------------------------------- 1 | .pagination-container { 2 | display: flex; 3 | flex-wrap: wrap; 4 | justify-content: flex-start; 5 | align-items: center; 6 | margin-top: 20px; 7 | } 8 | 9 | .pagination-container a { 10 | color: black; 11 | float: left; 12 | padding: 8px 16px; 13 | text-decoration: none; 14 | } 15 | 16 | .pagination-container { 17 | display: inline-flex; 18 | border-radius: 5px; 19 | overflow: hidden; 20 | } 21 | 22 | .pagination-container a { 23 | color: black; 24 | padding: 8px 16px; 25 | text-decoration: none; 26 | border: 1px solid #ddd; 27 | border-right: none; 28 | background-color: #f1f1f1; 29 | transition: background-color 0.3s ease-in-out; 30 | } 31 | 32 | .pagination-container a:first-child { 33 | border-top-left-radius: 5px; 34 | border-bottom-left-radius: 5px; 35 | } 36 | 37 | .pagination-container a:last-child { 38 | border-right: 1px solid #ddd; 39 | border-top-right-radius: 5px; 40 | border-bottom-right-radius: 5px; 41 | } 42 | 43 | .pagination-container a.active { 44 | background-color: #4caf50; 45 | color: white; 46 | border: none; 47 | } 48 | 49 | .pagination-container a:hover:not(.active) { 50 | background-color: #ddd; 51 | } 52 | -------------------------------------------------------------------------------- /assets/stylesheets/plugin.css: -------------------------------------------------------------------------------- 1 | ul, ol { 2 | padding-left: 0; 3 | } 4 | 5 | li.plugin { 6 | padding: 24px; 7 | border-radius: 1px; 8 | box-shadow: 0 8px 17px 0 rgba(0, 0, 0, 0.2), 0 6px 20px 0 rgba(0, 0, 0, 0.19); 9 | -webkit-box-shadow: 0 8px 17px 0 rgba(0, 0, 0, 0.2), 0 6px 20px 0 rgba(0, 0, 0, 0.19); 10 | } 11 | 12 | div.twocolumns div.column { 13 | width: 44.326906%; 14 | padding: 15px; 15 | } 16 | 17 | article.quote, .guidegroup { 18 | border-top: 0; 19 | padding-top: 0px; 20 | } 21 | 22 | .columnheader { 23 | margin-top: 50px; 24 | margin-bottom: 10px; 25 | } 26 | -------------------------------------------------------------------------------- /assets/stylesheets/trademark-policy.css: -------------------------------------------------------------------------------- 1 | h2 { 2 | margin-top: 3rem; 3 | margin-bottom: 2rem; 4 | font-weight: 100; 5 | text-indent: .5ch; 6 | } 7 | 8 | p + p { 9 | margin-top: 2.2rem; 10 | } 11 | 12 | .pre-footer { 13 | margin-top: 3rem; 14 | } 15 | 16 | -------------------------------------------------------------------------------- /build.gradle: -------------------------------------------------------------------------------- 1 | import org.grails.gradle.GrailsWebsitePlugin 2 | 3 | apply plugin: GrailsWebsitePlugin 4 | 5 | grails { 6 | assets = file("assets") 7 | profiles = file("conf/profiles.yml") 8 | modules = file("conf/modules.yml") 9 | releases = file("conf/releases.yml") 10 | questions = file("conf/questions.yml") 11 | posts = file("posts") 12 | minutes = file("minutes") 13 | pages = file("pages") 14 | template = file("templates/document.html") 15 | output = project.buildDir 16 | title = 'Grails framework' 17 | url = System.getenv("GRAILS_WS_URL") ?: 'https://grails.org' 18 | description = 'A powerful Groovy-based web application framework for the JVM built on top of Spring Boot' 19 | keywords = ['grails','jvm','framework','groovy', 'gradle', 'spring-boot', 'gorm'] 20 | robots = 'all' 21 | } 22 | -------------------------------------------------------------------------------- /buildSrc/build.gradle: -------------------------------------------------------------------------------- 1 | plugins { 2 | id 'java-gradle-plugin' 3 | id 'groovy' 4 | } 5 | 6 | ext { 7 | micronautVersion = '3.1.3' 8 | } 9 | 10 | repositories { 11 | mavenCentral() 12 | } 13 | 14 | 15 | dependencies { 16 | annotationProcessor(platform("io.micronaut:micronaut-bom:$micronautVersion")) 17 | implementation(platform("io.micronaut:micronaut-bom:$micronautVersion")) 18 | testAnnotationProcessor(platform("io.micronaut:micronaut-bom:$micronautVersion")) 19 | testImplementation(platform("io.micronaut:micronaut-bom:$micronautVersion")) 20 | 21 | annotationProcessor "io.micronaut:micronaut-inject-java" 22 | annotationProcessor("io.micronaut:micronaut-validation") 23 | implementation("io.micronaut:micronaut-validation") 24 | implementation("io.micronaut:micronaut-http-client") 25 | implementation("io.micronaut:micronaut-http") 26 | implementation "io.micronaut:micronaut-inject" 27 | 28 | implementation("org.yaml:snakeyaml:1.20") 29 | implementation("com.github.spotbugs:spotbugs-annotations:4.0.3") 30 | implementation("javax.validation:validation-api:2.0.1.Final") 31 | implementation("io.micronaut.rss:micronaut-rss-core:2.1.0") 32 | implementation('com.vladsch.flexmark:flexmark:0.61.26') 33 | implementation('com.vladsch.flexmark:flexmark-ext-tables:0.61.26') 34 | 35 | testImplementation("io.micronaut:micronaut-http-server-netty") 36 | testImplementation("org.spockframework:spock-core") { 37 | exclude module:'groovy-all' 38 | } 39 | } 40 | 41 | tasks.withType(Jar).configureEach { 42 | it.duplicatesStrategy = DuplicatesStrategy.INCLUDE 43 | } -------------------------------------------------------------------------------- /buildSrc/settings.gradle: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apache/grails-static-website/b139c6e8add79c53bda3e38e109f3f51ac44107d/buildSrc/settings.gradle -------------------------------------------------------------------------------- /buildSrc/src/main/groovy/org/grails/Content.groovy: -------------------------------------------------------------------------------- 1 | package org.grails 2 | 3 | import edu.umd.cs.findbugs.annotations.Nullable 4 | 5 | interface Content { 6 | @Nullable String getPath(); 7 | @Nullable String getTitle(); 8 | /** 9 | * 10 | * @return Body class 11 | */ 12 | @Nullable String getBody(); 13 | @Nullable String getDate(); 14 | @Nullable String getDescription(); 15 | @Nullable List getKeywords(); 16 | @Nullable String getRobots(); 17 | } 18 | -------------------------------------------------------------------------------- /buildSrc/src/main/groovy/org/grails/ContentAndMetadata.groovy: -------------------------------------------------------------------------------- 1 | package org.grails 2 | 3 | import groovy.transform.CompileStatic 4 | 5 | @CompileStatic 6 | class ContentAndMetadata { 7 | String content 8 | Map metadata 9 | } 10 | -------------------------------------------------------------------------------- /buildSrc/src/main/groovy/org/grails/HtmlMinutes.groovy: -------------------------------------------------------------------------------- 1 | package org.grails 2 | 3 | class HtmlMinutes { 4 | String path 5 | MinutesMetadata metadata 6 | String html 7 | } 8 | -------------------------------------------------------------------------------- /buildSrc/src/main/groovy/org/grails/HtmlPost.groovy: -------------------------------------------------------------------------------- 1 | package org.grails 2 | 3 | import groovy.transform.CompileStatic 4 | 5 | @CompileStatic 6 | class HtmlPost { 7 | String path 8 | PostMetadata metadata 9 | String html 10 | Set tags 11 | } 12 | 13 | -------------------------------------------------------------------------------- /buildSrc/src/main/groovy/org/grails/MarkdownMinutes.groovy: -------------------------------------------------------------------------------- 1 | package org.grails 2 | 3 | import groovy.transform.CompileStatic 4 | 5 | 6 | @CompileStatic 7 | class MarkdownMinutes extends Page { 8 | 9 | @Override 10 | String getPath() { 11 | return filename.replaceAll(".md", ".html").replaceAll(".markdown", ".html") 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /buildSrc/src/main/groovy/org/grails/MarkdownPost.groovy: -------------------------------------------------------------------------------- 1 | package org.grails; 2 | 3 | import groovy.transform.CompileStatic; 4 | 5 | @CompileStatic 6 | class MarkdownPost extends Page { 7 | 8 | @Override 9 | String getPath() { 10 | return filename.replaceAll(".md", ".html").replaceAll(".markdown", ".html") 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /buildSrc/src/main/groovy/org/grails/MinutesMetadata.groovy: -------------------------------------------------------------------------------- 1 | package org.grails 2 | 3 | import edu.umd.cs.findbugs.annotations.Nullable 4 | import groovy.transform.CompileStatic 5 | 6 | @CompileStatic 7 | interface MinutesMetadata { 8 | 9 | String get(String name) 10 | 11 | @Nullable 12 | String getUrl() 13 | 14 | @Nullable 15 | String getTitle() 16 | 17 | @Nullable 18 | String getDate() 19 | 20 | Map toMap() 21 | 22 | } 23 | -------------------------------------------------------------------------------- /buildSrc/src/main/groovy/org/grails/MinutesMetadataAdaptor.groovy: -------------------------------------------------------------------------------- 1 | package org.grails 2 | 3 | import groovy.transform.CompileStatic 4 | 5 | @CompileStatic 6 | class MinutesMetadataAdaptor implements MinutesMetadata { 7 | 8 | Map metadata 9 | MinutesMetadataAdaptor(Map metadata) { 10 | this.metadata = metadata 11 | 12 | } 13 | 14 | @Override 15 | String get(String name) { 16 | return metadata[name] 17 | } 18 | 19 | @Override 20 | String getUrl() { 21 | get('url') 22 | } 23 | 24 | @Override 25 | String getTitle() { 26 | get('title') 27 | } 28 | 29 | @Override 30 | String getDate() { 31 | get('date') 32 | } 33 | 34 | @Override 35 | Map toMap() { 36 | metadata 37 | } 38 | } 39 | -------------------------------------------------------------------------------- /buildSrc/src/main/groovy/org/grails/Page.groovy: -------------------------------------------------------------------------------- 1 | package org.grails 2 | 3 | import groovy.transform.CompileStatic 4 | 5 | @CompileStatic 6 | class Page implements Content { 7 | String filename 8 | Map metadata 9 | String content 10 | 11 | @Override 12 | String getPath() { 13 | filename?.replaceAll('\\\\', '/') 14 | } 15 | 16 | @Override 17 | String getTitle() { 18 | metadata && metadata.containsKey('title') ? metadata['title'] : null 19 | } 20 | 21 | @Override 22 | String getBody() { 23 | metadata && metadata.containsKey('body') ? metadata['body'] : null 24 | } 25 | 26 | @Override 27 | String getDate() { 28 | metadata && metadata.containsKey('date') ? metadata['date'] : null 29 | } 30 | 31 | @Override 32 | String getDescription() { 33 | metadata && metadata.containsKey('description') ? metadata['description'] : null 34 | } 35 | 36 | @Override 37 | List getKeywords() { 38 | metadata && metadata.containsKey('keywords') ? metadata['keywords'].split(",") as List : null 39 | } 40 | 41 | @Override 42 | String getRobots() { 43 | metadata && metadata.containsKey('robots') ? metadata['robots'] : null 44 | } 45 | } 46 | -------------------------------------------------------------------------------- /buildSrc/src/main/groovy/org/grails/PageElement.groovy: -------------------------------------------------------------------------------- 1 | package org.grails 2 | 3 | import groovy.transform.CompileStatic 4 | 5 | @CompileStatic 6 | interface PageElement { 7 | 8 | String renderAsHtml() 9 | } 10 | -------------------------------------------------------------------------------- /buildSrc/src/main/groovy/org/grails/PostMetadata.groovy: -------------------------------------------------------------------------------- 1 | package org.grails 2 | 3 | import edu.umd.cs.findbugs.annotations.Nullable 4 | 5 | interface PostMetadata { 6 | 7 | String get(String name) 8 | 9 | @Nullable 10 | String getUrl() 11 | 12 | @Nullable 13 | String getTitle() 14 | 15 | @Nullable 16 | String getAuthor() 17 | 18 | @Nullable 19 | String getDate() 20 | 21 | Map toMap() 22 | } -------------------------------------------------------------------------------- /buildSrc/src/main/groovy/org/grails/PostMetadataAdapter.groovy: -------------------------------------------------------------------------------- 1 | package org.grails 2 | 3 | import groovy.transform.CompileStatic 4 | 5 | @CompileStatic 6 | class PostMetadataAdapter implements PostMetadata { 7 | 8 | Map metadata 9 | PostMetadataAdapter(Map metadata) { 10 | this.metadata = metadata 11 | 12 | } 13 | 14 | @Override 15 | String get(String name) { 16 | return metadata[name] 17 | } 18 | 19 | @Override 20 | String getUrl() { 21 | get('url') 22 | } 23 | 24 | @Override 25 | String getTitle() { 26 | get('title') 27 | } 28 | 29 | @Override 30 | String getAuthor() { 31 | get('author') 32 | } 33 | 34 | @Override 35 | String getDate() { 36 | get('date') 37 | } 38 | 39 | @Override 40 | Map toMap() { 41 | metadata 42 | } 43 | } 44 | -------------------------------------------------------------------------------- /buildSrc/src/main/groovy/org/grails/ReadFileUtils.groovy: -------------------------------------------------------------------------------- 1 | package org.grails 2 | 3 | class ReadFileUtils { 4 | 5 | static String readFileContent(ClassLoader classLoader, String filename) { 6 | File file = getFileFromURL(classLoader, filename) 7 | if ( !file || !file.exists() ) { 8 | file = new File("buildSrc/build/resources/main/$filename") 9 | if ( !file || !file.exists() ) { 10 | return null 11 | } 12 | } 13 | file.text 14 | } 15 | 16 | static File getFileFromURL(ClassLoader classLoader, String filename) { 17 | URL url = classLoader.getResource(filename) 18 | File file = null 19 | try { 20 | file = new File(url.toURI()) 21 | } catch (URISyntaxException e) { 22 | file = new File(url.getPath()) 23 | } finally { 24 | return file 25 | } 26 | } 27 | } 28 | -------------------------------------------------------------------------------- /buildSrc/src/main/groovy/org/grails/documentation/GuideGroup.groovy: -------------------------------------------------------------------------------- 1 | package org.grails.documentation 2 | 3 | import groovy.transform.CompileStatic 4 | 5 | @CompileStatic 6 | class GuideGroup implements GuideGroupHtml { 7 | String title 8 | String image 9 | String description 10 | String ulId 11 | List items = [] 12 | } 13 | -------------------------------------------------------------------------------- /buildSrc/src/main/groovy/org/grails/documentation/GuideGroupItem.groovy: -------------------------------------------------------------------------------- 1 | package org.grails.documentation 2 | 3 | import groovy.transform.CompileStatic 4 | 5 | @CompileStatic 6 | class GuideGroupItem { 7 | String title 8 | String href 9 | String legend 10 | String image 11 | String category 12 | } 13 | -------------------------------------------------------------------------------- /buildSrc/src/main/groovy/org/grails/events/Event.groovy: -------------------------------------------------------------------------------- 1 | package org.grails.events 2 | 3 | import edu.umd.cs.findbugs.annotations.Nullable 4 | import groovy.transform.CompileStatic 5 | import groovy.transform.ToString 6 | 7 | import java.time.LocalDate 8 | 9 | @ToString 10 | @CompileStatic 11 | class Event { 12 | String name 13 | String location 14 | LocalDate date 15 | List speakers 16 | 17 | @Nullable 18 | String link 19 | } 20 | -------------------------------------------------------------------------------- /buildSrc/src/main/groovy/org/grails/events/EventsPage.groovy: -------------------------------------------------------------------------------- 1 | package org.grails.events 2 | 3 | import groovy.transform.CompileDynamic 4 | 5 | @CompileDynamic 6 | class EventsPage { 7 | 8 | @CompileDynamic 9 | static String eventsTable(List events, boolean showLocation = false) { 10 | String msg = """\ 11 |
12 | 13 | 14 | 15 | ${showLocation ? '': ''} 16 | 17 | 18 | 19 | ${showLocation ? '': ''} 20 | 21 | 22 | """ 23 | for (Event event : events) { 24 | msg += tableRowForEvent(event, showLocation) 25 | } 26 | msg += '' 27 | msg += '
EventDate(s)LocationSpeakers
' 28 | msg 29 | } 30 | 31 | static String tableRowForEvent(Event event, boolean showLocation) { 32 | String msg = '' 33 | if (event.link) { 34 | msg += "${event.name ?: ''}" 35 | } else { 36 | msg += "${event.name ?: ''}" 37 | } 38 | msg += "${event.date ?: ''}" 39 | if (showLocation) { 40 | msg += "${event.location ?: ''}" 41 | } 42 | msg += "${(event.speakers ? event.speakers.join(', ') : '')}" 43 | msg += "" 44 | msg 45 | } 46 | 47 | } 48 | -------------------------------------------------------------------------------- /buildSrc/src/main/groovy/org/grails/gradle/BuildGuidesTask.groovy: -------------------------------------------------------------------------------- 1 | package org.grails.gradle 2 | 3 | import groovy.transform.CompileStatic 4 | import org.gradle.api.DefaultTask 5 | import org.gradle.api.tasks.TaskAction 6 | 7 | @CompileStatic 8 | class BuildGuidesTask extends DefaultTask { 9 | 10 | @TaskAction 11 | void buildGuides() { 12 | 13 | } 14 | } 15 | -------------------------------------------------------------------------------- /buildSrc/src/main/groovy/org/grails/gradle/DocumentationTask.groovy: -------------------------------------------------------------------------------- 1 | package org.grails.gradle 2 | 3 | import groovy.transform.CompileStatic 4 | import org.grails.documentation.DocumentationPage 5 | import org.gradle.api.DefaultTask; 6 | import org.gradle.api.provider.Property 7 | import org.gradle.api.tasks.Input 8 | import org.gradle.api.tasks.OutputDirectory 9 | import org.gradle.api.tasks.TaskAction; 10 | 11 | @CompileStatic 12 | class DocumentationTask extends DefaultTask { 13 | 14 | static final String PAGE_NAME_DOCS = "documentation.html" 15 | public static final String TEMP = "temp" 16 | 17 | @Input 18 | final Property modules = project.objects.property(File) 19 | 20 | @Input 21 | final Property releases = project.objects.property(File) 22 | 23 | @Input 24 | final Property url = project.objects.property(String) 25 | 26 | @OutputDirectory 27 | final Property output = project.objects.property(File) 28 | 29 | @TaskAction 30 | void renderDocsPage() { 31 | File build = output.get() 32 | File temp = new File(build.absolutePath + "/" + TEMP) 33 | temp.mkdir() 34 | 35 | File output = new File(temp.getAbsolutePath() + "/" + PAGE_NAME_DOCS) 36 | output.createNewFile() 37 | output.text = "title: Documentation | Grails Framework\nbody: docs\n---\n" + 38 | DocumentationPage.mainContent(releases.get(), modules.get()) 39 | } 40 | } 41 | -------------------------------------------------------------------------------- /buildSrc/src/main/groovy/org/grails/gradle/ProfilesTask.groovy: -------------------------------------------------------------------------------- 1 | package org.grails.gradle 2 | 3 | import groovy.transform.CompileStatic 4 | import org.grails.documentation.ProfilesPage 5 | import org.gradle.api.DefaultTask 6 | import org.gradle.api.provider.Property 7 | import org.gradle.api.tasks.Input 8 | import org.gradle.api.tasks.OutputDirectory 9 | import org.gradle.api.tasks.TaskAction 10 | 11 | @CompileStatic 12 | class ProfilesTask extends DefaultTask { 13 | 14 | static final String PAGE_NAME_PROFILES = "profiles.html" 15 | public static final String TEMP = "temp" 16 | 17 | @Input 18 | final Property profiles = project.objects.property(File) 19 | 20 | @OutputDirectory 21 | final Property output = project.objects.property(File) 22 | 23 | @TaskAction 24 | void renderDocsPage() { 25 | File build = output.get() 26 | File temp = new File(build.absolutePath + "/" + TEMP) 27 | temp.mkdir() 28 | 29 | File output = new File(temp.getAbsolutePath() + "/" + PAGE_NAME_PROFILES) 30 | output.createNewFile() 31 | output.text = "title: Profiles | Grails Framework\nbody: docs\n---\n" + 32 | ProfilesPage.mainContent(profiles.get()) 33 | } 34 | } 35 | -------------------------------------------------------------------------------- /buildSrc/src/main/groovy/org/grails/gradle/QuestionsTask.groovy: -------------------------------------------------------------------------------- 1 | package org.grails.gradle 2 | 3 | import groovy.transform.CompileStatic 4 | import org.grails.questions.QuestionsPage 5 | import org.gradle.api.DefaultTask 6 | import org.gradle.api.provider.Property 7 | import org.gradle.api.tasks.Input 8 | import org.gradle.api.tasks.OutputDirectory 9 | import org.gradle.api.tasks.TaskAction 10 | 11 | @CompileStatic 12 | class QuestionsTask extends DefaultTask { 13 | 14 | static final String PAGE_NAME_QUESTIONS = "faq.html" 15 | 16 | @Input 17 | final Property questions = project.objects.property(File) 18 | 19 | @OutputDirectory 20 | final Property output = project.objects.property(File) 21 | 22 | @TaskAction 23 | void renderQuestionsPage() { 24 | File build = output.get() 25 | File temp = new File(build.absolutePath + "/" + DocumentationTask.TEMP) 26 | temp.mkdir() 27 | 28 | File output = new File(temp.getAbsolutePath() + "/" + PAGE_NAME_QUESTIONS) 29 | output.createNewFile() 30 | output.text = "title: Frequently Asked Questions | Micronaut Framework\nbody: faq\n---\n" + 31 | QuestionsPage.mainContent(questions.get()) 32 | } 33 | 34 | } 35 | -------------------------------------------------------------------------------- /buildSrc/src/main/groovy/org/grails/guides/Category.groovy: -------------------------------------------------------------------------------- 1 | package org.grails.guides 2 | 3 | import groovy.transform.CompileStatic 4 | 5 | @CompileStatic 6 | class Category { 7 | String name 8 | String image 9 | 10 | String getSlug() { 11 | String slug = name.replaceAll(' ', '') 12 | slug = slug.replaceAll('\\(', '') 13 | slug = slug.replaceAll('\\+', '') 14 | slug = slug.replaceAll('\\)', '') 15 | URLEncoder.encode(slug, 'UTF-8').toLowerCase() 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /buildSrc/src/main/groovy/org/grails/guides/GrailsMajorVersion.groovy: -------------------------------------------------------------------------------- 1 | package org.grails.guides 2 | 3 | import groovy.transform.CompileStatic 4 | 5 | @CompileStatic 6 | enum GrailsMajorVersion { 7 | GRAILS_3(3), 8 | GRAILS_4(4), 9 | GRAILS_5(5), 10 | GRAILS_6(6), 11 | 12 | final int id 13 | 14 | private GrailsMajorVersion(int id) { 15 | this.id = id 16 | } 17 | 18 | @Override 19 | String toString() { 20 | this.name() 21 | } 22 | } -------------------------------------------------------------------------------- /buildSrc/src/main/groovy/org/grails/guides/GrailsVersionedGuide.groovy: -------------------------------------------------------------------------------- 1 | package org.grails.guides 2 | 3 | import groovy.transform.CompileStatic 4 | 5 | @CompileStatic 6 | class GrailsVersionedGuide implements Guide { 7 | List authors 8 | String category 9 | Map> grailsMayorVersionTags = [:] 10 | String name 11 | String title 12 | String subtitle 13 | Date publicationDate 14 | String versionNumber 15 | String githubSlug 16 | String githubBranch 17 | 18 | @Override 19 | List getTags() { 20 | List> tags = grailsMayorVersionTags.collect { 21 | GrailsMajorVersion k, List v -> 22 | v 23 | } 24 | tags << grailsMayorVersionTags.collect { 25 | GrailsMajorVersion k, List v -> 26 | k.toString().toLowerCase() 27 | } as List 28 | tags.flatten() as List 29 | } 30 | } 31 | -------------------------------------------------------------------------------- /buildSrc/src/main/groovy/org/grails/guides/Guide.groovy: -------------------------------------------------------------------------------- 1 | package org.grails.guides 2 | 3 | import groovy.transform.CompileStatic 4 | 5 | @CompileStatic 6 | interface Guide { 7 | String getVersionNumber() 8 | List getAuthors() 9 | String getCategory() 10 | String getName() 11 | String getTitle() 12 | String getSubtitle() 13 | List getTags() 14 | Date getPublicationDate() 15 | } -------------------------------------------------------------------------------- /buildSrc/src/main/groovy/org/grails/guides/MultiLanguageGuide.groovy: -------------------------------------------------------------------------------- 1 | package org.grails.guides 2 | 3 | import groovy.transform.CompileStatic 4 | 5 | @CompileStatic 6 | class MultiLanguageGuide implements Guide { 7 | List authors 8 | String category 9 | Map githubSlugs 10 | Map> programmingLanguageTags 11 | String name 12 | String title 13 | String subtitle 14 | Date publicationDate 15 | String versionNumber 16 | 17 | @Override 18 | List getTags() { 19 | List> tags = programmingLanguageTags.collect { ProgrammingLanguage k, List v -> v} 20 | tags << programmingLanguageTags.collect {ProgrammingLanguage k, List v -> k.toString().toLowerCase()} as List 21 | tags.flatten() as List 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /buildSrc/src/main/groovy/org/grails/guides/ProgrammingLanguage.groovy: -------------------------------------------------------------------------------- 1 | package org.grails.guides 2 | 3 | import groovy.transform.CompileStatic 4 | 5 | @CompileStatic 6 | enum ProgrammingLanguage { 7 | JAVA(1), 8 | KOTLIN(2), 9 | GROOVY(3) 10 | 11 | final int id 12 | private ProgrammingLanguage(int id) { this.id = id } 13 | } 14 | -------------------------------------------------------------------------------- /buildSrc/src/main/groovy/org/grails/guides/SingleGuide.groovy: -------------------------------------------------------------------------------- 1 | package org.grails.guides 2 | 3 | import groovy.transform.CompileStatic 4 | import groovy.transform.ToString 5 | 6 | @ToString(includes = ['title']) 7 | @CompileStatic 8 | class SingleGuide implements Guide { 9 | String versionNumber 10 | List authors 11 | String category 12 | String githubSlug 13 | String githubBranch 14 | String name 15 | String title 16 | String subtitle 17 | List tags 18 | Date publicationDate 19 | } 20 | -------------------------------------------------------------------------------- /buildSrc/src/main/groovy/org/grails/guides/SingleLanguageGuide.groovy: -------------------------------------------------------------------------------- 1 | package org.grails.guides 2 | 3 | import groovy.transform.CompileStatic 4 | import groovy.transform.ToString 5 | 6 | @ToString(includes = ['title']) 7 | @CompileStatic 8 | class SingleLanguageGuide implements Guide { 9 | String versionNumber 10 | List authors 11 | String category 12 | String githubSlug 13 | String name 14 | String title 15 | String subtitle 16 | List tags 17 | Date publicationDate 18 | ProgrammingLanguage programmingLanguage 19 | } 20 | -------------------------------------------------------------------------------- /buildSrc/src/main/groovy/org/grails/guides/Training.groovy: -------------------------------------------------------------------------------- 1 | package org.grails.guides 2 | 3 | import groovy.transform.CompileDynamic 4 | import groovy.xml.MarkupBuilder 5 | 6 | class Training { 7 | @CompileDynamic 8 | static String training() { 9 | StringWriter writer = new StringWriter() 10 | MarkupBuilder html = new MarkupBuilder(writer) 11 | html.div(class: 'training') { 12 | h3(class: 'columnheader') { 13 | a(href: 'https://objectcomputing.com/training/catalog/grails/', 'Grails Training') 14 | } 15 | mkp.yieldUnescaped'[%events]' 16 | } 17 | writer.toString() 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /buildSrc/src/main/groovy/org/grails/plugin/Owner.groovy: -------------------------------------------------------------------------------- 1 | package org.grails.plugin 2 | 3 | import groovy.transform.EqualsAndHashCode 4 | 5 | @EqualsAndHashCode 6 | class Owner { 7 | String name; 8 | List plugins; 9 | } 10 | -------------------------------------------------------------------------------- /buildSrc/src/main/groovy/org/grails/plugin/Plugin.groovy: -------------------------------------------------------------------------------- 1 | package org.grails.plugin 2 | 3 | import groovy.transform.CompileStatic 4 | import groovy.transform.EqualsAndHashCode 5 | import groovy.transform.Sortable 6 | import org.jetbrains.annotations.NotNull 7 | 8 | import java.time.LocalDateTime 9 | 10 | @EqualsAndHashCode 11 | @CompileStatic 12 | @Sortable(includes=['updated']) 13 | class Plugin implements Comparable{ 14 | String name 15 | Owner owner 16 | String desc 17 | List labels 18 | String latestVersion 19 | String vcsUrl 20 | LocalDateTime updated 21 | String license 22 | Integer githubStars 23 | 24 | static String getUpdated(Plugin plugin){ 25 | plugin.updated 26 | } 27 | 28 | 29 | @Override 30 | int compareTo(@NotNull Object o) { 31 | return 0 32 | } 33 | 34 | } 35 | -------------------------------------------------------------------------------- /buildSrc/src/main/groovy/org/grails/questions/Question.groovy: -------------------------------------------------------------------------------- 1 | package org.grails.questions 2 | import groovy.transform.CompileStatic 3 | 4 | @CompileStatic 5 | class Question implements QuestionHtml { 6 | String title 7 | String answer 8 | String slug 9 | } 10 | -------------------------------------------------------------------------------- /buildSrc/src/main/groovy/org/grails/questions/QuestionHtml.groovy: -------------------------------------------------------------------------------- 1 | package org.grails.questions 2 | 3 | import groovy.transform.CompileDynamic 4 | import groovy.transform.CompileStatic 5 | import groovy.xml.MarkupBuilder 6 | import org.grails.PageElement 7 | import org.grails.markdown.MarkdownUtil 8 | 9 | @CompileStatic 10 | trait QuestionHtml implements PageElement { 11 | 12 | abstract String getTitle() 13 | abstract String getAnswer() 14 | abstract String getSlug() 15 | 16 | @CompileDynamic 17 | @Override 18 | String renderAsHtml() { 19 | StringWriter writer = new StringWriter() 20 | MarkupBuilder html = new MarkupBuilder(writer) 21 | html.div(class: 'question', id: slug) { 22 | h2 { 23 | html.mkp.yieldUnescaped title 24 | } 25 | String text = MarkdownUtil.htmlFromMarkdown(answer) 26 | text = text.replaceAll("\\\\n","
") 27 | html.mkp.yieldUnescaped(text) 28 | } 29 | writer.toString() 30 | } 31 | 32 | } -------------------------------------------------------------------------------- /buildSrc/src/main/groovy/org/grails/questions/QuestionsPage.groovy: -------------------------------------------------------------------------------- 1 | package org.grails.questions 2 | 3 | import groovy.transform.CompileDynamic 4 | import groovy.transform.CompileStatic 5 | import groovy.xml.MarkupBuilder 6 | import org.grails.markdown.MarkdownUtil 7 | import org.yaml.snakeyaml.Yaml 8 | 9 | @CompileStatic 10 | class QuestionsPage { 11 | @CompileDynamic 12 | static String mainContent(File questions) { 13 | StringWriter writer = new StringWriter() 14 | MarkupBuilder html = new MarkupBuilder(writer) 15 | Yaml yaml = new Yaml() 16 | Map model = yaml.load(questions.newDataInputStream()) 17 | List questionList = model['questions'].collect { 18 | new Question(title: it['title'], answer: it['answer'], slug: it['slug']) 19 | } 20 | html.div(class: 'headerbar chalicesbg') { 21 | html.div(class: 'content') { 22 | h1 'Questions' 23 | } 24 | } 25 | html.div(class: 'content') { 26 | article(id: 'questions') { 27 | for( Question question : questionList) { 28 | div(class: 'question', id: question.slug) { 29 | h2(class: 'columnheader', question.title) 30 | mkp.yieldUnescaped(MarkdownUtil.htmlFromMarkdown(question.answer.replace('\n', '
')) 31 | ) 32 | } 33 | } 34 | } 35 | } 36 | writer.toString() 37 | } 38 | } 39 | -------------------------------------------------------------------------------- /buildSrc/src/main/groovy/org/grails/tags/Tag.groovy: -------------------------------------------------------------------------------- 1 | package org.grails.tags 2 | 3 | import groovy.transform.Canonical 4 | import groovy.transform.CompileStatic 5 | import groovy.transform.Sortable 6 | 7 | @Canonical 8 | @Sortable(includes = ['title']) 9 | @CompileStatic 10 | class Tag { 11 | String title 12 | int ocurrence 13 | 14 | void setTitle(String title) { 15 | this.title = title?.trim() 16 | } 17 | 18 | String getSlug() { 19 | if ( !title ) { 20 | return null 21 | } 22 | String str = title 23 | str = str.toLowerCase() 24 | for ( String regex : [' ', '\\[', ']', '\''] ) { 25 | str = str.replaceAll(regex, '') 26 | } 27 | str = str.trim() 28 | URLEncoder.encode(str, 'UTF-8') 29 | } 30 | } 31 | -------------------------------------------------------------------------------- /buildSrc/src/main/groovy/org/grails/tags/TagCloud.groovy: -------------------------------------------------------------------------------- 1 | package org.grails.tags 2 | 3 | import groovy.transform.CompileDynamic 4 | import groovy.transform.CompileStatic 5 | import groovy.xml.MarkupBuilder 6 | 7 | @CompileStatic 8 | class TagCloud { 9 | 10 | @CompileDynamic 11 | static String tagCloud(String url, Set tags, boolean includeHeader = true) { 12 | StringWriter writer = new StringWriter() 13 | MarkupBuilder html = new MarkupBuilder(writer) 14 | html.div(class: 'tagsbytopic') { 15 | if (includeHeader) { 16 | h3 class: 'columnheader', 'Guides by Tag' 17 | } 18 | ul(class: 'tagcloud') { 19 | tags.sort { Tag a, Tag b -> a.slug <=> b.slug }.each { Tag t -> 20 | li(class: "tag${t.ocurrence}") { 21 | a href: "${url}/${t.slug.toLowerCase()}.html", t.title 22 | } 23 | } 24 | } 25 | } 26 | writer.toString() 27 | } 28 | } 29 | -------------------------------------------------------------------------------- /buildSrc/src/main/java/org/grails/airtable/AirtableApiError.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright 2017-2022 original authors 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); 5 | * you may not use this file except in compliance with the License. 6 | * You may obtain a copy of the License at 7 | * 8 | * https://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, 12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | * See the License for the specific language governing permissions and 14 | * limitations under the License. 15 | */ 16 | package org.grails.airtable; 17 | 18 | import io.micronaut.core.annotation.Introspected; 19 | 20 | /** 21 | * @author Sergio del Amo 22 | * @since 1.0.0 23 | */ 24 | @Introspected 25 | public class AirtableApiError { 26 | 27 | private AirtableError error; 28 | 29 | public AirtableApiError() { 30 | } 31 | 32 | public AirtableError getError() { 33 | return error; 34 | } 35 | 36 | public void setError(AirtableError error) { 37 | this.error = error; 38 | } 39 | } 40 | -------------------------------------------------------------------------------- /buildSrc/src/main/java/org/grails/airtable/AirtableBaseConfiguration.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright 2017-2022 original authors 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); 5 | * you may not use this file except in compliance with the License. 6 | * You may obtain a copy of the License at 7 | * 8 | * https://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, 12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | * See the License for the specific language governing permissions and 14 | * limitations under the License. 15 | */ 16 | package org.grails.airtable; 17 | 18 | import edu.umd.cs.findbugs.annotations.NonNull; 19 | 20 | /** 21 | * @author Sergio del Amo 22 | * @since 1.0.0 23 | */ 24 | public interface AirtableBaseConfiguration { 25 | /** 26 | * 27 | * @return Airtable base id 28 | */ 29 | @NonNull 30 | String getId(); 31 | } 32 | -------------------------------------------------------------------------------- /buildSrc/src/main/java/org/grails/airtable/AirtableBaseConfigurationProperties.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright 2017-2022 original authors 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); 5 | * you may not use this file except in compliance with the License. 6 | * You may obtain a copy of the License at 7 | * 8 | * https://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, 12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | * See the License for the specific language governing permissions and 14 | * limitations under the License. 15 | */ 16 | package org.grails.airtable; 17 | 18 | import edu.umd.cs.findbugs.annotations.NonNull; 19 | import io.micronaut.context.annotation.EachProperty; 20 | import io.micronaut.context.annotation.Parameter; 21 | 22 | import javax.validation.constraints.NotBlank; 23 | 24 | /** 25 | * @author Sergio del Amo 26 | * @since 1.0.0 27 | */ 28 | @EachProperty(AirtableConfigurationProperties.PREFIX + ".bases") 29 | public class AirtableBaseConfigurationProperties implements AirtableBaseConfiguration { 30 | 31 | private final String name; 32 | 33 | public AirtableBaseConfigurationProperties(@Parameter String name) { 34 | this.name = name; 35 | } 36 | 37 | @NonNull 38 | @NotBlank 39 | private String id; 40 | 41 | @NonNull 42 | @Override 43 | public String getId() { 44 | return id; 45 | } 46 | 47 | /** 48 | * 49 | * @param id Sets Airtable base id 50 | */ 51 | public void setId(@NonNull String id) { 52 | this.id = id; 53 | } 54 | } 55 | -------------------------------------------------------------------------------- /buildSrc/src/main/java/org/grails/airtable/AirtableConfiguration.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright 2017-2022 original authors 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); 5 | * you may not use this file except in compliance with the License. 6 | * You may obtain a copy of the License at 7 | * 8 | * https://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, 12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | * See the License for the specific language governing permissions and 14 | * limitations under the License. 15 | */ 16 | package org.grails.airtable; 17 | 18 | import edu.umd.cs.findbugs.annotations.NonNull; 19 | 20 | /** 21 | * @author Sergio del Amo 22 | * @since 1.0.0 23 | */ 24 | public interface AirtableConfiguration { 25 | 26 | /** 27 | * 28 | * @return Airtable API URL 29 | */ 30 | @NonNull 31 | String getUrl(); 32 | 33 | /** 34 | * 35 | * @return Airtable API Key 36 | */ 37 | @NonNull 38 | String getApiKey(); 39 | 40 | /** 41 | * 42 | * @return Airtable API version 43 | */ 44 | @NonNull 45 | String getApiVersion(); 46 | } 47 | -------------------------------------------------------------------------------- /buildSrc/src/main/java/org/grails/airtable/AirtableError.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright 2017-2022 original authors 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); 5 | * you may not use this file except in compliance with the License. 6 | * You may obtain a copy of the License at 7 | * 8 | * https://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, 12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | * See the License for the specific language governing permissions and 14 | * limitations under the License. 15 | */ 16 | package org.grails.airtable; 17 | 18 | import io.micronaut.core.annotation.Introspected; 19 | 20 | /** 21 | * @author Sergio del Amo 22 | * @since 1.0.0 23 | */ 24 | @Introspected 25 | public class AirtableError { 26 | private String type; 27 | private String message; 28 | 29 | public AirtableError() { 30 | } 31 | 32 | public String getType() { 33 | return type; 34 | } 35 | 36 | public void setType(String type) { 37 | this.type = type; 38 | } 39 | 40 | public String getMessage() { 41 | return message; 42 | } 43 | 44 | public void setMessage(String message) { 45 | this.message = message; 46 | } 47 | } 48 | -------------------------------------------------------------------------------- /buildSrc/src/main/java/org/grails/airtable/AirtableFactory.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright 2017-2022 original authors 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); 5 | * you may not use this file except in compliance with the License. 6 | * You may obtain a copy of the License at 7 | * 8 | * https://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, 12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | * See the License for the specific language governing permissions and 14 | * limitations under the License. 15 | */ 16 | package org.grails.airtable; 17 | 18 | import io.micronaut.context.annotation.EachBean; 19 | import io.micronaut.context.annotation.Factory; 20 | 21 | /** 22 | * @author Sergio del Amo 23 | * @since 1.0.0 24 | */ 25 | @Factory 26 | public class AirtableFactory { 27 | 28 | private final AirtableClient airtableClient; 29 | private final AirtableConfiguration airtableConfiguration; 30 | 31 | public AirtableFactory(AirtableClient airtableClient, 32 | AirtableConfiguration airtableConfiguration) { 33 | this.airtableClient = airtableClient; 34 | this.airtableConfiguration = airtableConfiguration; 35 | } 36 | 37 | 38 | @EachBean(AirtableBaseConfiguration.class) 39 | public AirtableBaseApi buildEngine(AirtableBaseConfiguration baseConfiguration) { 40 | return new AirtableBaseApi(airtableClient, airtableConfiguration, baseConfiguration); 41 | } 42 | } 43 | -------------------------------------------------------------------------------- /buildSrc/src/main/java/org/grails/airtable/CellFormat.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright 2017-2022 original authors 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); 5 | * you may not use this file except in compliance with the License. 6 | * You may obtain a copy of the License at 7 | * 8 | * https://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, 12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | * See the License for the specific language governing permissions and 14 | * limitations under the License. 15 | */ 16 | package org.grails.airtable; 17 | 18 | /** 19 | * @author Sergio del Amo 20 | * @since 1.0.0 21 | */ 22 | public enum CellFormat { 23 | JSON, STRING; 24 | 25 | @Override 26 | public String toString() { 27 | return name().toLowerCase(); 28 | } 29 | } 30 | -------------------------------------------------------------------------------- /buildSrc/src/main/java/org/grails/airtable/Direction.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright 2017-2022 original authors 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); 5 | * you may not use this file except in compliance with the License. 6 | * You may obtain a copy of the License at 7 | * 8 | * https://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, 12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | * See the License for the specific language governing permissions and 14 | * limitations under the License. 15 | */ 16 | package org.grails.airtable; 17 | 18 | /** 19 | * @author Sergio del Amo 20 | * @since 1.0.0 21 | */ 22 | public enum Direction { 23 | 24 | ASC, DESC; 25 | 26 | @Override 27 | public String toString() { 28 | return name().toLowerCase(); 29 | } 30 | } 31 | -------------------------------------------------------------------------------- /buildSrc/src/main/java/org/grails/airtable/RecordList.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright 2017-2022 original authors 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); 5 | * you may not use this file except in compliance with the License. 6 | * You may obtain a copy of the License at 7 | * 8 | * https://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, 12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | * See the License for the specific language governing permissions and 14 | * limitations under the License. 15 | */ 16 | package org.grails.airtable; 17 | 18 | import io.micronaut.core.annotation.Introspected; 19 | 20 | import java.util.List; 21 | 22 | /** 23 | * @author Sergio del Amo 24 | * @since 1.0.0 25 | */ 26 | @Introspected 27 | public class RecordList { 28 | 29 | private List records; 30 | 31 | public RecordList() { 32 | } 33 | 34 | public List getRecords() { 35 | return records; 36 | } 37 | 38 | public void setRecords(List records) { 39 | this.records = records; 40 | } 41 | } 42 | -------------------------------------------------------------------------------- /buildSrc/src/main/java/org/grails/markdown/MarkdownUtil.java: -------------------------------------------------------------------------------- 1 | package org.grails.markdown; 2 | 3 | import com.vladsch.flexmark.ext.tables.TablesExtension; 4 | import com.vladsch.flexmark.html.HtmlRenderer; 5 | import com.vladsch.flexmark.parser.Parser; 6 | import com.vladsch.flexmark.util.ast.Node; 7 | import com.vladsch.flexmark.util.data.DataHolder; 8 | import com.vladsch.flexmark.util.data.MutableDataSet; 9 | import java.util.Collections; 10 | 11 | public class MarkdownUtil { 12 | final static DataHolder OPTIONS = new MutableDataSet() 13 | .set(Parser.EXTENSIONS, Collections.singletonList(TablesExtension.create())) 14 | .toImmutable(); 15 | 16 | final static Parser PARSER = Parser.builder(OPTIONS).build(); 17 | final static HtmlRenderer RENDERER = HtmlRenderer.builder(OPTIONS).build(); 18 | 19 | public static String htmlFromMarkdown(String input) { 20 | Node document = PARSER.parse(input); 21 | return RENDERER.render(document); 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /buildSrc/src/main/resources/guidesuggestionform.html: -------------------------------------------------------------------------------- 1 | 4 | 5 | 11 | -------------------------------------------------------------------------------- /buildSrc/src/test/groovy/org/grails/airtable/AirtableApiErrorSpec.groovy: -------------------------------------------------------------------------------- 1 | package org.grails.airtable 2 | 3 | import io.micronaut.core.beans.BeanIntrospection 4 | import spock.lang.Specification 5 | 6 | class AirtableApiErrorSpec extends Specification { 7 | 8 | void "AirtableApiError is annotated with @Introspected"() { 9 | when: 10 | BeanIntrospection.getIntrospection(AirtableApiError) 11 | 12 | then: 13 | noExceptionThrown() 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /buildSrc/src/test/groovy/org/grails/airtable/AirtableBaseConfigurationSpec.groovy: -------------------------------------------------------------------------------- 1 | package org.grails.airtable 2 | 3 | import io.micronaut.inject.qualifiers.Qualifiers 4 | 5 | class AirtableBaseConfigurationSpec extends ApplicationContextSpecification { 6 | @Override 7 | Map getConfiguration() { 8 | super.configuration + [ 9 | 'airtable.api-key': 'secret', 10 | 'airtable.bases.2022.id': 'appxxxyyy', 11 | ] 12 | } 13 | 14 | void "bean of type AirtableBaseConfiguration named 2022 exists"() { 15 | expect: 16 | applicationContext.containsBean(AirtableBaseConfiguration, Qualifiers.byName("2022")) 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /buildSrc/src/test/groovy/org/grails/airtable/AirtableConfigurationSpec.groovy: -------------------------------------------------------------------------------- 1 | package org.grails.airtable 2 | 3 | class AirtableConfigurationSpec extends ApplicationContextSpecification { 4 | @Override 5 | Map getConfiguration() { 6 | super.configuration + [ 7 | 'airtable.api-key': 'secret', 8 | 'airtable.bases.2022.id': 'appxxxyyy', 9 | ] 10 | } 11 | 12 | void "bean of type AirtableConfiguration exists"() { 13 | expect: 14 | applicationContext.containsBean(AirtableConfiguration) 15 | 16 | and: 17 | applicationContext.getBean(AirtableConfiguration).getApiVersion() == 'v0' 18 | 19 | and: 20 | applicationContext.getBean(AirtableConfiguration).getApiKey() 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /buildSrc/src/test/groovy/org/grails/airtable/AirtableErrorSpec.groovy: -------------------------------------------------------------------------------- 1 | package org.grails.airtable 2 | 3 | import io.micronaut.core.beans.BeanIntrospection 4 | import spock.lang.Specification 5 | 6 | class AirtableErrorSpec extends Specification { 7 | void "AirtableError is annotated with @Introspected"() { 8 | when: 9 | BeanIntrospection.getIntrospection(AirtableError) 10 | 11 | then: 12 | noExceptionThrown() 13 | } 14 | } 15 | -------------------------------------------------------------------------------- /buildSrc/src/test/groovy/org/grails/airtable/ApplicationContextSpecification.groovy: -------------------------------------------------------------------------------- 1 | package org.grails.airtable 2 | 3 | import io.micronaut.context.ApplicationContext 4 | import io.micronaut.core.io.socket.SocketUtils 5 | import spock.lang.AutoCleanup 6 | import spock.lang.Shared 7 | import spock.lang.Specification 8 | 9 | abstract class ApplicationContextSpecification extends Specification implements ConfigurationFixture { 10 | 11 | @Shared 12 | int mockAirtablePort = SocketUtils.findAvailableTcpPort() 13 | 14 | @AutoCleanup 15 | @Shared 16 | ApplicationContext applicationContext = ApplicationContext.run(configuration) 17 | } 18 | -------------------------------------------------------------------------------- /buildSrc/src/test/groovy/org/grails/airtable/CellFormatSpec.groovy: -------------------------------------------------------------------------------- 1 | package org.grails.airtable 2 | 3 | import spock.lang.Specification 4 | 5 | class CellFormatSpec extends Specification { 6 | 7 | void "CellFormat::toString() returns lowercase string"() { 8 | expect: 9 | CellFormat.JSON.toString() == 'json' 10 | 11 | and: 12 | CellFormat.STRING.toString() == 'string' 13 | } 14 | } 15 | -------------------------------------------------------------------------------- /buildSrc/src/test/groovy/org/grails/airtable/ConfigurationFixture.groovy: -------------------------------------------------------------------------------- 1 | package org.grails.airtable 2 | 3 | trait ConfigurationFixture { 4 | 5 | Map getConfiguration() { 6 | Map m = [:] 7 | if (specName) { 8 | m['spec.name'] = specName 9 | } 10 | m 11 | } 12 | 13 | String getSpecName() { 14 | null 15 | } 16 | 17 | } -------------------------------------------------------------------------------- /buildSrc/src/test/groovy/org/grails/airtable/DirectionSpec.groovy: -------------------------------------------------------------------------------- 1 | package org.grails.airtable 2 | 3 | import spock.lang.Specification 4 | 5 | class DirectionSpec extends Specification { 6 | 7 | void "Direction::toString() returns lowercase string"() { 8 | expect: 9 | Direction.ASC.toString() == 'asc' 10 | 11 | and: 12 | Direction.DESC.toString() == 'desc' 13 | } 14 | } 15 | -------------------------------------------------------------------------------- /buildSrc/src/test/groovy/org/grails/airtable/Event.groovy: -------------------------------------------------------------------------------- 1 | package org.grails.airtable 2 | 3 | import edu.umd.cs.findbugs.annotations.Nullable 4 | import groovy.transform.CompileStatic 5 | import groovy.transform.ToString 6 | 7 | import java.time.LocalDate 8 | 9 | @ToString 10 | @CompileStatic 11 | class Event { 12 | String name 13 | LocalDate date 14 | List speakers 15 | 16 | @Nullable 17 | String link 18 | } 19 | -------------------------------------------------------------------------------- /buildSrc/src/test/groovy/org/grails/airtable/RecordListSpec.groovy: -------------------------------------------------------------------------------- 1 | package org.grails.airtable 2 | 3 | import io.micronaut.core.beans.BeanIntrospection 4 | import spock.lang.Specification 5 | 6 | class RecordListSpec extends Specification { 7 | void "RecordList is annotated with @Introspected"() { 8 | when: 9 | BeanIntrospection.getIntrospection(RecordList) 10 | 11 | then: 12 | noExceptionThrown() 13 | } 14 | } 15 | -------------------------------------------------------------------------------- /buildSrc/src/test/groovy/org/grails/airtable/RecordSpec.groovy: -------------------------------------------------------------------------------- 1 | package org.grails.airtable 2 | 3 | import io.micronaut.core.beans.BeanIntrospection 4 | import spock.lang.Specification 5 | 6 | class RecordSpec extends Specification { 7 | 8 | void "Record is annotated with @Introspected"() { 9 | when: 10 | BeanIntrospection.getIntrospection(Record) 11 | 12 | then: 13 | noExceptionThrown() 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /buildSrc/src/test/groovy/org/grails/airtable/SortSpec.groovy: -------------------------------------------------------------------------------- 1 | package org.grails.airtable 2 | 3 | import io.micronaut.core.beans.BeanIntrospection 4 | import spock.lang.Specification 5 | 6 | class SortSpec extends Specification { 7 | 8 | void "Sort is annotated with @Introspected"() { 9 | when: 10 | BeanIntrospection.getIntrospection(Sort) 11 | 12 | then: 13 | noExceptionThrown() 14 | } 15 | 16 | void "sort default direction is asc"() { 17 | expect: 18 | new Sort().direction == Direction.ASC 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /buildSrc/src/test/groovy/org/grails/airtable/TimeZoneSpec.groovy: -------------------------------------------------------------------------------- 1 | package org.grails.airtable 2 | 3 | import spock.lang.Specification 4 | 5 | class TimeZoneSpec extends Specification { 6 | 7 | void "TimeZone::toString() returns identifier in regular case"() { 8 | expect: 9 | TimeZone.PACIFIC_TAHITI.toString() == 'Pacific/Tahiti' 10 | } 11 | } 12 | -------------------------------------------------------------------------------- /buildSrc/src/test/groovy/org/grails/airtable/UserLocaleSpec.groovy: -------------------------------------------------------------------------------- 1 | package org.grails.airtable 2 | 3 | import spock.lang.Specification 4 | 5 | class UserLocaleSpec extends Specification { 6 | 7 | void "UserLocale::toString() returns modifier in lowercase"() { 8 | expect: 9 | UserLocale.BS.toString() == 'bs' 10 | } 11 | } 12 | -------------------------------------------------------------------------------- /docs/mamp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apache/grails-static-website/b139c6e8add79c53bda3e38e109f3f51ac44107d/docs/mamp.png -------------------------------------------------------------------------------- /docs/textexpander.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apache/grails-static-website/b139c6e8add79c53bda3e38e109f3f51ac44107d/docs/textexpander.png -------------------------------------------------------------------------------- /gradle/wrapper/gradle-wrapper.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apache/grails-static-website/b139c6e8add79c53bda3e38e109f3f51ac44107d/gradle/wrapper/gradle-wrapper.jar -------------------------------------------------------------------------------- /gradle/wrapper/gradle-wrapper.properties: -------------------------------------------------------------------------------- 1 | distributionBase=GRADLE_USER_HOME 2 | distributionPath=wrapper/dists 3 | distributionUrl=https\://services.gradle.org/distributions/gradle-7.6.4-bin.zip 4 | networkTimeout=10000 5 | zipStoreBase=GRADLE_USER_HOME 6 | zipStorePath=wrapper/dists 7 | -------------------------------------------------------------------------------- /pages/foundation/thank-you.html: -------------------------------------------------------------------------------- 1 | title: Thank You For Your Support | Grails® Framework 2 | CSS: /stylesheets/foundation.css 3 | JAVASCRIPT: https://js.hsforms.net/forms/v2.js 4 | body: foundation 5 | --- 6 | 7 |
8 |
9 |

Foundation

10 |
11 |
12 | 13 |
14 |
15 |

Thank you for your support

16 |

Your contribution is appreciated.

17 |

We will reach out to you shortly so we can find the best way to get you your rewards.

18 |
19 |
20 | 21 | -------------------------------------------------------------------------------- /pages/legacy-plugins.html: -------------------------------------------------------------------------------- 1 | title: Legacy Plugins | Grails® Framework 2 | --- 3 |
4 |
5 |

Legacy Plugins

6 |
7 |
8 |
9 |
10 |

11 | The Grails 1 & 2 plugin portal is no longer active. We are not accepting submissions for new plugins for Grails 1 & 2. 12 |

13 |

14 | Documentation for Grails 1 & 2 plugins can be found on the website or source code repository of each plugin. If you require additional assitance, please visit the Grails support page. 15 |

16 |
17 |
-------------------------------------------------------------------------------- /pages/support.html: -------------------------------------------------------------------------------- 1 | title: Commercial Support | Grails® Framework 2 | CSS: /stylesheets/support.css 3 | --- 4 |
5 |
6 |

Commercial Support

7 |
8 |
9 |
10 |
11 |

12 | As of June 2024, Grails® Foundation is no longer accepting new engagements to provide direct commercial support services. 13 | All existing agreements will continue to be fulfilled by the Grails Foundation. 14 | 15 | Interested in obtaining commercial support? Please reach out to one of the trusted vendors below to learn more about their offerings. 16 | 17 |

21 | 22 | If your organization offers commercial support services for the Grails framework and you would like to be included in this 23 | list, please contact us. 24 | 25 | 26 |

27 |
28 |
29 | 30 | 31 | 40 | 41 | 48 | -------------------------------------------------------------------------------- /posts/2016-04-01-1.md: -------------------------------------------------------------------------------- 1 | title: Quickcast #1: Grails® Interceptors 2 | date: April 1, 2016 3 | description: Grails co-founder, Jeff Scott Brown, talks Grails interceptors. 4 | author: Jeff Scott Brown 5 | image: quickcast.jpg 6 | video: https://www.youtube.com/watch?v=XnRNfDGkBVg 7 | --- 8 | 9 | # [%title] 10 | 11 | [%author] 12 | 13 | [%date] 14 | 15 | Tags: #quickcast 16 | 17 | In this 17-minute video, the Grails® framework co-founder, [Jeff Scott Brown](https://objectcomputing.com/products/2gm-team#brown), talks Grails [interceptors](https://en.wikipedia.org/wiki/Interceptor_pattern). 18 | 19 | (Yes, `create-interceptor` actually creates an interceptor. Mind. Blown.) 20 | 21 | This tutorial assumes only basic familiarity with Groovy (which is pretty darned expressive anyway) and the MVC concept (which you already know). It also serves as an excellent introduction to the interceptor pattern in any language, because Grails' behind-the-scenes legwork lets you focus on the logic of the pattern. 22 | 23 | Grails Quickcasts, brought to you through a partnership between [Object Computing, Inc.](https://objectcomputing.com/) (OCI) and [DZone](https://dzone.com/), provide bite-sized tutorials to help you maximize your productivity with the Framework. 24 | -------------------------------------------------------------------------------- /posts/2016-04-01-2.md: -------------------------------------------------------------------------------- 1 | title: Quickcast #2: JSON Views 2 | date: April 1, 2016 3 | description: Jeff Scott Brown uses music examples to probe JSON views. 4 | author: Jeff Scott Brown 5 | image: quickcast.jpg 6 | video: https://www.youtube.com/watch?v=XnRNfDGkBVg 7 | --- 8 | 9 | # [%title] 10 | 11 | [%author] 12 | 13 | [%date] 14 | 15 | Tags: #quickcast #json 16 | 17 | In a delightful and informative 15 minutes, the Grails® framework co-founder, [Jeff Scott Brown](https://objectcomputing.com/products/2gm-team#brown), probes JSON views. 18 | 19 | Beginning with a Grails 3.1.1 application created with a standard web profile, Jeff demonstrates how to add a few custom domain classes. 20 | 21 | Jeff uses music examples, including _Space Oddity_ by David Bowie (RIP) and _Close to the Edge_ by Yes, to populate an artist class with associated albums annotated with grails.rest.Resource. 22 | 23 | The goal is to publish a REST API under `/artists` to manage instances of the `artist` class and to support the JSON and XML formats. Sending a request to `/artists` delivers a list of artists, all of whom have albums associated with them. 24 | 25 | While the app is running in development mode, the JSON files can be altered, and the effects of those changes can be seen real-time in the application. 26 | 27 | This Quickcast assumes basic knowledge of Grails, JSON, and REST APIs. 28 | 29 | Grails Quickcasts, brought to you through a partnership between [Object Computing, Inc.](https://objectcomputing.com/) (OCI) and [DZone](https://dzone.com/), provide bite-sized tutorials to help you maximize your productivity with the Framework. 30 | -------------------------------------------------------------------------------- /posts/2016-04-27.md: -------------------------------------------------------------------------------- 1 | title: How to Use a Specific Version of GORM in Grails® 3 2 | date: April 27, 2016 3 | description: Learn how you can enforce a particular GORM version in Grails 3. 4 | author: Graeme Rocher 5 | image: 2016-04-27.jpg 6 | CSS: [%url]/stylesheets/prism.css 7 | JAVASCRIPT: [%url]/javascripts/prism.js 8 | --- 9 | 10 | # [%title] 11 | 12 | [%author] 13 | 14 | [%date] 15 | 16 | Tags: #gorm 17 | 18 | In order to ensure compatibility Grails® 3 ships with a BOM that applies dependency management and enforces a particular version of GORM when using Grails. 19 | 20 | Sometimes however, you want to use a different version or there is a more recent version of GORM out there that you would prefer to use. 21 | 22 | Luckily Gradle makes this fairly easy to control. Using the following snippet you can enforce a particular GORM version within your `build.gradle`: 23 | 24 | ```groovy 25 | configurations.all { 26 | resolutionStrategy.eachDependency { DependencyResolveDetails details -> 27 | if (details.requested.group == 'org.grails' 28 | && details.requested.name.startsWith('grails-datastore')) { 29 | details.useVersion("5.0.5.RELEASE") 30 | } 31 | } 32 | } 33 | ``` 34 | 35 | In this example I’m forcing Gradle to resolve the `5.0.5.RELEASE` version of GORM using the Gradle resolutionStrategy. 36 | -------------------------------------------------------------------------------- /posts/2016-04-28.md: -------------------------------------------------------------------------------- 1 | title: Grails® Slack Channel 2 | date: April 28, 2016 3 | description: Connect with the core Grails development team in the Grails Slack channel. 4 | author: Jeff Scott Brown 5 | image: 2016-04-28.jpg 6 | --- 7 | 8 | # [%title] 9 | 10 | [%author] 11 | 12 | [%date] 13 | 14 | The folks at Slack describe their application as follows: 15 | 16 | > A messaging app for teams who are changing the world. 17 | 18 | That sounds like us! :) 19 | 20 | We set up the Grails® Slack channel less than a year ago, and the channel has been very well received by the community. Our Slack channel is a great place to connect with the core Grails development team, as well as thousands of other Grails users, to ask and answer questions and to discuss ideas. 21 | 22 | The Grails Slack Channel can be found at [https://grails.slack.com](https://grails.slack.com/). Sign up at [https://slack.grails.org](https://slack.grails.org). 23 | -------------------------------------------------------------------------------- /posts/2016-05-28-img01.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apache/grails-static-website/b139c6e8add79c53bda3e38e109f3f51ac44107d/posts/2016-05-28-img01.png -------------------------------------------------------------------------------- /posts/2016-05-28-img02.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apache/grails-static-website/b139c6e8add79c53bda3e38e109f3f51ac44107d/posts/2016-05-28-img02.png -------------------------------------------------------------------------------- /posts/2016-06-02.md: -------------------------------------------------------------------------------- 1 | title: Monitoring and Metrics with Grails® 3 2 | date: June 2, 2016 3 | description: Jeff Scott Brown discusses monitoring and metrics with Grails 3 at GR8Conf EU 2016. 4 | author: Jeff Scott Brown 5 | image: 2016-06-02.jpg 6 | video: https://www.youtube.com/watch?v=wVpEsbzMj90 7 | --- 8 | # [%title] 9 | 10 | [%author] 11 | 12 | [%date] 13 | 14 | tags: #monitoring #video 15 | 16 | Jeff Scott Brown, co-founder of the Grails® framework, discusses monitoring and metrics with Grails 3 at GR8Conf EU 2016. 17 | 18 | In this presentation, Jeff demonstrates capabilities that are currently in development with the intention of soliciting feedback from the Grails community. He also introduces features of Grails 3 and Groovy. 19 | -------------------------------------------------------------------------------- /posts/2016-06-07-img01.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apache/grails-static-website/b139c6e8add79c53bda3e38e109f3f51ac44107d/posts/2016-06-07-img01.jpg -------------------------------------------------------------------------------- /posts/2016-06-07-img02.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apache/grails-static-website/b139c6e8add79c53bda3e38e109f3f51ac44107d/posts/2016-06-07-img02.jpg -------------------------------------------------------------------------------- /posts/2016-06-07-img03.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apache/grails-static-website/b139c6e8add79c53bda3e38e109f3f51ac44107d/posts/2016-06-07-img03.jpg -------------------------------------------------------------------------------- /posts/2016-06-07-img04.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apache/grails-static-website/b139c6e8add79c53bda3e38e109f3f51ac44107d/posts/2016-06-07-img04.jpg -------------------------------------------------------------------------------- /posts/2016-06-07-img05.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apache/grails-static-website/b139c6e8add79c53bda3e38e109f3f51ac44107d/posts/2016-06-07-img05.jpg -------------------------------------------------------------------------------- /posts/2016-06-26-img01.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apache/grails-static-website/b139c6e8add79c53bda3e38e109f3f51ac44107d/posts/2016-06-26-img01.jpg -------------------------------------------------------------------------------- /posts/2016-06-26-img02.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apache/grails-static-website/b139c6e8add79c53bda3e38e109f3f51ac44107d/posts/2016-06-26-img02.png -------------------------------------------------------------------------------- /posts/2016-06-26-img03.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apache/grails-static-website/b139c6e8add79c53bda3e38e109f3f51ac44107d/posts/2016-06-26-img03.jpg -------------------------------------------------------------------------------- /posts/2016-06-26-img04.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apache/grails-static-website/b139c6e8add79c53bda3e38e109f3f51ac44107d/posts/2016-06-26-img04.jpg -------------------------------------------------------------------------------- /posts/2016-06-26-img05.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apache/grails-static-website/b139c6e8add79c53bda3e38e109f3f51ac44107d/posts/2016-06-26-img05.png -------------------------------------------------------------------------------- /posts/2016-06-26-img06.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apache/grails-static-website/b139c6e8add79c53bda3e38e109f3f51ac44107d/posts/2016-06-26-img06.png -------------------------------------------------------------------------------- /posts/2016-06-26-img07.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apache/grails-static-website/b139c6e8add79c53bda3e38e109f3f51ac44107d/posts/2016-06-26-img07.png -------------------------------------------------------------------------------- /posts/2016-06-26-img08.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apache/grails-static-website/b139c6e8add79c53bda3e38e109f3f51ac44107d/posts/2016-06-26-img08.png -------------------------------------------------------------------------------- /posts/2016-06-26-img09.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apache/grails-static-website/b139c6e8add79c53bda3e38e109f3f51ac44107d/posts/2016-06-26-img09.png -------------------------------------------------------------------------------- /posts/2016-07-06-img01.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apache/grails-static-website/b139c6e8add79c53bda3e38e109f3f51ac44107d/posts/2016-07-06-img01.png -------------------------------------------------------------------------------- /posts/2016-07-06-img02.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apache/grails-static-website/b139c6e8add79c53bda3e38e109f3f51ac44107d/posts/2016-07-06-img02.png -------------------------------------------------------------------------------- /posts/2016-07-06-img03.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apache/grails-static-website/b139c6e8add79c53bda3e38e109f3f51ac44107d/posts/2016-07-06-img03.png -------------------------------------------------------------------------------- /posts/2016-07-06-img04.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apache/grails-static-website/b139c6e8add79c53bda3e38e109f3f51ac44107d/posts/2016-07-06-img04.png -------------------------------------------------------------------------------- /posts/2016-07-06-img05.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apache/grails-static-website/b139c6e8add79c53bda3e38e109f3f51ac44107d/posts/2016-07-06-img05.png -------------------------------------------------------------------------------- /posts/2016-07-06-img06.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apache/grails-static-website/b139c6e8add79c53bda3e38e109f3f51ac44107d/posts/2016-07-06-img06.png -------------------------------------------------------------------------------- /posts/2016-07-06-img07.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apache/grails-static-website/b139c6e8add79c53bda3e38e109f3f51ac44107d/posts/2016-07-06-img07.png -------------------------------------------------------------------------------- /posts/2016-07-06-img08.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apache/grails-static-website/b139c6e8add79c53bda3e38e109f3f51ac44107d/posts/2016-07-06-img08.png -------------------------------------------------------------------------------- /posts/2016-07-06-img09.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apache/grails-static-website/b139c6e8add79c53bda3e38e109f3f51ac44107d/posts/2016-07-06-img09.png -------------------------------------------------------------------------------- /posts/2016-07-06-img10.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apache/grails-static-website/b139c6e8add79c53bda3e38e109f3f51ac44107d/posts/2016-07-06-img10.png -------------------------------------------------------------------------------- /posts/2016-08-01-img01.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apache/grails-static-website/b139c6e8add79c53bda3e38e109f3f51ac44107d/posts/2016-08-01-img01.png -------------------------------------------------------------------------------- /posts/2016-08-01-img02.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apache/grails-static-website/b139c6e8add79c53bda3e38e109f3f51ac44107d/posts/2016-08-01-img02.jpg -------------------------------------------------------------------------------- /posts/2016-08-01-img03.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apache/grails-static-website/b139c6e8add79c53bda3e38e109f3f51ac44107d/posts/2016-08-01-img03.png -------------------------------------------------------------------------------- /posts/2016-08-01-img04.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apache/grails-static-website/b139c6e8add79c53bda3e38e109f3f51ac44107d/posts/2016-08-01-img04.jpg -------------------------------------------------------------------------------- /posts/2016-08-01-img05.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apache/grails-static-website/b139c6e8add79c53bda3e38e109f3f51ac44107d/posts/2016-08-01-img05.jpeg -------------------------------------------------------------------------------- /posts/2016-08-01-img06.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apache/grails-static-website/b139c6e8add79c53bda3e38e109f3f51ac44107d/posts/2016-08-01-img06.jpg -------------------------------------------------------------------------------- /posts/2016-08-01-img07.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apache/grails-static-website/b139c6e8add79c53bda3e38e109f3f51ac44107d/posts/2016-08-01-img07.jpeg -------------------------------------------------------------------------------- /posts/2016-08-01-img08.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apache/grails-static-website/b139c6e8add79c53bda3e38e109f3f51ac44107d/posts/2016-08-01-img08.jpeg -------------------------------------------------------------------------------- /posts/2016-08-01-img09.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apache/grails-static-website/b139c6e8add79c53bda3e38e109f3f51ac44107d/posts/2016-08-01-img09.jpeg -------------------------------------------------------------------------------- /posts/2016-08-01-img10.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apache/grails-static-website/b139c6e8add79c53bda3e38e109f3f51ac44107d/posts/2016-08-01-img10.jpeg -------------------------------------------------------------------------------- /posts/2016-08-01-img11.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apache/grails-static-website/b139c6e8add79c53bda3e38e109f3f51ac44107d/posts/2016-08-01-img11.jpeg -------------------------------------------------------------------------------- /posts/2016-08-01-img12.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apache/grails-static-website/b139c6e8add79c53bda3e38e109f3f51ac44107d/posts/2016-08-01-img12.jpeg -------------------------------------------------------------------------------- /posts/2016-08-01-img13.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apache/grails-static-website/b139c6e8add79c53bda3e38e109f3f51ac44107d/posts/2016-08-01-img13.jpeg -------------------------------------------------------------------------------- /posts/2016-08-01-img14.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apache/grails-static-website/b139c6e8add79c53bda3e38e109f3f51ac44107d/posts/2016-08-01-img14.png -------------------------------------------------------------------------------- /posts/2016-09-12-img01.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apache/grails-static-website/b139c6e8add79c53bda3e38e109f3f51ac44107d/posts/2016-09-12-img01.jpg -------------------------------------------------------------------------------- /posts/2016-09-12-img02.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apache/grails-static-website/b139c6e8add79c53bda3e38e109f3f51ac44107d/posts/2016-09-12-img02.jpg -------------------------------------------------------------------------------- /posts/2016-09-12-img03.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apache/grails-static-website/b139c6e8add79c53bda3e38e109f3f51ac44107d/posts/2016-09-12-img03.jpg -------------------------------------------------------------------------------- /posts/2016-10-03-img01.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apache/grails-static-website/b139c6e8add79c53bda3e38e109f3f51ac44107d/posts/2016-10-03-img01.png -------------------------------------------------------------------------------- /posts/2016-10-03-img02.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apache/grails-static-website/b139c6e8add79c53bda3e38e109f3f51ac44107d/posts/2016-10-03-img02.png -------------------------------------------------------------------------------- /posts/2016-10-03-img03.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apache/grails-static-website/b139c6e8add79c53bda3e38e109f3f51ac44107d/posts/2016-10-03-img03.png -------------------------------------------------------------------------------- /posts/2016-11-14-img01.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apache/grails-static-website/b139c6e8add79c53bda3e38e109f3f51ac44107d/posts/2016-11-14-img01.png -------------------------------------------------------------------------------- /posts/2016-11-14-img02.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apache/grails-static-website/b139c6e8add79c53bda3e38e109f3f51ac44107d/posts/2016-11-14-img02.png -------------------------------------------------------------------------------- /posts/2016-11-14-img03.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apache/grails-static-website/b139c6e8add79c53bda3e38e109f3f51ac44107d/posts/2016-11-14-img03.png -------------------------------------------------------------------------------- /posts/2016-12-14-img01.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apache/grails-static-website/b139c6e8add79c53bda3e38e109f3f51ac44107d/posts/2016-12-14-img01.jpg -------------------------------------------------------------------------------- /posts/2016-12-14-img02.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apache/grails-static-website/b139c6e8add79c53bda3e38e109f3f51ac44107d/posts/2016-12-14-img02.jpg -------------------------------------------------------------------------------- /posts/2016-12-14-img03.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apache/grails-static-website/b139c6e8add79c53bda3e38e109f3f51ac44107d/posts/2016-12-14-img03.jpg -------------------------------------------------------------------------------- /posts/2016-12-14-img04.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apache/grails-static-website/b139c6e8add79c53bda3e38e109f3f51ac44107d/posts/2016-12-14-img04.jpg -------------------------------------------------------------------------------- /posts/2016-12-14-img05.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apache/grails-static-website/b139c6e8add79c53bda3e38e109f3f51ac44107d/posts/2016-12-14-img05.jpg -------------------------------------------------------------------------------- /posts/2016-12-14-img06.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apache/grails-static-website/b139c6e8add79c53bda3e38e109f3f51ac44107d/posts/2016-12-14-img06.jpg -------------------------------------------------------------------------------- /posts/2016-12-14-img07.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apache/grails-static-website/b139c6e8add79c53bda3e38e109f3f51ac44107d/posts/2016-12-14-img07.jpg -------------------------------------------------------------------------------- /posts/2016-12-14-img08.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apache/grails-static-website/b139c6e8add79c53bda3e38e109f3f51ac44107d/posts/2016-12-14-img08.jpg -------------------------------------------------------------------------------- /posts/2017-01-20-1.md: -------------------------------------------------------------------------------- 1 | title: Quickcast #3: Multi-Project Builds 2 | date: January 20, 2017 3 | description: In this Quickcast, Grails® framework co-founder, Graeme Rocher, walks you through multi-project builds in Grails apps. 4 | author: Graeme Rocher 5 | image: quickcast.jpg 6 | video: https://www.youtube.com/watch?v=yNA0ce5fG9s 7 | --- 8 | 9 | # [%title] 10 | 11 | [%author] 12 | 13 | [%date] 14 | 15 | Tags: #quickcast 16 | 17 | In this video, Grails® framework co-founder Graeme Rocher walks you through multi-project builds in Grails apps. 18 | 19 | The Grails framework does a few handy things with multi-project builds and plugins, not the least of which being that Grails compiles your plugins first and puts the class and resources of those plugins directly in the classpath. This lets you make changes to your plugins and instantly see those changes in your build. 20 | 21 | Grails Quickcasts, brought to you through a partnership between [Object Computing, Inc.](https://objectcomputing.com/) (OCI) and [DZone](https://dzone.com/), provide bite-sized tutorials to help you maximize your productivity with the Framework. 22 | -------------------------------------------------------------------------------- /posts/2017-01-20-2.md: -------------------------------------------------------------------------------- 1 | title: Quickcast #4: Angular Scaffolding 2 | date: January 20, 2017 3 | description: This tutorial demonstrates how to have the Grails® framework set up a REST endpoint and all the Angular modules needed to get a web app running. 4 | author: James Kleeh 5 | image: quickcast.jpg 6 | video: https://www.youtube.com/watch?v=tT4BdlRFAis 7 | --- 8 | 9 | # [%title] 10 | 11 | [%author] 12 | 13 | [%date] 14 | 15 | Tags: #quickcast #rest 16 | 17 | In this Quickcast, 2GM (Groovy, Grails® framework, and Micronaut) team member, [James Kleeh](https://objectcomputing.com/products/2gm-team#kleeh), walks you through the process of using the Angular scaffolding for Grails apps to build a fully functional web app, using a simple blog format for demonstration. 18 | 19 | The tutorial explains how to have the Grails framework set up a REST endpoint and all the Angular modules needed to get the web app running. 20 | 21 | Grails Quickcasts, brought to you through a partnership between [Object Computing, Inc.](https://objectcomputing.com/) (OCI) and [DZone](https://dzone.com/), provide bite-sized tutorials to help you maximize your productivity with the Framework. 22 | -------------------------------------------------------------------------------- /posts/2017-01-20-3.md: -------------------------------------------------------------------------------- 1 | title: Quickcast #5: Retrieving Runtime Config Values in Grails® 3 2 | date: January 20, 2017 3 | description: Jeff Scott Brown highlights some of the great features of the Grails Framework. 4 | author: Jeff Scott Brown 5 | image: quickcast.jpg 6 | video: https://www.youtube.com/watch?v=Qw5hjwT9EOc 7 | --- 8 | 9 | # [%title] 10 | 11 | [%author] 12 | 13 | [%date] 14 | 15 | Tags: #quickcast 16 | 17 | In this short video tutorial, Grails® framework co-founder, [Jeff Scott Brown](https://objectcomputing.com/products/2gm-team#brown), highlights some of the great features of the Grails framework. 18 | 19 | In fewer than 18 minutes, Jeff describes several techniques for retrieving configuration values at runtime and discusses the pros and cons of each. Visit [this Grails blog post](https://objectcomputing.com/news/2016/08/31/retrieving-config-values-grails-3) for an accompanying article. 20 | 21 | For this Quickcast, you’ll need no more than a basic understanding of the Grails framework. 22 | 23 | Grails Quickcasts, brought to you through a partnership between [Object Computing, Inc.](https://objectcomputing.com/) (OCI) and [DZone](https://dzone.com/), provide bite-sized tutorials to help you maximize your productivity with the Framework. 24 | -------------------------------------------------------------------------------- /posts/2017-01-20-4.md: -------------------------------------------------------------------------------- 1 | title: Quickcast #6: Developing Grails® 3 Applications with IntelliJ IDEA 2 | date: January 20, 2017 3 | description: In the sixth Grails Quickcast, Grails framework co-founder, Jeff Scott Brown, introduces several tips and tricks related to building Grails 3 applications in IDEA. 4 | author: Jeff Scott Brown 5 | image: quickcast.jpg 6 | video: https://www.youtube.com/watch?v=XsCCsTRdezw 7 | --- 8 | 9 | # [%title] 10 | 11 | [%author] 12 | 13 | [%date] 14 | 15 | Tags: #quickcast 16 | 17 | Grails® 3 is a high-productivity framework for building web applications for the JVM. 18 | 19 | IntelliJ IDEA is a high-productivity Integrated Development Environment (IDE) for building a variety of application types. IDEA has always had great support for building Grails applications and, in particular, has the best support of any IDE for developing with Grails 3. 20 | 21 | In this 20-minute video, Grails framework co-founder, [Jeff Scott Brown](https://objectcomputing.com/products/2gm-team#brown), introduces several tips and tricks related to building Grails 3 applications in IDEA. 22 | 23 | Grails Quickcasts, brought to you through a partnership between [Object Computing, Inc.](https://objectcomputing.com/) (OCI) and [DZone](https://dzone.com/), provide bite-sized tutorials to help you maximize your productivity with the Framework. 24 | -------------------------------------------------------------------------------- /posts/2017-07-12.md: -------------------------------------------------------------------------------- 1 | title: Quickcast #7: Logging with Grails® 3 2 | date: July 12, 2017 3 | description: Sergio del Amo Caballero introduces several tips and tricks related to logging with a Grails 3 application. 4 | author: Sergio del Amo Caballero 5 | image: quickcast.jpg 6 | video: https://www.youtube.com/watch?v=3TppFy3lq1A 7 | --- 8 | 9 | # [%title] 10 | 11 | [%author] 12 | 13 | [%date] 14 | 15 | Tags: #quickcast 16 | 17 | In this 20-minute video, 2GM (Groovy, Grails® framework, and Micronaut) team member, [Sergio del Amo Caballero](https://objectcomputing.com/products/2gm-team#caballero), introduces several tips and tricks related to logging with a Grails 3 application. 18 | 19 | Sergio discusses changes to logger names in Grails 3.3 and things to bear in mind when logging in Grails artifacts and Groovy POGOs. 20 | 21 | Moreover, he explains the benefits of using Slf4j, parameterized logging, how to configure rolling logging, how to use an external configuration file, and more. 22 | 23 | Grails Quickcasts, brought to you through a partnership between [Object Computing, Inc.](https://objectcomputing.com/) (OCI) and [DZone](https://dzone.com/), provide bite-sized tutorials to help you maximize your productivity with the Framework. 24 | -------------------------------------------------------------------------------- /posts/2017-10-30.md: -------------------------------------------------------------------------------- 1 | title: Quickcast #8: Grails® React Profile 2 | date: October 30, 2017 3 | description: Zachary Klein demonstrates how to use the Grails® 3 React profile to build Grails applications with a React frontend. 4 | author: Zachary Klein 5 | image: quickcast.jpg 6 | video: https://www.youtube.com/watch?v=JVLn7kWkjp0 7 | --- 8 | 9 | # [%title] 10 | 11 | [%author] 12 | 13 | [%date] 14 | 15 | Tags: #quickcast #react 16 | 17 | In this short video tutorial, 2GM (Groovy, Grails® framework, and Micronaut) team member, [Zachary Klein](https://objectcomputing.com/products/2gm-team#klein-z), demonstrates how to use the Grails 3 React profile to build Grails applications with a React frontend. 18 | 19 | In particular, Zak shows you how to create a single project build, which allows you to mix React code with common Grails-view technologies, such as GSP. 20 | 21 | Moreover, he discusses the different Gradle tasks bundled with the profile and the typical workflow you may use while using it. 22 | 23 | Grails Quickcasts, brought to you through a partnership between [Object Computing, Inc.](https://objectcomputing.com/) (OCI) and [DZone](https://dzone.com/), provide bite-sized tutorials to help you maximize your productivity with the Framework. 24 | -------------------------------------------------------------------------------- /posts/2017-11-09.md: -------------------------------------------------------------------------------- 1 | title: Webinar: Grails® 3 for Spring Developers 2 | date: November 9, 2017 3 | description: Discover Grails® from the perspective of a Spring developer in this 75-minute webinar presented by Jeff Brown and Josh Long. 4 | author: Jeff Scott Brown & Josh Long 5 | image: 2017-11-09.jpg 6 | video: https://www.youtube.com/watch?v=71Avk4IcEPs 7 | --- 8 | 9 | # [%title] 10 | 11 | [%author] 12 | 13 | [%date] 14 | 15 | Tags: #webinar 16 | 17 | ## Overview 18 | 19 | Grails® 3 is a full stack framework built on top of Spring Boot. In addition to all of the capabilities offered by Boot, developers using Grails 3 benefit from the enormous productivity gains and other features (e.g., GORM, Profiles, etc.) that Grails 3 packs in! 20 | 21 | In this webinar, Spring Developer Advocate, Josh Long (@starbuxman), and Grails framework co-founder, Jeff Scott Brown (@jeffscottbrown), introduce the Grails framework from the perspective of a Spring developer and demonstrate how these awesome technologies play so well together. 22 | 23 | The session will be of interest to anyone looking to build robust JVM web applications with high productivity, while keeping the application code expressive and simple. 24 | 25 | Grails developers will find many interesting tips and tricks during the demonstrations but no prior experience with the Grails framework is necessary. 26 | 27 | ## Outline 28 | 29 | The following topics are covered in this webinar: 30 | 31 | - Quick Intro to Spring & the Grails framework 32 | - REST 33 | - JSON views 34 | - Testing 35 | - Plugins 36 | - Security 37 | - Deployment 38 | - Customizing Spring Boot in a Grails app 39 | -------------------------------------------------------------------------------- /posts/2017-11-30-img01.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apache/grails-static-website/b139c6e8add79c53bda3e38e109f3f51ac44107d/posts/2017-11-30-img01.png -------------------------------------------------------------------------------- /posts/2017-11-30.md: -------------------------------------------------------------------------------- 1 | title: Eric Helgeson Named 2017 Grails® Rock Star 2 | date: November 30, 2017 3 | description: The Grails® Rock Star Award recognizes a member of the Grails Community for his or her outstanding contributions to the success of the Framework. 4 | author: Sergio Del Amo Caballero 5 | image: 2017-11-30.jpg 6 | --- 7 | 8 | # [%title] 9 | 10 | [%author] 11 | 12 | [%date] 13 | 14 | The Grails® Rock Star Award recognizes a member of the Grails Community for his or her outstanding contributions to the success of the Framework. 15 | 16 | Yesterday at G3 Summit 2017, Eric Helgeson was awarded the Grails Rock Star Award. Eric is the author of the book [Practical Grails 3](https://www.grails3book.com/), and he is often seen in the [Grails Slack Community](https://grails.slack.com/) answering and helping other users. Moreover, Eric contributes to the Grails Community with code, plugin development, issues reporting, etc. 17 | 18 | Also, Graeme Rocher and Jeff Scott Brown, Grails framework co-founders, were awarded Grails lifetime contributor awards for their contributions in the past decade to the framework success. 19 | 20 | **Congratulations to Eric, Graeme, and Jeff for these well deserved awards.** 21 | 22 | ![Eric Helgeson, Graeme Rocher, and Jeff Scott Brown were honored at G3 Summit 2017 for their contributions to the Grails framework.](2017-11-30-img01.png) 23 | -------------------------------------------------------------------------------- /posts/2018-02-08.md: -------------------------------------------------------------------------------- 1 | title: Quickcast #9: GORM Many-to-One Relationship – Replacing a Collection 2 | date: February 8, 2018 3 | description: Sergio Del Amo Caballero explains how to efficiently replace a many-to-one collection with a minimal number of queries and by leveraging cascade behavior. 4 | author: Sergio del Amo Caballero 5 | image: quickcast.jpg 6 | video: https://www.youtube.com/watch?v=7Ypy6osALxY 7 | --- 8 | 9 | # [%title] 10 | 11 | [%author] 12 | 13 | [%date] 14 | 15 | Tags: #quickcast 16 | 17 | GORM, a powerful Groovy-based data-access toolkit for the JVM, enables simplified creation of many-to-one relationships. 18 | 19 | In this short video tutorial, 2GM (Groovy, Grails® framework, and Micronaut) team member, [Sergio Del Amo Caballero](https://objectcomputing.com/products/2gm-team#caballero), explains how to efficiently replace a many-to-one collection with a minimal number of queries and by leveraging cascade behavior. 20 | 21 | Grails Quickcasts, brought to you through a partnership between [Object Computing, Inc.](https://objectcomputing.com/) (OCI) and [DZone](https://dzone.com/), provide bite-sized tutorials to help you maximize your productivity with the Framework. 22 | -------------------------------------------------------------------------------- /posts/2018-02-09.md: -------------------------------------------------------------------------------- 1 | title: Webinar: Developing React Apps with Grails® 3 2 | date: February 9, 2018 3 | description: Learn how Grails® and React work together to simplify web app development. 4 | author: Zachary Klein 5 | image: 2018-02-09.jpg 6 | video: https://www.youtube.com/watch?v=tjQHQDwaxto 7 | slides: https://objectcomputing.com/files/9315/1855/8037/2018-02-09-Grails-React-Webinar-Slides.pdf 8 | --- 9 | 10 | # [%title] 11 | 12 | [%author] 13 | 14 | [%date] 15 | 16 | Tags: #webinar #react #javascript 17 | 18 | ## Overview 19 | 20 | React is the JavaScript view library from our friends at Facebook. Rather than providing a "full-stack framework" for the front end, React focuses entirely on being the 'V' in MVC. 21 | 22 | In this 60-minute webinar, 2GM (Groovy, Grails® framework, and Micronaut) team member, [Zachary Klein](https://objectcomputing.com/products/2gm-team#klein-z), demonstrates how to leverage React in your projects. You'll learn several ways to use these two frameworks together and get an introduction to the React profile for Grails apps. 23 | 24 | ## Outline 25 | 26 | The following topics are covered in this webinar: 27 | 28 | - Overview of React and build tooling 29 | - 3 Approaches to building Grails projects with React 30 | - The React profile 31 | - Spring Security REST 32 | - Unified deployment 33 | 34 | This webinar is a useful tutorial for Grails developers interested in adding React or another front-end framework/library to their projects. Front-end developers are also encouraged to discover what the Grails framework has to offer in a modern web development workflow. 35 | -------------------------------------------------------------------------------- /posts/2018-03-02-img01.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apache/grails-static-website/b139c6e8add79c53bda3e38e109f3f51ac44107d/posts/2018-03-02-img01.png -------------------------------------------------------------------------------- /posts/2018-03-02-img02.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apache/grails-static-website/b139c6e8add79c53bda3e38e109f3f51ac44107d/posts/2018-03-02-img02.png -------------------------------------------------------------------------------- /posts/2018-03-02-img03.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apache/grails-static-website/b139c6e8add79c53bda3e38e109f3f51ac44107d/posts/2018-03-02-img03.png -------------------------------------------------------------------------------- /posts/2018-03-02-img04.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apache/grails-static-website/b139c6e8add79c53bda3e38e109f3f51ac44107d/posts/2018-03-02-img04.png -------------------------------------------------------------------------------- /posts/2018-03-06.md: -------------------------------------------------------------------------------- 1 | title: Webinar: Browser Automation Testing with Geb & the Grails® Framework 2 | date: March 6, 2018 3 | description: Marcin Erdmann and Sergio del Amo Caballero discuss how Geb integrates seamlessly into the Grails® workflow and how this combination leads to robust and well-tested applications. 4 | author: Sergio del Amo Caballero & Marcin Erdmann 5 | image: grails-blog-index-4.png 6 | video: https://www.youtube.com/watch?v=E7zjib3wrxk 7 | --- 8 | 9 | # [%title] 10 | 11 | [%author] 12 | 13 | [%date] 14 | 15 | Tags: #webinar #geb 16 | 17 | Geb brings together the power of WebDriver, the elegance of jQuery content selection, the robustness of page-object modeling, and the expressiveness of the Groovy language. Together with Spock, Geb integrates into Grails® apps to ease the creation of functionals/acceptance tests. 18 | 19 | In this webinar, Geb Lead, Marcin Erdmann, and Grails team member, Sergio del Amo Caballero, discuss how Geb integrates seamlessly into the Grails workflow and how this combination leads to robust and well-tested applications. 20 | -------------------------------------------------------------------------------- /posts/2018-03-09.md: -------------------------------------------------------------------------------- 1 | title: Webinar: Build a Better API with GORM & GraphQL 2 | date: March 9, 2018 3 | description: James Kleeh demonstrates how a new GORM extension and Grails® plugin combine GORM and GraphQL to increase developer productivity. 4 | author: James Kleeh 5 | image: 2018-03-09.jpg 6 | video: https://www.youtube.com/watch?v=KphmxzIaVf0 7 | slides: https://objectcomputing.com/files/2115/2088/9809/180309-GORM-GraphQL-Webinar-Deck.pdf 8 | --- 9 | 10 | # [%title] 11 | 12 | [%author] 13 | 14 | [%date] 15 | 16 | Tags: #webinar #gorm #graphql 17 | 18 | ## Overview 19 | 20 | GraphQL is an exceptional technology that allows APIs to be more efficient and expressive. GORM is the object relational mapper used by Grails® apps that enables developers to interact with both relational and document databases through the declaration of simple Groovy classes. 21 | 22 | In this 55-minute webinar, 2GM (Groovy, Grails framework, and Micronaut) team member, [James Kleeh](https://objectcomputing.com/products/2gm-team#kleeh), discusses in depth a new GORM extension and Grails plugin that combine these two great technologies and increase developer productivity. 23 | 24 | ## Outline 25 | 26 | The following topics are covered in this webinar. 27 | 28 | - GORM Introduction 29 | - GraphQL Introduction 30 | - Comparison of GraphQL vs REST 31 | - GORM-GraphQL Features 32 | - GORM-GraphQL Customizations 33 | - GORM-GraphQL Testing 34 | 35 | This webinar is an excellent learning opportunity for developers who wish to improve the efficiency and expressiveness of their APIs. 36 | -------------------------------------------------------------------------------- /posts/2018-04-06.md: -------------------------------------------------------------------------------- 1 | title: Webinar: Database Migration with Grails® 3 2 | date: April 6, 2018 3 | description: Nirav Assar demonstrates how to apply the Grails® Database Migration plugin in development and production. 4 | author: Nirav Assar 5 | image: 2018-04-06.jpg 6 | video: https://www.youtube.com/watch?v=rNdfozn7NCs 7 | slides: https://objectcomputing.com/files/2715/2338/5917/180409-Database_Migration_Grails_3_Webinar_Deck.pdf 8 | --- 9 | 10 | # [%title] 11 | 12 | [%author] 13 | 14 | [%date] 15 | 16 | Tags: #webinar 17 | 18 | ## Overview 19 | 20 | Database migrations are an important facet of web development. Preserving existing data while seamlessly adding new functionality and tables is critical when making incremental database changes to production applications. 21 | 22 | Without a tool to manage database migrations, developers end up cobbling together solutions using manual SQL, error-prone communication processes, and costly risk management strategies. 23 | 24 | In this webinar, 2GM (Groovy, Grails® framework, and Micronaut) team member, [Nirav Assar](https://objectcomputing.com/products/2gm-team#assar), demonstrates how to apply the Grails Database Migration plugin in development and production. 25 | 26 | ## Outline 27 | 28 | The following topics are covered in this webinar: 29 | 30 | - Fundamental database management concepts 31 | - Overview of database migration tools 32 | - Demonstration of the Grails Database Migration plugin 33 | - Live coding examples representing real-world use cases 34 | - Advanced scenarios and best practices 35 | -------------------------------------------------------------------------------- /posts/2018-05-18.md: -------------------------------------------------------------------------------- 1 | title: Webinar: Groovy 2.5+ Roadmap with Paul King 2 | date: May 18, 2018 3 | description: Paul King introduces the latest features in Groovy 2.5 and provides a peek at what's planned for Groovy 3.0. 4 | author: Paul King 5 | image: 2018-05-18.jpg 6 | video: https://www.youtube.com/watch?v=ECZVbiFZPwE 7 | slides: https://objectcomputing.com/files/7715/2708/5312/180518-Groovy-Update-slide-deck.pdf 8 | --- 9 | 10 | # [%title] 11 | 12 | [%author] 13 | 14 | [%date] 15 | 16 | Tags: #webinar #groovy 17 | 18 | In this webinar, [Paul King](https://objectcomputing.com/products/2gm-team#king) introduces you to the latest features in Groovy 2.5 and offers a peek at what's planned for Groovy 3.0, including new AST transforms, new macro features, the new Parrot parser, and myriad other miscellaneous features. 19 | 20 | ## Outline 21 | 22 | The following topics are covered in this webinar. 23 | 24 | - AST Macros – write AST transformations and code generation or matching code in a Groovy friendly syntax 25 | - AST Transformations – new transforms and improvements including revamped versions of @Canonical and @Immutable 26 | - New DGM capabilities and library improvements – tap command, miscellaneous improvements 27 | - Improved tool support, including groovysh and Groovy console 28 | - Improvements throughout the libraries – JSON improvements, CliBuilder with annotations 29 | - The Parrot Parser – Java syntax alignment, new features, advanced capabilities 30 | - JDK9: support, limitations and on-going work 31 | -------------------------------------------------------------------------------- /posts/2018-08-22-1.md: -------------------------------------------------------------------------------- 1 | title: Quickcast #10: Debugging Grails® Apps 2 | date: August 22, 2018 3 | description: Iván López demonstrates a variety of ways to debug Grails® core code and the Grails CLI. 4 | author: Iván López 5 | image: quickcast.jpg 6 | video: https://www.youtube.com/watch?v=y69Cr_hYUCA 7 | --- 8 | 9 | # [%title] 10 | 11 | [%author] 12 | 13 | [%date] 14 | 15 | Tags: #quickcast 16 | 17 | In this 13-minute Quickcast, 2GM (Groovy, Grails® framework, and Micronaut) team member, [Iván López](https://objectcomputing.com/products/2gm-team#lopez), demonstrates a variety of ways to debug Grails core code and the Grails CLI (command line interface). Developers may use these tips to fix issues or contribute enhancements to the core Grails framework. 18 | 19 | Grails Quickcasts, brought to you through a partnership between [Object Computing, Inc.](https://objectcomputing.com/) (OCI) and [DZone](https://dzone.com/), provide bite-sized tutorials to help you maximize your productivity with the Framework. 20 | -------------------------------------------------------------------------------- /posts/2018-08-22-2.md: -------------------------------------------------------------------------------- 1 | title: Quickcast #11: Grails® Profiling with YourKit 2 | date: August 22, 2018 3 | description: Nirav Assar, demonstrates how to use YourKit to profile a Grails® application and spot CPU problems and heap and garbage collection issues. 4 | author: Nirav Assar 5 | image: quickcast.jpg 6 | video: https://www.youtube.com/watch?v=NJ_T5g4bBeY 7 | --- 8 | 9 | # [%title] 10 | 11 | [%author] 12 | 13 | [%date] 14 | 15 | Tags: #quickcast #yourkit 16 | 17 | In this Quickcast, 2GM (Groovy, Grails® framework, and Micronaut) team member, [Nirav Assar](https://objectcomputing.com/products/2gm-team#assar), demonstrates how to use YourKit to profile a Grails application and spot CPU problems and heap and garbage collection issues. 18 | 19 | Grails Quickcasts, brought to you through a partnership between [Object Computing, Inc.](https://objectcomputing.com/) (OCI) and [DZone](https://dzone.com/), provide bite-sized tutorials to help you maximize your productivity with the Framework. 20 | -------------------------------------------------------------------------------- /posts/2018-09-23.md: -------------------------------------------------------------------------------- 1 | title: Security Vulnerability in Asset-Pipeline and Jetty 2 | date: September 23, 2018 3 | description: Security vulnerability in asset-pipeline and Jetty 4 | author: Iván López 5 | image: 2018-09-23.jpg 6 | --- 7 | 8 | # [%title] 9 | 10 | [%author] 11 | 12 | [%date] 13 | 14 | Tags: #plugins 15 | 16 | ## Introduction 17 | 18 | [Asset-pipeline](https://github.com/bertramdev/asset-pipeline) has been the default plugin for handling static assets in a Grails® web application since Grails 2.4.0\. A security vulnerability that involves asset-pipeline and Jetty has been identified. 19 | 20 | ## Affected Versions 21 | 22 | The vulnerability affects all asset-pipeline users that deploy Grails applications in Jetty, and it allows directory traversal and download any file knowing its specific directory. 23 | 24 | ## Reproducing The Issue 25 | 26 | * Create a new grails application: `grails create-app foo` 27 | * In `build.gradle` change the `spring-boot-starter-tomcat` to `spring-boot-starter-jetty` 28 | * Build a war file: `grails war` 29 | * Deploy to Jetty 30 | * Send the following request to download Application.class `wget localhost:8080/foo-0.1/assets/..%5c%5cfoo%5cApplication.class -O Application.class` 31 | * It is also possible to download any any arbitrary file if the path is known. For example to download `application.yml`execute `curl -v localhost:8080/foo-0.1/assets/..%5capplication.yml`. 32 | 33 | ## Fixing The Issue 34 | 35 | The vulnerability has been addressed in recent versions of the asset-pipeline plugin: 36 | 37 | * 2.14.1.1 for Grails 2.x 38 | * 2.15.1 for Grails 3 and Java 7 39 | * 3.0.6 for Grails 3 and Java 8 40 | -------------------------------------------------------------------------------- /posts/2019-01-07.md: -------------------------------------------------------------------------------- 1 | title: SDKMAN! with Travis 2 | date: January 7, 2019 3 | description: Learn the steps involved to install SDKMAN in Travis CI. 4 | author: Sergio del Amo Caballero 5 | image: 2019-01-07.jpg 6 | --- 7 | 8 | # [%title] 9 | 10 | [%author] 11 | 12 | [%date] 13 | 14 | Tags: #deployment 15 | 16 | The [2GM (Groovy, Grails® framework, and Micronaut) team](https://objectcomputing.com/products/2gm-team) at [Object Computing, Inc.](https://objectcomputing.com/) (OCI) uses [Travis CI](https://travis-ci.org/) and [SDKMAN!](https://sdkman.io/) daily. 17 | 18 | Using SDKMAN! in Travis is possible and opens a lot of possibilities. 19 | 20 | The following `.travis.yml` file will install SDKMAN! and create a Grails app using the latest version available. 21 | 22 | ```bash 23 | install: true 24 | jdk: 25 | - oraclejdk8 26 | script: 27 | - curl -s get.sdkman.io | bash 28 | - source "$HOME/.sdkman/bin/sdkman-init.sh" 29 | - echo sdkman_auto_answer=true > ~/.sdkman/etc/config 30 | - source "/home/travis/.sdkman/bin/sdkman-init.sh" 31 | - sdk install grails 32 | ``` -------------------------------------------------------------------------------- /posts/2019-01-30.md: -------------------------------------------------------------------------------- 1 | title: Quickcast #12: Building Grails® Applications with Gradle 2 | date: January 30, 2019 3 | description: Sergio del Amo explores Grails® integration with the Gradle build tool. 4 | author: Sergio del Amo Caballero 5 | image: quickcast.jpg 6 | video: https://www.youtube.com/watch?v=-h3YfHbGkvA 7 | --- 8 | 9 | # [%title] 10 | 11 | [%author] 12 | 13 | [%date] 14 | 15 | Tags: #quickcast 16 | 17 | In this Grails® Quickcast, 2GM (Groovy, Grails framework, and Micronaut) team member, [Sergio del Amo](https://objectcomputing.com/products/2gm-team#caballero), explores Grails integration with the Gradle build tool. 18 | 19 | In this 25-minute tutorial, Sergio: 20 | 21 | - Explains the Gradle wrapper-related files 22 | - Explains how it's possible to delegate IDE build/run actions from IntelliJ IDEA to Gradle 23 | - Introduces common Gradle tasks for Grails developers, such as bootRun, test, integrationTest, and check or assemble 24 | - Demonstrates how to work with system properties and get a more verbose output from your Gradle test executions 25 | 26 | Grails Quickcasts, brought to you through a partnership between [Object Computing, Inc.](https://objectcomputing.com/) (OCI) and [DZone](https://dzone.com/), provide bite-sized tutorials to help you maximize your productivity with the Framework. 27 | -------------------------------------------------------------------------------- /posts/2019-03-27.md: -------------------------------------------------------------------------------- 1 | title: Webinar: Introducing Grails® 4: Upgrades and New Features 2 | date: March 27, 2019 3 | description: In anticipation of the 2019 release of Grails® 4, Grails team member, James Kleeh, hosts this webinar to bring you up to date on the latest upgrades and prepare you to migrate to the newest iteration of the framework. 4 | author: James Kleeh 5 | image: 2019-03-27.jpg 6 | video: https://www.youtube.com/watch?v=EVA_pIrjVdo 7 | slides: https://objectcomputing.com/files/9715/5371/5835/Slide_Deck_Introducing_Grails_4_Webinar.pdf 8 | --- 9 | 10 | # [%title] 11 | 12 | [%author] 13 | 14 | [%date] 15 | 16 | Tags: #webinar 17 | 18 | This webinar provides an introduction to the latest iteration of the Grails® framework. 19 | 20 | ## Overview 21 | 22 | The first milestone of Grails 4 was released in February 2019, and further milestones and release candidates are forthcoming, pending community feedback. 23 | 24 | This webinar, hosted by 2GM (Groovy, Grails framework, and Micronaut) team member [James Kleeh](https://objectcomputing.com/products/2gm-team#kleeh), provides Grails users a summary of the new features they can expect in Grails 4 (including Micronaut integration!) and a good idea of what to expect regarding the upgrade process. 25 | 26 | ## Outline 27 | 28 | The following topics are covered in this webinar: 29 | 30 | - Differences between Grails 3 and Grails 4 31 | - Key upgrades and new features 32 | - Why Spring Loaded is out, and how this impacts your Grails applications 33 | - What Micronaut integration means for you 34 | - What to expect from the upgrade effort going forward 35 | -------------------------------------------------------------------------------- /posts/2019-06-18.md: -------------------------------------------------------------------------------- 1 | title: Webinar: Using Apache Groovy for Data Science 2 | date: June 18, 2019 3 | description: Discover how to leverage the power of Apache Groovy to extract meaning from large data sets. 4 | author: Paul King 5 | image: 2019-06-18.jpg 6 | video: https://www.youtube.com/watch?v=rixvYN-DCPk 7 | slides: https://objectcomputing.com/files/5715/6095/8662/Slide_Deck_Groovy_for_Data_Science_Webinar.pdf 8 | --- 9 | 10 | # [%title] 11 | 12 | [%author] 13 | 14 | [%date] 15 | 16 | Tags: #webinar #groovy 17 | 18 | Apache Groovy is a multi-faceted, multi-paradigm programming language for the JVM that offers a wealth of features that make it ideal for transforming big data into usable solutions. 19 | 20 | - It has a dynamic nature like Python, which means that it is very powerful, easy to learn, and productive. 21 | - It has a static nature like Java and Kotlin, which makes it fast when needed. 22 | - And it has first-class functional support, meaning that it offers features and allows solutions similar to Scala. 23 | 24 | In this complimentary webinar, [Object Computing Groovy Practice Lead, Paul King](https://objectcomputing.com/products/2gm-team#king), reviews the key benefits of using Groovy to develop data science solutions, including integration with various JDK libraries commonly used in data science solutions. 25 | -------------------------------------------------------------------------------- /posts/2019-12-20.md: -------------------------------------------------------------------------------- 1 | title: Webinar: Grails® 4 Upgrade 2 | date: December 20, 2019 3 | description: Easily upgrade your Grails® 3 applications to Grails 4 with this step-by-step demonstration presented by Grails team member, Sergio del Amo Caballero. 4 | author: Sergio del Amo Caballero 5 | image: 2019-12-20.jpg 6 | video: https://www.youtube.com/watch?v=i-zSKRsI2FA 7 | slides: https://objectcomputing.com/files/5715/7841/1261/Slide_Deck_Grails_4_Upgrade_Webinar.pdf 8 | --- 9 | 10 | # [%title] 11 | 12 | [%author] 13 | 14 | [%date] 15 | 16 | Tags: #webinar 17 | 18 | Join 2GM (Groovy, Grails® framework, and Micronaut) team member, [Sergio del Amo](https://objectcomputing.com/products/2gm-team#caballero), for an in-depth demonstration of how to upgrade a Grails 3 application to Grails 4. Sergio also shows you how to benefit from the Micronaut integration available in the new iteration of the framework. 19 | 20 | ## Outline 21 | 22 | The following topics are covered in this webinar: 23 | 24 | * Grails 4 migration checklist 25 | * SpringBoot changes 26 | * Gradle changes 27 | * GORM changes 28 | * Plugin changes 29 | * Grails development hot reload 30 | * Micronaut + the Grails framework 31 | * Migration from Rest client builder to Micronaut HTTP client 32 | -------------------------------------------------------------------------------- /posts/2020-10-01-2gm-town-hall.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: 2GM Quarterly Town Hall Meetings 3 | date: Oct 1, 2020 4 | description: 2GM Town Hall Meetings give the Groovy, Grails® framework, and Micronaut team a chance to engage with you and empower you to contribute to the frameworks you love. 5 | author: Jen Wiese 6 | image: grails-blog-index-6.png 7 | --- 8 | 9 | # [%title] 10 | 11 | [%author] 12 | 13 | [%date] 14 | 15 | Tags: #townhall 16 | 17 | At Object Computing, home to the Grails® framework and Micronaut, our core values energize and guide us in all that we do. Those values are: 18 | 19 | - All of us is better than any one of us. 20 | - Innovate courageously. 21 | - Share it back. 22 | 23 | As part of our commitment to empowering technologists – both within our organization and without – to find inspiration in these values, we invest our resources in open source projects. Through those projects, we have the opportunity to engage with the global open source community, including the Groovy, Grails framework, and Micronaut communities – communities that are supportive, enthusiastic, creative, and full of thought leaders. 24 | 25 | 2GM Town Hall Meetings provide the Groovy, Grails framework, and Micronaut communities a place to gather once per quarter to review the most up-to-date news and resources available, celebrate accomplishments, ask questions, and participate more fully in the 2GM ecosystems. 26 | 27 | Each Town Hall Meeting is led by a panel of 2GM users, developers, and advocates. Everyone in the 2GM communities is welcome and encouraged to participate. 28 | 29 | We look forward to hearing from you, learning from you, engaging with you, and empowering you to contribute to the community and the frameworks you love. 30 | -------------------------------------------------------------------------------- /posts/2020-10-26-grails-foundation-announcement.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: Grails® Foundation Announced 3 | date: Oct 26, 2020 4 | description: We're pleased to announce the formation of the Grails® Foundation, a not-for-profit organization that exists to support and collectively lead the open source Grails® Framework. 5 | author: Jen Wiese 6 | image: grails-blog-index-5.png 7 | --- 8 | 9 | # [%title] 10 | 11 | [%author] 12 | 13 | [%date] 14 | 15 | Tags: #foundation 16 | 17 | We're pleased to announce the formation of the new Grails® Foundation, a not-for-profit company established to support and continue to advance the open source Grails® Framework. 18 | 19 | The Grails Foundation oversees software roadmap and development, best practices and processes, repository control, documentation and support, and fundraising related to the open source framework. 20 | 21 | [Continue reading on Object Computing, Inc. (OCI) website](https://objectcomputing.com/news/2020/10/26/new-grails-foundation-announced) 22 | -------------------------------------------------------------------------------- /posts/2021-02-05-2gm-town-hall-q1.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: Webinar: 2GM TOWN HALL MEETING: 2021 Q1 3 | date: February 5, 2021 4 | description: 2GM Town Hall Meetings provide the Groovy, Grails, and Micronaut communities a place to gather once per quarter to review the most up-to-date news and resources available, celebrate accomplishments, ask questions, and participate more fully in the 2GM ecosystems. 5 | author: Jen Wiese 6 | image: grails-blog-index-4.png 7 | video: https://www.youtube.com/watch?v=j7sf8G63OrI 8 | slides: https://objectcomputing.com/download_file/5088 9 | --- 10 | 11 | # [%title] 12 | 13 | [%author] 14 | 15 | [%date] 16 | 17 | Tags: #webinar #townhall 18 | 19 | A big thanks to everyone who joined us for our first 2GM Town Hall of 2021! We had a great time and learned about several exciting goings on within the Groovy, Grails, and Micronaut communities. For those of you who missed the live event, the recording is embedded below. 20 | 21 | I would like to take this opportunity to thank our awesome panel of experts: 22 | 23 | James Kleeh, Micronaut Development Lead 24 | Puneet Behl, Grails Development Lead 25 | Paul King, Groovy Development Lead 26 | Plus, our guest panelist, Graeme Rocher, Architect at Oracle 27 | 28 | Stay tuned for details about our next 2GM Town Hall meeting. 29 | 30 | 31 | -------------------------------------------------------------------------------- /posts/2021-03-22-gideon-hello-world.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apache/grails-static-website/b139c6e8add79c53bda3e38e109f3f51ac44107d/posts/2021-03-22-gideon-hello-world.png -------------------------------------------------------------------------------- /posts/2021-04-07-img01.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apache/grails-static-website/b139c6e8add79c53bda3e38e109f3f51ac44107d/posts/2021-04-07-img01.png -------------------------------------------------------------------------------- /posts/2021-05-21-2gm-town-hall-q2.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: 2GM Town Hall Meeting: 2021 Q2 3 | date: May 21, 2021 4 | description: 2GM Town Hall Meetings provide the Groovy, Grails, and Micronaut communities a place to gather once per quarter to review the most up-to-date news and resources available, celebrate accomplishments, ask questions, and participate more fully in the 2GM ecosystems. 5 | author: Jen Wiese 6 | image: grails-blog-index-1.png 7 | video: https://www.youtube.com/watch?v=_kmMsoVt32M 8 | slides: https://objectcomputing.com/download_file/5201 9 | --- 10 | 11 | # [%title] 12 | 13 | [%author] 14 | 15 | [%date] 16 | 17 | Tags: #webinar #townhall 18 | 19 | A big thanks to everyone who joined us for our Q2 2GM Town Hall Meeting! For those of you who missed the live event, the recording is embedded below. 20 | 21 | At this quarter's meeting, we shared updates regarding the Grails and Micronaut roadmaps, discussed changes to the Micronaut Guides, talked about how to become a sponsor of the Grails and Micronaut Foundations, and encouraged qualified community members to apply to join the 2GM engineering team! You can find all of Object Computing's open positions [here](https://jobs.lever.co/oci). 22 | 23 | Also, special thanks to our fantastic panel of experts: Jeff Scott Brown, David Estes, Iván López, and Graeme Rocher. 24 | 25 | Till next time! 26 | 27 | — Jen Wiese 28 | -------------------------------------------------------------------------------- /posts/2021-07-20-call-for-productivity-tips.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: Calling All 2GM Users: Share Your Productivity Tips 3 | date: July 20, 2021 4 | description: We're inviting community members to help us create a resource that benefits the Groovy, Grails, and Micronaut communities. 5 | author: Jen Wiese 6 | image: grails-blog-index-2.png 7 | --- 8 | 9 | # [%title] 10 | 11 | [%author] 12 | 13 | [%date] 14 | 15 | ## We're all about sharing it back. 16 | 17 | The Object Computing Groovy, Grails, and Micronaut team is collecting tips to compile into a resource that the global developer community can benefit from. By sharing your tips, you can help your peers build better solutions, making all of us stronger. 18 | 19 | ## What’s your go-to productivity tool or technique? 20 | 21 | No idea is too small! The little tips are often the things that add up to make the biggest difference. Bonus points if the trick isn't documented anywhere – you may be the first person to figure something out! 22 | 23 | Highlights from your submissions will be shared with the 2GM community. This is a great chance to help your fellow developers improve their skills ... and who knows? Maybe you'll also win some cool swag! 24 | 25 | ## Ready to participate? 26 | 27 | [Head over to this link](https://objectcomputing.typeform.com/to/j0BdcprA) and give us a peek inside your bag of tricks by sharing executable code, representative code snippets, or prose describing any practical tips you rely on to write better code faster. 28 | 29 | Multiple submissions are welcome; we just ask that you have all your ideas submitted by August 31st. 30 | 31 | We can’t wait to see all of the cool tips and tricks you've come up with! -------------------------------------------------------------------------------- /posts/2021-08-25-groovy-4-webinar.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: Groovy 4 Webinar Coming Soon 3 | date: August 25, 2021 4 | description: This complimentary 60-minute webinar prepares Groovy users of all proficiency levels to take advantage of the new features Groovy 4 offers. 5 | author: Jen Wiese 6 | image: grails-blog-index-4.png 7 | --- 8 | 9 | # [%title] 10 | 11 | [%author] 12 | 13 | [%date] 14 | 15 | Object Computing Groovy Project Lead, [Paul King](https://objectcomputing.com/products/2gm-team), presents a complimentary 60-minute webinar on September 16th in which he introduces the features and improvements you can expect in Apache Groovy 4. 16 | 17 | [Register here](https://us02web.zoom.us/webinar/register/2816299174731/WN_pGeF4yuSRHaiBNajcDkUcA) to join the webinar live or to receive an email notification when the recording is available on YouTube. 18 | -------------------------------------------------------------------------------- /posts/2021-09-02-grails-deep-dive.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: Grails Deep Dive Training Class Scheduled 3 | date: September 2, 2021 4 | description: Our fall Grails Deep Dive course is coming up! 5 | author: Jen Wiese 6 | image: grails-blog-index-1.png 7 | --- 8 | 9 | # [%title] 10 | 11 | [%author] 12 | 13 | [%date] 14 | 15 | If you've been wishing you could learn to maximize your productivity with the Grails framework directly from a member of the core Grails development team, this is your chance! A public offering of our popular Grails Deep Dive course starts next week. 16 | 17 | This 4-day, 12-hour in-depth training workshop provides developers the knowledge and skills they need to quickly master the Grails framework. Become proficient with the technology in just a few days through live, instructor-led, hands-on training. 18 | 19 | [Learn more and enroll](https://objectcomputing.com/services/training/catalog/grails/grails-deep-dive) 20 | -------------------------------------------------------------------------------- /posts/2021-09-15-q3-town-hall-meeting-scheduled.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: 2GM Q3 Town Hall Meeting Coming Soon 3 | date: September 15, 2021 4 | description: Our 2021 third-quarter Town Hall Meeting is just around the corner! 5 | author: Jen Wiese 6 | image: grails-blog-index-2.png 7 | --- 8 | 9 | # [%title] 10 | 11 | [%author] 12 | 13 | [%date] 14 | 15 | Our 2021 third-quarter Town Hall Meeting is just around the corner! 16 | 17 | 2GM Town Hall Meetings give the Groovy, Grails, and Micronaut team a chance to engage with you and empower you to contribute to the frameworks you love. Each Town Hall Meeting is led by a panel of 2GM users, developers, and advocates, and everyone is welcome and encouraged to participate. 18 | 19 | We look forward to seeing you on September 24th, where we'll be sharing an update on our Productivity Tips 'n' Tricks guide, chatting about the latest technology releases, and more! 20 | 21 | [Reserve your seat](https://us02web.zoom.us/webinar/register/7816317393035/WN_KbJAjtyMR8m56mzMroahEw) 22 | -------------------------------------------------------------------------------- /posts/2021-09-17-groovy-4-webinar.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: Webinar: An Insider's Guide to Groovy 4 3 | date: September 17, 2021 4 | description: This complimentary 60-minute webinar prepares Groovy users of all proficiency levels to take advantage of the new features Groovy 4 offers. 5 | author: Jen Wiese 6 | image: grails-blog-index-3.png 7 | video: https://www.youtube.com/watch?v=H027QTB_5MM 8 | slides: https://objectcomputing.com/download_file/5328 9 | --- 10 | 11 | # [%title] 12 | 13 | [%author] 14 | 15 | [%date] 16 | 17 | Apache Groovy 4 is nearing release, and it's been improved in a number of areas for greater simplicity and efficiency. 18 | 19 | Join Object Computing Groovy Practice Lead, [Paul King](https://objectcomputing.com/products/2gm-team#king), as he shares an overview of the exciting new features you'll find in Groovy 4, including JDK17 support, switch expressions, annotations on type parameters, enhanced ranges, and support for sealed classes, records, and language-integrated queries. He'll also introduce you to Groovy 4's additional bundle type checkers, macro methods, and design-by-contract support so you can specify preconditions, postconditions, and invariants. 20 | 21 | This complimentary 60-minute webinar prepares Groovy users of all proficiency levels to take advantage of the new features Groovy 4 offers. 22 | 23 | 24 | -------------------------------------------------------------------------------- /posts/2021-09-24-q3-town-hall-meeting.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: 2GM Q3 Town Hall Meeting: 2021 Q3 3 | date: September 24, 2021 4 | description: Community members who missed the live broadcast of our 2021 third-quarter Town Hall Meeting can watch the video recording here. 5 | author: Jen Wiese 6 | image: grails-blog-index-4.png 7 | video: https://www.youtube.com/watch?v=bG89gtyVPP8 8 | slides: https://objectcomputing.com/download_file/5342 9 | --- 10 | 11 | # [%title] 12 | 13 | [%author] 14 | 15 | [%date] 16 | 17 | A big thanks to everyone who joined us for our Q3 2GM Town Hall Meeting! For those of you who missed the live event, the recording is embedded below. 18 | 19 | At this quarter's meeting, we provided an update on the latest advancements with the Grails and Micronaut frameworks, including a look at what is coming soon. We also shared the latest news and sponsors of the Grails and Micronaut Foundations, as well as some great live discussions and Q&A with our panel. 20 | 21 | A special thanks to our fantastic panel of experts: Jeff Scott Brown, James Kleeh, Puneet Behl, Sergio del Amo Caballero, and our awesome guest Tim Berglund. 22 | 23 | Till next time! 24 | 25 | — Jen Wiese 26 | -------------------------------------------------------------------------------- /posts/2021-11-11.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: Grails® 5 - Groovy Podcast Episode 84 3 | date: November 11, 2021 4 | description: Puneet Behl and Sergio del Amo talk with Ken Kousen about everything Grails. 5 | author: Sergio del Amo Caballero 6 | image: 2019-12-20.jpg 7 | video: https://www.youtube.com/watch?v=b3EVczHSPy0 8 | --- 9 | 10 | # [%title] 11 | 12 | [%author] 13 | 14 | [%date] 15 | 16 | Tags: #podcast 17 | 18 | [Ken Kousen](https://twitter.com/kenkousen) (Java Champion, NFJS speaker, serial book author) invited [Puneet Behl](https://twitter.com/puneetbhl) (Grails Framework Development Lead) and [Sergio del Amo](https://twitter.com/sdelamo) (2GM Developer Advocate) to join him for the latest episode of the Groovy Podcast. 19 | 20 | This episode covers Grails framework 5, migrating from Grails framework 2 to Grails framework 5, Grails infrastructure, Micronaut framework integration with Grails framework, and more. 21 | 22 | Listen to it in your favorite [Podcast Player](https://nofluffjuststuff.com/podcast/2/groovy_podcast_84_s05e04_with_sergio_del_amo_and_paul_king) 23 | 24 | [Show Notes](https://github.com/groovy-podcast/groovypodcast/blob/master/ep-84.asciidoc) 25 | -------------------------------------------------------------------------------- /posts/2021-12-06-february-2022-training-announcement.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: Grails Training Now Enrolling 3 | date: Dec 7, 2021 4 | description: Our first training workshops for 2022 have just been added to the schedule! 5 | author: Jen Wiese 6 | image: grails-blog-index-3.png 7 | --- 8 | 9 | # [%title] 10 | 11 | [%author] 12 | 13 | [%date] 14 | 15 | Our first training workshops for 2022 have just been added to the schedule! 16 | 17 | Courses are developed and delivered by team members who work daily with these advanced technologies and can speak with authority as subject matter experts. 18 | 19 | [**Introduction to Grails Security**](https://objectcomputing.com/services/training/catalog/grails/grails-security-workshop) 20 | 21 | February 14 & 15, 2022 22 | 23 | Learn how to build robust security functionality into your Grails apps and practice configuring and using such plugins as Spring Security Core, LDAP, REST, ACL, and UI. 24 | 25 | [**Using Micronaut Features in a Grails Application**](https://objectcomputing.com/services/training/catalog/grails/micronaut-and-grails) 26 | 27 | February 16 & 17, 2022 28 | 29 | Learn how to take advantage of the Grails framework's built-in Micronaut features to enhance their productivity and application performance. 30 | 31 | -------------------------------------------------------------------------------- /posts/2022-01-07-2gm-town-hall-q1.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: 2GM Town Hall Meeting: 2022 Q1 3 | date: January 7, 2022 4 | description: Community members who missed the live broadcast of our 2022 first-quarter Town Hall Meeting can watch the video recording here. 5 | author: Jen Wiese 6 | image: grails-blog-index-4.png 7 | video: https://www.youtube.com/watch?v=EE5flg8Hj_E 8 | slides: https://objectcomputing.com/download_file/5451 9 | --- 10 | 11 | # [%title] 12 | 13 | [%author] 14 | 15 | [%date] 16 | 17 | A big thanks to everyone who joined us for our Q1 2GM Town Hall Meeting! For those of you who missed the live event, the recording is embedded below. 18 | 19 | At this quarter’s meeting, we provided an update on the latest advancements with the Grails and Micronaut frameworks, including a look at what is coming soon. We also shared the latest news and sponsors of the Grails and Micronaut Foundations, as well as some great live discussions and Q&A with our panel. 20 | 21 | A special thanks to our fantastic panel of experts: James Kleeh, Puneet Behl, Sergio del Amo Caballero, and our awesome guest [Cédric Champeau](http://melix.github.io/blog/). 22 | 23 | Till next time! 24 | 25 | — Jen Wiese 26 | -------------------------------------------------------------------------------- /posts/2023-02-08-repository-maint.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: Grails Artifact Repository Scheduled Maintenance 3 | date: February 8, 2023 4 | description: Scheduled Maintenance of repo.grails.org Feb 12, 2023 08:00 UTC - 11:00 UTC 5 | author: Jason Schindler 6 | image: grails-blog-index-5.png 7 | --- 8 | 9 | # [%title] 10 | 11 | [%author] 12 | 13 | [%date] 14 | 15 | **[%description]** 16 | 17 | The Grails Artifactory Instance at repo.grails.org will be down for scheduled maintenance on Sunday February 12th, 2023 as JFrog migrates it to newer infrastructure. 18 | 19 | The outage will begin at **08:00 UTC** and is expected to last 3 hours. The repository should be available again at **11:00 UTC** 20 | 21 | During this time, projects that retrieve their dependencies from repo.grails.org may experience issues. 22 | 23 | For more information, or to discuss issues encountered after this window, please see this GitHub issue. 24 | -------------------------------------------------------------------------------- /posts/2023-05-27-img0.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apache/grails-static-website/b139c6e8add79c53bda3e38e109f3f51ac44107d/posts/2023-05-27-img0.gif -------------------------------------------------------------------------------- /posts/2023-08-25-thenewselectoption.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apache/grails-static-website/b139c6e8add79c53bda3e38e109f3f51ac44107d/posts/2023-08-25-thenewselectoption.png -------------------------------------------------------------------------------- /posts/2023-09-11-new-grails-plugin-portal.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apache/grails-static-website/b139c6e8add79c53bda3e38e109f3f51ac44107d/posts/2023-09-11-new-grails-plugin-portal.png -------------------------------------------------------------------------------- /posts/2024-06-25-grails-seven-mvp.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: Grails 7 MVP 3 | date: June 25, 2024 4 | description: MVP (Minimum Viable Product) for Grails 7. 5 | author: Jeff Brown 6 | image: grails-blog-index-5.png 7 | --- 8 | 9 | # [%title] 10 | 11 | [%author] 12 | 13 | [%date] 14 | 15 | **[%description]** 16 | 17 | The Grails Community Steering Committee has begun discussions on the MVP (Minimum Viable Product) 18 | for Grails 7. To assist in these discussions, the Grails Foundation has enabled 19 | [GitHub Discussions](https://github.com/orgs/grails/discussions) on the grails-core project. We now 20 | need the community’s feedback! 21 | 22 | Please vote on the various posted polls and respond to the existing discussions to help with decisions 23 | on priorities for the Grails 7 MVP. 24 | 25 | Thank you for all of your input! 26 | -------------------------------------------------------------------------------- /publish.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | set -e 3 | 4 | if [ -z "$GH_TOKEN" ] 5 | then 6 | echo "You must provide the action with a GitHub Personal Access Token secret in order to deploy." 7 | exit 1 8 | fi 9 | 10 | if [ -z "$COMMIT_EMAIL" ] 11 | then 12 | COMMIT_EMAIL="${GITHUB_ACTOR}@users.noreply.github.com" 13 | fi 14 | 15 | if [ -z "$COMMIT_NAME" ] 16 | then 17 | COMMIT_NAME="${GITHUB_ACTOR}" 18 | fi 19 | 20 | git config --global user.name "$GITHUB_ACTOR" 21 | git config --global user.email "$GITHUB_ACTOR@users.noreply.github.com" 22 | git config --global credential.helper store 23 | # Store credentials 24 | echo "https://oauth2:$GITHUB_TOKEN@github.com" > ~/.git-credentials 25 | 26 | ./gradlew clean ${GRADLE_TASK} || EXIT_STATUS=$? 27 | 28 | if [[ $EXIT_STATUS -ne 0 ]]; then 29 | echo "Project Build failed" 30 | exit $EXIT_STATUS 31 | fi 32 | 33 | git clone https://${GH_TOKEN}@github.com/${GITHUB_SLUG}.git -b ${GH_BRANCH} ${GH_BRANCH} --single-branch > /dev/null 34 | cd ${GH_BRANCH} 35 | cp -rv ../build/dist/* . 36 | if git diff --quiet; then 37 | echo "No changes in MAIN Website" 38 | else 39 | git add -A 40 | git commit -a -m "Updating $GITHUB_SLUG ${GH_BRANCH} branch for Github Actions run:$GITHUB_RUN_ID" 41 | git push origin ${GH_BRANCH} 42 | fi 43 | 44 | cd .. 45 | rm -rf ${GH_BRANCH} 46 | 47 | exit $EXIT_STATUS 48 | -------------------------------------------------------------------------------- /release.sh: -------------------------------------------------------------------------------- 1 | DATE=`date +'%b %d, %Y'` 2 | echo " -" >> conf/releases.yml 3 | echo " version: $1" >> conf/releases.yml 4 | echo " publicationDate: $DATE" >> conf/releases.yml 5 | echo "" 6 | -------------------------------------------------------------------------------- /settings.gradle: -------------------------------------------------------------------------------- 1 | plugins { 2 | id 'com.gradle.develocity' version '4.0' 3 | id 'com.gradle.common-custom-user-data-gradle-plugin' version '2.2.1' 4 | } 5 | 6 | def isCI = System.getenv().containsKey('CI') 7 | def isLocal = !isCI 8 | 9 | develocity { 10 | server = 'https://ge.grails.org' 11 | buildScan { 12 | tag('grails') 13 | tag('grails-static-website') 14 | publishing.onlyIf { it.authenticated } 15 | uploadInBackground = isLocal 16 | } 17 | } 18 | 19 | buildCache { 20 | local { enabled = isLocal } 21 | remote(develocity.buildCache) { 22 | push = isCI 23 | enabled = true 24 | } 25 | } 26 | 27 | rootProject.name = 'static-website' 28 | --------------------------------------------------------------------------------