<?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>Fri, 18 May 2012 16:54:26 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.2</generator>
		<item>
		<title>Mixing Grails and Alfresco Share</title>
		<link>http://www.contentreich.de/mixing-grails-and-alfresco-share</link>
		<comments>http://www.contentreich.de/mixing-grails-and-alfresco-share#comments</comments>
		<pubDate>Tue, 08 May 2012 08:35:06 +0000</pubDate>
		<dc:creator>Andreas Steffan</dc:creator>
				<category><![CDATA[Alfresco]]></category>
		<category><![CDATA[Groovy / Grails]]></category>
		<category><![CDATA[Spring]]></category>
		<category><![CDATA[Collaboration]]></category>
		<category><![CDATA[Open Source]]></category>
		<category><![CDATA[Share]]></category>

		<guid isPermaLink="false">http://www.contentreich.de/?p=2223</guid>
		<description><![CDATA[The Alfresco Share application and the Surf framework have weaknesses and our mileage varies. Grails is based on Spring MVC as well any may help overcome shortcomings. <a href="http://www.contentreich.de/mixing-grails-and-alfresco-share">Weiterlesen <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<div class="alignleft labeledImage ">
<img src="http://www.contentreich.de/wp-content/uploads/2012/05/5084702426_b59f61346d_blog.jpg" alt="Tequila Sunrise" title="Tequila Sunrise" width="275" height="275" class="alignleft size-full wp-image-2222" />
</div>
<p>Alfresco Share and Spring Surf offer a nice extensible foundation for various kinds of content based applications. For some applications, it requires just a few tweaks to Share and you are done. In other situations, you might encounter bigger challenges remaining. Or maybe it is just that you do not feel comfortable with the way things are &#8220;usually&#8221; done in Share &#8211; like Freemarker templating or its typical Javascript.</p>
<p>Lets be honest: The Share application and the framework also do have weaknesses and our mileage varies.</p>
<p>Personally, I don&#8217;t really like the server side Javascript (Link to other post below). Besides, I have seen other requirements, like database access or security which provided food for thought.</p>
<h2>Make Sense &#8230; and Fun !</h2>
<p>I like Grails and the Groovy way &#8211; because it can be really productive (and fun !) once you passed the first hurdles and left the initial pain behind.</p>
<p>For quite some time, I was thinking about how to make sense of Groovy/Grails and the Alfresco stack at the same time (&#8230; and I don&#8217;t care if I&#8217;m the only one on the planet ;). In the past, there have been efforts getting these together at small scale &#8211; e.g. the introduction of Groovy (Web)Scripting.</p>
<p>This is about a large scale approach. As both, Spring Surf and Grails are based on Spring MVC, I was wondering whether they can be mixed in a single webapp and how nice they play together. With Alfresco Share the only Spring Surf application at hand, I started merging the whole beast with Grails &#8211; as a plugin. The dependency (hell) problem to overcome was expected. The only other one was due to a problem with absolute paths used by Alfresco Share to resolve Javascript imports (patch coming). In the end, I think these technologies play together at better than expected.</p>
<p>Here is a short demo video of the Alfresco Share Grails Plugin:</p>
<div class="post clearfix withThumb featured">
<p><a href="http://www.youtube.com/watch?v=T3a0_dUPRoU">http://www.youtube.com/watch?v=T3a0_dUPRoU</a></p>
</div>
<p>If you would like to try it, out follow the steps below:</p>
<pre class="brush: plain; title: ; notranslate">
#
# Make sure you have grails 2.0.x installed and
# an alfresco repository ready to serve at
# http://localhost:8080/alfresco
#
grails create-app gshare
cd gshare
#
# add mavenRepo &quot;http://vcs.contentreich.de/m2&quot;
# to grails-app/conf/BuildConfig.groovy
#
grails install-plugin alfresco-share 0.1
grails -Dserver.port=9080 run-app
#
# You are in the business now ;)
#
# Share is at http://localhost:9080/page
#
</pre>
<h2>Where to go next</h2>
<p>As the plugin code is standing there now, it almost required no tweaking to Alfresco code at all. The library-dependency situation should stay stable for a little while, so I hope overall maintainance effort is minimal. That is fairly important to me.</p>
<p>So Grails and Alfresco Share can be squeezed into one webapplication. I would be interested to know whether that can be done with the repo as well. ;)</p>
<p>Seriously, I have to say I&#8217;m not quite sure yet where to go from here &#8211; suggestions welcome.</p>
<p><strong>Update:</strong> Jira issue with fix created</p>
<p><strong>References:</strong></p>
<ul>
<li><a href="https://github.com/deas/alfresco-share">Grails Alfresco Share Plugin @ github</a></li>
<li><a href="http://www.contentreich.de/why-groovy-scripting-rocks-use-case-alfresco">Why Groovy Scripting rocks : Use Case Alfresco</a>
<li><a href="http://stackoverflow.com/questions/3238562/getresourceasstream-fails-under-new-environment">getResourceAsStream fails under new environment?</a>
<li><a href="https://issues.alfresco.com/jira/browse/ALF-14000">Alfresco Jira resource loading issue</a></li>
<li><a href="http://www.flickr.com/photos/leszekleszczynski">Image Credits</a></li>
]]></content:encoded>
			<wfw:commentRss>http://www.contentreich.de/mixing-grails-and-alfresco-share/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Why Groovy Scripting rocks : Use Case Alfresco</title>
		<link>http://www.contentreich.de/why-groovy-scripting-rocks-use-case-alfresco</link>
		<comments>http://www.contentreich.de/why-groovy-scripting-rocks-use-case-alfresco#comments</comments>
		<pubDate>Tue, 17 Apr 2012 07:10:21 +0000</pubDate>
		<dc:creator>Andreas Steffan</dc:creator>
				<category><![CDATA[Alfresco]]></category>
		<category><![CDATA[Groovy / Grails]]></category>

		<guid isPermaLink="false">http://www.contentreich.de/?p=2160</guid>
		<description><![CDATA[Quick turnaround is a major benefit of embedding a dynamically typed language within a Java based application. But the actual choice of the language can still make a huge difference. <a href="http://www.contentreich.de/why-groovy-scripting-rocks-use-case-alfresco">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="Rockstar" src="http://www.contentreich.de/wp-content/uploads/2012/04/2188127164_6f818761ae_blog.jpg" alt="Image of guy rocking" width="275" height="275" /></div>
<p>Quick turnaround is a major benefit of embedding a dynamically typed language within a Java based application. Developers no longer need to restart the whole application or the entire server for certain types of changes.</p>
<p>On the JVM, we have various dynamically typed languages to choose from. Ruby, Groovy, Javascript, Python and Clojure are among the candidates. They all have pros and cons so the best choice depends on the use case. This post is about Groovys pros.</p>
<h2>Javascript in Alfresco</h2>
<p>The Alfresco repository (and Spring Surf as well) provides an embedded Javascript interpreter (Rhino). Quite a lot can be done with a few lines of Javascript. Turnaround is far better than what you have with Java language based coding.</p>
<p>Still, there are things which could be improved, including:</p>
<ul>
<li>Debugging Support</li>
<li>Code Reuse</li>
<li>Java Integration</li>
</ul>
<p>Java integration cannot really be fixed due to the very nature (i.e. concepts/keywords) of Javascript. Technically, you can access the Java world:</p>
<pre class="brush: jscript; title: ; notranslate">

var ctx = Packages.org.springframework.web.context.ContextLoader.getCurrentWebApplicationContext();

var nr1 = Packages.org.alfresco.service.cmr.repository.NodeRef.newInstance();

var nr2 = Packages.org.alfresco.service.cmr.repository.NodeRef.getConstructor(...).newInstance(...);
</pre>
<p>This works and gets the job done, but feels just plain wrong.</p>
<p>There are Javascript improvement efforts underway (links below) regarding debugging support and code reuse. I cannot really tell where they are headed now, but I hope at least the reuse changes make it into the core code soon.</p>
<h2>The Groovy Alternative</h2>
<p>Groovy is really outshining the competition addressing these issues. Super smooth Java integration is baked into the language. Debugging is based on JPDA/JDI &#8211; a very mature and perfectly supported technology. Even the code providing the embedded scripting was almost where I wanted it. Spring Surf sources include an extension (spring-webscripts-addon-groovy) which has a working <code>GroovyScriptProcessor</code>.</p>
<p>The only little <del datetime="2012-04-16T09:12:02+00:00">hack</del> tweak to get breakpoints working was to break Webscript naming convensions replacing the dot with an underscore. Hence <code>groovy.get.groovy</code> becomes <code>groovy_get.groovy</code>. Today, it is just a proof of concept but it works right as I would expect. Deploy the module, attach your IDE to the process, set a breakpoint and drive the application there:</p>
<div id="attachment_2158" class="wp-caption alignleft" style="width: 902px"><img class=" wp-image-2158" title="Groovy breakpoint in Alfresco Webscript" src="http://www.contentreich.de/wp-content/uploads/2012/04/alfresco-groovy-webscript-break.png" alt="Groovy breakpoint in Alfresco Webscript" width="892" height="537" /><p class="wp-caption-text">Groovy breakpoint in Alfresco Webscript</p></div>
<p>Below is a link to the sources and a ready made module just in case you&#8217;d like to try it out. Honestly, I think Groovy deserves a little more attention in the Alfresco ecosystem. I am volunteering to push a little further.</p>
<h2>Other Languages</h2>
<p>In the Alfresco Repository/Spring Surf use case, I personally think you cannot beat Groovy. The only other <code>ScriptProcessor</code> I&#8217;m aware of is the Clojure based implementation. No doubt &#8211; the OOP <-> FP language border is rough, but Clojure is a beautiful language well worth it compared to &#8230; ;) Clojures REPL based development model makes it very appealing to me. I only had a quick glimpse at <code>lambda-alf</code> so far, but I will definitely have another closer look soon.  I would pick Clojure next because I enjoy the language &#8211; your mileage may vary.</p>
<p>PS: Just in case you look at my code and wonder what is going on in <code>DebuggableGroovyScriptProcessorFactory</code>:<br />
I wanted to reuse all the repository <code>baseJavaScriptExtension</code>s without compile time dependencies so the  same Groovy <code>ScriptProcessor</code> works in Surf Apps just as well. The reflection mess is just the struggle with the type system.</p>
<p><strong>Update April 19, 2012</strong>:</p>
<ul>
<li>Forked spring-webscripts-addon-groovy at github</li>
<li>Added Peters post to the references</li>
</ul>
<p><strong>References:</strong></p>
<ul>
<li><a href="https://github.com/deas/contentreich-alf-repo-sandbox">Alfresco module source code @ github</a></li>
<li><a href="https://github.com/deas/spring-webscripts-addon-groovy-cr">Fork of spring-webscripts-addon-groovy @ github</a></li>
<li><a href="http://blogs.alfresco.com/wp/pmonks/2010/08/19/alfresco-and-groovy-baby/">Alfresco and Groovy, Baby!</a></li>
<li><a href="http://axel-faust.de/?p=75&#038;lang=en">Script imports with a cleaner API</a> (Alfresco/Rhino)</li>
<li><a href="http://axel-faust.de/?p=47&amp;lang=en">Debugging Alfresco #1 – Eclipse JavaScript Debugger and Alfresco Repository</a> (Rhino/JSDT)</li>
<li><a href="http://blog.alfrescian.com/?p=202">Getting Alfresco Content Types via JavaScript</a></li>
<li><a href="https://github.com/skuro/lambdalf">lambdalf</a> (Clojure flavour for Alfresco)</li>
<li><a title="Image Credits" href="http://www.flickr.com/photos/adampenney/">Image Credits</a></li>
<li><a href="http://therobot.tumblr.com/post/26900072/emacs-outshines-all-other-editing-software-in" title="Emacs outshines competition">Definition of &#8220;outshine&#8221;</a></li>
</ul>
<p><a  title='Contentreich Alfresco Repo Sandbox Module' href='http://www.contentreich.de/?wpdmact=process&did=MTAuaG90bGluaw==' 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 Contentreich Alfresco Repo Sandbox Module</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.contentreich.de/why-groovy-scripting-rocks-use-case-alfresco/feed</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Wir realisieren Alfresco Community Projekte &#8211; aber nicht kostenlos!</title>
		<link>http://www.contentreich.de/wir-realisieren-alfresco-community-projekte-aber-nicht-kostenlos</link>
		<comments>http://www.contentreich.de/wir-realisieren-alfresco-community-projekte-aber-nicht-kostenlos#comments</comments>
		<pubDate>Mon, 02 Apr 2012 08:00:37 +0000</pubDate>
		<dc:creator>Sandra Martin</dc:creator>
				<category><![CDATA[Alfresco]]></category>
		<category><![CDATA[Content-Management]]></category>

		<guid isPermaLink="false">http://www.contentreich.de/?p=1997</guid>
		<description><![CDATA[Es ist nicht unüblich, dass Interessenten mit umfangreichen Projektanforderungen ein Festpreisangebot ohne Beauftragung einer Konzeptionsphase einfordern. <a href="http://www.contentreich.de/wir-realisieren-alfresco-community-projekte-aber-nicht-kostenlos">Weiterlesen <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>Als Dienstleister und Berater für ECM Lösungen erhalten wir immer öfter Projektanfragen für eine Umsetzung mit der Alfresco Community Software.</p>
<p>Alfresco bietet den Rahmen für Dokumentenverwaltung, Collaboration, Web-Content-Management uvm. und lässt sich sehr gut um kunden- und branchenspezifische Anforderungen erweitern.</p>
<p><img class="alignleft size-full wp-image-2131" title="Gratiskonzept" src="http://www.contentreich.de/wp-content/uploads/2012/03/Gratiskonzept.gif" alt="" width="275" height="275" /><strong>Es ist nicht unüblich, dass Interessenten mit umfangreichen Projektanforderungen <strong>ein Festpreisangebot</strong> ohne Beauftragung einer Konzeptionsphase einfordern</strong>.</p>
<p>Häufig führen viele Wege zum Ziel, es ist uns wichtig <strong>den für den Kunden besten Weg</strong> auszuarbeiten. Als Dienstleister muss ich das Geschäft und die Business Prozesse meines Kunden verstehen, um ihn optimal zu beraten. Für ein komplexes Anforderungspaket muss aus unserer Sicht ein technisches Konzept erstellt werden. Für dies Konzeptionsphase werden Ressourcen mit fachlichen/technischen Know-how benötigt. Auch ein Dienstleister im Bereich der Alfresco Community Software kann diese Tätigkeit üblicherweise nicht kostenlos anbieten. Oft macht im Vorfeld zusätzlich eine kostenpflichtige 2 bis 5-tägige Proof of Concept Phase gemeinsam mit dem Kunden Sinn.</p>
<p>Nachfolgend möchten wir aufzeigen, bei welchen Anforderungen eine zusätzliche Konzeptionsphase eingeplant werden sollte und welche Implementierungskosten durch die kundenspezifische Erweiterung eines vermeintlich &#8220;kostenlosen&#8221; Open Source ECM Produktes verursacht werden können.</p>
<p>Wir unterteilen Projektanfragen in die Kategorien klein, mittel, groß.</p>
<p><strong> „klein“</strong><br />
Der Kunde hat sich die Alfresco Community Lösung bereits angeschaut. Die „out of the box“ Funktionalitäten bilden seine Anforderungen an das System ab. Er benötigt noch 1 &#8211; 2 Tage Beratung, Schulung oder Anpassung um effektiver mit dem System arbeiten zu können.</p>
<p>&#8211;&gt; Kosten ca. 600 bis 1500 Euro netto je nach Umfang</p>
<p><strong>„mittel“</strong><br />
Der Kunde hat sich die Alfresco Community Lösung bereits angeschaut. Die „out of the box“ Funktionalität bildet 80% seiner Anforderungen an das System ab. Er benötigt noch 5 bis 15 Tage Beratung, Schulung und Anpassungen an das System. Auch hier macht die Beauftragung einer eintägigen Konzeptionsphase gemeinsam mit dem Kunden oft Sinn.</p>
<p>Anpassungen könnten sein:</p>
<ul>
<li>kundenspezifischer einfacher Business Prozess</li>
<li>kundenspezifische Metadaten</li>
<li>Oberflächendesign anpassen</li>
<li>Site Template</li>
<li>einfache Anpassung am Rollen / Rechte Modell</li>
</ul>
<p>&#8211;&gt; Kosten ca. 3200 bis 9600 Euro netto je nach Umfang</p>
<p><strong>„groß“</strong><br />
Umfangreiche Ausschreibungsunterlagen oder Excel Sheets mit nachfolgendem Anforderungspaketen:</p>
<ul>
<li>Übernahme von bestehenden Daten</li>
<li>Abbildung von kundenspezifischen Business Prozessen</li>
<li>Modellierung eines kundenspezifischen Datenmodel</li>
<li>kundenspezifische Metadaten</li>
<li>erweiterte Suchmöglichkeiten</li>
<li>projektbezogene E-mail Archivierung</li>
<li>Anbindung Fax- und Scannsoftware</li>
<li>Integration von unterschiedlichen Microsoft Office Produkten</li>
<li>CIFS Anbindung</li>
<li>CMIS Integration an andere Systeme</li>
<li>revisionssichere Datenspeicherung</li>
<li>Replikation der Daten über mehrere verteilte Systeme (z.B. Filialen im Ausland, Rechenzentren)</li>
<li>Datensicherung und Restore Möglichkeiten usw.</li>
<li>komplexe Sicherheitsanforderungen</li>
</ul>
<p>&#8211;&gt; Kosten liegen abhängig von Umfang und Projektlaufzeit im fünf- oder sechsstelligen Bereich (siehe Aufstellung unten)</p>
<p>Bei &#8220;großen&#8221; Projekten werden sehr häufig die Kosten für die Konzeptions- und Implementierungsphase unterschätzt.</p>
<p>Anbei ein Rechenbeispiel für ein Projekt mit 6 Monaten Laufzeit in Anlehnung an die <a href="http://www.alfresco.com/de/resources/research/forrester/total-economic-impact-of-alfresco/" target="_blank">Forrester Studie „The Total Economic Impact Of Alfresco Enterprise Content Management Solution“</a> um unsere Erfahrungswerte aus Deutschland ergänzt:</p>
<table cellspacing="0" cellpadding="0">
<tbody>
<tr>
<td valign="top" width="300px">Projektlaufzeit</td>
<td valign="top">6 Monate</td>
</tr>
<tr>
<td valign="top">1 interner Projektmitarbeiter</td>
<td valign="top">37.500 Euro</td>
</tr>
<tr>
<td valign="top">2 externe Alfresco Spezialisten (70 Euro/Stunde, 8-Stunden Tag, 110 Tage)</td>
<td valign="top">123.200 Euro</td>
</tr>
<tr>
<td valign="top">Hardwarekosten (Entwicklungs-, Integrations- und Produktivumgebung); Schulungskosten; kleinere Unterstützungen oder Upgrades für zwei Folgejahre</td>
<td valign="top">ca. 15.000 bis 20.000 Euro</td>
</tr>
<tr>
<td valign="top"><strong>GESAMTKOSTEN</strong></td>
<td valign="top"><strong>ca. 180.000 Euro</strong></td>
</tr>
</tbody>
</table>
<p><strong>Zusätzlich</strong> zu diesen Kosten wird in der Forrester Analyse ein Enterprise Abonnement mit 24&#215;7 Service in Höhe einer jährlichen Gebühr von ca. 75.000 Euro ($ 100.000) für zwei Folgejahre beziffert.</p>
<p>Welche Vor- / Nachteile und Risiken müssen beim Einsatz der &#8220;kostenlosen&#8221; Community Software betrachtet werden?</p>
<p><strong>Vorteile:</strong><br />
Einsparungen von ca. 75.000 Euro für Service/Support Gebühren <strong>jährlich</strong> (in Anlehnung an die Forrester Studie).</p>
<p><strong>Nachteile:</strong></p>
<ul>
<li>keine Nutzung der Alfresco Enterprise Edition</li>
<li>kein Alfresco Technical Support Services 24/7 für businesskritische Anwendungen</li>
<li>kein Wartungs-Releases, Patches und Hotfixes</li>
<li>keine zugesicherte Qualitätssicherung (QS)-Verfahren</li>
<li>keine Plattform-Unterstützung</li>
</ul>
<p><strong>weitere Risiken:</strong></p>
<ul>
<li>der Kunde trägt das Risiko bei Softwarefehlern am Kern der Community Lösung (Hot-Fixes müssen zusätzlich beauftragt werden),</li>
<li>keine vorgefertigten Alfresco Schulungsunterlagen,</li>
<li>keine supported Plattformmatrix</li>
<li>und auch neue Funktionalität die manchmal noch nicht im Enterprise-Stadium getestet ist :) .</li>
</ul>
<p>Achtung(!): Die o.g. Einsparungen ändern nichts an der Höhe der anfallenden Konzeptions- und Implementierungskosten, diese Aufwände entstehen bei der Enterprise und der Community Lösung gleichermaßen.</p>
<p><strong>Fazit aus unserer Sicht ist: </strong></p>
<p>Bei &#8220;kleineren&#8221; und &#8220;mittleren&#8221; Projekten können die Folgekosten beim Einsatz der Alfresco Community Lösung erheblich gesenkt werden. Die Risiken für nicht-business-kritische Projekte sind überschaubar.</p>
<p>Bei &#8220;großen&#8221; Projekten werden die Folgekosten (Service/Support Gebühren) ebenfalls  gesenkt, aber auf die Kosten für die Konzeption und Implementierung hat die Wahl Community oder Enterprise Version keine Auswirkungen. Generell ist bei &#8220;großen&#8221; ECM Projekten die Aufteilung in kleinere Teilprojekte (auch hinsichtlich der Risiko-Minimierung) sinnvoll.</p>
<p>Bei hochverfügbaren business-kritischen Systemen würden wir unseren Kunden eher zum Einsatz der Enterprise Edition und dem damit verbundenen Enterprise Support raten.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.contentreich.de/wir-realisieren-alfresco-community-projekte-aber-nicht-kostenlos/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Generic Brute Force SQL-Search &#8211; Groovy Style</title>
		<link>http://www.contentreich.de/generic-brute-force-sql-search-groovy-style</link>
		<comments>http://www.contentreich.de/generic-brute-force-sql-search-groovy-style#comments</comments>
		<pubDate>Mon, 26 Mar 2012 08:36:03 +0000</pubDate>
		<dc:creator>Andreas Steffan</dc:creator>
				<category><![CDATA[Alfresco]]></category>
		<category><![CDATA[Groovy / Grails]]></category>
		<category><![CDATA[Analysis]]></category>
		<category><![CDATA[Database]]></category>

		<guid isPermaLink="false">http://www.contentreich.de/?p=1886</guid>
		<description><![CDATA[Assume you are given a rdbms schema you are not familiar with and you are wondering where a piece of information is stored. This post introduces a groovy approach to find a given string in any string type text column in any rdbms. <a href="http://www.contentreich.de/generic-brute-force-sql-search-groovy-style">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="Hulk" src="http://www.contentreich.de/wp-content/uploads/2012/03/hulk.jpg" alt="Hulk" width="275" height="275" /></div>
<p>Assume you are given a rdbms schema you are not familiar with and you are wondering where a piece of information is stored. To me, this happens every now and then. A few days ago, a customer asked me to create a report based on data in his ERP database. Unfortunately it turned out that the schema was hosted in MS SQL Server, fairly big (roughly 100 tables with 30-40 columns on average), and looked meaningless to me (table- and column names). I remembered that ages ago, a colleague mentioned that he had written a tool addressing this kind of developer/admin problem. I never got to see it. Nevertheless, my current requirement made me revisit the idea. I really tried hard finding something ready to download and run &#8211; and failed &#8211; did not even find something close.</p>
<h2>Quick, but not dirty !</h2>
<p>To come up with something quickly, I picked Groovy. All of a sudden, an ugly reverse engineering task showed some beautiful aspects. I don&#8217;t want to praise the details of Groovy again. It just proved to be <strong>AWESOME</strong> in this case. Special thanks go to @mrhaki for his inspiring and practical posts. There is a link to the source at the bottom if you are interested. A few final remarks before you blow up your system:</p>
<pre class="brush: plain; title: ; notranslate">

$ ./DBBFSearch.groovy
error: Missing required options: v, U
usage: DBBFSearch -h -u userid -p password -v value -U url -d driver -j
                  jar -f function -m -q -s
 -d,--driver &lt;driver&gt;       Driver class
 -f,--function &lt;function&gt;   Column function
 -h,--help                  help
 -j,--jar &lt;jar&gt;             Jar file containing driver
 -m,--matches               Show row matches, default is count only
 -p,--password &lt;password&gt;   Password
 -q,--query                 Show SQL query
 -s,--substring             Substring search
 -U,--url &lt;url&gt;             Database URL
 -u,--userid &lt;userid&gt;       Userid
 -v,--value &lt;value&gt;         Value to search for

Example:
DBBFSearch -v findme \
-U 'jdbc:mysql://localhost/db?user=user&amp;password=pass' \
-j mysql:mysql-connector-java:5.1.6 -s -f lower
$
</pre>
<p>What I personally like most is the fact that you can execute it <strong>right away</strong>.</p>
<p>Here is a quick demo using <del datetime="2012-03-23T15:06:57+00:00">the customers ERP</del> my Alfresco schema searching for <code>admin</code>.</p>
<pre class="brush: plain; title: ; notranslate">

$ groovy https://raw.github.com/gist/2170917/a4e2af6cee3022b34fe5ec536d2c2b9ed9891c2a/DBBFSearch.groovy \
-v admin -U 'jdbc:mysql://localhost/alfresco?user=alfresco&amp;password=alfresco' \
-j mysql:mysql-connector-java:5.1.6 \
-f lower | grep '\] \['
alf_authority [1] [authority:1]
alf_child_assoc [2] [qname_localname:5]
alf_node [6] [audit_creator:16, audit_modifier:16]
alf_node_properties [1] [string_value:3]
$
</pre>
<p>The first line of output says the script looked at <em>one</em> column in the table <code>alf_authority</code> and found <em>one</em> row <code>authority</code> matching <code>admin</code>. The other lines have analogous meanings.</p>
<p>Just copying and pasting this commandline should work if you happen to have Groovy (>= 1.8.3 mostly because of the remote script execution) and the &#8220;usual developer alfresco database&#8221; &#8211; Trust me ! ;)</p>
<p>PS: With mysql I was sometimes executing things like</p>
<pre class="brush: plain; title: ; notranslate">

$ mysqldump --skip-extended-insert --user=alfresco \
--password=alfresco alfresco | \
grep www.alfresco.org &gt;/dev/null &amp;&amp; echo &quot;strike&quot;
strike
$
</pre>
<p>Sure, this approach has limitations. But sometimes it helps you getting at least basic information.</p>
<p>PPS: The Alfresco entity relationship diagram from the older post may be helpful if you really try digging in the Alfresco schema.</p>
<p>References:</p>
<ul>
<li><a href="https://gist.github.com/2170917">DBBFSearch gist</a></li>
<li><a href="http://mrhaki.blogspot.de">Messages from mrhaki</a></li>
<li><a href="http://www.contentreich.de/alfresco-entities-and-relationships" title="Alfresco Entities and Relationships [infographics]">Alfresco Entity Relationship diagram</a></li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://www.contentreich.de/generic-brute-force-sql-search-groovy-style/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Doppelte Alfresco Share Benutzer vermeiden</title>
		<link>http://www.contentreich.de/doppelte-alfresco-share-benutzer-vermeiden</link>
		<comments>http://www.contentreich.de/doppelte-alfresco-share-benutzer-vermeiden#comments</comments>
		<pubDate>Mon, 19 Mar 2012 10:45:02 +0000</pubDate>
		<dc:creator>Sandra Martin</dc:creator>
				<category><![CDATA[Alfresco]]></category>
		<category><![CDATA[Content-Management]]></category>
		<category><![CDATA[Dubletten]]></category>
		<category><![CDATA[Erweiterung]]></category>
		<category><![CDATA[Mitglieder]]></category>
		<category><![CDATA[Share]]></category>

		<guid isPermaLink="false">http://www.contentreich.de/?p=1860</guid>
		<description><![CDATA[Wie oft ist es euch passiert, dass ihr auf einer Share Site über die Funk­tion “Externe Benutzer hinzufü­gen” Mitglieder als "neue System Benutzer" ein­ge­laden habt, die bere­its im Sys­tem existieren?
Für ein Kun­den­pro­jekt haben wir über­legt, wie wir das Prob­lem dop­pelte Alfresco Share Benutzer anle­gen (inner­halb der Seite “Mit­glieder ein­laden”) mit geringem Aufwand min­imieren kön­nen. <a href="http://www.contentreich.de/doppelte-alfresco-share-benutzer-vermeiden">Weiterlesen <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p><img src="http://www.contentreich.de/wp-content/uploads/2012/03/User-Dubletten.jpg" alt="" title="Alfresco Share User Dubletten" width="275" height="275" class="alignleft size-full wp-image-1923" />Wie oft ist es euch passiert, dass ihr auf einer Share Site über die Funktion &#8220;Externe Benutzer hinzufügen&#8221; Mitglieder als &#8220;neue System Benutzer&#8221; eingeladen habt, die bereits im System existieren?<br />
Für ein Kundenprojekt haben wir überlegt, wie wir das Problem doppelte Alfresco Share Benutzer anlegen (innerhalb der Seite &#8220;Mitglieder einladen&#8221;) mit geringem Aufwand minimieren können. </p>
<p>Folgender Lösungsansatz wurde implementiert:</p>
<p><strong>Bereich 1 &#8220;Suche nach Mitarbeitern&#8221; (oben links)</strong></p>
<ul>
<li>die E-Mail Adresse des Benutzers definieren wir für diesen Lösungsansatz als eindeutigen, bekannten Schlüssel</li>
<li>das Feld &#8220;Suche&#8221; unter Schritte 1 &#8220;Suche nach Mitarbeitern&#8221; wurde um die Suche nach der E-Mail Adresse erweitert</li>
<li>die Suchergebnisse wurden um die Ausgabe der E-Mail Adresse ergänzt</li>
</ul>
<p><strong>Bereich &#8220;Externe Benutzer hinzufügen&#8221; (unten links)</strong></p>
<ul>
<li>das Feld &#8220;E-Mail&#8221; wurde als erstes Formularfeld nach oben verschoben</li>
<li>nach Eingabe der E-Mail Adresse und Verlassen des Feldes wird eine Suche nach der E-Mail Adresse angestoßen</li>
<li>bei positivem Suchergebnis geben wir eine Meldung aus, dass der Benutzer bereits im System existiert, der ermittelte Benutzer wird im oberen Bereich &#8220;Suche nach Mitarbeitern&#8221; als Suchergebnis eingeblendet und kann zum Bereich &#8220;Benutzer einladen&#8221; hinzugefügt werden</li>
<li>eine doppelte Anlage von Benutzern mit derselben E-Mail wird bei positivem Suchergebnis durch Ausblenden des &#8220;Hinzufügen&#8221; Buttons im unteren Bereich &#8220;Externe Benutzer hinzufügen&#8221; unterbunden</li>
<li>bei negativem Suchergebnis kann die Einladung des externen Benutzers wie gewohnt fortgesetzt werden</li>
</ul>
<p><em>Anmerkung: Ein 100% Lösungsansatz hätte direkt am Contentmodel erfolgen müssen, wäre aber aufwendiger gewesen und wurde daher verworfen.</em></p>
<p><strong>Hier eine kurzes Video zur Demonstration unserer Erweiterung:</strong></p>
<div class="post clearfix withThumb featured">
<p><a href="http://www.youtube.com/watch?v=A7iUpd5vc8A">http://www.youtube.com/watch?v=A7iUpd5vc8A</a></p>
</div>
<p>Wir freuen uns auch diesmal über Fragen, Anregungen, Kritik oder Lob von euch ;)</p>
]]></content:encoded>
			<wfw:commentRss>http://www.contentreich.de/doppelte-alfresco-share-benutzer-vermeiden/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<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 &#8211; and that may cause unexpected results. This post outlines an approach to change the system in order to get something &#8220;close to&#8221; 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 &#8220;last writer wins&#8221;. A typical sequence of events goes:</p>
<ul>
<li>You open the editing form for one item two times &#8211; 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&#8217;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 &#8220;Almost&#8221; 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&#8217;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 &quot;Optimistic Locking&quot; 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 &#8220;accidentally overwritten&#8221; 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 &#8220;<code>select ... for update</code>&#8221; 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>2</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 &#8220;out of the box&#8221; 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 />
&#8211;&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 &#8220;out of the box&#8221; Berechtigungsmodell vermittelt nachfolgendes Video (kann von Alfresco &#8220;Profis&#8221; 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 &#8220;abc&#8221; und &#8220;xyz&#8221; für beliebig viele Firmen stehen):</p>
<ul>
<li>interne Mitarbeiter haben entsprechend ihrer Rolle Zugriff auf alle Projektordner</li>
<li>externe Mitarbeiter der &#8220;Firma xyz&#8221; haben ausschließlich Zugriff als Collaborator auf Ordner / Dateien der „Firma xyz&#8221;</li>
<li>externe Mitarbeiter der &#8220;Firma abc&#8221; haben ausschließlich Zugriff als Collaborator auf Ordner / Dateien „Firma abc&#8221;</li>
<li>externe Mitarbeiter der Firmen &#8220;xyz&#8221; und &#8220;abc&#8221; 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 &#8220;Gruppen&#8221; 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&#8217;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 &#8211; 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 &#8220;properly&#8221;.</p>
<p>The project was of type fixed-scope and fixed-price. A No-Go due to Heisenberg&#8217;s uncertainty principle &#8211; 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 &#038; 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 &#038; 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 &#8211; 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 &#8230;. 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>
	</channel>
</rss>

