Tuesday 25 November 2014

Aspera File Transfer Integration with Liferay and Alfresco


About Aspera:

Many a times, we have requirement for transferring large amount of files. 

  • Aspera software solutions helps us to move large volumes of data over public and private IP networks efficiently.
  • Aspera works on fasp™ transfer technology.
  • This technology delivers maximum transfer speed regardless of network conditions and transfer distance. 
  • It eliminates the inherent weaknesses of conventional file transfer technologies such as FTP, HTTP and dramatically speeds transfers over public and private IP networks securely. 
  • Also it tracks down failed file transfers. And if destination server is down, Aspera automatically resumes partial transfers and retries failed transfers.

For more Information : AsperaSoft




 Liferay Portal can be used as front end and AlfrescoECM as backend technology for File Transfers:

1. Download Aspera Connect Plugin from http://downloads.asperasoft.com
2. Create a custom portlet in Liferay that allows users to upload files. 
3. Configure Aspera API to upload multiple files to Aspera Connect (Aspera Server).  
4. Aspera server is configured to inject the files into Alfresco repository using REST based API.


Alfresco Server:
The content ingestion is performed using importer script. The importer can be deployed by copying the 'webscripts' directory (and all its contents ) to [Alfresco_HOME]/ tomcat/shared/classes/alfresco/extension/templates. The 'templates' directory shall not be existing so create it prior to copying.


Note that in [ALFRESCO_HOME]/tomcat/shared/classes/alfresco-global.properties, 
"dir.root" property is set to an absolute path. This path will also be used for Aspera Server as docroot directory.

Create a new site in Alfresco repository via Alfresco Share. Create a folder in the site, eg. uploadsFromAspera. 
This folder will be the root directory for all the uploads that will be done.
It also is the root directory for all the contents that will be ingested into the Alfresco CMS.
From Alfresco view point, this folder will referenced using either its nodeRef or its path. Both values can be fetched using the administration console.

We can use the Repository Browser - http://HOSTNAME:PORT/share/page/repository - to navigate and get the path of the newly created folder:
eg. Sites/siteName/documentLibrary/uploadsFromAspera

Aspera Server:
In [ASPERA_HOME]/etc/aspera.conf, configure the docroot directory to be at least a sub-directory of Alfresco ${dir.root}/contentstore.
Eg. FILE: [ALFRESCO_HOME]/tomcat/shared/classes/alfresco-global.properties
dir.root=C:/Alfresco/alf_data
FILE: [ASPERA_HOME]/etc/aspera.conf

Liferay:
There is metadata information needed by Alfresco importer (name, title,
description, mime-type, encoding, locale of file to be uploaded).
 There is a front end directory provided by Aspera which contains several Javascript files:
- e.g. - asperaweb-2.js : the Aspera Connect plugin API

Custom portlet developed in Liferay, needs to provide below information:

- a transfer specification object

transferSpec = {
"paths": [],
"remote_host": remoteAsperaServer,
"remote_user": remoteUser,
"remote_password": remotePassword,
"direction": "send",
"target_rate" : 5000,
"resume_check" : "sparse",
"create_dir":true
};

- a call to perform the upload

