Magnolia 5.6 reached end of life on June 25, 2020. This branch is no longer supported, see End-of-life policy.
...
You can write your own custom commands and execute them on-demand or scheduled.
Commands consist of a command definition and Java business logic. Since the business logic is written in Java, you can perform basically any task that Java allows.
...
Advanced Tables - Table Plus | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
...
Advanced Tables - Table Plus | ||||||||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| ||||||||||||||||||||||||||
|
The advantage of using a catalog is that you can have identically named commands. You might want two activate
commands – one for pages and another for assets. To call a command that resides in a catalog, use the catalog name followed by a hyphen, then the command name. For example, you would distinguish the two activate commands by calling one with workflow-activate
and the other with default-activate
.
Catalog names have to be unique across the system. Magnolia will not merge commands with same name from various catalogs. It will load commands only from one of them. Since the ui-admininterface
module has a default
catalog, the name is already taken. If you created a default
catalog the names would conflict and the system would not load your command. Choose a catalog name that characterizes its commands, such as "messaging
" for commands that send emails and notifications. See Querying for catalogs and commands how to check for currently used names.
...
Advanced Tables - Table Plus | ||||||||||||||||||||||||||||||||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| ||||||||||||||||||||||||||||||||||||||||||||||||||
|
...
Executing commands with actions
In the UI commands are executed by actions. Here's an example action definition for the activate
action in the Pages app. You can find it in Configuration > -> /modules/pages/apps/pages/subApps/browser/actions/activate
. See Dialog action definition for the properties and their values.
Advanced Tables - Table Plus | ||||||||||||||||||||||||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| ||||||||||||||||||||||||||||||||||||||||||
|
...
params
: Parameters passed to the command. Depends on the command. For example, the activate
command expects to receive a repository
name and a content path
as parameters.catalog
: Name of the catalog where your command resides.command
: Name of the command.description
: Describes the job, for example "Send an email message on the hour"cron
: Schedule that indicates the execution time, written as a CRON expression. For example 0 0 1 5 11 ? 2010
means "run on November 5 at 01:00 am". Cronmaker is a useful tool for building expressions.active
: Set value to true
to activate the job.Advanced Tables - Table Plus | ||||||||||||||||||||||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| ||||||||||||||||||||||||||||||||||||||||
|
...
To query for existing commands:
config
repository workspace, sql
query language and nt:base
result item type.select * from nt:base where jcr:path like '%/commands/%'
".The result looks like this. Path notation: /modules/moduleName/commands/catalog/command
.
Code Block | ||||
---|---|---|---|---|
| ||||
71101 nodes returned in 24ms /modules/publishing-core/commands/default /modules/publishing-core/commands/default/publish /modules/activationpublishing-core/commands/default/unpublish /modules/activationpublishing-core/commands/default/activate /modules/activationpublishing-core/commands/default/deactivate /modules/activationpublishing-core/commands/versioned /modules/activationpublishing-core/commands/versioned/activatepublish /modules/activationpublishing-core/commands/versioned/activatepublish/version /modules/activationpublishing-core/commands/versioned/activatepublish/activatepublish /modules/activationpublishing-core/commands/versioned/deactivateunpublish /modules/activationpublishing-core/commands/versioned/deactivateunpublish/version /modules/publishing-core/commands/versioned/unpublish/unpublish /modules/publishing-core/commands/versioned/activate /modules/activationpublishing-core/commands/versioned/deactivate/deactivate /modules/ui-admincentral/commands/default /modules/ui-admincentral/commands/default/markAsDeleted /modules/ui-admincentral/commands/default/export /modules/ui-admincentral/commands/default/import /modules/ui-admincentral/commands/default/delete /modules/cache/commands/cache /modules/cache/commands/cache/flushAll .... /modules/rest-services/rest-endpoints/commands/enabledCommands /modules/rest-services/rest-endpoints/commands/enabledCommands/activate /modules/rest-services/rest-endpoints/commands/enabledCommands/activate/access /modules/rest-services/rest-endpoints/commands/enabledCommands/activate/access/roles /modules/rest-services/rest-endpoints/commands/enabledCommands/markAsDeleted /modules/rest-services/rest-endpoints/commands/enabledCommands/markAsDeleted/access /modules/rest-services/rest-endpoints/commands/enabledCommands/markAsDeleted/access/roles /modules/rest-services/rest-endpoints/commands/enabledCommands/backup /modules/rest-services/rest-endpoints/commands/enabledCommands/backup/access /modules/rest-services/rest-endpoints/commands/enabledCommands/backup/access/roles /modules/ui-framework/commands/default /modules/ui-framework/commands/default/importZip .... |
Use the Groovy console to execute command business logic manually, in ad hoc fashion. This is a quick way to test a custom command before you compile it as a Java class. Both of the two options below publish the page /travel/about/careers
.
...
You can test it by making a small change on the careers page, executing the Groovy commands, and viewing the modified history page on the public instance.
Issue the following commands in the console:
Option A - Calling the info.magnolia.commands.CommandsManager.executeCommand()
:
Code Block | ||||
---|---|---|---|---|
| ||||
map = new java.util.LinkedHashMap<String, String>() map.put("path", "/travel/about/careers") map.put("repository", "website") cm = info.magnolia.commands.CommandsManager.getInstance() cm.executeCommand('default','publish',map) |
Option B - Passing a SimpleContextobject
to the execute()
method:
Code Block | ||||
---|---|---|---|---|
| ||||
cm = info.magnolia.commands.CommandsManager.getInstance() command = cm.getCommand('activate') |
...
command.setRepository('website') |
...
command.setPath('/travel/about/careers') |
...
command.setRecursive(true)
command.execute( |
...
new info.magnolia.context.SimpleContext())
|
This example activates the page /travel/about/careers
. You can test it by making a small change on the careers page, executing the Groovy commands, and viewing the modified history page on the public instance.
The execute()
method is passed a Magnolia context instance ctx
which is an implicit object the console always puts at your disposal.
...
You can write your own custom commands and execute them either on demand or scheduled. For example, you could execute the standard Magnolia sendMail
command when a page is activated. This way you can send an email notification to a user who needs to review the page.
To create a command definition:
Create a commands
folder in the configuration hierarchy of your module.
Create a catalog
subfolder under the commands
folder. Choose a catalog name that characterizes its commands, such as messaging
for commands that send emails and notifications.
class
property. Set its value to the fully-qualified name of the Java class that contains the command logic such as info.magnolia.module.mail.commands.MailCommand
. The Java class should reside inside the module JAR.Advanced Tables - Table Plus | ||||||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| ||||||||||||||||||||||||
|
...
Code Block | ||||
---|---|---|---|---|
| ||||
public class MyCommand extends BaseRepositoryCommand { public boolean execute(Context context) { // Your command logic goes here. } } |
See the commands in the info.magnolia.commands.impl
package for examples.