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: diff --git a/grails-plugins.json b/grails-plugins.json index 5157329..357a40f 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", @@ -197,6 +198,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 +223,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", @@ -379,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" + "org.apache.grails:grails-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": "" }, { @@ -467,6 +470,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 +504,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 +530,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 +556,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 +582,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 +608,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 +634,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 +660,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 +686,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", @@ -874,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", @@ -971,6 +984,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", @@ -1135,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": { @@ -1184,16 +1198,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" }, { @@ -1387,16 +1402,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 }, { @@ -1789,16 +1805,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" + "org.apache.grails:grails-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": "" }, { @@ -1930,6 +1946,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", @@ -1965,17 +1982,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", @@ -2093,19 +2110,20 @@ "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 }, { + "deprecated": "This repository was archived by the owner on Mar 10, 2025. It is now read-only.", "bintrayPackage": { "name": "gorm-graphql", "repo": "plugins", @@ -2381,6 +2399,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", @@ -2870,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, @@ -2994,16 +3013,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
" }, { @@ -3183,6 +3202,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", @@ -3224,16 +3244,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" }, { @@ -3286,6 +3306,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

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

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", @@ -3310,6 +3331,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

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" }, { + "deprecated": "This repository was archived by the owner on Jul 3, 2023. It is now read-only.", "bintrayPackage": { "name": "http-requests-grails", "repo": "maven", @@ -3460,6 +3482,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", @@ -3484,6 +3507,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", @@ -3509,6 +3533,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", @@ -3533,6 +3558,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", @@ -3557,6 +3583,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", @@ -3634,6 +3661,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", @@ -3808,6 +3836,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

Other examples:

\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", @@ -3893,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

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

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": { @@ -4017,16 +4046,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" }, { @@ -4080,6 +4109,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", @@ -4106,6 +4136,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", @@ -4808,6 +4839,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", @@ -4909,6 +4941,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

Release Notes Grails 2.x

\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", @@ -5110,6 +5143,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", @@ -5151,17 +5185,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": { @@ -5276,16 +5310,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 }, { @@ -5390,6 +5424,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", @@ -5549,17 +5584,17 @@ "licenses": [ "Apache-2.0" ], - "issueTrackerUrl": "https://github.com/grails-plugins/grails-spring-security-acl/issues", + "issueTrackerUrl": "https://github.com/apache/grails-spring-security/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-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": { @@ -5599,16 +5634,16 @@ "licenses": [ "Apache-2.0" ], - "issueTrackerUrl": "https://github.com/grails/grails-spring-security-cas/issues", + "issueTrackerUrl": "https://github.com/apache/grails-spring-security/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-spring-security" }, "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 }, { @@ -5716,7 +5751,7 @@ }, { "bintrayPackage": { - "name": "spring-security-ldap", + "name": "grails-spring-security-ldap", "repo": "plugins", "owner": "grails", "desc": "Grails spring-security-ldap plugin", @@ -5728,21 +5763,21 @@ "licenses": [ "Apache-2.0" ], - "issueTrackerUrl": "https://github.com/grails-plugins/grails-spring-security-ldap/issues", + "issueTrackerUrl": "https://github.com/apache/grails-spring-security/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-spring-security" }, - "documentationUrl": "https://grails-plugins.github.io/grails-spring-security-ldap/", - "mavenMetadataUrl": null, - "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" + "documentationUrl": null, + "mavenMetadataUrl": "https://repo1.maven.org/maven2/org/apache/grails/grails-spring-security-ldap/maven-metadata.xml", + "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" }, { "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.", @@ -5754,16 +5789,16 @@ "licenses": [ "Apache-2.0" ], - "issueTrackerUrl": "https://github.com/grails/grails-spring-security-oauth2/issues", + "issueTrackerUrl": "https://github.com/apache/grails-spring-security/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-spring-security" }, "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 }, { @@ -6004,7 +6039,7 @@ }, { "bintrayPackage": { - "name": "spring-security-rest", + "name": "grails-spring-security-rest", "repo": "plugins", "owner": "grails", "desc": "Grails spring-security-rest plugin", @@ -6016,21 +6051,21 @@ "licenses": [ "Apache-2.0" ], - "issueTrackerUrl": "https://github.com/grails-plugins/grails-spring-security-rest/issues", + "issueTrackerUrl": "https://github.com/apache/grails-spring-security/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-spring-security" }, "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" }, { "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", @@ -6042,16 +6077,16 @@ "licenses": [ "Apache-2.0" ], - "issueTrackerUrl": "https://github.com/grails-plugins/grails-spring-security-rest/issues", + "issueTrackerUrl": "https://github.com/apache/grails-spring-security/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-spring-security" }, "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" }, { @@ -6109,7 +6144,7 @@ }, { "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", @@ -6122,16 +6157,16 @@ "licenses": [ "Apache-2.0" ], - "issueTrackerUrl": "https://github.com/grails-plugins/grails-spring-security-rest/issues", + "issueTrackerUrl": "https://github.com/apache/grails-spring-security/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-spring-security" }, "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" }, { @@ -6215,7 +6250,7 @@ }, { "bintrayPackage": { - "name": "spring-security-ui", + "name": "grails-spring-security-ui", "repo": "plugins", "owner": "grails", "desc": "Grails Spring Security UI", @@ -6226,16 +6261,16 @@ "licenses": [ "Apache-2.0" ], - "issueTrackerUrl": "https://github.com/grails/grails-spring-security-ui/issues", + "issueTrackerUrl": "https://github.com/apache/grails-spring-security/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-spring-security" }, "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" }, { @@ -6585,6 +6620,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",