Liferay North American Symposium 2012

Staff Blogs 2012年6月14日 按 James Falkner Staff

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

Staff Blogs 2012年6月13日 按 James Falkner Staff

"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

Staff Blogs 2012年5月31日 按 James Falkner Staff

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

Staff Blogs 2012年5月6日 按 James Falkner Staff

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

Staff Blogs 2012年4月25日 按 James Falkner Staff

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

Staff Blogs 2012年4月13日 按 James Falkner Staff

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

Staff Blogs 2012年4月11日 按 James Falkner Staff

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

Staff Blogs 2012年3月29日 按 James Falkner Staff

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

Staff Blogs 2012年2月28日 按 James Falkner Staff

 

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

Staff Blogs 2012年2月11日 按 James Falkner Staff

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

Staff Blogs 2012年2月1日 按 James Falkner Staff

[中文][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

Staff Blogs 2012年1月19日 按 James Falkner Staff

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

Staff Blogs 2012年1月11日 按 James Falkner Staff

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

Staff Blogs 2012年1月6日 按 James Falkner Staff

[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.  

 

Liferay Portal 6.1 Release Candidate Now Available

Staff Blogs 2011年12月21日 按 James Falkner Staff

Liferay is proud to announce that the Liferay 6.1 CE Release Candidate is available! [Download]

The Liferay product and engineering teams, in close concert with our awesome community, have spent many months getting the 6.1 release ready, and this is one of the final builds before it will be generally available. We are making this release in advance of the 6.1 GA release, in order to ferret out last minute issues, and get the great work that the teams have poured into this into your hands earlier.

New Stuff Since Beta-4

The community has been hard at work. Over 800 individual issues (bugs and improvements) have been resolved since Beta-4, and several new major and minor features make up 6.1. Ed Chung gave a great overview of these 6.1 themes and features at the East Coast Symposium. See my blog post regarding 6.1 Beta for a run-down of the major features in 6.1.  Other highlights in this RC include:

  • Setup Wizard - The first time you start Liferay, you are now presented with a final set of setup screens allowing you to configure the initial user, initial name of the instance, and (even more awesome) the ability to configure the database that Liferay uses.  
  • Mobile Device Rules - This has been delivered over various releases, but in the RC it is finally complete.  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.
  • Site Template Improvements - Another feature that's been there, but the linkage between a site template and the sites that derive from that template is now complete and functional.  You can create 100 sites based off a single template, and then modify something in the template and watch the changes automatically reflect in the sites that derive from the template.
  • Social Activity Improvements - Many improvements to Social Activity (formerly known as Social Equity).  You can see a description in the user's guide section on Social (note that the Liferay User Guide is still a work in progress!).
  • JSON Web Service Docs - Dynamic documentation is now generated for the new JSON Web Services feature.  Simply access http://localhost:8080/api/jsonws to get online documentation for the REST-like JSON Web Services, as well as a simple test harness for accessing services.  Also note that tunnel-web has been integrated into the portal and is no longer a separate web app (But the old paths that used /tunnel-web/ will continue to work and be mapped to /api).
  • ... And more :)

Downloads

The release candidate is available on our downloads page.  The additional files that some will need (for example, for developers) are listed on the RC Additional Files page.

Documentation

Our documentation continues to improve. With the help of the community, our end user, administrator, and developer documentation have all improved tremendously. While the final documentation has not yet been published (it will be published with the GA release), its open source nature means you can take a look at the development, and even contribute to the "code". If there is a specific new feature you are interested in learning about, you are encouraged to use any of the myriad avenues through which the community supports its constituents, or you can just give the RC build a try today!

Bug reporting

If you experience issues with this RC release, and believe it to be a bug in the product, you are encouraged to file a report at issues.liferay.com. There is a specific release to denote in the Affects Version/s field: 6.1.0 RC. The issue will be triaged, and if it has a big enough impact, will be fixed for the final GA release.  Note that only showstopper bugs (insecurity, crashes, severe memory "leak", data corruption, or major loss of functionality with no viable workaround)  will be fixed leading up to the GA release.

Upgrading to 6.1

As this is still not the final release, you should not use this unsupported release in a production environment. However, it is a good way to test that your eventual upgrade will succeed with the minimum of fuss. Several of our BugSquad members have already successfully upgraded their customized Liferay 6.0 environments to the early 6.1 builds, and this build gives you a chance to do the same.

Going Forward

As we approach the final GA release, there may be additional Release Candidate builds to fix any last minute issues. As always, you are encouraged to participate and contribute to the project, and we hope you enjoy this sneak peek!

Liferay Community Projects

Staff Blogs 2011年12月19日 按 James Falkner Staff

If you are reading this blog post, you are undoubtedly familiar with open source in general, and Liferay and its open source mission in particular.  Our community is spread out both globally and with respect to the technology that can be used on the web and on the Liferay Platform.  Over the years, numerous contributors have donated their time and resources into what we now know of as Liferay.  The kinds of contributions that are being made on a daily basis range from simply suggesting a new feature or finding and reporting a bug, through localizations, documentation, bugfixes, new features, feature improvements, and a host of other efforts that can be readily identified.

As Liferay grows, so to do the kinds of contributions that are useful.  At the highest level, we have Official Liferay Projects that you are all familiar with: Liferay Portal, Social Office, AlloyUI, and Liferay IDE round out the current top-level projects.  These are projects that Liferay has deemed important enough to be imbued with special attributes (such as being shipped with Liferay directly, or staffed with Liferay personnel, or using Liferay's software engineering resources like issues.liferay.com). Within these top-level projects are all kinds of contributions and innovation.

Zooming way in, at the lowest level there are contributions such as simple community-contributed bugfixes (e.g. those that have arrived via the 100 PaperCuts or BugSquad projects), one-liner translations, minor code improvements, or javadocs.  While no less important than other types of contributions, these at the lowest level are generally short-lived, focused contributions that do not require a team to contribute or maintain.

As you may have guessed, there is a missing void in the middle - there are non-trivial project ideas that community members have suggested, or some that are underway or have already been completed, and that represent non-trivial, community-led software efforts that make the Liferay Platform a better place to be.  Some have been contributed in the form of community plugins, or simply exist out on the web.  More importantly, they represent innovation coming from outside of the influence of existing Liferay technology.  

In an effort to bring these non-Liferay-led, non-trivial projects to light, and to encourage participation in these projects, we bring you the concept of Liferay Community Projects.

 

What is a Liferay Community Project?

A Liferay Community Project is an open source contribution driven by one or more Liferay Community members.  It represents a non-trivial addition to the open source Liferay ecosystem that is bigger than the simple contributions listed above, but not officially sponsored or developed by Liferay (the company).  Liferay Community projects have space on liferay.org, our community's home, on the new Community Projects Listing page.  As these are open source projects, participation is open to all.

What qualifies as a Liferay Community Project?

There are no hard and fast rules as to what would make up a good project and what would not.  Any non-trivial open source project that relates to and improves Liferay and Liferay technology would make for a good Liferay Community Project.  If you have an idea for a new project, but you haven't written a single line of code, contact us! (see below).  If you have been working on a project for some time, already have builds available, and simply want to more directly associate your project with Liferay (and obtain new developer talent), give us a call! (well, email us)

Why should I care?  What are the benefits?

Of course, open source projects are free to manage their projects on any website of their choosing (or have no web presence at all!).  However, the primary benefit of being listed as a community project at Liferay is to have a more direct relationship with Liferay and its open source ecosystem.  Each projects gets listed on the community projects page in a consistent way, along with a contributor listing, dedicated forum category, wiki space, and links to the project's deliverables.  Developers can connect and collaborate with other team members through the project's homepage.  Prospective contributors can quickly learn about available projects, try them out, and get involved.  On the other side of the coin, Liferay benefits through ever-increasing activity associated with Liferay.  In short, rather than just listeners, we want active participants in our open source conversation.

Are these incubation projects?

Existing incubation projects (such as Apache Incubator) have an implied governance model, one that governs contributions and the progression of a project from an incubation state to some sort of "accepted"/"approved" state.  Liferay Community Projects do not get "promoted" from one state to another, there is no implied governance model for contributions, and there is no promise that a project will be integrated into Liferay proper or otherwise be promoted.

What about Licensing?

Project maintainers are free to choose any open source license they wish.  In addition, it is up to each project to determine the governance model (if any), the rights assigned to contributions, and the mechanism by which contributions are made.  The only requirement for being a Liferay Community Project is that it must be open source (and the code must be licensed using an accepted open source license), be associated with and offer an improvement to Liferay technology in some way, and be willing to accept contributions and participants who which to get involved.

How do I start my own Liferay Community Project?

If you have an idea for a Liferay Project, simply contact community@liferay.com and talk about your idea.  We want to encourage new projects from any and all community members who have the time and energy to lead a project.  We'll get you set up with an information page, project collaboration tools, and appropriate links for potential and existing project members and developers, and answer any questions you may have.  Again, it is not required that your project already exist -- the best ideas often come from an initial idea seed that is acted upon and refined through community collaboration from day one.

Note that this program does not provide facilities for source code management, issue management, or build systems.  It is up to each project to provide that.  There are many resources available for open source, such as Github (which Liferay uses for its top-level projects), SourceForge, and a host of other online resources for maintaining open source.  

Where do we go from here?

As I discussed in an earlier blog post, we already have one community project led by Jan Gregor - The Liferay/JRebel Integration project.  There are a couple more projects in the pipeline which you'll be hearing about soon, but we want more!    As the program grows, we'll be adding more features (blogs anyone?) and streamlining the process by which new projects are born.  I am personally looking forward to 2012 and seeing what is possible with Liferay and open source! Keep an eye on the projects page for new and upcoming projects in which you may be interested in participating.

 

Community Roundup

Staff Blogs 2011年11月15日 按 James Falkner Staff

"Life would be so much easier if we only had the source code." - Author Unknown

Here we go again.  Once again I have failed to live up to my promises of a once-a-month roundup, and for that I apologize! It's been a very busy and exciting 6 weeks in our community, so I am here to give you a digest of the latest coolness that is the Liferay Community.  So please keep arms and legs inside the vehicle at all times, and sit back and enjoy the ride.  Let's do this thing!

  • I was fortunate enough to attend two of Liferay's symposiums last month, the Liferay Europe Symposium in Frankfurt, and the Liferay Spain Symposium in Madrid.  Met many awesome community members, attended a bunch of interesting sessions and activities, and generally had a great time learning from our European community contingent.  Slides from Europe and Slides from Spain are now available!
  • If you are near Rome this week, the final symposium of 2011 is taking place this Friday (November 18).  If you have a chance to attend the Liferay Italy Symposium, you will be pleasantly surprised at the highest ever quality content to date. 
  • We are coming up on the close of the Liferay 6.1 chapter in the epic book of Liferay.  On November 14 Liferay released its Beta-4 build, and it is now downloadable, but if you are participating in Community BugSquad, of course you have already reviewed the sneak-peek 6.1 builds, and several of your feedbacks/suggestions/fixes/improvements have already been incorporated, with more to come!  
  • You may have noticed a new celebrity blogger on liferay.com: Jan Gregor from Mimacom is kicking off the first of many Liferay Community Projects.  This project is implementing a Liferay/JRebel plugin to facilitate easy realtime, no-restart-needed deployment of apps on LIferay.  More notable though is that we at Liferay are going to elevate these kinds of community-driven "incubation" 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, contact community@liferay.com
  • 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. Recent Episodes: [9] [8] [7] [6] [5] and [4]
  • Liferay's User Groups continue to expand, with new groups beginning in Portland, Portugal, Norway, and others.  Visit the User Groups page to see all the recent activity.
  • Speaking of User Groups, the Spain User Group had a recent LSUG Meeting in Seville and it was a very successful event (15 attendees).  You can read the minutes and if interested, there are upcoming meetings in Marid, Sevilla, Barcelona, and Alicante.
  • Liferay's Community Leadership Team held its quarterly meetup last month, with several interesting discussions regarding what's buzzing in the community.  Check out the meeting minutes and follow the action on the thread if interested!
  • Notable industry blogger Dana Blankenhorn has an interesting take on Liferay's business model and mission.  Dana gave a rousing talk about the history of open source at WCS, and has written several great articles on open source in general.
  • Bradley's Tips!  This is a great collection of tidbits of useful information. Recently I've seen a lot of these kinds of things coming up (like Ray's gists), I think we need a centralized place into which these are placed, for easy access and searching!  *adds idea to queue*
  • Liferay IDE 1.4 has been released, with support of the upcoming Liferay 6.1, and Tomcat 7, as well as a few other goodies. Check out Greg's blog for details.
  • Random website running Liferay: AXA IM Corporate Website!
  • Remember that "50 Liferay Interview Questions" post from a while back?  Well, now you have the answers!
  • As you look back on the Liferay Community, you can see many innovative contributions and outstanding achievements.  You can also see a large ball of abused and ignored bug reports!  The Liferay Community has deputized a team of experts to help with this: Community Verifiers!  And we need your help!  If you are interested, leave comments below!
  • Wasim shows us how to install Liferay on eApps cloud hosting.  Yet another example of Liferay's cloud-friendliness.  
  • If you missed Oracle OpenWorld 2011, Liferay demonstrated the new features of Liferay 6.1, and was mentioned as one of 12 "hot products to see".  Cool! Well.. Hot!
  • We continue to see Open Source displacing proprietary stacks worldwide.  TechRepublic Live in Louisville mentioned Liferay as one of those displacing forces.
  • Speaking of the spread of Open Source, Gartner's 2011 Magic Quadrant for Horizontal Portals has placed Liferay in the Leader's Quadrant for the second year.  The only open source leader!  More coverage from CMS Report.
  • Mika has posted an excellent set of slides describing Liferay's SAML 2.0 support.  
  • Integrating Liferay with JOSSO (an open source SSO solution) has never been easier with Liferay 6.1.  Check out Gianluca's blog for details.
  • Liferay coverage from PyCON.  A Python conference.  Talking about Java portals?  Nice!
  • We in the Liferay Community are working on a new structured program to more easily get new users over the initial learning hill of Liferay, and provide valuable educational content to all of our community, regardless of expertise level. We need your input to proceed.  How should we structure such a program?  Leave your comments in the thread and learn by teaching!
  • Several people have been playing with Liferay and Jelastic (yet another cloud service).  Some discussion has taken place on the forums, and Marina has taken the time to write down details of this deployment.  Have fun with this one.
  • A thought-provoking examination of portals, and when they make sense.  For this author, it did not, but it provides some interesting guidance about when it does.
  • Activa wrote up a nice piece on the 2011 Spain Symposium.  Activa has been very active in our community and is a valuable community parter for Liferay! 
  • Finally!  Some handy scripts that can be cut/pasted into Liferay's Control Panel scripting console.  Terry provides a nice way to clean up user.  Be careful, there's no going back :)
  • No idea who created this or why, but it sounds fantastic :)
  • I really like Liferay's support for Dynamic Data Lists.  It's been a long time coming and how it's here.  Check out Arvind's description of it, and try it out in the latest beta!
  • Often the bane of developers, writing tests is a crucial part of ensuring quality in your projects.  With Liferay, it's really easy to write selenium tests (we at Liferay use this extensively, along with Jenkins).  Steffen shows how to do it.
  • Your 15 minutes are here.  15 minutes to Liferay on Cloudbees!

Recent Blog Posts: Radio Liferay Episodes [9] [8] [7] [6] [5] [4], WYSIWYG Editors, Philosophy of Writing, Custom Tools for Script Engine, Monitoring through firewalls, Embedding Portlets in Themes, Community Excellence, Spring and OSGi, Liferay @ Gartner ITExpo, Git Tips from Igor, Community Verifier, Fireworks, and finally Ehcache Configuration.

Recent Wiki Updates: CMIS and Alfresco 4.0, Custom Fields, Pagination, Development Style, Mail Integration, SOAP Web Services, Application Adapters (always wondered what those were!), Translation Team, AlloyUI Forms, Faceted Search, Slimming Liferay, Google Analytics

That's all I have for now.  I will do a Holiday Edition next month, with some goodies for all.  Enjoy your day!

 

Liferay 2011 Community Excellence Awards

Staff Blogs 2011年10月20日 按 James Falkner Staff

In addition to the annual "Partner of the Year" award, this year Liferay recognized its partners for their community achievements, awarding the Community Excellence Award.  We consider partners a valuable part of our community (just like we do with "regular" liferay.com denizens, Liferay's employees, and Liferay customers), and wanted to recognize their participation, independent of any revenue figures, deals closed, or any other other business factors.

What We Measured

The actual, super-secret formula has not been revealed in orer to keep things fair, but the formula involves several (over 20) contribution types, including the obvious ones like helpful forum posts (answers) and code contributions, but other non-obvious, yet highly valuable community metrics.  For the 2011 awards, we considered activity that occured between midnight, August 31st, 2010 and midnight, August 1st, 2011.

The Winners

The winning partners have a proven, well-rounded, and highly effective track record of being involved in the community and giving back.  They realize the benefits of open participation: 1) It ultimately helps their business operate more effeciently, because they are more knowledgable, 2) It improves their standing with other community members and clients, because they are seen as having the expertise enough to be able to help others, and 3) It moves the technology forward, by offering innovation that we alone cannot provide.

