Community Meetup at the North America Symposium

Company Blogs September 26, 2012 By James Falkner

If you are attending this year's Liferay North America Symposium in two weeks in San Francisco, on Sunday evening (the evening before the event begins) Liferay is hosting a community meetup. This will be a free event, starting around 8pm, at Irish Times [Map and Directions]. This is very close to the symposium venue, about a 3 minute walk.  Come meet your fellow community members, Liferay staff, and other interested parties with some free drinks, snacks, and interesting conversation! It'll be a great way to start off your two-day symposium. If you are interested in attending, let me know by leaving a comment on this blog post, so that we can gauge how many will be there! See you in San Francisco!

2012 Liferay Community Survey

Company Blogs September 25, 2012 By James Falkner

Hey all!  As your community manager, I am always trying to learn from you as much as possible, in order to make our community a better place to share ideas, meet new people, and generally grow the world of Liferay.  However, for such a large and active community, I alone cannot ever hope to conquer this task, so your Community Leadership Team has been exploring ways to solicit feedback, and not just ordinary feedback, but feedback that gets to the root motivations of participation (or not!). To that end, today we are opening the 2012 Liferay Community Survey - please take a few minutes (ok, about 10 of them) and share your feedback with us.  The results will help us further understand what motivates your participation, the improvements you wish to see, and how we can better attract and retain new community members in 2013 and beyond!

The survey will be open until October 23.  Your answers are completely anonymous, unless you wish to receive feedback, or more importantly have a chance to win cool prizes offered by our survey sponsors: MyOffice24x7, Componence, and Liferay!  Gift cards, Liferay books, and other fabulous prizes will be awarded to a few lucky survey respondants, so take the time to take the survey and make your voice heard!  Once the survey closes, the community leadership team will review the findings and present them to the community, and the results will be used to tune our efforts in the community and project going forward.

By the way: the survey questions were generated from the community, and the survey itself is implemented using MyOffice24x7 SmartForms, running on Liferay 6.1 CE GA2, configured by Componence.  So it truly was a Liferay Community effort, and we are happily "eating our own dogfood", thanks ya'll!

Community Roundup

Company Blogs August 22, 2012 By James Falkner

