Assistance with Open Source adoption


A wild structure type has appeared!

Liferay - Tue, 10/25/2016 - 10:37

People playing around with the new features of Liferay may have noticed something very interesting when creating web content structures. What is it you might ask? It is a way to embeded web content articles into other articles!


But wait, how do I use this stinking thing?


Using DDM Journal Article Structure


If you've already tried to use this you may notice that when you use the usual getData() it returns a JSON string containing the className and classPK of the article. Cool, but I don't have access to serviceLocator and don't know how to get the display of the content. Well you can, thanks to <@liferay_ui['asset-display'] />. Lets see the template.

As we can see above, by using the taglib we are able to pass in those two values that the structure gives us and display our web content. Because we are referencing the primary key of the article, if we make revisions those changes will be reflected when displaying the content.


But why should I care?


Good question, I mean this is a cool feature but how does it help accomplish your needs? Imagine you've created some great copy that you want to use throughout your site. You want to use it on a landing page with some other content to make some nice columns, but you also want to include it by itself on another page. And who wants to repeat themselves? With this, you can make your content and get it looking exactly how you need it to look, then you can use this new structure type to embeded it wherever you need it! And since you are creating a new template, you can rearrange how you want the articles to be displayed on the page without changing the embeded articles template.


But wait, there is more...


Imagine that I do want to change the template of the embeded article so that the markup is different depending on how it is being used. Lets look at some templates:




In this template I am using freeMarkerPortletPreferences.setValue("view", "basicContentView") to set my own custom preference. I've given it a value that is unique so that nothing else is disrupted. And here is another template where I am using the Bootstrap 3 markup for the carousel:





Again I am using the same pattern to set a unique view preference. But what about in the template I am embedding? I've created a basic structure and template for displaying a picture and some text. But I want to display it differently if I am creating a carousel or displaying them all together. So lets take a peak at how this affects my card template:



In this template we check to see what view has been set, and provide a default view if none is set. Look at this gif to see this in action:



The two web content articles on the left are displaying the web content articles on the right. You can see the template's I've included above to see how using the preferences to set a custom value allows us to change the way a web content template is displayed on the page. 


Enjoy using this new feature!

Travis Cory 2016-10-25T15:37:25Z
Categories: CMS, ECM

The Missing Maven Elements

Liferay - Wed, 10/19/2016 - 15:20

I mentioned last time in The State of Maven Development, that we were missing a few items for our Maven users.

Well I have good news...

You can now build themes in Maven!

In pom.xml:

<build> <plugins> <plugin> <artifactid>maven-dependency-plugin</artifactid> <executions> <execution> <phase>generate-resources</phase> <goals> <goal>copy-dependencies</goal> </goals> <configuration> <outputdirectory>${}/deps</outputdirectory> </configuration> </execution> </executions> </plugin> <plugin> <groupid>com.liferay</groupid> <artifactid></artifactid> <version>1.0.0</version> <executions> <execution> <phase>process-resources</phase> <goals> <goal>build-theme</goal> </goals> <configuration> <diffsdir>src/main/webapp/</diffsdir> <name>sample-maven-theme</name> <outputdir>${}/${}</outputdir> <parentdir>${}/deps/com.liferay.frontend.theme.styled-2.0.13.jar</parentdir> <parentname>_styled</parentname> <templateextension>ftl</templateextension> <unstyleddir>${}/deps/com.liferay.frontend.theme.unstyled-2.0.13.jar</unstyleddir> </configuration> </execution> </executions> </plugin> <plugin> <groupid>com.liferay</groupid> <artifactid>com.liferay.css.builder</artifactid> <version>1.0.20</version> <executions> <execution> <id>default-build-css</id> <phase>generate-sources</phase> <goals> <goal>build-css</goal> </goals> </execution> </executions> <configuration> <portalcommonpath>/</portalcommonpath> <docrootdirname>src/main/resources</docrootdirname> </configuration> </plugin> </plugins> </build> <dependencies> <dependency> <groupid>com.liferay</groupid> <artifactid>com.liferay.frontend.theme.styled</artifactid> <version>2.0.13</version> </dependency> <dependency> <groupid>com.liferay</groupid> <artifactid>com.liferay.frontend.theme.unstyled</artifactid> <version>2.0.13</version> </dependency> </dependencies>


We’ve also published 18 maven archetypes with many more on the way!


  • com.liferay:com.liferay.project.templates.activator
  • com.liferay:com.liferay.project.templates.api
  • com.liferay:com.liferay.project.templates.content.targeting.rule
  • com.liferay:com.liferay.project.templates.content.targeting.tracking.action
  • com.liferay:com.liferay.project.templates.fragment
  • com.liferay:com.liferay.project.templates.mvc.portlet
  • com.liferay:com.liferay.project.templates.portlet
  • com.liferay:com.liferay.project.templates.portlet.configuration.icon
  • com.liferay:com.liferay.project.templates.portlet.provider
  • com.liferay:com.liferay.project.templates.portlet.toolbar.contributor
  • com.liferay:com.liferay.project.templates.service
  • com.liferay:com.liferay.project.templates.service.builder
  • com.liferay:com.liferay.project.templates.service.wrapper
  • com.liferay:com.liferay.project.templates.simulation.panel.entry
  • com.liferay:com.liferay.project.templates.template.context.contributor


Check back with us as we continue to work on documentation, more archetypes including one new one that should make starting your next project much easier.

David Truong 2016-10-19T20:20:54Z
Categories: CMS, ECM

Single Page Applications with SennaJS and Liferay Faces

Liferay - Mon, 10/17/2016 - 15:46
Single Page Applications with SennaJS and Liferay Faces

One of Liferay 7’s most exciting new features is SennaJS, a Single Page Application engine. SennaJS makes the portal more user-friendly in many ways. For example, when a link is clicked and navigation occurs, SennaJS requests the necessary portlet markup via XHR and renders it in the browser so that the whole portal page is not reloaded. As part of our latest release of Liferay Faces, we’ve added support for SennaJS so that JSF portlet developers can take advantage of this amazing feature.

How do I use SennaJS with Liferay Faces portlets?

Liferay Faces Bridge enables support for SennaJS in Liferay 7 by default. Utilizing SennaJS is as simple as using h:link, h:outputLink, or any other component which renders an <a> tag.1 If the link navigates to another page in your portal, SennaJS will automatically handle the navigation and cause an XHR GET which will load only the changed parts of the page. You can try this live in the Liferay Faces Showcase h:link example by clicking the To Param page > link. Clicking the link causes an XHR GET via SennaJS which is shown visually with a blue loading bar at the top of the page. You can compare this to a full-page GET by changing the end of the URL from param back to navigation and hitting enter. The full-page navigation is not only slower, but it causes more blinking and changes on the page.

Disabling SennaJS

Although SennaJS improves the user experience, it may be unnecessary for (or, rarely, incompatible with) certain use cases. If your portlet requires that SennaJS be disabled, then simply add <single-page-application>false</single-page-application> to the <portlet> section of your liferay-portlet.xml.

Under The Hood: How Liferay Faces Integrates with SennaJS

The Liferay Faces team worked closely with Bruno Basto, a Liferay front-end engineer, and Eduardo Lundgren, one of the creators of SennaJS, to ensure that Liferay 7’s usage of SennaJS would be compatible with Liferay Faces. Fortunately, SennaJS and Liferay 7 were already working together elegantly before we attempted to add Liferay Faces to the mix. Liferay 7 required only a few minor tweaks to allow Liferay Faces to take advantage of SennaJS. Bruno Basto implemented these changes. Thanks to him, SennaJS avoids loading duplicate resources in the <head> section by automatically tracking all CSS and JS resources and assuming that JS resources should not be unloaded.2,3

Since SennaJS is enabled by default in Liferay 7, the Liferay Faces team only needed to disable it for JSF components which were incompatible with its features. SennaJS assumes all links cause navigation, and it uses an XHR to obtain the markup that would otherwise be obtained via a full-page GET. Since JSF commandLink components are intended to submit a form rather than simply navigate to another page, they must not invoke SennaJS’s functionality. Likewise, SennaJS automatically causes forms to submit via XHR. However this feature is not compatible with JSF, since JSF expects to be in total control of form submissions.4 In order to avoid these incompatibilities, we used the data-senna-off attribute to disable SennaJS for all commandLinks and forms in Liferay 7.

With the minor changes listed above, Liferay Faces now allows JSF developers to enjoy the major benefits of SennaJS in Liferay 7!

  1. …with the exception of commandLink components. See the “Under the Hood” section for more details.
  2. Even though SennaJS tracks all the JavaScript files that are loaded, there is no way for it to generically unload all the components from those files, so it assumes it should not unload a JS element. This has the beneficial side effect of not reloading the same JS multiple times when a user navigates from one page to another and back again with SennaJS.
  3. All of these improvements benefit Liferay portlet developers who use JSP technology as well.
  4. Of course, JSF has its own functionality for submitting forms via ajax.
Kyle Joseph Stiemann 2016-10-17T20:46:57Z
Categories: CMS, ECM

So Now what?

Liferay - Mon, 10/17/2016 - 03:54

In my last Blog entry (First Day at the SPA) I showed how to create a simple Newsletter Signup Form with the JSON API and some AngularJs, and earned a relaxing day at the Spa, but now what?

I still want more, more relaxing days at the pool, good and healthy food, muscle relaxing shiatsu massages, and still be able the deliver robust solutions.

So how can you continue optimizing my workflow, and still have time to chill?


The short Answer

JSON Webservices and a little bit of HTML and Javascript, and XML(And Yes we are still on a Vanilla Liferay Installation)


The long Answer

To show my take on the long answer, I will continue optimizing the small example, of my last Blog entry. 

The example Task: Adapt and Optimize the Mailing List sign up (control), to reflect a more realistic Signup form.

So the basic appearance won't change, only the signup process in the background.

Lets first look at the current process

Step 1) You enter an email-address.
Step 2) Your email-address is saved.

  Now lets look at the "improved" process

Step 1) The user enters an email-address.
Step 2) An automatic email is send to the entered email-address
Step 3) The user has to activate the subscription, with the provided link in the email
Step 4) After activation (clicking the link), the email-address is marked as activated

Like this achiving a "double opt in" for the Mailing List, which can save you much problems, at least in austria.

So Lets begin

I'am still using the prior coded liferay-service-provider.js, which was updated since the last post. (It can be found on Github

Step 1: Create our “database”