Here they are:

MIMACOM

MIMACOM is a leading provider in Europe for Enterprise Open Source solutions based on Java.  Headquartered in Bern, with offices in Zurich, Valencia, Stuttgart, and Rome, MIMACOM also makes regular contributions to projects other than Liferay, including ICEfaces, Spring, and Hibernate.  In 2010-2011, MIMACOM was particularly helpful with the 6.0 release (doing much pre-release testing), contributed plugins, and established the Austria and Slovakia user groups.

 

Savoir-faire Linux

Founded in 1999 with locations in Montreal, Quebec City, and Ottawa, Savoir-faire Linux is the reference for open-source software integration. They are the largest and most experienced Liferay integrator in Eastern Canada.  In 2010-2011, Savoir-faire contributed a huge number of open source plugins, and worked closely with the community and Liferay engineering to implement and document the faceted search feature in 6.1.  They also contributed many fixes for the 6.1 release, and we are delighted to have them be part of it all.

 

IBA CZ

IBA CZ is a fast growing IT service provider and development center of the IBA Group headquartered in the Czech Republic. They focus on up-to-date technologies including enterprise portals, enterprise Java, Business Intelligence, and Business Process Management to customers located in Central and Western Europe.  In 2010-2011, IBA CZ was very active in reporting and providing contributions for issues, participated in 100 papercuts, BugSquad, and Community Verifier, and established the Czech Republic User Group.

 

