Assistance with Open Source adoption


Sales Enablement with Content — What Our Customers Say

KnowledgTree - Tue, 08/26/2014 - 15:33

We love our customers. And we love what KnowledgeTree does for our customers too. It helps sales teams sell more effectively. How? By getting the right marketing and sales enablement content into sales people’s hands.

It’s fast to set-up, delivers value in minutes, gives marketing visibility into content ROI, and has sales teams raving about its value. But don’t take our word for it, here are some great quotes from our customers.

“KnowledgeTree makes it simple for both Marketing to distribute content to Sales, and for Sales to find the content they need at the exact moment they need it.”

Liz Shulof, Sr. Director of Marketing Communications, Bomgar


“KnowledgeTree helps us identify and use content with the highest ROI, and that’s generated millions in additional revenue for Software AG.”

Michael Durham, Director Pre-Sales Engineering, Software AG


“KnowledgeTree is exceptional in helping us manage and distribute our content.”

Dimitri Onistsuk, Director of Marketing, Shipwire

“[KnowledgeTree's] tracking metrics allow Sales Reps to identify which assets work best for them, and allow our Content team to understand what makes a piece of content successful. Simple to install; simple to configure; very powerful for Sales.”

Tucker Heiner, Manager, CRM Systems, RingCentral

“KnowledgeTree is straight-forward to use and allows me to use existing fields in Salesforce as the basis for the taxonomy to drive rules, which in turn expose the right content at the right time to the right sales rep.”

Brian Groth, Sales Enablement Manager, Xactly



The post Sales Enablement with Content — What Our Customers Say appeared first on KnowledgeTree.

Categories: ECM

Vaadin + Liferay: a recognized combination

Liferay - Tue, 08/26/2014 - 02:51

We were very happy to have received the Liferay Marketplace award for the best Free Opensource portlet for 2014 . This was a huge thing for us not only because itself uses the Tori forum portlet as its main discussion board, but also because Tori has shown us how awesome a combination Vaadin and Liferay really are together!

With the help of Vaadin you're able to build real Business Applications (with a capital A) and Liferay gives a solid ground for Vaadin applications to lean on.

A while ago we had a joint webinar about Vaadin & Liferay together, but received lots of questions on a more detailed Vaadin introduction to those of you not familiar with Vaadin from before.

Good news: We're hosting an Introduction to Vaadin Webinar already next week that will make you familiar with Vaadin in 30 minutes. Join Vaadin founder Joonas Lehtinen for an introduction and with answers to your questions on Thursday September 4th  @ 10AM PT (1PM ET). Sign up now at and learn to make your own Tori or larger business apps with Liferay and Vaadin!

Matti Tahvonen 2014-08-26T07:51:37Z
Categories: CMS, ECM

Ridiculously Simple Plugins on

Liferay - Tue, 08/26/2014 - 01:15
pre { white-space: pre; }

This article accompanies the session "Ridiculously simple plugins" hosted today (26. Aug, 16:00 CEST, 14:00 UTC) by me. The session is broadcasted on youtube and recording will be available (and linked here) after the session.

The purpose of this session is to demonstrate that - given the proper architecture - you can extend Portal Applications within minutes. Well - the story is: Your developer estimates an hour (to do it properly), which means that you might want to round up to the next unit, e.g. 1 day - and this includes documentation, deployment, administration etc.

It's most likely harder to get your system administrator to update the production system yet again than to implement new functionality - given a proper architecture.

Quick start if you want to follow along:

Everything you need is available on and if you don't want to read through everything when we start, pick the instructions with the yellow markers below:

Customers project

During the session we're going to create 3 simple plugins. Two of them are extending a business layer that is generated with XMLPortletFactory. If you'd like, you can download & execute xmlportletfactory yourself with the customer&invoice definition file, but you can also use the shortcut and download this portlet project, unzip it in the portlets directory of your plugins sdk (yes, I'm using Ant, sorry Maveners) and open it in your development environment. For the session I'll use Liferay Developer Studio, but you're free to use whatever you'd like.

What does this project do? It's just what xmlportletfactory generates from the customer.xml script. Actually, I've cheated. It also contains a custom portlet as well that will provide some random data for you. However, it doesn't compile: Consider it to be just the xmlportletfactory output. To make it usable, you'll need to run Liferay's ServiceBuilder.

We'll explore the resulting code during this session. In short: Add all portlets from the new "Customer" section to a page, create a few customers and invoices and click the icon left of a customer to see the invoices updated.

If you examine the default xmlportletfactory-generated UI, it's not too obvious, which customer is currently selected. You can see it when the icon in a customer's row changes from a square to an arrow. Let's make the current customer more visible by hooking into the already established mechanism of Inter Portlet Communication. The first portlet we create is a CustomerDetailPortlet, showing the name and location of a customer. If we had more business data, we'd probably show more data in the details. (Solution to be linked after the session)

For the next portlet, assume you're using this system, with thousands of customers in the database. Whenever somebody calls, you'll have to search for them again. But when they're calling, they typically call multiple times, delivering more details for their issues. That's why we want to keep track of the latest 5 callers and we'll create a MostRecentlyUsedCustomerPortlet (MRU): This will make it easy to just click on their name, rather than searching for the record again. (Solution to be linked after the session)

What does this teach us? In a portlet environment you can easily compose your application from many different building blocks. If you introduce yet another portlet that interacts with the existing ones, it doesn't need to be big to add value. And it doesn't need to be high-risk to update the site: If your new portlet has a bug - just remove it again. The others will still continue to work, unaffected.

Here's the screenshot of what can be achieved within minutes: (Customer and Invoices Portlets are what xmlportletfactory generated)

Customizing Core Portlets vs. Adding ridiculously Simple Portlets

Time permitting, we'll have one more plugin that demonstrates how to simplify Liferay's UI through a ridiculously simple portlet. If you add WebContent, you'll find that the UI for adding a single article has quite a complex UI. You can translate, tag, expire, categorize your content, provide abstracts etc.

What if your authors are untrained, infrequent users of Liferay? Do you want to train them on the generic UI? They'll probably be annoyed because it's so complex and they don't need all of the features. So why not simplify the UI?

In the forums, this typically comes along as "How do I change the WebContent Editor (or other plugins) to use my defaults?". I'd like to suggest a different approach: Create your own, ridiculously simple plugin. It doesn't mess with Liferay's portlets, is easy to maintain and quick to write. And if the API that you use changes in the next version, you can easily identify the spot to upgrade. In fact, that's exactly what I did - I stole some code from James' 7cogs article and made it work on Liferay 6.2 because the API changed slightly.

So, we're creating a SimplifiedArticlePortlet, which takes an article's title, as well as english and german text through a really simple UI. Point your inexperienced authors to this portlet to add their new articles and you'll be able to take them from there (and you can edit them with the full-featured WebContent editor). Here's a screenshot of the result:

If you follow along (e.g. develop the portlets) during the session, this one is a bit harder to follow - after all it involves an API call with 39 parameters. That's why I've prepared the portlet for you to copy/paste portions as you like: and

What's more?

Given your own applications: Consider to make the best out of the portal environment and compose your big application from many small building blocks. The reward is an easy maintenance of each single component and easy extension of the whole system.

Liferay's API is easy to use (even given occasional 39-parameter methods) and sometimes it's a great option to just hardcode your own logic to a ridiculously simple plugin than to extend and tweak one of Liferay's very generic out-of-the-box portlets. There's a place for generic features, just as there's a place for specialized, narror, behaviour. Choose what makes sense to you and don't fear to write throwaway code: If it's well compartmented (e.g. in a single plugin) there's nothing bad in it.


During the broadcast I didn't finish the MRUCustomerPortlet - here's what needs to be done. The code changes are marked in the solution download that will come up soon - portlet.xml is just updated as required, not marked:

  • Decorate the <li> content on view.jsp with a hyperlink that executes an action
  • Create an action handler in the portlet class, triggering the customerId event
  • Declare that our MRUCustomer portlet does also publish this event in portlet.xml
  • Declare that xmlportletfactory's CustomerPortlet now also processes this event in portlet.xml
  • Implement the eventhandler in CustomerPortlet to highlight the selected row.

And you're done. The full "solution" is now uploaded to

Olaf Kock 2014-08-26T06:15:54Z
Categories: CMS, ECM

Open Source. For Life.

Liferay - Mon, 08/25/2014 - 20:45

Life consists of all kinds of experiences. Some experiences are common, and we can go through them every day. Having a tasty meal. Sitting in traffic. Chatting with friends. Watching a good movie. These kinds of moments make up 97% of our lives. We don't think too much about these moments, they just happen.

Then there are those other experiences. The first day at a new job. The last day at an old job. A spectacular vacation far away. Getting married. Graduating from college. These things complete the last 3% of our lives. But these moments don't just come and disappear, they stay with us. We never forget these moments, and they eventually become part of how we think and how we live. Experiences that define who we are. Here are some 3% experiences that I'd like to share with you.

Above are a few of the 70+ children who live at Shepherd's Field Children's Village a foster home in China that goes all out to provide care, housing, education, and adoption opportunities for orphans with special needs. Miraculously, they are a private, non-profit organization. And Shepherd's Field has definitely seen some miracles. For example, back in 2002 when searching for land to build their facility on, the government offered them property for a price of 1 RMB, equivalent to 12 US cents. A far cry from the appraised value of $150,000. And for the last 12 years they've recieved many other acts of generosity. International doctors regularly visit the facility to donate their skills and time. Companies have donated millions into a new vocational education building that's being built. Every miracle that supports the foundation, supports the kids.

And here are a some of the faces from a group of Liferay employees in our China office who visited Shepherd's Field a couple weeks ago. None of us knew what to expect from the trip, but we prepared some games, crafts, and songs that the kids really enjoyed. But I don't think we could've done anything to prepare for the huge impression that these kids made on us during our time with them. I want to share these impressions with you too:

These kids know how to love.
The word I heard all week was "gēge" (哥哥). Gēge! Gēge! Gēge! (almost rhymes with "burger") The children would keep shouting this to us, starting from the very first day. I feel like I started to hear this word in my sleep! It means "older brother". For the girls in the group, they would always hear Jiějiě (姐姐), which means "older sister". The kids would say this to me, and would always be lifting their arms just like this:

The children always wanted us to hold and carry them. As the group videographer, so many times I was trying to film the kids, but I had to stop because they would shout gēge to me and reach out to me. They didn't even know who I was, but I know it didn't matter to them. That's just how trusting, and innocent they are. They are not afraid, they have no inhibitions. They just love to be held, they love to play, they love to connect. Some kids were even very considerate to us, making sure that we weren't too hot or uncomfortable during play time. We were all really surprised by how caring they were.

These kids are truly happy.
I will never forget this boy I got to spend time with in one of the houses. He always sat on the floor and played with a rubik's cube. I sat in front of him, and right away he gave me this little plastic duck so I could play next to him. I tried talking to him, but he was very quiet. I don't remember how it happened, but I took the duck and walked it across his back, making quacking sounds. He couldn't stop laughing and laughing. If I stopped, then he would take the duck and put it back in my hands, gesturing for me to keep on tickling him with the duck.

I later saw him sitting in a wheelchair, and I realized that he can't walk, and for whatever reason he is unable to speak much. But I feel like he had a smile on his face every time I saw him. On the very last day, I went back to his house to give him my last goodbye. When he saw me, he smiled and quacked at me just like when I was playing with him days before. That moment, I will remember forever.

From the outside it feels like these orphans don't have much. They don't have money, or gadgets, or lots of toys. They don't have their actual families. We thought that we would have to work hard to bring light and joy into their lives. But we quickly realized that they are already full of joy. The children are well cared for, they have everything they need. They have good food everyday, they have comfortable homes, and they have each other, the caretakers, the teachers, and the staff as their family. A huge 24/7 family. And they even have visitors like us who visit each week and play, play, play with them. They are never alone! These children have very little to worry about. It was amazing to spend time with them.

Meeting these kids can change your life.
They don't have many of the creature comforts that we have, and they live with different disabilities - yet they are happy. Genuinely happy. The result is that their happiness feels very pure, and innocent. That kind of happiness is infectious. We went to the orphanage to love on the children, but it almost felt like the opposite - the staff and kids wanted to show love to us.

The whole trip was really inspiring and heartfelt. Many of us reflected on ways that we can be more loving towards our own friends, family, and coworkers. We even had a group chatroom with the whole team, and we were sending beautful photos to each other even after everyone already went back home:

I hope this post has been encouraging and helps you see a bit more of what Liferay the company is doing to help communities across the globe. For more info about Shepherd's Field Children's Village and how you might be able to get involved, visit:

Ronald Sarayudej 2014-08-26T01:45:19Z
Categories: CMS, ECM

B2B Content Marketers: Are You Wasting Your Time Measuring Content Performance?

KnowledgTree - Mon, 08/25/2014 - 13:18

If you’re like most modern B2B marketers, a big part of your job is metric tracking and analysis — and there’s no shortage of things you could keep tabs on. Whether it’s response and click-through rates, website traffic and visitor activity, or prospect conversions and content engagement, marketers can choose from a seemingly endless list of KPIs to better understand — and optimize — their content marketing efforts.

But what if we told you that, in many circumstances, the time marketers spend tracking, studying, analyzing, and acting on those things is a big waste of time?

Are you measuring what really matters for marketing content performance? Look to sales enablement as key element for content measurement.

Now, we’re not suggesting that tracking and iterating on key performance indicators isn’t valuable on its own. Instead, we’d argue that the reason most marketers track that data is the problem.

Here’s why: For many marketers, performance measurement is a binary, arbitrary practice that devolves into a meaningless, time-consuming exercise. We measure for measurement’s sake, and typically without any clarity or goals around what that measurement means relative to the expected impact on sales. And, if you buy into the argument that a big part of modern marketers’ job is to drive sales enablement (we obviously do) and directly contribute to revenue growth, then that’s a pretty big problem.

So, what should B2B marketers be focusing on, and how can they better apply performance metrics to optimize sales enablement? Here are two tips to keep in mind:

  1. Allow sales enablement to drive content creation and measurement: The bottom line is that if sales enablement isn’t one of the biggest factors driving your content creation and analysis, then the intelligence you generate will be largely irrelevant. Sure, you might create a library of great content and you might even be driving traffic and conversions — but if it’s not being used by sales or attracting the right customers and prospects, does it really matter?
  2. Create value for customers and you’ll create value (and insight) for yourself: Our purpose as marketers is to create value for our customers and our organization. As such, everything we do should demonstrate how we create and capture value for prospects and the sales reps that engage them. Establishing the right metrics with sales enablement in mind will help you fine-tune your efforts to invest your resources more effectively and ensure that sales teams actually use those resources appropriately.

Unfortunately, there’s no one-size-fits-all formula for which metrics and KPIs should be tracked to optimize sales enablement.

But the more you pay attention to how, why, and in what context your sales team (and your customers) use content, the easier it will be to do something meaningful with the information and intelligence you capture.

The post B2B Content Marketers: Are You Wasting Your Time Measuring Content Performance? appeared first on KnowledgeTree.

Categories: ECM

2014 Liferay Marketplace App Contest Results

Liferay - Mon, 08/25/2014 - 12:52

Today Liferay announced the winners of the 2014 Liferay Marketplace App Contest! This year, we were super excited to see what our community could dream up, and you did not disappoint. The review team witnessed an unmistakeable and significant increase in overall app quality this year, so it was even more difficult to pick the winners. A big thank you goes to each of you who took the time to create and submit your apps to the contest, because without you, we'd never see the variety and creativity of apps that a big community of awesome people can produce. Ok, enough babbling, onto the results!

The Grand Prize Winners

This year, with the introduction of paid apps, we judged across two different axes: commercial/non-commercial and free/paid, which resulted in 4 different categories and 4 grand prize winners (and 4 runners up). This allows those with less available resources (i.e. people, time, and money) to still compete and win! Apps were judged for their creativity and usefulness, ease of installation/setup, user interface, user experience, Liferay integration, and completeness of solution. Here are the grand prize winners for 2014:

Social Apps Proxy (Free; developed by Stian Sigvartsen)

If you are building apps that integrate with all the things social, this app implements the most boring and complex part of that integration, and exposes a simplified interface for your app's customers to connect your app with their preferred social networks. It acts as a proxy between your app and any OAuth-based social network (like Twitter, LinkedIn, etc). OAuth is complex and difficult to get right, so this app does the magic for any number of external networks with which you wish to integrate, and does so securely within the Liferay platform!

Visioneo Reports PE (Paid; developed by Dominique Pardon)

Visioneo is a complete reporting application, allowing you to embed high quality reports into Liferay. Using the popular Open Source BIRT Eclipse designer, you can create powerful reports containing charts, data tables, cross-tables, images, grids, multiple pages and many other things from your own datasources (including Liferay itself!). There are two versions available: a Community Edition (CE) and a Professional Edition (PE). The Professional Edition includes enhanced Liferay integration through reports permissioning and document integration.

Tori Forum (Free; developed by Vaadin Ltd)

Tori is a discussion forum portlet with a fantastic user interface and experience. Features like real-time notifications and in-page navigation make it easy and comfortable to use. Also included are real time notifications, a re-use of Liferay's forums backend (and is therefore a drop-in replacement), enhanced SEO and page indexing, custom badging, and much more. With a fast and fluent in-page navigation pattern and integrated analyics, Tori Forum is a great alternative front to the built-in message boards!

Vahtie - Survey and Insight (Paid; developed by Arcusys Ltd)

Vahtie is a powerful survey and feedback management solution for organizations to do employee, customer and research insight. It's designed to support large scale organizations natively on Liferay platform. It's proven and tested in production and it's currently being used by organizations with tens of thousands of users. It's a turn-key solution to a problem that pretty much every company or organization has - how to improve business based on feedback from those that use whatever it is that your company or organization produces.

Each Grand Prize app will be on display at an upcoming Liferay Conference - if you're interested in learning more about them and meeting the developers and companies behind these apps, check out our upcoming events listing to see if there is an event nearby that you'd be interested in attending!

The Runners Up Announcements (Free; developed by Guillaume Lenoir)

This app implements a social announcements platform, using categories and vocabularies from Liferay. Users can create and manage announcements of varying purpose across multiple different sites, and includes support for adding rich media, workflow for announcements, native integration with Liferay's asset management framework, support for social activity streams, comments/likes/views, and uses Liferay's out of the box UI to provide a pleasing experience with virtually no changes.

Social Login for Liferay (Paid; developed by Moisés Belda)

Social Login for Liferay is a plugin which enables users to login to Liferay using their preferred social networks, including support for the most popular social networks like Google+, Facebook, Twitter, LinkedIn, and even includes support for Microsoft network login. It is OAuth2-based, and uses AlloyUI components to give users a great mobile and desktop experience when logging into your portal.

MapIt Now (Free; developed by 3F Consulting)

This plugin uses a visual geographic map to visualize the location of content such as blog and wiki posts, forum threads, users, and any other asset type in the Liferay platform. Implemented as a standard AlloyUI/JavaScript component, you can add multiple maps to a page, and link it to other built-in asset presenters such as Liferay's Asset Publisher. Administrative controls allow you to selectively enable or disable different asset types, and choose which mapping service and layers to use (e.g. OpenLayers/OpenStreetMap, Google Maps, Bing, and others). Paid plugins are also available to change the way the data is presented.

Intelligus TeamWorXX (Paid; developed by PFI Knowledge Solutions Ltd)

Intelligus TeamWorXX is a web-based collaboration and social networking suite, which leverages and extends the social and collaboration features of Liferay. TeamWorXX is aimed at helping groups of users work together effectively and share knowledge online. Used by over 250,000 users worldwide, Intelligus TeamWorXX is a feature rich web collaboration platform that hosts the UK's largest platform for public service collaboration. Intelligus TeamWorXX lets your users manage everything from searching all visible groups, members and content, to contributing ideas, posting announcements and creating polls.

Some Stats
  • 301 apps available on the Marketplace
  • 750 Enrolled Marketplace Developers
  • 150 Enrolled Marketplace Companies
  • 98 Total contest submissions from 15 countries (Australia, Belgium, Costa Rica, Czech Republic, Ecuador, Finland, France, Hungary, India, Italy, Peru, Romania, Spain, UK, USA)
... In Closing

This year we saw a huge increase in app quality during the contest: initial setup, UX, Liferay integration, you name it. Every single app in the contest was useful and I think shows the power of a community of people finding new and creative ways to use Liferay technology to solve real issues. Well done everyone!

James Falkner 2014-08-25T17:52:33Z
Categories: CMS, ECM

How to embed a Web Content on your theme?

Liferay - Fri, 08/22/2014 - 16:43

Hi guys

Most of the time I need to embed a Web Content on the theme that I develop.

To solve this I usually insert a Web Content Portlet using the following code:

#set ($VOID = $velocityPortletPreferences.setValue('groupId', $themeDisplay.getCompanyGroupId().toString())) #set ($VOID = $velocityPortletPreferences.setValue('articleId', $webContentID)) #set ($VOID = $velocityPortletPreferences.setValue('portletSetupShowBorders', 'false')) #set ($portlet_id = '56') #set ($my_portlet_id = "${portlet_id}_INSTANCE_ABC1") $theme.runtime($my_portlet_id, "", $velocityPortletPreferences.toString()) Some days ago, I was talking with others guys and Travis said to me that I can do this in another way. The following code insert the content of the "web content" where I need.   $journalContentUtil.getContent( $themeDisplay.getCompanyGroupId(), $webContentID, null, $locale.toString(), $themeDisplay )   If you know another way to embed a Web Content or a portlet let us know in comments.   See you soon :)   Paulo Fernandes 2014-08-22T21:43:20Z
Categories: CMS, ECM

Why Alfresco Rose Above the Crowd

Alfresco - Fri, 08/22/2014 - 03:42

By Jeff Klemens, Principal of Sageview Capital

The funding environment in Silicon Valley today is best classified as both dynamic and robust. Buoyed by both strong consumer successes such as Facebook, Twitter, LinkedIn and GoPro, and enterprise winners including Splunk, Workday, Palo Alto Networks and ServiceNow, the venture capital and growth equity community have seen a rebound in investor returns and a corresponding increase in capital allocated to finding the next disruptive growth company. This comes at a time when the impact of mobility, cloud computing, social media, open source development, and as-a-service business models have moved beyond the fringes and into the mainstream of the technology landscape. This has caused a major shift of budget dollars and has quickly created new winners and losers in nearly every technology market category. These mega-trends impact how both consumers interact with technology and enterprises purchase and deploy technology. And it makes for an incredible petri dish to cultivate innovation and new ways to deliver value to customers.

At Sageview, we focus on finding established businesses with a strong customer value proposition that are looking to scale their business and achieve the next level of their strategic vision. Our philosophy is to find just a few companies each year in which to invest both our capital and our time. Once invested, we work closely with the company – formally as board members but more broadly as strategic capital partners – to add value where our skill set and relationship network can be put to work in support of the company’s objectives. So while we see hundreds of interesting opportunities, we focus our energy on the ones we perceive to have the best combination of innovative product, large market opportunity, compelling strategic vision, and track record of company execution.

We are excited today to announce our investment in Alfresco because we believe it is a great fit on all of these dimensions. Alfresco has benefitted from the vision of the founding management team, led by John Newton, which architected Alfresco from the beginning to be a disruptive solution in the Enterprise Content Management (ECM) market. For nearly 10 years, customers have adopted Alfresco over competing legacy solutions to solve their business-critical content challenges due to its open, modern architecture that is both flexible and fully compliant, along with offering a compelling TCO proposition. We try to be as comprehensive as possible during our business diligence to have customers corroborate the company’s story, and in Alfresco’s case our conversations with customers and partners were very confirming of the product’s market-leading position and the company’s strategic direction. With 1,800 customers today, there is no shortage of case studies where Alfresco has delivered strong customer value. Alfresco’s track record of success in the ECM market is consistent and well established.

Driven by a desire to increase its market presence, Alfresco hired Doug Dennerline as CEO 19 months ago. Doug, together with the impressive senior leadership team he has recruited around him, has developed a clear strategy for the company to drive further growth, expand the breadth of the product portfolio and further enhance value for partners and customers. Alfresco’s hybrid cloud product strategy is bringing innovation to the intersection of the ECM, Business Process Management (BPM) and Collaboration markets. On the heels of their success in ECM we believe Alfresco is well positioned to penetrate these large adjacent markets. The investment we are leading will support the product, sales and marketing investments needed to ensure Alfresco delivers on this big vision. The acceleration of growth the company is experiencing today is evidence of the strategy paying off, and it’s still very early innings.

We look forward to working with Alfresco’s management team, Board of Directors, customers and partners to help achieve this compelling vision. While there are ample big promises amidst the disruption happening in technology today, the combination of product, market opportunity, vision and execution made Alfresco rise above the crowd for Sageview.

Categories: ECM

Simple REST App in Web Content Management (JSONFactoryUtil and HttpUtil)

Liferay - Thu, 08/21/2014 - 12:40

I've heard that you can do some really cool stuff in Web Content (check out James's and Ray's blogs) but haven't gotten around to tinkering with that myself.  Here is a fun little experiment with that, it grabs a Chuck Norris joke from a REST API, all from inside of a Web Content template.



And here is the code for the Web Content Template:

#set($jsonResponse = $jsonFactoryUtil.createJSONObject($httpUtil.URLtoString(''))) <p>We are calling a <a href="">simple REST API which grabs a Chuck Norris joke</a> and displaying part of our web content based on that response.</p> <p>Output some values for debuging purposes:</p> <ul> <li>jsonFactory: $jsonFactoryUtil (This will display the full package name if this loads correctly) <li>Response: $jsonResponse </ul> #if ($jsonResponse.getString('type') == 'success') <div class="portlet-msg-success"> $jsonResponse.getJSONObject('value').getString('joke') </div> #else <div class="portlet-msg-error"> You broke the interwebs. </div> #end


Additional Notes:

  • You can paste this into any web content template.  This outputs the same thing regardless of what is in your structure and web content.
  • Tested against 6.1.30 and 6.2.10
  • Uncheck "cacheable" if you want to load a new joke each time the page refreshes.
  • When using this code snippet, make sure that you have the script language set to "Velocity".
  • For this example, you wont need to enable restricted values from velocity or freemarker, but if you need more power and want to use Liferay services, be sure to check that out.
Scott Lee 2014-08-21T17:40:31Z
Categories: CMS, ECM

The Road Less Traveled in Enterprise Content Management (ECM)

Alfresco - Thu, 08/21/2014 - 06:00

2014 has been an exciting year thus far for Alfresco. Our developer Community continues to expand, we’ve brought great new partners into the fold, and we are incredibly honored to have been selected by some very prestigious new customers. Even better, our visionary product innovation at the intersection of business-critical content, process and collaboration continues at breakneck speed. As a result, Alfresco is on a growth trajectory that is triple the growth rate of the ECM industry overall1, and the company is growing more than 30 percent annually. I couldn’t be happier and hope you will join us at Alfresco Summit 2014 September 23-25 in San Francisco or October 7-9 in London where we will be sharing more details about our plans and priorities for the upcoming year.

But today I want to turn to some news that is validation for any CEO. I’m proud to announce that Alfresco has raised a new round of funding – a total of $45 million led by Sageview Capital along with participation from existing investors Accel Partners, Mayfield Fund and SAP Ventures.

Why are investors betting on Alfresco?

The Enterprise Content Management (ECM) market is huge – estimated to be a $5.1B industry (per Gartner) as of 2013. I’d guess it’s topping $6B today. And it’s also crowded – with traditional ECM vendors on one side struggling with legacy technology that dictates the dreaded “lock in” that frustrates customers… and newer, cloud collaboration players that serve a content “light” need for consumers who want to share or store content, like a PowerPoint document.

The path we’ve chosen is one less traveled – admittedly disruptive – and informed by customers’ needs that simply aren’t being addressed by the ECM industry today.

The world Alfresco lives in and the customer pain-points we solve are tied to mission-critical content, processes, and records.
In other words, we are content at scale – not the lightweight use of that content (like sharing images or documents). You can get cheap storage to do that. More so I’d argue that “ad hoc” storage is what causes content chaos. Highly-regulated industries (think government, finance/banking and high technology) require enterprise-grade content management solutions they can trust to comply with SOX, FERPA and other regulations. As example, many US-based IT organizations have compliance needs dictated by The Sarbanes Oxley Act (SOX) where who touched what document, when and how often is in the spotlight. These industries seek an enterprise-level, compliant way of managing their mission-critical content in a user-friendly way.

Open-source DNA + the application of open standards is disintermediating Legacy ECM players.
In the ECM industry, there is a large installed base of technology that has been around for nearly two decades. We hear complaints daily that companies crave something new – a more modern, and open architecture (built on open standards) that doesn’t trap them within the walls of legacy technology. Companies seek easy deployment and integration of their content management platforms into existing technologies. With legacy vendors, that is a long, expensive and ultimately unrealistic goal. But with Alfresco it can be done simply and quickly with a content management solution built on open standards, with a modern architecture that allows flexibility and can evolve with customers’ needs over time – avoiding vendor lock in. And integration with other lines of business (LOB) is easier as customers have access to source code to easily understand how to integrate with their preferred content management system.

Having the freedom to enjoy all the benefits of the Cloud – while also gaining the advantages of an on-premise environment (at the pace of the Web) is the Holy Grail.
While many companies today have highly-valued content that IT will never trust to anything but an on-premise environment, others desire to have the freedom and efficiency of the Cloud. In addition, many enterprises would prefer the best of both, where they can choose the cloud for some content while keeping other content on premises. Hence ECM customers seek deployment options to meet their IT departments’ preference—whether it be on premise, Cloud or via a hybrid approach. Alfresco is the hybrid solution that provides all these options. Having the ability to replace legacy, on-premise only solutions with a hybrid approach appeals to both the IT department and the end user. We give the end-user and IT the freedom to develop on top of the cloud platform for today’s mobile workforce, with the same compliance benefits of an on-premise solution.

It’s also worth sharing that one of the key frustrations of on premise software of the past is the slow pace of innovation. With an open architecture, you can actually operate and make changes to your on-premise architecture – when you’re ready – at the pace of the Web.

At Alfresco, we have built a business that now serves more than 1800 active customers in 212 countries, managing more than 7 billion documents for over 11 million users worldwide. We’ve set ourselves on a path less traveled – but one informed by customer needs.

We are confident with this latest round of funding that the trust our investors are placing in Alfresco will only deepen our industry disruption and accelerate our ability to lead customers toward the future of ECM.

1 Calculations performed by Alfresco Software based on Gartner Report, Market Share Analysis: Enterprise Content Management, Worldwide, 2013 Analyst(s): Tom Eid, Bianca Francesca Granetto, 2013 Published: 2 June 2014.

Categories: ECM

The Power of the Internal Customer

Liferay - Tue, 08/19/2014 - 18:47

The customer is always right. If you've been around the American marketplace long enough, you should be familiar with the phrase. It's the idea upon which the best restaurants and companies look to pride themselves to ensure all patrons are treated with utmost care and respect, and when entangled in a complaint, to side reasonably with the customer. This heavy emphasis on serving external customers makes sense: they are the ones who sustain our company and profit margins.

Yet there is growing awareness within corporate circles of the need to address another group: internal customers. Internal customers are officially defined as those who are directly connected to your company and most likely work within the company. Think of them as your employees and stakeholders. It might seem strange to think of your employees as customers since you're paying for their services. But the employees you hire are choosing to ascribe to and consume some sort of culture and work environment provided by your company. And if it is not a good environment, your workers will be less motivated to turn in their best work and could ultimately bolt for another gig.

Winning companies understand the power of the internal customer. In his book, Delivering Happiness, Zappos CEO Tony Hsieh mentions that "a company's core values ultimately define the company's character and brand. For individuals, character is destiny. For organizations, culture is destiny.” Hsieh is famous for creating a fun and refreshing work culture which landed Zappos on Fortune’s list of "The Best Companies to Work For." When you start at the root of creating the right infrastructure for the internal customer to succeed, then the natural result is better quality service and product for the external customer. Before you know it, employees will go the extra mile to ensure clients are satisfied.

So, how do you empower your internal customers to achieve more? What plans or services could you provide to help your employees thrive?

Here are three tips to help guide you in the right direction:

1) Provide effective mentorship throughout the organization

When certain employees aren't performing, lack of qualifications or motivation usually come up as popular reasons. But another reason might also be tied to your failure to set them up properly to succeed. Mentoring involves counseling and training the employee to develop their professional skill sets. When you provide good coaching, you are effectively setting a roadmap for your employee's career development. This relationship will help groom employees to become new leaders while fostering trust and confidence between both parties. 

2) Allow a forum for open and constructive feedback