Since I want Liferay's Workflowengine to take care of the backendprocess, but I don't want all the created webcontents to passthrough the same Mailinglist Workflow, the data entries will now be saved as Dynamic Data List Records. Here we can specify different workflows to individual List, and so being totally independent.    We create a new Data Definition, with the Fields Email and Activated. Later will not be shown it is only to hold the status of the entry.   And create a new Data Defenition List with the currently created Data Defenition. (Here we could already set the worklfow if it would be present)
  Step 2: Adapat the HTML/Javascript "CODING" Although there is no change in the frontend, there will be some minor changes in the HTML / Javascript portion, to help with the activation link and the minor changes in the liferay-service-provider API.   <div class="name-box"> <style type="text/css"> .name-box{margin:0;} </style> <div class="span4 no-margin" data-ng-app="newApp"> <div class="ng-view"></div> <script src="/angular/angular.min.js"></script> <script src="/angular/angular-route.min.js"></script> <script src="/angular-addon/liferay-service-provider.js"></script> <script> (function(app){ app.config(["liferayProvider","$routeProvider", function (liferayProvider,$routeProvider) { liferayProvider.setToken(btoa("newsletterservice:newsletterservice")); liferayProvider.addTypes({ name:"Newsletter", type: TYPES.DDLRECORD, groupId: 24913, recordSetId: 25719 }); $routeProvider .when("/", { template: "<form class='form-search' id='nameBox'>" + "<div class='input-append'>" + "<input class='search-query' data-ng-model='Email' placeholder='Enter Name ... ' type='text' />" + "<button class='btn' data-ng-click='saveName()' type='button'><i class='icon-envelope'>&nbsp;</i>Add Name</button>" + "</div></form>", controller: "baseController" }) .when("/success", { template: "<div class='alert alert-success'><b>Success!</b> Your name is now entered in our mailingslist!</div>" }) .when("/failure", { template: "<div class='alert alert-error '><b>Error!</b> Please try it again <a href='#/' > go back </a>!</div>" }) .when("/activate/:id",{ template: "<div class='alert alert-info'>{{message}}</div>", controller: "activationController" }).otherwise("/"); }]).controller("activationController", ["$scope", "$routeParams", "liferay", function($scope, $routeParams, liferay){ liferay["Newsletter"].update({Activated:true}, ${ $scope.message = "Email activated!"; }).catch(function(){ $scope.message = "Error!"; }); }]).controller("baseController", ["$scope", "$location", "liferay", function($scope, $location, liferay){ $scope.saveName = function(){ liferay["Newsletter"].create({Email:$scope.Email}).then(function(){ $location.url("/success"); }).catch(function(){ $location.url("/failure"); }); }; }]); }(angular.module("newApp",["LiferayService", "ngRoute"]))); </script> </div> </div><div class="name-box"> <style type="text/css"> .name-box{margin:0;} </style> <div class="span4 no-margin" data-ng-app="newApp"> <div class="ng-view"></div> <script src="/angular/angular.min.js"></script> <script src="/angular/angular-route.min.js"></script> <script src="/angular-addon/liferay-service-provider.js"></script> <script> (function(app){ app.config(["liferayProvider","$routeProvider", function (liferayProvider,$routeProvider) { liferayProvider.setToken(btoa("newsletterservice:newsletterservice")); liferayProvider.addTypes({ name:"Newsletter", type: TYPES.DDLRECORD, groupId: 24913, recordSetId: 25719 }); $routeProvider .when("/", { template: "<form class='form-search' id='nameBox'>" + "<div class='input-append'>" + "<input class='search-query' data-ng-model='Email' placeholder='Enter Name ... ' type='text' />" + "<button class='btn' data-ng-click='saveName()' type='button'><i class='icon-envelope'>&nbsp;</i>Add Name</button>" + "</div></form>", controller: "baseController" }) .when("/success", { template: "<div class='alert alert-success'><b>Success!</b> Your name is now entered in our mailingslist!</div>" }) .when("/failure", { template: "<div class='alert alert-error '><b>Error!</b> Please try it again <a href='#/' > go back </a>!</div>" }) .when("/activate/:id",{ template: "<div class='alert alert-info'>{{message}}</div>", controller: "activationController" }).otherwise("/"); }]).controller("activationController", ["$scope", "$routeParams", "liferay", function($scope, $routeParams, liferay){ liferay["Newsletter"].update({Activated:true}, ${ $scope.message = "Email activated!"; }).catch(function(){ $scope.message = "Error!"; }); }]).controller("baseController", ["$scope", "$location", "liferay", function($scope, $location, liferay){ $scope.saveName = function(){ liferay["Newsletter"].create({Email:$scope.Email}).then(function(){ $location.url("/success"); }).catch(function(){ $location.url("/failure"); }); }; }]); }(angular.module("newApp",["LiferayService", "ngRoute"]))); </script> </div> </div>   Due to the fact the the SPA has now to react to some urls, I added ngRoute Module and updated the Code to use the benefits of this module. (the activation link logic, could have been coded with 2-3 lines of vanilla Javascript code, but updating the code to benefite of ngRoute module makes it a real SPA, and it maintainable) Also since the liferay-service-provider.js should use DDRecord instead of WebContent, some minor changes in the config were needed, to set it up.   Step 3: Create a workflow XML file that reflects the needed/wanted process/flow

I must say the Liferay Workflowengine is pretty neat, and has some nice features. In my opinion it could improve documentation wise, but I cant be that bad, if I could wipout this xml in a few hours.

<?xml version="1.0"?> <workflow-definition xmlns="" xmlns:xsi="" xsi:schemaLocation=""> <name>Newsletter process</name> <description>Newsletter</description> <version>1</version> <state> <name>created</name> <metadata></metadata> <actions> <action> <name>start</name> <script><![CDATA[ var _log ="WORKFLOW"); _log.error("START"); var email = ""; var id = 1; try{ var idOffset = 3; id = workflowContext.get("entryClassPK") - idOffset; var record =; email = record.getFieldValue("Email"); } catch(e) { _log.error(e); } Packages.javax.mail.internet.InternetAddress(""), Packages.javax.mail.internet.InternetAddress(email), "Activation Email", "<html><body><a href='http://liferay:8080/web/spa-tests/main-page#/activate/" + id + "'>activation</a></body></html>", true ); ]]> </script> <script-language>javascript</script-language> <execution-type>onEntry</execution-type> </action> </actions> <initial>true</initial> <transitions> <transition> <name>timer</name> <target>timer</target> </transition> </transitions> </state> <task> <name>timer</name> <assignments> <user/> </assignments> <task-timers> <task-timer> <name>Timer</name> <description>1</description> <delay> <duration>1</duration> <scale>minute</scale> </delay> <recurrence> <duration>1.0</duration> <scale>minute</scale> </recurrence> <timer-actions> <timer-action> <name>approve</name> <script> <![CDATA[ var idOffset = 3; var id = workflowContext.get("entryClassPK") - idOffset; var record =; if(record.getFieldValue("Activated") == true){ var companyId = workflowContext.get("companyId"); var workflowInstanceLink = companyId, workflowContext.get("groupId"), workflowContext.get("entryClassName"), workflowContext.get("entryClassPK") ); var workflowInstanceId = workflowInstanceLink.getWorkflowInstanceId(); companyId, workflowContext.get("userId"), workflowInstanceId, "end", workflowContext ); } ]]> </script> <script-language>javascript</script-language> <priority>1</priority> </timer-action> </timer-actions> </task-timer> </task-timers> <transitions> <transition> <name>end</name> <target>end</target> <default>true</default> </transition> </transitions> </task> <state> <name>end</name> <actions> <action> <name>Approve</name> <description>Approve</description> <script> <![CDATA["approved"), workflowContext ); ]]> </script> <script-language>javascript</script-language> <execution-type>onEntry</execution-type> </action> </actions> </state> </workflow-definition>   Basically what this code does

1) On entering the intial State, an email is sent, with the activiation link
2) Now the Engine is checking periodically (1 minute interval), if the email-address was activated, through the link
3) If the entry was activated, the workflow will terminate. (this is a great place to an some code, that sends a welcome email, or so)

Now, just upload the workflow

and finally add it to the prior created DDL List

Last Step

Lean back and enjoy the time you have saved, and will save in the future, if you take advantage of the rich toolset that Liferay provides out-of-the-box.

Please share any Ideas, possible Improvements, Comments, Feedback and/or nice Spa locations in/near austria. I would like to hear from you.


Obviously there are still some improvements, since it is merely a proof of concept, but this I leave for you to explore. Charles Lam 2016-10-17T08:54:25Z
Categories: CMS, ECM

New themes Blog entry (4/4) - 1975 London theme

Liferay - Thu, 10/13/2016 - 04:08

Hi everyone!


In our final entry of the series, we are happy to introduce a theme that you can use to create your own subscription site. Welcome to 1975 London!.



"A music site as example"


The new 1975 London theme includes an awesome site template with news and an album player to sit back and relax while listening to small fragments of your favourite songs.


This theme includes some new exciting features such as:


  • Different ways to show the content preview: you can choose from two different cards and two layouts to show album previews display and combine it with different text positions to get modern and awesome layouts.



  • Two layouts to show album previews.



  • Modern layout to display news

  • Easy way to put your header over your content through a setting.


Soon in the marketplace


The 1975 London theme will soon be published in the marketplace.

  Marcos Castro 2016-10-13T09:08:27Z
Categories: CMS, ECM

Securing Liferay Chapter 5: An easily missed HTTPS caveat

Liferay - Wed, 10/12/2016 - 10:20

You probably know the basic installation instructions for Liferay Bundles: „unzip and run“ - with this you get to a working Liferay installation in a minute. It will run with all defaults - which might not be what you want in production.

This is part 5 of a series. All the chapters are linked at the bottom of this article - I recommend to start with chapter 1. This chapter is an extension to chapter 3 - an aspect that you'll not run into when you just follow my recommendation. But if you ignore those recommendations, there's something you might want to know. Just as before, please note that I'm using Apache httpd as the webserver of my choice. If you are more familiar with any of the others: Feel free to search/replace the name. It's the principle that I'd like to discuss, not the name or origin of the webserver.

Tomcat (or: my appserver) speaks https too...

Yes it does. Still, in chapter 3 I'm recommending to configure https through Apache httpd. Why?

  • because I'm used to it and I have it anyway just to get access to mod_rewrite
  • because it supports a lot of different configurations and has a lot of documentation (and implementations) readily available (Let'sEncrypt anyone?)
  • because... security...
What's more secure when Apache httpd handles encryption?

Httpd, being a separate process, typically runs as a different user than tomcat. Further more, it's started as root and drops those privileges once configured. And here's the main reason: You can store your private server key (the crown jewels of a web server) to be readable only to root. And when you're running on a separate server, you even have that level of protection between your Appserver and application (Liferay).

If your appserver handled encryption, it would need access to your private key as well. Granted, the private key in a Java keystore is typically password protected. The only problem is that the password also needs to be read by the user that tomcat is running as. So basically you can't really store the private key (that never must escape your control) in a way that the appserver can't read it.

Any security hole in either appserver or application might expose your filesystem to the outside - and it'd be a very bad idea to leak your private key. You might not even know when it escapes - I find it's a lot harder to properly protect the private key when you only have the appserver doing everything from serving application data to handling connection encryption.

And did I mention that just mod_rewrite alone has saved me hours for quickly fixing issues in production? If you've not yet considered an extra Apache httpd: let this chapter be the trigger for changing your setup. And if you did: Congratulations. Great choice.

Olaf Kock 2016-10-12T15:20:25Z
Categories: CMS, ECM

Docker image: Liferay DXP - Wildfly (JBoss)

Liferay - Mon, 10/10/2016 - 18:59

I recently played with Docker, CloudFoundry and decided to spend some time creating a docker image for Liferay DXP on Wildfly (i.e JBoss). I'm sharing my experience on this blog entry.

Run Docker image

Assuming you already have docker installed on your machine, you can easily run the docker image by executing the following command:

docker run -it -p 8080:8080 dorgendubal/liferay-dxp-wildfly

(The image is 2GB large and it will take some time to download it)

The startup takes about 2 minutes. You can then access your liferay:



  Pre-configured Docker image for Québec/Canada

I also created a pre-configured image for demo'ing purposes in Québec/Canada.

  • default locales are fr_CA/en_CA
  • wizard, terms of use and reminder question are skipped
  • administrator is preconfigured

docker run -it -p 8080:8080 dorgendubal/liferay-dxp-wildfly-quebec

  Contribution / Source code

Interested in contributing or in looking at the source code ?

Sven Werlen 2016-10-10T23:59:09Z
Categories: CMS, ECM

Portlet Filters in Liferay 7

Liferay - Tue, 10/04/2016 - 02:26

Liferay 7 comes with a lot of feature and each feature is worth to learn.  Portlet Filter is one of them. However, it is possible to write portlet filter in earlier versions but in Liferay 7 it has certain benefits.

As compared to earlier version Portlet Filter can be deployed as service in OSGI. There is no need to write filter in the same portlet plugin that is the ultimate benefit of Liferay 7 modular architecture, it gives us the possibility to apply filter on OOTB portlets with ease. This is beneficial where It can be applied and removed independently from the portlet without redeploying the portlet as the contracts between osgi services are loosely coupled.


In earlier version It is hard to apply filters on OOTB portlets. I think, it is not possible without EXT plugin. Taking advantage of OSGI in Liferay 7, Portlet Filter on OOTB portlet can be applied as a service and can be removed without need of the Portal downtime.


There can be following Portlet Filters.

a) Render Filter: -Render Filter mainly implements the doFilter(RenderRequest request, RenderResponse response, FilterChain chain) method of the the javax.portlet.filter.RenderFilter class.

b) Resource Filter: - Resource Filter implements the doFilter(ResourceRequest request, ResourceResponse response, FilterChain chain) method of the the javax.portlet.filter.ResourceFilter class.

c) Action Filter: - Action Filter mainly implements the doFilter(ActionRequest request, ActionResponse response, FilterChain chain) method of the the javax.portlet.filter.ActionFilter class.

