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

<channel>
	<title>Avantec Team Blog</title>
	<atom:link href="http://blog.avantec.se/?feed=rss2" rel="self" type="application/rss+xml" />
	<link>http://blog.avantec.se</link>
	<description>Blogg för Avantecs medarbetare - Liferay, Alfresco, Java</description>
	<lastBuildDate>Wed, 14 Dec 2011 10:54:34 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.2.1</generator>
		<item>
		<title>Linket byter namn till Avantec</title>
		<link>http://blog.avantec.se/?p=97</link>
		<comments>http://blog.avantec.se/?p=97#comments</comments>
		<pubDate>Wed, 14 Dec 2011 10:54:34 +0000</pubDate>
		<dc:creator>administrator</dc:creator>
				<category><![CDATA[Okategoriserade]]></category>

		<guid isPermaLink="false">http://blog.avantec.se/?p=97</guid>
		<description><![CDATA[Scandinavian Linknet AB blir nu Avantec Consulting AB. (Samma org.nr. som tidigare.)]]></description>
			<content:encoded><![CDATA[<p>Scandinavian Linknet AB blir nu Avantec Consulting AB. (Samma org.nr. som tidigare.)</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.avantec.se/?feed=rss2&#038;p=97</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Securing an Alfresco dashlet</title>
		<link>http://blog.avantec.se/?p=88</link>
		<comments>http://blog.avantec.se/?p=88#comments</comments>
		<pubDate>Sat, 03 Dec 2011 15:07:14 +0000</pubDate>
		<dc:creator>Carl-Johan Ström</dc:creator>
				<category><![CDATA[Okategoriserade]]></category>

		<guid isPermaLink="false">http://blog.linknet.se/?p=88</guid>
		<description><![CDATA[In a recent project, we wanted to disable some information for any other user than the Site Administratiors. This can be done by using the Remote API. custom-sitedashlet.get.js &#160; function main() { var siteId = page.url.templateArgs.site; var result = remote.call("/api/sites/" + siteId + "/memberships?format=json&#38;nf=" + stringUtils.urlEncode(user.name)); var json = eval('(' + result + ')'); if [...]]]></description>
			<content:encoded><![CDATA[<p>In a recent project, we wanted to disable some information for any other user than the Site Administratiors. This can be done by using the Remote API.</p>
<p><strong>custom-sitedashlet.get.js</strong> </p>
<p>&nbsp;<br />
<code><br />
<strong>function</strong> main()</p>
<p>{</p>
<p><strong>var</strong> siteId = page.url.templateArgs.site;</p>
<p><strong>var</strong> result = remote.call("/api/sites/" + siteId + "/memberships?format=json&amp;nf=" + stringUtils.urlEncode(user.name));</p>
<p><strong>var</strong> json = eval('(' + result + ')');</p>
<p><strong>if</strong> (json[0].role == "SiteManager") {</p>
<p>model.manager = true;</p>
<p>}<strong>else</strong>{</p>
<p>model.manager = false;</p>
<p>}</p>
<p>model.site = siteId;</p>
<p>&nbsp;</p>
<p>}</p>
<p>&nbsp;</p>
<p>main();<br />
</code></p>
<p><strong>custom-sitedashlet.get.html.ftl</strong><br />
<code><br />
&lt;script type="text/<span style="text-decoration: underline">javascript</span>"&gt;//&lt;![CDATA[</p>
<p>new Alfresco.DnavetDashlet("${args.htmlid}").setOptions(</p>
<p>{</p>
<p>"componentId": "${instance.object.id}"</p>
<p>});</p>
<p>//]]&gt;&lt;/script&gt;</p>
<p>&lt;div&gt;</p>
<p>&lt;div class="title"&gt;${<span style="text-decoration: underline">msg</span>("header.dashlet-title")}<span style="text-decoration: underline">&lt;/div&gt;</span></p>
<p>&lt;div&gt;</p>
<p>&lt;#if manager&gt;</p>
<p>SiteManager only content…</p>
<p>&lt;/#if&gt;</p>
<p><span style="text-decoration: underline">&lt;/div&gt;</span></p>
<p><span style="text-decoration: underline">&lt;/div&gt;</span><br />
</code></p>
<p>If you just want to limit content to system administrators, <code>user.isAdmin</code> is always available.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.avantec.se/?feed=rss2&#038;p=88</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>How to start Alfresco at boot time as a user other than root.</title>
		<link>http://blog.avantec.se/?p=69</link>
		<comments>http://blog.avantec.se/?p=69#comments</comments>
		<pubDate>Tue, 08 Nov 2011 15:29:17 +0000</pubDate>
		<dc:creator>Magnus Arnevall</dc:creator>
				<category><![CDATA[Alfresco]]></category>

		<guid isPermaLink="false">http://blog.linknet.se/?p=69</guid>
		<description><![CDATA[It&#8217;s possible to start Alfresco at boot time by adding a simple line to /etc/rc.d/rc.local on Red Hat-like distros or some similar equivalence on Debian-based systems. The problem with that, however, is that you won&#8217;t start and stop Alfresco the correct way if you reboot, which can lead to old PID files being left behind [...]]]></description>
			<content:encoded><![CDATA[<p>It&#8217;s possible to start Alfresco at boot time by adding a simple line to /etc/rc.d/rc.local on Red Hat-like distros or some similar equivalence on Debian-based systems. The problem with that, however, is that you won&#8217;t start and stop Alfresco the correct way if you reboot, which can lead to old PID files being left behind blocking Tomcat. Instead, we use a script in the init.d folder which catches reboots and shutdowns. </p>
<p>If starting and stopping Alfresco correctly at reboots was all you wanted to do, you could have just used a symbolic link in init.d pointing to the alfresco script in the installation folder (alfresco.sh e.g.), but since we want to run the system as an arbitrary, non-privileged user, e.g. user &#8216;alfresco&#8217;, we need a wrapper script that uses su. </p>
<p>Here is an example of the above for Ubuntu 10.10 with Alfresco 4 (use sudo with the commands below if you&#8217;re not running as root):</p>
<ul>
<li><code>touch /etc/init.d/alfresco</code></li>
<ul>
<li>(Owner should be root)</li>
</ul>
<li><code>chmod 755 /etc/init.d/alfresco</code></li>
<ul>
<li>(Make it executable)</li>
</ul>
<li><code>update-rc.d alfresco defaults 80</code></li>
<ul>
<li>This connects the script with the default rcN.d links, and priority 80 which makes it very likely it will be run last of the scripts per runlevel.</li>
</ul>
<li><code>emacs /etc/init.d/alfresco</code></li>
<li>Enter the following in the file:</li>
</ul>
<p><code><br />
#!/bin/sh<br />
#<br />
# Wrapper service script that changes user to Alfresco<br />
#</p>
<p>case "$1" in<br />
&nbsp;&nbsp;start)<br />
&nbsp;&nbsp;&nbsp;&nbsp;echo -n "Starting Alfresco: "<br />
&nbsp;&nbsp;&nbsp;&nbsp;su -l -c '/opt/alfresco-4.0.x/alfresco.sh start &gt; /dev/null 2&gt;&amp;1 &amp;' alfresco<br />
&nbsp;&nbsp;&nbsp;&nbsp;;;<br />
&nbsp;&nbsp;stop)<br />
&nbsp;&nbsp;&nbsp;&nbsp;echo -n "Stopping Alfresco: "<br />
&nbsp;&nbsp;&nbsp;&nbsp;/opt/alfresco-4.0.x/alfresco.sh stop<br />
&nbsp;&nbsp;&nbsp;&nbsp;;;<br />
&nbsp;&nbsp;restart)<br />
&nbsp;&nbsp;&nbsp;&nbsp;$0 stop<br />
&nbsp;&nbsp;&nbsp;&nbsp;$0 start<br />
&nbsp;&nbsp;&nbsp;&nbsp;;;<br />
&nbsp;&nbsp;reload)<br />
&nbsp;&nbsp;&nbsp;&nbsp;;;<br />
&nbsp;&nbsp;*)<br />
&nbsp;&nbsp;&nbsp;&nbsp;echo "Usage: $0 {start|stop|restart|reload|status}"<br />
&nbsp;&nbsp;&nbsp;&nbsp;exit 1<br />
esac</p>
<p>exit 0<br />
</code></p>
<ul>
<li>Replace &#8221;/opt/alfresco-4.0.x&#8221; above with the name of your installation folder.</li>
<li>Note that you may need to change a few of the default ports in Alfresco to unprivileged ports, since you&#8217;re not running as root, e.g. the ports for CIFS if you&#8217;re using that.</li>
<li>(Note that the su flag &#8216;-l&#8217; above isn&#8217;t bound by any order among the options, as opposed to the synonym &#8216;-&#8217; flag which must be the last su option.)</li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://blog.avantec.se/?feed=rss2&#038;p=69</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Användarvänliga url i Liferay</title>
		<link>http://blog.avantec.se/?p=51</link>
		<comments>http://blog.avantec.se/?p=51#comments</comments>
		<pubDate>Mon, 03 Oct 2011 08:00:33 +0000</pubDate>
		<dc:creator>Robert Johansson</dc:creator>
				<category><![CDATA[Liferay]]></category>

		<guid isPermaLink="false">http://blog.linknet.se/?p=51</guid>
		<description><![CDATA[Användarvänliga url&#8217;s är något man ska eftersträva att ha. I liferay sätts url utgångsläge till http://localhost:8080/web/guest/home. Liferay lägger alltså till /web/guest/ i url&#8217;n. Det skulle vara trevligt att kunna skriva om url&#8217;n till http://www.minsida.se. &#160; Liferay v6 Med version 6 har det blivit mycket enkelt. Gå till startsidan (/web/guest) och välj Manage-&#62; Settings -&#62; Virtual [...]]]></description>
			<content:encoded><![CDATA[<p>Användarvänliga url&#8217;s är något man ska eftersträva att ha. I liferay sätts url utgångsläge till http://localhost:8080/web/guest/home. Liferay lägger alltså till /web/guest/ i url&#8217;n.</p>
<p>Det skulle vara trevligt att kunna skriva om url&#8217;n till http://www.minsida.se.</p>
<p>&nbsp;</p>
<p><strong>Liferay v6</strong></p>
<p>Med version 6 har det blivit mycket enkelt. Gå till startsidan (/web/guest) och välj Manage-&gt; Settings -&gt; Virtual host.</p>
<p>Under Public virtual host skriver vi in vårt servernamn (www.minsida.se). Save!</p>
<p>&nbsp;</p>
<p><strong>Liferay v5</strong></p>
<p><iframe width="420" height="315" src="http://www.youtube.com/embed/dPdr6HpynMY" frameborder="0" allowfullscreen></iframe></p>
<p>&nbsp;</p>
<p><strong>Liferay v4</strong></p>
<p>För att åstadkomma detta kan man använda sig av <a title="Tuckey" href="http://urlrewritefilter.googlecode.com/svn/trunk/src/doc/manual/2.6/index.html" target="_blank">tuckey</a> UrlRewrite.</p>
<p>I filen urlrewrite.xml i katalogen &lt;liferay-portal-home&gt;\tomcat-X.X.X\webapps\ROOT\WEB-INF görs följande tillägg</p>
<p>&lt;rule match-type=&#8221;regex&#8221;&gt;<br />
&lt;from&gt;(.*)/web/guest/(.*)$&lt;/from&gt;<br />
&lt;to type=&#8221;permanent-redirect&#8221;&gt;$1/$2&lt;/to&gt;<br />
&lt;/rule&gt;</p>
<p>&lt;outbound-rule&gt;<br />
&lt;from&gt;(.*)/web/guest/(.*)$&lt;/from&gt;<br />
&lt;to type=&#8221;permanent-redirect&#8221;&gt;$1/$2&lt;/to&gt;<br />
&lt;/outbound-rule&gt;</p>
<p>&nbsp;</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.avantec.se/?feed=rss2&#038;p=51</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Liferay + Alfresco presentation</title>
		<link>http://blog.avantec.se/?p=43</link>
		<comments>http://blog.avantec.se/?p=43#comments</comments>
		<pubDate>Thu, 08 Sep 2011 12:27:58 +0000</pubDate>
		<dc:creator>Carl-Johan Ström</dc:creator>
				<category><![CDATA[Alfresco]]></category>
		<category><![CDATA[Liferay]]></category>

		<guid isPermaLink="false">http://blog.linknet.se/?p=43</guid>
		<description><![CDATA[&#160; &#160; Följande presentation visar på en mycket intressant setup som vi på Linknet tror stakt på. Innehåll i Alfresco som presenteras via CMIS av Liferay. Mer info på detta ämne kommer.. &#160; http://www.slideshare.net/alfresco/liferay-alfresco-delivering-enterprise-content-through-a-portal-02-august-2011 &#160; &#160; &#160; &#160;]]></description>
			<content:encoded><![CDATA[<p>&nbsp;</p>
<p>&nbsp;</p>
<p>Följande presentation visar på en mycket intressant setup som vi på Linknet tror stakt på.</p>
<p>Innehåll i Alfresco som presenteras via CMIS av Liferay. Mer info på detta ämne kommer..</p>
<p>&nbsp;</p>
<p><a href="http://www.slideshare.net/alfresco/liferay-alfresco-delivering-enterprise-content-through-a-portal-02-august-2011">http://www.slideshare.net/alfresco/liferay-alfresco-delivering-enterprise-content-through-a-portal-02-august-2011</a></p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.avantec.se/?feed=rss2&#038;p=43</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Stora batchjobb i Alfresco</title>
		<link>http://blog.avantec.se/?p=13</link>
		<comments>http://blog.avantec.se/?p=13#comments</comments>
		<pubDate>Fri, 02 Sep 2011 09:27:03 +0000</pubDate>
		<dc:creator>Carl-Johan Ström</dc:creator>
				<category><![CDATA[Alfresco]]></category>
		<category><![CDATA[Batch]]></category>
		<category><![CDATA[Webutveckling]]></category>

		<guid isPermaLink="false">http://blog.linknet.se:86/?p=13</guid>
		<description><![CDATA[Ibland uppstår behov att processa en större mängd noder i Alfresco. Till exempel att en viss operation behöver utföras på 20.000 noder. Alfresco använder Lucene i botten och ovanpå det ligger ett säkerhetslager. Resultatet blir att sannolikheten att diverse timeouter slår till och ställer till med problem är stor. Nedan följer några anteckningar jag gjort [...]]]></description>
			<content:encoded><![CDATA[<div>Ibland uppstår behov att processa en större mängd noder i Alfresco. Till exempel att en viss operation behöver utföras på 20.000 noder. Alfresco använder Lucene i botten och ovanpå det ligger ett säkerhetslager. Resultatet blir att sannolikheten att diverse timeouter slår till och ställer till med problem är stor.</div>
<div>Nedan följer några anteckningar jag gjort för att komma runt dessa problem:</p>
</div>
<div>Till att börja med måste man känna till hur alfresco jobbar. Det är lite förenklat så här:</div>
<div>1) Kör fråga mot lucene.</div>
<div>2) Loopa igenom 1000 entries i taget (batchsize = ej samma som maxPermissionChecks), kolla rättigheter och lägg till resultatlistan. Detta körs tills</div>
<div>a) maxPermissionChecks gräns uppnås eller</div>
<div>b) <em>maxPermissionCheckTimeMillis passeras eller</em></div>
<div><em>c) Lucenelistan är slut (alla resultat behandlade)</em></div>
<div>3) Presentera resultatlista</p>
</div>
<div>Vad som händer är vid 2 a eller b är att resultatet kommer visas för användaren, utan felmeddelande, trots att resultatet inte är fullständigt.</div>
<div>Minnet kan ta slut också, men då får man i regel ett exception. Med rekommenderade inställningar på XMX ska detta normalt aldrig ske.</div>
<div>Så för att &#8221;batcha&#8221; över många filer så behöver man ha ett villkor så man kan hålla koll på vika man har behandlat. Sedan ta med med det som villkor i frågan. I mitt fall:</div>
<div>+PATH:&#8221;/app:company_home/st:sites/cm:svb401svb/cm:documentLibrary//*&#8221; AND @cm\:content.mimetype:&#8221;application/x-dwg&#8221;  AND <strong>-ASPECT:&#8221;<em>company_m:to_process</em>&#8221;</strong></div>
<div>(notera minus framför sista villkoret)</div>
<div>Sen måste <em>maxPermissionCheckTimeMillis </em>ökas upp så att den hinner gå igenom en hel batch (=1000). Annars kommer man alltid få en tom resultatlista. Jag kör nu 60 sekunder istället för 10 (maxPermissionCheckTimeMillis=60000)</p>
</div>
<div>Vidare måste vi ha en större maxPermissionChecks är batchstorleken. Jag kör 8000 nu istället för 1000. Sedan i mitt script så behandlar jag bara efter de 800 första raderna (pga att transaktionen blir för stor annars). Sedan upprepar man scriptet tills frågan ger 0 tillbaka. Notera att man inte vet om man fått ett avhugget resultat. Är det jämt delbart på batchstorleken (=1000) så är det ju 99,9% säkerhet att så är fallet. I så fall kör man bara om scriptet tills man får ett resultat som inte är delbart på 1000 eller är 0.</p>
</div>
<div>Så här ser mitt script ut i helhet:</div>
<div>
<div><em> var nodes = search.luceneSearch(&#8221;PATH:\&#8221;/app:company_home/st:sites/cm:site01/cm:documentLibrary//*\&#8221; AND @cm\\:content.mimetype:\&#8221;application/x-dwg\&#8221; AND -ASPECT:\&#8221;company_m:to_process\&#8221;");</em></div>
<div><em>  model.nodes = nodes;</em></div>
<div><em>  </em></div>
<div><em>var len = 800;</em></div>
<div><em>if(nodes.length &lt; len) {</em></div>
<div><em> len = nodes.length;</em></div>
<div><em>}</em></div>
<div><em>model.length = len;</em></div>
<div><em>model.tot = nodes.length;</em></div>
<div><em>  </em></div>
<div><em>  for (i=0; i&lt; len; i++) {</em></div>
<div><em>  nodes[i].addAspect(&#8221;{http://www.company.com/alfresco/model/std/1.0}to_process&#8221;);</em></div>
<div><em>  }</em></div>
<div><em> }</em></div>
</div>
]]></content:encoded>
			<wfw:commentRss>http://blog.avantec.se/?feed=rss2&#038;p=13</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Bloggen är tillbaka!</title>
		<link>http://blog.avantec.se/?p=36</link>
		<comments>http://blog.avantec.se/?p=36#comments</comments>
		<pubDate>Thu, 01 Sep 2011 10:04:08 +0000</pubDate>
		<dc:creator>Carl-Johan Ström</dc:creator>
				<category><![CDATA[Okategoriserade]]></category>

		<guid isPermaLink="false">http://blog.linknet.se:86/?p=36</guid>
		<description><![CDATA[Efter två års frånvaro är nu Linknet-bloggen tillbaka. Vi har öppnat upp den igen i samband med att vi släppt vår nya hemsida. Jag hoppas att alla gamla läsare hittar tillbaka och att vi hittar några nya. Innehållet på bloggen kommer som förut i huvudsak att vara lösningar på problem vi stöter på i vårt [...]]]></description>
			<content:encoded><![CDATA[<p>Efter två års frånvaro är nu Linknet-bloggen tillbaka. Vi har öppnat upp den igen i samband med att vi släppt vår nya hemsida.</p>
<p>Jag hoppas att alla gamla läsare hittar tillbaka och att vi hittar några nya. Innehållet på bloggen kommer som förut i huvudsak att vara lösningar på problem vi stöter på i vårt vardagliga jobb som java-utvecklare.</p>
<p>Målsättningen är att publicera ett inlägg varje vecka ungefär. Det händer mycket spännande nu, så förvänta er inlägg om java-uteveckling, javascriptramverk som Yahoos YUI, Alfreso, Liferay, Solr, Mule och annat som vi springer på.</p>
<p>Man kan även följa oss på Facebook: <a href="http://www.facebook.com/pages/Scandinavian-Linknet-AB/155187724535263">http://www.facebook.com/pages/Scandinavian-Linknet-AB/155187724535263</a></p>
<p>&nbsp;</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.avantec.se/?feed=rss2&#038;p=36</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

