From a6f4dd6d77a013d08301d3e2d5288ddd2b13fb46 Mon Sep 17 00:00:00 2001 From: Thomas Rasmussen Date: Wed, 6 Aug 2025 09:34:23 +0200 Subject: [PATCH 01/35] Grails AWS SDK related plugins have been archived The plugins have been marked as archived on Github. Added the deprecated attribute to the plugins metadata with the message: "This repository was archived by the owner..." --- grails-plugins.json | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/grails-plugins.json b/grails-plugins.json index 5157329..d85bc8f 100644 --- a/grails-plugins.json +++ b/grails-plugins.json @@ -467,6 +467,7 @@ }, { "comment": "This entry in the registry is for the umbrella project for all the AWS plugins from agorapulse. Perhaps this entry is not necessary as each separate plugin also has its own entry?", + "deprecated": "This repository was archived by the owner on Jan 18, 2023. It is now read-only.", "bintrayPackage": { "name": "aws-sdk", "repo": "plugins", @@ -500,6 +501,7 @@ "readme": "

AWS SDK Grails Plugin

\n

\"Build \"Download\"

\n

Introduction

\n

The AWS SDK Plugins for Grails3 are a suite of plugins that adds support for the Amazon Web Services infrastructure services.

\n

The aim is to to get you started quickly by providing friendly lightweight utility Grails service wrappers, around the official AWS SDK for Java (which is great but very \ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffdjava-esque\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd).\nSee this article for more info.

\n

The following services are currently supported:

\n\n

Please check each README for usage info.

\n

Testing

\n

How to Unit Test AWS Services with LocalStack and Testcontainers

\n

Bugs

\n

To report any bug, please use the project Issues section on GitHub.

\n

Compatibilty

\n

NOTE: For Grails 4 you should consider migrating to Micronaut AWS SDK as Miconaut is now the first class citizen in Grails. Use -micronaut-1.2 releases for Grails 4.0.x.

\n

| Grails | Plugin |\n| ------------- |---------------|\n| 3.3.x, 4.x | 2.2.x |\n| 3.2.x | 2.1.x |\n| 2.x | 1.x |

\n" }, { + "deprecated": "This repository was archived by the owner on Jan 18, 2023. It is now read-only.", "bintrayPackage": { "name": "aws-sdk-cognito", "repo": "plugins", @@ -525,6 +527,7 @@ "readme": "

Grails AWS SDK Cognito Plugin

\n

This repo has been migrated to the main AWS SDK Grails Plugin repo.

\n

Here his the latest version of it

\n" }, { + "deprecated": "This repository was archived by the owner on Jan 18, 2023. It is now read-only.", "bintrayPackage": { "name": "aws-sdk-dynamodb", "repo": "plugins", @@ -550,6 +553,7 @@ "readme": "

Grails AWS SDK DynamoDB Plugin

\n

This repo has been migrated to the main AWS SDK Grails Plugin repo.

\n

Here his the latest version of it

\n" }, { + "deprecated": "This repository was archived by the owner on Jan 18, 2023. It is now read-only.", "bintrayPackage": { "name": "aws-sdk-kinesis", "repo": "plugins", @@ -575,6 +579,7 @@ "readme": "

Grails AWS SDK Kinesis Plugin

\n

This repo has been migrated to the main AWS SDK Grails Plugin repo.

\n

Here his the latest version of it

\n" }, { + "deprecated": "This repository was archived by the owner on Jan 18, 2023. It is now read-only.", "bintrayPackage": { "name": "aws-sdk-s3", "repo": "plugins", @@ -600,6 +605,7 @@ "readme": "

Grails AWS SDK S3 Plugin

\n

This repo has been migrated to the main AWS SDK Grails Plugin repo.

\n

Here his the latest version of it

\n" }, { + "deprecated": "This repository was archived by the owner on Jan 18, 2023. It is now read-only.", "bintrayPackage": { "name": "aws-sdk-ses", "repo": "plugins", @@ -625,6 +631,7 @@ "readme": "

Grails AWS SDK SES Plugin

\n

This repo has been migrated to the main AWS SDK Grails Plugin repo.

\n

Here his the latest version of it

\n" }, { + "deprecated": "This repository was archived by the owner on Jan 18, 2023. It is now read-only.", "bintrayPackage": { "name": "aws-sdk-sns", "repo": "plugins", @@ -650,6 +657,7 @@ "readme": "

Grails AWS SDK SNS Plugin

\n

This repo has been migrated to the main AWS SDK Grails Plugin repo.

\n

Here his the latest version of it

\n" }, { + "deprecated": "This repository was archived by the owner on Jan 18, 2023. It is now read-only.", "bintrayPackage": { "name": "aws-sdk-sqs", "repo": "plugins", @@ -675,6 +683,7 @@ "readme": "

Grails AWS SDK SQS Plugin

\n

This repo has been migrated to the main AWS SDK Grails Plugin repo.

\n

Here his the latest version of it

\n" }, { + "deprecated": "This repository was archived by the owner on Jan 18, 2023. It is now read-only.", "bintrayPackage": { "name": "aws-sdk-sts", "repo": "plugins", From a08002822d8b0416f89736be79c9ad5d947dadd4 Mon Sep 17 00:00:00 2001 From: Thomas Rasmussen Date: Wed, 6 Aug 2025 09:42:13 +0200 Subject: [PATCH 02/35] agorapulse has archived the following projects: facebook-sdk, newrelic, segment The metadata has been updated with a "deprecated" message --- grails-plugins.json | 3 +++ 1 file changed, 3 insertions(+) diff --git a/grails-plugins.json b/grails-plugins.json index d85bc8f..1a29003 100644 --- a/grails-plugins.json +++ b/grails-plugins.json @@ -1939,6 +1939,7 @@ "readme": "

See the README on GitHub

" }, { + "deprecated": "This repository was archived by the owner on Jan 18, 2023. It is now read-only.", "bintrayPackage": { "name": "facebook-sdk", "repo": "plugins", @@ -4115,6 +4116,7 @@ "readme": "

GORM for Neo4j

\n

This project implements GORM for the Neo4j 3.x Graph Database using the Bolt Java Driver.

\n

For more information see the following links:

\n\n

For the current development version see the following links:

\n\n" }, { + "deprecated": "This repository was archived by the owner on Jan 18, 2023. It is now read-only.", "bintrayPackage": { "name": "newrelic", "repo": "plugins", @@ -5399,6 +5401,7 @@ "readme": null }, { + "deprecated": "This repository was archived by the owner on Jan 18, 2023. It is now read-only.", "bintrayPackage": { "name": "segment", "repo": "plugins", From 25a63e28f528fcd4a4598610cc9922689aa1601d Mon Sep 17 00:00:00 2001 From: Thomas Rasmussen Date: Wed, 6 Aug 2025 09:48:15 +0200 Subject: [PATCH 03/35] goodstartgenetics archived grails-hibernate-filter --- grails-plugins.json | 1 + 1 file changed, 1 insertion(+) diff --git a/grails-plugins.json b/grails-plugins.json index 1a29003..b41887f 100644 --- a/grails-plugins.json +++ b/grails-plugins.json @@ -2391,6 +2391,7 @@ "readme": "

grails-hibernate-filter

\n

Description

\n

This is a fork of the original Grails Hibernate Filter Plugin\ncreated from fork appcela/grails-hibernate-plugin\nto make it work with the Grails 3 and Hibernate 4.

\n

This repo contains two projects:

\n
    \n
  1. hibernate-filter-plugin - with plugin code
  2. \n
  3. hibernate-filter-example - with example application using plugin
  4. \n
\n

Usage

\n

Build Plugin File

\n

Clone the repository and execute in main directory command:

\n
./gradlew hibernate-filter-plugin:jar\n
\n

You can publish it to your maven local repository using:

\n
./gradlew hibernate-filter-plugin:publishToMavenLocal\n
\n

Running example application

\n

To run example application use command:

\n
./gradlew hibernate-filter-example:bootRun\n
\n

Use plugin in your application

\n

Add dependency in build.gradle:

\n
compile "org.grails.plugins:grails-hibernate-filter:0.2.0"\n
\n

Configure dataSource in application.yml

\n
configClass: org.grails.plugin.hibernate.filter.HibernateFilterDomainConfiguration\n
\n

Usage

\n

Please refer to the official Grails Hibernate Filter Plugin for usage.

\n

Continuous integration server

\n

\"Build

\n" }, { + "deprecated": " This repository was archived by the owner on Jan 7, 2025. It is now read-only.", "bintrayPackage": { "comment": "Does not work with Grails > 3.2.* as of v0.5.5 (according to https://github.com/alexkramer/grails-hibernate-filter/issues/13)", "name": "hibernate-filter", From 9e0b4c2be4ffe84029e006b5519a346dcdbec83f Mon Sep 17 00:00:00 2001 From: Thomas Rasmussen Date: Wed, 6 Aug 2025 09:58:11 +0200 Subject: [PATCH 04/35] spring-security-rest and -redis has been archived The two projects have been merged into one project and "adopted" by Apache Grails --- grails-plugins.json | 2 ++ 1 file changed, 2 insertions(+) diff --git a/grails-plugins.json b/grails-plugins.json index b41887f..4ddae53 100644 --- a/grails-plugins.json +++ b/grails-plugins.json @@ -6016,6 +6016,7 @@ "readme": "

Spring Security OAuth2 VK Plugin

\n

\"Download\"

\n

Add a VK OAuth2 provider to the Spring Security OAuth2 Plugin.

\n

Installation

\n

Add the following dependencies in build.gradle

\n
repositories {\n  ...\n  maven { url "http://dl.bintray.com/purpleraven/plugins" }\n  ...\n}\n\ndependencies {\n...\n    compile 'org.grails.plugins:spring-security-oauth2:1.1+'\n    compile 'org.grails.plugins:spring-security-oauth2-vk:1.0'\n...\n}\n
\n

Usage

\n

Add this to your application.yml

\n
grails:\n    plugin:\n        springsecurity:\n            oauth2:\n                providers:\n                    vk:\n                        api_key: 'vk-api-key'               #needed\n                        api_secret: 'vk-api-secret'         #needed\n                        successUri: "/oauth2/vk/success"    #optional\n                        failureUri: "/oauth2/vk/failure"    #optional\n                        callback: "/oauth2/vk/callback"     #optional\n
\n

You can replace the URIs with your own controller implementation.

\n

In your view you can use the taglib exposed from this plugin and from OAuth plugin to create links and to know if the user is authenticated with a given provider:

\n
<oauth2:connect provider="vk" id="vk-connect-link">VK</oauth2:connect>\n\nLogged with VK?\n<oauth2:ifLoggedInWith provider="vk">yes</oauth2:ifLoggedInWith>\n<oauth2:ifNotLoggedInWith provider="vk">no</oauth2:ifNotLoggedInWith>\n
\n

License

\n

Apache 2

\n" }, { + "deprecated": "This repository was archived by the owner on Feb 28, 2025. It is now read-only.", "bintrayPackage": { "name": "spring-security-rest", "repo": "plugins", @@ -6121,6 +6122,7 @@ "readme": "

Spring Security REST for Grails

\n

\"Build\n\"Latest\n\"Known

\n

Grails plugin to implement a stateless, token-based, RESTful authentication\nusing Spring Security. Sponsored and supported by Object Computing Inc.

\n

Documentation:

\n\n

Companies using this plugin

\n\n

Are you using this plugin and want to be listed here? Include your company yourself.

\n

Support

\n\n

NOTE: if you have questions or issues, enable debug logging,\nand include the output in your request.

\n

Contributors

\n\n

License

\n

This software is licensed under the terms of the Apache License, Version 2.0

\n" }, { + "deprecated": "This repository was archived by the owner on Feb 28, 2025. It is now read-only.", "bintrayPackage": { "name": "spring-security-rest-redis", "repo": "plugins", From fb57458bb3780e9a317b0a8e3e2e6dca9abfff6e Mon Sep 17 00:00:00 2001 From: Thomas Rasmussen Date: Wed, 6 Aug 2025 10:01:24 +0200 Subject: [PATCH 05/35] http-builder-helper plugin has been archived --- grails-plugins.json | 1 + 1 file changed, 1 insertion(+) diff --git a/grails-plugins.json b/grails-plugins.json index 4ddae53..a844bf5 100644 --- a/grails-plugins.json +++ b/grails-plugins.json @@ -3297,6 +3297,7 @@ "readme": "

Html Cleaner Grails Plugin

\n

\"Build\n\"Download\"

\n

Introduction

\n

The Html Cleaner Plugin is a whitelist based html sanitizer, based on Jsoup.\nThis is a port to Grails3 of the Grails1 plugin, originally written by Sudhir Nimavat.

\n

It provides:

\n
    \n
  • a DSL to define whitelists,
  • \n
  • HtmlCleaner - A Spring bean which provides a method cleanHtml() to sanitize html,
  • \n
  • htmlCleanerTagLib - A taglib to sanitize html.
  • \n
\n

Note: Html cleaner is not just a sanitizer, it cleans ill-formed user supplied html and produces a well formed xml.

\n

Installation

\n

Declare the plugin dependency in the build.gradle file, as shown here:

\n
repositories {\n    ...\n    maven { url "http://dl.bintray.com/agorapulse/plugins" }\n}\ndependencies {\n    ...\n    compile "org.grails.plugins:html-cleaner:1.1"\n}\n
\n

Config

\n

Following whitelists are available by default and does not need any configuration:

\n
    \n
  • none
  • \n
  • simpleText
  • \n
  • basic
  • \n
  • basicWithImages
  • \n
  • relaxed
  • \n
\n

You can define default white list in your grails-app/conf/application.yml:

\n
grails:\n    plugin:\n        htmlcleaner:\n            defaultWhiteList: basic\n
\n

See below to define custom whitelists.

\n

Usage

\n

Let's say you have a form with a text area, but you don't want to allow any html. You can clean the user supplied text with whitelist none and it will stripe out all the html.

\n
import grails.plugin.htmlcleaner.HtmlCleaner\n\nclass FooController {\n\n    HtmlCleaner htmlCleaner\n\n    def save = {\n       String cleaned = htmlCleaner.cleanHtml(params.textArea, 'none') \n   }\n}\n
\n

Or in a service:

\n
import grails.plugin.htmlcleaner.HtmlCleaner\n\nclass FooService {\n\n    HtmlCleaner htmlCleaner\n\n    def foo(unsafe) {\n        String cleaned = htmlCleaner.cleanHtml(unsafe, 'none')\n    }\n}\n
\n

You can also allow basic html as per basic whitelist.

\n
def cleaned = htmlCleaner.cleanHtml(unsafe, 'basic')\n
\n

The plugin also provides a taglib.

\n
<hc:cleanHtml html="${domainInstance.description}" whitelist="basic"/>\n
\n

Defining custom whitelists

\n

Plugin provides a DSL to define custom whitelists in configuration.\nDefine a custom whitelist sample that will allow just b, i, p and span tags.

\n

application.groovy

\n
grails {\n    plugin {\n        htmlcleaner {\n            whitelists = {\n                whitelist("sample") {\n                    startwith "none"\n                    allow "b", "p", "i", "span"\n                }\n            }\n        }\n    }\n}\n
\n

The above configuration would define a whitelist with name sample that builds on top of whitelist none and allows additional tags b, i, p and span.

\n

A whitelist can start with any of the default whitelists or A whitelist can start with any custom whitelists that are defined earlier in configuration as well, but it must start with another whitelist.

\n

Define a whitelist sample2 that starts with whitelist sample we defined above and allows tag a with just one attribute href and puts rel="nofollow"

\n
grails {\n    plugin {\n        htmlcleaner {\n            whitelists = {\n                whitelist("sample2") {\n                    startwith "sample"\n                    allow("a") {\n                        attributes "href"\n                        enforce attribute:"rel", value:"nofollow"\n                    }\n                }\n            }\n        }\n    }\n}\n
\n

Define a whitelist basic-with-tables that starts with whitelist basic and allows tables.

\n
grails {\n    plugin {\n        htmlcleaner {\n            whitelists = {\n                whitelist("basic-with-tables") {\n                    startwith "basic"\n                    allow "table", "tr", "td"\n                }\n            }\n        }\n    }\n}\n
\n

Restricting attributes

\n
grails {\n    plugin {\n        htmlcleaner {\n            whitelists = {\n                whitelist("sample") {\n                    allow("div") {\n                        attributes "id", "class"\n                    }\n                }\n            }\n        }\n    }\n}\n
\n

Enforcing attributes - An enforced attribute will always be added to the element. If the element already has the attribute set, it will be overridden.

\n
grails {\n    plugin {\n        htmlcleaner {\n            whitelists = {\n                whitelist("sample") {\n                    allow("div") {\n                        enforce attribute:"class", value:"block"\n                    }\n                }\n            }\n        }\n    }\n}\n
\n

Defining multiple whitelists

\n
grails {\n    plugin {\n        htmlcleaner {\n            whitelists = {\n                whitelist("sample") {\n                    startwith "none"\n                    allow "b", "p", "span"\n                }\n                whitelist("sample-with-anchor") {\n                    startwith "sample"\n                    allow("a") {\n                        attributes "href"\n                        enforce attribute:"rel", value:"nofollow"\n                    }\n                }\n        \n                whitelist("basic-with-tables") {\n                    startwith "basic"\n                    allow "table", "tr", "td"\n                }\n        \n            }\n        }\n    }\n}\n
\n

Bugs

\n

To report any bug, please use the project Issues section on GitHub.

\n" }, { + "deprecated": "This repository was archived by the owner on Jun 18, 2024. It is now read-only.", "bintrayPackage": { "name": "http-builder-helper", "repo": "plugins", From 9ba839ac87ff9ad50671aa2ba69d2fc51e37988e Mon Sep 17 00:00:00 2001 From: Thomas Rasmussen Date: Wed, 6 Aug 2025 10:05:14 +0200 Subject: [PATCH 06/35] jaxrs-* plugins have been archived by its owner --- grails-plugins.json | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/grails-plugins.json b/grails-plugins.json index a844bf5..12fd34a 100644 --- a/grails-plugins.json +++ b/grails-plugins.json @@ -3472,6 +3472,7 @@ "readme": null }, { + "deprecated": "This repository was archived by the owner on Jul 3, 2023. It is now read-only.", "bintrayPackage": { "name": "jaxrs-core", "repo": "grails-plugins", @@ -3496,6 +3497,7 @@ "readme": "

\"Build

\n

JAX-RS Plugin for Grails 3.x

\n

See the documentation at http://budjb.github.io/grails-jaxrs/3.x/latest/.

\n" }, { + "deprecated": "This repository was archived by the owner on Jul 3, 2023. It is now read-only.", "bintrayPackage": { "name": "jaxrs-integration-test", "repo": "grails-plugins", @@ -3521,6 +3523,7 @@ "readme": "

\"Build

\n

JAX-RS Plugin for Grails 3.x

\n

See the documentation at http://budjb.github.io/grails-jaxrs/3.x/latest/.

\n" }, { + "deprecated": "This repository was archived by the owner on Jul 3, 2023. It is now read-only.", "bintrayPackage": { "name": "jaxrs-jersey1", "repo": "grails-plugins", @@ -3545,6 +3548,7 @@ "readme": "

\"Build

\n

JAX-RS Plugin for Grails 3.x

\n

See the documentation at http://budjb.github.io/grails-jaxrs/3.x/latest/.

\n" }, { + "deprecated": "This repository was archived by the owner on Jul 3, 2023. It is now read-only.", "bintrayPackage": { "name": "jaxrs-restlet", "repo": "grails-plugins", @@ -3569,6 +3573,7 @@ "readme": "

\"Build

\n

JAX-RS Plugin for Grails 3.x

\n

See the documentation at http://budjb.github.io/grails-jaxrs/3.x/latest/.

\n" }, { + "deprecated": "This repository was archived by the owner on Jul 3, 2023. It is now read-only.", "bintrayPackage": { "name": "jaxrs-swagger-ui", "repo": "grails-plugins", From d62bf2b05ccf2ac88931075533547b962ffdc00d Mon Sep 17 00:00:00 2001 From: Thomas Rasmussen Date: Wed, 6 Aug 2025 10:08:47 +0200 Subject: [PATCH 07/35] grails-rabbitmq-native plugin has been archived --- grails-plugins.json | 1 + 1 file changed, 1 insertion(+) diff --git a/grails-plugins.json b/grails-plugins.json index 12fd34a..5ffb443 100644 --- a/grails-plugins.json +++ b/grails-plugins.json @@ -4826,6 +4826,7 @@ "readme": "

\"Build

\n

grails-rabbitmq

\n

Grails RabbitMQ Plugin

\n

Sample Applicatoin

\n" }, { + "deprecated": "This repository was archived by the owner on Jul 3, 2023. It is now read-only.", "bintrayPackage": { "name": "rabbitmq-native", "repo": "grails-plugins", From 637cab8b5665ffc4cdd696e1019900fd542deb9d Mon Sep 17 00:00:00 2001 From: Thomas Rasmussen Date: Wed, 6 Aug 2025 10:11:39 +0200 Subject: [PATCH 08/35] http-requests-grails has been archived --- grails-plugins.json | 1 + 1 file changed, 1 insertion(+) diff --git a/grails-plugins.json b/grails-plugins.json index 5ffb443..773b527 100644 --- a/grails-plugins.json +++ b/grails-plugins.json @@ -3322,6 +3322,7 @@ "readme": "

Grails HTTP Builder Helper

\n

This plugin used to be called the REST plugin in Grails 1.x & 2.x, but for Grails 3.x it has been renamed to httpbuilder-helper. The plugin enables the usage of HTTPBuilder in a Grails application.

\n

Description

\n

The REST plugin enables the usage of HTTPBuilder on a Grails application.

\n

Usage

\n

The plugins will inject the following dynamic methods:

\n
    \n
  • withHttp(Map params, Closure stmts) - executes stmts using a HTTPBuilder
  • \n
  • withAsyncHttp(Map params, Closure stmts) - executes stmts using an AsyncHTTPBuilder
  • \n
  • withRest(Map params, Closure stmts) - executes stmts using a RESTClient
  • \n
\n

Examples

\n

Taken from HttpBuilder's Simplified GET Request

\n
withHttp(uri: "http://www.google.com") {\n   def html = get(path : '/search', query : [q:'Groovy'])\n   assert html.HEAD.size() == 1\n   assert html.BODY.size() == 1\n}\n
\n

Notice that you can call HTTPBuilder's methods inside stmts, the current HTTPBuilder is set as the closure's delegate. The same holds true for the other dynamic methods.\nAsyncHTTPBuilder

\n
import static groovyx.net.http.ContentType.HTML\nwithAsyncHttp(poolSize : 4, uri : "http://hc.apache.org", contentType : HTML) {\n   def result = get(path:'/') { resp, html ->\n      println ' got async response!'\n      return html\n   }\n   assert result instanceof java.util.concurrent.Future\n\n   while (! result.done) {\n      println 'waiting...'\n      Thread.sleep(2000)\n   }\n\n   /* The Future instance contains whatever is returned from the response\n      closure above; in this case the parsed HTML data: */\n   def html = result.get()\n   assert html instanceof groovy.util.slurpersupport.GPathResult\n}\n
\n

All dynamic methods will create a new http client when invoked unless you define an id: attribute. When this attribute is supplied the client will be stored as a property on the instance's metaClass. You will be able to access it via regular property access or using the id: again.

\n
class FooController {\n  def loginAction = {\n    withRest(id: "twitter", uri: "http://twitter.com/statuses/") {\n      auth.basic model.username, model.password\n    }\n  }\n  def queryAction = {\n    withRest(id: "twitter") {\n       def response = get(path: "followers.json")\n       // \ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\n    }\n    /* alternatively\n      def response twitter.get(path: "followers.json")\n    */\n  }\n}\n
\n

Configuration

\n

Dynamic method injection

\n

Dynamic methods will be added to controllers and services by default. You can change this setting by adding a configuration flag application.yml or application.groovy:

\n
grails.rest.injectInto = ["Controller", "Service", "Routes"]\n
\n

Proxy settings

\n

You can apply proxy settings by calling setProxy(String host, int port, String scheme) on the client/builders at any time. You can also take advantage of the proxy: shortcut

\n
withHttp(uri: "http://google.com", proxy: [host: "myproxy.acme.com", port: 8080, scheme: "http"])\n
\n

This shortcut has the following defaults

\n
port: = 80\nscheme: = http\n
\n

Meaning most of the times you'd only need to define a value for host:

\n

SSL Key-Store and Trust-Store support

\n

If you are connecting to a server through HTTPS you might need to add a Key and or a Trust Store to the underlying SSL Socket Factory. Some examples are\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd

\n

The service you are connecting to requires some sort of SSL Cert authentication,\nYou want to make sure that the server you are connecting to provides a specific certificate.\nYou do not mind that the certificate that the server provides doesn't match the Domain Name that the server has.\nNote, this last option will normally apply to development and test environments.

\n

So how can I add the Key and/or Trust Stores to the underlying SSL Socket Factory?

\n

The client will try to add a Key and a Trust Store if the URL of the host starts with https. By default it will attempt to locate a Key Store through the File System's path $HOME/.keystore e.g /home/berngp/.keystore and a Trust Store through the JVM Classpath ./truststore.jks, you can override this by specifying a rest.https.keystore.path and/or rest.https.truststore.path configuration entries in the application.yml or application.groovy file.

\n

Also by default it will try to open the stores using the following passwords '', 'changeit', 'changeme' but you can set a specific password through the rest.https.keystore.pass and rest.https.truststore.pass configuration entries. If for some reason it is unable to setup the underlying SSL Socket Factory it will fail silently unless the rest.https.sslSocketFactory.enforce configuration entry is set to true.

\n

Specifying a Hostname Verification strategy for the Trust Store.

\n

You can set three different Hostname Verification strategies through the rest.https.cert.hostnameVerifier configuration entry.

\n

ALLOW_ALL: The URL requested doesn't need to match the URL in the Certificate.\nSTRICT: The URL requested needs to match the URL in the Certificate.\nBROWSER_COMPATIBLE: The URL requested must be in the same domain as the one in the Certificate. It accepts wildcards.\nExample of a specific setup

\n
/** SSL truststore configuration key */\nrest.https.truststore.path = 'resources/certs/truststore.jks'\n/** SSL keystore configuration key */\nrest.https.keystore.path='resources/certs/keystore.jks'\n/** SSL keystore password configuration key */\nrest.https.keystore.pass='changeme'\n/** Certificate Hostname Verifier configuration key */\nrest.https.cert.hostnameVerifier = 'BROWSER_COMPATIBLE'\n/** Enforce SSL Socket Factory */\nrest.https.sslSocketFactory.enforce = true\n
\n

Generating a Key Store

\n

Generating a Java Key Store is outside the scope of this guide but you can find some useful information through the following links.

\n
    \n
  • \n

    Official JDK Guide - http://download.oracle.com/javase/6/docs/technotes/tools/solaris/keytool.html

    \n
  • \n
  • \n

    Importing a Private Key into a KeyStore (JDK 1.6 and above) - http://cunning.sharp.fm/2008/06/importing_private_keys_into_a.html

    \n
  • \n
  • \n

    KeyMan - An non JDK Key Tool by IBM - http://www.alphaworks.ibm.com/tech/keyman

    \n
  • \n
\n" }, { + "deprecated": "This repository was archived by the owner on Jul 3, 2023. It is now read-only.", "bintrayPackage": { "name": "http-requests-grails", "repo": "maven", From 153e7d1d13827dfce2551868126430a4c4def71e Mon Sep 17 00:00:00 2001 From: Thomas Rasmussen Date: Wed, 6 Aug 2025 10:14:31 +0200 Subject: [PATCH 09/35] Grails fields plugin archived (relocated to grails-views) --- grails-plugins.json | 1 + 1 file changed, 1 insertion(+) diff --git a/grails-plugins.json b/grails-plugins.json index 773b527..3a925fe 100644 --- a/grails-plugins.json +++ b/grails-plugins.json @@ -1964,6 +1964,7 @@ "readme": "

Facebook SDK Grails Plugin

\n

\"Build\n\"Download\"

\n

Introduction

\n

The Facebook Platform is a set of APIs that make your application more social. Read more about integrating Facebook with your web site on the Facebook developer site.

\n

This project contains the open source Grails Facebook SDK Plugin that allows you to integrate the Facebook Platform on a website/app powered by Grails.

\n

This plugin is a port of the official Facebook PHP SDK to Grails 3.0.

\n

It supports the latest OAuth2.0 authentication (required since October 1st 2011).

\n

Grails Facebook SDK Plugin provides the following Grails artefacts:

\n\n

WARNING: Facebook API v3.0 is now used by default.

\n

Installation

\n

Declare the plugin dependency in the build.gradle file, as shown here:

\n
dependencies {\n    ...\n    compile "org.grails.plugins:facebook-sdk:4:0.0"\n    ...\n}\n
\n

Config

\n

Create a Facebook app on Facebook Developers, in order to get your own app ID and app secret.

\n

Add your Facebook app parameters to your grails-app/conf/application.yml:

\n
grails:\n    plugin:\n        facebooksdk:\n            app:\n                id: {APP_ID}\n                permissions: {APP_PERMISSIONS} // Ex. ['email','user_photos']\n                secret: {APP_SECRET}\n
\n

By default, latest Graph API v3.3 will be used.\nYou can override default settings with apiVersion setting:

\n
grails:\n    plugin:\n        facebooksdk:\n            apiVersion: v2.3\n
\n

Since FacebookContext should be instantiated at each request, you must use prototype scope for your Controllers (since Grails 2.3, singleton is the default scope).

\n
grails:\n    controllers:\n        defaultScope: prototype\n
\n

Default jQuery selector is $, if you require another one, you can define it globally in your grails-app/conf/application.groovy:

\n
grails:\n    plugin:\n        facebooksdk:\n            customSelector: jQuery\n
\n

Bugs

\n

To report any bug, please use the project Issues section on GitHub.

\n

Feedback

\n

The Grails Facebook SDK is not an official Facebook SDK such as Javascript, PHP, iOS and Android SDKs.

\n

It is developed by AgoraPulse.

\n

The Grails Facebook SDK is licensed under the Apache Licence, Version 2.0.

\n

Breaking Changes

\n

4.0.1

\n
    \n
  • Default return type of fetchObject from FacebookExtensions is back to JsonObject instead of Map
  • \n
\n

4.0.0

\n
    \n
  • restfb upgrade - see https://github.com/restfb/restfb/blob/master/migrations.md\n
      \n
    • removed FacebookRestClient and DefaultFacebookRestClient
    • \n
    • avoid using raw JsonObject as the class has completely changed i.g. JsonObject from restfb 2.x implements own method asBoolean() which fails if the value is not boolean so you need to do regular foo != null check for testing the presense of the returned JsonObject value
    • \n
    \n
  • \n
  • FacebookGraphClient is now deprecated, use FacebookGraphClientService to create instances of FacebookClient with similar capabilities
  • \n
  • FacebookExtensions the most useful methods from FacebookGraphClientare now injected using extensions methods to FacebookClient interface directly
  • \n
\n" }, { + "deprecated": "This repository was archived by the owner on Mar 10, 2025. It is now read-only.", "bintrayPackage": { "name": "fields", "repo": "plugins", From f457c400942cd6c7174ae0f5538fa01c816a7cac Mon Sep 17 00:00:00 2001 From: Thomas Rasmussen Date: Wed, 6 Aug 2025 10:20:45 +0200 Subject: [PATCH 10/35] gorm-cassandra plugin has been archived --- grails-plugins.json | 1 + 1 file changed, 1 insertion(+) diff --git a/grails-plugins.json b/grails-plugins.json index 3a925fe..fb6d2a9 100644 --- a/grails-plugins.json +++ b/grails-plugins.json @@ -980,6 +980,7 @@ "readme": "This plugin establishes a `phoneNumber` constraint property for validateable objects, that being domain objects, and objects implementing `grails.validation.Validateable`. It relies on Google's [libphonenumber](https://github.com/google/libphonenumber) Java implementation" }, { + "deprecated": "This repository was archived by the owner on Dec 5, 2024. It is now read-only.", "bintrayPackage": { "name": "cassandra", "repo": "plugins", From 76de857ddb8d52c5341ba2e71549d4cfbcd8f28c Mon Sep 17 00:00:00 2001 From: Thomas Rasmussen Date: Wed, 6 Aug 2025 10:22:57 +0200 Subject: [PATCH 11/35] gorm-hibernate4 plugin has been archived --- grails-plugins.json | 1 + 1 file changed, 1 insertion(+) diff --git a/grails-plugins.json b/grails-plugins.json index fb6d2a9..654e7f0 100644 --- a/grails-plugins.json +++ b/grails-plugins.json @@ -3196,6 +3196,7 @@ "readme": "

\"Java\n\"Release\"\n\"Maven

\n

GORM (Grails Object Mapping)

\n

[Grails][Grails] is a framework used to build web applications with the [Groovy][Groovy] programming language. This project provides the plumbings for the GORM API both for Hibernate and for new implementations of GORM ontop of NoSQL datastores.\n[Grails]: http://grails.org/\n[Groovy]: http://groovy-lang.org/

\n

Getting Started

\n

For further information see the dedicated websites:

\n\n

License

\n

Grails and Groovy are licensed under the terms of the [Apache License, Version 2.0][Apache License, Version 2.0].\n[Apache License, Version 2.0]: http://www.apache.org/licenses/LICENSE-2.0.html

\n" }, { + "deprecated": "This repository was archived by the owner on Dec 5, 2024. It is now read-only.", "bintrayPackage": { "name": "hibernate4", "repo": "plugins", From 3f32dfbe823ed50ab5014d7fd995809a7b780e49 Mon Sep 17 00:00:00 2001 From: Thomas Rasmussen Date: Wed, 6 Aug 2025 10:30:22 +0200 Subject: [PATCH 12/35] Grails gorm-[graphql,mongodb,mongodb-rxneo4j] archived The plugins have been moved to Apache and the grails-data-mapping project --- grails-plugins.json | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/grails-plugins.json b/grails-plugins.json index 654e7f0..5cf3c3e 100644 --- a/grails-plugins.json +++ b/grails-plugins.json @@ -2118,6 +2118,7 @@ "readme": null }, { + "deprecated": "This repository was archived by the owner on Mar 10, 2025. It is now read-only.", "bintrayPackage": { "name": "gorm-graphql", "repo": "plugins", @@ -4026,6 +4027,7 @@ "readme": "

Infobip plugin \"Build

\n

Grails plugin for Infobip SMS API

\n

Prerequisite to using modninfobip plugin

\n
    \n
  • Sign up for an infobip account
  • \n
  • Confirm your account
  • \n
\n

Method Declarations

\n

Generate basic authorization

\n
String basicAuthorization(String username, String password)\n
\n
    \n
  • username - infobip username
  • \n
  • password - infobip password
  • \n
\n

NB: Basic authorization is mandatory for all infobip REST API requests.

\n

Send an SMS to a single phone number

\n
JSONObject sendSingleMessage(String authorization, String from, String to, String text)\n
\n
    \n
  • from - Sender phone number registered on infobip (Phone numbers are usually prefixed with + (plus sign), followed by a country code, network code and the subscriber number)
  • \n
  • to - Recipient phone number
  • \n
  • text - SMS message to send
  • \n
\n

Send an SMS to multiple phone numbers

\n
JSONObject sendSingleMessage(String authorization, String from, List to, String text)\n
\n
    \n
  • to - A list of string types of recipients' phone numbers
  • \n
\n

Send multiple SMS's to multiple or same recipient phone number

\n
JSONObject sendMultipleMessages(String authorization, JSONObject data)\n
\n
    \n
  • data - A json object of data. An example is show below.
  • \n
\n
{  \n   "messages":[  \n      {  \n         "from":"InfoSMS",\n         "to":[  \n            "41793026727",\n            "41793026731"\n         ],\n         "text":"May the Force be with you!"\n      },\n      {  \n         "from":"41793026700",\n         "to":"41793026785",\n         "text":"A long time ago, in a galaxy far, far away... It is a period of civil war. Rebel spaceships, striking from a hidden base, have won their first victory against the evil Galactic Empire."\n      }\n   ]\n}\n
\n

Get delivery reports

\n
JSONObject deliveryReport(String authorization)\n
\n

Get filtered delivery reports

\n
JSONObject deliveryReport(String authorization, Map filters)\n
\n
    \n
  • filters - A filter map. View here for more filter information.
  • \n
\n

NB: Delivery reports can only be gotten once. A second call returns an empty result.

\n

Pull received messages to phone number from Infobip server

\n
JSONObject pullReceivedMessages(String authorization)\nJSONObject pullReceivedMessages(String authorization, int limit)\n
\n
    \n
  • limit - The number of messages to pull from server. Default is 50 and maximum is 10000
  • \n
\n

Get logs

\n
// Call the messageLog method of corresponding service \n// class (SendMessageService or ReceiveMessageService)\nJSONObject messageLog(String authorization)\n
\n

Get filtered logs

\n
// Call the messageLog method of corresponding service \n// class (SendMessageService or ReceiveMessageService)\nJSONObject messageLog(String authorization, Map filters)\n
\n
    \n
  • filters - A filter map. View here for filter information for sent messages and\nhere for filter information for received messages.
  • \n
\n

Check Account Balance

\n
JSONObject checkAccountBalance(String authorization)\n
\n

Installation

\n

Edit application.groovy (or application.yml if you prefer) and build.gradle

\n
    \n
  • application.groovy
  • \n
\n
infobip.host = "https://api.infobip.com/sms/1"\n
\n

OR

\n
    \n
  • application.yml
  • \n
\n
infobip:\n    host: https://api.infobip.com/sms/1\n
\n
    \n
  • build.gradle
  • \n
\n
repositories {\n    maven {\n        url  "http://dl.bintray.com/modnsolutions/plugins-libraries" \n    }\n}\n\ndependencies {\n    compile "org.grails.plugins:modninfobip:1.0.2"\n}\n
\n

Usage

\n
    \n
  • Import the required service classes into you Grails Service or Controller class.
  • \n
\n
import com.modnsolutions.ReceiveMessageService //service to pull received messages and message log from infobip server\nimport com.modnsolutions.SendMessageService // service to send messages via infobip, get delivery report and message logs\nimport com.modnsolutions.UtilitiesService\n
\n
    \n
  • Inject AuthorizationService and SendMessageService classes into your Grails Service or Controller class.
  • \n
\n
ReceiveMessageService receiveMessageService\nSendMessageService sendMessageService\nUtilitiesService utilitiesService\n
\n
    \n
  • In your class method, generate your basic authorization code and send your messages
  • \n
\n
String basicAuthorization = utilitiesService.basicAuthorization("INFOBIP_USERNAME", "INFOBIP_PASSWORD")\nJSONObject singleMessageResponse = sendMessageService.sendSingleMessage(basicAuthorization, from, to, text)\nprintln singleMessageResponse\n
\n

Example

\n
import com.modnsolutions.ReceiveMessageService\nimport com.modnsolutions.SendMessageService\nimport com.modnsolutions.UtilitiesService\n\n// In Grails you can handle json objects and arrays by importing and using\n// import org.grails.web.json.JSONArray\n// import org.grails.web.json.JSONObject\n\nclass SMSController {\n    ReceiveMessageService receiveMessageService\n    SendMessageService sendMessageService\n    UtilitiesService utilitiesService\n    \n    def sendSingleSMS(String from, String to, String text) {\n        String basicAuthorization = utilitiesService.basicAuthorization("INFOBIP_USERNAME", "INFORBIP_PASSWORD")\n        render sendMessageService.sendSingleMessage(basicAuthorization, from, to, text)\n    }\n    \n    def pullMessages() {\n        String basicAuthorization = utilitiesService.basicAuthorization("INFOBIP_USERNAME", "INFORBIP_PASSWORD")\n        render receiveMessageService.pullReceivedMessages(basicAuthorization)\n    }\n    \n    def checkAccountBalance() {\n        String basicAuthorization = utilitiesService.basicAuthorization("INFOBIP_USERNAME", "INFORBIP_PASSWORD")\n        render utilitiesService.checkAccountBalance(basicAuthorization)\n    }\n    \n    ...\n}\n
\n" }, { + "deprecated": "This repository was archived by the owner on Mar 13, 2025. It is now read-only.", "bintrayPackage": { "name": "mongodb", "repo": "plugins", @@ -4101,6 +4103,7 @@ "readme": "

# TOC

\n

grails-multitenant-plugin

\n

This plugin is sponsored by IP Geolocation. It adds multitenant support for grails 3 applications based on hibernate filters. Tenants are resolved using spring security.

\n

Note

\n

Only branch grails3.0.xhibernate4 is working. Rest of branches are for GORM5 which has broken the way hibernate filters are applied. So they won't work. Also, this plugin works only for Grails 3.0 and 3.1. For later versions of grails, use GORM's built in multi-tenancy support.\nThe work on this plugin has been stopped in favor of Grails internal support for Multi-tenant architecture.

\n

Installation

\n

Add following dependency in build.gradle

\n
compile 'org.grails.plugins:multitenant:0.1'\n
\n

Add configClass attribute in application.yml under dataSource section like this:

\n
 configClass: org.grails.plugin.multitenant.HibernateMultitenantConfiguration \n
\n

Architecture

\n

This plugin uses single database single schema differentiator based technique to identify tenants.

\n

Resolving Tenant

\n

Currently it resolves tenant using spring security. So you have to edit spring security user domain class to implement TenantIdentifier trait like this:

\n
class User implements Serializable, TenantIdentifier\n
\n

It add userTenantId property to User domain class and injects two closures dynamically to this domain

\n

withTenantId

\n

This closure executes a particular code inside its scope with a tenantId supplied as parameters even if the logged in user does not belong to that tenant. You can only execute idempotent code inside this block. If your code is query, or some other read only operation, it will execute that with supplied tenantId. If your code is going to change something in database, it will use tenantId of logged in user. Be careful . .

\n
User.withTenantId(12){\n\n// Your code goes here\n\n}\n\n
\n

withoutTenantId

\n

As the name states, you can bypass tenantId filter temporarily to do operations not specific to any tenant.

\n
User.withoutTenantId(){\n\n// You code goes here\n\n
\n

The code in this scope should be read only as is the case with withTenantId method above.

\n

Multitenat Domain Classes

\n

You have to implement Multitenant trait in all domain classes you want to be multitenant.

\n
class Book implement Multitenant\n
\n

This will add a property tenantId to domain class and three methods as below:

\n
Long tenantId\n\n    def beforeInsert() {\n        if(tenantId == null){\n            tenantId = tenantResolverService.resolveTenant()\n        }\n    }\n\n    def beforeValidate() {\n        if(tenantId == null){\n            tenantId = tenantResolverService.resolveTenant()\n        }\n    }\n\n    def beforeUpdate() {\n        if(tenantId == null){\n            tenantId = tenantResolverService.resolveTenant()\n        }\n    }\n    \n
\n

So if you want to use these methods in any of multitenant domain class, you have to reproduce above code along with your own implementation as yours will overwrite these methods.

\n

TenantResolverService

\n

This plugin provide TenantResolverService to your application which can be injected anywhere just like normal grails services. It provides only one method resolveTenant which provides tenantId of current user. Multitenant plugin makes extensive use of this service at various places inside the code. Multitenant filter intercepts controller actions only. If you want to do some multitenant stuff inside a service then you should call that service from controller or use withTenantId as below:

\n
def tenantResolverService\nUser.withTenantId(tenantResolverService.resolveTenant()){\n // your code here\n}\n
\n

About ipgeolocation.io

\n

IP Geolocation's IP intelligence APIs help developer's find out Geolocation, Tim Zone, Local Currency and much more from just an IP address. For more information checkout document page

\n" }, { + "deprecated": "This repository was archived by the owner on Mar 10, 2025. It is now read-only.", "bintrayPackage": { "name": "neo4j", "repo": "plugins", @@ -5161,6 +5164,7 @@ }, { "comment": "Hard to tell versions to use here. According to https://gorm.grails.org/latest/rx/manual/ it is 7.3.2 but the latest release of this plugin is 6.1.7", + "deprecated": "This repository was archived by the owner on Mar 13, 2025. It is now read-only.", "bintrayPackage": { "name": "rx-mongodb", "repo": "plugins", From 544c570b68b5c43e2daeff26886d28e053b38578 Mon Sep 17 00:00:00 2001 From: Thomas Rasmussen Date: Wed, 6 Aug 2025 10:34:38 +0200 Subject: [PATCH 13/35] redis-gorm plugin has been archived --- grails-plugins.json | 1 + 1 file changed, 1 insertion(+) diff --git a/grails-plugins.json b/grails-plugins.json index 5cf3c3e..49cb8f5 100644 --- a/grails-plugins.json +++ b/grails-plugins.json @@ -4935,6 +4935,7 @@ "readme": "

\"Build

\n

Grails 3

\n

The 2.X version of the plugin is compatible only with grails 3.

\n

Grails Redis Plugin

\n

For integration between Redis and Grails GORM layer, see the Redis GORM plugin.

\n

That plugin was originally called "redis" (the name of this plugin), but it has since been refactored to "redis-gorm" and now relies on this plugin for connectivity.

\n

What is Redis?

\n

The best definition of Redis that I've heard is that it is a "collection of data structures exposed over the network".

\n

Redis is an insanely fast key/value store, in some ways similar to memcached, but the values it stores aren't just dumb blobs of data. Redis values are data structures like strings, lists, hash maps, sets, and sorted sets. Redis also can act as a lightweight pub/sub or message queueing system.

\n

Redis is used in production today by a number of very popular websites including Craigslist, StackOverflow, GitHub, The Guardian, and Digg.

\n

It's commonly lumped in with other NoSQL technologies and is commonly used as a caching layer. It has some similarities to Memcached or Tokyo Tyrant. Because Redis provides network-available data structures, it's very flexible and it's able to solve all kinds of problems. The creator of Redis, Salvatore Sanfilippo, has a nice post on his blog showing how to take advantage of Redis by just adding it to your stack. With the Grails Redis plugin, adding Redis to your grails app is very easy.

\n

I've created an introduction to Redis using groovy that shows you how to install redis and use some basic groovy commands. There is also a presentation that I gave at gr8conf 2011.

\n

The official Redis documentation is fantastic and includes a comprensive list of Redis commands, each command web page also has an embedded REPL that lets you test out the command against a live Redis server.

\n

What is Jedis?

\n

Jedis is the Java Redis connection library that the Grails Redis plugin uses. It's actively maintained, very fast, and doesn't try to do anything too clever. One of the nice things about it is that it doesn't try to munge around with the Redis command names, but follows them as closely as possible. This means that for almost all commands, the Redis command documentation can also be used to understand how to use the Jedis connection objects. You don't need to worry about translating the Redis documentation into Jedis commands.

\n

Installation

\n
grails install-plugin redis\n
\n

Out of the box, the plugin expects that Redis is running on localhost:6379. You can modify this (as well as any other pool config options) by adding a stanza like this to your grails-app/conf/Config.groovy file:

\n
grails {\n    redis {\n        poolConfig {\n            // jedis pool specific tweaks here, see jedis docs & src\n            // ex: testWhileIdle = true\n        }\n        timeout = 2000 //default in milliseconds\n        password = "somepassword" //defaults to no password\n    useSSL = false //or true to use SSL\n\n        // requires either host & port combo, or a sentinels and masterName combo\n\n        // use a single redis server (use only if nore using sentinel cluster)\n        port = 6379\n        host = "localhost"\n        database = 5 // set default database to 5\n\n        // use redis-sentinel cluster as opposed to a single redis server (use only if not use host/port)\n        sentinels = [ "host1:6379", "host2:6379", "host3:6379" ] // list of sentinel instance host/ports\n        masterName = "mymaster" // the name of a master the sentinel cluster is configured to monitor\n    }\n\n}\n
\n

The poolConfig section will let you tweak any of the setter values made available by the JedisPoolConfig. It implements the Apache Commons GenericObjectPool.

\n

NOTE: Please see Redis Sentinel - Documentation for more info on using redis-sentinel for high availability

\n

Plugin Usage

\n

RedisService Bean

\n
def redisService\n
\n

The redisService bean wraps the pool connection. It has a number of caching/memoization helper functions, template methods, and basic Redis commands, it will be your primary interface to Redis.

\n

The service overrides propertyMissing and methodMissing to delegate any missing requests to a Redis connection object. This means that any method that you'd normally call on a Redis connection object can be called directly on redisService.

\n
// overrides propertyMissing and methodMissing to delegate to redis\ndef redisService\n\nredisService.foo = "bar"\nassert "bar" == redisService.foo\n\nredisService.sadd("months", "february")\nassert true == redisService.sismember("months", "february")\n
\n

It also provides a template method called withRedis that takes a closure as a parameter. It passes a Jedis connection object to Redis into the closure. The template method automatically gets an object out of the pool and ensures that it gets returned to the pool after the closure finishes (even if there's an error).

\n
redisService.withRedis { Jedis redis ->\n    redis.set("foo", "bar")\n}\n
\n

The advantage to calling withRedis rather than just calling methods directly on redisService is that multiple commands will only use a single connection instance, rather than one per command.

\n

Redis also allows you to pipeline commands. Pipelining allows you to quickly send commands to Redis without waiting for a response. When the pipeline is executed, it returns a Result object, which works like a Future to give you the results of the pipeline. See the Jedis documentation on pipelining for more details. It works pretty much like the withRedis template does:

\n
redisService.withPipeline { Pipeline pipeline ->\n    pipeline.set("foo", "bar")\n}\n
\n

Redis has the notion of transactions, but it's not exactly the same as a database transaction. Redis transactions guarantee that all of the commands in the transaction will be executed as an atomic unit. Because Redis is single threaded, you're guaranteed to execute atomically and have a known state throughout the transaction. Redis does not support rolling back modifications that happen during a transaction.

\n

The withTransaction template method automatically opens and closes the transaction for you. If the closure doesn't throw and exception, it will tell Redis to execute the transaction

\n
redisService.withTransaction { Transaction transaction ->\n    transaction.set("foo", "bar")\n}\n
\n

Memoization

\n

Memoization is a write-through caching technique. The plugin gives a number of methods that take a key name, and a closure as parameters. These methods first check Redis to see if the key exists. If it does, it returns the value of the key and does not execute the closure. If it does not exist in Redis, it executes the closure and saves the result in Redis under the key. Subsequent calls will then be served the cached value from Redis rather than recalculating.

\n

This technique is very useful for caching values that are frequently requested but expensive to calculate.

\n

As of version 1.2 you may also use the new memoize annotations. See the Memoization Annotation section for usage and examples.

\n

There are methods for the basic Redis data types:

\n

String Memoization

\n
redisService.memoize("user:$userId:helloMessage") {\n    // expensive to calculate method that returns a String\n    "Hello ${security.currentLoggedInUser().firstName}"\n}\n
\n

By default, the key/value will be cached forever in Redis, you can ensure that the key is refreshed either by deleting the key from Redis, making the key include a date or timestamp, or by using the optional expire parameter, the value is the number of seconds before Redis should expire the key:

\n
def ONE_HOUR = 3600\nredisService.memoize("user:$userId:helloMessage", [expire: ONE_HOUR]) {\n    """\n    Hello ${security.currentLoggedInUser().firstName.\n    The temperature this hour is ${currentTemperature()}\n    """\n}\n
\n

Domain Object Memoization

\n

You can memoize a single domain object with redis. It will cache the ID of the domain object returned from the closure and on subsequent cache hits will return a proxy domain object using grails DomainObject.load(cachedId).

\n
String key = "user:42:favorite:author"\nAuthor author = redisService.memoizeDomainObject(Author, key) {\n    Author author = ... // expensive method to calculate user 42's favorite author...\n    return author\n}\n
\n

Now that you have the proxy object for the Author, you can do queries with it without actually having to hydrate the object (and anything it eagerly loads):

\n
def recommendedBooks = Book.findByAuthor(author)\n
\n

The object has the id field populated, but the remaining fields are lazily loaded only if their values are requested, so you can still do:

\n
println author.name\n
\n

To actually print out the name of the author.

\n

Domain List Memoization

\n

You can also memoize a list of domain object identifiers. It doesn't cache the entire domain object, just the database IDs of the domain objects in a returned list.

\n

This allows you to still grab the freshest objects from the database, but not repeatedly create an expensive list. This could be a big database query that joins a bunch of tables. Or some other process that does additional filtering based on selections the user has made in the UI. Something ephemeral for that session or user, that you don't want to persist, but need to be able to react to.

\n
def key = "user:$id:friends-books-user-does-not-own"\n\nredisService.memoizeDomainList(Book, key, ONE_HOUR) { redis ->\n    // expensive process to calculate all friend\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffds books and filter out books\n    // that the user already owns, this stores the list of determined Book IDs\n    // in Redis, but hydrates the Book objects from the DB\n}\n
\n

Other Memoization Methods

\n

There are other memoization methods that the plugin provides, check out the RedisService.groovy and the plugin tests for the exhaustive list.

\n
// Redis Hash memoize methods\n\nredisService.memoizeHash("saved-hash") { return [foo: "bar"] }\n\nredisService.memoizeHashField("saved-hash", "foo") { return "bar" }\n\n// Redis List memoize method\nredisService.memoizeList("saved-list") { return ["foo", "bar", "baz"] }\n\n// Redis Set memoize method\nredisService.memoizeSet("saved-set") { return ["foo", "bar", "baz"] as Set }\n\n// Redis Sorted Set memoize method\nredisService.memoizeScore("saved-sorted-set", "set-item") { return score }\n
\n

Other Methods

\n

The plugin also provides a few utility methods such as:

\n
redisService.flushDB() // dangerous!!!! should probably only be used for test cleanup\n\n// deletes all keys in the database matching a pattern, this is fairly expensive\n// as it uses the <code>keys</code> operation.  If you're doing this a lot and\n// have many keys in redis, you should be aggregating your own set of keys that\n// you'll later want to delete\nredisService.deleteKeysWithPattern("key:pattern:*")\n
\n

Redis Pool Bean

\n

You can have direct access to the pool of Redis connection objects by injecting redisPool into your code. Normally, you won't want to directly work with the pool, and instead interact with the redisService bean, but you have the option to manually work with the pool if desired.

\n
def redisPool\n
\n

Redis Taglib

\n

The redis:memoize TagLib lets you leverage memoization within your GSP files. Wrap it around any expensive to generate text and it will cache it and quickly serve it from Redis.

\n
<redis:memoize key="mykey" expire="3600">\n    <!--\n        insert expensive to generate GSP content here\n\n        taglib body will be executed once, subsequent calls\n        will pull from redis till the key expires\n    -->\n    <div id='header'>\n        ... expensive header stuff here that can be cached ...\n    </div>\n</redis:memoize>\n
\n

Multiple Redis Servers

\n

If you are using multiple redis servers in your environment which are NOT clustered and would like to perform discrete operations on them seperately from a single application, you can accomplish that by by adding some configuration to your application.

\n

The configuration block for redis accepts the following connections block parameters.

\n

Config.groovy

\n
grails {\n    redis {\n        poolConfig {\n            // pool specific tweaks here\n            // for parms see https://github.com/xetorthio/jedis/blob/master/src/main/java/redis/clients/jedis/JedisPoolConfig.java\n            // numTestsPerEvictionRun = 4\n        }\n\n        // requires either host & port combo, or a sentinels and masterName combo\n\n        // use a single redis server (use only if nore using sentinel cluster)\n        port = 6379\n        host = "localhost"\n\n        // use redis-sentinel cluster as opposed to a single redis server (use only if not use host/port)\n        sentinels = [ "host1:6379", "host2:6379", "host3:6379" ] // list of sentinel instance host/ports\n        masterName = "mymaster" // the name of a master the sentinel cluster is configured to monitor\n\n        connections {\n            cache {\n                poolConfig {\n                    // pool specific tweaks here\n                    // for parms see https://github.com/xetorthio/jedis/blob/master/src/main/java/redis/clients/jedis/JedisPoolConfig.java\n                    // numTestsPerEvictionRun = 4\n                }\n\n                // requires either host & port combo, or a sentinels and masterName combo\n\n                // use a single redis server (use only if nore using sentinel cluster)\n                port = 6380\n                host = "localhost"\n\n                // use redis-sentinel cluster as opposed to a single redis server (use only if not use host/port)\n                sentinels = [ "host1:6380", "host2:6380", "host3:6380" ] // list of sentinel instance host/ports\n                masterName = "cache" // the name of a master the sentinel cluster is configured to monitor\n            }\n            search {\n                poolConfig {\n                    // pool specific tweaks here\n                    // for parms see https://github.com/xetorthio/jedis/blob/master/src/main/java/redis/clients/jedis/JedisPoolConfig.java\n                    // numTestsPerEvictionRun = 4\n                }\n\n                // requires either host & port combo, or a sentinels and masterName combo\n\n                // use a single redis server (use only if nore using sentinel cluster)\n                port = 6381\n                host = "localhost"\n\n                // use redis-sentinel cluster as opposed to a single redis server (use only if not use host/port)\n                sentinels = [ "host1:6381", "host2:6381", "host3:6381" ] // list of sentinel instance host/ports\n                masterName = "search" // the name of a master the sentinel cluster is configured to monitor\n            }\n        }\n    }\n}\n
\n

The standard config block for the default connection has not changed. The new configuration is under the connections block. You will need to name your connections ('cache' and 'search' in the above block). The names must be unique.

\n

A new service bean will be wired in addition to the default redisService bean with the capitalized connection name appended to it. For example the above two connections would create a redisServiceCache and redisServiceSearch bean you can reference from your application code. If desired, you can also access the connection-specific redisPool beans that are created using the same naming convention, in this example they would be redisPoolCache and redisPoolSearch.

\n

In addition to the newly wired beans, you may also choose to continue using the standard redisService bean and simply refer to the connections by name when invoking targets on the service via redisService.withConnection('cache').withRedis{...} or redisService.withConnection('search').memoize(key){...}.

\n

Note: It is up to you if you prefer using the main redisService bean and the withConnection method or if you want to inject the additional service beans. The end result is the same and the withConnection is simply a pass through to the newly created beans.

\n
class FooService {\n\n    def redisService\n    // custom created beans for each connection, you can use these or just use the `withConnection` method\n    // both methods are demonstrated below for example purposes, but you'd like choose one method or the other\n    def redisServiceCache\n    def redisServiceSearch\n\n    def doWork(){\n        redisService.withRedis { Jedis redis ->\n            redis.set("foo", "bar")\n        }\n\n        redisService.withConnection('cache').withTransaction { Jedis redis ->\n            redis.set("foo", "bar")\n        }\n\n        redisServiceSearch.withPipeline { Jedis redis ->\n            redis.set("foo", "bar")\n        }\n\n        redisServiceCache.memoize("somecachekey") {Jedis redis ->\n            return cacheData\n        }\n\n        redisService.withConnection('search').memoizeDomainList(Book, "domainkey"){\n            return Book.findAllByTitleInList(["book1", "book3"])\n        }\n\n        redisService.memoizeDomainIdList(Book, "domainkey"){\n            return Book.findAllByTitleInList(["book1", "book3"])\n        }\n\n        redisServiceCache.memoizeDomainObject(Book, "domainkey"){\n            return Book.get(book1.id)\n        }\n\n        redisServiceSearch.memoizeHash("domainkey"){\n             return [foo: "bar"]\n        }\n    }\n}\n
\n

Memoization Annotations

\n

Memoization Annotations

\n

These currently do not work with grails 3.0+ and domain classes. Please only used these on service classes for grails 3.0+ until we can fix this

\n

In addition to using the concrete and finite redisService.memoize* methods, as of version 1.2 you may now also annotate a method with an appropriate @Memoize* annotation. This will perform an AST transformation at compile time and wrap the entire body of the method with the corresponding memoization method. The parameters such as key and expire are passed into the annotation and used in the redisService memoize method calls.

\n

The following are available as annotations:

\n\n \n \n \n \n \n \n \n \n \n \n
AnnotationDescription
@MemoizeUsed to memoize methods that return a \"string\" - redisService.memoize
@MemoizeObjectUsed to memoize methods that return an object - redisService.memoize
@MemoizeDomainObjectUsed to memoize methods that return a domain object - redisService.memoizeDomain
@MemoizeDomainListUsed to memoize methods that return a domain object list - redisService.memoizeDomainList
@MemoizeHashUsed to memoize methods that return a hash - redisService.memoizeHash
@MemoizeHashFieldUsed to memoize methods that return a hash field - redisService.memoizeHashField
@MemoizeListUsed to memoize methods that return a list - redisService.memoizeList
@MemoizeSetUsed to memoize methods that return a set - redisService.memoizeSet
@MemoizeScoreUsed to memoize methods that returns a score from a hash - redisService.memoizeScore
\n

There are integration usage tests written in spock for services at RedisMemoizeServiceSpec.groovy and for domains at RedisMemoizeDomainSpec.groovy

\n

Memoization Annotation Keys

\n

Since the value of the key must be passed in but will also be transformed by AST, we can not use the $ style gstring values in the keys. Instead you will use the # sign to represent a gstring value such as @Memoize(key = "#{book.title}:#{book.id}").

\n

During the AST tranformation these will be replaced with the $ character and will evaluate correctly during runtime as redisService.memoize("${book.title}:${book.id}"){...}.

\n

Anything that is not in the format key='#text' or key="${text}" will be treated as a string literal. Meaning that key="text" would be the same as using the literal string "text" as the memoize key redisService.memoize("text"){...} instead of the variable $text.

\n

Any variable that you use in the key property of the annotation will need to be in scope for this to work correctly. You will only get a RUNTIME error if you use a variable reference that is out of scope.

\n

This also applies to the expire field.

\n

Memoization Annotation Notes

\n

You are not required to import the import grails.plugin.redis.RedisService namespace or declare the service def redisService on any objects you wish to use this annotation with as the AST transform will detect whether this field is on your object and add it for you. You may certainly have either the import or def statements if you would like, but they are not required if you use the @Memoize* annotations.

\n

The user should be aware that any annotated method will be completely wrapped in the redis service call so any calculations that are contained within will also be wrapped and not executed of the key is in scope and not expired.

\n

If the compile succeeds but runtime fails or throws an exception, make sure the following are valid:\n* Your key OR value is configured correctly.\n* The key uses a #{} for all variables you want referenced.

\n

If the compile does NOT succeed make sure check the stack trace as some validation is done on the AST transform for each annotation type:\n* Required annotation properties are provided.\n* When using expire it is a valid Integer type variable.\n* When using value it is a valid closure.\n* When using key it is a valid String.

\n

@Memoize

\n

The @Memoize annotation is to be used when dealing with objects that are stored in Redis as strings. This annotation takes the following parameters:

\n
value   - A closure in the following format. (key OR value required)\nkey     - A unique key for the data cache. (key OR value required)\nexpire  - Expire time in seconds.  Will default to never so only pass a value like 3600 if you want value to expire.\n
\n

You can either specify a closure OR a key and expire. When using the closure style key @Memoize({"#{text}"}) you may not pass a key or expire to the annotation as the closure will be evaluated directly and used as the key value. This is due to a limitation on how Java deals with closure annotation parameters.

\n

Here is an example of usage:

\n
@Memoize({"#{text}"})\ndef getAnnotatedTextUsingClosure(String text, Date date) {\n    println 'cache miss getAnnotatedTextUsingClosure'\n    return "$text $date"\n}\n\n@Memoize(key = '#{text}')\ndef getAnnotatedTextUsingKey(String text, Date date) {\n    println 'cache miss getAnnotatedTextUsingKey'\n    return "$text $date"\n}\n\n//expire this extremely fast\n@Memoize(key = '#{text}', expire = '1')\ndef getAnnotatedTextUsingKeyAndExpire(String text, Date date) {\n    println 'cache miss getAnnotatedTextUsingKeyAndExpire'\n    return "$text $date"\n}\n\n//configurable expire time to live\n@Memoize(key = '#{text}', expire = '#{grailsApplication.config.cache.ttl}')\ndef getAnnotatedTextUsingKeyAndExpire(String text, Date date) {\n    println 'cache miss getAnnotatedTextUsingKeyAndExpire'\n    return "$text $date"\n}\n\n@Memoize(key = "#{book.title}:#{book.id}")\ndef getAnnotatedBook(Book book) {\n    println 'cache miss getAnnotatedBook'\n    return book.toString()\n}\n
\n

@MemoizeObject

\n

The @MemoizeObject annotation is to be used when dealing with simple (non-domain) objects that are to have their contents stored in Redis in JSON form. The simple object being returned by the return statement will be converted to JSON, stored in Redis, then converted from JSON back to the object. It is important to ensure that the object class you're using is able to be converted to and from JSON for this annotation to work. This annotation takes the following parameters:

\n
key     - A unique key for the data cache. (required)\nexpire  - Expire time in seconds.  Will default to never so only pass a value like 3600 if you want value to expire.\nclazz   - The class of the object to be memoizing. (required)\n
\n

Here is an example of usage:

\n
@MemoizeObject(key = "#{title}", expire = "#{grailsApplication.config.cache.ttl}", clazz = Book.class)\ndef createObject(String title, Date date) {\n    println 'cache miss createObject'\n    new Book(title: title, createDate: date)\n}\n
\n

This method is also available from the RedisService:

\n
redisService.memoizeObject(Book.class, title, grailsApplication.config.cache.ttl) {\n  println 'cache miss createObject'\n  new Book(title: title, createDate: date)\n}\n
\n

@MemoizeDomainObject

\n

The @MemoizeDomainObject annotation is to be used when dealing with domain objects that are to have their id's stored in Redis. See the documentation on Domain Object Memoization above for more details. This annotation takes the following parameters:

\n
key     - A unique key for the data cache. (required)\nexpire  - Expire time in seconds.  Will default to never so only pass a value like 3600 if you want value to expire.\nclazz   - The class of the object to be memoizing. (required)\n
\n

Here is an example of usage:

\n
@MemoizeDomainObject(key = "#{title}", clazz = Book.class)\ndef createDomainObject(String title, Date date) {\n    println 'cache miss createDomainObject'\n    Book.build(title: title, createDate: date)\n}\n
\n

@MemoizeDomainList

\n

The @MemoizeDomainList annotation is to be used when dealing with lists of domain objects that are to have their id's stored in Redis. See the documentation on Domain List Memoization above for more details. This annotation takes the following parameters:

\n
key     - A unique key for the data cache. (required)\nexpire  - Expire time in seconds.  Will default to never so only pass a value like 3600 if you want value to expire.\nclazz   - The class of the object to be memizing. (required)\n
\n

Here is an example of usage:

\n
@MemoizeDomainList(key = "getDomainListWithKeyClass:#{title}", clazz = Book.class)\ndef getDomainListWithKeyClass(String title, Date date) {\n    println 'cache miss getDomainListWithKeyClass'\n    Book.findAllByTitle(title)\n}\n
\n

@MemoizeList

\n

The @MemoizeList annotation is to be used when dealing with list type objects. This annotation takes the following parameters:

\n
value   - A closure in the following format. (key OR value required)\nkey     - A unique key for the data cache. (key OR value required)\nexpire  - Expire time in seconds.  Will default to never so only pass a value like 3600 if you want value to expire.\n
\n

You can either specify a closure OR a key and expire. When using the closure style key @Memoize({"#{text}"}) you may not pass a key or expire to the annotation as the closure will be evaluated directly and used as the key value. This is due to a limitation on how Java deals with closure annotation parameters.

\n

Here is an example of usage:

\n
@MemoizeList(key = "#{list[0]}")\ndef getAnnotatedList(List list) {\n    println 'cache miss getAnnotatedList'\n    return list\n}\n
\n

@MemoizeScore

\n

The @MemoizeScore annotation is to be used when dealing with scores in hashes. This annotation takes the following parameters:

\n
key     - A unique key for the data cache. (required)\nexpire  - Expire time in seconds.  Will default to never so only pass a value like 3600 if you want value to expire.\nmember  - The hash property to store. (required)\n
\n

Here is an example of usage:

\n
@MemoizeScore(key = "#{map.key}", member="foo")\ndef getAnnotatedScore(Map map) {\n    println 'cache miss getAnnotatedScore'\n    return map.foo\n}\n
\n

@MemoizeHash

\n

The @MemoizeHash annotation is to be used when dealing with maps/hash type objects. This annotation takes the following parameters:

\n
value   - A closure in the following format. (key OR value required)\nkey     - A unique key for the data cache. (key OR value required)\nexpire  - Expire time in seconds.  Will default to never so only pass a value like 3600 (one hour) if you want value to expire.\n
\n

You can either specify a closure OR a key and expire. When using the closure style key @Memoize({"#{text}"}) you may not pass a key or expire to the annotation as the closure will be evaluated directly and used as the key value. This is due to a limitation on how Java deals with closure annotation parameters.

\n

Here is an example of usage:

\n
@MemoizeHash(key = "#{map.foo}")\ndef getAnnotatedHash(Map map) {\n    println 'cache miss getAnnotatedHash'\n    return map\n}\n
\n

Grails 3.0

\n

Most things remain the same except configuration in the application.yml file will be done not in dsl closure but YAML style.

\n
---\ngrails:\n  redis:\n    poolConfig:\n      maxIdle: 10\n      doesnotexist: true\n
\n

The package namespace has changed to grails.plugins.redis. Note the addition of the s in plugin[s].

\n

@Memoize annotations currently do NOT work with domain objects and classes. We are working to fix this.

\n

Previously the @Memoize annotations would inject the redisService into your classes, due to changes in how beans are wired in grails 3.0.0+ it is recommended that you\ndefine the service in your classes like the following:

\n
class MyService {\n    \n    RedisService redisService\n    \n    @Memoize()\n    def doFoo(){\n        ...\n    }\n    \n}\n
\n

Release Notes Grails 3.x

\n
    \n
  • 2.0.5 - released 12/08/2016 - Upgrading to Jedis 2.9.0. Putting close on the resource in withRedis block.
  • \n
  • 2.0.4 - released 02/26/2016 - Upgrading to Jedis 2.8.0 and Gson 2.6.1. Official name for package to org.grails.plugins:redis. Moved bintray location. Breaking Change
  • \n
  • 2.0.3 - released 02/01/2016 - Attempting to cleaup the code and naming for plugin/package
  • \n
  • 2.0.2 - released 06/25/2015 - Adding support for external configuration of sentinels
  • \n
  • 2.0.1 - released 05/04/2015 - web-inf directory removed from plugin
  • \n
  • 2.0.0 - released 03/18/2015 - Grails 3.0.0 Support! You can install from bintray. There is a known issue where @Memoize annotations don't work on domain classes, most everything else works.
  • \n
\n

Release Notes Grails 2.x

\n
    \n
  • 1.0.0.M7 - released 8/5/2011 - this is actually the first released revision of the plugin. As it's replacing the old "redis" plugin (now "redis-gorm"), we needed to start with a number higher than the last released revision of that. If you want the old redis-gorm plugin (which hasn't been released as of 8/5/2011), you can use "grails install-plugin 1.0.0.M6"
  • \n
  • 1.0.0.M8 - released 8/15/2011 - bugfix release mostly around the JedisTemplate that was ported from redis-gorm
  • \n
  • 1.0.0.M9 - released 8/16/2011 - removal of the Jedis/RedisTemplate stuff from redis-gorm as it's needed by things that can't rely on grails plugins, minor bugfixes for tests.
  • \n
  • 1.1 - released 12/10/2011 - removed hibernate & tomcat plugin dependency, added memoizeSet, memoizeList, memoizeDomainObject, and deleteKeysWithPattern methods, significantly reduced amount of time redis connections were used by plugin during memoization, BREAKING CHANGE: memoize methods no longer pass a Jedis connection object into the closure, they must be created on demand within the closure code.
  • \n
  • 1.2 - released 2/1/2012 - added memoize annotations to support spring-cache like support on domain, service, and controller classes.
  • \n
  • 1.3 - released 4/28/2012 - added support for additional redis server endpoint wiring via config block.
  • \n
  • 1.3.1 - released 5/20/2012 - adds support for Jedis 2.1 and a database parameter in the config to pick a redis database
  • \n
  • 1.3.2 - released 7/6/2012 - marks erroring pool connections as invalid so the pool knows to discard and recreate them
  • \n
  • 1.3.3 - released 2/27/2013 - bugfix for transactions
  • \n
  • 1.4.0 - released 9/29/2013 - support for Redis Sentinel and Jedis 2.2
  • \n
  • 1.4.1 - released 9/29/2013 - bug fixes for memoizeDomainObject and checking logging level before calling logging method
  • \n
  • 1.4.3 - released 1/17/2014 - made the memoize methods not throw a JCE when redis is down, just log a warning and pass through the value retrieved live
  • \n
  • 1.4.4 - released 2/16/2014 - Allow for the 'expire' field to optionally be a variable in annotations instead of a constant string only, just like the 'key' works
  • \n
  • 1.5.0 - released 2/24/2014 - addition of @MemoizeObject annotation which allows for JSON representation to be stored in redis, moved log level of "optional" redis connections down to info, better handling/transformation of config values
  • \n
  • 1.5.1 - released 3/16/2014 - updated to Jedis 2.4.2
  • \n
  • 1.5.2 - released 4/18/2014 - Do not fail hard on bad poolConfig parameters
  • \n
  • 1.5.3 - released 4/23/2014 - Fix the implementation on soft setting the poolConfig parameters
  • \n
  • 1.5.5 - released 5/28/2014 - Added redisService.memoizeObject method (#34) with optional [cacheNull: false] flag (#35)
  • \n
  • 1.6.0 - released 11/04/2014 - Changed how RedisService is spring injected so that it's easier to mock out for tests by clients. Upgraded to Jedis 2.6.0.
  • \n
  • 1.6.2 - released 02/06/2015 - Port and timeout properties injected by external properties file are now converted to Integer. If not integer, then defaults used.
  • \n
\n" }, { + "deprecated": "This repository was archived by the owner on Dec 5, 2024. It is now read-only.", "bintrayPackage": { "name": "redis-gorm", "repo": "plugins", From 1a84103b1b7719a8b25b298a5a941f8c2df9b707 Mon Sep 17 00:00:00 2001 From: Thomas Rasmussen Date: Wed, 6 Aug 2025 10:37:31 +0200 Subject: [PATCH 14/35] rx-gorm-rest-client has been archived --- grails-plugins.json | 1 + 1 file changed, 1 insertion(+) diff --git a/grails-plugins.json b/grails-plugins.json index 49cb8f5..32a81a7 100644 --- a/grails-plugins.json +++ b/grails-plugins.json @@ -5137,6 +5137,7 @@ "readme": "

RetinaTag

\n

The Grails Retina Tag plugin adds retina tag image support to the asset pipeline <asset:image/> taglib.\nRetinaTag resolves this by extending <asset:image/> to create a hidpi_src attribute with the retina image path if it exists.

\n

Installation

\n

Add retina tag to your build config

\n
plugins {\n\tcompile ':retina-tag:1.1.0'\n}\n
\n

Grals 3

\n
dependencies {\n\tcompile 'com.bertramlabs.plugins:retina-tag:3.0.0'\n}\n
\n

Usage

\n

Add retina_tag.js to your application.js file after including jQuery:

\n
//=require retina_tag\n
\n

Add double pixel resolution images in your assets directory with the @2x modifier

\n
logo.png\nlogo@2x.png\n
\n

Be sure to also specify the base dimensions in your image_tag calls:

\n
<asset:image src='logo.png' height=50/>\n
\n

Awesome right?

\n

Forcing Refresh after loading dynamic content

\n

Retina tag listens to the global event on document called retina_tag:refresh. Firing this event will force retina_tag to rescan the dom for images and update their image src if necessary. Useful if loading content dynamically. Note: retina_tag automatically supports turbolinks.

\n

Override Hidpi src attribute

\n

In some cases it becomes necessary to override the data-hidpi-src attribute and skip asset pipeline. A good example of this might be to load a users profile picture which is stored elsewhere.

\n
\t<asset:image src="${user.photo.url('medium')}" data-hidpi-src="${user.photo.url('medium_2x')" height="75%" width="75"/>\n
\n

Contributing

\n
    \n
  1. Fork it
  2. \n
  3. Create your feature branch (git checkout -b my-new-feature)
  4. \n
  5. Commit your changes (git commit -am 'Added some feature')
  6. \n
  7. Push to the branch (git push origin my-new-feature)
  8. \n
  9. Create new Pull Request
  10. \n
\n

##License\nThis project is licensed under the APACHE License.

\n" }, { + "deprecated": "This repository was archived by the owner on Dec 5, 2024. It is now read-only.", "bintrayPackage": { "name": "rx-gorm-rest-client", "repo": "plugins", From bbe2190dca5d9d7d92dc84d23e504f8dcc234f8a Mon Sep 17 00:00:00 2001 From: Thomas Rasmussen Date: Wed, 6 Aug 2025 10:40:47 +0200 Subject: [PATCH 15/35] grails-async and event archived (moved to grails-core) --- grails-plugins.json | 2 ++ 1 file changed, 2 insertions(+) diff --git a/grails-plugins.json b/grails-plugins.json index 32a81a7..9c082f4 100644 --- a/grails-plugins.json +++ b/grails-plugins.json @@ -368,6 +368,7 @@ "readme": "

Asset Pipeline Handlebars Renderer Grails Plugin

\n

This plugin provides for server side execution of Handlebars.js templates. It is\nintended to compliment the handlebars-asset-pipeline plugin\nwhich compiles Handlebars templates into JavaScript for client side usage. The templates are compiled into Java\ncode using handlebars-java.

\n

Installation

\n

Add to build.gradle

\n
dependencies {\n     compile "org.grails.plugins:asset-pipeline-handlebars-renderer:0.1"\n}\n
\n

Configuration

\n

This plugin uses the same configuration as the handlebars-asset-pipeline plugin. Templates can be created in the standard assets/javascripts folder with an extension of .handlebars or .hbs. By default the templateRoot for your templates is specified as templates. This means that any handlebars file within assets/javascripts/templates/ will utilize its file name (without the extension) as its template name. So a template that lives at assets/javascripts/templates/my_template.hbs can be rendered as <handlebars:render template="my_template"/>.

\n

Usage

\n

A handlebars:render tag is provided to render handlebars templates similarly to how regular gsp templates are applied in views. Templates can be rendered inline:

\n
<handlebars:render model="[name: 'bob']">\n    <p>Hello {{name}}</p>\n</handlebars:render>\n
\n

Or they can be stored in a separate file and referenced by name:

\n
<handlebars:render template="home/hello" model="[name: 'bob']"/>\n
\n

For the above example, (assuming the default templateRoot) the template would be located at grails-app/assets/javascripts/templates/home/hello.hbs.

\n

If no model is supplied then the default page bindings (page scope variables) are used:

\n
<handlebars:render>\n    Hello {{name}} from the controller\n</handlebars:render>\n
\n

Behind the scenes, the taglib uses the handlebarsService to render templates. You can do the same if, for example, you want to render the template directly from a controller:

\n
def handlebarsService\n\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ndef list() {\n    render handlebarsService.apply("home/accounts", [accounts: Account.list()])\n}\n
\n" }, { + "deprecated": "This repository was archived by the owner on May 28, 2025. It is now read-only.", "bintrayPackage": { "name": "async", "repo": "plugins", @@ -1787,6 +1788,7 @@ "readme": "

Ember Asset-Pipeline

\n

\"Build

\n

MOVED: This project has moved to a sub project of the main asset-pipeline repository http://github.com/bertramdev/asset-pipeline

\n

Overview

\n

The JVM ember-asset-pipeline is a plugin that provides handlebars template precompiler support for Ember.js to asset-pipeline.

\n

Current Ember Version: 1.7.0

\n

For more information on how to use asset-pipeline, visit here.

\n

Usage

\n

Simply create files in your standard assets/javascripts folder with extension .handlebars or .hbs.\nBy default the templateRoot for your template names is specified as 'templates'. This means that any handlebars file within the root assets/javascripts folder will utilize its file name (without the extension) as its template name. Or a file in templates/show.handlebars would be named templates/show. If templates is set as the templateRoot than it would be named show

\n

It is also possible to change the template path seperator for templatenames to be used by handlebars:

\n

Gradle Example:

\n
assets {\n\tconfig = [\n\thandlebars: [\n\t\ttemplateRoot: 'templates',\n\t\ttemplatePathSeperator: '/'\n\t]\n\t]\n}\n
\n

Grails Example:

\n
grails {\n\tassets {\n\t\thandlebars {\n\t\t\ttemplateRoot = 'templates'\n\t\t\ttemplatePathSeperator = "/"\n\t\t}\n\t}\n}\n
\n

To use the handlebars runtime simply add handlebars js to your application.js or your gsp file

\n
//=require handlebars\n
\n

Using in the Browser

\n

Template functions are stored in the Handlebars.templates object using the template name. If the template name is\nperson/show, then the template function can be accessed from Handlebars.templates['person/show']. See the Template Names section for how template names are calculated.

\n

See the Handlebars.js website for more information on using Handlebars template functions.

\n" }, { + "deprecated": "This repository was archived by the owner on May 28, 2025. It is now read-only.", "bintrayPackage": { "name": "events", "repo": "plugins", From 169982593c25e40266d5b31ecbc1c07b1750c362 Mon Sep 17 00:00:00 2001 From: Thomas Rasmussen Date: Wed, 6 Aug 2025 10:43:04 +0200 Subject: [PATCH 16/35] database-migration has been archived (moved to grails-data-mapping) --- grails-plugins.json | 1 + 1 file changed, 1 insertion(+) diff --git a/grails-plugins.json b/grails-plugins.json index 9c082f4..176bc59 100644 --- a/grails-plugins.json +++ b/grails-plugins.json @@ -1385,6 +1385,7 @@ "readme": null }, { + "deprecated": "This repository was archived by the owner on Apr 8, 2025. It is now read-only.", "bintrayPackage": { "name": "database-migration", "repo": "plugins", From 150d972092acaf1d08c1e1b77a0f250ef7d4cc15 Mon Sep 17 00:00:00 2001 From: Thomas Rasmussen Date: Wed, 6 Aug 2025 10:46:03 +0200 Subject: [PATCH 17/35] grails-gsp, -scaffolding has been archived (moved to grails-views) --- grails-plugins.json | 2 ++ 1 file changed, 2 insertions(+) diff --git a/grails-plugins.json b/grails-plugins.json index 176bc59..8a5bf81 100644 --- a/grails-plugins.json +++ b/grails-plugins.json @@ -3000,6 +3000,7 @@ "readme": "

Greenmail Plugin for Grails 3

\n

This is a fork of grails greenmail plugin for grails 3.

\n

INSTALL

\n

Add a dependency for the plugin in build.gradle:

\n
\ndependencies {    \n    compile 'org.grails.plugins:greenmail:2.0.0.RC2'    \n}\n\n
\n

USAGE

\n

Provides a wrapper around GreenMail and provides a view that displays sent messages - useful for testing application in the development or test environments.

\n

Installation

\n
grails install-plugin greenmail\n
\n

The plugin assumes that you have some sort of Java mail provider installed (for instance the Grails mail plugin). You need to define a SMTP port for the mock Greenmail SMTP server to start with. Using the Grails Mail plugin, this is as simple as defining the grails.mail.port property in Config.groovy, like this (see the first line in the development and test blocks):

\n
environments {\n    production {\n        grails.serverURL = "http://www.changeme.com"\n    }\n    development {\n\tgrails.mail.port = com.icegreen.greenmail.util.ServerSetupTest.SMTP.port\n        grails.serverURL = "http://localhost:8080/${appName}"\n    }\n    test {\n\tgrails.mail.port = com.icegreen.greenmail.util.ServerSetupTest.SMTP.port\n        grails.serverURL = "http://localhost:8080/${appName}"\n    }\n}\n
\n

You can also completely disable the plugin by using the config setting grails.plugin.greenmail.disabled = true. For example, to disable greenmail in production:

\n
environments {\n    production {\n       grails.plugin.greenmail.disabled=true\n    }\n}\n
\n

If you need to change the default listening port (1025) you can use the grails.plugin.greenmail.ports.smtp configuration variable. For example:

\n
environments {\n    test {\n       grails.plugin.greenmail.ports.smtp = 2025\n    }\n}\n
\n

Usage in Integration Tests

\n

The plugin can be used to capture email messages during integration tests. For example:

\n
import com.icegreen.greenmail.util.*\n\nclass GreenmailTests extends GroovyTestCase {\n    def mailService\n    def greenMail\n\n    void testSendMail() {\n        Map mail = [message:'hello world', from:'from@piragua.com', to:'to@piragua.com', subject:'subject']\n\n        mailService.sendMail {\n            to mail.to\n            from mail.from\n            subject mail.subject\n            body mail.message\n        }\n        \n        assertEquals(1, greenMail.getReceivedMessages().length)\n\t\n        def message = greenMail.getReceivedMessages()[0]\n\t\t\n        assertEquals(mail.message, GreenMailUtil.getBody(message))\n        assertEquals(mail.from, GreenMailUtil.getAddressList(message.from))\n        assertEquals(mail.subject, message.subject)\n    }\n\n    void tearDown() {\n        greenMail.deleteAllMessages()\n    }\n}\n
\n

The plugin adds a deleteAllMessages() convenience method to the greenMail bean that deletes all received messages.

\n

Usage in running application

\n

The plugin provides a controller and view to show messages that are sent from the application. Simply browse to http://localhost:8080/greenmail and it will show a list of messages sent. You can click on the show link to view the raw message.

\n

Roadmap

\n

This is a fully functional plugin, though there are some features that I think would be worth adding. Contributions and patches are welcome!

\n
    \n
  • Messages sent by the Grails Mail plugin have duplicate "TO:" fields in the raw message and in the address list, for instance if the recipient is spam@piragua.com, then that email address is listed twice when you retrieve the address list for RecipientType.TO (e.g. GreenMailUtil.getAddressList(message.getRecipients(javax.mail.Message.RecipientType.TO))
  • \n
  • Ability to view HTML email messages as they appear in a mail client rather than as RAW message.
  • \n
\n" }, { + "deprecated": "This repository was archived by the owner on May 28, 2025. It is now read-only.", "bintrayPackage": { "name": "gsp", "repo": "plugins", @@ -5297,6 +5298,7 @@ "readme": null }, { + "deprecated": "This repository was archived by the owner on Mar 10, 2025. It is now read-only.", "bintrayPackage": { "name": "scaffolding", "repo": "plugins", From 3d672abdeb9314a54312b90a21fe10f7b9f3c395 Mon Sep 17 00:00:00 2001 From: Thomas Rasmussen Date: Wed, 6 Aug 2025 10:53:43 +0200 Subject: [PATCH 18/35] spring-security-[acl,cas,ldap,oauth2,ui] have been archived Theu have all been integrated into the grails-spring-security-core project --- grails-plugins.json | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/grails-plugins.json b/grails-plugins.json index 8a5bf81..3482daa 100644 --- a/grails-plugins.json +++ b/grails-plugins.json @@ -5571,6 +5571,7 @@ "readme": "

grails-soft-delete

\n

Provides Grails domain classes support for soft (or logical) deletes.

\n

WARNING

\n

This code is experimental. I can't garantee it will work, but I will improve it over time.

\n

How to install

\n

Slap the following code into build.gradle, dependencies part:

\n

compile 'org.grails.plugins:soft-delete:0.3'

\n

Alternatively you have to clone the repository, build the jar file and put it on a libs folder inside your application.

\n

How it works

\n

The plugin enhances all the domain classes using traits, overriding the common GORM methods.

\n

What is supported

\n

The following methods are supported:

\n
    \n
  • delete() (obvious, isn't it)
  • \n
  • get()
  • \n
  • load()
  • \n
  • getAll()
  • \n
  • list()
  • \n
  • first()
  • \n
  • last()
  • \n
  • findBy...(), findAllBy...(), countBy...()
  • \n
  • createCriteria()
  • \n
\n

What is not

\n

Well, the world isn't perfect

\n
    \n
  • All methods that use string query
  • \n
  • find() (which uses closures)
  • \n
\n" }, { + "deprecated": "This repository was archived by the owner on Mar 10, 2025. It is now read-only.", "bintrayPackage": { "name": "spring-security-acl", "repo": "plugins", @@ -5621,6 +5622,7 @@ "readme": "

Grails Spring Security AppInfo Plugin

\n

See documentation for further information.

\n" }, { + "deprecated": "This repository was archived by the owner on Feb 28, 2025. It is now read-only.", "bintrayPackage": { "name": "spring-security-cas", "repo": "plugins", @@ -5750,6 +5752,7 @@ "readme": "

Grails Spring Security Kerberos Plugin

\n

See documentation for further information.

\n" }, { + "deprecated": "This repository was archived by the owner on Feb 28, 2025. It is now read-only.", "bintrayPackage": { "name": "spring-security-ldap", "repo": "plugins", @@ -5776,6 +5779,7 @@ "readme": "

\"Build

\n

Grails Spring Security LDAP Plugin

\n

See documentation for further information.

\n

What is LDAP?

\n

Introduction to Lightweight Directory Services

\n

Tools and Resources

\n\n

Repository Branch Structure

\n

Branches:

\n
    \n
  • master Grails 4 compatible versions.
  • \n
  • 3.x Grails 3 compatible versions.
  • \n
\n" }, { + "deprecated": "This repository was archived by the owner on Mar 10, 2025. It is now read-only.", "bintrayPackage": { "name": "spring-security-oauth2", "repo": "plugins", @@ -6251,6 +6255,7 @@ "readme": "

Grails Spring Security Shiro Plugin \"Build

\n

See documentation for further information.

\n" }, { + "deprecated": "This repository was archived by the owner on Feb 28, 2025. It is now read-only.", "bintrayPackage": { "name": "spring-security-ui", "repo": "plugins", From 60449b28a9fd0fb2e016dc40ec136f75b8af04b2 Mon Sep 17 00:00:00 2001 From: Thomas Rasmussen Date: Wed, 6 Aug 2025 11:00:27 +0200 Subject: [PATCH 19/35] mail plugin has been archived Moved to a new project from owner 'grails' to 'grails-plugins' --- grails-plugins.json | 1 + 1 file changed, 1 insertion(+) diff --git a/grails-plugins.json b/grails-plugins.json index 3482daa..d991d63 100644 --- a/grails-plugins.json +++ b/grails-plugins.json @@ -3908,6 +3908,7 @@ "readme": "

Readme for LightningJ Grails Plugin

\n

LightningJ Grails plugin is a project to simplify the usage of the LightningJ\nlibrary in Grails 3.3.x applications and above.

\n

For documentation see docs/index.adoc of the project web-site at\nhttp://grails.lightningj.org

\n

Build status Master branch: \"Build

\n" }, { + "deprecated": "This repository was archived by the owner on Dec 5, 2024. It is now read-only.", "bintrayPackage": { "name": "mail", "repo": "plugins", From cae5f709c9ebd30eed28007bc51c5ff3e7040ccb Mon Sep 17 00:00:00 2001 From: Thomas Rasmussen Date: Wed, 6 Aug 2025 11:04:10 +0200 Subject: [PATCH 20/35] angular2-scaffolding and angularjs-scaffolding has been archived --- grails-plugins.json | 2 ++ 1 file changed, 2 insertions(+) diff --git a/grails-plugins.json b/grails-plugins.json index d991d63..99ebcc4 100644 --- a/grails-plugins.json +++ b/grails-plugins.json @@ -197,6 +197,7 @@ "readme": null }, { + "deprecated": "This repository was archived by the owner on Mar 3, 2023. It is now read-only.", "bintrayPackage": { "name": "angular2-scaffolding", "repo": "plugins", @@ -221,6 +222,7 @@ "readme": "

Grails 3 Angular Scaffolding Plugin

\n

\"Build

\n

A plugin for generating client side assets based on domain classes

\n

Documentation

\n

Latest: https://grails-plugins.github.io/grails-angular-scaffolding/latest\nSnapshot: https://grails-plugins.github.io/grails-angular-scaffolding/snapshot

\n" }, { + "deprecated": "This repository was archived by the owner on Feb 28, 2025. It is now read-only.", "bintrayPackage": { "name": "angularjs-scaffolding", "repo": "plugins", From 2f1cab898542385850b3e42e996bc11425660481 Mon Sep 17 00:00:00 2001 From: Thomas Rasmussen Date: Wed, 6 Aug 2025 11:05:58 +0200 Subject: [PATCH 21/35] grails-plugin-converters has been archived (moved to grails-core) --- grails-plugins.json | 1 + 1 file changed, 1 insertion(+) diff --git a/grails-plugins.json b/grails-plugins.json index 99ebcc4..2161561 100644 --- a/grails-plugins.json +++ b/grails-plugins.json @@ -1185,6 +1185,7 @@ "readme": null }, { + "deprecated": "This repository was archived by the owner on Apr 8, 2025. It is now read-only.", "bintrayPackage": { "name": "converters", "repo": "plugins", From c19f8867f5cae42357b23160c2018af3022ceb64 Mon Sep 17 00:00:00 2001 From: Thomas Rasmussen Date: Wed, 6 Aug 2025 11:07:39 +0200 Subject: [PATCH 22/35] cache-guava has been archived --- grails-plugins.json | 1 + 1 file changed, 1 insertion(+) diff --git a/grails-plugins.json b/grails-plugins.json index 2161561..5698eda 100644 --- a/grails-plugins.json +++ b/grails-plugins.json @@ -886,6 +886,7 @@ "readme": "

\"Build

\n

Grails Cache Ehcache Plugin

\n

Makes Ehcache the cache implementation for the Grails Cache Plugin

\n

Grails 3

\n

See https://plugins.grails.org/plugin/grails/cache-ehcache and Documentation

\n

Grails 2

\n

See https://grails.org/plugin/cache-ehcache and Documentation

\n

Branches

\n

The current master branch is for 3.x versions of the plugin compatible with Grails 3. There is a 1.x branch for on-going maintenance of 1.x versions of the plugin compatible with Grails 2. Please submit any pull requests to the appropriate branch. Changes to the 1.x branch will be merged into the master branch if appropriate.

\n" }, { + "deprecated": "This repository was archived by the owner on Jul 12, 2024. It is now read-only.", "bintrayPackage": { "name": "cache-guava", "repo": "plugins", From 879f354d1b219437b94bb3da3cf319b4f94c24f0 Mon Sep 17 00:00:00 2001 From: Thomas Rasmussen Date: Wed, 6 Aug 2025 11:12:41 +0200 Subject: [PATCH 23/35] x-frame-options-plugin has been archived --- grails-plugins.json | 2 ++ 1 file changed, 2 insertions(+) diff --git a/grails-plugins.json b/grails-plugins.json index 5698eda..9fe1fb4 100644 --- a/grails-plugins.json +++ b/grails-plugins.json @@ -2880,6 +2880,7 @@ "readme": "

Grails Views

\n

Additional View Technologies for Grails 3.0 and above.

\n

Initial implementation includes JSON views powered by Groovy's JsonBuilder, however this project provides the basis for implementation other view types.

\n

View the latest documentation for details.

\n

\"Java

\n" }, { + "deprecated": "This repository was archived by the owner on Apr 14, 2025. It is now read-only.", "bintrayPackage": { "name": "x-frame-options-plugin", "repo": "plugins", @@ -6632,6 +6633,7 @@ "readme": "

wschat

\n

Grails websocket chat Plugin provides a multi-chat room add-on to an existing grails based site/application.

\n
How to install
\n
Configuration variables required
\n
3.0.9 must have these configuration items to work
\n
Version info
\n
Creating admin accounts
\n
Customised chat menus for your chat users
\n
Customise fonts chat output through css
\n
Internationalisation
\n
How to use configure Live chat & Chat Bot
\n
Add profile with taglib connection call
\n
Chat room booking/reservations
\n
WebtRTC WebCam walk through
\n
WebtRTC File sharing
\n
Integrating with existing grails application
\n
Videos on youtube:
\n
    \n
  1. \n

    Video: grails app running wschat 0.14 part1

    \n
  2. \n
  3. \n

    Video: grails app running wschat 0.14 part2

    \n
  4. \n
  5. \n

    Video: Client/Server Messaging part 1.\nEarlier version focus on backend control of socket messages. So the backend of your application. Override a service for this. Explained in links further below.

    \n
  6. \n
  7. \n

    Video: Client/Server Messaging part 2\n(Messages via websockets to frontend). In short update frontend via websocket callbacks.

    \n
  8. \n
  9. \n

    Video: 1.12 Chat room booking/reservations

    \n
  10. \n
  11. \n

    Video: 1.22 Multiple login with same Chat user and TicTacToe

    \n
  12. \n
  13. \n

    Video 1.23 Add Live chat to your grails application

    \n
  14. \n
  15. \n

    Video 1.23-SNAPSHOT1 Live chat Logs BOT Artificial Intelligence and more

    \n
  16. \n
  17. \n

    Video 1.24 Chat BOT now working in chat rooms, returning responses and banning/kicking users

    \n
  18. \n
  19. \n

    Video 1.25 LiveChat (1 room multiple users with 1 admin interacting with all)

    \n
  20. \n
  21. \n

    Video 3.0.6 1.27 LiveChat monitoring and changing live chat style/colours

    \n
  22. \n
  23. \n

    Video 3.0.9 Spring security

    \n
  24. \n
\n
Chat Commands
\n
STUN Server, setting up your own server & WebRTC-terminology
\n
0.10+ & resources based apps (pre 2.4)
\n
ChatClientEndPoint Client/Server Messaging new feature since 1.11
\n
How to screen capture
\n
Chat to DB
\n
1.13 Offline Messaging - enable override
\n
demo sites
\n
Known issues
\n
Thanks to
\n
Grails wschat release/feature summary:
\n
3.0.6/1.27 \t- Major tidyup removed most ajax processing besides popup pages. \n\t\t\t  Added css/internationlisation customisation\n\t\t\t  \n3.0.5/1.26\t- Tidy up with new look and new feature to monitor Live Chat requests\n3.0.4/1.25  - Live Chat Many users to 1 admin (Video 10).\n\n3.0.3/1.24  - ChatBot and badWords added to the main chat room\n\n3.0.3/1.23  - Live Chat feature added as part of the plugin(watch video 7)\n\n3.0.3/1.21  - Websocket TicTacToe game added (Watch video 6)\n\n3.0.3/1.20  - Multiple login with same user but must be different rooms - removal of dbSupport check\n\n1.18 -  Mediastreaming enabled but has not worked for me \n   \n1.17  - Websocket -> WebRTC File sharing peer2peer available -  \n  \n1.12  - Chat room bookings for multiple participants\n   \n1.0+  - Supports WebRTC currently only on Chrome Canary.\n\n0.19+ - Supports webcam tested  on chrome/firefox.\n\nAdmin can:  kick/Ban (for specified time period)\nUsers can create profiles define details and upload photos.\nChat rooms can be created in Config.groovy +/ DB once logged in using UI.\n\nYou can websocket :\n\tsend files / use webRTC technology to have video chat or share screen\n\tplay Tictactoe / noughts + crosses\n\tLive chat - set up a client easily and monitor live chats\n\tConfigure chat bookings / invite external attendees (emails)\n
\n" }, { + "deprecated": "This repository was archived by the owner on Apr 14, 2025. It is now read-only.", "bintrayPackage": { "name": "x-frame-options", "repo": "plugins", From dbdf98cc604eaaf5fcd89fa98998e6ddc508962f Mon Sep 17 00:00:00 2001 From: Thomas Rasmussen Date: Wed, 6 Aug 2025 11:15:13 +0200 Subject: [PATCH 24/35] grails-console plugin has been archived --- grails-plugins.json | 1 + 1 file changed, 1 insertion(+) diff --git a/grails-plugins.json b/grails-plugins.json index 9fe1fb4..50b8ee3 100644 --- a/grails-plugins.json +++ b/grails-plugins.json @@ -1136,6 +1136,7 @@ "readme": null }, { + "deprecated": "This repository was archived by the owner on Sep 10, 2024. It is now read-only.", "bintrayPackage": { "name": "console", "repo": "grails-plugins", From ba47f4aa86e1d0dd10c42b1ca1137932e714fbad Mon Sep 17 00:00:00 2001 From: Thomas Rasmussen Date: Wed, 6 Aug 2025 11:16:51 +0200 Subject: [PATCH 25/35] jesque-admin has been archived --- grails-plugins.json | 1 + 1 file changed, 1 insertion(+) diff --git a/grails-plugins.json b/grails-plugins.json index 50b8ee3..79eb240 100644 --- a/grails-plugins.json +++ b/grails-plugins.json @@ -3666,6 +3666,7 @@ "readme": null }, { + "deprecated": "This repository was archived by the owner on Jul 9, 2025. It is now read-only.", "bintrayPackage": { "name": "jesque-admin", "repo": "plugins", From d910288eb44d08fb866e3b952592287e2d2ed633 Mon Sep 17 00:00:00 2001 From: Thomas Rasmussen Date: Wed, 6 Aug 2025 11:33:00 +0200 Subject: [PATCH 26/35] angular-scaffolding, ldap-server repos no longer exists --- grails-plugins.json | 2 ++ 1 file changed, 2 insertions(+) diff --git a/grails-plugins.json b/grails-plugins.json index 79eb240..9a0a7b9 100644 --- a/grails-plugins.json +++ b/grails-plugins.json @@ -148,6 +148,7 @@ "readme": null }, { + "deprecated": "The Github repository no longer exists", "bintrayPackage": { "name": "angular-scaffolding", "repo": "plugins", @@ -3841,6 +3842,7 @@ "readme": "

grails-kml-plugin

\n

This is a very powerful plugin that does multiple things:

\n

A plugin to read raw kml file in - load google maps and overlay kml boundaries over map geo locations, international postcode lookup & resolve address from postcode feature

\n

1. Post/Zip code lookup globally and resolves as much of address as possible

\n

2. If map enabled draws out

\n
2.1 Boundary / area if exists
\n
2.2 places geo location of location on map
\n

3. Provides KML Utils:

\n
3.1 Parsing utils (Google Map overlay) - read below
\n
3.2 Edit KML Files via plugin and update a boundary
\n

Please refer to YouTube video to understand all of above a bit better

\n

How to install: Dependency Grails 3 (build.gradle):

\n
compile "org.grails.plugins:kml:0.4"\n
\n
\n

Demo project (grails 3.3.8)

\n
\n
\n

YouTube videos:

\n
\n

Boxset - play all 3 as a playlist

\n

Part 1 Walk through urls and simple usage of plugin - very basic

\n

Part 2 Walk through of how to build on new grails project from scratch

\n

Part 3 Talk through code process / steps

\n
\n

Java docs for classes

\n
\n

Configuration values for your application.yml application.groovy in my case:

\n
kmlplugin{\n    //TO USE MAP API FEATURE NEEDS TO BE ENABLED\n    GOOGLE_API_KEY='YOUR GOOGLE API KEY'\n    //This is total amount of local areas to collect for editing KML  \n    MAX_AREAS=30\n\n    //How far to look for local areas in miles\n    MAX_DISTANCE=30\n\n    //This defines to enable map\n    ENABLE_MAP_LOOKUP=true\n\n    //By default treated as false\n    DISABLE_LAT_LNG_LOOKUP=false\n\n    // If you don't have API feature enabled on key disable this you get a developer map instead\n    MAP_HAS_API_ENABLED=false\n\n  \n    //2 char country code of where your _default.kml belongs to so we can look up area names\n    KML_COUNTRY='UK'\n\n    // Internal folder to manage KML files - create and ensure web user has access\n    KML_LOC="/opt/kmlplugin/_map/KML/"\n    KML_HISTORY="/opt/kmlplugin/_map/KML_HISTORY/"\n\n    //Drop this file in KML_LOC root folder - refer to notes below\n    KML_DEFAULT="_default.kml"\n\n    //This will re-run - recreate entries from _default.kml\n    //if you are running in dev on h2 db - it is worth enabling this to add areas to db upon boot\n    KML_RESET_FROM_DEFAULT=false\n}\n
\n

Upon Start Available urls:

\n

1. Lookup service : http://localhost:8080/lookup

\n

This provides a page that given country / postcode will attempt to:

\n
\n

1.1: Lookup postcode and return as much of address as possible

\n
\n
\n

1.2. If ENABLE_MAP_LOOKUP is set to true and GOOGLE_API_KEY has valid API access\nWill load map, put postcode on map\n& if KML boundaries loaded and matches will load in the area overlay on the map.

\n
\n
\n

1.3 To disable features you can add any or all these to url line:

\n
\n
    \n
  • http://localhost:8080/lookup/index?showState=false&showArea=false&showLatLong=false&streetRequired=false
  • \n
\n

Other examples:

\n
    \n
  • \n

    http://localhost:8080/lookup/index?showState=false&showArea=true&showLatLong=true&streetRequired=false&countrysearch=United%20Kingdom&countryCode=UK&postcode=SE1%201AP

    \n
  • \n
  • \n

    http://localhost:8080/lookup/index?countrysearch=United%20Kingdom&countryCode=UK&postcode=SE1%201AP

    \n
  • \n
  • \n

    http://localhost:8080/lookup/index?countrysearch=United%20Kingdom&countryCode=UK&postcode=SE1%201AP&longitude=-0.09326659999999999&latitude=51.5017828

    \n
  • \n
  • \n

    http://localhost:8080/lookup/index?countrysearch=United%20Kingdom&countryCode=UK&postcode=SE1%201AP&longitude=-0.09326659999999999&latitude=51.5017828&communitySearch=Southwark

    \n
  • \n
\n

2. TagLib call

\n

All passed variables to map and instance are not required but to show what above url params can be either posted or done as per above with instance being addition to params above\nfor tag lib if you already have data this is what it is expecting to be sent to it

\n
<map:lookup \n   showState="${false}"   \n   showArea="${false}" \n   showLatLong="${false}" \n   streetRequired="${false}"\n   instance="${[\n        countrysearch:'',\n        countryCode:'',\n        postcode:'',\n        building:'',\n        street:'',\n        city:'',\n        state:'',\n        communitySearch:'',\n        latitude:'',\n        longitude:'',\n    ]}"\n  />\n<!-- similar example with some data already set all of below\n is enough to trigger maps / overlay - could be saved data -->\n<map:lookup\n    showState="${false}"\n    showArea="${false}"\n    showLatLong="${false}"\n    streetRequired="${false}"\n    instance="${[\n        countrysearch:'United Kingdom',\n        countryCode:'UK',\n        postcode:'SE1 1AP',\n        building:'',\n        street:'',\n        city:'',\n        state:'',\n        communitySearch:'Southwark',\n        latitude:'51.5017828',\n        longitude:'-0.09326659999999999',\n    ]}"\n/>\n
\n

Map overlay editor : http://localhost:8080/map

\n

This provides an interface to edit and modify existing kml boundaries on the fly.\nIt provides raw kml extracted file, has feature to upload, hasn't been tested.

\n

Instructions / Notes

\n

Customising your own lookup

\n

You will need to take a copy of _address.gsp when verifyCode is called the data object returned contains full dump of\neverything useful .

\n

console.log(JSON.stringify(data)) will show all but 2 full data sets: data.latLongDetails and data.fullPostCodeDetails

\n

KML Notes :

\n
    \n
  1. /opt/kmlplugin/_map/KML/ ->
  2. \n
\n

Place a file for the given country. This will be KML file you get hold of that contains typically all the official boroughs/councils of a given country in the case of UK we found:

\n

was here\nSite appears to no longer work. You can get hold of file from here

\n

This file was then stored in this folder as

\n

_default.kml

\n

/opt/kmlplugin/_map/KML/_default.kml

\n

To parse KML Files Add this to BootStrap.groovy

\n
 KmlHelper.parseKml()\n
\n

When the site starts up for the very first time, it will attempt to read through this file and inside the same folder it will expand out all the found boroughs.

\n
$ ls -rtml /opt/kmlplugin/_map/KML/|more\ntotal 9876\n-rw-rw-r-- 1 mx1 mx1 7394653 Nov 29 17:08 _default.kml\n-rw-rw-r-- 1 mx1 mx1   19199 Dec  1 19:36 BEDFORDSHIRE.kml\n-rw-rw-r-- 1 mx1 mx1   31337 Dec  1 19:36 BUCKINGHAMSHIRE.kml\n-rw-rw-r-- 1 mx1 mx1   24338 Dec  1 19:36 CAMBRIDGESHIRE.kml\n-rw-rw-r-- 1 mx1 mx1     584 Dec  1 19:36 CHESHIRE.kml\n-rw-rw-r-- 1 mx1 mx1     584 Dec  1 19:36 CORNWALL.kml\n-rw-rw-r-- 1 mx1 mx1     582 Dec  1 19:36 CUMBRIA.kml\n
\n

At this point it has loaded up each borough and also split each borough/community into its own specific file.

\n

This process happens only once and can be redone by clearing out and dropping in as above a _default.kml file.

\n

This triggers an internal process to do what has been demonstrated.

\n

Once it has been generated. The site will from there on refer to all created files to load up each community.

\n

This means you can now edit each of the generated files for a given community and re-save it \ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd a saved version and application restart will then ensure the site is using whatever latest content each community has.

\n

Upon start up you will need to visit the map regions and it will show what has been produced.

\n

To enable logging:

\n

Add below to grails-app/conf/logback.groovy

\n
    logger('org.grails.plugins.kml', ERROR, ['STDOUT'], false)\n    logger('org.grails.plugins.kml', DEBUG, ['STDOUT'], false)\n    logger('org.grails.plugins.kml', WARN, ['STDOUT'], false)\n    logger('org.grails.plugins.kml', INFO, ['STDOUT'], false)\n
\n

##Credits

\n

/map KML Editor taken from Kjell Scharning

\n

KML Map editor or /map segement is thanks to above link which gave the source to build the rest as such.\nHis worked got wired into what the rest of the code does, as per what his page expected.

\n

/lookup my own work over different projects / requirements.

\n
Please note - KML Parsing utiltiy. I put this class together as an expansion from this question on SO extract-coordinates-from-kml-file-in-java. Since this plugin is currently functional with provided kml file, any one who has additional time and wishes to come on board and improve KML Parsing to work with other standards or any other aspect of this plugin, I be happy to accept their input. This isn't something I'm currently using and was put together for another project, decided to release into public realm since I guess it is a bit of magic.
\n

\"sample\n\"sample\n\"sample\n\"sample\n\"sample\n\"sample\n\"sample\n\"sample\n\"sample\n\"sample\n\"sample

\n" }, { + "deprecated": "The Github repository no longer exists", "bintrayPackage": { "name": "ldap-server", "repo": "plugins", From 425924974ba0fe51378029f04ea0072b7d5ee9d0 Mon Sep 17 00:00:00 2001 From: Thomas Rasmussen Date: Wed, 6 Aug 2025 11:33:51 +0200 Subject: [PATCH 27/35] spring-security-rest-gorm s been archived --- grails-plugins.json | 1 + 1 file changed, 1 insertion(+) diff --git a/grails-plugins.json b/grails-plugins.json index 9a0a7b9..6c21833 100644 --- a/grails-plugins.json +++ b/grails-plugins.json @@ -6079,6 +6079,7 @@ "readme": "

Spring Security REST for Grails

\n

\"Build\n\"Latest\n\"Known

\n

Grails plugin to implement a stateless, token-based, RESTful authentication\nusing Spring Security. Sponsored and supported by Object Computing Inc.

\n

Documentation:

\n\n

Companies using this plugin

\n\n

Are you using this plugin and want to be listed here? Include your company yourself.

\n

Support

\n\n

NOTE: if you have questions or issues, enable debug logging,\nand include the output in your request.

\n

Contributors

\n\n

License

\n

This software is licensed under the terms of the Apache License, Version 2.0

\n" }, { + "deprecated": "This repository was archived by the owner on Feb 28, 2025. It is now read-only.", "bintrayPackage": { "name": "spring-security-rest-gorm", "repo": "plugins", From 04370b145f2e4d2d88d4b8a5047f8c21123db3fd Mon Sep 17 00:00:00 2001 From: Thomas Rasmussen Date: Thu, 14 Aug 2025 11:26:38 +0200 Subject: [PATCH 28/35] Fix link to Apache Grails plugins page --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index fdb290a..8c2a2af 100644 --- a/README.md +++ b/README.md @@ -1,5 +1,5 @@ # Grails Plugin Page Data Source -This repository hosts the data used by the [Grails Plugin Page](https://www.grails.org/plugins.html) to list and display plugin information. +This repository hosts the data used by the [Grails Plugin Page](https://grails.apache.org/plugins.html) to list and display plugin information. ## Adding Your Plugin to the Grails Plugin Page To have your plugin listed on the Grails Plugin Page, follow these steps: From 70ec18b81aae823115f1079ece05aa41a85332b5 Mon Sep 17 00:00:00 2001 From: Thomas Rasmussen Date: Thu, 14 Aug 2025 11:27:49 +0200 Subject: [PATCH 29/35] Grails Async and Events plugins updated --- grails-plugins.json | 14 ++++++-------- 1 file changed, 6 insertions(+), 8 deletions(-) diff --git a/grails-plugins.json b/grails-plugins.json index 6c21833..9c9a835 100644 --- a/grails-plugins.json +++ b/grails-plugins.json @@ -371,7 +371,6 @@ "readme": "

Asset Pipeline Handlebars Renderer Grails Plugin

\n

This plugin provides for server side execution of Handlebars.js templates. It is\nintended to compliment the handlebars-asset-pipeline plugin\nwhich compiles Handlebars templates into JavaScript for client side usage. The templates are compiled into Java\ncode using handlebars-java.

\n

Installation

\n

Add to build.gradle

\n
dependencies {\n     compile "org.grails.plugins:asset-pipeline-handlebars-renderer:0.1"\n}\n
\n

Configuration

\n

This plugin uses the same configuration as the handlebars-asset-pipeline plugin. Templates can be created in the standard assets/javascripts folder with an extension of .handlebars or .hbs. By default the templateRoot for your templates is specified as templates. This means that any handlebars file within assets/javascripts/templates/ will utilize its file name (without the extension) as its template name. So a template that lives at assets/javascripts/templates/my_template.hbs can be rendered as <handlebars:render template="my_template"/>.

\n

Usage

\n

A handlebars:render tag is provided to render handlebars templates similarly to how regular gsp templates are applied in views. Templates can be rendered inline:

\n
<handlebars:render model="[name: 'bob']">\n    <p>Hello {{name}}</p>\n</handlebars:render>\n
\n

Or they can be stored in a separate file and referenced by name:

\n
<handlebars:render template="home/hello" model="[name: 'bob']"/>\n
\n

For the above example, (assuming the default templateRoot) the template would be located at grails-app/assets/javascripts/templates/home/hello.hbs.

\n

If no model is supplied then the default page bindings (page scope variables) are used:

\n
<handlebars:render>\n    Hello {{name}} from the controller\n</handlebars:render>\n
\n

Behind the scenes, the taglib uses the handlebarsService to render templates. You can do the same if, for example, you want to render the template directly from a controller:

\n
def handlebarsService\n\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ndef list() {\n    render handlebarsService.apply("home/accounts", [accounts: Account.list()])\n}\n
\n" }, { - "deprecated": "This repository was archived by the owner on May 28, 2025. It is now read-only.", "bintrayPackage": { "name": "async", "repo": "plugins", @@ -383,16 +382,16 @@ "licenses": [ "Apache-2.0" ], - "issueTrackerUrl": "https://github.com/grails/grails-async/issues", + "issueTrackerUrl": "https://github.com/apache/grails-core/issues", "latestVersion": "5.0.2", "updated": "2024-01-09T11:43:22.000Z", "systemIds": [ "org.grails.plugins:async" ], - "vcsUrl": "https://github.com/grails/grails-async" + "vcsUrl": "https://github.com/apache/grails-core" }, "documentationUrl": "https://async.grails.org/latest/guide/index.html", - "mavenMetadataUrl": "https://repo1.maven.org/maven2/org/grails/plugins/async/maven-metadata.xml", + "mavenMetadataUrl": "https://repo1.maven.org/maven2/org/apache/grails/grails-async/maven-metadata.xml", "readme": "" }, { @@ -1795,7 +1794,6 @@ "readme": "

Ember Asset-Pipeline

\n

\"Build

\n

MOVED: This project has moved to a sub project of the main asset-pipeline repository http://github.com/bertramdev/asset-pipeline

\n

Overview

\n

The JVM ember-asset-pipeline is a plugin that provides handlebars template precompiler support for Ember.js to asset-pipeline.

\n

Current Ember Version: 1.7.0

\n

For more information on how to use asset-pipeline, visit here.

\n

Usage

\n

Simply create files in your standard assets/javascripts folder with extension .handlebars or .hbs.\nBy default the templateRoot for your template names is specified as 'templates'. This means that any handlebars file within the root assets/javascripts folder will utilize its file name (without the extension) as its template name. Or a file in templates/show.handlebars would be named templates/show. If templates is set as the templateRoot than it would be named show

\n

It is also possible to change the template path seperator for templatenames to be used by handlebars:

\n

Gradle Example:

\n
assets {\n\tconfig = [\n\thandlebars: [\n\t\ttemplateRoot: 'templates',\n\t\ttemplatePathSeperator: '/'\n\t]\n\t]\n}\n
\n

Grails Example:

\n
grails {\n\tassets {\n\t\thandlebars {\n\t\t\ttemplateRoot = 'templates'\n\t\t\ttemplatePathSeperator = "/"\n\t\t}\n\t}\n}\n
\n

To use the handlebars runtime simply add handlebars js to your application.js or your gsp file

\n
//=require handlebars\n
\n

Using in the Browser

\n

Template functions are stored in the Handlebars.templates object using the template name. If the template name is\nperson/show, then the template function can be accessed from Handlebars.templates['person/show']. See the Template Names section for how template names are calculated.

\n

See the Handlebars.js website for more information on using Handlebars template functions.

\n" }, { - "deprecated": "This repository was archived by the owner on May 28, 2025. It is now read-only.", "bintrayPackage": { "name": "events", "repo": "plugins", @@ -1808,16 +1806,16 @@ "licenses": [ "Apache-2.0" ], - "issueTrackerUrl": "https://github.com/grails/grails-async/issues", + "issueTrackerUrl": "https://github.com/apache/grails-core/issues", "latestVersion": "5.0.2", "updated": "2024-01-09T11:43:24.000Z", "systemIds": [ "org.grails.plugins:events" ], - "vcsUrl": "https://github.com/grails/grails-async" + "vcsUrl": "https://github.com/apache/grails-core" }, "documentationUrl": "https://async.grails.org/latest/guide/index.html#events", - "mavenMetadataUrl": "https://repo1.maven.org/maven2/org/grails/plugins/events/maven-metadata.xml", + "mavenMetadataUrl": "https://repo1.maven.org/maven2/org/apache/grails/grails-events/maven-metadata.xml", "readme": "" }, { From 29deb54a3c003c33c1920556f43289f47a0d67a0 Mon Sep 17 00:00:00 2001 From: Thomas Rasmussen Date: Thu, 14 Aug 2025 11:32:14 +0200 Subject: [PATCH 30/35] Updated systemIds --- grails-plugins.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/grails-plugins.json b/grails-plugins.json index 9c9a835..91141e8 100644 --- a/grails-plugins.json +++ b/grails-plugins.json @@ -386,7 +386,7 @@ "latestVersion": "5.0.2", "updated": "2024-01-09T11:43:22.000Z", "systemIds": [ - "org.grails.plugins:async" + "org.apache.grails:grails-async" ], "vcsUrl": "https://github.com/apache/grails-core" }, @@ -1810,7 +1810,7 @@ "latestVersion": "5.0.2", "updated": "2024-01-09T11:43:24.000Z", "systemIds": [ - "org.grails.plugins:events" + "org.apache.grails:grails-events" ], "vcsUrl": "https://github.com/apache/grails-core" }, From e7f2cec792197e4e7f8a1b401bc6023c13405a76 Mon Sep 17 00:00:00 2001 From: Thomas Rasmussen Date: Thu, 2 Oct 2025 14:25:18 +0200 Subject: [PATCH 31/35] Updated plugins moved into the Apache Grail Core repo Updated metadata: Some of the projects have been moved into the Apache Grails Core repo - grails-converters - grails-data-hibernate5-dbmigration - grails-fields - grails-geb - grails-gsp - grails-data-mongodb - grails-scaffolding - grails-spring-security-acl - grails-spring-security-cas - grails-spring-security-ldap - grails-spring-security-oauth2 - grails-spring-security-rest - grails-spring-security-rest-datamapping - grails-spring-security-rest-redis - grails-spring-security-ui --- grails-plugins.json | 162 ++++++++++++++++++++------------------------ 1 file changed, 75 insertions(+), 87 deletions(-) diff --git a/grails-plugins.json b/grails-plugins.json index 91141e8..f15e9a0 100644 --- a/grails-plugins.json +++ b/grails-plugins.json @@ -1187,7 +1187,6 @@ "readme": null }, { - "deprecated": "This repository was archived by the owner on Apr 8, 2025. It is now read-only.", "bintrayPackage": { "name": "converters", "repo": "plugins", @@ -1200,16 +1199,17 @@ "licenses": [ "Apache-2.0" ], - "issueTrackerUrl": "https://github.com/grails/grails-plugin-converters/issues", + "issueTrackerUrl": "https://github.com/apache/grails-core/issues", "latestVersion": "5.0.0", "updated": "2024-02-26T10:59:18.000Z", "systemIds": [ - "org.grails.plugins:converters" + "org.grails.plugins:converters", + "org.apache.grails:grails-converters" ], - "vcsUrl": "https://github.com/grails-plugins/grails-plugin-converters" + "vcsUrl": "https://github.com/apache/grails-core" }, "documentationUrl": null, - "mavenMetadataUrl": "https://repo1.maven.org/maven2/org/grails/plugins/converters/maven-metadata.xml", + "mavenMetadataUrl": "https://repo1.maven.org/maven2/org/apache/grails/grails-converters/maven-metadata.xml", "readme": "

Grails Converters

\n

This is the Converters plugin that has been part of Grails core up until version 3.3 and now is a standalone plugin.

\n

Users of Grails 3.3.x and above should use this plugin.

\n

Installation

\n

Simply add the dependency to your build.gradle file:

\n
compile "org.grails.plugins:converters"\n
\n" }, { @@ -1390,7 +1390,6 @@ "readme": null }, { - "deprecated": "This repository was archived by the owner on Apr 8, 2025. It is now read-only.", "bintrayPackage": { "name": "database-migration", "repo": "plugins", @@ -1404,16 +1403,17 @@ "licenses": [ "Apache-2.0" ], - "issueTrackerUrl": "https://github.com/grails/grails-database-migration/issues", + "issueTrackerUrl": "https://github.com/apache/grails-core/issues", "latestVersion": "5.0.0", "updated": "2024-12-18T22:20:28.000Z", "systemIds": [ - "org.grails.plugins:database-migration" + "org.grails.plugins:database-migration", + "org.apache.grails:grails-data-hibernate5-dbmigration" ], - "vcsUrl": "https://github.com/grails/grails-database-migration" + "vcsUrl": "https://github.com/apache/grails-core" }, "documentationUrl": "https://grails.github.io/grails-database-migration/", - "mavenMetadataUrl": "https://repo1.maven.org/maven2/org/grails/plugins/database-migration/maven-metadata.xml", + "mavenMetadataUrl": "https://repo1.maven.org/maven2/org/apache/grails/grails-data-hibernate5-dbmigration/maven-metadata.xml", "readme": null }, { @@ -1972,7 +1972,6 @@ "readme": "

Facebook SDK Grails Plugin

\n

\"Build\n\"Download\"

\n

Introduction

\n

The Facebook Platform is a set of APIs that make your application more social. Read more about integrating Facebook with your web site on the Facebook developer site.

\n

This project contains the open source Grails Facebook SDK Plugin that allows you to integrate the Facebook Platform on a website/app powered by Grails.

\n

This plugin is a port of the official Facebook PHP SDK to Grails 3.0.

\n

It supports the latest OAuth2.0 authentication (required since October 1st 2011).

\n

Grails Facebook SDK Plugin provides the following Grails artefacts:

\n\n

WARNING: Facebook API v3.0 is now used by default.

\n

Installation

\n

Declare the plugin dependency in the build.gradle file, as shown here:

\n
dependencies {\n    ...\n    compile "org.grails.plugins:facebook-sdk:4:0.0"\n    ...\n}\n
\n

Config

\n

Create a Facebook app on Facebook Developers, in order to get your own app ID and app secret.

\n

Add your Facebook app parameters to your grails-app/conf/application.yml:

\n
grails:\n    plugin:\n        facebooksdk:\n            app:\n                id: {APP_ID}\n                permissions: {APP_PERMISSIONS} // Ex. ['email','user_photos']\n                secret: {APP_SECRET}\n
\n

By default, latest Graph API v3.3 will be used.\nYou can override default settings with apiVersion setting:

\n
grails:\n    plugin:\n        facebooksdk:\n            apiVersion: v2.3\n
\n

Since FacebookContext should be instantiated at each request, you must use prototype scope for your Controllers (since Grails 2.3, singleton is the default scope).

\n
grails:\n    controllers:\n        defaultScope: prototype\n
\n

Default jQuery selector is $, if you require another one, you can define it globally in your grails-app/conf/application.groovy:

\n
grails:\n    plugin:\n        facebooksdk:\n            customSelector: jQuery\n
\n

Bugs

\n

To report any bug, please use the project Issues section on GitHub.

\n

Feedback

\n

The Grails Facebook SDK is not an official Facebook SDK such as Javascript, PHP, iOS and Android SDKs.

\n

It is developed by AgoraPulse.

\n

The Grails Facebook SDK is licensed under the Apache Licence, Version 2.0.

\n

Breaking Changes

\n

4.0.1

\n
    \n
  • Default return type of fetchObject from FacebookExtensions is back to JsonObject instead of Map
  • \n
\n

4.0.0

\n
    \n
  • restfb upgrade - see https://github.com/restfb/restfb/blob/master/migrations.md\n
      \n
    • removed FacebookRestClient and DefaultFacebookRestClient
    • \n
    • avoid using raw JsonObject as the class has completely changed i.g. JsonObject from restfb 2.x implements own method asBoolean() which fails if the value is not boolean so you need to do regular foo != null check for testing the presense of the returned JsonObject value
    • \n
    \n
  • \n
  • FacebookGraphClient is now deprecated, use FacebookGraphClientService to create instances of FacebookClient with similar capabilities
  • \n
  • FacebookExtensions the most useful methods from FacebookGraphClientare now injected using extensions methods to FacebookClient interface directly
  • \n
\n" }, { - "deprecated": "This repository was archived by the owner on Mar 10, 2025. It is now read-only.", "bintrayPackage": { "name": "fields", "repo": "plugins", @@ -1984,17 +1983,17 @@ "licenses": [ "Apache-2.0" ], - "issueTrackerUrl": "https://github.com/gpc/fields/issues", + "issueTrackerUrl": "https://github.com/apache/grails-core/issues", "latestVersion": "5.0.3", "updated": "2024-04-08T19:47:32.000Z", "systemIds": [ - "io.github.gpc:fields" + "org.apache.grails:grails-fields" ], - "vcsUrl": "https://github.com/gpc/fields" + "vcsUrl": "https://github.com/apache/grails-core" }, - "documentationUrl": "https://gpc.github.io/fields/", - "mavenMetadataUrl": "https://repo1.maven.org/maven2/io/github/gpc/fields/maven-metadata.xml", - "readme": "Find the latest documentation here: https://gpc.github.io/fields" + "documentationUrl": "https://docs.grails.org/latest/guide/theWebLayer.html#fields", + "mavenMetadataUrl": "https://repo1.maven.org/maven2/org/apache/grails/grails-fields/maven-metadata.xml", + "readme": "Find the latest documentation here: https://docs.grails.org/latest/guide/theWebLayer.html#fields" }, { "displayName": "file-viewer", @@ -2112,16 +2111,16 @@ "licenses": [ "Apache-2.0" ], - "issueTrackerUrl": "https://github.com/grails/geb/issues", + "issueTrackerUrl": "https://github.com/apache/grails-core/issues", "latestVersion": "4.1.1", "updated": "2024-12-22T00:53:39.000Z", "systemIds": [ - "org.grails.plugins:geb" + "org.apache.grails:grails-geb" ], - "vcsUrl": "https://github.com/grails/geb" + "vcsUrl": "https://github.com/apache/grails-core" }, "documentationUrl": null, - "mavenMetadataUrl": "https://repo1.maven.org/maven2/org/grails/plugins/geb/maven-metadata.xml", + "mavenMetadataUrl": "https://repo1.maven.org/maven2/org/apache/grails/grails-geb/maven-metadata.xml", "readme": null }, { @@ -3005,7 +3004,6 @@ "readme": "

Greenmail Plugin for Grails 3

\n

This is a fork of grails greenmail plugin for grails 3.

\n

INSTALL

\n

Add a dependency for the plugin in build.gradle:

\n
\ndependencies {    \n    compile 'org.grails.plugins:greenmail:2.0.0.RC2'    \n}\n\n
\n

USAGE

\n

Provides a wrapper around GreenMail and provides a view that displays sent messages - useful for testing application in the development or test environments.

\n

Installation

\n
grails install-plugin greenmail\n
\n

The plugin assumes that you have some sort of Java mail provider installed (for instance the Grails mail plugin). You need to define a SMTP port for the mock Greenmail SMTP server to start with. Using the Grails Mail plugin, this is as simple as defining the grails.mail.port property in Config.groovy, like this (see the first line in the development and test blocks):

\n
environments {\n    production {\n        grails.serverURL = "http://www.changeme.com"\n    }\n    development {\n\tgrails.mail.port = com.icegreen.greenmail.util.ServerSetupTest.SMTP.port\n        grails.serverURL = "http://localhost:8080/${appName}"\n    }\n    test {\n\tgrails.mail.port = com.icegreen.greenmail.util.ServerSetupTest.SMTP.port\n        grails.serverURL = "http://localhost:8080/${appName}"\n    }\n}\n
\n

You can also completely disable the plugin by using the config setting grails.plugin.greenmail.disabled = true. For example, to disable greenmail in production:

\n
environments {\n    production {\n       grails.plugin.greenmail.disabled=true\n    }\n}\n
\n

If you need to change the default listening port (1025) you can use the grails.plugin.greenmail.ports.smtp configuration variable. For example:

\n
environments {\n    test {\n       grails.plugin.greenmail.ports.smtp = 2025\n    }\n}\n
\n

Usage in Integration Tests

\n

The plugin can be used to capture email messages during integration tests. For example:

\n
import com.icegreen.greenmail.util.*\n\nclass GreenmailTests extends GroovyTestCase {\n    def mailService\n    def greenMail\n\n    void testSendMail() {\n        Map mail = [message:'hello world', from:'from@piragua.com', to:'to@piragua.com', subject:'subject']\n\n        mailService.sendMail {\n            to mail.to\n            from mail.from\n            subject mail.subject\n            body mail.message\n        }\n        \n        assertEquals(1, greenMail.getReceivedMessages().length)\n\t\n        def message = greenMail.getReceivedMessages()[0]\n\t\t\n        assertEquals(mail.message, GreenMailUtil.getBody(message))\n        assertEquals(mail.from, GreenMailUtil.getAddressList(message.from))\n        assertEquals(mail.subject, message.subject)\n    }\n\n    void tearDown() {\n        greenMail.deleteAllMessages()\n    }\n}\n
\n

The plugin adds a deleteAllMessages() convenience method to the greenMail bean that deletes all received messages.

\n

Usage in running application

\n

The plugin provides a controller and view to show messages that are sent from the application. Simply browse to http://localhost:8080/greenmail and it will show a list of messages sent. You can click on the show link to view the raw message.

\n

Roadmap

\n

This is a fully functional plugin, though there are some features that I think would be worth adding. Contributions and patches are welcome!

\n
    \n
  • Messages sent by the Grails Mail plugin have duplicate "TO:" fields in the raw message and in the address list, for instance if the recipient is spam@piragua.com, then that email address is listed twice when you retrieve the address list for RecipientType.TO (e.g. GreenMailUtil.getAddressList(message.getRecipients(javax.mail.Message.RecipientType.TO))
  • \n
  • Ability to view HTML email messages as they appear in a mail client rather than as RAW message.
  • \n
\n" }, { - "deprecated": "This repository was archived by the owner on May 28, 2025. It is now read-only.", "bintrayPackage": { "name": "gsp", "repo": "plugins", @@ -3017,16 +3015,16 @@ "licenses": [ "Apache-2.0" ], - "issueTrackerUrl": "https://github.com/grails/grails-gsp/issues", + "issueTrackerUrl": "https://github.com/apache/grails-core/issues", "latestVersion": "6.2.4", "updated": "2024-11-19T22:48:43.000Z", "systemIds": [ - "org.grails.plugins:gsp" + "org.apache.grails:grails-gsp" ], - "vcsUrl": "https://github.com/grails/grails-gsp" + "vcsUrl": "https://github.com/apache/grails-core" }, "documentationUrl": "https://gsp.grails.org/latest/guide/index.html", - "mavenMetadataUrl": "https://repo1.maven.org/maven2/org/grails/plugins/gsp/maven-metadata.xml", + "mavenMetadataUrl": "https://repo1.maven.org/maven2/org/apache/grails/grails-gsp/maven-metadata.xml", "readme": "
\n
\n
\n

This project contains the sources for GSP, the server-side view rendering technology used in Grails.

\n
\n
\n
\n
\n

Documentation

\n
\n
\n\n
\n
\n
" }, { @@ -3248,16 +3246,16 @@ "licenses": [ "Apache-2.0" ], - "issueTrackerUrl": "https://github.com/grails/grails-data-mapping/issues", + "issueTrackerUrl": "https://github.com/apache/grails-core/issues", "latestVersion": "8.1.1", "updated": "2024-11-19T01:27:50.000Z", "systemIds": [ - "org.grails.plugins:hibernate5" + "org.apache.grails:grails-data-hibernate5" ], - "vcsUrl": "https://github.com/grails/grails-data-mapping" + "vcsUrl": "https://github.com/apache/grails-core/issues" }, - "documentationUrl": "https://grails.github.io/grails-data-mapping/", - "mavenMetadataUrl": "https://repo1.maven.org/maven2/org/grails/plugins/hibernate5/maven-metadata.xml", + "documentationUrl": null, + "mavenMetadataUrl": "https://repo1.maven.org/maven2/org/apache/grails/grails-data-hibernate5/maven-metadata.xml", "readme": "

\"Java\n\"Release\"\n\"Maven

\n

GORM (Grails Object Mapping)

\n

[Grails][Grails] is a framework used to build web applications with the [Groovy][Groovy] programming language. This project provides the plumbings for the GORM API both for Hibernate and for new implementations of GORM ontop of NoSQL datastores.\n[Grails]: http://grails.org/\n[Groovy]: http://groovy-lang.org/

\n

Getting Started

\n

For further information see the dedicated websites:

\n\n

License

\n

Grails and Groovy are licensed under the terms of the [Apache License, Version 2.0][Apache License, Version 2.0].\n[Apache License, Version 2.0]: http://www.apache.org/licenses/LICENSE-2.0.html

\n" }, { @@ -4039,7 +4037,6 @@ "readme": "

Infobip plugin \"Build

\n

Grails plugin for Infobip SMS API

\n

Prerequisite to using modninfobip plugin

\n
    \n
  • Sign up for an infobip account
  • \n
  • Confirm your account
  • \n
\n

Method Declarations

\n

Generate basic authorization

\n
String basicAuthorization(String username, String password)\n
\n
    \n
  • username - infobip username
  • \n
  • password - infobip password
  • \n
\n

NB: Basic authorization is mandatory for all infobip REST API requests.

\n

Send an SMS to a single phone number

\n
JSONObject sendSingleMessage(String authorization, String from, String to, String text)\n
\n
    \n
  • from - Sender phone number registered on infobip (Phone numbers are usually prefixed with + (plus sign), followed by a country code, network code and the subscriber number)
  • \n
  • to - Recipient phone number
  • \n
  • text - SMS message to send
  • \n
\n

Send an SMS to multiple phone numbers

\n
JSONObject sendSingleMessage(String authorization, String from, List to, String text)\n
\n
    \n
  • to - A list of string types of recipients' phone numbers
  • \n
\n

Send multiple SMS's to multiple or same recipient phone number

\n
JSONObject sendMultipleMessages(String authorization, JSONObject data)\n
\n
    \n
  • data - A json object of data. An example is show below.
  • \n
\n
{  \n   "messages":[  \n      {  \n         "from":"InfoSMS",\n         "to":[  \n            "41793026727",\n            "41793026731"\n         ],\n         "text":"May the Force be with you!"\n      },\n      {  \n         "from":"41793026700",\n         "to":"41793026785",\n         "text":"A long time ago, in a galaxy far, far away... It is a period of civil war. Rebel spaceships, striking from a hidden base, have won their first victory against the evil Galactic Empire."\n      }\n   ]\n}\n
\n

Get delivery reports

\n
JSONObject deliveryReport(String authorization)\n
\n

Get filtered delivery reports

\n
JSONObject deliveryReport(String authorization, Map filters)\n
\n
    \n
  • filters - A filter map. View here for more filter information.
  • \n
\n

NB: Delivery reports can only be gotten once. A second call returns an empty result.

\n

Pull received messages to phone number from Infobip server

\n
JSONObject pullReceivedMessages(String authorization)\nJSONObject pullReceivedMessages(String authorization, int limit)\n
\n
    \n
  • limit - The number of messages to pull from server. Default is 50 and maximum is 10000
  • \n
\n

Get logs

\n
// Call the messageLog method of corresponding service \n// class (SendMessageService or ReceiveMessageService)\nJSONObject messageLog(String authorization)\n
\n

Get filtered logs

\n
// Call the messageLog method of corresponding service \n// class (SendMessageService or ReceiveMessageService)\nJSONObject messageLog(String authorization, Map filters)\n
\n
    \n
  • filters - A filter map. View here for filter information for sent messages and\nhere for filter information for received messages.
  • \n
\n

Check Account Balance

\n
JSONObject checkAccountBalance(String authorization)\n
\n

Installation

\n

Edit application.groovy (or application.yml if you prefer) and build.gradle

\n
    \n
  • application.groovy
  • \n
\n
infobip.host = "https://api.infobip.com/sms/1"\n
\n

OR

\n
    \n
  • application.yml
  • \n
\n
infobip:\n    host: https://api.infobip.com/sms/1\n
\n
    \n
  • build.gradle
  • \n
\n
repositories {\n    maven {\n        url  "http://dl.bintray.com/modnsolutions/plugins-libraries" \n    }\n}\n\ndependencies {\n    compile "org.grails.plugins:modninfobip:1.0.2"\n}\n
\n

Usage

\n
    \n
  • Import the required service classes into you Grails Service or Controller class.
  • \n
\n
import com.modnsolutions.ReceiveMessageService //service to pull received messages and message log from infobip server\nimport com.modnsolutions.SendMessageService // service to send messages via infobip, get delivery report and message logs\nimport com.modnsolutions.UtilitiesService\n
\n
    \n
  • Inject AuthorizationService and SendMessageService classes into your Grails Service or Controller class.
  • \n
\n
ReceiveMessageService receiveMessageService\nSendMessageService sendMessageService\nUtilitiesService utilitiesService\n
\n
    \n
  • In your class method, generate your basic authorization code and send your messages
  • \n
\n
String basicAuthorization = utilitiesService.basicAuthorization("INFOBIP_USERNAME", "INFOBIP_PASSWORD")\nJSONObject singleMessageResponse = sendMessageService.sendSingleMessage(basicAuthorization, from, to, text)\nprintln singleMessageResponse\n
\n

Example

\n
import com.modnsolutions.ReceiveMessageService\nimport com.modnsolutions.SendMessageService\nimport com.modnsolutions.UtilitiesService\n\n// In Grails you can handle json objects and arrays by importing and using\n// import org.grails.web.json.JSONArray\n// import org.grails.web.json.JSONObject\n\nclass SMSController {\n    ReceiveMessageService receiveMessageService\n    SendMessageService sendMessageService\n    UtilitiesService utilitiesService\n    \n    def sendSingleSMS(String from, String to, String text) {\n        String basicAuthorization = utilitiesService.basicAuthorization("INFOBIP_USERNAME", "INFORBIP_PASSWORD")\n        render sendMessageService.sendSingleMessage(basicAuthorization, from, to, text)\n    }\n    \n    def pullMessages() {\n        String basicAuthorization = utilitiesService.basicAuthorization("INFOBIP_USERNAME", "INFORBIP_PASSWORD")\n        render receiveMessageService.pullReceivedMessages(basicAuthorization)\n    }\n    \n    def checkAccountBalance() {\n        String basicAuthorization = utilitiesService.basicAuthorization("INFOBIP_USERNAME", "INFORBIP_PASSWORD")\n        render utilitiesService.checkAccountBalance(basicAuthorization)\n    }\n    \n    ...\n}\n
\n" }, { - "deprecated": "This repository was archived by the owner on Mar 13, 2025. It is now read-only.", "bintrayPackage": { "name": "mongodb", "repo": "plugins", @@ -4052,16 +4049,16 @@ "licenses": [ "Apache-2.0" ], - "issueTrackerUrl": "https://github.com/grails/gorm-mongodb/issues", + "issueTrackerUrl": "https://github.com/apache/grails-core/issues", "latestVersion": "8.2.0", "updated": "2024-03-15T19:26:14.000Z", "systemIds": [ - "org.grails.plugins:mongodb" + "org.apache.grails:grails-data-mongodb" ], - "vcsUrl": "https://github.com/grails/gorm-mongodb" + "vcsUrl": "https://github.com/apache/grails-core" }, "documentationUrl": null, - "mavenMetadataUrl": "https://repo1.maven.org/maven2/org/grails/plugins/mongodb/maven-metadata.xml", + "mavenMetadataUrl": "https://repo1.maven.org/maven2/org/apache/grails/grails-data-mongodb/maven-metadata.xml", "readme": "

\"Java\n\"Release\"

\n

GORM for MongoDB

\n

This project implements GORM for the MongoDB Document Database.

\n

NOTE: This source code here is for version 6.x and above. For prevoius versions' source see the relevant branch on the Grails Data Mapping project.

\n

For more information see the following links:

\n\n

For the current development version see the following links:

\n\n" }, { @@ -5306,7 +5303,6 @@ "readme": null }, { - "deprecated": "This repository was archived by the owner on Mar 10, 2025. It is now read-only.", "bintrayPackage": { "name": "scaffolding", "repo": "plugins", @@ -5318,16 +5314,16 @@ "licenses": [ "Apache-2.0" ], - "issueTrackerUrl": "https://github.com/grails/scaffolding/issues", + "issueTrackerUrl": "https://github.com/apache/grails-core/issues", "latestVersion": "5.1.3", "updated": "2024-11-20T12:41:42.000Z", "systemIds": [ - "org.grails.plugins:scaffolding" + "org.apache.grails:grails-scaffolding" ], - "vcsUrl": "https://github.com/grails/scaffolding" + "vcsUrl": "https://github.com/apache/grails-core" }, "documentationUrl": null, - "mavenMetadataUrl": "https://repo1.maven.org/maven2/org/grails/plugins/scaffolding/maven-metadata.xml", + "mavenMetadataUrl": "https://repo1.maven.org/maven2/org/apache/grails/grails-scaffolding/maven-metadata.xml", "readme": null }, { @@ -5579,7 +5575,6 @@ "readme": "

grails-soft-delete

\n

Provides Grails domain classes support for soft (or logical) deletes.

\n

WARNING

\n

This code is experimental. I can't garantee it will work, but I will improve it over time.

\n

How to install

\n

Slap the following code into build.gradle, dependencies part:

\n

compile 'org.grails.plugins:soft-delete:0.3'

\n

Alternatively you have to clone the repository, build the jar file and put it on a libs folder inside your application.

\n

How it works

\n

The plugin enhances all the domain classes using traits, overriding the common GORM methods.

\n

What is supported

\n

The following methods are supported:

\n
    \n
  • delete() (obvious, isn't it)
  • \n
  • get()
  • \n
  • load()
  • \n
  • getAll()
  • \n
  • list()
  • \n
  • first()
  • \n
  • last()
  • \n
  • findBy...(), findAllBy...(), countBy...()
  • \n
  • createCriteria()
  • \n
\n

What is not

\n

Well, the world isn't perfect

\n
    \n
  • All methods that use string query
  • \n
  • find() (which uses closures)
  • \n
\n" }, { - "deprecated": "This repository was archived by the owner on Mar 10, 2025. It is now read-only.", "bintrayPackage": { "name": "spring-security-acl", "repo": "plugins", @@ -5593,13 +5588,13 @@ "licenses": [ "Apache-2.0" ], - "issueTrackerUrl": "https://github.com/grails-plugins/grails-spring-security-acl/issues", + "issueTrackerUrl": "https://github.com/apache/grails-core/issues", "latestVersion": "4.0.0.M2", "updated": "2019-04-18T15:29:17.202Z", "systemIds": [ - "org.grails.plugins:spring-security-acl" + "org.apache.grails:grails-spring-security-acl" ], - "vcsUrl": "https://github.com/grails-plugins/grails-spring-security-acl" + "vcsUrl": "https://github.com/apache/grails-core" }, "documentationUrl": "https://grails-plugins.github.io/grails-spring-security-acl/", "mavenMetadataUrl": null, @@ -5630,7 +5625,6 @@ "readme": "

Grails Spring Security AppInfo Plugin

\n

See documentation for further information.

\n" }, { - "deprecated": "This repository was archived by the owner on Feb 28, 2025. It is now read-only.", "bintrayPackage": { "name": "spring-security-cas", "repo": "plugins", @@ -5644,16 +5638,16 @@ "licenses": [ "Apache-2.0" ], - "issueTrackerUrl": "https://github.com/grails/grails-spring-security-cas/issues", + "issueTrackerUrl": "https://github.com/apache/grails-core/issues", "latestVersion": "4.0.0", "updated": "2024-01-26T07:29:57.000Z", "systemIds": [ - "org.grails.plugins:spring-security-cas" + "org.apache.grails:grails-spring-security-cas" ], - "vcsUrl": "https://github.com/grails/grails-spring-security-cas" + "vcsUrl": "https://github.com/apache/grails-core/issues" }, "documentationUrl": "https://grails.github.io/grails-spring-security-cas/", - "mavenMetadataUrl": "https://repo1.maven.org/maven2/org/grails/plugins/spring-security-cas/maven-metadata.xml", + "mavenMetadataUrl": "https://repo1.maven.org/maven2/org/apache/grails/grails-spring-security-cas/maven-metadata.xml", "readme": null }, { @@ -5760,9 +5754,8 @@ "readme": "

Grails Spring Security Kerberos Plugin

\n

See documentation for further information.

\n" }, { - "deprecated": "This repository was archived by the owner on Feb 28, 2025. It is now read-only.", "bintrayPackage": { - "name": "spring-security-ldap", + "name": "grails-spring-security-ldap", "repo": "plugins", "owner": "grails", "desc": "Grails spring-security-ldap plugin", @@ -5774,22 +5767,21 @@ "licenses": [ "Apache-2.0" ], - "issueTrackerUrl": "https://github.com/grails-plugins/grails-spring-security-ldap/issues", + "issueTrackerUrl": "https://github.com/apache/grails-core/issues", "latestVersion": "4.0.0.M1", "updated": "2020-03-24T10:30:31.547Z", "systemIds": [ - "org.grails.plugins:spring-security-ldap" + "org.apache.grails:grails-spring-security-ldap" ], - "vcsUrl": "https://github.com/grails-plugins/grails-spring-security-ldap" + "vcsUrl": "https://github.com/apache/grails-core" }, - "documentationUrl": "https://grails-plugins.github.io/grails-spring-security-ldap/", - "mavenMetadataUrl": null, + "documentationUrl": null, + "mavenMetadataUrl": "https://repo1.maven.org/maven2/org/apache/grails/grails-spring-security-ldap/maven-metadata.xml", "readme": "

\"Build

\n

Grails Spring Security LDAP Plugin

\n

See documentation for further information.

\n

What is LDAP?

\n

Introduction to Lightweight Directory Services

\n

Tools and Resources

\n\n

Repository Branch Structure

\n

Branches:

\n
    \n
  • master Grails 4 compatible versions.
  • \n
  • 3.x Grails 3 compatible versions.
  • \n
\n" }, { - "deprecated": "This repository was archived by the owner on Mar 10, 2025. It is now read-only.", "bintrayPackage": { - "name": "spring-security-oauth2", + "name": "grails-spring-security-oauth2", "repo": "plugins", "owner": "grails", "desc": "This plugin provides the capability to authenticate via OAuth 2. Depends on Grails spring-security-core.", @@ -5801,16 +5793,16 @@ "licenses": [ "Apache-2.0" ], - "issueTrackerUrl": "https://github.com/grails/grails-spring-security-oauth2/issues", + "issueTrackerUrl": "https://github.com/apache/grails-core/issues", "latestVersion": "3.0.1", "updated": "2024-01-23T14:30:36.000Z", "systemIds": [ - "org.grails.plugins:spring-security-oauth2" + "org.apache.grails:grails-spring-security-oauth2" ], - "vcsUrl": "https://github.com/grails/grails-spring-security-oauth2" + "vcsUrl": "https://github.com/apache/grails-core" }, "documentationUrl": "https://grails.github.io/grails-spring-security-oauth2/", - "mavenMetadataUrl": "https://repo1.maven.org/maven2/org/grails/plugins/spring-security-oauth2/maven-metadata.xml", + "mavenMetadataUrl": "https://repo1.maven.org/maven2/org/apache/grails/grails-spring-security-oauth2/maven-metadata.xml", "readme": null }, { @@ -6050,9 +6042,8 @@ "readme": "

Spring Security OAuth2 VK Plugin

\n

\"Download\"

\n

Add a VK OAuth2 provider to the Spring Security OAuth2 Plugin.

\n

Installation

\n

Add the following dependencies in build.gradle

\n
repositories {\n  ...\n  maven { url "http://dl.bintray.com/purpleraven/plugins" }\n  ...\n}\n\ndependencies {\n...\n    compile 'org.grails.plugins:spring-security-oauth2:1.1+'\n    compile 'org.grails.plugins:spring-security-oauth2-vk:1.0'\n...\n}\n
\n

Usage

\n

Add this to your application.yml

\n
grails:\n    plugin:\n        springsecurity:\n            oauth2:\n                providers:\n                    vk:\n                        api_key: 'vk-api-key'               #needed\n                        api_secret: 'vk-api-secret'         #needed\n                        successUri: "/oauth2/vk/success"    #optional\n                        failureUri: "/oauth2/vk/failure"    #optional\n                        callback: "/oauth2/vk/callback"     #optional\n
\n

You can replace the URIs with your own controller implementation.

\n

In your view you can use the taglib exposed from this plugin and from OAuth plugin to create links and to know if the user is authenticated with a given provider:

\n
<oauth2:connect provider="vk" id="vk-connect-link">VK</oauth2:connect>\n\nLogged with VK?\n<oauth2:ifLoggedInWith provider="vk">yes</oauth2:ifLoggedInWith>\n<oauth2:ifNotLoggedInWith provider="vk">no</oauth2:ifNotLoggedInWith>\n
\n

License

\n

Apache 2

\n" }, { - "deprecated": "This repository was archived by the owner on Feb 28, 2025. It is now read-only.", "bintrayPackage": { - "name": "spring-security-rest", + "name": "grails-spring-security-rest", "repo": "plugins", "owner": "grails", "desc": "Grails spring-security-rest plugin", @@ -6064,22 +6055,21 @@ "licenses": [ "Apache-2.0" ], - "issueTrackerUrl": "https://github.com/grails-plugins/grails-spring-security-rest/issues", + "issueTrackerUrl": "https://github.com/apache/grails-core/issues", "latestVersion": "3.0.1", "updated": "2020-04-06T05:51:10.703Z", "systemIds": [ - "org.grails.plugins:spring-security-rest" + "org.apache.grails:grails-spring-security-rest" ], - "vcsUrl": "https://github.com/alvarosanchez/grails-spring-security-rest" + "vcsUrl": "https://github.com/apache/grails-core" }, "documentationUrl": "https://grails-plugins.github.io/grails-spring-security-rest/latest/docs/", - "mavenMetadataUrl": null, + "mavenMetadataUrl": "https://repo1.maven.org/maven2/org/apache/grails/grails-spring-security-rest/maven-metadata.xml", "readme": "

Spring Security REST for Grails

\n

\"Build\n\"Latest\n\"Known

\n

Grails plugin to implement a stateless, token-based, RESTful authentication\nusing Spring Security. Sponsored and supported by Object Computing Inc.

\n

Documentation:

\n\n

Companies using this plugin

\n\n

Are you using this plugin and want to be listed here? Include your company yourself.

\n

Support

\n\n

NOTE: if you have questions or issues, enable debug logging,\nand include the output in your request.

\n

Contributors

\n\n

License

\n

This software is licensed under the terms of the Apache License, Version 2.0

\n" }, { - "deprecated": "This repository was archived by the owner on Feb 28, 2025. It is now read-only.", "bintrayPackage": { - "name": "spring-security-rest-gorm", + "name": "grails-spring-security-rest-datamapping", "repo": "plugins", "owner": "grails", "desc": "Spring Security REST plugin for Grails - GORM module", @@ -6091,16 +6081,16 @@ "licenses": [ "Apache-2.0" ], - "issueTrackerUrl": "https://github.com/grails-plugins/grails-spring-security-rest/issues", + "issueTrackerUrl": "https://github.com/apache/grails-core/issues", "latestVersion": "3.0.1", "updated": "2020-04-06T05:51:13.612Z", "systemIds": [ - "org.grails.plugins:spring-security-rest-gorm" + "org.apache.grails:grails-spring-security-rest-datamapping" ], - "vcsUrl": "https://github.com/grails-plugins/grails-spring-security-rest" + "vcsUrl": "https://github.com/apache/grails-core" }, "documentationUrl": "https://grails-plugins.github.io/grails-spring-security-rest/latest/docs/", - "mavenMetadataUrl": null, + "mavenMetadataUrl": "https://repo1.maven.org/maven2/org/apache/grails/grails-spring-security-rest-datamapping/maven-metadata.xml", "readme": "

Spring Security REST for Grails

\n

\"Build\n\"Latest\n\"Known

\n

Grails plugin to implement a stateless, token-based, RESTful authentication\nusing Spring Security. Sponsored and supported by Object Computing Inc.

\n

Documentation:

\n\n

Companies using this plugin

\n\n

Are you using this plugin and want to be listed here? Include your company yourself.

\n

Support

\n\n

NOTE: if you have questions or issues, enable debug logging,\nand include the output in your request.

\n

Contributors

\n\n

License

\n

This software is licensed under the terms of the Apache License, Version 2.0

\n" }, { @@ -6157,9 +6147,8 @@ "readme": "

Spring Security REST for Grails

\n

\"Build\n\"Latest\n\"Known

\n

Grails plugin to implement a stateless, token-based, RESTful authentication\nusing Spring Security. Sponsored and supported by Object Computing Inc.

\n

Documentation:

\n\n

Companies using this plugin

\n\n

Are you using this plugin and want to be listed here? Include your company yourself.

\n

Support

\n\n

NOTE: if you have questions or issues, enable debug logging,\nand include the output in your request.

\n

Contributors

\n\n

License

\n

This software is licensed under the terms of the Apache License, Version 2.0

\n" }, { - "deprecated": "This repository was archived by the owner on Feb 28, 2025. It is now read-only.", "bintrayPackage": { - "name": "spring-security-rest-redis", + "name": "grails-spring-security-rest-redis", "repo": "plugins", "owner": "grails", "desc": "Spring Security REST plugin for Grails - Redis module", @@ -6172,16 +6161,16 @@ "licenses": [ "Apache-2.0" ], - "issueTrackerUrl": "https://github.com/grails-plugins/grails-spring-security-rest/issues", + "issueTrackerUrl": "https://github.com/apache/grails-core/issues", "latestVersion": "3.0.1", "updated": "2020-04-06T05:51:18.295Z", "systemIds": [ - "org.grails.plugins:spring-security-rest-redis" + "org.apache.grails:grails-spring-security-rest-redis" ], - "vcsUrl": "https://github.com/alvarosanchez/grails-spring-security-rest" + "vcsUrl": "https://github.com/apache/grails-core" }, "documentationUrl": "https://grails-plugins.github.io/grails-spring-security-rest/latest/docs/", - "mavenMetadataUrl": null, + "mavenMetadataUrl": "https://repo1.maven.org/maven2/org/apache/grails/grails-spring-security-rest-redis/maven-metadata.xml", "readme": "

Spring Security REST for Grails

\n

\"Build\n\"Latest\n\"Known

\n

Grails plugin to implement a stateless, token-based, RESTful authentication\nusing Spring Security. Sponsored and supported by Object Computing Inc.

\n

Documentation:

\n\n

Companies using this plugin

\n\n

Are you using this plugin and want to be listed here? Include your company yourself.

\n

Support

\n\n

NOTE: if you have questions or issues, enable debug logging,\nand include the output in your request.

\n

Contributors

\n\n

License

\n

This software is licensed under the terms of the Apache License, Version 2.0

\n" }, { @@ -6264,9 +6253,8 @@ "readme": "

Grails Spring Security Shiro Plugin \"Build

\n

See documentation for further information.

\n" }, { - "deprecated": "This repository was archived by the owner on Feb 28, 2025. It is now read-only.", "bintrayPackage": { - "name": "spring-security-ui", + "name": "grails-spring-security-ui", "repo": "plugins", "owner": "grails", "desc": "Grails Spring Security UI", @@ -6277,16 +6265,16 @@ "licenses": [ "Apache-2.0" ], - "issueTrackerUrl": "https://github.com/grails/grails-spring-security-ui/issues", + "issueTrackerUrl": "https://github.com/apache/grails-core/issues", "latestVersion": "4.0.0-RC1", "updated": "2022-09-07T00:00:00.000Z", "systemIds": [ - "org.grails.plugins:spring-security-ui" + "org.apache.grails:grails-spring-security-ui" ], - "vcsUrl": "https://github.com/grails-plugins/grails-spring-security-ui" + "vcsUrl": "https://github.com/apache/grails-core" }, "documentationUrl": "https://grails.github.io/grails-spring-security-ui/", - "mavenMetadataUrl": "https://repo1.maven.org/maven2/org/grails/plugins/spring-security-ui/maven-metadata.xml", + "mavenMetadataUrl": "https://repo1.maven.org/maven2/org/apache/grails/grails-spring-security-ui/maven-metadata.xml", "readme": "

Grails Spring Security UI

\n

Documentation

\n" }, { From 89f4a671e78a93951574a51bfc31273e2628d9ac Mon Sep 17 00:00:00 2001 From: Thomas Rasmussen Date: Wed, 8 Oct 2025 13:44:10 +0200 Subject: [PATCH 32/35] Updated locations for grails.spring-security.* and grails-console --- grails-plugins.json | 31 +++++++++++++++---------------- 1 file changed, 15 insertions(+), 16 deletions(-) diff --git a/grails-plugins.json b/grails-plugins.json index f15e9a0..6cba34d 100644 --- a/grails-plugins.json +++ b/grails-plugins.json @@ -1136,7 +1136,6 @@ "readme": null }, { - "deprecated": "This repository was archived by the owner on Sep 10, 2024. It is now read-only.", "bintrayPackage": { "name": "console", "repo": "grails-plugins", @@ -1150,17 +1149,17 @@ "licenses": [ "Apache-2.0" ], - "issueTrackerUrl": "https://github.com/sheehan/grails-console/issues", + "issueTrackerUrl": "https://github.com/apache/grails-core/issues", "latestVersion": "2.1.1", "updated": "2018-01-23T03:19:17.309Z", "systemIds": [ - "org.grails.plugins:grails-console" + "org.grails:grails-console" ], - "vcsUrl": "https://github.com/sheehan/grails-console" + "vcsUrl": "https://github.com/apache/grails-core" }, "documentationUrl": null, - "mavenMetadataUrl": null, - "readme": "

Summary

\n

A web-based Groovy console for interactive runtime application management and debugging

\n

\"Screenshot\"

\n

Installation

\n

The 1.X version is for Grails 2.

\n

The 2.0.X version is for Grails 3.0 - 3.2.

\n

The 2.1.X version is for Grails 3.3+.

\n

Grails 2

\n

Add a dependency in BuildConfig.groovy:

\n
grails.project.dependency.resolution = {\n  // ...\n  plugins {\n    runtime ':console:1.5.12'\n    // ...\n  }\n}\n
\n

Grails 3+

\n

Note: If using Grails 3.0.4, you need to update the asset-pipeline dependency in build.gradle to 3.0.6 or greater. 3.0.5 is used by default and has a bug that prevents the console page from rendering.

\n

Note: If using Grails 3.0.12, you will need to add this to your configuration: grails.resources.pattern = '/**'. There is a bug related to resource paths.

\n

Add a dependency in build.gradle

\n
runtime 'org.grails.plugins:grails-console:2.1.1'\n
\n

Usage

\n

Use a browser to navigate to the /console page of your running app, e.g. http://localhost:8080/{app-name}/console

\n

Type any Groovy commands in the console text area, then click on the execute button. The console plugin relies on Groovy Shell. Lookup Groovy Shell documentation for more information.\nThe Groovy Shell uses the Grails classloader, so you can access any class or artifact (e.g. domain classes, services, etc.) just like in your application code.

\n

Saving/loading scripts

\n

Click on the Save button to save the current script.

\n

Use the Storage pane to navigate existing files. Click on a file to load it into the editor.

\n

There are currently two storage options available:

\n

Local Storage

\n

Local Storage uses HTML5 Web Storage. The files are serialized and stored in the browser as a map under the key gconsole.files.

\n

Remote Storage

\n

Remote Storage uses the filesystem of the server on which the application is running.

\n

Writing to the browser console

\n

Calls made to the implicit console variable will be executed on the browser's console.\nThe arguments are serialized as JSON and the calls are queued to run after the script completes.

\n

Example:\n\"Screenshot\"

\n

Implicit variables

\n

The following implicit variables are available:

\n\n

See Script Examples for example usage.

\n

Keyboard Shortcuts

\n

| Key | Command |\n|---|---|\n| Ctrl-Enter / \ufffd\ufffd\ufffd\ufffd\ufffd\ufffd-Enter | Execute |\n| Ctrl-S / \ufffd\ufffd\ufffd\ufffd\ufffd\ufffd-S | Save |\n| Esc | Clear output |

\n

Configuration

\n

The following configuration options are available:

\n

| Property | Description |\n|---|---|\n| grails.plugin.console.enabled | Whether to enable the plugin. Default is true for the development environment, false otherwise. |\n| grails.plugin.console.baseUrl | Base URL for the console controller. Can be a String or a List of Strings if having multiple URLs is desired. Default uses createLink(). |\n| grails.plugin.console.fileStore.remote.enabled | Whether to include the remote file store functionality. Default is true. |\n| grails.plugin.console.fileStore.remote.defaultPath | Default path when browsing remote files. Default is /. |\n| grails.plugin.console.layout | Used to override the plugin's GSP layout. |\n| grails.plugin.console.newFileText | Text to display as a template for new files. Can be used to add frequently used imports, environment specific warnings, etc... Defaults to empty. |\n| grails.plugin.console.tabSize | The width of a tab character. Defaults to 4. |\n| grails.plugin.console.indentWithTabs | Whether indents should use tabs rather than spaces. Default is false. |\n| grails.plugin.console.indentUnit | How many spaces a block should be indented. Default is 4. |\n| grails.plugin.console.csrfProtection.enabled | Whether to enable CSRF protection. Default is true. |

\n

Security

\n

By default (as of v1.5.0) the console plugin is only enabled in the development environment. You can enable or disable it for any environment with\nthe grails.plugin.console.enabled config option in Config.groovy / application.groovy (Grails 3). If the plugin is enabled in non-development environments, be sure to guard access using a security plugin like Spring Security Core or Shiro. For Grails 2.x, the paths /console/** and /plugins/console*/** should be secured. For Grails 3.x, the paths /console/** and /static/console/** should be secured.

\n

Spring Security Core example:

\n
grails.plugin.springsecurity.controllerAnnotations.staticRules = [\n    [pattern:"/console/**",          access:['ROLE_ADMIN']],\n    [pattern:"/plugins/console*/**", access:['ROLE_ADMIN']],  // Grails 2.x\n    [pattern:"/static/console/**",   access:['ROLE_ADMIN']], // Grails 3.x\n]\n
\n

Another example restricting access to localhost IPs:

\n
grails.plugin.springsecurity.controllerAnnotations.staticRules = [\n    [pattern:"/console/**",          access:["hasRole('ROLE_ADMIN') && (hasIpAddress('127.0.0.1') || hasIpAddress('::1'))"]],\n    [pattern:"/plugins/console*/**", access:["hasRole('ROLE_ADMIN') && (hasIpAddress('127.0.0.1') || hasIpAddress('::1'))"]], // Grails 2.x\n    [pattern:"/static/console/**",   access:["hasRole('ROLE_ADMIN') && (hasIpAddress('127.0.0.1') || hasIpAddress('::1'))"]], // Grails 3.x\n]\n
\n

Authors

\n\n

Development

\n

Please see CONTRIBUTING.md

\n" + "mavenMetadataUrl": "https://repo1.maven.org/maven2/org/grails/grails-console/maven-metadata.xml", + "readme": "

Summary

\n

A web-based Groovy console for interactive runtime application management and debugging

" }, { "bintrayPackage": { @@ -5793,13 +5792,13 @@ "licenses": [ "Apache-2.0" ], - "issueTrackerUrl": "https://github.com/apache/grails-core/issues", + "issueTrackerUrl": "https://github.com/apache/grails-spring-security/issues", "latestVersion": "3.0.1", "updated": "2024-01-23T14:30:36.000Z", "systemIds": [ "org.apache.grails:grails-spring-security-oauth2" ], - "vcsUrl": "https://github.com/apache/grails-core" + "vcsUrl": "https://github.com/apache/grails-spring-security" }, "documentationUrl": "https://grails.github.io/grails-spring-security-oauth2/", "mavenMetadataUrl": "https://repo1.maven.org/maven2/org/apache/grails/grails-spring-security-oauth2/maven-metadata.xml", @@ -6055,13 +6054,13 @@ "licenses": [ "Apache-2.0" ], - "issueTrackerUrl": "https://github.com/apache/grails-core/issues", + "issueTrackerUrl": "https://github.com/apache/grails-spring-security/issues", "latestVersion": "3.0.1", "updated": "2020-04-06T05:51:10.703Z", "systemIds": [ "org.apache.grails:grails-spring-security-rest" ], - "vcsUrl": "https://github.com/apache/grails-core" + "vcsUrl": "https://github.com/apache/grails-spring-security" }, "documentationUrl": "https://grails-plugins.github.io/grails-spring-security-rest/latest/docs/", "mavenMetadataUrl": "https://repo1.maven.org/maven2/org/apache/grails/grails-spring-security-rest/maven-metadata.xml", @@ -6081,13 +6080,13 @@ "licenses": [ "Apache-2.0" ], - "issueTrackerUrl": "https://github.com/apache/grails-core/issues", + "issueTrackerUrl": "https://github.com/apache/grails-spring-security/issues", "latestVersion": "3.0.1", "updated": "2020-04-06T05:51:13.612Z", "systemIds": [ "org.apache.grails:grails-spring-security-rest-datamapping" ], - "vcsUrl": "https://github.com/apache/grails-core" + "vcsUrl": "https://github.com/apache/grails-spring-security" }, "documentationUrl": "https://grails-plugins.github.io/grails-spring-security-rest/latest/docs/", "mavenMetadataUrl": "https://repo1.maven.org/maven2/org/apache/grails/grails-spring-security-rest-datamapping/maven-metadata.xml", @@ -6161,13 +6160,13 @@ "licenses": [ "Apache-2.0" ], - "issueTrackerUrl": "https://github.com/apache/grails-core/issues", + "issueTrackerUrl": "https://github.com/apache/grails-spring-security/issues", "latestVersion": "3.0.1", "updated": "2020-04-06T05:51:18.295Z", "systemIds": [ "org.apache.grails:grails-spring-security-rest-redis" ], - "vcsUrl": "https://github.com/apache/grails-core" + "vcsUrl": "https://github.com/apache/grails-spring-security" }, "documentationUrl": "https://grails-plugins.github.io/grails-spring-security-rest/latest/docs/", "mavenMetadataUrl": "https://repo1.maven.org/maven2/org/apache/grails/grails-spring-security-rest-redis/maven-metadata.xml", @@ -6265,13 +6264,13 @@ "licenses": [ "Apache-2.0" ], - "issueTrackerUrl": "https://github.com/apache/grails-core/issues", + "issueTrackerUrl": "https://github.com/apache/grails-spring-security/issues", "latestVersion": "4.0.0-RC1", "updated": "2022-09-07T00:00:00.000Z", "systemIds": [ "org.apache.grails:grails-spring-security-ui" ], - "vcsUrl": "https://github.com/apache/grails-core" + "vcsUrl": "https://github.com/apache/grails-spring-security" }, "documentationUrl": "https://grails.github.io/grails-spring-security-ui/", "mavenMetadataUrl": "https://repo1.maven.org/maven2/org/apache/grails/grails-spring-security-ui/maven-metadata.xml", From ed8ca0e2cfc3231b2b51eca42063cbaf0ddbc367 Mon Sep 17 00:00:00 2001 From: Thomas Rasmussen Date: Wed, 8 Oct 2025 14:13:19 +0200 Subject: [PATCH 33/35] Updated grails-x-frame-options, grails-spring-security-* --- grails-plugins.json | 30 ++++++++++++++---------------- 1 file changed, 14 insertions(+), 16 deletions(-) diff --git a/grails-plugins.json b/grails-plugins.json index 6cba34d..0325412 100644 --- a/grails-plugins.json +++ b/grails-plugins.json @@ -2878,7 +2878,6 @@ "readme": "

Grails Views

\n

Additional View Technologies for Grails 3.0 and above.

\n

Initial implementation includes JSON views powered by Groovy's JsonBuilder, however this project provides the basis for implementation other view types.

\n

View the latest documentation for details.

\n

\"Java

\n" }, { - "deprecated": "This repository was archived by the owner on Apr 14, 2025. It is now read-only.", "bintrayPackage": { "name": "x-frame-options-plugin", "repo": "plugins", @@ -2890,14 +2889,14 @@ "licenses": [ "Apache-2.0" ], - "issueTrackerUrl": "https://github.com/mrhaki/grails-x-frame-options-plugin/issues", + "issueTrackerUrl": "https://github.com/grails-plugins/grails-x-frame-options-plugin/issues", "latestVersion": "1.1.0", "updated": "2017-03-09T10:57:09.659Z", "systemIds": [ "org.grails.plugins:x-frame-options", "org.grails.plugins:grails-x-frame-options-plugin" ], - "vcsUrl": "https://github.com/mrhaki/grails-x-frame-options-plugin" + "vcsUrl": "https://github.com/grails-plugins/grails-x-frame-options-plugin" }, "documentationUrl": null, "mavenMetadataUrl": null, @@ -3912,7 +3911,6 @@ "readme": "

Readme for LightningJ Grails Plugin

\n

LightningJ Grails plugin is a project to simplify the usage of the LightningJ\nlibrary in Grails 3.3.x applications and above.

\n

For documentation see docs/index.adoc of the project web-site at\nhttp://grails.lightningj.org

\n

Build status Master branch: \"Build

\n" }, { - "deprecated": "This repository was archived by the owner on Dec 5, 2024. It is now read-only.", "bintrayPackage": { "name": "mail", "repo": "plugins", @@ -3924,17 +3922,17 @@ "licenses": [ "Apache-2.0" ], - "issueTrackerUrl": "https://github.com/grails3-plugins/mail/issues", + "issueTrackerUrl": "https://github.com/grails-plugins/grails-mail/issues", "latestVersion": "3.0.0", "updated": "2019-10-22T14:59:33.694Z", "systemIds": [ "org.grails.plugins:mail" ], - "vcsUrl": "https://github.com/grails3-plugins/mail" + "vcsUrl": "https://github.com/grails-plugins/grails-mail" }, - "documentationUrl": "https://grails3-plugins.github.io/mail/", + "documentationUrl": "https://github.com/grails-plugins/grails-mail", "mavenMetadataUrl": null, - "readme": "

The Grails mail plugin provides a convenient DSL for sending email. It supports plain text, html, attachments, inline resources and i18n among other features.\n\"Build

\n

Mail can be sent using the @mailService@ via the @sendMail@ method. Here is an example\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd

\n
mailService.sendMail {\n   to "fred@gmail.com","ginger@gmail.com"\n   from "john@gmail.com"\n   cc "marge@gmail.com", "ed@gmail.com"\n   bcc "joe@gmail.com"\n   subject "Hello John"\n   text 'this is some text'\n}\n
\n

Please see the User Guide for more information.

\n

The plugin is released under the Apache License 2.0 and is produced under the Grails Plugin Collective.

\n

Versions

\n
    \n
  • 3.x - Compatible with Grails 4
  • \n
  • 2.x - Compatible with Grails 3
  • \n
  • 1.x - Compatible with Grails 2
  • \n
\n

Issues

\n

Issues can be raised via GitHub Issues.

\n

Contributing

\n

Pull requests are the preferred method for submitting contributions. Please open an issue via that issue tracker link above and create an issue describing what your contribution addresses.

\n

If you are contributing documentation, raising an issue is not necessary.

\n" + "readme": "

The Grails mail plugin provides a convenient DSL for sending email. It supports plain text, html, attachments, inline resources and i18n among other features.\n

Mail can be sent using the @mailService@ via the @sendMail@ method. Here is an example\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd

\n
mailService.sendMail {\n   to "fred@gmail.com","ginger@gmail.com"\n   from "john@gmail.com"\n   cc "marge@gmail.com", "ed@gmail.com"\n   bcc "joe@gmail.com"\n   subject "Hello John"\n   text 'this is some text'\n}\n
\n

Please see the User Guide for more information.

\n

The plugin is released under the Apache License 2.0 and is produced under the Grails Plugin Collective.

\n

Versions

\n
    \n
  • 3.x - Compatible with Grails 4
  • \n
  • 2.x - Compatible with Grails 3
  • \n
  • 1.x - Compatible with Grails 2
  • \n
\n

Issues

\n

Issues can be raised via GitHub Issues.

\n

Contributing

\n

Pull requests are the preferred method for submitting contributions. Please open an issue via that issue tracker link above and create an issue describing what your contribution addresses.

\n

If you are contributing documentation, raising an issue is not necessary.

\n" }, { "bintrayPackage": { @@ -5587,17 +5585,17 @@ "licenses": [ "Apache-2.0" ], - "issueTrackerUrl": "https://github.com/apache/grails-core/issues", + "issueTrackerUrl": "https://github.com/apache/grails-spring-security/issues", "latestVersion": "4.0.0.M2", "updated": "2019-04-18T15:29:17.202Z", "systemIds": [ "org.apache.grails:grails-spring-security-acl" ], - "vcsUrl": "https://github.com/apache/grails-core" + "vcsUrl": "https://github.com/apache/grails-spring-security" }, "documentationUrl": "https://grails-plugins.github.io/grails-spring-security-acl/", "mavenMetadataUrl": null, - "readme": "

[\"Build

\n

Grails Spring Security ACL Plugin

\n

See documentation for further information.

\n

Developing this plugin

\n

To run the tests exeucte:

\n

./gradlew -Dgeb.env=chromeHeadless check

\n" + "readme": "

Grails Spring Security ACL Plugin

\n

See documentation for further information.

\n

Developing this plugin

\n

To run the tests exeucte:

\n

./gradlew -Dgeb.env=chromeHeadless check

\n" }, { "bintrayPackage": { @@ -5637,13 +5635,13 @@ "licenses": [ "Apache-2.0" ], - "issueTrackerUrl": "https://github.com/apache/grails-core/issues", + "issueTrackerUrl": "https://github.com/apache/grails-spring-security/issues", "latestVersion": "4.0.0", "updated": "2024-01-26T07:29:57.000Z", "systemIds": [ "org.apache.grails:grails-spring-security-cas" ], - "vcsUrl": "https://github.com/apache/grails-core/issues" + "vcsUrl": "https://github.com/apache/grails-spring-security" }, "documentationUrl": "https://grails.github.io/grails-spring-security-cas/", "mavenMetadataUrl": "https://repo1.maven.org/maven2/org/apache/grails/grails-spring-security-cas/maven-metadata.xml", @@ -5766,17 +5764,17 @@ "licenses": [ "Apache-2.0" ], - "issueTrackerUrl": "https://github.com/apache/grails-core/issues", + "issueTrackerUrl": "https://github.com/apache/grails-spring-security/issues", "latestVersion": "4.0.0.M1", "updated": "2020-03-24T10:30:31.547Z", "systemIds": [ "org.apache.grails:grails-spring-security-ldap" ], - "vcsUrl": "https://github.com/apache/grails-core" + "vcsUrl": "https://github.com/apache/grails-spring-security" }, "documentationUrl": null, "mavenMetadataUrl": "https://repo1.maven.org/maven2/org/apache/grails/grails-spring-security-ldap/maven-metadata.xml", - "readme": "

\"Build

\n

Grails Spring Security LDAP Plugin

\n

See documentation for further information.

\n

What is LDAP?

\n

Introduction to Lightweight Directory Services

\n

Tools and Resources

\n\n

Repository Branch Structure

\n

Branches:

\n
    \n
  • master Grails 4 compatible versions.
  • \n
  • 3.x Grails 3 compatible versions.
  • \n
\n" + "readme": "

Grails Spring Security LDAP Plugin

\n

See documentation for further information.

\n

What is LDAP?

\n

Introduction to Lightweight Directory Services

\n

Tools and Resources

\n\n

Repository Branch Structure

\n

Branches:

\n
    \n
  • master Grails 4 compatible versions.
  • \n
  • 3.x Grails 3 compatible versions.
  • \n
\n" }, { "bintrayPackage": { From ed41a5214e18dfc8c3c9c95f36845330b4d7fe4e Mon Sep 17 00:00:00 2001 From: Thomas Rasmussen Date: Wed, 8 Oct 2025 14:23:19 +0200 Subject: [PATCH 34/35] Gorm Mongodb updated after move to grails-core --- grails-plugins.json | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/grails-plugins.json b/grails-plugins.json index 0325412..33424fd 100644 --- a/grails-plugins.json +++ b/grails-plugins.json @@ -5186,17 +5186,17 @@ "licenses": [ "Apache-2.0" ], - "issueTrackerUrl": "https://github.com/grails/gorm-mongodb/issues", + "issueTrackerUrl": "https://github.com/apache/grails-core/issues", "latestVersion": "6.1.7", "updated": "2020-07-06T19:52:37.703Z", "systemIds": [ "org.grails.plugins:rx-mongodb" ], - "vcsUrl": "https://github.com/grails/gorm-mongodb" + "vcsUrl": "https://github.com/apache/grails-core" }, "documentationUrl": "https://gorm.grails.org/latest/rx/manual/", "mavenMetadataUrl": null, - "readme": "

\"Java\n\"Release\"

\n

GORM for MongoDB

\n

This project implements GORM for the MongoDB Document Database.

\n

NOTE: This source code here is for version 6.x and above. For prevoius versions' source see the relevant branch on the Grails Data Mapping project.

\n

For more information see the following links:

\n\n

For the current development version see the following links:

\n\n" + "readme": "

GORM for MongoDB

\n

This project implements GORM for the MongoDB Document Database.

\n
  • API
  • \n\n

    For the current development version see the following links:

    \n\n" }, { "bintrayPackage": { From 63743fbb075e758ccd85785aa5cfa1ad7ba480e8 Mon Sep 17 00:00:00 2001 From: Thomas Rasmussen Date: Wed, 8 Oct 2025 14:37:44 +0200 Subject: [PATCH 35/35] Mongodb metadata cleanup --- grails-plugins.json | 1 - 1 file changed, 1 deletion(-) diff --git a/grails-plugins.json b/grails-plugins.json index 33424fd..357a40f 100644 --- a/grails-plugins.json +++ b/grails-plugins.json @@ -5172,7 +5172,6 @@ }, { "comment": "Hard to tell versions to use here. According to https://gorm.grails.org/latest/rx/manual/ it is 7.3.2 but the latest release of this plugin is 6.1.7", - "deprecated": "This repository was archived by the owner on Mar 13, 2025. It is now read-only.", "bintrayPackage": { "name": "rx-mongodb", "repo": "plugins",