Announcing the new Liferay Community site

General Blogs June 15, 2017 By Milen Dyankov

Originally published on Liferay Community site

Today we're announcing a new place for the Liferay Community! This is something we've been waiting for a long time and we're super excited to finally show it to you.

"Wait, what? Yet another website?"

Uhh ... well ... yes! But it all makes perfect sense! Please, let me explain.

The evolution of

Few years ago when Liferay was a single-product-company, it was natural that the main website was about the product! There was no clear distinction between technical and business audience. This seemed to be a good idea at the time and worked quite well. But as they say, if something is for everyone it's not good enough for anyone.


Liferay website

As Liferay grew from product vendor to a company that builds software to solve more and more complicated business problems, the website also changed to address those goals. Today it perfectly responds to our business audience's needs. Unfortunately this also means technical folks feel somewhat abandoned. to the rescue!

Liferay Developer Network was developed to serve as new home for technical audience. It was designed to be a one stop shop for everything related to Liferay Portal - from basic information, through community guides, documentation and sample code, to tools and Marketplace plugins! The feedback after it was launched was more than optimistic and pretty much all Liferay developers and users I've talked to, said LDN is great!

Liferay Developer Network website

The only issue is - it focuses on a single product and therefore does not show you the big picture! Today Liferay provides a number of open source projects, which can be used independently or together. Meanwhile LDN only focuses on the portal platform!

One site to rule them all -!

With about 12 or so (at the time of writing) independently developed open source projects, each of which has its own website, it becomes a challenge to keep things in sync. While we want to allow project teams evolve their web presence in any way they find to fit best, we also need to serve well our vibrant and diverse community! This is how the Liferay Community website was born!

Projects at Liferay Community website

So what is it and what it will be in the future?

News at Liferay Community website

With Liferay's main website focusing on business goals and LDN being focused on a single product, we needed a place where developers like you will feel right at home! So we have laid the foundations of what we hope to quickly become a modern, cozy and functional space, where developers get to know better the whole family of Liferay projects!

At the time of writing this, the website is in what we consider phase 0 - a new beginning with huge potential to grow quickly! It features the most significant projects and publishes relevant news (one of which you are reading right now). It's very much a one way communication channel, but it won't stay that way for long! We plan to make it a lot more dynamic and interactive but we need your help!

This website is meant to best serve you so let us know what do you like and what you don't like! Share your ideas, concerns and expectations! Report bugs, typos, rendering issues! Feel free to reach us at anytime.

We really hope, together we can make this place an awesome home for all of us!

Liferay Karaf compatibility layer

Technical Blogs December 9, 2016 By Milen Dyankov

Hello Liferay Community,
Christmas is coming soon and that means you probably expect your well deserved (you've been good community members, haven't you?) present from Liferay's community! So I decided to make you one! A brand new and shiny Karaf compatibility layer for Liferay 7
I know, those of you who know Karaf are now very excited! Yes remote SSH shell is there and you can now install and manage features in Liferay! Enjoy! And please send feedback!
I also know some of you have no idea what am I talking about :) Let me give you a brief explanation. Karaf is a a lightweight, powerful, and enterprise ready OSGi based container. It comes with many great features, such as dynamic configuration (which btw Liferay also has), provisioning applications, remote shell via SSH, JMX management, security layer for services and commands, instances management, ... This compatibility layer brings some of those things into Liferay:
Oh and there is already an answer to the "Wait, there is Gogo shell, why install another one?" question :)
Now go ahead, open you present, play with it and let me know how do you like it! 

liferayctl - download and run Liferay locally from Docker images.

Company Blogs August 31, 2015 By Milen Dyankov

Looking at Liferay 7 Milestone 7 download stats, it seams many have tried it already. Yet considering the size of the community, the numbers are not that impressive. I'm pretty sure it's not because it's too hard or too time consuming to do it. However if that was your excuse, you may need to think of another one because trying out Liferay just got easier. How much easier? As easy as typing ./liferayctl start in your command prompt!


If you are Linux or OS X user, please allow me to introduce to you liferayctl - a command line tool to download and run a Liferay version from a Docker container.

