tag:blogger.com,1999:blog-5966326232439952192024-03-12T16:34:47.598-07:00Philipp Bärfuss (Magnolia)Magnolia CMS and beyond.Philipp Bärfusshttp://www.blogger.com/profile/15402313894436505808noreply@blogger.comBlogger27125tag:blogger.com,1999:blog-596632623243995219.post-36772221210214006562013-11-21T01:31:00.000-08:002013-11-21T14:05:31.362-08:00Magnolia Turns Ten: 7 Tips for Creating Long-Lived Software Once upon a time... we were a family-sized team working from a garage. Today, Magnolia is a company with subsidiaries that span the globe. As someone who was with Magnolia when the project just started to take off, I’m using this opportunity to sit down on a metaphorical bench and look back on the past decade like a wise old man.<br />
<br />
I remember the joy when we sold the first license. Today, I lead about 25 developers and we have a base of 180 customers. What a shift! The cosiness was nice, but having a Mojito in Miami or getting ready for our US conference feels good, too.<br />
<br />
I’ve been doing my job here for almost 9 years. In the course of this almost-decade, I learned some valuable lessons on how to successfully manage long-lived software projects. Making a nice piece of software is quite an achievement already, but continuously improving it for 10 years without getting stalled or irrelevant is even more of a challenge. Here are 7 tips that might help you tackle and succeed in similar challenges.<br />
<br />
<b>1. It’s the potential, not the features</b><br />
You need features to close the deal. You need a catchy message to market the product. But the value of a software project lies in its potential. Often, we create a hook and ship a basic default implementation. For example, we once added a language detection mechanism. Once this was done, different approaches were added to projects. Later, we worked in some of them into the product. If you are sure that there is more you can do with the product, you can be sure that you will be able to innovate if needed. And: the people using your software will most likely find a way to solve their problems. This might make them happier and more loyal than you think.<br />
<br />
<b>2. Remove obstacles to make space for that potential</b><br />
The best way to create potential is to remove obstacles. For instance, we once added a hook to configure custom renders, which let others support other languages. In another case, we streamlined the codebase for JSP and Freemarker support, so we had to care less about maintenance. Sometimes, it’s even enough to make a class extendable by changing a method’s visibility from private to protected. The things that are blocking you are likely blocking others, too. So removing obstacles is as important for increasing the potential of a software as creating new catchy features. I experienced that once the obstacles were removed, new ideas came up immediately. It frees the project and opens up many paths.<br />
<br />
<b>3. Evolution beats revolution</b><br />
You start out with big, lofty ideas. Unfortunately, you won't change the world right away. In this initial frustration, it might be tempting to start over, to change everything. However, never underestimate the negative side effects of a revolution. There are many who won't follow you. There will be customers who won't update and developers who resists to learn. Plus: if your project has been running long enough, you will have a pile of things that you have to migrate, too. Is this a vote for keeping everything as is? Absolutely not! This might be the end of your project. However, you should evolve step by step, incrementally. Verify if the new approaches result in success. Learn what you have to do differently next time. If you consistently remove obstacles and care about the potential of the software, you can be sure to not need a revolution to change things. If it’s not the right time for a great idea, it’s not a great idea yet!<br />
<br />
<b>4. Quality requires more effort</b><br />
I had to learn that quality is not a side effect of virtuous developer skills. As soon as you are more than a one man show, you need to make sure that what is created by different minds fits together in reality, too. Today, we have so many commits - only automated testing and integration testing guarantees a stable and shippable piece of software. To build this up, you need time and steady improvements. Make sure you continuously add enough test related improvements to your backlog. Developers will not write tests if it is too cumbersome or if the effort seems to outweigh the benefits.<br />
<br />
<b>5. Decentralise through ownership</b><br />
Over the years, code which is not owned by anybody is turning into orphan code. And guess what - this fact contradicts with the evolutionary and obstacle driven approach I describe above. I strongly believe that organizations work best if they are decentralised. Owners will maintain the code in their very own interest. We have more than 30 modules today and no one could possibly have an overview of what needs to happen where and when. Owners solve that problem.<br />
<br />
<b>6. Always ship</b><br />
If you don't ship, your best idea might die an instant death. If you wait too long or if you want too much, it will get more and more difficult to finish. Sometimes, it’s better to have a smaller and maybe less satisfying release than to risk waiting for too long. Only then can you properly move forward and readjust your priorities and your planning. When people start using what you created, they will give you the feedback you need to make it better.<br />
<br />
<b>7. Retrospection is everything</b><br />
Your methods should change as you move along. What was a good approach for a long time might not work once you add one more developer to the team or a new feature to the software. It’s critical to have a retrospection meeting after each milestone. This will help you adapt your approach and guarantees that you are not moving into the wrong direction for too long. If there is no adaptive management, there won't be any agile software development in the end.<br />
<br />
If you keep these points in mind, your long running project won't become stalled or irrelevant, and you’ll be able to surprise again and again. I’m convinced that Magnolia 5 has the potential to let impressive innovation evolve it for many more decades!<br />
<br />
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiOlySvG_PPGjoiq0wVfi_0ss8f1S8pzMZg8QseP0ZFCVmN29-8oG37kXos27A3-4SWLPdsk2j4jWPr3EhVel0rE3ZAmE-wXl7pXxtm3_EBfMzCCLPmggG-boyvcItCMqP9aoC9iGMR2w/s1600/CIMG0928.jpg" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" height="240" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiOlySvG_PPGjoiq0wVfi_0ss8f1S8pzMZg8QseP0ZFCVmN29-8oG37kXos27A3-4SWLPdsk2j4jWPr3EhVel0rE3ZAmE-wXl7pXxtm3_EBfMzCCLPmggG-boyvcItCMqP9aoC9iGMR2w/s320/CIMG0928.jpg" width="320" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">When we were still cute and young ;-) Philipp, Boris and Greg in Berlin</td></tr>
</tbody></table>
<br />
<br />Philipp Bärfusshttp://www.blogger.com/profile/15402313894436505808noreply@blogger.com1tag:blogger.com,1999:blog-596632623243995219.post-33380113797237308142011-04-13T08:00:00.000-07:002011-04-13T08:51:02.575-07:00Magnolia CMS 5.0 - Milestone 3The new UI architecture and framework is built! Finally we have a solid fundament and feel that we are on the right path. We urged to have a more final AdminCentral though, but decided not to rush into anything and didn't want to build upon something half-baked. As a result we can now present an extraordinary customizable and pluggable UI.<br />
<br />
Watch our technical video featuring a short demo of the milestone 3, some architecture slides and a sample customization module:<br />
<br />
<div class="separator" style="clear: both; text-align: center;"><a href="http://blip.tv/file/5013725"><img border="0" height="212" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhN_n59Rc9O5X52Va5epjJrz5Xp1KDrgbIrglwAOFkURUKebakQ4QmyWP0S1oA4FVwxhF25ePpAqtSaCpdwKI9EGKSzoM0DhZpZSSA8YuCbXLGz5EUshhg16oN6aJwmPNw8WRmbphUOgw/s320/Screen+shot+2011-04-13+at+16.55.07.png" width="320" /></a></div><br />
In the next milestone we will focus on the page editing and templating. Naturally we will also catchup on the AdminCentral and dialogs to round over the impression.Philipp Bärfusshttp://www.blogger.com/profile/15402313894436505808noreply@blogger.com4tag:blogger.com,1999:blog-596632623243995219.post-65074369622189216182011-03-03T00:52:00.000-08:002011-04-08T04:38:52.194-07:00Magnolia CMS 5.0 - Architecture manifestsAfter few weeks of Magnolia 5.0 development and again focussing on the UI architecture, I have finally assembled slides and diagrams to give insights into our doing. Some of the concepts are very drafty but most of them are already reflected in the latest codebase. When we deliver the milestone 3 end of march, we hope that the base architecture will be set in stone ;-)<br />
<br />
<a href="http://www.slideshare.net/pbaerfuss/magnolia-cms-50-architecture" title="Magnolia CMS 5.0 - Architecture">Magnolia CMS 5.0 - Architecture</a><br />
<a href="http://www.slideshare.net/pbaerfuss/magnolia-cms-50-architecture"><img border="0" height="240" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiEf0xjoRF4pliSYDHs8OOUNKVbL-ghjjBTooOs_cJk5PYyWH-w51vf6b8jfeqSun_F6tCUc8gBciGhe08AqbhYYNRpWIVAxFXqPNTPnV9R3Csxq1g_qo_1viyao7R95Xz7olalq-4GDA/s320/Screen+shot+2011-04-08+at+13.31.36.png" width="320" /></a><br />
<br />
<a href="http://www.slideshare.net/pbaerfuss/magnolia-cms-50-overview" title="Magnolia CMS 5.0 - Overview">Magnolia CMS 5.0 - Overview</a><br />
An other high level presentation describing our goals and plans can be found here:<br />
<a href="http://www.slideshare.net/pbaerfuss/magnolia-cms-50-overview"><img border="0" height="242" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh1gjNiGX5baDw4Qzit5XXtQii_6e9_YVrPXOKuxgGMLKQhwGTgPoI13iTtKBDImdGp2MzQ0G1el0I9WTfXnKp_FivH4OXBLjoGArgRE-JSTBSYULyRyE-tecUManIw1AktI0HgZPI96g/s320/Screen+shot+2011-04-08+at+13.31.56.png" width="320" /></a>Philipp Bärfusshttp://www.blogger.com/profile/15402313894436505808noreply@blogger.com0tag:blogger.com,1999:blog-596632623243995219.post-9635118715150098332010-12-08T08:37:00.000-08:002010-12-08T09:01:28.775-08:00Groovyness - the agile paragraphsBack on track. After releasing Magnolia CMS 4.4 my mindset moves back to Magnolia 5.0. While playing around with groovy to merge the changes from the 4.4 branch back to the trunk I came up with a idea which I would like to share and get some feedback from you. <br />
<br />
Using a groovy builder (DSL) we could make the paragraph definition very concise<br />
<ul><li>include the dialog definition in the paragraph definition</li>
<li>add a closure for rendering the content</li>
</ul><br />
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="http://pastebin.com/94x5EnzJ" style="margin-left: auto; margin-right: auto;"><img border="0" height="243" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjSrThUcdehqDfsTDR15I2g0dQUml_KSIN3oQqIZ9NAd8sJcULIAMaUVV0ub1_PxYn_pu4ktysXM8S0YQZGTA-tVK8fQ4OfJ1zeOF_mmXW0xDUlqebn_e2T55dDfACLU1RJ35ce70jMzg/s320/Screen+shot+2010-12-08+at+17.15.40.png" width="320" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">example: text and image paragraph</td></tr>
</tbody></table><br />
What we get:<br />
<ul><li>no configuration (update, ...)</li>
<li>a single concise definition (all in one place)</li>
<li>agile</li>
</ul><br />
Note: this will not replace any other ways of defining paragraphs or dialogs its just a groovy alternative. But since we allow pragmatic registration of dialogs, paragraph, ... in Magnolia 5.0 such an implementation should be rather trivial.Philipp Bärfusshttp://www.blogger.com/profile/15402313894436505808noreply@blogger.com4tag:blogger.com,1999:blog-596632623243995219.post-56102628041527212202010-10-21T03:25:00.000-07:002010-10-21T03:25:26.944-07:00Magnolia CMS 4.4 - Milestone 1The team has finished its <a href="http://mind42.com/pub/mindmap?mid=2e89be76-d196-4cbe-b296-b6e3678f866c">first sprint</a> of Magnolia 4.4 development. As you might know, we aim to deliver some acutely missed enterprise features with this release.<br />
<br />
If you want to see some of the features in action please have a look at the video done by Federico:<br />
<br />
<embed allowfullscreen="true" allowscriptaccess="always" height="286" src="http://blip.tv/play/hpYGgoXzewA%2Em4v" type="application/x-shockwave-flash" width="410"></embed><br />
<br />
Features we have implemented in the first sprint:<br />
<ul><li><b>Diff view (EE)</b>. We have implemented a visual diff based on the rendered HTML output.</li>
<li><b>Translation export/import (EE)</b>. Export and import of translatable text to and from CSV files. The export uses the dialog configuration to determine what should be exported and what not.</li>
<li><b>Soft locking (EE)</b>. Show a warning message if other users have a page open in the edit mode.</li>
<li><b>ModeShape support</b>. Magnolia can now be backed with the JBoss JCR repository implementation.</li>
<li><b>FCKEditor update</b>. We updated to 2.6.6. The most interesting feature in this version is a SpellChecker.</li>
<li><b>Early paragraph execution</b>. Paragraphs sometimes want to execute logic before the page rendering starts. This is needed to perform operations like forward and redirect. This is now possible due to a new filter which executes the model in an early phase. This enables us to build multi-step forms (see next sprint).</li>
</ul>In the <a href="http://mind42.com/pub/mindmap?mid=cc73d805-ea2e-4129-a28b-dc7043c8218a">second sprint</a>, which will be the last one, we will mainly work on:<br />
<ul><li><b>De-coupling deletion and de-activation</b>. The immediate de-activation of content on deletion was always problematic. We have worked out a <a href="http://wiki.magnolia-cms.com/display/DEV/Concept+-+Uncoupling+deletion+and+de-activation">concept</a> and are about to solve the issue.</li>
<li><b>Reference view (EE)</b>. A page which lists content that references a page and content the page references. This can be used to build a warning message on deletion and to show dependent content in the workflow dialog.</li>
<li><b>Multi-step forms (CE/STK)</b>. Enhancement of the form builder so that one can build wizard-like multi-step forms. Each step is created as a sub-page. Each step validates and the status is kept in the session. The <a href="http://wiki.magnolia-cms.com/display/DEV/Concept+Multi-step+forms">concept</a> is based on the new early paragraph execution.</li>
</ul><br />
Finally we want to thank <a href="http://www.aperto.de/">Aperto</a> (diff view), <a href="http://www.mediacatalyst.com/">MediaCatalyst</a>/Sony Europe (translation export/import) and <a href="http://www.fastforward.ch/">fastforward</a> (FCKEditor update) for their substantial contributions.<br />
<br />
You can download the bundles from our Maven/Nexus repository. Be aware of the fact that those releases are definitely not meant to be used in production.<br />
<ul><li><a href="http://nexus.magnolia-cms.com/index.html#nexus-search;gav~info.magnolia~magnolia-tomcat-bundle~4.4-m1~~">CE bundle - 4.4 M1</a></li>
<li><a href="http://nexus.magnolia-cms.com/index.html#nexus-search;gav~info.magnolia~magnolia-enterprise-bundle~4.4-m1~~">EE bundle - 4.4 M1</a></li>
</ul>Philipp Bärfusshttp://www.blogger.com/profile/15402313894436505808noreply@blogger.com1tag:blogger.com,1999:blog-596632623243995219.post-17621978030158156652010-09-24T01:49:00.000-07:002010-09-24T01:49:52.088-07:00Unconference 2010 - Magnolia 5.0 and RoadmapThis year's <a href="http://www.magnolia-cms.com/home/community/conference.html">Magnolia conference</a> was a very great and inspiring event. At the community day we had few presentations related to Magnolia 5.0 which's slides we like to share with you:<br />
<br />
<div style="width:410px" id="__ss_5268702"><strong s410tyle="display:block;margin:12px 0 4px"><a href="http://www.slideshare.net/pbaerfuss/magnolia-50-three-perspectives" title="Magnolia 5.0 - Three perspectives">Magnolia 5.0 - Three perspectives</a></strong><br />
A brief overview about where we stand and what we plan to achieve if Magnolia 5.0. You are missing the demo, but well ... there is still some valuable info in it.<br />
<object id="__sse5268702" width="410" height="342"><param name="movie" value="http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=magnolia5-0-threeeperspectives-100923100135-phpapp01&stripped_title=magnolia-50-three-perspectives&userName=pbaerfuss" /><param name="allowFullScreen" value="true"/><param name="allowScriptAccess" value="always"/><embed name="__sse5268702" src="http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=magnolia5-0-threeeperspectives-100923100135-phpapp01&stripped_title=magnolia-50-three-perspectives&userName=pbaerfuss" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="410" height="342"></embed></object><br />
</div><br />
<div style="width:410px" id="__ss_1977414"><strong style="display:block;margin:12px 0 4px"><a href="http://www.slideshare.net/pbaerfuss/magnolia-50-genuine" title="Magnolia 5.0 'GenUIne'">Magnolia 5.0 'GenUIne'</a></strong>This is the presentation as given at the conference 2009 for those interested in the background. <br />
<object id="__sse1977414" width="410" height="342"><param name="movie" value="http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=genuine-090910060718-phpapp02&rel=0&stripped_title=magnolia-50-genuine&userName=pbaerfuss" /><param name="allowFullScreen" value="true"/><param name="allowScriptAccess" value="always"/><embed name="__sse1977414" src="http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=genuine-090910060718-phpapp02&rel=0&stripped_title=magnolia-50-genuine&userName=pbaerfuss" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="410" height="342"></embed></object><br />
</div><br />
<div style="width:410px" id="__ss_5237937"><strong style="display:block;margin:12px 0 4px"><a href="http://www.slideshare.net/DanielLipp/mgnl5whyvaadin" title="Magnolia 5.0 - Why Vaadin">Magnolia 5.0 - Why Vaadin</a></strong>My colleague Daniel Lipp talked about why we have chosen for Vaadin.<br />
<object id="__sse5237937" width="410" height="342"><param name="movie" value="http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=mgnl5whyvaadin-100920023159-phpapp02&stripped_title=mgnl5whyvaadin&userName=DanielLipp" /><param name="allowFullScreen" value="true"/><param name="allowScriptAccess" value="always"/><embed name="__sse5237937" src="http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=mgnl5whyvaadin-100920023159-phpapp02&stripped_title=mgnl5whyvaadin&userName=DanielLipp" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="410" height="342"></embed></object></div><br />
<div style="width:410px" id="__ss_5269366"><strong style="display:block;margin:12px 0 4px"><a href="http://www.slideshare.net/pbaerfuss/jcr-and-content-api" title="Magnolia 5.0 - JCR 2.0 and Content API">Magnolia 5.0 - JCR 2.0 and Content API</a></strong>Some insights about what JCR 2.0 means for us and how we can improve the current Content API and gain performance.<br />
<object id="__sse5269366" width="410" height="342"><param name="movie" value="http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=jcrandcontentapi-100923111417-phpapp02&rel=0&stripped_title=jcr-and-content-api&userName=pbaerfuss" /><param name="allowFullScreen" value="true"/><param name="allowScriptAccess" value="always"/><embed name="__sse5269366" src="http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=jcrandcontentapi-100923111417-phpapp02&rel=0&stripped_title=jcr-and-content-api&userName=pbaerfuss" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="410" height="342"></embed></object><br />
</div><br />
<div style="width:410px" id="__ss_5268972"><strong style="display:block;margin:12px 0 4px"><a href="http://www.slideshare.net/pbaerfuss/magnolia-roadmap-beyond-50" title="Magnolia Roadmap - Beyond 5.0">Magnolia Roadmap - Beyond 5.0</a></strong>About Magnolia 4.4 and STK 2.0.<br />
<object id="__sse5268972" width="410" height="342"><param name="movie" value="http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=roadmap-100923103154-phpapp01&stripped_title=magnolia-roadmap-beyond-50&userName=pbaerfuss" /><param name="allowFullScreen" value="true"/><param name="allowScriptAccess" value="always"/><embed name="__sse5268972" src="http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=roadmap-100923103154-phpapp01&stripped_title=magnolia-roadmap-beyond-50&userName=pbaerfuss" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="410" height="342"></embed></object><br />
</div>Philipp Bärfusshttp://www.blogger.com/profile/15402313894436505808noreply@blogger.com0tag:blogger.com,1999:blog-596632623243995219.post-88564889478630533142010-08-31T08:20:00.000-07:002010-08-31T08:24:42.160-07:00Why Vaadin - proof of conceptNow, three weeks after deciding for Vaadin, we have finished the very first prototype.<br />
<br />
To complete the current sprint we have released the result as the <a href="http://nexus.magnolia-cms.com/service/local/artifact/maven/redirect?r=magnolia.public.releases&g=info.magnolia&a=magnolia-empty-webapp&v=5.0-m1&e=war">first milestone</a>. We created a short video to demonstrate the current status so you don’t need to install it yourself. Please be aware that we have not focused on things like user experience design and theming. We just wanted to implement a mini AdminCentral and prove that Vaadin works for us.<br />
<br />
<embed allowfullscreen="true" allowscriptaccess="always" height="258" src="http://blip.tv/play/hpYGgfmuOQA%2Em4v" type="application/x-shockwave-flash" width="410"></embed><br />
<i><span class="Apple-style-span" style="font-size: x-small;"><a href="http://blip.tv/file/4066576">Video</a>: by Federico Grilli</span></i><br />
<br />
<i>Note: if you use the current milestone release you will have to point your browser to /AdminCentral/ as otherwise the old AdminCentral will be served. We will switch that as soon the new UI is functional enough.</i><br />
<br />
<b>Our experience</b><br />
We had a quick start and were able to implement things like the tree view, accordion menu and dialogs very quickly. So Vaadin definitely fits our team and will fit other Java oriented teams well.<br />
<br />
<b>Extensibility</b><br />
It is the ultimate goal to make the new AdminCentral extensible so that everybody can contribute rich modules and paragraphs to the system easily. As expected the server side characteristic of Vaadin helped a lot and allowed us the improve the wiring of the components:<br />
<ul><li>Provider interfaces for the various elements (dialog field, accordion menu actions, ..)</li>
<li>No dependency on the Content API</li>
<li>DSL/Builder APIs can be build easily (not yet done)</li>
<li>All is instantiated/configured by Content2Bean</li>
</ul><br />
<b>History support</b><br />
We still need to improve things but the accordion menu already supports history, and if you switch the tree views (website -> config -> website) you will see that the state of the former selection is kept. We also want the complete status (selected page) to be “bookmarkable”.<br />
<br />
<b>Page editing</b><br />
It was the goal to prove that we can embed a Vaadin application into an existing web page and that we can inject Vaadin components like the edit bars or dialogs. This worked, and since the client side coding is done in GWT, we did not need to leave the Java world. As always, once you leave the well-treaded path you have to overcome obstacles but we learned a lot, found traction and finally succeeded.<br />
<br />
Now that the basics are done, we will have to optimize the initial loading time. The produced script is definitely not small (170k) and has to be cached. Setting the correct response headers will do its job. We also plan to add the edit bars already in the GWT entry point and only bind them later to the server side components. It might be that we even move bigger parts of the code to the client side, but since this is GWT backed code, it is not different from what we had to do in the "Plain GWT" approach.<br />
<br />
<b>Next steps</b><br />
Many things were done and decided quickly so we need to finalize and clean up in the next sprint (the last before the <a href="http://www.magnolia-cms.com/home/community/conference.html">conference</a>). Therefore, we will improve the naming and streamline the architecture a bit.<br />
<br />
Now that we can build the dialogs by code we want to show that it is feasible to write a nice dialog editor. How fancy is that!<br />
<br />
Looking forward to discuss/argue at our <a href="http://www.magnolia-cms.com/home/community/conference.html">conference</a> ;-)Philipp Bärfusshttp://www.blogger.com/profile/15402313894436505808noreply@blogger.com9tag:blogger.com,1999:blog-596632623243995219.post-27163364789375204962010-08-11T08:09:00.000-07:002010-08-11T08:35:24.226-07:00Why Vaadin - line of argumentWhile I told in my <a href="http://philipp-baerfuss-magnolia.blogspot.com/2010/08/why-vaadin-odyssey.html">former post</a> how it came that we left the GWT/ExtGWT couple behind us and finally deciding for Vaadin, I want to elaborate why we think Vaadin is the best option.<br />
<br />
First I will explain how Vaadin helps us to solve some of the crucial problems and why it is so effective to build the new AdminCentral with it. Afterward I will response to some valid concerns raised by the Magnolia CMS community.<br />
<br />
<span class="Apple-style-span" style="font-size: x-large;">Benefits</span><br />
<br />
<span class="Apple-style-span" style="font-size: large;">Server side execution</span><br />
Executing UI events on the server is controversial - more on that later - but it has tremendous benefits.<br />
<ul><li><b>Reflection can be used. </b>While GWT code can't use reflection server side code can. This is for instance very helpful when we transform dialog definitions into real dialogs.<b> </b></li>
<li><b>Security respected. </b>At any time we can use ACLs to define what should be possible in the UI.</li>
<li><b>Less web services. </b>The UI is build on the server, but rendered on the client. So there is no need to define additional services for receiving dialog and tree descriptors.<br />
We just have to expose the content related stateless REST services. </li>
<li><b>Agility. </b>With GWT it is difficult to support agility as you cannot change the final code without compiling it. With Vaadin we can for instance use our powerful Groovy support. </li>
<li><b>Magnolia API. </b>Full Magnolia API can be used and no DTOs are needed.</li>
<li><b>Testing. </b>All code can be tested with normal junit test cases. Even the UI code. The server side widget is linked to the client side widget by annotation.</li>
</ul><span class="Apple-style-span" style="font-size: large;">Efficiency</span><br />
We are a small team and efficiency matters, as time-to-market is crucial.<br />
<ul><li><b>Collaboration. </b>The two communities and the backing companies are looking forward to support this collaboration and to help each other to make this successful.</li>
<li><b>Documentation.</b> Vaadin's <b>documentation</b> is just great. The <a href="http://vaadin.com/book">Book of Vaadin</a>, which is freely available, makes it easy to get started.</li>
<li><b>Compilation</b>. No GWT compilation is needed unless a new client side widget has to be written which should be rarely the case once AdminCentral is rolled out. Composite widgets are not requiring any GWT coding.</li>
<li><b>Theming. </b>As many other things theming is a service provided by Vaadin. Once we decided for a design it will be easy to implement a Vaadin version.</li>
</ul><span class="Apple-style-span" style="font-size: large;">Third party and custom modules</span><br />
It will be much easier to adapt the AdminCentral and plugin module specific UI than if we had chosen for GWT. Firstly one hasn't to perform GWT compilations and secondly reflection/injection will be used to plugin into the AdminCentral.<br />
It is the ultimate goal to make the AdminCentral extendable and usable for more generic content management related use-cases.<br />
<b><br />
</b><span class="Apple-style-span" style="font-size: x-large;">Performance Concerns</span><br />
After the decision was made the community raised concerns about the performance of such a solution. Originally I shared this concerns but want to explain why I think they are not justified or at least don't neutralize the benefits.<br />
<br />
<span class="Apple-style-span" style="font-size: large;">Factor in the scenario</span><br />
We are going to develop the AdminCentral and not the next generation gmail application. The AdminCentral is the backend and is typically used intranets.<br />
<div><br />
<span class="Apple-style-span" style="font-size: large;">Number of Requests</span><br />
The server side event handling will lead to more requests and will add the network latency to most of the user interactions. This sounds dramatic in the beginning but is it really true? Let's have a closer look.<br />
<br />
<b>Scenario A) Ask for data (GWT) = send event (Vaadin)</b><br />
Most of the user interactions will result in a request to the server. The only difference is the reason for sending it. While GWT will ask for the data to show or send some data, Vaadin will send the event information.<br />
Examples:<br />
<ul><li>creating a page</li>
<li> moving a page in the tree</li>
<li> open dialog</li>
<li> click save button</li>
</ul><b><b><span class="Apple-style-span" style="font-weight: normal;"><b>Scenario </b></span>B) One request to rule them all</b></b><br />
Note that any client side UI will also request data from the server. So it is actually not unlikely that a client which uses stateless REST services will send more requests to assemble the data its needing.<br />
<br />
A typical use-case is opening a dialog for paragraph editing which needs additional information to fill a table or read information from a page we are linking to.<br />
<br />
<i>GWT</i> (2 - 3 requests):<br />
<ol><li>event -> execute open-dialog action</li>
<li>ask the server for the dialog to open and its descriptor (might be cacheable, but not necessary due to some complex rules like paragaph to dialog mappings, ..) </li>
<li>populate the dialog -> request to fetch the data details</li>
<li>we need some sub-nodes to fill in a table -> request to fetch the data</li>
</ol><i>Vaadin</i> (1 request):<br />
<ol><li>event -> immediate request to server</li>
<li>event handler builds the dialog (this is fast as no rendering is involved)</li>
<li>some data is read. Reading additional information as meta data and sub-nodes are at hand</li>
<li>bind the data to the dialog</li>
<li>Vaading sends back a JSON representation of the UI changes</li>
<li>client side rendering engine applies the changes</li>
</ol>Here we actually save requests by Vaadin's roundtrip approach.<br />
<br />
<b>Scenario </b><b>C) Visibility changes - Vaadin says not No to client side events</b><br />
In other use-cases as clicking on a tab or navigating in menus none of the frameworks sends events to the server. In both cases it is client side code which toggles the visibility.<br />
<br />
<b>Conclusion</b><br />
While we surely expect to have more requests, we don't think that we talk about doubling the numbers of request. In fact I believe that we will not see an increase bigger than about 10-20 %.<br />
<br />
<span class="Apple-style-span" style="font-size: large;">Responsiveness of the Demos</span><br />
Some stated rightly that the ExtGWT examples are snappier. In my opinion this is due to the fact that the examples just don't use server side services to read the data. But is this a realistic scenario? How often will you perform user interactions without having to read or send data?<br />
<br />
<i>Example: Sorting in the table</i><br />
Client side sorting is a nice thing to do, but normally you will request the data on demand (paging). How will you sort the data which you have not received yet?<br />
<br />
<span class="Apple-style-span" style="font-size: large;">Optimize where you expect the biggest performance gain</span><br />
While we can discuss for a very long time about the client performance I think that an end user will judge the overall performance including search, filtering of data, ...<br />
<br />
And here we can do much on the server side. I prefer to invest time on that end than to optimize the very last bit and byte sent over the wire.<br />
<br />
<b>Content API</b><br />
<ul><li>return iterators not collections (same as JCR)</li>
<li>don't apply the security checks, delegate that to JCR (possible since JCR 2.0) </li>
</ul><b>JCR / Content Structure</b><br />
<ul><li>mixin for metadata instead of using a sub-nodes</li>
<li>versioning friendly structure: extra node to separate paragraphs and subpages</li>
<li>use more and proper node types: searching, ..</li>
</ul>I am very sure that the resulting responsiveness will benefit much more from this kind of improvements.<br />
<br />
<span class="Apple-style-span" style="font-size: x-large;">Proof of concept</span><br />
As for now we have decided for Vaadin but still we are just entering a proof of concept phase in which we want to proof that Vaadin is really the better choice. Here are the scenarios we explicitly test.<br />
<b><br />
</b><br />
<b>Page Editing</b><br />
Here we expect some GWT coding. It is sufficient if the dialogs and toolbox can be Vaadin components.<br />
<ul><li>show that we can inject behavior into existing HTML: add edit button which opens edit dialog</li>
<li>mouse over: show paragraph information on mouse over</li>
<li>inline editing: proof that inline editing will work</li>
</ul><b>Tree Grid</b><br />
Vaadin is working on the tree grid. If we find some shortcomings they will most likely help to improve it.<br />
<ul><li>move: drag and drop</li>
<li>context menu: per node type</li>
<li>editable row</li>
</ul><b>Paragraph</b><br />
If we use a technology to build the new AdminCentral we want to ensure that it can be used to write more complex paragraphs as well. As an example I take the page commenting. Each page has a commenting paragraph. The scenario is different as it must work for high traffic websites too.<b> </b><br />
<ul><li>initial form should not create a session (the page should be served by the cache)</li>
<li>coexistence: two independent Vaadin paragraphs<b><br />
</b></li>
</ul><br />
<span class="Apple-style-span" style="font-size: x-large;">Conclusion</span><br />
We really think Vaadin has great potential and deserves its chance. Still we are new to that technology and will have to verify that our assumptions are right.<br />
<br />
We won't rush into anything</div>Philipp Bärfusshttp://www.blogger.com/profile/15402313894436505808noreply@blogger.com18tag:blogger.com,1999:blog-596632623243995219.post-75694781141208457022010-08-11T01:42:00.000-07:002010-08-11T08:34:38.655-07:00Why Vaadin - the OdysseyBefore I write why we have chosen Vaadin I have to wrap up how it came that we queried our first choice: GWT/ExtGWT.<br />
After the first two Magnolia 5.0 sprints we realized that we have to reconsider our initial decision. We still liked the GWT approach but also faced some challenges which justified such a step.<br />
<ul><li><b>All in one compilation. </b>To optimize the resulting JavaScript code GWT removes unused methods and shortens the names. While this produces minimal and fast code, the outcome is unpredictable and prevents method calls from one module to the another unless they were compiled in the same step. In Magnolia CMS you will install additional modules or update them at run time. This requires a recompilation of the whole AdminCentral unless other tricks are applied.<br />
We planned to re-compile on demand but this conflicts with the exhausting compilation time. Delivering non-optimized JavaScript was also considered. And finally we opted to expose some methods by using gwt-exporter but this would reduce the interoperability of modules. </li>
<li><b>Compilation time</b>. The GWT compilation time increases with the number of inherited modules (ExtGWT is quite heavy) and the produced permutations (browser, languages). If we want to support 5 browsers and 10 languages this multiplies compilation time by 50. At this point the compilation already took 2 minutes on a local computer and 12 minutes on our Hudson server.<br />
This is not so relevant while developing due to the fantastic <i>development mode</i> but<i> </i>it contradicts our concept of executing a compilation on Magnolia module installation/update. Possible workarounds are: use a draft compilation first or compile permutation on demand but it seems like a mine field.</li>
<li><b>MVP pattern. </b>As recommended we wanted to apply the MVP pattern but ExtGWT has its own concept of handling events and this conflicts with the proposed approach by Google. The goal is that the presenter layer can be tested with normal JUnit test cases without extending GWTTestCase which runs a browser under the hood and is terribly slow. We could wrap the ExtGWT components but this won't lead to a slim architecture design and to billion of interfaces.</li>
</ul>So we dropped ExtGWT and designed a <i>plain GWT</i> approach:<br />
<ul><li>Use gwt-exporter to expose a plugin mechanism</li>
<li>Use GWT 2.1 which brings a new MVP framework (at the time milestone 2 release)<br />
</li>
<li>Write our own widgets or write a wrapper for few components<br />
</li>
</ul><div>It is not surprising that we brought the <i>ExtJs/Javascript</i> approach back on the table at that point. Once this happened the <i>Vaadin</i> supporters realized their chance and raised their hands. While I never liked the server side part of <i>Vaadin </i>and excluded it from earlier evaluation phases for that reason, I was desperate enough to reconsider that decision ;-)</div><div><br />
</div><div>We launched a <a href="http://wiki.magnolia-cms.com/display/MAGNOLIA5/Architecture+Survey">survey</a> and filled a <a href="http://wiki.magnolia-cms.com/display/MAGNOLIA5/Architecture+-+Decision+Table">decision table</a>.</div><div><br />
</div><div><a href="http://wiki.magnolia-cms.com/display/MAGNOLIA5/Architecture+Survey"><b>Survey</b></a></div><div>None of the approaches won the survey but the Vaadin community got attracted and this lead to same phone calls with Joonas Lehtinen, the CEO of IT Mill - the company behind Vaadin. So we realized that there is potential for collaboration for the two communities and companies.</div><div><br />
</div><div><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgIPWFGcBSFnWcStJOaVQkNmtRSnabZaTB4Z7A4PprIJtn1WTeGvUD8UtIeMNxqfVxZK5rjsAl7EdWlysJUbBsZIFUJopA-7Rz5TOy4j67QS_GvVHB7iifC6isBdFammtG8R_MiRKTzTA/s1600/survey+result.png" onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}"><img alt="" border="0" id="BLOGGER_PHOTO_ID_5504058140417965538" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgIPWFGcBSFnWcStJOaVQkNmtRSnabZaTB4Z7A4PprIJtn1WTeGvUD8UtIeMNxqfVxZK5rjsAl7EdWlysJUbBsZIFUJopA-7Rz5TOy4j67QS_GvVHB7iifC6isBdFammtG8R_MiRKTzTA/s320/survey+result.png" style="cursor: pointer; display: block; height: 110px; margin: 0px auto 10px; text-align: center; width: 320px;" /></a></div><b><a href="http://wiki.magnolia-cms.com/display/MAGNOLIA5/Architecture+-+Decision+Table">Decision Table</a><br />
<span class="Apple-style-span" style="font-weight: normal;">We dropped the <i>ExtJs/Javascript</i> for the simple reason that we didn't have enough motivation and knowledge to go for it. Some think we are lame but have you ever tried to make a cool product with an unmotivated team which in addition lacks the skills to fulfill the task? I hope not.</span></b><br />
<b><span class="Apple-style-span" style="font-weight: normal;"> While Vaadin got the most points (39 points), GWT </span></b><b><span class="Apple-style-span" style="font-weight: normal;">(29 points)</span></b><b><span class="Apple-style-span" style="font-weight: normal;"> was not yet dismissed as the decision table was only meant to give us an overview and we have not weighted the criteria.</span></b><br />
So we ended up with having the two valuable options:<br />
<ul><li>Plain GWT</li>
<li>Vaadin</li>
</ul><span style="font-weight: bold;">Team Voting</span><br />
At the end we had a final voting in the team. The result was 4 against 2 in favor of <span style="font-style: italic;">Vaadin</span>.<br />
<br />
So that was it: Vaadin<br />
<br />
<span style="font-weight: bold;">Reasoning</span><br />
In the <a href="http://philipp-baerfuss-magnolia.blogspot.com/2010/08/why-vaadin-line-of-argument.html">next blog post</a> - following today - I will explain why Vaadin was the prize winner and how it solves some of the bigger problems we faced with the plain GWT approach.Philipp Bärfusshttp://www.blogger.com/profile/15402313894436505808noreply@blogger.com5tag:blogger.com,1999:blog-596632623243995219.post-39191140466553092272010-04-27T05:42:00.000-07:002010-05-04T00:46:53.506-07:00Osborn's ChecklistThe second method we applied during our Magnolia 5.0 kick-off session is a pearl of a creativity technic. The method is simple but will produce useful outcome in many scenarios.<br /><br />Following the checklist as found at :<br />- http://www.ifm.eng.cam.ac.uk/ctm/idm/tools/concept/osborn.html<br /><br /><table border="1" cellpadding="6"><tbody> </tbody><tbody> </tbody><tbody> </tbody><tbody> <tr> <td valign="top">Other uses</td> <td valign="top">New ways to use as is? Other uses if modified?</td> </tr> <tr> <td valign="top">Adapt</td> <td valign="top">What else is like this? What other idea does<br /> this suggest? Does past offer parallel? What could I copy? Whom could<br /> I emulate?</td> </tr> <tr> <td valign="top">Modify</td> <td valign="top">New twist? Change meaning, colour, motion,<br /> odour, taste, form, shape? Other changes?</td> </tr> <tr> <td valign="top">Magnify</td> <td valign="top">What to add? More time? Greater frequency?<br /> Stronger? Higher? Larger? Longer? Thicker? Heavier? Extra value? Plus<br /> ingredient? Duplicate? Multiply? Exaggerate?</td> </tr> <tr> <td valign="top">Minify</td> <td valign="top">What to subtract? Smaller? Condensed?<br /> Miniature? Lower? Shorter? Narrower? Lighter? Omit? Streamline? Split<br /> up? Understate? Less frequent?</td> </tr> <tr> <td valign="top">Substitute</td> <td valign="top">Who else instead? What else instead? Other<br /> ingredient? Other material? Other process? Other power? Other place?<br /> Other approach? Other tone of voice? Other time?</td> </tr> <tr> <td valign="top">Rearrange</td> <td valign="top">Interchange components? Other pattern? Other<br /> layout? Other sequence? Transpose cause and effect? Change place?<br /> Change schedule? Earlier? Later?</td> </tr> <tr> <td valign="top">Reverse</td> <td valign="top">Transpose positive and negative? How about<br /> opposites? Turn it backward, upside down, inside out? Reverse roles?<br /> Change shoes? Turn tables? Turn other cheek?</td> </tr> <tr> <td valign="top">Combine</td> <td valign="top">How about a blend, an alloy, an assortment, an<br /> ensemble? Combine units?</td> </tr> </tbody><tbody></tbody></table><br /><br />I admit that this technic fits best situations in which you have to overwork an already existing something - like in our case a CMS ;-) It is less useful if you start from scratch. But this is why I find this method so great. Then isn't it more often the case that you rather overwork something than that you start from scratch? And unfortunately one uses creative technics mostly when starting a project but less once you are in the process of maintaining it! But this is the correct moment to use a technic like this, because you will systematically over-think the current solution and will improve it.<br /><br />I also like the method, because it can be used with any team and it is easy to convince others to use this method: common lets verify it against this checklist!<br /><br />To often we just focus about features to add but forget that we could change things or even remove components to make it better.<br /><br />Other uses? Modify? Magnify? Minify? Rearrange? Reverse? Combine?<br /><br />So easy is that!Philipp Bärfusshttp://www.blogger.com/profile/15402313894436505808noreply@blogger.com0tag:blogger.com,1999:blog-596632623243995219.post-67891901410218222532010-04-27T05:08:00.001-07:002010-04-27T05:17:52.844-07:00Inverse BrainstormingWe made our Magnolia 5.0 kick-off session to define what 5.0 is all about. In this session we opened our mindset and used creativity instruments to approach Magnolia 5.0 in a less technical way.<br /><br />If found this very inspiring and would like to present the two technics we used.<br /><br />Lets start with the i<span>nverse brainstorming</span><span style="font-weight:bold;">.</span><br /><br />Sometimes it is hard to find good solutions or new meaningful features. This is especially the case if one sticks to the very same topic for quite a while. What to do? We used a destructive variation of the good old brainstorming.<br /><br />One simply inverses the question and hence we tried to find ways how to make things worse.<br /><br />Some of our favorites?<br />- direct xml editing, upload with FTP<br />- support IE6 ;-)<br />- rewrite the JCR layer<br />- more editions<br />- drop CE<br />- develop it offshore<br />- write less tests<br />- don't use any libraries<br /><br />Oh yes, that is fun, but in the analysis we saw how meaningful this statements are. It helped us to realize how easy it is to diverge from what we really should do. It is also surprising how some of the items could have been raised in a common positive barnstorming session but probably for the wrong reason.<br /><br />With this method one can definitely trigger real thinking.<br /><br />Try it!Philipp Bärfusshttp://www.blogger.com/profile/15402313894436505808noreply@blogger.com1tag:blogger.com,1999:blog-596632623243995219.post-33822768123522989492010-03-22T10:22:00.000-07:002010-03-22T10:55:35.788-07:00Rendering Engine and ContextIn the fresh baked Magnolia 4.3 we introduced the rendering engine. Why? Well all started when I supervised the creation of some new architecture diagrams. My colleague is a technical writer, a good one, but still I had a hard time to explain the rendering process and potential integration scenarios. <div>At some point, lacking other explanations, I introduced the rendering engine which finally helped us to visualize the system. A backbox, a centralized thing responsible for taking a content and producing HTML results.<br /><br />Here are the two diagrams (existing long before any line of code)<br /><br />A) Request processing<br /><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj1-1V904jMk-DwVov57Nwws2IGNPaFhfq4Yqeuxdkw8Ryt_XVlQzec7kaLeczwKId8CFZdzXQ5i96M55kOWSSjXWGxaGfzui6BUyzxJWxbT8N-CqCaMSvzKGZG5okdeCvpuEzhfK3IlQ/s1600-h/Request+processing.png"><img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 208px;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj1-1V904jMk-DwVov57Nwws2IGNPaFhfq4Yqeuxdkw8Ryt_XVlQzec7kaLeczwKId8CFZdzXQ5i96M55kOWSSjXWGxaGfzui6BUyzxJWxbT8N-CqCaMSvzKGZG5okdeCvpuEzhfK3IlQ/s400/Request+processing.png" border="0" alt="" id="BLOGGER_PHOTO_ID_5451513196873546594" /></a><br /><br />B) Rendering Engine<br /><br /><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj_XVXgTDofW4xUd_kK3yNgtNjzZc1iR9Sri3nGkGaxYF4DBWtMoNGUzU5sKm4HVgVzptgq7PSaoyfaTQFk2BjiZtzTxI0g6FTQOgCF3o9NyV7Lhv-fzjcQVeCyxzniFMeec0K1O5N3WA/s1600-h/Rendering+engine-1.png"><img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 280px;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj_XVXgTDofW4xUd_kK3yNgtNjzZc1iR9Sri3nGkGaxYF4DBWtMoNGUzU5sKm4HVgVzptgq7PSaoyfaTQFk2BjiZtzTxI0g6FTQOgCF3o9NyV7Lhv-fzjcQVeCyxzniFMeec0K1O5N3WA/s400/Rendering+engine-1.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5451517915899928258" /></a><br /><br />More and more I started to use that inexistent thing. Finally when the gate keeper already started to close the gate I wrote two concept pages about how to implement that thing:<br /><ul><li><a href="http://wiki.magnolia-cms.com/display/DEV/Concept+-+Rendering+Engine">Rendering Rngine</a></li><li><a href="http://wiki.magnolia-cms.com/display/DEV/Concept+-+Rendering+Context">Rendering Context</a></li></ul><br /><br /><div>For Magnolia 4.3 we just introduced the rendering engine but not yet the rendering context which, once introduce too, will make all that really powerful. The context will provide things like: writer, outputstream, link transformer, parameters ... and will make the rendering completely independent of the request processing.</div><br />Funny is, that when I went back to my coworker and informed him that I implemented the rendering engine, he was only surprised that it didn't exist before ;-)</div>Philipp Bärfusshttp://www.blogger.com/profile/15402313894436505808noreply@blogger.com2tag:blogger.com,1999:blog-596632623243995219.post-4818573870791392010-02-18T02:21:00.000-08:002010-02-18T08:28:47.613-08:00I18n authoring support on stage (Magnolia 4.3)Done! The i18n support for authoring is implemented and part of the Magnolia 4.3 milestone 2 release . Again I have created a video to quickly demonstrate how stuff works.<div><ul><li>enabling i18n authoring</li><li>adapting a dialog</li><li>i18n & multi site support</li></ul><br /><br /><object width="320" height="265"><param name="movie" value="http://www.youtube.com/v/fYoiffRmlZg&hl=en_US&fs=1&"></param><param name="allowFullScreen" value="true"></param><param name="allowscriptaccess" value="always"></param><embed src="http://www.youtube.com/v/fYoiffRmlZg&hl=en_US&fs=1&" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="320" height="265"></embed></object><br /><br />I decided to add another interface configured at /server/i18n/authoring which is responsible to render the language chooser and which will adapt dialogs based on the i18n configuration. Hence it is possible to have your own implementations which could add extra tabs or duplicate the fields. If you are interested:</div><div><ul><li>interface: <a href="http://svn.magnolia-cms.com/view/community/magnolia/tags/magnolia-4.3-m2/magnolia-gui/src/main/java/info/magnolia/cms/gui/i18n/I18nAuthoringSupport.java?view=markup">I18nAuthoringSupport</a></li><li>default implementation: <span class="Apple-style-span" style="font-family:Monaco, serif;font-size:100%;"><span class="Apple-style-span" style="font-size:11px;"><span class="Apple-style-span" style=" ;font-family:Georgia, serif;font-size:16px;"><a href="http://svn.magnolia-cms.com/view/community/magnolia/tags/magnolia-4.3-m2/magnolia-gui/src/main/java/info/magnolia/cms/gui/i18n/DefautlI18nAuthoringSupport.java?revision=32009&view=markup">DefautlI18nAuthoringSupport</a></span></span></span></li></ul></div>Philipp Bärfusshttp://www.blogger.com/profile/15402313894436505808noreply@blogger.com0tag:blogger.com,1999:blog-596632623243995219.post-10307012961618890622010-02-08T10:00:00.000-08:002010-02-09T02:56:29.285-08:00i18n support in dialogs (Magnolia 4.3)Multi language support by maintaining a separate hierarchy per language has been supported since ever. In Magnolia 3.5 we added <a href="http://wiki.magnolia-cms.com/display/WIKI/Introduction+to+I18nContentSupport">i18n suppor</a>t for multiple language sites allowing to have a single hierarchy. But we were still missing a nice built-in support for entering 18n data in the dialogs.<br /><br />Till now the developer was forced to create a field per language (title_de, title_fr, ..). The positive thing about that was that one was able to place the fields as one pleased, by either putting them together in one place or having extra tabs per language. But the drawback of that was, that one had to add this fields per language and that once you wanted support more than 4 languages you had trouble to place the fields in a sensible way.<br /><br />For instance it would be a nightmare to use STK in such a scenario as one had to adapt all the dialogs manually.<br /><br />So we decided to improve that for 4.3. You will now mark a dialog field as i18n aware by adding an i18n nodedata to its definition. The dialog will then render the dialog accordingly based on the current language.<br /><br />First we wanted to have the language chooser in the dialog but failed to find a solution which is nice and also not to complicated to implement (we will rewrite the UI for 5.0). So we came to the conclusion that selecting the language in the main bar of the page makes much more sense. The edit/new bar will then pass the current content language to the dialog. The dialog looks then 100% the same as in a single language scenario but is i18n aware in the way that it renames the field as marked to be i18n aware to the correct name: title_de, title_fr, …<br /><br />Beside we will also support per site i18n configuration, so that one can work with quite complex scenarios.Philipp Bärfusshttp://www.blogger.com/profile/15402313894436505808noreply@blogger.com1tag:blogger.com,1999:blog-596632623243995219.post-48323025018100221172010-02-02T00:50:00.000-08:002010-02-02T03:14:02.179-08:00Configuration Inheritance (Magnolia 4.3)<div><div>While developing the mutlisite support we realized once more how helpful it would be if one were able to inherit configurations instead of copying them. After some thoughts I came to the conclution that it might be rather simple to support this by implementing an other content wrapper which merges the content under the hood.</div><div><br /></div><div>The wrapper checks the existence of a nodedata named 'extends' which can define a absolut or relative path to an other node.</div><div><br /></div><div>You can see a demonstration in the following short video: </div><div><br /></div><div><object width="320" height="265"><param name="movie" value="http://www.youtube.com/v/aIbmFqGZH7M&hl=en_US&fs=1&rel=0"></param><param name="allowFullScreen" value="true"></param><param name="allowscriptaccess" value="always"></param><embed src="http://www.youtube.com/v/aIbmFqGZH7M&hl=en_US&fs=1&rel=0" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="320" height="265"></embed></object></div></div><br />First I had to <a href="http://jira.magnolia-cms.com/browse/MAGNOLIA-3015">re-factor/improve the content API</a> to make that wrapper extendable in a easier way. Then I have just created some tests and added the implementation. Once this was done I just searched the two places where I have to wrap the passed configuration before processing:<div><div><div><ul><li>content2bean (used to build filters, modules, templates and various other components, ..)</li><li>dialog manager (responsible to transform a configuration into a dialog)</li></ul></div><div>The merge is then performed as follows (taken from the javadoc):<ul> <li>node datas are merged and values are overwritten</li> <li>sub content nodes are merged, the original order is guaranteed, new nodes are added at the end of the list</li></ul>The mechanism supports multiple inheritances as such:<ul> <li>the node the current node inherits from can again extend a node</li> <li>nodes laying deeper in the hierarchy can extend an other node</li></ul></div></div></div>Philipp Bärfusshttp://www.blogger.com/profile/15402313894436505808noreply@blogger.com3tag:blogger.com,1999:blog-596632623243995219.post-46733025792362148632009-09-17T02:25:00.000-07:002009-09-17T02:29:49.514-07:00STK BookSome weeks ago I have put down as much information in as little time as possible. The result can be found in the <a href="http://wiki.magnolia-cms.com/display/DEV/STK+Book">STK Book</a>. It is for the moment the far best entry point for anybody trying to work with the STK. I also think that this pages contain some information valuable for those who are already familiar with the main concepts.Philipp Bärfusshttp://www.blogger.com/profile/15402313894436505808noreply@blogger.com2tag:blogger.com,1999:blog-596632623243995219.post-63279909890969541022009-04-02T02:18:00.000-07:002009-04-02T02:35:04.150-07:00STK 1.1, next levelWe improved STK based on projects and feedback given in workshops and I can say it is a major step forward. Doing that we added several new essential features and the concept planted in 1.0 are now building the fundamentals and are now applied more concisely.<br /><br />Following some of the most prominent new features.<br />- fancy teasers / stages (caroussel, ..)<br />- new / events overview (calendar, ..)<br />- commenting<br />- categorization<br />- faq<br />- glossary<br /><br />We will release in about 2 weeks a first beta or even a release candidate. For those who are most interested can download the <a href="http://repo.magnolia-cms.com/m2/info/magnolia/magnolia-standard-templating-kit-bundle/1.1-m4/magnolia-standard-templating-kit-bundle-1.1-m4-bundle.zip">milstone 4 version</a> which we actually already use successfully in one of our projects.Philipp Bärfusshttp://www.blogger.com/profile/15402313894436505808noreply@blogger.com0tag:blogger.com,1999:blog-596632623243995219.post-56372359507531178202009-02-17T07:01:00.000-08:002009-04-02T01:54:52.818-07:00STK: HTML and CSS structureI have copied a page which describes the <a href="http://wiki.magnolia-cms.com/display/DEV/HTML+and+CSS+concept">HTML and CSS concepts</a> behind the STK.<div><br /></div><div>This is mainly important for designers working on new themes.</div>Philipp Bärfusshttp://www.blogger.com/profile/15402313894436505808noreply@blogger.com4tag:blogger.com,1999:blog-596632623243995219.post-51950450080430846162009-02-17T00:37:00.000-08:002009-04-02T01:54:52.819-07:00The base: content 2 bean<div>Wolf asked me to elaborate a bit on all the billions of options you can configure in the template definitions (and site configuration). Before I start to do so I would like to point all to a new documentation page we have added to the documentation about <a href="http://documentation.magnolia-cms.com/reference/configuration.html">generic configuration mechanism</a>.<br /></div><div><br /></div><div>The essential chapter is the one about <a href="http://documentation.magnolia-cms.com/reference/configuration.html#Content2Bean">content 2 bean</a> which describes how the configuration is transformed to java beans. The key point is, that if you want to know what you can configure you have to look at the java bean's code (resp. javadoc). This is also the mechanism which is used to setup up the module bean based on the configuration under <span class="Apple-style-span" style="font-family:'courier new';">/modules/mymodule/config</span></div><div><br /></div><div>As a next step I will start to list most important properties of a STK template.</div>Philipp Bärfusshttp://www.blogger.com/profile/15402313894436505808noreply@blogger.com0tag:blogger.com,1999:blog-596632623243995219.post-74371766723493599932009-02-12T00:31:00.000-08:002009-04-02T01:54:52.819-07:00Release NotesGregory finally published the <a href="http://documentation.magnolia-cms.com/releases/4-0.html">release notes</a> which contains all relevant information about changes (see also the sub pages summarizing API changes & cleanup ).<div><br /></div><div>As a template developer you should especially read the <a href="http://documentation.magnolia-cms.com/releases/4-0/templating.html">new templating features</a> page.</div>Philipp Bärfusshttp://www.blogger.com/profile/15402313894436505808noreply@blogger.com0tag:blogger.com,1999:blog-596632623243995219.post-45189076914053829692009-02-10T05:16:00.000-08:002009-04-02T01:54:52.819-07:00What is a ThemePhilippe asked me to explain what a theme is. So I did on a new<a href="http://wiki.magnolia.info/display/DEV/Themes"> theme page</a>.Philipp Bärfusshttp://www.blogger.com/profile/15402313894436505808noreply@blogger.com0tag:blogger.com,1999:blog-596632623243995219.post-70276096661714691332009-02-10T01:57:00.000-08:002009-04-02T01:54:52.819-07:00STK: ThemesIn STK 1.0 we started to support themes. By default we deliver the theme-pop. I added a quick note about <a href="http://wiki.magnolia-cms.com/display/DEV/Standard+Templating+Kit#StandardTemplatingKit-Themes">how to create a custom theme</a>.<br /><br />In the later run this definitely deserves an extra page.Philipp Bärfusshttp://www.blogger.com/profile/15402313894436505808noreply@blogger.com1tag:blogger.com,1999:blog-596632623243995219.post-49859202981201917722009-02-10T01:45:00.000-08:002009-04-02T01:54:52.819-07:00FreeMarker: STK's template languageThere were controversy debates about the fact that we use FreeMarker as the main template language in STK.<div><br /></div><div>So I have put some answers I have given on the user list to the main <a href="http://wiki.magnolia-cms.com/display/DEV/Standard+Templating+Kit">STK documentation</a> page and wrote a Magnolia oriented <a href="http://wiki.magnolia-cms.com/display/DEV/Standard+Templating+Kit">FreeMarker primer.</a></div><div><br /></div><div><br /></div>Philipp Bärfusshttp://www.blogger.com/profile/15402313894436505808noreply@blogger.com0tag:blogger.com,1999:blog-596632623243995219.post-6635420326064221732009-02-10T00:32:00.000-08:002009-04-02T01:54:52.819-07:00Introduction to Standard Templating KitMany days passed into the land since I have posted the last time. But now I think it is time to become a bit noisier ;-) I will try to assemble useful information about magnolia 4.0 and the new STK (Standard Templating Kit)<br /><br />Doing so I will keep the interested audience informed on this blog. So don't hesitate to depose questions here.<br /><br />One of the first things I plan to do is to make a kind of kick off screen cast.<br /><br />So lets go!Philipp Bärfusshttp://www.blogger.com/profile/15402313894436505808noreply@blogger.com2tag:blogger.com,1999:blog-596632623243995219.post-81146665168117326052008-05-14T10:09:00.000-07:002009-04-02T01:54:52.820-07:00Magnolia 3.6Some of you might wonder what we are currently working on for the upcoming Magnolia 3.6 release. There are four enhancements which I will highlight in this blog entry:<br />- Performance<br />- Caching (API & Strategies)<br />- Backup / Migration<br />- Transactional Activation<br /><br />In essence, Magnolia 3.6 will ease maintenance, boost performance and strengthen the robustness or our content management system in production environments.<br /><br />Performance:<br />When talking about performance improvements, I mean significant improvements which are mainly beneficial for authors who create and manage content within Magnolia. Magnolia 3.6 will be up to 10 times faster for example when creating paragraphs, activating content, managing revisions, importing content, and more.<br /><br />These improvements are mainly possible because we reduced the usage of mix:versionable (<a href="http://jira.magnolia.info/browse/MAGNOLIA-2086">MAGNOLIA-2086</a>).Additionally, we were also able to solve the memory related issues (<a href="http://jira.magnolia.info/browse/MAGNOLIA-1998">MAGNOLIA-1998</a>, <a href="http://jira.magnolia.info/browse/MAGNOLIA-2099">MAGNOLIA-2099</a>) and have already back ported the solution to Magnolia 3.5.<br /><br />Caching:<br />We already finished development of a new and better API from scratch for Magnolia 3.6 which allows granular custom flushing and caching strategies. The new cache system allows to implement individual cache solutions which optimally meet the load patterns of a website to ensure high availability of every single content element. The default implementation is built on top of <a href="http://ehcache.sourceforge.net">ehcache</a>. The enterprise edition of Magnolia 3.6 will include pre-defined caching solutions that will substantially increase the number of requests served by Magnolia when hitting a cached page, the mechanism being that pages will be cached in the background before the existing cache for visited pages is being flushed. The solution also ensures that only one request truggers the caching process if multiple requests ask for the same not yet cached content.<br /><br />Backup:<br />We wrote a backup facility which allows to restore revisions of content as well. This was not possible before, because only the latest version of a page has been imported in releases prior to Magnolia 3.6. Under the hood, the new backup happens in a persistence independent manner, which was not possible with jcr imports before. The new backup feature will be a nice tool for migrations from one persistence to another. This would be needed if you change the database or wish to profit from the new bundled persistence provided by jackrabbit 1.4).<br /><br />Transactional Activation:<br />In former Magnolia versions there was no mechanism guaranteeing that newly created or updated content is being propagated to all public instances (so called “subscribers”) in a staging environment. In Magnolia 3.6, such content gets ether published to all public instances or not at all due to the new transactional activation functionality.<br />The content will be sent to each public instance at the same time so that the single publishing request does not get cumulated any more as in previous Magnolia releases. The transactional activation feature of Magnolia 3.6 makes sure that changes are only committed and published effectively once the content reached all subscriber instances successfully.<br /><br />I am eager to explore this version in production :-)<br /><br />If you would like to read more about the technical details of the upcoming Magnolia 3.6 release, visit the <a href="http://wiki.magnolia.info/display/DEV/Home">Magnolia Development Wiki</a>. This is the place where we have today started to make our internal concepts, roadmaps and backlog available publicly. Please note the comment functionality at the bottom of each Wiki page – you are invited to add information or leave a question there.<br /><br />Just in case you don't have an account for our Wiki yet, feel free to <a href="http://jira.magnolia.info/secure/Signup%21default.jspa">register</a>.Philipp Bärfusshttp://www.blogger.com/profile/15402313894436505808noreply@blogger.com5