wabson

Share Custom Actions in a JAR

Blog Post created by wabson Employee on Feb 28, 2010
Update, 4th May 2011: The Backup action is now part of Share Extras and documentation and downloads are now available on the Custom Backup Action page.



Since the ability to package Share extensions was added in the HEAD codeline some weeks ago, both Kev and myself have demonstrated how you can package up dashlets in a JAR file for deployment into Share.



The example we both used was my Site Tags dashlet that we showed at the Alfresco Meetups last year, but at the Madrid meetup we also showed an example of how Share's Document Library can be extended with a custom 'backup' action.



Custom backup action



Document Library actions have no web-tier webscripts, but hook into the client-side actions framework using a bit of custom JavaScript. Each action has a small 16x16 icon and a bit of CSS code to apply this image, one or more text labels (which should of course be externalised for i18n goodness) and a bit of config to hook them into the app. Lastly, since most actions by their nature do something, it's likely that they will make a RESTful call back to the repository to perform their work, which may require a custom webscript there.



That's quite a few files, but fortunately we can use the JAR extension mechanism to package everything up nicely.



Just like the Site Tags dashlet, I set this up in Eclipse using a standard project layout and my share extensions build script (with a couple of minor changes) to build the JAR file.



To make it easy to copy this structure, I've uploaded a ZIP of the project directory, containing the following files



  • build.xml - the extensions build script


  • config/alfresco/messages/slingshot-custom-backup-action.properties - contains the strings used for the action label and confirmation/failure messages


  • config/alfresco/templates/webscripts - contains the repository-tier webscript used to create a back-up copy of the file


  • config/org/springframework/extensions/surf/slingshot-custom-backup-action-context.xml - Spring config used to initialise the i18n messages


  • config/spring-surf-config-custom.xml - not used at present, but could define additional Surf endpoints for calling third-party RESTful services


  • web - contains all client-side resources used by the action



It should be relatively easy to copy this structure to define your own custom action, following the custom action wiki document to understand what each file does. This will help you to build other actions that call back to the repository via a web script, but actions aren't limited to calling Alfresco services only. For some examples, take a look at my own list of Share action ideas.



Once you have your structure you can build the JAR file using Ant, e.g.

ant -Djar.name=share-backup-action.jar


The JAR file can then be dropped into Tomcat's shared/lib directory, and all that remains is to configure the document actions web scripts to pull in the action definition. This is the slightly fiddly bit.



Firstly, copy the web script configuration file WEB-INF/classes/alfresco/site-webscripts/org/alfresco/components/documentlibrary/documentlist.get.config.xml from the Share webapp into the directory alfresco/web-extension/site-webscripts/org/alfresco/components/documentlibrary in Tomcat's shared/classes to override it. You should see a section <actionSet id='document'> which defines all the actions shown for a normal document in the document list view.



To add the backup action to this list, add the following line just before the </actionset> element for that block.

<action type='action-link' id='onActionBackup' permission='' label='actions.document.backup' />


If you also want the action to show up in the document details view, you need to copy the file WEB-INF/classes/alfresco/site-webscripts/org/alfresco/components/document-details/document-actions.get.config.xml into alfresco/web-extension/site-webscripts/org/alfresco/components/document-details in shared/classes in the same way.



Lastly, we need to ensure that the client-side JS and CSS assets get pulled into the UI as unfortunately the config files do not allow us to specify these dependencies.



To do this, we must override the file WEB-INF/classes/alfresco/site-webscripts/org/alfresco/components/documentlibrary/actions-common.get.head.ftl. Again, copy this into the corresponding directory in shared/classes/alfresco/web-extension and add the following lines at the bottom of the file.

<@link rel='stylesheet' type='text/css' href='${page.url.context}/res/components/documentlibrary/backup-action.css' />

<@script type='text/javascript' src='${page.url.context}/res/components/documentlibrary/backup-action.js'></@script>


That's it. Now you can restart Tomcat and you should see the 'Backup' action - complete with UI labels and icon - in the Document Library.



Downloads

Outcomes