CIGNEX Datamatics

Based in Santa Clara, CIGNEX Datamatics is the world's leading provider of Open Source Enterprise Content Management and SOA & ESB consulting services and software solutions. Their customers include companies in the Media, Healthcare, Education, Government, Gaming and High Tech industry. In 2010-2011, the team had consistent community contributions in many different areas (forum answers, bug reports, plugin contributions, and more) owing to their Liferay Platform expertise.   They also hold 1 of only 4 coveted "Liferay Legend" status indicators.

 

Componence

With locations in Nederland, Ukraine and India, Componence has offered Internet, Social Media and Mobile solutions since 2001. With over 200 portal implementations, Componence is portal market leader in the Netherlands with technology focus on Java and portal.  In 2010-2011, Componence contributed plugins, established the Netherlands User Group, participated in BugSquad, 100 PaperCuts, Community Verifier, and holds 1 of only 4 coveted "Liferay Legend" status indicators. 

 

A big "Thank You!" and congratulations goes to all of our 2011 Community Excellence Award winners!

How Can We Win Next Year?

Think about how participation in Liferay's open source community can help you (see the above winners for some ideas).  Rather than taking an ad-hoc approach, build in community participation into your business model and resourcing plans.  Value will organically flow into the community and back to you in various tangible ways.  For example, you fix a bug, provide a translation, develop and contribute a new feature, or investigate and solve someone else's problem on the forums.  You have helped the community, and without knowing it, got trained in the process!  How cool is that?

 