Guess what?  It's time for another Community Roundup!  I know it's been a while since the last roundup.  It's been quite a busy last few months in the Liferay Community.  We saw the release of several Liferay product updates, the soft opening of the Liferay Marketplace, and several new initiatives in the community.  I'll try to cover as much as I can, filtering only the best for you, with lots of links to keep you informed and up to date.  On with the show!

  • The fall event season is heating up.  I don't get out much, so it's nice to be able to connect an online identity to a real person every once in a while.  Liferay is active in community meetups and industry events -- you may have seen us at this year's OSCON, and read below for details on local community meetups happening around the world.  Many events are free to attend (like our community meetups), so don't hesitate to come say hi if you can! We will also be at Gartner's PCC in London, the Jenkins User Conference in San Francisco, JavaOne (also in SF), the AFCEA Fort Knox Industry Day, and then the entire month of October (and some of November) you'll find 4 Liferay Symposiums in a row - San Francisco, Frankfurt, Madrid, and Milan.
  • Speaking of symposiums, last year we began to accept topic submissions from our community.  Last year, at the US symposiums, I believe we got around 5 submissions.  This year, it was close to 30.  I'm guessing the European symposiums are seeing a similar increase!  I was shocked and awed at this.  And they weren't run of the mill sales pitches, these were real technology and community discussions, which I'm sure made it tough on the organizers to choose.  You can see the program listings: [North America, Europe, Spain] and I highly encourage you to attend at least one.  The Spain and Europe CFPs are still open, so be sure to submit if you've got a topic you wish to present.
  • The much anticiated opening of the Liferay Marketplace finally arrived in late July.  The Liferay Marketplace is the new place for our community to share, browse, and download Liferay-compatible apps.  You can find all of Liferay's supported plugins, and in the near future you will be able to upload your own applications, and make them available on the Marketplace.  Next week (August 27-31), Liferay will host several live sessions in multiple languages and timezones to discuss how you can use the Marketplace and what you can do with it today, and what's coming up.  I highly recommend you attend at least one!
  • Also on the release front, we saw the release of Liferay Social Office 2.0 CE.  A much needed refresh of the Social Office product, this new release has too many new features to go over here.  It looks really great, so give it a go!
  • July also saw the release of Liferay Portal 6.1 CE GA2 and EE GA2.  This update brought several important updates to the platform, including support for the aforementioned Marketplace, and important security updates.
  • Security is very important to anyone who uses Liferay, and the newly-formed Community Security Team has taken on the task to educate developers on security, and help to find, fix, and notify the community about security issues in Liferay.  If you are interested in learning more or joining this effort, contact the team today!
  • As you know, last year we began the Community Verifier team, to help verify existing issues in Liferay, and clean up our JIRA database of backlogged issues.  The team has donated a huge amount of their time, and has verified/triaged over 370 issues since January.  Well done!
  • Juan Gonzalez (aka juangon) is a very active in our community and is always willing to contribute, whether it's on the forums, the Community Security Team, or even on other open source projects.  Most recently, he collaborated with the fine folks on the XMLPortletFactory to integrate it with Liferay's built-in workflow engine.  Check out Liferay XMLPortletFactory Workflows!
  • Participation in our community is one of the best ways to get to know the technology.  Contributions, no matter how small, should be treated as a gift to the community, and we have not done a great job to date of shepharding those contributions into the project.  In an effort to improve this, Drew Blessing has kicked off a new effort in the Community Verifier program to pair up contributors, community verifiers, and Liferay core engineers, and get those contributions flowing once again.  But we need your help!  If interested in joining the CV program, please join this thread and get involved!
  • Shout-out to our 2012 Q2 Top Contributors: Jelmer, Tejas, and Amit have been kicking butt in their own special ways in our community, and I want to personally thank them for their efforts.  Of course everyone who contributes should be commended, and so I look forward to Q3 and beyond.
  • Olaf continues to provide visibility into our community, through his regular podcast.  Most recently, Radio Liferay has featured Jim Hinkey on Javadocs, Bruno Farache (aka Bruno Admin), Juan Fernández (Core Engineer and active Community guy), Michael Young (One of Liferay's Founders), Jeffrey Handa (Training), Greg Amerson (of IDE fame), and a host of others.
  • More Liferay User Groups are popping up!  We welcome new groups in Denver (US), New York/New Jersey (US), Dortmund (DE), and Twin Cities (US).
  • User Group activity is picking up across the world.  India held their first and second meetups in Pune and Ahmedabad, and plans for Bangalore later this year.  The UK is lighting up as well, with meetups planned for September.  Spain, Netherlands, Dortmund, Austin, Denver, Twin Cities, and Belgium also have (or recently had) events - check their pages for details, and get to know your local Liferay community!
  • CMSWire recently held a discussion: "Does Open Source Encourage and Support Innovation?".  This is of course very important to understand when considering Open Source for your business.  We in the community of course believe in it, but it's nice to see an external perspective.  Of course, the only vendors consulted were open source, but the arguments made are sound in this blogger's opinion!
  • Our Liferay Community is but one of many in the software industry.  Roland (from Nuxeo) recently talked with community managers from several open source communities (including ours!), and wrote a nice 4-part piece on the practice of community management. [Part 1, Part 2, Part 3, Part 4].
  • Our fearless community champion Ray continues his adventure.  Who is this mysterious hero that keeps saving Ray?
  • There are new, custom designed Liferay teeshirts available at cost (no markup) at Liferay's CafePress online store.  These were designed by our very own Bryan Ho!  Women's and Men's sizes and fits available.  You can even get a onesie for your little one.  Also, I heard a rumor of a 3rd design that was never published and is really hard to find - if you find it, let me know.
  • Earlier this year, the community began accepting new Liferay Community Projects - since then several have popped up, the latest of which is a handy JavaScript utility belt for Liferay Developers: Rogers.js.
  • Thanks to YOU, our Liferay Community, we have been voted #1 for SourceForge.net's July Project Of The Month!  Check out the interview with Brian Chan, one of the Liferay founders, who was instrumental in us finding and continuing to use SourceForge as the home for Liferay downloads back in the stone ages of Liferay.  I was very happy to see so many of you lend your voice.  We beat SugarCRM!  And I now have 94 new and useless Twitter accounts.  Just kidding.
  • Wasim continues to contribute some great work in the area of user experience in his blog.  Liferay 6.1 Theme Initializer 2? Yes, please!
  • Random tweet: @simonfeesh Totally geeking out today. Am absolutely impressed with @liferay. Wow. Makes other CMS platforms look ordinary.
  • Mobile is still in its infancy.  There's too much confusion, I can't get no relief.  One of the tenants of Liferay's design is that it gives you the choice about how to do many things, including mobile support.  Two articles stuck out recently: Milen describes how to use the Mobile Device Detection in Liferay 6.1.  And Tony Byrne from Real Story Group explains the choices one must make when designing for Mobile using Liferay. Both nice articles (be sure to read Nate's comment on Tony's article!).
  • Jignesh has very useful tidbits of Liferay Developer goodness.  I particularly like the coverage of AlloyUI and Liferay's WCM.
  • Jelmer gives us some nice tips / best practices for Liferay development.  If your Liferay project involves continuous deployment of Liferay and your plugins, there are some nice tips here.
  • Liferay held a Twitter contest back in May - you can read more about it on the results page, but what I was particularly happy about was that the prizes chosen were characterized as "Cool and baffling" :)
  • FancyBox Portlet anyone?  Davide brings us this interesting visualization tool for Liferay (using jQuery).
  • As you know, earlier this year the PortletFaces project was moved under the Liferay Community umbrella, headed up by Neil Griffin.  The Liferay Faces project has just had their first GA release of Liferay Faces, welcome news for JSF+Liferay users.  Also, check out the nice demos page if you're wondering what Liferay Faces can do for you!
  • The Liferay IRC channel (#liferay on FreeNode) has been picking up steam - we're up to around 30 people at peak times (generally Monday morning for some reason) and maybe 15 or so 'regulars'.  Come join us!  I wonder if we should start up bi-weekly meetups!  For Hungarian users, we now have a #liferay-hu channel as well!
  • Liferay IDE 1.6 has recently been released, with awesome new features for developers like automatic source attachment for handy debugging, new support for JSF Projects, ServiceBuilder enhancements, and other community contributions. Nice job Greg and team!
  • Tejas (one of our most active contributors recently) also maintains his own blog - most recently discussing the creation of Portlet URLs from Theme template code.  Thanks Tejas!
  • Dave Nebinger shows how you can integrate Piwik (open source analytics) with Liferay.  I came across Piwik back in my Community Equity days, and it is a really nice solution for tracking visitors and gathering nice looking data. Thank Dave!
  • Speaking of monitoring things, what about monitoring Liferay itself?  Mika has a nice article on using Nagios, Jolokia, and JMX4Perl, complete with fully functional configuration examples.
  • New Blog Entries: Cincinatti Film Festival and Liferay, Custom Footer Navigation, Maven and GA2, 6.1 Development Guide, Liferay Open Development, Workflow Context Variables, and many more.  Also, I know I've promised this for a while now, but we are making progress on opening up liferay.com blogs for the entire community.  Stay tuned!
  • New Wiki Updates: Community Verifier Contributors, Using Custom Fields, User Feedback, Contributing using Git and Github, Getting Started as a Developer, and many more.
That's all I have for you today, folks.  Thanks again to our amazing community that keeps giving and keeps me going.  Until next time!
 

Social Office 2.0 CE Release

Company Blogs August 1, 2012 By James Falkner

Today Liferay released the next CE release of its flagship social collaboration product: Social Office 2.0 CE! [Download from the Liferay Marketplace] [Documentation]

Liferay Social Office is a social collaboration solution for the enterprise that streamlines communication, saves time, builds group cohesion and raises productivity. It is built on Liferay Portal, and shares much of its functionality, but also adds additional functionality for social networking and department-level collaboration.

The Social Office team, in conjunction with its awesome community of users and developers, have spent many months getting this release ready, and I'd like to describe some of the details about new features and additions to the product.

Downloads

Social Office 2.0 CE is now available in the newly opened Liferay Marketplace.  It can be easily added onto your existing Liferay Portal installation (starting with Liferay Portal 6.1 CE GA2).  Simply navigate to Control Panel, click on the Store tab (under the Marketplace section of Control Panel), and you will see Social Office 2.0 as a Featured App.  Alternatively, you can download it through the Marketplace's web store at liferay.com/marketplace.

New and Improved Features

Social Office 2.0 is a major revamp, and includes many features for social collaboration.  Here are a few of the highlights, but I highly recommend you check it out for yourself!

Installation

Unlike previous versions of Social Office, Social Office 2.0 is available as an application that can be installed on Liferay Portal 6.1. Liferay applications, or apps, are packages of Liferay plugins that are grouped together with descriptions, version information, and other metadata. Social Office 2.0 is one of those applications. They're available from Liferay Marketplace. Prior to version 2.0, Social Office was provided as an independent product that was based on, but separate from, Liferay Portal.  Read the Social Office Documentation for more details on getting started with Social Office 2.0.

Dockbar Integration

Social Office fully integrates with Liferay's Dockbar, providing easy to access links to common functions and a notification area to quickly see what's important to you.  Users are alerted to new notifications or requests, providing a quick means of responding to the notification.  

Profile

Your profile page represents you to other users.  It provides details about you, including your name and picture, descriptions that you provide, links to your presence on SO and other social sites, status updates, site memberships, a summary of connections, and other pertinent personal information about you.  it has had a major revamp in 2.0.

Dashboard

Your dashboard shows you a collection of information pertinent to you, such as upcoming tasks and events, your status updates (and the ability to enter new ones), related activities, and allows you to manage your contacts and private messages. The Dashboard is easily reachable from the Dockbar.

Contacts Center

New to Social Office 2.0, the Contacts Center is a key enhancement that makes finding, following, and tracking your contacts much easier.  You can add other contacts as connections or simply follow them, to receive updates when activities occur.  You can also do things like send private messages, or even block them.

Events Center

The Events Center integrates with Liferay's out-of-the-box Calendar functionality, giving you a birds-eye view of upcoming events that you are involved with.  

Followers and Connections

You can now connect to other users as a two-way relationship (friending), or simply follow users to receive updates on their activities through the newly revamped Activities Stream.

Activity Stream

Social Office 2.0's new Activity Stream integrates with all facets of Social Office, showing you activities from your contacts and followers.  You can also filter activities to only display those from connections, those you are following, activities on sites you are a member of, or your own activities.

Microblogging

Another key feature and highly requested improvement is the ability to publish content to your very own microblog, targeting subsets of your contacts, or broadcast to the entire site.  

Hashtags, Mentions, and Autocompletion

When sending messages or updating your status, you can use #hashtags to give context to your post, and you can @Mention other users, providing an easy link to their profile and giving them notice that you are talking about (or to!) them.  When using mentions, Social Office dynamically provides autocompletion for contact names, so you can quickly find the person you want to mention.

Private Messaging

Another highly requested feature, Social Office allows users to send Private Messages (PMs) to other users.  Messages are email-like and you can also attach content to the message, and include multiple people in a private conversation.

Notifications

When on a Social Office site, your notifications are displayed in the Dockbar, giving you quick access to important information or activity to which you need to respond. Clicking on the Notifications dialog shows you all of your unread or pending notifications, and can be cleared as needed.

Site Management

Social Office adds extra collaborative tools to Liferay and allows you to quickly set up sites designed to facilitate collaboration. Each site is template-based and designed to provide a single group or team with a virtual shared workspace. Members of your organization who belong to multiple groups or teams in your organization can belong to multiple Social Office sites on the portal.

Tasks Management

Social Office also features a Task Management System, allowing you and your team to track tasks to completion.  Tasks can be filtered by tag or site, and expected task attributes like due date, assignee, percent completed, are present.

Fluid Layout

Social Office features a new flexible theme. You can toggle between a fixed and fluid theme layout where fluid layouts conform to fit the width of the screen, giving you extra real estate to manage your site.

Integration with Liferay Portal

Build on the award-winning Liferay Portal, Social Office users and sites can also use Liferay's built-in document management, blog, wiki, forum, chat, and custom plugins typically used with Liferay.
 

Integration with Liferay Sync

Liferay Sync transforms the Liferay platform into a central, easy-to-use document sharing service.  Combining Sync + Social Office allows your teams to access Social Office documents from desktop and mobile platforms.  The Community Edition of Sync is limited to one Social Office site.  If you need to sync multiple sites, get the Enterprise Edition.
 

Documentation

The Liferay Documentation Team has been hard at work updating all of the documentation for the new release, and the new "Working Smarter With Social Office" is ready!

Bug Reporting

As always, the project continues to use the Social Office JIRA site to report and manage bug and improvement tickets. If you believe you have encountered a bug in the new release (shocking, I know), please be cognizant of the bug reporting standards and report your issue on issues.liferay.com, selecting the SOS project and the "2.0.0" release as the value for the "Affects Version/s" field.

Getting Support

Support for Social Office 2.0 CE comes from the wonderful and active community, from which Liferay itself was nurtured into the enterprise offering it is today. Please visit the community pages to find out more about the myriad avenues through which you can get your questions answered. For Enterprise customers, Liferay also offers Social Office 2.0 EE, which is due to be released shortly after this CE release.

What's Next?

Of course we in the Liferay Community are interested in your take on the new features and improvements in Social Office 2.0.  If you are interested in learning more about how you can get involved, visit the Liferay Community pages and dig in.  Also, check out the Social Office Project page for even more SO-specific information.

Liferay Portal 6.1 CE GA2 Release

Company Blogs August 1, 2012 By James Falkner

It's finally here - Liferay Portal 6.1 GA2! [Download] [Quick Start] [Documentation]

This is an update release for Liferay Portal, bringing a host of fixes and some improvements based on feedback from the community.  

Release Nomenclature

Following Liferay's versioning scheme established in 2010, this release is called Liferay Portal 6.1 CE GA2. The internal version number is 6.1.1 (i.e. the first update release of 6.1). Future CE releases of 6.1 (if any) will be designated GA3, GA4, .. and so on. See below for upgrade instructions from previous releases.

Downloads

You can find the GA2 release on the usual downloads page. If you need additional files (for example, the source code, or dependency libraries), visit the additional files page.

Changelog

In addition to the numerous bugs that have been fixed since 6.1 GA1, Several new improvements have gone into this release. Highlights include:

Documentation

As always, the Liferay Documentation Team has been hard at work updating all of the documentation for the new release. This includes updated javadoc and related reference documentation, and updates to the User Guide and Development Guide. You may have been watching the progress of it via its new home on github, but if not, you can access the full documentation on the documentation page.

Bug Reporting

As always, the project continues to use issues.liferay.com to report and manage bug and improvement tickets. If you believe you have encountered a bug in the new release (shocking, I know), please be cognizant of the bug reporting standards and report your issue on issues.liferay.com, selecting the 6.1.1 CE GA2 release as the value for the "Affects Version/s" field.

Upgrading

As a general rule, you can upgrade from one release of Liferay to the next. This means that you can upgrade from 5.2 to 6.0, or 6.0 to 6.1, but not directly from 5.2 to 6.1. For 5.2 to 6.1, you would need to progress from 5.2 to 6.0, then 6.0 to 6.1. See the Upgrading Liferay chapter of the Liferay User Guide for more detail on upgrading to 6.1.

For users of GA1, you can directly upgrade to GA2 following normal upgrade procedures found in the documentation.

Getting Support

Support for Liferay 6.1 CE comes from the wonderful and active community, from which Liferay itself was nurtured into the enterprise offering it is today. Please visit the community pages to find out more about the myriad avenues through which you can get your questions answered. Liferay and its worldwide partner network also provides services, support, training, and consulting around its flagship enterprise offering, Liferay Portal 6.1 EE, an update of which is due to be released shortly after this CE update.

What's Next?

Of course we in the Liferay Community are interested in your take on this update. Work has already begun on the next evolution of Liferay. If you are interested in learning more about how you can get involved, visit the Liferay Community pages and dig in.

Liferay Community Security Team

Company Blogs July 9, 2012 By James Falkner

I'm particularly happy to announce that today we are launching a new initiative in the community around Liferay security.  From the new Community Security Team (CST) pages: "The Liferay Community Security Team is an all-volunteer group of community members who manage security issues related to Liferay CE. When security-related issues arise in the open source Liferay project, the CST works to minimize the impact and provide notification and relief to the community. In addition, the CST provides ongoing education to developers and users to keep their Liferay sites secure."

This team provides a much needed and long overdue element in the Liferay open source community, helping to quickly fix security issues and provide patches for existing community users.  As Liferay (and many other open source projects) continues to grow in usage and popularity, so too does the importance and potential impact of security issues, and it's vital that we respond quickly with a well understood and predictable response. In addition to reacting (through advisories, patches, etc), this team is also chartered with being proactive in the community, educating developers, administrators, and end users about security best practices and specific techniques that can be used with Liferay.

The CST pages contain a wealth of information including:

  • How you can get involved in the team
  • How the team operates
  • How to subscribe to receive new security advisories
  • How to respond to such advisories
  • How to report new issues
  • How to install patches
  • and much more

As an important part of and corporate sponsor of open source, Liferay is also issuing a corporate security statement, outlining its commitment to security, and policies around reporting to the wider community.

Getting Involved

The initial CST comprises of individuals from the wider Liferay community, as well as employees of Liferay, Inc. All community members are welcome to participate! Because membership gives access to information about potentially sensitive security issues, membership is somewhat limited to those in the Liferay community with a proven track record in the areas related to security or with special skills needed by the team. The best way to get involved is to review security fixes with a security mindset, get down and dirty and find and/or fix a few issues, and interact with the team in its course of duties.

The team is currently busy catching up with a number of security issues that were reported in the Liferay Portal 6.1 CE GA1 release.  Several fixes are currently available through the CST, and a couple more are expected in the next week (be sure to subscribe to the Security Advisory Forum or the feed (click on the RSS/Atom icon on the Known Vulnerabilities page)

What's Next?

As with any new venture, there are still a few unfinished items and there are bound to be hiccups or things we can improve on, so please be patient and constructive with any feedback you wish to give.

The team is still in the process of ironing out its processes, and some work remains for GA1 (as stated above).  We are also expecting a GA2 release of Liferay Portal 6.1 soon, and at that point the team will shift to managing that release's security.  Once the processes have been battle-tested, the team will begin to execute on other areas of its charter (e.g. education and outreach).  The team will also begin to integrate its output within other areas of the community (e.g. pointers to latest patches on the main CE download page, or perhaps notifications during initial install that there are new fixes available).  The team will also provide translations for the CST page content and advisories in the following weeks.

There are a lot of community members that care about security, I am hopeful that together we can ensure continued confidence in the security of Liferay!

Liferay North American Symposium 2012

Company Blogs June 14, 2012 By James Falkner

This year, the Liferay Community will gather around the world to learn, share knowledge, and meet fellow Liferay technologists and experts, as part of the popular Liferay Symposium series.  The Liferay North American Symposium [Register] takes place October 8-9 in San Francisco, and it will be one you DO NOT want to miss.

What's new this year?

You mean besides everything?  It's our first time in San Francisco ("Helloooo, Frisco!!"), one of the most beautiful and interesting cities in the world (in this blogger's humble and biased opinion).  We've got an awesome line up of speakers, including Liferay leadership, industry luminaries, and real world customers sharing case studies.  There are many more workshops and training activities than years past.  There's a mobile app with cool features.  My jokes are AT LEAST 30% better.  And many more surprises lurking for attendees.

Why should I attend?

Besides the normal (but still awesome) presentations about Liferay technology, case studies, etc, we also have many workshops that attendees can attend, to get hands-on experience with Liferay and related technologies.  For those who want even more depth, the full-on Liferay training will be held the day after the symposium.  There is also a LOT to do in San Francisco and the SF Bay Area, before, during, and after the symposium.  But most important (again, in my humble and biased opinion) is that you will meet and engage with the lifeblood of Liferay's community -- its people.

These are the people that make the Liferay Community clock tick -- our open source developers and contributors, partners, customers, ISVs, Marketplace publishers, and everyone in between.  It is simply the best place to get the complete Liferay experience in an action-packed 2 day event.  Registration is now open, and I'm telling you -- you won't want to miss this one.

Getting Involved

Just like last year, the agenda will include topics submitted by YOU, the Liferay community! Join the largest gathering of the Liferay community and participate in the sharing of knowledge and expertise with fellow community and Liferay experts.  Submit your topic for consideration, and join us in San Francisco, Frankfurt, Madrid, and (somewhere in) Italy!  Speakers will be announced August 15 for San Francisco, so don't wait!

Demystifying Liferay's Open Development

Company Blogs June 13, 2012 By James Falkner

"What is Liferay working on?"

This question is probably the most popular high-level question asked by the our community.  Whether you are an enthusiast, open source Liferay developer, partner, or potential or long-time customer, you want to know what's coming up and what's being worked on.  On my first day on the job, in my first blog post as your community manager, I promised to "Engage with you on the roadmap for 6.1 and beyond".  Today marks a significant step towards closing the gap between what you think the Liferay Community is doing and what we are actually doing.  This information has sort of been there all along, in the form of individual tickets in JIRA, but our process is evolving and becoming even more transparent and easier to understand. 

A Brief History of Liferay's Development Process

In the early days, when the community was very small, pretty much everyone was in tune with what the community leaders were doing.  There were twice-yearly meetups in LA, the source code base was small, and there wasn't a ton of people issuing requests and complaints and suggestions for improvements.

As the popularity and user base of Liferay grew, and as companies started using it more and more for mission critical applications, the need for knowing what was being worked on (and therefore what could be expected in the next release) grew proportionally.  Since Liferay (and liferay.com) was already a social collaboration tool, and had amazing features like a Wiki, The Roadmap was enshrined as a wiki page (here's the one for 5.0) for all to see and collaborate on, with the expectation that it would be nurtured and updated frequently.

Unfortunately, the wiki turned out to be the place where the roadmap went to die a quiet, ignominious death.  The problem was not that wikis are inherently bad, it's just not the right tool for a quickly evolving project with lots and lots of details.  No one was willing to babysit the wiki page and ensure its accuracy on a daily basis during product release cycles, because it was not much more than an electronic whiteboard (and not very powerful or fun to use).   So, we were left with an afterimage of what the project was supposed to be at the beginning of the release cycle.

In the meantime, Liferay Program Management was becoming more adept at using JIRA to its fullest potential, to manage the huge activity occurring on issues.liferay.com.  What was once essentially a large, flat list of bugs and improvements (with the same workflows and same metadata - name, description, assignee, etc) was slowly transforming into a powerful issue management system with customized metadata, workflows, new filters, and OpenSocial visualizations built on top of the "flat list of bugs", giving the community never-before-seen ways of visualizing and managing issues.

In addition, Liferay itself was changing - trying out new development models and seeing which ones best fit the company's and community's development style.  We're not pioneers here - effective development teams have been using various models like XP, Scrum, Kanban, etc for years, so we were just picking those that seemed to match our development culture best, modifying as needed, and marching on.  In October 2011 I visited our Madrid office, and was pleasantly surprised to see the whiteboard in the office look something like this:

( Attribution   Some rights reserved  by  Plutor)

I was like "ahhh.. low tech solutions for low tech problems.  Genius!".  If I could set up a camera in this office, and take a picture every hour and upload it to liferay.com, then we'd all have a pretty clear idea of what was currently being worked on and we'd have a constantly updating picture of what Liferay thought should be in the next release.  But a camera is too fragile, and we can't all be in Spain (though that would be nice...).  What they were practicing was a form of Kanban, prototyping it with the development team there.  We have now taken it from pushpins and post-it notes to JIRA and one of its many plugins called "Greenhopper".

This post isn't meant to educate you on what Kanban is or how to use Greenhopper.   Instead, I'll explain how it can be used to visualize the work of the Liferay developer community (Side note: I tend to lump Liferay employees with the rest of the community!).

The Liferay Activity Board

Many product presentations end with a Roadmap Slide - this is the slide where high level features are paired with expected due dates, and is usually accompanied by some kind of disclaimer which absolves the presenter of all responsibility for the dates and content presented.

This is not a roadmap.

Rather, what we now have at our fingertips is a view onto what was formerly a post-it note board maintained in Liferay's development centers. It's better and more useful than a static roadmap.  At this point you may be asking yourself "So what, I don't want to see the 50 bugs that were fixed today, and I don't care that Ryan was blocked on LPS-23133 and Julio's average cycle time is 7.5 days.  I want to know what's coming in the next version of Liferay!"  Fair enough.  The nice thing about how we are using JIRA and Greenhopper is that it is now possible to get exactly that - a view onto the current, major, high-level themes being worked on for the next version of Liferay, ignoring all of the boring details.  With the new Community Rapid Board, you can do exactly that:

It's called a Rapid Board and is essentially a 2D table showing Stories flowing through various states.  A Story is a supporting artifact for a set of requirements.  The labeled rows (Quick Wins, Collaboration Calendar, etc, also called Swimlanes) represent groups of related stories under the same feature area that are currently being worked.  Columns represent current state of the stories being worked.  So, for example, for Liferay 6.2, you can see that the following high level items are planned or being worked on:

Of course, the set of visible feature areas for 6.2 is evolving, so this list will change over time.  You can click on individual stories and drill down to your heart's content.  Eventually you'll arrive at one or more JIRA tickets representing the lowest level of development subtasks assigned to individual developers, which can ultimately be mapped to source code changes at github.  Following this rabbit hole is very instructive and helpful in the future when unraveling issues :)

Quick Wins

Quick Wins allow any Liferay Developer to work on whatever they want under certain conditions.  Often times, community contributions that you make are handled as Quick Wins.  These are shortcuts to the development process - things that can typically be handled generally within one day, without undue process.  Liferay has always benefited from these and we want to encourage them to keep happening.

How is this different?

Liferay is not only an open source product, its development process is also very open, and now we are making it even easier to keep track of what's going on, which helps you get involved earlier and provide feedback on how you want to see the product evolve.

Of course, it's just as easy to neglect a fancy tool like JIRA as it is to neglect a wiki, so how is this any better?  The difference is that this tool is now in the critical path for daily (and sometimes) hourly work of our community of developers.  Neglect on anyone's part will cause pain for many other people, so it's in everyone's best interest to keep things accurate and use the tool for its intended purpose.  Not only that, it's easy and fun to use (it can be very therapeutic to weed through a complex board every day and see the progress of tickets).  And in the end, it provides a rich set of tools to measure progress and find roadblocks and places where development process can improve.  Of course, there is a higher learning curve compared to a wiki page, but in the end it is worth it.

What does this mean for me?

Right now, these JIRA-based tools are used internally by Liferay's development teams.  Outside of these teams, the process for the community remains the same (for now) - file bugs at issues.liferay.com, discuss new features and improvements via the forums and Proposals Wiki, and then file new feature requests via issues.liferay.com.  These will in time be promoted to  Stories (often times Quick Wins).  As a separate effort, your Community Leadership Team and Liferay Product Management teams are  working on improving the "ideation" experience within our community, to make it very easy to crowd-source new ideas and promote community-born ideas into reality much faster, but that's a separate blog post in the near future (I promise!).

I am sure that "Roadmap Slides" won't be going away anytime soon - you'll probably see several of them in the upcoming Liferay Symposiums - but the extra granularity and daily (and sometimes hourly) reflection of the current state of Liferay within these Rapid Board views gives everyone a realtime view onto the what is happening with Liferay development.

Twitter Contest Results

Company Blogs May 31, 2012 By James Falkner

The results are in!

Liferay launched its first Twitter contest earlier this month with this tweet. Our guest judge for the two-week long contest was journalist Josette Rigsby from CMS Wire.  Josette has carefully looked over each entry, and has provided her expert judgement as follows:


Liferay has managed to combine two of my life long loves - super heroes and code. So when they asked me to judge a contest of developer super powers, I couldn't resist. Almost everyone that has cracked open an editor and created a program has wished for the power to slay issues (and occasionally users). Apparently, some of you wish for a lot more. There were lots of good entries, but many revolved around a few key themes:

  • Coding Better: 38%
  • Coding Faster: 11%
  • Coding Longer: 7%
  • Coding More Enjoyably: 30%
  • Taking Revenge on Frustrating Problems: 14%

Let's take a look at the entries that stood out the most. In third place is @mariogrimaldi89 for his desire to have the ability to read the client's mind to really understand what he wants [tweet]. We are right there with you, sir. We all know testing is important, and curse not having them when we have to work on somebody else's code. However, the love for testing sometimes briefly disappears when we're the ones writing the code. So, second place goes to @LeoPratlong for his desire to be able to write all tests at once: unit, functional and UI from user stories [tweet]. Last, but certainly not least, first place goes to @ben3342 for his wish to code with his mind, or if that doesn't work out, his beard [tweet]. Congratulations to all the winners and thanks to everyone else for taking time to enter.


So, there you have it.  Winners will be notified via email to arrange delivery of their cool yet baffling prizes, as described below.  Be sure to follow @Liferay for future Twitter contests, and keep rooting for Ray, my favorite superhero!

Prizes

Ben, Leo, and Mario will each get one of the 3 fabulous prizes!

Col. Fezziwig's Eccid Blaster Steampunk Ray Gun

This Eccid Blaster replica ray gun hearkens back to the days of Jules Verne and H.G. Wells. Like something out of a Tom Swift novel, the Blaster features incredible detail, hand-painted accents and has a removable "laser" cartridge on top.

Sphero!

The Sphero is simply a robotic ball that rolls around on the floor and is controlled through a virtual joystiq on your smartphone. After you’re finished being easily amused with your control over a plastic ball, download the free apps and have some more fun playing Sphero-integrated games such as a side-scrolling space game and even golf.

Arduino Uno Starter Kit

The Arduino Uno is a microcontroller board based on the ATmega328 (datasheet). It has 14 digital input/output pins (of which 6 can be used as PWM outputs), 6 analog inputs, a 16 MHz crystal oscillator, a USB connection, a power jack, an ICSP header, and a reset button.  Pefect for the tinkerer in you!

Twitter Contest: Web Developer Superpowers

Company Blogs May 6, 2012 By James Falkner

Web developers are often faced with a daunting task: make a compelling web experience as quickly as possible for as little cost as possible.  With the vast array of resources at their disposal thanks to the internet, you'd think this task would be easy, but soon reality sets in, and developers are left wishing they were able to do things outside the capabilities of mere mortals.  So, the question becomes:

If a web developer could have a superpower, what would it be?

You tell us.

Liferay launched its first Twitter contest today with this tweet. Our guest judge for the two-week long contest is journalist Josette Rigsby from CMS Wire. The contest will run until Sunday, May 20 at midnight US/Pacific. The rules are simple:

  • Reply to the Liferay tweet in the 140-character limit.
  • Include the two hashtags #supdev and #liferay in your tweet.
  • Be creative and have fun.

The participant with the best answer will receive a unique and fun prize. Two runners-up also receive prizes.

More about our guest judge

Josette Rigsby is an enterprise architect with more than 15 years experience leading information technology teams. Her articles for CMS Wire cover a wide range of enterprise CMS topics including open-source technologies, cloud-based software development and other tech trends. She has written extensively about Liferay for CMS Wire, including stories this year that tracked the growth of the Liferay community and her take on the launch of Liferay Portal 6.1. Follow her at @techielicous for her latest articles, and follow her on Google+ for entertaining posts about technology and culture.

Prizes

Three winners will receive one out of a set of fabulous prizes!

Col. Fezziwig's Eccid Blaster Steampunk Ray Gun

This Eccid Blaster replica ray gun hearkens back to the days of Jules Verne and H.G. Wells. Like something out of a Tom Swift novel, the Blaster features incredible detail, hand-painted accents and has a removable "laser" cartridge on top.

Sphero!

The Sphero is simply a robotic ball that rolls around on the floor and is controlled through a virtual joystiq on your smartphone. After you’re finished being easily amused with your control over a plastic ball, download the free apps and have some more fun playing Sphero-integrated games such as a side-scrolling space game and even golf.

Arduino Uno Starter Kit

The Arduino Uno is a microcontroller board based on the ATmega328 (datasheet). It has 14 digital input/output pins (of which 6 can be used as PWM outputs), 6 analog inputs, a 16 MHz crystal oscillator, a USB connection, a power jack, an ICSP header, and a reset button.  Pefect for the tinkerer in you!

Hungary Community Meetup

Company Blogs April 25, 2012 By James Falkner

If you are attending this year's Liferay Hungary Symposium next month in Budapest, also plan on attending the Liferay Hungary Community Meetup on May 16 (the evening prior to the symposium). This will be a free event, starting around 18:00 (possible a little later or earlier, depending on when the pre-symposium training completes!), at Zydeco Bar [enjoy some pictures]. Come meet your fellow community members (and friendly community managers), Liferay staff, and other interested parties with some free drinks, snacks, and interesting conversation! It'll be a great way to start off your symposium. If you are interested in attending, you must let us know by sending an email to events-hu@liferay.com!  Space is limited, as Zydeco is really cozy, so everyone will be friends by the end. See you in Budapest!

Liferay and Web Experience Standards

Company Blogs April 13, 2012 By James Falkner

Liferay has a long history of participation in and implementation of various standards in web software over the years. Notably, Liferay has participated in development of JSR-286 (Portlet 2.0), JSR-314 (JSF 2.0), WSRP, and CMIS. Liferay is once again participating in a new standard called WEMI (Web Experience Management Interoperability).

The Technical Committee for WEMI had its first Face-to-Face meeting earlier this month in Copenhagen (big thanks to Sitecore who hosted all of us!), and I attended as a Liferay representative. You can read the meeting minutes here (thanks to Peeter from Adobe!).  It's a bit of a departure from my ordinary duties as community manager, but as a long time user of Liferay's WCM (both UI and API), knowledge of our community's use of (and issues encountered in) Liferay, and with some experience in standards development, it is an interesting role to play for me. I had low expectations given it was the first meeting, the number of participants was large, and no agenda set for the meeting, but was pleasantly surprised by level of knowledge and experience of the group, our ability to stay focused on the getting work done, and the amount of agreement on basic problems.

The funny thing is, I believe that most if not all of the vendors present have already implemented much of what WEMI seeks to standardize, but in a proprietary way, so in that regard I believe it is a ripe area for standardization. Of course, the moment we all got in the same room, the scope and goals of the TC started to evolve, but that's not surprising either. I think the general consensus is that there is some meat to this (after all, if you thought the goals were bogus, you probably wouldn't participate), but in order to build interest and excitement, ensure broad adoption, and keep the TC engaged, we need first to declare some real world use cases for WEMI, useful problems that it can solve that cannot be solved today (through existing standards or existing tools), so we'll be working on those first. There are a couple that have been put on the table, such as site content indexing/archive/retrieval (especially across versions of a CMS, such as when upgrading Liferay), or providing additional context around content objects, for use by social engagement systems. Serge (Jahia) has an excellent pre- and post-writeup in this regard.