When you create an environment where honesty is valued, then you can expect work quality to improve and the environment to be more harmonious. Processes will be improved, backbiting will be reduced, and grievances will be settled. Employees will also feel more valued for their thoughts and opinions, regardless of title or pay. At Liferay HQ, nobody owns an office or cubicle, including the C-levels. We all work amongst one another, sitting in rows of desks without walls, free to go back and forth with those around us. This will also curb "groupthink" which can greatly hinder growth and innovation. The best ideas in the room sometimes come from the person whom you may least expect.  

3) Show them you really care through action

Appreciation goes a long way and comes in many different forms. It could be as simple as acknowledging an employee's stellar work through an email or as elaborate as throwing a company-wide party. The important thing is that your employees know and feel how much you value them. As you recognize their unique contributions as both a worker and person, the work atmosphere will begin to feel more like family and less like a sterile office space where people just clock in and clock out. Different teams and departments will get each other's back and band together to achieve one common goal: an ultimate win for all.

Providing a culture in which employees can thrive and excel is just as important as serving the external customer. The corporations that understand this will be hiring, growing and keeping talent far above the rest of the competition—which will greatly benefit the external customer, too.


Liferay: Nerd On The Street is a blog devoted to sharing new ideas about business and technology. To continue the discussion, post your thoughtful insights below.

