<?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>ecmarchitect.com &#187; Alfresco Developer Series</title>
	<atom:link href="http://ecmarchitect.com/categories/content-management/alfresco-developer-series/feed" rel="self" type="application/rss+xml" />
	<link>http://ecmarchitect.com</link>
	<description>Jeff Potts on ECM, portals, search, collaboration, and a bunch of personal stuff</description>
	<lastBuildDate>Wed, 28 Jul 2010 06:19:11 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0</generator>
		<item>
		<title>New Tutorial: Getting Started with CMIS</title>
		<link>http://ecmarchitect.com/archives/2009/11/23/1094</link>
		<comments>http://ecmarchitect.com/archives/2009/11/23/1094#comments</comments>
		<pubDate>Mon, 23 Nov 2009 22:52:42 +0000</pubDate>
		<dc:creator>jpotts</dc:creator>
				<category><![CDATA[Alfresco]]></category>
		<category><![CDATA[Alfresco Developer Series]]></category>
		<category><![CDATA[CMIS]]></category>
		<category><![CDATA[Content Management]]></category>
		<category><![CDATA[General]]></category>
		<category><![CDATA[Apache Abdera]]></category>
		<category><![CDATA[Apache Chemistry]]></category>
		<category><![CDATA[AtomPub Binding]]></category>
		<category><![CDATA[Examples]]></category>
		<category><![CDATA[Optaros]]></category>
		<category><![CDATA[tutorial]]></category>

		<guid isPermaLink="false">http://ecmarchitect.com/?p=1094</guid>
		<description><![CDATA[I&#8217;ve written a new tutorial on the proposed Content Management Interoperability Services (CMIS) standard called, &#8220;Getting Started with CMIS&#8220;. The tutorial first takes you through an overview of the specification. Then, I do several examples. The examples start out using curl to make GET, PUT, POST, and DELETE calls against Alfresco to perform CRUD functions [...]]]></description>
			<content:encoded><![CDATA[<p>I&#8217;ve written a new tutorial on the proposed <a title="CMIS Committee Home Page at OASIS" href="http://www.oasis-open.org/committees/cmis" target="_blank">Content Management Interoperability Services (CMIS)</a> standard called, &#8220;<a title="ecmarchitect.com tutorial: Getting Started with CMIS" href="http://ecmarchitect.com/images/articles/cmis/cmis-article.pdf" target="_self">Getting Started with CMIS</a>&#8220;. The tutorial first takes you through an overview of the specification. Then, I do several examples. The examples start out using curl to make GET, PUT, POST, and DELETE calls against Alfresco to perform CRUD functions on folders, documents, and relationships in the repository. If you&#8217;ve been dabbling with CMIS and you&#8217;ve struggled to find examples, particularly of POSTs, here you go.</p>
<p>I used Alfresco Community built from head, but yesterday, Alfresco pushed a new Community release that supports CMIS 1.0 Committee Draft 04 so you can <a title="Alfresco Community Download Page" href="http://wiki.alfresco.com/wiki/Download_Community_Edition" target="_blank">download</a> that, use the <a title="Alfresco hosted CMIS repository" href="http://cmis.alfresco.com" target="_blank">hosted Alfresco CMIS repository</a>, or spin up an <a title="Alfresco wiki: Official Amazon EC2 image" href="http://wiki.alfresco.com/wiki/EC2" target="_blank">EC2 image</a> (once Luis gets it updated with the new Community release). If you don&#8217;t want to use Alfresco you should be able to use any CMIS repository that supports 1.0cd04. I tried some, but not all, of the command-line examples against the Apache <a title="Apache Chemistry Home" href="http://incubator.apache.org/chemistry/" target="_blank">Chemistry</a> test server.</p>
<p>Once you&#8217;ve felt both the joy and the pain of talking directly to the CMIS AtomPub Binding, I take you through some very short examples using JavaScript and Java. For Java I show Apache <a title="Apache Abdera Home" href="http://abdera.apache.org/" target="_blank">Abdera</a>, Apache Chemistry, and the Apache Chemistry TCK.</p>
<p>For the Chemistry TCK stuff, I&#8217;m using Alfresco&#8217;s <a title="Alfresco wiki: CMIS Maven Toolkit" href="http://wiki.alfresco.com/wiki/CMIS_Maven_Toolkit" target="_blank">CMIS Maven Toolkit</a> which <a title="Gabrielle Columbro's Blog" href="http://mindthegab.com/" target="_blank">Gabriele Columbro</a> and <a title="Richard McKnight's blog" href="http://oldschooltechie.com/" target="_blank">Richard McKnight</a> put together. That inspired me to do <a title="CMIS article source code archive" href="http://ecmarchitect.com/images/cmis-article-code.zip">my examples</a> with Maven as well (plus, it&#8217;s practical&#8211;the Abdera and Chemistry clients have a lot of dependencies, and using Maven meant I didn&#8217;t have to chase any of those down).</p>
<p>So take a look at the tutorial, try out the examples with your favorite CMIS 1.0 repo, and let me know what you think. If you like it, pass it along to a friend. As with past tutorials, I&#8217;ve released it under <a title="Creative Commons Attribution-Share Alike 3.0" href="http://creativecommons.org/licenses/by-sa/3.0/" target="_blank">Creative Commons Attribution-Share Alike</a>.</p>
<p>[Updated to correct typo with Gabriele's name. Sorry, Gab!]</p>
]]></content:encoded>
			<wfw:commentRss>http://ecmarchitect.com/archives/2009/11/23/1094/feed</wfw:commentRss>
		<slash:comments>17</slash:comments>
		</item>
		<item>
		<title>Alfresco Developer Guide source reorg and 3.2 Community update</title>
		<link>http://ecmarchitect.com/archives/2009/07/30/1023</link>
		<comments>http://ecmarchitect.com/archives/2009/07/30/1023#comments</comments>
		<pubDate>Thu, 30 Jul 2009 05:50:38 +0000</pubDate>
		<dc:creator>jpotts</dc:creator>
				<category><![CDATA[Alfresco]]></category>
		<category><![CDATA[Alfresco Book]]></category>
		<category><![CDATA[Alfresco Developer Series]]></category>
		<category><![CDATA[Content Management]]></category>
		<category><![CDATA[Alfresco Developer Guide]]></category>
		<category><![CDATA[Example]]></category>
		<category><![CDATA[Optaros]]></category>

		<guid isPermaLink="false">http://ecmarchitect.com/?p=1023</guid>
		<description><![CDATA[[UPDATE: Added a link to the source code that works with 3.2 Enterprise] I originally wrote the Alfresco Developer Guide source code for Alfresco 2.2 Enterprise and Alfresco 3 Labs. The code was pretty much the same regardless of which one you were running. For things that did happen to be different, I handled those [...]]]></description>
			<content:encoded><![CDATA[<p>[UPDATE: Added a link to the source code that works with 3.2 Enterprise]</p>
<p>I originally wrote the <a title="Buy the Alfresco Developer Guide" href="http://www.packtpub.com/alfresco-developer-guide/book/mid/080509wz4lps" target="_blank">Alfresco Developer Guide</a> source code for Alfresco 2.2 Enterprise and Alfresco 3 Labs. The code was pretty much the same regardless of which one you were running. For things that did happen to be different, I handled those with separate projects: one for community-specific stuff and one for enterprise-specific stuff. This was pretty much limited to minor web script differences for the &#8220;client extensions&#8221; projects and LDAP configuration differences for the &#8220;server extension&#8221; project.</p>
<p>With the release of 3.2 Community, I realized:</p>
<ul>
<li>The number of different flavors of Alfresco any given reader might be running are going up, not down. Who knows when 2.2 Enterprise will be sunset.</li>
<li>It is no longer as easy as &#8220;Enterprise&#8221; versus &#8220;Labs/Community&#8221; because multiple releases of the same flavor are prevalent (2.2E, 3.0E, and 3.1E, for example).</li>
<li>Tagging my code in Subversion by Chapter alone is no longer enough&#8211;I need to tag by Chapter and by Alfresco version.</li>
<li>Sending the publisher the code one chapter at-a-time and expecting them to manage updates and deciding how to organize all of the chapter code was a bad idea.</li>
</ul>
<p>So, I&#8217;ve done some work to make this better (reorg the projects, restructure the download files). I&#8217;ve also tested the example code from each chapter against the latest service packs for all releases since 2.2 Enterprise. That includes making some small updates to get the examples running on 3.2 Community.</p>
<p>You can now download either all of the source for every version I tested against, or, download the source that works for a specific version. It may take the official download site at Packt a while to get the new files, so here are links to download them from my site:</p>
<p>Alfresco Developer Guide example source code for&#8230;</p>
<ul>
<li>Alfresco 2.2 Enterprise (~5.3 MB, <a title="Source download 2.2 enterprise" href="http://ecmarchitect.com/images/3117_code_2.2-enterprise.zip">Download</a>)</li>
<li>Alfresco 3.0 Labs (~5.6 MB, <a title="Source download 3d Labs" href="http://ecmarchitect.com/images/3117_code_3.0-labs.zip">Download</a>)</li>
<li>Alfresco 3.0 Enterprise (~5.7 MB, <a title="Source download 3.0 enterprise" href="http://ecmarchitect.com/images/3117_code_3.0-enterprise.zip">Download</a>)</li>
<li>Alfresco 3.1 Enterprise (~5.6 MB, <a title="Source download 3.1 enterprise" href="http://ecmarchitect.com/images/3117_code_3.1-enterprise.zip">Download</a>)</li>
<li>Alfresco 3.2 Community (~5.7 MB, <a title="Source download 3.2 community" href="http://ecmarchitect.com/images/3117_code_3.2-community.zip">Download</a>)</li>
<li>Alfresco 3.2 Enterprise (~5.9 MB, <a title="Source download 3.2 enterprise" href="http://ecmarchitect.com/images/3117_code_3.2-enterprise.zip" target="_self">Download</a>)</li>
<li>All of the above, combined (~28.1 MB, <a title="Source download all versions combined" href="http://ecmarchitect.com/images/3117_code.zip">Download</a>)</li>
</ul>
<p>Hopefully this makes it easier for you to grab only what you need and makes it clear that each Eclipse project contains only what&#8217;s needed to work with that version of Alfresco. Deployment is easier too. Most of the time, it&#8217;s just the &#8220;someco-client-extensions&#8221; project that you deploy.</p>
<p>Now that I&#8217;ve got everything structured like I want it, as new versions of Alfresco are released, it should be much easier to keep up.</p>
]]></content:encoded>
			<wfw:commentRss>http://ecmarchitect.com/archives/2009/07/30/1023/feed</wfw:commentRss>
		<slash:comments>27</slash:comments>
		</item>
		<item>
		<title>Keeping your Alfresco web scripts DRY</title>
		<link>http://ecmarchitect.com/archives/2009/06/01/994</link>
		<comments>http://ecmarchitect.com/archives/2009/06/01/994#comments</comments>
		<pubDate>Mon, 01 Jun 2009 16:05:22 +0000</pubDate>
		<dc:creator>jpotts</dc:creator>
				<category><![CDATA[Alfresco]]></category>
		<category><![CDATA[Alfresco Developer Series]]></category>
		<category><![CDATA[Alfresco Developer Guide]]></category>
		<category><![CDATA[Best Practices]]></category>
		<category><![CDATA[Optaros]]></category>
		<category><![CDATA[Tips]]></category>
		<category><![CDATA[Web Scripts]]></category>

		<guid isPermaLink="false">http://ecmarchitect.com/?p=994</guid>
		<description><![CDATA[One of my teammates thoroughly drenched our under-the-desk development server with a giant cup of coffee once. Somehow, disaster was avoided, although the client&#8217;s carpet had a nice coffee-stain outline of the server&#8217;s footprint long after the app rolled out which afforded the rest of us endless opportunities to mercilessly haze the clumsy coder. Keeping [...]]]></description>
			<content:encoded><![CDATA[<p>One of my teammates thoroughly drenched our under-the-desk development server with a giant cup of coffee once. Somehow, disaster was avoided, although the client&#8217;s carpet had a nice coffee-stain outline of the server&#8217;s footprint long after the app rolled out which afforded the rest of us endless opportunities to mercilessly haze the clumsy coder.</p>
<p>Keeping your Alfresco web scripts DRY is actually not about making your developers use spill-proof travel mugs, or better yet, virtual machines. DRY is a coding philosophy or principle that stands for Don&#8217;t Repeat Yourself. There are all kinds of resources available that go into more detail, and the principle is more broad than simply avoiding duplicate code, but that&#8217;s what I want to focus on here.</p>
<p>There are three techniques you should be using to avoid repeating yourself when writing web scripts: web script configuration, JavaScript libraries accessed via import, and FreeMarker macros accessed via import.</p>
<p><strong>Web Script Configuration</strong></p>
<p>Added in 3.0, a web script configuration file is an XML file that contains arbitrary settings for your web script. It&#8217;s accessible from both your controller and your view. Building on the hello world web script from the <a title="Alfresco Developer Guide Book" href="http://www.packtpub.com/alfresco-developer-guide/book/mid/080509wz4lps" target="_blank">Alfresco Developer Guide</a>, you could add a configuration script named &#8220;helloworld.get.config.xml&#8221; that contained:</p>
<p><code><br />
&lt;properties&gt;<br />
&lt;title&gt;Hello World&lt;/title&gt;<br />
&lt;/properties&gt;<br />
</code></p>
<p>You could then access the &#8220;title&#8221; element from a JavaScript controller using the built-in E4X library:</p>
<p><code>var s = new XML(config.script);<br />
logger.log(s.title);<br />
</code></p>
<p>And, you could also grab the title from the FreeMarker view:</p>
<p><code>&lt;title&gt;${config.script["properties"]["title"]}&lt;/title&gt;</code></p>
<p>The web script configuration lets you separate your configuration from your controller logic. And because you can get to it from both the controller and the view, you don&#8217;t have to stick configuration info into your model.</p>
<p>This example showed a script-specific configuration, but global configuration is also possible. See the <a title="Alfresco Web Scripts Wiki" href="http://wiki.alfresco.com/wiki/Web_Scripts#Configuration" target="_blank">Alfresco Wiki Page on Web Scripts</a> for more details.</p>
<p><strong>JavaScript Import</strong></p>
<p>If your web script controllers are written in JavaScript, at some point you will find yourself writing JavaScript functions that you&#8217;d like to share across multiple web scripts. A common example is logic that builds a query string, executes the query, and returns the results. You don&#8217;t want to repeat the code that does that across multiple controllers. That&#8217;s what the import statement is for.</p>
<p>The syntax is easy:</p>
<p><code>&lt;import resource="classpath:alfresco/extension/scripts/status.js"&gt;</code></p>
<p>This needs to be the first line of your JavaScript controller file. This example shows a JavaScript library being imported from the classpath, but you can also import from the repository by name or by node reference. See the <a title="Alfresco JavaScript API Wiki" href="http://wiki.alfresco.com/wiki/3.0_JavaScript_API#Script_Files" target="_blank">Alfresco JavaScript API Wiki Page</a> for more details.</p>
<p><strong>FreeMarker Import</strong></p>
<p>Of the three this is the one I see ignored most often. Let&#8217;s take the <a title="Optaros Home Page" href="http://www.optaros.com" target="_blank">Optaros</a>-developed microblogging component for Share. Its basic data entity is called a &#8220;Status&#8221; object. So web scripts on the repository tier return JSON that might have a single Status object or a list of Status objects. That&#8217;s two different web scripts and two different views, but the difference between a list of objects and a single object is really just the list-related wrapper&#8211;in both cases, the individual Status object JSON is identical. I&#8217;ve seen people simply copy-and-paste the FreeMarker from the single-object template to the list template and then just wrap that with the list markup. <em>That&#8217;s bad.</em> If you ever change how a Status object is structured, you&#8217;ve got to change it in (at least) two places. (Or it&#8217;ll be someone that comes after you that has to do it which makes it even worse. If you aren&#8217;t following the analogy, your redundant code is the coffee stain).</p>
<p>Instead of duplicating the logic, use a FreeMarker import and define a macro that formats the object. Then you can call the macro any time you need your object formatted. Here&#8217;s how it works for Status.</p>
<p>A FreeMarker file called &#8220;status.lib.ftl&#8221; contains the macros that format Status objects. It lives with the rest of the web script files and looks like this:</p>
<p><code><br />
&lt;#assign datetimeformat="EEE, dd MMM yyyy HH:mm:ss zzz"&gt;<br />
&lt;#--<br />
Renders a status node as a JSON object<br />
--&gt;<br />
&lt;#macro statusJSON status&gt;<br />
&lt;#escape x as jsonUtils.encodeJSONString(x)&gt;<br />
{<br />
"siteId" : "${status.properties["optStatus:siteId"]!''}",<br />
"user" : "${status.properties["optStatus:user"]!''}",<br />
"message" : "${status.properties["optStatus:message"]!''}",<br />
"prefix" : "${status.properties["optStatus:prefix"]!''}",<br />
"mood" : "${status.properties["optStatus:mood"]!''}",<br />
"complete" : ${(status.properties["optStatus:complete"]!'false')?string},<br />
"created" : "${status.properties["cm:created"]?string(datetimeformat)}",<br />
"modified" : "${status.properties["cm:modified"]?string(datetimeformat)}"<br />
}<br />
&lt;/#escape&gt;<br />
&lt;/#macro&gt;<br />
&lt;#--<br />
Renders a status node as HTML<br />
--&gt;<br />
&lt;#macro statusHTML status&gt;<br />
SiteID: ${status.properties["optStatus:siteId"]!''}&lt;br /&gt;<br />
User: ${status.properties["optStatus:user"]!''}&lt;br /&gt;<br />
Message: ${status.properties["optStatus:message"]!''}&lt;br /&gt;<br />
Prefix: ${status.properties["optStatus:prefix"]!''}&lt;br /&gt;<br />
Mood: ${status.properties["optStatus:mood"]!''}&lt;br /&gt;<br />
Complete: ${(status.properties["optStatus:complete"]!'false')?string}&lt;br /&gt;<br />
Created: ${status.properties["cm:created"]?string(datetimeformat)}&lt;br /&gt;<br />
Modified: ${status.properties["cm:modified"]?string(datetimeformat)}&lt;br /&gt;<br />
&lt;/#macro&gt;<br />
</code></p>
<p>There&#8217;s one macro for JSON and another for HTML. It still bothers me that the same basic structure is repeated, but at least they are both in the same file and it feels better knowing that this is the one and only place where the data structure for a Status object is defined.</p>
<p>The FreeMarker that returns Status objects as JSON resides in status.get.json.ftl and looks like this:</p>
<p><code>&lt;#import "status.lib.ftl" as statusLib/&gt;<br />
{<br />
"items" : [<br />
&lt;#list results as result&gt;<br />
&lt;@statusLib.statusJSON status=result /&gt;<br />
&lt;#if result_has_next&gt;,&lt;/#if&gt;<br />
&lt;/#list&gt;<br />
]<br />
}</code></p>
<p>You can see the import statement followed by the JSON that sets up the list, and then the call to the FreeMarker macro to format each Status object in the list.</p>
<p>When someone posts a new Status, the new Status object is returned. Rather than repeat the JSON structure for a Status object, the status.post.json.ftl view simply calls the same macro that got called from the GET:</p>
<p><code>&lt;#import "status.lib.ftl" as statusLib/&gt;<br />
{<br />
"status" : &lt;@statusLib.statusJSON status=result /&gt;<br />
}</code></p>
<p>Now if the data structure for a Status object ever needs to change, it only has to be changed in one place.</p>
<p><strong>Don&#8217;t Repeat Yourself</strong></p>
<p>Take a look at your web scripts. Eliminate your duplicate code. And keep a lid on your mocha frappuccino.</p>
]]></content:encoded>
			<wfw:commentRss>http://ecmarchitect.com/archives/2009/06/01/994/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Curl up with a good web script</title>
		<link>http://ecmarchitect.com/archives/2009/04/10/959</link>
		<comments>http://ecmarchitect.com/archives/2009/04/10/959#comments</comments>
		<pubDate>Fri, 10 Apr 2009 15:50:34 +0000</pubDate>
		<dc:creator>jpotts</dc:creator>
				<category><![CDATA[Alfresco]]></category>
		<category><![CDATA[Alfresco Developer Series]]></category>
		<category><![CDATA[Content Management]]></category>
		<category><![CDATA[Alfresco Surf]]></category>
		<category><![CDATA[curl]]></category>
		<category><![CDATA[development]]></category>
		<category><![CDATA[REST]]></category>
		<category><![CDATA[testing]]></category>

		<guid isPermaLink="false">http://ecmarchitect.com/?p=959</guid>
		<description><![CDATA[Curl is a useful tool for all sorts of things. One specific example of when it comes in handy is when you are developing Alfresco web scripts. On a Surf project, for example, you might divide into a &#8220;Surf tier&#8221; team and a &#8220;Repository tier&#8221; team. Once you&#8217;ve agreed on the interface, including both the [...]]]></description>
			<content:encoded><![CDATA[<p><a title="cURL Home Page" href="http://curl.haxx.se/" target="_blank">Curl</a> is a useful tool for all sorts of things. One specific example of when it comes in handy is when you are developing <a title="Alfresco Home Page" href="http://www.alfresco.com" target="_blank">Alfresco</a> web scripts. On a <a title="About the Alfresco Surf Platform" href="http://wiki.alfresco.com/wiki/Surf_Platform" target="_blank">Surf</a> project, for example, you might divide into a &#8220;Surf tier&#8221; team and a &#8220;Repository tier&#8221; team. Once you&#8217;ve agreed on the interface, including both the URLs and the format of the data that goes back-and-forth between the tiers, the two teams can start cranking out code in parallel.</p>
<p>If you&#8217;re on the repo team, you need a way to test your API, and you probably don&#8217;t have a UI to test it with (that&#8217;s what the other team&#8217;s working on). There are lots of solutions to this but curl is really handy and it runs everywhere (on Windows, use Cygwin).</p>
<p>This post isn&#8217;t intended to be a full reference or how-to for curl, and obviously, you can use curl for a lot of tasks that involve HTTP, not just Alfresco web scripts. Here are some quick examples of using curl with Alfresco web scripts to get you going.</p>
<p><strong>Get a ticket</strong></p>
<p>It&#8217;s highly likely that your web script will require authentication. So the first thing you do is call the login web script to get a ticket.<br />
<code><br />
curl -v "http://localhost:8080/alfresco/service/api/login?u=admin&amp;pw=somepassword"<br />
</code></p>
<p>Alfresco will respond with something like:<br />
<code><br />
&lt;?xml version="1.0" encoding="UTF-8"?&gt;<br />
&lt;ticket&gt;TICKET_e46107058fdd2760441b44481a22e7498e7dbf66&lt;/ticket&gt;<br />
</code></p>
<p>Now you can take that ticket and append it to your subsequent web script calls.</p>
<p>Any web script you&#8217;ve got that accepts GET can be tested using the same simple syntax.</p>
<p><strong>Post JSON to your custom web script</strong></p>
<p>If all you had were GETs you&#8217;d probably just test them in your browser. POSTs, PUTs and DELETEs require a little more doing to test. You&#8217;re going to want to test those web scripts so that when the front-end team has their stuff ready, it all comes together without a lot of fuss.</p>
<p>So let&#8217;s say you&#8217;ve got a web script that the front-end will be POSTing JSON to. To test it out, create a file with some test JSON, then post it to the web script using curl, like this:<br />
<code><br />
curl -v -X POST "http://localhost:8080/alfresco/service/someco/someScript?alf_ticket=TICKET_e46107058fdd2760441b44481a22e7498e7dbf66" -H "Content-Type: application/json" -d @/Users/jpotts/test.json<br />
</code></p>
<p>By the way, did you know that starting with 3.0, if you name your controller with &#8220;.json&#8221; before the &#8220;.js&#8221; the JSON will be sitting in a root variable called &#8220;json&#8221;?  So in this case instead of naming my controller &#8220;someScript.post.js&#8221; I&#8217;d name it &#8220;someScript.post.json.js&#8221; and then in my JavaScript, I can just eval the &#8220;json&#8221; variable that got created for me automatically and start working with the object,  like this:<br />
<code><br />
var postedObject = eval('(' + json + ')');<br />
logger.log("Customer name:" + postedObject.customerName);<br />
</code></p>
<p><strong>Run a CMIS query</strong></p>
<p>With 3.0 Alfresco added an implementation of the proposed CMIS spec to the product. CMIS gives you a Web Services API, a RESTful API, and a SQL-like query language. Once you figure out the syntax, it&#8217;s easy to post CMIS queries to the repository. You can wrap the CMIS query in XML:<br />
<code><br />
&lt;cmis:query xmlns:cmis="http://www.cmis.org/2008/05" &gt;<br />
&lt;cmis:statement&gt;&lt;![CDATA[select * from cm_content where cm_name like '%Foo%']]&gt;&lt;/cmis:statement&gt;<br />
&lt;/cmis:query&gt;<br />
</code></p>
<p>Then post it using the same syntax as you saw previously, but with a different Content-Type in the header, like this:<br />
<code><br />
curl -v -X POST "http://localhost:8080/alfresco/service/api/query?alf_ticket=TICKET_e46107058fdd2760441b44481a22e7498e7dbf66" -H "Content-Type: application/cmisquery+xml" -d @/Users/jpotts/cmis-query.xml<br />
</code></p>
<p>Alfresco will respond with ATOM, but it&#8217;s a little verbose so I won&#8217;t take up space here to show you the result. Also, I noticed this bombed when I ran it against 3.1 Enterprise but I haven&#8217;t drilled down on why yet.</p>
<p><strong>Create a new object using CMIS ATOM</strong></p>
<p>Issuing a GET against a CMIS URL returns ATOM. But CMIS URLs can also accept POSTed ATOM to do things like create new objects. For example, to create a new content object you would first create the ATOM XML:<br />
<code><br />
&lt;?xml version="1.0" encoding="utf-8"?&gt;<br />
&lt;entry xmlns="http://www.w3.org/2005/Atom" xmlns:cmis="http://www.cmis.org/2008/05"&gt;<br />
&lt;title&gt;Test Plain Text Content&lt;/title&gt;<br />
&lt;summary&gt;Plain text content created via CMIS POST&lt;/summary&gt;<br />
&lt;content type="text/plain"&gt;SGVyZSBpcyBzb21lIHBsYWluIHRleHQgY29udGVudC4K&lt;/content&gt;<br />
&lt;cmis:object&gt;<br />
&lt;cmis:properties&gt;<br />
&lt;cmis:propertyString cmis:name="ObjectTypeId"&gt;&lt;cmis:value&gt;document&lt;/cmis:value&gt;&lt;/cmis:propertyString&gt;<br />
&lt;/cmis:properties&gt;<br />
&lt;/cmis:object&gt;<br />
&lt;/entry&gt;<br />
</code></p>
<p>Note that the content has to be Base64 encoded. In this case, the content is plain text that reads, &#8220;Here is some plain text content.&#8221; One way to encode it is to use OpenSSL like &#8220;openssl base64 -in &lt;infile&gt; -out &lt;outfile&gt;&#8221;. The exact syntax of ATOM XML with CMIS is the subject for another post.</p>
<p>Once you&#8217;ve got the XML ready to go, post it using the same syntax shown previously, with a different Content-Type in the header:<br />
<code><br />
curl -v -X POST "http://localhost:8080/alfresco/service/api/node/workspace/SpacesStore/18fd9821-42a5-4c6a-86d3-3f252679cf7d/children?alf_ticket=TICKET_e46107058fdd2760441b44481a22e7498e7dbf66" -H "Content-Type: application/atom+xml" -d @/Users/jpotts/testCreate.atom.xml<br />
</code></p>
<p>The node reference in the URL above is a reference to the folder in which this new child will be created. There&#8217;s also a similar URL that uses the path instead of a node ref if that&#8217;s more your thing.</p>
<p><strong>Refreshing Web Scripts from Ant</strong></p>
<p>One of the things you do quite frequently when you develop web scripts is tell Alfresco to refresh its list of web scripts. There are lots of ways to automate this, but one is to create an Ant task that uses curl to invoke the web script refresh URL. This lets you deploy your changes and tell Alfresco to refresh the list in one step (and makes sure you and your teammates never forget to do the refresh).<br />
<code><br />
&lt;target name="deploy-webscripts" depends="deploy" description="Refreshes the list of webscripts"&gt;<br />
&lt;exec executable="curl"&gt;<br />
&lt;arg value="-d"/&gt;<br />
&lt;arg value="reset=on"/&gt;<br />
&lt;arg value="http://${alfresco.web.url}/service/index"/&gt;<br />
&lt;/exec&gt;<br />
&lt;/target&gt;<br />
</code></p>
<p>In this example, the &#8220;deploy&#8221; ant task this task depends on is responsible for copying the web scripts to the appropriate place in the exploded Alfresco WAR. (Thanks to my colleague Eric Shea (http://www.eshea.net/2009/01/30/alfresco-dev-survivors-kit-part-1/) for this tip).</p>
<p>So there you go. It&#8217;s not Earth-shattering but it might give you a productivity boost if you don&#8217;t already have curl or an alternative already in your bag of tricks.</p>
]]></content:encoded>
			<wfw:commentRss>http://ecmarchitect.com/archives/2009/04/10/959/feed</wfw:commentRss>
		<slash:comments>22</slash:comments>
		</item>
		<item>
		<title>Grasping Thumbnails in Alfresco 3</title>
		<link>http://ecmarchitect.com/archives/2009/03/03/913</link>
		<comments>http://ecmarchitect.com/archives/2009/03/03/913#comments</comments>
		<pubDate>Wed, 04 Mar 2009 03:44:09 +0000</pubDate>
		<dc:creator>jpotts</dc:creator>
				<category><![CDATA[Alfresco]]></category>
		<category><![CDATA[Alfresco Developer Series]]></category>
		<category><![CDATA[General]]></category>
		<category><![CDATA[thumbnail]]></category>
		<category><![CDATA[tutorial]]></category>

		<guid isPermaLink="false">http://ecmarchitect.com/?p=913</guid>
		<description><![CDATA[With Alfresco 3 (both Labs and Enterprise), Alfresco added a new thumbnail service. It isn&#8217;t documented too well yet so I thought I&#8217;d write up a quick example. What is it The Thumbnail Service is used to create alternate renditions of objects. Typically, those alternate renditions are small images called &#8220;thumbnails&#8221;. You can see a [...]]]></description>
			<content:encoded><![CDATA[<p>With Alfresco 3 (both Labs and Enterprise), <a title="Alfresco Home Page" href="http://www.alfresco.com" target="_blank">Alfresco</a> added a new thumbnail service. It isn&#8217;t documented too well yet so I thought I&#8217;d write up a quick example.</p>
<p><strong>What is it</strong></p>
<p>The Thumbnail Service is used to create alternate renditions of objects. Typically, those alternate renditions are small images called &#8220;thumbnails&#8221;. You can see a working application of the thumbnail service if you take a look at Alfresco Share&#8217;s document library. When you upload a document, the thumbnail service is invoked, and a small image is shown next to each item in the list.</p>
<p><strong>Where thumbnails live</strong></p>
<p>Like everything else in Alfresco, thumbnails are stored as nodes. Nodes are instances of cm:thumbnail and are stored as children of the object they represent. (You can see this for yourself by looking at the thumbnailed object in the node browser). Objects can have any number of thumbnails. This lets you have thumbnails of different sizes and mime types, for example.</p>
<p>Once Alfresco generates a thumbnail for an object, the object will have the cm:thumbnailed aspect applied to it so it is easy to find or filter objects based on whether or not they have at least one thumbnail.</p>
<p><strong>Thumbnail definitions &amp; thumbnail names</strong></p>
<p>Every thumbnail has a thumbnail definition. The thumbnail definition keeps track of things like the mime type, transformation options, placeholder path, and thumbnail name. The thumbnail name uniquely identifies the thumbnail definition in the thumbnail registry. When you want to generate or display a thumbnail for an object, you must specify the name. For example, given a thumbnail definition named &#8220;scImageThumbnail&#8221;, you could use JavaScript to create a thumbnail for an object by calling the &#8220;createThumbnail&#8221; method on a ScriptNode like this:</p>
<p><code>document.createThumbnail("scImageThumbnail", true);</code></p>
<p>The first argument is the name of the thumbnail definition. The second argument says the thumbnail should be generated asynchronously.</p>
<p><strong>Registering thumbnail definitions</strong></p>
<p>The thumbnail registry needs to know about your thumbnail definitions. The out-of-the-box thumbnails are registered in the thumbnail-service-context.xml file. I don&#8217;t see a clean way to extend that without repeating the definitions, so in my example, I wrote a bean that calls the Thumbnail Registry and registers the custom thumbnail definitions provided in the Spring context file:</p>
<pre><code>
public class ThumbnailRegistryBootstrap {
  private ThumbnailService thumbnailService;
  private List&lt;ThumbnailDefinition&gt; thumbnailDefinitions;
  private Logger logger = Logger.getLogger(ThumbnailRegistryBootstrap.class);

public void init() {
  ThumbnailRegistry thumbnailRegistry = thumbnailService.getThumbnailRegistry();
    for (ThumbnailDefinition thumbDef : thumbnailDefinitions) {
      logger.info("Adding thumbnail definition:" + thumbDef.getName());
      thumbnailRegistry.addThumbnailDefinition(thumbDef);
    }
}

public void setThumbnailService(ThumbnailService thumbnailService) {
  this.thumbnailService = thumbnailService;
}

public void setThumbnailDefinitions(
  List&lt;ThumbnailDefinition&gt; thumbnailDefinitions) {
  this.thumbnailDefinitions = thumbnailDefinitions;
}

}
</code></pre>
<p>So this class will add all of my thumbnail definitions to the thumbnail registry. The class and the definitions are configured in a Spring context file. The config for a single thumbnail called &#8220;scImageThumbnail&#8221; which is a PNG 100 pixels high and retains the original aspect ratio of the image would be:</p>
<pre><code>
&lt;bean id="someco.thumbnailRegistry"
 class="com.someco.thumbnails.ThumbnailRegistryBootstrap"
 depends-on="ThumbnailService"
 init-method="init"&gt;
  &lt;property name="thumbnailService" ref="ThumbnailService" /&gt;
  &lt;property name="thumbnailDefinitions"&gt;
    &lt;list&gt;
      &lt;bean class="org.alfresco.repo.thumbnail.ThumbnailDefinition"&gt;
        &lt;property name="name" value="scImageThumbnail" /&gt;
        &lt;property name="mimetype" value="image/png"/&gt;
        &lt;property name="transformationOptions"&gt;
          &lt;bean  class="org.alfresco.repo.content.transform.magick.ImageTransformationOptions"&gt;
            &lt;property name="resizeOptions"&gt;
              &lt;bean class="org.alfresco.repo.content.transform.magick.ImageResizeOptions"&gt;
              &lt;property name="height" value="100"/&gt;
              &lt;property name="maintainAspectRatio" value="true"/&gt;
              &lt;property name="resizeToThumbnail" value="true" /&gt;
            &lt;/bean&gt;
          &lt;/property&gt;
        &lt;/bean&gt;
     &lt;/property&gt;
     &lt;property name="placeHolderResourcePath" value="alfresco/extension/thumbnail/thumbnail_placeholder_scImageThumbnail.png" /&gt;
   &lt;/bean&gt;
 &lt;/list&gt;
 &lt;/property&gt;
&lt;/bean&gt;
</code></pre>
<p>The placeholder is a graphic that the thumbnail service can return as the thumbnail if the thumbnail for a given node has not been generated. In my example I just copied one of the out-of-the-box placeholders and renamed it but you could use anything you want there.</p>
<p><strong>Example</strong></p>
<p>I built a simple example to show how this works. Here is a screencast that shows it running or you can <a href="/images/someco-thumbnail-example-project.zip">download the source</a> and build it yourself.</p>
<p><object classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" width="320" height="265" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,40,0"><param name="allowFullScreen" value="true" /><param name="allowscriptaccess" value="always" /><param name="src" value="http://www.youtube.com/v/lENsFH8b6U0&amp;hl=en&amp;fs=1&amp;rel=0" /><embed type="application/x-shockwave-flash" width="320" height="265" src="http://www.youtube.com/v/lENsFH8b6U0&amp;hl=en&amp;fs=1&amp;rel=0" allowscriptaccess="always" allowfullscreen="true"></embed></object></p>
<p>In the example, a simple form is presented to allow a file to be uploaded. The form posts to a web script which creates a new node using the file provided. The form GET and POST web scripts are essentially the &#8220;helloworldform&#8221; web scripts from the Alfresco Developer Guide.</p>
<p>The &#8220;image list&#8221; is a simple GET web script that queries the folder where the images are uploaded to and writes out a list of image tags. The interesting thing to note here is the URL that&#8217;s used:</p>
<p><code>${url.serviceContext}/api/node/workspace/SpacesStore/${image.id}/content/thumbnails/scImageThumbnail?ph=true&amp;c=queue</code></p>
<p>That URL is an out-of-the-box web script that returns the specified thumbnail for a given node reference. In my example I&#8217;m using the &#8220;ph&#8221; and &#8220;c&#8221; arguments. The &#8220;ph&#8221; argument says whether or not the placeholder image should be returned if the thumbnail does not exist. The &#8220;c&#8221; argument says that if a thumbnail doesn&#8217;t exist, queue a request for thumbnail creation. (Note that the descriptor says the queue create argument is &#8220;qc&#8221; but if you look at the controller source you&#8217;ll see it is actually just &#8220;c&#8221;. I&#8217;ll check to see if there&#8217;s a Jira on that).</p>
<p>When you add a new image and then go to the image list you&#8217;ll see the placeholder graphic. Behind the scenes, a thumbnail creation request has been queued. If you refresh the page, the thumbnail should show up because Alfresco has had a chance to generate it. If you wanted to queue the request when the node is created, you could either create a rule on the folder that holds the images, or you could add a call to &#8220;createThumbnail&#8221; in the upload POST web script controller, as shown earlier. (I&#8217;ve got an example of that commented out in the source).</p>
<p><strong>That&#8217;s it</strong></p>
<p>Hopefully this has given you some insight into the new thumbnail service in Alfresco. If you want to play with it yourself, you can download the source for the example and build it with Ant (make sure you set build.properties to match your environment first) by running &#8220;ant deploy&#8221;. Make sure you&#8217;ve got ImageMagick installed on your Alfresco server&#8211;the thumbnail service depends on it. You&#8217;ll also need the SDK to compile the registry bootstrap class. If you want to see what the thumbnail service is actually doing you&#8217;ll need the Alfresco source. None of the thumbnail source is included in the source code that currently accompanies the SDK.</p>
]]></content:encoded>
			<wfw:commentRss>http://ecmarchitect.com/archives/2009/03/03/913/feed</wfw:commentRss>
		<slash:comments>21</slash:comments>
		</item>
		<item>
		<title>Pre-order the Alfresco Developer Guide today</title>
		<link>http://ecmarchitect.com/archives/2008/08/26/846</link>
		<comments>http://ecmarchitect.com/archives/2008/08/26/846#comments</comments>
		<pubDate>Tue, 26 Aug 2008 14:37:58 +0000</pubDate>
		<dc:creator>jpotts</dc:creator>
				<category><![CDATA[Alfresco]]></category>
		<category><![CDATA[Alfresco Book]]></category>
		<category><![CDATA[Alfresco Developer Series]]></category>

		<guid isPermaLink="false">http://ecmarchitect.com/archives/2008/08/26/846</guid>
		<description><![CDATA[Packt Publishing has officially announced the availability of my forthcoming book, Alfresco Developer Guide. It is now available for pre-order and it should be shipping in November.]]></description>
			<content:encoded><![CDATA[<p><a target="_blank" href="http://www.packtpub.com/">Packt Publishing</a> has officially announced the availability of my forthcoming book, <a target="_blank" href="http://www.packtpub.com/alfresco-developer-guide/book">Alfresco Developer Guide</a>. It is now available for pre-order and it should be shipping in November.</p>
]]></content:encoded>
			<wfw:commentRss>http://ecmarchitect.com/archives/2008/08/26/846/feed</wfw:commentRss>
		<slash:comments>9</slash:comments>
		</item>
		<item>
		<title>Progress on the Alfresco book</title>
		<link>http://ecmarchitect.com/archives/2008/08/04/844</link>
		<comments>http://ecmarchitect.com/archives/2008/08/04/844#comments</comments>
		<pubDate>Mon, 04 Aug 2008 16:02:21 +0000</pubDate>
		<dc:creator>jpotts</dc:creator>
				<category><![CDATA[Alfresco]]></category>
		<category><![CDATA[Alfresco Book]]></category>
		<category><![CDATA[Alfresco Developer Series]]></category>
		<category><![CDATA[Content Management]]></category>

		<guid isPermaLink="false">http://ecmarchitect.com/archives/2008/08/04/844</guid>
		<description><![CDATA[Several readers have asked how the book I&#8217;m writing on Alfresco development is coming along. First of all, thanks for asking. It has been quite a project. The first draft of the entire book is now complete. What&#8217;s happening now is that a group of technical reviewers from Alfresco, Optaros, and Packt, the book&#8217;s publisher, [...]]]></description>
			<content:encoded><![CDATA[<p>Several readers have asked how <a href="http://ecmarchitect.com/archives/2008/04/29/825" title="Post: My summer project: A book">the book</a> I&#8217;m writing on Alfresco development is coming along. First of all, thanks for asking. It has been quite a project. The first draft of the entire book is now complete. What&#8217;s happening now is that a group of technical reviewers from <a href="http://www.alfresco.com" title="Alfresco Home Page" target="_blank">Alfresco</a>, <a href="http://www.optaros.com" title="Optaros Home Page" target="_blank">Optaros</a>, and <a href="http://www.packtpub.com/" title="Packt Publishing Home Page" target="_blank">Packt</a>, the book&#8217;s publisher, are going through the chapters and providing comments. So far, I&#8217;ve been able to turn those around quickly but I anticipate an increasing volume of feedback as we move into the later, more technical, chapters.</p>
<p>I&#8217;m pretty excited about how it is coming together. If you like the tone and scope of the <a href="http://ecmarchitect.com/alfresco-developer-series" title="Alfresco Developer Series">Alfresco Developer Series</a> of tutorials you&#8217;re going to like the book. The book is full of hands-on examples so it should be really good for people that are new to the Alfresco platform.</p>
<p>It would be great if we could publish by the time the <a href="http://www.alfresco.com/about/events/2008/10/cc-us-1008/" title="Alfresco User Conference Details" target="_blank">North American Community Conference</a> happens in Washington D.C. on October 9th, but to be honest, I&#8217;m not exactly sure what the schedule looks like from here on out. I&#8217;ll give another update as we get closer to publication.</p>
]]></content:encoded>
			<wfw:commentRss>http://ecmarchitect.com/archives/2008/08/04/844/feed</wfw:commentRss>
		<slash:comments>12</slash:comments>
		</item>
		<item>
		<title>My Summer Project: a Book</title>
		<link>http://ecmarchitect.com/archives/2008/04/29/825</link>
		<comments>http://ecmarchitect.com/archives/2008/04/29/825#comments</comments>
		<pubDate>Tue, 29 Apr 2008 17:53:20 +0000</pubDate>
		<dc:creator>jpotts</dc:creator>
				<category><![CDATA[Alfresco]]></category>
		<category><![CDATA[Alfresco Book]]></category>
		<category><![CDATA[Alfresco Developer Series]]></category>
		<category><![CDATA[Content Management]]></category>

		<guid isPermaLink="false">http://ecmarchitect.com/archives/2008/04/29/825</guid>
		<description><![CDATA[I&#8217;ve been doing a lot of writing lately, but as faithful readers have noticed, it hasn&#8217;t been in the blog. What&#8217;s the cause of the post slowdown? I&#8217;ve taken on a project that I hope you&#8217;ll be excited about. This Spring, Packt approached me about writing an Alfresco developer&#8217;s guide. Honestly, I went back-and-forth with [...]]]></description>
			<content:encoded><![CDATA[<p>I&#8217;ve been doing a lot of writing lately, but as faithful readers have noticed, it hasn&#8217;t been in the blog. What&#8217;s the cause of the post slowdown? I&#8217;ve taken on a project that I hope you&#8217;ll be excited about. This Spring, <a href="http://www.packtpub.com/" title="Packt Publishing Home Page" target="_blank">Packt</a> approached me about writing an Alfresco developer&#8217;s guide. Honestly, I went back-and-forth with the idea. Ultimately, it was the encouragement from ecmarchitect.com readers that swayed my decision.</p>
<p>I began writing on President&#8217;s Day. I thought the <a href="http://ecmarchitect.com/alfresco-developer-series" title="Alfresco Developer Series">Alfresco Developer Series</a> articles would be a good start and would save some time, and they have, but they represent a relatively small portion of the overall work and I&#8217;m doing a fair amount of restructuring of that content. The current schedule has the writing finishing up toward the end of summer with us going to press some time after that.</p>
<p><a href="http://www.optaros.com" title="Optaros Home Page" target="_blank">Optaros</a> is fully behind the project&#8211;there&#8217;s no way I could do this without their support. <a href="http://www.alfresco.com" title="Alfresco Home Page" target="_blank">Alfresco</a> is excited about it too, although we&#8217;re all expecting the timing to be a bit tricky with 3.0 coming out in roughly the same time frame. I&#8217;m currently making sure all example code runs on both the latest Enterprise release as well as the latest Community release&#8211;we&#8217;ll see if I can keep that up. It remains to be seen how much of the new 3.0 web client I&#8217;ll be able to cover based on the timing.</p>
<p>So that&#8217;s why posts and comment responses have slowed down a bit. I think I&#8217;ve caught up on responding to comments (and keep those coming, by the way). If you posted a comment within the last month or so and never saw anything from me, you might have a look to see if I&#8217;ve addressed your question, especially on the <a href="http://ecmarchitect.com/archives/2008/04/08/823" title="Alfresco Web Scripts as Liferay Portlets">Web Scripts as Liferay Portlets</a> post, which saw a lot of activity.</p>
]]></content:encoded>
			<wfw:commentRss>http://ecmarchitect.com/archives/2008/04/29/825/feed</wfw:commentRss>
		<slash:comments>10</slash:comments>
		</item>
		<item>
		<title>Alfresco recognizes ecmarchitect.com&#8217;s Alfresco Developer Series</title>
		<link>http://ecmarchitect.com/archives/2007/12/18/791</link>
		<comments>http://ecmarchitect.com/archives/2007/12/18/791#comments</comments>
		<pubDate>Tue, 18 Dec 2007 20:08:45 +0000</pubDate>
		<dc:creator>jpotts</dc:creator>
				<category><![CDATA[Alfresco]]></category>
		<category><![CDATA[Alfresco Developer Series]]></category>
		<category><![CDATA[General]]></category>

		<guid isPermaLink="false">http://ecmarchitect.com/archives/2007/12/18/791</guid>
		<description><![CDATA[I&#8217;m very pleased to announce to ecmarchitect.com readers that Alfresco has chosen me as their Community Contributor of the Month for December, 2007. This is primarily in recognition of the Alfresco Developer Series articles I&#8217;ve posted this year which are aimed at bringing new developers up-to-speed on the platform. I&#8217;m extremely flattered that Alfresco chose [...]]]></description>
			<content:encoded><![CDATA[<p>I&#8217;m very pleased to announce to ecmarchitect.com readers that Alfresco has chosen me as their <a title="Alfresco Community Contributor of the Month" target="_blank" href="http://wiki.alfresco.com/wiki/Contributor_of_the_Month">Community Contributor of the Month</a> for December, 2007. This is primarily in recognition of the <a title="Alfresco Developer Series" href="/alfresco-developer-series/">Alfresco Developer Series</a> articles I&#8217;ve posted this year which are aimed at bringing new developers up-to-speed on the platform.</p>
<p>I&#8217;m extremely flattered that Alfresco chose me to be the first recipient as part of this program. I think it highlights the fact that in the open source community, there are numerous ways you can get involved that can add value, whether that&#8217;s by writing code, helping test a new release, contributing a project to the forge, or writing documentation.</p>
<p>I&#8217;m also fortunate that <a title="Optaros Home Page" target="_blank" href="http://www.optaros.com">Optaros</a> encourages and expects employees to get involved in the open source community&#8211;it&#8217;s one of the many reasons I joined the company.</p>
<p>Last, thanks to everyone at Alfresco (John Newton, Matt Asay, Paul Holmes-Higgin, Kevin Cochrane, Luis Sala) and Optaros (Marc Osofsky, Dave Gynn, John Eckman, Brian Doyal) for encouraging, reviewing and promoting the articles.</p>
<p>And a special thanks to those of you that have read the articles and left comments or approached me at conferences over the past year. Knowing you are getting value out of this stuff makes it worthwhile.</p>
<p>Okay, cue the music and cut my mike. I&#8217;m off to the after party.</p>
]]></content:encoded>
			<wfw:commentRss>http://ecmarchitect.com/archives/2007/12/18/791/feed</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>Get your Alfresco &#8216;flow on</title>
		<link>http://ecmarchitect.com/archives/2007/11/19/785</link>
		<comments>http://ecmarchitect.com/archives/2007/11/19/785#comments</comments>
		<pubDate>Mon, 19 Nov 2007 07:51:21 +0000</pubDate>
		<dc:creator>jpotts</dc:creator>
				<category><![CDATA[Alfresco]]></category>
		<category><![CDATA[Alfresco Developer Series]]></category>
		<category><![CDATA[Content Management]]></category>
		<category><![CDATA[General]]></category>

		<guid isPermaLink="false">http://ecmarchitect.com/archives/2007/11/19/785</guid>
		<description><![CDATA[With the busy holiday season approaching, it&#8217;s hard to find time to streamline your content-centric business processes. Here&#8217;s a tip: Buy everyone gift cards. Use the time saved to learn how to implement advanced workflows using Alfresco&#8216;s embedded JBoss jBPM engine. This article and the accompanying source code should be everything you need to get [...]]]></description>
			<content:encoded><![CDATA[<p>With the busy holiday season approaching, it&#8217;s hard to find time to streamline your content-centric business processes. Here&#8217;s a tip: Buy everyone gift cards. Use the time saved to learn how to implement advanced workflows using <a title="Alfresco home page" target="_blank" href="http://www.alfresco.com">Alfresco</a>&#8216;s embedded JBoss <a title="JBoss jBPM home page" target="_blank" href="http://www.jboss.com/products/jbpm">jBPM</a> engine. This <a title="Alfresco Developer: Advanced Workflows" href="http://ecmarchitect.com/images/articles/alfresco-workflow/advanced-workflow-article.pdf">article</a> and the <a title="Alfresco Developer: Advanced Workflow Source Code" href="http://ecmarchitect.com/images/articles/alfresco-workflow/advanced-workflow-article-project.zip">accompanying source code</a> should be everything you need to get started and then some.</p>
<p>The article starts by describing jBPM concepts and the high-level steps for implementing advanced workflows in Alfresco and then dives into the details by walking you through an example.</p>
<p>The example extends the &#8220;SomeCo Whitepapers&#8221; story from earlier articles in the <a title="Alfresco Developer Series" href="/alfresco-developer-series/">Alfresco Developer Series</a> by implementing a business process to enable SomeCo&#8217;s engineering team, marketing team, and third-party partners to review whitepapers before being published to the SomeCo web site.</p>
<p>The integration of third-party partners is handled through email&#8211;recipients simply click a link to approve or reject the workflow task.</p>
<p>As in prior articles, the source code bundle is cumulative&#8211;it contains all of the &#8220;SomeCo&#8221; code we&#8217;ve worked on thus far.</p>
<p><strong>About the &#8220;Alfresco Developer&#8221; series of articles</strong></p>
<p>The <a title="Alfresco Developer Series" href="/alfresco-developer-series/">Alfresco Developer Series</a> of articles is a collection of technical tutorials aimed at getting you up-to-speed quickly on the key aspects of Alfresco. The series covers extensions and customizations performed during a typical Alfresco implementation by walking through a realistic example that is expanded upon in each successive article. The content is based on real-world Alfresco projects executed by the <a title="Optaros ECM Practice Alfresco Partnership" target="_blank" href="http://www.optaros.com/en/partners/alfresco_partnership">Optaros ECM practice</a> for clients around the globe.</p>
<p>Past articles include:</p>
<ul>
<li><a title="Intro to the Web Script Framework" href="http://ecmarchitect.com/archives/2007/10/25/777">Intro to the Web Script Framework</a></li>
<li><a title="Implementing Custom Behaviors" href="http://ecmarchitect.com/archives/2007/09/26/770">Implementing Custom Behaviors</a></li>
<li><a title="Implementing Custom Behaviors" href="http://ecmarchitect.com/archives/2007/09/26/770" /> 	<a title="Working with Custom Content Types" href="http://ecmarchitect.com/images/articles/alfresco-content/content-article.pdf">Working with Custom Content Types</a></li>
<li><a title="Working with Custom Content Types" href="http://ecmarchitect.com/images/articles/alfresco-content/content-article.pdf" /> 	<a title="Developing Custom Actions" href="http://ecmarchitect.com/archives/2007/01/10/732">Developing Custom Actions</a></li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://ecmarchitect.com/archives/2007/11/19/785/feed</wfw:commentRss>
		<slash:comments>30</slash:comments>
		</item>
	</channel>
</rss>