It's also important to keep it small and simple, while still providing real value in the first iteration. A 1.0 spec that simply sets the groundwork for 2.0 is a waste of time, because no one will stick around for 2.0 due to lack of adoption. So on that topic we all agreed as well. Also, as Boris (Magnolia) states, we mustn't make yet another "hierarchical nodes and data elements" standard -- we already have a couple of those, and it reminds me of this excellent XKCD comic:

WEMI must focus its efforts at a level above things like CMIS (in fact, WEMI started during CMIS development, where some participants felt it was missing several key parts to CMS interoperability) if it is to provide real value.

So, what's in it for Liferay?

Why would Liferay participate and implement such a standard?  There are many reasons, but here are some:

  • It's currently hard to programmatically aggregate and mashup content from Liferay for use in a browser or mobile device. Yes, you can use our JSON-friendly APIs to get at content, or our Java APIs, but you have to do a lot of groundwork to even get to the point where you can call the APIs and understand what you can do with it. This is one of the reasons we have things like the Asset Publisher (which does a lot of that groundwork for you) and the ability to export portlet content as widgets, neither of which give you programmatic access to the content and its associated metadata.
  • While documentation is improving, it's still not close to 100%, so there are many APIs and domain models that have little or no documentation.
  • Content archive/retrieval is done through import/export, but a) it's unusable across different versions of Liferay, and b) its format (LAR) is also mostly undocumented (though it's somewhat easy to infer its contents if you know a lot about Liferay's architecture), but in general only Liferay knows what to do with them.
  • Liferay provides a lot of functionality wrapped around content (versioning, workflow, social, etc) but most of this is stripped out or opaque when accessing content through content APIs. You have to do a bunch of extra work to find this additional data and relate it to the content.
  • Liferay customers often wish to aggregate web content from other systems, so having a good understanding of this up and coming standard will help us implement it faster.