Liferay 6.1 Beta Release

Staff Blogs 2011年10月14日 按 James Falkner Staff

Liferay is proud to announce the Liferay 6.1 CE Beta release!  The Liferay product and engineering teams, in close concert with our awesome community, have spent many months getting the 6.1 release ready, and this is one of the final builds before it will be generally available.  We are making this release in advance of the 6.1 GA release, in order to ferret out last minute issues, and get the great work that the the teams have poured into this into your hands earlier.

New stuff since 6.0

The community has been hard at work.  Over 2500 individual issues have been resolved, and several new major and minor features make up 6.1.  Ed Chung gave a great overview of these 6.1 themes and features at the East Coast Symposium.  Here's a cheat sheet to some of the major ones (many in the community will undoubtedly be familiar with them, as you helped develop and/or review them!)

  • Multiple Repository Mounting - including CMIS 1.0 Support
  • Unification of the Document Library and Image Gallery
  • Native support for storing videos and other media types
  • Robust content metadata management
  • Establishing contextual relationships between content types (Related Assets)
  • Enhanced staging support (including Branching, Versioning, and Rollback)
  • Dynamic Site and Page Templates
  • User Customizable Pages
  • User Defined Lists (Dynamic Data Lists)
  • Workflow-enabled Forms
  • Mobile Device Detection
  • Unified User Management
  • RESTful Web Services
  • OpenSocial 1.1 Support
  • Enhancements for Liferay IDE 1.4
  • More social networking and collaboration feaures  (too many to list!)
  • Better Scalability
  • Better Management and Monitoring
  • Better Documentation
  • Better Quality
  • ..."And There's More!"