asperaWeb.startTransfer(transferSpec, aspera_connect_settings, callbacks = {
error : function(obj) {
console.log("Upload failed to start : " +
JSON.stringify(obj, null, 4));
},
success:function () {
console.log("success ...");
disableButton("#upload_form
#upload_button");
}
});

Encode the content’s metadata as cookie for the transfer specification. Cookie format:

COOKIE="mimetype":" encoding":"locale":"cm:title":"cm:name":"cm:description";
Example:
cookie="video/mp4 : UTF-8: en_US_: My Title:my_file.mp4: My description"
The metadata can also be encoded using tags attributes of transferSpec. Tags convention for transfer specification is tags.company or tags.domain. 


Aspera Pre/Post Processing
The uploaded file are available in the docroot path configured in aspera.conf (configuration file of Aspera Server). To make the link with Alfresco CMS, the content will be ingested in CMS when the upload is completed. Aspera pre/post processing offers the possibility to run programs on the occurrence of events during the lifetime of transfer session and transfer files. When a file is successfully uploaded (two conditions TYPE is file and STATE is success), a script (ingest.pl - perl script ) is called to perform the ingestion into CMS. The ingestion is done using the REST API supplied by Alfresco.

Thanks for reading. Happy Learning! 


Thursday 18 September 2014

Custom AUI Validation in Liferay 6.1


Implementing a custom rule for non-alphabets using AUI Validator:

A simple program to compare Start Date and End Date using AUI Validator:

Many a times it is required, that we want to provide rules to dynamically added fields.
We can use current validator and iterate over rules by passing rowId:

Tuesday 2 September 2014

Flickr Integration with Liferay


Many a times, we work with clients who like to maintain their account using several Social Media Tools. We might require to display them in the form of feeds by pulling data from one of their accounts.

I have taken an example of Flickr here. We can create a Liferay portlet and show public contents by configuring flickr feed id and number of feeds on web page.



Create a  Liferay portlet eg. FlickrApp Portlet. 

In liferay-portlet.xml specify your configurationAction class let say FlickrConfigurationActionImpl.

In FlickrConfigurationActionImpl, you need to add code for storing preferences. 
Below is sample code:
In configuration.jsp, you need to write logic for providing preferences i.e. showing inputs for feeds.


In view.jsp, you need to add logic for storing preferences:


You need to add the FlickrFeedAPI for accessing these feeds.
1. Download latest Jquery min js file
2. Download Flickr feed js file from Jquery Feed Plugin
3. Create a flickr-setup.js file which takes feed count and feed id as input and displays feeds as shown below:
For FlickrServices, you can refer : Feeds

Thanks for reading! Happy Learning !

Sunday 31 August 2014

Import Roles in Liferay 6.1


In previous post, we saw how to export Roles in Liferay 6.1 via xml.

Below is the code snippet for importing Roles along with Permissions in your Liferay Portal.

Export Roles in Liferay 6.1

Many a times, it is required to have Import/Export functionality for Roles.
This functionality is already supported in Liferay 6.2 where we can do lar import/export for roles and organizations as well.

Below is the code snippet for Exporting Roles along with Permissions in the form of xml in Liferay 6.1.

Create a hook in liferay eg, RolesMgmt hook. Create a class called as ExportRolesAction which extends BaseStrutsPortletAction.

Refer below code for the same:




Now, you can override view.jsp from path - /portal-web/docroot/html/portlet/role_admin/view.jsp
and add code to display buttons for Import Roles and Export Roles on front end.

So in addition to the existing code of view.jsp, you can add below code snippet for the import/export:


You can also add code for validating the checkboxes like disabling the checkboxes of default role types. In the next post I shall be giving sample code for Roles Import.

Thanks for reading!
Happy Learning!

Wednesday 20 August 2014

Using Custom Fields/Custom Attributes in Liferay 6.1


Some time we may come across the need for adding a property or storing data associated with OOTB portlets. We dont need to create any new service. It can be done with the help of Custom Attributes or Custom Fields. Liferay provides this feature through Expando services.

The mechanism is supported by using 4 database tables: ExpandoTable, ExpandoColumn, ExpandoRow and ExpandoValue.

Expando values can be added to liferay objects like: Users, Documents and Media, Web Contents, Bookmarks, etc. through control panel and programmatically to the custom portlets as well.

For Custom-Portlets:

Create custom-fields for custom-table:
Suppose we want to create the custom fields into custom-table. e.g Let us create a custom field named
PrimaryTag and associate it with a custom portlet named VideoManagement.
Example code:

It will add an entry in all 4 expando-tables mapped with VideoManagement classname.


Display custom-fields into your webpage(for custom portlet)
Liferay provides below code to display custom fields on page for all the OOTB portlets.
Same code can be used in custom-portlet to display them as text fields.


In LocalServiceImpl add following code for storing expandovalue:


The way of setting value:


e.g addCustomAttribute(_companyId, _className, PrimaryTag", _classPK, “primaryTagValue”);
i.e. ExpandoValueLocalServiceUtil.addValue(classNameId, tableId, columnId, classPK, data);


The way of getting value:


Expando Table:

Expando Column:


Expando Value:

where tableId is the id of default table, columnId the id of retrieved column and classPK the primary key of entity.

For OOTB portlets e.g journalArticle, we have to first create custom attributes from control panel.

The following code sets attributes for particular article using service context.


Thanks for reading! Happy Learning!

Using Asset Category in Custom Portlet of Liferay 6.1

Many a times it is required that when one of our custom content is created we need to let the asset framework know. You just need to invoke a method of the asset framework. When invoking this method we can also let the framework know about the tags and/or categories of the content that was just authored.

This is the code you can put it to any jsp page for implementing category popup.

// vManag is the object which is refering to custom portlet named VideoManagement.

In JSP



The tag <liferay-ui:asset-categories-selector> uses AssetCategoryServiceUtil.getCategories(className, classPK) to get the list of categories and populates the curCategoryIds from this list.

All the methods that you will need to invoke are part of the AssetEntryLocalService. In particular you should access these methods using either the static methods of AssetLocalServiceUtil or by using an instance of the AssetEntryLocalService injected by Spring.

First time you are adding record in custom table so you have to select cateogry from popup.It will show all categories in the category popup by specifying empty string in curCategoryIds and At the time of editing record you have to get categoryIds [like 45326,45327] from custom table that is already stored after adding record and then assign categoryIds to curCategoryIds in asset-categories-selector tag.

So you can see the category selected and if 'select' button is clicked, the same category is shown as checked and that will be useful when you editing any record of custom-table to show default selected values in that popup.

When user select any category from that popup. It will automatically create a hidden field with name assetCategoryIds in the same page.


In Java class

So here you can get the values of selected categoryIds like 45326,45327[two category selected in popup]

you can make entry in custom table for adding/editing record and also in assetEntry table for that same recordId.

This is the logic for making entry in assetEntry table for that recordId.


userId :- is the identifier of the user who created the content.

VideoManagement.class.getName() :- which is the class name refering to custom portlet named VideoManagement.

vManag.getVideoId() :- represent as classPK which is unique recordId for that content[specify Id of that record which is already added/updated].

assetCategoryIds :- represent the categories that have been selected by the author of the content.

Url :- which specify the url of content i.e for videomanagement portlet you can specify videoURL.

Thanks for reading! Happy Learning!

Refer more,
https://www.liferay.com/documentation/liferay-portal/6.1/development/-/ai/asset-framewo-4

Tuesday 15 July 2014

Display Dockbar based on Roles in Liferay


Below code can be used to check logged in user is Admininstrator then display Dockbar:#if ($permissionChecker.isOmniadmin())#dockbar()#end

Below code snippet is used to show/hide dockbar based on custom Role. If logged in user has custom Role assigned, then dockbar shall be visible to him. It shall be hidden for rest of users.

#if ( $is_signed_in )        #set ($roleService = $serviceLocator.findService("com.liferay.portal.service.RoleService"))    #set ($listOfUserRoles = $roleService.getUserRoles( $user_id ))    #foreach( $userRole in $listOfUserRoles)       #if ($userRole.getName() == "Custom-Role")          #dockbar()       #end    #end#end