A standard also forces implementers to adhere to the published, documented, (and in cases of a good standard) well-understood spec - and WEMI in particular (with its goal of simplicity and usefulness out of the gate) will define context and content metadata such that interesting content-centric functionality provided by vendors is exposed in a well known and consistent way.

Other Aspects

There were many other topics broached during the meeting, and I've included a few notable ones here:

  • Since in general, reuse/recycling is a good thing in many aspects of life, the group also recognizes that there could be existing standards that could be co-opted for use by WEMI as building blocks (for example, semantic constructs from HTML5 such as <article>, or build WEMI on top of OData and borrowing their querying capabilities) and more investigation is ongoing.
  • Content may appear to be arranged as a hierarchy when viewed in the context of a desktop website, but content served to a mobile device may have an entirely different organization. WEMI should allow for this.
  • Serialization/representational formats/protocol bindings: Let's stick with formats friendly to the consumers we are targeting with WEMI: meaning, let's use JSON and HTML, not XML and/or SOAP.
  • Access Control is specifically out of scope for WEMI (too complex, no least common denominator, etc), but the concept of contexts and personalization may prove useful. Contexts allow you to declare the purpose/destination of content during the retrieval/aggregation, so that even more aggregation work is done for you by the CMS.

In summary, I think this working group works well together, no one showed up and dropped a fully baked implementation and said "this is where we start", and I think we will make quick work of this and have something quite useful quite quickly.  So, I am looking forward to getting into it!

 

Community Roundup

Company Blogs April 11, 2012 By James Falkner

Hello Liferay Community!  It's been over 3 months since my last roundup, and for that I again apologize.  Seems like I start each one of these with an apology.  It's been a rather busy start to this year for Liferay, so I hope you'll forgive me as I try to separate the wheat from the chaff and present you once again, for your clicking pleasure, all the happenings in the Liferay world.  Let the show begin!

  • Liferay 6.1 CE was released earlier this year, and since then it's been downloaded over half a million times!  From the community perspective, this is fantastic news - it puts the technology in front of many, and hopefully the community will see some ROI from that :)  In addition, for our enterprise customers, Liferay 6.1 EE is also now available.
  • We have also experienced great growth in the community in terms of raw numbers, and this year we are also looking at increasing the quality, not just the quantity, of community initiatives and contributions.  It should be an exciting 2012!
  • The 2012 Symposia planning is well underway, with events planned in Stockholm, Budapest, Paris, San Francisco, Madrid, and Frankfurt, with more being planned.  If you have a chance to attend, it's a great way to meet the community and learn a little something too!  If you really want to give back, submit a paper for one of the many call for papers that are now open! If you can't attend a symposium, you may also be interested in learning about Liferay at one of the many Roadshows that start this month.
  • Besides Liferay-centric events, you'll find us in various places around the world, attending, sometimes sponsoring, sometimes giving talks, and it's great to meet fellow enthusiasts outside of our regularly scheduled events.  If you're in the Chicago area next month, check out CMSExpo, where Liferay is 1 of 3 featured CMS's! You'll also find us (or would have!) at CeBIT (with e-Spirit), OSCON, JavaOne, and many others.  
  • I know I like to talk about our awesome community in general terms, but it's the individual accomplishments and contributions that make it so awesome.  We are now recognizing individual achievements through the Liferay Contributor Awards.
  • Olaf continues to provide visibility into our community, through a regular podcast.  Most recently, Radio Liferay has featured Bruno Farache (aka Bruno Admin), Juan Fernández (Core Engineer and active Community guy), Michael Young (One of Liferay's Founders), Jeffrey Handa (Training), Greg Amerson (of IDE fame), and a host of others.
  • Apoorva has written many good articles on Liferay, the latest of which deals with caching of custom portlet data in Liferay.  
  • Have a question about Liferay front-end technologies?  Ask Bradley.  His Liferay Tips site is full of interesting tidbits of usefulness!
  • More Liferay User Groups are popping up!  We welcome new groups in Morocco, San Jose, Belgium, France, and India!
  • Speaking of user groups, the Liferay Spain User Group hosted a community event in Alicante back in January.  Rather than read minutes, check out the tweets coming from participants!  In addition, UK, Austin, DC, and many others are hosting events near you.  Keep an eye on the Community Events page for upcoming events.
  • Liferay Github Developers rejoice!  We now have tags on our repositories.
  • Our Liferay Community is but one of many in the software industry.  Roland (from Nuxeo) recently talked with community managers from several open source communities (including ours!), and wrote a nice piece on the practice of community management.  Part 2 of this is also available.
  • The Liferay BugSquad team was instrumental in implementing and refining many of the features found in Liferay 6.1.  After a short breather taken after the release, we are gearing up to get back into the action.  More details coming soon!
  • David Caron shows how easy it is to use the Vaadin UI Framework with Liferay.  Vaadin makes it easy to make very compelling, responsive web apps!
  • The Community Verifier team went on a rampage earlier this year, verifying and triaging over 350 bugs in a few short weeks.  Kudos to the whole team, and to Drew Blessing who took home the coveted title of "Contributor of the Month" for February. 
  • Our fearless community champion Ray continues his adventure.  Check out his new outfit!
  • Get your latest Liferay news and community activities through your favorite Android device.  Check out Liferoid Lite!
  • Liferay strives to keep up with new initiatives in the standards space. Liferay has of course been invoved in past standards efforts, such as JSR-168, JSR-286, CMIS, and more. Liferay is once again participating in the (free to all) upcoming OASIS standard around WEMI (Web Experience Management Interoperability). The title may be buzz-wordy, but the goals are not. If interested, get involved!
  • Liferay is Java-based, but you don't have to be a Java expert to use it or create websites with it.  In fact, suppose you are a Scala expert?  Miguel demonstrates that even Scala fits into the Liferay world. Also, node.js + Liferay.  Cool!
  • Wear your Liferay colors with pride, and choose from a vast array of products emblazened with the Liferay logo in our CafePress online store.  All products are prized to move, so act now!  But seriously... there is no markup on any item!
  • Earlier this year, the community began accepting new Liferay Community Projects - since then several have popped up, including a Facebook Integration project, OSGi bridges, Project Learn, and there are more in the pipeline.  It's a great way to get involved in open source!
  • For the JSF fans: Liferay is assuming leadership of the portletfaces.org project.  Check out the new Liferay Faces Project page for details.
  • Somewhat random tweet:  Jonny Olliff-Lee: Today @FlizLovesKon solved a tricky problem in #Liferay, while showing what I love & dislike about Open Source Software! Well done dude!
  • Maven mavens can now rely on Liferay's Maven Artifacts.  Also, check out the Maven documentation for tips on getting started with Liferay and Maven.  Jan Gregor will also do a LIVE webinar on this subject next week.
  • Liferay has been talking about App Marketplaces for a few years now, and with much fanfare we announced the Liferay Marketplace last year.  It's been a while in the making, but we should see the first public beta later this month!  In advance of that, Brian Kim (COO of Liferay) has written a nice article for ECommerce Times talking about marketplaces in general.
  • The always entertaining and informative blogger Dana Blankenhorn writes about Liferay's "Comfort of Normal Business". It's spot-on.
  • XMLPortletFactory has been upgraded to work with Liferay 6.1.  This is a nice tool to generate CRUD Liferay Apps (including source!) from XML definitions. 
  • If you're into workflows and Activiti, check out this handy tutorial on how to integrate it with Liferay.
  • After more than 400 downloads of the previous versions and good feedback from several users around the world, Juan released a new version of the Wordpress Importer Portlet (1.2).  Check it out!
  • Have you ever wondered how to connect Liferay to a different database?  Well, wonder no more: here's how to do it with the Plugins SDK.
  • You may have noticed increased participation in social media sites such as Wayin [More Info].  We're expanding our reach beyond forums and other traditional outlets, so get involved!  Check out our new Facebook "Community Input" page - powered by Wayin.
  • You may have also seen Liferay stacks available through BitNami.  Now, with a couple of clicks, you can enable a Liferay-powered cloud hosting environment through BitNami Cloud Hosting.  Coooool!
  • Interested in some highly technical, yet informative presentations (Tech Talks) from the folks in Spain?  Check out this tech talk repository.  "You will find slides, source code examples, and much more about HTML5, programming languages, cloud computing, and other crazy stuff"
  • Liferay is often used for building all kinds of sites.  As an example of its social prowess, and to see what it might be like to combine Pinterest, Amazon, and Facebook, check out what CMS Report has to say about Social Umami!
  • Wow, a super-handy reference for jQuery/YUI/AlloyUI developers.  How do you do jQuery's $('div.foo:first') in AlloyUI? Why, it's A.one('div.foo') of course!  And many more..
  • Interesting way to map out the various Liferay apps out there.  PealTrees is like a roadmap of.. well.. things.  Here's the Liferay corner :)
  • TheServerSide has some nice coverage of Liferay, from Vivek's "10 Reasons to Love Liferay" to Cameron's "5 neat things".
  • Liferay 6.1 brings with it the ability to mount multiple content repositories (e.g. CMIS, Documentum, Sharepoint, etc).  And now Tomas brings the ability to mount OS filesystems!  Yes, this means you can finally get rid of your OS desktop and use a browser and Liferay for everything! ;-)
  • I know that you are lamenting the fact that the built-in WYSIWYG editor in Liferay (CKEditor) does not have the out of box ability to write complex math formulas.  Lament no more, with this nice plugin.
  • One piece of FUD often heard regarding open source is that it is of lower quality, because so many people hack on it for so long.  Not so, for open source as a whole.  
  • Recent Blogs: Again, there are too many to list, just visit or subscribe to blogs.liferay.com and you'll be set.  Faces, McNealy on Liferay, Contributor Awards(Me!), Scala, Europe Symposium CFP, Maven Themes, Faceted Search, SAML, Kaleo Actions, and more!
  • Recent Wiki page updates: Liferay Developer, IntelliJ, Web Services, CMIS, WebDAV, Websphere 8, and much, much more (too many to list)

