<?xml version="1.0"?>
<rss version="2.0" xmlns:geo="http://www.w3.org/2003/01/geo/wgs84_pos#" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:media="http://search.yahoo.com/mrss/" xmlns:yt="http://gdata.youtube.com/schemas/2007" xmlns:atom="http://www.w3.org/2005/Atom">
   <channel>
      <title>Alfresco Community Blogs</title>
      <description>Blogs from members of the Alfresco community of end-users, developers, and contributors.</description>
      <link>http://pipes.yahoo.com/pipes/pipe.info?_id=92dfeaa7519208e970eec2bdc7e9f3fa</link>
      <atom:link rel="next" href="http://pipes.yahoo.com/pipes/pipe.run?_id=92dfeaa7519208e970eec2bdc7e9f3fa&amp;_render=rss&amp;page=2"/>
      <pubDate>Fri, 24 May 2013 00:49:38 +0000</pubDate>
      <generator>http://pipes.yahoo.com/pipes/</generator>
      <item>
         <title>Mentoring at Google Summer of Code 2013</title>
         <link>http://www.open4dev.com/journal/2013/5/13/mentoring-at-google-summer-of-code-2013.html</link>
         <description>&lt;p&gt;&lt;span class=&quot;thumbnail-image-float-right ssNonEditable&quot;&gt;&lt;span&gt;&lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://www.open4dev.com/journal/2013/5/13/mentoring-at-google-summer-of-code-2013.html&quot;&gt;&lt;img src=&quot;http://www.open4dev.com/storage/thumbnails/2935919-22674024-thumbnail.jpg?__SQUARESPACE_CACHEVERSION=1368433177687&quot; alt=&quot;Google Summer of Code 2013 logo&quot;/&gt;&lt;/a&gt;&lt;/span&gt;&lt;/span&gt;The Apache Software Foundation is participating in Google Summer of Code 2013 and I'm going to join as the mentor of the Apache ManifoldCF proposals.&lt;/p&gt;</description>
         <guid isPermaLink="false">288041:2935920:33691133</guid>
         <pubDate>Mon, 13 May 2013 07:50:16 +0000</pubDate>
      </item>
      <item>
         <title>Alfresco Stockholm Meetup – release of Manual Manager</title>
         <link>http://loftux.com/2013/05/07/alfresco-stockholm-meetup-release-of-manual-manager/</link>
         <description>On Monday the 6 may the first Alfresco Meetup in Sweden was held in Stockholm. It was a great event with good speakers, Carl Nordenfelt (Redpill Linpro) told about Alfresco best practices, Barbara Lemke (Alfresco) showed Alfresco Workdesk, Jeff Potts talked about the Alfresco API, the one you can use to make your applications Alfresco [...]</description>
         <guid isPermaLink="false">http://loftux.se/?p=1066</guid>
         <pubDate>Tue, 07 May 2013 13:09:08 +0000</pubDate>
         <content:encoded><![CDATA[<p>On Monday the 6 may the first Alfresco Meetup in Sweden was held in Stockholm. It was a great event with good speakers, Carl Nordenfelt (Redpill Linpro) told about Alfresco best practices, Barbara Lemke (Alfresco) showed Alfresco Workdesk, Jeff Potts talked about the Alfresco API, the one you can use to make your applications Alfresco Cloud aware.</p>
<p>And I also did a talk about Media Viewers and demoed PdfJs and the Embed viewer (read more about them <a rel="nofollow" target="_blank" href="http://loftux.com/2012/11/30/media-viewers-extending-alfresco-viewer-capability/">here</a>). In preparing this speak I used <a rel="nofollow" target="_blank" href="http://lab.hakim.se/reveal-js/#/">reveal.js</a>, a tool to make html presentations. And it also supports using markdown syntax. Wouldn&#8217;t it be possible to use the Alfresco add-on Manual Manager I had created to author the slides?</p>
<p>Well I added this.<br />
<a rel="nofollow" target="_blank" href="http://loftux.se/wp-content/uploads/2013/05/Manual-Manager-slideshow.png"><img src="http://loftux.se/wp-content/uploads/2013/05/Manual-Manager-slideshow.png" alt="Manual Manager slideshow" width="863" height="256" class="aligncenter size-full wp-image-1067"/></a><br />
Using that menu option your current topic page will become first slide. All subtopics will be the following slides (navigating your slide deck right/left). Each of those subtopics that has childs will also become slides (the up/down navigation in reveal.js).<br />
All with selectable theme and transitions.</p>
<p>Full introduction to the Manual Manager <a rel="nofollow" target="_blank" href="http://loftux.com/2012/11/04/manual-manager-for-alfresco/">here</a>. Lots of features, check the video in that post out.</p>
<p>And I hope more people will use this tool. I&#8217;m now releasing it as open source. It is now available at github <a rel="nofollow" target="_blank" href="https://github.com/loftuxab/manual-manager">https://github.com/loftuxab/manual-manager</a>!</p>]]></content:encoded>
      </item>
      <item>
         <title>Alfresco, CMIS y Python</title>
         <link>http://www.fegor.com/2013/04/alfresco-cmis-y-python.html</link>
         <description>El estandar CMIS (Content Management Interoperability Services) es un estandar para la gestion de contenidos aprobada por OASIS.&lt;br /&gt;&lt;br /&gt;&lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://en.wikipedia.org/wiki/Content_Management_Interoperability_Services&quot;&gt;http://en.wikipedia.org/wiki/Content_Management_Interoperability_Services&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Esto nos permite tener una capa de llamadas estandar para multitud de productos de gestion de contenidos que incluyan CMIS y por tanto también acceder desde multitud de lenguajes y no solo desde Java.&lt;br /&gt;&lt;br /&gt;Este es el caso de &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;https://code.google.com/p/cmislib/&quot;&gt;cmislib &lt;/a&gt;de &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://ecmarchitect.com/&quot;&gt;Jeff Potts&lt;/a&gt; para Python.&lt;br /&gt;&lt;br /&gt;La installación es muy sencilla, necesitamos un interprete Python (versión&lt;br /&gt;2.7) además del módulo cmislib y setuptools para instalar el primero y&lt;br /&gt;Alfresco 4.&lt;br /&gt;&lt;br /&gt;Podemos usar la línea de comandos de Python para hacer las siguientes pruebas:&lt;br /&gt;&lt;br /&gt;Importamos la librería:&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;&quot;&gt;from cmislib.model import CmisClient, Repository&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Creamos el cliente configurando el end-point y las credenciales:&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;&quot;&gt;client = CmisClient('http://localhost:8080/alfresco/s/cmis', 'admin', 'admin')&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Recuperamos el servicio de repositorio por defecto:&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;&quot;&gt;repo = client.getDefaultRepository()&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;&quot;&gt;repo.getRepositoryId()&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Recuperamos información del repositorio:&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;&quot;&gt;info = repo.getRepositoryInfo()&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;&quot;&gt;for k,v in info.items():&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; print &quot;%s:%s&quot; % (k,v)&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Deberia devolvernos algo así:&lt;br /&gt;&lt;span style=&quot;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;&quot;&gt;cmisSpecificationTitle:Version 1.0 OASIS Standard&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;&quot;&gt;aclCapability:&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;&quot;&gt;cmisVersionSupported:1.0&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;&quot;&gt;principalAnonymous:guest&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;&quot;&gt;principalAnyone:GROUP_EVERYONE&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;&quot;&gt;repositoryDescription:None&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;&quot;&gt;changesOnType:cmis:document&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;&quot;&gt;changesIncomplete:true&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;&quot;&gt;productVersion:4.0.0 (4003)&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;&quot;&gt;rootFolderId:workspace://SpacesStore/b92b669b-4f2a-42ab-a9d8-1451b1596e80&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;&quot;&gt;repositoryId:6891ed19-41e3-4160-8c77-65de35c5a428&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;&quot;&gt;repositoryName:Main Repository&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;&quot;&gt;vendorName:Alfresco&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;&quot;&gt;productName:Alfresco Repository (Community)&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Bien, ya lo tenemos, ahora creamos...&lt;br /&gt;&lt;br /&gt;... una carpeta:&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;&quot;&gt;rootFolder = repo.rootFolder&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;&quot;&gt;newFolder = rootFolder.createFolder('Carpeta nueva')&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;&quot;&gt;newFolder.id&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;... un contenido:&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;&quot;&gt;f = open('Mi fichero', 'r')&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;&quot;&gt;newDoc = newFolder.createDocument('New Document', contentFile=f)&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;... y listamos las propiedades:&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;&quot;&gt;for k,v in newDoc.properties.items()&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; print '%s = %s' % (k,v)&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Personalmente me parece una idea muy buena y más con el lenguaje más popular&lt;br /&gt;del momento ;-)&lt;br /&gt;&lt;br /&gt;Más información en:&lt;br /&gt;&lt;br /&gt;&lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;https://code.google.com/p/cmislib/&quot;&gt;https://code.google.com/p/cmislib/&lt;/a&gt;&lt;br /&gt;&lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://chemistry.apache.org/python/cmislib.html&quot;&gt;http://chemistry.apache.org/python/cmislib.html&lt;/a&gt;&lt;br /&gt;&lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;https://pypi.python.org/pypi/setuptools#files&quot;&gt;https://pypi.python.org/pypi/setuptools#files&lt;/a&gt;&lt;br /&gt;&lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://www.python.org/&quot;&gt;http://www.python.org/&lt;/a&gt;&lt;br /&gt;&lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;https://www.oasis-open.org/committees/tc_home.php?wg_abbrev=cmis&quot;&gt;https://www.oasis-open.org/committees/tc_home.php?wg_abbrev=cmis&lt;/a&gt;&lt;br /&gt;&lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://cmis.alfresco.com/&quot;&gt;http://cmis.alfresco.com/&lt;/a&gt;</description>
         <author>Fernando González</author>
         <guid isPermaLink="false">tag:blogger.com,1999:blog-13003183.post-6462074922969553345</guid>
         <pubDate>Thu, 25 Apr 2013 21:00:00 +0000</pubDate>
      </item>
      <item>
         <title>The Missing Alfresco Quickshare Download Link</title>
         <link>http://www.contentreich.de/the-missing-alfresco-quickshare-download</link>
         <description>&lt;p&gt;&lt;img width=&quot;150&quot; height=&quot;150&quot; src=&quot;http://www.contentreich.de/wp-content/uploads/2013/04/alfresco-quickshare-missing-link-150x150.png&quot; class=&quot;attachment-thumbnail wp-post-image&quot; alt=&quot;The Missing Alfresco Quickshare Download Link&quot; title=&quot;The Missing Alfresco Quickshare Download Link&quot; style=&quot;float:right;&quot;/&gt;The Quickshare feature introduced with Alfresco 4.2 &quot;misses&quot; a download feature. Fixing the issue is easy. Get the &quot;fix&quot; here !  &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://www.contentreich.de/the-missing-alfresco-quickshare-download&quot;&gt;Weiterlesen &lt;span class=&quot;meta-nav&quot;&gt;&amp;#8594;&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;The post &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://www.contentreich.de/the-missing-alfresco-quickshare-download&quot;&gt;The Missing Alfresco Quickshare Download Link&lt;/a&gt; appeared first on &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://www.contentreich.de&quot;&gt;CONTENTREICH&lt;/a&gt;.&lt;/p&gt;</description>
         <guid isPermaLink="false">http://www.contentreich.de/?p=3196</guid>
         <pubDate>Mon, 22 Apr 2013 08:24:16 +0000</pubDate>
         <content:encoded><![CDATA[<div class="alignleft labeledImage "><img src="http://www.contentreich.de/wp-content/uploads/2013/04/alfresco-quickshare-missing-link.png" alt="Screenshot showing the missing Alfresco Quickshare Download link" width="275" height="275" class="alignleft size-full wp-image-3195"/></div>
<p>At first glance, the quickshare feature introduced with Alfresco 4.2 really seemed to address a long standing requirement for me. I have been asked more than once about how to share content publicly. A few days ago, I wanted to share a big file with another guy. I happily uploaded that file to our alfresco server, clicked the share button and checked the public page to make sure the other guy gets a chance to see and download the file.</p>
<p>Bummer ! Where is the download link ?</p>
<p>I was looking around in Share whether I missed a checkbox or something &#8230; no. I checked issues.alfresco.com and googled around &#8211; found I am not the only one missing that download link. Jeff Potts and another guy were asking about it months ago. I have to say I just do not understand the arguing of the Alfresco Cloud/Mobile support team why it should be as it is, so I &#8220;fixed&#8221; it myself. The file below provides a drop-in fix giving you the link. Assuming you have a standard Alfresco tomcat installation, just unzip it in the alfresco directory, restart Share and enjoy sharing.</p>
<div id='wpdm_file_14' class='wpdm_file wpdm-only-button'><div class='cont'><div class='btn_outer'><div class='btn_outer_c' style=''><a rel="nofollow" class='btn_left  ' title='Quickshare Download for Alfresco Share 4.2' target="_blank" href='http://www.contentreich.de/?wpdmact=process&did=MTQuaG90bGluaw=='>Download Quickshare Download for Alfresco Share 4.2</a><span class='btn_right'>&nbsp;</span></div></div><div class='clear'></div></div></div>
<h2>References</h2>
<ul>
<li><a rel="nofollow" target="_blank" href="https://getsatisfaction.com/alfresco/topics/quick_share_page_needs_a_download_link">Quick share page needs a download link</a></li>
</ul>
<div class="social-ring">
<div class="social-ring-button"><a rel="nofollow" target="_blank" href="http://twitter.com/share" lang="en" class="sr-twitter-button twitter-share-button"></a></div>
<div class="social-ring-button"><div class="g-plusone"></div></div>
<div class="social-ring-button"></div> 
<div class="social-ring-button"></div> 
</div><div style="clear:both;">&nbsp;</div>
<p>The post <a rel="nofollow" target="_blank" href="http://www.contentreich.de/the-missing-alfresco-quickshare-download">The Missing Alfresco Quickshare Download Link</a> appeared first on <a rel="nofollow" target="_blank" href="http://www.contentreich.de">CONTENTREICH</a>.</p>]]></content:encoded>
      </item>
      <item>
         <title>Using Maven Alfresco SDK with the Enterprise edition</title>
         <link>http://bpeters.tumblr.com/post/47609269106</link>
         <description>Using Maven Alfresco SDK with the Enterprise edition: Alfresco Consultant Maurizio Pillitu wrote a...</description>
         <guid isPermaLink="false">http://bpeters.tumblr.com/post/47609269106</guid>
         <pubDate>Wed, 10 Apr 2013 08:55:40 +0000</pubDate>
      </item>
      <item>
         <title>CRÉER UN MODÈLE DE DONNÉES PERSONNALISÉ SOUS ALFRESCO</title>
         <link>http://archiveyourdocs.com/creer-un-modele-de-donnees-personnalise-sous-alfresco?utm_source=rss&amp;utm_medium=rss&amp;utm_campaign=creer-un-modele-de-donnees-personnalise-sous-alfresco</link>
         <description>Alfresco est une plate-forme de gestion de contenu extensible, souple et évolutif. Alfresco fournit par défaut un système de modèles de données assez complet qui vous permet de gérer la plupart de vos données. Cependant, rien ne vous empêche d‘étendre &amp;#8230; &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://archiveyourdocs.com/creer-un-modele-de-donnees-personnalise-sous-alfresco&quot;&gt;Continuer la lecture &lt;span class=&quot;meta-nav&quot;&gt;&amp;#8594;&lt;/span&gt;&lt;/a&gt;</description>
         <guid isPermaLink="false">http://archiveyourdocs.com/?p=2214</guid>
         <pubDate>Wed, 03 Apr 2013 10:35:50 +0000</pubDate>
         <content:encoded><![CDATA[<div class="WordSection1">
<p style="text-align:justify;"><a rel="nofollow" target="_blank" href="http://archiveyourdocs.com/wp-content/uploads/2013/04/logo-alfres.png"><img class="alignleft size-full wp-image-2221" title="logo alfres" src="http://archiveyourdocs.com/wp-content/uploads/2013/04/logo-alfres.png" alt="" width="116" height="105"/></a>Alfresco est une plate-forme de gestion de contenu extensible, souple et évolutif. Alfresco fournit par défaut un système de modèles de données assez complet qui vous permet de gérer la plupart de vos données. Cependant, rien ne vous empêche d‘étendre ces modèles ou de créer un modèle personnalisé pour le faire correspondre à des besoins métier spécifiques. Dans cet article nous allons mettre en œuvre la création d’un nouveau modèle de données personnalisé en introduisant, dans une première partie, quelques définitions et en détaillant, dans une deuxième partie, les étapes de création une par une.</p>
<p><span id="more-2214"></span></p>
<p style="text-align:justify;"><span style="text-decoration:underline;"><strong>Partie 1 : Qu’est-ce qu’un modèle de donnée sous Alfresco ?</strong></span></p>
<p style="text-align:justify;"><strong>Un modèle de donnée :</strong> c&rsquo;est le système qui permet de décrire les données stockées dans l’entrepôt des données sous Alfresco. C’est la collection entre des types de données, des propriétés (métadonnées), des contraintes, des associations, des aspects de contenu et des comportements personnalisés :</p>
<p class="size-medium" style="padding-left:30px;text-align:justify;"><strong>1.</strong> <strong>Les types de contenu</strong>: c’est l’équivalent d’une classe dans le monde orienté objet. Un type de contenu complexe peut avoir plusieurs propriétés qui peuvent être héritées à partir d’un type parent. Par défaut, on trouve dans Alfresco deux types complexes qui sont le « Content » et le « Folder ». Il est possible d’étendre les modèles de données pour les faire correspondre à des besoins métier personnalisés.<br />
<strong>2.</strong> <strong>Les propriétés</strong> (Property types or data types) : ce sont les métadonnées associées à un type particulier.<br />
<strong>3.</strong> <strong>Les types de données</strong>: Ils décrivent les types fondamentaux de données utilisés pour stocker les propriétés. Exemple de type fondamental : « Double », « Float », « Integer ».<br />
<strong>4.</strong> <strong>Les contraintes</strong>: Ils sont imposées sur les propriétés (telles que des contraintes sur les valeurs des propriétés pour les faire correspondre à un certain modèle). On distingue 4 types de contraintes disponibles :</p>
<p class="size-medium" style="padding-left:60px;text-align:justify;">- REGEX : utilisée pour vérifier la correspondance d’une valeur avec une expression régulière.<br />
- LIST : utilisée pour définir une liste de valeurs possibles pour une propriété donnée.<br />
- MINMAX : permet de définir un intervalle de valeurs limitées entre une valeur Minvalue et Maxvalue.<br />
- LENGTH : permet d’ajouter une restriction sur la longueur d’une chaine de caractère.</p>
<div class="size-medium">
<p style="padding-left:30px;text-align:justify;"><strong>5.</strong> <strong>Les associations</strong>, pour définir une relation entre les types de contenu.<br />
<strong>6.</strong> <strong>Les aspects</strong>, qui représentent une autre forme d&rsquo;encapsulation (connu sous le nom « cross cutting ») où la structure décrite peut être appliquée à n&rsquo;importe quel autre type de contenu. Les aspects nous permettent de «tronçonner» de notre modèle de contenu des propriétés et des associations et de les rattacher à d’autres types de contenu au moment où nous en avons besoin.</p>
</div>
<p style="text-align:justify;"><span style="text-decoration:underline;"><strong>Partie 2 : Comment créer un modèle de donnée personnalisé sous Alfresco ?</strong></span></p>
<p style="text-align:justify;">Dans la suite, nous allons détailler étape par étape la création d’un modèle de donnée personnalisé avec deux types de contenus personnalisés « <strong>Type facture</strong> » et « <strong>Type contrat</strong> ». Ci-dessous les propriétés de chaque type :</p>
<p style="padding-left:30px;text-align:justify;"><span style="text-decoration:underline;"><strong>Type facture</strong></span> :<br />
- Date de règlement (type : date)<br />
- Date d&rsquo;exécution (type : date)<br />
- Référence (type : texte)<br />
- Nom Client (type : texte avec une contrainte de type «REGEX» pour n’autoriser que les valeurs alphabétiques)<br />
- Montant (type : int)<br />
- Nom émetteur (type : texte)</p>
<p style="padding-left:30px;text-align:justify;"><span style="text-decoration:underline;"><strong>Type contrat</strong></span> :<br />
- Nom Client (type : texte)<br />
- Nom émetteur (type : texte)<br />
- Référence (type : texte)<br />
- Date du contrat (type : date)</p>
<div style="text-align:justify;padding-left:30px;"><strong>Voyons maintenant les étapes à suivre pour créer notre modèle :</strong></div>
<p style="text-align:justify;padding-left:30px;"><strong>1.</strong>  Créer un nouveau dossier nommé « tuto » et placer le sous Alfresco/tomcat/shared /classes/alfresco/extension/. Cette technique permet d’ajouter une extension sans toucher au code natif d’Alfresco.</p>
<p style="text-align:justify;padding-left:30px;"><strong>2.  </strong>La deuxième étape est la déclaration de notre modèle de donnée personnalisé via l’ajout d’un fichier de contexte (Custom Model Context File).  Ce fichier permet de déclarer à Alfresco la création d’un nouveau modèle de contenu. Nativement, Alfresco charge tous les fichiers qui se terminent par &laquo;&nbsp;<strong>context.xml</strong>&laquo;&nbsp;, placés dans le dossier « <strong>extension</strong> ». Tout ce que nous devons faire est de créer un fichier qui se termine par ce suffixe, et d’y déclarer notre modèle.</p>
<p style="text-align:justify;padding-left:30px;">Sous le dossier de l’extension, créez un nouveau fichier XML  appelé « <strong><em>tuto-model-context</em></strong>» et y insérez le code suivant :</p>
<p style="text-align:justify;padding-left:30px;"><strong><span style="text-decoration:underline;">Code : tuto-model-context.xml :</span></strong></p>
<pre>&lt;?xml version=&#039;1.0&#039; encoding=&#039;UTF-8&#039;?&gt;
&lt;!DOCTYPE beans PUBLIC &#039;-//SPRING//DTD BEAN//EN&#039; &#039;http://www.springframework.org/dtd/spring-beans.dtd&#039;&gt;
 &lt;beans&gt;
    &lt;!-- Registration of new models --&gt;	

	&lt;bean id=&quot;example.dictionaryBootstrap&quot; parent=&quot;dictionaryModelBootstrap&quot; depends-on=&quot;dictionaryBootstrap&quot;&gt;

        	&lt;property name=&quot;models&quot;&gt;
          	&lt;list&gt;
                		&lt;value&gt;alfresco/extension/tuto/tutoModel.xml&lt;/value&gt;
            	&lt;/list&gt;
        	&lt;/property&gt;

      &lt;/bean&gt;
&lt;/beans&gt;</pre>
<p style="padding-left:30px;text-align:justify;"><strong>3.  </strong>Passons maintenant à la création de notre modèles de donné. Créez un nouveau fichier XML dans le répertoire de l&rsquo;extension et y insérer le code ci-dessous. Assurez-vous que le nom correspond à ce que vous avez spécifié dans le fichier « tuto-model-context.xml ». Pour notre exemple, le fichier doit être nommé « tutoModel.xml ».</p>
<p style="padding-left:30px;"><strong><span style="text-decoration:underline;">Code : tuto-model-context.xml</span> :</strong></p>
<pre>&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&gt;
&lt;!-- Definition of new Model --&gt;
&lt;model name=&quot;tut:tutomodel&quot; xmlns=&quot;http://www.alfresco.org/model/dictionary/1.0&quot;&gt;
    &lt;!-- Optional meta-data about the model --&gt;
    &lt;description&gt;ArchiveYourDocs&lt;/description&gt;
    &lt;author&gt;Salmen KTATA&lt;/author&gt;
    &lt;version&gt;1.0&lt;/version&gt;
    &lt;!-- Imports are required to allow references to definitions in other models --&gt;
    &lt;imports&gt;
        &lt;!-- Import Alfresco Dictionary Definitions --&gt;
        &lt;import uri=&quot;http://www.alfresco.org/model/dictionary/1.0&quot; prefix=&quot;d&quot; /&gt;
        &lt;!-- Import Alfresco Content Domain Model Definitions --&gt;
        &lt;import uri=&quot;http://www.alfresco.org/model/content/1.0&quot; prefix=&quot;cm&quot; /&gt;
    &lt;/imports&gt;
    &lt;!-- Introduction of new namespaces defined by this model --&gt;
    &lt;namespaces&gt;
        &lt;namespace uri=&quot;tuto.model.client&quot; prefix=&quot;tut&quot; /&gt;
    &lt;/namespaces&gt;

    &lt;types&gt;
        &lt;!-- Enterprise-wide generic document type --&gt;

		&lt;type name=&quot;tut:facture&quot;&gt;
            &lt;title&gt;Tuto Facture&lt;/title&gt;
            &lt;parent&gt;cm:content&lt;/parent&gt;
			&lt;properties&gt;

				&lt;property name=&quot;tut:factdateReglement&quot;&gt;
					&lt;title&gt;Date de réglement&lt;/title&gt;
					&lt;type&gt;d:date&lt;/type&gt;
					&lt;mandatory&gt;false&lt;/mandatory&gt;
				&lt;/property&gt;

				&lt;property name=&quot;tut:factdateExecution&quot;&gt;
					&lt;title&gt;Date d&#039;exécution&lt;/title&gt;
					&lt;type&gt;d:date&lt;/type&gt;
					&lt;mandatory&gt;true&lt;/mandatory&gt;
				&lt;/property&gt;

				&lt;property name=&quot;tut:factreference&quot;&gt;
					&lt;title&gt;Référence&lt;/title&gt;
					&lt;type&gt;d:text&lt;/type&gt;
					&lt;mandatory&gt;false&lt;/mandatory&gt;
				&lt;/property&gt;

				&lt;property name=&quot;tut:factnomClient&quot;&gt;
					&lt;title&gt;Nom Client&lt;/title&gt;
					&lt;type&gt;d:text&lt;/type&gt;
					&lt;mandatory&gt;false&lt;/mandatory&gt;
					&lt;constraints&gt;
						&lt;constraint name=&quot;tut:regex1&quot; type=&quot;REGEX&quot;&gt;
						&lt;parameter name=&quot;expression&quot;&gt;&lt;value&gt;[a-zA-Z]*&lt;/value&gt;&lt;/parameter&gt;
						&lt;parameter name=&quot;requiresMatch&quot;&gt;&lt;value&gt;flase&lt;/value&gt;&lt;/parameter&gt;
					&lt;/constraint&gt;
				&lt;/property&gt;

				&lt;property name=&quot;tut:factmontant&quot;&gt;
					&lt;title&gt;Montant&lt;/title&gt;
					&lt;type&gt;d:int&lt;/type&gt;
					&lt;mandatory&gt;false&lt;/mandatory&gt;
				&lt;/property&gt;

				&lt;property name=&quot;tut:factnomEmetteur&quot;&gt;
					&lt;title&gt;Nom emetteur&lt;/title&gt;
					&lt;type&gt;d:text&lt;/type&gt;
					&lt;mandatory&gt;false&lt;/mandatory&gt;
				&lt;/property&gt;
         &lt;/properties&gt;
        &lt;/type&gt;

        &lt;type name=&quot;tut:contrat&quot;&gt;
            &lt;title&gt;Tuto Contrat&lt;/title&gt;
            &lt;parent&gt;cm:content&lt;/parent&gt;
		&lt;properties&gt;
				&lt;property name=&quot;tut:contnomClient&quot;&gt;
					&lt;title&gt;Nom Client&lt;/title&gt;
					&lt;type&gt;d:text&lt;/type&gt;
					&lt;mandatory&gt;false&lt;/mandatory&gt;
				&lt;/property&gt;

				&lt;property name=&quot;tut:contnomEmetteur&quot;&gt;
					&lt;title&gt;Nom emetteur&lt;/title&gt;
					&lt;type&gt;d:text&lt;/type&gt;
					&lt;mandatory&gt;false&lt;/mandatory&gt;
				&lt;/property&gt;

				&lt;property name=&quot;tut:contreference&quot;&gt;
					&lt;title&gt;Référence&lt;/title&gt;
					&lt;type&gt;d:text&lt;/type&gt;
					&lt;mandatory&gt;false&lt;/mandatory&gt;
				&lt;/property&gt;

				&lt;property name=&quot;tut:contdate&quot;&gt;
					&lt;title&gt;Date du contract&lt;/title&gt;
					&lt;type&gt;d:date&lt;/type&gt;
					&lt;mandatory&gt;false&lt;/mandatory&gt;
				&lt;/property&gt;
		 &lt;/properties&gt;	
        &lt;/type&gt;
    &lt;/types&gt;
&lt;/model&gt;</pre>
<p style="text-align:justify;padding-left:30px;"><strong>4.  </strong>La dernière étape consiste à redémarrer Tomcat pour qu’Alfresco charge notre modèle personnalisé. Regardez le journal pendant le redémarrage. Vous ne devriez pas voir des erreurs liées au chargement du modèle personnalisé.</p>
<p style="text-align:justify;">Vous pouvez télécharger le modèle personnalisé qu’on a créé via ce <a rel="nofollow" target="_blank" href="http://archiveyourdocs.com/wp-content/uploads/2013/04/tuto.rar">lien</a>.</p>
</div>]]></content:encoded>
         <category>Blog</category>
      </item>
      <item>
         <title>Introducing the User Script Console</title>
         <link>http://www.techbits.de/2013/04/01/introducing-the-user-script-console/</link>
         <description>The Alfresco JavaScript Console is really popular among Alfresco administrators and developers to easy automate tasks around Alfresco. This leads to more and more requests from users to have their problems fixed and tasks automated and keeps developers and administrators from more &amp;#8230; &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://www.techbits.de/2013/04/01/introducing-the-user-script-console/&quot;&gt;Continue reading &lt;span class=&quot;meta-nav&quot;&gt;&amp;#8594;&lt;/span&gt;&lt;/a&gt;</description>
         <guid isPermaLink="false">http://www.techbits.de/?p=434</guid>
         <pubDate>Mon, 01 Apr 2013 03:01:15 +0000</pubDate>
         <content:encoded><![CDATA[<p>The <a rel="nofollow" target="_blank" href="https://github.com/share-extras/js-console">Alfresco JavaScript Console</a> is really popular among Alfresco administrators and developers to easy automate tasks around Alfresco. This leads to more and more requests from users to have their problems fixed and tasks automated and keeps developers and administrators from more important tasks.</p>
<p>With the new <strong>User Script Console</strong> extension for Alfresco Share the users finally can access the powerful JavaScript API directly by themselves without needing a specialist. It integrates as a page in a Share site:</p>
<p><a rel="nofollow" target="_blank" href="http://www.techbits.de/2013/04/01/introducing-the-user-script-console/01_usc/"><img class="aligncenter size-full wp-image-435" title="The User Script Console integrated as Share site" src="http://www.techbits.de/wp-content/uploads/2013/03/01_usc.png" alt="" width="922" height="647"/></a></p>
<p>Of cause it can not be expected of end users to know JavaScript or the Alfresco APIs right away. That is why the User Script Console slowly introduces the users to the capabilities of the API using a <a rel="nofollow" target="_blank" href="http://en.wikipedia.org/wiki/Gamification">Gamification</a> approach. Users start out as novices and can gain experience (XP) while using the JavaScript API.</p>
<h2>User &#8220;Experience&#8221;</h2>
<p>API access gradually changes with increased experience:</p>
<ul>
<li>0 XP = No Alfresco API access</li>
<li>10 XP = Read properties and permissions, only document root object</li>
<li>1000 XP = Add comments, add Tags to any node</li>
<li>5000 XP = Write properties and add tags, Site API, full ScriptNode api</li>
<li>10000 XP = Groups API (Add/Remove people from sites)</li>
<li>20000 XP = Full Alfresco Javascript API</li>
<li>50000 XP = runas admin, access beans using Packages.java</li>
</ul>
<p>A new user starting out as a novice must first write a syntactically correct JavaScript using given examples. He receives 1 XP for each successful transaction and will soon gain access to some parts of the Alfreco API (XP of 10 or more). Commands above his experience level are not available:</p>
<p><a rel="nofollow" target="_blank" href="http://www.techbits.de/2013/04/01/introducing-the-user-script-console/03_level_error/"><img class="aligncenter size-full wp-image-437" title="Users can only run API commands that their XP level allows" src="http://www.techbits.de/wp-content/uploads/2013/03/03_level_error.png" alt="" width="961" height="400"/></a></p>
<h2>Examples</h2>
<p>To help users find their way around, there are examples in the &#8220;Examples&#8221; menu that are adjusted to the users experience level. It starts out with a list of simple JavaScript examples for &#8220;for&#8221;-loops and &#8220;if&#8221;-clauses.</p>
<p><a rel="nofollow" target="_blank" href="http://www.techbits.de/2013/04/01/introducing-the-user-script-console/02_examples/"><img class="aligncenter size-full wp-image-436" title="Examples help to get started" src="http://www.techbits.de/wp-content/uploads/2013/03/02_examples.png" alt="" width="667" height="370"/></a></p>
<h2>Badges</h2>
<p>Additionally users can earn badges for special achievements (each earns 500 XP):</p>
<ul>
<li><strong>Unlocker</strong>: Unlocked more than 10 documents that were locked by the Sharepoint API.</li>
<li><strong>Tagmaster</strong>: Added 100 different tags to documents</li>
<li><strong>Ninja</strong>: more than 10 &#8220;hidden&#8221; property changes with behaviourfilter.disableBehaviour()</li>
<li><strong>Shapeshifter</strong>: More than 100 calls of the transformDocument/transformImage</li>
<li><strong>JsGuru</strong>: Run 10 consecutive scripts that all JsLint without any warnings</li>
<li><strong>Loadtester</strong>: Your last 10 scripts have all run longer than 30s</li>
<li><strong>MrClean</strong>: Purge the archive store (nodeArchiveService)</li>
<li><strong>Reporter</strong>: Generation of more than 10000 lines of print output</li>
<li><strong>Bouncer</strong>: Removed at least 100 people from groups/sites</li>
<li><strong>Hacker</strong>: Usage of Packages.java to access Spring beans directly</li>
</ul>
<p><a rel="nofollow" target="_blank" href="http://www.techbits.de/2013/04/01/introducing-the-user-script-console/04_badge/"><img class="aligncenter size-full wp-image-438" title="Users receive badges for special achievements" src="http://www.techbits.de/wp-content/uploads/2013/03/04_badge.png" alt="" width="1012" height="430"/></a>The new User Script Console will help to empower the savvy user to automate Alfresco in an unprecedented way and lets administrators focus on more important tasks like backup and restore of the Alfresco repository.</p>
<p>Available today for Alfresco 4.1.</p>]]></content:encoded>
      </item>
      <item>
         <title>H2 support 1.1.1 for Alfresco 3.4.12 Enterprise with Maven</title>
         <link>http://feedproxy.google.com/~r/Skuro/~3/ThCHs96kzog/</link>
         <description>&lt;p&gt;Just a quick update on the &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;https://github.com/skuro/alfresco-h2-support&quot;&gt;H2 support&lt;/a&gt;
project, today I released the &lt;code&gt;1.1.1&lt;/code&gt; maintenance version which targets
Alfresco v3.4.12 Enterprise.&lt;/p&gt;

&lt;p&gt;Please make sure you always double check the &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;https://github.com/skuro/alfresco-h2-support/wiki/H2-Database-support-for-Alfresco&quot;&gt;official documentation&lt;/a&gt;
to pick and choose the right version to use in your Alfresco project.&lt;/p&gt;

&lt;h1&gt;H2 and Maven&lt;/h1&gt;

&lt;p&gt;For &lt;del&gt;the sane&lt;/del&gt; those among you that use the &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;https://artifacts.alfresco.com/nexus/content/repositories/alfresco-docs/alfresco-lifecycle-aggregator/latest/index.html&quot;&gt;Maven SDK&lt;/a&gt;,
you should know that &lt;code&gt;H2 support&lt;/code&gt; is used to quickly boot the Alfresco repository
webapp during your development cycles.&lt;/p&gt;

&lt;p&gt;If you're using a version of Alfresco other than the default 4.x that's assumed
by the SDK, you must also adapt your H2 support version to be able to start up
Alfresco. It's as easy as overriding the following maven property:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;&amp;lt;h2-support.version&amp;gt;1.1.1&amp;lt;/h2-support.version&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Happy development!&lt;/p&gt;
&lt;div class=&quot;feedflare&quot;&gt;
&lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://feeds.feedburner.com/~ff/Skuro?a=ThCHs96kzog:UUX5Ofn4VFM:yIl2AUoC8zA&quot;&gt;&lt;img src=&quot;http://feeds.feedburner.com/~ff/Skuro?d=yIl2AUoC8zA&quot; border=&quot;0&quot;&gt;&lt;/a&gt; &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://feeds.feedburner.com/~ff/Skuro?a=ThCHs96kzog:UUX5Ofn4VFM:V_sGLiPBpWU&quot;&gt;&lt;img src=&quot;http://feeds.feedburner.com/~ff/Skuro?i=ThCHs96kzog:UUX5Ofn4VFM:V_sGLiPBpWU&quot; border=&quot;0&quot;&gt;&lt;/a&gt; &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://feeds.feedburner.com/~ff/Skuro?a=ThCHs96kzog:UUX5Ofn4VFM:7Q72WNTAKBA&quot;&gt;&lt;img src=&quot;http://feeds.feedburner.com/~ff/Skuro?d=7Q72WNTAKBA&quot; border=&quot;0&quot;&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src=&quot;http://feeds.feedburner.com/~r/Skuro/~4/ThCHs96kzog&quot; height=&quot;1&quot; width=&quot;1&quot;/&gt;</description>
         <guid isPermaLink="false">http://skuro.tk/2013/03/27/h2-support-for-alfresco-3-4-12-and-maven/</guid>
         <pubDate>Tue, 26 Mar 2013 23:00:00 +0000</pubDate>
      </item>
      <item>
         <title>Apache ManifoldCF @ Alfresco Meetup - slides</title>
         <link>http://www.open4dev.com/journal/2013/3/23/apache-manifoldcf-alfresco-meetup-slides.html</link>
         <description>&lt;p&gt;&lt;span class=&quot;ssNonEditable full-image-float-right&quot;&gt;&lt;img src=&quot;http://www.open4dev.com/storage/img/logos/ManifoldCF-logo.PNG?__SQUARESPACE_CACHEVERSION=1310116095291&quot; alt=&quot;Apache ManifoldCF logo&quot;/&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;Below the slides of my talk at the Alfresco Meetup during the Codemotion about Apache ManifoldCF and the new Alfresco connector. Hope this helps :)&lt;/p&gt;</description>
         <guid isPermaLink="false">288041:2935920:33103572</guid>
         <pubDate>Sat, 23 Mar 2013 18:21:25 +0000</pubDate>
      </item>
      <item>
         <title>Listar usuarios en Share</title>
         <link>http://feedproxy.google.com/~r/blogspot/sttPqZ/~3/iXlAXbqYJnk/listar-usuarios-en-share.html</link>
         <description>&lt;div dir=&quot;ltr&quot; style=&quot;text-align:left;&quot;&gt;
Hace poco me han preguntado en un curso como se podia obtener el listado completo de usuarios desde la interfaz de Alfresco Share, que a diferencia del Alfresco Web explorer no tiene un boton del tipo &quot;mostrar todos&quot;.&lt;br /&gt;
&lt;br /&gt;
Hasta las versiones 4.1 siempre había recurrido al wildcard '*' ya que el mecanismo de búsqueda obligaba a poner almenos uno. Incluso en algunas búsquedas que exigen almenos 3 carácteres se había podido usar '***'.&lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear:both;text-align:center;&quot;&gt;
&lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://2.bp.blogspot.com/-DHF2Ki3Tkh0/UUrbtoYVLNI/AAAAAAAAAGs/P4cIYzoGi_A/s1600/search40.jpg&quot; style=&quot;margin-left:1em;margin-right:1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;199&quot; src=&quot;http://2.bp.blogspot.com/-DHF2Ki3Tkh0/UUrbtoYVLNI/AAAAAAAAAGs/P4cIYzoGi_A/s400/search40.jpg&quot; width=&quot;400&quot;/&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
En la versión 4.1.3 he podido comprobar como el asterisco '*' ya no devolvía ningún resultado, sin embargo tenemos la posibilidad de utilizar el wildcard '%' ya que las consultas de los usuarios se hacen a la base de datos para evitar problemas de consistencia con SOLR.&lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear:both;text-align:center;&quot;&gt;
&lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://2.bp.blogspot.com/-oF_neDvkD7E/UUrcbXN54zI/AAAAAAAAAG0/GhJmwHcPbpU/s1600/search41.jpg&quot; style=&quot;margin-left:1em;margin-right:1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;203&quot; src=&quot;http://2.bp.blogspot.com/-oF_neDvkD7E/UUrcbXN54zI/AAAAAAAAAG0/GhJmwHcPbpU/s400/search41.jpg&quot; width=&quot;400&quot;/&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;img src=&quot;http://feeds.feedburner.com/~r/blogspot/sttPqZ/~4/iXlAXbqYJnk&quot; height=&quot;1&quot; width=&quot;1&quot;/&gt;</description>
         <author>Raúl</author>
         <guid isPermaLink="false">tag:blogger.com,1999:blog-6921541245628552381.post-152458624940851330</guid>
         <pubDate>Thu, 21 Mar 2013 11:12:00 +0000</pubDate>
         <media:thumbnail height="72" url="http://2.bp.blogspot.com/-DHF2Ki3Tkh0/UUrbtoYVLNI/AAAAAAAAAGs/P4cIYzoGi_A/s72-c/search40.jpg" width="72" xmlns:media="http://search.yahoo.com/mrss/"/>
      </item>
      <item>
         <title>File System Transfer Reciever</title>
         <link>http://feedproxy.google.com/~r/blogspot/sttPqZ/~3/5OkISutrZIs/file-system-transfer-reciever.html</link>
         <description>&lt;div dir=&quot;ltr&quot; style=&quot;text-align:left;&quot;&gt;
&lt;br /&gt;
Cuando hablamos de replicación en Alfresco normalmente nos referimos a la replicación de contenidos entre repositorios de Alfresco, pero está no es la única opción que tenemos. En algunos casos por ejemplo podriamos estar ejecutando un sitio web con una tecnología diferente que simplemente requiera una estructura de ficheros en el filesystem, al más puro estilo CMS.&lt;br /&gt;
&lt;br /&gt;
Aunque el transfer service apareció por primera vez en la versión 3.3, no ha sido hasta la versión 4 cuando hemos podido tener una interfaz web que haga uso de este servicio&lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear:both;text-align:center;&quot;&gt;
&lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://4.bp.blogspot.com/-kqZYcTzJhds/UUouSGZfosI/AAAAAAAAAF0/99S52J2ffgM/s1600/fstr.jpg&quot; style=&quot;margin-left:1em;margin-right:1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;300&quot; src=&quot;http://4.bp.blogspot.com/-kqZYcTzJhds/UUouSGZfosI/AAAAAAAAAF0/99S52J2ffgM/s400/fstr.jpg&quot; width=&quot;400&quot;/&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
Algunas características del File System Transfer Reciever o FSTR:&lt;br /&gt;
&lt;br /&gt;
&lt;ul&gt;
&lt;li&gt;Permite transferir carpetas y contenido a un file system remoto a través del Transfer Service.&lt;/li&gt;
&lt;li&gt;El file system de destino se establece especializando el tipo transfer target a file system transfer.&lt;/li&gt;
&lt;li&gt;Nos permite establecer un mapeo entre la raíz del file system de origen y de destino.&lt;/li&gt;
&lt;li&gt;Soporta la sincronización del Replication Service&lt;/li&gt;
&lt;li&gt;Usa una base de datos derby para mantener el historial de nodos sincronizados (no usa la estructura del contentstore de Alfresco).&lt;/li&gt;
&lt;li&gt;Se ejecuta bajo una instancia de Tomcat 7 como una aplicación web usando el framework de webscripts&lt;/li&gt;
&lt;/ul&gt;
El File System Transfer Reciever que viene empaquetado como un zip que se instala a parte y está disponible tanto para versiones Community como Enterprise. La estructura del fichero zip es la siguiente:&lt;br /&gt;
&lt;br /&gt;
&lt;div style=&quot;direction:ltr;margin-bottom:0pt;margin-left:0in;margin-top:3.84pt;text-indent:0in;unicode-bidi:embed;&quot;&gt;
&lt;span style=&quot;color:#595959;font-family:'Courier New';&quot;&gt;|- classes/&lt;br /&gt;&amp;nbsp; |&amp;nbsp;&amp;nbsp; |-&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color:#595959;font-family:'Courier New';&quot;&gt;ftr-custom.properties&lt;/span&gt;&lt;span style=&quot;color:#595959;font-family:'Courier New';&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#595959;font-family:'Courier New';&quot;&gt;&amp;nbsp; |&amp;nbsp;&amp;nbsp; |- ftr-custom-context.xml&lt;br /&gt;&amp;nbsp; |&amp;nbsp;&amp;nbsp; |-&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color:#595959;font-family:'Courier New';&quot;&gt;ftr-launcher.properties&lt;/span&gt;&lt;span style=&quot;color:#595959;font-family:'Courier New';&quot;&gt;&lt;br /&gt;&amp;nbsp; |&amp;nbsp;&amp;nbsp; |- ftr-launcher-context.xml&lt;br /&gt;&amp;nbsp; |&amp;nbsp;&amp;nbsp; |- log4j.properties&lt;br /&gt;&amp;nbsp; |- lib/&lt;br /&gt;&amp;nbsp; |&amp;nbsp;&amp;nbsp; |- &amp;lt;various libs&amp;gt;&lt;br /&gt;&amp;nbsp; |-&lt;/span&gt;&lt;span style=&quot;color:#595959;font-family:'Courier New';&quot;&gt;webapps&lt;/span&gt;&lt;span style=&quot;color:#595959;font-family:'Courier New';&quot;&gt;/&lt;br /&gt;&amp;nbsp; |&amp;nbsp;&amp;nbsp; |- file-transfer-&lt;/span&gt;&lt;span style=&quot;color:#595959;font-family:'Courier New';&quot;&gt;receiver.war&lt;/span&gt;&lt;span style=&quot;color:#595959;font-family:'Courier New';&quot;&gt;&lt;br /&gt;&amp;nbsp; |- file-transfer-receiver.jar&lt;/span&gt;&lt;/div&gt;
&lt;br /&gt;
En los ficheros properties configuramos:&lt;br /&gt;
&lt;br /&gt;
ftr-launcher.properties&lt;br /&gt;
&lt;pre style=&quot;background-color:#eeeeee;border:1px dashed rgb(153, 153, 153);color:black;font-family:Andale Mono, Lucida Console, Monaco, fixed, monospace;font-size:12px;line-height:14px;overflow:auto;padding:5px;width:100%;&quot;&gt;&lt;code&gt;
&amp;nbsp; ftr.tomcat.baseDir=${user.dir}
&amp;nbsp; ftr.tomcat.portNum=9090
&lt;/code&gt; &lt;/pre&gt;
ftr-custom.properties&lt;br /&gt;
&lt;pre style=&quot;background-color:#eeeeee;border:1px dashed rgb(153, 153, 153);color:black;font-family:Andale Mono, Lucida Console, Monaco, fixed, monospace;font-size:12px;line-height:14px;overflow:auto;padding:5px;width:100%;&quot;&gt;&lt;code&gt;&amp;nbsp; 
&amp;nbsp; ftr.tomcat.portNum=9090
&amp;nbsp; fileTransferReceiver.stagingDirectory=./ftr-staging
&amp;nbsp; fileTransferReceiver.rootDirectory=./ftr-root
&amp;nbsp; fileTransferReceiver.jdbcUrl=jdbc:derby:./derbyDB;create=true;user=alfresco;password=alfresco
&amp;nbsp; fileTransferReceiver.username=admin
&amp;nbsp; fileTransferReceiver.password=admin
&lt;/code&gt;&lt;/pre&gt;
&lt;br /&gt;
El staging directory será el directorio temporal donde se va a realizar la replicación y una vez está haya concluido se moverá al root directory.&amp;nbsp; Una vez configurado levantaremos el servicio:&lt;br /&gt;
&lt;br /&gt;
&lt;span style=&quot;color:#595959;font-family:'Courier New';&quot;&gt;java –jar file-transfer-receiver.jar&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &lt;br /&gt;
En la interfaz de Share crearemos primero el target, para ello tendremos que crear una carpeta en la ruta siguiente:&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear:both;text-align:center;&quot;&gt;
&lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://3.bp.blogspot.com/-sJ3QBjmnaX4/UUo5XA9sWeI/AAAAAAAAAGA/WEZ8TQO2Amw/s1600/crumb.jpg&quot; style=&quot;margin-left:1em;margin-right:1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;http://3.bp.blogspot.com/-sJ3QBjmnaX4/UUo5XA9sWeI/AAAAAAAAAGA/WEZ8TQO2Amw/s1600/crumb.jpg&quot;/&gt;&lt;/a&gt;&lt;/div&gt;
La carpeta Default Group tiene una regla que automáticamente especializa las carpetas al tipo trx:transferTarget. Como en este caso lo que necesitamos es una especialización a trx:fileTransferTarget. A día de hoy y con la versión 4.1.3 no podremos realizar este cambio a menos que editmos el ficher share-config-custon.xml y añadamos a la seccion types lo siguiente:&lt;br /&gt;
&lt;br /&gt;
&lt;pre style=&quot;background-color:#eeeeee;border:1px dashed rgb(153, 153, 153);color:black;font-family:Andale Mono, Lucida Console, Monaco, fixed, monospace;font-size:12px;line-height:14px;overflow:auto;padding:5px;width:100%;&quot;&gt;&lt;code&gt;      &amp;lt;types&amp;gt;
         &amp;lt;type name=&quot;cm:content&quot;&amp;gt;
         &amp;lt;/type&amp;gt;

         &amp;lt;type name=&quot;cm:folder&quot;&amp;gt;
         &amp;lt;/type&amp;gt;

         &amp;lt;type name=&quot;trx:transferTarget&quot;&amp;gt;
               &amp;lt;subtype name=&quot;trx:fileTransferTarget&quot; /&amp;gt;
         &amp;lt;/type&amp;gt;
      &amp;lt;/types&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;br /&gt;
Además deberemos activar la replicación a nivel de configuración en el fichero alfresco-global.properties&lt;br /&gt;
&lt;pre style=&quot;background-color:#eeeeee;border:1px dashed rgb(153, 153, 153);color:black;font-family:Andale Mono, Lucida Console, Monaco, fixed, monospace;font-size:12px;line-height:14px;overflow:auto;padding:5px;width:100%;&quot;&gt;&lt;code&gt; replication.enabled=true&lt;/code&gt;&lt;/pre&gt;
En las acciones del directorio que acabamos de crear (pulsar 2 veces en el directorio creado sobre la barra de navegación) tendremos la accion Change Type y nos aparecerá un desplegable para especializar al tipo fileTransferTarget&lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear:both;text-align:center;&quot;&gt;
&lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://1.bp.blogspot.com/--0kPRLc7sAU/UUo8qkkmOwI/AAAAAAAAAGE/NfIrlbKYBHs/s1600/changetype.jpg&quot; style=&quot;margin-left:1em;margin-right:1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;http://1.bp.blogspot.com/--0kPRLc7sAU/UUo8qkkmOwI/AAAAAAAAAGE/NfIrlbKYBHs/s1600/changetype.jpg&quot;/&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
Editando las propiedades establecemos la configuración:&lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear:both;text-align:center;&quot;&gt;
&lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://3.bp.blogspot.com/-k-l3H2aOAPw/UUo-HOVOegI/AAAAAAAAAGM/nRz175rlCck/s1600/target.jpg&quot; style=&quot;margin-left:1em;margin-right:1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;http://3.bp.blogspot.com/-k-l3H2aOAPw/UUo-HOVOegI/AAAAAAAAAGM/nRz175rlCck/s1600/target.jpg&quot;/&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
Y configuramos el job de replicación a través de la consola de administración&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear:both;text-align:center;&quot;&gt;
&lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://4.bp.blogspot.com/-sNbBS7jNY7o/UUpBXIraPfI/AAAAAAAAAGc/S99yp3hU7pw/s1600/job.jpg&quot; style=&quot;margin-left:1em;margin-right:1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;http://4.bp.blogspot.com/-sNbBS7jNY7o/UUpBXIraPfI/AAAAAAAAAGc/S99yp3hU7pw/s1600/job.jpg&quot;/&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
Y ejecutamos o programamos el job. En la consola del fstr veremos un mensaje cuando se finalice la replicación&lt;br /&gt;
&lt;pre style=&quot;background-color:#eeeeee;border:1px dashed rgb(153, 153, 153);color:black;font-family:Andale Mono, Lucida Console, Monaco, fixed, monospace;font-size:12px;line-height:14px;overflow:auto;padding:5px;width:100%;&quot;&gt;&lt;code&gt;
Status update: COMPLETE&lt;/code&gt;&lt;/pre&gt;
&lt;br /&gt;
Y podemos comprobar que la estructura de ficheros aparece bajo la ruta configurada: &lt;br /&gt;
&lt;pre style=&quot;background-color:#eeeeee;border:1px dashed rgb(153, 153, 153);color:black;font-family:Andale Mono, Lucida Console, Monaco, fixed, monospace;font-size:12px;line-height:14px;overflow:auto;padding:5px;width:100%;&quot;&gt;&lt;code&gt;
alfresco@alfresco:/opt/ftr$ ls ftr-root/
Drafts&amp;nbsp; Effective&amp;nbsp; In Review&lt;/code&gt;&lt;/pre&gt;
&lt;br /&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;img src=&quot;http://feeds.feedburner.com/~r/blogspot/sttPqZ/~4/5OkISutrZIs&quot; height=&quot;1&quot; width=&quot;1&quot;/&gt;</description>
         <author>Raúl</author>
         <guid isPermaLink="false">tag:blogger.com,1999:blog-6921541245628552381.post-3526340333108267559</guid>
         <pubDate>Wed, 20 Mar 2013 23:24:00 +0000</pubDate>
         <media:thumbnail height="72" url="http://4.bp.blogspot.com/-kqZYcTzJhds/UUouSGZfosI/AAAAAAAAAF0/99S52J2ffgM/s72-c/fstr.jpg" width="72" xmlns:media="http://search.yahoo.com/mrss/"/>
      </item>
      <item>
         <title>Ocultando Iconos en Share (3.4)</title>
         <link>http://crisinthecloud.blogspot.com/2013/03/ocultando-iconos-en-share-34.html</link>
         <description>&lt;div style=&quot;text-align:justify;&quot;&gt;Muy buenas.&lt;/div&gt;&lt;div style=&quot;text-align:justify;&quot;&gt;Hace poco un cliente me pidió customizar y ocultar algunos componentes para que los usuarios que no tuvieran permisos de administrador no los vieran. En concreto me refiero a los de la cabecera:&lt;/div&gt;&lt;div style=&quot;text-align:justify;&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style=&quot;text-align:justify;&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear:both;text-align:center;&quot;&gt;&lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://4.bp.blogspot.com/-WXEs92C3_94/UUnYqIowEoI/AAAAAAAAANE/7uwkoLQ3C7g/s1600/icons_share.JPG&quot; style=&quot;margin-left:1em;margin-right:1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;63&quot; src=&quot;http://4.bp.blogspot.com/-WXEs92C3_94/UUnYqIowEoI/AAAAAAAAANE/7uwkoLQ3C7g/s400/icons_share.JPG&quot; width=&quot;400&quot;/&gt;&lt;/a&gt;&lt;/div&gt;&lt;div style=&quot;text-align:justify;&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style=&quot;text-align:justify;&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style=&quot;text-align:justify;&quot;&gt;&lt;/div&gt;&lt;div style=&quot;text-align:justify;&quot;&gt;Pues bien, os quiero enseñar cómo hacerlo siguiendo las buenas prácticas en Alfresco.&lt;/div&gt;&lt;div style=&quot;text-align:justify;&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style=&quot;text-align:justify;&quot;&gt;&lt;div class=&quot;separator&quot; style=&quot;clear:both;&quot;&gt;&lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://draft.blogger.com/blogger.g?blogID=256223976738939642&quot; style=&quot;margin-left:1em;margin-right:1em;&quot;&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear:both;&quot;&gt;&lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://draft.blogger.com/blogger.g?blogID=256223976738939642&quot; style=&quot;margin-left:1em;margin-right:1em;&quot;&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear:both;&quot;&gt;&lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://draft.blogger.com/blogger.g?blogID=256223976738939642&quot; style=&quot;margin-left:1em;margin-right:1em;&quot;&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear:both;&quot;&gt;&lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://draft.blogger.com/blogger.g?blogID=256223976738939642#editor/src=dashboard&quot; style=&quot;margin-left:1em;margin-right:1em;&quot;&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear:both;&quot;&gt;&lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://draft.blogger.com/blogger.g?blogID=256223976738939642&quot; style=&quot;margin-left:1em;margin-right:1em;&quot;&gt;&lt;/a&gt;&lt;/div&gt;Para filtrar los iconos, puedes configurarlo en el share-config-custom.xml (que debes tener ubicado en&amp;nbsp; /shared/clases/alfresco/web-extension/), entre los tags de &amp;lt;header&amp;gt; y &amp;lt;/header&amp;gt; tal y como muestro en la siguiente captura:&lt;/div&gt;&lt;div style=&quot;text-align:justify;&quot;&gt;&lt;div class=&quot;separator&quot; style=&quot;clear:both;&quot;&gt;&lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://4.bp.blogspot.com/-mUFt3QiChCk/UUnYqOVXYcI/AAAAAAAAANI/hiUNBz0-LjU/s1600/share_header.JPG&quot; style=&quot;margin-left:1em;margin-right:1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;444&quot; src=&quot;http://4.bp.blogspot.com/-mUFt3QiChCk/UUnYqOVXYcI/AAAAAAAAANI/hiUNBz0-LjU/s640/share_header.JPG&quot; width=&quot;640&quot;/&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style=&quot;text-align:justify;&quot;&gt;&lt;/div&gt;&lt;div style=&quot;text-align:justify;&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style=&quot;text-align:justify;&quot;&gt;Este fragmento, podéis copiarlo desde share-config.xml que tenéis ubicado en /webapps/share/WEB-INF/classes/alfresco/ y podeis pegarlo en vuestro share-condig personalizado dentro de web-extension como os comenté más arriba.&lt;/div&gt;&lt;div style=&quot;text-align:justify;&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style=&quot;text-align:justify;&quot;&gt;Si observáis, lo único que debéis es añadir en el apartado que queráis ocultar permission=&quot;admin&quot; y de esta forma solo será visible para éste.&lt;/div&gt;&lt;div style=&quot;text-align:justify;&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style=&quot;text-align:justify;&quot;&gt;&amp;nbsp;Por ejemplo:&lt;/div&gt;&lt;div style=&quot;text-align:justify;&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style=&quot;text-align:justify;&quot;&gt;&amp;nbsp;&amp;lt;item type=&quot;link&quot; id=&quot;repository&quot; permission=&quot;admin&quot;&amp;gt;/repository&amp;lt;/item&amp;gt;&amp;nbsp; &lt;/div&gt;&lt;div style=&quot;text-align:justify;&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style=&quot;text-align:justify;&quot;&gt;&lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://draft.blogger.com/blogger.g?blogID=256223976738939642&quot; style=&quot;clear:left;float:left;margin-bottom:1em;margin-right:1em;&quot;&gt;&lt;/a&gt;&lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://draft.blogger.com/blogger.g?blogID=256223976738939642#editor/src=dashboard&quot; style=&quot;clear:left;float:left;margin-bottom:1em;margin-right:1em;&quot;&gt;&lt;/a&gt;&lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://draft.blogger.com/blogger.g?blogID=256223976738939642&quot; style=&quot;clear:left;float:left;margin-bottom:1em;margin-right:1em;&quot;&gt;&lt;/a&gt;&lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://draft.blogger.com/blogger.g?blogID=256223976738939642&quot; style=&quot;clear:left;float:left;margin-bottom:1em;margin-right:1em;&quot;&gt;&lt;/a&gt;&lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://draft.blogger.com/blogger.g?blogID=256223976738939642&quot; style=&quot;clear:left;float:left;margin-bottom:1em;margin-right:1em;&quot;&gt;&lt;/a&gt;Con esa línea le decimos a Share que nos oculte el icono del repositoriopara todos aquellos usuarios que no sean administradores.&lt;/div&gt;&lt;div style=&quot;text-align:justify;&quot;&gt;&lt;/div&gt;&lt;div style=&quot;text-align:justify;&quot;&gt;&lt;/div&gt;&lt;div style=&quot;text-align:justify;&quot;&gt;&lt;/div&gt;&lt;div style=&quot;text-align:justify;&quot;&gt;&lt;br /&gt;El cliente necesitaba ocultar, además de estos iconos, la búsqueda del share que encontramos arriba a la derecha en el dashboard del usuario:&lt;/div&gt;&lt;div style=&quot;text-align:justify;&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style=&quot;text-align:justify;&quot;&gt;&lt;/div&gt;&lt;div style=&quot;text-align:justify;&quot;&gt;&lt;div class=&quot;separator&quot; style=&quot;clear:both;text-align:center;&quot;&gt;&lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://1.bp.blogspot.com/-wwSIxRmfa-c/UUnYqPA61OI/AAAAAAAAANM/uJuOs2GmSv8/s1600/search_share.JPG&quot; style=&quot;margin-left:1em;margin-right:1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;http://1.bp.blogspot.com/-wwSIxRmfa-c/UUnYqPA61OI/AAAAAAAAANM/uJuOs2GmSv8/s1600/search_share.JPG&quot;/&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style=&quot;text-align:justify;&quot;&gt;Pero desafortunadamente, para Alfresco 3.4 no es posible controlarlo en el header como los anteriores iconos. Así que optamos por lo más sencillo: Ocultarlo mediante una clase que la declaramos en un css con un display:none.&lt;/div&gt;&lt;div style=&quot;text-align:justify;&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style=&quot;text-align:justify;&quot;&gt;Espero que os haya servido de ayuda. De todas formas, a medida que vaya trabajando y sacando más cosillas os la iré compartiendo :-) &lt;/div&gt;&lt;div style=&quot;text-align:justify;&quot;&gt;&lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://draft.blogger.com/blogger.g?blogID=256223976738939642&quot; style=&quot;clear:left;float:left;margin-bottom:1em;margin-right:1em;&quot;&gt;&lt;/a&gt;&lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://draft.blogger.com/blogger.g?blogID=256223976738939642#editor/src=dashboard&quot; style=&quot;clear:left;float:left;margin-bottom:1em;margin-right:1em;&quot;&gt;&lt;/a&gt;&lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://draft.blogger.com/blogger.g?blogID=256223976738939642&quot; style=&quot;clear:left;float:left;margin-bottom:1em;margin-right:1em;&quot;&gt;&lt;/a&gt;&lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://draft.blogger.com/blogger.g?blogID=256223976738939642&quot; style=&quot;clear:left;float:left;margin-bottom:1em;margin-right:1em;&quot;&gt;&lt;/a&gt;&lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://draft.blogger.com/blogger.g?blogID=256223976738939642&quot; style=&quot;clear:left;float:left;margin-bottom:1em;margin-right:1em;&quot;&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style=&quot;text-align:justify;&quot;&gt;Un saludo! &lt;/div&gt;</description>
         <author>noreply@blogger.com (Cristina Martín)</author>
         <guid isPermaLink="false">tag:blogger.com,1999:blog-256223976738939642.post-349877717467376293</guid>
         <pubDate>Wed, 20 Mar 2013 19:00:00 +0000</pubDate>
         <media:thumbnail height="72" url="http://4.bp.blogspot.com/-WXEs92C3_94/UUnYqIowEoI/AAAAAAAAANE/7uwkoLQ3C7g/s72-c/icons_share.JPG" width="72" xmlns:media="http://search.yahoo.com/mrss/"/>
      </item>
      <item>
         <title>Java StringBuilder myth debunked -- now with content!</title>
         <link>http://feedproxy.google.com/~r/Skuro/~3/Pq9XIOM7i7g/</link>
         <description>&lt;h1&gt;The myth&lt;/h1&gt;

&lt;blockquote&gt;&lt;p&gt;Concatenating two Strings with the plus operator is the source of all evil&lt;/p&gt;

&lt;p&gt;-- Anonymous Java dev&lt;/p&gt;&lt;/blockquote&gt;

&lt;p&gt;&lt;em&gt;&lt;strong&gt;NOTE&lt;/strong&gt;: The source code for the tests discussed here can be found on &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;https://github.com/skuro/stringbuilder&quot;&gt;Github&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;It's from university time that I learned to regard &lt;code&gt;String&lt;/code&gt; concatenation in Java
using the '+' plus operator as a deadly performance sin. Recently there has been
an internal review at &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://www.backbase.com&quot;&gt;Backbase R&amp;amp;D&lt;/a&gt; where such recurring
mantra was dismissed as a myth due to &lt;code&gt;javac&lt;/code&gt; using &lt;code&gt;StringBuilder&lt;/code&gt; under the hood
any time you use the plus operator to join Strings. I set myself up to prove
such a point and verify the reality under different environments.&lt;/p&gt;

&lt;h1&gt;The test&lt;/h1&gt;

&lt;p&gt;Relying on your compiler to optimize your &lt;code&gt;String&lt;/code&gt; concatenation means that things
might change heavily depending on the JDK vendor you adopt. As far as platform
support goes for my daily job, three main vendors should be considered:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Oracle JDK&lt;/li&gt;
&lt;li&gt;IBM JDK&lt;/li&gt;
&lt;li&gt;ECJ -- for developers only&lt;/li&gt;
&lt;/ul&gt;


&lt;p&gt;Moreover, while we officially support Java 5 through 6, we are also looking into
supporting Java 7 for our products, adding another three-folded level of indirection on top of
the three vendors. For the sake of &lt;del&gt;lazyness&lt;/del&gt; simplicity, the &lt;code&gt;ecj&lt;/code&gt; compiled
bytecode will be run with a single JDK, namely Oracle JDK7.&lt;/p&gt;

&lt;p&gt;I prepared a &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;https://www.virtualbox.org/&quot;&gt;Virtualbox&lt;/a&gt; VM with all the above JDK
installed, then I developed some classes to express three different concatenation
methods, amounting to three to four concatenations per method invocaiton,
depending on the specific test case.&lt;/p&gt;

&lt;p&gt;The test classes are run a thousands times for each test round, with a total of
100 rounds each test case. The same VM is used to run all the rounds for the same
test case, and it's restarted across different test cases, all to let the Java
runtime perform all the optimizations it can, without affecting the other test
cases in any way. The default options were used to start all JVMs.&lt;/p&gt;

&lt;p&gt;More details can be found in the benchmark runner &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;https://github.com/skuro/stringbuilder/blob/master/bench.sh&quot;&gt;script&lt;/a&gt;.&lt;/p&gt;

&lt;h1&gt;The code&lt;/h1&gt;

&lt;p&gt;Full code for both test cases and the test suite is available on &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;https://github.com/skuro/stringbuilder&quot;&gt;Github&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;The following different test cases were produced to measure performance
differences of the String concatenation with plus against the direct use of a
&lt;code&gt;StringBuilder&lt;/code&gt;:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;// String concat with plus
String result = &quot;const1&quot; + base;
result = result + &quot;const2&quot;;
&lt;/code&gt;&lt;/pre&gt;

&lt;hr /&gt;

&lt;pre&gt;&lt;code&gt;// String concat with a StringBuilder
new StringBuilder()
              .append(&quot;const1&quot;)
              .append(base)
              .append(&quot;const2&quot;)
              .append(append)
              .toString();
}
&lt;/code&gt;&lt;/pre&gt;

&lt;hr /&gt;

&lt;pre&gt;&lt;code&gt;//String concat with an initialized StringBuilder
new StringBuilder(&quot;const1&quot;)
              .append(base)
              .append(&quot;const2&quot;)
              .append(append)
              .toString();
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;The general idea is to provide a concatenation both at the head and at the tail
of constant &lt;code&gt;String&lt;/code&gt;s over a variable. The difference between the last two cases,
both making explicit use of &lt;code&gt;StringBuilder&lt;/code&gt;, is in the latter using the 1-arg
constructor which initializes the builder with the initial part of the result.&lt;/p&gt;

&lt;h1&gt;The results&lt;/h1&gt;

&lt;p&gt;Enough talking, down below here you can have a look at the generated graphs, where
each data point corresponds to a single test round (e.g. 1000 executions of the same
test class).&lt;/p&gt;

&lt;p&gt;The discussion of the results and some more juicy details will follow.&lt;/p&gt;

&lt;h2&gt;&lt;img title=&quot;Concatenation with plus&quot; alt=&quot;Concatenation with plus&quot;/&gt;&lt;/h2&gt;

&lt;h2&gt;&lt;img title=&quot;Concatenation with StringBuilder&quot; alt=&quot;Concatenation with StringBuilder&quot;/&gt;&lt;/h2&gt;

&lt;p&gt;&lt;img title=&quot;Concatenation with initalized StringBuilder&quot; alt=&quot;Concatenation with initialized StringBuilder&quot;/&gt;&lt;/p&gt;

&lt;h1&gt;The discussion&lt;/h1&gt;

&lt;p&gt;Oracle JKD5 is the clear loser here, appearing to be in a B league when compared
to the others. But that's not really the scope of this exercise, and thus we'll
gloss over it for the time being.&lt;/p&gt;

&lt;p&gt;That said, there are two other interesting bits I observe in the above graph. The first is that indeed
there is generally quite a difference between the use of the plus operator vs an explicit
&lt;code&gt;StringBuilder&lt;/code&gt;, &lt;em&gt;especially&lt;/em&gt; if you're using Oracle Java5 which performs tree
times worse the the rest of the crew.&lt;/p&gt;

&lt;p&gt;The second observation is that while it generally holds for most of the JDKs that
an explicit &lt;code&gt;StringBuilder&lt;/code&gt; will offer up to twice the speed as the regular plus
operator, &lt;strong&gt;IBM JDK6 seems not to suffer&lt;/strong&gt; from any performance loss, always averaging
25ms to complete the task in all test cases.&lt;/p&gt;

&lt;p&gt;A closer look at the generated bytecode reveals some interesting details&lt;/p&gt;

&lt;h1&gt;The bytecode&lt;/h1&gt;

&lt;p&gt;&lt;em&gt;&lt;strong&gt;NOTE:&lt;/strong&gt; the decompiled classes are also available on &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;https://github.com/skuro/stringbuilder&quot;&gt;Github&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Across all possible JDKs &lt;code&gt;StringBuilders&lt;/code&gt; are &lt;strong&gt;always&lt;/strong&gt; used to implement &lt;code&gt;String&lt;/code&gt;
concatenation even in presence of a plus sign.
Moreover, across all vendors and versions, &lt;strong&gt;there is almost no difference at all&lt;/strong&gt;
for the same test case. The only one that stands a bit apart is &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;https://github.com/skuro/stringbuilder/blob/master/ecj/CatPlus.class.txt&quot;&gt;&lt;code&gt;ecj&lt;/code&gt;&lt;/a&gt;,
which is the only one to cleverly optimize the &lt;code&gt;CatPlus&lt;/code&gt; test case to invoke
the 1-arg constructor of the &lt;code&gt;StringBuilder&lt;/code&gt; instead of the 0-arg version.&lt;/p&gt;

&lt;p&gt;Comparing the resulting bytecode exposes what could affect performance in the
different scnarios:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;when concatenating with plus, &lt;em&gt;new instances of &lt;code&gt;StringBuilder&lt;/code&gt;&lt;/em&gt; are created
any time a concatenation happens. This can easily result in a performance
degradation due to useless invocation of the constructor plus more stress on
the garbage collector due to throw away instances&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;compilers will take you literally and only initalize &lt;code&gt;StringBuilder&lt;/code&gt; with its
1-arg constructor if and only if you write it that way in the original code. This
results in respectively four and three invocations of &lt;code&gt;StringBuilder.append&lt;/code&gt; for
&lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;https://github.com/skuro/stringbuilder/blob/master/ecj/CatSB.class.txt&quot;&gt;CatSB&lt;/a&gt; and &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;https://github.com/skuro/stringbuilder/blob/master/ecj/CatSB2.class.txt&quot;&gt;CatSB2&lt;/a&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;


&lt;h1&gt;The conclusion&lt;/h1&gt;

&lt;p&gt;Bytecode analysis offers the final answer to the original question.&lt;/p&gt;

&lt;blockquote&gt;&lt;p&gt;Do you need to explicitly use a &lt;code&gt;StringBuilder&lt;/code&gt; to improve performance? &lt;strong&gt;Yes&lt;/strong&gt;&lt;/p&gt;&lt;/blockquote&gt;

&lt;p&gt;The above graphs clearly show that, unless you're using IBM JDK6 runtime, you will
loss 50% performance when using the plus operator, although it's the one to perform
slightly worse across the candidates when expliciting &lt;code&gt;StringBuilder&lt;/code&gt;s.&lt;/p&gt;

&lt;p&gt;Also, it's quite interesting to see how &lt;em&gt;JIT optimizations&lt;/em&gt; impact the overall
performance: for instance, even in presence of different bytecode between the two
explicit &lt;code&gt;StringBuilder&lt;/code&gt; test cases, the end result is absolutely the same in the
long run.&lt;/p&gt;

&lt;p&gt;&lt;img alt=&quot;Myth confirmed&quot;/&gt;&lt;/p&gt;
&lt;div class=&quot;feedflare&quot;&gt;
&lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://feeds.feedburner.com/~ff/Skuro?a=Pq9XIOM7i7g:YiD6hL2RG7A:yIl2AUoC8zA&quot;&gt;&lt;img src=&quot;http://feeds.feedburner.com/~ff/Skuro?d=yIl2AUoC8zA&quot; border=&quot;0&quot;&gt;&lt;/a&gt; &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://feeds.feedburner.com/~ff/Skuro?a=Pq9XIOM7i7g:YiD6hL2RG7A:V_sGLiPBpWU&quot;&gt;&lt;img src=&quot;http://feeds.feedburner.com/~ff/Skuro?i=Pq9XIOM7i7g:YiD6hL2RG7A:V_sGLiPBpWU&quot; border=&quot;0&quot;&gt;&lt;/a&gt; &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://feeds.feedburner.com/~ff/Skuro?a=Pq9XIOM7i7g:YiD6hL2RG7A:7Q72WNTAKBA&quot;&gt;&lt;img src=&quot;http://feeds.feedburner.com/~ff/Skuro?d=7Q72WNTAKBA&quot; border=&quot;0&quot;&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src=&quot;http://feeds.feedburner.com/~r/Skuro/~4/Pq9XIOM7i7g&quot; height=&quot;1&quot; width=&quot;1&quot;/&gt;</description>
         <guid isPermaLink="false">http://skuro.tk/2013/03/11/java-stringbuilder-myth-now-with-content/</guid>
         <pubDate>Sun, 10 Mar 2013 23:00:00 +0000</pubDate>
      </item>
      <item>
         <title>The Observer Pattern in Spring</title>
         <link>http://feedproxy.google.com/~r/Skuro/~3/PJI3JSXZqsI/</link>
         <description>&lt;h1&gt;Observers in Spring&lt;/h1&gt;

&lt;blockquote&gt;&lt;p&gt;To the man-in-the-street, who, I'm sorry to say,&lt;br/&gt;
Is a keen observer of life,&lt;br/&gt;
The word &quot;Intellectual&quot; suggests straight away&lt;br/&gt;
A man who's untrue to his wife.&lt;/p&gt;

&lt;p&gt;-- W.H. Auden&lt;/p&gt;&lt;/blockquote&gt;

&lt;p&gt;The Observer pattern is a very basic one out of the GoF bible which is unbelivably easy to implement and still quote
powerful so use. Here I present my take on it using the Spring observer pattern which I found quite helpful in designing
extension points for my software.&lt;/p&gt;

&lt;h1&gt;Core classes&lt;/h1&gt;

&lt;p&gt;Pushing back the little NIH devil whispering in my ears, I started by reusing the standard building blocks for the
Observer pattern: &lt;code&gt;java.util.Observable&lt;/code&gt; and &lt;code&gt;java.util.Observer&lt;/code&gt;. The Observable class provides the logic to handle a
registry of Observers, and to propagate updates (I prefer to think more of in terms of events) to all of the registered
Observers.&lt;/p&gt;

&lt;p&gt;In the context of a Spring container, there will be beans to configure and hook together, and it's key to this exercise
to find a flexible and handy way to connect things together.&lt;/p&gt;

&lt;h1&gt;Automatic registration&lt;/h1&gt;

&lt;p&gt;Supporting code for this blog post can be found on &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;https://github.com/skuro/spring-observer&quot;&gt;GitHub&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;When developing a Spring application you're always instantiating your classes as singletons within the Spring container.
Annotations or XML configurations will take care  of initialize instances of your classes, wiring them together in a
connected graph of objects with loose dependencies on the specific concrete classes you adopt in your code.&lt;/p&gt;

&lt;p&gt;As you will always have to declare beans, it would be nice to let Spring wire obects for you in an Observer fashion,
with a minimal coding effort required. The most minimalistic approach I could think of is to just require developers to
declare their observer beans, and put in place enough machinery to automatically hook them to an Observable provided by
the application. In this example I create a &lt;code&gt;ObserverBeanPostProcessor&lt;/code&gt; and a &lt;code&gt;SpringObserver&lt;/code&gt;
tagging interface to identify which beans are actually declaring valid Observers, and register them automatically.&lt;/p&gt;

&lt;p&gt;To complete the picture, the &lt;code&gt;SpringObservable&lt;/code&gt; interface declares which &lt;code&gt;Observer&lt;/code&gt; class it's able to notify, thus
leveraging the tagging interface and letting the &lt;code&gt;ObserverBeanPostProcessor&lt;/code&gt; know which beans to filter and registser.&lt;/p&gt;

&lt;p&gt;This enables a software component to provide the desired &lt;code&gt;SpringObservable&lt;/code&gt; and the &lt;code&gt;ObserverBeanPostProcessor&lt;/code&gt; beans, where
consumers of such API will be only required to instantiate their &lt;code&gt;Observer&lt;/code&gt; beans.&lt;/p&gt;

&lt;p&gt;Note that &lt;code&gt;Observers&lt;/code&gt; can be themselves &lt;code&gt;Observables&lt;/code&gt;, so that you can easily construct chains of beans in which events
will be propagated. As long as you ensure not to form any cyclic graph, of course.&lt;/p&gt;

&lt;h1&gt;Conclusions&lt;/h1&gt;

&lt;p&gt;In object oriented languages such as Java, patterns are a powerful tool to apply. The Observer is a neat strategy for
cascading changes on objects, or just to propagate events through a series of processors. All in a clean, loosly coupled
fashion.&lt;/p&gt;

&lt;p&gt;The code here is just a proof of concept, not a library which is intended for production use. The concepts and the
implementation are easy enough to be applied in your Spring application without any need for depending on this code.&lt;/p&gt;
&lt;div class=&quot;feedflare&quot;&gt;
&lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://feeds.feedburner.com/~ff/Skuro?a=PJI3JSXZqsI:-FL7Nn6e4fU:yIl2AUoC8zA&quot;&gt;&lt;img src=&quot;http://feeds.feedburner.com/~ff/Skuro?d=yIl2AUoC8zA&quot; border=&quot;0&quot;&gt;&lt;/a&gt; &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://feeds.feedburner.com/~ff/Skuro?a=PJI3JSXZqsI:-FL7Nn6e4fU:V_sGLiPBpWU&quot;&gt;&lt;img src=&quot;http://feeds.feedburner.com/~ff/Skuro?i=PJI3JSXZqsI:-FL7Nn6e4fU:V_sGLiPBpWU&quot; border=&quot;0&quot;&gt;&lt;/a&gt; &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://feeds.feedburner.com/~ff/Skuro?a=PJI3JSXZqsI:-FL7Nn6e4fU:7Q72WNTAKBA&quot;&gt;&lt;img src=&quot;http://feeds.feedburner.com/~ff/Skuro?d=7Q72WNTAKBA&quot; border=&quot;0&quot;&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src=&quot;http://feeds.feedburner.com/~r/Skuro/~4/PJI3JSXZqsI&quot; height=&quot;1&quot; width=&quot;1&quot;/&gt;</description>
         <guid isPermaLink="false">http://skuro.tk/2013/03/10/observer-pattern-spring-framework/</guid>
         <pubDate>Sat, 09 Mar 2013 23:00:00 +0000</pubDate>
      </item>
      <item>
         <title>Apache ManifoldCF @ Alfresco Meetup</title>
         <link>http://www.open4dev.com/journal/2013/3/8/apache-manifoldcf-alfresco-meetup.html</link>
         <description>&lt;p style=&quot;text-align:justify;&quot;&gt;&lt;span class=&quot;full-image-float-right ssNonEditable&quot;&gt;&lt;img src=&quot;http://www.open4dev.com/storage/img/logos/alfresco-logo.png?__SQUARESPACE_CACHEVERSION=1276095735503&quot; alt=&quot;Alfresco logo&quot;/&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;I have a slot during the Alfresco Meetup to talk about Apache ManifoldCF and the new connector that I'm developing with Maurizio Pillitu (Alfresco).&lt;/p&gt;</description>
         <guid isPermaLink="false">288041:2935920:32942285</guid>
         <pubDate>Fri, 08 Mar 2013 11:47:02 +0000</pubDate>
      </item>
      <item>
         <title>Java StringBuilder myth debunked</title>
         <link>http://feedproxy.google.com/~r/Skuro/~3/Qog6jmpTwKs/</link>
         <description>&lt;p&gt;&lt;em&gt;NOTE: this post was published before it was ready, the real content can now be found &lt;a rel=&quot;nofollow&quot;&gt;here&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;
&lt;div class=&quot;feedflare&quot;&gt;
&lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://feeds.feedburner.com/~ff/Skuro?a=Qog6jmpTwKs:_FjnORwhw7Y:yIl2AUoC8zA&quot;&gt;&lt;img src=&quot;http://feeds.feedburner.com/~ff/Skuro?d=yIl2AUoC8zA&quot; border=&quot;0&quot;&gt;&lt;/a&gt; &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://feeds.feedburner.com/~ff/Skuro?a=Qog6jmpTwKs:_FjnORwhw7Y:V_sGLiPBpWU&quot;&gt;&lt;img src=&quot;http://feeds.feedburner.com/~ff/Skuro?i=Qog6jmpTwKs:_FjnORwhw7Y:V_sGLiPBpWU&quot; border=&quot;0&quot;&gt;&lt;/a&gt; &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://feeds.feedburner.com/~ff/Skuro?a=Qog6jmpTwKs:_FjnORwhw7Y:7Q72WNTAKBA&quot;&gt;&lt;img src=&quot;http://feeds.feedburner.com/~ff/Skuro?d=7Q72WNTAKBA&quot; border=&quot;0&quot;&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src=&quot;http://feeds.feedburner.com/~r/Skuro/~4/Qog6jmpTwKs&quot; height=&quot;1&quot; width=&quot;1&quot;/&gt;</description>
         <guid isPermaLink="false">http://skuro.tk/2013/03/06/java-stringbuilder-myth/</guid>
         <pubDate>Tue, 05 Mar 2013 23:00:00 +0000</pubDate>
      </item>
      <item>
         <title>Finding a penny</title>
         <link>http://wanderingalfresco.wordpress.com/2013/02/27/finding-a-penny/</link>
         <description>Sometimes you stumble across a really valuable tip and just have to share it. I just got one such tip from Loftux in the IRC chat this morning: Back when we upgraded from 3.4.x to 4.0.2.9, we had a bunch &amp;#8230; &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://wanderingalfresco.wordpress.com/2013/02/27/finding-a-penny/&quot;&gt;Continue reading &lt;span class=&quot;meta-nav&quot;&gt;&amp;#8594;&lt;/span&gt;&lt;/a&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://stats.wordpress.com/b.gif?host=wanderingalfresco.wordpress.com&amp;#038;blog=23905304&amp;#038;post=201&amp;#038;subd=wanderingalfresco&amp;#038;ref=&amp;#038;feed=1&quot; width=&quot;1&quot; height=&quot;1&quot;/&gt;</description>
         <guid isPermaLink="false">http://wanderingalfresco.wordpress.com/?p=201</guid>
         <pubDate>Wed, 27 Feb 2013 15:31:52 +0000</pubDate>
         <content:encoded><![CDATA[<p>Sometimes you stumble across a really valuable tip and just have to share it.  I just got one such tip from <a rel="nofollow" target="_blank" href="http://loftux.com">Loftux</a> in the IRC chat this morning:</p>
<p>Back when we upgraded from 3.4.x to 4.0.2.9, we had a bunch of problems with getting our production database to upgrade properly. Thanks to some really great help from Alfresco&#8217;s support team (thanks Kyle!), we were able to successfully manipulate the database to allow the upgrade to complete successfully.  The worrisome thing about this is that the databases for our development and QA instances upgraded without a hitch.  </p>
<p>Because of that, we learned to always test a major upgrade on a copy of the production database and repository. The only hard thing about that is that making a copy of our nearly-3-TB production repository to be able to test an upgrade is a real pain.  This is where the tip from Loftux comes in.  He wrote:</p>
<p style="font-family:Monaco, Courier, monospace;line-height:140%;border:1px dashed #aaa8a8;font-size:80%;color:#080;background-color:#f7f7f7;margin:1em 0;padding:.5em 0 .3em .5em;word-wrap:normal;width:100%;">Upgrade tip: Create a copy instance from backup with only the database, skip content (alf_data). Then in alfresco-global.properties set system.bootstrap.config_check.strict=false. Then you can run the upgrade and test that all the patches work without having to copy all your content data. This is an important first test. Your instance will not be usable (you have no content), but saves you the trouble copying all that file content.</p>
<p>Thanks Loftux!</p>
<br />  <a rel="nofollow" target="_blank" href="http://feeds.wordpress.com/1.0/gocomments/wanderingalfresco.wordpress.com/201/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/wanderingalfresco.wordpress.com/201/"/></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=wanderingalfresco.wordpress.com&#038;blog=23905304&#038;post=201&#038;subd=wanderingalfresco&#038;ref=&#038;feed=1" width="1" height="1"/>]]></content:encoded>
         <media:content medium="image" url="http://0.gravatar.com/avatar/08db656472ec0d3b2ae3355095abbf5d?s=96&amp;amp;d=identicon&amp;amp;r=G">
            <media:title type="html">icrew</media:title>
         </media:content>
         <category>Uncategorized</category>
      </item>
      <item>
         <title>Apache ManifoldCF 1.1.1 released</title>
         <link>http://www.open4dev.com/journal/2013/2/19/apache-manifoldcf-111-released.html</link>
         <description>&lt;p&gt;&lt;span class=&quot;ssNonEditable full-image-float-right&quot;&gt;&lt;img src=&quot;http://www.open4dev.com/storage/img/logos/ManifoldCF-logo.PNG?__SQUARESPACE_CACHEVERSION=1310116095291&quot; alt=&quot;Apache ManifoldCF logo&quot;/&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;We are proud to announce that we have released Apache ManifoldCF 1.1.1.&lt;/p&gt;
&lt;p&gt;Many improvements are included in this latest release, starting from CMIS, LDAP and JDBC Connector and then about Kerberos, NTLM and Solr. And much more!!!&lt;/p&gt;</description>
         <guid isPermaLink="false">288041:2935920:32837840</guid>
         <pubDate>Tue, 19 Feb 2013 09:47:26 +0000</pubDate>
      </item>
      <item>
         <title>Alfresco Java-Backed WebScripts demo updated</title>
         <link>http://www.open4dev.com/journal/2013/2/19/alfresco-java-backed-webscripts-demo-updated.html</link>
         <description>&lt;p style=&quot;text-align:justify;&quot;&gt;&lt;span class=&quot;full-image-float-right ssNonEditable&quot;&gt;&lt;img src=&quot;http://www.open4dev.com/storage/img/logos/alfresco-logo.png?__SQUARESPACE_CACHEVERSION=1276095735503&quot; alt=&quot;Alfresco logo&quot;/&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;Recently I have updated my project dedicated to show how to implement Alfresco Java-Backed WebScripts. All the examples are related to the official Alfresco Wiki.&lt;/p&gt;</description>
         <guid isPermaLink="false">288041:2935920:32837718</guid>
         <pubDate>Tue, 19 Feb 2013 08:08:22 +0000</pubDate>
      </item>
      <item>
         <title>Starting and Stopping Alfresco the Admin Way : Using Init</title>
         <link>http://www.contentreich.de/starting-and-stopping-alfresco-the-admin-way-using-init</link>
         <description>&lt;p&gt;&lt;img width=&quot;150&quot; height=&quot;150&quot; src=&quot;http://www.contentreich.de/wp-content/uploads/2013/02/5135243026_8dfbf4ec5e_blog-150x150.jpg&quot; class=&quot;attachment-thumbnail wp-post-image&quot; alt=&quot;Starting and Stopping Alfresco the Admin Way : Using Init&quot; title=&quot;Starting and Stopping Alfresco the Admin Way : Using Init&quot; style=&quot;float:right;&quot;/&gt;Running a Java process as a service has always been somewhat messy and causing headaches. This post gives a recipe to hook Alfresco system lifecyle to init - starting and stopping it the admin way. &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://www.contentreich.de/starting-and-stopping-alfresco-the-admin-way-using-init&quot;&gt;Weiterlesen &lt;span class=&quot;meta-nav&quot;&gt;&amp;#8594;&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;The post &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://www.contentreich.de/starting-and-stopping-alfresco-the-admin-way-using-init&quot;&gt;Starting and Stopping Alfresco the Admin Way : Using Init&lt;/a&gt; appeared first on &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://www.contentreich.de&quot;&gt;CONTENTREICH&lt;/a&gt;.&lt;/p&gt;</description>
         <guid isPermaLink="false">http://www.contentreich.de/?p=3097</guid>
         <pubDate>Mon, 18 Feb 2013 08:35:34 +0000</pubDate>
         <content:encoded><![CDATA[<div class="alignleft labeledImage "><img src="http://www.contentreich.de/wp-content/uploads/2013/02/5135243026_8dfbf4ec5e_blog.jpg" alt="Image of a power switch" width="275" height="275" class="alignleft size-full wp-image-3098"/></div>
<p>Running a Java process as a service has always been somewhat messy and causing headaches. In the typical case of the tomcat lifecyle, there are usually are a bunch of shell scripts involved. This post gives a recipe to hook Alfresco system lifecyle to init and to behave like an admin might expect.</p>
<p>Admins want tomcat to start and stop when the system goes up or down. And they want this to happen in an absolutely reliable way. If they tell it to stop, they want it to stop. They don&#8217;t care whether the process is out of memory or stuck for another reason. And most likely, admins do not want the process to run with root privileges. Still it may be required to bind to privileged ports.</p>
<h2>System Lifecycle Management Tooling Provided</h2>
<p>The interactive Alfresco installer provides you with a shell-script <code>alfresco.sh</code> to start and stop the system. Even database lifecycle is managed by this script if you chose to install the database as well. On top of that, there even is a graphical manager app. There is nothing wrong which these tools &#8211; they are great for initial exploration, but they are not really suited for <code>init</code> or <code>upstart</code> and hence, systems in production.</p>
<h2>Hooking Alfresco System Lifecycle to Init</h2>
<p>I have been writing at least half a dozen init shell scripts to manage lifecycle of Java based daemons. This time I wanted something ready made and maintained by other people. As expected, there is a <code>tomcat7</code> package for Ubuntu (and other Debians most likely) shipping a fairly decent <code>/etc/init.d/tomcat7</code> script. It reads configuration from <code>/etc/default/tomcat7</code>, so that is the place to set some variables, such as <code>TOMCAT7_USER</code>, <code>TOMCAT7_GROUP</code>, <code>JAVA_HOME</code>, <code>JAVA_OPTS</code>, <code>AUTHBIND</code>, <code>CATALINA_HOME</code>, <code>CATALINA_BASE</code> and some more. Setting it up is self explanatory. The init-script expects <code>$CATALINA_BASE/conf/policy.d</code> for concatenation as <code>$CATALINA_BASE/work/catalina.policy</code>. I have not checked what the package ships, but assuming it is sane, you can copy it to the Alfresco tomcat installation, e.g.:</p>
<pre>
cp -r /etc/tomcat7/policy.d /opt/alfresco/tomcat/conf
</pre>
<p>Beware of <code>tomcat/bin/setenv.sh</code> shipped with Alfresco. It unconditionally sets <code>JAVA_HOME</code>. The init script will fail if the value differs from the one in <code>/etc/default/tomcat7</code>. Hence, it is safer to wrap it:</p>
<pre>
if [ -z &quot;$JAVA_HOME&quot; ] ; then
    JAVA_HOME=/opt/alfresco_42s/java
    JRE_HOME=/opt/alfresco_42s/java
    JAVA_OPTS=&quot;$JAVA_OPTS &quot;
    export JAVA_HOME
    export JRE_HOME
    export JAVA_OPTS
fi
</pre>
<p>Finally, you may want to try it out </p>
<pre>
/etc/init.d/tomcat7 start
</pre>
<p>and create appropriate links for init</p>
<pre>
sudo update-rc.d tomcat defaults
</pre>
<p>Beware that <code>alfresco.sh</code> and <code>tomcat7</code> don&#8217;t mix. They both work on their own. But using one to start, the other to stop won&#8217;t work. This is due to the different pid file they use.</p>
<h2>References</h2>
<ul>
<li><a rel="nofollow" target="_blank" href="http://www.flickr.com/photos/sparkieblues">Image Credits</a></li>
</ul>
<div class="social-ring">
<div class="social-ring-button"><a rel="nofollow" target="_blank" href="http://twitter.com/share" lang="en" class="sr-twitter-button twitter-share-button"></a></div>
<div class="social-ring-button"><div class="g-plusone"></div></div>
<div class="social-ring-button"></div> 
<div class="social-ring-button"></div> 
</div><div style="clear:both;">&nbsp;</div>
<p>The post <a rel="nofollow" target="_blank" href="http://www.contentreich.de/starting-and-stopping-alfresco-the-admin-way-using-init">Starting and Stopping Alfresco the Admin Way : Using Init</a> appeared first on <a rel="nofollow" target="_blank" href="http://www.contentreich.de">CONTENTREICH</a>.</p>]]></content:encoded>
      </item>
      <item>
         <title>A svn post commit hook to comment on Jira</title>
         <link>http://feedproxy.google.com/~r/Skuro/~3/56GI2XcFh6g/</link>
         <description>&lt;p&gt;If I had to pick a single thing that really bothers me of &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;https://confluence.atlassian.com/display/AOD/JIRA+OnDemand&quot;&gt;Jira OnDemand&lt;/a&gt;
is that it &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;https://jira.atlassian.com/browse/AOD-710&quot;&gt;doesn't support our hosted svn&lt;/a&gt; in any
possible way.&lt;/p&gt;

&lt;p&gt;The biggest pain developers like me have without any basic integration between the VCS and the ticketing system is that any time you have to
test an issue, perform some code reviews, sort out some merging or simply digging the history of a given piece of code, it wastes your time to
switch between all of your unconnected tools to accomplish your task. As an example, at &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://www.backbase.com&quot;&gt;Backbase&lt;/a&gt; we use
&lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://trac.edgewall.org/&quot;&gt;Trac&lt;/a&gt; to look at our code on a browser, and we end up having to type URLs by hand to switch on and off Jira.&lt;/p&gt;

&lt;p&gt;How hard could it be to simply &lt;em&gt;link&lt;/em&gt; Jira to our commits?&lt;/p&gt;

&lt;h2&gt;A hint to the solution&lt;/h2&gt;

&lt;p&gt;Looking at a way to fix this issue, I first had an intuition: what our Jira &lt;em&gt;does&lt;/em&gt; support are web links to an issue. Trac is
just another web site, why can't we use application links instead of listing the commit messages as Jira comments? After all,
there's a &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;https://developer.atlassian.com/display/JIRADEV/JIRA+REST+API+for+Remote+Issue+Links&quot;&gt;rich API&lt;/a&gt; that I can use to
script the hell out of our commits! It literally took me 40 minutes to come up with the following:&lt;/p&gt;

 


&lt;p&gt;It currently features:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;creates a &lt;em&gt;Related commits&lt;/em&gt; link on each Jira issue mentioned in your commit comment&lt;/li&gt;
&lt;li&gt;multiple Jira keys in the same commit message supported&lt;/li&gt;
&lt;/ul&gt;


&lt;p&gt;That's it. Not an impressive list of features, but enough for 40m hacking on bash scripts. When we'll have this hook installed
in our svn server, we can easily go from the Jira issue to all the diffs associated with it.&lt;/p&gt;

&lt;p&gt;This facilitates code reviews and
issue verification or analysis at a later stage, enormously simplifying the life of every developer by providing that dead-simple
integration that Atlassian doesn't want to provide out of the box.&lt;/p&gt;

&lt;p&gt;I understand the performance reasons behind avoid fully integrating
on-premise svn with OnDemand instances. Still, they could do much, much better than say they're sorry and live their customers
lives being miserable because of it.&lt;/p&gt;
&lt;div class=&quot;feedflare&quot;&gt;
&lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://feeds.feedburner.com/~ff/Skuro?a=56GI2XcFh6g:Qfk6xSpLUuk:yIl2AUoC8zA&quot;&gt;&lt;img src=&quot;http://feeds.feedburner.com/~ff/Skuro?d=yIl2AUoC8zA&quot; border=&quot;0&quot;&gt;&lt;/a&gt; &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://feeds.feedburner.com/~ff/Skuro?a=56GI2XcFh6g:Qfk6xSpLUuk:V_sGLiPBpWU&quot;&gt;&lt;img src=&quot;http://feeds.feedburner.com/~ff/Skuro?i=56GI2XcFh6g:Qfk6xSpLUuk:V_sGLiPBpWU&quot; border=&quot;0&quot;&gt;&lt;/a&gt; &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://feeds.feedburner.com/~ff/Skuro?a=56GI2XcFh6g:Qfk6xSpLUuk:7Q72WNTAKBA&quot;&gt;&lt;img src=&quot;http://feeds.feedburner.com/~ff/Skuro?d=7Q72WNTAKBA&quot; border=&quot;0&quot;&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src=&quot;http://feeds.feedburner.com/~r/Skuro/~4/56GI2XcFh6g&quot; height=&quot;1&quot; width=&quot;1&quot;/&gt;</description>
         <guid isPermaLink="false">http://skuro.tk/2013/02/18/svn-postcommit-hook-jira-comments/</guid>
         <pubDate>Sun, 17 Feb 2013 23:00:00 +0000</pubDate>
      </item>
      <item>
         <title>Alfresco Google Docs integration – not very usable for advanced formatting</title>
         <link>http://loftux.com/2013/02/17/alfresco-google-docs-integration-not-very-usable-for-advanced-formatting/</link>
         <description>I have done some tests using the new Google Docs (Google Drive) integration in Alfresco 4.2. You can se all on how it works in &lt;a rel=&quot;nofollow&quot; title=&quot;Alfresco Google Docs 4.2&quot; target=&quot;_blank&quot; href=&quot;http://www.youtube.com/watch?v=LbTuCekDHI8&quot;&gt;this video&lt;/a&gt; created by Jeff Potts, Alfresco. The Alfresco engineers has all done a great job here, and I would love to use this [...]</description>
         <guid isPermaLink="false">http://loftux.se/?p=1034</guid>
         <pubDate>Sun, 17 Feb 2013 14:15:33 +0000</pubDate>
         <content:encoded><![CDATA[<p>I have done some tests using the new Google Docs (Google Drive) integration in Alfresco 4.2. You can se all on how it works in <a rel="nofollow" title="Alfresco Google Docs 4.2" target="_blank" href="http://www.youtube.com/watch?v=LbTuCekDHI8">this video</a> created by Jeff Potts, Alfresco.<br />
The Alfresco engineers has all done a great job here, and I would love to use this as my primary way of editing office documents. If it were not for what the actual output of the advanced formatted documents look like.</p>
<p>The process of editing goes like this; you create your file in Alfresco, this file is stored in by default as an Open Office XML file (Microsoft Office 2007). You then check this file out, in this case transfer it to Google Docs. This is where the first conversion of file format takes place, from ooxml to proprietary Google Docs format. And we have the first formatting loss. Do your edits, save back to Alfresco. Now we have a second conversion of file format, from Google Docs format back to ooxml, and with that some more formatting loss.</p>
<p>This is what it can look like<br />
<a rel="nofollow" target="_blank" href="http://loftux.se/wp-content/uploads/2013/02/Alfresco-Google-Docs.png"><img src="http://loftux.se/wp-content/uploads/2013/02/Alfresco-Google-Docs-1024x284.png" alt="Alfresco Google Docs" width="1024" height="284" class="aligncenter size-large wp-image-1046"/></a><br />
You can clearly notice that some formatting gets lost on each edit, and you cannot be sure that your end result is what you expected. I also tested with Open Document format files, result is different formatting loss, but the same basic problem.<br />
As test documents I used OoXML files from <a rel="nofollow" target="_blank" href="http://katana.oooninja.com/w/reference_sample_documents">ooninja</a>.</p>
<p>I actually think the Google Docs editor is ok for most situations, and if you print the document or export the document to pdf while still in Google Docs, the looks and formatting matches what you see on screen.</p>
<p>So what can be done about this situation?<br />
Not much until Google makes its proprietary document format available. Even if format conversion filters improves a lot I think there will be formatting losses when you have to convert format back and forth each edit. But if you could actually retrieve the Google Docs format file, Alfresco could store this file in the repository. When you need to edit next time, just upload this file to Google Docs, it&#8217;s their own format so should be no formatting loss here. Preview could be generated when the checking is done by exporting a pdf from Google Docs. We shouldn&#8217;t need to involve other office formats at all.</p>
<p>As stated initially, I think Alfresco engineers have done as good job as possible. The problem here is locking in file formats, only Google can change that. They will probably argue that there is no lock in since you can export content in may different formats. And it may be that it is technically very difficult, I&#8217;m still thinking &#8216;file&#8217; when thinking about document, a document stored in Google Docs format may very well be many fragments split up in a database.</p>]]></content:encoded>
      </item>
      <item>
         <title>Transformar ficheros RAW en Alfresco</title>
         <link>http://www.fegor.com/2013/02/transformar-ficheros-raw-en-alfresco.html</link>
         <description>&lt;div class=&quot;separator&quot; style=&quot;clear:both;text-align:center;&quot;&gt;&lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://3.bp.blogspot.com/-WjcnY30uLLc/URQP0TSansI/AAAAAAAAAXk/GjdhdPKPppk/s1600/NikonAlfresco.png&quot; style=&quot;clear:right;float:right;margin-bottom:1em;margin-left:1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;http://3.bp.blogspot.com/-WjcnY30uLLc/URQP0TSansI/AAAAAAAAAXk/GjdhdPKPppk/s1600/NikonAlfresco.png&quot;/&gt;&lt;/a&gt;&lt;/div&gt;Como ya sabemos, Alfresco tiene muchas posibilidades de manipulación y transformación de ficheros/documentos. Una de las cosas más flexibles es el uso de transformadores que puden ser de dos tipos básicamente:&lt;br /&gt;&lt;div&gt;&lt;/div&gt;&lt;ol&gt;&lt;li&gt;Llamadas directas a algún comando o utilidad del sistema&lt;/li&gt;&lt;li&gt;Desarrollar una clase Java que realice la transformación&lt;/li&gt;&lt;/ol&gt;&lt;div&gt;&lt;/div&gt;Aquí vamos a ver la primera para utilizar la transformación de fotografías tomadas en formato RAW (o bruto como generalmente se llama) a TIFF y a JPEG. Actualmente hago fotos con Nikon y Olympus y me interesa pasar el formato NEF (por poner el de Nikon) a TIFF y a JPEG. ImageMagick puede hacerlo pero me ha dado problemas tanto en el resultado (no se pueden ver) como en la propia conversión por lo que voy a usar otra utilidad que existe para Linux, Mac OS X y Windows.&lt;br /&gt;&lt;div&gt;&lt;/div&gt;Esta utilidad se llama dcraw y podemos bajarla de &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://www.cybercom.net/~dcoffin/dcraw/&quot;&gt;http://www.cybercom.net/~dcoffin/dcraw/&lt;/a&gt; para el sistema operativo que tengamos. En este caso voy a utilizar la que hay para Windows compilada con MingW desde la dirección &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://www.rawness.es/dcraw/?lang=es&quot;&gt;http://www.rawness.es/dcraw/?lang=es&lt;/a&gt;&lt;br /&gt;&lt;div&gt;&lt;/div&gt;Una vez instalada o descomprimida en el directorio que nos guste obtendremos el programa ejecutable dcraw.exe&lt;br /&gt;&lt;div&gt;&lt;/div&gt;Bien, ahora a configurar el transformador...&lt;br /&gt;&lt;div&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear:both;text-align:center;&quot;&gt;&lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://1.bp.blogspot.com/-poStnBoucjk/URQQG-jcfhI/AAAAAAAAAYA/k1_lguyDw8A/s1600/ReglaNEFTIFF.JPG&quot; style=&quot;clear:left;float:left;margin-bottom:1em;margin-right:1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;403&quot; src=&quot;http://1.bp.blogspot.com/-poStnBoucjk/URQQG-jcfhI/AAAAAAAAAYA/k1_lguyDw8A/s640/ReglaNEFTIFF.JPG&quot; width=&quot;640&quot;/&gt;&amp;nbsp;&lt;/a&gt;&lt;/div&gt;Toda la configuración se basa en un bean llamado RuntimeExecutableContentTransformer para versiones anteriore a la 3.2 de Alfresco o RuntimeExecutableContentTransformeWorker para las siguientes. A su vez este bean contiene las siguientes propiedades principales:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;b&gt;transformCommand: &lt;/b&gt;Define el comando y parámetros usando variables como ${source} y ${target}&lt;/li&gt;&lt;li&gt;&lt;b&gt;checkCommand: &lt;/b&gt;Chequea si la sintaxis es correcta y si ocurre un error también se puede definir con errorCodes. Cuando no está disponible el método getReliability devuelve 0:0 este método se usa para utilizar el transformador más eficiente en caso de que haya varios definidos que conviertan de la misma fuente al mismo destino.&lt;/li&gt;&lt;li&gt;&lt;b&gt;explicitTransformations &lt;/b&gt;establece el tipo MIME fuente y destino de forma explícita.&amp;nbsp;&lt;/li&gt;&lt;/ul&gt;Creamos el fichero nef-tiff-jpeg-transform-context.xml:&lt;br /&gt;&lt;div&gt;&lt;/div&gt;&lt;span style=&quot;&quot;&gt;&amp;lt;?xml version='1.0' encoding='UTF-8'?&amp;gt;  &lt;div&gt;&amp;lt;!DOCTYPE beans PUBLIC '-//SPRING//DTD BEAN//EN' 'http://www.springframework.org/dtd/spring-beans.dtd'&amp;gt;&lt;/div&gt;&lt;div&gt;&amp;lt;beans&amp;gt;&lt;/div&gt;&lt;div&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;bean id=&quot;transformer.worker.NEFtoTIFF&quot; class=&quot;org.alfresco.repo.content.transform.RuntimeExecutableContentTransformerWorker&quot;&amp;gt;&lt;/div&gt;&lt;div&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;property name=&quot;checkCommand&quot;&amp;gt;&lt;/div&gt;&lt;div&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;bean class=&quot;org.alfresco.util.exec.RuntimeExec&quot;&amp;gt;&lt;/div&gt;&lt;div&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;property name=&quot;commandMap&quot;&amp;gt;&lt;/div&gt;&lt;div&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;map&amp;gt;&lt;/div&gt;&lt;div&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;entry key=&quot;.*&quot;&amp;gt;&lt;/div&gt;&lt;div&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;value&amp;gt;${dcraw.exe} -i ${dcraw.home}/test.nef&amp;lt;/value&amp;gt;&lt;/div&gt;&lt;div&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/entry&amp;gt;&lt;/div&gt;&lt;div&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/map&amp;gt;&lt;/div&gt;&lt;div&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/property&amp;gt;&lt;/div&gt;&lt;div&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;property name=&quot;errorCodes&quot;&amp;gt;&lt;/div&gt;&lt;div&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;value&amp;gt;1&amp;lt;/value&amp;gt;&lt;/div&gt;&lt;div&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/property&amp;gt;&lt;/div&gt;&lt;div&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/bean&amp;gt;&lt;/div&gt;&lt;div&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/property&amp;gt;&lt;/div&gt;&lt;div&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;property name=&quot;transformCommand&quot;&amp;gt;&lt;/div&gt;&lt;div&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;bean class=&quot;org.alfresco.util.exec.RuntimeExec&quot;&amp;gt;&lt;/div&gt;&lt;div&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;property name=&quot;commandMap&quot;&amp;gt;&lt;/div&gt;&lt;div&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;map&amp;gt;&lt;/div&gt;&lt;div&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;entry key=&quot;Linux.*&quot;&amp;gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/div&gt;&lt;div&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;value&amp;gt;${dcraw.exe} -T '${source}' '${target}'&amp;lt;/value&amp;gt;&lt;/div&gt;&lt;div&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/entry&amp;gt;&lt;/div&gt;&lt;div&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;entry key=&quot;Mac OS X&quot;&amp;gt;&lt;/div&gt;&lt;div&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;value&amp;gt;${dcraw.exe} -T '${source}' '${target}'&amp;lt;/value&amp;gt;&lt;/div&gt;&lt;div&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/entry&amp;gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/div&gt;&lt;div&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;entry key=&quot;Windows.*&quot;&amp;gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/div&gt;&lt;div&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;value&amp;gt;${dcraw.exe} -T &quot;${source}&quot; &quot;${target}&quot;&amp;lt;/value&amp;gt;&lt;/div&gt;&lt;div&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/entry&amp;gt;&lt;/div&gt;&lt;div&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/map&amp;gt;&lt;/div&gt;&lt;div&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/property&amp;gt;&lt;/div&gt;&lt;div&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;property name=&quot;waitForCompletion&quot;&amp;gt;&lt;/div&gt;&lt;div&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;value&amp;gt;true&amp;lt;/value&amp;gt;&lt;/div&gt;&lt;div&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/property&amp;gt;&lt;/div&gt;&lt;div&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/bean&amp;gt;&lt;/div&gt;&lt;div&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/property&amp;gt;&lt;/div&gt;&lt;div&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;property name=&quot;explicitTransformations&quot;&amp;gt;&lt;/div&gt;&lt;div&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;list&amp;gt;&lt;/div&gt;&lt;div&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;bean class=&quot;org.alfresco.repo.content.transform.ExplictTransformationDetails&quot; &amp;gt;&lt;/div&gt;&lt;div&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;property name=&quot;sourceMimetype&quot;&amp;gt;&amp;lt;value&amp;gt;image/x-nikon-nef&amp;lt;/value&amp;gt;&amp;lt;/property&amp;gt;&lt;/div&gt;&lt;div&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;property name=&quot;targetMimetype&quot;&amp;gt;&amp;lt;value&amp;gt;image/tiff&amp;lt;/value&amp;gt;&amp;lt;/property&amp;gt;&lt;/div&gt;&lt;div&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/bean&amp;gt;&lt;/div&gt;&lt;div&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/list&amp;gt;&lt;/div&gt;&lt;div&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/property&amp;gt;&lt;/div&gt;&lt;div&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;property name=&quot;mimetypeService&quot;&amp;gt;&lt;/div&gt;&lt;div&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;ref bean=&quot;mimetypeService&quot;/&amp;gt;&lt;/div&gt;&lt;div&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/property&amp;gt;&lt;/div&gt;&lt;div&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/bean&amp;gt;&lt;/div&gt;&lt;div&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;bean id=&quot;transformer.NEFtoTIFF&quot; class=&quot;org.alfresco.repo.content.transform.ProxyContentTransformer&quot; parent=&quot;baseContentTransformer&quot;&amp;gt;&lt;/div&gt;&lt;div&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;property name=&quot;worker&quot;&amp;gt;&lt;/div&gt;&lt;div&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;ref bean=&quot;transformer.worker.NEFtoTIFF&quot;/&amp;gt;&lt;/div&gt;&lt;div&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/property&amp;gt;&lt;/div&gt;&lt;div&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/bean&amp;gt;&lt;/div&gt;&lt;div&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;bean id=&quot;transformer.complex.Nef.Jpg&quot;&lt;/div&gt;&lt;div&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; class=&quot;org.alfresco.repo.content.transform.ComplexContentTransformer&quot;&lt;/div&gt;&lt;div&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; parent=&quot;baseContentTransformer&quot; &amp;gt;&lt;/div&gt;&lt;div&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;property name=&quot;transformers&quot;&amp;gt;&lt;/div&gt;&lt;div&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;list&amp;gt;&lt;/div&gt;&lt;div&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;ref bean=&quot;transformer.NEFtoTIFF&quot; /&amp;gt;&lt;/div&gt;&lt;div&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;ref bean=&quot;transformer.ImageMagick&quot; /&amp;gt;&lt;/div&gt;&lt;div&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/list&amp;gt;&lt;/div&gt;&lt;div&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/property&amp;gt;&lt;/div&gt;&lt;div&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;property name=&quot;intermediateMimetypes&quot;&amp;gt;&lt;/div&gt;&lt;div&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;list&amp;gt;&lt;/div&gt;&lt;div&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;value&amp;gt;image/tiff&amp;lt;/value&amp;gt;&lt;/div&gt;&lt;div&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/list&amp;gt;&lt;/div&gt;&lt;div&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/property&amp;gt;&lt;/div&gt;&lt;div&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/bean&amp;gt;&lt;/div&gt;&lt;div&gt;&amp;lt;/beans&amp;gt;&lt;/div&gt;&lt;/span&gt;&lt;br /&gt;&lt;div&gt;&lt;/div&gt;Como vemos hay además otro bean definido de la clase ComplexContentTransformer, este sirve para realizar transformaciones a partir de otras, es decir, si no podemos transformar una imagen del formato NEF al formato JPEG pero si podemos realizar la transformación de NEF a TIFF y de TIFF a JPEG podemos configurarlo a través de este bean en el que hay que poner los transformadores y el mimetype intermedio de la transformación.&lt;br /&gt;&lt;br /&gt;&lt;div class=&quot;separator&quot; style=&quot;clear:both;text-align:center;&quot;&gt;&lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://4.bp.blogspot.com/--vKNNZ3ezrs/URQQFSmWWsI/AAAAAAAAAXs/Wb0q-_wWRbQ/s1600/documentlist.JPG&quot; style=&quot;clear:left;float:left;margin-bottom:1em;margin-right:1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;228&quot; src=&quot;http://4.bp.blogspot.com/--vKNNZ3ezrs/URQQFSmWWsI/AAAAAAAAAXs/Wb0q-_wWRbQ/s640/documentlist.JPG&quot; width=&quot;640&quot;/&gt;&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&amp;nbsp;Con esto ya podemos transformar imágenes tomadas directamente en RAW (NEF en el caso de Nikon) a TIFF y a si vez y mediante ComplexContentTransformer directamente a JPEG.&lt;/div&gt;&lt;div&gt;&lt;/div&gt;Ahora con dcraw.exe...&lt;br /&gt;&lt;div&gt;&lt;/div&gt;Esta utilidad de línea de comandos al igual que convert.exe de ImageMagick tiene la siguiente sintaxis:&lt;br /&gt;&lt;div&gt;&lt;/div&gt;&lt;span style=&quot;&quot;&gt;C:&amp;#92;Users&amp;#92;fernando.gonzalez&amp;#92;workspace&amp;#92;Common&amp;#92;MingW-release-orig-x32&amp;gt;dcraw.exe&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;&quot;&gt;Raw photo decoder &quot;dcraw&quot; v9.06  &lt;div&gt;by Dave Coffin, dcoffin a cybercom o net&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;Usage:&amp;nbsp; dcraw.exe [OPTION]... [FILE]...&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;-v&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Print verbose messages&lt;/div&gt;&lt;div&gt;-c&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Write image data to standard output&lt;/div&gt;&lt;div&gt;-e&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Extract embedded thumbnail image&lt;/div&gt;&lt;div&gt;-i&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Identify files without decoding them&lt;/div&gt;&lt;div&gt;-i -v&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Identify files and show metadata&lt;/div&gt;&lt;div&gt;-z&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Change file dates to camera timestamp&lt;/div&gt;&lt;div&gt;-w&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Use camera white balance, if possible&lt;/div&gt;&lt;div&gt;-a&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Average the whole image for white balance&lt;/div&gt;&lt;div&gt;-A &amp;lt;x y w h&amp;gt; Average a grey box for white balance&lt;/div&gt;&lt;div&gt;-r &amp;lt;r g b g&amp;gt; Set custom white balance&lt;/div&gt;&lt;div&gt;+M/-M&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Use/don't use an embedded color matrix&lt;/div&gt;&lt;div&gt;-C &amp;lt;r b&amp;gt;&amp;nbsp; Correct chromatic aberration&lt;/div&gt;&lt;div&gt;-P &amp;lt;file&amp;gt; Fix the dead pixels listed in this file&lt;/div&gt;&lt;div&gt;-K &amp;lt;file&amp;gt; Subtract dark frame (16-bit raw PGM)&lt;/div&gt;&lt;div&gt;-k &amp;lt;num&amp;gt;&amp;nbsp; Set the darkness level&lt;/div&gt;&lt;div&gt;-S &amp;lt;num&amp;gt;&amp;nbsp; Set the saturation level&lt;/div&gt;&lt;div&gt;-n &amp;lt;num&amp;gt;&amp;nbsp; Set threshold for wavelet denoising&lt;/div&gt;&lt;div&gt;-H [0-9]&amp;nbsp; Highlight mode (0=clip, 1=unclip, 2=blend, 3+=rebuild)&lt;/div&gt;&lt;div&gt;-t [0-7]&amp;nbsp; Flip image (0=none, 3=180, 5=90CCW, 6=90CW)&lt;/div&gt;&lt;div&gt;-o [0-5]&amp;nbsp; Output colorspace (raw,sRGB,Adobe,Wide,ProPhoto,XYZ)&lt;/div&gt;&lt;div&gt;-d&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Document mode (no color, no interpolation)&lt;/div&gt;&lt;div&gt;-D&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Document mode without scaling (totally raw)&lt;/div&gt;&lt;div&gt;-j&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Don't stretch or rotate raw pixels&lt;/div&gt;&lt;div&gt;-W&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Don't automatically brighten the image&lt;/div&gt;&lt;div&gt;-b &amp;lt;num&amp;gt;&amp;nbsp; Adjust brightness (default = 1.0)&lt;/div&gt;&lt;div&gt;-g &amp;lt;p ts&amp;gt; Set custom gamma curve (default = 2.222 4.5)&lt;/div&gt;&lt;div&gt;-q [0-3]&amp;nbsp; Set the interpolation quality&lt;/div&gt;&lt;div&gt;-h&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Half-size color image (twice as fast as &quot;-q 0&quot;)&lt;/div&gt;&lt;div&gt;-f&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Interpolate RGGB as four colors&lt;/div&gt;&lt;div&gt;-m &amp;lt;num&amp;gt;&amp;nbsp; Apply a 3x3 median filter to R-G and B-G&lt;/div&gt;&lt;div&gt;-s [0..N-1] Select one raw image or &quot;all&quot; from each file&lt;/div&gt;&lt;div&gt;-6&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Write 16-bit instead of 8-bit&lt;/div&gt;&lt;div&gt;-4&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Linear 16-bit, same as &quot;-6 -W -g 1 1&quot;&lt;/div&gt;&lt;div&gt;-T&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Write TIFF instead of PPM&lt;/div&gt;&lt;/span&gt;&lt;br /&gt;&lt;div&gt;&lt;/div&gt;Podemos observar tres cosas:&lt;br /&gt;&lt;ol&gt;&lt;li&gt;Podemos usar el modificador -i para chequear la utilidad, solo hay que usar una imagen y llamarla por ejemplo test.nef&lt;/li&gt;&lt;li&gt;Debemos usar el modificador -T para pasar las imágenes a TIFF en lugar de PPM que es lo que hace por defecto&lt;/li&gt;&lt;li&gt;Tenemos un problema, el resultado de la transformación es siempre el mismo fichero pero con la extensión cambiada, es decir, no podemos obligar a guardar el resultado en otro fichero (bueno, si, con el modificador -c que saca la salida por consola y capturandola con una redirección &quot;&amp;gt;&quot; pero esto no funciona bien)&lt;/li&gt;&lt;/ol&gt;&lt;div&gt;Como Alfresco utiliza en la transformación dos variables ${source} y ${target} y ambos son distintos (genera los nombres de estos ficheros distintas) nos encontramos con el problema de que no podemos llamarlo directamente por lo que hay que crear un script que llame correctamente al ejecutable con los modificadores adecuados.&lt;/div&gt;&lt;div&gt;&lt;/div&gt;Este script en formato BAT/CMD de Windows y llamado &lt;span style=&quot;&quot;&gt;dcraw.cmd&lt;/span&gt; es el siguiente:&lt;br /&gt;&lt;div&gt;&lt;/div&gt;&lt;span style=&quot;&quot;&gt;@ECHO OFF  &lt;div&gt;set path_dcraw=%0&lt;/div&gt;&lt;div&gt;SET opts=%1&lt;/div&gt;&lt;div&gt;SET source=%2&lt;/div&gt;&lt;div&gt;SET target=%3&lt;/div&gt;&lt;div&gt;%path_dcraw:~,-3%exe %opts% %source%&lt;/div&gt;&lt;div&gt;IF &quot;%opts%&quot;==&quot;-i&quot; GOTO END&lt;/div&gt;&lt;div&gt;MOVE %source:~,-4%tiff&quot; %target% &lt;/div&gt;&lt;div&gt;:END&lt;/div&gt;&lt;/span&gt;&lt;br /&gt;&lt;div&gt;&lt;/div&gt;Seguidamente vamos a crear las variables en el fichero de propiedades, en este caso utilizo el mismo alfresco-global.properties:&lt;br /&gt;&lt;div&gt;&lt;/div&gt;&lt;span style=&quot;&quot;&gt;dcraw.home=C:/Users/fernando.gonzalez/workspace/Common/MingW-release-orig-x32  &lt;div&gt;dcraw.exe=${dcraw.home}/dcraw.cmd&lt;/div&gt;&lt;/span&gt;&lt;br /&gt;&lt;div&gt;&lt;/div&gt;Y por último debemos declarar los tipos MIME (mimetypes) en el fichero &lt;span style=&quot;&quot;&gt;mimetypes-extension-map.xml &lt;/span&gt;que está en &lt;span style=&quot;&quot;&gt;&amp;lt;extensionRoot&amp;gt;/alfresco/extension/mimetype&lt;/span&gt;:&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;&quot;&gt;&lt;div&gt;&lt;/div&gt;&lt;/span&gt;&lt;span style=&quot;&quot;&gt;&amp;lt;alfresco-config area=&quot;mimetype-map&quot;&amp;gt;&lt;/span&gt;  &lt;br /&gt;&lt;span style=&quot;&quot;&gt;&lt;div&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;config evaluator=&quot;string-compare&quot; condition=&quot;Mimetype Map&quot;&amp;gt;&lt;/div&gt;&lt;div&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;mimetypes&amp;gt;&lt;/div&gt;&lt;div&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;mimetype mimetype=&quot;image/x-nikon-nef&quot; display=&quot;Nikon Raw Image&quot;&amp;gt;&lt;/div&gt;&lt;div&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;extension&amp;gt;nef&amp;lt;/extension&amp;gt;&lt;/div&gt;&lt;div&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/mimetype&amp;gt;&lt;/div&gt;&lt;div&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/mimetype&amp;gt;&lt;/div&gt;&lt;div&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/mimetypes&amp;gt;&lt;/div&gt;&lt;div&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/config&amp;gt;&lt;/div&gt;&lt;div&gt;&amp;lt;/alfresco-config&amp;gt;&lt;br /&gt;&lt;/div&gt;&lt;/span&gt;&lt;br /&gt;&lt;div&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear:both;text-align:center;&quot;&gt;&lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://3.bp.blogspot.com/-KpL2s09x4UA/URQQF_WzmAI/AAAAAAAAAXw/9_njNv1RKjM/s1600/ReglasNEFTIFFJPEG.JPG&quot; style=&quot;clear:left;float:left;margin-bottom:1em;margin-right:1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;284&quot; src=&quot;http://3.bp.blogspot.com/-KpL2s09x4UA/URQQF_WzmAI/AAAAAAAAAXw/9_njNv1RKjM/s640/ReglasNEFTIFFJPEG.JPG&quot; width=&quot;640&quot;/&gt;&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&amp;nbsp;Listo, ya solo nos falta hacer las reglas necesarias para convertir NEF a TIFF o a JPEG directamente en nuesto estudio fotográfico y tener almacenadas y ordenadas todas nuestras fotografías. Además, podemos usar Alfresco de previsualizador de imágenes RAW aunque no tengamos nigún programa para ello como podemos ver en la siguiente imagen:&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear:both;text-align:center;&quot;&gt;&lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://1.bp.blogspot.com/-fOdv78KBKe4/URQQGq2KK9I/AAAAAAAAAX8/i2L3jkn25dM/s1600/previsualizaci%25C3%25B3n.JPG&quot; style=&quot;clear:left;float:left;margin-bottom:1em;margin-right:1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;340&quot; src=&quot;http://1.bp.blogspot.com/-fOdv78KBKe4/URQQGq2KK9I/AAAAAAAAAX8/i2L3jkn25dM/s640/previsualizaci%25C3%25B3n.JPG&quot; width=&quot;640&quot;/&gt;&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;Para depurar podemos activar las siguientes líneas en Log4J (log4j.properties o custom-log4j.propeties en el extension):&lt;br /&gt;&lt;div&gt;&lt;/div&gt;&lt;span style=&quot;&quot;&gt;log4j.logger.org.alfresco.repo.content.transform.TransformerDebug=debug  &lt;div&gt;log4j.logger.org.alfresco.util.exec.RuntimeExec=debug&lt;/div&gt;&lt;div&gt;log4j.logger.org.alfresco.repo.content.transform.ContentTransformerRegistry=debug&lt;/div&gt;&lt;/span&gt;&lt;br /&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;Enlaces de interés:&lt;br /&gt;&lt;br /&gt;&lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://wiki.alfresco.com/wiki/Content_Transformations&quot;&gt;http://wiki.alfresco.com/wiki/Content_Transformations&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://docs.alfresco.com/4.1/index.jsp&quot;&gt;http://docs.alfresco.com/4.1/index.jsp&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;https://wiki.alfresco.com/wiki/Content_Transformation_and_Metadata_Extraction_with_Apache_Tika&quot;&gt;https://wiki.alfresco.com/wiki/Content_Transformation_and_Metadata_Extraction_with_Apache_Tika&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;https://wiki.alfresco.com/wiki/Developer_Guide&quot;&gt;https://wiki.alfresco.com/wiki/Developer_Guide&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;</description>
         <author>Fernando González</author>
         <guid isPermaLink="false">tag:blogger.com,1999:blog-13003183.post-6363459630219185411</guid>
         <pubDate>Thu, 07 Feb 2013 21:51:00 +0000</pubDate>
         <media:thumbnail height="72" url="http://3.bp.blogspot.com/-WjcnY30uLLc/URQP0TSansI/AAAAAAAAAXk/GjdhdPKPppk/s72-c/NikonAlfresco.png" width="72" xmlns:media="http://search.yahoo.com/mrss/"/>
      </item>
      <item>
         <title>Caching Alfresco Webscripts</title>
         <link>http://www.ecm-uncovered.com/1/post/2013/01/caching-alfresco-webscripts.html</link>
         <description>IntroductionAs my first post I decided to describe a way to cache Alfresco Webscripts. The reason you might want to cache some webscripts is performance, let's make a real world example. You are asked to show a list of recent notification documents, contained in the company Alfresco repository, on a page your company website. You create a webscript that searches for th [...]</description>
         <guid isPermaLink="false">http://www.ecm-uncovered.com/1/post/2013/01/caching-alfresco-webscripts.html</guid>
         <pubDate>Wed, 30 Jan 2013 10:51:29 +0000</pubDate>
         <content:encoded><![CDATA[<div class="paragraph" style="text-align:left;"><strong><font size="4">Introduction</font></strong><br /><span></span>As my first post I decided to describe a way to cache Alfresco Webscripts. <br />The reason you might want to cache some webscripts is <strong>performance</strong>, let's make a real world example. You are asked to show a list of recent notification documents, contained in the company Alfresco repository, on a page your company website. You create a webscript that searches for the documents and generates a response containing the list. Then you realize that the site has a lot of visitors and the webscript consumes too much resources if called every time the page is shown.<br /><span>The most effective way to speed up the generation of a response is not generating it at all, but rather serving a previously baked one. This is the domain of http caching, if you are new to this subject I reccomend you to read this <a rel="nofollow" title="" target="_blank" href="http://www.mnot.net/cache_docs">Caching Tutorial for Authors and Webmasters</a>.&nbsp;</span><a rel="nofollow" title="" target="_blank" href="http://wiki.alfresco.com/wiki/Web_Scripts"> Alfresco offers ways to modify http headers related to caching</a> which contain informations about the cacheability of the response and leaves the responsibility of actually caching the response to an external cache.<br /><span></span>There are <strong>two kind of caches</strong> we can exploit to speed up our web site:<br /><ul><li>private cache: managed by the user browser. Can hold the webscript response previously received by that user and serve it without intervention from Alfresco.<br /></li><li>public cache: managed by a proxy cache placed between Alfresco and the website. Can hold the webscript response previously received by any user and serve it without intervention from Alfresco.</li></ul>Before going forward we are going to install a proxy cache called Squid.<br /><br /><strong><font size="4"><font size="4">S</font>quid installation</font></strong><br />&nbsp;<a rel="nofollow" title="" target="_blank" href="http://www.squid-cache.org/">Squid</a> is a very popular proxy cache server, it's open source, flexible and well documented and easy to install.<br /><span>Install squid following </span>the installtion instruction for your O.S., if you are using linux the easiest way is using distribution packages. Once done you have to configure squid to suit your requirements modifying squid.conf. Below is simple configuration suited for educational needs.<br /></div>  <blockquote style="text-align:left;"><font size="1">###<br />#<br />#&nbsp;&nbsp; &nbsp;Minimal configuration file for webscript caching needs of Fastweb&nbsp;&nbsp; &nbsp;Mind<br />#<br />###<br /><br />##proxy accepting connections on port 80, acting as reverse proxy<br />http_port 80 accel defaultsite=localhost<br />##Origin server on localhost:8080, PASSTHRU supports http authentication from the client<br />cache_peer 127.0.0.1 parent 8080 0 no-query no-digest originserver login=PASSTHRU<br />acl our_sites dstdomain localhost<br />http_access allow our_sites<br />http_access deny all<br /><br />##avoid caching static resources so cache directory will only hold cached webscript response <br />##resources can be inspected manually (requested by Leonardo Fenu)<br />acl images urlpath_regex -i &#92;.(jpg|jpeg|gif|png)(&#92;?.*)?$<br />acl css urlpath_regex -i &#92;.(css)(&#92;?.*)?$<br />acl javascript urlpath_regex -i &#92;.(js)(&#92;?.*)?$<br />cache deny images<br />cache deny css<br />cache deny javascript<br />cache allow all<br /><br />##max memory available for caching (there aren't many cacheable resources at the moment)<br />cache_mem&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 16 MB<br />#memory_cache_mode&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; always<br />##specify disk caching<br />##parameters after ufs<br />##1) cache directory<br />##2) amount space in MB that squid is allowed to use<br />##3) number of level 1 subdirectories that will be created under cache dir (leave 1 only for simple manual inspection)<br />##4) number of level 2 subdirectories that will be created under cache dir (leave 1 only for simple manual inspection)<br />##uncomment to cache on disk so cached resources can be inspected and caches will survive squid restarts<br />##!!!IMPORTANT see instructions Installation.txt file before enabling disk caching &nbsp;<br />#cache_dir ufs /squid 100 1 1<br /><br /></font></blockquote>  <div class="paragraph" style="text-align:left;">The first block sets reverse proxy mode, which means Squid must accelerate responses coming from Alfresco. The second block denies caching of web resources so our cache will only contain the webscript response. The third block states that squid must cache responses in RAM but contains commented instructions for caching to disk so you can examine what squid is caching.<br /><br /><span>To manage Squid use the following instructions</span><br /><span>start squid: </span>&nbsp;&nbsp;&nbsp; <span>./squid</span><br /><span>stop squid: </span>&nbsp;&nbsp;&nbsp; <span>./squid -k shutdown</span><br /><span>reparse configuration file: </span>./squid -k reconfigure<br /><br /><strong><font size="4"><span>Webscripts Caching Module</span></font></strong><br />To ease the experimentation of webscripts caching I created the webscripts caching module.<span> This module consists of a Maven project containing library code and webscripts caching examples. The pom file and the project structure are a simplified version of those I use for <strong>development of generic alfresco modules. </strong>I won't describe them here but</span> this may be the subject for another post.<br /></div>  <div><div style="margin:10px 0 0;"> <a rel="nofollow" target="_blank" href="http://www.ecm-uncovered.com/uploads/1/6/6/2/16624568/webscripts_caching.zip"><img src="http://www.weebly.com/weebly/images/file_icons/gz.png" width="36" height="36" style="float:left;margin:0 15px 15px 0;border:0;"/></a><div style="float:left;text-align:left;"><table style="font-size:12px;font-family:tahoma;line-height:.9;"><tr><td colspan="2"><b> webscripts_caching.zip</b></td></tr><tr style="display:none;"><td>File Size:  </td><td>35 kb</td></tr><tr style="display:none;"><td>File Type:  </td><td> zip</td></tr></table><a rel="nofollow" target="_blank" href="http://www.ecm-uncovered.com/uploads/1/6/6/2/16624568/webscripts_caching.zip" style="font-weight:bold;">Download File</a></div> </div>  <hr style="clear:both;width:100%;visibility:hidden;"></div>  <blockquote style="text-align:left;"><font size="1">...<br /><span></span>&lt;!--<br />This POM manages the lifecycle of an Alfresco Project<br />&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;Usage:<br />&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;Configure environment dependent properties!<br />&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;mvn clean package -Pfull-deploy&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;builds amp<br />&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;mvn process-classes -Pfast-deploy&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;quickly deploys project files on tomcat <br />&nbsp;--&gt;<br />&lt;project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"<br />&nbsp;&nbsp;&nbsp; xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd"&gt;<br /><span>...</span><br />&nbsp;&nbsp;&nbsp; &lt;properties&gt;<br />&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &lt;!-- Environment dependent Properties --&gt;<br />&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &lt;tomcatDir&gt;/Users/matteogrolla/Development/alfresco/alfresco-enterprise-4.1.x/tomcat&lt;/tomcatDir&gt;<br /></font></blockquote>  <div class="paragraph" style="text-align:left;">This maven project allows two kind of deployment:<br /><ul><li>full deploy: generates an amp which must be applied to Alfresco requiring application restart. This is suitable for production deployment</li><li>fast deploy: copies project artifacts (sources, compiled classes, configurations...) inside Alfresco web application allowing to make some modifications without application restart (e.g. javascript webscripts modifications. Remember to set tomcatDir property correctly.<br /></li></ul><span></span>At this point we can start looking at the caching example <strong>cachetest.get</strong> supplied with the module. Here I list the controller which is the most interesting part of the webscript.<br /><span></span></div>  <blockquote style="text-align:left;"><font size="1">&lt;import resource="classpath:alfresco/templates/webscripts/com/sourcesense/common/cacheUtils.lib.js"&gt;<br /><br />function computeLastModifiedContent(){<br />&nbsp;&nbsp; var lm = new Date();<br />&nbsp; &nbsp;<br />&nbsp;&nbsp; //content has been modified at last time multiple of 10 seconds<br />&nbsp;&nbsp; lm.setSeconds( truncate(lm.getSeconds(), 10) );<br />&nbsp; &nbsp;<br />&nbsp;&nbsp; //content has been modified at the beginning of current minute<br />&nbsp;&nbsp; //lm.setSeconds(0);<br />&nbsp; &nbsp;<br />&nbsp;&nbsp; //content has been modified at the beginning of current hour<br />&nbsp;&nbsp; //lm.setMinutes(0, 0);<br /><br />&nbsp;&nbsp; //content has been modified today at 8:00<br />&nbsp;&nbsp; //lm.setHours(8, 0, 0);</font><br /><br /><span></span><font size="1">&nbsp;&nbsp; return lm;<br />}<br /><br />function generateModel(){<br />&nbsp;&nbsp; value = "computed value"&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;<br />&nbsp;&nbsp; model.value = value;<br />&nbsp;&nbsp; model.lastModified = new Date();<br />&nbsp;&nbsp; model.lastModifiedContent = computeLastModifiedContent();<br />&nbsp;&nbsp; model.now = new Date();<br />}<br /><br />//only code may change<br />//executeIfModified(generateModel);<br /><br />//code and data may change<br />//executeIfModified(generateModel, computeLastModifiedContent, {isPublic: true});<br />executeIfModified(generateModel, computeLastModifiedContent, {maxAge: 10, isPublic: false});<br /><br />//only code may change<br />//response can be cached for 5s<br />//executeIfModified(generateModel, null, {maxAge: 5});<br /><br /></font></blockquote>  <div class="paragraph" style="text-align:left;">The execution starts <u>executeIfModified</u> which is responsible to generate the webscript response only if it has changed from previously generated one. If it hasn't instead of the full response only a <strong>NotModifiedHeader</strong> is sent so the cache receiving it (either public or private) knows it's safe to serve the cached version.<br /><span></span>ExecuteIfModified accepts the following parameters:<br /><ul><li>generateModel callback: a function which returns the model object to be consumed by the template. This function is called only if the old response isn't fresh anymore.</li><li>computeLastModifiedContent callback: a possible reason why the current response (of the same webscript called with the same parameters) is going to differ from previous is because the repository content processed by the webscript has changed. This function is responsible to compute last time the content has been modified. In some particular cases it's possible to perform this test but in general it would be too slow so we just compute a timestamp pretending it's the last time the content has changed. If previous response was sent before this moment (browsers and proxy cache send the timestamp of the instant when they received previous response) it's invalid</li><li>options: an optional object which may contain any of the following properties<br /><ul><li>maxAge: specifies the number of seconds the response may be cached before being revalidated (revalidation: a request is sent to the webscripts whish responds with a NotModifiedHeader, meaning the cached response is still valid, or the new response)</li><li>isPublic: enforces the statement that this request can be cached by a public cache (not normally needed)</li></ul></li></ul><span></span>When ExecuteIfModified is invoked it first determines if the previous <strong>response is invalid</strong>. This can be because:<br /><ul><li>Webscript code has changed since last response. On every deployment Maven updates a timestamp variable in cacheutils.lib.js for this purpose.<br /></li><li>Data processed by the webscript has changed since last response. See computeLastModifiedContent callback.<br /></li></ul>Once determined it either sends a NotModifiedHeader or generate a new response.<br /><br /><font size="4"><strong><span></span>Tests using Squid</strong></font><br /><span>Using your browser go to this address: </span><br />&nbsp;&nbsp;&nbsp; http://localhost/alfresco/wcs/cachetest<br />This will send the request to the webscript passing through squid. When you want to <strong>refresh the page</strong> do it <strong>using the provided "reload this" link</strong>. If you press enter on the address bar or use the refresh page functionality of your browser, your browser may explicitly ask for a not cached response.<span> Tests are done using two different browsers to simulate different users.</span> During the tests you can monitor Squid behaviour watching these files (tail -f &lt;file&gt;)<br /><ul><li>squid/log/access.log&nbsp;&nbsp;&nbsp; terse indication about requests caching</li><li>squid/log/cache.log&nbsp;&nbsp;&nbsp; detailed indication about requests caching</li></ul>Note: tests have been performed using squid 3.2.5<br /><span></span><br /><strong>Test 1</strong><br />in <br />&nbsp;&nbsp;&nbsp; computeLastModifiedContent()<br />set<br />&nbsp;&nbsp;&nbsp; lm.setSeconds( truncate(lm.getSeconds(), 10) );<br />invoke executeIfModified like this:<br />&nbsp;&nbsp;&nbsp; executeIfModified(generateModel, computeLastModifiedContent);<br /><span></span><br />Content changes for timestamps multiple of 10s, maxAge=0 so caches have to revalidate the response before serving it. This setting is easy to test and very predictable.<br /><br /><span>steps:</span><br /><ol><li><span>Load the page on browser1</span> and browser2<span></span></li><li><span></span>Empty both browser caches</li><li>Hit "reload this" link on both<br /></li></ol><span></span><span>During first reload and reloads after a data change (or code deployed through maven) </span>in access.log you will see TCP_REFRESH_MODIFIED<br /><span>After a new response and before a data change you will see TCP_REFRESH_UNMODIFIED</span><br /><span></span><br /><span></span><font size="2"><strong>Test 2</strong></font><br />in <br />&nbsp;&nbsp;&nbsp; computeLastModifiedContent()<br />set<br />&nbsp;&nbsp;&nbsp; lm.setSeconds( truncate(lm.getSeconds(), 10) );<br />invoke executeIfModified like this:<br />&nbsp;&nbsp;&nbsp; executeIfModified(generateModel, computeLastModifiedContent, {maxAge: 10});<br /><span></span><br /><span></span>The difference from test 1 is that now we allow caches to serve directly (without revalidation) content stored less than 10s before. This setting is more efficient but there's more risk of serving a stale response (particularly for longer value of maxAge) <br /><br /><span>steps:</span><br /><span>Repeat previous step, </span>you will see that when the browser cache holds a valid response squid won't receive any request. Use the development tools of your browser to verify that the response is serve from local cache.<br /><span></span><br /><font size="4"><strong>Mobile Caches</strong></font><br /><span></span>Browsers cache work very well on PC browsers. They do a little less on mobile browsers, especially older versions. Here below I give you some links to articles detailing mobile browsers limitations so that you can decide if you can live with them or you need another solution (maybe use HTML5).<br /><ul><li><a rel="nofollow" title="" target="_blank" href="http://www.guypo.com/mobile/understanding-mobile-cache-sizes/">understanding mobile cache sizes</a></li><li><a rel="nofollow" title="" target="_blank" href="http://www.yuiblog.com/blog/2010/06/28/mobile-browser-cache-limits/">mobile browsers cache limits</a></li><li><a rel="nofollow" title="" target="_blank" href="http://www.webperformancetoday.com/2012/07/12/early-findings-mobile-browser-cache-persistence-and-behaviour/">mobile cache persistence and behaviour</a><br /></li></ul></div>]]></content:encoded>
         <category>Uncategorized</category>
      </item>
      <item>
         <title>Rechercher des propriétés vides</title>
         <link>http://charles.torda.net/2013/01/23/rechercher-des-proprietes-vides/</link>
         <description>Récemment, j&amp;#8217;ai eu la nécessité de lister tous les documents pour lesquels une propriété n&amp;#8217;était pas définie. Je ne m&amp;#8217;étais pas encore intéressé à la manière dont SOLR traitait ces cas, voici mon retour d&amp;#8217;expérience avec Alfresco 4.0.d et les &amp;#8230; &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://charles.torda.net/2013/01/23/rechercher-des-proprietes-vides/&quot;&gt;Continuer la lecture &lt;span class=&quot;meta-nav&quot;&gt;&amp;#8594;&lt;/span&gt;&lt;/a&gt;</description>
         <guid isPermaLink="false">http://charles.torda.net/?p=746</guid>
         <pubDate>Wed, 23 Jan 2013 11:58:30 +0000</pubDate>
      </item>
      <item>
         <title>Agile erste Schritte mit Alfresco ECM</title>
         <link>http://www.contentreich.de/agile-erste-schritte-mit-alfresco-ecm</link>
         <description>&lt;p&gt;&lt;img width=&quot;150&quot; height=&quot;150&quot; src=&quot;http://www.contentreich.de/wp-content/uploads/2013/01/959864706_894bdfaa56_blog-150x150.jpg&quot; class=&quot;attachment-thumbnail wp-post-image&quot; alt=&quot;Agile erste Schritte mit Alfresco ECM&quot; title=&quot;Agile erste Schritte mit Alfresco ECM&quot; style=&quot;float:right;&quot;/&gt;Enterprise Content Management Systeme (ECMS) versprechen Unterstützung bei vielen Themen  im Umgang mit Dokumenten. Aber Features bringen Komplexitität mit sich. Wie kann man sich als Alfresco Einsteiger der Herausforderung ECM stellen ? &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://www.contentreich.de/agile-erste-schritte-mit-alfresco-ecm&quot;&gt;Weiterlesen &lt;span class=&quot;meta-nav&quot;&gt;&amp;#8594;&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;The post &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://www.contentreich.de/agile-erste-schritte-mit-alfresco-ecm&quot;&gt;Agile erste Schritte mit Alfresco ECM&lt;/a&gt; appeared first on &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://www.contentreich.de&quot;&gt;CONTENTREICH&lt;/a&gt;.&lt;/p&gt;</description>
         <guid isPermaLink="false">http://www.contentreich.de/?p=3006</guid>
         <pubDate>Wed, 23 Jan 2013 08:33:07 +0000</pubDate>
         <content:encoded><![CDATA[<div class="alignleft labeledImage "><img class="alignleft size-full wp-image-3010" alt="Picture of a baby making first steps" src="http://www.contentreich.de/wp-content/uploads/2013/01/959864706_894bdfaa56_blog.jpg" width="275" height="275"/></div>
<p>Dokumentenbestände aller Art im Unternehmen wachsen und wachsen. Ab einer gewissen Menge wird es unmöglich mit Fileserver und Disziplin die Kontrolle zu behalten. Enterprise Content Management Systeme (ECMS) versprechen (seit vielen Jahren) Abhilfe und bieten im Kern in der Regel Unterstüzung bei Themen wie Inhaltsablage, Versionierung, Auditing, Sicherheit, Modellierung, Suche, Lebenszylus, Transformation, Metadaten Extraktion, Taxonomy, Workflow etc. Diese Funktionalitäten möchte vermutlich jedes Unternehmen gerne zur Verfügung haben. Das Gute bringt zieht allerdings das Schlechte nach sich. Features bringen Komplexitität mit sich.</p>
<p>Wie sollte man sich als Einsteiger der Materie sinnvoll nähern ?<br />
Kommt ein ECM für mich überhaupt in Frage ?</p>
<h2>ECM Hemmschuhe</h2>
<p>Dank Open Source und Produkten wie Alfresco oder Nuxeo kann man heute sehr mächtige Systeme auch <strong>lizenz</strong>kostenfrei bekommen. Dieser alte Hemmschuh muss also heute nicht zwingend noch einer sein.</p>
<p>Bei den lizenzkostenfreien &#8220;Community&#8221; Varianten stellt sich schnell die Frage nach Support und Gewährleistung. Hersteller und Partner übernehmen diese Aufgaben im freien Community Modell in der Regel nicht.</p>
<p>Kann lizenzkostenfreie Software eigentlich etwas taugen ?</p>
<p>Was mache ich wenn es mit geschäftskritischen Dokumenten im System plötzlich zu Problemen kommt ?</p>
<p>Speziell zu Alfresco gibt es dazu seit Jahren Frage und Antwort <a rel="nofollow" target="_blank" href="http://stackoverflow.com/questions/150591/using-alfresco-community-in-production">&#8220;Using Alfresco Community in production&#8221;</a> auf stackoverflow. Trotz des Alters denke ich sind die Aussagen heute so aktuell und richtig wie damals. Man kann es also grundsätzlich durchaus wagen. Und um es auszuprobieren reicht es allemal.</p>
<h2>Umgang mit Komplexität und kleinem Budget</h2>
<p>Vor einigen Jahren hat so mancher Hersteller allein für Installation und Konfiguration eines Test-Systems durchaus ein paar Manntage abgerechnet. Das Setup eines solchen Systems &#8220;zum Ausprobieren&#8221; sollte heute der nette Adminstrator Kollege auf die Schnelle hinbekommen. Auch das Thema Betrieb ist in der Regel kein Problem für diesen Mitarbeiter.</p>
<p>Mit der Entwicklung verhält es sich da meist etwas anders. Der Kollege der schon mal mit Java programmiert hat kann durchaus schnell überfordert sein, wenn es darum geht das System durch Konfiguration und Logik anzupassen oder einen Bug zu beheben. Entwickler &#8220;aufzugleisen&#8221; ist schlichtweg aufwendiger als bei anderer Technologie. Diese Tatsache ist unter anderem bedingt durch Funktionsvielfalt der Plattform. Unternehmen müssen klar darüber werden, ob sie man Entwicklungs-Know-How aufbauen wollen oder nicht.</p>
<p>Für eine erste Erkundung schlagen wir in der Regel vor:</p>
<ul>
<li>Fachliche Komplexität so gering wie möglich halten</li>
<li>Einen Spike / Prototypen für einen <strong>einfachen</strong> Anwendungsfall implementieren</li>
<li>Funktionälität einsetzen von der man nach einer Recherche sicher sein kann, dass das System sie (nahezu) so liefert wie man es braucht</li>
</ul>
<p>In der Praxis ist es oft leider so, dass gerade kleine Unternehmen gar nicht wissen welche Funktionalität genau sie <strong>wirklich</strong> brauchen. Man sollte zumindest den einen oder anderen ganz konkreten Anwendungsfall im Kopf haben.</p>
<p>Auch neigen Einsteiger mitunter dazu fachliche Komplexität zu unterschätzen. In der Vergangenheit habe ich einige Projekte an Komplexität scheitern sehen. Oft, weil dem &#8220;you ain&#8217;t gonna need it&#8221; Prinzip nicht Folge geleistet, und viel Aufwand für Dinge aufgebracht wurde die nie gebraucht wurden oder würden. In einem Fall wollte ein kleiner Mittelständler der bis dato keine ECM Erfahrungen hatte gleich ein Projekt &#8220;Revisionssichere Archivierung&#8221; umsetzen. Ein Anderer analog &#8220;Rechnungseingang und Workflow&#8221;. Grundsätzlich sind dies absolut legitime Anwendungen für ein ECM &#8211; aber eben keine trivialen Themen für einen Einsteiger mit schmalem Budget. Insbesondere dann nicht, wenn auch die Technik mit der realisiert werden soll noch Neuland für das Unternehmen ist.</p>
<p>Wichtig ist zu akzeptieren das vieles eben <strong>nicht</strong> klar, und die gesamte Materie auch nicht trivial ist. Mit dieser Einsicht wird der Eine oder Andere feststellen, dass es in so einem Fall nicht unbedingt sinnvoll ist im Vorfeld hausintern lange Konzepte zu schreiben welche man dann einem Dienstleister vorlegt. Wenn man sich erst einmal damit abgefunden hat, dass ein Projekt etwas chaoitisch sein kann kommt man schnell zu agilen Methoden wie Scrum oder Kanban. Diese Methoden sind eben genau auf so ein Szenario ausgerichtet.</p>
<p>Bei Alfresco ist das Thema &#8220;Dokumentenaustausch über das Internet&#8221; &#8211; mit internen und externen Mitarbeitern etwas was sich hervorragend für Einstieger eignet. Mit wenig Aufwand kann man für die meisten Unternehmen schnell echten Wert schaffen und realistische Anwendungsfälle abbilden. Der Anfänger bekommt ein Gefühl für Aspeke von ECM, und lernt einzuschätzen welche weiteren Anwendungsfälle sinnvoll abgebildet werden können. Learning by doing &#8211; <del datetime="2013-01-11T14:27:49+00:00">Gangnam</del> Agile Style.</p>
<h2>Referenzen</h2>
<ul>
<li><a rel="nofollow" target="_blank" href="http://stackoverflow.com/questions/150591/using-alfresco-community-in-production">Using Alfresco Community in production @ stackoverflow</a></li>
<li><a rel="nofollow" title="Sane Enterprise Software in Germany and Beyond" target="_blank" href="http://www.contentreich.de/sane-enterprise-software-in-germany-and-beyond">Sane Enterprise Software in Germany and Beyond</a></li>
<li><a rel="nofollow" target="_blank" href="http://www.samuliheljo.com/blog/driving-a-scrum-team-at-the-edge-of-chaos/">Driving a Scrum team at the edge of chaos (Agreement-Certainty Matrix)</a></li>
<li><a rel="nofollow" target="_blank" href="http://www.youtube.com/watch?v=502ILHjX9EE">Agile Product Ownership in a Nutshell</a></li>
<li><a rel="nofollow" target="_blank" href="http://de.wikipedia.org/wiki/YAGNI">YAGNI Prinzip</a></li>
<li><a rel="nofollow" target="_blank" href="http://scaledagileframework.com/spikes/">Spike (Agile)</a></li>
<li><a rel="nofollow" target="_blank" href="http://www.flickr.com/photos/seandreilinger">Image Credits</a></li>
</ul>
<div class="social-ring">
<div class="social-ring-button"><a rel="nofollow" target="_blank" href="http://twitter.com/share" lang="en" class="sr-twitter-button twitter-share-button"></a></div>
<div class="social-ring-button"><div class="g-plusone"></div></div>
<div class="social-ring-button"></div> 
<div class="social-ring-button"></div> 
</div><div style="clear:both;">&nbsp;</div>
<p>The post <a rel="nofollow" target="_blank" href="http://www.contentreich.de/agile-erste-schritte-mit-alfresco-ecm">Agile erste Schritte mit Alfresco ECM</a> appeared first on <a rel="nofollow" target="_blank" href="http://www.contentreich.de">CONTENTREICH</a>.</p>]]></content:encoded>
      </item>
      <item>
         <title>About Me</title>
         <link>http://onalfresco.blogspot.com/2013/01/about-me.html</link>
         <description>&lt;h2&gt;About Me.&lt;/h2&gt;&lt;br /&gt;&lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;https://profiles.google.com/107107023544024386365?rel=author&quot;&gt;My Google+ Profile&lt;/a&gt;</description>
         <author>Snig Bhaumik</author>
         <guid isPermaLink="false">tag:blogger.com,1999:blog-3095692350172949352.post-7735346478201175119</guid>
         <pubDate>Mon, 21 Jan 2013 02:53:00 +0000</pubDate>
      </item>
      <item>
         <title>Java Class Reloading Pain : A Fresh Open Source JRebel Alternative</title>
         <link>http://www.contentreich.de/java-class-reloading-pain-a-fresh-open-source-jrebel-alternative</link>
         <description>&lt;p&gt;&lt;img width=&quot;150&quot; height=&quot;150&quot; src=&quot;http://www.contentreich.de/wp-content/uploads/2013/01/3077556441_83d4770066_blog-150x150.jpg&quot; class=&quot;attachment-thumbnail wp-post-image&quot; alt=&quot;Java Class Reloading Pain : A Fresh Open Source JRebel Alternative&quot; title=&quot;Java Class Reloading Pain : A Fresh Open Source JRebel Alternative&quot; style=&quot;float:right;&quot;/&gt;This post introduces a fresh and simple pure Open Source approach knocking down JVM- and application restarts during development. It really helps - in grails 2.0 and beyond. &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://www.contentreich.de/java-class-reloading-pain-a-fresh-open-source-jrebel-alternative&quot;&gt;Weiterlesen &lt;span class=&quot;meta-nav&quot;&gt;&amp;#8594;&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;The post &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://www.contentreich.de/java-class-reloading-pain-a-fresh-open-source-jrebel-alternative&quot;&gt;Java Class Reloading Pain : A Fresh Open Source JRebel Alternative&lt;/a&gt; appeared first on &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://www.contentreich.de&quot;&gt;CONTENTREICH&lt;/a&gt;.&lt;/p&gt;</description>
         <guid isPermaLink="false">http://www.contentreich.de/?p=2958</guid>
         <pubDate>Tue, 15 Jan 2013 08:35:04 +0000</pubDate>
         <content:encoded><![CDATA[<div class="alignleft labeledImage "><img src="http://www.contentreich.de/wp-content/uploads/2013/01/3077556441_83d4770066_blog.jpg" alt="Picture of two pills" width="275" height="275" class="alignleft size-full wp-image-2960"/></div>
<p>This post introduces a very simple pure Open Source approach knocking down JVM- and application restarts during development. It may not address every scenario requiring class updates, but it reduced the total amount of restarts significantly for me. Your mileage may vary. My workstation is a Linux system and a part of the approach outlined uses a stacked filesystem. I don&#8217;t know whether a stacked filesystem that will do is available on every other OS Juava supports. It may not be required for you at all. Even if, I am fairly sure it is possible to come up with an alternative which does not leverage OS support.</p>
<h2>Java Class Reloading : A long History of Pain</h2>
<p>Developers&#8217; desire to reload class changes is as old as Java. Official bug entry &#8220;4910812 : Enhance Hot Code Replacement&#8221; dates back to 2003. The most annoying thing for me is the fact that restarts distract a lot. I tend to switch context, do something else and forget about the restarted application. In fact, reloading pain was a major driver for me to almost convert towards dynamic languages.  Sure, the problem is not easy to solve, but there still is demand &#8211; not everybody has given up hope yet.</p>
<p>Pain perceived depends on various factors. It may not really matter in situations where restarts are fast, such as in the case of desktop applications. But it can matter a lot when you are working on server side components which need a heavyweight environment bootstrapped to run. One of my heavyweights is a webapp called alfresco repository, and one workaround is trying to avoid the Java language and use a dynamic language instead. I am still doing this and will keep doing it when I feel it makes sense.</p>
<p>Approaches <del datetime="2013-01-09T13:42:44+00:00">Solutions</del> addressing the bug <del datetime="2013-01-15T08:22:31+00:00">issue</del> generally separate in to categories, JVM &#8211; und agent based ones. The ones I looked at over time did not work for me for one reason or another. JRebel, the canonical choice was ruled out because it is not Open Souce and I don&#8217;t like that it wants the IDE to be aware of it. DCEVM and most other efforts seem either dead or immature.</p>
<h2>Revisiting Class Reloading</h2>
<p>Actually, I was fairly happy with the help offered by dynamic languages. I was watching Graeme Rochers Groovy / Grails Exchange 2012 Keynote where he mentioned that spring-loaded, the agent based reloading solution introduced with Grails 2 is available separately on github. I consider SpringSource and the Grails community trustworthy, so I decided to try adding the missing pieces for my &#8220;other than grails day to day&#8221; work.</p>
<p>Frankly, the spring-loaded agent source looks ugly, but I guess that is due to current JVM limitations imposed at an agent based solution in general. I doubt JRebel sources look better in this respect. At the end of the day, I don&#8217;t really care about how ugly the source looks as long as is works for me and there is no need to understand it.</p>
<p>All the spring-loaded agent requires to work are a few Java command line arguments, e.g. <code>-javaagent:/opt/spring-loaded/springloaded-1.1.1-dev.jar -noverify</code>. Depending on your use case, this may already be most you need besides immediate recompilation of classes whenever they change. Eclipse has &#8220;build automatically&#8221; set by default and hence does the latter out of the box. I hope IntelliJ has a similiar feature (I am about to switch).</p>
<p>For my current alfresco repository case I needed a way to get the project classes directory &#8220;merged&#8221; with the one of the webapp. The missing ingredient was a stacking filesystem &#8211; I picked FUSE based UnionFS. Layering the directories works like this:</p>
<pre>

unionfs-fuse /opt/alfresco/tomcat/webapps/alfresco/WEB-INF/classes-default=RO:/home/deas/projects/project-a/target/classes=RO:/home/deas/work/projects/project-b/target/classes=RO /opt/alfresco/tomcat/webapps/alfresco/WEB-INF/classes

</pre>
<p>This union-mount makes changes of class files in <code>target/classes</code> directories of projects appear immediately in the webapp where they are detected by spring-loaded. Neither spring-loaded nor the IDE need to be aware of what is actually happing.</p>
<p>I have just started using this and I am exploring further possibilities. But it already helps me &#8211; a lot. It may help you as well.</p>
<p>Honestly, I wonder why SpringSource is not making serious noise about spring-loaded. I am quite excited already. Thank you guys.</p>
<p>Yes, it is not easy but Oracle should still ship cure with the JVM. This may change a little with Java 8. Bug 4910812 received a fresh comment in December. But even if JVM-level efforts resume, it may still take some more time until hotswap catches up in terms of functionality.</p>
<h2>References</h2>
<ul>
<li><a rel="nofollow" target="_blank" href="http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=4910812">Bug 4910812 : Enhance Hot Code Replacement</a></li>
<li><a rel="nofollow" target="_blank" href="http://zeroturnaround.com/software/jrebel/">JRebel</a></li>
<li><a rel="nofollow" target="_blank" href="http://java.dzone.com/articles/reloading-java-classes-401">Reloading Java  Classes: HotSwap and JRebel — Behind the Scenes</a></li>
<li><a rel="nofollow" target="_blank" href="http://ssw.jku.at/dcevm/">Dynamic Code Evolution VM</a></li>
<li><a rel="nofollow" target="_blank" href="https://github.com/SpringSource/spring-loaded">spring-loaded @ github</a></li>
<li><a rel="nofollow" target="_blank" href="https://github.com/fakereplace/fakereplace">fakereplace @ github</a></li>
<li><a rel="nofollow" target="_blank" href="http://java.net/projects/agentsmith">agentsmith</a></li>
<li><a rel="nofollow" target="_blank" href="http://discotek.ca/feenix">Feenix class reloading tool</a></li>
<li><a rel="nofollow" target="_blank" href="http://podgorny.cz/moin/UnionFsFuse">unionfs-fuse</a></li>
<li><a rel="nofollow" target="_blank" href="http://skillsmatter.com/podcast/groovy-grails/grails-keynote">Groovy / Grails Exchange 2012 Keynote</a></li>
<li><a rel="nofollow" target="_blank" href="http://www.flickr.com/photos/eagleglide/">Image Credits</a></li>
</ul>
<div class="social-ring">
<div class="social-ring-button"><a rel="nofollow" target="_blank" href="http://twitter.com/share" lang="en" class="sr-twitter-button twitter-share-button"></a></div>
<div class="social-ring-button"><div class="g-plusone"></div></div>
<div class="social-ring-button"></div> 
<div class="social-ring-button"></div> 
</div><div style="clear:both;">&nbsp;</div>
<p>The post <a rel="nofollow" target="_blank" href="http://www.contentreich.de/java-class-reloading-pain-a-fresh-open-source-jrebel-alternative">Java Class Reloading Pain : A Fresh Open Source JRebel Alternative</a> appeared first on <a rel="nofollow" target="_blank" href="http://www.contentreich.de">CONTENTREICH</a>.</p>]]></content:encoded>
      </item>
      <item>
         <title>Générer des données de test pour My Network Dashlet</title>
         <link>http://charles.torda.net/2012/12/24/generer-des-donnees-de-test-pour-my-network-dashlet/</link>
         <description>Dans son article sur My Network Dashlet, Richard Esplin (@esplinr) précise qu&amp;#8217;il lui a été difficile de créer un jeu de test. En effet, cette tâche, sans être difficile techniquement, est particulièrement longue : il faut d&amp;#8217;abord créer des utilisateurs, &amp;#8230; &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://charles.torda.net/2012/12/24/generer-des-donnees-de-test-pour-my-network-dashlet/&quot;&gt;Continuer la lecture &lt;span class=&quot;meta-nav&quot;&gt;&amp;#8594;&lt;/span&gt;&lt;/a&gt;</description>
         <guid isPermaLink="false">http://charles.torda.net/?p=725</guid>
         <pubDate>Mon, 24 Dec 2012 08:53:42 +0000</pubDate>
         <category>Non classé</category>
      </item>
      <item>
         <title>Win Free Copies of my new book on GateIn</title>
         <link>http://www.open4dev.com/journal/2012/12/18/win-free-copies-of-my-new-book-on-gatein.html</link>
         <description>&lt;span class=&quot;thumbnail-image-float-right ssNonEditable&quot;&gt;&lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://www.open4dev.com/journal/2012/12/18/win-free-copies-of-my-new-book-on-gatein.html&quot;&gt;&lt;img src=&quot;http://www.open4dev.com/storage/thumbnails/2935919-20840967-thumbnail.jpg?__SQUARESPACE_CACHEVERSION=1351858436272&quot; alt=&quot;&quot;/&gt;&lt;/a&gt;&lt;/span&gt;
&lt;p&gt;Readers would be pleased to know that I have teamed up with Packt Publishing to organize a &lt;strong&gt;Giveaway of my new GateIn Cookbook&lt;/strong&gt; book as part of our Christmas Bonanza!&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;And four lucky winners stand a chance to win copies of my new book. Keep reading to find out how you can be one of the Lucky Winners.&lt;/strong&gt;&lt;/p&gt;</description>
         <guid isPermaLink="false">288041:2935920:32083024</guid>
         <pubDate>Tue, 18 Dec 2012 14:42:28 +0000</pubDate>
      </item>
      <item>
         <title>Sane Enterprise Software in Germany and Beyond</title>
         <link>http://www.contentreich.de/sane-enterprise-software-in-germany-and-beyond</link>
         <description>&lt;p&gt;&lt;img width=&quot;150&quot; height=&quot;150&quot; src=&quot;http://www.contentreich.de/wp-content/uploads/2012/12/HomerSimpson-no-150x150.png&quot; class=&quot;attachment-thumbnail wp-post-image&quot; alt=&quot;Sane Enterprise Software in Germany and Beyond&quot; title=&quot;Sane Enterprise Software in Germany and Beyond&quot; style=&quot;float:right;&quot;/&gt;ERP, CRM, ECM – Enterprise software can be incredibly frustrating. This post summarizes what I expect from a contemporary product. &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://www.contentreich.de/sane-enterprise-software-in-germany-and-beyond&quot;&gt;Weiterlesen &lt;span class=&quot;meta-nav&quot;&gt;&amp;#8594;&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;The post &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://www.contentreich.de/sane-enterprise-software-in-germany-and-beyond&quot;&gt;Sane Enterprise Software in Germany and Beyond&lt;/a&gt; appeared first on &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://www.contentreich.de&quot;&gt;CONTENTREICH&lt;/a&gt;.&lt;/p&gt;</description>
         <guid isPermaLink="false">http://www.contentreich.de/?p=2898</guid>
         <pubDate>Mon, 17 Dec 2012 10:14:51 +0000</pubDate>
         <content:encoded><![CDATA[<div class="alignleft labeledImage "><img class="alignleft size-full wp-image-2827" title="Desperate" src="http://www.contentreich.de/wp-content/uploads/2012/12/HomerSimpson-no.png" alt="Picture of desperate Homer Simpson" width="275" height="275"/></div>
<p>ERP, CRM, ECM &#8211; Enterprise software can be incredibly frustrating. For some reason, special rules seems apply. I think it is somehow related to the fact that enterprise things tend to change rather slowly. And even more so in Germany. But they do change, no matter whether vendors object and stick to historical principles. The motivation for this post originated from one of the worst enterprise software experiences I encountered. It summarizes what I personally expect from a contemporary product.</p>
<h2>Get you started easily</h2>
<p>It should be in the best interest of any software vendor to offer a pleasing user experience &#8211; in general and for developers in particular if enterprise software is your kind of business. Usually the product will have to integrate somehow. I expect to get playing quickly and painlessly. Provide me with a download and a basic installation procedure. At the try out stage, I don&#8217;t care about all the bells and whistles which might need tweaking at some point. I want to get a basic feeling of the product. Please don&#8217;t tell me the product is super sophisticated and powerful and hence requires one week of your consultant to set it up. If that happens to be the case, the product is broken. Check out MongoDB, Riak or Elasticsearch (or even Alfresco) to get an idea what I am talking about &#8211; delightful in this regard.</p>
<h2>Support Developers</h2>
<p>Given that enterprise software requires integration work carried out by developers, you should better make sure not annoy them too much. Major painpoints include long turnaround (probably involving server restarts) and lack of public access to (read : googleable) documentation. Why developers matter ? Because at the end of the day, truth is that developers often end up using what they want to use. Their influence on how things evolve is quite strong. You may want to check out the Redmonks predictions page from the references. John Newton from Alfresco seems to have realized that years ago &#8211; engineering culture matters &#8230; and the enterprise needs a little overhaul. That does not necessarily mean github punks have to invade. Just look at the Alfresco-EMC vendor comparsion and choose for yourself.</p>
<h2>Obey the Unix Philosophy</h2>
<p>Implement functionality exceptionally well, leverage others where they are really good at and prevent overlap. At the very least, follow the &#8220;Rule of Composition&#8221; (but the others should not hurt either). I could come up with countless examples of useless features shipped with enterprise software. Paying customers expect serious functionality unless explicitly stated otherwise. Do not frustrate them with immature solutions not labeled as such &#8211; not even for free. It will fire back. At the Alfresco Devcon Keynote in Berlin, John Newton said Alfresco will be focusing on what they do really well. That has not always been the case in the past.</p>
<p>Provide excellent support for RESTful HTTP communication &#8211; client and server side. The glory days of CORBA, DCOM and RMI are over. Today we know HTTP has beautiful properties for general interprocess communication. On top of that it is the protocol of the cloud.</p>
<h2>Embrace the Cloud</h2>
<p>Like it or not, applications are moving to the cloud. Cloud issues (legal, security, extensibility) are all being addressed. The application in the cloud will soon be a massive competitive advantage for various reasons &#8211; TCO, availabilty, manageability, scalability etc. Sure some people operating on-premise systems might not like the idea, be scared of the cloud and hence object. But it is too late for the most part : &#8220;The suits have taken over&#8221;. ;)</p>
<h2>Be Open</h2>
<p>Open Source is of course what we all like most. But it is not a must. I can happily work with closed source software which has a healthy community and information I can find using google. Conversation behind closed doors raises suspicion something is wrong with the company or the product.</p>
<h2>No Marketing Nonsense please</h2>
<p>Terms such as &#8220;integrates seamless&#8221; or &#8220;modularity&#8221; seem to be popular among software marketers. To me, they immediately make an ugly smell when they are not backed reasonably. Sure nobody wants a seam or a huge monolithic island. Everybody wants it smooth and pluggable. But please marketeers &#8211; back these terms or leave them. And please if you say &#8220;future proof due to standards&#8221; &#8211; drop at least one word or two which standard you are referring to. Standards are not a good thing per se. In fact, praising them in general also makes a smell for me.</p>
<p>The best (very special) feature advertised in my case was the fact that &#8220;data is safe in your RDMBS&#8221;. Great, I really appreciate my data being safe. In practice, that boiled down to roughly 40 &#8220;meaningful&#8221; named tables per tenant. Meaningful in this context meant most of them were called &#8220;data_n_m&#8221; with a bunch of columns  &#8220;value_m&#8221;  and n being the index of the tenant. </p>
<h2>References</h2>
<ul>
<li><a rel="nofollow" target="_blank" href="http://en.wikipedia.org/wiki/Unix_philosophy">Unix philosophy</a></li>
<li><a rel="nofollow" target="_blank" href="http://www.idc.de/press/presse_idc_studie_cloud2012.jsp">IDC-Studie: Cloud Computing in Deutschland 2012 – Evolution der Revolution</a></li>
<li><a rel="nofollow" target="_blank" href="http://www.zdnet.com/uk/cloud-decisions-are-no-longer-in-the-it-departments-hands-the-suits-have-taken-over-7000008141/">Cloud decisions are no longer in the IT department&#8217;s hands &#8211; the suits have taken over</a></li>
<li><a rel="nofollow" target="_blank" href="http://redmonk.com/sogrady/2012/12/02/ten/">Redmonk predictions and what we really do in IT</a></li>
<li><a rel="nofollow" target="_blank" href="http://www.quora.com/Cloud-Security">Cloud-Security [quora]</a></li>
<li><a rel="nofollow" target="_blank" href="http://www.quora.com/Software-Engineering/Does-a-good-engineering-culture-matter/answers/1790289">Does a good engineering culture matter?</a></li>
<li><a rel="nofollow" target="_blank" href="http://readwrite.com/2012/11/27/the-enterprise-is-cool-again-and-box-ceo-aaron-levie-is-loving-it">The Enterprise Is Cool Again, and Box CEO Aaron Levie Is Loving It</a></li>
<li><a rel="nofollow" target="_blank" href="http://blog.tsgrp.com/2012/12/07/documentum-to-alfresco-migration-comparing-company-visions/">Documentum to Alfresco Migration – Comparing Company Visions</a></li>
</ul>
<div class="social-ring">
<div class="social-ring-button"><a rel="nofollow" target="_blank" href="http://twitter.com/share" lang="en" class="sr-twitter-button twitter-share-button"></a></div>
<div class="social-ring-button"><div class="g-plusone"></div></div>
<div class="social-ring-button"></div> 
<div class="social-ring-button"></div> 
</div><div style="clear:both;">&nbsp;</div>
<p>The post <a rel="nofollow" target="_blank" href="http://www.contentreich.de/sane-enterprise-software-in-germany-and-beyond">Sane Enterprise Software in Germany and Beyond</a> appeared first on <a rel="nofollow" target="_blank" href="http://www.contentreich.de">CONTENTREICH</a>.</p>]]></content:encoded>
      </item>
      <item>
         <title>Cifrado de contenido en Alfresco</title>
         <link>http://www.fegor.com/2012/12/encriptacion-de-contenido-en-alfresco.html</link>
         <description>&lt;div class=&quot;separator&quot; style=&quot;clear:both;text-align:center;&quot;&gt;&lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://2.bp.blogspot.com/-Ae4e1c5vXtU/UMslCQZ8a2I/AAAAAAAAAUw/x8Hjqy4WTv0/s1600/aes-logo.png&quot; style=&quot;clear:left;float:left;margin-bottom:1em;margin-right:1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;124&quot; src=&quot;http://2.bp.blogspot.com/-Ae4e1c5vXtU/UMslCQZ8a2I/AAAAAAAAAUw/x8Hjqy4WTv0/s200/aes-logo.png&quot; width=&quot;200&quot;/&gt;&lt;/a&gt;&lt;/div&gt;En muchas ocasiones es necesario el cifrado del contenido en Alfresco, en este sentido ya Alfresco en la versión 4.0 puede cifrar propiedades (&lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://wiki.alfresco.com/wiki/Data_Encryption&quot;&gt;http://wiki.alfresco.com/wiki/Data_Encryption&lt;/a&gt;) y también hay un módulo para utilizar el cifrado (&lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://addons.alfresco.com/addons/alfresco-encryption-module&quot;&gt;http://addons.alfresco.com/addons/alfresco-encryption-module&lt;/a&gt;).&lt;br /&gt;&lt;br /&gt;En este caso vamos a realizar dos acciones que cifren y descifren el contenido de un documento (propiedad content) usando el algoritmo de cifrado simétrico AES. Estos sirven para la versión 3.4 de Alfresco y siguientes.&lt;br /&gt;&lt;br /&gt;El código también se encuentra en: &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://code.google.com/p/alfcrypto&quot;&gt;http://code.google.com/p/alfcrypto&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://1.bp.blogspot.com/-0X3UgtSXxeo/UMsqxxBkpaI/AAAAAAAAAVI/g14KHDUBGjM/s1600/descifrar.JPG&quot; style=&quot;clear:right;float:right;margin-bottom:1em;margin-left:1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;192&quot; src=&quot;http://1.bp.blogspot.com/-0X3UgtSXxeo/UMsqxxBkpaI/AAAAAAAAAVI/g14KHDUBGjM/s320/descifrar.JPG&quot; width=&quot;320&quot;/&gt;&lt;/a&gt;&lt;b&gt;Algunas cosas importantes primero&lt;/b&gt;: Este software es una versión alpha o beta o como queráis llamarla pero sobre todo es un código hecho de forma más o menos rápida y por tanto no hay garantía ninguna de funcionamiento, se ha probado solo con algunos documentos MS-Word y PDF. Además, ya he detectado un problema, cuando se descifra el tipo MIME en el que se guarda la copia desencriptada es plain/text (no es que no funcione, si descargais el documento se puede abrir/editar, etc) por lo que hay que incluir en el modelo de datos una propiedad que guarde el valor original y lo restaure posteriormente (ya lo haré cuando consiga algo de tiempo). Se ha realizado solamente con &lt;b&gt;carácter educativo&lt;/b&gt; y por lo tanto no lo recomiendo para su uso en sistemas de producción sin realizar antes algunas modificaciones y pruebas.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Otro apunte más&lt;/b&gt;, como bien comenta Toni de la Fuente (&lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://blyx.com/&quot;&gt;blyx.com&lt;/a&gt;), existen algunas restricciones derivadas del cifrado, la primera es en la previsualización, evidentemente no existe cuando los documentos están cifrados y no tiene sentido descifrar para previsualizar ya que rompería la seguridad. Tampoco es posible la indexación full-text ya que no es posible al igual que en contenidos de imágenes (JPG, GIF, etc.), es más, es una buena idea cambiar el tipo MIME a algún tipo que Alfresco no indexe y cuando sea descifrado reponer el tipo MIME original. El uso de este sistema sería para documentos que son necesariamente obligados a ser cifrados y solo se tenga acceso a ellos por personal especial (Recursos Humanos, I+D+I, datos con carácter especial de protección de datos, etc.) que una vez descifrados (en otra ubicación a la original principalmente) sean descargados y borrados (la copia descifrada) vaciando la papelera e incluso modificando la configuración para que no sean guardados en esta. Además recomendaría que o bien el cifrado, o el descifrado se aloje en otras unidades de disco diferentes usando para ello &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://wiki.alfresco.com/wiki/Content_Store_Selector&quot;&gt;Content Store Selector&lt;/a&gt; (en este último caso solo para las versiones Enterprise).&lt;br /&gt;&lt;br /&gt;Con todo esto, comencemos:&lt;br /&gt;&lt;br /&gt;Lo primero que hay que hacer es construir la clase de cifrado que en este caso se llamará crypto.java:&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-size:small;&quot;&gt;&lt;span style=&quot;&quot;&gt;/*&lt;br /&gt;&amp;nbsp;* alfcrypto is free software: you can redistribute it and/or modify&lt;br /&gt;&amp;nbsp;* it under the terms of the GNU Lesser General Public License as published by&lt;br /&gt;&amp;nbsp;* the Free Software Foundation, either version 3 of the License, or&lt;br /&gt;&amp;nbsp;* (at your option) any later version.&lt;br /&gt;&amp;nbsp;*&lt;br /&gt;&amp;nbsp;* alfcrypto is distributed in the hope that it will be useful,&lt;br /&gt;&amp;nbsp;* but WITHOUT ANY WARRANTY; without even the implied warranty of&lt;br /&gt;&amp;nbsp;* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.&amp;nbsp; See the&lt;br /&gt;&amp;nbsp;* GNU Lesser General Public License for more details.&lt;br /&gt;&amp;nbsp;*&lt;br /&gt;&amp;nbsp;* You should have received a copy of the GNU Lesser General Public License&lt;br /&gt;&amp;nbsp;* along with Alfresco. If not, see &amp;lt;http://www.gnu.org/licenses/&amp;gt;.&lt;br /&gt;&amp;nbsp;*/&lt;br /&gt;package com.fegor.alfresco.security.crypto;&lt;br /&gt;&lt;br /&gt;import java.io.IOException;&lt;br /&gt;import java.io.UnsupportedEncodingException;&lt;br /&gt;import java.security.AlgorithmParameters;&lt;br /&gt;import java.security.InvalidAlgorithmParameterException;&lt;br /&gt;import java.security.InvalidKeyException;&lt;br /&gt;import java.security.NoSuchAlgorithmException;&lt;br /&gt;import java.security.SecureRandom;&lt;br /&gt;import java.security.spec.InvalidKeySpecException;&lt;br /&gt;import java.security.spec.InvalidParameterSpecException;&lt;br /&gt;import java.security.spec.KeySpec;&lt;br /&gt;&lt;br /&gt;import org.apache.log4j.Logger;&lt;br /&gt;&lt;br /&gt;import javax.crypto.BadPaddingException;&lt;br /&gt;import javax.crypto.Cipher;&lt;br /&gt;import javax.crypto.IllegalBlockSizeException;&lt;br /&gt;import javax.crypto.NoSuchPaddingException;&lt;br /&gt;import javax.crypto.SecretKey;&lt;br /&gt;import javax.crypto.SecretKeyFactory;&lt;br /&gt;import javax.crypto.ShortBufferException;&lt;br /&gt;import javax.crypto.spec.IvParameterSpec;&lt;br /&gt;import javax.crypto.spec.PBEKeySpec;&lt;br /&gt;import javax.crypto.spec.SecretKeySpec;&lt;br /&gt;&lt;br /&gt;import org.apache.commons.codec.DecoderException;&lt;br /&gt;import org.apache.commons.codec.binary.Hex;&lt;br /&gt;&lt;br /&gt;public class Crypto {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; private final Logger logger = Logger.getLogger(Crypto.class);&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; String password = null;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; public final static int SALT_LEN = 8;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; byte[] vector_init = null;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; byte[] salt_pos = null;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; byte[] input;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; byte[] output;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Cipher eCipher = null;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Cipher deCipher = null;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; private final int KEYLEN_BITS = 128;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; private final int ITERATIONS = 65536;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; /**&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;* Constructor&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;*/&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; public Crypto() {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; /**&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;* Encryption configuration&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;* &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;* @throws NoSuchAlgorithmException&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;* @throws InvalidKeySpecException&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;* @throws NoSuchPaddingException&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;* @throws InvalidParameterSpecException&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;* @throws IllegalBlockSizeException&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;* @throws BadPaddingException&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;* @throws UnsupportedEncodingException&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;* @throws InvalidKeyException&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;*/&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; public void configEncrypt() throws NoSuchAlgorithmException,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; InvalidKeySpecException, NoSuchPaddingException,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; InvalidParameterSpecException, IllegalBlockSizeException,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; BadPaddingException, UnsupportedEncodingException,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; InvalidKeyException {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; SecretKeyFactory factory = null;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; SecretKey tmp = null;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; salt_pos = new byte[SALT_LEN];&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; SecureRandom rnd = new SecureRandom();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; rnd.nextBytes(salt_pos);&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; if (logger.isDebugEnabled())&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; logger.debug(this.getClass().getName() + &quot;: [salt: &quot;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; + (new String(Hex.encodeHex(salt_pos))) + &quot;]&quot;);&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; factory = SecretKeyFactory.getInstance(&quot;PBKDF2WithHmacSHA1&quot;);&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; /*&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;* http://www.javamex.com/tutorials/cryptography/unrestricted_policy_files&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;* .shtml&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;*/&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; KeySpec spec = new PBEKeySpec(password.toCharArray(), salt_pos,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; ITERATIONS, KEYLEN_BITS);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; tmp = factory.generateSecret(spec);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; SecretKey secret = new SecretKeySpec(tmp.getEncoded(), &quot;AES&quot;);&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; eCipher = Cipher.getInstance(&quot;AES/CBC/PKCS5Padding&quot;);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; eCipher.init(Cipher.ENCRYPT_MODE, secret);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; AlgorithmParameters params = eCipher.getParameters();&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; vector_init = params.getParameterSpec(IvParameterSpec.class).getIV();&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; if (logger.isDebugEnabled())&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; logger.debug(this.getClass().getName() + &quot;: [vector ini: &quot;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; + (new String(Hex.encodeHex(vector_init))) + &quot;]&quot;);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; /**&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;* Decryption configuration&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;* &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;* @param initvec&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;* @param salt&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;* @throws NoSuchAlgorithmException&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;* @throws InvalidKeySpecException&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;* @throws NoSuchPaddingException&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;* @throws InvalidKeyException&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;* @throws InvalidAlgorithmParameterException&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;* @throws DecoderException&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;*/&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; public void configDecrypt(String initvec, String salt)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; throws NoSuchAlgorithmException, InvalidKeySpecException,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; NoSuchPaddingException, InvalidKeyException,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; InvalidAlgorithmParameterException, DecoderException {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; SecretKeyFactory factory = null;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; SecretKey tmp = null;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; SecretKey secret = null;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; salt_pos = Hex.decodeHex(salt.toCharArray());&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; if (logger.isDebugEnabled())&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; logger.debug(this.getClass().getName() + &quot;: [salt: &quot;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; + (new String(Hex.encodeHex(salt_pos))) + &quot;]&quot;);&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; vector_init = Hex.decodeHex(initvec.toCharArray());&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; if (logger.isDebugEnabled())&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; logger.debug(this.getClass().getName() + &quot;: [vector ini: &quot;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; + (new String(Hex.encodeHex(vector_init))) + &quot;]&quot;);&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; /*&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;* http://www.javamex.com/tutorials/cryptography/unrestricted_policy_files&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;* .shtml&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;*/&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; factory = SecretKeyFactory.getInstance(&quot;PBKDF2WithHmacSHA1&quot;);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; KeySpec spec = new PBEKeySpec(password.toCharArray(), salt_pos,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; ITERATIONS, KEYLEN_BITS);&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; tmp = factory.generateSecret(spec);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; secret = new SecretKeySpec(tmp.getEncoded(), &quot;AES&quot;);&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; deCipher = Cipher.getInstance(&quot;AES/CBC/PKCS5Padding&quot;);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; deCipher.init(Cipher.DECRYPT_MODE, secret, new IvParameterSpec(&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; vector_init));&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; /**&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;* Cipher input&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;* &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;* @param input&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;*&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; - the cleartext file to be encrypted&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;* @param output&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;*&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; - the encrypted data file&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;* @throws IOException&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;* @throws IllegalBlockSizeException&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;* @throws BadPaddingException&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;* @throws ShortBufferException&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;*/&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; public void Cipher() throws IOException, IllegalBlockSizeException,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; BadPaddingException, ShortBufferException {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; try {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; this.output = eCipher.doFinal(this.input);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; } catch (IllegalBlockSizeException e) {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; e.printStackTrace();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; } catch (BadPaddingException e) {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; e.printStackTrace();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; /**&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;* Decipher input&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;* &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;* @param input&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;*&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; - the cleartext file to be encrypted&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;* @param output&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;*&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; - the encrypted data file&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;* @throws IOException&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;* @throws IllegalBlockSizeException&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;* @throws BadPaddingException&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;* @throws ShortBufferException&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;*/&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; public void Decipher() throws IOException, IllegalBlockSizeException,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; BadPaddingException, ShortBufferException {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; try {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; this.output = deCipher.doFinal(this.input);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; } catch (IllegalBlockSizeException e) {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; e.printStackTrace();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; } catch (BadPaddingException e) {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; e.printStackTrace();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; /*&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;* Methods setter and getter&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;*/&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; public void setInput(byte[] input) {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; this.input = input;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; public void setPassword(String password) {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; this.password = password;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; public String getSalt() {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; return (new String(Hex.encodeHex(salt_pos)));&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; public String getVectorInit() {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; return (new String(Hex.encodeHex(vector_init)));&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; public byte[] getOutput() {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; return this.output;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;}&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Como se observa es una clase normal con los métodos para configurar el cifrado y descifrado y la llamada para realizar las acciones correspondientes.&lt;br /&gt;&lt;br /&gt;Utilizaremos dos aspectos para saber que documentos están cifrados y cuales han sido descifrados, el modelo de datos a utilizar será el siguiente:&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-size:small;&quot;&gt;&amp;lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&amp;gt;&lt;br /&gt;&amp;lt;model name=&quot;acr:alfcryptoModel&quot; xmlns=&quot;http://www.alfresco.org/model/dictionary/1.0&quot;&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;!-- Optional meta-data about the model --&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;description&amp;gt;Alfresco Crypto Model&amp;lt;/description&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;author&amp;gt;Fernando González Ruano (twitter://fegorama)&amp;lt;/author&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;version&amp;gt;1.0&amp;lt;/version&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;imports&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;import uri=&quot;http://www.alfresco.org/model/dictionary/1.0&quot;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; prefix=&quot;d&quot; /&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;import uri=&quot;http://www.alfresco.org/model/content/1.0&quot; prefix=&quot;cm&quot; /&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/imports&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;namespaces&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;namespace uri=&quot;http://www.fegorsoft.com/model/alfcrypto/1.0&quot;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; prefix=&quot;acr&quot; /&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/namespaces&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;aspects&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;aspect name=&quot;acr:ciphered&quot;&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;title&amp;gt;Ciphered&amp;lt;/title&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;properties&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;property name=&quot;acr:salt&quot;&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;type&amp;gt;d:text&amp;lt;/type&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;mandatory&amp;gt;false&amp;lt;/mandatory&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;index enabled=&quot;true&quot;&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;atomic&amp;gt;false&amp;lt;/atomic&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;stored&amp;gt;false&amp;lt;/stored&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;tokenised&amp;gt;false&amp;lt;/tokenised&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/index&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/property&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;property name=&quot;acr:vector_ini&quot;&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;type&amp;gt;d:text&amp;lt;/type&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;mandatory&amp;gt;false&amp;lt;/mandatory&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;index enabled=&quot;true&quot;&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;atomic&amp;gt;false&amp;lt;/atomic&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;stored&amp;gt;false&amp;lt;/stored&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;tokenised&amp;gt;false&amp;lt;/tokenised&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/index&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/property&amp;gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/properties&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/aspect&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;aspect name=&quot;acr:deciphered&quot;&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;title&amp;gt;Deciphered&amp;lt;/title&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/aspect&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/aspects&amp;gt;&lt;br /&gt;&amp;lt;/model&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Para llamar a esta clase se necesitan dos acciones de Alfresco, estas serán CipherContent.java y DecipherContent.java:&lt;br /&gt;&lt;br /&gt;Fichero: CipherContent.java&lt;br /&gt;&lt;span style=&quot;font-size:small;&quot;&gt;/*&lt;br /&gt;&amp;nbsp;* alfcrypto is free software: you can redistribute it and/or modify&lt;br /&gt;&amp;nbsp;* it under the terms of the GNU Lesser General Public License as published by&lt;br /&gt;&amp;nbsp;* the Free Software Foundation, either version 3 of the License, or&lt;br /&gt;&amp;nbsp;* (at your option) any later version.&lt;br /&gt;&amp;nbsp;*&lt;br /&gt;&amp;nbsp;* alfcrypto is distributed in the hope that it will be useful,&lt;br /&gt;&amp;nbsp;* but WITHOUT ANY WARRANTY; without even the implied warranty of&lt;br /&gt;&amp;nbsp;* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.&amp;nbsp; See the&lt;br /&gt;&amp;nbsp;* GNU Lesser General Public License for more details.&lt;br /&gt;&amp;nbsp;*&lt;br /&gt;&amp;nbsp;* You should have received a copy of the GNU Lesser General Public License&lt;br /&gt;&amp;nbsp;* along with Alfresco. If not, see &amp;lt;http://www.gnu.org/licenses/&amp;gt;.&lt;br /&gt;&amp;nbsp;*/&lt;br /&gt;package com.fegor.alfresco.action;&lt;br /&gt;&lt;br /&gt;import java.io.IOException;&lt;br /&gt;import java.io.Serializable;&lt;br /&gt;import java.io.UnsupportedEncodingException;&lt;br /&gt;import java.security.InvalidKeyException;&lt;br /&gt;import java.security.NoSuchAlgorithmException;&lt;br /&gt;import java.security.spec.InvalidKeySpecException;&lt;br /&gt;import java.security.spec.InvalidParameterSpecException;&lt;br /&gt;import java.util.HashMap;&lt;br /&gt;import java.util.List;&lt;br /&gt;&lt;br /&gt;import javax.crypto.BadPaddingException;&lt;br /&gt;import javax.crypto.IllegalBlockSizeException;&lt;br /&gt;import javax.crypto.NoSuchPaddingException;&lt;br /&gt;import javax.crypto.ShortBufferException;&lt;br /&gt;&lt;br /&gt;import org.alfresco.model.ContentModel;&lt;br /&gt;import org.alfresco.repo.action.executer.ActionExecuterAbstractBase;&lt;br /&gt;import org.alfresco.service.cmr.action.Action;&lt;br /&gt;import org.alfresco.service.cmr.action.ParameterDefinition;&lt;br /&gt;import org.alfresco.service.cmr.repository.ContentIOException;&lt;br /&gt;import org.alfresco.service.cmr.repository.ContentReader;&lt;br /&gt;import org.alfresco.service.cmr.repository.ContentService;&lt;br /&gt;import org.alfresco.service.cmr.repository.ContentWriter;&lt;br /&gt;import org.alfresco.service.cmr.repository.NodeRef;&lt;br /&gt;import org.alfresco.service.cmr.repository.NodeService;&lt;br /&gt;import org.alfresco.service.namespace.QName;&lt;br /&gt;import org.apache.commons.io.IOUtils;&lt;br /&gt;import org.apache.log4j.Logger;&lt;br /&gt;&lt;br /&gt;import com.fegor.alfresco.model.AlfCryptoModel;&lt;br /&gt;import com.fegor.alfresco.security.crypto.Crypto;&lt;br /&gt;import com.google.gdata.util.common.util.Base64;&lt;br /&gt;&lt;br /&gt;/**&lt;br /&gt;&amp;nbsp;* CryptoRepo Action&lt;br /&gt;&amp;nbsp;* &lt;br /&gt;&amp;nbsp;* @author fegor&lt;br /&gt;&amp;nbsp;* &lt;br /&gt;&amp;nbsp;*/&lt;br /&gt;public class CipherContent extends ActionExecuterAbstractBase {&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; private final Logger logger = Logger.getLogger(CipherContent.class);&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; /*&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;* Services&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;*/&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; private ContentService contentService;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; private NodeService nodeService;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; private String password;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; //&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; // TODO Poder usar más algoritmos que AES&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; //&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; // private String algorithm;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; private String salt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; private String vector_init;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; /*&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;* (non-Javadoc)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;* &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;* @see&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;* org.alfresco.repo.action.executer.ActionExecuterAbstractBase#executeImpl&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;* (org.alfresco.service.cmr.action.Action,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;* org.alfresco.service.cmr.repository.NodeRef)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;*/&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; @Override&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; protected void executeImpl(Action action, NodeRef actionedUponNodeRef) {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; if (!nodeService.hasAspect(actionedUponNodeRef,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; AlfCryptoModel.ASPECT_CIPHERED)) {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; if (logger.isDebugEnabled()) {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; logger.debug(this.getClass().getName() + &quot;: [Action for: &quot;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; + actionedUponNodeRef + &quot; is ciphering...]&quot;);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; if (actionedUponNodeRef != null)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; try {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; this.cryptoFileCipher(actionedUponNodeRef);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; } catch (ContentIOException e) {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; e.printStackTrace();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; } catch (IOException e) {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; e.printStackTrace();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; /*&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;* (non-Javadoc)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;* &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;* @see org.alfresco.repo.action.ParameterizedItemAbstractBase#&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;* addParameterDefinitions(java.util.List)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;*/&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; @Override&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; protected void addParameterDefinitions(List&amp;lt;ParameterDefinition&amp;gt; arg0) {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; /**&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;* Crypto file for nodeRef&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;* &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;* @param nodeRef&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;* @throws IOException&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;* @throws ContentIOException&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;*/&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; private void cryptoFileCipher(NodeRef nodeRef) throws ContentIOException,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; IOException {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; ContentReader contentReader = this.contentService.getReader(nodeRef,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; ContentModel.PROP_CONTENT);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; ContentWriter contentWriter = this.contentService.getWriter(nodeRef,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; ContentModel.PROP_CONTENT, true);&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; if (contentReader != null) {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; Crypto crypto = new Crypto();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; crypto.setPassword(this.password);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; byte[] crb = IOUtils.toByteArray(contentReader&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; .getContentInputStream());&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; try {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; crypto.configEncrypt();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; } catch (InvalidKeyException e) {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; e.printStackTrace();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; } catch (NoSuchAlgorithmException e) {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; e.printStackTrace();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; } catch (InvalidKeySpecException e) {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; e.printStackTrace();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; } catch (NoSuchPaddingException e) {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; e.printStackTrace();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; } catch (InvalidParameterSpecException e) {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; e.printStackTrace();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; } catch (IllegalBlockSizeException e) {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; e.printStackTrace();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; } catch (BadPaddingException e) {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; e.printStackTrace();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; } catch (UnsupportedEncodingException e) {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; e.printStackTrace();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; crypto.setInput(crb);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; try {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; crypto.Cipher();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; } catch (IllegalBlockSizeException e) {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; e.printStackTrace();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; } catch (BadPaddingException e) {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; e.printStackTrace();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; } catch (ShortBufferException e) {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; e.printStackTrace();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; } catch (IOException e) {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; e.printStackTrace();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; contentWriter.putContent(Base64.encode(crypto.getOutput()));&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; this.salt = crypto.getSalt();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; this.vector_init = crypto.getVectorInit();&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; this.removeAspect(nodeRef);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; this.addAspect(nodeRef);&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; } else {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; if (logger.isDebugEnabled())&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; logger.debug(this.getClass().getName()&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; + &quot;: [contentReader is null]&quot;);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; /**&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;* Remove aspect Deciphered&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;* &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;* @param nodeRef&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;*/&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; private void removeAspect(NodeRef nodeRef) {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; if (nodeService.hasAspect(nodeRef, AlfCryptoModel.ASPECT_DECIPHERED)) {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; nodeService.removeAspect(nodeRef, AlfCryptoModel.ASPECT_DECIPHERED);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; /**&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;* Add aspect Ciphered&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;* &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;* @param nodeRef&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;*/&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; private void addAspect(NodeRef nodeRef) {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; HashMap&amp;lt;QName, Serializable&amp;gt; properties = new HashMap&amp;lt;QName, Serializable&amp;gt;(&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; 1, 1.0f);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; properties.put(AlfCryptoModel.PROP_SALT, this.salt);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; properties.put(AlfCryptoModel.PROP_VECTOR_INIT, this.vector_init);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; if (!nodeService.hasAspect(nodeRef, AlfCryptoModel.ASPECT_CIPHERED)) {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; nodeService.addAspect(nodeRef, AlfCryptoModel.ASPECT_CIPHERED,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; properties);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; /**&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;* @param contentService&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;*/&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; public void setContentService(ContentService contentService) {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; this.contentService = contentService;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; /**&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;* @param nodeService&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;*/&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; public void setNodeService(NodeService nodeService) {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; this.nodeService = nodeService;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; /**&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;* @param password&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;*/&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; public void setPassword(String password) {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; this.password = password;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; /**&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;* @param algorithm&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;*/&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; //&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; // TODO Poder usar más algoritmos que AES&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; //&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; // public void setAlgorithm(String algorithm) {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; // this.algorithm = algorithm;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; // }&lt;br /&gt;}&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Fichero: DecipherContent.java&lt;br /&gt;&lt;span style=&quot;font-size:small;&quot;&gt;/*&lt;br /&gt;&amp;nbsp;* alfcrypto is free software: you can redistribute it and/or modify&lt;br /&gt;&amp;nbsp;* it under the terms of the GNU Lesser General Public License as published by&lt;br /&gt;&amp;nbsp;* the Free Software Foundation, either version 3 of the License, or&lt;br /&gt;&amp;nbsp;* (at your option) any later version.&lt;br /&gt;&amp;nbsp;*&lt;br /&gt;&amp;nbsp;* alfcrypto is distributed in the hope that it will be useful,&lt;br /&gt;&amp;nbsp;* but WITHOUT ANY WARRANTY; without even the implied warranty of&lt;br /&gt;&amp;nbsp;* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.&amp;nbsp; See the&lt;br /&gt;&amp;nbsp;* GNU Lesser General Public License for more details.&lt;br /&gt;&amp;nbsp;*&lt;br /&gt;&amp;nbsp;* You should have received a copy of the GNU Lesser General Public License&lt;br /&gt;&amp;nbsp;* along with Alfresco. If not, see &amp;lt;http://www.gnu.org/licenses/&amp;gt;.&lt;br /&gt;&amp;nbsp;*/&lt;br /&gt;package com.fegor.alfresco.action;&lt;br /&gt;&lt;br /&gt;import java.io.ByteArrayInputStream;&lt;br /&gt;import java.io.IOException;&lt;br /&gt;import java.io.InputStream;&lt;br /&gt;import java.security.InvalidAlgorithmParameterException;&lt;br /&gt;import java.security.InvalidKeyException;&lt;br /&gt;import java.security.NoSuchAlgorithmException;&lt;br /&gt;import java.security.spec.InvalidKeySpecException;&lt;br /&gt;import java.util.List;&lt;br /&gt;&lt;br /&gt;import javax.crypto.BadPaddingException;&lt;br /&gt;import javax.crypto.IllegalBlockSizeException;&lt;br /&gt;import javax.crypto.NoSuchPaddingException;&lt;br /&gt;import javax.crypto.ShortBufferException;&lt;br /&gt;&lt;br /&gt;import org.alfresco.model.ContentModel;&lt;br /&gt;import org.alfresco.repo.action.executer.ActionExecuterAbstractBase;&lt;br /&gt;import org.alfresco.service.cmr.action.Action;&lt;br /&gt;import org.alfresco.service.cmr.action.ParameterDefinition;&lt;br /&gt;import org.alfresco.service.cmr.repository.ContentReader;&lt;br /&gt;import org.alfresco.service.cmr.repository.ContentService;&lt;br /&gt;import org.alfresco.service.cmr.repository.ContentWriter;&lt;br /&gt;import org.alfresco.service.cmr.repository.NodeRef;&lt;br /&gt;import org.alfresco.service.cmr.repository.NodeService;&lt;br /&gt;import org.apache.commons.codec.DecoderException;&lt;br /&gt;import org.apache.log4j.Logger;&lt;br /&gt;&lt;br /&gt;import com.fegor.alfresco.model.AlfCryptoModel;&lt;br /&gt;import com.fegor.alfresco.security.crypto.Crypto;&lt;br /&gt;import com.google.gdata.util.common.util.Base64;&lt;br /&gt;import com.google.gdata.util.common.util.Base64DecoderException;&lt;br /&gt;&lt;br /&gt;/**&lt;br /&gt;&amp;nbsp;* DecryptoRepo Action&lt;br /&gt;&amp;nbsp;* &lt;br /&gt;&amp;nbsp;* @author fegor&lt;br /&gt;&amp;nbsp;* &lt;br /&gt;&amp;nbsp;*/&lt;br /&gt;public class DecipherContent extends ActionExecuterAbstractBase {&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; private final Logger logger = Logger.getLogger(DecipherContent.class);&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; /*&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;* Services&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;*/&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; private ContentService contentService;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; private NodeService nodeService;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; private String password;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; //&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; // TODO Poder usar más algoritmos que AES&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; //&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; // private String algorithm;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; private String salt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; private String vector_init;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; /*&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;* (non-Javadoc)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;* &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;* @see&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;* org.alfresco.repo.action.executer.ActionExecuterAbstractBase#executeImpl&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;* (org.alfresco.service.cmr.action.Action,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;* org.alfresco.service.cmr.repository.NodeRef)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;*/&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; @Override&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; protected void executeImpl(Action action, NodeRef actionedUponNodeRef) {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; if (nodeService.hasAspect(actionedUponNodeRef,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; AlfCryptoModel.ASPECT_CIPHERED)) {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; if (logger.isDebugEnabled()) {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; logger.debug(this.getClass().getName() + &quot;: [Action for: &quot;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; + actionedUponNodeRef + &quot; is deciphering...]&quot;);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; if (actionedUponNodeRef != null)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; try {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; this.cryptoFileDecipher(actionedUponNodeRef);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; } catch (InvalidAlgorithmParameterException e) {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; e.printStackTrace();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; } catch (DecoderException e) {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; e.printStackTrace();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; /*&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;* (non-Javadoc)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;* &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;* @see org.alfresco.repo.action.ParameterizedItemAbstractBase#&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;* addParameterDefinitions(java.util.List)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;*/&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; @Override&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; protected void addParameterDefinitions(List&amp;lt;ParameterDefinition&amp;gt; arg0) {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; /**&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;* Scan file for nodeRef&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;* &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;* @param nodeRef&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;* @throws DecoderException&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;* @throws InvalidAlgorithmParameterException&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;*/&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; private void cryptoFileDecipher(NodeRef nodeRef)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; throws InvalidAlgorithmParameterException, DecoderException {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; ContentReader contentReader = this.contentService.getReader(nodeRef,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; ContentModel.PROP_CONTENT);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; ContentWriter contentWriter = this.contentService.getWriter(nodeRef,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; ContentModel.PROP_CONTENT, true);&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; if (contentReader != null) {&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; byte[] crb = contentReader.getContentString().getBytes();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; Crypto crypto = new Crypto();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; crypto.setPassword(this.password);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; this.salt = (String) nodeService.getProperty(nodeRef,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; AlfCryptoModel.PROP_SALT);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; this.vector_init = (String) nodeService.getProperty(nodeRef,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; AlfCryptoModel.PROP_VECTOR_INIT);&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; try {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; crypto.configDecrypt(this.vector_init, this.salt);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; } catch (InvalidKeyException e) {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; e.printStackTrace();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; } catch (NoSuchAlgorithmException e) {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; e.printStackTrace();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; } catch (InvalidKeySpecException e) {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; e.printStackTrace();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; } catch (NoSuchPaddingException e) {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; e.printStackTrace();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; try {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; crypto.setInput(Base64.decode(crb));&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; } catch (Base64DecoderException e1) {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; e1.printStackTrace();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; try {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; crypto.Decipher();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; } catch (IllegalBlockSizeException e) {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; e.printStackTrace();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; } catch (BadPaddingException e) {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; e.printStackTrace();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; } catch (ShortBufferException e) {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; e.printStackTrace();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; } catch (IOException e) {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; e.printStackTrace();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; contentWriter.setMimetype(&quot;text/plain&quot;);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; contentWriter.putContent((InputStream) (new ByteArrayInputStream(&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; crypto.getOutput())));&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; this.removeAspect(nodeRef);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; this.addAspect(nodeRef);&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; } else {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; if (logger.isDebugEnabled())&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; logger.debug(this.getClass().getName()&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; + &quot;: [contentReader is null]&quot;);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; /**&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;* Remove aspect Ciphered&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;* &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;* @param nodeRef&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;*/&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; private void removeAspect(NodeRef nodeRef) {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; if (nodeService.hasAspect(nodeRef, AlfCryptoModel.ASPECT_CIPHERED)) {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; nodeService.removeAspect(nodeRef, AlfCryptoModel.ASPECT_CIPHERED);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; /**&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;* Add aspect Deciphered&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;* &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;* @param nodeRef&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;*/&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; private void addAspect(NodeRef nodeRef) {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; if (!nodeService.hasAspect(nodeRef, AlfCryptoModel.ASPECT_CIPHERED)) {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; nodeService&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; .addAspect(nodeRef, AlfCryptoModel.ASPECT_CIPHERED, null);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; /**&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;* @param contentService&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;*/&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; public void setContentService(ContentService contentService) {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; this.contentService = contentService;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; /**&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;* @param nodeService&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;*/&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; public void setNodeService(NodeService nodeService) {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; this.nodeService = nodeService;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; /**&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;* @param password&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;*/&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; public void setPassword(String password) {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; this.password = password;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; /**&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;* @param algorithm&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;*/&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; //&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; // TODO Poder usar más algoritmos que AES&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; //&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; // public void setAlgorithm(String algorithm) {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; // this.algorithm = algorithm;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; // }&lt;br /&gt;}&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;El siguiente paso es configurar y registrar las acciones en Alfresco:&lt;br /&gt;&lt;br /&gt;Fichero: actions-context.xml&lt;br /&gt;&lt;span style=&quot;font-size:small;&quot;&gt;&amp;lt;?xml version='1.0' encoding='UTF-8'?&amp;gt;&lt;br /&gt;&amp;lt;!DOCTYPE beans PUBLIC '-//SPRING//DTD BEAN//EN' 'http://www.springframework.org/dtd/spring-beans.dtd'&amp;gt;&lt;br /&gt;&amp;lt;beans&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;bean class=&quot;org.springframework.beans.factory.config.PropertyPlaceholderConfigurer&quot;&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;property name=&quot;ignoreUnresolvablePlaceholders&quot;&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;value&amp;gt;true&amp;lt;/value&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/property&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;property name=&quot;locations&quot;&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;list&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;value&amp;gt;classpath:alfresco/extension/alfcrypto.properties&amp;lt;/value&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/list&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/property&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/bean&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;bean id=&quot;alfcrypto.cipher.action&quot; class=&quot;com.fegor.alfresco.action.CipherContent&quot;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; parent=&quot;action-executer&quot;&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;property name=&quot;contentService&quot;&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;ref bean=&quot;contentService&quot; /&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/property&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;property name=&quot;nodeService&quot;&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;ref bean=&quot;nodeService&quot; /&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/property&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;!-- TODO Poder usar más algoritmos que AES --&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;!-- &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;property name=&quot;algorithm&quot;&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;value&amp;gt;${alfviral.algorithm}&amp;lt;/value&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/property&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; --&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;property name=&quot;password&quot;&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;value&amp;gt;${alfviral.password}&amp;lt;/value&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/property&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/bean&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;bean id=&quot;alfcrypto.decipher.action&quot; class=&quot;com.fegor.alfresco.action.DecipherContent&quot;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; parent=&quot;action-executer&quot;&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;property name=&quot;contentService&quot;&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;ref bean=&quot;contentService&quot; /&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/property&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;property name=&quot;nodeService&quot;&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;ref bean=&quot;nodeService&quot; /&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/property&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;!-- TODO Poder usar más algoritmos que AES --&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;!-- &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;property name=&quot;algorithm&quot;&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;value&amp;gt;${alfviral.algorithm}&amp;lt;/value&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/property&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; --&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;property name=&quot;password&quot;&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;value&amp;gt;${alfviral.password}&amp;lt;/value&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/property&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/bean&amp;gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;lt;/beans&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Fichero: model-context.xml&lt;br /&gt;&lt;span style=&quot;font-size:small;&quot;&gt;&amp;lt;?xml version='1.0' encoding='UTF-8'?&amp;gt;&lt;br /&gt;&amp;lt;!DOCTYPE beans PUBLIC '-//SPRING//DTD BEAN//EN' 'http://www.springframework.org/dtd/spring-beans.dtd'&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;beans&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;!-- Modelos --&amp;gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;bean id=&quot;alfcrypto.dictionaryBootstrap&quot; parent=&quot;dictionaryModelBootstrap&quot; depends-on=&quot;dictionaryBootstrap&quot;&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;property name=&quot;models&quot;&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;list&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;value&amp;gt;alfresco/module/alfcrypto/model/alfcryptoModel.xml&amp;lt;/value&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/list&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/property&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/bean&amp;gt;&amp;nbsp; &lt;br /&gt;&amp;lt;/beans&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-size:small;&quot;&gt;&lt;br /&gt;&lt;/span&gt;Fichero: webclient-context.xml&lt;br /&gt;&lt;span style=&quot;font-size:small;&quot;&gt;&amp;lt;?xml version='1.0' encoding='UTF-8'?&amp;gt;&lt;br /&gt;&amp;lt;!DOCTYPE beans PUBLIC '-//SPRING//DTD BEAN//EN' 'http://www.springframework.org/dtd/spring-beans.dtd'&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;beans&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;lt;bean id=&quot;alfcrypto.resourceBundle&quot; parent=&quot;actionResourceBundles&quot;&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;property name=&quot;resourceBundles&quot;&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;list&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;value&amp;gt;alfresco.module.alfcrypto.messages.alfcrypto&amp;lt;/value&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/list&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/property&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;lt;/bean&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;lt;bean id=&quot;alfcrypto.webclient.configBootstrap&quot; class=&quot;org.alfresco.web.config.WebClientConfigBootstrap&quot;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; init-method=&quot;init&quot;&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;property name=&quot;configs&quot;&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;list&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;value&amp;gt;classpath:alfresco/module/alfcrypto/ui/web-client-config-custom.xml&amp;lt;/value&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/list&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/property&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;lt;/bean&amp;gt;&lt;br /&gt;&amp;lt;/beans&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Fichero: web-client-config-custom.xml&lt;br /&gt;&lt;span style=&quot;font-size:small;&quot;&gt;&amp;lt;alfresco-config&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;lt;config evaluator=&quot;aspect-name&quot; condition=&quot;acr:ciphered&quot;&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;property-sheet&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;show-property name=&quot;acr:salt&quot; display-label-id=&quot;alfcrypto.label.salt&quot; read-only=&quot;true&quot;/&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;show-property name=&quot;acr:vector_init&quot; display-label-id=&quot;alfcrypto.label.vector_init&quot; read-only=&quot;true&quot;/&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/property-sheet&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;lt;/config&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;lt;config evaluator=&quot;aspect-name&quot; condition=&quot;acr:deciphered&quot;&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;lt;/config&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;lt;config evaluator=&quot;string-compare&quot; condition=&quot;Action Wizards&quot;&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;aspects&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;aspect name=&quot;acr:ciphered&quot; display-label-id=&quot;alfcrypto.label.ciphered&quot;/&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;aspect name=&quot;acr:deciphered&quot; display-label-id=&quot;alfcrypto.label.deciphered&quot;/&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/aspects&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;lt;/config&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;lt;/alfresco-config&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Fichero: alfcrypto.properties (messages)&lt;br /&gt;&lt;span style=&quot;font-size:small;&quot;&gt;alfcrypto.cipher.action.title=Cifrar&lt;br /&gt;alfcrypto.cipher.action.description=Cifrado del contenido&lt;br /&gt;&lt;br /&gt;alfcrypto.decipher.action.title=Descifrar&lt;br /&gt;alfcrypto.decipher.action.description=Descifrado del contenido&lt;br /&gt;&lt;br /&gt;alfcrypto.label.ciphered=Cifrado&lt;br /&gt;alfcrypto.label.deciphered=Descifrado&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Y por último construir el fichero de configuración:&lt;br /&gt;&lt;br /&gt;Fichero: alfcrypto.properties&lt;br /&gt;&lt;span style=&quot;font-size:small;&quot;&gt;# La elección de algoritmo (alfcrypto.algorithm) no está implementado todavía&lt;br /&gt;alfcrypto.algorithm=AES&lt;br /&gt;alfcrypto.password=estoesunaclavesecreta&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class=&quot;separator&quot; style=&quot;clear:both;text-align:center;&quot;&gt;&lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://2.bp.blogspot.com/-rbL2zfN-Is4/UMslHvDxv8I/AAAAAAAAAU4/XbFK0Ph0XKE/s1600/encryption.jpg&quot; style=&quot;clear:right;float:right;margin-bottom:1em;margin-left:1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;162&quot; src=&quot;http://2.bp.blogspot.com/-rbL2zfN-Is4/UMslHvDxv8I/AAAAAAAAAU4/XbFK0Ph0XKE/s200/encryption.jpg&quot; width=&quot;200&quot;/&gt;&lt;/a&gt;&lt;/div&gt;A partir de aquí podemos utilizar el sistema para cifrar y descifrar, para ello podemos usar reglas para que el contenido en una carpeta sea cifrado, crear un workflow para descifrar el contenido de los documentos cifrados, etc.&lt;br /&gt;&lt;br /&gt;Solo cifra el contenido, no las propiedades de los documentos.&lt;br /&gt;&lt;br /&gt;Más sobre este tema:&lt;br /&gt;&lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://es.wikipedia.org/wiki/Advanced_Encryption_Standard&quot;&gt;http://es.wikipedia.org/wiki/Advanced_Encryption_Standard&lt;/a&gt;&lt;br /&gt;&lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://en.wikipedia.org/wiki/Advanced_Encryption_Standard&quot;&gt;http://en.wikipedia.org/wiki/Advanced_Encryption_Standard &lt;/a&gt;&lt;br /&gt;&lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://wiki.alfresco.com/wiki/Data_Encryption&quot;&gt;http://wiki.alfresco.com/wiki/Data_Encryption&lt;/a&gt;&lt;br /&gt;&lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://addons.alfresco.com/addons/alfresco-encryption-module&quot;&gt;http://addons.alfresco.com/addons/alfresco-encryption-module&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;</description>
         <author>Fernando González</author>
         <guid isPermaLink="false">tag:blogger.com,1999:blog-13003183.post-1778446246309403096</guid>
         <pubDate>Sun, 16 Dec 2012 16:01:00 +0000</pubDate>
         <media:thumbnail height="72" url="http://2.bp.blogspot.com/-Ae4e1c5vXtU/UMslCQZ8a2I/AAAAAAAAAUw/x8Hjqy4WTv0/s72-c/aes-logo.png" width="72" xmlns:media="http://search.yahoo.com/mrss/"/>
      </item>
      <item>
         <title>Un long silence, mais une grande activité autour d’Amexio</title>
         <link>http://charles.torda.net/2012/12/15/un-long-silence-mais-une-grande-activite-autour-amexio/</link>
         <description>Le mois de décembre est traditionnellement le moment de faire le bilan de l&amp;#8217;année écoulée. Si l&amp;#8217;on se penche sur le cas de ce blog, on pourrait se dire que mon activité s&amp;#8217;est arrêtée en juin dernier et que j&amp;#8217;aurai &amp;#8230; &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://charles.torda.net/2012/12/15/un-long-silence-mais-une-grande-activite-autour-amexio/&quot;&gt;Continuer la lecture &lt;span class=&quot;meta-nav&quot;&gt;&amp;#8594;&lt;/span&gt;&lt;/a&gt;</description>
         <guid isPermaLink="false">http://charles.torda.net/?p=702</guid>
         <pubDate>Sat, 15 Dec 2012 13:22:15 +0000</pubDate>
      </item>
      <item>
         <title>[SHARE] Visualizar propiedad texto con editor de texto enriquecido</title>
         <link>http://crisinthecloud.blogspot.com/2012/12/share-visualizar-propiedad-texto-con.html</link>
         <description>Buenas a todos.&lt;br /&gt;&lt;br /&gt;Os voy a dejar un pequeño apunte que nunca esta demás.&lt;br /&gt;&lt;br /&gt;Si tenéis una propiedad en un modelo que sea de tipo texto (d:text), y queréis que al editar esa propiedad se muestre el editor &quot;enriquecido&quot; y aparezca como el campo description:&lt;br /&gt;&lt;br /&gt;&lt;div class=&quot;separator&quot; style=&quot;clear:both;text-align:center;&quot;&gt;&lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://3.bp.blogspot.com/-QtP_c7bHFg0/UMHveegHJpI/AAAAAAAAAMI/3XJNIY4esoE/s1600/tex_rich.jpg&quot; style=&quot;margin-left:1em;margin-right:1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;339&quot; src=&quot;http://3.bp.blogspot.com/-QtP_c7bHFg0/UMHveegHJpI/AAAAAAAAAMI/3XJNIY4esoE/s640/tex_rich.jpg&quot; width=&quot;640&quot;/&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;Lo que tenéis que hacer es ponerla así es por un lado en el modelo de datos cambiar el &lt;b&gt;d:text&lt;/b&gt; por d:mltext&lt;br /&gt;Y en segunda instancia, en vuestro share-config-custom.xml envolver el campo descripción de la siguiente forma:&lt;br /&gt;&lt;div class=&quot;separator&quot; style=&quot;clear:both;text-align:center;&quot;&gt;&lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://2.bp.blogspot.com/-QMy9m68Bzo0/UMHxnI4rLTI/AAAAAAAAAMQ/sFFBCwb3DkU/s1600/tex_rich.jpg&quot; style=&quot;margin-left:1em;margin-right:1em;&quot;&gt;&lt;br /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;div class=&quot;separator&quot; style=&quot;clear:both;text-align:center;&quot;&gt;&lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://3.bp.blogspot.com/-IPl0MUIfmIA/UMHxrFqbLoI/AAAAAAAAAMY/1yckOSDG_YM/s1600/campo_mlText.JPG&quot; style=&quot;margin-left:1em;margin-right:1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;142&quot; src=&quot;http://3.bp.blogspot.com/-IPl0MUIfmIA/UMHxrFqbLoI/AAAAAAAAAMY/1yckOSDG_YM/s640/campo_mlText.JPG&quot; width=&quot;640&quot;/&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;Y listo.&lt;br /&gt;&lt;br /&gt;En dos pasos podreis reutilizarlo =)&lt;br /&gt;&lt;br /&gt;Un saludo!!!&lt;br /&gt;&lt;span style=&quot;font-size:11.0pt;&quot;&gt;&lt;br /&gt;&lt;/span&gt;</description>
         <author>noreply@blogger.com (Cristina Martín)</author>
         <guid isPermaLink="false">tag:blogger.com,1999:blog-256223976738939642.post-6864767737968535038</guid>
         <pubDate>Fri, 07 Dec 2012 13:42:00 +0000</pubDate>
         <media:thumbnail height="72" url="http://3.bp.blogspot.com/-QtP_c7bHFg0/UMHveegHJpI/AAAAAAAAAMI/3XJNIY4esoE/s72-c/tex_rich.jpg" width="72" xmlns:media="http://search.yahoo.com/mrss/"/>
      </item>
      <item>
         <title>Media Viewers  – extending Alfresco viewer capability</title>
         <link>http://loftux.com/2012/11/30/media-viewers-extending-alfresco-viewer-capability/</link>
         <description>I&amp;#8217;ve been working together with Will Abson on Share Extras and the &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://code.google.com/p/share-extras/wiki/MediaViewers&quot;&gt;Media Viewers project&lt;/a&gt;. Will has previously introduced this addon in this &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://blogs.alfresco.com/wp/wabson/2012/07/04/media-previews-is-dead-long-live-media-viewers/&quot;&gt;post&lt;/a&gt;. So now I&amp;#8217;m going to give you the option for some hands on using the new Quick Share feature of Alfresco 4.2 (this is running 4.2.c from [...]</description>
         <guid isPermaLink="false">http://loftux.se/?p=952</guid>
         <pubDate>Fri, 30 Nov 2012 15:25:49 +0000</pubDate>
         <content:encoded><![CDATA[<p>I&#8217;ve been working together with Will Abson on Share Extras and the <a rel="nofollow" target="_blank" href="http://code.google.com/p/share-extras/wiki/MediaViewers">Media Viewers project</a>. Will has previously introduced this addon in this <a rel="nofollow" target="_blank" href="http://blogs.alfresco.com/wp/wabson/2012/07/04/media-previews-is-dead-long-live-media-viewers/">post</a>. So now I&#8217;m going to give you the option for some hands on using the new Quick Share feature of Alfresco 4.2 (this is running 4.2.c from HEAD). Thats the main focus of this post, I&#8217;m not going into details about how to do configuration, you can information about that on the Media Viewers web, and on Wills blog. What I refer to below as Viewers by different names are specific implementations included in the Media Viewers package.</p>
<p>I want to start with mentioning one of the simplest included viewers, Embed. It does exactly that, it takes the document content and loads it in an iframe. This means that the browser kicks in a plugin and just render. Lets start with an example for html. Normally you would get the html file converted to flash, but with this config it shown as is. </p>
<pre>
      &lt;condition mimeType=&quot;text/html&quot;&gt;
         &lt;plugin testPluginAvailability=&quot;false&quot;&gt;Embed&lt;/plugin&gt;
      &lt;/condition&gt;
</pre>
<p>&rarr; Try out <a rel="nofollow" target="_blank" href="https://loftux.com/demo/s/52eZ5bsZSG6hFziuxk6O4Q">HTML Embed Example</a>.<br />
The property testPluginAvailability=&#8221;false&#8221; means that the Embed Viewer skips tests if a plugin is available, we do not need this since html always can be rendered by the browser. And just change the condition in the config to mimetype=&#8221;text/plain&#8221; and you will have the same for plain text files (rendered in browser instead of transformed to flash).<br />
Note that Alfresco <a rel="nofollow" target="_blank" href="http://blogs.alfresco.com/wp/kevinr/2012/06/19/configuring-the-share-html-processing-blackwhite-list/">sanitize</a> some html tags for security reasons.</p>
<p>Now what if you have a document format, and have installed a special viewer? In this example I have used Visio, and installed a special free viewer downloaded from Microsofts website.<br />
&rarr; Try out <a rel="nofollow" target="_blank" href="https://loftux.com/demo/s/buFafOJKSDmrZWWwtBoOVA">Visio Example</a>.</p>
<pre>
      &lt;condition mimeType=&quot;application/vnd.visio&quot;&gt;
         &lt;plugin testPluginAvailability=&quot;true&quot; ieActiveX=&quot;VisioViewer.Viewer.1&quot;&gt;Embed&lt;/plugin&gt;
      &lt;/condition&gt;
</pre>
<p>Setting testPluginAvailability=&#8221;true&#8221; means that the Embed viewer will test if the mentioned viewer is actually available. The setting ieActiveX=&#8221;VisioViewer.Viewer.1&#8243; is what is tested for in Internet Explorer. That is the ActiveX string found in the Windows registry, you can add many AciveX string separated by comma, the Embed viewer will test each one of them for availability. For other browsers it tests if a suitable plugin is available using the mimetype.<br />
<a rel="nofollow" target="_blank" href="http://loftux.se/wp-content/uploads/2012/11/Visio-Embedded.png"><img src="http://loftux.se/wp-content/uploads/2012/11/Visio-Embedded-300x183.png" alt="" title="Visio Embedded" width="300" height="183" class="aligncenter size-medium wp-image-956"/></a><br />
If you are not on Windows, use IE, and do not have Visio Viewer installed, the viewer has probably used it fallback capability, and you will see it using the PdfJs viewer (and so on, see below).</p>
<p>Now for some PdfJs magic. In the Media Viewer we have included the pdf.js library and created what we have called the PdfJs Viewer that will render pdf documents and other documents that can be transformed to pdf directly in the browser.</p>
<pre>
      &lt;condition thumbnail=&quot;pdf&quot;&gt;
         &lt;plugin src=&quot;pdf&quot;&gt;PdfJs&lt;/plugin&gt;
         &lt;plugin src=&quot;pdf&quot; testPluginAvailability=&quot;true&quot;&gt;Embed&lt;/plugin&gt;
         &lt;plugin src=&quot;webpreview&quot; paging=&quot;true&quot;&gt;WebPreviewer&lt;/plugin&gt;
      &lt;/condition&gt;
      
      &lt;!-- PdfJS viewer for PDF --&gt;
      &lt;condition mimeType=&quot;application/pdf&quot;&gt;
         &lt;plugin&gt;PdfJs&lt;/plugin&gt;
         &lt;plugin testPluginAvailability=&quot;true&quot;&gt;Embed&lt;/plugin&gt;
         &lt;plugin src=&quot;webpreview&quot; paging=&quot;true&quot;&gt;WebPreviewer&lt;/plugin&gt;
      &lt;/condition&gt;
</pre>
<p>What this config does is that it first test if the PdfJs viewer can be used (minimum html5 capable browser). If not, it falls back to the Embed viewer mentioned above. It has built in IE tests for PDF Reader and Foxit reader, if you have others you need to specify them. Again for other browsers, Embed test is done using mimetype, so no need for configuration there.<br />
If the first two options have failed, it uses Alfresco default flash based viewer.<br />
I suggest you try to view these examples with different browsers, and if possible with and without a pdf reader installed, and you should see some of the fallback mechanisms.<br />
&rarr; Try out <a rel="nofollow" target="_blank" href="https://loftux.com/demo/s/yBD_rmuRSdSESx1s8Zv5tQ">Large document</a> 151 pages.<br />
&rarr; Try out <a rel="nofollow" target="_blank" href="https://loftux.com/demo/s/ML-eZIk-ROil00fOsmNDIA">Grafic intense document</a>. This one take some time to render using PdfJs. I got it to work on iPad as well, but takes a couple of minutes before rendering is complete.<br />
&rarr; Try out <a rel="nofollow" target="_blank" href="https://loftux.com/demo/s/jyknOhAvQnyaNlW639Drug">Slide Presentation</a>. For this one, try to zoom out, and you will see how nicely the slides flow (thanks to Will Abson css magic). That is, you can only see this if you browser supports PdfJs.<br />
<a rel="nofollow" target="_blank" href="http://loftux.se/wp-content/uploads/2012/11/Alfresco-&#xbb;-Formatting-example.pdf.png"><img src="http://loftux.se/wp-content/uploads/2012/11/Alfresco-&#xbb;-Formatting-example.pdf-300x240.png" alt="" title="Alfresco &#xbb; Formatting example.pdf" width="300" height="240" class="aligncenter size-medium wp-image-959"/></a><br />
There are many more kinds of viewers included in the Media Viewers project. To use the features shown here, you need to grab the source code and compile yourself for now.<br />
And if you forgot to test the Search capability with syntax highlighting in the PdfJs viewer, now its time to revisit one of the links above with a html5 capable browser.</p>]]></content:encoded>
      </item>
      <item>
         <title>Open Source event in Milan with Sourcesense, SMC and BNova</title>
         <link>http://www.open4dev.com/journal/2012/11/29/open-source-event-in-milan-with-sourcesense-smc-and-bnova.html</link>
         <description>&lt;p&gt;&lt;span class=&quot;full-image-float-right ssNonEditable&quot;&gt;&lt;span&gt;&lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://www.open4dev.com/journal/2012/11/29/open-source-event-in-milan-with-sourcesense-smc-and-bnova.html&quot;&gt;&lt;img src=&quot;http://www.open4dev.com/storage/img/events/Doria_Sala_Archi_00_small.png?__SQUARESPACE_CACHEVERSION=1354183082720&quot; alt=&quot;&quot;/&gt;&lt;/a&gt;&lt;/span&gt;&lt;/span&gt;You are invited to the event organized by &lt;strong&gt;Sourcesense&lt;/strong&gt;, &lt;strong&gt;SMC&lt;/strong&gt; and &lt;strong&gt;BNova&lt;/strong&gt; about Enterprise Open Source for solutions dedicated to Enterprise Content Management, portals and Business Intelligence.&lt;/p&gt;</description>
         <guid isPermaLink="false">288041:2935920:31446847</guid>
         <pubDate>Thu, 29 Nov 2012 09:36:21 +0000</pubDate>
      </item>
      <item>
         <title>TypeScript for Alfresco and CMIS &amp;#8211; Alfresco DevCon 2012 lightning talk slides and sample app</title>
         <link>http://integratedsemantics.org/2012/11/25/typescript-for-alfresco-and-cmis-alfresco-devcon-2012-lightning-talk-slides/</link>
         <description>&lt;p&gt;I also uploaded my slides to &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://www.slideshare.net/stevereiner/typescript-for-alfresco-and-cmis-alfresco-devcon-2012-san-jose&quot; title=&quot;TypeScript for Alfresco and CMIS on SlideShare&quot;&gt;SlideShare&lt;/a&gt; from the second lightning talk presentation I made at Alfresco &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://devcon.alfresco.com/&quot; title=&quot;Alfresco DevCon 2012&quot;&gt;DevCon&lt;/a&gt; 2012 San Jose.&lt;/p&gt;
&lt;p&gt; &lt;/p&gt; 
&lt;p style=&quot;margin-bottom:5px;&quot;&gt; &lt;strong&gt; &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://www.slideshare.net/stevereiner/typescript-for-alfresco-and-cmis-alfresco-devcon-2012-san-jose&quot; title=&quot;TypeScript for Alfresco and CMIS - Alfresco DevCon 2012 San Jose&quot;&gt;TypeScript for Alfresco and CMIS &amp;#8211; Alfresco DevCon 2012 San Jose&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;p style=&quot;margin-bottom:5px;&quot;&gt;This briefly covered some languages that can be translated to JavaScript (&lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://www.typescriptlang.org/&quot; title=&quot;TypeScript web site&quot;&gt;TypeScript&lt;/a&gt;, Dart, ActionScript, CoffeeScript) and used for developing HTML5/JS  desktop and mobile web applications. TypeScript seems to be the best choice. The IDEs and editors currently supporting TypeScript was then listed.&lt;/p&gt;
&lt;p style=&quot;margin-bottom:5px;&quot;&gt;Finally, my plans to support various Alfresco and CMIS things with &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://www.typescriptlang.org/&quot; title=&quot;TypeScript web site&quot;&gt;TypeScript&lt;/a&gt; was covered: port CMIS Spaces and FlexSpaces from Flex/AS3 to TypeScript, TypeScript wrappers for AlfJS and CMIS.JS, additional Alfresco and CMIS TypeScript libraries, sample showing a Share dashlet written in TypeScript, and a TypeScript definition file for intellisense / compile time type checking for Alfresco WebScripts.&lt;/p&gt;
&lt;p style=&quot;margin-bottom:5px;&quot;&gt;The small TypeScript app (start on a repo browser) I started with definition wrappers for &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;https://github.com/alfrescolabs/alfjs&quot; title=&quot;AlfJS&quot;&gt;AlfJS&lt;/a&gt;, YUI3, with a dummy tree (no real data yet) and folder table (that displays data from Alfresco with AlfJS) is included here &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://integratedsemantics.org/wp-content/uploads/2012/11/alf-yui-typescript-app1.zip&quot; title=&quot;alf-yui-typescript-app1.zip&quot;&gt;alf-yui-typescript-app1.zip&lt;/a&gt; (will add to github later). The definition for YUI3 comes from what this &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;https://gist.github.com/3845543&quot; title=&quot;YUI3 TypeScript gist&quot;&gt;gist&lt;/a&gt; had with adds to get it to compile in Visual Studio 2012 with the TypeScript plugin.&lt;/p&gt;</description>
         <author>admin</author>
         <guid isPermaLink="false">http://integratedsemantics.org/2012/11/25/typescript-for-alfresco-and-cmis-alfresco-devcon-2012-lightning-talk-slides/</guid>
         <pubDate>Mon, 26 Nov 2012 06:30:53 +0000</pubDate>
      </item>
      <item>
         <title>Apache Stanbol Version of OpenCalais Integration &amp;#8211; Alfresco DevCon 2012 lightning talk slides</title>
         <link>http://integratedsemantics.org/2012/11/25/apache-stanbol-version-of-opencalais-integration-alfresco-devcon-2012-lightning-talk-slides/</link>
         <description>&lt;p&gt;I uploaded my slides to &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://www.slideshare.net/stevereiner/dev-con-stanbol-version-of-opencalais-integration&quot; title=&quot;Apache Stanbol Version of OpenCalais Integration on SlideShare&quot;&gt;SlideShare&lt;/a&gt; from the first lightning talk presentation I made at Alfresco &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://devcon.alfresco.com/&quot; title=&quot;Alfresco DevCon 2012&quot;&gt;DevCon&lt;/a&gt; 2012 San Jose:&lt;/p&gt;
&lt;p&gt; &lt;/p&gt; 
&lt;p style=&quot;margin-bottom:5px;&quot;&gt; &lt;strong&gt; &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://www.slideshare.net/stevereiner/dev-con-stanbol-version-of-opencalais-integration&quot; title=&quot;An Alfresco Apache Stanbol Integration (port of OpenCalais integration) - Alfresco DevCon 2012 San Jose&quot;&gt;An Alfresco Apache Stanbol Integration (port of OpenCalais integration) &amp;#8211; Alfresco DevCon 2012 San Jose&lt;/a&gt; &lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;It covers the port of the OpenCalais Integration and its Share UI extension to work with Apache Stanbol. These integrations support auto-tagging, semantic tag clouds, and semantic geo-tagged maps. Both integrations are open source and available on &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://code.google.com/p/semantics4alfresco/&quot; title=&quot;Semantics4Alfresco Google Code&quot;&gt;Google Code&lt;/a&gt; .&lt;/p&gt;</description>
         <author>admin</author>
         <guid isPermaLink="false">http://integratedsemantics.org/2012/11/25/apache-stanbol-version-of-opencalais-integration-alfresco-devcon-2012-lightning-talk-slides/</guid>
         <pubDate>Mon, 26 Nov 2012 06:30:38 +0000</pubDate>
      </item>
      <item>
         <title>Is Google Drive becoming a Threat for Enterprise Content Management ?</title>
         <link>http://www.contentreich.de/is-google-drive-becoming-a-threat-for-enterprise-content-management</link>
         <description>&lt;p&gt;&lt;img width=&quot;150&quot; height=&quot;150&quot; src=&quot;http://www.contentreich.de/wp-content/uploads/2012/11/5th-element-evil-planet-150x150.jpg&quot; class=&quot;attachment-thumbnail wp-post-image&quot; alt=&quot;Is Google Drive becoming a Threat for Enterprise Content Management ?&quot; title=&quot;Is Google Drive becoming a Threat for Enterprise Content Management ?&quot; style=&quot;float:right;&quot;/&gt;Google Drive will never be threat to ECM because of the lack of trust in Google and the cloud in general. This seems to be the killer argument and common sense. On top of that, it is missing frequently required features. Are these old arguments actually reasonable today ? &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://www.contentreich.de/is-google-drive-becoming-a-threat-for-enterprise-content-management&quot;&gt;Weiterlesen &lt;span class=&quot;meta-nav&quot;&gt;&amp;#8594;&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;The post &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://www.contentreich.de/is-google-drive-becoming-a-threat-for-enterprise-content-management&quot;&gt;Is Google Drive becoming a Threat for Enterprise Content Management ?&lt;/a&gt; appeared first on &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://www.contentreich.de&quot;&gt;CONTENTREICH&lt;/a&gt;.&lt;/p&gt;</description>
         <guid isPermaLink="false">http://www.contentreich.de/?p=2815</guid>
         <pubDate>Tue, 20 Nov 2012 09:10:18 +0000</pubDate>
         <content:encoded><![CDATA[<div class="alignleft labeledImage "><img class="alignleft size-full wp-image-2827" title="Evil Planet from 5th Element" src="http://www.contentreich.de/wp-content/uploads/2012/11/5th-element-evil-planet.jpg" alt="Picture of Evil Planet expanding" width="275" height="275"/></div>
<p>The strike of the enterprise toys is not over yet and the ones aiming at basic file sharing (such as box or dropbox) have already invaded territory of traditional enterprise content management. The battle is being fought right now. This post is about a new contender &#8211; Google.</p>
<p>Is it becoming a threat for enterprise content management ?</p>
<p>You may say : &#8220;No way ! Are you crazy ? We neither trust Google nor do we trust the cloud in general. We will never ever use Google Drive or something even remotely similar for enterprise content management ! Besides, we can&#8217;t do serious enterprise content management with this new toy anyways.&#8221;</p>
<p><strong>Really ?</strong></p>
<p>I guess pretty much everybody I have been talking to in this regard reacts somewhat like this &#8211; and even more so when people are from Germany. It reminds me a bit of the situation with the enterprise toys where this kind of &#8220;killer counterarguments&#8221; was raised. But are they actually reasonable ?</p>
<p>When referring to traditional enterprise content management, what I have in mind are highly transactional process driven on-premise systems in general and Alfresco in particular since I know this one best. With Alfresco in the Cloud and Alfresco One, Alfresco has expanded beyond company firewalls so it is no longer strictly traditional in this sense, but it is still frequently used in this way.</p>
<p>This November, I have been attending the Alfresco Devcon in Berlin and Devoxx in Antwerp one week later. In Antwerp, I chose to join the Google Drive SDK session by Nicolas Garnier. All of a sudden it felt like thunderstruck when I realized the Google Drive product actually has quite some things in common with the Alfresco Platform. In areas such as editing, Google Drive even reaches way beyond. For now I would like to focus on what these systems have in common or where they are tending to converge.</p>
<h2>Content Model and -Services: The Basic</h2>
<p>First I did a quick comparison of the very basic stuff &#8211; CMIS seemed a good start. It looks like Google Drive already has pretty much everything a CMIS implementation is required to have. The main difference today being that the Google Drive API is RESTful JSON instead of SOAP / Atom Pub as demanded by the Spec. In the Q&#038;A part of the session, I asked Nicolas whether Google is targeting the enterprise and if they are planing to offer a full CMIS implementation. The answer to the first question was a bit vague. But the second answer was amazing. Nicolas did not know what CMIS was, so I gave him a brief explanation. Even better: Right after the session, I found CMIS for Google Drive is already there (beta though) and called Cloudoku.</p>
<h2>Cloud and Mobile: The Buzz</h2>
<p>Clound and mobile, that&#8217;s where the Buzz is. You either take these into account or your product may be irrelevant very soon. Alfresco has realized this and they are making serious investments. Have a look at Alfresco in the Cloud, their mobile solution or the Alfresco One product aiming to cover the entire enterprise content lifecycle. Now how does Google compare ?</p>
<p>Regarding mobile, there is a Drive app providing basic content creation and editing capabilities. Not completely equivalent to the Alfresco App but remarkably similar. Alfresco introduced a mobile SDK at the Devcon. Google has a SDK targeting mobile as well.</p>
<p>And the Cloud ? Google Drive (formerly Docs) has always been cloud based. Alfresco in the Cloud has been released this year. Google offers OAuth2 based access for third party applications. If I got it right, Alfresco does the same thing now. The Cloud API has been released in October along with the mobile SDK. Google does not distinguish SDKs between mobile and cloud as Alfresco does, but it is available for various languages and platforms. On top of that, both companies are coming up with desktop sync applications &#8211; competition for the &#8220;traditional&#8221; file sharing enterprise toys.</p>
<p>In addition to a the service based SDK, both platforms provide a Javascript API to build custom user interfaces. Alfresco does not yet allow you to deploy this kind of code in their cloud environment.</p>
<h2>Transactions, Processes and Control: The Nasty</h2>
<p>Traditional enterprise content management usually is very transactional and process (BPM) driven. Naturally, companies like the idea of having total control of their assets. Unfortunately, these requirements tend to pose tremendous technical challenges. Things are already complicated when you are dealing with shared resources (memory, storage and CPU) within one process, but they get orders of magnitude more complex when this is not the case. Alfresco aims to address these requirements everywhere at once &#8211; on-premise, in the cloud and mobile with their Alfresco One product. I cannot tell how well it works in practice.</p>
<p>The simple process scoped solutions already have issues. Introducing custom <del datetime="2012-11-20T08:57:38+00:00">bugs</del> code always comes at the risk of introducing failure &#8211; which in worst case brings the whole system down. This may not be a problem on-premise, but it is a different story in the cloud where functionality is usually backed by multi-tenancy aware software running on shared resources. Hence, SaaS providers may not like the idea of deploying your code.</p>
<p>Alfresco is clearly ahead in terms of the nasty as Google has nothing comparable so far and does not even care yet. But what is holding them back offering an appliance just as they did in search.</p>
<h2>Conclusions and Predictions</h2>
<ul>
<li>I think Google will give the enterprise more attention in the near future</li>
<li>The biggest roadblock for Google and the cloud in general are based on trust and our perception of security. I am sure Google is aware of that combating it. I am not promoting to just blindly trust the cloud. But I think it is about time to rethink security in general. Do our old policies still hold in 2012 ?</li>
<li>Alfresco is still quite a bit ahead in terms of functionality, but Google has a vast amount of cloud applications for a wide variety of domains. I am sure there is quite a bit of symbiosis (with regards to content) waiting to be found and released.</li>
<li>Google Drive may evolve to &#8220;Alfresco Community in the Cloud&#8221; ;)</li>
</ul>
<p>These are just my 0.2c. Feel free to let me know what you think.</p>
<h2>References</h2>
<ul>
<li><a rel="nofollow" target="_blank" href="http://techcrunch.com/2012/07/01/rise-of-the-enterprise-toys/">Rise of The Enterprise Toys</a></li>
<li><a rel="nofollow" target="_blank" href="http://www.realstorygroup.com/Blog/2462-Why-traditional-ECM-tools-like-Documentum-FileNet-SharePoint-and-Alfresco-are-not-suited-for-cloud-file-sharing">Why traditional ECM tools like Documentum, FileNet, SharePoint, and Alfresco are not suited for cloud file sharing</a></li>
<li><a rel="nofollow" target="_blank" href="http://www.cloudoku.com/faq.html">Cloudoku (CMIS for Google Drive)</a></li>
<li><a rel="nofollow" target="_blank" href="http://blogs.alfresco.com/wp/cloud-connected-content-is-different/">How is Cloud Connected Content Different? (Alfresco One)</a></li>
<li><a rel="nofollow" target="_blank" href="http://devoxx.com/display/DV12/Google+Drive+SDK">Google Drive SDK Session @ Devoxx 2012 (Nicolas Garnier)</a></li>
<li><a rel="nofollow" target="_blank" href="http://googledevelopers.blogspot.de/2012/04/introducing-google-drive-and-google.html">Introducing Google Drive and the Google Drive SDK</a></li>
<li><a rel="nofollow" target="_blank" href="http://en.wikipedia.org/wiki/Content_Management_Interoperability_Services">CMIS (Wikipedia)</a></li>
<li><a rel="nofollow" target="_blank" href="http://docs.alfresco.com/4.0/index.jsp?topic=%2Fcom.alfresco.enterprise.doc%2Fconcepts%2Fserv-repo-about.html">Alfresco Content Services</a></li>
<li><a rel="nofollow" target="_blank" href="https://developers.google.com/apps-script/service_ui">Google UI Service API</a></li>
<li><a rel="nofollow" target="_blank" href="http://sharextras.org/jsdoc/share/community-4.2.b/">Share Client-side API / Community 4.2.b</a></li>
</ul>
<div class="social-ring">
<div class="social-ring-button"><a rel="nofollow" target="_blank" href="http://twitter.com/share" lang="en" class="sr-twitter-button twitter-share-button"></a></div>
<div class="social-ring-button"><div class="g-plusone"></div></div>
<div class="social-ring-button"></div> 
<div class="social-ring-button"></div> 
</div><div style="clear:both;">&nbsp;</div>
<p>The post <a rel="nofollow" target="_blank" href="http://www.contentreich.de/is-google-drive-becoming-a-threat-for-enterprise-content-management">Is Google Drive becoming a Threat for Enterprise Content Management ?</a> appeared first on <a rel="nofollow" target="_blank" href="http://www.contentreich.de">CONTENTREICH</a>.</p>]]></content:encoded>
      </item>
      <item>
         <title>GateIn Cookbook has been published</title>
         <link>http://www.open4dev.com/journal/2012/11/12/gatein-cookbook-has-been-published.html</link>
         <description>&lt;p&gt;&lt;span class=&quot;thumbnail-image-float-right ssNonEditable&quot;&gt;&lt;span&gt;&lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://www.open4dev.com/journal/2012/11/12/gatein-cookbook-has-been-published.html&quot;&gt;&lt;img src=&quot;http://www.open4dev.com/storage/thumbnails/2935919-20840967-thumbnail.jpg?__SQUARESPACE_CACHEVERSION=1351858436272&quot; alt=&quot;GateIn Cookbook cover&quot;/&gt;&lt;/a&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;I'm proud to announce that my book titled &lt;strong&gt;GateIn Cookbook&lt;/strong&gt; has been published the last week by Packt Publishing.&lt;/p&gt;
&lt;p&gt;This is my second contribution as an author at Packt and I wrote this book together with &lt;strong&gt;Luca Stancapiano&lt;/strong&gt; (Sourcesense) and &lt;strong&gt;Ken Finnigan&lt;/strong&gt; (JBoss / Red Hat).&lt;/p&gt;</description>
         <guid isPermaLink="false">288041:2935920:30604744</guid>
         <pubDate>Mon, 12 Nov 2012 18:42:33 +0000</pubDate>
      </item>
      <item>
         <title>Named as an Alfresco Community Star</title>
         <link>http://www.open4dev.com/journal/2012/11/8/named-as-an-alfresco-community-star.html</link>
         <description>&lt;p&gt;&lt;span class=&quot;thumbnail-image-float-right ssNonEditable&quot;&gt;&lt;span&gt;&lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://www.open4dev.com/journal/2012/11/8/named-as-an-alfresco-community-star.html&quot;&gt;&lt;img src=&quot;http://www.open4dev.com/storage/thumbnails/3820899-16799622-thumbnail.jpg?__SQUARESPACE_CACHEVERSION=1352412444171&quot; alt=&quot;Medals of contribution&quot;/&gt;&lt;/a&gt;&lt;/span&gt;&lt;span class=&quot;thumbnail-caption&quot; style=&quot;width:152px;&quot;&gt;Medals of contribution: running the new course Alfresco Through Portals and talking at the Lightning Talks session&lt;/span&gt;&lt;/span&gt;First I have to say that it was great to see all of you guys behind the Alfresco Community during the Alfresco DevCon 2012 in Berlin.&lt;/p&gt;</description>
         <guid isPermaLink="false">288041:2935920:30361039</guid>
         <pubDate>Thu, 08 Nov 2012 21:42:59 +0000</pubDate>
      </item>
      <item>
         <title>Maven Alfresco SDK 1.0</title>
         <link>http://bpeters.tumblr.com/post/35067681659</link>
         <description>Maven Alfresco SDK 1.0: Today Alfresco released the Maven Alfresco SDK 1.0. The current version...</description>
         <guid isPermaLink="false">http://bpeters.tumblr.com/post/35067681659</guid>
         <pubDate>Mon, 05 Nov 2012 18:59:34 +0000</pubDate>
      </item>
      <item>
         <title>Manual Manager for Alfresco</title>
         <link>http://loftux.com/2012/11/04/manual-manager-for-alfresco/</link>
         <description>Some time back I was asked by a client if I could help them update their Alfresco Manual. It turned out to be a long Word document, nicely done with lots of screenshots. The problem here is that it&amp;#8217;s a long document (30+ pages long), and if you need to just edit a small section, [...]</description>
         <guid isPermaLink="false">http://loftux.se/?p=939</guid>
         <pubDate>Sun, 04 Nov 2012 19:38:55 +0000</pubDate>
         <content:encoded><![CDATA[<p>Some time back I was asked by a client if I could help them update their Alfresco Manual. It turned out to be a long Word document, nicely done with lots of screenshots. The problem here is that it&#8217;s a long document (30+ pages long), and if you need to just edit a small section, you need to check out and edit the whole thing. For end users that need quick help, that long document makes it hard to find the information within the document.<br />
So I thought it must be a better way to do this, more like the <a rel="nofollow" target="_blank" href="http://docs.alfresco.com/4.2/index.jsp">Alfresco Help Documentation</a>, but with the content managed and displayed within Alfresco itself.<br />
Thus I created the Manual Manager add-on.<br />
<a rel="nofollow" target="_blank" href="http://loftux.se/wp-content/uploads/2012/11/Manual-Manager-overview.png"><img src="http://loftux.se/wp-content/uploads/2012/11/Manual-Manager-overview-300x179.png" alt="" title="Manual Manager overview" width="300" height="179" class="aligncenter size-medium wp-image-943"/></a><br />
It is a content creation and editing tool using Markdown syntax, with content displayed and navigated using a tree-view control.<br />
Features include</p>
<ul>
<li>Real-time display of formatting when editing</li>
<li>Sortable topics</li>
<li>Movie, Copy and Delete topics including subtopics</li>
<li>Insert standard Alfresco images and icons</li>
<li>Upload custom images via dialog box or drag and drop</li>
<li>Insert custom image size, transformed using Alfresco thumbnails</li>
<li>Custom templates for new content, repository default stored in Data Dictionary or Site specific</li>
<li>Manage versions, quickly view what previous versions looked like.</li>
<li>Print an individual topic or include all subtopics, each topic includes edit metadata in footer</li>
<li>Page content is loaded using ajax, then formatted client side so page loading is superfast</li>
</ul>
<p>Of course this need not only to be used for Software manuals, it can be use for any type of documentation. One use case could be for project minutes, using the template feature to add a default minute template.</p>
<p>I will release this add-on soon. It will be a paid-for add-on, I have yet to decide on how.<br />
Meanwhile, I have created a video where you can see how the Manual Manager works.</p>
<p><a rel="nofollow" target="_blank" href="http://www.youtube.com/watch?v=iTn-lJozYkM">http://www.youtube.com/watch?v=iTn-lJozYkM</a></p>]]></content:encoded>
      </item>
      <item>
         <title>My involvement at Alfresco DevCon 2012</title>
         <link>http://www.open4dev.com/journal/2012/11/2/my-involvement-at-alfresco-devcon-2012.html</link>
         <description>&lt;p&gt;&lt;span class=&quot;full-image-float-right ssNonEditable&quot;&gt;&lt;span&gt;&lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://www.open4dev.com/journal/2012/11/2/my-involvement-at-alfresco-devcon-2012.html&quot;&gt;&lt;img src=&quot;http://www.open4dev.com/storage/thumbnails/2935919-19707367-thumbnail.jpg?__SQUARESPACE_CACHEVERSION=1351876404564&quot; alt=&quot;&quot;/&gt;&lt;/a&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;This year I will participate at the Alfresco DevCon 2012 in Berlin in different ways, trying to contribute in this event as I usually do for the Alfresco community.&lt;/p&gt;</description>
         <guid isPermaLink="false">288041:2935920:30287785</guid>
         <pubDate>Fri, 02 Nov 2012 16:44:32 +0000</pubDate>
      </item>
      <item>
         <title>Disabling inherited permissions on a Site causes the SiteManager to loose rights</title>
         <link>http://blog.mitco-solutions.com/post/34556458835</link>
         <description>&lt;p&gt;It&amp;#8217;s been a while since I last posted something, that didn&amp;#8217;t mean I wasn&amp;#8217;t into Alfresco on the contrary I was too busy with Alfresco stuff to post ;).&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;So what&amp;#8217;s this issue all about??&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;The issue has to do with the permissions based on roles(SiteConsumer, SiteContributer,SiteCollaborator and SiteManager) handled and configured within Sites.&lt;/p&gt;
&lt;p&gt;Within an Enterprise organisation it&amp;#8217;s not sufficient to group everyone within these roles. Most likely you&amp;#8217;ll have departments with their own access rights. E.g. there will be a group Finance department with a role SiteContributer.&lt;/p&gt;
&lt;p&gt;So before you&amp;#8217;ll know it, the repository view will be used to set permissions. This is were the issue starts.&lt;/p&gt;
&lt;p&gt;The following image is the default Site Manage Permissions view:&lt;/p&gt;
&lt;p&gt;&lt;img alt=&quot;Site Roles Permissions&quot; height=&quot;420&quot; src=&quot;http://mitco-solutions.com/blog/images/Roles%20Permissions.PNG&quot; width=&quot;500&quot;/&gt;&lt;/p&gt;
&lt;p&gt;But we want to add the &amp;#8220;Finance Department&amp;#8221; group, so we need the Repository view &amp;#8220;Manage Permissions&amp;#8221;:&lt;/p&gt;
&lt;p&gt;&lt;img alt=&quot;Repository Manage Permissions&quot; height=&quot;370&quot; src=&quot;http://mitco-solutions.com/blog/images/Normal%20Permissions.PNG&quot; width=&quot;500&quot;/&gt;&lt;/p&gt;
&lt;p&gt;So the normal way setting a permission will be the following:&lt;/p&gt;
&lt;ol&gt;&lt;li&gt;Click on &amp;#8220;Inherit Permissions&amp;#8221; button to disable the current active permissions&lt;/li&gt;
&lt;li&gt;Click on Add User/Group to add our &amp;#8220;Finance Department&amp;#8221;&lt;/li&gt;
&lt;li&gt;Save&lt;/li&gt;
&lt;/ol&gt;&lt;p&gt;Which will result in the following:&lt;/p&gt;
&lt;p&gt;&lt;img alt=&quot;Issue SiteManager is gone&quot; height=&quot;170&quot; src=&quot;http://mitco-solutions.com/blog/images/Issue.PNG&quot; width=&quot;500&quot;/&gt;&lt;/p&gt;
&lt;p&gt;Outside a site this is a proper permission-set but within a site this disables the Site Manager to have admin rights. So the Site Manager can&amp;#8217;t even fix the issue he/she has noticed afterwards :(.&lt;/p&gt;
&lt;p&gt;So there are 3 solutions for this:&lt;/p&gt;
&lt;ol&gt;&lt;li&gt;Use the default Site &amp;#8220;Manage Permissions&amp;#8221; View to first disable all the roles to have access. This will disable the &amp;#8220;Inherit Permissions&amp;#8221; and will add the SiteManager permission to the folder/content.&lt;/li&gt;
&lt;li&gt;Write a Java Behaviour which will run on NodeServicePolicies.OnUpdatePropertiesPolicy and will add the SiteManager permission after inheritsPermissions() has been set to false.&lt;/li&gt;
&lt;li&gt;Or like what I did, because I can&amp;#8217;t shutdown production for a while, is write a JavaScript which fires from the JavaScript-Console within Share&lt;/li&gt;
&lt;/ol&gt;&lt;p&gt;This is the piece of code I use after an issue is submitted:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;var site = space;&lt;br/&gt;&lt;br/&gt;recurse(site.childByNamePath(&amp;#8220;documentLibrary&amp;#8221;), function(node) {&lt;br/&gt;    if (!node.inheritsPermissions()) {&lt;br/&gt;        logger.log(&amp;#8220;BEFORE: &amp;#8221; + node.getPermissions());&lt;br/&gt;        node.removePermission(&amp;#8220;SiteManager&amp;#8221;, &amp;#8220;GROUP_site_&amp;#8221; + site.name + &amp;#8220;_SiteManager&amp;#8221;);&lt;br/&gt;        node.removePermission(&amp;#8220;SiteManager&amp;#8221;, &amp;#8220;GROUP_&amp;#8221; + site.name + &amp;#8220;_SiteManager&amp;#8221;);&lt;br/&gt;        node.setPermission(&amp;#8220;SiteManager&amp;#8221;, &amp;#8220;GROUP_site_&amp;#8221; + site.name + &amp;#8220;_SiteManager&amp;#8221;);&lt;br/&gt;        logger.log(&amp;#8220;AFTER: &amp;#8221; + node.getPermissions());&lt;br/&gt;    }&lt;br/&gt;});&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;I&amp;#8217;ve instructed all the Site Admin&amp;#8217;s to follow step 1 before changing permissions, but like always there are cases where users don&amp;#8217;t follow guide lines.&lt;/p&gt;

&lt;p&gt;&amp;#8212;- UPDATE &amp;#8212;-&lt;/p&gt;
&lt;p&gt;Alfresco opened a JIRA ticket: &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;https://issues.alfresco.com/jira/browse/ALF-16522&quot; title=&quot;JIRA&quot;&gt;&lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;https://issues.alfresco.com/jira/browse/ALF-16522&quot;&gt;https://issues.alfresco.com/jira/browse/ALF-16522&lt;/a&gt; &lt;/a&gt;&lt;/p&gt;</description>
         <guid isPermaLink="false">http://blog.mitco-solutions.com/post/34556458835</guid>
         <pubDate>Mon, 29 Oct 2012 09:47:00 +0000</pubDate>
      </item>
      <item>
         <title>Actualización de Alfviral 1.2.1</title>
         <link>http://www.fegor.com/2012/10/actualizacion-de-alfviral-121.html</link>
         <description>&lt;div class=&quot;separator&quot; style=&quot;clear:both;text-align:center;&quot;&gt;&lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://2.bp.blogspot.com/-CXZ9XpHoD_0/UImYQ6oR7YI/AAAAAAAAAUU/JVosGAWUp84/s1600/Captura+de+pantalla+2012-10-25+a+la(s)+21.47.01.png&quot; style=&quot;clear:left;float:left;margin-bottom:1em;margin-right:1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;http://2.bp.blogspot.com/-CXZ9XpHoD_0/UImYQ6oR7YI/AAAAAAAAAUU/JVosGAWUp84/s1600/Captura+de+pantalla+2012-10-25+a+la(s)+21.47.01.png&quot;/&gt;&lt;/a&gt;&lt;/div&gt;Debido a un &quot;desliz&quot; en mi código con la versión 1.2.0 se me olvidó declarar el servicio NodeService para usarlo en los modos COMMAND y INSTREAM por lo que he arreglado esto y algún que otro retoque más y he subido la versión 1.2.1 que os recomiendo que instaléis en lugar de la versión anterior.&lt;br /&gt;&lt;br /&gt;&lt;div class=&quot;separator&quot; style=&quot;clear:both;text-align:center;&quot;&gt;&lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://4.bp.blogspot.com/-xqELDd2w69M/UImYbgbHf2I/AAAAAAAAAUc/rSmpj7gR_as/s1600/Captura+de+pantalla+2012-10-25+a+la(s)+21.46.35.png&quot; style=&quot;clear:right;float:right;margin-bottom:1em;margin-left:1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;135&quot; src=&quot;http://4.bp.blogspot.com/-xqELDd2w69M/UImYbgbHf2I/AAAAAAAAAUc/rSmpj7gR_as/s320/Captura+de+pantalla+2012-10-25+a+la(s)+21.46.35.png&quot; width=&quot;320&quot;/&gt;&lt;/a&gt;&lt;/div&gt;Agradezco a Niccolò Pasquetto su aportación y aviso.&lt;br /&gt;&lt;br /&gt;La nueva versión se puede descargar directamente desde:&lt;br /&gt;&lt;br /&gt;&lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;https://alfviral.googlecode.com/files/fegorsoft-alfviral-1.2.1.zip&quot;&gt;https://alfviral.googlecode.com/files/fegorsoft-alfviral-1.2.1.zip&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;</description>
         <author>Fernando González</author>
         <guid isPermaLink="false">tag:blogger.com,1999:blog-13003183.post-7742682225498660831</guid>
         <pubDate>Thu, 25 Oct 2012 21:56:00 +0000</pubDate>
         <media:thumbnail height="72" url="http://2.bp.blogspot.com/-CXZ9XpHoD_0/UImYQ6oR7YI/AAAAAAAAAUU/JVosGAWUp84/s72-c/Captura+de+pantalla+2012-10-25+a+la(s)+21.47.01.png" width="72" xmlns:media="http://search.yahoo.com/mrss/"/>
      </item>
      <item>
         <title>Contentreich Alfresco add-on – Site Gruppen</title>
         <link>http://www.contentreich.de/contentreich-alfresco-add-on-site-gruppen</link>
         <description>&lt;p&gt;&lt;img width=&quot;150&quot; height=&quot;150&quot; src=&quot;http://www.contentreich.de/wp-content/uploads/2012/10/Contentreich-add-on-Site-Gruppen-150x150.jpg&quot; class=&quot;attachment-thumbnail wp-post-image&quot; alt=&quot;Contentreich Alfresco add-on &amp;#8211; Site Gruppen&quot; title=&quot;Contentreich Alfresco add-on &amp;#8211; Site Gruppen&quot; style=&quot;float:right;&quot;/&gt;Eine Alfresco Share Site bietet von Haus aus ein Sicherheits-Modell basierend auf vier Gruppen denen jeweils eine Menge von Rechten (Rolle) zugeordnet ist : Manager, Mitwirkender, Mitarbeiter und Konsument. Benutzer und (globale) Gruppen lassen sich von Managern diesen vier Gruppen zuweisen. Das Contentreich Alfresco add-on Site Gruppen erlaubt Site Managern alternativ (site lokale) Gruppen zu pflegen und mit beliebig vielen Gruppen Berechtigungen zuzuweisen.

A default Alfresco Share site provides a security-model based on four groups which have one set of permissions assigned : Manager, Collaborator, Contributor and Consumer. Managers assign people and (global) groups to one of these groups. The Contentreich Alfresco add-on Site Groups alternatively allows site managers to maintain (site local) groups and hence assign access permissions with an arbitrary amount of groups. &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://www.contentreich.de/contentreich-alfresco-add-on-site-gruppen&quot;&gt;Weiterlesen &lt;span class=&quot;meta-nav&quot;&gt;&amp;#8594;&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;The post &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://www.contentreich.de/contentreich-alfresco-add-on-site-gruppen&quot;&gt;Contentreich Alfresco add-on &amp;#8211; Site Gruppen&lt;/a&gt; appeared first on &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://www.contentreich.de&quot;&gt;CONTENTREICH&lt;/a&gt;.&lt;/p&gt;</description>
         <guid isPermaLink="false">http://www.contentreich.de/?p=2718</guid>
         <pubDate>Thu, 25 Oct 2012 14:32:10 +0000</pubDate>
         <content:encoded><![CDATA[<p><img src="http://www.contentreich.de/wp-content/uploads/2012/10/Contentreich-add-on-Site-Gruppen.jpg" alt="" title="Contentreich Alfresco add-on Site-Gruppen" width="275" height="275" class="alignleft size-full wp-image-2758"/>Eine Alfresco Share Site bietet von Haus aus ein Sicherheits-Modell basierend auf vier Gruppen denen jeweils eine Menge von Rechten (Rolle) zugeordnet ist : Manager, Mitwirkender, Mitarbeiter und Konsument. Benutzer und (globale) Gruppen lassen sich von Managern diesen vier Gruppen zuweisen. Im Artikel <a rel="nofollow" target="_blank" href="http://www.contentreich.de/individuelle-alfresco-share-gruppen" title="Individuelle Alfresco Share Gruppen">Individuelle Alfresco Share Gruppen</a> haben wir dieses Modell etwas genauer betrachtet.</p>
<p>Es macht folgende Einschränkungen:</p>
<ul>
<li>Jeder Site-Benutzer ist mindestens einer der vier Gruppen welche bei der Zuweisung der Berechtigungen an Inhalten zur Verfügung stehen zugeordnet.</li>
<li>Globale Gruppen können nur vom Administrator angelegt werden und führen neue Komplexität ein.</li>
</ul>
<p>Das Contentreich Alfresco add-on Site Gruppen kann <strong>alternativ</strong> zu der Standard-Gruppenfunktionalität mit Hinblick auf Zugriffsrechte für bestimmte oder alle Sites eines Repositories genutzt werden.</p>
<p>Es bietet:</p>
<ul>
<li>Beliebig viele site-lokale Gruppen die von Site-Managern verwaltet werden können</li>
<li>Zusätzliche Zuweisung von Berechtigungen für lokalen Gruppen</li>
<li>Zuweisung von Personen zu den site-lokalen Gruppen bevor eine Einladung angenommen wird</li>
</ul>
<p>Im Zusammenhang mit Zugriffsberechtigungen ist es wichtig zu verstehen, dass Berechtigung grundsätzlich gewährt wird. Verboten wird in diesem Sinne nicht explizit, sondern implizit dadurch, dass keine Erlaubnis erteilt ist.</p>
<p>Vorraussetzung für dieses add-on ist Alfresco ab Version 4. Das folgende Video illustriert die Funktionsweise mit einem Anwendungsfall.</p>
<div class="post clearfix withThumb featured">
<p><a rel="nofollow" target="_blank" href="http://www.youtube.com/watch?v=2JQov6sjqxE">http://www.youtube.com/watch?v=2JQov6sjqxE</a></p>
</div>
<h2>Referenzen</h2>
<ul>
<li><a rel="nofollow" target="_blank" href="http://www.contentreich.de/individuelle-alfresco-share-gruppen" title="Individuelle Alfresco Share Gruppen">Individuelle Alfresco Share Gruppen</a></li>
</ul>
<div class="social-ring">
<div class="social-ring-button"><a rel="nofollow" target="_blank" href="http://twitter.com/share" lang="en" class="sr-twitter-button twitter-share-button"></a></div>
<div class="social-ring-button"><div class="g-plusone"></div></div>
<div class="social-ring-button"></div> 
<div class="social-ring-button"></div> 
</div><div style="clear:both;">&nbsp;</div>
<p>The post <a rel="nofollow" target="_blank" href="http://www.contentreich.de/contentreich-alfresco-add-on-site-gruppen">Contentreich Alfresco add-on &#8211; Site Gruppen</a> appeared first on <a rel="nofollow" target="_blank" href="http://www.contentreich.de">CONTENTREICH</a>.</p>]]></content:encoded>
      </item>
      <item>
         <title>Contentreich Alfresco add-on – Email</title>
         <link>http://www.contentreich.de/contentreich-alfresco-add-on-email</link>
         <description>&lt;p&gt;&lt;img width=&quot;150&quot; height=&quot;150&quot; src=&quot;http://www.contentreich.de/wp-content/uploads/2012/10/Contentreich-add-on-Email-150x150.jpg&quot; class=&quot;attachment-thumbnail wp-post-image&quot; alt=&quot;Contentreich Alfresco add-on &amp;#8211; Email&quot; title=&quot;Contentreich Alfresco add-on &amp;#8211; Email&quot; style=&quot;float:right;&quot;/&gt;Die Email-Adresse eines Benutzers wird von Anwendungen grundsätzlich gerne zur Identifikation von Benutzern  eingesetzt weil sie im Vergleich zu Usernamen wie &quot;asteffan123&quot; diverse Vorteile bietet.  Im Enterpreise Umfeld können sich insbesondere durch externe Authentisierungs-Komponenten hier größere Herausforderungen stellen. Das Contentreich Alfresco add-on Email ist für Anwendungen gedacht welche der Email-Adresse eine stärkere Bedeutung beimessen also Alfresco es von Haus aus tut. &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://www.contentreich.de/contentreich-alfresco-add-on-email&quot;&gt;Weiterlesen &lt;span class=&quot;meta-nav&quot;&gt;&amp;#8594;&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;The post &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://www.contentreich.de/contentreich-alfresco-add-on-email&quot;&gt;Contentreich Alfresco add-on &amp;#8211; Email&lt;/a&gt; appeared first on &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://www.contentreich.de&quot;&gt;CONTENTREICH&lt;/a&gt;.&lt;/p&gt;</description>
         <guid isPermaLink="false">http://www.contentreich.de/?p=2710</guid>
         <pubDate>Thu, 25 Oct 2012 13:36:54 +0000</pubDate>
         <content:encoded><![CDATA[<p><img src="http://www.contentreich.de/wp-content/uploads/2012/10/Contentreich-add-on-Email.jpg" alt="" title="Contentreich Alfresco add-on Email" width="275" height="275" class="alignleft size-full wp-image-2761"/>Die Email-Adresse eines Benutzers wird von Anwendungen grundsätzlich gerne zur Identifikation von Benutzern eingesetzt. Im Zweifelsfall ist die Email-Adresse dem User besser bekannt als ein Username wie &#8220;asteffan123&#8243;. Beim Einsatz der Email-Adresse zur Identifikation sind fehlerhafte Eingaben beim Login Prozeß unwahrscheinlicher. Außerdem ist eine Umsetzung des Anwendungsfalles &#8220;Passwort vergessen&#8221; besser möglich.</p>
<p>In einer Alfresco Out-of-the Box Installation kommt der Email-Adresse eine weniger bedeutsame Rolle zu. Gründe dafür sind unter anderem, dass im Enterprise Umfeld oftmals andere externe Systeme zur Authentifizierung genutzt werden die nicht die Email-Adresse zur Identifikation eines Benutzers nutzen (z.B. Active-Directory). In so einem Szenario ist es oftmals auch nicht möglich schreibend auf die Datenbestände zuzugreifen, so dass &#8220;Passwort vergessen&#8221; nicht immer ohne weiteres realisierbar ist.</p>
<p>Das Contentreich Alfresco add-on Email ist für Anwendungen gedacht welche der Email-Adresse als Schlüssel zur Identifikation von Usern allgemein höherere Bedeutung beimessen als Alfresco es von Haus aus tut.</p>
<p>Es bietet folgende Funktionalität:</p>
<ul>
<li>Vermeidung von mehrfach angelegten Benutzeren &#8211; insbesondere im Rahmen von Einladungen aus Share Sites</li>
<li>Erweiterung der Personen Suche um Email-Adresse</li>
<li>Erzwingung von eindeutigen Benutzer Email-Adressen durch Behaviour (optional)</li>
<li>Share login mit Username oder Email-Adresse</li>
<li>Prozess Passwort vergessen</li>
</ul>
<p>Grundsätzlich ist es nicht zwingend notwendig, dass Alfresco ausschließlich die native Authentisierung nutzt. Es können also durchaus zusätzlich Active Directory oder andere externe Authentisierungs-Komponenten genutzt werden.</p>
<p>Unterstützt wird Alfresco ab Version 4. Das folgende Video illustriert die Funktionsweise dieses add-on.</p>
<div class="post clearfix withThumb featured">
<p><a rel="nofollow" target="_blank" href="http://www.youtube.com/watch?v=6MnANFtM7rg">http://www.youtube.com/watch?v=6MnANFtM7rg</a></p>
</div>
<h2>Referenzen</h2>
<ul>
<li><a rel="nofollow" target="_blank" href="http://www.contentreich.de/doppelte-alfresco-share-benutzer-vermeiden" title="Doppelte Alfresco Share Benutzer vermeiden">Doppelte Alfresco Share Benutzer vermeiden</a></li>
</ul>
<div class="social-ring">
<div class="social-ring-button"><a rel="nofollow" target="_blank" href="http://twitter.com/share" lang="en" class="sr-twitter-button twitter-share-button"></a></div>
<div class="social-ring-button"><div class="g-plusone"></div></div>
<div class="social-ring-button"></div> 
<div class="social-ring-button"></div> 
</div><div style="clear:both;">&nbsp;</div>
<p>The post <a rel="nofollow" target="_blank" href="http://www.contentreich.de/contentreich-alfresco-add-on-email">Contentreich Alfresco add-on &#8211; Email</a> appeared first on <a rel="nofollow" target="_blank" href="http://www.contentreich.de">CONTENTREICH</a>.</p>]]></content:encoded>
      </item>
      <item>
         <title>Alfresco training – formation Alfresco</title>
         <link>http://alfrescoshare.wordpress.com/2012/10/24/alfresco-training-formation-alfresco/</link>
         <description>I&amp;#8217;m very glad to announce that Alfstore has been selected by Alfresco Software as an Authorized Training Partner for France. This new partnership has been announced by Alfresco during the Paris Alfresco Day 2012. Only Authorized Training Partners can deliver Alfresco classes based on course material developed by Alfresco itself, so this is a great [...]&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://stats.wordpress.com/b.gif?host=alfrescoshare.wordpress.com&amp;#038;blog=6932163&amp;#038;post=320&amp;#038;subd=alfrescoshare&amp;#038;ref=&amp;#038;feed=1&quot; width=&quot;1&quot; height=&quot;1&quot;/&gt;</description>
         <guid isPermaLink="false">http://alfrescoshare.wordpress.com/?p=320</guid>
         <pubDate>Wed, 24 Oct 2012 15:55:44 +0000</pubDate>
         <media:content medium="image" url="http://1.gravatar.com/avatar/7970d817de877c7af3c536a1e981c4c3?s=96&amp;amp;d=identicon&amp;amp;r=G">
            <media:title type="html">e.spindler</media:title>
         </media:content>
      </item>
      <item>
         <title>Add Repository Manage Permissions action within a Site</title>
         <link>http://blog.mitco-solutions.com/post/34232651305</link>
         <description>&lt;p&gt;Like the title says we&amp;#8217;re going to add the default Repository &amp;#8220;Manage Permissions&amp;#8221; action within a site.&lt;/p&gt;
&lt;p&gt;So we&amp;#8217;re going to add a piece of XML to the &lt;strong&gt;share-config-custom.xml&lt;/strong&gt; (placed in &amp;lt;tomcat-dir&amp;gt;/shared/classes/alfresco/web-extension/).&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&amp;lt;!&amp;#8212; Doc libary custom &amp;#8212;&amp;gt;&lt;br/&gt;&lt;br/&gt;    &amp;lt;config evaluator=&amp;#8221;string-compare&amp;#8221; condition=&amp;#8221;DocLibActions&amp;#8221;&amp;gt;&lt;br/&gt;        &amp;lt;actions&amp;gt;&lt;br/&gt;            &amp;lt;!&amp;#8212; Manage permissions (repository roles) &amp;#8212;&amp;gt;&lt;br/&gt;            &amp;lt;action id=&amp;#8221;document-manage-repo-permissions&amp;#8221; type=&amp;#8221;pagelink&amp;#8221; icon=&amp;#8221;document-manage-permissions&amp;#8221; label=&amp;#8221;actions.document.manage-permissions&amp;#8221;&amp;gt;&lt;br/&gt;                &amp;lt;param name=&amp;#8221;page&amp;#8221;&amp;gt;manage-permissions?nodeRef={node.nodeRef}&amp;lt;/param&amp;gt;&lt;br/&gt;                &amp;lt;permissions&amp;gt;&lt;br/&gt;                    &amp;lt;permission allow=&amp;#8221;true&amp;#8221;&amp;gt;ChangePermissions&amp;lt;/permission&amp;gt;&lt;br/&gt;                &amp;lt;/permissions&amp;gt;&lt;br/&gt;                &amp;lt;evaluator negate=&amp;#8221;true&amp;#8221;&amp;gt;evaluator.doclib.action.isLocked&amp;lt;/evaluator&amp;gt;&lt;br/&gt;            &amp;lt;/action&amp;gt;&lt;br/&gt;        &amp;lt;actionGroups&amp;gt;&lt;br/&gt;            &amp;lt;actionGroup id=&amp;#8221;document-details&amp;#8221;&amp;gt;&lt;br/&gt;                &amp;lt;action index=&amp;#8221;290&amp;#8221; id=&amp;#8221;document-manage-site-permissions&amp;#8221; label=&amp;#8221;actions.site.manage-permissions&amp;#8221; /&amp;gt;&lt;br/&gt;            &amp;lt;/actionGroup&amp;gt;&lt;br/&gt;            &amp;lt;actionGroup id=&amp;#8221;folder-browse&amp;#8221;&amp;gt;&lt;br/&gt;                &amp;lt;action index=&amp;#8221;190&amp;#8221; id=&amp;#8221;document-manage-site-permissions&amp;#8221; icon=&amp;#8221;folder-manage-permissions&amp;#8221; label=&amp;#8221;actions.site.manage-permissions&amp;#8221; /&amp;gt;&lt;br/&gt;            &amp;lt;/actionGroup&amp;gt;&lt;br/&gt;            &amp;lt;actionGroup id=&amp;#8221;folder-details&amp;#8221;&amp;gt;&lt;br/&gt;                &amp;lt;action index=&amp;#8221;170&amp;#8221; id=&amp;#8221;document-manage-site-permissions&amp;#8221; icon=&amp;#8221;folder-manage-permissions&amp;#8221; label=&amp;#8221;actions.site.manage-permissions&amp;#8221; /&amp;gt;&lt;br/&gt;            &amp;lt;/actionGroup&amp;gt;&lt;br/&gt;        &amp;lt;/actionGroups&amp;gt;&lt;br/&gt;    &amp;lt;/config&amp;gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;strong&gt;OK&lt;/strong&gt;, so what have I done. Nothing that fancy, just changed the evaluator which was before checking on&lt;br/&gt;&lt;strong&gt;&amp;lt;evaluator negate=&amp;#8221;true&amp;#8221;&amp;gt;evaluator.doclib.action.siteBased&amp;lt;/evaluator&amp;gt;&lt;/strong&gt; and now on&lt;br/&gt;&lt;strong&gt;&amp;lt;evaluator negate=&amp;#8221;true&amp;#8221;&amp;gt;evaluator.doclib.action.isLocked&amp;lt;/evaluator&amp;gt;&lt;/strong&gt; which is a pretty standard evaluator. &lt;/p&gt;
&lt;p&gt;And the following xml is just to rename the label or else it will have the same name twice for both actions and that won&amp;#8217;t be easy for users :).&lt;/p&gt;
&lt;p&gt;So in a message bundle i&amp;#8217;ve define:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;actions.site.manage-permissions=Manage Roles Permissions&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;If one would like to rename the repository &amp;#8220;Manager Permissions&amp;#8221; it would be something like:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;actions.folder.manage-permissions=Manager Repository Permissions&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;strong&gt;Result&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;img alt=&quot;Manage Roles Action&quot; height=&quot;425&quot; src=&quot;http://mitco-solutions.com/blog/images/manage%20roles%20permissions.PNG&quot; width=&quot;500&quot;/&gt;&lt;/p&gt;</description>
         <guid isPermaLink="false">http://blog.mitco-solutions.com/post/34232651305</guid>
         <pubDate>Wed, 24 Oct 2012 15:10:20 +0000</pubDate>
      </item>
      <item>
         <title>Contentreich Alfresco add-ons</title>
         <link>http://www.contentreich.de/contentreich-alfresco-add-ons</link>
         <description>&lt;p&gt;&lt;img width=&quot;150&quot; height=&quot;150&quot; src=&quot;http://www.contentreich.de/wp-content/uploads/2012/10/Alfresco-add-on-150x150.jpg&quot; class=&quot;attachment-thumbnail wp-post-image&quot; alt=&quot;Contentreich Alfresco add-ons&quot; title=&quot;Contentreich Alfresco add-ons&quot; style=&quot;float:right;&quot;/&gt;Wir möchten unseren Kunden zukünftig Contentreich Alfresco add-ons zur Verfügung stellen, die ähnlich den gängigen Browser add-ons zur Laufzeit aktiviert und deaktiviert werden können. In folgenden Video könnt ihr euch davon überzeugen, wie einfach add-ons zur Laufzeit aktiviert und deaktiviert werden. Ein einfacher Browser Reload und die add-ons können benutzt werden. So macht Alfresco Erweiterung Spass ;-) &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://www.contentreich.de/contentreich-alfresco-add-ons&quot;&gt;Weiterlesen &lt;span class=&quot;meta-nav&quot;&gt;&amp;#8594;&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;The post &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://www.contentreich.de/contentreich-alfresco-add-ons&quot;&gt;Contentreich Alfresco add-ons&lt;/a&gt; appeared first on &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://www.contentreich.de&quot;&gt;CONTENTREICH&lt;/a&gt;.&lt;/p&gt;</description>
         <guid isPermaLink="false">http://www.contentreich.de/?p=2652</guid>
         <pubDate>Tue, 23 Oct 2012 07:58:56 +0000</pubDate>
         <content:encoded><![CDATA[<p><img class="alignleft size-full wp-image-2653" title="Contentreich Alfresco add-ons" src="http://www.contentreich.de/wp-content/uploads/2012/10/Alfresco-add-on.jpg" alt="" width="275" height="275"/>Mit dem neuen Alfresco Community Release 4.2.a haben sich die technischen Rahmenbedingungen zur einfachen und effizienten Erweiterung der Funktionalität entscheidend verbessert (mit Einschränkungen gilt dieses auch bereits für ältere 4.x Versionen).</p>
<p>Wir möchten unseren Kunden zukünftig Contentreich add-ons zur Verfügung stellen, die ähnlich den gängigen Browser add-ons zur Laufzeit aktiviert und deaktiviert werden können.</p>
<p>Im Vorfeld müssen diese Erweiterungen in die Alfresco Umgebung eingespielt werden. Diverse zusätzliche Anpassungen an der Alfresco Konfiguration (z.B. XML Anpassungen von Hand) sollten bei kleineren Erweiterungen der Vergangenheit angehören.</p>
<p>Im nachfolgenden Screenshot könnt ihr unsere Erweiterungen innerhalb der Contentreich Alfresco Umgebung sehen (Share und Repository seitig):<br />
<img class="aligncenter size-full wp-image-2657" title="Alfresco Extensions im Dateisystem" src="http://www.contentreich.de/wp-content/uploads/2012/10/AlfrescoExtensionsimDateisystem.png" alt="" width="584" height="403"/></p>
<p>In folgenden Video könnt ihr euch davon überzeugen, wie einfach add-ons zur Laufzeit aktiviert und deaktiviert werden. Ein einfacher Browser Reload und die add-ons können benutzt werden. So macht Alfresco Erweiterung Spass ;-)</p>
<h3>Contentreich add-ons Teil 1:</h3>
<ul>
<li>&#8220;Theme-Erweiterung&#8221;, </li>
<li>&#8220;Login mit Email oder Username&#8221; und</li>
<li>&#8220;Passwort vergessen&#8221; Funktion</li>
</ul>
<div class="post clearfix withThumb featured">
<p><a rel="nofollow" target="_blank" href="http://www.youtube.com/watch?v=T9qDg5SzFxo">http://www.youtube.com/watch?v=T9qDg5SzFxo</a></p>
</div>
<p><em>Hinweis: Bei dem &#8220;Passwort vergessen&#8221; add-on haben wir uns funktional weitestgehend am bestehenden ResetPasswordDialog add-on (siehe <a rel="nofollow" target="_blank" href="http://code.google.com/p/share-extras/wiki/ResetPasswordDialog">share-extras</a>) von Will Abson orientiert.</em></p>
<p>Dieses Video ist nur ein Ausschnitt aus unserer add-ons Sammlung. In den kommenden Tagen und Wochen kommt noch mehr!</p>
<div class="social-ring">
<div class="social-ring-button"><a rel="nofollow" target="_blank" href="http://twitter.com/share" lang="en" class="sr-twitter-button twitter-share-button"></a></div>
<div class="social-ring-button"><div class="g-plusone"></div></div>
<div class="social-ring-button"></div> 
<div class="social-ring-button"></div> 
</div><div style="clear:both;">&nbsp;</div>
<p>The post <a rel="nofollow" target="_blank" href="http://www.contentreich.de/contentreich-alfresco-add-ons">Contentreich Alfresco add-ons</a> appeared first on <a rel="nofollow" target="_blank" href="http://www.contentreich.de">CONTENTREICH</a>.</p>]]></content:encoded>
      </item>
      <item>
         <title>Alfresco Community 4.2.a Review</title>
         <link>http://www.contentreich.de/alfresco-community-4-2-a-review</link>
         <description>&lt;p&gt;&lt;img width=&quot;150&quot; height=&quot;150&quot; src=&quot;http://www.contentreich.de/wp-content/uploads/2012/10/Alfresco-4-2-a-150x150.png&quot; class=&quot;attachment-thumbnail wp-post-image&quot; alt=&quot;Alfresco Community 4.2.a Review&quot; title=&quot;Alfresco Community 4.2.a Review&quot; style=&quot;float:right;&quot;/&gt;Mit der neuen Alfresco Community Version 4.2.a sind neben Optimierungen am Code auch einige verbesserte und neue Funktionen in Alfresco Share integriert worden. Wir haben euch fünf Video Reviews für diese Neuerungen innerhalb der Benutzeroberfläche von Share vorbereitet und möchten euch mit diesen Videos unsere ganz persönlichen Eindrücke vom neuen Release präsentieren. &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://www.contentreich.de/alfresco-community-4-2-a-review&quot;&gt;Weiterlesen &lt;span class=&quot;meta-nav&quot;&gt;&amp;#8594;&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;The post &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://www.contentreich.de/alfresco-community-4-2-a-review&quot;&gt;Alfresco Community 4.2.a Review&lt;/a&gt; appeared first on &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://www.contentreich.de&quot;&gt;CONTENTREICH&lt;/a&gt;.&lt;/p&gt;</description>
         <guid isPermaLink="false">http://www.contentreich.de/?p=2600</guid>
         <pubDate>Mon, 22 Oct 2012 08:15:05 +0000</pubDate>
         <content:encoded><![CDATA[<p><img class="alignleft size-full wp-image-2638" title="Alfresco Community 4.2.a" src="http://www.contentreich.de/wp-content/uploads/2012/10/Alfresco-4-2-a.png" alt="" width="275" height="275"/>Mit der neuen <strong>Alfresco Community Version 4.2.a</strong> sind neben Optimierungen am Code auch einige verbesserte und neue Funktionen in Alfresco Share integriert worden.</p>
<p>Die neue Rich Media Gallery View, die neuen Suche Dashlets, einfaches Sharing von Inhalten und Vieles mehr, machen die Zusammenarbeit im Alfresco Share noch einfacher und effektiver.</p>
<p>Wir haben euch fünf Video Reviews für diese Neuerungen innerhalb der Benutzeroberfläche von Share vorbereitet. Diese Videos präsentieren unsere ganz persönlichen Eindrücke vom neuen Release.</p>
<p>Fazit für uns (mit einer kleinen Einschränkung, Solr funktioniert bei uns nach dem Umstieg noch nicht) :</p>
<blockquote><p><strong>Ein Umstieg auf die 4.2.a lohnt sich :)</strong></p></blockquote>
<h5></h5>
<h5>Review Teil 1: Erweiterungen am My Task Dashlet</h5>
<div class="post clearfix withThumb featured">
<p><a rel="nofollow" target="_blank" href="http://www.youtube.com/watch?v=4b9zlQqQ9Ik">http://www.youtube.com/watch?v=4b9zlQqQ9Ik</a></p>
</div>
<h5></h5>
<h5>Review Teil 2: Die neuen Search und Saved Search Dashlets</h5>
<div class="post clearfix withThumb featured">
<p><a rel="nofollow" target="_blank" href="http://www.youtube.com/watch?v=MPn_A3f_iqs">http://www.youtube.com/watch?v=MPn_A3f_iqs</a></p>
</div>
<h5></h5>
<h5>Review Teil 3: Image Preview Dashlet und Rich Media Gallery View</h5>
<div class="post clearfix withThumb featured">
<p><a rel="nofollow" target="_blank" href="http://www.youtube.com/watch?v=yH-jJAZDoYw">http://www.youtube.com/watch?v=yH-jJAZDoYw</a></p>
</div>
<h5></h5>
<h5>Review Teil 4: Zip Download und Quick Share</h5>
<div class="post clearfix withThumb featured">
<p><a rel="nofollow" target="_blank" href="http://www.youtube.com/watch?v=496uZ-vOASw">http://www.youtube.com/watch?v=496uZ-vOASw</a></p>
</div>
<h5></h5>
<h5>Review Teil 5: Single Click Google Docs Integration</h5>
<div class="post clearfix withThumb featured">
<p><a rel="nofollow" target="_blank" href="http://www.youtube.com/watch?v=rZ63PRr2Cmg">http://www.youtube.com/watch?v=rZ63PRr2Cmg</a></p>
</div>
<p>Wir hoffen die Video Reviews konnten euch bei eurer Entscheidung für oder gegen die Version 4.2.a helfen.</p>
<p><em>Update: Mit der 4.2.a gab es einen Fehler bei Einladung via Email. Dieser wird mit Version 4.2.b laut Alfresco gefixt (siehe <a rel="nofollow" target="_blank" href="https://issues.alfresco.com/jira/browse/ALF-16436">ALF-16436</a>)</em></p>
<p>In den kommenden Tagen möchten wir euch die neuen Erweiterungsmöglichkeiten von Alfresco Share vorstellen und versprechen euch einen Einblick in eine ganz neue, unkomplizierte Vorgehensweise :) .</p>
<div class="social-ring">
<div class="social-ring-button"><a rel="nofollow" target="_blank" href="http://twitter.com/share" lang="en" class="sr-twitter-button twitter-share-button"></a></div>
<div class="social-ring-button"><div class="g-plusone"></div></div>
<div class="social-ring-button"></div> 
<div class="social-ring-button"></div> 
</div><div style="clear:both;">&nbsp;</div>
<p>The post <a rel="nofollow" target="_blank" href="http://www.contentreich.de/alfresco-community-4-2-a-review">Alfresco Community 4.2.a Review</a> appeared first on <a rel="nofollow" target="_blank" href="http://www.contentreich.de">CONTENTREICH</a>.</p>]]></content:encoded>
      </item>
      <item>
         <title>H2 support 1.5 for Alfresco 4.1.1 Enterprise</title>
         <link>http://feedproxy.google.com/~r/Skuro/~3/R4IM55LkZVM/</link>
         <description>&lt;p&gt;After Alfresco version 4.1.1 Enterprise came out earlier this month,
&lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;https://github.com/skuro/alfresco-h2-support&quot;&gt;H2 support&lt;/a&gt; needed to
stay up to date and release a new version which incorporates the
few schema changes in the Alfresco database. Thanks to
&lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://springyweb.com&quot;&gt;Jon Evans&lt;/a&gt; and &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://www.ixxus.com&quot;&gt;Ixxus&lt;/a&gt;,
 H2 Support v1.5 it's already out there!&lt;/p&gt;

&lt;h1&gt;Version management&lt;/h1&gt;

&lt;p&gt;As
&lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;https://github.com/skuro/alfresco-h2-support/wiki/H2-Database-support-for-Alfresco&quot;&gt;usual&lt;/a&gt;,
H2 support follows its own version numbering scheme, and you need to
double check which one to use depending on the Alfresco version you're
running: version 1.5 only supports Alfresco 4.1.1 Enterprise, so if
you're targeting other versions go and update your POM.&lt;/p&gt;

&lt;h1&gt;Availability on Maven Central&lt;/h1&gt;

&lt;p&gt;By the time of this writing, H2 support was just pushed to
&lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;https://oss.sonatype.org/index.html&quot;&gt;Sonatype OSS&lt;/a&gt;, and while it
should happen shortly, it still has to be synchronized with Maven
Central. If the following Maven dependency fails to resolve, try to
download and install it from
&lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;https://oss.sonatype.org/content/repositories/releases/tk/skuro/alfresco/h2-support/1.5/&quot;&gt;here&lt;/a&gt;:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;&amp;lt;dependency&amp;gt;
  &amp;lt;groupId&amp;gt;tk.skuro.alfresco&amp;lt;/groupId&amp;gt;
  &amp;lt;artifactId&amp;gt;h2-support&amp;lt;/artifactId&amp;gt;
  &amp;lt;version&amp;gt;1.5&amp;lt;/version&amp;gt;
&amp;lt;/dependency&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;On a side note, the stats feature of Sonatype Nexus are plain awesome.
I can have direct insights of the amount of downloads of H2 support
over time, split by version number. Check it out:&lt;/p&gt;

&lt;p&gt;&lt;img title=&quot;H2 download stats&quot; alt=&quot;H2 download stats&quot;/&gt;&lt;/p&gt;

&lt;h1&gt;Your chance to be awesome&lt;/h1&gt;

&lt;p&gt;Jon was just great to help H2 support and provide the patch that made
1.5 happen. It's always inspiring to see how OpenSource drives people
to build something together, spending time to shape technology to be
the way we need, asking for nothing else in return than just be part
of the community.&lt;/p&gt;

&lt;p&gt;H2 support is a tiny project, and requires little
development and maintenance. Still, you can always help by either
testing it against &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;https://github.com/skuro/alfresco-h2-support/wiki/H2-Database-support-for-Alfresco&quot;&gt;undocumented Alfresco versions&lt;/a&gt;, or &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;https://github.com/skuro/alfresco-h2-support/issues&quot;&gt;reporting bugs&lt;/a&gt;
or your wish list as soon as you figure them out.&lt;/p&gt;

&lt;p&gt;Thanks for reading this and happy Alfresco hacking!&lt;/p&gt;
&lt;div class=&quot;feedflare&quot;&gt;
&lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://feeds.feedburner.com/~ff/Skuro?a=R4IM55LkZVM:EBQYTs1UOj8:yIl2AUoC8zA&quot;&gt;&lt;img src=&quot;http://feeds.feedburner.com/~ff/Skuro?d=yIl2AUoC8zA&quot; border=&quot;0&quot;&gt;&lt;/a&gt; &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://feeds.feedburner.com/~ff/Skuro?a=R4IM55LkZVM:EBQYTs1UOj8:V_sGLiPBpWU&quot;&gt;&lt;img src=&quot;http://feeds.feedburner.com/~ff/Skuro?i=R4IM55LkZVM:EBQYTs1UOj8:V_sGLiPBpWU&quot; border=&quot;0&quot;&gt;&lt;/a&gt; &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://feeds.feedburner.com/~ff/Skuro?a=R4IM55LkZVM:EBQYTs1UOj8:7Q72WNTAKBA&quot;&gt;&lt;img src=&quot;http://feeds.feedburner.com/~ff/Skuro?d=7Q72WNTAKBA&quot; border=&quot;0&quot;&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src=&quot;http://feeds.feedburner.com/~r/Skuro/~4/R4IM55LkZVM&quot; height=&quot;1&quot; width=&quot;1&quot;/&gt;</description>
         <guid isPermaLink="false">http://skuro.tk/2012/10/16/alfresco-h2-support-update/</guid>
         <pubDate>Mon, 15 Oct 2012 22:00:00 +0000</pubDate>
      </item>
      <item>
         <title>October Amsterdam Clojure 2012 is coming up!</title>
         <link>http://feedproxy.google.com/~r/Skuro/~3/3aIJWrDgrEE/</link>
         <description>&lt;p&gt;Saturday, October 27th. Less than two weeks. That's the time when
October Amsterdam Clojure, the biggest Clojure free event in the
Netherlands, will be up on stage. I'm so incredibly excited about it,
I can't wait to see all the seasoned clojurians, passionate
technologists and curious newbies meet together to discuss one of the
most intriguing technologies of our present day. Here's a couple of
things to remind you of what's ahead of us.&lt;/p&gt;

&lt;h1&gt;Don't forget to bring a ticket&lt;/h1&gt;

&lt;p&gt;As much as the event is totally free to attend, our limited logistics
imposes us a limit on the attendance. In order to reserve your seat at
the event, just go on the event
&lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://bit.ly/octamsclj-register&quot;&gt;Meetup page&lt;/a&gt; and RSVP. This much,
and you'll be joining us and have full access to the conference.&lt;/p&gt;

&lt;h1&gt;How to reach us&lt;/h1&gt;

&lt;p&gt;As it goes with all Amsterdam Clojurians regular meetup, the big
October event will be also hosted by
&lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://www.backbase.com&quot;&gt;Backbase&lt;/a&gt;. You can find the &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://www.backbase.com/contact/DIRECTIONS-backbase-INIT.pdf&quot;&gt;directions to
the venue&lt;/a&gt; on the official &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://amsclj.nl/october.html&quot;&gt;event page&lt;/a&gt;.
While it's not far from Central Station, make sure to take note of the
correct address. Once you're in the neighborhood, it's easy to find
us: just go to the main entrance of the big, glass building with the
huge newspapers logos on top. Yes,
&lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://www.cctvinfo.com/news_images/Geutebruck_INIT_building_ext.gif&quot;&gt;that one&lt;/a&gt;.
You'll find some of our awesome Clojurian volunteer to wait for you
downstairs.&lt;/p&gt;

&lt;h1&gt;Afterparty drinkup&lt;/h1&gt;

&lt;p&gt;We're still in the process of organizing a drinkup right after the
event, make sure your agenda is free in order to join the swarm of
Clojure coders and discuss functional programming philosophies over a
couple of beers!&lt;/p&gt;

&lt;h1&gt;Stay up to date&lt;/h1&gt;

&lt;p&gt;Events are complex beasts, and we'll try hard to let you always be up
to date with any sudden change of the plan. If you want to double
check the official plan, here's where you can find all the info you
need:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;the official &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://bit.ly/octamsclj-register&quot;&gt;event page&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;#OctAmsClj at
 &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://www.meetup.com/The-Amsterdam-Clojure-Meetup-Group/events/74036402/&quot;&gt;Meetup.com&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;our official social channels (&lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://www.meetup.com/The-Amsterdam-Clojure-Meetup-Group/events/74036402/&quot;&gt;Twitter&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;our official social channels (&lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;https://twitter.com/amsclj&quot;&gt;Twitter&lt;/a&gt;,
(Facebook)[http://www.facebook.com/AmsterdamClojurians] and
&lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;https://plus.google.com/107873826198867434419/about&quot;&gt;Google+&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;


&lt;p&gt;Looking forward to meet you there!&lt;/p&gt;
&lt;div class=&quot;feedflare&quot;&gt;
&lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://feeds.feedburner.com/~ff/Skuro?a=3aIJWrDgrEE:knoG1drM4-4:yIl2AUoC8zA&quot;&gt;&lt;img src=&quot;http://feeds.feedburner.com/~ff/Skuro?d=yIl2AUoC8zA&quot; border=&quot;0&quot;&gt;&lt;/a&gt; &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://feeds.feedburner.com/~ff/Skuro?a=3aIJWrDgrEE:knoG1drM4-4:V_sGLiPBpWU&quot;&gt;&lt;img src=&quot;http://feeds.feedburner.com/~ff/Skuro?i=3aIJWrDgrEE:knoG1drM4-4:V_sGLiPBpWU&quot; border=&quot;0&quot;&gt;&lt;/a&gt; &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://feeds.feedburner.com/~ff/Skuro?a=3aIJWrDgrEE:knoG1drM4-4:7Q72WNTAKBA&quot;&gt;&lt;img src=&quot;http://feeds.feedburner.com/~ff/Skuro?d=7Q72WNTAKBA&quot; border=&quot;0&quot;&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src=&quot;http://feeds.feedburner.com/~r/Skuro/~4/3aIJWrDgrEE&quot; height=&quot;1&quot; width=&quot;1&quot;/&gt;</description>
         <guid isPermaLink="false">http://skuro.tk/2012/10/14/october-amsterdam-clojure-coming-up/</guid>
         <pubDate>Sat, 13 Oct 2012 22:00:00 +0000</pubDate>
      </item>
      <item>
         <title>Exclusión de ficheros para Alfviral (versión 1.2.0)</title>
         <link>http://www.fegor.com/2012/10/exclusion-de-ficheros-para-alfviral.html</link>
         <description>&lt;div class=&quot;separator&quot; style=&quot;clear:both;text-align:center;&quot;&gt;&lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://2.bp.blogspot.com/-4bqGNBd_zh8/UGvosPyT4YI/AAAAAAAAAUA/7UU0VJUa9cs/s1600/4.jpg&quot; style=&quot;clear:left;float:left;margin-bottom:1em;margin-right:1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;145&quot; src=&quot;http://2.bp.blogspot.com/-4bqGNBd_zh8/UGvosPyT4YI/AAAAAAAAAUA/7UU0VJUa9cs/s200/4.jpg&quot; width=&quot;200&quot;/&gt;&lt;/a&gt;&lt;/div&gt;Hace unos días recibí una solicitud de un usuario sobre mi módulo para escanear ficheros desde Alfresco. La nueva funcionalidad solicitada era la de poder seleccionar qué ficheros queremos que sean enviados al antivirus que tengamos configurado.&lt;br /&gt;&lt;br /&gt;Anoche estuve retocando un poco el módulo e incluí la funcionalidad en forma de ficheros excluidos, es decir, una lista de ficheros que no queremos que se envíen al antivirus para ser escaneados, en este caso podemos incluir ficheros PDF, TXT, CSV, etc. y no se enviarán para ser analizados. En la nueva configuración solo hay un parámetro más configurado por ejemplo como sigue:&lt;br /&gt;&lt;br /&gt;alfviral.file.exceptions=text/html|text/xml|application/pdf|image/jpeg|text/plain&lt;br /&gt;&lt;br /&gt;Donde en la lista y separada por &quot;|&quot; podemos incluir los archivos según su &quot;Content-Type&quot;.&lt;br /&gt;&lt;br /&gt;Espero que con esta nueva funcionalidad pueda &quot;discriminarse&quot; mejor que documentos/ficheros necesitamos que sean analizados.&lt;br /&gt;&lt;br /&gt;He incluido el módulo como versión 1.2.0.&lt;br /&gt;&lt;br /&gt;</description>
         <author>Fernando González</author>
         <guid isPermaLink="false">tag:blogger.com,1999:blog-13003183.post-5382179062427965666</guid>
         <pubDate>Wed, 03 Oct 2012 07:15:00 +0000</pubDate>
         <media:thumbnail height="72" url="http://2.bp.blogspot.com/-4bqGNBd_zh8/UGvosPyT4YI/AAAAAAAAAUA/7UU0VJUa9cs/s72-c/4.jpg" width="72" xmlns:media="http://search.yahoo.com/mrss/"/>
      </item>
      <item>
         <title>Alfresco Share in IE Compatibility Mode</title>
         <link>http://onalfresco.blogspot.com/2012/09/alfresco-share-in-ie-compatibility-mode.html</link>
         <description>Alfresco Share is not supported in Internet Explorer Compatibility Views - for both IE8 Compat View and IE9 Compat View.&lt;br /&gt;&lt;br /&gt;There are number of UI bugs crops up in these mode of the browser, where as these works even in IE6 (and of course these works in IE7, IE8 onwards).&lt;br /&gt;&lt;br /&gt;For example, one of the functionalities that does not work in Compat View is inserting image in a Wiki page.&lt;br /&gt;&lt;div class=&quot;separator&quot; style=&quot;clear:both;text-align:center;&quot;&gt;&lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://1.bp.blogspot.com/-2APE8MUgHD4/UGk2h7wpu9I/AAAAAAAAAJI/YSfeYQz7tmg/s1600/Wiki.PNG&quot; style=&quot;clear:left;float:left;margin-bottom:1em;margin-right:1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;330&quot; src=&quot;http://1.bp.blogspot.com/-2APE8MUgHD4/UGk2h7wpu9I/AAAAAAAAAJI/YSfeYQz7tmg/s640/Wiki.PNG&quot; width=&quot;600&quot;/&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;</description>
         <author>Snig Bhaumik</author>
         <guid isPermaLink="false">tag:blogger.com,1999:blog-3095692350172949352.post-7483811620315886611</guid>
         <pubDate>Sun, 30 Sep 2012 23:24:00 +0000</pubDate>
         <media:thumbnail height="72" url="http://1.bp.blogspot.com/-2APE8MUgHD4/UGk2h7wpu9I/AAAAAAAAAJI/YSfeYQz7tmg/s72-c/Wiki.PNG" width="72" xmlns:media="http://search.yahoo.com/mrss/"/>
      </item>
      <item>
         <title>Como no sobrecargar form.get.head.ftl en Alfresco</title>
         <link>http://www.fegor.com/2012/09/como-no-sobrecargar-formgetheadftl-en.html</link>
         <description>&lt;div class=&quot;separator&quot; style=&quot;clear:both;text-align:center;&quot;&gt;&lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://1.bp.blogspot.com/-bhv2yEEAF7c/UGMU5-X4_HI/AAAAAAAAATw/rpLgOMCmWmo/s1600/images.jpg&quot; style=&quot;clear:left;float:left;margin-bottom:1em;margin-right:1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;199&quot; src=&quot;http://1.bp.blogspot.com/-bhv2yEEAF7c/UGMU5-X4_HI/AAAAAAAAATw/rpLgOMCmWmo/s200/images.jpg&quot; width=&quot;200&quot;/&gt;&lt;/a&gt;&lt;/div&gt;En el blog de Michal Wróbel y su magnífico artículo &quot;&lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://blog.mwrobel.eu/field-validation-alfresco-share-form/#respond&quot;&gt;How to perform form field validation in Alfresco Share?&lt;/a&gt;&quot; se explica la forma de usar los eventos para validaciones de campos en formulario de Alfresco Share. Lo hace sobreescribiendo la restricción obligatoria (mandatory constraint).&lt;br /&gt;&lt;br /&gt;El problema viene cuando creamos un módulo para Alfresco Share con su fichero JAR correspondiente y lo instalamos en un Alfresco Share donde hay otro fichero form.get.head.ftl ya que el del JAR anulará al anterior con lo que no funcionarán las validaciones.&lt;br /&gt;&lt;br /&gt;Para esto he decidido usar otra forma de tener cargado el fichero .js que necesitamos para las validaciones, por ejemplo form_validation_module.js dentro de nuestra instalación. La forma es usando la referencia a ficheros javascript de la configuración de los &quot;forms&quot; de forma que podamos tener y cargar los ficheros por cada módulo que tengamos sin tener que tocar el fichero original.&lt;br /&gt;&lt;br /&gt;De esta forma, podremos tener el mismo fichero form_validation_module.js en la misma ubicación tomcat/webapps/share/components/form pero ahora lo referenciamos no en form.get.head.ftl sino dentro de nuestro fichero de configuración de los campos, por ejemplo module-form-config.xml de esta forma:&lt;br /&gt;&lt;span style=&quot;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;&quot;&gt;&amp;lt;alfresco-config&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;config&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;forms&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;b&gt;&amp;lt;dependencies&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;js src=&quot;/components/form/form_validation_module-min.js&quot;&amp;gt;&amp;lt;/js&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/dependencies&amp;gt;&lt;/b&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/forms&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/config&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;&quot;&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;config evaluator=&quot;node-type&quot; condition=&quot;fg:example&quot;&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;forms&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;form&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;field-visibility&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;show id=&quot;fg:xfiles&quot;/&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/field-visibility&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;appearance&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;field id=&quot;fg:xfiles&quot; mandatory=&quot;true&quot;&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;constraint-handlers&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;constraint type=&quot;mandatory&quot;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; validation-handler=&quot;Alfresco.forms.validation.prueba&quot;/&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/constraint-handlers&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/field&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/appearance&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/form&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/forms&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/config&amp;gt;&lt;br /&gt;&amp;lt;/alfresco-config&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Lo único que cambia del anterior método es que aquí no hace falta referenciar la parte ${page.url.context}/res y que hay que añadir &quot;-min&quot; al fichero si lo vamos a &quot;compactar&quot;.&lt;br /&gt;&lt;br /&gt;De esta forma tendrémos más seguridad a la hora de desplegar distintos módulos para Alfresco Share donde haya otros ya instalados.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;</description>
         <author>Fernando González</author>
         <guid isPermaLink="false">tag:blogger.com,1999:blog-13003183.post-676162992526658283</guid>
         <pubDate>Wed, 26 Sep 2012 16:46:00 +0000</pubDate>
         <media:thumbnail height="72" url="http://1.bp.blogspot.com/-bhv2yEEAF7c/UGMU5-X4_HI/AAAAAAAAATw/rpLgOMCmWmo/s72-c/images.jpg" width="72" xmlns:media="http://search.yahoo.com/mrss/"/>
      </item>
      <item>
         <title>Getting closer to Alfresco on the command line</title>
         <link>http://thinkalfresco.blogspot.com/2012/09/getting-closer-on-command-line.html</link>
         <description>&lt;br /&gt;
I recently kicked of a small GPL project to work with the Alfresco repository from the command line. Check out the tools here&amp;nbsp;&lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://code.google.com/p/alfresco-shell-tools/&quot;&gt;http://code.google.com/p/alfresco-shell-tools/&lt;/a&gt;.&lt;br /&gt;
&lt;br /&gt;
Since its early stage a month ago I am already using the project at several customers to get my admin tasks done more easily.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;</description>
         <author>noreply@blogger.com (Lothar Märkle)</author>
         <guid isPermaLink="false">tag:blogger.com,1999:blog-3862704576763351872.post-2042909372494660064</guid>
         <pubDate>Wed, 19 Sep 2012 13:48:00 +0000</pubDate>
      </item>
      <item>
         <title>Wearing earplugs</title>
         <link>http://wanderingalfresco.wordpress.com/2012/09/07/wearing-earplugs/</link>
         <description>We recently upgraded to Alfresco 4.0.2.9. While we&amp;#8217;re definitely happy to be up on the new version (lots of nice new features), one issue has been bugging me: There&amp;#8217;s an awful lot of noise in the log file. Back in &amp;#8230; &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://wanderingalfresco.wordpress.com/2012/09/07/wearing-earplugs/&quot;&gt;Continue reading &lt;span class=&quot;meta-nav&quot;&gt;&amp;#8594;&lt;/span&gt;&lt;/a&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://stats.wordpress.com/b.gif?host=wanderingalfresco.wordpress.com&amp;#038;blog=23905304&amp;#038;post=192&amp;#038;subd=wanderingalfresco&amp;#038;ref=&amp;#038;feed=1&quot; width=&quot;1&quot; height=&quot;1&quot;/&gt;</description>
         <guid isPermaLink="false">http://wanderingalfresco.wordpress.com/?p=192</guid>
         <pubDate>Fri, 07 Sep 2012 22:52:00 +0000</pubDate>
         <content:encoded><![CDATA[<p>We recently upgraded to Alfresco 4.0.2.9.  While we&#8217;re definitely happy to be up on the new version (lots of nice new features), one issue has been bugging me:  There&#8217;s an awful lot of noise in the log file.</p>
<p>Back in 3.4.x, I usually monitored the log file with the command:<br />
<code><br />
tail -500f /usr/share/tomcat/logs/catalina.out | grep -v "^&#92;Wat"<br />
</code><br />
What that does is to strip out all of the stack traces from the log (all of the lines beginning with &#8221;   at&#8221;), making the log file much more readable.  As this was just affecting which lines are displayed, not what&#8217;s actually in the log file, I could turn off the grep filtering if I ever wanted the complete version for troubleshooting.</p>
<p>However, in 4.0.2.9, there&#8217;s a lot more spurious stuff in there.  In addition to the stack traces, there&#8217;s also:</p>
<p>1) Very frequent repetitions of the lines:<br />
<code><br />
Sep 7, 2012 3:35:03 PM org.apache.tomcat.util.http.Parameters processParameters<br />
WARNING: Parameters: Invalid chunk '' ignored.<br />
</code></p>
<p>2) Complete copies of the raw HTML of the error page served up whenever a HTTP 500 (internal error) error occurs.</p>
<p>3) A bunch of blank lines</p>
<p>So, this afternoon, after a bit of chatter about this on the Alfresco IRC channel, I decided I really needed a better version of my log file monitoring command.  Here&#8217;s what I developed:</p>
<pre style="font-family:Monaco, Courier, monospace;white-space:pre;line-height:120%;border:1px dashed #aaa8a8;font-size:80%;color:#080;overflow:auto;margin:1em 0;padding:.5em 0 .3em .5em;">tail -7500f /usr/share/tomcat/logs/catalina.out | perl -nle 'print if (($_ !~ /^&#92;W*[&lt;a&#92;.]/) &amp;&amp; ($_ !~ /^$/) &amp;&amp; ($_ !~ /org.apache.tomcat.util.http.Parameters processParameters/) &amp;&amp; ($_ !~ /Invalid chunk/))'</pre>
<p><i>Note that the line above scrolls sideways so it doesn&#8217;t get word-wrapped incorrectly.</i></p>
<p>To break down the individual portions of that perl &#8220;print if&#8221; command:<br />
<b><code>($_ !~ /^&#92;W*[&lt;a&#92;.]/)</code>:</b> Don&#8217;t print any lines that begin with whitespace (optional), followed by either a &#8220;&lt;&#8221; (getting rid of the error 500 HTML lines); an &#8220;a&#8221; (getting rid of the &#8221;   at&#8221; lines); or a &#8220;.&#8221; (getting rid of the &#8221;   &#8230; 40 more&#8221; lines)</p>
<p><b><code>($_ !~ /^$/)</code>:</b> Don&#8217;t print any blank lines</p>
<p><b><code>($_ !~ /org.apache.tomcat.util.http.Parameters processParameters/)</code>:</b> Get rid of the lines containing &#8220;org.apache.tomcat.util.http.Parameters processParameters&#8221;</p>
<p><b><code>($_ !~ /Invalid chunk/)</code>:</b> Get rid of the lines containing &#8220;Invalid chunk&#8221;</p>
<p>This isn&#8217;t an earth-shattering improvement, but it does make the log file a bunch easier to read, for me at least.</p>
<br />  <a rel="nofollow" target="_blank" href="http://feeds.wordpress.com/1.0/gocomments/wanderingalfresco.wordpress.com/192/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/wanderingalfresco.wordpress.com/192/"/></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=wanderingalfresco.wordpress.com&#038;blog=23905304&#038;post=192&#038;subd=wanderingalfresco&#038;ref=&#038;feed=1" width="1" height="1"/>]]></content:encoded>
         <media:content medium="image" url="http://0.gravatar.com/avatar/08db656472ec0d3b2ae3355095abbf5d?s=96&amp;amp;d=identicon&amp;amp;r=G">
            <media:title type="html">icrew</media:title>
         </media:content>
         <category>Uncategorized</category>
      </item>
      <item>
         <title>org4idea adds org-mode support to Intellij IDEA</title>
         <link>http://feedproxy.google.com/~r/Skuro/~3/CJfGDMnQNMA/</link>
         <description>&lt;p&gt;&lt;em&gt;tl;dr:&lt;/em&gt; &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;https://github.com/skuro/org4idea&quot;&gt;org4idea&lt;/a&gt; is a brand new
 project to add &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://orgmode.org&quot;&gt;org-mode&lt;/a&gt; support to &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://www.jetbrains.com/idea/&quot;&gt;IntelliJ IDEA&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;A coin with two sides&lt;/h2&gt;

&lt;p&gt;Given the gargantuan size of the feature list of
&lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://orgmode.org/&quot;&gt;org-mode&lt;/a&gt;, there's hardly any competition of
note taking systems for hackers. I'm completely sold on it since long
time already, so much that
&lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://unixhelp.ed.ac.uk/CGI/man-cgi?uptime&quot;&gt;uptime(1)&lt;/a&gt; returns
always a quite precise approximation of the Emacs process lifetime.&lt;/p&gt;

&lt;p&gt;While such setup makes for a merry and seamless experience while
hacking on my &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://clojure.org/&quot;&gt;Clojure&lt;/a&gt; projects, the dream
breakes when I move to work on Java code, where I shall have no other
IDE besides &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://www.jetbrains.com/idea/&quot;&gt;IntelliJ IDEA&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;Baby steps&lt;/h2&gt;

&lt;p&gt;As there's no better way than a quick hacking session to start the
weekend, I eventually decided to take some time to put together a
minimal plugin to support editing org files within IntelliJ: a few
hours later &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;https://github.com/skuro/org4idea&quot;&gt;org4idea&lt;/a&gt; landed on my
GitHub account. It's a ridiculously tiny plugin at the moment, only
providing syntax highlight for comments and outlines.&lt;/p&gt;

&lt;p&gt;While I'm
not planning to support all the features and plugins of org in
IntelliJ you can safely bet I'll be adding new features with time. You
can always open an &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;https://github.com/skuro/org4idea/issues&quot;&gt;issue&lt;/a&gt;
to try to buy some karma points to that specific feature you desperately
need to be implemented (well, in such cases you could also realize you're just
one fork away).&lt;/p&gt;

&lt;h2&gt;Installation&lt;/h2&gt;

&lt;p&gt;While the plugin still awaits approval in the official
&lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://plugins.intellij.net/plugin?pr=&amp;amp;pluginId=7095&quot;&gt;repository&lt;/a&gt; you
can manually install the plugin by downloading &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;https://github.com/downloads/skuro/org4idea/org4idea.jar&quot;&gt;org4idea.jar&lt;/a&gt;
and feed it to the &lt;em&gt;Settings -&amp;gt; Plugins -&amp;gt; Install plugin from disk&lt;/em&gt;
dialog.&lt;/p&gt;

&lt;p&gt;Happy GTD!&lt;/p&gt;
&lt;div class=&quot;feedflare&quot;&gt;
&lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://feeds.feedburner.com/~ff/Skuro?a=CJfGDMnQNMA:9fL3Bmj_PQ0:yIl2AUoC8zA&quot;&gt;&lt;img src=&quot;http://feeds.feedburner.com/~ff/Skuro?d=yIl2AUoC8zA&quot; border=&quot;0&quot;&gt;&lt;/a&gt; &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://feeds.feedburner.com/~ff/Skuro?a=CJfGDMnQNMA:9fL3Bmj_PQ0:V_sGLiPBpWU&quot;&gt;&lt;img src=&quot;http://feeds.feedburner.com/~ff/Skuro?i=CJfGDMnQNMA:9fL3Bmj_PQ0:V_sGLiPBpWU&quot; border=&quot;0&quot;&gt;&lt;/a&gt; &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://feeds.feedburner.com/~ff/Skuro?a=CJfGDMnQNMA:9fL3Bmj_PQ0:7Q72WNTAKBA&quot;&gt;&lt;img src=&quot;http://feeds.feedburner.com/~ff/Skuro?d=7Q72WNTAKBA&quot; border=&quot;0&quot;&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src=&quot;http://feeds.feedburner.com/~r/Skuro/~4/CJfGDMnQNMA&quot; height=&quot;1&quot; width=&quot;1&quot;/&gt;</description>
         <guid isPermaLink="false">http://skuro.tk/2012/09/08/org-mode-intellij-plugin/</guid>
         <pubDate>Fri, 07 Sep 2012 22:00:00 +0000</pubDate>
      </item>
      <item>
         <title>Alfresco Certified Engineer (ACE)</title>
         <link>http://onalfresco.blogspot.com/2012/09/alfresco-certified-engineer-ace.html</link>
         <description>&lt;div class=&quot;separator&quot; style=&quot;clear:both;text-align:center;&quot;&gt;&lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://1.bp.blogspot.com/-E2YatK2x4EQ/UEhsw8NZzdI/AAAAAAAAAI4/wTQNByM5gsc/s1600/ACE_logo.jpg&quot; style=&quot;clear:left;float:left;margin-bottom:1em;margin-right:1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;100&quot; src=&quot;http://1.bp.blogspot.com/-E2YatK2x4EQ/UEhsw8NZzdI/AAAAAAAAAI4/wTQNByM5gsc/s200/ACE_logo.jpg&quot; width=&quot;200&quot;/&gt;&lt;/a&gt;&lt;/div&gt;Proud moment for me to announce, became an Alfresco Certified Engineer yesterday. It had been a good experience to review where am I after working on Alfresco for last 4 years since Alfresco 2.1&lt;br /&gt;&lt;br /&gt;For whom, who are targeting for the certification, here are a few useful information. &lt;br /&gt;&lt;h3&gt;&amp;nbsp;&lt;/h3&gt;&lt;h3&gt;These are areas where you will be tested.&lt;/h3&gt;&lt;ul&gt;&lt;li&gt;The Alfresco architecture and Repository&lt;/li&gt;&lt;li&gt;Understand, design and create content models and custom object types and aspects&lt;/li&gt;&lt;li&gt;Package and deploy Alfresco extensions and modules&lt;/li&gt;&lt;li&gt;Develop extensions for the Alfresco Explorer Web Client&lt;/li&gt;&lt;li&gt;Develop applications and Services using the Alfresco APIs (Foundation Services, JCR, Web Services)&lt;/li&gt;&lt;li&gt;Understand, define, customize and deploy Advance Workflows and Task Models&lt;/li&gt;&lt;li&gt;Understand how workflows interact with content&lt;/li&gt;&lt;li&gt;Connect to external applications using Web Services and protocols like SOAP &amp;amp; CMIS&lt;/li&gt;&lt;/ul&gt;&lt;h3&gt;&lt;span style=&quot;color:white;&quot;&gt;. &lt;/span&gt;&lt;/h3&gt;&lt;h3&gt;There are 80 questions and you have 60 minutes to answer these. You need to secure at least 75% to become an ACE.&lt;/h3&gt;&lt;h3&gt;&lt;span style=&quot;color:white;&quot;&gt;. &lt;/span&gt;&lt;/h3&gt;&lt;h3&gt;These are courses that will help you to pass the certification&lt;/h3&gt;&lt;ul&gt;&lt;li&gt;Alfresco Fundamentals Course&lt;/li&gt;&lt;li&gt;Alfresco Web Scripts Course&lt;/li&gt;&lt;li&gt;the Alfresco Share Configuration Course&lt;/li&gt;&lt;li&gt;API Development Training Course&lt;/li&gt;&lt;li&gt;Alfresco Workflow Training Course&lt;/li&gt;&lt;/ul&gt;&lt;i&gt;However, there is no formal requirement or pre-requisite for these courses or training.&lt;/i&gt;&lt;br /&gt;&lt;h3&gt;&lt;span style=&quot;color:white;&quot;&gt;.&lt;/span&gt;&lt;/h3&gt;&lt;h3&gt;Here is the categories and divisions of areas the questions are structured in the certification.&lt;/h3&gt;&lt;table style=&quot;border-spacing:10px;border-style:solid;border-width:1px;&quot;&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;Architectural Core&lt;/td&gt;&lt;td&gt;39%&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Repository Customization&lt;/td&gt;&lt;td&gt;22%&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Web Scripting&lt;/td&gt;&lt;td&gt;13%&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;UI Customization&lt;/td&gt;&lt;td&gt;14%&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Web Services&lt;/td&gt;&lt;td&gt;12%&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;h3&gt;&lt;span style=&quot;color:white;&quot;&gt;. &lt;/span&gt;&lt;/h3&gt;&lt;h3&gt;Types of questions.&lt;/h3&gt;&lt;ul style=&quot;list-style-type:disc;&quot;&gt;&lt;li&gt; &lt;b&gt;Multiple Choice&lt;/b&gt; — you need to select one option that best answers the question or completes a statement.&lt;/li&gt;&lt;li&gt;&lt;b&gt;Multiple Responses&lt;/b&gt; — select more than one option that best answers the question or completes a statement. The text states how many options are correct, such as Choose two.&lt;/li&gt;&lt;li&gt;&lt;b&gt;Sample Directions&lt;/b&gt; — read the statement or question. From the response options, select the option(s) that represent the most correct or best answer(s) given the information provided.&lt;/li&gt;&lt;li&gt;&lt;b&gt;True/False&lt;/b&gt; — select either true or false as the answer.&lt;/li&gt;&lt;li&gt;&lt;b&gt;Hotspot &lt;/b&gt;— you have to click on the correct area within an image. There is only one correct answer to this type of question.&lt;/li&gt;&lt;/ul&gt;</description>
         <author>Snig Bhaumik</author>
         <guid isPermaLink="false">tag:blogger.com,1999:blog-3095692350172949352.post-4421179180115545093</guid>
         <pubDate>Thu, 06 Sep 2012 02:30:00 +0000</pubDate>
         <media:thumbnail height="72" url="http://1.bp.blogspot.com/-E2YatK2x4EQ/UEhsw8NZzdI/AAAAAAAAAI4/wTQNByM5gsc/s72-c/ACE_logo.jpg" width="72" xmlns:media="http://search.yahoo.com/mrss/"/>
      </item>
      <item>
         <title>Alfviral versión 1.1.0</title>
         <link>http://www.fegor.com/2012/09/alfviral-version-110.html</link>
         <description>Por fin el 21 de agosto liberé la versión 1.1.0 del módulo para escaneo de documentos mediante antivirus llamado Alfviral (el nombre a lo mejor no es muy apropiado pero fue el que se me ocurrió en ese momento).&lt;br /&gt;&lt;br /&gt;Básicamente lo que se ha incluido ha sido una pequeña refactorización del código y la inclusión de la posibilidad de poder escanear los documentos mediante la página &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://www.virustotal.com/&quot;&gt;www.virustotal.com&lt;/a&gt; que a su vez utiliza más de 40 motores de antivirus.&lt;br /&gt;&lt;br /&gt;&lt;div class=&quot;separator&quot; style=&quot;clear:both;text-align:center;&quot;&gt;&lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://4.bp.blogspot.com/-PV63eaycB5s/UERgTUnwTBI/AAAAAAAAATQ/3993nle2pCw/s1600/alfviral-behavior.png&quot; style=&quot;margin-left:1em;margin-right:1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;640&quot; src=&quot;http://4.bp.blogspot.com/-PV63eaycB5s/UERgTUnwTBI/AAAAAAAAATQ/3993nle2pCw/s640/alfviral-behavior.png&quot; width=&quot;611&quot;/&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;Las características actuales del módulo son:&lt;br /&gt;&lt;br /&gt;1. Escanear en base a tres modos distintos:&lt;br /&gt;&lt;br /&gt;COMMAND: Permite utilizar un script o directamente el programa ejecutable del antivirus que se quiera siempre y cuando permita al menos un parámetro que sea el fichero a escanear. Este proceso depende del arranque del comando antivirus en si.&lt;br /&gt;&lt;br /&gt;INSTREAM: Utilizado para lanzar un flujo de datos del fichero en Alfresco hacia el puerto (3310TCP) utilizado por ClamAV. Esto permite tener un antivirus ClamAV central en un servidor y utilizarlo remotamente desde Alfresco.&lt;br /&gt;&lt;br /&gt;VIRUSTOTAL: En este modo se sube el fichero que sube o se actualiza en Alfresco a la web virustotal.com vía HTTP mediante el método POST y se recoge el resultado mediante JSON para su análisis.&lt;br /&gt;&lt;br /&gt;2. Si el documento se detecta como infectado se añade el aspecto &quot;infected&quot; así como un aspecto adicional dependiendo del método utilizado para su análisis.&lt;br /&gt;&lt;br /&gt;3. Uso de las &quot;policies&quot; de Alfresco usando los métodos onContentUpdate y onContentRead para analizar los documentos que son subidos, modificados y/o leídos.&lt;br /&gt;&lt;br /&gt;4. Se puede utilizar el análisis mediante una programación de tiempo indicando a partir de qué espacio se quiere analizar y si se utiliza en profundidad, es decir, a los subespacios.&lt;br /&gt;&lt;br /&gt;5. Implemena acciones de usuario tanto en la interface /alfresco como en /share para poder analizar documentos de forma interactiva.&lt;br /&gt;&lt;br /&gt;6. Uso de reglas para personalizar los análisis utilizando la acción de escanear. &lt;br /&gt;&lt;br /&gt;7. Facilidad de instalación utilizando las Alfresco Module Management Tools para la parte de repositorio y copiando directamente una librería en extension/lib para Share.&lt;br /&gt;&lt;br /&gt;8. Configuración flexible y sencilla para establecer el modo de análisis y las formas en las que se quiere realizar el análisis:&lt;br /&gt;&lt;br /&gt;- Al subir/modificar un documento&lt;br /&gt;- Al leer un documento&lt;br /&gt;- En una programación horaria y/o de fecha concreta&lt;br /&gt;- Desde una carpeta (espacio de trabajo) en adelante&lt;br /&gt;&lt;br /&gt;Un ejemplo de configuración es:&lt;br /&gt;&lt;br /&gt;&lt;pre class=&quot;prettyprint&quot;&gt;&lt;span class=&quot;com&quot;&gt;# Command to exec, i.e. clamscan, alfviral.sh, etc.&lt;/span&gt;&lt;span class=&quot;pln&quot;&gt;&lt;br /&gt;alfviral&lt;/span&gt;&lt;span class=&quot;pun&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;pln&quot;&gt;command&lt;/span&gt;&lt;span class=&quot;pun&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;pln&quot;&gt;C&lt;/span&gt;&lt;span class=&quot;pun&quot;&gt;&amp;#92;:&amp;#92;&amp;#92;&lt;/span&gt;&lt;span class=&quot;typ&quot;&gt;Users&lt;/span&gt;&lt;span class=&quot;pun&quot;&gt;&amp;#92;&amp;#92;&lt;/span&gt;&lt;span class=&quot;pln&quot;&gt;fegor&lt;/span&gt;&lt;span class=&quot;pun&quot;&gt;&amp;#92;&amp;#92;&lt;/span&gt;&lt;span class=&quot;typ&quot;&gt;Documents&lt;/span&gt;&lt;span class=&quot;pun&quot;&gt;&amp;#92;&amp;#92;&lt;/span&gt;&lt;span class=&quot;pln&quot;&gt;alfviral&lt;/span&gt;&lt;span class=&quot;pun&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;pln&quot;&gt;bat&lt;br /&gt;&lt;/span&gt;&lt;span class=&quot;com&quot;&gt;# Config for ClamAV in stream data&lt;/span&gt;&lt;span class=&quot;pln&quot;&gt;&lt;br /&gt;alfviral&lt;/span&gt;&lt;span class=&quot;pun&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;pln&quot;&gt;timeout&lt;/span&gt;&lt;span class=&quot;pun&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;lit&quot;&gt;30000&lt;/span&gt;&lt;span class=&quot;pln&quot;&gt;&lt;br /&gt;alfviral&lt;/span&gt;&lt;span class=&quot;pun&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;pln&quot;&gt;host&lt;/span&gt;&lt;span class=&quot;pun&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;lit&quot;&gt;127.0&lt;/span&gt;&lt;span class=&quot;pun&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;lit&quot;&gt;0.1&lt;/span&gt;&lt;span class=&quot;pln&quot;&gt;&lt;br /&gt;alfviral&lt;/span&gt;&lt;span class=&quot;pun&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;pln&quot;&gt;port&lt;/span&gt;&lt;span class=&quot;pun&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;lit&quot;&gt;3310&lt;/span&gt;&lt;span class=&quot;pln&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span class=&quot;com&quot;&gt;#Config for VIRUSTOTAL&lt;/span&gt;&lt;span class=&quot;pln&quot;&gt;&lt;br /&gt;vt&lt;/span&gt;&lt;span class=&quot;pun&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;pln&quot;&gt;key&lt;/span&gt;&lt;span class=&quot;pun&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;lit&quot;&gt;246df658bca5e096895683c01ba4bd2eb3a00303b506bda774b71488134bf984&lt;/span&gt;&lt;span class=&quot;pln&quot;&gt;&lt;br /&gt;vt&lt;/span&gt;&lt;span class=&quot;pun&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;pln&quot;&gt;url&lt;/span&gt;&lt;span class=&quot;pun&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;pln&quot;&gt;https&lt;/span&gt;&lt;span class=&quot;pun&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;com&quot;&gt;//www.virustotal.com/vtapi/v2/file/scan&lt;/span&gt;&lt;span class=&quot;pln&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span class=&quot;com&quot;&gt;# Modes: COMMAND, INSTREAM, VIRUSTOTAL&lt;/span&gt;&lt;span class=&quot;pln&quot;&gt;&lt;br /&gt;alfviral&lt;/span&gt;&lt;span class=&quot;pun&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;pln&quot;&gt;mode&lt;/span&gt;&lt;span class=&quot;pun&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;pln&quot;&gt;VIRUSTOTAL&lt;br /&gt;&lt;/span&gt;&lt;span class=&quot;com&quot;&gt;# Events&lt;/span&gt;&lt;span class=&quot;pln&quot;&gt;&lt;br /&gt;alfviral&lt;/span&gt;&lt;span class=&quot;pun&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;pln&quot;&gt;on_update&lt;/span&gt;&lt;span class=&quot;pun&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;pln&quot;&gt;TRUE&lt;br /&gt;alfviral&lt;/span&gt;&lt;span class=&quot;pun&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;pln&quot;&gt;on_read&lt;/span&gt;&lt;span class=&quot;pun&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;pln&quot;&gt;FALSE&lt;br /&gt;&lt;/span&gt;&lt;span class=&quot;com&quot;&gt;# Scheduled action&lt;/span&gt;&lt;span class=&quot;pln&quot;&gt;&lt;br /&gt;alfviral&lt;/span&gt;&lt;span class=&quot;pun&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;pln&quot;&gt;scheduled&lt;/span&gt;&lt;span class=&quot;pun&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;pln&quot;&gt;pathQuery&lt;/span&gt;&lt;span class=&quot;pun&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;str&quot;&gt;/app:company_home/&lt;/span&gt;&lt;span class=&quot;pln&quot;&gt;st&lt;/span&gt;&lt;span class=&quot;pun&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;pln&quot;&gt;sites&lt;br /&gt;alfviral&lt;/span&gt;&lt;span class=&quot;pun&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;pln&quot;&gt;scheduled&lt;/span&gt;&lt;span class=&quot;pun&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;pln&quot;&gt;cronExpression&lt;/span&gt;&lt;span class=&quot;pun&quot;&gt;=*&lt;/span&gt;&lt;span class=&quot;pln&quot;&gt; &lt;/span&gt;&lt;span class=&quot;pun&quot;&gt;*&lt;/span&gt;&lt;span class=&quot;pln&quot;&gt; &lt;/span&gt;&lt;span class=&quot;lit&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;pln&quot;&gt; &lt;/span&gt;&lt;span class=&quot;pun&quot;&gt;*&lt;/span&gt;&lt;span class=&quot;pln&quot;&gt; &lt;/span&gt;&lt;span class=&quot;pun&quot;&gt;*&lt;/span&gt;&lt;span class=&quot;pln&quot;&gt; &lt;/span&gt;&lt;span class=&quot;pun&quot;&gt;?&lt;/span&gt;&lt;span class=&quot;pln&quot;&gt; &lt;/span&gt;&lt;span class=&quot;lit&quot;&gt;2099&lt;/span&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Toda la información tanto en español como en inglés está en la página principal del proyecto: &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://code.google.com/p/alfviral/&quot;&gt;http://code.google.com/p/alfviral/&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Como es un proyecto libre y personal las mejoras y nuevas funcionalidades dependen mucho de mi tiempo libre pero más o menos algunas ideas que tengo en mente son:&lt;br /&gt;&lt;br /&gt;- Añadir estadísticas sobre los documentos infectados&lt;br /&gt;- Posibilidad de mover los documentos infectados a un espacio de cuarentena&lt;br /&gt;- Recuperación de los documentos infectados a su ubicación original si son desinfectados o se eliminan los aspectos de infección. &lt;br /&gt;- Añadir nuevos protocolos de comunicación con antivirus (Symantec, McAfee,...)&lt;br /&gt;- Poder utilizar distintos modos de análisis al mismo tiempo y para diferentes objetos (espacios y ficheros)&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;</description>
         <author>Fernando González</author>
         <guid isPermaLink="false">tag:blogger.com,1999:blog-13003183.post-8915196463479838448</guid>
         <pubDate>Mon, 03 Sep 2012 07:30:00 +0000</pubDate>
         <media:thumbnail height="72" url="http://4.bp.blogspot.com/-PV63eaycB5s/UERgTUnwTBI/AAAAAAAAATQ/3993nle2pCw/s72-c/alfviral-behavior.png" width="72" xmlns:media="http://search.yahoo.com/mrss/"/>
      </item>
      <item>
         <title>Slides from Dispatch in Clojure</title>
         <link>http://feedproxy.google.com/~r/Skuro/~3/AFEq22VyqXU/</link>
         <description>&lt;h2&gt;Presentation slides&lt;/h2&gt;

&lt;p&gt;A bit late, and already announced
&lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;https://twitter.com/skuro/status/233285542769487875&quot;&gt;elsewhere&lt;/a&gt;, but
here you can find the slides from the &lt;em&gt;Dispatch in Clojure&lt;/em&gt;
presentation I gave at the
&lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://www.meetup.com/The-Amsterdam-Clojure-Meetup-Group/events/73689122/&quot;&gt;August 2012 meetup&lt;/a&gt;
of the
&lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://www.meetup.com/The-Amsterdam-Clojure-Meetup-Group/&quot;&gt;Amsterdam Clojurians&lt;/a&gt;
group. Hopefully it will ease you bearing to wait for the &lt;a rel=&quot;nofollow&quot;&gt;October
Amsterdam Clojure&lt;/a&gt; event later in October :-)&lt;/p&gt;

&lt;p&gt;The code samples I used in the presentation are available on &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;https://github.com/skuro/clj-dispatch&quot;&gt;GitHub&lt;/a&gt;.&lt;/p&gt;

 


&lt;h2&gt;The story behind&lt;/h2&gt;

&lt;p&gt;In a previous meetup a discussion arose about
&lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://clojure.org/protocols&quot;&gt;protocols&lt;/a&gt; and how they relate to
&lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://en.wikipedia.org/wiki/Mixin&quot;&gt;mixins&lt;/a&gt; in other languages such
as &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://www.ruby-lang.org/en/&quot;&gt;Ruby&lt;/a&gt;. A quick mention to virtual
methods dispatch table was enough to let my head spin around all the
details I was missing on low level Clojure mechanics. A presentation
was due.&lt;/p&gt;

&lt;h2&gt;What's in&lt;/h2&gt;

&lt;p&gt;What I was curious about, and eventually ended in the presentation, is
how Clojure implements function calls and method dispatch from both a
low level JVM and high level language syntax perspectives, and how
they relate to each other. What's (briefly) covered in the
presentation:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;JVM bytecodes used for method call&lt;/li&gt;
&lt;li&gt;plain &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://clojure.org/functional_programming&quot;&gt;function call&lt;/a&gt; in Clojure&lt;/li&gt;
&lt;li&gt;&lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://clojure.org/multimethods&quot;&gt;multimethods&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://clojure.org/Protocols&quot;&gt;protocols&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;


&lt;p&gt;What couldn't be entered in the presentation is the interesting
digressions we had during the meetup using an open REPL, some sample
projects and a Java decompiler.&lt;/p&gt;

&lt;p&gt;Video recordings are still a pending TODO in the meetup list, so if
you're around Amsterdam make sure you come and &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://www.meetup.com/The-Amsterdam-Clojure-Meetup-Group/&quot;&gt;join us&lt;/a&gt; for some other
awesome Dutch Clojure nights!&lt;/p&gt;
&lt;div class=&quot;feedflare&quot;&gt;
&lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://feeds.feedburner.com/~ff/Skuro?a=AFEq22VyqXU:i38Tf0KXzTo:yIl2AUoC8zA&quot;&gt;&lt;img src=&quot;http://feeds.feedburner.com/~ff/Skuro?d=yIl2AUoC8zA&quot; border=&quot;0&quot;&gt;&lt;/a&gt; &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://feeds.feedburner.com/~ff/Skuro?a=AFEq22VyqXU:i38Tf0KXzTo:V_sGLiPBpWU&quot;&gt;&lt;img src=&quot;http://feeds.feedburner.com/~ff/Skuro?i=AFEq22VyqXU:i38Tf0KXzTo:V_sGLiPBpWU&quot; border=&quot;0&quot;&gt;&lt;/a&gt; &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://feeds.feedburner.com/~ff/Skuro?a=AFEq22VyqXU:i38Tf0KXzTo:7Q72WNTAKBA&quot;&gt;&lt;img src=&quot;http://feeds.feedburner.com/~ff/Skuro?d=7Q72WNTAKBA&quot; border=&quot;0&quot;&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src=&quot;http://feeds.feedburner.com/~r/Skuro/~4/AFEq22VyqXU&quot; height=&quot;1&quot; width=&quot;1&quot;/&gt;</description>
         <guid isPermaLink="false">http://skuro.tk/2012/08/31/dispatch-in-clojure-presentation-slides/</guid>
         <pubDate>Thu, 30 Aug 2012 22:00:00 +0000</pubDate>
      </item>
      <item>
         <title>Fix Alfresco Share quick search</title>
         <link>http://loftux.com/2012/08/24/fix-alfresco-share-quick-search/</link>
         <description>Quick search in the Share (the little box in the top right) do not behave as most expect. When you enter multiple keywords, then Alfresco will search using OR. Which means that you get more hits with multiple keywords, not as you expect, results narrowed. So we need to get Alfresco to do AND by [...]</description>
         <guid isPermaLink="false">http://loftux.se/?p=920</guid>
         <pubDate>Fri, 24 Aug 2012 12:28:09 +0000</pubDate>
         <content:encoded><![CDATA[<p>Quick search in the Share (the little box in the top right) do not behave as most expect. When you enter multiple keywords, then Alfresco will search using OR. Which means that you get more hits with multiple keywords, not as you expect, results narrowed. So we need to get Alfresco to do AND by default between the keywords.</p>
<p>Now it is perfectly acceptable to write AND yourself between keywords (feel free to try), but we want it automatically. There is an issue <a rel="nofollow" title="ALF-6349" target="_blank" href="https://issues.alfresco.com/jira/browse/ALF-6349">ALF-6349</a> where it is described how it can be done generally to all searches by changing the Search.java to make it configurable via the bean definition. The problem with introducing the change is that when you have already selected a default (OR) you can not just change when a number of components and their adaptations may depend on current behavior, and we can have unexpected bugs.</p>
<p>My solution was instead to change only how Share quick search behaves, also here a change is needed for projects/repository/source/java/org/alfresco/repo/jscript/Search.java by extending the class when the search is done with the javascript search object to be able to take a new parameter, <code> andOperator: boolean optional, if true, use the AND operator, defaults to false (OR) </code>.<br />
Next file to change is projects/remote-api/config/alfresco/templates/webscripts/org/alfresco/slingshot/search/search.lib.js<br />
We can now use a parameter in the serach<br />
<code>var queryDef = {<br />
         query: ftsQuery,<br />
         language: "fts-alfresco",<br />
         page: {maxItems: params.maxResults * 2},    // allow for space for filtering out results<br />
         templates: getQueryTemplate(),<br />
         defaultField: "keywords",<br />
         onerror: "no-results",<br />
         sort: sortColumns,<br />
         andOperator: true<br />
      };</code><br />
In this file there is also one more change needed,<code>ftsQuery += ' AND (+TYPE:"cm:content" OR +TYPE:"cm:folder")'</code> an OR needs to be inserted here, else we get AND (since this is now default).<br />
The last file to change is projects/remote-api/config/alfresco/templates/webscripts/org/alfresco/slingshot/search/search.get.config.xml<br />
<code>&lt;search&gt;<br />
   &lt;default-query-template&gt;%(ALL)&lt;/default-query-template&gt;<br />
&lt;/search&gt;</code><br />
We need to change the default query template, else all terms will get AND and the results are no hits. But we instead use the magic keyword ALL, not only does our search work, it will automatically search all your custom metadata fields too (you can try this in the quick search using ALL:&lt;your term&gt;).</p>
<p>I will attach a complete diff for my changes to the issue <a rel="nofollow" title="ALF-6349" target="_blank" href="https://issues.alfresco.com/jira/browse/ALF-6349">ALF-6349</a>.</p>]]></content:encoded>
      </item>
      <item>
         <title>Hiding the Header bar of Alfresco Share portlets in Liferay</title>
         <link>http://onalfresco.blogspot.com/2012/08/hiding-header-bar-of-alfresco-share.html</link>
         <description>Recently I was creating a demo for one of our customers who wanted to use Share portlets in Liferay.&lt;br /&gt;&lt;br /&gt;Environment: Alfresco 4.0.2, Liferay 6.1.0&lt;br /&gt;&lt;br /&gt;The Share portlets were easily deployed and working in Liferay. However, the default Share header bar was not expected inside the portlet.&lt;br /&gt;&lt;div class=&quot;separator&quot; style=&quot;clear:both;text-align:center;&quot;&gt;&lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://3.bp.blogspot.com/-rHjyaqUVeTo/UDT_X45NqgI/AAAAAAAAAIY/8Rtt6ighfAU/s1600/Header.PNG&quot; style=&quot;clear:left;float:left;margin-bottom:1em;margin-right:1em;&quot;&gt;&lt;img border=&quot;1&quot; height=&quot;22&quot; src=&quot;http://3.bp.blogspot.com/-rHjyaqUVeTo/UDT_X45NqgI/AAAAAAAAAIY/8Rtt6ighfAU/s640/Header.PNG&quot; width=&quot;640&quot;/&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;It was presented like there are two navigation bars in your screen - one is from Liferay navigation, another of Share Header.&lt;br /&gt;&lt;br /&gt;Thus I needed to get rid of the header, but since the same page as of Share application is used in the portlet container as well, I couldn't simply get rid of the header.&lt;br /&gt;&lt;br /&gt;Added a few lines in &lt;span style=&quot;&quot;&gt;site-webscripts/org/alfresco/header.get.html.ftl&lt;/span&gt; file.&lt;br /&gt;&lt;br /&gt;&lt;div style=&quot;&quot;&gt;&amp;lt;#assign portlet = context.attributes.portletHost!false&amp;gt;&lt;br /&gt;&amp;lt;#if portlet&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;#assign todo=&quot;we are not displaying header in portlet context. so nothing to do&quot;&amp;gt;&lt;br /&gt;&amp;lt;#else&amp;gt;&lt;/div&gt;&lt;div style=&quot;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;#-- The original Header generator FTL code goes here --&amp;gt;&lt;/div&gt;&lt;span style=&quot;&quot;&gt;&amp;lt;/#if&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;It made the header bar not rendered while in Portlet, but the bar was as usual displayed in the Share application.&lt;br /&gt;&lt;div class=&quot;separator&quot; style=&quot;clear:both;text-align:center;&quot;&gt;&lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://1.bp.blogspot.com/-dO-UeVJt_2E/UDUDJ48tV-I/AAAAAAAAAIo/HfqtJpDMBKo/s1600/Screenshot.PNG&quot; style=&quot;clear:left;float:left;margin-bottom:1em;margin-right:1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;315&quot; src=&quot;http://1.bp.blogspot.com/-dO-UeVJt_2E/UDUDJ48tV-I/AAAAAAAAAIo/HfqtJpDMBKo/s640/Screenshot.PNG&quot; width=&quot;640&quot;/&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;</description>
         <author>Snig Bhaumik</author>
         <guid isPermaLink="false">tag:blogger.com,1999:blog-3095692350172949352.post-8642469614774058122</guid>
         <pubDate>Wed, 22 Aug 2012 09:06:00 +0000</pubDate>
         <media:thumbnail height="72" url="http://3.bp.blogspot.com/-rHjyaqUVeTo/UDT_X45NqgI/AAAAAAAAAIY/8Rtt6ighfAU/s72-c/Header.PNG" width="72" xmlns:media="http://search.yahoo.com/mrss/"/>
      </item>
      <item>
         <title>Setting user preferences via JavaScript Console</title>
         <link>http://blog.alfrescian.com/?p=210</link>
         <description>&lt;p&gt;While upgrading a huge Alfresco system from 3.4 to 4.0 I was asked if it is possible to collapse all sections (excepting the actions) on the document-details page.&lt;/p&gt;
&lt;p&gt;The state of these twisters is saved for each user in his preferences (preference: org.alfresco.share.twisters.collapsed), so I wrote a little script using the &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://code.google.com/p/share-extras/wiki/JavascriptConsole&quot;&gt;JavaScript Console&lt;/a&gt;:&lt;/p&gt;
&lt;pre class=&quot;wp-code-highlight prettyprint&quot;&gt;var docDetailsTwisters = [&amp;quot;DocumentTags&amp;quot;,&amp;quot;DocumentLinks&amp;quot;,&amp;quot;DocumentMetadata&amp;quot;,&amp;quot;DocumentPermissions&amp;quot;,&amp;quot;DocumentWorkflows&amp;quot;,&amp;quot;DocumentVersions&amp;quot;,&amp;quot;DocumentPublishing&amp;quot;];
var nodes = search.luceneSearch(&amp;#039;+TYPE:&amp;quot;cm:person&amp;quot;&amp;#039;);
logger.log(nodes.length);
for each(var node in nodes) {
    var userid = node.properties.userName;
    logger.log(userid);
    var twisterCollapPref = preferenceService.getPreferences(userid, &amp;quot;org.alfresco.share.twisters.collapsed&amp;quot;);
    var newTwisters;
    if (twisterCollapPref.org != null){
      var twistersToAdd = [];
      var twistersSet = twisterCollapPref.org.alfresco.share.twisters.collapsed;
      logger.log(&amp;quot;collapsed twisters: &amp;quot; + twistersSet);
      for each (var t in docDetailsTwisters){
        if (twistersSet.indexOf(t) == -1){
          twistersToAdd.push(t);
        }
      }
      newTwisters = twistersSet + (twistersToAdd.length &amp;amp;gt; 0 ? (&amp;quot;,&amp;quot; + twistersToAdd.join(&amp;quot;,&amp;quot;)) : &amp;quot;&amp;quot;);

    }
    else{
      newTwisters = docDetailsTwisters.join(&amp;quot;,&amp;quot;);
    }
  preferenceService.setPreferences(userid, {org :{alfresco : {share : {twisters : {collapsed : newTwisters}}}}});

  logger.log(&amp;quot;new collapsed twisters:&amp;quot; + newTwisters);
}&lt;/pre&gt;</description>
         <author>jan</author>
         <guid isPermaLink="false">http://blog.alfrescian.com/?p=210</guid>
         <pubDate>Fri, 03 Aug 2012 09:26:20 +0000</pubDate>
      </item>
      <item>
         <title>FlexibleDashboard+Liferay: Collaborative BI dashboards managed in Liferay</title>
         <link>http://integratedsemantics.org/2012/08/02/flexibledashboardliferay-collaborative-bi-dashboards-managed-in-liferay/</link>
         <description>&lt;p&gt;&lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://integratedsemantics.org/wp-content/uploads/2012/08/flexibledashboardliferay-100.png&quot; title=&quot;FlexibleDashboard+Liferay&quot;&gt;&lt;img src=&quot;http://integratedsemantics.org/wp-content/uploads/2012/08/flexibledashboardliferay-40.png&quot; alt=&quot;FlexibleDashboard+Liferay&quot;/&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://code.google.com/p/flexible-liferay/&quot;&gt;FlexibleDashboard+Liferay&lt;/a&gt; is an open source BI dashboard app / framework which supports dashboards layouts (user/group) managed in Liferay that can mix pure Flex FlexibleDashboard pods and regular Liferay portlets.  This used to be called FlexibleLiferay when it was only a Flex portal container / Liferay front end app for portals with only regular Liferay portlets.&lt;/p&gt;
&lt;p&gt;Placeholder &amp;#8220;flexpod&amp;#8221; portlets from the &amp;#8220;FlexibleDashboard+Liferay&amp;#8221; category can be added to a page/tab in the regular Liferay web UI, to configure BI dashboards.  Then in the FlexibleDashboard+Liferay Flex/AIR app the appropriate FlexibleDashboard Flex pod will be displayed instead of a portlet. A Flex pod means its a pure Flex module being displayed without being wrapped in a portlet / HTML.&lt;/p&gt;
&lt;p&gt;All these FlexibleDashboard Flex pods are supported:  bar/line chart, pie chart, grid and grid/chart with Spring ActionScript config of BlazeDS data sources, BIRT report, JasperReports report, OLAP pivot grid / XMLA query tool, Pentaho charts, calendar, local files, and HTML.&lt;/p&gt;
&lt;p&gt;Current limitations: pod.xml file configures on a portlet basis, would be better to have configurable properties on a portlet instance basis. Also module SWF files load from the Flex/AIR app dir, not from portlet web app dirs.&lt;/p&gt;</description>
         <author>admin</author>
         <guid isPermaLink="false">http://integratedsemantics.org/2012/08/02/flexibledashboardliferay-collaborative-bi-dashboards-managed-in-liferay/</guid>
         <pubDate>Fri, 03 Aug 2012 06:48:52 +0000</pubDate>
      </item>
      <item>
         <title>Alfresco Zimlet – updates and fixes</title>
         <link>http://louise.hu/poet/?p=5967</link>
         <description>I&amp;#8217;ve made an updated version of open-sourced Alfresco Zimlet. New features and fixes: SSO ticket based authentication support (&amp;#8216;alfresco_ticket&amp;#8217; and &amp;#8216;alfresco_url&amp;#8217; cookies) localization support (english and hungarian properties included) works with Alfresco 4.x and Zimbra 7.x bugfixes&amp;#8230; See README file for installation&amp;#8230; Alfresco side webscript installation steps: 1. Import web script package (ZIP) at Alfresco [...]</description>
         <guid isPermaLink="false">http://louise.hu/poet/?p=5967</guid>
         <pubDate>Fri, 06 Jul 2012 08:15:34 +0000</pubDate>
      </item>
      <item>
         <title>FlexibleShare updated</title>
         <link>http://integratedsemantics.org/2012/06/29/flexibleshare-updated/</link>
         <description>&lt;p&gt;&lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://code.google.com/p/flexibleshare/&quot; title=&quot;FlexibleShare Google Code Project&quot;&gt;FlexibleShare&lt;/a&gt; extends &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://code.google.com/p/flexible-dashboard/&quot; title=&quot;FlexibleDashboard&quot;&gt;FlexibleDashboard&lt;/a&gt; (dashboard framework, BI charting, reporting pods) with &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://code.google.com/p/flexspaces/&quot; title=&quot;FlexSpaces&quot;&gt;FlexSpaces&lt;/a&gt; doc management pods (Alfresco backend) and adds additional Flex pods for Share collaboration (Alfresco Share backend). All three of these projects are open source. FlexibleShare has been updated to use code from the latest versions of FlexSpaces and FlexibleDashboard, and the Share pods have added site selection drop downs.  Also added an  &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://addons.alfresco.com/addons/flexibleshare&quot; title=&quot;FlexibleShare Alfresco Add+Ons page&quot;&gt;Alfresco Add-Ons&lt;/a&gt; page for FlexibleShare.&lt;/p&gt;
&lt;p&gt;The doc management portion now has support for Alfresco 4.0, and a new preferences dialog for easier setup of server domain/port and API key setup of optional semantic auto-tagging with the &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://code.google.com/p/semantics4alfresco/&quot; title=&quot;OpenCalais Integration for Alfresco&quot;&gt;OpenCalais Integration&lt;/a&gt; for Alfresco. The default config in the flexibleShareAirPods.xml just has the combined multi-view FlexSpaces pod shown in the top left. This screenshot also shows the available search, tasks, and local files pods (the all repository doc lib pod is not shown). In the AIR version, files from the local files pod can be copied into a doc lib view via drag/drop. Also in the AIR version, multi-select files can be copied via drag / drop from the desktop into a doc lib view,  copied out via drag/drop, or the native desktop clipboard can be used to copy/paste of files between the desktop and a doc lib   (AIR can do more than the HTML5 drag in available in some browers).&lt;/p&gt;
&lt;p&gt;&lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://integratedsemantics.org/wp-content/uploads/2011/05/flexibleshareairbld4.png&quot; title=&quot;FlexibleShare FlexSpaces Doc Management&quot;&gt;&lt;img src=&quot;http://integratedsemantics.org/wp-content/uploads/2012/06/flexibleshareairbld4-33percent.png&quot; alt=&quot;flexibleshareairbld4-33percent.png&quot;/&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;The Share collaboration wiki, blog, discussions, doclib Flex pods are now more usable out of the box with added drop-downs to select Share site to work with (instead of setting the share site shortName in the pods xml file). More work is needed to hook up the calendar pod to load Share site calendar info (and an add event dialog is not available yet). Although the calendar pod is able to load iCalendar files, more work is needed to get it to work with the iCalendar data available from the Alfresco &amp;#8220;slingshot&amp;#8221; /calendar/eventList?site={shortName}&amp;amp;format=calendar webscript.&lt;/p&gt;
&lt;p&gt;&lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://integratedsemantics.org/wp-content/uploads/2012/06/flexiblesharesharepods.png&quot; title=&quot;FlexibleShare Share Collaboration&quot;&gt;&lt;img src=&quot;http://integratedsemantics.org/wp-content/uploads/2012/06/flexiblesharesharepods33.png&quot; alt=&quot;flexiblesharesharepods2.png&quot;/&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Planned for FlexibleShare:  calendar pod hookup with Share sites,   multiple repository support,  support for CMIS repositories, drag/drop copy between repositories, support for Alfresco Cloud repositories, multi-repository search,  Solr facets search navigation,  support for Apache Stanbol semantic auto-tagging / semantic search,  mobile/touch?, and a port/translation to HTML5 / CSS / JavaScript (FlexSpaces, CMIS Spaces, FlexibleDashboard, FlexibleShare).&lt;/p&gt;
&lt;p&gt;Steve Reiner&lt;br /&gt;
&lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://www.integratedsemantics.com&quot; title=&quot;Integrated Semantics&quot;&gt;Integrated Semantics&lt;/a&gt;&lt;br /&gt;
&lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://www.twitter.com/stevereiner&quot; title=&quot;@stevereiner on Twitter&quot;&gt;@stevereiner&lt;/a&gt; on twitter&lt;/p&gt;</description>
         <author>admin</author>
         <guid isPermaLink="false">http://integratedsemantics.org/2012/06/29/flexibleshare-updated/</guid>
         <pubDate>Fri, 29 Jun 2012 19:21:22 +0000</pubDate>
      </item>
      <item>
         <title>H2 support updated to the latest Alfresco versions</title>
         <link>http://feedproxy.google.com/~r/Skuro/~3/U1OT6VqKcgo/</link>
         <description>&lt;p&gt;&lt;strong&gt;tl;dr:&lt;/strong&gt; two new releases of &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;https://github.com/skuro/alfresco-h2-support&quot;&gt;H2 Support&lt;/a&gt; are available, to support both Alfresco v4.0.1 and v4.0.2 Enterprise edition&lt;/p&gt;

&lt;p&gt;Time flies, and (good) software always keeps a fast development pace. This applies to &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://www.alfresco.com&quot;&gt;Alfresco&lt;/a&gt;, which released a couple of Enterprise versions since I last updated the &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;https://github.com/skuro/alfresco-h2-support&quot;&gt;H2 Support&lt;/a&gt; module. Promptly, &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;https://twitter.com/#!/pjlucidi&quot;&gt;Piergiorgio Lucidi&lt;/a&gt; &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://code.google.com/p/maven-alfresco-archetypes/issues/detail?id=94&quot;&gt;found out&lt;/a&gt; that the latest H2 Support version was incompatible with Alfresco v4.0.2. Time for a new release.&lt;/p&gt;

&lt;h2&gt;Double rainbows&lt;/h2&gt;

&lt;p&gt;Last time I released H2 Support Alfresco was still on v4.0.0, with v4.0.1 and v4.0.2 already released in the meanwhile. The effort to upgrade H2 Support is fairly trivial, as it only requires some diff&amp;amp;merge of DB related configuration from the original Alfresco codebase to H2 Support sources. Hence, not one but &lt;strong&gt;two&lt;/strong&gt; releases of H2 Support were issued today, namely&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;https://github.com/skuro/alfresco-h2-support/tree/v1.4&quot;&gt;v1.4&lt;/a&gt; -- H2 Support for Alfresco v4.0.2&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;https://github.com/skuro/alfresco-h2-support/tree/v1.3&quot;&gt;v1.3&lt;/a&gt; -- H2 Support for Alfresco v4.0.1&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;


&lt;p&gt;As usual, please refer to the &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;https://github.com/skuro/alfresco-h2-support/wiki/H2-Database-support-for-Alfresco&quot;&gt;official documentation&lt;/a&gt; for matching H2 Support and Alfresco versions.&lt;/p&gt;

&lt;h2&gt;Availability on Central&lt;/h2&gt;

&lt;p&gt;The new releases are already available on OSS Sonatype &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;https://oss.sonatype.org/content/groups/public/tk/skuro/alfresco/h2-support/&quot;&gt;maven repository&lt;/a&gt;. Give it enough time and they'll end up in Maven Central.&lt;/p&gt;
&lt;div class=&quot;feedflare&quot;&gt;
&lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://feeds.feedburner.com/~ff/Skuro?a=U1OT6VqKcgo:ThQZGZ22-iE:yIl2AUoC8zA&quot;&gt;&lt;img src=&quot;http://feeds.feedburner.com/~ff/Skuro?d=yIl2AUoC8zA&quot; border=&quot;0&quot;&gt;&lt;/a&gt; &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://feeds.feedburner.com/~ff/Skuro?a=U1OT6VqKcgo:ThQZGZ22-iE:V_sGLiPBpWU&quot;&gt;&lt;img src=&quot;http://feeds.feedburner.com/~ff/Skuro?i=U1OT6VqKcgo:ThQZGZ22-iE:V_sGLiPBpWU&quot; border=&quot;0&quot;&gt;&lt;/a&gt; &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://feeds.feedburner.com/~ff/Skuro?a=U1OT6VqKcgo:ThQZGZ22-iE:7Q72WNTAKBA&quot;&gt;&lt;img src=&quot;http://feeds.feedburner.com/~ff/Skuro?d=7Q72WNTAKBA&quot; border=&quot;0&quot;&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src=&quot;http://feeds.feedburner.com/~r/Skuro/~4/U1OT6VqKcgo&quot; height=&quot;1&quot; width=&quot;1&quot;/&gt;</description>
         <guid isPermaLink="false">http://skuro.tk/2012/06/27/h2-support-for-the-lates-alfresco-versions/</guid>
         <pubDate>Tue, 26 Jun 2012 22:00:00 +0000</pubDate>
      </item>
      <item>
         <title>Improving Alfresco datalist performance</title>
         <link>http://www.techbits.de/2012/06/26/improving-alfresco-datalist-performance/</link>
         <description>Let&amp;#8217;s talk about Datalists&amp;#8230; (yes, that was a reference to the wat talk). If you have worked with Datalists in Alfresco and added more than a few hundred rows to a table (maybe even more than 1000) you&amp;#8217;ll have noticed &amp;#8230; &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://www.techbits.de/2012/06/26/improving-alfresco-datalist-performance/&quot;&gt;Continue reading &lt;span class=&quot;meta-nav&quot;&gt;&amp;#8594;&lt;/span&gt;&lt;/a&gt;</description>
         <guid isPermaLink="false">http://www.techbits.de/?p=423</guid>
         <pubDate>Tue, 26 Jun 2012 12:33:02 +0000</pubDate>
         <content:encoded><![CDATA[<p>Let&#8217;s talk about Datalists&#8230; (yes, that was a reference to <a rel="nofollow" target="_blank" href="https://www.destroyallsoftware.com/talks/wat">the wat talk</a>). If you have worked<br />
with Datalists in Alfresco and added more than a few hundred rows to a table (maybe even more than 1000) you&#8217;ll have noticed a significant increase in loading time. To understand why that is, let&#8217;s a have a look whats going on behind the scenes when you open a datalist in the grid view:</p>
<ul>
<li>The webscript e.g. /datalists/data/node/workspace/SpacesStore/dae615e9-1d08-483f-a19b-69b30b5bffed (that&#8217;s the Datalist&#8217;s nodeRef) is called</li>
<li>A list of columns (from Share&#8217;s form configuration) and filter criteria are sent to the repository as well</li>
<li>The repository webscript runs a lucene search (using the filter criteria, if set)</li>
<li>It loops over the result</li>
<li>for each result Evaluator.run() (from evaluator.lib.js) is called</li>
<li>Evaluator.run() uses the FormService to build the fields</li>
<li>The FormService builds the complete form from the datamodel (including model, data values, contraints)</li>
<li>For each field with a ListConstraints alle the values are localized (new in 3.4.8)</li>
<li>A ListValueConstraint&#8217;s getAllowedValues() and getDisplayLabel() are called potentially thousands of times.</li>
</ul>
<h1>What we know</h1>
<p>What&#8217;s wrong here? Several things. It starts with the search which is not very fast. In Alfresco 3.4.x a <strong>lucene PATH query</strong> is used here which is known to not be very fast, espcially with large repositories or when the lucene index is not stored on a really fast disk. For the document library <a rel="nofollow" target="_blank" href="http://ecmarchitect.com/archives/2011/04/13/1331">Jeff Potts has suggested to use node.children</a> instead of the lucnene PATH query to speed things up. Of course this only works if no filters are used.</p>
<p>Another issue with the search that adds to the performance problems of the datalists, is, that the whole datalist is read into the browser at once. There is <strong>no server side paging</strong> implemented for datalists which means that if you have 1000 rows in the datalist you have to wait for the browser to load all the 1000 rows before the first 50 are displayed. Stefano Argentiero has suggested a <a rel="nofollow" target="_blank" href="http://lab.qbrgroup.it/alfresco-share-datalist-paginazione-server-side/">modification to the Alfresco datalist to add server side pagination</a> which whould also help speeding up the datalist rendering.</p>
<p>Stefano Argentiero realized that running the Evaluator.run() function for each row takes a lot of time, but why is that? The Evaluator function <strong>calls the FormService</strong> for each row and constructs the whole form. This means that all field defintions are built, including contraints and for ListContraints even all the individual contraint values are collected. Since the fields are only displayed in the datalist (mode=&#8221;view&#8221;) these contraints values are never needed at all.</p>
<h1>The new localization doesn&#8217;t help</h1>
<p>With a change in Alfresco 3.4.9 (<a rel="nofollow" target="_blank" href="https://issues.alfresco.com/jira/browse/ALF-9514?focusedCommentId=169413&amp;page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel#comment-169413">ALF-9514</a>) each of these <strong>contraint values are even localized</strong>. That means if you have 1000 rows in the table and one field with a list contraint of 100 values (not uncommon) your ListContraint&#8217;s getDisplayLabel() and getAllowedValues() methods are easily called 100000 times when the datalist model is built in the webscript.</p>
<p>Anyone <strong>upgrading to Alfresco &gt;=3.4.8</strong> who is using custom ListContraints should make sure that&#8230;</p>
<ul>
<li>Your getAllowedValues() method returns a cached List as quickly as possible</li>
<li>If you don&#8217;t need localized constraint values overwrite the getDisplayLabel() method to simply return the value to skip the localization code.</li>
</ul>
<h1>What can be done?</h1>
<p>Apart from the issues that this new localization introduced I still wanted to have the datalist displayed as fast as possible. Calling the <strong>FormService</strong> and building the whole form over and over again for each row didn&#8217;t strike me as a smart approach. I looked into the evaluator.lib.js to see if can be <strong>removed</strong> for good <img src='http://www.techbits.de/wp-includes/images/smilies/icon_wink.gif' alt=';-)' class='wp-smiley'/> </p>
<p>This is the block from evaluator.lib.js calls the FormService and extracts the data that is returned:</p>
<pre>// Use the form service to parse the required properties
scriptObj = formService.getForm("node", node.nodeRef, fields, fields);

// Make sure we can quickly look-up the Field Definition within the formData loop...
var objDefinitions = {};
for each (formDef in scriptObj.fieldDefinitions)
{
 objDefinitions[formDef.dataKeyName] = formDef;
}

// Populate the data model
var formData = scriptObj.formData.data;
for (var k in formData)
{
 var isAssoc = k.indexOf("assoc") == 0,
	value = formData[k].value,
	values,
	type = isAssoc ? objDefinitions[k].endpointType : objDefinitions[k].dataType,
	endpointMany = isAssoc ? objDefinitions[k].endpointMany : false,
	objData =
	{
	   type: type
	};

 if (value instanceof java.util.Date)
 {
	objData.value = utils.toISO8601(value);
	objData.displayValue = objData.value;
	nodeData[k] = objData;
 }
 else if (endpointMany)
 {
	if (value.length() &gt; 0)
	{
	   values = value.split(",");
	   nodeData[k] = [];
	   for each (value in values)
	   {
		  var objLoop =
		  {
			 type: objData.type,
			 value: value,
			 displayValue: value
		  };

		  if (Evaluator.decorateFieldData(objLoop, node))
		  {
			 nodeData[k].push(objLoop);
		  }
	   }
	}
 }
 else
 {
	objData.value = value;
	objData.displayValue = objData.value;

	if (Evaluator.decorateFieldData(objData, node))
	{
	   nodeData[k] = objData;
	}
 }
}</pre>
<p>This can be easily replaced by that following block of code which doesn&#8217;t use the FormService at all:</p>
<pre>// Populate the data model
for each(k in fields)
{
 var value = node.properties[k], objData = {};
 if (value) {
	var formkey = "prop_" + k.replace(":", "_");

	if (typeof value == "boolean") {
		objData.type = "boolean";
		objData.value = value;
		objData.displayValue = objData.value;
		nodeData[formkey] = objData;
	}
	else if (value &amp;&amp; value.getMonth)
	{
	objData.type = "date";
		objData.value = utils.toISO8601(value);
		objData.displayValue = objData.value;
		nodeData[formkey] = objData;
	}
	else
	{
		objData.type = "text";
		objData.value = value ? value : "";
		objData.displayValue = objData.value;
		if (Evaluator.decorateFieldData(objData, node))
		{
			nodeData[formkey] = objData;
		}
	}
}
else {
	var assoc = node.assocs[k];
	if (assoc &amp;&amp; assoc.length &gt; 0) {

		var formkey = "assoc_" + k.replace(":", "_");
		nodeData[formkey] = [];

		for each(var value in assoc) {

			objData.type = value.typeShort;
			objData.value = value.nodeRef;
			objData.displayValue = objData.value;
			if (Evaluator.decorateFieldData(objData, value))
			{
				nodeData[formkey].push(objData);
			}
		}
	}
}
}</pre>
<h1>Does it help?</h1>
<p>I tested this change using a datalist with 1000 rows and 6 columns with one column having a list contraint (about 30 values). With this configuration the original webscript returned in about 2.4s (on a fast dev system). Using my patched evalator.lib.js without the call to the FormService the same datagrid is displayed in 870ms. This is <strong>more than a 2x increase</strong> in performance. Depending on the number of rows and constraints your results may vary.</p>
<p>I didn&#8217;t need all the features that can be modeled in the datalist so this change does <strong>NOT support all the features</strong> of the original implementation:</p>
<ul>
<li>Multivalue properties are currently not supported (could be easily added)</li>
<li>NodeRef properties are currently not supported (could be easily added)</li>
<li>You can not change the datalists values in the grid using FormFilters any more</li>
<li>maybe other things are broken&#8230;</li>
</ul>
<p>Maybe this well help some of you out there to improve the performance of the datalists in your Alfresco solutions.</p>
<p>&nbsp;</p>]]></content:encoded>
      </item>
      <item>
         <title>FlexibleDashboard now has Mobile AIR support for iOS/iPads and Android Tablets</title>
         <link>http://integratedsemantics.org/2012/06/17/flexibledashboard-now-has-mobile-air-support-for-iosipads-and-android-tablets/</link>
         <description>&lt;p&gt;&lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://code.google.com/p/flexible-dashboard/&quot; title=&quot;FlexibleDashboard on Google Code&quot;&gt;FlexibleDashboard&lt;/a&gt;, an open source dashboard project for BI dashboards/mashups, etc., now has a Flex Mobile AIR version in addition to Desktop (Desktop AIR and Flex in browser) versions. An Android build is available for download, and the iOS version can be built from the common source.&lt;/p&gt;
&lt;p&gt;FlexibleDashboard used the esria dashboard as a starting point and evolved it with added flexmdi cascade/tile (esria pod drag/drop in tile mode), more pods, both Flex in Browser and Flex+AIR versions, port from Flex 3 to Flex 4,  and pods in separate Flex modules. Example pods using Spring ActionScript to have different configs for individual pods and config of a simple IDataService with either SOAP, XML, or RemoteObject BlazeDS datasources (see GridPod and ChartGridPod) were also added.&lt;/p&gt;
&lt;p&gt;FlexibleDashboard has the following pods: esria charting pods with quietly scheming animation (line, bar, pie charts),  JasperReports viewer, BIRT Report viewer, OLAP pivotable grid with XMLA datasource support and MDX query editor (from Grebulon sourceforge project), Pentaho Charts sample, a simple BlazeDS data pod, Flex SWF pod, Calendar, HTML viewing (IFrame, AIR HTML, mobile StageWebView versions),  and some AIR only (Desktop and Mobile) pods (HTML browser, Google gadgets, Liferay portlet widget, and Local Files browser).&lt;/p&gt;
&lt;p&gt;For mobile, only the bare minimum was done: pod min/max/close button hit areas was increased and mobile versions of pods displaying HTML were created (the snapshot feature of the flexcapacitor WebView Flex UIComponent StageWebView wrapper helped to support cascading mode html pods with only the topmost being in StageWebVeiw mode and the other being in bitmap snapshot mode.) Other pods were unchanged and don&amp;#8217;t have mobile specific UI (but stuff still works, even  mx chart drill down with touch).  Also, the original app projects were split into separate app / library / modules projects to facilitate sharing with the new mobile app / library projects.&lt;/p&gt;
&lt;p&gt;It took an error message on iOS about not being able to load module SWF (Duh!) to get me to change the mobile project to link pod code instead of loading modules. Android Mobile AIR was able to load modules, but mobile Flex app projects in Flash Builder doesn&amp;#8217;t have module setup and won&amp;#8217;t build the app using framework RSL even though its in the UI. So I ended up just having a single mobile app project for both iOS and Android that doesn&amp;#8217;t use modules (desktop AIR and in-browser Flex app projects still use modules).&lt;/p&gt;
&lt;p&gt;Plan in the future to have some sort of HTML5/JS Dashboard project like FlexibleDashboard   (with web app and PhoneGap mobile app variations).  Also plan to add support for semantic data sources / semantic data integration, and more visualization support.&lt;/p&gt;
&lt;p&gt;Steve Reiner&lt;/p&gt;
&lt;p&gt;Integrated Semantics&lt;/p&gt;
&lt;p&gt;&lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://www.twitter.com/stevereiner&quot; title=&quot;www.twitter.com/stevereiner&quot;&gt;@stevereiner on Twitter&lt;/a&gt;&lt;/p&gt;</description>
         <author>admin</author>
         <guid isPermaLink="false">http://integratedsemantics.org/2012/06/17/flexibledashboard-now-has-mobile-air-support-for-iosipads-and-android-tablets/</guid>
         <pubDate>Mon, 18 Jun 2012 07:31:46 +0000</pubDate>
      </item>
      <item>
         <title>How to add custom Share site presets (the nice way) - Alfresco Hack #5</title>
         <link>http://thinkalfresco.blogspot.com/2012/06/alfresco-hack-5-how-to-add-custom-share.html</link>
         <description>[See here about my post about the &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://thinkalfresco.blogspot.de/2012/04/ecm-marketplace-for-alfresco-modules.html&quot;&gt;benefits of the b2b marketplace for Alfresco modules and solutions&lt;/a&gt;.]&lt;br /&gt;
[Check out our newest&amp;nbsp;&lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://www.ecm-market.de/email-for-share.html&quot;&gt;module for email management and archiving with Alfresco&lt;/a&gt;]&lt;br /&gt;
[See here about our even newer &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://www.ecm-market.de/alfresco-module/tools/trashcan-manager.html?___store=english&quot;&gt;module for automatic trashcan management with Alfresco&lt;/a&gt;]&lt;br /&gt;
&lt;br /&gt;
This blog post will explain in depth a way to add custom site presets to Alfresco share as nice as possible. Nice here means, to play well with others:&lt;br /&gt;
&lt;ul&gt;
&lt;li&gt;use the extension mechanism&lt;/li&gt;
&lt;li&gt;do not overwrite any existing configuration files&lt;/li&gt;
&lt;li&gt;do not overwrite any Alfresco Spring beans&lt;/li&gt;
&lt;/ul&gt;
&lt;div&gt;
This way, many modules can be deployed independently to Alfresco without interfering, each providing a new site preset.&lt;br /&gt;
&lt;br /&gt;
Currently, as of Alfresco 4.0dCE and 4.0.1EE it is not possible to add presets through the share extension mechanism alone. &lt;br /&gt;
&lt;br /&gt;
&lt;div&gt;
A common requirement of anybody who likes to  customize Alfresco share is to provide custom site presets. For example,  show the links-Page besides the document library per default. Or to  present a specialized page targeting a specific use case. A common  requirement for&amp;nbsp;ourselves&amp;nbsp;and the &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://www.ecm-market.de/?___store=english&quot;&gt;ecm Market &lt;/a&gt;vendors as well.&lt;/div&gt;
&lt;h3&gt;




&lt;br /&gt;
&lt;/h3&gt;
&lt;h3&gt;




    What is a share site preset?&lt;/h3&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
A site preset contains the initial configuration of a site: The site dashboard layout, and any preconfigured site dashlets. The initial set of site pages can be set as well. Examples for existing site pages are the document library page, the calendar, the wiki, the datalist page. It is an easy way to add your custom requirements to a site. So, to sum it up, a site preset is maybe better unterstood as a site type, because it captures all behaviour that makes it special (or different) from others. And of course, multiple sites can be instantiated from the site type.&lt;br /&gt;
&lt;h3&gt;




&lt;br /&gt;
&lt;/h3&gt;
&lt;h3&gt;




    How to create a share site preset?&lt;/h3&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
The steps are simple as noted below - but to play nice with other, care must be taken to not override files and spring beans: &lt;/div&gt;
&lt;div&gt;
&lt;ol&gt;
&lt;li&gt;Create a preset file containing the XML configuration of your site : &lt;span style=&quot;font-family:'Courier New', Courier, monospace;&quot;&gt;my-custom-presets.xml.&amp;nbsp;&lt;/span&gt;A good starting point is to copy the existing presets.xml and remove all&amp;nbsp;unnecessary configuration&amp;nbsp;&lt;/li&gt;
&lt;li&gt;Create an extension to augment the presets UI dialog controller with your new site data.&lt;/li&gt;
&lt;li&gt;Add our new presets file to the list of preset files that the share preset manager recognizes.&lt;/li&gt;
&lt;/ol&gt;
Steps 1 and 2 can be done without overwriting any files using the existing share extension mechanism, but step 3 would need to overwrite the presets manager bean named &lt;span style=&quot;font-family:'Courier New', Courier, monospace;&quot;&gt;webframework.presets.manager&lt;/span&gt;&lt;span style=&quot;font-family:inherit;&quot;&gt;&lt;span style=&quot;font-family:inherit;&quot;&gt; to add the new preset&lt;/span&gt;&lt;span style=&quot;font-family:'Courier New', Courier, monospace;&quot;&gt;.&lt;/span&gt;&lt;/span&gt; This is the presets manager bean (it is part of surf located in the spring-surf-1.0.0.jar) as it comes with alfresco:&lt;br /&gt;
&lt;br /&gt;
&lt;style&gt;
.usageExample {
border:1px solid #e8e8e8;background-color:#f7f7f7;margin-left:20px;margin-right:20px;padding:15px;}
&lt;/style&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;usageExample&quot;&gt;
&lt;span style=&quot;font-family:'Courier New', Courier, monospace;&quot;&gt;&amp;nbsp; &amp;nbsp;&amp;lt;!-- Presets manager - configured to walk a search path for preset definition files --&amp;gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family:'Courier New', Courier, monospace;&quot;&gt;&amp;nbsp; &amp;nbsp;&amp;lt;bean id=&quot;webframework.presets.manager&quot; class=&quot;org.springframework.extensions.surf.PresetsManager&quot;&amp;gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family:'Courier New', Courier, monospace;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;lt;property name=&quot;modelObjectService&quot; ref=&quot;webframework.service.modelobject&quot; /&amp;gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family:'Courier New', Courier, monospace;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;lt;property name=&quot;searchPath&quot; ref=&quot;webframework.presets.searchpath&quot; /&amp;gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family:'Courier New', Courier, monospace;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;lt;property name=&quot;files&quot;&amp;gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family:'Courier New', Courier, monospace;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;lt;list&amp;gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family:'Courier New', Courier, monospace;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;lt;value&amp;gt;presets.xml&amp;lt;/value&amp;gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family:'Courier New', Courier, monospace;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;lt;/list&amp;gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family:'Courier New', Courier, monospace;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;lt;/property&amp;gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family:'Courier New', Courier, monospace;&quot;&gt;&amp;nbsp; &amp;nbsp;&amp;lt;/bean&amp;gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
Out of the box, it would be possible to place a file named presets.xml in a package named alfresco/site-data/presets or alfresco/web-extension/site-data/presets - which is resolved by the the search path. But because the file name is fixed to &lt;span style=&quot;font-family:'Courier New', Courier, monospace;&quot;&gt;presets.xml&lt;/span&gt; it is not possible to deploy multiple presets without overwriting each other. But to the rescue comes the tool I introduced in the blog post&amp;nbsp;&lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://thinkalfresco.blogspot.de/2012/05/augmenting-alfresco-spring-bean.html&quot;&gt;Augmenting Alfresco Spring Bean configuration without overwriting beans&lt;/a&gt;. This litte class will add the my-custom-presets.xml file the the presets manager bean on startup dynamically, so that the original bean must not be overridden:&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
&lt;div class=&quot;usageExample&quot;&gt;
&lt;span style=&quot;font-family:'Courier New', Courier, monospace;&quot;&gt;&amp;lt;bean id=&quot;ecm4u.custom.presets&quot;&lt;/span&gt;&lt;span class=&quot;Apple-tab-span&quot; style=&quot;font-family:'Courier New', Courier, monospace;white-space:pre;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;font-family:'Courier New', Courier, monospace;&quot;&gt;class=&quot;de.ecm4u.alfresco.utils.spring.AddToListPropertyPostProcessor&quot;&amp;gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family:'Courier New', Courier, monospace;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;lt;property name=&quot;beanName&quot; value=&quot;webframework.presets.manager&quot; /&amp;gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family:'Courier New', Courier, monospace;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;lt;property name=&quot;propertyName&quot; value=&quot;files&quot; /&amp;gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family:'Courier New', Courier, monospace;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;lt;property name=&quot;position&quot; value=&quot;-1&quot; /&amp;gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family:'Courier New', Courier, monospace;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;lt;property name=&quot;additionalProperties&quot;&amp;gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family:'Courier New', Courier, monospace;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;lt;list&amp;gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family:'Courier New', Courier, monospace;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;lt;value&amp;gt;my-custom-presets.xml&amp;lt;/value&amp;gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family:'Courier New', Courier, monospace;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;lt;/list&amp;gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family:'Courier New', Courier, monospace;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;lt;/property&amp;gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family:'Courier New', Courier, monospace;&quot;&gt;&amp;lt;/bean&amp;gt;&lt;/span&gt;&lt;/div&gt;
&lt;br /&gt;
A module using this tooling plays nice with others, because no overwriting as taken place.&lt;br /&gt;
&lt;br /&gt;
&lt;h4&gt;




Back to step 2, &amp;nbsp;creating the share extension to augment the site creation controller with the new site:&lt;/h4&gt;
Place a file my-custom-extension.xml into &lt;span style=&quot;font-family:'Courier New', Courier, monospace;&quot;&gt;alfresco/site-data/extensions/&lt;/span&gt;&lt;span style=&quot;font-family:inherit;&quot;&gt; with the following contents. It is a share extension with a single package customization.&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family:'Courier New', Courier, monospace;&quot;&gt;&lt;br /&gt;
&lt;/span&gt;&lt;br /&gt;
&lt;div class=&quot;usageExample&quot;&gt;
&lt;span class=&quot;s1&quot; style=&quot;font-family:'Courier New', Courier, monospace;&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;font-family:'Courier New', Courier, monospace;&quot;&gt;extension&lt;/span&gt;&lt;span class=&quot;s1&quot; style=&quot;font-family:'Courier New', Courier, monospace;&quot;&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;
&lt;div class=&quot;p1&quot;&gt;
&lt;span style=&quot;font-family:'Courier New', Courier, monospace;&quot;&gt;&lt;span class=&quot;s2&quot;&gt;&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;lt;&lt;/span&gt;modules&lt;span class=&quot;s1&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;p1&quot;&gt;
&lt;span style=&quot;font-family:'Courier New', Courier, monospace;&quot;&gt;&lt;span class=&quot;s2&quot;&gt;&lt;span class=&quot;Apple-tab-span&quot;&gt;&lt;/span&gt;&lt;span class=&quot;Apple-tab-span&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;lt;&lt;/span&gt;module&lt;span class=&quot;s1&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;p2&quot;&gt;
&lt;span style=&quot;font-family:'Courier New', Courier, monospace;&quot;&gt;&lt;span class=&quot;Apple-tab-span&quot;&gt;&lt;/span&gt;&lt;span class=&quot;Apple-tab-span&quot;&gt;&lt;/span&gt;&lt;span class=&quot;Apple-tab-span&quot;&gt;&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;lt;&lt;/span&gt;&lt;span class=&quot;s3&quot;&gt;id&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;&amp;gt;my-custom-site-preset&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&quot;s3&quot;&gt;id&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;p3&quot;&gt;
&lt;span class=&quot;s1&quot; style=&quot;font-family:'Courier New', Courier, monospace;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;lt;&lt;/span&gt;&lt;span style=&quot;font-family:'Courier New', Courier, monospace;&quot;&gt;auto-deploy&lt;/span&gt;&lt;span class=&quot;s1&quot; style=&quot;font-family:'Courier New', Courier, monospace;&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;s2&quot; style=&quot;font-family:'Courier New', Courier, monospace;&quot;&gt;true&lt;/span&gt;&lt;span class=&quot;s1&quot; style=&quot;font-family:'Courier New', Courier, monospace;&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span style=&quot;font-family:'Courier New', Courier, monospace;&quot;&gt;auto-deploy&lt;/span&gt;&lt;span class=&quot;s1&quot; style=&quot;font-family:'Courier New', Courier, monospace;&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;p1&quot;&gt;
&lt;span style=&quot;font-family:'Courier New', Courier, monospace;&quot;&gt;&lt;span class=&quot;s2&quot;&gt;&lt;span class=&quot;Apple-tab-span&quot;&gt;&lt;/span&gt;&lt;span class=&quot;Apple-tab-span&quot;&gt;&lt;/span&gt;&lt;span class=&quot;Apple-tab-span&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;lt;&lt;/span&gt;customizations&lt;span class=&quot;s1&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;p1&quot;&gt;
&lt;span style=&quot;font-family:'Courier New', Courier, monospace;&quot;&gt;&lt;span class=&quot;s2&quot;&gt;&lt;span class=&quot;Apple-tab-span&quot;&gt;&lt;/span&gt;&lt;span class=&quot;Apple-tab-span&quot;&gt;&lt;/span&gt;&lt;span class=&quot;Apple-tab-span&quot;&gt;&lt;/span&gt;&lt;span class=&quot;Apple-tab-span&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;lt;&lt;/span&gt;customization&lt;span class=&quot;s1&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;background-color:transparent;font-family:'Courier New', Courier, monospace;&quot;&gt;&lt;span class=&quot;s1&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;lt;&lt;/span&gt;targetPackageRoot&lt;span class=&quot;s1&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;org.alfresco.modules&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;&amp;lt;/&lt;/span&gt;targetPackageRoot&lt;span class=&quot;s1&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;background-color:transparent;font-family:'Courier New', Courier, monospace;&quot;&gt;&lt;span class=&quot;s1&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;lt;&lt;/span&gt;&lt;span class=&quot;s3&quot;&gt;sourcePackageRoot&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;&amp;gt;&lt;/span&gt;ecm4u.samples.custom.modules&lt;/span&gt;&lt;span class=&quot;s1&quot; style=&quot;background-color:transparent;font-family:'Courier New', Courier, monospace;&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span style=&quot;background-color:transparent;font-family:'Courier New', Courier, monospace;&quot;&gt;sourcePackageRoot&lt;/span&gt;&lt;span class=&quot;s1&quot; style=&quot;background-color:transparent;font-family:'Courier New', Courier, monospace;&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;p1&quot;&gt;
&lt;span style=&quot;font-family:'Courier New', Courier, monospace;&quot;&gt;&lt;span class=&quot;s2&quot;&gt;&lt;span class=&quot;Apple-tab-span&quot;&gt;&lt;/span&gt;&lt;span class=&quot;Apple-tab-span&quot;&gt;&lt;/span&gt;&lt;span class=&quot;Apple-tab-span&quot;&gt;&lt;/span&gt;&lt;span class=&quot;Apple-tab-span&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;lt;/&lt;/span&gt;customization&lt;span class=&quot;s1&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;p1&quot;&gt;
&lt;span style=&quot;font-family:'Courier New', Courier, monospace;&quot;&gt;&lt;span class=&quot;s2&quot;&gt;&lt;span class=&quot;Apple-tab-span&quot;&gt;&lt;/span&gt;&lt;span class=&quot;Apple-tab-span&quot;&gt;&lt;/span&gt;&lt;span class=&quot;Apple-tab-span&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;lt;/&lt;/span&gt;customizations&lt;span class=&quot;s1&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;p1&quot;&gt;
&lt;span style=&quot;font-family:'Courier New', Courier, monospace;&quot;&gt;&lt;span class=&quot;s2&quot;&gt;&lt;span class=&quot;Apple-tab-span&quot;&gt;&lt;/span&gt;&lt;span class=&quot;Apple-tab-span&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;lt;/&lt;/span&gt;module&lt;span class=&quot;s1&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;p1&quot;&gt;
&lt;span style=&quot;font-family:'Courier New', Courier, monospace;&quot;&gt;&lt;span class=&quot;s1&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;lt;/modules&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;p1&quot;&gt;
&lt;span style=&quot;font-family:'Courier New', Courier, monospace;&quot;&gt;&lt;span class=&quot;s1&quot;&gt;&amp;lt;/extension&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
To finally make your site preset available for selection in the share create site dialog, a short javascript snippet is needed. Add this snippet to a file named &lt;span style=&quot;font-family:'Courier New', Courier, monospace;&quot;&gt;create-site.get.js&lt;/span&gt; into a package &lt;span style=&quot;font-family:'Courier New', Courier, monospace;&quot;&gt;webscripts.ecm4u.sampels.custom.modules&lt;/span&gt;:&lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;usageExample&quot;&gt;
&lt;span class=&quot;s1&quot; style=&quot;background-color:transparent;font-family:'Courier New', Courier, monospace;&quot;&gt;if&lt;/span&gt;&lt;span style=&quot;background-color:transparent;font-family:'Courier New', Courier, monospace;&quot;&gt;(model.sitePresets) {&lt;/span&gt;&lt;br /&gt;
&lt;div class=&quot;p2&quot;&gt;
&lt;span style=&quot;font-family:'Courier New', Courier, monospace;&quot;&gt;&lt;span class=&quot;s2&quot;&gt;&lt;span class=&quot;Apple-tab-span&quot;&gt;&lt;/span&gt;&amp;nbsp; &amp;nbsp; model.sitePresets.push({&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;p2&quot;&gt;
&lt;span style=&quot;font-family:'Courier New', Courier, monospace;&quot;&gt;&lt;span class=&quot;s2&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; id: &lt;/span&gt;&quot;my-custom-preset-id&quot;&lt;span class=&quot;s2&quot;&gt;,&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;p2&quot;&gt;
&lt;span style=&quot;font-family:'Courier New', Courier, monospace;&quot;&gt;&lt;span class=&quot;s2&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; name: &quot;My custom site&quot;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;p2&quot;&gt;
&lt;span style=&quot;font-family:'Courier New', Courier, monospace;&quot;&gt;&lt;span class=&quot;s2&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; });&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;p1&quot;&gt;
&lt;span style=&quot;font-family:'Courier New', Courier, monospace;&quot;&gt;}&lt;/span&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;
&lt;div&gt;
&lt;h4&gt;




Back to step 1, creating the presets description file:&lt;/h4&gt;
&lt;/div&gt;
&lt;div&gt;
How a presets file might actually look like is shown here. Add this file at &lt;span style=&quot;font-family:'Courier New', Courier, monospace;&quot;&gt;alfresco/site-data/presets&lt;/span&gt; and name it &lt;span style=&quot;font-family:'Courier New', Courier, monospace;&quot;&gt;my-custom-presets.xml&lt;/span&gt;:&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
Please note, that the preset id has to match the id parameter of the script customization above.&lt;br /&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
&lt;div class=&quot;usageExample&quot;&gt;
&lt;div class=&quot;p1&quot;&gt;
&lt;span class=&quot;s1&quot;&gt;&amp;lt;?&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;xml&lt;/span&gt;&lt;span class=&quot;s3&quot;&gt; &lt;/span&gt;version&lt;span class=&quot;s3&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;s4&quot;&gt;'1.0'&lt;/span&gt;&lt;span class=&quot;s3&quot;&gt; &lt;/span&gt;encoding&lt;span class=&quot;s3&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;s4&quot;&gt;'UTF-8'&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;?&amp;gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;p2&quot;&gt;
&lt;span class=&quot;s1&quot;&gt;&amp;lt;&lt;/span&gt;presets&lt;span class=&quot;s1&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;p3&quot;&gt;
&lt;span class=&quot;s3&quot;&gt;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;preset&lt;/span&gt;&lt;span class=&quot;s3&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s5&quot;&gt;id&lt;/span&gt;&lt;span class=&quot;s3&quot;&gt;=&lt;/span&gt;&quot;&lt;b&gt;my-custom-preset-id&lt;/b&gt;&quot;&lt;span class=&quot;s1&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;p4&quot;&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class=&quot;s1&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;components&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;&amp;gt;&lt;/span&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;p5&quot;&gt;
&lt;span class=&quot;s3&quot;&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&amp;lt;!-- title --&amp;gt;&lt;/div&gt;
&lt;div class=&quot;p4&quot;&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class=&quot;s1&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;component&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;p4&quot;&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class=&quot;s1&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;scope&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;&amp;gt;&lt;/span&gt;page&lt;span class=&quot;s1&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;scope&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;p2&quot;&gt;
&lt;span class=&quot;s3&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;&amp;lt;&lt;/span&gt;region-id&lt;span class=&quot;s1&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;s3&quot;&gt;title&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;&amp;lt;/&lt;/span&gt;region-id&lt;span class=&quot;s1&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;p4&quot;&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class=&quot;s1&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;source-id&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;&amp;gt;&lt;/span&gt;site/${&lt;span class=&quot;s6&quot;&gt;siteid&lt;/span&gt;}/&lt;span class=&quot;s6&quot;&gt;dashboard&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;source-id&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;p4&quot;&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class=&quot;s1&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;url&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;&amp;gt;&lt;/span&gt;/components/title/collaboration-title&lt;span class=&quot;s1&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;url&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;p4&quot;&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class=&quot;s1&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;component&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;p5&quot;&gt;
&lt;span class=&quot;s3&quot;&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&amp;lt;!-- navigation --&amp;gt;&lt;/div&gt;
&lt;div class=&quot;p4&quot;&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class=&quot;s1&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;component&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;p4&quot;&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class=&quot;s1&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;scope&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;&amp;gt;&lt;/span&gt;page&lt;span class=&quot;s1&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;scope&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;p4&quot;&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class=&quot;s1&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;region-id&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;&amp;gt;&lt;/span&gt;navigation&lt;span class=&quot;s1&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;region-id&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;p4&quot;&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class=&quot;s1&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;source-id&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;&amp;gt;&lt;/span&gt;site/${&lt;span class=&quot;s6&quot;&gt;siteid&lt;/span&gt;}/&lt;span class=&quot;s6&quot;&gt;dashboard&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;source-id&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;p4&quot;&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class=&quot;s1&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;url&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;&amp;gt;&lt;/span&gt;/components/navigation/collaboration-navigation&lt;span class=&quot;s1&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;url&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;p4&quot;&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class=&quot;s1&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;component&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;p5&quot;&gt;
&lt;span class=&quot;s3&quot;&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&amp;lt;!-- &lt;span class=&quot;s6&quot;&gt;dashboard&lt;/span&gt; components --&amp;gt;&lt;/div&gt;
&lt;div class=&quot;p4&quot;&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class=&quot;s1&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;component&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;p4&quot;&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class=&quot;s1&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;scope&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;&amp;gt;&lt;/span&gt;page&lt;span class=&quot;s1&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;scope&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;p4&quot;&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class=&quot;s1&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;region-id&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;&amp;gt;&lt;/span&gt;full-width-&lt;span class=&quot;s6&quot;&gt;dashlet&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;region-id&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;p4&quot;&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class=&quot;s1&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;source-id&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;&amp;gt;&lt;/span&gt;site/${&lt;span class=&quot;s6&quot;&gt;siteid&lt;/span&gt;}/&lt;span class=&quot;s6&quot;&gt;dashboard&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;source-id&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;p4&quot;&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class=&quot;s1&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;url&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;&amp;gt;&lt;/span&gt;/components/&lt;span class=&quot;s6&quot;&gt;dashlets&lt;/span&gt;/dynamic-welcome&lt;span class=&quot;s1&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;url&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;p4&quot;&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class=&quot;s1&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;properties&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;p2&quot;&gt;
&lt;span class=&quot;s3&quot;&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;&amp;lt;&lt;/span&gt;dashboardType&lt;span class=&quot;s1&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;s3&quot;&gt;site&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;&amp;lt;/&lt;/span&gt;dashboardType&lt;span class=&quot;s1&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;p4&quot;&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class=&quot;s1&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;properties&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;p4&quot;&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class=&quot;s1&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;component&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;p4&quot;&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class=&quot;s1&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;component&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;p4&quot;&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class=&quot;s1&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;scope&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;&amp;gt;&lt;/span&gt;page&lt;span class=&quot;s1&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;scope&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;p4&quot;&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class=&quot;s1&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;region-id&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;&amp;gt;&lt;/span&gt;component-1-1&lt;span class=&quot;s1&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;region-id&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;p4&quot;&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class=&quot;s1&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;source-id&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;&amp;gt;&lt;/span&gt;site/${&lt;span class=&quot;s6&quot;&gt;siteid&lt;/span&gt;}/&lt;span class=&quot;s6&quot;&gt;dashboard&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;source-id&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;p4&quot;&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class=&quot;s1&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;url&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;&amp;gt;&lt;/span&gt;/components/&lt;span class=&quot;s6&quot;&gt;dashlets&lt;/span&gt;/colleagues&lt;span class=&quot;s1&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;url&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;p4&quot;&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class=&quot;s1&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;properties&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;p4&quot;&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class=&quot;s1&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;height&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;&amp;gt;&lt;/span&gt;504&lt;span class=&quot;s1&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;height&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;p4&quot;&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class=&quot;s1&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;properties&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;p4&quot;&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class=&quot;s1&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;component&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;p4&quot;&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class=&quot;s1&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;component&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;p4&quot;&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class=&quot;s1&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;scope&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;&amp;gt;&lt;/span&gt;page&lt;span class=&quot;s1&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;scope&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;p4&quot;&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class=&quot;s1&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;region-id&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;&amp;gt;&lt;/span&gt;component-2-1&lt;span class=&quot;s1&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;region-id&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;p4&quot;&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class=&quot;s1&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;source-id&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;&amp;gt;&lt;/span&gt;site/${&lt;span class=&quot;s6&quot;&gt;siteid&lt;/span&gt;}/&lt;span class=&quot;s6&quot;&gt;dashboard&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;source-id&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;p4&quot;&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class=&quot;s1&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;url&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;&amp;gt;&lt;/span&gt;/components/&lt;span class=&quot;s6&quot;&gt;dashlets&lt;/span&gt;/&lt;span class=&quot;s6&quot;&gt;docsummary&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;url&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;p4&quot;&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class=&quot;s1&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;component&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;p4&quot;&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class=&quot;s1&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;component&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;p4&quot;&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class=&quot;s1&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;scope&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;&amp;gt;&lt;/span&gt;page&lt;span class=&quot;s1&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;scope&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;p4&quot;&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class=&quot;s1&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;region-id&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;&amp;gt;&lt;/span&gt;component-2-2&lt;span class=&quot;s1&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;region-id&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;p4&quot;&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class=&quot;s1&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;source-id&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;&amp;gt;&lt;/span&gt;site/${&lt;span class=&quot;s6&quot;&gt;siteid&lt;/span&gt;}/&lt;span class=&quot;s6&quot;&gt;dashboard&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;source-id&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;p4&quot;&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class=&quot;s1&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;url&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;&amp;gt;&lt;/span&gt;/components/&lt;span class=&quot;s6&quot;&gt;dashlets&lt;/span&gt;/&lt;span class=&quot;s6&quot;&gt;activityfeed&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;url&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;p4&quot;&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class=&quot;s1&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;component&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;p2&quot;&gt;
&lt;span class=&quot;s3&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;&amp;lt;/&lt;/span&gt;components&lt;span class=&quot;s1&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;p4&quot;&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class=&quot;s1&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;pages&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;p3&quot;&gt;
&lt;span class=&quot;s3&quot;&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;page&lt;/span&gt;&lt;span class=&quot;s3&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s5&quot;&gt;id&lt;/span&gt;&lt;span class=&quot;s3&quot;&gt;=&lt;/span&gt;&quot;site/${siteid}/dashboard&quot;&lt;span class=&quot;s1&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;p4&quot;&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class=&quot;s1&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;title&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;&amp;gt;&lt;/span&gt;Collaboration &lt;span class=&quot;s6&quot;&gt;lodda&lt;/span&gt;&amp;nbsp; Site &lt;span class=&quot;s6&quot;&gt;Dashboard&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;title&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;p4&quot;&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class=&quot;s1&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;description&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;&amp;gt;&lt;/span&gt;Collaboration &lt;span class=&quot;s6&quot;&gt;lodda&lt;/span&gt; site's &lt;span class=&quot;s6&quot;&gt;dashboard&lt;/span&gt; page&lt;span class=&quot;s1&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;description&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;p4&quot;&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class=&quot;s1&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;template-instance&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;s6&quot;&gt;dashboard&lt;/span&gt;-2-columns-wide-right&lt;span class=&quot;s1&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;template-instance&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;p2&quot;&gt;
&lt;span class=&quot;s3&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;&amp;lt;&lt;/span&gt;authentication&lt;span class=&quot;s1&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;s3&quot;&gt;user&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;&amp;lt;/&lt;/span&gt;authentication&lt;span class=&quot;s1&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;p4&quot;&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class=&quot;s1&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;properties&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;p4&quot;&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class=&quot;s1&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;sitePages&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;&amp;gt;&lt;/span&gt;[{&quot;pageId&quot;:&quot;&lt;span class=&quot;s6&quot;&gt;documentlibrary&lt;/span&gt;&quot;}, {&quot;pageId&quot;:&quot;links&quot;}]&lt;span class=&quot;s1&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;sitePages&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;p4&quot;&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class=&quot;s1&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;properties&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;p4&quot;&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class=&quot;s1&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;page&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;p4&quot;&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class=&quot;s1&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;pages&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;p2&quot;&gt;
&lt;span class=&quot;s3&quot;&gt;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;&amp;lt;/&lt;/span&gt;preset&lt;span class=&quot;s1&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;p2&quot;&gt;
&lt;span class=&quot;s1&quot;&gt;&amp;lt;/&lt;/span&gt;presets&lt;span class=&quot;s1&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;
Quite some lengthy steps, to sum up:&lt;br /&gt;
&lt;br /&gt;
&lt;ul&gt;
&lt;li&gt;a presets file describing your site preset configuration&lt;/li&gt;
&lt;li&gt;a share extension configuration&lt;/li&gt;
&lt;li&gt;a spring bean definition to use the Spring&amp;nbsp;&lt;span style=&quot;background-color:white;color:#333333;font-size:13px;line-height:16px;text-align:left;&quot;&gt;&lt;span style=&quot;font-family:'Courier New', Courier, monospace;&quot;&gt;&lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://thinkalfresco.blogspot.de/2012/05/augmenting-alfresco-spring-bean.html&quot;&gt;AddToListPropertyPostProcessor&lt;/a&gt;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;span style=&quot;color:#333333;font-family:inherit;&quot;&gt;&lt;span style=&quot;line-height:16px;&quot;&gt;But you will be able to let your users to create sites of a new type. New site types are a perfect way to introduce new functionality and use case into Alfresco. And because no files will be overwritten using this approach, it is possible to create different AMP files, each of it containing a new site type.&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;color:#333333;font-family:inherit;&quot;&gt;&lt;span style=&quot;line-height:16px;&quot;&gt;&lt;br /&gt;
&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;color:#333333;&quot;&gt;&lt;span style=&quot;line-height:16px;&quot;&gt;Let me know if it works - but also if it not works of course;)&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;color:#333333;&quot;&gt;&lt;span style=&quot;line-height:16px;&quot;&gt;&lt;br /&gt;
&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;color:#333333;&quot;&gt;&lt;span style=&quot;line-height:16px;&quot;&gt;One thing that comes to mind - the share extension has to be activated. To activate the module automatically on share startup, add this to your shared/classes/alfresco/web-extension/share-config-custom.xml file:&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;color:#333333;&quot;&gt;&lt;span style=&quot;line-height:16px;&quot;&gt;&lt;br /&gt;
&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;div class=&quot;usageExample&quot;&gt;
&lt;span style=&quot;color:#333333;&quot;&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;color:#333333;&quot;&gt;&lt;span style=&quot;line-height:16px;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;lt;config evaluator=&quot;string-compare&quot; condition=&quot;WebFramework&quot;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;color:#333333;&quot;&gt;&lt;span style=&quot;line-height:16px;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;lt;web-framework&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;color:#333333;&quot;&gt;&lt;span style=&quot;line-height:16px;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;lt;module-deployment&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;color:#333333;&quot;&gt;&lt;span style=&quot;line-height:16px;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;lt;mode&amp;gt;manual&amp;lt;/mode&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;color:#333333;&quot;&gt;&lt;span style=&quot;line-height:16px;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;lt;enable-auto-deploy-modules&amp;gt;true&amp;lt;/enable-auto-deploy-modules&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;color:#333333;&quot;&gt;&lt;span style=&quot;line-height:16px;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;lt;/module-deployment&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;color:#333333;&quot;&gt;&lt;span style=&quot;line-height:16px;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;lt;/web-framework&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;color:#333333;&quot;&gt;&lt;span style=&quot;line-height:16px;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;lt;/config&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;div style=&quot;line-height:16px;&quot;&gt;
&lt;span style=&quot;color:#333333;&quot;&gt;&lt;br /&gt;
&lt;/span&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;br /&gt;
&lt;span style=&quot;color:#333333;font-family:inherit;&quot;&gt;&lt;span style=&quot;line-height:16px;&quot;&gt;&lt;br /&gt;
&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;color:#333333;font-family:inherit;&quot;&gt;&lt;span style=&quot;line-height:16px;&quot;&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;</description>
         <author>noreply@blogger.com (Lothar Märkle)</author>
         <guid isPermaLink="false">tag:blogger.com,1999:blog-3862704576763351872.post-3615687216662853108</guid>
         <pubDate>Fri, 08 Jun 2012 20:40:00 +0000</pubDate>
      </item>
      <item>
         <title>OpenCalais Integration updated for Alfresco 4.0 and added use of new Share config mechanism. Apache Stanbol Plans</title>
         <link>http://integratedsemantics.org/2012/06/05/opencalais-integration-updated-for-alfresco-40-and-added-use-of-new-share-config-mechanism-apache-stanbol-plans/</link>
         <description>&lt;p&gt;The OpenCalais Integration for &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://www.alfresco.com&quot; title=&quot;Alfresco&quot;&gt;Alfresco&lt;/a&gt; was finally updated for Alfresco 4.0 . Given the shift away from the Alfresco Forge to the Alfresco Add+Ons catalog site, the new home for the OpenCalais integration is now on a  &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://code.google.com/p/semantics4alfresco/&quot; title=&quot;OpenCalais Integration on Semantics4Alfresco Google Code&quot;&gt;Google Code&lt;/a&gt; site pointed to by its &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://addons.alfresco.com/addons/opencalais-integration&quot; title=&quot;OpenCalais Integration Add+Ons Page&quot;&gt;add+ons&lt;/a&gt; page&lt;/p&gt;
&lt;p&gt;For Alfresco 4.0 with Solr enabled, an issue was fixed. (Some code that needed to get to newly added top level semantic tag categories right away needed to change to use a CategoryService API instead of using a search query since there is added delay in indexing. Changing the alfresco.cron  value  in solrcore.properties from 15 secs to 150 secs helped to get something that was intermittent to be reproducible every time.)&lt;/p&gt;
&lt;p&gt;The Share Integration (semantic tag cloud dashlet, semantic geo-tagged map dashlet, auto-tag action menu in doc libraries and repository) was updated to use the new doclib action config mechanism added in 4.0 . Its much nicer to put an added action menu in a web-extension/share-config-custom.xml file than to setup the  modified versions of actions-common.get.head.ftl , documentlist.get.config.xml, etc in web-extension.  (Helpful &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://ecmstuff.blogspot.co.uk/2012/04/adding-document-library-actions-in.html&quot; title=&quot;ECM Stuff&quot;&gt;ECM Stuff blog post&lt;/a&gt; on Share action config in Alfresco 4.0)&lt;/p&gt;
&lt;p&gt;To use the free OpenCalais service, you need to get an API key from  &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://www.opencalais.com/&quot; title=&quot;OpenCalais&quot;&gt;opencalais.com&lt;/a&gt;  This allows you to submit 50,000 documents a day. More requests are supported in the non free version called Calais vs. the free (but not open source) service called OpenCalais. Note that document size per submission is to 100k bytes in all versions, the service retains extracted metadata (doesn&amp;#8217;t retain content). So its geared more for news articles than large sensitive documents.  Calais has a &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://viewer.opencalais.com/&quot; title=&quot;OpenCalais test page&quot;&gt;test page&lt;/a&gt; to try out giving it text and seeing what it extracts.&lt;/p&gt;
&lt;p&gt;To use the Share auto-tag action menu  (used to do a one time auto-tag on a document) you need a Calais api key setup in module&amp;#92;calais&amp;#92;module-context.xml  (see readme.txt).  Semantic tags will be listed in the properties section of a Share document details page  (not with regular tag UI since a different category content model / custom root category is used for semantic tags). You can also add one or more semantic tag clouds dashlets and a semantic geo-tagged map dashlet to share dashboards (site and/or global) to navigate from semantic tags to documents.   In explorer, doing a one time auto-tag you need to used the run a rule on a doc action and give the Calais key each time in the dialog.   A  rule to auto-tag documents in a folder can be setup in Explorer or Share (using the &amp;#8220;Auto-tag with Calais&amp;#8221; action, and you need to give the Calais api key as a parameter to this).&lt;/p&gt;
&lt;p&gt;FlexSpaces has support for the OpenCalais integration in all its versions (desktop AIR client, Flex in-browser, Mobile AIR).  Like Share it supports semantic tag clouds, a semantic geo-tagged map, and one time auto-tagging like Share. It has additional OpenCalais features: semantic tag suggestion, adding / removing semantic tags on a document.  You can setup a Calais api key (and Alfresco server info) in FlexSpaces preferences dialog that was added in the 2012.02.08 version and avoid having to do this in FlexSpacesConfig.xml . Info entered is sticky and per user on their local machine (stored in a Local Shared Object). So theoretically each user could submit 50,000 documents a day to OpenCalais if they each signed up for a key.  &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://code.google.com/p/flexibleshare/&quot; title=&quot;FlexibleShare&quot;&gt;FlexibleShare&lt;/a&gt; includes FlexSpaces and its semantic features, but hasn&amp;#8217;t been updated with the preferences dialog or other recent FlexSpaces changes yet (&lt;strong&gt;update&lt;/strong&gt;: FlexibleShare 6/28/2012 version now has the preferences dialog and Alfresco 4.0 support too).&lt;/p&gt;
&lt;p&gt;&lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://integratedsemantics.org/wp-content/uploads/2012/06/prefs-dialog.png&quot; title=&quot;FlexSpaces Preferences Dialog&quot;&gt;&lt;img src=&quot;http://integratedsemantics.org/wp-content/uploads/2012/06/prefs-dialog2.png&quot; alt=&quot;FlexSpaces Preferences Dialog&quot;/&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Plan to have an Alfresco integration with &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://incubator.apache.org/stanbol/&quot;&gt;Apache Stanbol&lt;/a&gt; on the same &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://code.google.com/p/semantics4alfresco/&quot; title=&quot;Semantics4Alfresco Google Code&quot;&gt;Semantics4Alfresco Google Code&lt;/a&gt;  site with the OpenCalais integration.  Apache Stanbol (derived from the IKS project) is fully open source, is a general stack of frameworks for semantic content management and can do more than content enhancement,  can get around the drawbacks of OpenCalais, and gives you more flexibility to setup customized ontologies vs. the fixed support Calias has. Stanbol can also call other enhancement engines instead of the default OpenNLP or even chain them together. Stanbol has an adapter for OpenCalais. For enhancing news, OpenCalais works better out of the box than OpenNLP.   Zaizi has already done Stanbol integration work, although only a version for an old IKS version is currently open source.  Integrated Semantics will leverage  / extend any newer Stanbol integration that Zaizi makes available open source.  A Stanbol integration could extend Solr facets with semantic facets.&lt;/p&gt;</description>
         <author>admin</author>
         <guid isPermaLink="false">http://integratedsemantics.org/2012/06/05/opencalais-integration-updated-for-alfresco-40-and-added-use-of-new-share-config-mechanism-apache-stanbol-plans/</guid>
         <pubDate>Wed, 06 Jun 2012 07:44:17 +0000</pubDate>
      </item>
      <item>
         <title>Legacy artifacts repository update: going remote</title>
         <link>http://feedproxy.google.com/~r/Skuro/~3/07CcjUdzuF0/</link>
         <description>&lt;h1&gt;The case against&lt;/h1&gt;

&lt;p&gt;After &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://skuro.tk/2012/05/14/legacy-libraries-for-your-maven-build/&quot;&gt;showing&lt;/a&gt; how to use your version control repository to host legacy libraries, &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://discursive.com/&quot;&gt;Tim O'Brien&lt;/a&gt; made a case against its use mentioning how a maintenance hell it would be to use such a strategy, and that a repository manager like &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://www.sonatype.org/nexus&quot;&gt;Nexus&lt;/a&gt; or &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://www.jfrog.com/index.php&quot;&gt;Artifactory&lt;/a&gt; is the preferred solution. After all, with a local repository in your sources you're indeed unable to &lt;strong&gt;download&lt;/strong&gt; the JAR, so that any dependent project wouldn't be able to compile against your transitive dependencies. Isn't it part of the maven revolution to never, ever check in your libraries in your VCS?&lt;/p&gt;

&lt;h1&gt;The case for&lt;/h1&gt;

&lt;p&gt;When your project has a mid-big scale, and you depend on a tens of legacy/funny libraries that the whole Internet can't provide, which are maybe still likely to get updates, you should &lt;del&gt;question your project&lt;/del&gt; take the chance to leverage a repository manager. But, if your project is relatively small, with just a bunch of stray dependencies and no access to a repository manager for any reason, there's little value to gain from building an infrastructure around your JARs, and you can easily leverage a piece of infrastructure you're most likely to have already: your remote or centralized VCS repository.&lt;/p&gt;

&lt;h1&gt;[Not only] Github&lt;/h1&gt;

&lt;p&gt;While &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;https://github.com/&quot;&gt;Github&lt;/a&gt; is my source hosting service of choice, and I'm sticking to it for the sake of my example, the strategy is not limited to it, and as long as you have plain HTTP access to your source files you can create such an integration. &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://code.google.com/p/maven-svn-wagon/wiki/MavenRepositoryInsideGoogleCode&quot;&gt;SVN on Google Code&lt;/a&gt; is just another option.&lt;/p&gt;

&lt;p&gt;That said, let's get to the juicy part. The main problem with a &lt;code&gt;file://&lt;/code&gt; based repository is that absolute URLs and locality of artifacts get in the way of other people leveraging your project, eventually breaking transitive dependencies access. The trick is then to just point to the remote location where your sources are already hosted and available, still exploiting the Maven repository layout. As already explained &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://cemerick.com/2010/08/24/hosting-maven-repos-on-github/&quot;&gt;elsewhere&lt;/a&gt;, here's the &lt;code&gt;&amp;lt;repository&amp;gt;&lt;/code&gt; definition to put in your POM in case you're on Github:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;&amp;lt;repository&amp;gt;
    &amp;lt;id&amp;gt;repo&amp;lt;/id&amp;gt;
    &amp;lt;url&amp;gt;https://github.com/$USER/$PROJECT/raw/master/$PATH&amp;lt;/url&amp;gt;
&amp;lt;/repository&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Where you have to replace &lt;code&gt;$USER&lt;/code&gt;, &lt;code&gt;$PROJECT&lt;/code&gt; and &lt;code&gt;$PATH&lt;/code&gt; with your Github username, your project name and the path to your maven repository root within your sources (e.g. &lt;code&gt;src/main/lib&lt;/code&gt; in the previous article).&lt;/p&gt;
&lt;div class=&quot;feedflare&quot;&gt;
&lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://feeds.feedburner.com/~ff/Skuro?a=07CcjUdzuF0:ApkVrZlrBRo:yIl2AUoC8zA&quot;&gt;&lt;img src=&quot;http://feeds.feedburner.com/~ff/Skuro?d=yIl2AUoC8zA&quot; border=&quot;0&quot;&gt;&lt;/a&gt; &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://feeds.feedburner.com/~ff/Skuro?a=07CcjUdzuF0:ApkVrZlrBRo:V_sGLiPBpWU&quot;&gt;&lt;img src=&quot;http://feeds.feedburner.com/~ff/Skuro?i=07CcjUdzuF0:ApkVrZlrBRo:V_sGLiPBpWU&quot; border=&quot;0&quot;&gt;&lt;/a&gt; &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://feeds.feedburner.com/~ff/Skuro?a=07CcjUdzuF0:ApkVrZlrBRo:7Q72WNTAKBA&quot;&gt;&lt;img src=&quot;http://feeds.feedburner.com/~ff/Skuro?d=7Q72WNTAKBA&quot; border=&quot;0&quot;&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src=&quot;http://feeds.feedburner.com/~r/Skuro/~4/07CcjUdzuF0&quot; height=&quot;1&quot; width=&quot;1&quot;/&gt;</description>
         <guid isPermaLink="false">http://skuro.tk/2012/05/28/legacy-artifacts-repository-update-going-remote/</guid>
         <pubDate>Sun, 27 May 2012 22:00:00 +0000</pubDate>
      </item>
      <item>
         <title>First Test Version and Source of CMIS Spaces Mobile Available</title>
         <link>http://integratedsemantics.org/2012/05/20/first-test-version-and-source-of-cmis-spaces-mobile-available/</link>
         <description>&lt;p&gt;CMIS Spaces is a Flex based RIA Client for CMIS content mgt repositories with Desktop (AIR App, Flex In Browser) and Mobile (Android Mobile AIR App, iOS Mobile AIR App) versions.&lt;/p&gt;
&lt;p&gt;The source and first test version of CMIS Spaces Mobile is finally available on the &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://code.google.com/p/cmisspaces/&quot; title=&quot;CMIS Spaces&quot;&gt;CMIS Spaces Google Code&lt;/a&gt; site. Its geared more for Android tablets / iPads than smart phones.&lt;/p&gt;
&lt;p&gt;A first test build of CMIS Spaces Mobile for Android is available for download. The iOS version can be built from the common source using Flash Builder 4.6 / Flex 4.6 .&lt;/p&gt;
&lt;p&gt;A newer version of FlexSpaces Mobile for Alfresco and newer source is also available on the &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://code.google.com/p/flexspaces/&quot; title=&quot;FlexSpaces&quot;&gt;FlexSpaces Google Code&lt;/a&gt; site. CMIS Spaces and FlexSpaces share a good bit code between them. FlexSpaces has support for more features (workflow, etc.) and uses custom web scripts instead of CMIS binding APIs.&lt;/p&gt;
&lt;p&gt;A third test build of FlexSpaces Mobile for Android is available for download. FlexSpaces Mobile for iOS can be built from the common FlexSpaces source.&lt;/p&gt;
&lt;p&gt;Alfresco Add+Ons Catalog pages:&lt;br /&gt;
&lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;https://addons.alfresco.com/addons/cmis-spaces&quot; title=&quot;CMIS Spaces Add On&quot;&gt;CMIS Spaces&lt;/a&gt;&lt;br /&gt;
&lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://addons.alfresco.com/addons/flexspaces&quot; title=&quot;FlexSpaces Add On&quot;&gt;Flex Spaces&lt;/a&gt;&lt;/p&gt;</description>
         <author>admin</author>
         <guid isPermaLink="false">http://integratedsemantics.org/2012/05/20/first-test-version-and-source-of-cmis-spaces-mobile-available/</guid>
         <pubDate>Mon, 21 May 2012 04:30:19 +0000</pubDate>
      </item>
      <item>
         <title>Walking faster</title>
         <link>http://wanderingalfresco.wordpress.com/2012/05/18/walking-faster/</link>
         <description>Update 6/29/2012: Andrew Laurence did a nice write-up of the background behind these improvements for the TidBITS blog about a week ago. There are also some interesting comments there. In the recently-released Mac OS X 10.7.4 update, Apple has implemented &amp;#8230; &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://wanderingalfresco.wordpress.com/2012/05/18/walking-faster/&quot;&gt;Continue reading &lt;span class=&quot;meta-nav&quot;&gt;&amp;#8594;&lt;/span&gt;&lt;/a&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://stats.wordpress.com/b.gif?host=wanderingalfresco.wordpress.com&amp;#038;blog=23905304&amp;#038;post=179&amp;#038;subd=wanderingalfresco&amp;#038;ref=&amp;#038;feed=1&quot; width=&quot;1&quot; height=&quot;1&quot;/&gt;</description>
         <guid isPermaLink="false">http://wanderingalfresco.wordpress.com/?p=179</guid>
         <pubDate>Fri, 18 May 2012 23:43:09 +0000</pubDate>
         <content:encoded><![CDATA[<p><b>Update 6/29/2012:</b> Andrew Laurence did a nice write-up of the <a rel="nofollow" target="_blank" href="http://tidbits.com/article/13076">background behind these improvements</a> for the TidBITS blog about a week ago.  There are also some interesting comments there.</p>
<p>In the recently-released Mac OS X 10.7.4 update, Apple has implemented changes to its WebDAV client that dramatically speed up connections. If you are connecting to Alfresco by mounting it in the Finder, you&#8217;re in for a much improved experience, especially if you&#8217;re using the authentication chain to allow users to authenticate against an external authN/Z provider.</p>
<p>In our environment, these speed-ups are on the order of 2.5 times faster.  This is especially evident when browsing between folders or working with large numbers of small files.</p>
<p>These changes also make the WebDAV connections more reliable and stable.</p>
<p>So, if you&#8217;re using Mac OS X Finder to connect to Alfresco, I&#8217;d strongly recommend updating to Mac OS X 10.7.4.</p>
<p>From a technical point of view, all they did was to add support for session cookies to the WebDAV client.</p>
<p>To connect to the Alfresco from the Mac OS X Finder, here&#8217;s what you do:</p>
<ol>
<li>In the Finder, choose <strong>Connect to Server&#8230;</strong> from the <strong>Go</strong> menu</li>
<li>Enter <a rel="nofollow" target="_blank" href="https://alfresco.companyname.com/alfresco/webdav"><font face="Courier">https://alfresco.companyname.com/alfresco/webdav</font></a> in the <strong>Server Address:</strong> field of the window that appears.
<p>    <em>A question for the audience:</em> In our environment (tomcat running behind Apache, where Apache is set to do a 302 redirect from http to https), entering &#8220;<a rel="nofollow" target="_blank" href="http://&#038;#8221">http://&#038;#8221</a>; instead of &#8220;<a rel="nofollow" target="_blank" href="https://&#038;#8221">https://&#038;#8221</a>; does not see the speed benefits mentioned here. I&#8217;d appreciate any thoughts about why this might be happening.</li>
<li>Click the <strong>+</strong> button to the right of the server address field to add it to the <strong>Favorite Servers</strong> list, for easier future access.</li>
<li>Click <strong>Connect</strong> and enter your <strong>Name</strong> and <strong>Password</strong> when prompted.</li>
<li>You&#8217;ll see a &#8220;webdav&#8221; disk appear on your desktop.  You can now use that like any other disk on your system.</li>
</ol>
<p>Until this update was released, we had been recommending that Mac OS X users use Cyberduck to connect to WebDAV on Alfresco. Cyberduck is still somewhat faster than the Mac OS X Finder, but this update makes the Finder much more usable, and suitable for most uses.</p>
<br />  <a rel="nofollow" target="_blank" href="http://feeds.wordpress.com/1.0/gocomments/wanderingalfresco.wordpress.com/179/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/wanderingalfresco.wordpress.com/179/"/></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=wanderingalfresco.wordpress.com&#038;blog=23905304&#038;post=179&#038;subd=wanderingalfresco&#038;ref=&#038;feed=1" width="1" height="1"/>]]></content:encoded>
         <media:content medium="image" url="http://0.gravatar.com/avatar/08db656472ec0d3b2ae3355095abbf5d?s=96&amp;amp;d=identicon&amp;amp;r=G">
            <media:title type="html">icrew</media:title>
         </media:content>
         <category>Uncategorized</category>
      </item>
      <item>
         <title>Augment Alfresco Spring Bean configuration (without overwriting beans) - Alfresco Hack #4</title>
         <link>http://thinkalfresco.blogspot.com/2012/05/augmenting-alfresco-spring-bean.html</link>
         <description>&lt;br /&gt;
[See here my post about the&amp;nbsp;&lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://thinkalfresco.blogspot.de/2012/04/ecm-marketplace-for-alfresco-modules.html&quot;&gt;benefits of the b2b marketplace for Alfresco modules and solutions&lt;/a&gt;.]&lt;br /&gt;
&lt;br /&gt;
...continuing my Alfresco hacks series posts...&lt;br /&gt;
&lt;br /&gt;
Development with Alfresco is fun - due to the facts that Alfresco is build upon the Spring framework and that it is open source almost every part of it can be changed or extended just by changing the spring bean configuration. This is fine and&amp;nbsp;sufficient if you have full control over the configuration.&amp;nbsp;But more and more modules and real solutions are built on top of Alfresco. And these extensions can even be combined, which leads to an even more complex and hard-to-control configuration. It is important to add your own code without overwriting any of the Alfresco Spring beans - to play well with others&lt;br /&gt;
&lt;br /&gt;
&lt;i&gt;Warning: Heavy developer stuff ahead! You&amp;nbsp;definitely&amp;nbsp;need to know what you are doing here...&lt;/i&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;h3&gt;




Augment list properties of existing Alfresco Spring Beans&lt;/h3&gt;
&lt;br /&gt;
Sometimes, the ootb configuration and extensibility mechanism of Alfresco does not cover (yet) the area that you would like to customize or extend. But often, it would almost be possible just by adding a value to a list property of an existing Alfresco bean. Examples are:&lt;br /&gt;
&lt;br /&gt;
&lt;ul&gt;
&lt;li&gt;Add another Share site preset definition file (I will show an example in my next post)&lt;/li&gt;
&lt;li&gt;Add additional search paths for share/surf&lt;/li&gt;
&lt;li&gt;Add a method interceptor to the core public services&lt;/li&gt;
&lt;li&gt;Add a property decorator or user permissions for share (bean applicationScriptUtils)&lt;/li&gt;
&lt;/ul&gt;
&lt;div&gt;
The basic idea is to use a Spring &lt;span style=&quot;font-family:'Courier New', Courier, monospace;&quot;&gt;BeanFactoryPostProcessor&lt;/span&gt;&lt;span style=&quot;font-family:inherit;&quot;&gt;. A BeanFactoryPostProcessor is able to change the bean &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://www.blogger.com/goog_1422010803&quot;&gt;configuration just before a bean gets&amp;nbsp;&lt;/a&gt;&lt;/span&gt;&lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://static.springsource.org/spring/docs/3.0.x/javadoc-api/org/springframework/beans/factory/config/BeanFactoryPostProcessor.html&quot;&gt;instantiated&lt;/a&gt;. This way, an additional list value can be added to a bean property, just as if it would have been configured in xml.&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;
&lt;h3&gt;




Example: Add a permission to the share document library repository response&lt;/h3&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;
The requirement is to provide a custom permission to the share document library, because an action evaluator should be configured to only show the action if the user has the actual permission to carry out the action.&lt;br /&gt;
&lt;br /&gt;
The &lt;span style=&quot;font-family:'Courier New', Courier, monospace;&quot;&gt;applicationScriptUtils&lt;/span&gt; bean controls which permissions are given back to share during document library browsing and as&amp;nbsp;&lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://docs.alfresco.com/4.0/index.jsp?topic=%2Fcom.alfresco.enterprise.doc%2Fconcepts%2Fdoclib-web-tier.html&quot;&gt;described here&lt;/a&gt;&amp;nbsp;the bean&amp;nbsp;&lt;span style=&quot;font-family:'Courier New', Courier, monospace;&quot;&gt;applicationScriptUtils&lt;/span&gt; can be overwritten to configure it.&lt;br /&gt;
&lt;br /&gt;
Also the &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://jared.ottleys.net/alfresco/alfresco-property-decorators-cont&quot;&gt;map-merge feature of Spring&lt;/a&gt; will not solve this completely as discussed on the linked blog.&lt;br /&gt;
&lt;br /&gt;
Using the BeanFactoryPostProcessor will allow to configure it, without any overwriting of beans and compatible with other extensions which have the same requirement.&lt;br /&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;
&lt;span style=&quot;background-color:#f3f3f3;&quot;&gt;&amp;lt;bean id=&quot;ecm4u.test.CustomPermission&quot;&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;background-color:#f3f3f3;&quot;&gt;&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space:pre;&quot;&gt;  &lt;/span&gt;class=&quot;de.ecm4u.alfresco.utils.spring.AddToListPropertyPostProcessor&quot;&amp;gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;background-color:#f3f3f3;&quot;&gt;&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space:pre;&quot;&gt;  &lt;/span&gt;&amp;lt;property name=&quot;beanName&quot; value=&quot;&lt;b&gt;applicationScriptUtils&lt;/b&gt;&quot; /&amp;gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;background-color:#f3f3f3;&quot;&gt;&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space:pre;&quot;&gt;  &lt;/span&gt;&amp;lt;property name=&quot;propertyName&quot; value=&quot;&lt;strong&gt;userPermissions&lt;/strong&gt;&quot; /&amp;gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;background-color:#f3f3f3;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;lt;property name=&quot;position&quot; value=&quot;&lt;b&gt;-1&lt;/b&gt;&lt;/span&gt;&lt;span style=&quot;background-color:#f3f3f3;&quot;&gt;&quot; /&amp;gt; &amp;lt;!-- -1 means end of list --&amp;gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;background-color:#f3f3f3;&quot;&gt;&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space:pre;&quot;&gt;  &lt;/span&gt;&amp;lt;property name=&quot;additionalProperties&quot;&amp;gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;background-color:#f3f3f3;&quot;&gt;&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space:pre;&quot;&gt;   &lt;/span&gt;&amp;lt;list&amp;gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;background-color:#f3f3f3;&quot;&gt;&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space:pre;&quot;&gt;    &lt;/span&gt;&amp;lt;value&amp;gt;&lt;b&gt;CustomPermission&lt;/b&gt;&amp;lt;/value&amp;gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;background-color:#f3f3f3;&quot;&gt;&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space:pre;&quot;&gt;   &lt;/span&gt;&amp;lt;/list&amp;gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;background-color:#f3f3f3;&quot;&gt;&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space:pre;&quot;&gt;  &lt;/span&gt;&amp;lt;/property&amp;gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;background-color:#f3f3f3;&quot;&gt;&amp;lt;/bean&amp;gt;&lt;/span&gt;&lt;/div&gt;
&lt;br /&gt;
If you would like to try it out - although it is easy to implement a BeanFactoryPostProcessor - the source code is provided below. I have used it in modules and projects with success.&lt;br /&gt;
&lt;h3&gt;




&lt;/h3&gt;
&lt;h3&gt;


&lt;/h3&gt;
&lt;h3&gt;




AddToListProperty BeanFactoryPostProcessor source code&lt;/h3&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;span style=&quot;background-color:#f3f3f3;&quot;&gt; package de.ecm4u.alfresco.utils.spring;&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;background-color:#f3f3f3;&quot;&gt;&lt;br /&gt;
import java.util.ArrayList;&lt;br /&gt;
import java.util.List;&lt;br /&gt;
import org.apache.commons.logging.Log;&lt;br /&gt;
import org.apache.commons.logging.LogFactory;&lt;br /&gt;
import org.springframework.beans.BeansException;&lt;br /&gt;
import org.springframework.beans.factory.config.BeanDefinition;&lt;br /&gt;
import org.springframework.beans.factory.config.BeanFactoryPostProcessor;&lt;br /&gt;
import org.springframework.beans.factory.config.ConfigurableListableBeanFactory;&lt;br /&gt;
import org.springframework.core.Ordered;&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;background-color:#f3f3f3;&quot;&gt;&lt;br /&gt;
/**&lt;br /&gt;
* This {@link BeanFactoryPostProcessor} adds additional properties to a list&lt;br /&gt;
* property of an already defined bean.&lt;br /&gt;
*&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;background-color:#f3f3f3;&quot;&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;background-color:#f3f3f3;&quot;&gt;* Copyright 2010 Lothar Maerkle&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;background-color:#f3f3f3;&quot;&gt;*&amp;nbsp;&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;background-color:#f3f3f3;&quot;&gt;* Licensed under the Apache License, Version 2.0 (the &quot;License&quot;); you may not&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;background-color:#f3f3f3;&quot;&gt;* use this file except in compliance with the License. You may obtain a copy of&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;background-color:#f3f3f3;&quot;&gt;* the License at&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;background-color:#f3f3f3;&quot;&gt;*&amp;nbsp;&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;background-color:#f3f3f3;&quot;&gt;* http://www.apache.org/licenses/LICENSE-2.0&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;background-color:#f3f3f3;&quot;&gt;*&amp;nbsp;&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;background-color:#f3f3f3;&quot;&gt;* Unless required by applicable law or agreed to in writing, software&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;background-color:#f3f3f3;&quot;&gt;* distributed under the License is distributed on an &quot;AS IS&quot; BASIS, WITHOUT&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;background-color:#f3f3f3;&quot;&gt;* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;background-color:#f3f3f3;&quot;&gt;* License for the specific language governing permissions and limitations under&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;background-color:#f3f3f3;&quot;&gt;* &amp;nbsp;the License.&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;background-color:#f3f3f3;&quot;&gt;*&amp;nbsp;&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;span style=&quot;background-color:#f3f3f3;&quot;&gt; * @author lothar.maerkle@ecm4u.de&lt;br /&gt;
*/&lt;br /&gt;
public class AddToListPropertyPostProcessor implements BeanFactoryPostProcessor, Ordered {&lt;br /&gt;
&amp;nbsp; &amp;nbsp; private static final Log LOGGER = LogFactory.getLog(AddToListPropertyPostProcessor.class);&lt;br /&gt;
&amp;nbsp; &amp;nbsp; private String beanName;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; private String propertyName;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; private List&amp;lt;Object&amp;gt; additionalProperties;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; /**&lt;br /&gt;
&amp;nbsp; &amp;nbsp; * Controls where the additional properties are added to the list of the target bean.&lt;br /&gt;
&amp;nbsp; &amp;nbsp; * The position is an index, negativ values are interpreted from the end of the list.&lt;br /&gt;
&amp;nbsp; &amp;nbsp; * Eg. 0 means haed of the list, -1 means append to the end of the list.&lt;br /&gt;
&amp;nbsp; &amp;nbsp; */&lt;br /&gt;
&amp;nbsp; &amp;nbsp; private int position = -1;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; @SuppressWarnings({ &quot;unchecked&quot; })&lt;br /&gt;
&amp;nbsp; &amp;nbsp; public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException {&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; String[] beans = beanFactory.getBeanDefinitionNames();&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; for (String bName : beans) {&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; if (bName.equals(beanName)) {&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; BeanDefinition def = beanFactory.getBeanDefinition(beanName);&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; // add mappings&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; if (additionalProperties != null&amp;nbsp;&amp;amp;&amp;amp; !additionalProperties.isEmpty()) {&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; List&amp;lt;Object&amp;gt; mapped = (List&amp;lt;Object&amp;gt;) &amp;nbsp;def.getPropertyValues().getPropertyValue(propertyName).getValue();&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; if (mapped == null) {&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;mapped = new ArrayList&amp;lt;Object&amp;gt;();&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if (position &amp;gt;= 0) {&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;// correct overflow positive size&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;position = position &amp;lt;= mapped.size() ? position&amp;nbsp;: mapped.size();&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;for (int v = 0; v &amp;lt; additionalProperties.size(); v++) {&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;mapped.add(position + v, mapped);&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; } else if (position &amp;lt; 0) {&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; // correct overflow negative size&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; position = (Math.abs(position) - 1) &amp;lt;= mapped.size() ? position: (mapped.size() + 1) * (-1);&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; int size = mapped.size();&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; for (int v = 0; v &amp;lt; additionalProperties.size(); v++) {&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; mapped.add(size + position + v + 1, additionalProperties.get(v) );&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; if (LOGGER.isInfoEnabled()) {&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;LOGGER.info(&quot;Added properties: bean=&quot; + bName&amp;nbsp;+ &quot;, property=&quot; + propertyName + &quot;, mappings=&quot;+ additionalProperties + &quot;, position=&quot;+ position);&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;background-color:#f3f3f3;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}&lt;br /&gt;
&amp;nbsp; &amp;nbsp; }&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;background-color:#f3f3f3;&quot;&gt;&amp;nbsp; &amp;nbsp; // last comment for 1000 lines, thank you for your understanding&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;background-color:#f3f3f3;&quot;&gt;&amp;nbsp; &amp;nbsp; public int getOrder() {&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return Integer.MAX_VALUE;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; }&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;background-color:#f3f3f3;&quot;&gt;&amp;nbsp; &amp;nbsp; public final String getBeanName() {&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; return beanName;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; }&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;background-color:#f3f3f3;&quot;&gt;&amp;nbsp; &amp;nbsp; public final void setBeanName(String beanName) {&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;this.beanName = beanName;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; }&lt;br /&gt;
&amp;nbsp; &amp;nbsp; public final String getPropertyName() {&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; return propertyName;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; }&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;background-color:#f3f3f3;&quot;&gt;&amp;nbsp; &amp;nbsp; public final void setPropertyName(String propertyName) {&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; this.propertyName = propertyName;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; }&lt;br /&gt;
&amp;nbsp; &amp;nbsp; public final List&amp;lt;Object&amp;gt; getAdditionalProperties() {&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; return additionalProperties;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; }&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;background-color:#f3f3f3;&quot;&gt;&amp;nbsp; &amp;nbsp; public final void setAdditionalProperties(List&amp;lt;Object&amp;gt; additionalProperties) {&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; this.additionalProperties = additionalProperties;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; }&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;background-color:#f3f3f3;&quot;&gt;&amp;nbsp; &amp;nbsp; public final int getPosition() {&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; return position;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; }&lt;br /&gt;
&amp;nbsp; &amp;nbsp; public final void setPosition(int position) {&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; this.position = position;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; }&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;background-color:#f3f3f3;&quot;&gt; }&lt;/span&gt;</description>
         <author>noreply@blogger.com (Lothar Märkle)</author>
         <guid isPermaLink="false">tag:blogger.com,1999:blog-3862704576763351872.post-6609656478632757614</guid>
         <pubDate>Fri, 18 May 2012 11:42:00 +0000</pubDate>
      </item>
      <item>
         <title>&lt;div class=&quot;separator&quot;&amp;hellip;</title>
         <link>http://onalfresco.blogspot.com/2012/05/organizations-in-order-to-implement-and.html</link>
         <description>&lt;div class=&quot;separator&quot; style=&quot;clear:both;text-align:center;&quot;&gt;&lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://2.bp.blogspot.com/-tATuXCp0C38/T7X38OfAMUI/AAAAAAAAAIE/Vm_5PYQuIJo/s1600/alfresco-logo.png&quot; style=&quot;clear:left;float:left;margin-bottom:1em;margin-right:1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;http://2.bp.blogspot.com/-tATuXCp0C38/T7X38OfAMUI/AAAAAAAAAIE/Vm_5PYQuIJo/s1600/alfresco-logo.png&quot;/&gt;&lt;/a&gt;&lt;/div&gt;Organizations, in order to implement and adapt Alfresco as the ECM solution for the enterprise, need to follow certain plan and path.&lt;br /&gt;&lt;br /&gt;Here we will elaborate what should be the specific plan of action for  implementing Alfresco as the ECM solution in the business.&lt;br /&gt; &lt;h3&gt;&amp;nbsp;&lt;/h3&gt;&lt;h3&gt;Identify Content Sources&lt;/h3&gt;In an organization, Content can be produced from a variety of sources.&lt;br /&gt; For example Email transactions, Business Document productions,  Images, Media file generation processes etc. Identification and listing  of all these sources are quite essential.&lt;br /&gt; There should be particular life cycle of each of these contents in the business, capturing these is also equally required.&lt;br /&gt; &lt;h3&gt;&amp;nbsp;&lt;/h3&gt;&lt;h3&gt;Identify Actors&lt;/h3&gt;Similarly as there are number of different content sources possible  in an organization, there can be variety of people and system actors  involved in the production and maintenance of the content.&lt;br /&gt; It is important to list down all such actors who contribute and  participate in any phase of the content life cycle, along with their  roles and actions they usually perform. This will also help to structure  the permission model of the system.&lt;br /&gt; &lt;h3&gt;&amp;nbsp;&lt;/h3&gt;&lt;h3&gt;Create Organization Taxonomy&lt;/h3&gt;This is probably the most important thing to do while establishing an ECM system. This involves&lt;br /&gt; &lt;ol&gt;&lt;li&gt;Creating standard and fixed set of content Tags for the business&lt;/li&gt;&lt;li&gt;Creating content categorization hierarchy and structure&lt;/li&gt;&lt;li&gt;Creating user folksonomy strategy&lt;/li&gt;&lt;li&gt;Create business specific content metadata, content types etc&lt;/li&gt;&lt;/ol&gt;&lt;h3&gt;&amp;nbsp;&lt;/h3&gt;&lt;h3&gt;Design Content Storage Structure&lt;/h3&gt;This is all about how different types of contents will be stored in the repository.&lt;br /&gt; Answer the questions such as how many Sites will be created, what  will be the default space (folder) hierarchy in each of the sites, what  are the standard folder templates that can be re-used in the system etc.&lt;br /&gt; &lt;h3&gt;&amp;nbsp;&lt;/h3&gt;&lt;h3&gt;Identify Document Management features&lt;/h3&gt;There are several standard document management features available in Alfresco ECM. For example&lt;br /&gt; &lt;ul style=&quot;list-style-type:square;&quot;&gt;&lt;li&gt;Versioning&lt;/li&gt;&lt;li&gt;Check-In, Check-Out&lt;/li&gt;&lt;li&gt;Comments&lt;/li&gt;&lt;li&gt;Manage Permissions&lt;/li&gt;&lt;li&gt;Manage Content Types, Metadata&lt;/li&gt;&lt;li&gt;Copy, Move, Edit&lt;/li&gt;&lt;li&gt;etc&lt;/li&gt;&lt;/ul&gt;The business needs to identify which all features they need and how to use them.&lt;br /&gt; &lt;h3&gt;&amp;nbsp;&lt;/h3&gt;&lt;h3&gt;Structure Content Business Process&lt;/h3&gt;In an organization, contents are not created without any processes behind them.&lt;br /&gt; Identifying and structuring these business processes and workflows  are one of the most important aspects of an ECM implementation.&lt;br /&gt; Write and spec these workflows in flow chart format that can help developers to easily implement them.&lt;br /&gt; &lt;h3&gt;&amp;nbsp;&lt;/h3&gt;&lt;h3&gt;Collaboration around Contents&lt;/h3&gt;Alfresco is not only a simple document management system, it offers rich set of Web 2.0 collaboration features.&lt;br /&gt; In today's social media driven world, users work in a very  collaborative and connected environment. Alfresco offers all standard  collaboration stuff which organizations must evaluate and implement  accordingly.&lt;br /&gt; &lt;h3&gt;&amp;nbsp;&lt;/h3&gt;&lt;h3&gt;Implement the above standard features&lt;/h3&gt;Deploy the above standard ECM use cases, run for a period, evaluate the performance and functionalities of the system.&lt;br /&gt; &lt;h3&gt;&amp;nbsp;&lt;/h3&gt;&lt;h3&gt;Finally, identify and implement Customizations&lt;/h3&gt;&lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://blog.infoaxon.com/wp-content/uploads/2011/03/alfresco-ia.png&quot;&gt;&lt;/a&gt;At  this point of time, the business owners should be pretty clear about  what they need from Alfresco, as the ECM solution of the business. Now  you can write down the business specific customizations, additional  features they want. Implement those functionalities and you have a  stable ECM solution in the business that will last long.</description>
         <author>Snig Bhaumik</author>
         <guid isPermaLink="false">tag:blogger.com,1999:blog-3095692350172949352.post-6729917909582831318</guid>
         <pubDate>Fri, 18 May 2012 00:22:00 +0000</pubDate>
         <media:thumbnail height="72" url="http://2.bp.blogspot.com/-tATuXCp0C38/T7X38OfAMUI/AAAAAAAAAIE/Vm_5PYQuIJo/s72-c/alfresco-logo.png" width="72" xmlns:media="http://search.yahoo.com/mrss/"/>
      </item>
      <item>
         <title>removePermission for all users/groups workaround</title>
         <link>http://louise.hu/poet/?p=5922</link>
         <description>I take an ugly bug in removePermission JavaScript function of Alfresco 4.0.d Community Edition. You can reproduce by this sample script: var node = companyhome.childByNamePath&amp;#40;&amp;#34;User Homes/louise&amp;#34;&amp;#41;; &amp;#160; permissions = node.getPermissions&amp;#40;&amp;#41;; print&amp;#40;&amp;#34;Before removePermission:&amp;#34;&amp;#41;; print&amp;#40;permissions&amp;#41;; &amp;#160; node.removePermission&amp;#40;&amp;#34;Coordinator&amp;#34;&amp;#41;; &amp;#160; permissions = node.getPermissions&amp;#40;&amp;#41;; print&amp;#40;&amp;#34;After removePermission:&amp;#34;&amp;#41;; print&amp;#40;permissions&amp;#41;; Results should be: Before removePermission: 0 : ALLOWED;louise;All 1 : ALLOWED;ROLE_OWNER;All 2 : [...]</description>
         <guid isPermaLink="false">http://louise.hu/poet/?p=5922</guid>
         <pubDate>Thu, 17 May 2012 13:34:10 +0000</pubDate>
      </item>
      <item>
         <title>Setting up your Browser to use Alfresco Search</title>
         <link>http://onalfresco.blogspot.com/2012/05/setting-up-your-browser-to-use-alfresco.html</link>
         <description>In Alfresco 4, OpenSearch is by default enabled.&lt;br /&gt;You, however, need to configure this in your browser.&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Open URL [&lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://localhost:8080/alfresco/service/api/search/engines&quot;&gt;http://localhost:8080/alfresco/service/api/search/engines&lt;/a&gt;] (replace localhost and 8080 with your alfresco server url). If OpenSearch is enabled, the following screen should come up.&lt;br /&gt;&lt;div class=&quot;separator&quot; style=&quot;clear:both;text-align:center;&quot;&gt;&lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://3.bp.blogspot.com/-kuyBjuwWNbI/T7JjQ8pp_lI/AAAAAAAAAHo/MO15po_3brA/s400/OS1.png&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;141&quot; src=&quot;http://3.bp.blogspot.com/-kuyBjuwWNbI/T7JjQ8pp_lI/AAAAAAAAAHo/MO15po_3brA/s400/OS1.png&quot; width=&quot;400&quot;/&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt; &lt;/li&gt;&lt;li&gt;While this page is open, click on the browser search engine drop down on the right hand side of the address bar.&lt;br /&gt;&lt;div class=&quot;separator&quot; style=&quot;clear:both;text-align:center;&quot;&gt;&lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://1.bp.blogspot.com/-6tW4j4dGBvo/T7JjVSDECDI/AAAAAAAAAHw/TSV8_ms5qw4/s1600/OS2.png&quot; style=&quot;margin-left:1em;margin-right:1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;96&quot; src=&quot;http://1.bp.blogspot.com/-6tW4j4dGBvo/T7JjVSDECDI/AAAAAAAAAHw/TSV8_ms5qw4/s400/OS2.png&quot; width=&quot;400&quot;/&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt; &lt;/li&gt;&lt;li&gt;Click on &quot;Add Alfresco Keyword Search&quot; - Alfresco OpenSearch search engine has now configured in your browser.&amp;nbsp;&lt;/li&gt;&lt;li&gt;Choose this search engine, type something in the search box, press enter.&amp;nbsp;&lt;/li&gt;&lt;li&gt;Alfresco would ask you for user credentials (if not logged in in Alfresco Explorer in this browser session). And as per your user credentials, the content search output will be displayed.&lt;br /&gt;&lt;div class=&quot;separator&quot; style=&quot;clear:both;text-align:center;&quot;&gt;&lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://4.bp.blogspot.com/-iXv9AUfDQnc/T7JjV_v9BxI/AAAAAAAAAH4/_KmF8R-v1Wc/s1600/OS3.png&quot; style=&quot;margin-left:1em;margin-right:1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;113&quot; src=&quot;http://4.bp.blogspot.com/-iXv9AUfDQnc/T7JjV_v9BxI/AAAAAAAAAH4/_KmF8R-v1Wc/s400/OS3.png&quot; width=&quot;400&quot;/&gt;&amp;nbsp;&lt;/a&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear:both;text-align:left;&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;h3 class=&quot;separator&quot; style=&quot;clear:both;text-align:left;&quot;&gt;   Note:&lt;/h3&gt;&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;&lt;span style=&quot;background-color:#3d85c6;&quot;&gt;&lt;span style=&quot;background-color:cyan;&quot;&gt;Alfresco takes care of the user permission and scope automatically. There is no need to do any enhancements for this.&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style=&quot;background-color:#3d85c6;&quot;&gt;&lt;span style=&quot;background-color:cyan;&quot;&gt;The search executes onto across repository (as per the permission), this is not limited to only ''Sites''.&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style=&quot;background-color:#3d85c6;&quot;&gt;&lt;span style=&quot;background-color:cyan;&quot;&gt;The output is paginated. Also, the name of the document enables you to download this.&lt;/span&gt;&lt;span style=&quot;background-color:cyan;&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;</description>
         <author>Snig Bhaumik</author>
         <guid isPermaLink="false">tag:blogger.com,1999:blog-3095692350172949352.post-6959038178965162818</guid>
         <pubDate>Tue, 15 May 2012 07:18:00 +0000</pubDate>
         <media:thumbnail height="72" url="http://3.bp.blogspot.com/-kuyBjuwWNbI/T7JjQ8pp_lI/AAAAAAAAAHo/MO15po_3brA/s72-c/OS1.png" width="72" xmlns:media="http://search.yahoo.com/mrss/"/>
      </item>
      <item>
         <title>Legacy libraries for your maven build</title>
         <link>http://feedproxy.google.com/~r/Skuro/~3/SH0C52LJ6Uo/</link>
         <description>&lt;h1&gt;Legacy libraries&lt;/h1&gt;

&lt;p&gt;Dealing with legacy code is always tricky, and adapting your tooling to leverage them is sometimes plain hard. Especially when you're building your projects with Maven and your code happens to depend on some ancient library which appear to be unknown to the Internet™, you probably have to figure out how to tell Maven where to find that damn library. This is also the problem when dealing with e.g. proprietary third party libraries which don't ship with a POM, therefore they don't mavenly exist.&lt;/p&gt;

&lt;h1&gt;Local repositories FTW&lt;/h1&gt;

&lt;p&gt;&lt;strong&gt;UPDATE:&lt;/strong&gt; following the argument from &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://discursive.com/&quot;&gt;Tim O'Brien&lt;/a&gt;, I wrote a &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://skuro.tk/2012/05/28/legacy-artifacts-repository-update-going-remote/&quot;&gt;follow up&lt;/a&gt; to also exploit Github as a remote repository using the same storage strategy&lt;/p&gt;

&lt;p&gt;There are a number of possible solutions to the above mentioned problem, which ideally involve a shared, remote artifact repository where to deploy the JAR file that causes you headaches. Recently, I found myself in the need of creating (yet another) Maven build around some &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://www.alfresco.com&quot;&gt;Alfresco&lt;/a&gt;, to enable &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://skuro.tk/lambdalf/&quot;&gt;Lambdalf&lt;/a&gt; to build its Clojure sources. The rocky road to Maven for Alfresco is still long, and as a result you find yourself dealing with some iffy libraries when coding against Alfresco. Some examples, just opening up the WAR files:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;truezip.jar&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;mybaties-3.0.4-patched.jar&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;acegi-security-0.8.2_patched.jar&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;


&lt;p&gt;One solution I found that doesn't require setting up your publicly available &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://www.sonatype.org/nexus/&quot;&gt;Nexus&lt;/a&gt; repository, nor using someone else's &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://www.jfrog.com/products.php&quot;&gt;Artifactory&lt;/a&gt;, is to provide the problematic JARs in a maven repository as part of your sources. Suppose you have a mysterious &lt;code&gt;fluff.jar&lt;/code&gt; library you need to include in your classpath, here's how it works:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;place the JAR file in &lt;code&gt;src/main/lib/fluff/fluff/unknown/fluff-unknown.jar&lt;/code&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;setup the dependency in your POM:&lt;/p&gt;

&lt;p&gt;  &lt;/p&gt; 

&lt;pre&gt;&lt;code&gt;&amp;lt;dependency&amp;gt;
  &amp;lt;groupId&amp;gt;fluff&amp;lt;/groupId&amp;gt;
  &amp;lt;artifactId&amp;gt;fluff&amp;lt;/artifactId&amp;gt;
  &amp;lt;version&amp;gt;unknown&amp;lt;/version&amp;gt;
&amp;lt;/dependency&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;  &lt;/p&gt;&lt;/li&gt; 
&lt;li&gt;&lt;p&gt;still in your POM, enable the local repository:&lt;/p&gt;

&lt;p&gt;  &lt;/p&gt; 

&lt;pre&gt;&lt;code&gt;&amp;lt;repository&amp;gt;
  &amp;lt;id&amp;gt;legacy-artifacts&amp;lt;/id&amp;gt;
  &amp;lt;url&amp;gt;file://${project.basedir}/src/main/lib&amp;lt;/url&amp;gt;
&amp;lt;/repository&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;  &lt;/p&gt;&lt;/li&gt; 
&lt;/ul&gt;


&lt;p&gt;Voil&amp;aacute;. You just created a local, portable repository in your sources and instructed Maven to look there for artifacts.&lt;/p&gt;

&lt;h1&gt;License&lt;/h1&gt;

&lt;p&gt;A couple of golden rules for all the cowboy programmers out there:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;always, always, &lt;strong&gt;always check if the license allows you to redistribute the libraries&lt;/strong&gt; you're going to include in your project&lt;/li&gt;
&lt;li&gt;never, never, &lt;strong&gt;never distribute a piece of software you're not entitled to give away&lt;/strong&gt; and &lt;strong&gt;attach the license of all third party libraries&lt;/strong&gt; along with your project&lt;/li&gt;
&lt;/ul&gt;


&lt;p&gt;That said, I'll leave you to your local Maven repositories. Happy building!&lt;/p&gt;
&lt;div class=&quot;feedflare&quot;&gt;
&lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://feeds.feedburner.com/~ff/Skuro?a=SH0C52LJ6Uo:qxj-ncwnTGQ:yIl2AUoC8zA&quot;&gt;&lt;img src=&quot;http://feeds.feedburner.com/~ff/Skuro?d=yIl2AUoC8zA&quot; border=&quot;0&quot;&gt;&lt;/a&gt; &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://feeds.feedburner.com/~ff/Skuro?a=SH0C52LJ6Uo:qxj-ncwnTGQ:V_sGLiPBpWU&quot;&gt;&lt;img src=&quot;http://feeds.feedburner.com/~ff/Skuro?i=SH0C52LJ6Uo:qxj-ncwnTGQ:V_sGLiPBpWU&quot; border=&quot;0&quot;&gt;&lt;/a&gt; &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://feeds.feedburner.com/~ff/Skuro?a=SH0C52LJ6Uo:qxj-ncwnTGQ:7Q72WNTAKBA&quot;&gt;&lt;img src=&quot;http://feeds.feedburner.com/~ff/Skuro?d=7Q72WNTAKBA&quot; border=&quot;0&quot;&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src=&quot;http://feeds.feedburner.com/~r/Skuro/~4/SH0C52LJ6Uo&quot; height=&quot;1&quot; width=&quot;1&quot;/&gt;</description>
         <guid isPermaLink="false">http://skuro.tk/2012/05/14/legacy-libraries-for-your-maven-build/</guid>
         <pubDate>Sun, 13 May 2012 22:00:00 +0000</pubDate>
      </item>
      <item>
         <title>Inbound e-mail and gmail.com accounts</title>
         <link>http://louise.hu/poet/?p=5915</link>
         <description>I&amp;#8217;ve tested Alfresco 4.0.d inbound email (to Space with Alias) configuration with Google Mail STMP, but mails not received&amp;#8230; To get the solution first increase logging level for subethamail package: log4j.logger.org.subethamail.smtp.server=debug Let see the log events: 00:08:30,585 DEBUG &amp;#91;org.subethamail.smtp.server.Session&amp;#93; SMTP connection from mail-wg0-f45.google.com/74.125.82.45, new connection count: 1 00:08:30,586 DEBUG &amp;#91;org.subethamail.smtp.server.Session&amp;#93; Server: 220 alfresco.louise.hu ESMTP SubEthaSMTP [...]</description>
         <guid isPermaLink="false">http://louise.hu/poet/?p=5915</guid>
         <pubDate>Fri, 11 May 2012 14:37:36 +0000</pubDate>
      </item>
      <item>
         <title>Exporter les documents depuis Alfresco Share 4.0d</title>
         <link>http://charles.torda.net/2012/05/11/exporter-les-documents-depuis-alfresco-share-4-0d/</link>
         <description>Je m&amp;#8217;étonne parfois de l&amp;#8217;absence de certaines fonctionnalités de gestion documentaire &amp;#171;&amp;#160;classique&amp;#160;&amp;#187; dans Share. Il en est ainsi de l&amp;#8217;export multiple de documents qui consiste à récupérer un ensemble de documents en une seule opération. Le résultat de l&amp;#8217;export est &amp;#8230; &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://charles.torda.net/2012/05/11/exporter-les-documents-depuis-alfresco-share-4-0d/&quot;&gt;Continuer la lecture &lt;span class=&quot;meta-nav&quot;&gt;&amp;#8594;&lt;/span&gt;&lt;/a&gt;</description>
         <guid isPermaLink="false">http://charles.torda.net/?p=590</guid>
         <pubDate>Fri, 11 May 2012 00:19:41 +0000</pubDate>
      </item>
      <item>
         <title>Problemas en la previsualización de documentos PDF en Alfresco</title>
         <link>http://www.fegor.com/2012/05/problemas-en-la-previsualizacion-de.html</link>
         <description>&lt;span style=&quot;font-size:large;&quot;&gt;Primer problema:&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;En ocasiones los ficheros PDF no pueden ser visualizados por el Share de Alfresco. Esto puede ser debido a que si el PDF tiene activas las restricciones de impresión y/o copia, la librería &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://www.swftools.org/&quot;&gt;SWFTools&lt;/a&gt; y en concreto la utilidad pdf2swf no es capaz de transformar el fichero.&lt;br /&gt;&lt;br /&gt;Para estar seguros de que es este el problema, podemos llamar directamente a la utilidad con el fichero PDF y comprobar el resultado:&lt;br /&gt;&lt;br /&gt;&lt;div style=&quot;&quot;&gt;pdf2swf prueba.pdf -o prueba.swf&lt;/div&gt;&lt;br /&gt;Si el mensaje que devuelve es &quot;&lt;span style=&quot;font-size:small;&quot;&gt;&lt;span style=&quot;background-color:white;color:black;display:inline;float:none;font-style:normal;font-variant:normal;font-weight:normal;letter-spacing:normal;line-height:14px;orphans:2;text-align:left;text-indent:0px;text-transform:none;white-space:normal;widows:2;word-spacing:0px;&quot;&gt;FATAL &amp;nbsp; PDF disallows copying&lt;/span&gt;&lt;/span&gt;&quot; entonces estamos ante este problema.&lt;br /&gt;&lt;br /&gt;La forma de solucionarlo es recompilar &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://www.swftools.org/&quot;&gt;SWFTools&lt;/a&gt; y de esta forma evitamos el aviso y podremos ver los documentos.&lt;br /&gt;&lt;br /&gt;Las siguientes instrucciones son para la compilación bajo Linux:&lt;br /&gt;&lt;br /&gt;Bajamos el paquete de código fuente de las &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://www.swftools.org/&quot;&gt;SWFTools&lt;/a&gt; (p.e. la versión 0.9.2 está probada en la versión 3.4.8 de Alfresco funcionando perfectamente), lo descomprimimos y entramos en el directorio creado.&lt;br /&gt;&lt;br /&gt;En &lt;span style=&quot;&quot;&gt;lib/pdf/pdf.cc&lt;/span&gt; comentamos las dos líneas siguientes:&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;&quot;&gt;if(!pi-&amp;gt;config_print &amp;amp;&amp;amp; pi-&amp;gt;nocopy) {msg(&quot;&amp;lt;fatal&amp;gt; PDF disallows copying&quot;);exit(0);}&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;&quot;&gt;if(pi-&amp;gt;config_print &amp;amp;&amp;amp; pi-&amp;gt;noprint) {msg(&quot;&amp;lt;fatal&amp;gt; PDF disallows printing&quot;);exit(0);}}&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Configuramos de forma estática para que podamos llevarlo a otras distribuciones de Linux (yo la he probado en Ubuntu 11.10):&lt;br /&gt;&lt;br /&gt;&lt;div style=&quot;&quot;&gt;CC=/usr/bin/gcc-4.6 CXX=/usr/bin/g++-4.6 LDFLAGS=&quot;-static&quot; ./configure&lt;/div&gt;&lt;br /&gt;Seguramente tengamos que instalar los paquetes para desarrollo como es el g++ y el gcc.&lt;br /&gt;&lt;br /&gt;Luego:&lt;br /&gt;&lt;br /&gt;&lt;div style=&quot;&quot;&gt;make&lt;/div&gt;&lt;br /&gt;Y por último:&lt;br /&gt;&lt;br /&gt;&lt;div style=&quot;&quot;&gt;make install&amp;nbsp;&lt;/div&gt;&lt;br /&gt;O bien, simplemente sustituimos la utilidad pdf2swf que es la que se utiliza. Ya podremos ver los PDF bloqueados normalmente.&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-size:large;&quot;&gt;Segundo problema:&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Otro problema que encontramos es que en la versión 3.4.x y 4.x los PDF se ven borrosos en la previsualización, esto es debido a los modificadores establecidos para realizar la conversión a SWF que pone Alfresco.&lt;br /&gt;&lt;br /&gt;&lt;div class=&quot;separator&quot; style=&quot;clear:both;text-align:center;&quot;&gt;&lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://3.bp.blogspot.com/-sBsqzmf3k4k/T6vsPnJCLII/AAAAAAAAAOY/kboHGs-gR1g/s1600/sharezoom1.png&quot; style=&quot;clear:left;float:left;margin-bottom:1em;margin-right:1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;339&quot; src=&quot;http://3.bp.blogspot.com/-sBsqzmf3k4k/T6vsPnJCLII/AAAAAAAAAOY/kboHGs-gR1g/s640/sharezoom1.png&quot; width=&quot;640&quot;/&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;Para solucionarla tendremos que modificar el fichero &lt;span style=&quot;&quot;&gt;webapps/alfresco/WEB-INF/classes/alfresco/subsystems/thirdparty/default/swf-transform.properties&lt;/span&gt; que generalmente tiene la siguiente línea: &lt;br /&gt;&lt;br /&gt;&lt;div style=&quot;&quot;&gt;swf.encoder.params=&lt;span style=&quot;&quot;&gt;-s zoom=72 -s ppmsubpixels=1 -s poly2bitmap=1 -s bitmapfonts=1 &lt;/span&gt;&lt;/div&gt;&lt;br /&gt;Por esta otra (por ejemplo):&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;&quot;&gt;swf.encoder.params=-s zoom=100 -s ppmsubpixels=1 -s poly2bitmap=1 -s bitmapfonts=1 &lt;/span&gt;&lt;br /&gt;&lt;br /&gt;De esta forma se verán correctamente, eso si, el tiempo de conversión será mayor.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class=&quot;separator&quot; style=&quot;clear:both;text-align:center;&quot;&gt;&lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://2.bp.blogspot.com/-gXKSAdapLuk/T6vsX4S-9qI/AAAAAAAAAOg/WFkR4YWV3J8/s1600/sharezoom2.png&quot; style=&quot;clear:left;float:left;margin-bottom:1em;margin-right:1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;233&quot; src=&quot;http://2.bp.blogspot.com/-gXKSAdapLuk/T6vsX4S-9qI/AAAAAAAAAOg/WFkR4YWV3J8/s640/sharezoom2.png&quot; width=&quot;640&quot;/&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;ACTUALIZACIÓN (12/07/2012): Aunque para compilar SWFTools se puede usar la información de los enlaces que doy al final, para Ubuntu 11 (y probado en la 12) tanto para amd64 como i386 se pueden seguir la siguiente secuencia de comandos de forma rápida:&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-size:x-small;&quot;&gt;&lt;span style=&quot;&quot;&gt;sudo apt-get install build-essential checkinstall&lt;/span&gt;&lt;br style=&quot;&quot;/&gt;&lt;span style=&quot;&quot;&gt;sudo chown $USER /usr/local/src&lt;/span&gt;&lt;br style=&quot;&quot;/&gt;&lt;span style=&quot;&quot;&gt;sudo chmod u+rwx /usr/local/src&lt;/span&gt;&lt;br style=&quot;&quot;/&gt;&lt;span style=&quot;&quot;&gt;sudo apt-get install libgif-dev xpdf libfreetype6 libfreetype6-dev libjpeg62 libjpeg8 libjpeg8-dev&lt;/span&gt;&lt;br style=&quot;&quot;/&gt;&lt;span style=&quot;&quot;&gt;sudo wget http://www.swftools.org/swftools-0.9.1.tar.gz&lt;/span&gt;&lt;br style=&quot;&quot;/&gt;&lt;span style=&quot;&quot;&gt;cd lib/pdf&lt;/span&gt;&lt;br style=&quot;&quot;/&gt;&lt;span style=&quot;&quot;&gt;sudo wget http://gd.tuwien.ac.at/publishing/xpdf/xpdf-3.02.tar.gz&lt;/span&gt;&lt;br style=&quot;&quot;/&gt;&lt;span style=&quot;&quot;&gt;./configure make&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-size:x-small;&quot;&gt;&lt;span style=&quot;&quot;&gt; sudo checkinstall&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Fuentes:&lt;br /&gt;&lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://monkiki.wordpress.com/2010/04/19/compilar-pdf2swf-con-soporte-para-pdf-protegidos/&quot;&gt;http://monkiki.wordpress.com/2010/04/19/compilar-pdf2swf-con-soporte-para-pdf-protegidos/&lt;/a&gt;&lt;br /&gt;&lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://loftux.com/2012/01/08/replace-alfresco-standard-flash-viewer-with-pdf-js/&quot;&gt;http://loftux.com/2012/01/08/replace-alfresco-standard-flash-viewer-with-pdf-js/&lt;/a&gt;&lt;br /&gt;&lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://www.vservu.com/_blog/MegaZine3_-_tips,_tricks_and_hints/post/pdf2swf-switches/&quot;&gt;http://www.vservu.com/_blog/MegaZine3_-_tips,_tricks_and_hints/post/pdf2swf-switches/&lt;/a&gt;&lt;br /&gt;&lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://www.swftools.org/&quot;&gt;http://www.swftools.org/&lt;/a&gt;&lt;br /&gt;&lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;https://designbye.wordpress.com/2010/02/23/installing-swftools-and-pdf2swf-on-ubuntu-linux/&quot;&gt;https://designbye.wordpress.com/2010/02/23/installing-swftools-and-pdf2swf-on-ubuntu-linux/&lt;/a&gt;&lt;br /&gt;&lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://ubuntuforums.org/showthread.php?t=1821521&quot;&gt;http://ubuntuforums.org/showthread.php?t=1821521&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;</description>
         <author>Fernando González</author>
         <guid isPermaLink="false">tag:blogger.com,1999:blog-13003183.post-7179878961175303331</guid>
         <pubDate>Thu, 10 May 2012 18:33:00 +0000</pubDate>
         <media:thumbnail height="72" url="http://3.bp.blogspot.com/-sBsqzmf3k4k/T6vsPnJCLII/AAAAAAAAAOY/kboHGs-gR1g/s72-c/sharezoom1.png" width="72" xmlns:media="http://search.yahoo.com/mrss/"/>
      </item>
      <item>
         <title>Zimbra briefcase export tool</title>
         <link>http://louise.hu/poet/?p=5904</link>
         <description>Simple shell script to retrieve all user accounts from Zimbra, and recursively download Briefcase contents into user-named subfolders. Script requires https url of zimbra server with active admin account/password. #!/bin/bash # # Zimbra Briefcases export tool by LouiSe@louise.hu # # Usage (run on Zimbra server): # ./zimbra-briefcase-export.sh &amp;#34;https://myzimbra.com:7071&amp;#34; &amp;#34;admin@myzimbra.com&amp;#34; &amp;#34;mypassword&amp;#34; # &amp;#160; ZIMBRA_HOST=$1 ACCOUNT_LIST=/tmp/zimbra_accounts.txt ACCOUNT_ADMIN=$2 [...]</description>
         <guid isPermaLink="false">http://louise.hu/poet/?p=5904</guid>
         <pubDate>Thu, 10 May 2012 14:30:26 +0000</pubDate>
      </item>
      <item>
         <title>Simplifier la configuration des actions multiples dans Share</title>
         <link>http://charles.torda.net/2012/05/08/simplifier-la-configuration-des-actions-multiples-dans-share/</link>
         <description>La barre d&amp;#8217;outils de Share est un élément regroupant plusieurs fonctions de gestion documentaire : création de nouveaux documents, de nouveaux dossiers, actions multiples sur la sélection de documents, etc. Ce composant supporte les configurations suivantes : liste des types &amp;#8230; &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://charles.torda.net/2012/05/08/simplifier-la-configuration-des-actions-multiples-dans-share/&quot;&gt;Continuer la lecture &lt;span class=&quot;meta-nav&quot;&gt;&amp;#8594;&lt;/span&gt;&lt;/a&gt;</description>
         <guid isPermaLink="false">http://charles.torda.net/?p=565</guid>
         <pubDate>Tue, 08 May 2012 20:31:21 +0000</pubDate>
      </item>
      <item>
         <title>Debug your build with the plan maven plugin</title>
         <link>http://feedproxy.google.com/~r/Skuro/~3/G0_Gmaf_OPw/</link>
         <description>&lt;h1&gt;Contention over configuration&lt;/h1&gt;

&lt;p&gt;While &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://www.thoughtworks.com/&quot;&gt;ThoughtWorks&lt;/a&gt; put it &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://www.thoughtworks.com/sites/www.thoughtworks.com/files/images/52/radar-march-2012-tools.jpg&quot;&gt;on hold&lt;/a&gt;, there are still a number of occasions where a normal Java guy such as the truly yours have to face refactorings of ginormus Maven builds. In my company, for instance, I'm now in the situation where I need to speed up the build of one component whose project structure involves 27 POM files, with up to 4 levels of nesting. Needless to say, there are tens of plugin executions, plugins and all the possible Maven black magic you can think of. The default options for build introspection (help plugin, enable debug, etc.) left me helpless in the middle of a gargantuan build execution log file.&lt;/p&gt;

&lt;h1&gt;Plan plugin FTW&lt;/h1&gt;

&lt;p&gt;I ended up writing a small plugin to help me debugging the build by dumping the execution plan. I originally named it &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://plan-maven-plugin.skuro.tk&quot;&gt;&lt;code&gt;plan-maven-plugin&lt;/code&gt;&lt;/a&gt;, and put all the sources on &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;https://github.com/skuro/plan-maven-plugin&quot;&gt;github&lt;/a&gt;. As the plugin is already on &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://search.maven.org/#artifactdetails%7Ctk.skuro%7Cplan-maven-plugin%7C1.1%7Cmaven-plugin&quot;&gt;Maven Central&lt;/a&gt;, you only need to place the following in your &lt;code&gt;settings.xml&lt;/code&gt;:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;&amp;lt;pluginGroups&amp;gt;
  &amp;lt;pluginGroup&amp;gt;tk.skuro&amp;lt;/pluginGroup&amp;gt;
&amp;lt;/pluginGroups&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Thanks to &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;https://github.com/dthume&quot;&gt;David Thume&lt;/a&gt;, this is what it looks like now:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;$ mvn plan:plan -Dgoals=clean,javadoc:jar,sources:jar,package,gpg:sign
...
[INFO] --- plan-maven-plugin:1.1:plan (default-cli) @ plan-maven-plugin ---
[INFO] 
[INFO] Current lifecycle:
[INFO]     pre-clean
[INFO]     clean
[INFO]     post-clean
[INFO]     validate
[INFO]     initialize
[INFO]     generate-sources
[INFO]     process-sources
[INFO]     generate-resources
[INFO]     process-resources
[INFO]     compile
[INFO]     process-classes
[INFO]     generate-test-sources
[INFO]     process-test-sources
[INFO]     generate-test-resources
[INFO]     process-test-resources
[INFO]     test-compile
[INFO]     process-test-classes
[INFO]     test
[INFO]     prepare-package
[INFO]     package
[INFO]     pre-integration-test
[INFO]     integration-test
[INFO]     post-integration-test
[INFO]     verify
[INFO]     install
[INFO]     deploy
[INFO]     
[INFO] Execution plan:
[INFO]     [clean] org.apache.maven.plugins:maven-clean-plugin:clean (default-clean)
[INFO]     [-] org.apache.maven.plugins:maven-javadoc-plugin:jar (default-cli)
[INFO]     [-] org.apache.maven.plugins:maven-source-plugin:jar (default-cli)
[INFO]     [validate] org.apache.maven.plugins:maven-enforcer-plugin:enforce (enforce-maven)
[INFO]     [generate-resources] org.apache.maven.plugins:maven-plugin-plugin:descriptor (default-descriptor)
[INFO]     [process-resources] org.apache.maven.plugins:maven-resources-plugin:resources (default-resources)
[INFO]     [compile] org.apache.maven.plugins:maven-compiler-plugin:compile (default-compile)
[INFO]     [process-test-resources] org.apache.maven.plugins:maven-resources-plugin:testResources (default-testResources)
[INFO]     [test-compile] org.apache.maven.plugins:maven-compiler-plugin:testCompile (default-testCompile)
[INFO]     [test] org.apache.maven.plugins:maven-surefire-plugin:test (default-test)
[INFO]     [package] org.apache.maven.plugins:maven-jar-plugin:jar (default-jar)
[INFO]     [package] org.apache.maven.plugins:maven-plugin-plugin:addPluginArtifactMetadata (default-addPluginArtifactMetadata)
[INFO]     [-] org.apache.maven.plugins:maven-gpg-plugin:sign (default-cli)
...
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;I still have a long way to go before I can bring my build to acceptable performance levels, but surely enough this will give me much more insights on what's possibly going wrong. Enjoy!&lt;/p&gt;
&lt;div class=&quot;feedflare&quot;&gt;
&lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://feeds.feedburner.com/~ff/Skuro?a=G0_Gmaf_OPw:IzXrEz0F8kY:yIl2AUoC8zA&quot;&gt;&lt;img src=&quot;http://feeds.feedburner.com/~ff/Skuro?d=yIl2AUoC8zA&quot; border=&quot;0&quot;&gt;&lt;/a&gt; &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://feeds.feedburner.com/~ff/Skuro?a=G0_Gmaf_OPw:IzXrEz0F8kY:V_sGLiPBpWU&quot;&gt;&lt;img src=&quot;http://feeds.feedburner.com/~ff/Skuro?i=G0_Gmaf_OPw:IzXrEz0F8kY:V_sGLiPBpWU&quot; border=&quot;0&quot;&gt;&lt;/a&gt; &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://feeds.feedburner.com/~ff/Skuro?a=G0_Gmaf_OPw:IzXrEz0F8kY:7Q72WNTAKBA&quot;&gt;&lt;img src=&quot;http://feeds.feedburner.com/~ff/Skuro?d=7Q72WNTAKBA&quot; border=&quot;0&quot;&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src=&quot;http://feeds.feedburner.com/~r/Skuro/~4/G0_Gmaf_OPw&quot; height=&quot;1&quot; width=&quot;1&quot;/&gt;</description>
         <guid isPermaLink="false">http://skuro.tk/2012/05/08/debug-your-build-with-the-plan-maven-plugin/</guid>
         <pubDate>Mon, 07 May 2012 22:00:00 +0000</pubDate>
      </item>
      <item>
         <title>Select metadata edit form based on aspect</title>
         <link>http://loftux.com/2012/05/04/select-metadata-edit-form-based-on-aspect/</link>
         <description>For a client I needed to come up with a solution to use a specific metadata edit form when the document had a certain aspect applied. Reason was that that if it had this aspect, you should only be allowed to edit this subset of metadata, not the default name, title etc (sort of a [...]</description>
         <guid isPermaLink="false">http://loftux.se/?p=877</guid>
         <pubDate>Fri, 04 May 2012 11:11:20 +0000</pubDate>
         <content:encoded><![CDATA[<p>For a client I needed to come up with a solution to use a specific metadata edit form when the document had a certain aspect applied. Reason was that that if it had this aspect, you should only be allowed to edit this subset of metadata, not the default name, title etc (sort of a lockdown). Out of the box you can only configure different forms based on document type so I needed to find a way to see if the document had the aspect applied, and if so show a special form.</p>
<p>In Share, when I need to alter default functionality I start with looking into the page I need to change, and then find out how this page is called, and if I can add parameters or need to change javascript. In this case it is page/site/{site}/edit-metadata that I somehow need to tell to use a different form. This page use template-instances/edit-metadata.xml, and in there is a form component</p>
<pre>
&lt;!-- Edit Metadata Form --&gt;
&lt;component&gt;
  &lt;region-id&gt;edit-metadata&lt;/region-id&gt;
  &lt;url&gt;/components/form&lt;/url&gt;
  &lt;properties&gt;
    &lt;itemKind&gt;node&lt;/itemKind&gt;
    &lt;itemId&gt;{nodeRef}&lt;/itemId&gt;
    &lt;mode&gt;edit&lt;/mode&gt;
    &lt;submitType&gt;json&lt;/submitType&gt;
    &lt;showCaption&gt;true&lt;/showCaption&gt;
    &lt;showCancelButton&gt;true&lt;/showCancelButton&gt;
  &lt;/properties&gt;
&lt;/component&gt;
</pre>
<p>The form is rendered using the webscript /components/form, now I need to find out if there is a way to pass in a form id. I then look in folder site-webscripts/org/alfresco/components/form/ to find out how the form generation works, form.get.html.ftl includes form.lib.ftl and in there I can see that you can pass formId as an argument. I can now either alter template-instances/edit-metadata.xml, or use the new Surf extensibility functionality (from version 4.0). With a surf extension i add to site-data/extension a file called myextension.xml with content</p>
<pre>
&lt;extension&gt;
	&lt;modules&gt;
		&lt;module&gt;
			&lt;id&gt;ReplaceForm&lt;/id&gt;
			&lt;description&gt;Show edit metadata for specific form&lt;/description&gt;
			&lt;components&gt;
				&lt;component&gt;
					&lt;scope&gt;template&lt;/scope&gt;
					&lt;region-id&gt;edit-metadata&lt;/region-id&gt;
					&lt;source-id&gt;edit-metadata&lt;/source-id&gt;
					&lt;sub-components&gt;
						&lt;sub-component id=&quot;default&quot;&gt;
							&lt;evaluations&gt;
								&lt;evaluation id=&quot;hide&quot;&gt;
									&lt;render&gt;false&lt;/render&gt;
								&lt;/evaluation&gt;
							&lt;/evaluations&gt;
						&lt;/sub-component&gt;
						&lt;sub-component id=&quot;edit-metadata-new&quot; index=&quot;25&quot;&gt;
							&lt;url&gt;/components/form&lt;/url&gt;
							&lt;properties&gt;
								&lt;itemKind&gt;node&lt;/itemKind&gt;
								&lt;itemId&gt;{nodeRef}&lt;/itemId&gt;
								&lt;formId&gt;{formId}&lt;/formId&gt;
								&lt;mode&gt;edit&lt;/mode&gt;
								&lt;submitType&gt;json&lt;/submitType&gt;
								&lt;showCaption&gt;true&lt;/showCaption&gt;
								&lt;showCancelButton&gt;true&lt;/showCancelButton&gt;
							&lt;/properties&gt;
						&lt;/sub-component&gt;
					&lt;/sub-components&gt;
				&lt;/component&gt;
			&lt;/components&gt;
		&lt;/module&gt;
	&lt;/modules&gt;
&lt;/extension&gt;
</pre>
<p>I will not go into details about surf extension, instead watch the Alfresco <a rel="nofollow" target="_blank" href="http://www2.alfresco.com/TTL_Episode54">Webinar</a> about Surf extension with David Draper and read the <a rel="nofollow" target="_blank" href="http://www.slideshare.net/alfresco/tech-talk-live-on-share-extensibility">slides</a>. What happens when this customization is applied is that the default component is replaced by one that can take formId as url parameter. You can easily test this (when above extension is applied) by navigating to page edit-metadata and in the end of the url add &#038;formId=doclib-simple-metadata. You will se the form that is normally just used for the popup edit metadata dialog in the full page edit.</p>
<p>So now I need a way to call this page with the formId parameter. The edit-metadata page is opened using a document library action, so I need to append the formId parameter if (and only then) the aspect in question is used. From version 4.0 this is in configuration that you can easily alter. The default config for actions is found in share/WEB-INF/classes/alfresco/share-documentlibrary-config.xml. From there I came up with this config that you can put in share-config-custom.xml</p>
<pre>
  &lt;config evaluator=&quot;string-compare&quot; condition=&quot;DocLibActions&quot;&gt;
    &lt;!-- Action definitions --&gt;
    &lt;actions&gt;
      &lt;action id=&quot;document-edit-metadata&quot; type=&quot;pagelink&quot; label=&quot;actions.document.edit-metadata&quot;&gt;
        &lt;param name=&quot;page&quot;&gt;edit-metadata?nodeRef={node.nodeRef}&lt;/param&gt;
        &lt;permissions&gt;
          &lt;permission allow=&quot;true&quot;&gt;Write&lt;/permission&gt;
        &lt;/permissions&gt;
        &lt;evaluator negate=&quot;true&quot;&gt;evaluator.doclib.action.isLocked&lt;/evaluator&gt;
        &lt;override&gt;document-edit-properties&lt;/override&gt;
      &lt;/action&gt;
      &lt;action id=&quot;document-edit-metadata-diarie&quot; type=&quot;pagelink&quot; label=&quot;actions.document.edit-metadata&quot;&gt;
        &lt;param name=&quot;page&quot;&gt;&lt;![CDATA[edit-metadata?nodeRef={node.nodeRef}&amp;formId=diarie]]&gt;&lt;/param&gt;
        &lt;permissions&gt;
          &lt;permission allow=&quot;true&quot;&gt;Write&lt;/permission&gt;
        &lt;/permissions&gt;
        &lt;evaluator&gt;evaluator.isDiarieNotLocked&lt;/evaluator&gt;
        &lt;override&gt;document-edit-metadata&lt;/override&gt;
        &lt;override&gt;document-edit-properties&lt;/override&gt;
      &lt;/action&gt;
    &lt;/actions&gt;

    &lt;!-- Action Group definitions --&gt;
    &lt;actionGroups&gt;
      &lt;actionGroup id=&quot;document-browse&quot;&gt;
        &lt;action index=&quot;130&quot; id=&quot;document-edit-metadata&quot; /&gt;
        &lt;action index=&quot;130&quot; id=&quot;document-edit-metadata-diarie&quot; /&gt;
      &lt;/actionGroup&gt;
      &lt;actionGroup id=&quot;document-details&quot;&gt;
        &lt;action index=&quot;120&quot; id=&quot;document-edit-metadata-diarie&quot; /&gt;
      &lt;/actionGroup&gt;
    &lt;/actionGroups&gt;
  &lt;/config&gt;
</pre>
<p>It does two things, first I replace the popup metadata edit in browse mode, I want the full page. So that is why the default config for action &#8216;document-edit-metadata&#8217; is added. I cannot only add this action to Action group definitions, because then you will see both, that is why I redefine the action, but now with an override to hide document-edit-properties if used. Next is to add my new action &#8216;document-edit-metadata-diarie&#8217; that has the formId parameter. Note that it needs enclose the parameter in CDATA to be valid xml. If the evaluator returns true, then use this one and override the others. So next we need to define the evaluator.isDiarieNotLocked. Default evaluators can be found in share/WEB-INF/classes/alfresco/slingshot-documentlibrary-context.xml. Put yours in a mycustom-context.xml file in the class-path.</p>
<pre>
  &lt;bean id=&quot;evaluator.hasdiariefordaspect&quot; parent=&quot;evaluator.doclib.action.hasAspect&quot;&gt;
    &lt;property name=&quot;aspects&quot;&gt;
      &lt;list&gt;
        &lt;value&gt;lx:diarieFord&lt;/value&gt;
      &lt;/list&gt;
    &lt;/property&gt;
  &lt;/bean&gt;
  &lt;bean id=&quot;evaluator.isNotLocked&quot; parent=&quot;evaluator.doclib.action.chainedMatchOne&quot;&gt;
    &lt;property name=&quot;evaluators&quot;&gt;
      &lt;list&gt;
        &lt;ref bean=&quot;evaluator.doclib.action.notEditable&quot; /&gt;
      &lt;/list&gt;
    &lt;/property&gt;
    &lt;property name=&quot;negateOutput&quot; value=&quot;true&quot; /&gt;
  &lt;/bean&gt;
  &lt;bean id=&quot;evaluator.isDiarieNotLocked&quot; parent=&quot;evaluator.doclib.action.chainedMatchAll&quot;&gt;
    &lt;property name=&quot;evaluators&quot;&gt;
      &lt;list&gt;
        &lt;ref bean=&quot;evaluator.hasdiariefordaspect&quot; /&gt;
        &lt;ref bean=&quot;evaluator.isNotLocked&quot; /&gt;
      &lt;/list&gt;
    &lt;/property&gt;
  &lt;/bean&gt;
</pre>
<p>So my evaluators does this, evaluator.hasdiariefordaspect checks that is has the required aspect, evaluator.isNotLocked evaluates if it can be edited and is not locked (this one propbably can be defined in a smarter way, but it works), then finally put together in evaluator.isDiarieNotLocked where we need both previous evaluators to be true. If you want to learn more about Share Document library extension read Mike Hatfields <a rel="nofollow" target="_blank" href="http://blogs.alfresco.com/wp/mikeh/">blog</a>.</p>
<p>And finally we have customized Share to use a specific form for edit metadata when the document has the selected aspect applied. With only configuration files!</p>
<p>Note that my approach lets user with a bit of knowledge add whatever form id they want in the url, and thus potentially edit hidden metadata. In this use case it was not considered an issue.</p>]]></content:encoded>
      </item>
      <item>
         <title>Checking for Ticks</title>
         <link>http://wanderingalfresco.wordpress.com/2012/04/20/checking-for-ticks/</link>
         <description>This is a follow-on post to my &amp;#8220;Counting the Livestock&amp;#8221; post from a couple of weeks ago. Reading that post first will give some background to this one. With many thanks to Alex Strachan and Chris Turner, I&amp;#8217;ve been able &amp;#8230; &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://wanderingalfresco.wordpress.com/2012/04/20/checking-for-ticks/&quot;&gt;Continue reading &lt;span class=&quot;meta-nav&quot;&gt;&amp;#8594;&lt;/span&gt;&lt;/a&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://stats.wordpress.com/b.gif?host=wanderingalfresco.wordpress.com&amp;#038;blog=23905304&amp;#038;post=166&amp;#038;subd=wanderingalfresco&amp;#038;ref=&amp;#038;feed=1&quot; width=&quot;1&quot; height=&quot;1&quot;/&gt;</description>
         <guid isPermaLink="false">http://wanderingalfresco.wordpress.com/?p=166</guid>
         <pubDate>Fri, 20 Apr 2012 15:31:53 +0000</pubDate>
         <content:encoded><![CDATA[<p>This is a follow-on post to my &#8220;<a rel="nofollow" target="_blank" href="http://wanderingalfresco.wordpress.com/2012/03/02/counting-the-livestock/" title="Counting the livestock">Counting the Livestock</a>&#8221; post from a couple of weeks ago. Reading that post first will give some background to this one.</p>
<p>With many thanks to Alex Strachan and Chris Turner, I&#8217;ve been able to greatly improve the script and have it do a somewhat deeper examination of how the files on disk are referenced by tables in the repository.  I&#8217;ve also greatly cleaned up the script, so it should be easier to understand and modify for use in your environment. (For example, the 7 variables at the start of the script are all you need to change, rather than having to do a search-and-replace for that info throughout.)</p>
<p>First, some background on the structure of the Alfresco database in terms of how it refers to files:</p>
<ol>
<li>At the lowest level, the <code>alf_content_url</code> table directly contains the paths to the files on disk corresponding to nodes in the repository, as well as their sizes.</li>
<li>The <code>alf_content_data</code> table contains things like the mime type and content encoding, and refers to the <code>alf_content_url</code> table.</li>
<li>Finally, 3 tables refer to entries in the <code>alf_content_data</code> table: <code>alf_node_properties</code>, <code>avm_nodes</code>, and <code>alf_audit_model</code>.</li>
</ol>
<p>The script below is designed to check all of that for consistency.  That is, it will let you know if the 5 tables above all map correctly down to files on disk.</p>
<p><span style="color:#f00;"><strong>Important notes:</strong></span></p>
<ol>
<li><span style="color:#f00;"><em>Use the script below at your own risk</em></span>, especially the &#8220;Files on disk that are not in the Alfresco DB. Can be backed up, then deleted.&#8221; bit.  Unless you thoroughly understand what this script is doing and are comfortable with it, <em>be very careful</em> here.  You could badly damage your Alfresco repository.</li>
<li>This is only a reporting tool. If it reports errors in your repository, some may be harmless, some may be indicative of a real problem.  This is meant as a starting point for investigations into potential problems, not as a fix for those problems.</li>
<li>Even though the script below only reads from the database and files on disk, and doesn&#8217;t make any changes, it&#8217;s still a <em>really</em> good idea to have a good backup of the repository and database before running this.</li>
</ol>
<p><span id="more-166"></span></p>
<h2>The Script</h2>
<p>I&#8217;m running EE 3.4.8 on RHEL5 and MySQL, and that&#8217;s what this script is written for.  It shouldn&#8217;t be that hard to modify it for use on other platforms or other databases.</p>
<pre style="font-family:Monaco, Courier, monospace;white-space:pre;line-height:120%;border:1px dashed #aaa8a8;font-size:80%;color:#080;overflow:auto;margin:1em 0;padding:.5em 0 .3em .5em;">#!/bin/bash

#update the 7 variables below to correspond to your environment
DB_HOST=dbhost.company.com
DB_PORT=3306
DB_NAME=alfresco
DB_USER=alfresco
DB_PASS='alfresco'
REPO_PATH="/var/lib/alf_data/contentstore"
TMP_PATH="/tmp/check_db/"

#You may not need to modify anything below this line unless you are adapting
#this script to a different platform
ORIG_WD=`pwd`
mkdir -p $TMP_PATH
cd $TMP_PATH

ESCAPED_REPO_PATH=$(printf "%s&#92;n" "$REPO_PATH" | sed 's/[][&#92;.*^$/]/&#92;&#92;&amp;/g')

#Get the list of files the DB thinks are on disk
/usr/bin/mysql --skip-column-names -u $DB_USER --password=$DB_PASS &#92;
-h $DB_HOST -P $DB_PORT -e "select content_size, content_url FROM alf_content_url " &#92;
$DB_NAME | /bin/sed 's/store:&#92;//&#92;./' | /bin/sort -n --field-separator='/' -k2 -k3 -k4 &#92;
-k5 -k6 -k7 &gt; compare_db_results.txt

#Get the list of files that are actually on disk
/usr/bin/find $REPO_PATH -type f &#92;
| /usr/bin/xargs du -b | /bin/sed "s/$ESCAPED_REPO_PATH/&#92;./" &#92;
| /bin/sort -n --field-separator='/' -k2 -k3 -k4 -k5 -k6 -k7 &gt; compare_file_results.txt

#Compare the list of files from the DB to the list from disk
/usr/bin/diff compare_db_results.txt compare_file_results.txt &#92;
| /bin/sort --field-separator='/' -k2 -k3 -k4 -k5 -k6 -k7 &gt; compare_store_diff.txt

diff_sizes=`/usr/bin/uniq -f2 -D compare_store_diff.txt | grep "[&lt;&gt;]" | &#92;
/bin/sed 's/^&gt;/---&#92;n&gt;/'`
if [ -n "$diff_sizes" ]
then
    echo "WARNING: Files that have different sizes on disk than what's listed in the DB"
    echo "$diff_sizes"
fi

not_on_disk=`/usr/bin/uniq -f2 -u compare_store_diff.txt | /bin/grep "&lt;"`
if [ -n "$not_on_disk" ]
then
    echo
    echo "WARNING: Files listed in the Alfresco DB that are not on disk"
    echo "$not_on_disk"
fi

not_in_db=`/usr/bin/uniq -f2 -u compare_store_diff.txt | /bin/grep "&gt;"`
if [ -n "$not_in_db" ]
then
    echo
    echo "Files on disk that are not in the Alfresco DB. Can be backed up then deleted."
    echo "$not_in_db"
fi

#get the list of nodes that appear in alf_content_data
mysql -N -u $DB_USER --password=$DB_PASS -h $DB_HOST -P $DB_PORT -e &#92;
"select id FROM alf_content_data" $DB_NAME | sort -un &gt; alf_content_data_ids.txt

#get the list of nodes that appear in alf_node_properties
mysql -N -u $DB_USER --password=$DB_PASS -h $DB_HOST -P $DB_PORT -e &#92;
"select long_value FROM alf_node_properties anp WHERE (anp.actual_type_n=21)" $DB_NAME | &#92;
sort -un &gt; alf_node_properties_long_value.txt

#get the list of nodes that appear in avm_nodes
mysql -N -u $DB_USER --password=$DB_PASS -h $DB_HOST -P $DB_PORT -e &#92;
"select substring(content_url,4) FROM avm_nodes" $DB_NAME  | sort -un &gt; &#92;
avm_nodes_content_url.txt

#get the list of nodes that appear in alf_audit_model
mysql -N -u $DB_USER --password=$DB_PASS -h $DB_HOST -P $DB_PORT -e &#92;
"select content_data_id FROM alf_audit_model" $DB_NAME | sort -un &gt; &#92;
alf_audit_model_content_data_id.txt

echo
echo "Unique entries in alf_content_data"
perl -nle 'print if /^&#92;d+$/' alf_content_data_ids.txt | wc -l

echo "Unique entries in alf_node_properties"
perl -nle 'print if /^&#92;d+$/' alf_node_properties_long_value.txt | wc -l

echo "Unique entries in avm_nodes"
perl -nle 'print if /^&#92;d+$/' avm_nodes_content_url.txt | wc -l

echo "Unique entries in alf_audit_model"
perl -nle 'print if /^&#92;d+$/' alf_audit_model_content_data_id.txt | wc -l

echo
echo "Unique entries in use (alf_node_properties + avm_nodes + alf_audit_model)"
cat alf_node_properties_long_value.txt avm_nodes_content_url.txt &#92;
alf_audit_model_content_data_id.txt | sort -un | perl -nle 'print if /^&#92;d+$/' &gt; &#92;
entries_in_use.txt
cat entries_in_use.txt | wc -l

echo
echo "In alf_content_data but not in any of alf_node_properties, avm_nodes, or &#92;
alf_audit_model"
diff alf_content_data_ids.txt entries_in_use.txt | perl -nle 'print if /^&lt; &#92;d+$/' | wc -l

echo "In alf_node_properties but not alf_content_data"
diff alf_content_data_ids.txt alf_node_properties_long_value.txt | &#92;
perl -nle 'print if /^&gt; &#92;d+$/' | wc -l

echo "In avm_nodes but not alf_content_data"
diff alf_content_data_ids.txt avm_nodes_content_url.txt | &#92;
perl -nle 'print if /^&gt; &#92;d+$/' | wc -l

echo "In alf_audit_model but not alf_content_data"
diff alf_content_data_ids.txt alf_audit_model_content_data_id.txt | &#92;
perl -nle 'print if /^&gt; &#92;d+$/' | wc -l

diff alf_content_data_ids.txt entries_in_use.txt | perl -nle 'print if /^&lt; &#92;d+$/' | &#92;
/bin/sed 's/^&lt; //'  &gt;limbo_nodes.txt

nodes_to_check=`perl -pe 's/&#92;n/, /g' limbo_nodes.txt | /bin/sed 's/, $//'`
if [ -n "$nodes_to_check" ]
then
    echo
    echo "Listing of node IDs in alf_content_data that are not in any of &#92;
alf_node_properties, avm_nodes, or alf_audit_model"
    echo "$nodes_to_check"

    echo
    echo "Files corresponding to the node IDs in alf_content_data that are not in any of &#92;
alf_node_properties, avm_nodes, or alf_audit_model"
    mysql -N -u $DB_USER --password=$DB_PASS -h $DB_HOST -P $DB_PORT -e &#92;
    "select acu.content_url from alf_content_data acd, alf_content_url acu where acd.id &#92;
in ($nodes_to_check) AND acd.content_url_id=acu.id;" $DB_NAME | &#92;
    sed "s/store:&#92;//$ESCAPED_REPO_PATH/"
fi

cd $ORIG_WD
rm -rf $TMP_PATH
</pre>
<h2>Example Results</h2>
<h3>Clean repository</h3>
<p>The output from running this script against a fully-intact repository looks like:</p>
<pre style="font-family:Monaco, Courier, monospace;white-space:pre;line-height:120%;border:1px dashed #aaa8a8;font-size:80%;color:#080;overflow:auto;margin:1em 0;padding:.5em 0 .3em .5em;">Unique entries in alf_content_data
15426
Unique entries in alf_node_properties
14459
Unique entries in avm_nodes
962
Unique entries in alf_audit_model
5

Unique entries in use (alf_node_properties + avm_nodes + alf_audit_model)
15426

In alf_content_data but not in any of alf_node_properties, avm_nodes, or alf_audit_model
0
In alf_node_properties but not alf_content_data
0
In avm_nodes but not alf_content_data
0
In alf_audit_model but not alf_content_data
0
</pre>
<h3>Less-clean repository</h3>
<p>The output from running this script against a repository thats still functioning perfectly normally, but has a few issues, looks like the following.  In other words, if you get output like this, <em>don&#8217;t panic</em>!  Everything may still be OK:</p>
<pre style="font-family:Monaco, Courier, monospace;white-space:pre;line-height:120%;border:1px dashed #aaa8a8;font-size:80%;color:#080;overflow:auto;margin:1em 0;padding:.5em 0 .3em .5em;">WARNING: Files that have different sizes on disk than what's listed in the DB
---
&gt; 0	./2012/3/13/14/29/12296f59-d5f6-4c4c-af0d-16583aa299ad.bin
&lt; 270	./2012/3/13/14/29/12296f59-d5f6-4c4c-af0d-16583aa299ad.bin
---
&gt; 0	./2012/3/13/14/29/74f4bb37-440b-4c4d-b118-85aa7c2d3602.bin
&lt; 274	./2012/3/13/14/29/74f4bb37-440b-4c4d-b118-85aa7c2d3602.bin
---
&gt; 0	./2012/3/13/14/29/a03d4b7c-090f-4535-ae6f-fd7ceebf3233.bin
&lt; 352	./2012/3/13/14/29/a03d4b7c-090f-4535-ae6f-fd7ceebf3233.bin
---
&gt; 0	./2012/3/13/14/29/dd9d0e21-78a2-419e-a640-d413243cbb33.bin
&lt; 322	./2012/3/13/14/29/dd9d0e21-78a2-419e-a640-d413243cbb33.bin
---
&gt; 0	./2012/3/13/14/29/dfba42f6-4de8-4ba8-bfac-570dc83919c0.bin
&lt; 270	./2012/3/13/14/29/dfba42f6-4de8-4ba8-bfac-570dc83919c0.bin

Files on disk that are not in the Alfresco DB. Can be deleted.
&gt; 304	./dsmerror.log

Unique entries in alf_content_data
318462
Unique entries in alf_node_properties
305564
Unique entries in avm_nodes
12865
Unique entries in alf_audit_model
5

Unique entries in use (alf_node_properties + avm_nodes + alf_audit_model)
318434

In alf_content_data but not in any of alf_node_properties, avm_nodes, or alf_audit_model
28
In alf_node_properties but not alf_content_data
0
In avm_nodes but not alf_content_data
0
In alf_audit_model but not alf_content_data
0

Listing of node IDs in alf_content_data that are not in any of alf_node_properties, 
avm_nodes, or alf_audit_model
1178218, 1185143, 1185851, 1185858, 1189818, 1189883, 1189887, 1189889, 1189891, 1190182, 
1192920, 1193702, 1193985, 1195720, 1200796, 1228477, 1232014, 1234133, 1234135, 1246246, 
1257045, 1257046, 1307167, 1315011, 1315014, 1315018, 1315306, 1325256

Files corresponding to the node IDs in alf_content_data that are not in any of 
alf_node_properties, avm_nodes, or alf_audit_model
/var/lib/alf_data/contentstore/2011/9/19/19/16/88d5fe33-b713-48e8-9ea5-0c8f9b8e67bc.bin
/var/lib/alf_data/contentstore/2011/10/4/14/45/b8c81f19-c1d7-4742-8ac6-0afdddd25662.bin
/var/lib/alf_data/contentstore/2011/10/5/16/27/653e0bc9-12d6-4793-b193-2cb586d3764c.bin
/var/lib/alf_data/contentstore/2011/10/5/16/27/6bb5309c-bd3c-41fd-9da9-fd15e0ce5775.bin
/var/lib/alf_data/contentstore/2011/10/17/13/32/edd92f96-2592-4665-ae00-43071461ba99.bin
/var/lib/alf_data/contentstore/2011/10/18/14/56/6dfe33b9-bb47-4b4b-9fc4-b3e2a5b5b907.bin
/var/lib/alf_data/contentstore/2011/10/18/14/58/f9a0e767-edd1-48ce-9370-4d14e3905841.bin
/var/lib/alf_data/contentstore/2011/10/18/14/59/82b483df-5993-454a-98a8-1367b19fd833.bin
/var/lib/alf_data/contentstore/2011/10/18/14/59/df59b441-b67d-4a26-a5ee-01911703b9b5.bin
/var/lib/alf_data/contentstore/2011/10/19/16/13/3a664989-fa0b-4e2c-9222-ebd8fe02cf32.bin
/var/lib/alf_data/contentstore/2011/10/26/11/12/06efd829-3468-4b39-8c92-c4822d4b3341.bin
/var/lib/alf_data/contentstore/2011/10/26/17/38/7bae34d5-8097-49f3-b7a9-a2b2cb4c63c8.bin
/var/lib/alf_data/contentstore/2011/10/27/11/16/389f3450-477a-495a-b509-8800c6c6b046.bin
/var/lib/alf_data/contentstore/2011/10/28/13/8/1cefb1b5-664f-427f-b325-906012eba680.bin
/var/lib/alf_data/contentstore/2011/11/4/12/30/bf52a856-9516-4d11-af6a-645c0322d1c2.bin
/var/lib/alf_data/contentstore/2011/12/5/14/45/856d2b67-28e8-40ce-8859-26a29a23afe3.bin
/var/lib/alf_data/contentstore/2011/12/7/16/36/6d4b2dd7-551b-4472-a075-2f9f3e4ecaf6.bin
/var/lib/alf_data/contentstore/2011/12/14/12/42/1910cb27-6812-420e-abcb-05e6793d2e54.bin
/var/lib/alf_data/contentstore/2011/12/14/12/42/f38205bf-2d48-452c-bf5f-36cdb0480f30.bin
/var/lib/alf_data/contentstore/2012/1/12/14/14/c6de3fe1-74c3-410d-903d-b89d3739fb47.bin
/var/lib/alf_data/contentstore/2012/1/30/15/10/2c49054d-b6d4-4864-b2e2-46ce242c1962.bin
/var/lib/alf_data/contentstore/2012/1/30/15/10/59b8d996-6dcc-44dc-9a5e-caf7a9453dc1.bin
/var/lib/alf_data/contentstore/2012/3/7/19/50/9378ca45-851e-4ad2-833c-e7bceed3ded8.bin
/var/lib/alf_data/contentstore/2012/3/14/11/28/80bcceb1-c7bd-485f-aa40-41e6ef0a17d4.bin
/var/lib/alf_data/contentstore/2012/3/14/11/28/2be42bd0-e658-435a-9b07-3c3b06537604.bin
/var/lib/alf_data/contentstore/2012/3/14/11/28/6020177f-ae02-4833-8465-a21cbe24dd09.bin
/var/lib/alf_data/contentstore/2012/3/14/16/32/d42425d9-4139-4c1e-8b08-a394474eafcb.bin
/var/lib/alf_data/contentstore/2012/3/23/14/33/367ff98d-8bce-4970-a67e-be2b41a63ed7.bin
</pre>
<br />  <a rel="nofollow" target="_blank" href="http://feeds.wordpress.com/1.0/gocomments/wanderingalfresco.wordpress.com/166/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/wanderingalfresco.wordpress.com/166/"/></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=wanderingalfresco.wordpress.com&#038;blog=23905304&#038;post=166&#038;subd=wanderingalfresco&#038;ref=&#038;feed=1" width="1" height="1"/>]]></content:encoded>
         <media:content medium="image" url="http://0.gravatar.com/avatar/08db656472ec0d3b2ae3355095abbf5d?s=96&amp;amp;d=identicon&amp;amp;r=G">
            <media:title type="html">icrew</media:title>
         </media:content>
         <category>Scripts</category>
      </item>
      <item>
         <title>New CMIS Spaces 2012.04.19 version</title>
         <link>http://integratedsemantics.org/2012/04/19/new-cmis-spaces-20120419-version/</link>
         <description>&lt;p&gt;&lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://integratedsemantics.org/wp-content/uploads/2012/04/cmis-spaces-20120419.png&quot; title=&quot;CMIS Spaces 2012 04 19&quot;&gt;&lt;img src=&quot;http://integratedsemantics.org/wp-content/uploads/2012/04/cmis-spaces-20120419-3.png&quot; alt=&quot;cmis-spaces-20120419-3.png&quot;/&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;A new version of CMIS Spaces is now available on &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://code.google.com/p/cmisspaces/&quot; title=&quot;CMIS Spaces Google Code Project&quot;&gt;google code&lt;/a&gt;:&lt;/p&gt;
&lt;p&gt;1. Now can set the cmis atompub url for your repository from a preferences dialog without changing the config file. The preferences dialog  is accessed by clicking on the &amp;#8221;Preferences&amp;#8221; button on the login page.&lt;/p&gt;
&lt;p&gt;2. Has fixes for Alfresco 4.x opencmis atompub binding. Tested on Alfresco 4.0d (Alfresco 3.x atompub binding, 4.x opencmis atompub binding,  and soap binding),  IBM FileNet, Nuxeo 5.5,  and Adobe CRX). Still need to test on Microsoft SharePoint and EMC Documentum.&lt;/p&gt;
&lt;p&gt;3. Now uses the video player instead of video display control (so has more controls and fullscreen option). A  &amp;#8221;Play Video&amp;#8221; menu was added to the File menu.&lt;/p&gt;
&lt;p&gt;4. The code has been been split up into libraries (atompub, soap, main cmis spaces lib, etc.) and an app project. Further work is needed on the libraries, maybe could make more like Apache Chemistry OpenCMIS client APIs.&lt;/p&gt;
&lt;p&gt;5. AIR and  &amp;#8221;in browser&amp;#8221; versions are available  A CMIS Spaces Mobile version (like FlexSpace Moble) is coming soon.&lt;/p&gt;</description>
         <author>admin</author>
         <guid isPermaLink="false">http://integratedsemantics.org/2012/04/19/new-cmis-spaces-20120419-version/</guid>
         <pubDate>Fri, 20 Apr 2012 02:15:28 +0000</pubDate>
      </item>
      <item>
         <title>Enviar documentos a Alfresco de forma desantendida</title>
         <link>http://www.fegor.com/2012/04/enviar-documentos-alfresco-de-forma.html</link>
         <description>En ocasiones necesitamos enviar a Alfresco documentos que han sido escaneados o generados por otras aplicaciones de forma automatizada.&lt;br /&gt;&lt;br /&gt;La forma más común de &quot;inyectar&quot; documentos a Alfresco es mediante el uso del protocolo CIFS, de forma que podemos usar una unidad de red o recurso compartido (según el sistema operativo utilizado) para guardar el documento directamente en el entorno de Alfresco.&lt;br /&gt;&lt;br /&gt;En ocasiones, bien porque el producto está limitado a usar unidades de red, o bien, porque necesitamos que los ficheros generados se envíen de alguna forma u orden y a una hora o espacio de tiempo determinado, hay que usar sistemas de copia o de movimiento de ficheros de forma desatendida.&lt;br /&gt;&lt;br /&gt;En este caso, se ha utilizado un sistema utilizando el producto DigiDocFlow (&lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://www.digidocflow.com/&quot;&gt;http://www.digidocflow.com/&lt;/a&gt;) que en lugar de guardar el documento escaneado y el correspondiente fichero XML con los valores de los metadatos en el recurso de red del servidor donde está instalado Alfresco, se ha utilizado un directorio local de la máquina donde está instalado el producto (en Windows XP) y mediante un proceso batch se copian cada minuto a una unidad compartida de red que hace referencia a una carpeta de Alfresco llamada FROMSCAN.&lt;br /&gt;&lt;br /&gt;&lt;div class=&quot;separator&quot; style=&quot;clear:both;text-align:center;&quot;&gt;&lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://1.bp.blogspot.com/-boZEgSK7M2Q/T41GPP6CMKI/AAAAAAAAAOA/X5DAvI4VnKI/s1600/articuloblog.png&quot; style=&quot;margin-left:1em;margin-right:1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;230&quot; src=&quot;http://1.bp.blogspot.com/-boZEgSK7M2Q/T41GPP6CMKI/AAAAAAAAAOA/X5DAvI4VnKI/s400/articuloblog.png&quot; width=&quot;400&quot;/&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;Los pasos han sido:&lt;br /&gt;&lt;br /&gt;1. Crear una carpeta en Company Home de Alfresco llamada FROMSCAN. Esta llevará las reglas necesarias para mover los documentos que entran.&lt;br /&gt;&lt;br /&gt;2. Crear una carpeta local en Windows XP donde está instalado DigiDocFlow llamada también FROMSCAN.&lt;br /&gt;&lt;br /&gt;3. Escribir el siguiente fichero batch:&lt;br /&gt;&lt;br /&gt;&lt;div style=&quot;&quot;&gt;@ECHO OFF&lt;/div&gt;&lt;div style=&quot;&quot;&gt;SET CARPETAWIN=C:&amp;#92;FROMSCAN&lt;/div&gt;&lt;div style=&quot;&quot;&gt;SET CARPETAALF=Y:&amp;#92;FROMSCAN&lt;/div&gt;&lt;div style=&quot;&quot;&gt;COPY /Y &quot;%CARPETAWIN%&amp;#92;*.pdf&quot; &quot;%CARPETAALF%&quot;&lt;/div&gt;&lt;div style=&quot;&quot;&gt;COPY /Y &quot;%CARPETAWIN%&amp;#92;*.xml&quot; &quot;%CARPETAALF%&quot;&lt;/div&gt;&lt;div style=&quot;&quot;&gt;IF ERRORLEVEL 1 GOTO SALIR&lt;/div&gt;&lt;div style=&quot;&quot;&gt;DEL /F /Q &quot;%CARPETAWIN%&amp;#92;*.*&quot;&lt;/div&gt;&lt;div style=&quot;&quot;&gt;:SALIR&lt;/div&gt;&lt;br /&gt;4. Crear la tarea (ejecutar en intérprete de comandos en Windows XP llamado CMD.EXE) para que se realice (ejecute) el batch cada hora:&lt;br /&gt;&lt;br /&gt;&lt;div style=&quot;&quot;&gt;SCHTASKS /CREATE /TN FROMSCAN /TR &quot;CMD /C &amp;#92;&quot;C:&amp;#92;FROMSCAN.BAT&amp;#92;&quot;&quot; /SC HOURLY&lt;/div&gt;&lt;br /&gt;Hay que tener en cuenta &quot;escapar&quot; las comillas con &amp;#92; para que no se produzcan errores, no en este caso, pero si, si en el directorio o nombre de fichero batch se contienen caracteres en blanco.&lt;br /&gt;&lt;br /&gt;De esta forma podemos tener incluso un directorio local donde van a parar ficheros que provienen de un ERP, un CRM o un sistema de escaneo como Kofax o DigiDocFlow sin tener que usar ningún tipo de conector y personalizando tanto el tiempo de envío de los ficheros como el orden.&lt;br /&gt;&lt;br /&gt;</description>
         <author>Fernando González</author>
         <guid isPermaLink="false">tag:blogger.com,1999:blog-13003183.post-8235946289600264489</guid>
         <pubDate>Tue, 17 Apr 2012 12:33:00 +0000</pubDate>
         <media:thumbnail height="72" url="http://1.bp.blogspot.com/-boZEgSK7M2Q/T41GPP6CMKI/AAAAAAAAAOA/X5DAvI4VnKI/s72-c/articuloblog.png" width="72" xmlns:media="http://search.yahoo.com/mrss/"/>
      </item>
      <item>
         <title>Alfresco Certified Administrator</title>
         <link>http://eleaese.blogspot.com/2012/04/alfresco-certified-administrator.html</link>
         <description>&lt;div dir=&quot;ltr&quot; style=&quot;text-align:left;&quot;&gt;Como parte de una nueva etapa de la compañía, Alfresco tiene ahora carreras de certificación. Hay dos líneas, Administración e Ingeniería. Las certificaciones son ACA (Alfresco Certified Administrator) y ACE (Alfresco Certified Enginner). Más detalles están disponibles en el sitio &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://university.alfresco.com/accreditation.html&quot;&gt;Alfresco University&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Como nuestro objetivo es ser partners de Alfresco, queremos homologar nuestra experiencia en la plataforma obtenida desde el año 2006. Por eso he obtenido la primera certificación de la región, y soy:&lt;br /&gt;&lt;br /&gt;&lt;div class=&quot;separator&quot; style=&quot;clear:both;text-align:center;&quot;&gt;&lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://www.impulseit.com/wp/wp-content/uploads/2012/02/ACA_logo1.jpg&quot; style=&quot;margin-left:1em;margin-right:1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;84&quot; src=&quot;http://www.impulseit.com/wp/wp-content/uploads/2012/02/ACA_logo1.jpg&quot; width=&quot;200&quot;/&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;div class=&quot;separator&quot; style=&quot;clear:both;text-align:center;&quot;&gt;&lt;/div&gt;Estoy feliz con este logro. Agradezco a &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://ecmarchitect.com/&quot;&gt;Jeff Potts&lt;/a&gt;, por la inspiración, a &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://cl.linkedin.com/in/haroldverazamora&quot;&gt;Harold Vera&lt;/a&gt;, por su amistad, aportes y conocimientos, a &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://blyx.com/&quot;&gt;Tony&lt;/a&gt;, &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://www.fegor.com/&quot;&gt;Fernando&lt;/a&gt;&amp;nbsp;y&amp;nbsp;&lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://crisinthecloud.blogspot.com/&quot;&gt;Cristina&lt;/a&gt;, por sus notas y tweets, a &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://standardoperationprocedure.blogspot.com/&quot;&gt;Alejandro&lt;/a&gt;&amp;nbsp;y &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://blogs.alfresco.com/wp/cmiguens/&quot;&gt;Carlos&lt;/a&gt;, por sus insights.&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;</description>
         <author>noreply@blogger.com (Luis A. Sanchez)</author>
         <guid isPermaLink="false">tag:blogger.com,1999:blog-6109192527890491381.post-2341296515943793704</guid>
         <pubDate>Sat, 14 Apr 2012 04:06:00 +0000</pubDate>
      </item>
      <item>
         <title>ecm marketplace for Alfresco modules, solutions and services</title>
         <link>http://thinkalfresco.blogspot.com/2012/04/ecm-marketplace-for-alfresco-modules.html</link>
         <description>&lt;span style=&quot;font-family:'Helvetica Neue', Arial, Helvetica, sans-serif;&quot;&gt;There was no update on my blog about Alfresco for quite a long time - but I have a very good excuse: I was busy founding and building up a new company. The company is named ecm4u (see &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://www.ecm4u.de/&quot;&gt;http://www.ecm4u.de&lt;/a&gt;) and it offers modules, solutions and services for and connected to the field of ECM/DMS and the Alfresco system in particular.&lt;/span&gt;  &lt;br /&gt;
&lt;br /&gt;
&lt;span style=&quot;font-family:'Helvetica Neue', Arial, Helvetica, sans-serif;&quot;&gt;Recently, we launched the ecm Market (see &lt;/span&gt;&lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://www.ecm-market.de/&quot; style=&quot;font-family:'Helvetica Neue', Arial, Helvetica, sans-serif;&quot;&gt;http://www.ecm-market.de&lt;/a&gt;&lt;span style=&quot;font-family:'Helvetica Neue', Arial, Helvetica, sans-serif;&quot;&gt;) which is a B2B marketplace for tools, modules, complete solutions and services compatible with Alfresco.&lt;/span&gt;&lt;br /&gt;
&lt;h2&gt;



&lt;span style=&quot;font-family:'Helvetica Neue', Arial, Helvetica, sans-serif;font-size:100%;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;h2&gt;




  &lt;span style=&quot;font-family:'Helvetica Neue', Arial, Helvetica, sans-serif;font-size:100%;&quot;&gt;Who could benefit from the ecm Market?&lt;/span&gt;&lt;/h2&gt;
&lt;div&gt;
&lt;span style=&quot;font-family:'Helvetica Neue', Arial, Helvetica, sans-serif;font-size:100%;&quot;&gt;  &lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;div style=&quot;font-size:100%;font-style:normal;font-variant:normal;font-weight:normal;line-height:normal;&quot;&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;h3&gt;




  &lt;span style=&quot;font-family:'Helvetica Neue', Arial, Helvetica, sans-serif;&quot;&gt;First: Companies that use Alfresco today&lt;/span&gt;&lt;/h3&gt;
&lt;div style=&quot;font-size:100%;font-style:normal;font-variant:normal;font-weight:normal;line-height:normal;&quot;&gt;
&lt;span style=&quot;font-family:'Helvetica Neue', Arial, Helvetica, sans-serif;&quot;&gt;  &lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;font-size:100%;font-style:normal;font-variant:normal;font-weight:normal;line-height:normal;&quot;&gt;
&lt;span style=&quot;font-family:'Helvetica Neue', Arial, Helvetica, sans-serif;&quot;&gt;When Alfresco is already up and running, the users start to like it and usually soon request more features. Most requirements will be small ones that improve usability, for example:&lt;/span&gt;&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;&lt;span style=&quot;font-family:'Helvetica Neue', Arial, Helvetica, sans-serif;font-size:100%;&quot;&gt;Sending a document link to a collegue&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family:'Helvetica Neue', Arial, Helvetica, sans-serif;&quot;&gt;Sending document as attachment&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family:'Helvetica Neue', Arial, Helvetica, sans-serif;&quot;&gt;Zipping up a space&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family:'Helvetica Neue', Arial, Helvetica, sans-serif;&quot;&gt;Changing multiple properties in one go&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family:'Helvetica Neue', Arial, Helvetica, sans-serif;&quot;&gt;....&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;div&gt;
&lt;span style=&quot;font-family:'Helvetica Neue', Arial, Helvetica, sans-serif;&quot;&gt;Modules that extend Alfresco with those features can be found at the ecm Market &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://www.ecm-market.de/alfresco-module/produktivitaet.html&quot;&gt;productivity&lt;/a&gt; category for example.&lt;/span&gt;&lt;span style=&quot;font-family:'Helvetica Neue', Arial, Helvetica, sans-serif;font-size:16px;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;font-family:'Helvetica Neue', Arial, Helvetica, sans-serif;&quot;&gt;The marketplace rules ensures &lt;b&gt;instant availability&lt;/b&gt; and a &lt;b&gt;ready-to-use&lt;/b&gt; package for download and the installation of the module. Using the ecm Market also provides&amp;nbsp;&lt;b&gt;safety&lt;/b&gt;, as it allows to &lt;b&gt;compare&lt;/b&gt; similar modules regarding functionality. Last but not least, because every product is presented with a given&amp;nbsp;&lt;b&gt;price&lt;/b&gt;. It is also possible to &lt;b&gt;return and refund&lt;/b&gt; a module if it does not work as expected and described. All ecm Market modules also come with &lt;b&gt;support&lt;/b&gt;, so that it is assured that any arising problems are handled and resolved.&lt;/span&gt;  &lt;span style=&quot;font-family:'Helvetica Neue', Arial, Helvetica, sans-serif;&quot;&gt;  &lt;/span&gt;  &lt;br /&gt;
&lt;h3&gt;




&lt;span style=&quot;font-family:'Helvetica Neue', Arial, Helvetica, sans-serif;&quot;&gt;&lt;br /&gt;
&lt;/span&gt;&lt;/h3&gt;
&lt;h3&gt;




  &lt;span style=&quot;font-family:'Helvetica Neue', Arial, Helvetica, sans-serif;&quot;&gt;Second: Companies that think of introducing Alfresco&lt;/span&gt;&lt;/h3&gt;
&lt;div&gt;
&lt;span style=&quot;font-family:'Helvetica Neue', Arial, Helvetica, sans-serif;&quot;&gt;  &lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span style=&quot;font-family:'Helvetica Neue', Arial, Helvetica, sans-serif;&quot;&gt;In the first place, it is usually a single specific use case that make companies think of using Alfresco. Typical use cases could be:&lt;/span&gt;&lt;/div&gt;
&lt;ul style=&quot;font-size:100%;font-style:normal;font-variant:normal;font-weight:normal;line-height:normal;&quot;&gt;&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;&lt;span style=&quot;font-family:'Helvetica Neue', Arial, Helvetica, sans-serif;&quot;&gt;Simple collaboration needs: distributed employees need to collaborate and work together, exchange documents&lt;/span&gt;&lt;/li&gt;
&lt;li style=&quot;font-size:100%;font-style:normal;font-variant:normal;font-weight:normal;line-height:normal;&quot;&gt;&lt;span style=&quot;font-family:'Helvetica Neue', Arial, Helvetica, sans-serif;&quot;&gt;The SubCon Case: Plenty of subcontractors are delivering parts within a big project. They are also competitors, so each subcontractor has its own specific area in Alfresco without being able to see the quotes and numbers of each other.&lt;/span&gt;&lt;/li&gt;
&lt;li style=&quot;font-size:100%;font-style:normal;font-variant:normal;font-weight:normal;line-height:normal;&quot;&gt;&lt;span style=&quot;font-family:'Helvetica Neue', Arial, Helvetica, sans-serif;&quot;&gt;Managing invoices and contracts&lt;/span&gt;&lt;/li&gt;
&lt;li style=&quot;font-size:100%;font-style:normal;font-variant:normal;font-weight:normal;line-height:normal;&quot;&gt;&lt;span style=&quot;font-family:'Helvetica Neue', Arial, Helvetica, sans-serif;&quot;&gt;Fulfilling quality process requirements&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;span style=&quot;font-family:'Helvetica Neue', Arial, Helvetica, sans-serif;font-size:100%;&quot;&gt;For collaboration requirements, Alfresco can be used out-of-the-box, as it is very strong in collaboration, sharing content and working together. For the other use cases, Alfresco needs to be extended to fulfill the requirements. This has to be done by a system &lt;/span&gt;&lt;span style=&quot;font-family:'Helvetica Neue', Arial, Helvetica, sans-serif;&quot;&gt;integrator&lt;/span&gt;&lt;span style=&quot;font-family:'Helvetica Neue', Arial, Helvetica, sans-serif;&quot;&gt;&lt;span style=&quot;font-size:100%;&quot;&gt; with a deep knowledge of Alfresco and will result in a &lt;/span&gt;straight&lt;span style=&quot;font-size:100%;&quot;&gt; software-tailoring-IT project. &lt;/span&gt;&lt;/span&gt;  &lt;span style=&quot;font-family:'Helvetica Neue', Arial, Helvetica, sans-serif;&quot;&gt;&lt;span style=&quot;font-size:100%;&quot;&gt; &lt;/span&gt;&lt;/span&gt;  &lt;span style=&quot;font-family:'Helvetica Neue', Arial, Helvetica, sans-serif;&quot;&gt;&lt;span style=&quot;font-size:100%;&quot;&gt;While a software development project will allow to perfectly customize Alfresco to your needs, you always take the good with the bad. IT projects can be risky in terms of timeline and budget, as we all know. Deep customization will make updates to future releases of the main product a very difficult task. Using a prepackaged module that contains a part of the required functionality can help to reduce the project risk in terms of budget and a shortened timeline. Most modules of the ecm Market will have received much more testing, because they are used multiple times by many customers, thus providing better quality at a lower cost. &lt;/span&gt;&lt;/span&gt;  &lt;span style=&quot;font-family:'Helvetica Neue', Arial, Helvetica, sans-serif;&quot;&gt; &lt;/span&gt;  &lt;br /&gt;
&lt;h3&gt;



&lt;span style=&quot;font-family:'Helvetica Neue', Arial, Helvetica, sans-serif;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;h3&gt;




  &lt;span style=&quot;font-family:'Helvetica Neue', Arial, Helvetica, sans-serif;&quot;&gt;Third: System Integrators&lt;/span&gt;&lt;/h3&gt;
&lt;div&gt;
&lt;span style=&quot;font-family:'Helvetica Neue', Arial, Helvetica, sans-serif;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;
&lt;span style=&quot;font-family:'Helvetica Neue', Arial, Helvetica, sans-serif;&quot;&gt; &lt;/span&gt;  &lt;span style=&quot;font-family:'Helvetica Neue', Arial, Helvetica, sans-serif;&quot;&gt;The point of view of system integrators is usually providing high quality services by experts. Software developers, architects and analysts work together to implement business requirements for a customer.&lt;/span&gt;  &lt;span style=&quot;font-family:'Helvetica Neue', Arial, Helvetica, sans-serif;&quot;&gt; &lt;/span&gt;  &lt;span style=&quot;font-family:'Helvetica Neue', Arial, Helvetica, sans-serif;&quot;&gt;Although the requirements for a customer in a project can be very specific, there are always recurring or cross-cutting issues and solutions that can be applied again in different contexts and therefore reused. In the early stage of a project, in my opinion, it is no (nearly no) additional effort to identify those requirements and to factor them out in a separate module (or code-library) that can be reused in the next project. Or, even better, companies can benefit by offering these modules one the ecm Market. By doing so, further development could be funded and the module can be improved with new features or a more robust implementation. Also, new regions and markets can be addressed by the ecm Market - a rather difficult task for a single company that has to rely on its individual marketing and sales efforts.&lt;/span&gt;  &lt;span style=&quot;font-family:'Helvetica Neue', Arial, Helvetica, sans-serif;&quot;&gt; &lt;/span&gt;  &lt;span style=&quot;font-family:'Helvetica Neue', Arial, Helvetica, sans-serif;&quot;&gt;All system integrators are invited to improve the number and range of available products at the ecm Market. A large marketplace has advantages for all participants. &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;https://www.ecm-market.de/index.php/vendor/signup/&quot;&gt;Registration&lt;/a&gt; and &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://www.ecm-market.de/anbieter-informationen&quot;&gt;information&lt;/a&gt;&amp;nbsp;on how to become a vendor on the ecm Market is available in both English and German language following the above links.&lt;/span&gt;  &lt;span style=&quot;font-family:'Helvetica Neue', Arial, Helvetica, sans-serif;&quot;&gt; &lt;/span&gt;  &lt;br /&gt;
&lt;h3&gt;



&lt;span style=&quot;font-family:'Helvetica Neue', Arial, Helvetica, sans-serif;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;h3&gt;




  &lt;span style=&quot;font-family:'Helvetica Neue', Arial, Helvetica, sans-serif;&quot;&gt;Fourth: The Alfresco Community and ecosystem&lt;/span&gt;&lt;/h3&gt;
&lt;div&gt;
&lt;span style=&quot;font-family:'Helvetica Neue', Arial, Helvetica, sans-serif;&quot;&gt;&lt;/span&gt;&lt;/div&gt;
&lt;span style=&quot;font-family:'Helvetica Neue', Arial, Helvetica, sans-serif;&quot;&gt;I am convinced, that the ecm Market will improve and spread the usage of Alfresco. Small and medium sized companies, who do not currently use Alfresco, will be able to introduce it at lower costs and risks. Why? Because they will be able to find a module specific (or close) to their first and primary use case. This will lower the entry of doing a quick pilot project with the Community version. And as soon as the system usage and its importance grows within the company, upgrade to an Enterprise Version to have it covered with the appropriate level of support and features needed for operation in an enterprise environment as a first line system.&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family:'Helvetica Neue', Arial, Helvetica, sans-serif;&quot;&gt;&lt;span style=&quot;font-size:100%;&quot;&gt;&lt;i&gt;&lt;/i&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;a rel=&quot;nofollow&quot; name='more'&gt;&lt;/a&gt;&lt;span style=&quot;font-family:'Helvetica Neue', Arial, Helvetica, sans-serif;&quot;&gt;&lt;span style=&quot;font-size:100%;&quot;&gt;&lt;i&gt;&lt;br /&gt;&lt;/i&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family:'Helvetica Neue', Arial, Helvetica, sans-serif;&quot;&gt; &lt;/span&gt;  &lt;span style=&quot;font-family:'Helvetica Neue', Arial, Helvetica, sans-serif;&quot;&gt; &lt;/span&gt;  &lt;span style=&quot;font-family:'Helvetica Neue', Arial, Helvetica, sans-serif;&quot;&gt; &lt;/span&gt;  &lt;span style=&quot;font-family:'Helvetica Neue', Arial, Helvetica, sans-serif;&quot;&gt;&lt;span style=&quot;font-size:100%;&quot;&gt;&lt;i&gt;&quot;So? Come up to the lab&quot;&lt;/i&gt; and browse the &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://www.ecm-market.de/alfresco-module.html/&quot;&gt;currently available modules and offerings&lt;/a&gt;.&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family:'Helvetica Neue', Arial, Helvetica, sans-serif;&quot;&gt;&lt;span style=&quot;font-size:100%;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family:'Helvetica Neue', Arial, Helvetica, sans-serif;&quot;&gt;&lt;span style=&quot;font-size:100%;&quot;&gt; &lt;/span&gt;&lt;/span&gt;  &lt;span style=&quot;font-family:'Helvetica Neue', Arial, Helvetica, sans-serif;&quot;&gt;&lt;span style=&quot;font-size:100%;&quot;&gt;If you have not found what you are looking for, contact me at &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;mailto:lothar.maerkle@ecm4u.de&quot;&gt;lothar.maerkle@ecm4u.de&lt;/a&gt; to talk about your requirements or ideas. We are willing to help you at any stage of your investigation. If you have a great idea or use case, we are open to also take some risk, e.g. to implement some part of it on our own for you. Let's talk about it!&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;div style=&quot;font-family:Georgia, serif;font-size:100%;font-style:normal;font-variant:normal;font-weight:normal;line-height:normal;&quot;&gt;
&lt;/div&gt;
&lt;div style=&quot;font-family:Georgia, serif;font-size:100%;font-style:normal;font-variant:normal;font-weight:normal;line-height:normal;&quot;&gt;
&lt;/div&gt;
&lt;div style=&quot;font-family:Georgia, serif;font-size:100%;font-style:normal;font-variant:normal;font-weight:normal;line-height:normal;&quot;&gt;
&lt;/div&gt;
&lt;div style=&quot;font-family:Georgia, serif;font-size:100%;font-style:normal;font-variant:normal;font-weight:normal;line-height:normal;&quot;&gt;
&lt;/div&gt;
&lt;div style=&quot;font-family:Georgia, serif;font-size:100%;font-style:normal;font-variant:normal;font-weight:normal;line-height:normal;&quot;&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div style=&quot;font-family:Georgia, serif;font-size:100%;font-style:normal;font-variant:normal;font-weight:normal;line-height:normal;&quot;&gt;
&lt;/div&gt;
&lt;div style=&quot;font-family:Georgia, serif;font-size:100%;font-style:normal;font-variant:normal;font-weight:normal;line-height:normal;&quot;&gt;
&lt;/div&gt;
&lt;div style=&quot;font-family:Georgia, serif;font-size:100%;font-style:normal;font-variant:normal;font-weight:normal;line-height:normal;&quot;&gt;
&lt;/div&gt;
&lt;div style=&quot;font-family:Georgia, serif;font-size:16px;font-style:normal;font-variant:normal;font-weight:normal;line-height:normal;&quot;&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;</description>
         <author>noreply@blogger.com (Lothar Märkle)</author>
         <guid isPermaLink="false">tag:blogger.com,1999:blog-3862704576763351872.post-8961730330354609744</guid>
         <pubDate>Thu, 12 Apr 2012 19:14:00 +0000</pubDate>
      </item>
      <item>
         <title>Getting Alfresco Content Types via JavaScript</title>
         <link>http://blog.alfrescian.com/?p=202</link>
         <description>&lt;p&gt;I was asked if it is possible to access Alfresco&amp;#8217;s DictionaryService via JavaScript&amp;#8230;Well, not directly using an offical Alfresco JS Root-Object, but it isn&amp;#8217;t a big task if you use some functions of the embedded Rhine engine (&amp;amp; of course Florian&amp;#8217;s famous Alfresco JavaScript Console &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://alfresco.fme.de/JavaScript-Console.923.0.html&quot;&gt;http://alfresco.fme.de/JavaScript-Console.923.0.html&lt;/a&gt;):&lt;/p&gt;
&lt;pre class=&quot;wp-code-highlight prettyprint&quot;&gt;var ctx = Packages.org.springframework.web.context.ContextLoader.getCurrentWebApplicationContext();
var model = Packages.org.alfresco.model.ContentModel;
var dictionaryService = ctx.getBean(&amp;quot;DictionaryService&amp;quot;);
types = dictionaryService.getSubTypes(model.TYPE_CONTENT, true).toArray();
for each(var type in types){
  print(type);
}&lt;/pre&gt;
&lt;p&gt;&lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://blog.alfrescian.com/wp-content/uploads/2012/04/JavaScriptConsole-DictionaryService.png&quot;&gt;&lt;img class=&quot;alignnone size-large wp-image-203&quot; title=&quot;JavaScriptConsole-DictionaryService&quot; src=&quot;http://blog.alfrescian.com/wp-content/uploads/2012/04/JavaScriptConsole-DictionaryService-1024x656.png&quot; alt=&quot;&quot; width=&quot;584&quot; height=&quot;374&quot;/&gt;&lt;/a&gt;&lt;/p&gt;</description>
         <author>jan</author>
         <guid isPermaLink="false">http://blog.alfrescian.com/?p=202</guid>
         <pubDate>Wed, 04 Apr 2012 12:45:10 +0000</pubDate>
      </item>
      <item>
         <title>La navigation par catégories dans les sites Alfresco Share 4.0</title>
         <link>http://charles.torda.net/2012/03/23/la-navigation-par-categories-dans-les-sites-alfresco-share-4-0/</link>
         <description>Il y a quelques mois, je présentais un moyen de rendre accessible la navigation par catégories dans les sites Share : Mettre en place la navigation par catégories dans les sites de Share 3.4d. Ce billet est encore régulièrement consulté &amp;#8230; &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://charles.torda.net/2012/03/23/la-navigation-par-categories-dans-les-sites-alfresco-share-4-0/&quot;&gt;Continuer la lecture &lt;span class=&quot;meta-nav&quot;&gt;&amp;#8594;&lt;/span&gt;&lt;/a&gt;</description>
         <guid isPermaLink="false">http://charles.torda.net/?p=544</guid>
         <pubDate>Fri, 23 Mar 2012 14:10:09 +0000</pubDate>
      </item>
      <item>
         <title>Edition « insitu » de la description des documents</title>
         <link>http://charles.torda.net/2012/03/19/edition-insitu-de-la-description-des-documents/</link>
         <description>Alfresco 4.0 est arrivé avec un lot de nouvelles fonctionnalités bien pratiques pour les utilisateurs. On compte parmi elles l&amp;#8217;édition in-situ des métadonnées. Ce billet a pour objectif de présenter ce principe et d&amp;#8217;illustrer quelques améliorations possibles. L&amp;#8217;édition in-situ, qu&amp;#8217;est &amp;#8230; &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://charles.torda.net/2012/03/19/edition-insitu-de-la-description-des-documents/&quot;&gt;Continuer la lecture &lt;span class=&quot;meta-nav&quot;&gt;&amp;#8594;&lt;/span&gt;&lt;/a&gt;</description>
         <guid isPermaLink="false">http://charles.torda.net/?p=521</guid>
         <pubDate>Mon, 19 Mar 2012 12:48:15 +0000</pubDate>
      </item>
      <item>
         <title>Having a chat</title>
         <link>http://wanderingalfresco.wordpress.com/2012/03/14/having-a-chat/</link>
         <description>Lately I&amp;#8217;ve been hanging out a bit on the #Alfresco IRC chat. It&amp;#8217;s quite a useful resource for quick answers from others in the community, and as moral support from others who know what you&amp;#8217;re going through! I personally use &amp;#8230; &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://wanderingalfresco.wordpress.com/2012/03/14/having-a-chat/&quot;&gt;Continue reading &lt;span class=&quot;meta-nav&quot;&gt;&amp;#8594;&lt;/span&gt;&lt;/a&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://stats.wordpress.com/b.gif?host=wanderingalfresco.wordpress.com&amp;#038;blog=23905304&amp;#038;post=161&amp;#038;subd=wanderingalfresco&amp;#038;ref=&amp;#038;feed=1&quot; width=&quot;1&quot; height=&quot;1&quot;/&gt;</description>
         <guid isPermaLink="false">http://wanderingalfresco.wordpress.com/?p=161</guid>
         <pubDate>Wed, 14 Mar 2012 19:04:56 +0000</pubDate>
         <content:encoded><![CDATA[<p>Lately I&#8217;ve been hanging out a bit on the #Alfresco IRC chat.  It&#8217;s quite a useful resource for quick answers from others in the community, and as moral support from others who know what you&#8217;re going through!</p>
<p>I personally use <a rel="nofollow" target="_blank" href="http://adium.im/">Adium</a> to connect to it, and, since it&#8217;s a bit obscure, I thought I&#8217;d post some instructions on how to get Adium to connect to the #Alfresco IRC chat:</p>
<ol>
<li>Choose preferences from the Adium menu</li>
<li>Choose IRC (Internet Relay Chat) from the &#8216;+&#8217; pop-up menu in the lower left corner of the Accounts tab of the Preferences window.</li>
<li>On Account tab in window that appears, enter chat.us.freenode.net.</li>
<li>Nickname should be your nickname on irc, e.g. &#8216;iancrew&#8217;. Leave password field blank.</li>
<li>On Personal tab in that window, enter your IRC nickname in the &#8220;Username (Ident)&#8221; field.</li>
<li>Click OK.</li>
<li>You should see chat.us.freenode.net (nickname) in your accounts list, and it should connect pretty quickly.</li>
<li>Close the preferences window</li>
<li>Choose &#8220;Join Group Chat&#8221; from the File menu</li>
<li>Choose &#8220;chat.us.freenode.net (nickname)&#8221; from the Account pop-up menu</li>
<li>Enter &#8220;#alfresco&#8221; in the Channel field.  Leave the password field blank.</li>
<li>Click Join.</li>
<li>Once you&#8217;re in the chat, choose &#8220;Add Group Chat Bookmark&#8221; from the Contact menu to save the #Alfresco chat in your contacts list</li>
</ol>
<p>To have Adium automatically connect to the #Alfresco chat each time it starts up:</p>
<ol>
<li>Right-click on the #Alfresco listing in your contacts list</li>
<li>Choose &#8220;Get Info&#8221;</li>
<li>Check the checkbox on the &#8220;Bookmark: Automatically join on connect&#8221; line</li>
</ol>
<p>The only thing I don&#8217;t like about Adium is that it doesn&#8217;t auto-split your posts to the chatroom at 256 characters, which means that longer posts sometimes get cut off.  Annoying, but not that big a deal.  (Though if anyone knows how to fix it, please let me know in the comments below!)</p>
<p>Hope to see you there!  (Yes, &#8220;iancrew&#8221; is me&#8230;.)</p>
<br />  <a rel="nofollow" target="_blank" href="http://feeds.wordpress.com/1.0/gocomments/wanderingalfresco.wordpress.com/161/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/wanderingalfresco.wordpress.com/161/"/></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=wanderingalfresco.wordpress.com&#038;blog=23905304&#038;post=161&#038;subd=wanderingalfresco&#038;ref=&#038;feed=1" width="1" height="1"/>]]></content:encoded>
         <media:content medium="image" url="http://0.gravatar.com/avatar/08db656472ec0d3b2ae3355095abbf5d?s=96&amp;amp;d=identicon&amp;amp;r=G">
            <media:title type="html">icrew</media:title>
         </media:content>
         <category>Uncategorized</category>
      </item>
      <item>
         <title>Introducing the File System Transfer Receiver (FSTR)</title>
         <link>http://bpeters.tumblr.com/post/19235206166</link>
         <description>Introducing the File System Transfer Receiver (FSTR): In Alfresco 4.0 you can transfer files from...</description>
         <guid isPermaLink="false">http://bpeters.tumblr.com/post/19235206166</guid>
         <pubDate>Tue, 13 Mar 2012 14:14:00 +0000</pubDate>
      </item>
      <item>
         <title>Want to know eveything about the Jive and Alfresco integration ?</title>
         <link>http://alfrescoshare.wordpress.com/2012/03/13/want-to-know-eveything-about-the-jive-and-alfresco-integration/</link>
         <description>Event : Paris &amp;#8211; March 29, 2012 Alfstore, in partnership with Alfresco, has the pleasure to invite you to a breakfast to present its software components that now make possible the native integration of Alfresco DM solution with Jive, social networking platform business&amp;#8230; More info Filed under: Uncategorized&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://stats.wordpress.com/b.gif?host=alfrescoshare.wordpress.com&amp;#038;blog=6932163&amp;#038;post=303&amp;#038;subd=alfrescoshare&amp;#038;ref=&amp;#038;feed=1&quot; width=&quot;1&quot; height=&quot;1&quot;/&gt;</description>
         <guid isPermaLink="false">http://alfrescoshare.wordpress.com/?p=303</guid>
         <pubDate>Tue, 13 Mar 2012 09:07:38 +0000</pubDate>
         <media:content medium="image" url="http://1.gravatar.com/avatar/7970d817de877c7af3c536a1e981c4c3?s=96&amp;amp;d=identicon&amp;amp;r=G">
            <media:title type="html">e.spindler</media:title>
         </media:content>
         <category>Uncategorized</category>
      </item>
   </channel>
</rss>
<!-- fe4.yql.bf1.yahoo.com compressed/chunked Fri May 24 00:49:35 UTC 2013 -->
