<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>CONTENTREICH</title>
	<atom:link href="http://www.contentreich.de/feed" rel="self" type="application/rss+xml" />
	<link>http://www.contentreich.de</link>
	<description>Beratung, Schulung, Entwicklung für Alfresco ECM / Share, JEE, Grails / Groovy / Wordpress</description>
	<lastBuildDate>Tue, 21 Feb 2012 09:04:52 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.1</generator>
		<item>
		<title>Extending Alfresco FormService with Optimistic Locking</title>
		<link>http://www.contentreich.de/extending-alfresco-formservice-with-optimistic-locking</link>
		<comments>http://www.contentreich.de/extending-alfresco-formservice-with-optimistic-locking#comments</comments>
		<pubDate>Tue, 21 Feb 2012 08:05:04 +0000</pubDate>
		<dc:creator>Andreas Steffan</dc:creator>
				<category><![CDATA[Alfresco]]></category>
		<category><![CDATA[Database]]></category>
		<category><![CDATA[ECM]]></category>
		<category><![CDATA[WCM]]></category>

		<guid isPermaLink="false">http://www.contentreich.de/?p=1813</guid>
		<description><![CDATA[Optimistic locking is a commonly used concurrency control method for web applications. It is so frequently needed that frameworks such as Grails use it by default. Alfresco FormService does not support it out of the box. This may cause unexpected results. This post outlines an approach to change the system in order to get something "close to" optimistic locking behavior. <a href="http://www.contentreich.de/extending-alfresco-formservice-with-optimistic-locking">Weiterlesen <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<div class="alignleft labeledImage "><img class="alignnone size-full wp-image-1261" title="3998455558_ec258bac3e_blog" src="http://www.contentreich.de/wp-content/uploads/2012/02/3211113939_04f022fe13_blog.png" alt="Yes We Can" width="275" height="275" /></div>
<p><a title="Optimistic Locking" href="http://en.wikipedia.org/wiki/Optimistic_concurrency_control">Optimistic locking</a> is a commonly used concurrency control method for web applications. It is so frequently needed that frameworks such as Grails use it by default. Alfresco <code>FormService</code> does not support it out of the box — and that may cause unexpected results. This post outlines an approach to change the system in order to get something “close to” optimistic locking behavior.</p>
<h2>The Default Concurrent Write Situation</h2>
<p>Today, I am working on an Alfresco Web Quickstart derived project. A part of the editorial interface is based on Alfresco Share and the editorial process as a whole makes heavy use of the FormService (which is used by the Web Editor as well). I have not used this service extensively in the past, but I was suprised to see that concurrent editing can end up “last writer wins”. A typical sequence of events goes:</p>
<ul>
<li>You open the editing form for one item two times — using one browser with two tabs will do. You can just as well use two diffrent users or browser sessions.</li>
<li>You subsequently save the forms you just opened.</li>
<li>The second write operation overwrites the changes of the first.</li>
</ul>
<p>The risk of a conflict depends on the content change frequency, editing process duration and amount of editors working on the content. You may be tempted to address this using versioning, but doing so may open a new can of worms you don’t want. The first thing I thought was that other people should have been faced with this situation before, so I started googling for a solution. I was even more suprised not finding anything really useful and ended up DIY.</p>
<p>I found, that in fact it is quite easy to get a behavior which is not optimistic locking in the very strict sense, but close. Even more important, the system can behave much more expected in the situation of a conflict.</p>
<h2>An “Almost” Optimistic Locking Implementation</h2>
<p>The following is a rough outline of the solution I came up with (There is a link to the sources below). I have been using it with Alfresco Community 4.0.d.</p>
<p>In the repository, you deploy a filter</p>
<pre class="brush: xml; title: ; notranslate">
&lt;bean id=&quot;optimisticLockFormFilter&quot;
      class=&quot;OptimisticLockFilter&quot;
      parent=&quot;baseFormFilter&quot;&gt;
      &lt;property name=&quot;nodeService&quot; ref=&quot;NodeService&quot; /&gt;
      &lt;property name=&quot;namespaceService&quot; ref=&quot;NamespaceService&quot; /&gt;
      &lt;property name=&quot;filterRegistry&quot; ref=&quot;nodeFilterRegistry&quot; /&gt;
&lt;/bean&gt;
</pre>
<p>which hooks into the form processing. This filter is aware of a special field name prefix <code>_olock_</code>, telling it that a field is meant to be used for version checking. I used <code>cm:modified</code> just because it was here and there and ready to go. In <code>beforePersist</code> the filter checks whether fields matching this prefix have been submitted. If that is the case, it compares the values with current persisted ones. It throws an exception if they don’t match.</p>
<p>To make use of it, you use a special form control template in your form configuration:</p>
<pre class="brush: plain; title: ; notranslate">
&lt;field id=&quot;cm:modified&quot;&gt;
    &lt;control template=&quot;olock.ftl&quot;/&gt;
&lt;/field&gt;
</pre>
<p>The control template is derived from <code>hidden.ftl</code> and the important part is</p>
<pre class="brush: plain; title: ; notranslate">
&lt;#if form.mode == &quot;edit&quot; || form.mode == &quot;create&quot;&gt;
   &lt;input type=&quot;hidden&quot; name=&quot;_olock_${field.name}&quot;
          value=&quot;&lt;#if field.value?is_number&gt;${fieldValue?c}&lt;#else&gt;${fieldValue?html}&lt;/#if&gt;&quot; /&gt;
&lt;/#if&gt;
</pre>
<p>With all this in place, the second save operation will (usually) fail showing the following dialog:</p>
<div id="attachment_1816" class="wp-caption aligncenter" style="width: 588px"><img class=" wp-image-1816 " title="Alfresco Share &quot;Optimistic Locking&quot; Failure Dialog" src="http://www.contentreich.de/wp-content/uploads/2012/02/alfresco-optmistic-locking-fail.png" alt="Alfresco Share &quot;Optimistic Locking&quot; Failure Dialog" width="578" height="130" /><p class="wp-caption-text">Alfresco Share “Optimistic Locking” Failure Dialog</p></div>
<p>Actually quite funny that Share behaves nice here (with no further customization), presenting us with the failure dialog. :)</p>
<p>Again, this solution may not be beautiful for academic eyes as it is not 100% bullet-proof. Nevertheless, it should handle the real world situation fairly well and it should be almost impossible to create the “accidentally overwritten” situation. In fact, aiming for perfection, I tried making it 100% bullet-proof. At first glance, it seemed <code>LockService</code> provides the functionality needed, but that is not quite the case. What I wanted was “<code>select ... for update</code>” style row level read locking. The code using <code>LockService</code> is still in place and in fact used when the service gets injected.</p>
<p>I still feel like I must have missed something and wonder how other people deal with this situation. To be honest, I think Alfresco should be shipping optimistic locking functionality out of the box. I wonder whether they have something in the making.</p>
<p>Resources:</p>
<ul>
<li><a title="Optimistic Locking" href="http://en.wikipedia.org/wiki/Optimistic_concurrency_control">Optimistic Locking</a></li>
<li><a title="Alfresco Form Developers Guide" href="http://wiki.alfresco.com/wiki/Forms_Developer_Guide">Alfresco Form Developers Guide</a></li>
<li><a title="Alfresco Web Editor" href="http://wiki.alfresco.com/wiki/Web_Editor">Alfresco Web Editor</a></li>
<li><a title="Image Credits" href="http://www.flickr.com/photos/locator">Image Credits</a></li>
</ul>
<p><a  title='Optimistic Locking Alfresco Forms Service Extension' href='http://www.contentreich.de/?wpdmact=process&did=OS5ob3RsaW5r' style="background:url('http://www.contentreich.de/wp-content/plugins/download-manager/icon/download.png') no-repeat;padding:3px 12px 12px 28px;font:bold 10pt verdana;">Download Optimistic Locking Alfresco Forms Service Extension</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.contentreich.de/extending-alfresco-formservice-with-optimistic-locking/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Individuelle Alfresco Share Gruppen</title>
		<link>http://www.contentreich.de/individuelle-alfresco-share-gruppen</link>
		<comments>http://www.contentreich.de/individuelle-alfresco-share-gruppen#comments</comments>
		<pubDate>Thu, 02 Feb 2012 08:35:20 +0000</pubDate>
		<dc:creator>Sandra Martin</dc:creator>
				<category><![CDATA[Alfresco]]></category>
		<category><![CDATA[Berechtigungen]]></category>
		<category><![CDATA[Gruppen]]></category>
		<category><![CDATA[Rollen]]></category>
		<category><![CDATA[Share]]></category>

		<guid isPermaLink="false">http://www.contentreich.de/?p=1518</guid>
		<description><![CDATA[Der SiteManager einer Share Site soll die Möglichkeit erhalten, individuelle sitespezifische Gruppen anzulegen und zu verwalten. Das Berechtigungsmodell in Alfresco Share lässt dieses Szenario "out of the box" nicht abbilden. <a href="http://www.contentreich.de/individuelle-alfresco-share-gruppen">Weiterlesen <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p><img class="alignleft size-full wp-image-1519" title="Share Site Gruppen" src="http://www.contentreich.de/wp-content/uploads/2012/02/gruppen.jpg" alt="" width="275" height="275" />Das Berechtigungsmodell in Alfresco Share lässt bestimmte Szenarien “out of the box” nicht abbilden. <strong>Der Manager einer Share Site darf z.B. keine individuellen Gruppen anlegen und deren Mitglieder verwalten</strong>.</p>
<p>Sobald eine neue Share Site erstellt wird, legt Alfresco eine sitespezifische Gruppe für die jeweilige Site mit vier Untergruppen an.</p>
<p>Die vier Untergruppen dienen hierbei der Zusammenfassung der Mitglieder entsprechend ihrer Rolle als Contributor, Collaborator, Consumer und Manager. Per Defaultverhalten werden diesen Gruppen die gleichnamigen Berechtigungen <code>Contributor, Collaborator, Consumer</code> und <code>Manager</code> zugewiesen.</p>
<p><strong>DEFAULT</strong>:<br />
Gruppe: <code>GROUP_SITE_XYZ_Collaborator</code><br />
–&gt; Berechtigung: <code>SiteCollaborator</code></p>
<p>Die Benutzung des Administrationstools zur Gruppenverwaltung (Anlegen/Bearbeiten/Löschen von Gruppen sowie Zuweisen von Mitgliedern) obliegt einem Administrator. Der Manager einer Site kann diese vom Administrator vordefinierten Gruppen auf seine Site einladen. Zum Zeitpunkt der Einladung kann der Manager entscheiden, ob dieser Mitglieder der Gruppe zukünftig als Contributor, Collaborator, Consumer oder Manager Zugriff auf die Inhalte haben.</p>
<p>Das Basiswissen zum “out of the box” Berechtigungsmodell vermittelt nachfolgendes Video (kann von Alfresco “Profis” gerne übersprungen werden):</p>
<div class="post clearfix withThumb featured">
<p><a href="http://www.youtube.com/watch?v=17CUxw3pR3Q">http://www.youtube.com/watch?v=17CUxw3pR3Q</a></p>
</div>
<p><em>Alfresco Share Basiswissen: sitespezifische Gruppen / Rollen / Berechtigungen und deren Zusammenspiel</em></p>
<h2>Verwaltung individuellen Share Site Gruppen</h2>
<p>Der SiteManager einer Share Site soll die Möglichkeit erhalten, individuelle sitespezifische Gruppen anzulegen und zu verwalten.</p>
<p>Im nachfolgendem Diagramm haben wir versucht diese Erweiterung grafisch darzustellen (Vergrößerung per Mausklick):<br />

<a href='http://www.contentreich.de/individuelle-alfresco-share-gruppen/diagrammberechtigung' title='Diagramm sitespezifische Berechtigung' rel='gallery-1518'><img width="584" height="412" src="http://www.contentreich.de/wp-content/uploads/2012/02/DiagrammBerechtigung-584x412.png" class="attachment-large" alt="Diagramm sitespezifische Berechtigung" title="Diagramm sitespezifische Berechtigung" /></a>
</p>
<p><strong>Das Berechtigungsmodell wurde wie folgt vorgegeben</strong> (wobei die Firmen “abc” und “xyz” für beliebig viele Firmen stehen):</p>
<ul>
<li>interne Mitarbeiter haben entsprechend ihrer Rolle Zugriff auf alle Projektordner</li>
<li>externe Mitarbeiter der “Firma xyz” haben ausschließlich Zugriff als Collaborator auf Ordner / Dateien der „Firma xyz”</li>
<li>externe Mitarbeiter der “Firma abc” haben ausschließlich Zugriff als Collaborator auf Ordner / Dateien „Firma abc”</li>
<li>externe Mitarbeiter der Firmen “xyz” und “abc” können Ordner / Dokumente der internen Mitarbeiter und der jeweils anderen externen Firmen nicht sehen</li>
</ul>
<p>In einem früheren Beitrag haben wir bereits einen <a href="http://www.contentreich.de/alfresco-share-prototype-security-hack">Prototypen zur Verwaltung von Berechtigungen für einzelne Benutzer</a> vorgestellt. Diese Erweiterung wurde nun entsprechend der oben genannten Anforderungen auf Gruppen ausgeweitet. Zusätzlich wurde der Menüpunkt “Gruppen” unterhalb der Mitgliederverwaltung (Funktionalität für Manager einer Site) durch die neue Funktionalität Gruppen– / Mitgliederverwaltung ersetzt. Natürlich kann man die neue Funktionalität auch ergänzend implementieren.</p>
<p>Unser nachfolgendes Video beschreibt diese Erweiterung an einem Prototypen:</p>
<div class="post clearfix withThumb featured ">
<p><a href="http://www.youtube.com/watch?v=lK6nfN9fWR8">http://www.youtube.com/watch?v=lK6nfN9fWR8</a></p>
</div>
]]></content:encoded>
			<wfw:commentRss>http://www.contentreich.de/individuelle-alfresco-share-gruppen/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>An Alfresco Developer’s Challenge and Journey</title>
		<link>http://www.contentreich.de/an-alfresco-developers-challenge-and-journey</link>
		<comments>http://www.contentreich.de/an-alfresco-developers-challenge-and-journey#comments</comments>
		<pubDate>Tue, 17 Jan 2012 09:05:16 +0000</pubDate>
		<dc:creator>Andreas Steffan</dc:creator>
				<category><![CDATA[Alfresco]]></category>
		<category><![CDATA[Spring]]></category>
		<category><![CDATA[Analysis]]></category>
		<category><![CDATA[Open Source]]></category>

		<guid isPermaLink="false">http://www.contentreich.de/?p=1430</guid>
		<description><![CDATA[Alfresco is a very flexible content-platform in general. It provides mechanisms to customize almost every component (Spring-Bean, Webscript, Templates) shipped with the core product. Still, there are times when the solution is not as obvious and as the developer initially had in mind. <a href="http://www.contentreich.de/an-alfresco-developers-challenge-and-journey">Weiterlesen <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<div class="alignleft labeledImage "><img class="alignnone size-full wp-image-1261" title="3998455558_ec258bac3e_blog" src="http://www.contentreich.de/wp-content/uploads/2012/01/3998455558_ec258bac3e_blog.jpg" alt="An idea (lit bulp)" width="275" height="275" /></div>
<p>Alfresco is a very flexible content-platform in general. It provides mechanisms to customize almost every component (Spring-Bean, Webscript, Templates) shipped with the core product.</p>
<p>Still, sometimes the technical solution does not prove to be even close to what the developer had in mind. This post is about a recent personal challenge and the journey to the solution in an Alfresco Share customization project targeting version 3.4.</p>
<h2>Business Requirements</h2>
<p>The project consisted of various stories. One was about customization of the Share invitation email with the following requirements:</p>
<ul>
<li>As a Site-Manager, we want an optional personal message to be included in the invitation-email.</li>
<li>As a Site-Manager, we want to receive invitee read-receipts for invitation-emails</li>
<li>As a Site-Manager, we want the company logo to appear in the invitation email.</li>
</ul>
<p>The customer was fairly pragmatic — requirements implemented quickly and decently priced being far more important than educational value of the code. Hence, it was ok to apply these customizations on a global level - to all share sites with no further scoping. That all sounded reasonably to me and I was confident to get it implemented “properly”.</p>
<p>The project was of type fixed-scope and fixed-price. A No-Go due to Heisenberg’s uncertainty principle — sure, but there was no way around.</p>
<p>Now, if you are an Alfresco developer reading this, please take a minute virtually outlining your solution and make a rough effort estimation before proceeding with solution journey on the <a href="http://www.contentreich.de/an-alfresco-developers-challenge-and-journey/2" title="An Alfresco Developer’s Challenge and Journey Part 2">next page</a></a>. But even if you have no clue what Alfresco is, it might be worth reading further.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.contentreich.de/an-alfresco-developers-challenge-and-journey/feed</wfw:commentRss>
		<slash:comments>7</slash:comments>
		</item>
		<item>
		<title>Merry Christmas and a Happy New Year!</title>
		<link>http://www.contentreich.de/merry-christmas-2011-and-a-happy-new-year</link>
		<comments>http://www.contentreich.de/merry-christmas-2011-and-a-happy-new-year#comments</comments>
		<pubDate>Wed, 21 Dec 2011 11:41:55 +0000</pubDate>
		<dc:creator>Sandra Martin</dc:creator>
				<category><![CDATA[Allgemein]]></category>
		<category><![CDATA[Contentreich]]></category>

		<guid isPermaLink="false">http://www.contentreich.de/?p=1415</guid>
		<description><![CDATA[Wir wün­sche allen Part­nern, Auf­tragge­bern, Fol­low­ern, Fre­un­den und ihren Fam­i­lien besinnliche Fest­tage und ein gutes Ankom­men im neuen Jahr! Andreas &#38; Sandra]]></description>
			<content:encoded><![CDATA[<p>Wir wün­sche allen Part­nern, Auf­tragge­bern, Fol­low­ern, Fre­un­den und ihren Fam­i­lien besinnliche Fest­tage und ein gutes Ankom­men im neuen Jahr!</p>
<p>Andreas &amp; Sandra</p>
<p><a href="http://www.flickr.com/people/sebzpics/"><img src="http://www.contentreich.de/wp-content/uploads/2011/12/weihnacht2011.jpg" alt="" title="Weihnachten 2011" width="635" height="424" class="aligncenter size-full wp-image-1416" /></a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.contentreich.de/merry-christmas-2011-and-a-happy-new-year/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Online Reputation — Wie wollen wir wahrgenommen werden?</title>
		<link>http://www.contentreich.de/online-reputation</link>
		<comments>http://www.contentreich.de/online-reputation#comments</comments>
		<pubDate>Fri, 09 Dec 2011 09:28:31 +0000</pubDate>
		<dc:creator>Sandra Martin</dc:creator>
				<category><![CDATA[Allgemein]]></category>
		<category><![CDATA[Contentreich]]></category>
		<category><![CDATA[WordPress]]></category>
		<category><![CDATA[CSS3]]></category>
		<category><![CDATA[HTML5]]></category>

		<guid isPermaLink="false">http://www.contentreich.de/?p=1348</guid>
		<description><![CDATA[In den letzten Wochen haben wir uns intensiv mit unserem eigenen Webauftritt auseinander gesetzt. Wir wollten unser Tätigkeitsfeld für „Nicht IT‘ler“ verständlicher kommunizieren ... <a href="http://www.contentreich.de/online-reputation">Weiterlesen <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>Online Reputation (ORM) ist für uns keine Einzelmaßnahme, sondern eine kontinuierliche Arbeit an unseren Profilen in sozialen Netzwerken, Beiträgen/Kommentaren in Blogs bis hin zum eigenen Webauftritt.</p>
<blockquote><p>ORM = Unter Online-Reputationsmanagement wird die Überwachung und Beeinflussung des Rufs einer Person, einer Organisation oder eines Produkts in digitalen Medien verstanden. (Wikipedia)</p></blockquote>
<p>In den letzten Wochen haben wir uns intensiv mit unserem eigenen Webauftritt auseinander gesetzt. Wir wollten unser Tätigkeitsfeld für „Nicht IT‘ler“ verständlicher kommunizieren, denn nicht selten haben wir uns anhören müssen, dass Freunde und Bekannte an Hand unserer Website nicht verstanden, was wir beruflich machen. Das sollte sich ändern.</p>
<blockquote><p>Wir möchten bei unseren Kunden kostengünstige, leicht verständliche, einfach bedienbare und schnell erweiterbare webbasierte Dokumentenverwaltungs– / Kollaborationssysteme einsetzen. Bei unseren Webprojekten steht ein flexibler und schlanker (agil) Softwareentwicklungsprozess im Vordergrund. Gemeinsam mit unseren Kunden fokussieren wir uns auf die zu erreichenden Ziele und möchten mit geringem bürokratischen Aufwand Projekt erfolgreich abschließen.</p></blockquote>
<p>Mit unser bisheriger Webauftritt konnten wir dieses offensichtlich nicht vermitteln.</p>
<h2>Maßnahmen an unserer Website</h2>
<ul>
<li>Umstrukturierung der Inhalte, aktuelle Beiträge auf der Startseite.</li>
<li>„Technologie“ und „Wir über uns“ wurde unter dem Punkt „Sie benötigen Unterstützung?“ zusammengefasst und durch die Verwendung von Mindmaps (hoffentlich) „leicht verdaulicher“ gemacht.</li>
<li>Unter „Projekte“ haben wir eine chronologische Übersicht (auf Basis des WordPress Plugins Timeline) umgesetzt.</li>
<li>Unser „altes“ WordPress Theme „Oracle“ von ThemeTrust durch ein Freies WordPress Child Theme für Twenty Eleven: Paper (HTML5 / CSS3) ersetzt und durch CSS Anpassungen an unser CD angeglichen.</li>
</ul>
<p><a href="http://www.contentreich.de/wp-content/uploads/2011/12/paper_wpcharity.jpg"><img class="alignleft size-full wp-image-1355" title="paper_wpcharity" src="http://www.contentreich.de/wp-content/uploads/2011/12/paper_wpcharity.jpg" alt="Twenty Eleven Child Theme Paper (WP Charity)" width="275" height="275" /></a>Das verwendete Theme spiegelt für uns den handwerklichen Teil unserer Arbeit wieder. Wir beginnen bei vielen unserer Projekt mit einem Papier und Bleistift Konzept. Es werden Diagramme gezeichnet, Abläufe skizziert usw. . </p>
<p>Das Child Theme (verantwortlich für das Grundlayout der Website) wird von WP Charity kostenlos zur Verfügung gestellt und kann durch eine Spende an weltweite Hilfsprojekte freiwillig unterstützt werden. Also eine gute Sache!</p>
<p>Durch den Einsatz eines Child Themes auf der Basis von Twenty Eleven sind wir von Weiterentwicklungen durch WordPress am „Eltern“ Theme nicht ausgeschlossen und somit zukunftssicher (soweit man das in unserer Branche sagen kann).</p>
<p>Im letzten Jahr haben wir einige Kundenprojekte unter Verwendung von WordPress kostengünstig umgesetzt und sind von den unzähligen Möglichkeiten der individuellen kundenspezifischen Anpassungen begeistert. Zwei Website Beispiele (neben unserem Auftritt) sind die Sites Saselmädchen und Ingenieurkonzepte.</p>
<p>Ob wir mit den beschriebenen Maßnahmen das Ziel erreicht haben .… wir hoffen es ;)</p>
<p>Quellen:</p>
<ul>
<li><a title="WP Charity" href="http://wpcharity.com/" target="_blank">WP Charity Child Theme Paper</a></li>
<li><a title="Wikipedia" href="http://de.wikipedia.org/wiki/Online-Reputationsmanagement" target="_blank">Wikipedia Online Reputation</a></li>
<li><a title="Saselmaedchen" href="http://www.saselmädchen.de" target="_blank">Saselmädchen</a></li>
<li><a title="Ingenieurkonzepte" href="http://www.ingenieurkonzepte.de" target="_blank">Ingenieurkonzepte</a></li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://www.contentreich.de/online-reputation/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Unobstrusive Spring Beans Injection — Performance Analysis (Alfresco Example)</title>
		<link>http://www.contentreich.de/unobstrusive-spring-beans-injection-performance-analysis-alfresco-example</link>
		<comments>http://www.contentreich.de/unobstrusive-spring-beans-injection-performance-analysis-alfresco-example#comments</comments>
		<pubDate>Tue, 15 Nov 2011 11:51:03 +0000</pubDate>
		<dc:creator>Andreas Steffan</dc:creator>
				<category><![CDATA[Alfresco]]></category>
		<category><![CDATA[Spring]]></category>
		<category><![CDATA[Analysis]]></category>
		<category><![CDATA[Open Source]]></category>

		<guid isPermaLink="false">http://www.contentreich.de/?p=1262</guid>
		<description><![CDATA[Sometimes you need to know where an application is spending how much time. The old school System.currentTimeMillis() approach works for basic scenarios. If you have a Spring based application, applying an AOP style "bean injection" approach may get you far better results - cleaner and faster. <a href="http://www.contentreich.de/unobstrusive-spring-beans-injection-performance-analysis-alfresco-example">Weiterlesen <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<div class="alignleft labeledImage ">
<img class="alignnone size-full wp-image-1261" title="3020016417_3c4f42de7b_blog" src="http://www.contentreich.de/wp-content/uploads/2011/11/3020016417_3c4f42de7b_blog.jpg" alt="Stopwatch" width="275" height="275" /><br />
<a class="license-cc" href="http://www.flickr.com/photos/purplemattfish/3020016417/sizes/z/in/photostream/"></a></div>
<p>Sometimes you need to know where an application is spending time and how long things take to finish.</p>
<p>In situations with sources at hand, you may have applied the intuitive straight forward approach wrapping <code>doHeavyLifting()</code> calls in <code>System.currentTimeMillis()</code> to compute the duration. The obvious drawback is the fact that instrumentation code is mixed in code doing what needs to be done. The encapsulation concern can of course be addressed using AOP.</p>
<p>Another less obvious disadvantage is the fact that you need sources and a compiler to get the instrumentation code into the application.</p>
<h2>Spring Instrumentation without Source and Compiler</h2>
<p>Today, <del datetime="2011-11-15T12:02:36+00:00">all</del> a lot of java based applications are built on top of Spring dependency injection. A few months ago me and a colleague were faced with the challenge to analyze an application showing massive performance problems. We did not have the source code, but we were at least lucky with the fact, that this application was built with Spring. This provided us with possibilities to drop-in Spring bean definitions like <code>org.springframework.jmx.support.MBeanServerFactoryBean</code> and<br />
<code>org.hibernate.jmx.StatisticsService</code> allowing us to export instrumentation data for analysis.</p>
<p>A few weeks ago, another colleague was wondering about Alfresco performance. I was immediately asking myself whether an approach similiar to the one taken before could be applied to gather Alfresco performance data. Sure, the situation was a little different in that we have Alfresco sources, but I wanted a more clean solution without touching sources.</p>
<h2>Proof of Concept with Alfresco</h2>
<p>Even though I had no concrete performance problem with Alfresco, I wanted to find out how far I’d get. Looking at all the <code>*-context.xml</code> files, I felt Alfresco must be the ultimate Spring application on the planet. My out of-the-box installation has roughly 2000 Spring bean definitions with nested application contexts and seems to use each and every feature Spring has to offer.</p>
<p>First I got hurt learning that using the <code>aop</code> namespace in Alfresco Spring beans xml yields all kind of weird errors. Fortunately, the good old bean elements proved to provide the features I needed and work just fine. The basic proof of concept was successful — interceptors, advisors and pointcuts et al. did what I wanted them to do without touching Alfresco code.</p>
<h2>Next steps</h2>
<p>As the basic building blocks were working. The bean definitions looked like the following code:</p>
<pre class="brush: xml; title: ; notranslate">

&lt;bean id=&quot;methodNamePointcut&quot;
      class=&quot;org.springframework.aop.support.NameMatchMethodPointcut&quot;&gt;
 &lt;property name=&quot;mappedNames&quot;&gt;
   &lt;list&gt;
&lt;!--
public ResultSet executeQuery(SearchParameters searchParameters, String language)
--&gt;
    &lt;value&gt;executeQuery&lt;/value&gt;
   &lt;/list&gt;
 &lt;/property&gt;
&lt;/bean&gt;

&lt;bean id=&quot;profileAdvice&quot;
      class=&quot;de.contentreich.instrumentation.ProfileMethodInterceptor&quot; /&gt;

&lt;bean id=&quot;profilingAdvisor&quot;
      class=&quot;org.springframework.aop.support.DefaultPointcutAdvisor&quot;&gt;
 &lt;property name=&quot;pointcut&quot; ref=&quot;methodNamePointcut&quot; /&gt;
 &lt;property name=&quot;advice&quot; ref=&quot;profileAdvice&quot; /&gt;
&lt;/bean&gt;

&lt;bean id=&quot;profilingAutoProxyCreator&quot;
      class=&quot;org.springframework.aop.framework.autoproxy.BeanNameAutoProxyCreator&quot;&gt;
 &lt;property name=&quot;proxyTargetClass&quot; value=&quot;true&quot; /&gt;
 &lt;property name=&quot;beanNames&quot;&gt;
  &lt;list&gt;
&lt;!-- id=solr, id=lucene - core-services-context.xml --&gt;
&lt;!--
classpath*:alfresco/extension/subsystems/Search/solr/solr/*-context.xml
--&gt;
   &lt;value&gt;search.solrQueryHTTPCLient&lt;/value&gt;
 &lt;/list&gt;
 &lt;/property&gt;
 &lt;property name=&quot;interceptorNames&quot;&gt;
  &lt;list&gt;
    &lt;value&gt;profilingAdvisor&lt;/value&gt;
  &lt;/list&gt;
 &lt;/property&gt;
&lt;/bean&gt;
</pre>
<p>Questings now coming up where</p>
<ul>
<li>What (objects/methods) is actually available for instrumentation ?</li>
<li>How do I get decent presentation of the data quickly ?</li>
<li>What is a decent foundation to build performance gathering upon ?</li>
</ul>
<p>To address the first question, I built a webscript to browse the (nested) Spring contexts and their beans including method signatures.</p>
<p>Regarding the second and third question, I found <code>perf4j</code> addressing them fairly well. As the <code>Servlet</code> shipping with <code>perf4j</code> does not really fit in the Alfresco repository context, I wrote a replacement webscript to get the graphical view of the gathered data. <code>Perf4j</code> is based on <code>log4j</code> and out-of-the box, Alfresco does not support <code>log4j.xml</code> files needed (due to <code>AppenderAttachable</code>s). Hence, I extended <code>Log4JHierarchyInit</code> to implement the support for XML based syntax. The final challenge left with <code>perf4j</code>s was the fact that <code>AgnosticTimingAspect</code> is based on annotation code, so I wrote an alternative working without.</p>
<p>One special “pointcut” with Alfresco are the webscripts it hosts. I implemented a special path based pointcut (<code>DynamicMethodMatcherPointcut</code>) allowing me to match and instrument them. Yes, I know <code>AbstractWebScript</code> already has timing code, but I wanted graphs. ;)</p>
<p>Below are screenshots showing beans, bean signature and a simple graph displaying execution times of a few solr webscript.</p>

<a href='http://www.contentreich.de/unobstrusive-spring-beans-injection-performance-analysis-alfresco-example/beans-screenshot-full' title='beans-screenshot-full' rel='gallery-1262'><img width="150" height="150" src="http://www.contentreich.de/wp-content/uploads/2011/11/beans-screenshot-full-150x150.png" class="attachment-thumbnail" alt="beans-screenshot-full" title="beans-screenshot-full" /></a>
<a href='http://www.contentreich.de/unobstrusive-spring-beans-injection-performance-analysis-alfresco-example/graph-execution-screenshot-full' title='graph-execution-screenshot-full' rel='gallery-1262'><img width="150" height="150" src="http://www.contentreich.de/wp-content/uploads/2011/11/graph-execution-screenshot-full-150x150.png" class="attachment-thumbnail" alt="graph-execution-screenshot-full" title="graph-execution-screenshot-full" /></a>
<a href='http://www.contentreich.de/unobstrusive-spring-beans-injection-performance-analysis-alfresco-example/search_lucene_alfresco' title='search_lucene_alfresco' rel='gallery-1262'><img width="150" height="150" src="http://www.contentreich.de/wp-content/uploads/2011/11/search_lucene_alfresco-150x150.png" class="attachment-thumbnail" alt="search_lucene_alfresco" title="search_lucene_alfresco" /></a>

<p>Source can be found at github and there is also a tarball with the binary <code>amp</code> file ready to deploy and sample extension code which should be dropped in <code>tomcat</code>s <code>shared/classes</code> folder.</p>
<p>Finally I’d like to emphasize that the basic injection code is not dependent on Alfresco at all. It should work in just about any Spring based application.</p>
<p>Resources:</p>
<ul>
<li><a title="Perf4j" href="http://perf4j.codehaus.org/">Perf4J</a></li>
<li><a title="Spring AOP" href="http://static.springsource.org/spring/docs/3.0.6.RELEASE/spring-framework-reference/html/aop.html">Spring AOP</a></li>
<li><a title="Alfresco Repository Architecture" href="http://wiki.alfresco.com/wiki/Alfresco_Repository_Architecture">Alfresco Repository Architecture</a></li>
<li><a title="contentreich-alf-repo-sandbox Source Code" href="https://github.com/deas/contentreich-alf-repo-sandbox">Source @ Github</a></li>
</ul>
<p><a  title='Alfresco Instrumentation Repository Extension' href='http://www.contentreich.de/?wpdmact=process&did=OC5ob3RsaW5r' style="background:url('http://www.contentreich.de/wp-content/plugins/download-manager/icon/download.png') no-repeat;padding:3px 12px 12px 28px;font:bold 10pt verdana;">Download Alfresco Instrumentation Repository Extension</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.contentreich.de/unobstrusive-spring-beans-injection-performance-analysis-alfresco-example/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Alfresco Community R/W-Source Repository Available (Bugfixes)</title>
		<link>http://www.contentreich.de/alfresco-community-rw-source-repository-available-bugfixes</link>
		<comments>http://www.contentreich.de/alfresco-community-rw-source-repository-available-bugfixes#comments</comments>
		<pubDate>Tue, 25 Oct 2011 08:33:16 +0000</pubDate>
		<dc:creator>Andreas Steffan</dc:creator>
				<category><![CDATA[Alfresco]]></category>
		<category><![CDATA[Contentreich]]></category>
		<category><![CDATA[Bugfixes]]></category>
		<category><![CDATA[Git]]></category>
		<category><![CDATA[Open Source]]></category>
		<category><![CDATA[Svn]]></category>

		<guid isPermaLink="false">http://www.contentreich.de/?p=1139</guid>
		<description><![CDATA[The Open Source project Alfresco so far "only" has a community read-only svn repository. This post outlines an approach extending that with a read/write git repository to support collective community bugfixing. <a href="http://www.contentreich.de/alfresco-community-rw-source-repository-available-bugfixes">Weiterlesen <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<div class="alignleft labeledImage "><img class="alignnone size-full wp-image-791" title="Patches" src="http://www.contentreich.de/wp-content/uploads/2011/10/5701880866_fc2072e781_blog.jpg" alt="Patches" width="275" height="275" /></div>
<p>In my post <a title="Alfresco Community Bugfixing" href="http://www.contentreich.de/alfresco-community-bugfixing">Alfresco Community Bugfixing</a> I stated</p>
<blockquote><p>I wish we (as the com­mu­nity) had some­thing — a sys­tem and/or process to sup­port our bug­fix­ing needs. A place to exchange com­mu­nity release (bug­fix) patches.</p></blockquote>
<p>Alfresco Community Manager Jeff Potts and me agreed that the root “prob­lem” are two fla­vors (Community and Enterprise) of core alfresco code and the fact that com­mu­nity con­trib­u­tors have no easy way to “com­mit and share”.</p>
<p>Meanwhile I’ve been experimenting a bit, and I think the outcome is ready to try out for people feeling comfortable working with sources. The solution introduced here is based on <code>git</code>(hub) and <code>git-svn</code>. The latter is only required if you want to deal with subversion HEAD source from the official Alfresco Community repository as well.</p>
<p>The whole setup may also work for other Open Source projects where there is only a community read-only repo available. Due to the possibilities it introduces, <code>git(-svn)</code> may even prove to be helpful in the case where all you have is an ordinary <code>svn</code> repo. I for one am moving entirely to <code>git</code> —  wrapping <code>svn</code> where needed.</p>
<h2>Subscribing to Bugfixes</h2>
<p>At this time, the git repository has three branches (3.4.c-fixes, 3.4.d-fixes and 4.0.a-fixes) and three tags (3.4.c, 3.4.d and 4.0.a). As the names suggest, the tags correspond to the svn release revisions (r24514, r25020, r30857) and the respective branches are for bugfix maintaince only.</p>
<p>If you are just interested in subscribing to bugfix-only sources, all you need to do to hook up is</p>
<pre class="brush: plain; title: ; notranslate">
git clone git@github.com:deas/alfresco.git
</pre>
<p>To obtain the latest version of a certain branch, execute the following</p>
<pre class="brush: plain; title: ; notranslate">
cd alfresco
git checkout 4.0.a-fixes
git pull
</pre>
<h2>Incorporating Official Subversion HEAD</h2>
<p>If you want the latest source from the official subversion repository as well, you can link it in like so:</p>
<pre class="brush: plain; title: ; notranslate">
cd alfresco
git checkout 4.0.a
git svn init http://svn.alfresco.com/repos/alfresco-open-mirror \
 -T alfresco/HEAD
git update-ref refs/remotes/trunk 4.0.a
git svn fetch
git checkout -b svn-head
git svn rebase
</pre>
<p>Now, you are on a new (local only, up to date) branch <code>svn-head</code>. You may see a few warnings <code>Couldn't find revmap ...</code>, but those are not a real problems.</p>
<h2>Cherry-Picking Bugfixes</h2>
<p>Not everybody can or wants to work through code (possibly with a debugger) to fix a bug. Sometimes you don’t have to. <a title="ALF-10840" href="https://issues.alfresco.com/jira/browse/ALF-10840">ALF-10840</a> is an example. Well in fact I worked through the code fixing it myself in this case, but this example still shows how to fix a bug in the sources without actual coding. :)</p>
<p>This is what worked here:</p>
<pre class="brush: plain; title: ; notranslate">
git checkout svn-head
git svn rebase
git log
</pre>
<p>There, you’ll find commit <code>534ab26f191bb3fbef8bc0b05d5f13911112f106</code> mentioning “Fix for ALF-10840″. If you know the <code>svn</code> rev, you can just as well run</p>
<pre class="brush: plain; title: ; notranslate">
git svn find-rev r31335
</pre>
<p>to find out the corresponding <code>git</code> commit-id.</p>
<p>With the commit-id at hand, you can cherry-pick the bugfix into the <code>4.0.a-fixes</code> branch.</p>
<pre class="brush: plain; title: ; notranslate">
git checkout 4.0.a-fixes
git cherry-pick 534ab26f191bb3fbef8bc0b05d5f13911112f106
</pre>
<p>Done — sources are now ready for compilation with the bugfix rolled in.</p>
<h2>Final Words</h2>
<p>Of course sometimes you won’t find a fix in <code>svn HEAD</code> and you have to do the heavy lifting yourself. Things may also get a bit messy when you want to introduce official fixes in sources you have already touched. Still, it should not be too hard — <code>git revert ...</code> and interactive rebasing are your friends.</p>
<p>I am in no way the official bugfix maintainer for Alfresco Community releases and I won’t be tracking <a title="Alfresco JIRA" href="https://issues.alfresco.com">Alfresco JIRA</a> for fixes in general. For the time being, I will only be fixing bugs that affect me.</p>
<p>But I would <strong>definitely appreciate</strong> people joining a collaborative bugfix approach as that may save us all some time and give us better software. Just drop me a line if you’d like to be added as a contributor (repo write access).</p>
<p>Update Okt 27, 2011:<br />
Tags and branches have been updated to 4.0.b.</p>
<p>Resources:</p>
<ul>
<li><a title="Alfresco Community Bugfixing" href="http://www.contentreich.de/alfresco-community-bugfixing">Alfresco Community Bugfixing</a></li>
<li><a title="Alfresco Community Bugfix Repository @ github" href="https://github.com/deas/alfresco/">Alfresco Community Bugfix Repository @ github</a></li>
<li><a title="git-svn-tutorial" href="http://trac.parrot.org/parrot/wiki/git-svn-tutorial">git-svn-tutorial</a></li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://www.contentreich.de/alfresco-community-rw-source-repository-available-bugfixes/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Using an Embedded REPL to Accelerate Development (Example: Alfresco)</title>
		<link>http://www.contentreich.de/using-an-embedded-repl-to-accelerate-development-example-alfresco</link>
		<comments>http://www.contentreich.de/using-an-embedded-repl-to-accelerate-development-example-alfresco#comments</comments>
		<pubDate>Tue, 18 Oct 2011 09:00:41 +0000</pubDate>
		<dc:creator>Andreas Steffan</dc:creator>
				<category><![CDATA[Alfresco]]></category>
		<category><![CDATA[Groovy / Grails]]></category>
		<category><![CDATA[Spring]]></category>
		<category><![CDATA[JVM]]></category>
		<category><![CDATA[Open Source]]></category>
		<category><![CDATA[REPL]]></category>

		<guid isPermaLink="false">http://www.contentreich.de/?p=1096</guid>
		<description><![CDATA[For me, waiting is by far the worst part of development. depending on the environment, the build and deploy phases of the code-build-deploy-test development cycle can really take a significant share of your implementation time. There are various approaches addressing this annoying problem. This post discusses leveraging an embedded Read-Eval-Print-Loop . <a href="http://www.contentreich.de/using-an-embedded-repl-to-accelerate-development-example-alfresco">Weiterlesen <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p><img class="alignleft size-full wp-image-1098" title="Alfresco Javascript Shell" src="http://www.contentreich.de/wp-content/uploads/2011/10/alfresco-rhino-shell.png" alt="Javascript REPL embedded in Alfresco" width="275" height="275" /></p>
<p>Waiting time during build and deployment phases of the code-build-deploy-test cycle can really be an annoying part of development. The amount of time “wasted” depends on various project “ingredients” — environment, experience, programming language, application bootstrap and system resources to name a few. The fact that PHP, Rails (and others) eliminate and/or keep these times at a minimum is a key factor of their success.</p>
<p>Long build/deployment times also have consequences. As a developer, you think twice whether you’ll “try out” something or not. But trying things out and exploring is important to get it right and gain experience.</p>
<p>Most Java based applications have a habit of making the developer wait. Today we have various approaches cutting this time on the JVM. <a title="JRebel" href="http://www.zeroturnaround.com/jrebel/">JRebel</a> is one, dynamic languages are another.</p>
<h2>REPLs help exploring — and exploring is important</h2>
<p>REPLs (Read-Eval-Print-Loops) are a beautiful tool to quickly explore and understand — very important as things tend to get more and more complex. On the JVM, most of the popular (dynamic) languages — Groovy, Ruby, Javascript, Scala and Clojure ship at least a console based one.</p>
<p>In order to explore your application you have to either bootstrap it within the REPL environment or embed the REPL in the JVM and provide it with access to your application. Grails supports this approach in general with its <a title="Grails Shell and Console" href="http://www.grails.org/Command+Line+Tools">Shell and Console</a>. Even though you can access and explore your bootstrapped application, it is not running within an appserver so you cannot use it with a browser.</p>
<h2>REPL exploration approach has broad scope</h2>
<p>Roughly a year ago, inspired by the Grails tools and the idea of embedding a <a title="Embedding a Groovy Console" href="http://groovy.codehaus.org/Embedding+a+Groovy+Console+in+a+Java+Server+Application">Groovy REPL in an App-Server</a> I was wondering if a similiar helpful solution could be quickly implemented for the <a title="Alfresco" href="http://www.alfresco.com">Alfresco</a> Repository.  I had a few tweets going back and forth with Peter Monks and a few others and started off using Groovy at that time. Altough it was working, the “quick shot solution” did not really prove to be useful. The main reason was that code was still too verbose. It then became clear to me what Peter had in mind talking about a CMS-DSL. Besides, Alfresco has special challenges like transaction and security to tackle. (Other) Alfresco centric approaches like the ones implemented by Peter and Florian Maul  (Javascript Console) avoid these by not keeping state on the server and wrapping code in a transaction.</p>
<p>So the overall story was a bit broader in scope than I realized at first glance a year ago. The idea of an embedded REPL can be applied in various dynamic languages, and there may be application dependent special challenges.</p>
<h2>Alfresco implementation</h2>
<p>Driven by demand to get something useful working for the Alfresco scenario, I started all over with Javascript (rhino) instead of Groovy (Alfresco ships with a proven Javascript environment) — keeping in mind that the REPL idea is far more general.</p>
<p>I remixed ideas (and code ;) from various sources in a quick hack solution to get something usable quickly.  The outcome Alfresco application is a telnet based Javascript REPL similiar to <code>org.mozilla.javascript.tools.shell.Main</code> with additional functions <code>setUser</code>, <code>unsetUser</code>, <code>whoami</code>, <code>withTx</code> and the <a title="Alfresco Javascript Root Scope Objects" href="http://wiki.alfresco.com/wiki/4.0_JavaScript_API#Root_Scope_Objects">usual Alfresco Javascript objects</a> initialized.</p>
<p>Example Code:</p>
<pre class="brush: jscript; title: ; notranslate">
// User guest is default otherwise
setUser('admin');
// Works w/o TX
for each (var f in companyhome.children) { print(f.name); }

// Needs TX
withTx(function() {
  companyhome.createFile(&quot;shell.txt&quot;).content = &quot;Hallo World !&quot;;
});
// Restore default user guest
unsetUser();
whoami(); // guest
</pre>
<p>Below, you can find links to the source of the general Spring based REPL embedding code, the Alfresco extension (source and binary amp ready for deployment). At this time, the only “ready to use” application code is the Alfresco repository extension. But it should not be too hard hacking the code to implement a REPL based on another language (most ship a console application) or UI (in case you want to control the “security hole” it exposes at runtime — i.e. in a production system :).</p>
<p>The repository extension code should work with all community versions from 3.4 up to 4.0.a. Please remember that it is a quick hack so far. It works for me, but it may eat your system.</p>
<p>To try out the repository extension:</p>
<ul>
<li>Deploy <code>alfresco-scripting-tools-1.0.amp</code></li>
<li>Go to <code>http://localhost:8080/alfresco/service/api/javascript/service</code> and enable it</li>
<li><code>telnet localhost 6790</code></li>
<li>Type <code>help();</code> and try some Javascript</li>
</ul>
<p>I have a lot of potential ideas what to implement next with a Groovy based DSL on the very top of that list. But before going further, practice has to prove that I really eat my own dogfood. :)</p>
<p>I would appreciate if you drop me a line in case you find this useful.</p>
<p>Resources:</p>
<ul>
<li><a title="Alfresco and Groovy, Baby !" href="http://blogs.alfresco.com/wp/pmonks/2010/08/19/alfresco-and-groovy-baby/">Alfresco and Groovy, Baby!</a></li>
<li><a title="Alfresco Javascript Console" href="http://code.google.com/p/share-extras/wiki/JavascriptConsole">Alfresco Javascript Console</a></li>
<li><a title="Grails Command Line Tools" href="http://www.grails.org/Command+Line+Tools">Grails Command Line Tools</a></li>
<li><a title="Embedding a Groovy Console" href="http://groovy.codehaus.org/Embedding+a+Groovy+Console+in+a+Java+Server+Application">Embedding a Groovy Console in a Java Server Application</a></li>
<li><a title="Github Scripting Tools Repository" href="https://github.com/deas/scripting-tools">Github Scripting Tools Repository</a></li>
<li><a title="Github Alfresco Scripting Tools Repository" href="https://github.com/deas/alfresco-scripting-tools">Github Alfresco Scripting Tools Repository</a></li>
</ul>
<p><a  title='Alfresco Scripting Tools Repository Extension' href='http://www.contentreich.de/?wpdmact=process&did=Ny5ob3RsaW5r' style="background:url('http://www.contentreich.de/wp-content/plugins/download-manager/icon/download.png') no-repeat;padding:3px 12px 12px 28px;font:bold 10pt verdana;">Download Alfresco Scripting Tools Repository Extension</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.contentreich.de/using-an-embedded-repl-to-accelerate-development-example-alfresco/feed</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Alfresco Community Bugfixing</title>
		<link>http://www.contentreich.de/alfresco-community-bugfixing</link>
		<comments>http://www.contentreich.de/alfresco-community-bugfixing#comments</comments>
		<pubDate>Wed, 27 Jul 2011 08:20:58 +0000</pubDate>
		<dc:creator>Andreas Steffan</dc:creator>
				<category><![CDATA[Alfresco]]></category>
		<category><![CDATA[Open Source]]></category>

		<guid isPermaLink="false">http://www.contentreich.de/?p=1047</guid>
		<description><![CDATA[Some people are running Alfresco Community in production - "officially unsupported". What do you do when you get affected by a production critical bug ? <a href="http://www.contentreich.de/alfresco-community-bugfixing">Weiterlesen <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<div class="alignleft labeledImage "><img class="alignnone size-full wp-image-791" title="Cockroach" src="http://www.contentreich.de/wp-content/uploads/2011/07/146627814_e6780d7092_blog.jpg" alt="Cockroach on palm" width="275" height="275" /><a class="license-cc" href="http://www.flickr.com/photos/scragz/146627814/sizes/l/in/photostream/"></a></div>
<p>All non trivial software has bugs — that’s just the ways it is. Alfresco is no exception — neither Enterprise nor Community edition. The major difference between these two versions is that you pay a subscription which provides support in case you run into “some kind of trouble” with the Enterprise product — bugs being a special case. We once bumped into a CMIS-QL problem with the Enterprise edition and Alfresco support provided us with a patch quite quickly. I have not checked whether this fix has has found its way into the Community edition.</p>
<p>Enterprise edition and the new Alfresco Team product may not be “the right” choice either for cost or other reasons. I fully understand that providing product support boils down to cost and hence, restricting flexibility of a product (Alfresco Team) is one approach to cut effort.</p>
<p>Anyways, I am sure there is still a significant amount of “brave” people (like us ;) running Alfresco Community in production.</p>
<p>What do we do, when we get affected by a production critical bug (happened to us more than once) ?</p>
<p>Alfresco and certified partners don’t help, now what ?</p>
<p>When I found ourselves in this situation, I usually googled and worked my way through the forums and JIRA picking up hints on the way. I cannot remember a single case where we have found a patch “ready to apply” against an official release, so usually, we had to fix the release code revision (as in svn) ourselves (the hints picked up during investigation more or less helpful). A few weeks ago it was <a href="http://issues.alfresco.com/jira/browse/ALF-2880">ALF-2880</a> (patch against 3.4c below) and <a href="http://issues.alfresco.com/jira/browse/ALF-6182">ALF-6182</a>.</p>
<p>I wish we (as the community) had something — a system and/or process to support our bugfixing needs. A place to exchange community release (bugfix) patches. Google Code, github, sourceforge all work fine for extensions, but they don’t work well for “core changes”. Of course we could (technically) just attach patches to the JIRA issues, but I’m not sure whether that is fine with Alfresco people.</p>
<p>Anyone else feeling the need for better bugfix support in Alfresco Community ?</p>
<p>PS: We have been asked quite a few times what exactly is covered by Enterprise support subscription and how to handle the support situation when Community edition is used.</p>
<p><strong>Update 04.08.2011</strong></p>
<p>Alfresco JIRA <a href="http://issues.alfresco.com/jira/browse/ALF" title="ALF Project Description">ALF project description</a> states:</p>
<blockquote><p>Global project for Alfresco development — for Community issues,</p></blockquote>
<p>Maybe I get something wrong, but I don’t quite understand why <a href="http://issues.alfresco.com/jira/browse/ALF-2880" title="ALF-2880">ALF-2880</a> (as an example) gets updated to</p>
<p>Resolution: Fixed<br />
Fix Version/s: 3.3.5, 3.4.0 Enterprise</p>
<p><a  title='ALF-2880 3.4c Community Fix' href='http://www.contentreich.de/?wpdmact=process&did=Ni5ob3RsaW5r' style="background:url('http://www.contentreich.de/wp-content/plugins/download-manager/icon/download.png') no-repeat;padding:3px 12px 12px 28px;font:bold 10pt verdana;">Download ALF-2880 3.4c Community Fix</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.contentreich.de/alfresco-community-bugfixing/feed</wfw:commentRss>
		<slash:comments>7</slash:comments>
		</item>
		<item>
		<title>Alfresco Team und Social Strategie verwirrt</title>
		<link>http://www.contentreich.de/alfresco-team-und-social-strategie-verwirrt</link>
		<comments>http://www.contentreich.de/alfresco-team-und-social-strategie-verwirrt#comments</comments>
		<pubDate>Thu, 23 Jun 2011 07:18:43 +0000</pubDate>
		<dc:creator>Andreas Steffan</dc:creator>
				<category><![CDATA[Alfresco]]></category>
		<category><![CDATA[Collaboration]]></category>
		<category><![CDATA[ECM]]></category>
		<category><![CDATA[Open Source]]></category>
		<category><![CDATA[Teamwork]]></category>

		<guid isPermaLink="false">http://www.contentreich.de/?p=996</guid>
		<description><![CDATA[Social, Social, Social und nun dieser Launch von Alfresco Team. Die Ereignisse der letzten Zeit scheinen im Alfresco Umfeld für Verwirrung gesorgt zu haben. <a href="http://www.contentreich.de/alfresco-team-und-social-strategie-verwirrt">Weiterlesen <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<div class="alignleft labeledImage "><img class="alignnone size-full wp-image-791" title="Verwirrung" src="http://www.contentreich.de/wp-content/uploads/2011/06/3706381958_a2a3b59e0e_blog.jpg" alt="Verwirrung" width="275" height="275" /><br />
<a class="license-cc" href="http://www.flickr.com/photos/wonderwebby/3706381958/"></a></div>
<p>Die Ereignisse der letzten Zeit, insbesondere die der letzten Tage scheinen im Alfresco Umfeld für Verwirrung gesorgt zu haben:</p>
<p>Das immer wieder genannte Commitment zu OpenSource, der neue Community Manager Jeff Potts, die Keynote von John Newton, die Jive Partnerschaft — Alfresco setzt auf Social im weitesten Sinne.</p>
<p>Am 17.06.2010 betont Alfresco Community Manager Jeff Potts die Bedeutung der Community in seinem Post <a href="http://blogs.alfresco.com/wp/with-commercial-open-source-innovation-happens-everywhere/">With Commercial Open Source, Innovation Happens Everywhere</a> auf socialcontent.com, am 20.06 launcht Alfresco ihr neues Produkt <a href="http://team.alfresco.com/">Alfresco Team</a>. Überrascht also versuche ich zu verstehen wie Team ins Bild passt.</p>
<p>Ok, dass es Alfresco Bedarf jenseits des Enterprise Preissegmentes gibt war klar. Absolut in Ordnung, dass Alfresco selbst einen Teil des Kuchen abhaben will. Die Idee ist nun ein relativ starres Collaboration-Produkt (mit wirklich tollen <a href="http://team.alfresco.com/#/features">Features </a>!) für einen kleinen Preis anzubieten. Natürlich, <a href="http://team.alfresco.com/support/customizations">schränkt man die Flexibilität ein</a>, laufen intern weniger Support-Aufwände auf, s.d. man günstiger anbieten kann.</p>
<p>Wie aber stellt sich die Situation anderen Parteien dar ?</p>
<h2>Aus  Kundensicht</h2>
<p>Der Einstieg in Alfresco Collaboration wird mit Team sehr einfach: Runterladen, interaktiven Installer laufen lassen, ein bisschen mit Browser konfigurieren — fertig. In einem <a title="Alfresco Team Preise" href="http://team.alfresco.com/#/buy">kleinen Rahmen</a> kann man nun ein tolles qualitätsgesichertes Produkt sogar kostenlos nutzen. Braucht man Support oder mehr User sind die Kosten überschaubar.</p>
<p>Was aber macht man, wenn man nicht erlaubte Änderungen braucht ?<br />
Im Grunde gibt es hier zwei Wege:</p>
<ol>
<li>Upgrade auf Enterprise</li>
<li>Migration auf Community</li>
</ol>
<p>Der erste Weg ist wegen der damit verbundenen Kosten für das eine oder oder andere Unternehmen vielleicht nicht möglich. Im zweiten Szenario gibt man mindestens den Support auf.</p>
<p>Was also tun ?</p>
<h2>Aus Community Sicht</h2>
<p>In <a title="Alfresco Team auf ecmarchitect" href="http://ecmarchitect.com/archives/2011/06/21/1413">Alfresco launches Team for Departments and SMBs</a> sagt Jeff Potts unter anderem, das Quellen der Neuerungen (und der  IOS Applikationen) Open Source sein werden und in die nächsten Community und Enterprise Releases eingehen werden. Trotzdem ist mir persönlich unverständlich warum das Produkt und der Code auf diese Art und Weise urplötzlich der “Welt” vorgestellt werden.</p>
<p>Speziell unter dem Gesichtspunkt “Community als Innovationsmotor” passt Alfresco Team bei mir nicht ins Bild. Im <a title="Loftux Blog Post zu Alfresco Team und Community" href="http://loftux.com/2011/06/21/alfresco-team-do-smbs-innovate/">Loftux Blog</a> sieht man Gedanken von anderen Leuten die offensichtlich Schwierigkeiten haben das Vorgehen von Alfresco nachzuvollziehen.</p>
<p>PS: Überhaupt haben ich persönlich als Teil der Community manchmal das Problem zu verstehen, wie Alfresco sich seine Community-Mitglieder wünscht. Wenn man sich z.B. Gruppen in Business-Netzwerken wie xing oder linkedin anschaut kann man fast das Gefühl bekommen das Alfresco Mitarbeiter dort grundsätzlich nicht auf Fragen eingehen — im Gegensatz zu Plattformen die Alfresco gehören (wie z.B. im Forum). Missverständnisse jedenfalls bauen am Ende kein Vertrauen auf (Social Web !) .</p>
<h2>Aus Partner/Dienstleister Sicht</h2>
<p>Wegen der erheblich eingeschränkten Möglichkeiten der Anpassung (Kerngeschäft vieler Dienstleister !) sehe ich für uns und unsere Kunden nicht, wie wir die supportete Variante sinnvoll einsetzen können. Außer vielleicht jetzt ganz aktuell um mal kurz (mit einem stabilen Stand) zu “spielen” und zu sehen was an Funktionalität in Community — und Enterprise Edition kommt. Selbst wenn ein Kunde nach einem Test mit dem Produkt “out of the box” wunschlos glücklich ist hätte ich ein Problem mit gutem Gefühl anzubieten — es sei denn allen Beteiligten ist zu 100% klar wie man verfährt, wenn Anpassungen erforderlich werden die bei Team nicht “erlaubt” sind.</p>
<p>Ich bin wirklich sehr gespannt wie sich dieses Produkt am Markt behaupten wird.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.contentreich.de/alfresco-team-und-social-strategie-verwirrt/feed</wfw:commentRss>
		<slash:comments>9</slash:comments>
		</item>
	</channel>
</rss>