I hope you find this aggregration of interesting community news useful.  And I promise to keep them coming as often as possible.  I'll leave you with this bit of humor:

“Twitter is a great place to tell the world what you’re thinking before you’ve had a chance to think about it.” - Chris Pirillo

Liferay Contributor Awards

Company Blogs March 29, 2012 By James Falkner

At last year's West Coast Symposium, Liferay awarded Community Excellence Awards to several of our valued business partners.  This award went to those partners whose employee's had the biggest impact on and contributions to on our open source community, regardless of how much business (i.e. money) was generated.  Liferay enjoys a strong partner network, with over 115 global partners, and we wanted to show how much we appreciated their efforts in the community.

But there is another class of community member that deserves recognition:  YOU!

Many of our Liferay Community members are affiliated with Liferay because they use it and love it, and aren't associated with any partner companies.  It can be argued that contributions from this class of member is even more valuable, since they are done because of the love of the platform, the love of open source, or simply a desire to give a little back.

Regardless of our community member's reasons for participating and contributing, a great way to recognize individual achievements is with regular individual awards.  To that end, we in the community are announcing a new program: Liferay Contributor Awards!

Liferay Contributor Awards

This award is given quarterly (every three months) to the top 3 community members who demonstrate the most unique and valued participation and contributions to our community during the time period.  Everyone likes recognition of their achievements, and to that end, each set of quarterly winners will be featured on the community homepage, and we'll have a hall of fame board to remember your achievements, and be able to claim title to the throne for that period.  Liferay has its roots in open source, is built with lots of blood, sweat, and tears from our community members, and these awards represent the best and most valued contributors we have. 

Other Perks

As the winner of a quarterly Liferay Contributor Award, in addition to the recognition, you will also be entered into a random drawing for a prize!  This quarterly prize will be one of:

  • A free seat at a Liferay Training of your choice within the next year (subject to availability, and not including travel or lodging or other costs -- just the training and associated materials).
  • A free conference pass to an upcoming Liferay Symposium of your choice within the next year (not including travel or lodging or other costs -- just the conference pass)
  • A $200 gift card to one of many choices of online stores
Since there are 3 quarterly winners, you will have a 1 in 3 chance of winning.  Pretty good odds!
 

How do I win?

Ah, the most important question! While we cannot divulge our super-secret formula for determining quarterly winners, you can guess at what makes you more likely to win.  Speaking at a Liferay Symposium (the Call For Papers is already open for France, North America, and Europe Symposiums!!), Useful forum and wiki activity, contributions to documentation, providing translations, contributing bugfixes or improvements at issues.liferay.com, participation in User Groups, helping others on IRC, developing and contributing open source plugins for the Liferay Marketplace, blogging about Liferay (on and off liferay.com), and a host of other activities (many others can be found on our participation and contribution pages) are some of the examples of what makes a great Community Contributor.
 
Do not think that you have to contribute to all of the above categories in order to win!  Some members are great at answering forum questions, but don't fix bugs.  Others have technical writing skills and could make valuable contributions to the documentation, but are afraid to stand up in front of audiences.  Still others are awesome engineers and can diagnose bugs and implement improvements, but don't want to create plugins.  We all have strengths, and it is generally where you can concentrate most of your effort (but don't be afraid to try something new, which can also be rewarding).
 

Nominations

In addition, community members are encouraged to nominate their members for the award.   Did you get significant help from someone in the community on a ridiculously difficult task?  Do you know of an unsung hero that should be recognized?  Do you know of a community member who has demonstrated unique and significant value to the community, which may not be obvious to community staffers? Just drop us a note at community@liferay.com explaining why you think that a particular community member deserves the award.  Nominations will be considered along with other activities that occur throughout the award period.
 

When do we start?

We've already started!  The first quarter of 2012 is coming to a close in a few days.  In early April, I will announce the first quarter's Liferay Contributor Award winners, and the drawing will be held at that time as well.  You still have 72 hours to get your contributions in for this quarter, and be thinking about how you will dethrone the winners next quarter!  Good luck to everyone!

Liferay Sync - Release Candidate

Company Blogs February 28, 2012 By James Falkner

 

Liferay Sync Release Candidate 1 is now available [Download]!  Liferay Sync is an add-on product for Liferay 6.1 CE and EE that enables your users to publish and access documents and files from multiple environments, including Windows and Mac OS Desktops, and iOS-based mobile platforms.  You can read more details on its product page.

The initial release earlier this month was a Beta release.   Since then, the Liferay team has worked with our internal and external community to fix bugs and add additional improvements, and you can now download the first release candidate!  For iOS users, the Beta release is available now, but the usual 7-10 day waiting period means that the RC1 build will be available sometime next week, and your iOS device will be sure to tell you about it via its auto-update feature.

Changes since Beta

Many small items have been fixed in this release candidate.  You can browse the full list, but I've highlighted a couple below:

  • Igoring Deletes - if you place a .ignore-deletes file in the root folder on your local client, then deleting local files has no effect on the server, and the files will not be re-downloaded after a client restart.
  • Fixed all known internationalization and filename encoding issues
  • Windows and Mac OS X integration cleanup
  • General usability and stability improvements

The full GA release will happen in late March or early April, after ferreting out any last minute issues with this release candidate.  And for you Android users, I sense a disturbance in the force for you, so stay tuned!

Update on Marketplace

Company Blogs February 11, 2012 By James Falkner

As you know, Liferay announced the Liferay Marketplace with much fanfare last year. In developing the Liferay Marketplace, we had to take an approach different from those that target consumers of mobile devices (such as Apple's wildly successful App Store). We have been feverishly working on its release since then, and are planning to open the marketplace for beta testing in April! This is later than our original date, but I think it will be worth the wait. Through feedback at events, online, and internally, we have decided to delay the release to add in several new enterprise-level features outlined below.

Company Registration and Profiles

One of the features that we’ve been focusing on is the ability for companies and organizations to maintain their company profile on the Marketplace. This profile will allow organizations to establish a presence above and beyond the set of apps they produce. Details such as company logos, descriptions, website links, marketplace activity, and apps will be made available from company profiles.

Company Users

Individual app authors can be associated with a company, such that the apps that they produce are also associated with their company. This is a typical case for companies of all sizes that produce multiple apps. Potentially, one or two
 technical resources can then be assigned to manage the apps on behalf of the company and also manage the company’s user list.

Company Purchases

In many cases, IT departments want to have more control over the purchasing of licenses for apps that are used across the company. Alternatively, they might wish to restrict the set of apps that are allowed within their networks. To that end, on the Liferay Marketplace, IT administrators can bulk-purchase licenses on behalf of the company (and using the company credit card), giving immediate access to these apps by users (employees) associated with the company.

Metrics

Everyone, including Liferay, wants to know how they are doing. For this, fine- grained reports with pretty graphs can be generated for a number of different metrics, including purchases, views, downloads, etc. You can quickly spot trends in your apps and get reports about things like revenue, downloads, etc.

The Rest

All of the other features of Marketplace are more or less as described in the current Marketplace information. There have been some slight tweaks to improve workflows for app developers, and improvements in User Profiles as well.

So please bear with us as we prepare to launch the Liferay Marketplace. It's coming together nicely, and it is an important milestone for the Liferay Platform! We hope you like it!

Introducing Liferay Sync

Company Blogs February 1, 2012 By James Falkner

[中文][Español]

Liferay makes it easy to create compelling websites, publish and share content, and manage documents through its award-winning open web platform.  Today, Liferay is introducing Liferay Sync, an innovative way to extend the reach of your documents and files to desktop and mobile environments.

What is Liferay Sync?

Liferay Sync is an add-on product for Liferay 6.1 CE and EE that enables your users to publish and access documents and files from multiple environments, including Windows and Mac OS Desktops, and iOS-based mobile platforms.  As users add and collaborate on documents and files, Liferay Sync automatically synchronizes them across all configured Sync clients, making documents available for viewing or editing in the native environments in which Liferay Sync is supported.  Liferay Sync is fully integrated into the Liferay Platform --  features such as authentication, versioning, workflow, and social collaboration extend naturally into the supported environments. Liferay Sync also makes documents available while offline -- with automatic synchronization once reconnected.

Downloads

For Mac OS or Windows, visit the Liferay Sync product page, and click Get it Now (on the right-side navigation menu) to download the client application for your desktop environment.  Once installed, follow the on-screen instructions to configure your client to connect to an existing Liferay 6.1 deployment using valid credentials.

For iOS, visit the App Store and search for Liferay, and install the Liferay Sync App.  Once installed, follow the on-screen instructions as above. (Update: We are in the process of working with Apple to get the Liferay Sync iOS app published - we expect it to be available by February 8).

How does it work?

Liferay Sync manages documents and site information through Liferay 6.1's built-in web services.  Clients securely communicate to Liferay using user-supplied credentials, such that each user can only access those documents and sites for which they have permissions.  Changes made through Liferay Sync are immediately available to the rest of the Liferay Platform, including users accessing Liferay through traditional web-based interfaces.

For desktop environments, a new folder structure is created and used for synchronizing files.  Files found therein can be treated as any ordinary file.  Credentials, sync frequency, and other folder options can be configured in-client.  Native desktop notification events keep you abreast of what Sync is doing, and native menu and taskbar integration keep Sync controls within easy reach.

Mobile environments are naturally dependent on the way in which documents are handled.  For iOS, documents are maintained in a file list, and can be viewed by clicking on the files themselves.  External files accessible from other apps can be "opened" using Liferay Sync, thereby dropped into your Sync folder and synchronized across other Sync clients.  "Pulling down" on the Sync file list forces a refresh (automatic sync frequency can be configured as well).

This Liferay Sync release is designed to work with Liferay 6.1 Community Edition and the upcoming Enterprise Edition.  When used with the Enterprise Edition of Liferay, Sync will enable users to synchronize documents and files across all of the sites for which they have access.  

Beta Release

This release is a beta release.  As such, you may come across bugs or unexpected behavior.  Like other Liferay projects and products, we are using our JIRA installation at issues.liferay.com to manage issues. If you find an issue, make sure to read and understand the JIRA Guidelines, and file issues under the new SYNC project.

You may also visit the Liferay Sync forum and post questions or feedback.

What's next?

We hope that the wider Liferay community will find this add-on useful for both CE and EE use cases.  In the coming weeks, we will work with the community to iron out any last minute issues before general availability (GA).  In addition, full documentation will be available for this add-on when the GA release is available.  

Community Roundup

Company Blogs January 19, 2012 By James Falkner

Welcome to my first community roundup of 2012.  Yes, I know I've been slacking big time.  The holiday break, and inevitable pile of work to do post-holiday, has kept me away from the roundup.  But I'm back with a rundown of all that is happening in the Liferay community, so start clickin'!

  • Of course the Big News so far in 2012 is Liferay's release of the 6.1 Community Edition.  Packed with features and improvements, including a new setup wizard, enhanced WCM and user management, and many more.  See some of the external coverage here, here, and here (and here, auf Deutsch).  Also don't miss Seb's first review!  A great start to the new year! (Maven fans - here's your present).
  • One of the things I'd like to see in 2012 is getting back to the source in our open source roots.  In that vain, I've kicked off a new way to be a part of the community: Liferay Community Projects! We are going to elevate these kinds of community-driven open source projects to a higher level of visibility on liferay.org, providing more collaboration tools (like user groups) and project status. If you are interested in starting a new project (or housing an existing project) on liferay.org, fill out the form and get started. 
  • BitNami wasted no time integrating Liferay 6.1 into their set of available stacks.  You can get Liferay as an easy to use installer, a VM image, or an AMI for Amazon EC2!  
  • Late last year, Liferay held it's 2nd annual Liferay Italy Sympsium in the beautiful and historic city of Rome.  Check out the pictures from the venue, and check out SMC's nice video recap and pictures!  Also check out this nice written recap (in Italiano) by Andrea.
  • Speaking of Liferay Symposia, we are gearing up for the 2012 season.  The first one out of the gate will be our first ever in Scandinavia, The Liferay Nordic Symposium in the idyllic city of Stockholm, Sweden.
  • Olaf has published several more Radio Liferay releases, the latest of which features several of our high profile community members discussing their contributions and thoughts on our community. Check out the Radio Liferay feed page for more details and links to the streams.
  • TSG is fresh from Alfresco DevCon and writes up a nice piece on Lessons Learned integrating the two.
  • Liferay's User Groups continue to expand, with new groups beginning in Finland, the UK, and Detroit. Visit the User Groups page to see all the recent activity.
  • Several of you may have heard rumblings about OSGi and Liferay.  Check out this interview with Raymond Augé regarding the Arkadiko project, which is an upcoming Liferay Community Project.  
  • For you Londoners, a first London Liferay Meetup happened on January 19th.  Pics and wrap-ups will hopefully be forthcoming!
  • Liferay strives to keep up with new initiatives in the standards space.  Liferay has of course been invoved in past standards efforts, such as JSR-168, JSR-286, CMIS, and more.  Liferay is once again participating in the (free to all) upcoming OASIS standard around WEMI (Web Experience Management Interoperability).  The title may be buzz-wordy, but the goals are not.  If interested, get involved!
  • Sagar gives a nice rundown of applying advanced workflow to custom assets.  
  • Drew spent some time on Liferay's IRC channel and with the help of the community was able to successfully (and quickly) complete an upgrade from 6.0 -> 6.1.  Nice work!  Drew spent his unexpected free time creating this masterpiece.
  • Here is a very interesting piece of work to reverse-engineer Liferay's entity relationships.  I was really hoping a nice ER diagram was waiting for me at the bottom of this post, but perhaps an astute reader cares to take a stab at making one?
  • Are you kidding me?  An Android app that allows one to peruse social content from a Liferay site?  Wow.  I can't wait for someone to try it out and let me know what it looks like.  Screenshots look very promising!
  • The Liferay Community's BugSquad team recently concluded their efforts for 6.1 and decided on the two best tee shirt designs.  Shirts will begin shipping soon to those who participated.  Wear your shirt with pride, for it is this team that made a huge contribution to Liferay 6.1! 
  • EmDev has released a new version (6.1) of their Activiti Liferay plugin.  This brings support for Liferay 6.1 (yay!), Activiti 5.8 and some other minor improvements.  Thanks Alexey!
  • What do you know about Kaleo?  Now I know 10 more than you you..
  • Many of us are comfortable with Liferay technology and remember what it was like when we were not so familiar with it. There are many more community members who are struggling with basic Liferay concepts, and need a quick intro to common tasks. The Liferay Community is embarking on a new effort to contribute high quality learning guides (in the form of videos and written word).  Check out the Liferay University Video Topics page and sign up for your favorite topic!
  • Attention MacBook Air owners.  You have a new skin.  You can thank me later.
  • Our very own Paul Hinz wrote a nice piece on Portals vs. Web CMS for CMSWire.  A good read, and it's not a blatent plug for Liferay either :)
  • More news on the Liferay IDE front: Liferay IDE 1.5 is now available!  Features such as a hook configuration editor, importing binary projects, JSP debugging over remote Liferay links, and first class support for GlassFish.
  • More from Bradey Wood's Liferay Tips - Embedding Navigation Portlet into Layout File.  Keep 'em coming Brad!
  • If you use Liferay's Friendly URL mapping functionality, you may appreciate this handy friendlier friendly URL Mapper from DevJohnny.  
  • For those of you into BlazeDS and Adobe Flex, here's a nice writeup by fandry explaining how to create Liferay portlets that use both.  
  • Our awesome Liferay Community Verifier team is hard at work scouring the Liferay issues database and improving its quality. A contest is ongoing, if you're interested, follow the thread and sign up!  You can follow the progress of the team here.
  • This Saturday in Alicante the Liferay Spain User Group will hold a meetup.  The meetups thus far have been very well attended, and you do not want to miss this one if you can make it! Arroz y Liferay!  Can't be beat :)
  • Random tweet: @benb3342: #Liferay skills on LinkedIn up 29% year on year.
  • Ever wanted to do an ls -l from a portlet?  Well now you can, with the Liferay Portlet Shell!
  • Liferay Workflow provides a lot of features, one of which is notifications.  When a workflow item lands in your queue, you want to know about it.  Configure email notifications using this handy reference.
  • Wonder what powers Liferay staffers?  Now you don't have to wonder!
  • Chris Stavros from LEVEL Studios is found in this gem from last year's Liferay West Coast Symposium.  I personally found his talk and his demo (which is not in the video) very inspiring and eye-opening to the possibilities of really useful ways to use Liferay.
  • James McGovern, one of our industry's notable thought leaders, provides his thoughts on Liferay's Service Builder and Liferay Security.  Thanks James!
  • Here's a handy script to.. ahem.. kill Liferay processes on unix-based systems.  Hopefully you don't need this too often :)
  • Too many blog posts and wiki page updates to list today.  Well, ok, a couple.  DDL III.  SASS.  Sesame.  Social Equity. Github Cheating.  That is all I have time for.  The rest can be found at blogs.liferay.com.

