I eluded in a previous post our struggles dealing with the HippoCMS platform. It wasn’t our preferred path, but a choice handed down from above. Enough said about that. It’s useful to understand a little bit about the environment we were using it.
I believe the pressure to choose a CMS came from a deadline that required some choices about platform choice to be made in an organisation. At this time, the extent to what the actual product was unknown. Our experience working with other clients is that you should generally work out what you want to do before you pick a product, or the platform will often dictate and limit your ability to do things. My colleague Erik Dörnenburg has been writing more about this recently.
The premises of a CMS are alluring for organisations. We have content… therefore we need a content management system. The thought ensues, “Surely we can just buy one off the shelf.” Whether or not you should use a CMS is for another blog post, and you can read some of Martin Fowler’s thoughts on the subject here.
We wanted to protect our client’s ability to evolve their website beyond the restrictions of their CMS, so we architected a system where content managed in a CMS would sit behind a content service, and a separate part of the stack focused on the rendering side. It looks a little like this:
The issues that we faced with HippoCMS included:
A small community based on the Java Content Repository
Hippo is based on the Java Content Repository (JCR) API, a specification for standardising the storage and access of content. Even as I write this blog, putting “JCR” or “Java Content Repository” I am forced to link to the wikipedia page because I spent three minutes trying to find the official Java site (it looks like the official site is hosted by Adobe here). If the standard is small, the community surrounding the products are naturally going to be smaller. Unlike users of spring, putting a stacktrace into google will generally show the sourcecode of the file rather than how someone got over it. I’d be happy living on the bleeding edge… if the technology was actually pretty decent.
Unfortunately a lot of the gripes I write about are the fact that the product itself is based on the the JCR specification. Some simple examples include:
- A proprietary query syntax – You query the JCR with an xpath-like query language. It’s actually less useful than xpath, such as not implementing all functions available in xpath and some weird quirks
- Connecting to the repository via two mechanisms – Either RMI (yuck! and inefficient) or in memory. This automatically limits your deployment options to the application container model. Forget fast feedback loops of changing, starting a java process and then retesting.
Hippo CMS UI generates a huge number of exceptions
One reason Hippo was selected was for the perceived separability of the CMS editor and the website component (referred to as the Hippo Site Toolkit). We didn’t want to tightly couple the publishing/rendering side to the same technology stack as the underlying CMS. Hippo allows you to do this by having separately deployed artefacts in the application container. Unfortunately, the Wicket-based UI (maybe because we used it without the Hippo Site Toolkit) generates exceptions like nobody’s business. We spent some effort trying to understand the exceptions and fix them, but there were frankly too many to mention.
Poor taxonomy plugin implementation
One of the reasons Hippo was allegedly picked was for the taxonomy plugin. Unfortunately this gave us no world of pain both in usability and in terms of maintaining it. In terms of the specific issues we faced with the maintenance included the multi-language support (it didn’t allow that) and then just simply getting it deployed without issues.
CMS UI lack of responsiveness
Our client’s usage of the site wasn’t very big. Less than 300 articles and, at the peak, about 10 concurrent users. Let’s just say that even with three people, the UI was sluggish and unresponsive. We tried some of the suggestions on this page, but it’s a bit of a worry that it can’t responsively support more than one user out of the box with standard configuration.
Configuration inside the JCR
Most of our projects take a pretty standard approach to implementing Continuous Delivery. We want to easily source control configuration, and script deployments so that releases into different environments are repeatable, reliable, rapid and consistent. Unfortunately a lot of the configuration for new document type involves “switching a flag to capture changes”, playing around with the UI for a new document type” and then exporting a bunch of XML that you must then load with some very proprietary APIs.
After several iterations, we were able to streamline this process as best we could but that took some time (I’m guessing about a developer two weeks full time).
Lack of testability
We spent quite a bit of effort trying to work out the best automated testing strategy. Some of the developers first tried replicating the JCR structure the UI would recreate but then I pointed out that would give us no feedback of if Hippo changed the way did its mapping. We ended up with some integration tests that drove the wicket-based UI (with a wonderfully consistent but horrid set of generated IDs) and then poked our content service for expected results.
A pair of developers worked out a great strategy for dealing with this, working out the dynamically generated APIs and driving the UI via Selenium Webdriver to generate the data we would query inside the proprietary XML-based data store.
Lack of real clustering
In “enterprise” mode, you can opt to pay for clustering support although it’s a little bit strange because you aren’t recommended to upgrade a single node within a cluster when other nodes are connected to the same datastore (in case the shared state is corrupted). This kind of makes seamless upgrades without complicated DB mirror/restore and switcheroo really difficult. We ended up architecting the system for a degraded service using caches on the content service as a compromise to the “clustered” CMS.
Summary
As much as I wish success for the Hippo group, I think many of the problems are around its inherent basis on the JCR. I do think that there are a couple more things that could be done to make life easier for developers including increasing the amount of documentation and thinking about how to better streamline automated, frequent deployments around the CMS.
Having worked with Hippo in the past this is very recognizable. Reading the Fowler link and re performance I was wondering if you did use the pattern of having [editing -> repo] [repo -> publishing], so two jcr repos on different machines, of which one is finetuned for editing and one for publishing.
Hi Rogier,
Glad to see we aren’t alone in this world and thanks for leaving a comment.
We didn’t end up with physical repositories for editing/publishing (at least not one based on JCR). The long term vision with the content service was actually to allow future re-architecting when you hit the CMS limits. We actually proved this part out by replacing the taxonomy section with a Ruby on Rails website.
Hi Patrick,
Thank you for your feedback on Hippo CMS. As Product Manager of Hippo, I am always interested to learn how our users work with our product and how they feel it can be improved. Below, I’ll respond to the areas you address and you’ll find that in many cases we were aware of these issues and have enhanced Hippo’s capabilities in our recent 7.8 release. Having said that, we also have further improvements planned as part of our 2013 roadmap.
JCR community – indeed, the community around this standard is not as large as for instance the Spring community. However, within the realm of CMSs, it is the most supported standard, see this overview for a list of open source and commercial software packages supporting this standard for accessing content. Hippo is also actively participating in other standards bodies such as the Web Experience Management Interoperability by OASIS.
As you may know, Hippo ships with a standard delivery tier allowing developers to easily create web sites or REST services. When using this delivery tier, developers do not need to use these JCR APIs for the most common use cases as he can use POJOs to interact with the data. Other benefits of the Hippo delivery tier (also known as HST) include built-in caching, and seamless integration with other CMS functionality such as the channel manager and template composer.
CMS exceptions and responsiveness – this has improved significantly in the recent 7.8 release. We have streamlined the code base in several places, for instance by changing certain UI elements to be lazily loaded, improving the overall responsiveness.
Taxonomy implementation – a recent release (June last year) of the taxonomy plugin added multi-language support.
Configuration management – this especially has been a big focus point for us in the 7.8 release. We have released several new tools to help developers bring the changes from their development environment to the typical test, acceptance and production environments. Also the reverse route is supported, so developers can test using the content and settings used in production. Also on our 2013 roadmap we have planned several features to further streamline this process such as Content Replication and Content Packaging.
Testability – automating functional tests for the CMS UI is indeed not simple. As part of our test suite, we have developed a standardized way of creating those functional tests. After having used these tests internally for some time, we are now using the same testing framework in a few projects together with our implementation partners. We expect that we will release this to all implementation partners later this year.
An alternative approach for your testing scenario is to manipulate documents using the Hippo workflow API. This API allows developers to perform all actions on content that you can also perform using the UI: creating, publishing, unpublishing, etc.
Clustering and upgrades – also here we have improved the product in the 7.8 release. We have improved existing tooling and created new tools to ensure that all upgrade scenarios can be executed in a clustered environment.
Next to these improvements, we also have a set of best practices, such as how to build and deploy REST services using Hippo. We have trainings available on these subjects and can also assist in projects. And as any open source vendor, we also have a forum where we discuss product issues, improvements, what’s the best way to customize Hippo for a certain architecture, etc. I’d like to invite you to join us there to discuss the product and if you start a new Hippo project – we sure hope you will – do let us know and we’ll see how we can support you there!
Kind regards, Oscar Scholten
Hi, you alluded, not eluded. To elude means to escape or avoid.