Obviously you need to have Docker installed before you can use it (if you still don't, I really admire your resistance to IT trends)!

Let me give you some examples:

Before we start, let's get the tool and make it executable

curl -LO && chmod +x liferayctl

Now lets run Liferay 7 Milestone 7 (attention OS X users, make sure you are in a boot2docker terminal window)

./liferayctl -v 7.0m7 start

Be patient - it needs to download the image the first time you start it. This may take few minutes. Once it starts go to http://localhost:8080 and enjoy it ;)

Now let's say you want to compare it to the latest stable release (6.2ga4 at the time of writing), side by side in your browser. Type

./liferayctl -p 8180 -a 8109 start

and point you browser to http://localhost:8180. Feel free to add and modify whatever you want. Once you are done playing with it, simply run

./liferayctl -v 7.0m7 stop
./liferayctl stop

to stop both instances. You can start it again later on by repeating the steps above.

As you see, you don't have to be a Docker expert to use liferayctl. However it helps to get to know how it works!

Liferay Docker images

Now that you know liferayctl starts Liferay from a Docker container, you may wander which images it uses. If you search for Liferay in Docker Hub you'll find quite some images. Those vary widely in size, configuration and what Liferay version they target.

As much as I hate to reinvent the wheel, I had to create own images to satisfy the following requirements:

  • have minimal size images (based on Apline Linux image)
  • have minimal layers (single layer above Alpine providing all the data and several layers with meta data only)
  • make sure images do not depend nor contain anything but Java and Liferay Tomcat bundle
  • image structure is the same for each Liferay version (here is how they are generated)
  • hove control over stable and latest tags and make sure they point to the latest stable release and latest milestone release respectively

The images are uploaded in azzazzel/liferay-standalone Docker Hub repository. Sticking to those allows liferayctl to make some assumptions and provide very simple command line interface. However those are regular docker images and can be used directly with Docker. For example there is nothing that prevents you from running

docker run -ti --rm azzazzel/liferay-standalone:7.0m7

Be aware though that liferayctl makes some assumptions about container names and if you start liferay-standalone container directly from docker, it may interfere with the containers created by liferayctl!

Disclaimer and feedback request

I hope you'll enjoy liferayctl and the images and find them useful. Please keep in mind they are NOT meant to be used in production!

Please also keep in mind liferayctl as well as the docker images are NOT Liferay official artifacts and thus are NOT officially supported by Liferay. All images are build upon Liferay Community Edition versions.

As of now, there are only 3 images uploaded

  • 6.2ga4 (also tagged as stable)
  • 7.0m6
  • 7.0m7 (also tagged as latest)

I can release other versions on request. There are currently no plans to release Liferay Enterprise Edition images as far as I know! In the future Liferay may or may not decide to release official and supported tool and images. Meanwhile I will do my best to support those tools (I have plans for some more, such as allowing to use different database, automated creation of dev environment, ....) and images as long as there is interest!

So please, please send feedback, pull requests and report issues at liferay-docker-images project page on GitHub. Of course you can also drop me an e-mail or comment here, but this may take longer for me to notice and react.

Last but not least, you can meet me and discuss those and other subjects face to face at Liferay DEVCONLiferay Portal Solutions Forum - UK and Liferay Symposium North America.

Mobile Device Recognition beyond the UI

Company Blogs June 27, 2013 By Milen Dyankov

As you probably know in version 6.1 Liferay introduced the mobile device rules feature. However if you haven't followed the discussions and presentations about it, you may be under the wrong impression that is't very limited. Some people even claim it doesn't work. Judging by the number and type of questions I still get asked now days, I think I know where most of the confusion comes from - the user interface.

The first problem is that the UI will let you create rules even if there is no plug-in capable of actually detecting the device. Yes, you do need a plug-in for that. The API, data model and the UI are provided with the portal, but similarly to workflow and search (just to name a few) functionalities, the actual work of detecting the device is delegated to an external plugin. At the time of writing there is only one such plugin in Marketplace - Device Recognition Provider which internally uses WURFL. However if other providers become available in the future (or you create your own one), you will still be able to seamlessly hook them in.

Now, as I mentioned earlier, the UI will not warn you if the plugin is not installed. It will let you create a rule and the rule of course will never match as long as the plugin is missing! Of course all this is explained in the documentation but for those very few people who don't have the time to read it, in Liferay 6.2 we added a very visible warning message!

The second problem is about answering the "how much is not too much?" question properly. I guess we can have an endless discussion on this one but the fact is that at some point of time a decision was made that the only criterias that need to be available in the UI are operating system and whether the device is a tablet. In Liferay 6.2 you will be also able to specify ranges of screen resolutions and display sizes. I understand this still may be too limited for some of you, but the truth is, everyone has his needs and there is no way to make an user friendly interface that will cover all WURFL capabilities! Well, may be there is - a DSL (Domain Specific Language) on top of some rule engine will actually fit nice in here. Unfortunately there were more important things in the 6.2 road map so you'll have to wait a bit longer for this one or help us implement it!

The good news is you can use all of the capabilities in your custom portlets. You can use DeviceDetectionUtil to get the current user's Device. Once you get the Device object you can get the value of any WURFL capability by calling getCapability(java.lang.String) method. Actually you can do the same even from web content templates. Here is a simple example that will render some phone numbers as links if the device is capable of doing phone calls or sending text messages.


<?xml version="1.0"?> 
  <dynamic-element name="phone_number" type="text" index-type="" repeatable="false"/>   
  <dynamic-element name="sms_number" type="text" index-type="" repeatable="false"/>  
  <dynamic-element name="email" type="text" index-type="" repeatable="false"/>

Template in Velocity:

#set( $callPrefix = $device.getCapability("xhtml_make_phone_call_string") )
#set( $smsPrefix = $device.getCapability("xhtml_send_sms_string") )
#set( $canDoPhoneCalls = $callPrefix != "none" )
#set( $canSendSMS = $smsPrefix != "none")

<h3>Contact us!</h3>

You can
  <li>call us at  
    #if( $canDoPhoneCalls )
      <a href="$callPrefix$phone_number.getData()">$phone_number.getData()</a> 
  <li>or send an SMS message to 
    #if( $canSendSMS )  
      <a href="$smsPrefix$sms_number.getData()">$sms_number.getData()</a> 
    and we'll call you back  
  <li>or <a href="mailto:$email.getData()">e-mail us </li>

Template in Freemarker:

<#assign callPrefix = device.getCapability("xhtml_make_phone_call_string")>
<#assign smsPrefix = device.getCapability("xhtml_send_sms_string")>
<#assign canDoPhoneCalls = (callPrefix != "none")>
<#assign canSendSMS = (smsPrefix != "none")> 

<h3>Contact us!</h3>

You can
  <li>call us at
    <#if canDoPhoneCalls >
      <a href="${callPrefix + phone_number.getData()}">${phone_number.getData()}</a>
  <li>or send an SMS message to
    <#if canSendSMS >
      <a href="${smsPrefix + sms_number.getData()}">${sms_number.getData()}</a>
   and we'll call you back
  <li>or <a href="mailto:${email.getData()}">e-mail us </li>

I hope the above proved to you the device recognition functionality in Liferay is not as limited as it may seem on the first look! And I certainly hope more will come in upcoming versions.

The power (user) is back

Company Blogs January 22, 2013 By Milen Dyankov

The title will probably make some people argue that it was never gone on the first place. That's true. But there are some resources out there trying to convince you that  User and Power User roles are basically the same thing. Some even state that Power User is there for legacy reasons but it's not and will not be used by Liferay in a future. While I'll refrain from making any statements as to what Liferay will do in the future, I think you shold know that currently (which is Liferay version 6.1) User and Power User roles provide different permissions set! 
The confusion comes partly from the fact that by default all users are assigned to both roles. Thus from user perspective it would theoretically make no difference in which role given permission is set. But keep in mind that users can be removed from Power User role at any time. So before you do set a permission please think whether it should apply to all users ever (then add it to the User role) or it should only apply to given group of users (if so add it to a specific role - for example Power User)

To add to the confusion, in 6.1 a new button called "Clean Up Permissions" showed up in Control Panel. While the description tries its best to describe what it does, it may not be very clear if you believed that User and Power User are the same. To help you better understand, I generated the following table which shows what are the default permissions for Guest, User and Power User roles before and after you click on "Clean Up Permissions"  (click on the screenshot below to download the PDF):         

Liferay 6.1 default permissions (screenshot)

Liferay source code history - a piece of art

Company Blogs January 14, 2013 By Milen Dyankov

Ever wandered what it takes to build a product like Liferay? Let me show you in a ... very visual way. Please sit comfortably and watch how the time flies (not to mention the developers) and several years of source code history draws an extraordinary picture in just  8 minutes:

For those of you who are more concerned about how the video was made then what it represents (and also to comply with some of the licences) here is the information:
  • animation created by Gource - tool which displays software projects as an animated tree with the root directory of the project at its centre. Directories appear as branches with files as leaves. Developers can be seen working on the tree at the times they contributed to the project.
  • source code history based on commits in Liferay's master branch
  • the developers avatars comes from Gravatar
  • Background music by
  • everything put together in OpenShot


Showing 6 results.
Items 20
of 1