I hope you all have a great, safe, and productive 2012 in whatever endeavour or passion you might have! I'll leave you with this quote:

"A computer lets you make more mistakes faster than any invention in human history - with the possible exceptions of handguns and tequila." - Mitch Ratcliffe

On with the show!

Writing Liferay Apps with Web Content Templates

Company Blogs January 11, 2012 By James Falkner

One of the often overlooked features of Liferay's WCM system is the ability to write non-trivial apps using it.  There have been a few blog posts about this, notably Ray Augé's Advanced Web Content Example With AJAX.  In the community, it's great for me because I can quickly create interesting visualizations of community data and share it with you immediately.  There are some pros and cons to this approach:

Benefits:

  • No compilation needed - WCM relies on the use of Templates, written in interpreted (i.e. scripted) languages such as Velocity Templates.  This means you can quickly make a change and see your results quickly.
  • No deployment needed - since Web Content isn't a java portlet, you don't need to re-deploy.  More importantly it means you don't have to wait for a website administrator to deploy it if you cannot deploy yourself!
  • You can combine presentation (e.g. HTML/JS/CSS) and logic (e.g. Velocity) into the same template, keeping related code together.

Drawbacks:

  • Velocity is first and foremost a templating/presentation language.  It is not a general purpose computing language, so die hard MVC types will probably dismiss the use of Velocity in this way and call me a heretic/lunatic.  It's great for prototyping though!  
  • Currently, Structures and Templates aren't versioned, and they do not participate in Liferay's Workflow system.  So you can't revert to older (working) versions of templates if you make a mistake.
  • No compilation needed - so it's not as fast as the native bytecode that would result from the equivalent java source code.  But it's still quite fast.
  • Velocity and other scripting languages have weird quirks that often cannot be caught except through trial and error, and limitations (e.g. no use of generics) that compiled/strongly typed languages have.
  • You can combine presentation (e.g. HTML) and logic (e.g. Velocity) into the same template :)

In my opinion, Liferay WCM is a very good solution for app prototyping or for non-trivial apps that don't have tons of logic or page flows in them.  You have already seen an example of this in the Community Activity Map, and the example I use below forms the basis for the Hot Topics app that you can now see on liferay.org.

Basic Template Template

To get started creating an app of this nature, you need to start with simple Web Content Template that is itself a template:

#if ($request.lifecycle == "RENDER_PHASE")

  ## This phase will handle the presentation code (i.e. HTML/CSS/JS).  Any calls
  ## to the ${request.resource-url} will retrieve the result of evaluating the below
  ## RESOURCE_PHASE below.

#elseif ($request.lifecycle == "RESOURCE_PHASE")

  ## This phase will handle the AJAX request like a portlet's serveResource() method

#end

So decide what needs to be executed on the server side, and put it in the RESOURCE_PHASE.  This is typically where most if not all of the business (i.e. non-presentation) logic goes.  Put the presentation logic in the RENDER_PHASE.

Hot Topics Example

For this app, I want to show which threads have the most posts in the last week.  So, I needed to query Liferay's Message Boards.  Since there is no getMostActiveThreadsInTheLastWeek() method (I know.. what's up with that??), I needed a custom query.  This means using Liferay's DynamicQuery feature.  But from Velocity?  Turns out it's not that bad.  Here's the full RESOURCE_PHASE code to create and execute a Dynamic Query, and generate a JSON object as a result which contains the most active threads in the last week:

#set ($portletNamespace = $request.portlet-namespace)
#set ($scopeGroupId = $getterUtil.getLong($request.theme-display.scope-group-id))

#if ($request.lifecycle == "RENDER_PHASE")

  ## bunch of display logic to show the JSON result nicely

#elseif ($request.lifecycle == "RESOURCE_PHASE")
  #set ($logFactory = $portal.getClass().forName('com.liferay.portal.kernel.log.LogFactoryUtil'))
  #set ($log = $logFactory.getLog('mylog'))

  #set ($portalBeanLocator = $portal.getClass().forName("com.liferay.portal.kernel.bean.PortalBeanLocatorUtil"))
  #set ($jsonFactory = $portalBeanLocator.locate("com.liferay.portal.kernel.json.JSONFactoryUtil"))
  #set ($mbMessageLocalService = $portalBeanLocator.locate("com.liferay.portlet.messageboards.service.MBMessageLocalService.velocity"))
  #set ($mbThreadLocalService = $portalBeanLocator.locate("com.liferay.portlet.messageboards.service.MBThreadLocalService.velocity"))

  #set ($calClass = $portal.getClass().forName("java.util.GregorianCalendar"))
  #set ($mbMessageClass = $portal.getClass().forName("com.liferay.portlet.messageboards.model.MBMessage"))
  #set ($mbThreadClass = $portal.getClass().forName("com.liferay.portlet.messageboards.model.MBThread"))
  #set ($dqfu = $portal.getClass().forName("com.liferay.portal.kernel.dao.orm.DynamicQueryFactoryUtil"))
  #set ($pfu = $portal.getClass().forName("com.liferay.portal.kernel.dao.orm.ProjectionFactoryUtil"))
  #set ($ofu = $portal.getClass().forName("com.liferay.portal.kernel.dao.orm.OrderFactoryUtil"))

  #set ($now = $calClass.getInstance())
  #set ($weeksago = $calClass.getInstance())
  #set ($prevweeks = 0 - $getterUtil.getInteger($period.data))
  #set ($V = $weeksago.add(3, $prevweeks))


  #set ($q = $dqfu.forClass($mbThreadClass))
  #set ($rfu = $portal.getClass().forName("com.liferay.portal.kernel.dao.orm.RestrictionsFactoryUtil"))

  #set ($groupIdCriteria = $rfu.ne("categoryId", $getterUtil.getLong("-1")))
  #set ($V = $q.add($groupIdCriteria))

  #set ($groupIdCriteria = $rfu.eq("groupId", $getterUtil.getLong($scopeGroupId)))
  #set ($V = $q.add($groupIdCriteria))

  #set ($companyIdCriteria = $rfu.eq("companyId", $getterUtil.getLong($companyId)))
  #set ($V = $q.add($companyIdCriteria))

  #set ($statusCriteria = $rfu.eq("status", 0))
  #set ($V = $q.add($statusCriteria))

  #set ($lastPostDateCriteria = $rfu.between("lastPostDate", $weeksago.getTime(), $now.getTime()))
  #set ($V = $q.add($lastPostDateCriteria))

  #set ($V = $q.setProjection($pfu.property("threadId")))

  #set ($res1 = $mbMessageLocalService.dynamicQuery($q))
  #set ($q2 = $dqfu.forClass($mbMessageClass))

  #set ($inCriteria = $rfu.in("threadId", $res1))
  #set ($V = $q2.add($inCriteria))

  #set ($createDateCriteria = $rfu.between("createDate", $weeksago.getTime(), $now.getTime()))
  #set ($V = $q2.add($createDateCriteria))

  #set ($V = $q2.setProjection($pfu.projectionList().add($pfu.groupProperty("rootMessageId")).add($pfu.alias($pfu.rowCount(), "msgCount"))))
  #set ($V = $q2.addOrder($ofu.desc("msgCount")))
  #set ($V = $q2.setLimit(0, 7))

  #set ($res2 = $mbMessageLocalService.dynamicQuery($q2))

  #set ($jsonArray = $jsonFactory.createJSONArray())

  #foreach ($msgSum in $res2)

    #set ($rootMsgId = $msgSum.get(0))
    #set ($msgCount = $msgSum.get(1))
    #set ($subject = $mbMessageLocalService.getMessage($rootMsgId).getSubject())

    #set ($jsonObject = $jsonFactory.createJSONObject())
    #set ($V = $jsonObject.put("subject", $stringUtil.shorten($htmlUtil.escape($subject), 55)))
    #set ($V = $jsonObject.put("msgid", $rootMsgId))
    #set ($V = $jsonObject.put("msgCount", $msgCount))
    #set ($V = $jsonArray.put($jsonObject))
  #end
{
"jsonArray": $jsonArray
}
#end