Martin Yan 2014-08-19T23:47:05Z
Categories: CMS, ECM

Radio Liferay Episode 40: Our Upcoming Events. Hack 'em!

Liferay - Tue, 08/19/2014 - 10:51

  Radio Liferay is back with a repeat guest, James Falkner, Liferay's Community Manager. Like last year, symposium season is about to start (even though we already had some events earlier this year...). And there's something new, for the nerds and software craftsmen among you.

We talked about

  • The upcoming events, how to tell them apart and the target audience. In short: LPSF (Liferay Portal Solutions Forum) is targetted to business users, DevCon is targetted to Developers and technically interested people. Symposium has tracks for both groups.
  • You'll find almost all of the upcoming events on Liferay's Events overview - filter for "Conferences". As of publication of this episode, the first brazil symposium is not yet on that list.
  • Check if the event you want to go to still has an open Call For Paper. Some are still open the day that this episode is released.
  • Final reminder: Unconference seats will be limited. Register early to make sure you get your seat.
  • This year, we're going to provide access to the (anonymous) data that backs the events, and hope that you'll create an awesome mashup with this data. Refer to James' blog article "DIY: Liferay Events Hacks: Part 1" for details of the API and let us know if you need more help
  • iBeacons and what to do with them at events. (Watch out for a part 2 of James' blog article)
  • ...and other topics - but listen yourself... if you listen close enough, you might even hear a secret

Follow @RadioLiferay (James) or @olafk (me) on twitter

Again, shoutout and big thank you to Auphonic for postproduction help. This is a fantastic service!

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

Or just download the MP3 here:

Olaf Kock 2014-08-19T15:51:55Z
Categories: CMS, ECM

Hosting OSGi F2F at Liferay Spain

Liferay - Tue, 08/19/2014 - 05:25

I am sure most of you already know we are members of the OSGi Alliance, and we are trying to get involved as much as we can. Our next step is to host a face to face during the 9th, 10th and 11th of September here at the Liferay Spain office.

But not only that, Peter Kriens has kindly accepted my proposal to talk about OSGi and the enRoute initiative in a public talk (seats are limited, sorry). You can find all the details of the talk in the event page (we are organizing the talk under the MadridJUG umbrella)

Hope to meet some of you at Peter's talk!


Miguel Ángel Pastor Olivar 2014-08-19T10:25:30Z
Categories: CMS, ECM

DIY: Liferay Events Hacks: Part 1

Liferay - Thu, 08/14/2014 - 10:08

Liferay hold many events throughout the year (10+ this year alone), featuring keynotes, workshops, expert speakers, onsite and offsite events, and multiple venues around the world. The data associated with past, current, and future events includes huge agendas, many speakers, rooms, activities, maps, locations, analytics during the event, and much more.

Finding an effective way to aggregate and display all that data for attendees (on multiple devices) is a challenge! We have websites and mobile apps that are designed for displaying this data, but there are things some folks want and others do not, so we are challenging you, the community: do it yourself and make it better than ours, and show everyone what you made!

We're opening up the data stream for our community, and want to see what kinds of new and interesting things you can do with the data. Think dynamic maps. Floating faces. Wordles. Mind maps. Semantic content analysis magic. Mashups with social media. Interactive websites. Ways to connect the dots that no one else thought of. The data is simple, and your creativity is unending, so show us what you can do! (BTW: Technically, the data has been open, just undocumented!)

What's in it for me?

You'll gain respect, love and admiration from our community. Not enough for you? We will also show everyone your creations at the upcoming symposiums and DevCon this fall and tell everyone you are a rockstar!

How do I participate?

Simple - create something awesome using the data feed (see below for details on the format and meaning of the data), and tweet the result (pics, screenshots, videos, links) using the #DIYLiferay hashtag. Also, feel free to blog, forum-post, and anything else you want to use to get the word out. We want to see what you did!

There is a lot of data - you don't have to use all of it. Just pick the stuff you want to use, and ignore the rest. Even just the speaker headshots could be used for some rotating awesome 3D sphere of heads. Also, I tried to describe everything in excruciating detail below, but may have missed stuff, but the names and content should be pretty straightforward, and you can check out the data feed and compare it to the microsite and mobile app to see how the data is used there, to give you some idea on how to use it for your own purposes.

  • If you write code, seriously consider licensing it with an OSI-approved open source license. We want to learn from you! And find bugs for you.
  • You must follow applicable laws (e.g. copyrights, trademarks, logo usage, etc). Nothing new here.
  • Since the event data changes constantly, you should include the following statement prominently in your solution: "This presentation of Liferay Event data was created by [Your Name Here]. Please note that all data is subject to change and Liferay's official event data can be found at"
Liferay Events Data Feed Details

All event data are stored internally on in Dynamic Data Lists, and can be downloaded as individual JSON documents using Liferay's built-in JSONWS service. We layer on a plugin (which will eventually make its way to the Marketplace) to do some post-processing of the returned documents for easier usage in the mobile app.

What code do I need to write?

You can use any language or framework that can retrieve and parse content (so basically, any language!). See the end of this post for working code that you can quickly try out to see how things work. But the main workflow is:

  1. Get a list of events in JSON
  2. Get data about a specific event in JSON
  3. Do something awesome with the data
General guidelines
  • All dates are represented in format YYYY-MM-DD or HH:MM and are assumed to be in the local event timezone unless otherwise noted.
  • Boolean values are represented by the strings 'true' and 'false' - you will need to convert these to real booleans in your chosen language if desired.
  • Some items are themselves are strings that represent JSON documents and must be parsed as such again, in code. For example, you might find a string like "{\"foo\": \"bar\", \"baz\": 3}" and you would need to parse this to programmatically access it (e.g. using JSON.parse()).
  • Some items are lists of name/value pairs, e.g. a=b,c=d and may contain whitespace (including tab characters!) that should be trimmed. That means you should parse 'a=b,c=d' the same as ' a =b , c = d'. Also, colon-separated lists like 'a:b:c,d:e:f' is the same as ' a: b : c ,d: e :f '. Recommendation: use String.trim(). Enjoy!
  • Every record returned via a JSON endpoint will have a UUID associated with it named uuid. This is sometimes used to relate two items together, e.g. agenda items have a list of speakers represented as a list of uuids, which can be used to get the right speaker record via the uuid (assuming you have already retrieved the list of speakers).
  • I suggest you download and cache all event data for a given event at once, and store them internally (possibly using hashtables for quick lookup based on things like uuid). If you only download half the data, you might not be able to de-reference certain pointers (like speaker UUIDs). That's what the mobile app does (and periodically refreshes data once every 30 minutes while the app is running).
Step 1: Getting the list of events

As we have many different events throughout the year, the first thing to get is a list of events, using the following endpoint (notice the hard-coded ddlRecordSetId value - this is your key to the kingdom and should never change for the event listing):

Go ahead, click it! You know you want to.

This is the same endpoint used by the mobile app to show you the event select screen when the app is first used. The returned document is a JSON array with the following structure:

[ { "dynamicElements": EVENT_1_DATA_JSON_OBJECT }, { "dynamicElements": EVENT_2_DATA_JSON_OBJECT }, ..., { "dynamicElements": EVENT_N_DATA_JSON_OBJECT } ]

Each event is represented as an object in the above array, named dynamicElements. Each event object (the EVENT_N_DATA_JSON_OBJECT from above) has the following elements:

  • active: 'true' or 'false' (note they are strings, not booleans), inactive events aren't finalized and should be ignored (and are blocked in mobile app)
  • booth_map_name: name of map (see below) that represent sponsor booths
  • end_date: when the "thanks for attending" message should show in the app, format YYYY-MM-DD
  • end_time: when the "thanks for attending" message should show in the app, format HH:MM
  • event_hashtag: official event Twitter hashtag (e.g. #lrdevcon for the upcoming developer conference)
  • event_type_dict: translations for select options for sponsor levels, session types, and agenda filter names. Format: comma-separated name=value pairs. E.g. "diamond=DIAMANT,gold=Gold" means the level with key "diamond" should be displayed as DIAMANT (German translation of Diamond) and key "gold" should be displayed as Gold.
  • event_tz: number of hours ahead or behind GMT (negative numbers indicate ahead, e.g. France is -2 in summer, can be used to correct for phones that are set to a different timezone than the event itself to calculate 'local event time' based on device time.
  • event_url: Web URL to the event microsite
  • eventid: identifier used to namespace the user data for this event
  • inactive_msg: message to show user when trying to access inactive event via mobile app
  • latitude: Decimal degrees of latitude for event location (approximate, used for the 'pick the closest location' button in app)
  • location_label: Name of location (usually a city name, e.g. Paris or Boston)
  • logo: the logo to use to represent the event. This string is an embedded JSON document which can be used to construct the final URL to the logo, format is: {"groupId": gid, "uuid":uuid, "version":version}. You can parse this with JSON.parse(). The final URL can then be constructed:[groupId]/[uuid]
  • longitude: Decimal degrees of longitude for event location (approximate)
  • menutitle: String which appears at top of mobile app screens
  • metadata_types: [see below for details]
  • news_type: ddlRecordSetId of the list of news to show user, can periodically check this to see if there is breaking news (see news item below)
  • ordered_sponsor_levels: the order and size of the sponsor logos on the Sponsors screen. Format: comma-separated list of [name:logos-per-row:size] triplets. For example diamond:1:large,platinum:2:small means that Diamond-level sponsor logos should be shown at the top, 1 per row, and 'large' size, where Platinum-level sponsors are shown 2 per row, and a smaller size. Size can be large or small. Names of sponsor levels are used in the sponsor list, and the display name can be found in the event_type_dict.
  • randomize_sponsors: 'true' or 'false': whether to randomize order of individual logos within each sponsor level.
  • register_url: the URL for people to register to attend.
  • session_survey_questions: A list of questions to ask when survey feedback is given. The format of this is beyond the scope of this challenge :)
  • start_date: when the event begins, used to order on the 'event select' screen. format YYYY-MM-DD
  • start_time: when the event begins, used to order on the 'event select' screen. format HH:MM
  • survey_questions: A list of questions to ask when event feedback is given. The format of this is beyond the scope of this challenge :)
  • title: name of event to show on the event select screen.
  • track_colors: Custom definition of track bar colors for agenda screen. Format: comma-separated list of hex values (where the first one represents track 1, etc) For example #234233,#66DDAA
  • upload_photosetid: the photoset id used to upload and retrieve pictures from the event [see below for details]
  • uuid: unique identifier for this particular object

As new events come online, they will appear in this list. And past events are here as well, in case you wish to test with past event data to fine-tune your app!

The metadata_types element

Each event has a metadata_types field. This is the key to drilling down and getting event-specific data (like agendas, speakers, etc). The format of this element is a comma-separated list of name:ID pairs. For example agenda:12323423,activities:23423243,... You use these IDs to retrieve data of a particular type for a particular event, for example: just as you did for the event list. The elements in the metadata_types list include:

  • agenda: A giant list of all agenda items for the event that appear on the microsite and mobile app
  • activities: A list of onsite and offsite activities (e.g. community meetups, social hours, etc)
  • contacts: A list of initial contacts to populate the 'Contacts' screen for the event
  • galleries: A list of photo galleries to show on the 'Gallery' screen for the event
  • maps: A list of maps to show on the 'Maps' screen for the event
  • rooms: A list of rooms used at the event (used to map agenda items to physical rooms)
  • speakers: A list of all speakers (used to generate pics, biographies, etc)
  • sponsors: A list of the sponsors of the event, for the 'Sponsors' screen

Each type of data is explained below. You will also find elements for beacon_forms, beacon_individual_events, beacon_region_events, and beacon_regions: These are related to our iBeacons feature at events, and will be covered in part 2 of this blog post.

Step 2: Fetch data about an individual event

Once you have fetched the list of events above, you can then use the metadata_types object for an event to access details about the specific event, using the ddlRecordSetId's in the metadata_types field for that event. For example, the agenda for France Symposium is 35246557.  You should fetch all data (agenda, speakers, rooms, etc) for a given event at once, because some elements reference other elements (e.g. an agenda item lists speakers by their uuid, which can be looked up in the speakers data for the event).

Fetching The Agenda

The agenda is the most complicated of all the event data types. Here's the France Symposium agenda. Note that all agenda items are represented here, including breaks, after-parties, registration, etc. Some elements may not have all fields filled out (e.g. there are no speakers for the 'Breakfast' agenda item, and no video URLs either). The format is the same as above, with the following elements:

  • custom_css_class: ignore this, not the droid you are looking for
  • date: Day of the session, format: YYYY-MM-DD
  • display_in_mobile_app: whether to display in mobile app or not (some items are not)
  • display_on_live: whether to display on microsite or not (some unfinished items are not, and you should ignore these)
  • download_label: Slide download URL (only active after event)
  • download_url: Session replay URL (only active after event)
  • enable_notes: Whether to enable 'personal notes' field in app (e.g. "Lunch" is not enabled for this)
  • enable_ratings: Whether to enable the session to be rated (e.g. "Afternoon Break" is not rateable)
  • end_time_hour: When the session ends (it's actually a JSON array with a single element representing the hour of end - don't ask why)
  • end_time_minutes: When the session ends (it's actually a JSON array with one element representing the minutes of end time - don't ask why)
  • room_uuid: The UUID of the room element that in which this session takes place
  • session_summary: The human-readable abstract/summary of the session
  • session_type: A single-element JSON array representing the type ("Technical", "Case Study", "Workshop", etc. used to put cool icons on the display)
  • speakers_uuid: A comma-separated list of speaker UUIDs for the session. You can look up speaker details via the UUID and the speaker list below.
  • select_category: If present, then this is a JSON array representing a list of categories to which this session belongs. E.g. all Mobile-related talks would have mobile as a category, or perhaps mobile, responsive. These are free-form tags that are used on the website and mobile app to allow attendees to only show certain kinds of sessions. The display name of the filters can be found in the event_type_dict dictionary for the event.
  • sponsors_uuid: A comma-separated list of sponsors that are sponsoring the session (e.g. for sponsored after-parties, etc)
  • start_time_hour: When it starts (again, a single-value JSON array)
  • start_time_minutes: When it starts (again, a single-value JSON array)
  • survey_questions: The list of questions to ask when rating the session. Out of scope for this challenge!
  • title: The title of the session
  • uuid: The unique identifier for this session
  • video_url: Direct video replay URL (available after event)
Fetching The Speakers

Here's the France Symposium speaker list. Format is the same, with the following elements:

  • speaker_bio: Human-readable biography of speaker
  • speaker_company: Their company
  • speaker_highlight: true or false. Whether they are highlighted. Highlighted speakers are shown on a "Highlighted speakers" page on the microsite.
  • speaker_image: The URL to the headshot. Again, it's a JSON document that can be used to construct the URL in the same way as other images (for example the logo element in the Event List)
  • speaker_keynote: true or false. true means it's a keynote, and is highlighted on the agenda listing.
  • speaker_name: Name of speaker
  • speaker_social_blog: URL to their blog
  • speaker_social_facebook: URL to their Facebook page
  • speaker_social_liferay: URL to their Liferay profile
  • speaker_social_linkedin: URL to their LinkedIn page
  • speaker_social_twitter: URL to their twitter page
  • speaker_social_youtube: URL to their youtube page
  • speaker_title: Their job title
  • uuid: Unique identifer for this speaker
Fetching The Sponsors

Example from France Symposium. Here are the elements:

  • docmedia: The sponsor's logo. Same deal as above, it's a JSON document which can be parsed to construct the URL.
  • level_rank: Their rank within their level. E.g. a Gold sponsor of rank 2 would be displayed below rank 1 or 0. Ignored if randomize_sponsors is in effect for this event.
  • link: The link to the sponsor's homepage/website.
  • name: The name of the sponsor.
  • rank: Their rank - it's a single-element JSON array indicating the key of their rank. e.g. 'diamond' or 'platinum' or 'exhibitor'.
  • type: A single-element JSON array. 'event' is a traditional sponsor. 'photo' is a photostream sponsor. 'scan' is a badge scanner sponsor.
  • uuid: Unique identifier for this sponsor.
Fetching The Rooms

Rooms are linked to sessions via UUID. Here's the France Symposium room list. Elements are:

  • display_as_track_heading: ignored (it used to mean something, but no longer)
  • map_id: Unused currently (we use the name of the room as a key in the other lists)
  • room_name: Name of room (e.g. "Grote Zaal" or "Grand Ballroom")
  • room_number: Unused currently
  • uuid: A unique identifier for the room
Fetching The Activities

Activities are things like Community Meetups, etc that appear on the "Activities" screen in the mobile app. Here's the France Symposium activities list. Elements:

  • date: The date of the event, format: YYYY-MM-DD
  • description: Human-readable description of event
  • endtime: When it ends. Format: HH:MM
  • hostedby: Company or individual that is hosting activity
  • map_name: The name of the map element that can be used to generate a pointer to the map itself.
  • picture: A JSON object that can be used to construct a pointer to the image for the activity.
  • starttime: When it starts. Format: HH:MM
  • title: The title of the activity
  • uuid: A unique identifier for the activity.
Fetching The Maps

Maps are used to show room layouts and provide maps to relevant physical locations (e.g. hotels, pubs, tennis courts, etc). Here's the France Symposium map listing. Elements includE:

  • address: The physical address of the place. Don't try to parse it, just use it as input to some map service like google. Also, for room maps, there's no address.
  • icon: A small thumbnail representing the location.
  • image: A bigger image representing the location.
  • name: The name of the place (is used in the Activities list to generate a link to this map)
  • phone: If you want to call/text the location, use this phone number.
  • show_map: For items that don't have an actual address (like a room in a venue), this is 'false', and the mobile app won't generate a dynamic google map.
  • uuid: A unique identifier for this map. Is used elsewhere (e.g. in the agenda's room_uuid element) to reference this map.
Fetching The Contacts

In the mobile app, there is a Contacts screen with a default list of contacts, that can be added to at certain events that have QR codes printed on badges. Here's the France Symposium contacts list. Elements:

  • blog: Their blog pointer
  • city: The city in which they do business
  • companyname: Name of company
  • country: Name of country
  • facebook: Their facebook page
  • firstname: Their given name
  • googleplus: Their Google+ page
  • lastname: Their family name
  • linkedin: Their LinkedIn page
  • phone: Their business phone number
  • picture: Their image (again, a JSON object that must be parsed to construct an image URL)
  • readonly: Whether they can be deleted. 'true' or 'false'.
  • state: Their state/region
  • street: Their street address
  • twitter: Their twitter page
  • url: Their company's URL
  • uuid: A unique identifier for this contact
  • youtube: Their YouTube page
  • zip: Their postal code
Fetching The Galleries

In the mobile app, there is a Gallery page with different tabs for different events. Generally, the gallery in position 1 is the gallery representing the current event that is being brosed. Here's the France Symposium gallery list. Elements:

  • photosetid: The photoset identifier (see below)
  • position: The position of the tab (1=leftmost, 4=rightmost)
  • rateable: Whether pics in this gallery can be rated (thumbs up). Generally only the current event's pics can be rated.
  • title: The title of the gallery (appears on tabs)
  • uuid: A unique identifier for this gallery entry.

During the event, attendees are encouraged to take pics and upload them with the mobile app, and the pics go to Flickr. You can retrieve a listing of all the pics from Flickr using the photosetid and Flickr's REST web service (you have to have an API Key, and follow their docs closely to do this). This listing you get back from Flickr also includes a direct photo URL for each photo, so you can make pretty pictures dance.

And that's it!

Trying it with Sample Code

Since you're reading this on, simply open your Developer JavaScript console in your browser, and copy/paste this code into it and press return. Note there's absolutely no error checking whatsoever.

var eventsUrl = ''; function listener() { var events = JSON.parse(this.responseText); var eventList = ''; events.forEach(function (el) { var event = el.dynamicElements; eventList += (event.start_date + ' ' + event.title + ' ' + event.location_label + '\n\n'); }); alert(eventList.trim()); } var req = new XMLHttpRequest(); req.onload = listener;'get', eventsUrl, true); req.send();

This will generate an alert popup for our events by retrieving the listing and parsing it out:

Another Example This one is a bit more complicated, it retrieves all of the events, looks for our North America Symposium entry, then retrieves its agenda and looks for sessions that are categorized as mobile sessions, and shows its details in another annoying popup. var urlPrefix = ''; function handleAgenda() { var agenda = JSON.parse(this.responseText); agenda.forEach(function(info) { var agendaItem = info.dynamicElements; if (agendaItem.select_category) { var cats = JSON.parse(agendaItem.select_category); if (cats.indexOf('mobile') != -1) { alert('A a mobile session: ' + agendaItem.title + ' on ' +; } } }); } function handleEvents() { var events = JSON.parse(this.responseText); // find the NAS Boston event events.forEach(function(event) { if (event.dynamicElements.eventid === 'lr-nas-2014') { // get the metadata_id for the agenda and put it into a dictionary // dealing with whitespace via trim() var eventDict = {}; event.dynamicElements.metadata_types .split(',') .map(function(el) {return el.trim();}) .forEach(function(nvpair) { var parts = nvpair.split(':').map(function(el) { return el.trim();}); eventDict[parts[0]] = parts[1] }); var agendaId = eventDict.agenda; var agendaReq = new XMLHttpRequest(); agendaReq.onload = handleAgenda;'get', urlPrefix + agendaId, true); agendaReq.send(); } }); } var eventsReq = new XMLHttpRequest(); eventsReq.onload = handleEvents;'get', urlPrefix + '36416693', true); eventsReq.send();

Good luck, and don't forget to tweet your creation with #DIYLiferay or leave it in comments below! Happy hacking!

Image credits: DIY Google Glass from FalconHive

James Falkner 2014-08-14T15:08:44Z
Categories: CMS, ECM

Our Commitment to a Strong Open Source Product

Alfresco - Thu, 08/14/2014 - 08:46

In 2009, I wrote a blog post entitled, “Building a Stronger Open Source Product”. I used that post to share the philosophy behind Alfresco Community Edition, and to provide guidelines for when a feature of Alfresco is made freely-available and when it is paid-only.

Alfresco has evolved significantly since that time. We added one SaaS offering and are working on another, we published mobile apps and SDK’s for both iOS and Android, and we released an enterprise version of Activiti. At Alfresco Summit we will be discussing our release of Alfresco 5.0. That’s a lot of change in the last five years!

Given this rapid evolution, we want to reaffirm our commitment to open source as well as set expectations around what you should expect from us moving forward. Our goal of taking the content management and business process management worlds by storm has not changed, and our strategy has matured along with our company.

Our Open Source Principles

The core tenets of my 2009 blog post haven’t changed even as the company has progressed, but we will reformulate them in the context of where Alfresco is today and where we are headed.

1. We want you to be successful with all of our software and solutions.

Whether you are currently a paying customer or not, we want you to be successful with our software and solutions. We do not intend to hinder our freely available offerings. We believe that if you have a great experience with our products, you will continue to trust us. This will ultimately lead you to becoming a paying customer.

When we choose to make a product like Alfresco Community Edition freely-available under an OSI-approved open source license, we want that product to be high-quality, provide significant value, and solve important business problems. An evaluation of our open source products should demonstrate our brand’s value by representing the capabilities of our expanded products. To assist you in being successful, we make resources such as our official documentation and our issues tracker public, and we invest resources in things like the public forums and the wiki.

There are currently features that are only available in Alfresco Enterprise Edition and our other paid products, and we expect to add more over time. Later in this post I will explain how we make those decisions. My point is that if you don’t need the features available in the paid version, and you choose to invest your own time and resources supporting the software yourself, that should be a realistic choice for you to make.

More information on the specific differences between Alfresco Community Edition and Alfresco Enterprise Edition is available on our site for the Community Edition product.

2. Alfresco has been and will continue to be an open source company. We will provide freely-available, viable alternatives to commercial software and solutions, including our own.

Every year is an election year for us. If you are paying for commercial support for a particular piece of software we provide, or paying for one of our hosted solutions, we do not want to hold you hostage. We will provide you with a practical way to take your data with you so that you can run it in an open source alternative that you support yourself, if you choose to do so.

The open source alternatives we provide may not be a drop-in replacement. For example, suppose we release a Widget Management SaaS offering that is only available to paid subscribers. The open source alternative might be a community-contributed user interface running on top of Alfresco Community Edition installed on an organization’s own servers. They might have to use our API to migrate the data or write some code to get the same end-user features, and they will have to support it themselves. But if an organizations wants to do the heavy lifting, we will not put roadblocks in the way.

3. We will make certain features of the core platform available only to those who pay for support. Additionally, we may make entire solutions that sit on the core platform paid-only.

We believe that the larger or more mission-critical an installation is, the more sense it makes for a company to pay for additional features and commercial support. Therefore, when it comes to the core platform, most features that we reserve for paying customers will be related to scalability and ease of administration for large installations.

There may be some features which are not core to basic use cases that we only make available to paying customers. If the open source version would be unusable for common cases without that feature, the feature will not be paid-only. Examples of potential paid features include those specific to a niche use case such as contract management. Other examples include features that not everyone requires, such as synchronizing content to the Alfresco public cloud.

And we will continue to make integrations with proprietary products part of our paid solutions.

There may be entire solutions that sit on top of the core repository, both on-premises and SaaS, that we make available only to paying customers. This is how almost every SaaS solution is being developed today. Companies build on top of open source and contribute back to those projects, but the solution itself is rarely made available as open source software.

Do Well, Do Good, Innovate

At Alfresco Summit 2013 in Boston, Dries Buytaert, the founder of Drupal and the co-founder of the commercial open source company, Acquia, made an astute observation. He said that the commercial open source model allows us to do well by building a profitable commercial company, and to do good, by making quality software freely-available to those who might not otherwise be able to afford it. We couldn’t agree more.

Our openness also allows you, the community, to build amazing things on top of our platform. The community-as-innovation engine concept continues to be important to us as a company. We know that to keep the community interested we have to keep feeding it with quality open source software and open API’s. That is exactly what we will continue to do.

Categories: ECM

Radio Liferay Episode 39: Liferay Cloud Services

Liferay - Thu, 08/14/2014 - 03:41

 \o/ Radio Liferay is back. A while ago I talked with Juan Fernandez and Ivica Čardić about an exciting project they're collaborating on: Liferay Cloud Services. "What's this?" you ask? Well, good that you're asking, because here's the explanation. It's all about helping you monitor the health of your Liferay Installation, keeping an eye on the installed fixpacks (if you're using EE) or showing you some monitoring information that the server provides and you'd otherwise risk not to see.

(The episode is prefixed with a PSA for all Radio Liferay Listeners: The CfP for Devcon2014 is still open until 22. Aug 2014) and if you intend to come to the unconference on 4. Nov., make sure to register early: We have limited space and already predict that we'll sell out the unconference - there are enough seats available for the regular DevCon)

Juan is a project manager on this very project, working in Spain. Ivica is Senior Software Engineer, implementing LCS with the engineering team (Marko Čikoš and Igor Bešlić) in Croatia. I delayed publishing this episode to wait for the end of the private beta (you couldn't join anyway) until the public beta is just about to start.

We talked about

  • How LCS got started and what problems it solves (this is work in progress, designed for constantly added functionality)
  • (among the current information shown are things like: Performance metrics on JVM- and portal/portlet level, Fixpack information (EE only) and -installation.
  • The public beta is just around the corner (estimated in September). Test results from the private beta are in and lots of feature requests implemented (I can certify on that - some of them are mine)
  • Intended new features, to be added over time
  • New target audiences (currently it's largely system administrators, but content managers, e.g. for content targetting statistics, could be a possible future extension)
  • For the nerds, we talked about how LCS is implemented under the hood, and the mechanics of targetting Liferay 6.1 and 6.2 at the same time.
  • ...and others - but listen yourself...

Follow @RadioLiferay or @olafk (me) on twitter

Again, shoutout and big thank you to Auphonic for postproduction help. This is a fantastic service!

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

Or just download the MP3 here:

Olaf Kock 2014-08-14T08:41:02Z
Categories: CMS, ECM

On the Toxic Wonder of Technology

Liferay - Wed, 08/13/2014 - 16:00

“If technology is a drug – and it does feel like a drug – then what, precisely, are the side-effects?”

-Charlie Brooker, The Guardian

Daniel Kaluuya and Jessica Brown Findlay in Channel 4’s Black Mirror.


I recently discovered the marvelously provocative British drama Black Mirror, written and conceived by Charlie Brooker. Every episode features a different cast and setting and focuses on the deeper impact a piece of technology can have on human experience. The ability to replay every memory on a screen or resurrect a spouse from messaging and records sounds quite fine on paper, but how does it exacerbate a marital spat or numb the grieving process? At the end of the day, every piece of technology is a tool, and it falls to us how we will use or misuse it.


Times have changed. We’re living in *the future*, though, of course, we’ve always been in someone’s “future”. Technology has become this weirdly unifying tool that bridges long distances, heals divides, simplifies experience. Just now, ten different people in ten different places collectively laughed/grimaced/grinned watching a cat play with an ipad. We are simultaneously more like our true selves and less so online, in a forum, on a comment thread, wherein we are represented solely by words and increasingly-high-definition avatars.


On this digital frontier, no one is truly in control. Brooker says, “[T]hat’s the promise of technology, isn’t it? It is supposed to help us control our lives, but it ends up controlling us.” I buy a phone so I can talk to people, then stare at my screen and talk even less to the people around me. On a whim I buy a gorgeous car so I can drive to work in style and I find myself fretting over every smudge and scratch. In the end, who owns whom?


This indentured servitude is a by-product of the “always-on” mentality. Our newsfeeds never stop updating; we never stop checking our social media or checking in with friends. We are always online or at work or with friends, and always engaged in something: the prime evil, we tell ourselves, is to slow down and stop. The smiling god of productivity demands not a sacrifice of time, but of rest. We allow our passions to converge and be stored in a smartphone or internet account and it becomes our crutch, our grail. We become addicted to technological connection because it has become the means by which we exercise our passions to love, to succeed, to learn.


As with any rapidly-developing new thing, it is our responsibility to learn good stewardship. Every piece of tech is just that: a tool created to serve something greater. I type a web address so I can book a flight to my friend’s wedding; I plug in a webcam to chat with my sister. The toxic wonder of boxed circuits and high definition screens is balanced by technology’s ability to facilitate true connection. And whether we manufacture, program, market or consume tech it is important to bear in mind that these faux-magical toys we use to live, work and love are simply a means, not an end.




Liferay: Nerd On The Street is a blog devoted to sharing new ideas about life, business and technology. To continue the discussion, post your thoughtful insights below.

Josiah "Duke" Harrist 2014-08-13T21:00:32Z
Categories: CMS, ECM

Liferay Screens is Pretty Neat

Liferay - Tue, 08/12/2014 - 18:50

Here's a sneak peek at Liferay Screens Beta in the Xcode environment. Liferay Screens are basically mobile widgets that simplify development of mobile apps with Liferay as the backend.

More info here on GitHub

Youtube Preview

James Min 2014-08-12T23:50:04Z
Categories: CMS, ECM

Sales Enablement and Meeting in the Middle

KnowledgTree - Tue, 08/12/2014 - 15:38

Peter Ostrow and the team at Aberdeen always put together great research around Sales Enablement. A blog post from August 11 looks at an interesting take-away from some of his most recent research. It found that even at high performing companies, sales and marketing leadership only meet 5-6 times a year to coordinate strategies.

Sales and Marketing Must Get Together

Given how vital it is that these two teams collaborate, it is a surprising result. They should be working in lock-step every day. Marketing should be continually evaluating whether their lead generation activities are translating into closed business. And Marketing should understand whether their sales enablement programs are truly supporting the sales process, for example.

Similarly, sales teams should evaluate whether messaging is effective with prospects and customers. And provide real world feedback to Marketing about what is resonating in the market. Again, for example.

What Do High Performing Teams Do?

High performing companies are highly correlated with healthy relationships between sales and marketing, according to his research. Which is increasingly true in the new world of sales processes that are anything but linear from lead to revenue.

So, how to increase the frequency of these meetings, or more importantly, increase the amount of collaboration between sales and marketing? The key element is to have shared goals.

When marketing’s primary metric regarding the sales team is number of leads, they’ll focus on that. You can already visualize the arguments between the two teams about lead quality. And when sales is focused solely on closing contracts, they’ll tend to neglect top of the sales funnel.

But when marketing and sales both care about the entire lead to revenue process — tip to tail — they’re going to work together. When content development, sales enablement, lead generation, and final closings are measured and tied together for sale and marketing to goal on, you get a close-knit and highly collaborative organization.

The post Sales Enablement and Meeting in the Middle appeared first on KnowledgeTree.

Categories: ECM

How calendar events are seen in different time zones

Liferay - Tue, 08/12/2014 - 08:54

One of the most important features of the new calendar portlet is the ability of consistently showing events to users in different time zones. It is invaluable for global organizations. If your team is scattered around the world, you would really want to make sure things happen at the same time!

However, the consistent behavior can be quite difficult to grasp. It is understandable that 9 AM in São Paulo is 1 PM in London... when there is no Daylight Savings Time. Now, if it is 9 AM in São Paulo, what time is it in London if the United Kingdom is under summer time? What time would it be in London if São Paulo is under summer time? And when both cities are in DST? Recurring events make these questions yet more baffling. Your Paulistano colleague would see that meeting, which used to happen at 9 AM, just changed to 8 AM... Working it out can drive one crazy! (Not me, of course; I work with it all the time but I'm completely sane.)

Luckily, those calculations are no job for humans, the calendar handles it all. Nonetheless, one may need to know how calendar works with diverse time zones; otherwise, one could choose bad times for events and get lost with some strange behaviors. Here we will see what is needed to know.

How users in different time zones see events

Consider an hypothetical company which uses Liferay and the calendar portlet. The company's portal time zone is set to the Coordinated Universal Time (UTC). Also, this company has two employees: Brian, who lives in Los Angeles, and Juán, who lives in Madrid. Brian went into his account configuration and, in the section "Display Settings", changed his time zone to be America/Los Angeles; likewise, Juán changed his time zone to Europe/Madrid.

Now, Brian schedules a meeting with Juán at February 3, 2014. In the calendar, he clicks in the row labeled "8 AM" to create the event:

Once Brian creates the event and invites his colleague, Juán will see the following event in his calendar:

To Juán, the event appears at 5 PM (or 17:00) since this is the corresponding time in Spain:

Note, however, that neither Los Angeles nor Madrid are under daylight savings time. Would Brian schedule the event to March 24 (when Los Angeles is under DST), the meeting would appear in Juán's calendar at 4 PM:

As you can see, the events are displayed in an specific hour depending on the authenticated user time zone. If the user is not authenticated, however, the events are going to be displayed in the portal time zone. So, for example, an unauthenticated user would see the event from February 3 at 4 PM, since this is the corresponding hour in Universal Time; the meeting at March 24 would be displayed at 3 PM to the guest user.

Time zones and recurring events

Users who deal with partners in different time zones probably are used to these details. Subtler than these differences is the behavior of recurring events.

Recurring events are trickier because they should happen in the same hour of the day, all days. Suppose, for example, that Brian scheduled meetings with another colleague from LA every Monday at 10 AM. They would expect the events to always be scheduled to 10 AM regardless of whether DST is in effect or not. Both the meeting at March 3 and the meeting at March 31 would happen at 10 AM in Los Angeles time, although the former would happen at 6 PM (18:00) UTC and the latter at 5 PM (17:00) UTC.

For achieving this behavior, Brian just needs to create the recurring event in his own calendar. Since his user time zone is America/Los Angeles, the calendar portlet will make the event fixed in the same hour at this time zone.

When users are on different time zones, the schedule time should be fixed on only one of the time zones. Otherwise, the same event would be scheduled for two different moments in time! Suppose, for example, that our colleague Brian wants to have weekly meetings with Juán. Brian then creates a recurring event in his own calendar, recurring every Monday, at 8 AM (Los Angeles time), starting at March 3; also, he invites Juán to the event. What will Juán see?

Well, that depends on the Monday Juan is looking at:

  • At March 3, the meeting will be scheduled for 5 PM:

  • California will be under daylight savings time from March 9 on; LA clocks should have one hour added to them. So, at March 10 Juán will see the event happening one hour sooner, at 4 PM:

  • For its turn, DST will start in Spain at March 30, so an hour will be added to each clock in Madrid. This will synchronize them with the Los Angeles clocks, so, at March 31, Juán will see the event scheduled for 5 PM:

As you can see, for consistency, the event can only be fixed in one time zone. For users in other time zones, the event will keep changing its start and end times. It can be a bit dizzying but the user does not need to track it at all. Juán would only need to be aware that the meetings could happen in different times - the calendar will always display the correct time. With proper notifications, he would be informed of the correct time in a timely manner.

If Brian and Juán prefer the event to be fixed in the Madrilenian time zone, then Juán would create the event in his calendar, since his time zone is the Spanish one. If, on the other hand, the event would be created in a site calendar, the recurring event would be fixed in the portal time zone - which, in our example, is UTC.

Which time zones affects the event times?

As you can see, each time an event is rendered in the screen there are two time zones to define its start and end times. The first one is the time zone of the user who sees the event. This display time zone is important to define the hour to be displayed but has no influence on the exact moment the event will take place. It can make the event appear at 8 AM to an LA-located user and 17 PM to another user at Madrid, but it is showing the same hour, since 8 AM in Los Angeles time is the same as 17 PM in Madrid time.

Most of the time, the display time zone will be the time zone the authenticated user has chosen in her Display Settings. If the user is not authenticated, it will be the portal time zone.

There is a way of forcing the calendar to always use the same arbitrary display time zone in a site: just go into the Calendar portlet preferences and disable the "Use Global Time Zone" option at the bottom of the screen. Then, select the time zone you would want to be used by the Calendar as the displayed one. This configuration is site-scoped: the events will be displayed int he selected time zone in all pages of the configured site, regardless of the user time zone.

Apart from the display time zone, each event is associated to other time zone. This one is only relevant for recurring events, since this is used to "fix" the event on a specific hour of the day; since the event is going to be "fixed" it is important to know in which time zone the hour and minute will be the same, regardless of the day. This event time zone, is derived from the calendar in which the event was created. If the event was created in a user calendar, the the event time zone is the user time zone of its creator. If, otherwise, it was created in a site calendar, the event time zone will be the portal time zone.

  What does it affect? How it is defined? When is it relevant? Display time zone It defines at which time zone the events will be displayed. In our examples, it defines whether de event is displayed in Los Angeles time our Madrid time.
  • If the portlet configuration was changed, it will be the time zone selected in the portlet configuration
  • If the portlet configuration was not changed:
    • If the user is authenticated, it will be the user time zone.
    • If the user is not authenticated, it will be the portal time zone.
Always: no event can be rendered without taking into consideration the display time zone. After all, the hour should be displayed in some specific time zone, otherwise it has no meaning. Event time zone In recurring events, it defines the time zone at which the hour and minute should be the same. In our examples, it defines that an event should happen always at, let us say, 8 AM in Los Angeles time regardless of whether LA is under daylight savings time.
  • If the event was created in a user calendar, it will be the user time zone of the event creator.
  • If the event was created in a site calendar, it will be the portal time zone.
Only when rendering recurring events.

An experienced reader will feel the need of choosing the event time zone. If the organization of our example does have a site for its office in Madrid, the events created on this site calendar would be preferably bound to the Madrid time zone, not to the portal time zone, which is UTC. Also, I may create an event on my own site but decide that it should be bound to another, completely different time zone. Alas, this is not possible now, but a ticket is already filled for that and this feature will be available in the next major release.

Many may find all this stuff bewildering. Don't worry: most users will never need to think about it. The decisions a user has to make are much simpler. Do you want to see the events in Los Angeles time or in Madrid time? Do you want your weekly event to happen at the same hour in which city? You just need to answer these straightforward questions. The calendar portlet will take care of the details for you - in a consistent way.

Adam Victor Brandizzi 2014-08-12T13:54:20Z
Categories: CMS, ECM
Syndicate content