Downloads

The beta release will be available on our downloads page soon.  In the meantime, the usual files (portal bundles, sql scripts, CE plugins, and other supporting files) can be found on SourceForge: portal bundles and plugins.

6.1 Documentation

Our documentation continues to improve.  With the help of the community, our end user, administrator, and developer documentation have all improved tremendously.  The effort to document this release continues through this beta.  While the final documentation has not yet been published (it will be published with the GA release), its open source nature means you can take a look at the development, and even contribute to the "code".  If there is a specific new feature you are interested in learning about, you are encouraged to use any of the myriad avenues through which the community supports its constituents, or you can just give the Beta build a try today!

Bug reporting

If you experience issues with this beta release, and believe it to be a bug in the product, you are encouraged to file a report at issues.liferay.com.  There is a specific release to denote in the Affects Version/s field: 6.1.0 B3 (Beta-3).  The issue will be triaged, and if it has a big enough impact, will be fixed for the final GA release.

Upgrading to 6.1

As this is still a beta, you are should not use this unsupported release in a production environment.  However, it is a good way to test that your eventual upgrade will succeed with the minimum of fuss.  Several of our BugSquad members have already successfully upgraded their customized Liferay 6.0 environments to the early 6.1 builds, and this build gives you a chance to do the same.

Going Forward

As we approach the final GA release, there may be additional Release Candidate builds to fix any last minute issues.  As always, you are encouraged to participate and contribute to the project, and I hope you enjoy this sneak peek!

Community Meetup at the Europe Symposium

Staff Blogs 2011年10月10日 按 James Falkner Staff

Update: The Meetup will take place at Berliner 109 on Monday, October 17, at 18:00!  This is a couple of minutes walk east, from the Symposium venue (Sheraton Offenbach Hotel).

If you are attending this year's European Symposium next week in Frankfurt, on Monday evening (after the pre-symposium training) Liferay is hosting a community meetup.  This will be a free event, starting around 18:00, at a Berliner 109.  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 Frankfrurt!

显示 91 结果中的 41 - 60。
Items 20
的 5