Details

There are many things going on here:

Velocity Debugging/Logging

  #set ($logFactory = $portal.getClass().forName('com.liferay.portal.kernel.log.LogFactoryUtil'))
  #set ($log = $logFactory.getLog('mylog'))
This gives me a way to debug the code by looking at the server log (if you are using this kind of app so that you can bypass your website admin, chances are you won't have access to the server logs, so this won't help you).  To emit debug info, I can do things like $log.error($msgCount) or $log.error("Hi There").
 

Creating references for arbitrary JVM classes

  #set ($calClass = $portal.getClass().forName("java.util.GregorianCalendar"))
This allows me to create references to any class known in the JVM for doing things like calling static methods, etc.  Many of these are needed for constructing Dynamic Queries.
 

Calculating Now and a Week Ago

  #set ($now = $calClass.getInstance())
  #set ($weeksago = $calClass.getInstance())
  #set ($prevweeks = 0 - $getterUtil.getInteger($period.data))
  #set ($V = $weeksago.add(3, $prevweeks))
This creates Calendar objects representing the current time, and a week ago.  Note that the number of weeks is specified in a web content structure using the period structure element.
 
The rest of the code constructs two dynamic queries:
  • The first one ($q) queries for MBThread entities that have a categoryId of -1 (MBThreads that do not have a categoryId of -1 are not threads from the message boards portlet, instead they are threads for things like comments on document library entries, etc).  The query also includes other criteria, like groupId/companyId must match the "current" groupId/companyId of the site in which the web content is placed, the status must be 0 (indicating it is an approved (i.e. not draft or deleted) entry), and most importantly the lastPostDate must be between my desired time period start and end.  Finally, I am not interested in all of the MBThread entity - I just need the threadId.  So my query includes a Projection that only returns the threadId.
  • The second query ($q2) queries for all MBMessage entities that match my new critieria: they must have a threadId of one of the threads identified in the first query (hence the in criteria), and the message's createDate must also be between my start/end dates.  This is to avoid counting messages in the thread that occured before the cutoff dates.  Finally, this gem:
  #set ($V = $q2.setProjection($pfu.projectionList().add($pfu.groupProperty("rootMessageId")).add($pfu.alias($pfu.rowCount(), "msgCount"))))
  #set ($V = $q2.addOrder($ofu.desc("msgCount")))
  #set ($V = $q2.setLimit(0, 7))
This creates a projection that is grouped by the rootMessageId, since each message in the same thread will have the same rootMessageId (which I eventually use to construct the URL to the message), and includes a count of the messages that match (with an alias defined so I can refer to the row count when specifying the order of the results via addOrder()).  I also limit the results to 7 because I don't want to show any more than that (this is a simple app).  This second query returns a result table that looks like:
 
rootMessageId rowCount (alias="msgCount")
10232 (the id of the first message in the thread) 22 (the number of MBMessages with this rootMessageId in the date range)
11542 21
12323 18
...and so on ... and so on (descending order)

So after the Dynamic Queries executes, it's just a matter of constructing a JSONObject (and sanitizing/sizing the actual text of the subject of the thread) and returning it.

Liferay WCM and Velocity Gotchas