d) Event Filter: - Event Filter mainly implements the doFilter(EventRequest request, EventResponse response, FilterChain chain) method of the the javax.portlet.filter.EventFilter class.


To define PortletFilter first step there is need to declare following properties that will identify this service as PortletFilter and on which portlet service it is applied. Suppose we want to apply filter on Login Portlet. It can be done just by writing an independent module that has following component class.


                immediate = true,

                property = {

        " com_liferay_login_web_portlet_LoginPortlet"


    service = PortletFilter.class


public class MyLoginPortletFilter implements RenderFilter {



                public void destroy() {




                public void doFilter(

                                                RenderRequest request, RenderResponse response, FilterChain chain)

                                throws IOException, PortletException {


                                System.out.println("Before filter action");

                                chain.doFilter(request, response);

                                System.out.println("After filter action");




                public void init(FilterConfig filterConfig) throws PortletException {




Sushil Patidar 2016-10-04T07:26:23Z
Categories: CMS, ECM

First Day at the SPA

Liferay - Fri, 09/30/2016 - 10:15

To develop for Liferay is no simple Task. There are many things you have to keep in mind, if you want to create and develop professional Applications, and you also have to learn many different technologies, if you aren't yet an savvy Java-Developer. So what are the alternatives, searching the web and marketplace portlets, or ...? Here is a different approach, that uses vanilla Liferay and HTML / Javascript and very little time.


So how can you create applications, and still have time for a day at the SPA? The short Answer

JSON Webservices and a little bit of HTML and Javascript.

The long Answer

To show my take on the long answer, I made up this small example. But bare in mind, that any form with many amount and logic is create able.

The example Task: Create a Mailing List sign up (control)

  Step 1: Create our “database”
  1. First we need to create a web-folder, lets call it “Mailing List”.
    Here all the “data entries”, will be stored

  2. Next we create our “datastructure” as an Journal / WebContent Structure (the Liferay naming is a bit confusing, to an Liferay beginner like me), adding all field we need.

    For our example the field Email should be enough.

  3. Now create a template for the newly created structure


Step 2: Now comes the best part "CODING"

Write some Javascript and HTML Code, that uses the jsons webservices to create new Articles (this is the important part), these entries are our “data entries”. For our example I used angular and created all the liferay specific functions in an separate module, so that I can reuse. (It is not yet production grade code, but nice for a demo)

Here, the HTML / Javascript code that should be added into the WebContent:

<div class="newletter-box"> <style type="text/css">.newletter-box{margin:0;}</style> <div class="span4 no-margin"> <div id="newsletterAlertBox" class="alert alert-success hide"> <b>Success!</b> Your email address is now entered in our mailingslist! </div> <form id="newsletterBox" class="form-search"> <div class="input-append" data-ng-app="newsApp" data-ng-controller="baseController"> <input class="search-query" data-ng-model="Email" placeholder="Enter Email ... " type="text" /> <button class="btn" data-ng-click="saveEmailAddress()" type="button"> <i class="icon-envelope">&nbsp;</i>Add to List </button> </div> </form> <script src="/angular/angular.min.js"></script> <script src="/angular-addon/liferay-service-provider.js"></script> <script> (function(app){ app.config(["liferayProvider", function (liferayProvider) { liferayProvider.setToken(btoa("newsletterservice:newsletterservice")); liferayProvider.addTypes({ name:"Newsletter", groupId: 24913, folderId: 24927, structureId: 24930, templateId: 24932 }); }]).controller("baseController", ["$scope", "liferay", function($scope, liferay){ $scope.saveEmailAddress = function(){ liferay["Newsletter"].create({Email:$scope.Email}).success(function(){ document.querySelectorAll("#newsletterAlertBox").className = "alert alert-success"; document.querySelectorAll("#newsletterBox").className += " hide"; }).error(function(){ console.warn(arguments); }) }; }]); }(angular.module("newsApp",["LiferayService"]))); </script> </div> </div>

I posted the code for the angular module, on github:, if you wanted to use it or try it out yourself.

Last Step:

Go to the SPA and enjoy the time you have saved. (Since a form like this can be build in 30 mins, and about 60-90 mins without the liferay-service-provider.js ) No Java, no Jenkins, no Maven, no ....  just Vanilla Liferay and some basic HTML and Javascript.

I'm eager to hear from other people and experiences. Please share any Ideas, Comments and Feedback you might have.

Charles Lam 2016-09-30T15:15:25Z
Categories: CMS, ECM

Mobile First with Liferay Screens – part 3 The future

Liferay - Thu, 09/29/2016 - 08:05

This blog is part of a series of entries on Mobile First with Liferay Screens. [Part 1] [Part 2] [Part 3]



Mobile First with Liferay Screens – part 3
The future


The world of mobile is on the move and users are always ready to move with it. Keeping up with every development is a difficult task for organizations. In Part 1 of this blog series, we described how Liferay Screens can provide a head start with this. Part 2 was about Phlink, the native mobile app we developed with the help of this tool for healthcare provider Philadelphia. How do we see the future of our mobile apps and what further plans do we have with Liferay Screens? Read this third and last part to find out.


Visit our roadshow on 13 October

Would you like to find out more about the possibilities of our native mobile apps on the basis of Liferay Screens? Then visit our roadshow on 13 October in Spaces Amsterdam. Registration is now open!


Liferay Digital Experience Platform

Prepare your business, Create experiences and Understand customers; this is the course Liferay has chosen with the new Liferay Digital Experience Platform. The goal of Liferay DXP is to offer users a digital experience, in which they can shape their customer journey themselves. The platform makes it possible for you as an organization to communicate more effectively and more often with your users and really 'listen' to them, so that you understand what their needs are. You can then transform this insight into action, providing the right information and functionality at the right moment. Users then make a choice from what is offered and create their own digital world.


Although it has its roots in the familiar Liferay Portal, the Liferay Digital Experience Platform puts an end to thinking in terms of portals and intranet. Liferay DXP is a platform solution, and that platform includes mobile devices along with the web interface. Many users communicate primarily via their smartphone or tablet and so the creation of a digital experience also means: the development of mobile apps.

Liferay Screens

The Liferay Screens development tool makes it possible to use the features of the Liferay Digital Experience platform in native mobile apps. This means the content for all devices and applications is delivered by the same platform and we can provide users with a consistent personalized user journey - from desktop to smartphone and tablet - on the basis of aggregate behavior towards predictable requirements.


Componence was able to thoroughly explore the opportunities and possibilities offered by Liferay Screens during the development process of the Phlink app. As described in part 2 of this series, we devoted a great deal of time and energy to the expansion and improvement of Liferay Screens. This resulted in several modified screenlets and a large number of new ones. And as far as we are concerned, these activities will continue.


Liferay to the max

What does the future look like for our mobile apps? In the first place, we intend to use Liferay DXP to the max and take advantage of all the possibilities offered by the platform. In addition, we aim to provide access to more applications in order to satisfy the needs of the users even more. Naturally, nobody will use an app to submit an expense report, but an abstract of the administration system could certainly be interesting for a project organization. A controller might find it handy to be able to access the financial data - not to modify it but to obtain a quick overview of the situation. And the director of a company may not be interested in the flow of invoices, but would like to check the current status of figures and activities. So we will present more information and different types of information in our apps.


More interaction

The future of our mobile apps also lies in increasing interaction with the user and with devices such as iBeacon and other IoT applications in which physical objects and the virtual world come together (Internet of Things). Imagine that you regularly visit a particular branch of an organization. Then you could obtain answers to all sorts of practical questions via your app on the basis of iBeacon, geolocation or IP address. Where is the closest unoccupied workspace or computer? Where can I find an available meeting room? Where is my colleague, and is he even on the premises today? If it is your first visit to the branch, then you will want to know something about the house rules, the managers present and the closing times of the building.

Users will also interact increasingly with each other via the app. An example is the safe creation and maintenance of group chats, an important feature for healthcare workers in particular. They need to be able to communicate with each other about clients and share personal data, without losing control of this information. Users will also be able to work together in the future within temporary work groups that they set up via the app. And they can use the app to record the expertise available within the organization and find it again later.


Further with Liferay Screens

Componence is continuing to work on Liferay Screens in accordance with a roadmap based on customer wishes and our own vision of the future. So the focus is on interactive and social communication applications such as Private Messaging, Blogs and Group Chats. We will also pay attention to the support for several subsites, in-app branding, finding and creating connections, improving security, filling in forms, and day-to-day reporting.

Separately from this roadmap, Liferay will also continue to supply new screenlets, which we can then further adapt and expand. We are extremely interested in additions such as different levels of authentication, more stringent security (encrypted storage and transport), and expansion of Audience Targeting and the social applications. Componence intends to maintain its lead in the further development of Liferay Screens and will follow the course set out by Liferay with the Digital Experience Platform.


Second Screenlets Library

The collection of new screenlets developed by Componence includes familiar Liferay functionalities such as Localization, Menu, Global Search, Web Content List, Web Content Detail, Comments, Subscription, Notifications, Calendar and User Search. This second Liferay Screenlets Library therefore represents a valuable addition to the functionality offered by the standard Liferay Screens Library.

We will monitor the requirements of our customers and possibly also subscription holders in order to develop more screenlets and add these to our library. We will be happy to use these screenlets to give organizations a head start in the development of native mobile apps on the basis of Liferay Screens. Our library also contains numerous handy Liferay plug-ins, which enable us to achieve a uniform web functionality.


Basis app

Working on the Liferay Screens philosophy, Componence has developed an application framework and basis app, which we can use to quickly produce the foundation for a mobile app. This enables us to show customers a working branded app before the development stage has even begun, which will form the starting point for follow-up discussions about the business value to be added.

By continuously investing time and energy in this basis app and the related Liferay Screens Libraries, we can provide our customers extremely quickly with tailor-made native mobile apps. A strategy that makes it possible to provide continued service to organizations that already use Liferay, and to fulfil the Mobile first wishes of prospects immediately.


Social DXP App

In the near future, Componence will start working on the development of a standard Social DXP App. This will be a generic product that can satisfy the standard wishes of organizations. The Social DXP App – which will be available in the Liferay Marketplace – can be configured as required using the Liferay DXP control panel. This means functionalities and branding can be implemented as desired and combined with predefined site templates.


Visit our roadshow on 13 October

In collaboration with Liferay, we are organizing a roadshow about Mobile Ready Experiences on Thursday afternoon 13 October. An ideal opportunity for an extensive introduction to Liferay Screens and the possibilities this tool offers your organization. Be inspired by our mobile app Phlink and discover what Liferay can mean for your mobile strategy. You can register now for our roadshow in Amsterdam on 13 October!

Maarten van Heiningen 2016-09-29T13:05:28Z
Categories: CMS, ECM

My 27th of September at LSNA2016

Liferay - Tue, 09/27/2016 - 14:14

After a thirty-minute train ride sitting amidst super-excited teenagers, even the energized atmosphere of a downtown Chicago Tuesday morning seemed like a peace cloud. Anyway, got to the Hilton in good time for a bagel and creamcheese breakfast and an aromatic Colombian brew before Sergio's session.


Create Amazing Web Services with Liferay DXP (Sergio Gonzalez)
  • APIs are first class citizens
  • Cons of current web service APIs.
  • Configure a REST end point in Control Panel to expose a web service suite.

A simple BasicJAXRSSampleApplication class definition.

  • This class is an OSGI component.
  • Has a getSingletons() method.
  • Pretty standard REST servlet container with the usual annotations, bells and whistles.
  • Classic JAXB for XML<->Object model conversion, with freedom to define your own MessageBodyReader and MessageBodyWriter.
  • Swagger for REST documentation
  • Standard JAX-RS annotation-driven marshalling (to XML or JSON) as well as pagination for each web service request.
  • Demo'ed a nifty cURL-initiated request that posted an image to the document repository using a web service. The cool part was when he tweaked the service to set assetTagNames via the ServiceContext taking a comma-separated set of tag names from the web service invocation’s query params.
  • Decouple the internal logic of the service from the exposed contract.
  Taking Complete Control of Product Navigation in Liferay DXP (Julio Camarero)

“How many of you remember dockbar? How many remember Control Panel? Site Administration? Okay, all of that has been revamped in DXP.”

  • New Control menu is the one menu to rule them all.
  • New Product menu now includes the Control Panel, Site Administration and all configuration menus.
  • New User Personal Bar
  • New Simulation menu

New concept of Product Themes – themes for the product navigation. Traditional themes are now referred to as Site Themes.

Julio demonstrated the ease with which a new tool/widget can be coded that attaches itself to a particular location in an existing control menu.

“You can have this class in your application/module/anywhere. Liferay will find it and use it.”


Guest Keynote: Why Customer Experience! (Mark Grannan)

Mark made a pretty compelling case for investment in customer experience. This presentation is for you if you’re having trouble seeing why customer experience is even necessary. The experiential sailing analogy was super interesting. Customer experience has to be balanced with digital operational excellence to harness a fly-wheel effect and propel towards the end goal.


Pulse Awards

I was very pleased to be included in the awardee list for Individual Contributor of the Year for 2016.

Thanks, Liferay, for the recognition.

Thanks, Apollo, for the support and a fostering work environment.

Congratulations to all the other awardees. I'm honored to be among you.



The big highlight at lunch was not the food (don't get me wrong - great food!). Rather, it was a 4-minute conversation I had over lunch with the very talented Julio Camarero.

I pretty much described a content SEO issue I was hoping to have a work-around for, and he, right there, between mouthfuls of baked trout and asparagus, described a hook style fix for me, only asking for some time to recall the actual artifact that would need to be tweaked.

Extreme programming minus keyboard! 


The Changing Face of SEO (Corbin Murakami)

Corbin began with a sombre reminder.

“Don’t forget about SEO”

  • Distinguished between strategic and technical SEO.
  • Google increasingly rewards good UX
  • Google Knowledge Graphs
  • to find structure data
  • Optimize site structure from a search implications perspective

Corbin has got to be one of the (if not the) funniest speakers at the conference. Oh, and did leave us with a relevant reminder.

“Don’t forget about SEO”


Search Intelligently Using Elastic Search (Andre Oliveira)

I just knew it when Andre spoke in his dreamy low tones that there was something hot bubbling beneath the surface.

He began with a nice survey of the search landscape.

  • The Search-Centric Digital Experience
  • Multi-asset searching (already available), but each asset can lead to a different user journey
  • Go beyond grammar and spelling in search suggestions; think invisible search network of previously made decisions/choices

And then came the demo.

There is a whole bunch of features enabled by default in the new out-of-the-box Search portlet. Can be whittled down to meet requirements.

Search portlet is still instantiable, but you can have multiple search pages in a site.

Andre built a new search view by dragging and dropping a search bar, search result lists, a few facets, a map,…WHOA!

And then he searched for all potholes in Boston. (I didn’t even know you could geolocate those.)

Another awesome presentation!

Additional search features include autocomplete readiness

Best approach with DXP is to have an external search engine running alongside - that's where Elastic Search comes in. 

  • REST API extensible with OSGI
  • explore the best query for results relevance
  • visualization with Kibana
  • (just watch the presentation when it becomes available ...lot more here)



How Graph Theory Helps the Development of Liferay's Publication Tools (Máté Thurzó)

Mate provided a fantastic “got button, need shirt to sew it on” scenario when the design team found that at the heart of the publication process is a graph of publishable data. But they had to think afresh as to how the graph nature of the publication data lent itself to the actual publication process.

This landed up being a theoretical journey into graph theory with some cool insights into the topological ordering algorithms underlying the content publication process used by Liferay.

A beast called the Coffman-Graham algorithm fosters the possibility of parallel processing, validation before the publication process begins, some prediction (probably to optimize a publication plan before execution), etc.

Great presentation if you're up for a theoretical discussion, or want to get into the inner workings of the Staging/Publication process.

Oh, and Liferay has a Neo4j driver, available on github.


Closing Keynote

It was a sombre keynote (and I was glad for it) with Bryan interviewing the Founder of Rahab's Daughers, a local Chicago non-profit that "aims to spread awareness about the underrated problem of human trafficking within the United States".

Exemplars of courage. Amazing work!

-- -- -- -- -- -- -- --

It's been a fun two days. Got some ideas swimming around my head, and a casual conversation with my boss seems to suggest I can install DXP on a dev node and start experiementing with some of the goodness I've had the chance to hear about over these last two days. 

Javeed Chida 2016-09-27T19:14:54Z
Categories: CMS, ECM

Liferay Symposium North America 2016 - Tuesday's Live Blog

Liferay - Mon, 09/26/2016 - 17:01

Welcome to the Liferay Symposium North America 2016 Live Blog! If you've never followed one of these live blogs before, the content runs in reverse chronological order so that people following live can just refresh the page and see the latest on top.

Presentation slides will be available in about two weeks (as of 9/27/16). Check

(Looking for Monday's blog? Here you go!)


That's it! Thanks for following along. For those of you who made it out to Chicago, safe travels home and we hope to see you next year!

4:00pm - Closing Keynote - Bryan Cheung, Liferay

Henry Nakamura started the final session with the raffle drawing for the exhibit hall gameboards. Attendees won an Apple Watch and an Amazon Echo.

After, Bryan Cheung came up to close out the event. He brought up a Liferay employee, Sam (founder of Rahab's Daughters) and Darnesha (a survivor of human trafficking), to share about their experiences.

As a survivor of human trafficking, Sam started Rahab's Daughters to provide holistic help to survivors that lets them see a life after being trafficked. The team at Rahab's Daughters goes out on the streets of Chicago every week to try and build relationships with victims, so that they can see that the organization is trustworthy. They also have a safehouse that provides shelter to the women they help.

Darnesha hopes to study Psychology so that she can help others, the way that Sam has helped her. She shared that she wants to teach girls that nothing can hold them back, and they have the ability to do anything they set their minds to. 

The backpacks that we collected and filled during Symposium will be given to the women who come to Rahab's Daughters. When rescued, survivors usually leave all their possessions behind. We can tangibly care for these women during their new start by providing backpacks filled with toiletries and other necessities.

You can learn more about Rahab's Daughters and how to help stop human trafficking at their website:

3:20pm - Digital Transformation in Government, Glenn Saler, Liferay

Glenn Saler shared about Liferay's work with US government agencies and its partnership with Carahsoft, a technology solutions provider for government. Carahsoft is a GSA Schedule holder for Liferay and an open source catalyst that has experience providing resources that help agencies navigate open source communities for the first time.


- Government agencies at every level have received mandates to go digital and innovate new ways to serve its citizens. Use cases for Liferay in government include video based military training, HR and military career portals, post graduate studies portals, energy information, support of space exploration, grant tracking, informational websites, public services, cyber investigations and collaborative workspaces.

- Liferay DXP capabilities:

  • Providing a modern, unified platform to deliver digital services
  • Aiding digital transformation through tools that facilitate government work for employees
  • Benchmarked as one of the industry's most secure platforms

Case Studies:

  • Illinois Student Assistance Commission - ISAC runs two portals on Liferay, one for students and one for employees to collaborate with universities. They manage the grant process for the state of Illinois and facilitate the process of making college more affordable to students (read more here).
  • - Liferay enabled to integrate 17 different legacy solutions into one platform and streamline the search functionality. Most importantly, they were able to implement the new project in only 6 months (read more here).
  • - Alex Kim, one of the implementers from SSAI for this project, shared about The GLOBE Program is a worldwide organization that encourages students to get excited about earth science. Schools organize projects to measure the temperature, look at clouds, measure rainfall, etc. and students are able to upload their work to the site. Currently, the website supports over 30,000 organizations and over 100,000 monthly visitors (read more here).

  • Finnish Ministry of Social Affairs & Health - There has been wide adoption of Liferay throughout the Finnish government. The digital services that the government is building with Liferay reach 5,000,000+ Finnish citizens. For the Ministry of Social Affairs & Health, Arcusys (a Liferay partner) combined 10+ separate governmental organization and campaign sites under one Liferay environment (example case -
  • Online Training Portal for OmaKanta - The Finnish government is also pushing for a national centralized health record system, called OmaKanta. This change requires training 200,000+ health care professionals throughout Finland to use the new digital system. The OmaKanta training solution was built on Liferay and Valamis and significantly lowers training costs. It also makes it easier to update training as needed and ensure that the current information is pushed to users immediately.

2:30pm - Case Study: Digitizing Communications Across 1,000+ Coach Stores - Adrienne Sweeney and Madhukar Kakaraparthi, COACH, Inc.

Coach first implemented Liferay in 2012 as the global intranet. Today, they are going to talk about the VM Insights tool, which they created in order to simplify and consolidate communication between Coach stores and the corporate team.


- Coach has become a global company, and its stores are at the heart of its business. As they grow, communication is becoming more challenging. They use too many tools, processes aren't aligned, and in-store employees end up frustrated by solution overload.

- They had one focus: Simplify + Consolidate + Engage

- Visual Merchandising (VM) is a large part of retail. A Visual Merchandiser coordinates the display exhibits in all parts of a retail store. Coach wanted consistency in stores across the globe so that customers always recognize the feel of a Coach store.

- VM is done via high-resolution PDFs distributed to stores as a guide for them to implement. Coach wanted to digitize this process and give store employees a digital tool that shows them the latest guidelines. The corporate headquarters also needed a way to confirm that the stores had been set up according to guidelines, as well as a way to respond to any questions or challenges that come up.

Before Liferay:

With Liferay, Coach was able to:

  • Consolidate 11 regional tools onto 1 global platform.
  • Stop printing and mailing VM PDFs, which saved 1.4 million sheets of paper and over $500,000 annually.
  • Create one global process with two-way collaboration between corporate and stores across geographies.
  • Design a visually appealing and useful site for their employees (This is the VM team, after all. The final tool needed to be beautiful to match their high standards).

Project Highlights:

  • Built on Liferay 6.2
  • 6 month implementation time
  • Currently have a Liferay DXP proof of concept in progress to see where they can take the tool next

VM Insights: How It Works

  • Stores can access guidelines from the homepage, as well as search to find them quickly. A doc previewer makes it faster to view documents, which was previously a problem due to slow network connections within stores.
  • The out-of-the-box Notifications portlet allows them to alert stores as soon as new guidelines are available, ensuring that communication doesn't fall through the cracks.
  • When the store finishes setting up, they send photos back to corporate, where the VM team reviews and adds comments as needed.


Madhukar also went through a live demo of the tool (using both a laptop and a tablet), showing us a typical workflow for the VM team when they publish new guidelines.

1:50pm - Enhanced Theming With Lexicon - Rob Frampton, Liferay

Rob Frampton is a front-end developer at Liferay and works on many of our theming tools, including Liferay Lexicon.

What is Lexicon?

- Lexicon is Liferay's "Experience Language". You can think of it as style guidelines used to design Liferay DXP's components.

- Lexicon is built on top of Bootstrap, extending its current components and adding new ones.

Theme Architecture

- Any theme in Liferay begins with an unstyled theme. It will deploy, but the Lexicon files aren't implemented. 

- When a styled theme is deployed, it saves over the unstyled theme and replaces the CSS so that the page is now usable, rather than static HTML.

- On top of that, you can write a custom theme that will overwrite any files in Bootstrap and Lexicon as needed. This is an incredibly powerful tool that makes Liferay endlessly customizable.

Leveraging Taglibs

- Taglibs are reusable tags that exist within Liferay DXP. These render Lexicon markup, so that you don't need to look up documentation to implement Lexicon components. 

Customizing Lexicon

- Lexicon allows customization for the core styling, meaning that you can change how Bootstrap and Lexicon look without writing new stylers (I have to admit, this talk is a little over my head, but I think I wrote this statement down verbatim).

Here are some examples of what you can accomplish with only a few changes to variables. The developers for Lexicon have tried to make variables for everything you might want to change in different components, hopefully making it easy for you to customize your site design as much as you want.



In Liferay DXP, when you're designing your theme, you're really styling for Lexicon. But no one wants to spend hours digging through source files and trying to see all the variables they can change... which is why Rob built the Lexicon Customizer.

Components are on the left and Variables are on the right.  Below the Lexicon and Bootstrap elements, you can edit components and see the effect in the Preview pane in the middle. In the slide above, you can see how Rob was able to bring up a color picker to change the look of the green alert. When you're done, export the code and you're good to go (you can see the menu to do this in the top right corner, the three white dots). Rob also walked the group through a couple different workflows for deploying any changes you make.

You can download the Lexicon Customizer at

1:10pm - Must-Have Strategies for Your Website Redesign (Lessons From the Upgrade) - Ryan Schuhler, Liferay

What decisions do you need to make for the upgrade process? What challenges will you run into? Using as a case study, Ryan Schuhler went through lessons our Web Team learned during the upgrade from Liferay 6.1 to 6.2.


- You should consider upgrading or redesigning if:

  • Your site feels dated
  • Your users get lost or feel confused on the site
  • Your site pages feel inconsistent
  • Every time you need a new page, it feels like you're creating everything from scratch. Site redesign isn't just for end users. It also benefits those who are in charge of upkeep.

- Pros:

  • New features
  • Improvement (especially as Liferay continues to add more functionality in new versions)

- Cons:

  • Cost (Time, money and resources)
  • Change (It's difficult to get people excited about better UX, because it means that their process will need to change)

- Stories from, including our process, planning and implementation:

  • Ryan shared how the team created a new design for features pages, but wasn't able to implement it until the upgrade. Lesson learned: you need to balance your current work alongside the upgrade. In this case, the team found a way to create a similar page style on the old version of the website, so that they could get the new design live immediately.
  • One goal for the new site was to funnel and focus our users during their interactions with our websites. This formed the basis of the navigation redesign. Lesson learned: Set limits for navigation ahead of time, so that the site remains manageable in the future. For, they decided to make navigation no more than 3 levels deep.
  • No matter what, if you're using custom portlets, you'll need to update them when you upgrade to a new Liferay version. The Liferay team had an extra layer of complexity because the new website was being developed on a new instance. Lesson learned: Migrate portlets in chunks. First do the minimum amount of work necessary and delay the rest until things are more stable.
  • When the Web Team created a new instance, they created a number of new subdomains. However, they forgot to take into account how this would affect SEO until our SEO analyst brought up the issue to the developers. Lesson learned: work with your SEO analyst to ensure that your upgrade process doesn't tank your SEO.

- Three things to keep in mind:

  • Incrementally improve
  • Think about User Experience
  • Remember SEO

12:50pm - Lunch

Another day, another lunch! This is your last chance to look at exhibits from our sponsors, participate in the charity activity and get your gameboard stickers.

It takes less than a minute to stuff a backpack with supplies. We're almost at 200. Help us fill the last few backpacks we have!


If you finished filling your gameboards, you can drop them off at the Registration desk. Deadline is 2pm!

11:55 am - Liferay Pulse Awards

Presented by Henry Nakamura

Best B2B Digital Experience - Murata Manufacturing

Best Intranet Experience - Domino's Pizza

Best Omnichannel Experience - AvMed 

Best Overall Digital Transformation - Volkswagen Group of America

Congratulations, everyone!

11:10 am - Liferay Product Roadmap

Our VP of Product Management, Ed Chung, is sharing about the changes in Liferay DXP and our roadmap going forward. Exciting stuff – join us next year so you don't miss out!

11:00 am - Liferay Pulse Awards

Every year, we enjoy taking the time to acknowledge our community contributors with our Liferay Pulse Awards. Jamie Sammons presented both our Community Excellence Award and our Individual Contributors of the Year. These are awarded based on number of blog posts, code contributions, new applications added to Liferay Marketplace and forum participation.

2016 Community Excellence Award Winners

2016 Individual Contributors of the Year

(I'm not sure why this photo is glowing. I'm guessing it's because our contributors are truly that amazing.)

10:20 am - Guest Keynote: Why Customer Experience? What Should Digital Leaders About it? - Mark Grannan, Forrester Research

Mark Grannan works as an analyst for Forrester Research with AD&D professionals, helping them understand customer experience and how it can benefit their business.

What is Customer Experience?

- Forrester's CX Index measures effectiveness, ease and emotion of customer experience. These three qualities contribute to customer loyalty, which is built on retention, enrichment and advocacy. Using this index, Forrester is able to measure the quality of customer experience today.

- This slide makes it clear that investing in CX and doing well has huge advantages to your business.

- However, companies in the "Leaders" category have gone out of business in the past ten years, and companies in the "Laggards" category have had great success. There are external factors at play that make it very difficult to measure the true impact of customer experience.

- The question we need to ask is, Does customer experience really drive revenue growth?

- It's easier to find a clear picture when you compare competitors within the same industry:

- This even applies overseas. TalkTalk is a UK equivalent of Comcast and had a data breach that affected customer experience.

- What does this mean for you? What can you do with this information?

  • Map yourself and competitors (see the Apollo Education Group case study from Monday's live blog)
  • Honestly assess your potential (How does your company make money today? Can your company enable experimentation around CX?)
  • Craft your CX strategy (Break from the pack, dominate a segment, ride the disruption)

- How do you use Customer Experience to move my Digital Experience agenda forward? 

  • Look at every step of a customer's journey. We talked about this during our final session yesterday on the need for a holistic customer lifecycle dashboard. The goal today is to optimize the journey, not individual touchpoints. Yes, individual touchpoints need to be excellent, but everything needs to contribute to the overall customer experience.

- The return of the Bell Curve:

- Adopters and Collaborators make up the bulk of the market today. Differentiators – those who are creating new digital products – are still rare. It's hard to create new products and still pay attention to the rest of your business. Companies need to master both sides of digital – Digital Customer Experience and Digital Operational Excellence.

Three Key Takeaways:

- Remember the three "e's" of Customer Experience: Effectiveness, Ease and Emotion.

- Customer Experience is linked to revenue when customers have options and there is Customer Experience differentiation in a market.

- Customer Experience + Digital Operational Experience = "How" to move Digital Experience forward.

9:40 am - Building Deeper Customer Relationships With Audience Targeting - Evan Thibodeau, Liferay

Personalization matters. When experiences are personalized for us, they are transformed into more engaging moments that we remember.


- Audience Targeting allows you to segment users in order to cater content to them according to their activity and identity. Each user is unique, and segmentation allows you to deliver more personalized experiences.

- Campaigns allow you to apply priority, start and end dates, as well as custom reports to your user segments. These three things together – Audience Targeting, Segmentation and Campaigns – give you the ability to control personalized experiences for your customers.

Retail Demo: Finer Cloth (a fictitious brand)

We followed one user, Ray, through his full customer journey with Finer Cloth. Here are the highlights of the demo:

First visit to the website, when we don't yet know anything about Ray. For now, the site shows both men's and women's clothing.

After signing up, we gain some information about Ray and are able to show him a new home page, filled with items that he is most likely to be interested in.

Ray ignores our fall campaign for socks and starts looking at suits instead. Because he is signed in, we're able to track that information and show him this page the next time he visits the website:

But that isn't where the journey ends! We've been talking the past two days about getting to the heart of customer experience, and that goes beyond the initial purchase. What else can we offer Ray? How can we continue to deliver personalized experiences that match his interests and needs?

Evan also showed us how an admin can create these kinds of experiences with Liferay's Audience Targeting module. If you followed along with yesterday's QAD case study, you already saw a short preview of how this works. The retail example may be familiar to you, but examples like QAD show that Audience Targeting is useful for many situations. Think of a typical intranet: the majority of content is irrelevant to the majority of users, because it isn't personalized to their role within the company. That's where audience targeting can help, by serving up the relevant content as needed based on audience segments.

9:00 am - Create Once, Use Everywhere: Maximizing Your Content in Mobile - Javier Gamarra, Liferay

Javier Gamarra works in Liferay's Madrid office and is a Senior Software Engineer working on Liferay Screens. The goal of Screens is to create a single source publishing tool, one CMS for all app and web channels. Javier shared in-depth examples of the new features in Liferay Screens 2.0. If you like to see the technical details of how Liferay Screens does what it does, this session is definitely one to review on the Recap site.


- Content is king. Users today expect to be able to access content everywhere, in every form and at anytime. Millennials in particular have broken the traditional loyalty loop, and now want content to be personalized to every form factor.

- Because of new connected devices, today is a wonderful time to be alive, but a huge pain for developers. We need to find ways to create content once and use it everywhere, in order to save time. Javier explained that this is called COPE = Create Once, Publish Everywhere.

- How to COPE?

  • Separate content from display
  • Ensure content modularity and portability
  • Build Content Management Systems, not WPT. You should have the ability to present content in any format at any time.
  • Build digital experiences across web, mobile and connected devices in order to meet customer expectations.

- New Features in Liferay Screens 2.0 (this is just a quick preview – Javier went through a lot of material!)

  • Objective for screens is easing the development for native applications.
  • Asset Display
  • Gallery that can expose new views with same content
  • Reusable code between apps
  • Structured content
  • New themes to apply to apps

8:50 am

Good morning! Grab your coffee and settle in, because we have another full day of great sessions to looks forward to. We should be starting in a few minutes.

Christine Reyes 2016-09-26T22:01:01Z
Categories: CMS, ECM

My 26th of September at LSNA2016

Liferay - Mon, 09/26/2016 - 16:14

Here's a running note dump of my day 1 at Liferay Symposium North America 2016, here in Chicago.

This is just to pique your curiosity if you couldn't make it out here AND your interests happen to match mine. Wait for the slide decks and presentations to be shared by Liferay so you get it all.

Keynote (Bryan Cheung)

Bryan did it again, making his point with the same efficiency he preaches. I recalled his keynote from 2015 where he began with a heart-warming picture of children interacting with technology at Disney World, and came full circle with a sobering and grounding message not to lose track of what really matters as we embark on our digital ventures.

This year, Bryan took us through a history lesson on the culture of design – one that cuts across all industries – whereby the average and median population has traditionally been targeted. The challenge he left us with was to heed the need to design to the edges, so that our designs, while scaling for the majority, do not neglect the minority and certainly not the “jagged” reality of the majority as well.

Lots to think about. Relevant keynote.


New Features in Audience Targeting 2.0 – Liferay DXP (Julio Camarero) Prospects: Converting users who are not yet customers
  • Define segments (audience definitions)
  • Fully renovated UI/UX
  • Create/manage user segments and campaigns
  • Users compartmentalized using:
    • IP addresses
    • Language rules
  • Custom fields
  • Take audience to form to capture as a lead
Recent inactive clients
  • Reports by user segment
  • Excel export capabilities
  • Asset Publisher integration
    • Enable user segment filtering feature in the new Asset Publisher configuration
  • New Simulation experience for user segment matches
Engaging customers
  • Improved campaigns
  • Multiple user segments
  • Campaign-specific content display
  • Measuring via reporting

“I want to check:

How many people watched the banner on the home page

How many people clicked on the link on the home page

How many typed into the form

How many actually completed and submitted the form


Audience Targeting is a framework – fully extensible to meet specific company requirements. Rules tutorials that show how to segment users based on custom rules are available on the wiki, etc.

Experimental app demonstrating:
  • Segment users based on mail keywords (keywords from emails they receive)
  • Targeting users by mood

I was really impressed by the experimental mood-driven targeting app that Julio demonstrated. No better way to say the sky is the limit than show a great (albeit forced) example.

Good stuff!


The ROI of Modularity (Ray Auge)

Ray’s gentle introduction to the struggle behind “IT’s platform for diversification” started to get my attention when he said “coupling exists in the IT industry at many levels, not just between one piece of code and another piece of code…”.

I thought this was a really fresh perspective on thinking about ROI for everyone – from programmers (IT decision makers), all the way up (or out) to executive decision makers.

The real takeaway from Ray’s presentation was to understand the importance of decoupling at ALL levels of IT development through delivery. My paraphrased bullet points are below.

  • Virtualization (decoupling inter-system dependencies and gaining virtual )
  • Polyglot (decoupling developers affinity to implementation language preferences)
  • Microservices ( decoupling systems by adopting clearly documented and stringent contracts between the moving parts)
  • Continuous delivery (decoupling from the unpredictability/variances of time)
  • Modularity (taking different deliverables, mixing them up and being able to get a return on the summation, doing it smartly appears to be the challenge)

“Reinventing yourself every few years is bloody costly”

  Leading Your Company’s Digital Transformation (Brian Laird)

I’ve got to say. My boss’s boss’s boss is a fantastic talker. That’s likely not going to impact my raise any, but hey, it IS true!

You should check out this presentation if you are an IT thinker/professional who may be accustomed to thinking about change inside out, with IT as your greatest influencer. Brian forces a broader thinking mindset, outlining the main drivers for digital transformation. Great talk for IT entrepreneurs and decision-makers alike.



Glorious whitefish! What else is there to say!

<insert picture here I was too busy eating to snap a picture of my plate. By the time I realized that, the food was all gone./>

  Building a Culture of Trust, with Slack (Andrew Gruhn, Jay Landro)

If there was one presentation for a developer to attend at LSNA16, I think it would have to be this one. I think…

I had heard of Slack from a developer friend and even used it a little bit in the last year with a closed group of friends, but man, the good stuff is beneath the surface.

Andrew introduced Slack features real quick in the light of how his team used slack channels as a step toward dispelling the absolute absence of phatic communication in globally distributed teams.

“Slack is a javascript web app wrapped in electron.”

  • Slack provides integrations with well-known application stacks out three. E.g. Github, giffy. Great use case is when continuous integration can notify an integrated Slack group.
  • Rise of integrations as a service: IFTTT (IF This Then That) and Zapier.
  • They demonstrated a channel named #designideation which showed pictures they snapshotted using the camera from IFTTT.
  • Use of web hooks to setup a simple integration: being able to type a command to slackbot and then have the web hook propagate to another integrated system. E.g. QA person type a command to slackbot which (via a web hook) triggered a build and deployment to the QA servers.
  • Use of Liferay IO – a microservices host – that can be used to expose select operations. These operations could service commands sent to slackbot.
  • A framework for bots: “Slackbot is the language parsing tool within slack.” Worth checking out the “When someone says” and “Slackbot responds” mapping tool feature of Slackbot.
  • A LiferayBot implementation that could be queried by commands via Slack. E.g. “@liferay-bot search for xyz” causes the LiferayBot to perform the search and return a URL to the Search Results on a Liferay DXP instance.



Boost Your Productivity with Web Experience Manager in Liferay DXP

This session was mostly a look at the Control menu in Liferay DXP.

The dockbar has been overhauled. Repeat. The dockbar has been overhauled.

Lots of improvements to navigating around Control Panel and User Account settings. Much improved UX.

Content Authoring improvements include:

  • ease in comparing historic versions of content
  • image selector enhancements (pull an image from a URL and drag-and-drop, inline image editing)
  • a new priority field that can be set in Asset Publisher to bring certain content with higher priority at the top of results
  • new “Restrictions” feature that lets you define what structures can be used for content in a specified folder. (this is pretty cool)
  • new page type called “Page set”. If a page is of type Page Set, then it does not get rendered as a link and gets treated as a true container. Thus we don’t need a hack to make it unclickable. Page sets are not clickable. Sweet!
  • ADTs for breadcrumb and navigation now available (I’ve only ever used Asset Publisher, time I dug into the other ones)
  • A theme can now have a decorator set for it – out of box nifty displays
  • Publishing simplified
  • LAR properties – delete (LAR) on success/failure.

Questions I asked:

  • There is a Restrictions API, right?
    • Not sure.
  • Have you looked into versioning templates?
    • No. (I would love this feature. Note to self to request it via JIRA.)

Jose Dominguez was super-welcoming of emails. Nice, tight presentation.

Coffee break!

Decadent Ice cream brownie. WHAT!?!?

So good.


Protect Your Data! Securing Your Liferay Instance

“One does not simply walk into Mordor”

That is how you begin a discussion of security. Not that the evil lord Sauron is an ideal example of an IT Director persona (no offence meant).

That’s how Jeff Handa began his presentation as he walked through a breadth-first list of common Infrastructure precautions and best practices.

Liferay is just on top of whatever foundation platform we have chosen. So pick a supported platform that is familiar, patched, and monitored.

  Upgrading and Redesigning Websites (Ryan Schuhler)

Ryan  talked through the madness of a UI/UX upgrade on top of an actual version upgrade of

“What have I done?”

You know, he mentioned that every upgrade and redesign effort often feels like an existential crisis. For my part, and maybe this says too much about myself, but I have experienced existential crises of earth-shattering proportions with something as simple as a cut-and-paste operation. Again, that’s just me.

He shared a nice checklist of questions to ask yourself before embarking on a redesign/upgrade effort. Lots of good common-sense tips and spectrum of UX options to consider. Great talk for UX designers and primarily front-end developers.

- - - - 

Got to catch the train out. Will post tomorrow's notes... tomorrow!

Javeed Chida 2016-09-26T21:14:15Z
Categories: CMS, ECM

Define Websocket Server Endpoints using Liferay Websocket Whiteboard

Liferay - Mon, 09/26/2016 - 06:13
Define Websocket Server Endpoints using Liferay Websocket Whiteboard

JSR 356 is the Java API for Websocket. It defines the standard way to create Websocket client and server endpoits in Java. In this blog we are going to describe how you can register websocket server endpoints in a OSGi container using Liferay Websocket Whiteboard

What is Liferay Websocket Whiteboard?

The Liferay Websocket Whiteboard is a simple module which allows you to define new Websocket server endpoints as regular OSGi services.

We are still going through the peer review process so, at the time of this writing, some of the features could not be in master branch yet. How do you register a Websocket server endpoint with Liferay Websocket Whiteboard? Include dependencies

First of all you will need to add the Liferay Websocket Whiteboard dependency to your project.

For now we have not published the dependencies in our nexus, so you need to create the needed jars from the source code (run gradle install in the websocket folder).

In the near future, once we publish the artifacts to our public Nexus repo, you will just need to add the dependencies in your build file, as shown below:

com.liferay:com.liferay.websocket.whiteboard:1.0.0 com.liferay:com.liferay.websocket.whiteboard.spifly.fragment:1.0.0 Configure your Liferay OSGi Container

If you are going to define your new websocket server endpoint in Liferay 7, anything special needs to be done, all the required infrastrcuture is already provided.

Configure your NonLiferay OSGi Container

If you are going to register your server endpoint in a standalone OSGi Container, you will need to register a javax.servlet.ServletContext service with the property set to true.

Here you can see an example of how to register a ServletContext service with the property set to TRUE:

Dictionary<String, Object> servletContextProps = new Hashtable<String, Object>(); servletContextProps.put("", Boolean.TRUE); bundleContext.registerService(ServletContext.class, servletContext, servletContextProps); Define server endpoints

Now your are ready to create your first Websocket server endpoint. For now we don't support the Annotation-Driven Approach version, only the Interface-Driven Approach is supported.

If you want to  create a websocket Server endpoint you only need to register a OSGi Service for javax.websocket.Endpoint.class with the following properties:

org.osgi.htto.websocket.endpoint.path: required, the path for the websocket.

Here you can see an example of how to register a server Endpoint service using Declarative Services:

@Component( immediate = true, property = {"org.osgi.http.websocket.endpoint.path=/echo"}, service = Endpoint.class ) public class EchoWebSocketEndpoint extends Endpoint { @Override public void onOpen(final Session session, EndpointConfig endpointConfig) { session.addMessageHandler( new MessageHandler.Whole<String>() { @Override public void onMessage(String text) { try { RemoteEndpoint.Basic remoteEndpoint = session.getBasicRemote(); remoteEndpoint.sendText(text); } catch (IOException ioe) { throw new RuntimeException(ioe); } } }); } } See also

JSR 356

Websocket server endpoints

Cristina Gonzalez 2016-09-26T11:13:22Z
Categories: CMS, ECM

Liferay Symposium North America 2016 - Monday's Live Blog

Liferay - Sun, 09/25/2016 - 22:14

Welcome to the Liferay Symposium North America 2016 Live Blog! If you've never followed one of these live blogs before, the content runs in reverse chronological order so that people following live can just refresh the page and see the latest on top.


5:00 pm

That's it for today! Tuesday's live blogging starts here at 9:00 am.

4:30 pm - The Customer Lifecycle Dashboard of the Future - Jason Chang and Mark Hensley, Liferay

One more session until the day is over! Jason Chang and Mark Hensley both work with the Marketing department at Liferay. As marketers, they're here to share how IT can partner with Marketing to support customers across the full lifecycle.


- We need a dashboard that has a full view of the customer lifecycle. What it actually looks like will vary from company to company; the important part is how you build it and how you use it.

- Digital transformation should be guided by a customer-centric digital strategy – not a marketing strategy, and not a customer service strategy.

- The traditional customer journey is department-centric. As customers move through their journey, they are passed off from Marketing to Sales to Support and eventually to Community.

- Customers don't see companies in terms of departments; they just see one brand experience. The customer lifecycle dashboard isn't about a prettier UI. It's about having visibility into the entire lifecycle regardless of your role in the organization.

Jason and Mark offered some hypotheses for how to get out of these traditional boundaries:

- Improve customer loyalty and retention. Look at percentage of customers onboarded, percentage of customers trained, low/no support ticket counts as things that you can look at in order to prepare for future problems. For example, in Liferay, if customers don't hit project milestones within the first 90 days, there is a high percentage that they will not renew their subscription. Part of our job is to make sure that their onboarding goes smoothly, so that they continue to have a good experience with Liferay.

- Sharing retention and loyalty metrics between Sales, Training and Support ensures that no one has fallen through the cracks. Again, using Liferay as an example, if training goes well, the number of tickets that Support sees should decrease, because customers have been educated well on how to use the software.

- Marketing can additionally contribute by targeting content, not just to prospects, but to customers during the onboarding and training process as well. Additionally, they could contribute to building loyalty by targeting content about new features and upgrades to existing customers.

They also shared a table of recommended metrics, how to diagnose them, and opportunities to improve customer experience. You can see from the picture that it had a lot of information in very small text! Make sure to check it out on the Recap site in a few weeks:

3:50 pm - Case Study: Building a Foundation for Healthcare Transformation - Deepesh Chandra, Mount Sinai Health System

Mount Sinai is based out of New York City. They own 7 hospitals, 1 medical school with 15 institutes and 12 ambulatory practices. Their goal is to drive innovation and research in healthcare, and they consider themselves champions of technology in their field.


- The healthcare industry is based on volume (if a doctor sees a patient ten times, she gets paid ten times). There is no incentive to keep patients out of the healthcare system.

- Today's question is, How do we sustain a healthier system going forward?

Changes you will see in the next 5 years:

  • Health insurance utilization will continue to increase, while available funds continues to decrease (in terms of medical spend per capita).
  • Demand for services is increasing due to an aging population, an increasingly unhealthy population and general medical inflation.
  • Many large practices will merge or go out of practice due to the strain of financial and clinical transformations.

- DSRIP is New York's Delivery System Reform Incentive Payment program and aims to transform the state's delivery system, so that the demand for healthcare services goes down. This would be done by coordinating with community care to prevent the need for acute or emergency care services, which are always more expensive.

- Mount Sinai is approaching this by building Community Care Hubs around New York. The idea is that any patient living within this "hub" will be connected with community care options. Under the hood, this will all be powered by IT so that providers are working with one another, and have the right information at the right time. The technology even enables them to go on the field through mobile services.

- Ultimately, healthcare will treat people less like patients and more like customers by filling in gaps in the system, such as providing warm handovers to housing services for a patient that is homeless. All of this coordination and collaboration within the community is built on Liferay and Okta; together, these technologies drive user experiences for Mount Sinai's community partners.

Deepesh Chandra shared a detailed overview of how Mount Sinai is creating these services with Liferay and Okta. Mount Sinai is all-in on building these hubs and implementing them into a system-wide process. "If our beds are filled, it means we've failed," one advertisement from Mount Sinai says. The ultimate goal is to use technology to provide better care to patients.

The Liferay implementation took them 6 months, and most of the work went into integrating Okta and building the necessary security layers. They are moving forward by continuing to build more applications into Liferay.

2:20 pm - Uncovering the Business Wins in Modularity, Microservices and Other Technical Megatrends - Milen Dyankov, Liferay

Milen Dyankov is a Developer Advocate at Liferay, meaning that he interacts with our community and brings their feedback into our products. It can be challenging to get the worlds of business and IT to understand one another, but it's crucial to find a way, especially when responding to technical megatrends.


- Software is now everywhere. You have to deal with it no matter what. Software is also never done. It is constantly being improved and enhanced.

- Think of racecars, which are constantly being maintained and improved. But racecars don't win races; people do. Software is the same way, and it needs a great team of people to keep it useful.

- For those of us that don't exactly understand how it works, software seems like magic.

- How much is the magic of software worth to you? Is that magic efficient? Is there better magic out there? These are the kinds of questions you should be asking about software, rather than focusing only on the end result.

- In other words, can you trust the magicians? Do you trust their integrity, their approach and their expertise?

- The problem with off-the-shelf products is that the magic is replaced by production. The result is that business users view software as an assembly line that needs to be made more efficient. It's tempting to try and implement trends (such as microservices) that aren't relevant to the software.

Milen used this image to explain the business and development perception of software:

Hopefully you can see that clearly. On top, we have a magical scene of three people floating on bright green balls of light. Below, we realize that there are more performers dressed in black controlling the balls of light. Milen explained that the bottom view is how IT teams actually make things happen, and the top is the part of software that end users usually see.

- One of the key changes in Liferay DXP is that it targets a new business problem: How do you interact with and understand customers? Liferay Portal aimed to solve integration problems, and dev teams have served up many solutions that are capable of solving this problem. Digital experiences are new ground, and software experts are working on building the magic that will solve this new challenge.

- The perfect infrastructure of today is built by unconstrained developers focused on business goals, building independently deployable, cohesive services with well defined boundaries and communication countracts, and a modular runtime with service management capabilities. Whew – that's quite a sentence. Here's a picture of the slide:

And here are three ways that you can use Liferay DXP to achieve this:



(I recommend checking out the slides when they're available for better quality images)

Milen emphasized that there's no "best" solution. It depends on your business and what you need to solve the problems you have.

"You don't pay engineers to write code, you pay them to understand subtleties and edges of the problem. The code is incidental." -Ted Dziuba

If you can trust your software team to help you, than you don't need to focus on buzzwords. You can focus on the business problems, and your team will build the solution you need.

1:40 pm - Keeping Millennials' Atten... ooh, Snapchat! - Michelle Hoshi, Liferay

Millennials! Who are they, really? Marketers talk about millennials all the time for the following reasons:

  • They are born between 1980 - 2000, which is a wide spread of people.
  • $200 Billion+ spending power by 2020.
  • Known as The Always Connected Generation, Sharing Generation, Digital Natives
  • They use multiple tech devices, everything from wearable devices to tablets. 87% of millennials use 2-3 devices every day.
  • Although they are experts at navigating technology, they have little patience with poor user experiences.
  • Authenticity is extremely important to millennials. They aren't easily moved by flashy ads or hype.
  • Millennials are also research-oriented and will usually do a lot of independent research before ever talking to a company about a purchase.

Busting the myths about millennials:

  • They're all part of the same audience. Millennials cover a 20-year age difference, meaning they can be anyone to a teenage girl to a young father with children.
  • Jumping on a Trend = Success. Selfies and emoticons are popular, but when companies try to implement them, they often fall flat for being inauthentic or gimmicky. 
  • Don't develop strong brand loyalty. Millennials who develop a relationship with brands at a young age are more likely to stay loyal as they grow older, as long as the company makes sense to them.
  • It's all about online shopping. There's an idea out there that, because millennials are so connected, everything must be online. However, they also expect offline experiences to stay connected with what they see online.

Michelle Hoshi proposed that we need to think about more than "Why Marketing to Millennials Makes Sense for Your Business." Now, the mindset has moved beyond just millennials and is driving change for other audiences as well. She shared about Hylands, a homeopathic company that used an online Pickleball campaign to build a community for the seniors using their products.

Three final takeaways to get to the heart of customer experience:

  1. Keep it individualized.
  2. Keep it simple.
  3. Keep getting feedback.

12:04 pm - Lunch time!

I would have snapped a picture of the amazing spread we had for lunch, but there's too much going on right now to focus on the food! Most of our attendees are networking with peers or sitting at our Food for Thought tables, where they can have focused conversations about Liferay products and other website-related topics.

It's a little hard to read the sign, but this group is talking about Testing Your Liferay Implementation with some of Liferay's Quality Assurance team.


It's definitely crowded in here! I was barely able to back up enough to get everyone in this picture. You can see half of Zeno Rocha's face on the right, pausing from talking to customers about WeDeploy, a new product from Liferay.


Other LSNA16 attendees are taking advantage of our speed consulting sessions...


...or spending time talking to colleagues.

If you're on-site with us, this is also a good time to participate in this year's charity activity. We're collecting supplies to put in backpacks that will be given to survivors of human trafficking. If you have extra shampoo, conditioner, etc. in your hotel room, remember to bring them downstairs so you can help with this great cause!

From the Liferay Event mobile app:

11:20 am - Case Study: Leading Your Company's Digital Transformation - Brian Laird, Apollo Education Group

Just five years ago, we wouldn't have thought we could change our thermostat from our phones. This is digital transformation: using the digital age to do things differently than we've ever done them before. Apollo Education Group is a US-based company that owns universities across the country. Higher education is growing and the number of students enrolled is expected to double over the next 10 years. In addition, the types of students are changing, as more people attend school after being part of the workforce for a few years. Brian Laird leads digital transformation at Apollo so that they will be ready for this future.


- Digital Transformation is NOT about IT. It's about looking at how technology is changing the world and seeing how business can respond.

- Uber just disrupted the taxi business five years ago, and they are already being disrupted by autonomous cars. Everyone needs to pay attention to digital transformation and innovation.

- Brian Laird shared that one key part of the transformation was to map the business processes for all of their universities. This resulted in a list of 13,000 requirements, but 80% of them were actually the same process for every university. Apollo saw an opportunity to create a standardized plan that would apply to most of their schools. This became the foundation for their digital transformation and move to a new platform.

- Why was Liferay important?

  • Time to market has greatly decreased. If the university has the content ready, Apollo's IT team can create a fully integrated student portal in 3 weeks or less.
  • Sharing of best practices is now the norm, due to the work of mapping business process. This allowed IT to templatize the initial roll out and build common components used by the schools.
  • Allowed them to jump start their mobile initiatives.

- Results:

  • The ROI paid for itself in only 2 years.
  • eCommerce now has over $60M running through it and is rapidly growing. Someone can pay online and start going to class in 2 - 3 minutes.
  • Supported 4 new institutions along with approximately 20% organic growth across the rest of schools.

- Tips for Success:

  • Understand the Digital Transformation Maturity Model (see this one by Altimeter).
  • Create a process for general IT transformation, including fixing the nuts and bolts, fixing the applications and processes, and optimizing systems.
  • Executive team needs to be completely bought in and willing to drive the change. This was the biggest driver for change.
  • Be willing to "figure it out as you go." No matter how well you plan, things may change in as little as two years.
  • Agree on what is most important to customers and the company. For Apollo, this meant understanding what millennials expect from a quality education.

Brian Laird shared even more keys to success in his slides, which will be available in a few weeks. What an incredibly in-depth look at the process of digital transformation and how to tackle the challenges every business encounters.

10:40 am - Case Study: AvMed - Delivering a Superior Health Experience with Liferay - Ana Eberhard, AvMed

AvMed was created in 1969 to provide health insurance in the aviation industry. Today, they serve over 340,000 members and have over 800 employees across the state of Florida. They call themselves a WELLfluent Lifestyle Brand, a portmanteau of "Wellness" and "Affluence". AvMed's goal is to help their members have lives that are rich in health and happiness.


- The website AvMed had was originally created inside-out, rather than needs-driven. The company decided internally that they needed to communicate information, and then it was added to the website. It lacked a storefront, a way to sell directly to consumers, because the site was built for people who were already members. On top of that, the entire website was hard-coded and not responsive for mobile.

- The new website would need a better user experience, as well as integration with portals for AvMed's 4 consituent groups. They wanted the new website to be engaging and a true home of their brand that kept people coming back.

- They began by redesigning the pre login experience and saw the following advantages:

  • Improved design appeal
  • Content updates managed through Marketing
  • Appealing "storefront"
  • Mobile responsive
  • Scalable with the Liferay platform

Keep an eye out for the recording of this presentation (which should be available in about two weeks). Ana Eberhard walked us through individual pages of the pre login and post login experience that they designed for their customers, including a personalized dashboard, information on plan-specific costs, a secure message center and other values behind AvMed's services.They have already seen $38,000 in call center savings, after only three months with the new system.

10:00 am - Case Study: Qad's Evolving Web Systems Architecture - Bob Ward, QAD

QAD is  a global ERP company that helps companies manage their supply chain, primarily manufacturing companies. QAD's IT team is always looking for better IT architecture solutions so they can improve their systems and make QAD's employees more productive. This is Bob Ward's role within the company, and he originally chose Liferay as a CMS and an integration platform.


- Every company needs to find a way to address the gap between strategy and execution.

- QAD uses Liferay internally to create Business Management views as well as Architect views, which allows them to "roll out the blueprints on the table," so to speak. They can have a clear view of their architecture when planning for the future. 

- For their project, QAD decided to use the Audience Targeting module to increase personalization for users. The goal of this project was to provided a dashboard on the account home page that was tailored to each user's needs and preferences, based on what QAD knew about them. Liferay's Audience Targeting module provided a good alternative to custom code, which would take a lot of resources to maintain as the project evolved.

- The key piece was setting up the profile with the correct customer attributes (job role, install type, etc.). From there, QAD created segments and used Audience Targeting to vary displays for each customer. The module allows you to "do whatever you want, in terms of personalization," without writing custom code. On the front end, this means that the customer will see icons for submitting new incidents, using screen share, viewing the document library, etc. There are eight different dashboards that QAD manages, and they are able to set the default view to whatever seems most appropriate to the customer, based on their profile.

-  This method of personalization enables rapid release of new features and improves the customer experience. QAD's future plans for audience targeting include aggregating more customer data for a 360 view of customers, improving messaging and communications, targeting content based on what is not included in customer profiles and hardening the infrastructure to grow capacity.

9:15 am - Opening Keynote, Bryan Cheung, Liferay

Bryan gave us an overview of how the rule of average was designed, looking at everything from the Bell Curve to the BMI that we still use today. Designing for the average helps achieve efficiency and scale, so traditionally, this idea of designing for the middle has guided innovation and manufacturing. However, no individual is ever perfectly average in every category. As Bryan said in his talk, "The world wasn't designed for you."

When we design for the average, we provide a perfect experience for no one. In business, we need to learn how to design for the edges of the Bell Curve – the individual.


- We tend to design to the average, by necessity. Remember those tiny desks you had to sit in at school (if you're from the US)? Depending on your size, you might have had to squeeze into them or sit with your knees knocking against the wooden tray. Historically, design hasn't been personalized, because we haven't had the ability to carry this out.

- "Technology allows us to design for each customer – at scale."

- Three of Liferay's customers are using technology to:

  • Deliver personal experiences. McDonald's has developed a personal intranet/extranet training site for their employees (primarily in Europe), many of whom are millennials who prefer to learn about their job on a smartphone or a computer, rather than behind a desk. The platform improved the employee experience, made people feel more connected and decreased staff turnover.
  • Help people provide personal experiences. Another of Liferay's customers, a telecom company, built a platform for their call center. Imagine being a rep at a typical call center. You finish a difficult call with a frustrated customer, and immediately have to dive into another call, bringing up multiple systems in order to try and understand what the caller's problem is. This telecom company solved this issue by creating a single view of callers, so that reps can intuitively scan a dashboard and know how to help callers in seconds.
  • Mix digital & human interactions to provide personal experiences. Gefa Bank has traditionally done very personalized, face-to-face business, such as driving to a factory, talking to their customers about their upcoming loan needs and getting a wet ink signature with a handshake. As the next generation of business leaders takes over this kind of traditional company, Gefa is looking for ways to digitize the deep technical knowledge of their staff (such as specific needs of their customers), so that they can use technology to create a more personal business model.
- "What is absolutely essential is that the CIO must be customer-oriented." - CIO of Gefa Bank. This quote may make you feel stressed or anxious about the upcoming changes in business, but Bryan shared that he sees this as an exciting opportunity. Business has always wanted to be customer-obsessed and provide perfectly tailored services. We've just never been able to do it until now.

9:00 am - Opening Keynote, Bryan Cheung, Liferay

Henry Nakamura, our master of ceremonies today, started the morning by acknowledging our customers who have been using Liferay since Portal 4.0. When one customer was asked what he loved about Liferay, he said, "We always trusted Liferay to be our platform of choice, and since the day we decided to do this, it has never failed us. Never."

This year's conference theme is "Get to the Heart of Customer Experience," which really captures some of the changes coming in Liferay DXP. In addition to sessions about DXP features, we're also looking forward to guest keynotes, case studies, a packed exhibit hall, networking and more.

This is also the first year of our Customer Connect program, which helps our customers who have similar business goals and challenges meet together to discuss how they're using Liferay to solve them. Definitely something to check out!

8:45 am

Good morning! We're almost ready to kick off the conference with an opening keynote from Liferay's CEO. Here are some of the sessions to look forward to today:

- Case Studies from 4 of Liferay's customers: QAD, AvMed, Apollo Education Group and Mount Sinai Health System

- How to discover business wins in modularity and microservices

- A discussion of how the traditional marketing dashboard is changing to help businesses see the full customer lifecycle, including metrics that offer insight on the post-sale experience 

Christine Reyes 2016-09-26T03:14:20Z
Categories: CMS, ECM

Evaluating maven based DXP modules

Liferay - Tue, 09/20/2016 - 08:31

I had this plugin for Liferay 6.2 that quite limited in terms of complexity.
A perfect candidate to try to port it to a proper DXP OSGi module, I would say.

This is probably true as long as you're willing to sacrifice your current build infrastructure and processes and adopt the new Gradle way of setting up your project.

But we have invested a lot in our automated build environment and in knowledge by our people.
This means: develop proper maven based artifacts, deployable to Nexus, versionable with the Maven release plugin, stackable with parent / super POM hierarchies, etc....

So, we'd rather stick with that.

After a day of experimenting, reading up on the current state of affairs with regards to IDEs, CLI tools (blade, Gradle buildship, BNDtools, what have you) my preliminary conclusion is not so positive:

Some guy from Portugal wrote a few blog posts on transitive dependencies in OSGi in general, and scanning over them revealed that there is no proper transitive dependency resolution/inclusion mechanism with OSGi. So solutions have to be found outside OSGi and in the domain of build tooling.

But apparently, within the Liferay ecosystem of build tooling this has not been addressed either.

David Nebinger did a clear Liferay-oriented sum-up of OSGi ways to include dependencies but this does not go as far as to include the automatic build process with having dependencies only in a single place (i.e. you'd still have to list _all_ transitive dependencies from your POM or build.gradle in bnd.bnd in order to have them shipped with your module.

So... I sincerely hope that I have to nuance my words later on, either because I have overlooked something, or that there is a maven plugin in the works that will magically solve everything...

To be continued...

Geert van der Ploeg 2016-09-20T13:31:43Z
Categories: CMS, ECM

Radio Liferay Episode 58: Jorge Ferrer continued

Liferay - Tue, 09/20/2016 - 02:22

  Two episodes (or an eternity) ago, I spoke to Jorge Ferrer, Liferay's VP of Engineering. We didn't have enough time to finish the conversation, so we continued a while after - and then I buried the recording /o\. Anyway, apart from it being still from "before the release of the current version", it's still relevant stuff, I feel bad about missing to post it. Check for yourself - here it finally is.

As before, we're speaking about various internal and external topics and I've also been teasing him a bit.

We're talking about these (and more) topics

  • Microservices vs Monoliths
  • Shortly before the release many modules were moved around and renamed. We talk about the reasons and what this meant for the translations
  • What's the meaning of "Feature-Complete"?
  • A lot of Feedback starts to come in during the Beta Cycle
  • Nitpicking on the Beta Criteria: JBoss and Upgrade Routines
  • Lookahead on the next episode on Performance Tuning
  • Releaseplans (of course, I could have retrofitted an exact release date...)
  • What's it like to be hired into Liferay Engineering?
  • Is it forbidden to write Javadoc?

Follow @JorgeFerrer, @RadioLiferay and me (@olafk) on twitter.

You'll find this episode - and make sure that you don't miss any of the future episodes - by subscribing to You can also subscribe on itunes.: Just search for "Radio Liferay" or just "Liferay" in the podcast directory. Make sure to write a review for the podcast directory of your choice - or find everything about Radio Liferay on

Or just download the MP3 here

Olaf Kock 2016-09-20T07:22:45Z
Categories: CMS, ECM

New accessibility features in AlloyEditor

Liferay - Mon, 09/19/2016 - 02:56

As many of you know, a while ago we presented AlloyEditor as the result of our quest for a delightful and productive editing experience. Alloy Editor was included by default as the rich editor in Liferay 7 (Yay!)


While we stand by it, our search for simplicity has inadvertently complicated some previously trivial tasks such as adding an alt attribute to an image. You can still add it editing the source code directly as shown in the following animation, but this is far from an ideal experience.



This attribute is essential to provide proper accessibility and SEO to your contents. Furthermore, some may even be mandatory for some projects and public institutions. Accessibility is very important to us so we have given high priority to solving this issue.

The solution

The solution has been to add a simple but useful button to support this option. As you can see below, the button only shows when the user selects an image, without cluttering the rest of the UI.



Thanks to the new extensibility features of the platform, we’ve developed a module that automatically adds this button and configures the editor to show it on the image toolbar.


You can already use this new button in Liferay DE Fix-Pack-4 and it will be bundled in the next GAs of Liferay Portal.


What’s coming next?

On top of this simple addition, we’ve been researching on a more general approach to make creating accessible content as easy and enjoyable as possible. This includes:

  • Automatic detection of accessibility problems as you type.

  • Hints and auto-fixing mechanisms to easily improve the contents.

  • Configurable set of rules and severities to focus on what matters most.


We’d love to hear some feedback from all of you regarding what are your most pressing needs and how you’d imagine they could be solved.

Antonio Pol 2016-09-19T07:56:45Z
Categories: CMS, ECM

Debugging Liferay 7 In Intellij

Liferay - Fri, 09/16/2016 - 00:16

So I'm doing more and more development using pure Intellij for Liferay 7 / DXP, even debugging.

I thought I'd share how I do it in case someone else is looking for a brief how-to.

Tomcat Setup

So I do not like running Tomcat within the IDE, it just feels wrong.  I'd rather have it run as a separate JVM with it's own memory settings, etc.  Besides I use external Tomcats to test deployments, run demos, etc., so I use them for development also.  The downside to this approach is that there is zero support for hot deploy; if you change code you have to do a build and deploy it for debugging to work.

Configuring Tomcat for debugging is really easy, but a quick script copy will make it even easier.

In your tomcat-8.0.32/bin directory, copy the startup script as debug.  On Windows that means copying startup.bat as debug.bat, on all others you copy as

Edit your new debug script with your favorite text editor and, practically the last line of the file you'll find the EXECUTABLE start line (will vary based upon your platform).

Right before the "start", insert the word "jpda" and save the file.

For Windows your line will read:

call "%EXECUTABLE%" jpda start %CMD_LINE_ARGS%

For all others your line will read:

exec "$PRGDIR"/"$EXECUTABLE" jpda start "$@"

This gives you a great little startup script that enables remote debugging.

Use your debug script to launch Tomcat.

Intellij Setup

We now need to set up a remote debugging configuration.  From the Run menu, choose Edit Configurations... option to open the Run/Debug Configurations dialog.

Click the + sign in the upper left corner to add a new configuration and choose Remote from the dropdown menu.

Give the configuration a valid name and change the port number to 8000 (Tomcat defaults to 8000).  If debugging locally, keep localhost as the host; if debugging on a remote server, use the remote hostname.

Click on OK to save the new configuration.

To start a debug session, select Debug from the Run menu and select the debug configuration to launch.  The debug panel will be opened and the console should report it has connected to Tomcat.

Debugging Projects

If your project happens to be the matching Liferay source for the portal you're running, you should have all of the source available to start an actual debug session.  I'm usually in my own projects needing to understand what is going on in my code or the interaction of my code with the portal.

So when I'm ready to debug I have already built and deployed my module and I can set breakpoints in my code and start clicking around in the portal.

When one of your breakpoints is hit, Intellij will come to the front and the debugger will be front and center.  You can step through your code, set watches and view object, variable and parameter values.

Intellij will let you debug your code or any declared dependencies in your project.  But once you make a call to code that is not a dependency of your project, the debugger may lose visibility on where you actually are.

Fortunately there's an easy fix for this.  Choose Project Structure... from the File menu.  Select the Libraries item on the left.  The right side is where additional libraries can be added for debugging without affecting your actual project dependencies.

Click the + sign to add a new library.  Pick Java if you have a local source directory and/or jar file that you want to add or Maven if you want to download the dependency from the Maven repositories.  So, for example, you may want to add the portal-impl.jar file and link in the source directory to help debug against the core.  For the OSGi modules, you can add the individual jars or source dirs as you need them.


So now you can debug Liferay/Tomcat remotely in Intellij.

Perhaps in a future blog I'll throw together a post about debugging Tomcat within Intellij instead of remotely...

David H Nebinger 2016-09-16T05:16:19Z
Categories: CMS, ECM

Content SEO - Hidden In Plain Sight

Liferay - Thu, 09/15/2016 - 10:55
It cannot be that it was just forgotten, This fundamental feature, thus I sought Through thick of forum, blog, e'en post ill-gotten Until my quest returned me to the spot Where sat the creature with expression cursed Inquiring why I didn't look here first.   This post is the result of a search for how to configure SEO metadata tags for content. We're all familiar with how to specify those for pages - simply go to the page in Control Panel, choose the SEO tab and enter the Title, Description and Keywords.       Well, it so happens that you can do this for content as well, but not in the same way as we do it for pages.   Let's back up a bit. WHY would we need to specify SEO for a content. Those meta tags (title, description and keywords) are relevant at a page level so search engines can determine if a given page has relevancy to a given search.   But, content, unlike pages, is just markup that is part of a whole! When we think of a content-driven website, we think of pages with each page having one (often more than one) Web Content Display portlet instances, and, don't forget, possibly one or more Asset Publisher portlet instances.   Ah! Asset Publisher, a clever device that brings back content items meeting specified criteria.   If you code your Asset Puiblisher's Application Display Template (ADT) mindfully, it will likely have a link to a detail view of that content item. And if you've gone all the way, then you know that the detail view you see is really hosted on a placeholder page that also contains an Asset Publisher portlet instance that is configured as its Default Asset Publisher, and that your content has its Display Page set to the placeholder page we just talked about. All of this setup helps the Asset Publisher engine apply your content template to your content XHTML and render it on the placeholder page. These are details you are quite familiar with if you have used Asset Publisher before.    If the previous paragraph is all new to you, you are in for a treat! Read this short blog post and come back here if you're still interested in this one.  Warning: you may not want to come back for a while because Asset Publisher might just blow you away and preoccupy you with several little project ideas.   Now, the first thing to do is go to a page that has your Asset Publisher portlet instance duly configured. Here's mine, with a fancy card view for each result.   Next, click on one of the content items so you get to the detail view of your content. This basically follows the link you coded in your ADT.   And view the page source for that selected content item. You should see something like the below.     Spot the three tags we care about - title, description and keywords and study their values. Title: Young Night - Browse Poems - Liferay Description: Hand in hand, we take it all in: The babble of the river, The whisper of the wind, Keywords: free verse   Now, let's see where those values are coming from. Go into the Control Panel, then Web Content Repository, and edit the content item in question.    The title is just the Title on the Content tab.      Note that the Title specified is Young Night. But if you look at what got into the page source above, you can see we had: Young Night - Browse Poems - Liferay. The page name and site name seem to get suffixed to the Title.    Next, click on the Abstract tab. The Abstract field sources your description meta tag.     Finally, click on the Categorization tab. The Categories and Tags, together, source the keywords meta tag. We have one category specified, free-verse.      For kicks, let's add a few tags.     Now, let's go view the page source again. We should see the newly added tags show up for the keywords meta tag. Note that the tags and the categories are consolidated into a comma-separated list.     So, there we have it. For content items that are served up via the Asset Publisher, we can now control the SEO title, description and keywords via content metadata.   The interesting thing here is that we're making our content SEO-friendly without really thinking about it. But if an SEO specialist were to come by and ask us how they might effect changes in a specific content item's SEO tags, we now know where to point them.   Isn't life[ray] beautiful? Javeed Chida 2016-09-15T15:55:56Z
Categories: CMS, ECM
Syndicate content