Velocity is first and foremost a templating/presentation language.  It is not a general purpose computing language, so die hard MVC types will probably dismiss the use of Velocity in this way and call me a heretic/lunatic.  But it also means that some things are hard (or impossible, for example did anyone catch that I hard-coded Calendar.MONTH to be 3 ?  You can't reference static member variables of a class unless it is already part of the Velocity context in which a template is evaluated).  There are many other perils awaiting the adventurous Velocity coder.  I learned many things through trial and error (and the help of my IRC friends on the #liferay channel!).  Here are some more:
 
  • Don't forget to use $var instead of var.  If you forget the $, you won't get syntax errors, just silent errors and half of your code will next execute.
  • If you can use an intelligent IDE (like IntelliJ IDEA or Eclipse) and its Velocity syntax checking, do it!  I saved tons of time by using IntelliJ and declaring variable types, which allowed for autocompletion and type checking.  For example, I had tons of these:
#* @vtlvariable name="request" type="java.util.Map" *#
#* @vtlvariable name="httpUtil" type="com.liferay.portal.kernel.util.HttpUtil" *#
#* @vtlvariable name="htmlUtil" type="com.liferay.portal.kernel.util.HtmlUtil" *#
#* @vtlvariable name="obc" type="com.liferay.portal.util.comparator.UserLastNameComparator" *#
#* @vtlvariable name="serviceLocator" type="com.liferay.portal.velocity.ServiceLocator" *#
#* @vtlvariable name="teamLocalService" type="com.liferay.portal.service.TeamLocalServiceUtil" *#
#* @vtlvariable name="mbMessageLocalService" type="com.liferay.portlet.messageboards.service.MBMessageLocalServiceUtil" *#
#* @vtlvariable name="mbThreadLocalService" type="com.liferay.portlet.messageboards.service.MBThreadLocalServiceUtil" *#
  • Any time you access things from the ${request.theme-display}, or access one of your WCM structure fields that represent a number (but are of type "Text" in the template), they are probably not of the the type that you want.  You need to use generous amounts of $getterUtil.getXXX calls to make sure.  For example, 
#set ($scopeGroupId = $getterUtil.getLong($request.theme-display.scope-group-id))
will work (and makes $scopeGroupId a Long), whereas
#set ($scopeGroupId = $request.theme-display.scope-group-id)
Will results in a $scopeGroupId that is not a Long, and so if you pass it in to a method that is expecting a Long, it won't work, and will probably silently fail and you'll be befuddled.
  • If you want to create a new instance of a class (e.g. a HashMap) you can'y say new HashMap().  Velocity does not know what "new" is - after all, you're using a presentation/templating language, not Java!   But we're using it for more than display.  So as a workaround you can do things like $portal.getClass().forName("java.util.HashMap").newInstance().
  • Accessing elements of an array cannot be done using $array[0].  You have to use $array.get(0).
 

The Full Source to Hot Topics

Here's the full source, including my display code, and my IntelliJ variable declarations (which may have some unnecessary declarations, but I use this block for other stuff too).  If you spot errors or poor coding technique or whatever else, please let me know so I can learn!
#* @vtlvariable name="portletNamespace" type="java.lang.String" *#
#* @vtlvariable name="portal" type="com.liferay.portal.util.Portal" *#
#* @vtlvariable name="getterUtil" type="com.liferay.portal.kernel.util.GetterUtil" *#
#* @vtlvariable name="stringUtil" type="com.liferay.portal.kernel.util.StringUtil" *#
#* @vtlvariable name="max-members" type="com.liferay.portlet.journal.util.TemplateNode" *#
#* @vtlvariable name="team-name" type="com.liferay.portlet.journal.util.TemplateNode" *#
#* @vtlvariable name="section-members" type="com.liferay.portlet.journal.util.TemplateNode" *#
#* @vtlvariable name="groupId" type="java.lang.String" *#
#* @vtlvariable name="sectionMembers" type="java.lang.String" *#
#* @vtlvariable name="locale" type="java.util.Locale" *#
#* @vtlvariable name="companyId" type="java.lang.String" *#
#* @vtlvariable name="scopeGroupId" type="java.lang.String" *#
#* @vtlvariable name="sectionName" type="java.lang.String" *#
#* @vtlvariable name="section-name" type="com.liferay.portlet.journal.util.TemplateNode" *#
#* @vtlvariable name="params" type="java.util.LinkedHashMap" *#
#* @vtlvariable name="users" type="java.util.List" *#
#* @vtlvariable name="user" type="com.liferay.portal.model.User" *#
#* @vtlvariable name="themeDisplay" type="com.liferay.portal.theme.ThemeDisplay" *#
#* @vtlvariable name="languageUtil" type="com.liferay.portal.kernel.language.LanguageUtil" *#
#* @vtlvariable name="request" type="java.util.Map" *#
#* @vtlvariable name="httpUtil" type="com.liferay.portal.kernel.util.HttpUtil" *#
#* @vtlvariable name="htmlUtil" type="com.liferay.portal.kernel.util.HtmlUtil" *#
#* @vtlvariable name="obc" type="com.liferay.portal.util.comparator.UserLastNameComparator" *#
#* @vtlvariable name="serviceLocator" type="com.liferay.portal.velocity.ServiceLocator" *#
#* @vtlvariable name="teamLocalService" type="com.liferay.portal.service.TeamLocalServiceUtil" *#
#* @vtlvariable name="mbMessageLocalService" type="com.liferay.portlet.messageboards.service.MBMessageLocalServiceUtil" *#
#* @vtlvariable name="mbThreadLocalService" type="com.liferay.portlet.messageboards.service.MBThreadLocalServiceUtil" *#
#* @vtlvariable name="imageToken" type="com.liferay.portal.kernel.servlet.ImageServletToken" *#
#* @vtlvariable name="userLocalService" type="com.liferay.portal.service.UserLocalServiceUtil" *#
#* @vtlvariable name="groupIdCriteria" type="com.liferay.portal.kernel.dao.orm.Criterion" *#
#* @vtlvariable name="groupIdProp" type="com.liferay.portal.kernel.dao.orm.Property" *#
#* @vtlvariable name="threadMap" type="java.util.Map<java.lang.Long, java.lang.Integer>" *#
#* @vtlvariable name="q" type="com.liferay.portal.kernel.dao.orm.DynamicQuery" *#
#* @vtlvariable name="q2" type="com.liferay.portal.kernel.dao.orm.DynamicQuery" *#
#* @vtlvariable name="rfu" type="com.liferay.portal.kernel.dao.orm.RestrictionsFactoryUtil" *#
#* @vtlvariable name="pfu" type="com.liferay.portal.kernel.dao.orm.ProjectionFactoryUtil" *#
#* @vtlvariable name="ofu" type="com.liferay.portal.kernel.dao.orm.OrderFactoryUtil" *#
#* @vtlvariable name="msgs" type="java.util.List<com.liferay.portlet.messageboards.model.MBMessage>" *#

#set ($portletNamespace = $request.portlet-namespace)
#set ($scopeGroupId = $getterUtil.getLong($request.theme-display.scope-group-id))

#if ($request.lifecycle == "RENDER_PHASE")

<body onload="${portletNamespace}getTable();">
<article>
  <h1 class="section-heading section-heading-b">
    <div>$title.data</div>
    <div class="section-heading-hr"></div>
  </h1>

  <div id='${portletNamespace}tablediv' style='width: 85%;'><!-- --></div>
</article>
</body>
<script type="text/javascript">

  var ${portletNamespace}table = new Object();

  var ${portletNamespace}ICON =
    '<img  class="icon" \
        src="http://my-liferay-site-cdn.com/osb-theme/images/spacer.png" \
        alt="Message Boards" title="Message Boards" \
        style="  background-image: url(\'/html/icons/_sprite.png\');\
            background-position: 50% -736px; \
        background-repeat: no-repeat; height: 16px; width: 16px;">';

  function ${portletNamespace}drawChart() {

    var html =
      '<div> \
         <table style="margin-bottom:0em;"> \
           <tbody>';

    for (i = 0; i < ${portletNamespace}table.length; i++) {
      html +=
        '<tr> \
          <td class="portlet-icon" style="padding-right:6px;"> \
          <table style="margin-top:-4px; margin-bottom:0px;">\
            <tr>\
            <td>\
              <span>' + ${portletNamespace}ICON + '</span> \
            </td>\
            </tr>\
            <tr>\
            <td>\
              <span style="color:#908E91; font-size:9px;">'+
                ${portletNamespace}table[i].msgCount +
              '</span>\
            </td>\
            </tr>\
          </table>\
          </td> \
          <td>\
          <div>\
            <h3 class="txt-n fs-11 m-0 o-h">\
            <span class="display-b m-tn3 m-b6">\
              <a href="/community/forums/-/message_boards/message/' +
                ${portletNamespace}table[i].msgid +'">'+
                ${portletNamespace}table[i].subject +
              '</a>\
            </span>\
            </h3>\
          </div>\
          </td>\
        </tr>';
    }
    html += '</tbody>\
      </table>\
    </div>';

    document.getElementById('${portletNamespace}tablediv').innerHTML = html;
  }

  function ${portletNamespace}getTable() {
    AUI().use(
      "aui-base", "aui-io-plugin", "aui-io-request",
      function(A) {
        A.io.request(
          '${request.resource-url}',
          {
            data: {
            },
            dataType: "json",
            on: {
              success: function(event, id, obj) {
                var responseData = this.get("responseData");
                  ${portletNamespace}table = responseData.jsonArray || [];

                  ${portletNamespace}drawChart();
              },
              failure: function(event, id, obj) {
              }
            }
          }
        );
      }
    );
  }

</script>
#elseif ($request.lifecycle == "RESOURCE_PHASE")
  #set ($logFactory = $portal.getClass().forName('com.liferay.portal.kernel.log.LogFactoryUtil'))
  #set ($log = $logFactory.getLog('mylog'))

  #set ($portalBeanLocator = $portal.getClass().forName("com.liferay.portal.kernel.bean.PortalBeanLocatorUtil"))
  #set ($jsonFactory = $portalBeanLocator.locate("com.liferay.portal.kernel.json.JSONFactoryUtil"))
  #set ($mbMessageLocalService = $portalBeanLocator.locate("com.liferay.portlet.messageboards.service.MBMessageLocalService.velocity"))
  #set ($mbThreadLocalService = $portalBeanLocator.locate("com.liferay.portlet.messageboards.service.MBThreadLocalService.velocity"))

  #set ($calClass = $portal.getClass().forName("java.util.GregorianCalendar"))
  #set ($mbMessageClass = $portal.getClass().forName("com.liferay.portlet.messageboards.model.MBMessage"))
  #set ($mbThreadClass = $portal.getClass().forName("com.liferay.portlet.messageboards.model.MBThread"))
  #set ($dqfu = $portal.getClass().forName("com.liferay.portal.kernel.dao.orm.DynamicQueryFactoryUtil"))
  #set ($pfu = $portal.getClass().forName("com.liferay.portal.kernel.dao.orm.ProjectionFactoryUtil"))
  #set ($ofu = $portal.getClass().forName("com.liferay.portal.kernel.dao.orm.OrderFactoryUtil"))

  #set ($now = $calClass.getInstance())
  #set ($weeksago = $calClass.getInstance())
  #set ($prevweeks = 0 - $getterUtil.getInteger($period.data))
  #set ($V = $weeksago.add(3, $prevweeks))


  #set ($q = $dqfu.forClass($mbThreadClass))
  #set ($rfu = $portal.getClass().forName("com.liferay.portal.kernel.dao.orm.RestrictionsFactoryUtil"))

  #set ($groupIdCriteria = $rfu.ne("categoryId", $getterUtil.getLong("-1")))
  #set ($V = $q.add($groupIdCriteria))

  #set ($groupIdCriteria = $rfu.eq("groupId", $getterUtil.getLong($scopeGroupId)))
  #set ($V = $q.add($groupIdCriteria))

  #set ($companyIdCriteria = $rfu.eq("companyId", $getterUtil.getLong($companyId)))
  #set ($V = $q.add($companyIdCriteria))

  #set ($statusCriteria = $rfu.eq("status", 0))
  #set ($V = $q.add($statusCriteria))

  #set ($lastPostDateCriteria = $rfu.between("lastPostDate", $weeksago.getTime(), $now.getTime()))
  #set ($V = $q.add($lastPostDateCriteria))

  #set ($V = $q.setProjection($pfu.property("threadId")))

  #set ($res1 = $mbMessageLocalService.dynamicQuery($q))
  #set ($q2 = $dqfu.forClass($mbMessageClass))

  #set ($inCriteria = $rfu.in("threadId", $res1))
  #set ($V = $q2.add($inCriteria))

  #set ($createDateCriteria = $rfu.between("createDate", $weeksago.getTime(), $now.getTime()))
  #set ($V = $q2.add($createDateCriteria))

  #set ($V = $q2.setProjection($pfu.projectionList().add($pfu.groupProperty("rootMessageId")).add($pfu.alias($pfu.rowCount(), "msgCount"))))
  #set ($V = $q2.addOrder($ofu.desc("msgCount")))
  #set ($V = $q2.setLimit(0, 7))

  #set ($res2 = $mbMessageLocalService.dynamicQuery($q2))

  #set ($jsonArray = $jsonFactory.createJSONArray())

  #foreach ($msgSum in $res2)

    #set ($rootMsgId = $msgSum.get(0))
    #set ($msgCount = $msgSum.get(1))
    #set ($subject = $mbMessageLocalService.getMessage($rootMsgId).getSubject())

    #set ($jsonObject = $jsonFactory.createJSONObject())
    #set ($V = $jsonObject.put("subject", $stringUtil.shorten($htmlUtil.escape($subject), 55)))
    #set ($V = $jsonObject.put("msgid", $rootMsgId))
    #set ($V = $jsonObject.put("msgCount", $msgCount))
    #set ($V = $jsonArray.put($jsonObject))
  #end
{
"jsonArray": $jsonArray
}
#end

 

Liferay 6.1 CE Release

Company Blogs January 6, 2012 By James Falkner

[Magyarul] [中文] [Deutsch][Español]

[Update: Liferay 6.1 EE has been released.  More information about Enterprise Edition can be found in Ed's blog post announcement!]

Today Liferay released the next version of its flagship software: Liferay Portal 6.1 CE! [Download] [Quick Start]

The Liferay product and engineering teams, in close concert with our awesome community, have spent many months getting the 6.1 release ready, and it is finally here.  Read below for the gory details.

Release Nomenclature

Following Liferay's versioning scheme established in 2010, this release is Liferay 6.1 CE GA1.  The internal version number is6.1.0 (i.e. the first release of 6.1).  Future CE releases of 6.1 will be designated GA2, GA3, .. and so on.  See below for upgrade instructions from 6.0 and 5.x.

Downloads

You can find the 6.1 release on the usual downloads page.  If you need additional files (for example, the source code, or dependency libraries), visit the additional files page.

New Features

In addition to the numerous bugs that have been fixed since 6.0 GA4, Many new features and improvements have gone into this release. Highlights include:

  • Updated Support Matrix - Liferay's general policy is to update our support matrix for each release, testing Liferay against newer major releases of supporting operating systems, app servers, browsers, and databases (we reguarly update the bundled upstream open source libraries to fix bugs or take advantage of new features in the open source we depend on).  For example, we are moving to Tomcat 7.x, MySQL 5.5.x, JBoss AS 7, Geronimo 2.2.1, and others.
  • UI Refinements - Too numerous to list here.  Many tasks that used to require a trip to Control Panel (thus losing your UI context) can now be done via the "Manage" menu.  Document Libary has gotten a sweet overhaul.  General improvements in snappiness.  
  • Sites - As described in Jorge's blog and now in the official documentation, the Sites concept has been introduced, decoupling a set of pages from an associated community or organization.  This is one of the big conceptual changes in 6.1.
  • Setup Wizard - To ease the first-time configuration of a portal (and its associated database), when starting a new instance of Liferay, the optional Setup Wizard will prompt for and configure these items for you.  No more mucking about with portal-ext.properties for those basic configurations everyone wants to do initially.
  • Marketplace Support - Groundwork in the form of app hot deploy and marketplace browsing has been introduced into 6.1, gearing up for the opening of the Marketplace later this year.
  • Mobile Device Enhancements -  For example,  mobile device rules allow you to configure sets of rules and use those rules to alter the behavior of the portal based on the device being used to access Liferay. You can also access and evaluate rules through custom scripts.
  • Social Activity Improvements - Many improvements to the social value system (formerly known as Social Equity).  Check out the official documentation on what's new
  • JSON Web Service Improvements - A lot of work has been done in this area, making it much easier to invoke Liferay's services using REST-like (AtomPub-based) JSON (e.g. through supplied JavaScript libraries, or through standard HTTP requests).  Online documentation is also available (check out http://localhost:8080/api/jsonws on your local install. Sweetness!)
  • Asset Publisher Improvements - The darling of the supplied out-of-box portlets, Asset Publisher can now do things like showand publish content from/to multiple scopes, better linking behavior for assets, and many more.
  • Content Management Goodness - One of Liferay's core strengths is its simple yet powerful Web Content Management System.  There have been many usability and functional improvements to it, including inline drag/drop structure editing, internationalized web content titles, preloading of structures on template creation, selection of default display pages, and more!
  • Search Improvements - Lots of performance and accuracy improvements.  Including users in search results.  
  • Unification of the Document Library and Image Gallery - these two apps have historically overlapped each other - that overlap has now been eliminated, by combining the two into a Documents and Media app (with a much fancier UI to boot).  
  • Multiple Repository Mounting.  In the new Documents and Media app, you can now mount multiple repositories (e.g. through CMIS) and develop custom connectors to link to existing CMS repositories.  Features that overlap with Liferay are respected (e.g. permissioning, locking, etc).
  • Native support for storing and serving videos and other media types - Liferay now includes preview functionality for rendering PDFs and other common document formats in-browser, eliminating the need for external apps to view.  In addition, audio and video can be captured and played back from within Liferay.
  • Robust content metadata management - New metadata management tools and UIs to easily capture extra metadata related to documents, for efficient searching and categorization of documents.  Sales team uploading this year's financial data?  Let them enter the "bottom line" numbers into well defined metadata fields for easy sorting and searching.
  • Establishing contextual relationships between content types - with the Related Assets feature, any asset can be dynamically related to any other asset, for easy cross-referencing.  For example, link to a document in a meeting request, or relate a forum post to a blog entry.  Relations can be mined and analyzed later.
  • Enhanced staging support (including Site Branching, Versioning, and Rollback).  A major overhaul of the staging feature, Liferay allows concurrent editing of sites, with versioning and rollback (undo/redo) of changes on the fly.
  • Dynamic Site and Page Templates - One can now create an entire site based on a site template.  When changes are made to the template, the changes are automatically (and smartly) applied to any derived sites.  Sites can later be unlinked if needed, allowing independent forking.
  • User Customizable Pages - Allows your users to customize certain areas of a site's pages, while keeping other areas fixed.
  • User Defined Lists (Dynamic Data Lists) - A very powerful feature that allows one to create a custom data list based on a user-specified schema.  Data can be extracted for reporting, or any other use.
  • Unified User Management - Liferay has always had the ability to be your central directory of users.  The management of said users has not always been easy.  In Liferay 6.1, users and their associated organizations can be viewed hierarchically, allowing easy navigation into your user directory.
  • OpenSocial 1.1 Support - this includes the new pub/sub feature from OpenSocial.
  • Enhancements for Liferay IDE - It's never been easier to develop for the Liferay Platform, using the latest features of Liferay 6.1 and the Liferay IDE.  Liferay 6.1 now includes a remote server deployment plugin, allowing development against a remote instance of Liferay.  Simply throw a switch to publish your tested changes to a production environment.
  • More social networking and collaboration feaures (too many to list them all!) - anonymous comments that are later associated with you when you sign up, follow support, related assets, social activity improvements (already discussed above), wiki images, setting threads as questions by default, and, and.. well.. just try it!
  • Better Scalability
  • Better Auditing, Management and Monitoring
  • Better Documentation
  • Better Security
  • Better Quality
  • ... And more!

Documentation

The Liferay Documentation Team has been hard at work updating all of the documentation for the new release.  This includes updated (and vastly improved/enlarged) javadoc and related reference documentation, and a new User Guide.  You may have been watching the progress of it via its new home on github, but if not, you can access the full documentation on thedocumentation page.
 

Bug Reporting

As always, the project continues to use issues.liferay.com to report and manage bug and improvement tickets.  If you believe you have encountered a bug in the new release (shocking, I know), please be cognizant of the bug reporting standards and report your issue on issues.liferay.com, selecting the "6.1.0 GA" release as the value for the "Affects Version/s" field.
 

Upgrading

As a general rule, you can upgrade from one release of Liferay to the next.  This means that you can upgrade from 5.2 to 6.0, or 6.0 to 6.1, but not from 5.2 to 6.1.  For 5.2 to 6.1, you would need to progress from 5.2 to 6.0, then 6.0 to 6.1.  See the Upgrading Liferay chapter of the Liferay User Guide for more detail on upgrading to 6.1.

Getting Support

Support for Liferay 6.1 CE comes from the wonderful and active community, from which Liferay itself was nurtured into the enterprise offering it is today.  Please visit the community pages to find out more about the myriad avenues through which you can get your questions answered.

Liferay and its worldwide partner network also provides services, support, training, and consulting around its flagship enterprise offering, Liferay Portal 6.1 EE, which is due to be released shortly after this CE release.

What's Next?

Of course we in the Liferay Community are interested in your take on the new features and improvements in Liferay 6.1.  Work has already begun on the next evolution of Liferay.  If you are interested in learning more about how you can get involved, visit theLiferay Community pages and dig in.  

 
Showing 61 - 80 of 117 results.
Items 20
of 6