tag:blogger.com,1999:blog-16220890779196817572024-03-12T23:03:43.718-07:00Key to ContentDick Weisingerhttp://www.blogger.com/profile/06275286068863587252noreply@blogger.comBlogger47125tag:blogger.com,1999:blog-1622089077919681757.post-8423107414021541452015-05-18T18:11:00.001-07:002015-05-18T18:11:20.630-07:00Content Management Lifecycles in Nuxeo<div dir="ltr" style="text-align: left;" trbidi="on">
<br />
<h3 style="text-align: left;">
Lifecycle Versus Workflow</h3>
Content lifecycle refers to the states or phases that content transitions through over time. A lifecycle can be visually represented using UML or a state transition diagram. Content states act as identifiers that can be used by search. They're also often used to control content access permissions. Additionally, the change of content state can cause actions to be triggered. <br />
<br />
Content lifecycles shouldn't be confused with workflows. Workflows are used to manage the processes that occur within and between lifecycles. They model the flow of tasks associated with a process. Very often content will be attached to a workflow and acted on as part of the completion of the tasks that make up the workflow.<br />
<br />
It's a best practice to cleanly separate lifecycle and workflow when implementing content management. Workflow typically is the thing that enables content to move through the different states of its lifecycle. But because lifecycles and workflows work closely together, it's easy to focus on building workflows without explicitly modeling the states of the lifecycle. <br />
<br />
Very often lifecycle is something that is implicitly modeled in content management systems. In that case, metadata schemas or content models will be extended to include a state variable to track the state of the content. Workflows are then built to update state information as content moves through a process.<br />
<br />
<h3 style="text-align: left;">
Nuxeo Content Lifecycle</h3>
In Nuxeo the concept of content lifecycles comes prewired as part of the Studio web-based configuration tool. Within Studio you can define the states in the lifecycle and the transition paths between them.<br />
<br />
Here is a screenshot from Studio of the <i>default</i> lifecycle state transition diagram. For the default lifecycle, possible states include project, obsolete, deleted and approved.<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
</div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjoQ7AkOMaIBGe8gxLNjDt6CedNtS3uXbIcAV0TgHOPyX7bMZD0A8AZS0qLv4D8PvMm4DrWmQxFVNJxVyoOJYyygXoOpStXfILa0rVXJqwj4qMeSZhv57exdwwr2B6ZAH-mBt7nv5BEi96f/s1600/lifecycle.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjoQ7AkOMaIBGe8gxLNjDt6CedNtS3uXbIcAV0TgHOPyX7bMZD0A8AZS0qLv4D8PvMm4DrWmQxFVNJxVyoOJYyygXoOpStXfILa0rVXJqwj4qMeSZhv57exdwwr2B6ZAH-mBt7nv5BEi96f/s1600/lifecycle.png" /></a></div>
<div class="separator" style="clear: both; text-align: left;">
<br /></div>
<div class="separator" style="clear: both; text-align: left;">
Using Studio, let's now define a new lifecycle called <i>ReviewCycle</i> with states called <i>Draft</i>, <i>Review</i>, <i>Reject</i>, <i>Available</i>, <i>Obsolete </i>as follows:</div>
<div class="separator" style="clear: both; text-align: left;">
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgbl3dm38Eqm0PVhcg3_42KKNZVxvj5FCjS1oaBeF7fNiR856mAL9iXieGzg7uKOz06XTzZX12G5NATHEF2UXJFj39rKepTxS5vTg4c8ilhyZU87lGSS7D5rVROUXtdTe6AcN50KK1DCwC-/s1600/lifecycle.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgbl3dm38Eqm0PVhcg3_42KKNZVxvj5FCjS1oaBeF7fNiR856mAL9iXieGzg7uKOz06XTzZX12G5NATHEF2UXJFj39rKepTxS5vTg4c8ilhyZU87lGSS7D5rVROUXtdTe6AcN50KK1DCwC-/s1600/lifecycle.png" /></a></div>
<div class="separator" style="clear: both; text-align: left;">
<br /></div>
<div class="separator" style="clear: both; text-align: left;">
This new lifecycle can then be associated with a new document type definition called <i>ReviewType </i>using Studio configuration forms. All <i>ReviewType </i>documents on creation will automatically be associated with this new lifecycle definition. Within Studio, in the definition of the document type, we reference the <i>ReviewCycle </i>Lifecycle as follows:</div>
<div class="separator" style="clear: both; text-align: left;">
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh_URMxMXcqVWSlOujR8ViDyisFfnz2HtrDXUEUgQQ6oynDQFuLjdrYiGfVh4jxJvd9KteJF0P5iOBiKFaoMN5fgWg1yZS21yuiuzYOqS3iJF47GHc4J-u6XxHXFxM04CO-FoTGOQh2tarY/s1600/lifecycle.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="203" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh_URMxMXcqVWSlOujR8ViDyisFfnz2HtrDXUEUgQQ6oynDQFuLjdrYiGfVh4jxJvd9KteJF0P5iOBiKFaoMN5fgWg1yZS21yuiuzYOqS3iJF47GHc4J-u6XxHXFxM04CO-FoTGOQh2tarY/s320/lifecycle.png" width="320" /></a></div>
<div class="separator" style="clear: both; text-align: left;">
In this case our new document type is defined as inheriting from the standard File type. We'll make no other changes, other than to define a different label and icons associated with the new document type.</div>
<div class="separator" style="clear: both; text-align: center;">
<br /></div>
<div class="separator" style="clear: both; text-align: left;">
To briefly see how our new document type and lifecycle with states work, we can create a simple demonstration using an Automation Chain that transitions a <i>ReviewType </i>document that is in the initial state <i>Draft </i>to the state <i>Review</i>. Note that the name of the transition between these two states is called <i>to_Review</i>.</div>
<div class="separator" style="clear: both; text-align: left;">
<br /></div>
<div class="separator" style="clear: both; text-align: left;">
Next let's create a button in the UI that the user can press that we can program to change the state of the document. To do that we create a User Action as follows:</div>
<div class="separator" style="clear: both; text-align: center;">
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjcQogC1x2xYh5GW4PIDD1pmTWJUyYrnDi2QTv9oSSv-RauvaDpA2Sfsfg8Lp1gm5SUaZZuPm7m3auZDZfBoZbLOy-UjWx5UFWy48UhxK7yvNh8tYWTrODruhPBhd4mpSMuOyQsFn-61IG5/s1600/lifecycle.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="400" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjcQogC1x2xYh5GW4PIDD1pmTWJUyYrnDi2QTv9oSSv-RauvaDpA2Sfsfg8Lp1gm5SUaZZuPm7m3auZDZfBoZbLOy-UjWx5UFWy48UhxK7yvNh8tYWTrODruhPBhd4mpSMuOyQsFn-61IG5/s400/lifecycle.png" width="283" /></a></div>
<div class="separator" style="clear: both; text-align: left;">
Here we've uploaded a new icon of a right-pointing arrow that will be visible as a button to click on that will then run our Automation Chain. Note that we specify that the button should be visible only when a document is in the lifecycle state of <i>Draft</i>. At the bottom of the definition form we specify the Automation Chain that the button is associated with: <i>setReviewLifeCycle</i>.</div>
<div class="separator" style="clear: both; text-align: left;">
<br /></div>
<div class="separator" style="clear: both; text-align: left;">
Now let's run our test. We first create our new document type called <i>ReviewType </i>(label is Review):</div>
<div class="separator" style="clear: both; text-align: left;">
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEii-cIGSuOoQ6-mAFXFOphyphenhyphenowbsYoS7pO5scGmeYuAJ-Hvid4d7566lL90qkBPhZ_YB0CK07FtcIoAhp1pbHjhe7O7pejBVu6NpdoRR7y69vgAs2ixusghGioSmIeNermityUXHPxBSoBEr/s1600/lifecycle.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="183" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEii-cIGSuOoQ6-mAFXFOphyphenhyphenowbsYoS7pO5scGmeYuAJ-Hvid4d7566lL90qkBPhZ_YB0CK07FtcIoAhp1pbHjhe7O7pejBVu6NpdoRR7y69vgAs2ixusghGioSmIeNermityUXHPxBSoBEr/s400/lifecycle.png" width="400" /></a></div>
<div class="separator" style="clear: both; text-align: center;">
<br /></div>
<div class="separator" style="clear: both; text-align: left;">
On the summary page for the document we can see that the state of the document is initially <i>Draft</i>. Next to the permanent link icon on the document Title header we can see a new icon that we've added that when clicked on will automatically transition the state of the lifecycle to <i>Review</i>.</div>
<div class="separator" style="clear: both; text-align: left;">
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjBaza00afPOTwHGGoryhRFzBZ29pOzKDAqjI4D-ICOmGemgPIC-vRP78rGs8jQ9UU8NPTyy6Z8Hvacsl7WuduEIcFwHDxf7gWQ8ECMEV6qlUjCozpsXOUXZi_gROsDixudyAYVQQN9Cjsl/s1600/lifecycle.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="350" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjBaza00afPOTwHGGoryhRFzBZ29pOzKDAqjI4D-ICOmGemgPIC-vRP78rGs8jQ9UU8NPTyy6Z8Hvacsl7WuduEIcFwHDxf7gWQ8ECMEV6qlUjCozpsXOUXZi_gROsDixudyAYVQQN9Cjsl/s640/lifecycle.png" width="640" /></a></div>
<div class="separator" style="clear: both; text-align: left;">
<br /></div>
<div class="separator" style="clear: both; text-align: left;">
When we click on this transition icon, the summary page refreshes and the document is then in the Review state. Note that the transition icon button is no longer displayed in the Title.</div>
<div class="separator" style="clear: both; text-align: left;">
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhtGC88aqzjKPDC9qI2GJiTuUPzcAhKOj18AwIU4PMCP0mOCBrNigzeR6aKKjf3hib25i5I-O-YfaliIJ7S6t2wo0uZCVb2wypzGmOf3-RSGt4dIYY9lMRhG6gA1X83prraGKtHOGn7XIHJ/s1600/lifecycle.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="354" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhtGC88aqzjKPDC9qI2GJiTuUPzcAhKOj18AwIU4PMCP0mOCBrNigzeR6aKKjf3hib25i5I-O-YfaliIJ7S6t2wo0uZCVb2wypzGmOf3-RSGt4dIYY9lMRhG6gA1X83prraGKtHOGn7XIHJ/s640/lifecycle.png" width="640" /></a></div>
<div class="separator" style="clear: both; text-align: left;">
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
</div>
<div class="separator" style="clear: both; text-align: left;">
One more thing we can demonstrate is how easy it is to then programatically locate all documents that are in a specific lifecycle state. We can power up the Nuxeo shell and run an NXQL query against the repository to find all documents that are in the <i>Review </i>state. In our case, it will be just the one we uploaded and transitioned.</div>
<div class="separator" style="clear: both; text-align: left;">
<br /></div>
<div class="separator" style="clear: both; text-align: left;">
We can see that in the next screenshot where we issue an NXQL query. The query finds the document (called Application) that we've just uploaded and transitioned into the <i>Review </i>state.</div>
<div class="separator" style="clear: both; text-align: left;">
<br /></div>
<div class="separator" style="clear: both; text-align: left;">
Select * from Document where ecm:currentLifeCycleState = 'Review'.</div>
<div class="separator" style="clear: both; text-align: left;">
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjtfmj3Hr0cvShe1zAXlATq_VXeDIQrCG43xQHF4WGehCEuutpxhd_J5J-m8RS78IPqen_pHEE4VtiWpd-_g8Vv_8mDknUNpWqX0NrE3pMFdXcUeTbVLYhM2a4YkWxTPdwjyM3jmQP39lD4/s1600/lifecycle.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="207" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjtfmj3Hr0cvShe1zAXlATq_VXeDIQrCG43xQHF4WGehCEuutpxhd_J5J-m8RS78IPqen_pHEE4VtiWpd-_g8Vv_8mDknUNpWqX0NrE3pMFdXcUeTbVLYhM2a4YkWxTPdwjyM3jmQP39lD4/s640/lifecycle.png" width="640" /></a></div>
<div class="separator" style="clear: both; text-align: left;">
<br /></div>
<div id="SL_balloon_obj">
<div id="SL_shadow_translator">
</div>
</div>
</div>
Dick Weisingerhttp://www.blogger.com/profile/06275286068863587252noreply@blogger.com0tag:blogger.com,1999:blog-1622089077919681757.post-84773341247950808532015-05-09T15:56:00.000-07:002015-05-09T15:56:52.827-07:00Nuxeo Automation Scripting with Nashorn<div dir="ltr" style="text-align: left;" trbidi="on">
In March, Nuxeo Platform Fast Track 7.2 was released. One new feature of that release is Automation Scripting enabled by Java 8 and Nashorn.<br />
<br />
<a href="http://www.oracle.com/technetwork/articles/java/jf14-nashorn-2126515.html" target="_blank">Nashorn</a> replaces the Rhino Javascript scripting engine in Java 8. <a href="http://openjdk.java.net/jeps/174" target="_blank">Nashorn is based on JSR 262</a> and provides better compliance with the ECMA normalized Javascript specification. Compared to Rhino, the performance and memory usage of Nashorn is significantly better.<br />
<br />
<a href="http://www.nuxeo.com/blog/automation-scripting-unleashes-the-power-of-nashorn-in-the-nuxeo-platform/" target="_blank">Thierry Delprat wrote a blog</a> that introduces Nuxeo Automation Scripting with Nashorn. <br />
<br />
I wanted to test out the new feature, so I thought that I'd apply scripting to a "drop folder" use case. In a "drop folder"scenario, an action is triggered that processes and then files documents as they are created and dropped into a folder.<br />
<br />
This is typically how imports from a capture product like Ephesoft are handled. For example, in the Ephesoft case, scanned images are written to a repository folder using CMIS, and then a rule or action associated with the folder pushed to from Ephesoft further processes document metadata and ultimately files the document into a target folder.<br />
<h3 style="text-align: left;">
The Drop Folder Scenario</h3>
I wanted to see how easy it would be to use Nuxeo Automation Scripting to create a "drop folder" script. <br />
<br />
For this test scenario, I created two Workspaces in Nuxeo called "Drop Folder" and "Target Folder".<br />
<br />
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjj9-YWiWqAl0CMtzvpr0Vm-_6aS_OTU7rgKBCBowa_LVgkXAzBf-u6wSThI4CHId6YsvRK4XeB4_JRELovdLN7gbR7SL6k8LpxOW0tQWfXoVoJNGrvqntKQ6tTjb9EFjwPDOUQ8jEvEIQW/s1600/Nuxeo1.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em; text-align: center;"><img border="0" height="171" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjj9-YWiWqAl0CMtzvpr0Vm-_6aS_OTU7rgKBCBowa_LVgkXAzBf-u6wSThI4CHId6YsvRK4XeB4_JRELovdLN7gbR7SL6k8LpxOW0tQWfXoVoJNGrvqntKQ6tTjb9EFjwPDOUQ8jEvEIQW/s640/Nuxeo1.png" width="640" /></a><br />
<br />
Under Target Folder, I created the following three folders:<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjvzOEHFUgt-wTb9HBnd6b7hXiv98UD-iOWhZRLcZABmIv8HB6qGg3yEA8kZO1rPatOkrJo80pogAbNfqGdJfp7F6v2P0JLRGc7dazNIDcq7ZrZcukPeWE5lyftCBCK9K0pqQMiqme9zf88/s1600/Nuxeo.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="212" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjvzOEHFUgt-wTb9HBnd6b7hXiv98UD-iOWhZRLcZABmIv8HB6qGg3yEA8kZO1rPatOkrJo80pogAbNfqGdJfp7F6v2P0JLRGc7dazNIDcq7ZrZcukPeWE5lyftCBCK9K0pqQMiqme9zf88/s320/Nuxeo.png" width="320" /></a></div>
<div class="separator" style="clear: both; text-align: left;">
<br /></div>
<div class="separator" style="clear: both; text-align: left;">
The idea for the test script is that documents will be uploaded into the "Drop Folder". Based on the mimetype of the document, it will be moved into the "Target Folder" area and filed under "PDF Files" if the document is PDF, under "Word Files" if the mimetype is Word, or otherwise filed under "Other Files".</div>
<div class="separator" style="clear: both; text-align: left;">
<br /></div>
<div class="separator" style="clear: both; text-align: left;">
In addition, the description field for the document will be updated with information stating that the document was autofiled and the time the file was made.</div>
<h3 style="clear: both; text-align: left;">
Implementation</h3>
To implement this, in Nuxeo Studio, I first created an Automation Script called "OnImportScript" and an Event Handler called "OnDocImport".<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgasYN8w8T3iD9BLXlra5cQEurRWdgmB2FNE3yihaYKHsZpLN5yid6wTBfhKKtVlrCW_Y7cqldRlpHqyKvsys244ZMdWehYhrSTAwEd3IM8ZEavaNIKniv-DVDkFhaydOsT6e2H7SG-Rmeu/s1600/Nuxeo.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="320" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgasYN8w8T3iD9BLXlra5cQEurRWdgmB2FNE3yihaYKHsZpLN5yid6wTBfhKKtVlrCW_Y7cqldRlpHqyKvsys244ZMdWehYhrSTAwEd3IM8ZEavaNIKniv-DVDkFhaydOsT6e2H7SG-Rmeu/s320/Nuxeo.png" width="203" /></a></div>
<br />
The event handler tracks the "Document created" events and is triggered when items are created in the folder "/default-domain/workspaces/Drop Folder". The operation that is run when the event is triggered is called OnImportScript.<br />
<br />
Here is the screen for configuring the event handler.<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh0aEl-5uQ5EKI6pTNhd9hbBu-8CHL2uR4y3AU7-V5rDLAjOBxlET3NZcZzv2w-qN8W8DQWJNCFNxl5IGVW6_t202oPKPZZCHmRQzddVbwrJ9-DK8ohCPDNHQYtfPjkxBAKAaUXHKHEJt6G/s1600/Nuxeo.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="640" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh0aEl-5uQ5EKI6pTNhd9hbBu-8CHL2uR4y3AU7-V5rDLAjOBxlET3NZcZzv2w-qN8W8DQWJNCFNxl5IGVW6_t202oPKPZZCHmRQzddVbwrJ9-DK8ohCPDNHQYtfPjkxBAKAaUXHKHEJt6G/s640/Nuxeo.png" width="475" /></a></div>
<div class="separator" style="clear: both; text-align: center;">
<br /></div>
<div class="separator" style="clear: both; text-align: left;">
Next I filled in the Javascript code that runs when the event triggers. The Javascript code for the OnImportScript is shown below. In that code, the run() method will be called to start the processing.</div>
<div class="separator" style="clear: both; text-align: left;">
<br /></div>
<div class="separator" style="clear: both; text-align: left;">
The run() method identifies the location of Target Folder and moves the document based on the mimetype.</div>
<br />
<br />
<pre style="background: rgb(241, 241, 241); color: black; text-align: left;">var WORD_MIMETYPE = "application/vnd.openxmlformats-officedocument.wordprocessingml.document";
var PDF_MIMETYPE = "application/pdf";
var WORD_FOLDER = "Word Files";
var PDF_FOLDER = "PDF Files";
var OTHER_FOLDER = "Other Files";
var TOP_TARGET_FOLDER = "Target Folder";
// Get the parent node for the current node
function getParentFolder(node)
{
// Get the parent reference -- org.nuxeo.ecm.core.api.DocumentRef
var parent = node.getParentRef();
return Repository.GetDocument(node, { 'value': parent.toString() });
}
// Return a child of a folder by name
function getChildByName(fldr, childName)
{
if(! fldr.getDocumentType().isFolder() ) return null;
var children = Document.GetChildren(fldr, {});
if(children==null) return null;
for each(var child in children)
{
if(child.getName().equals(childName)) return child;
}
return null;
}
function getFolderChild(fldr, childName)
{
var child = getChildByName(fldr, childName);
if(child) return child;
// Create the child folder if it doesn't exist
if(! fldr.getDocumentType().isFolder() ) return null;
return Document.Create(fldr, { 'type': 'Folder', 'name': childName });
}
// ctx -- java.util.HashMap
// input -- org.nuxeo.ecm.core.api.impl.DocumentModelImpl
// params -- java.util.HashMap
function run(ctx, input, params) {
// Event is instance of org.nuxeo.ecm.core.event.impl.EventImpl
// If the event isn't "Create Document", then return
if(!ctx.Event.getName().equals("documentCreated")) return;
// If the input isn't a document, then return
if( input===null || !input.getClass().getName().equals("org.nuxeo.ecm.core.api.impl.DocumentModelImpl") ) return;
// If the input is a folder and not a document, ignore it
if( input.getDocumentType().isFolder() ) return null;
// Collect some information about the document
var doc = input;
var docBlob = Document.GetBlob(doc, {});
var mimeType = docBlob.getMimeType();
var dropFolderNode = getParentFolder(doc);
var dropFolderParent = getParentFolder(dropFolderNode);
var targetFolder = getFolderChild(dropFolderParent, TOP_TARGET_FOLDER);
// File the incoming document based on its mimetype
var targetFolderSub;
if(mimeType.equals(PDF_MIMETYPE))
{
targetFolderSub = getFolderChild(targetFolder, PDF_FOLDER);
}
else if(mimeType.equals(WORD_MIMETYPE))
{
targetFolderSub = getFolderChild(targetFolder, WORD_FOLDER);
}
else
{
targetFolderSub = getFolderChild(targetFolder, OTHER_FOLDER);
}
// File the document by moving it to the target folder
if(targetFolderSub != null)
{
// Move the document to the correct target folder
Document.Move(doc, { 'target': targetFolderSub.getId()} );
var now = new Date();
Document.SetProperty(doc,{"xpath":'dc:description', "save":true, "value":"Autofiled from folder '" + dropFolderNode.getName() + "' at " + now.toLocaleString() });
}
}
</pre>
<h3 style="text-align: left;">
Results</h3>
To test, I created documents in the Drop Folder and saw that the Document created event successfully triggered and filed the documents to the correct target folders based on the mimetype.<br />
<br />
I was happy with the results, although my testing was minimal. The purpose of this was just to see how Nuxeo Automation Scripting works and to validate that the approach could be used for creating Javascript-based folder rules, although the approach isn't limited to just putting rules on folders.<br />
<br /></div>
Dick Weisingerhttp://www.blogger.com/profile/06275286068863587252noreply@blogger.com0tag:blogger.com,1999:blog-1622089077919681757.post-72623323448477762772014-11-26T07:41:00.001-08:002014-11-26T07:45:03.974-08:00Deploying Nuxeo IDE Customizations<div dir="ltr" style="text-align: left;" trbidi="on">
<div dir="ltr" style="text-align: left;" trbidi="on">
<div dir="ltr" style="text-align: left;" trbidi="on">
In this article, I have a tip for deploying Nuxeo customizations developed using the Nuxeo Eclipse IDE.<br />
<br />
But first let me first mention a few things about how to go about customizing Nuxeo.<br />
<br />
There are two main methods for customizing the Nuxeo web application:<br />
<ul style="text-align: left;">
<li>Nuxeo Studio</li>
<li>Nuxeo Eclipse IDE plugin</li>
</ul>
<h3 style="text-align: left;">
<b>Nuxeo Studio</b></h3>
<div>
<a href="http://www.nuxeo.com/products/studio/" target="_blank">Nuxeo Studio</a> is a cloud-based configuration tool. It's <a href="https://connect.nuxeo.com/register/#/" target="_blank">available by subscription</a>, but it's not required to have in order to use Nuxeo. Actually, without Studio you don't miss out on any of the cool end-user Nuxeo product features, but by using it, you can save yourself a tremendous amount of development and administration time, and you'll also know that your configurations made in <a href="http://www.nuxeo.com/products/studio/" target="_blank">Studio </a>are guaranteed to be automatically upgradable to future product versions of Nuxeo. </div>
<div>
<br /></div>
<div>
Nuxeo without Studio is much harder. If you don't use Studio you'll need to hand-code and debug quite a few configuration files. That can involve writing a lot of XML, XHTML and other code, easily hundreds of lines of code even for simple configurations. And while manually creating those files isn't really that complex, writing those files can be tedious, and it's easy to introduce syntax errors while writing them that may end up later costing you many hours of time trying to track down and fix. </div>
<div>
<br /></div>
<div>
You can do a lot with Studio, and if you're serious about Nuxeo, you really should use it. We've found, for example, that most projects we work on start out by developing a custom content model and designing associated create, view and edit forms. With Nuxeo Studio, an analyst could easily build and test the content model and all associated forms without needing assistance from a developer. Studio also allows you to graphically design workflows, set up automation tasks, and a lot more.<br />
<br /></div>
<h3 style="text-align: left;">
Nuxeo IDE</h3>
<div>
For many installations, using Nuxeo Studio for configuring your application is sufficient, but if you need to do even more in-depth customizations than what Studio lets you do, you can use <a href="http://doc.nuxeo.com/display/IDEDOC/Installing+Nuxeo+IDE" target="_blank">Nuxeo's Eclipse plugin</a>. Nuxeo has great <a href="http://doc.nuxeo.com/display/IDEDOC/Nuxeo+IDE+Documentation+Center" target="_blank">on-line documentation</a> showing you how to use it. Unlike Studio, the Nuxeo IDE is a tool that targets Java developers.</div>
<div>
<br /></div>
<div>
Using the Nuxeo Eclipse IDE you can extend and override parts of the Nuxeo application. From a Nuxeo perspective within Eclipse you can create a Nuxeo project and then add artifacts to it. You can then deploy your project changes, launch Tomcat and run and debug the Nuxeo application, all within the Eclipse environment.<br />
<br /></div>
<h3 style="text-align: left;">
Deploying the Project Bundle</h3>
<div>
Now for the tip. </div>
<div>
<br /></div>
<div>
It's easy to <a href="http://doc.nuxeo.com/display/IDEDOC/Running+your+Projects+on+the+Server" target="_blank">hot reload</a> Nuxeo projects within Eclipse using the Nuxeo IDE plugin. That feature really speeds up development. But when deploying your IDE-developed customizations to a new Nuxeo instance, there's an additional deployment file that you need to have in your project.<br />
<br />
Nuxeo has an option in the IDE to jar all the files of your project. To deploy your changes, you just create the jar and then drop it into the nxserver/bundles directory of your new instance and restart.</div>
<div>
<br /></div>
<div>
The option to jar is available by first right-clicking on your project in the Eclipse Nuxeo perspective and then selecting <i>Nuxeo </i>and <i>Export Jar</i>.</div>
<div>
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiphUxlvIvJliRkOFzn8ijTACCbXLBrA-C6qdjkJOmcPy5ZXwKWUC_yHjG5PUb5LvlZP1-YDpyfg2xdLBVFdNMRqYpDfUFAPNxX4Nwr7zy_hnr6Mr4FB7IN6yKJ7VZf2vvI0KGsAk4wDU_M/s1600/IDEMenu.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiphUxlvIvJliRkOFzn8ijTACCbXLBrA-C6qdjkJOmcPy5ZXwKWUC_yHjG5PUb5LvlZP1-YDpyfg2xdLBVFdNMRqYpDfUFAPNxX4Nwr7zy_hnr6Mr4FB7IN6yKJ7VZf2vvI0KGsAk4wDU_M/s1600/IDEMenu.png" height="320" width="316" /></a></div>
<div class="separator" style="clear: both; text-align: center;">
<br /></div>
<div class="separator" style="clear: both; text-align: left;">
That's easy enough. But there's one more thing you need to do to prepare the jar file for deployment on another server, and if you don't do it, you're likely to run into problems. This step isn't needed when you're developing and deploying from within Eclipse and is <a href="http://doc.nuxeo.com/display/NXDOC/How+to+create+an+empty+bundle" target="_blank">easy to overlook</a> when reading Nuxeo's explanation for how to use the Nuxeo Eclipse IDE.</div>
</div>
<div class="separator" style="clear: both; text-align: center;">
<span style="text-align: left;"><br /></span></div>
<div class="separator" style="clear: both; text-align: justify;">
<span style="text-align: left;">Every time Tomcat is restarted, the nuxeo.war directory under nxserver will get redeployed and expanded. Because of that, any files you may have attempted to manually add to the nuxeo.war area after a deployment will be lost the next time the war is redeployed. </span></div>
<div class="separator" style="clear: both; text-align: justify;">
<span style="text-align: left;"><br /></span></div>
<div class="separator" style="clear: both; text-align: justify;">
<span style="text-align: left;">A feature of the Nuxeo Eclipse IDE is that after the war is expanded, the project's web asset files from the src/main/resources/web directory of your project will be automatically copied into the war area, modifying the standard Nuxeo instance with your customizations.</span></div>
<div class="separator" style="clear: both; text-align: center;">
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg0nTKdE-uCfuVKLukV0M9srJnvaFEWyYHcJM6sbOp9R1SEIntcR5tKyD2WrQlc1vg8lAhoMYZq9zVwfQMpob8Cckigvd1qRnF6n3hXm6Sph6uBFUC-uhNDIckdxEr2b6Jdhw4j5kOF-648/s1600/IDEFragment.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg0nTKdE-uCfuVKLukV0M9srJnvaFEWyYHcJM6sbOp9R1SEIntcR5tKyD2WrQlc1vg8lAhoMYZq9zVwfQMpob8Cckigvd1qRnF6n3hXm6Sph6uBFUC-uhNDIckdxEr2b6Jdhw4j5kOF-648/s1600/IDEFragment.png" height="320" width="234" /></a></div>
<div class="separator" style="clear: both; text-align: center;">
<br /></div>
<div class="separator" style="clear: both; text-align: left;">
But when deploying your project jar file to another Nuxeo instance, if you just copy over the jar to the new instance, the web asset files in your jar won't be visible to Tomcat. Similar to what is done automatically for you with the Eclipse hot reload, the web asset files need to be placed within the expanded war. This can be done using the deployment-fragment.xml file. This file needs to be placed in your project at the top of the directory src/main/resources/OSGI-INF, for example:</div>
<div class="separator" style="clear: both; text-align: center;">
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiHMEyKe_8mhEn7NeDbgvYOYVgwcbAu9KIPMRfDnWmP3MtnI6NiHwQi5sRta3a1NLQG4niWAYyLJAehdGtxuIja5CnxLNM3nVvnDm-EzSz1dmMYkQFiTL_OE7pd8Qsa-Xb3_1huJ6zW9Bo0/s1600/IDEFragment.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiHMEyKe_8mhEn7NeDbgvYOYVgwcbAu9KIPMRfDnWmP3MtnI6NiHwQi5sRta3a1NLQG4niWAYyLJAehdGtxuIja5CnxLNM3nVvnDm-EzSz1dmMYkQFiTL_OE7pd8Qsa-Xb3_1huJ6zW9Bo0/s1600/IDEFragment.png" height="320" width="231" /></a></div>
<div class="separator" style="clear: both; text-align: center;">
<br /></div>
<div class="separator" style="clear: both; text-align: left;">
Here's an example of what you can put in that file:</div>
<div class="separator" style="clear: both; text-align: center;">
<br /></div>
</div>
</div>
<pre class="brush:xml;"><?xml version="1.0"?>
<fragment version="1">
<extension target="application#MODULE">
<module>
<java>${bundle.fileName}</java>
</module>
</extension>
<require>all</require>
<install>
<delete path="${bundle.fileName}.tmp"/>
<unzip from="${bundle.fileName}" to="${bundle.fileName}.tmp"/>
<copy from="${bundle.fileName}.tmp/web/nuxeo.war" to="/"/>
<append from="${bundle.fileName}.tmp/OSGI-INF/I18n/com.formtek.nuxeo.xrefs.messages.properties" to="nuxeo.war/WEB-INF/classes/messages_en_US.properties" addNewLine="true"/>
<append from="${bundle.fileName}.tmp/OSGI-INF/I18n/com.formtek.nuxeo.xrefs.messages.properties" to="nuxeo.war/WEB-INF/classes/messages_en.properties" addNewLine="true"/>
<delete path="${bundle.fileName}.tmp"/>
</install>
</fragment>
</pre>
<br />
You can see that the install section of the code unjars your bundle and copies over all assets that are under the web directory of your project to the corresponding area of the expanded nuxeo.war.
<br />
<br />
That's it. With the deployment-fragment.xml file in place, your bundle will be correctly deployed into the target Nuxeo instance when Tomcat starts up. <br />
<br />
The content of the deployment-fragment.xml file looks something like an ant build file. <a href="http://community.nuxeo.com/static/dev-tutorial/firstbundle.html#d4e807" target="_blank">It describes tasks</a> that are run when the bundle file is loaded. Some of the <a href="http://doc.athento.com/xwiki/bin/view/Athento+Platform/How+to+configure+the+deployment+of+a+Bundle#.VHXrJjHF98E" target="_blank">things that you can script</a> in this file include:<br />
<br />
<ul style="text-align: left;"><ul>
<li>unzip or unjar files </li>
<li>create folders </li>
<li>move files</li>
<li>delete files and folders</li>
<li>append files</li>
</ul>
</ul>
<div>
<br /></div>
<div>
[Note that there was a problem in the initial release of Nuxeo 6.0 for handling hot reloads. Future releases are fixed. For the 6.0 release, this <a href="https://jira.nuxeo.com/browse/NXP-15889" target="_blank">JIRA</a> explains a workaround.]</div>
</div>
Dick Weisingerhttp://www.blogger.com/profile/06275286068863587252noreply@blogger.com1tag:blogger.com,1999:blog-1622089077919681757.post-89768492649123041102014-11-17T07:02:00.001-08:002014-11-17T07:02:09.869-08:00Nuxeo 6.0 and Elasticsearch<div dir="ltr" style="text-align: left;" trbidi="on">
<a href="http://lucidworks.com/" target="_blank">Lucidworks'</a> Lucene and Solr have been the dominant open source search options for the last decade. Solr is now widely used and is tightly integrated with many products, like those from Alfresco and PTC, and it's <a href="http://lucidworks.com/blog/who-uses-lucenesolr/" target="_blank">used by a wide variety of companies</a> and organizations like Comcast, Disney, Goldmansachs and the FCC. Here at Formtek, we've integrated it into <a href="http://formtek.com/products/orion/" target="_blank">Formtek Orion</a> software too.<br />
<br />
But Solr isn't the only viable open-source search option any more. For example, it got my attention earlier this year when ECM vendor <a href="http://www.nuxeo.com/" target="_blank">Nuxeo </a><a href="http://www.nuxeo.com/media-center/nuxeo-integrates-elasticsearch-query-engine/" target="_blank">upgraded the search capabilities</a> of their core product to use <a href="http://www.elasticsearch.com/" target="_blank">Elasticsearch</a> in their 5.9.3 fast track release. That <a href="http://nuxeo.github.io/releasenotes/6.0/developers.html#anchor-0" target="_blank">Elasticsearch </a>integration is officially available now in the Nuxeo long term support (LTS) <a href="http://nuxeo.github.io/releasenotes/6.0/index.html" target="_blank">6.0 release</a> and was just made available this week.<br />
<br />
<b><span style="font-size: large;">Solr Versus Elasticsearch</span></b><br />
<br />
What makes Elasticsearch attractive as a technology?<br />
<br />
There's actually a lot of similarities between Solr and Elasticsearch technologies. Both <a href="http://en.wikipedia.org/wiki/Elasticsearch" target="_blank">Elasticsearch</a> and <a href="http://en.wikipedia.org/wiki/Apache_Solr" target="_blank">Solr </a>are built on top of Lucene, and they're both Java-based Apache-licensed open source software. The <a href="http://www.elasticsearchtutorial.com/elasticsearch-vs-solr.html" target="_blank">feature sets</a> for both of them are very comparable, partly because they're both built on top of Lucene. Both technologies offer:<br />
<ul style="text-align: left;">
<li>Java API and REST</li>
<li>Faceting</li>
<li>Highlighting</li>
<li>Replication</li>
<li>Distribution</li>
</ul>
But despite the similarities, or maybe because of them, Elasticsearch has seen tremendous growth in mindshare over the last two years. <a href="http://www.google.com/trends/explore#q=solr%2C%20elasticsearch&cmpt=q" target="_blank">Google Trends shows</a> that Elasticsearch interest <a href="http://www.searchtechnologies.com/elasticsearch-solr-lucene" target="_blank">surpassed interest</a> in Solr in 2014. So, at this point, while the Solr community is significantly bigger and Solr is more mature, Elasticsearch is growing quickly and is expected to grow even faster, especially now after Elasticsearch <a href="http://www.elasticsearch.com/blog/press/elasticsearch-raises-70-million-series-c-financing/" target="_blank">received $70 million</a> of venture funding in June 2014.<br />
<br />
Compared to Solr, opinions about ElasticSearch are often that it is <a href="http://www.quora.com/What-are-the-main-differences-between-ElasticSearch-Apache-Solr-and-SolrCloud" target="_blank">simpler to configure</a> and administer, it's use of REST and JSON is more intuitive, and it is <a href="http://thinkbiganalytics.com/solr-vs-elastic-search/" target="_blank">built on an architecture that was designed from the ground up for distributed scaling</a>.<br />
<br />
<b><span style="font-size: large;">Nuxeo Implementation of Elasticsearch</span></b><br />
<br />
Some of the benefits of Elasticsearch derived by Nuxeo in their 6.0 release include:<br />
<br />
<ul style="text-align: left;">
<li>Faster full text search</li>
<li>Query features like facets, geo location, and "more results like this"</li>
<li>Consistency with Nuxeo's <a href="http://doc.nuxeo.com/display/NXDOC/NXQL" target="_blank">NXQL query language</a></li>
<li>Ability to aggregate data for running reports and generating statistics</li>
<li>Highly scalability horizontally by adding Elasticsearch nodes</li>
</ul>
<div>
<a href="http://www.nuxeo.com/blog/meet-team-eric-barroca/" target="_blank">Eric Barroca</a>, Nuxeo CEO, <a href="http://www.nuxeo.com/media-center/nuxeo-integrates-elasticsearch-query-engine/" target="_blank">commented that</a> "with Elasticsearch, we have separated the query engine from the database, which has major implications for architectural flexibility and performance. Because Elasticsearch scales horizontally, the Nuxeo Platform now has virtually infinite scalability.”</div>
<div>
<br /></div>
<br />
<b><span style="font-size: large;">Eventual Consistency</span></b><br />
<br />
<br />
<div>
When working with Alfresco and Solr implementations I first ran into the problem of <a href="http://docs.alfresco.com/4.0/concepts/solr-event-consistency.html" target="_blank">'eventual consistency'</a>. I like Nuxeo's solution for this with their Elasticsearch implementation.</div>
<div>
<br /></div>
<div>
In short, the problem is that a repository which uses an external search engine often takes time to update the search indexes after any changes are made in the repository. As a way to make client software seem more responsive, repositories like Alfresco and Nuxeo separate out the process of updating the search index from the database transaction. </div>
<div>
<br /></div>
<div>
'Eventual consistency' or 'asynchronous indexing' refers to a small gap of time, often just seconds, between when a database operation occurs and when the request to update the search index to reflect the data changes is queued and then finally processed. Ultimately both the database and search index will be consistent.</div>
<div>
<br /></div>
<div>
In <a href="https://wiki.alfresco.com/wiki/Alfresco_And_SOLR" target="_blank">Alfresco 4.0</a> you had to choose a search engine: either Lucene or Solr. Lucene searches were 'in transaction' so that database and search indexes were always consistent, while Solr searches would use 'eventual consistency'. Depending on your use case, it was possible to choose either the Solr or Lucene implementation, and that one engine would then be used for all queries. But with Alfresco 5.0 <a href="http://richard.esplins.org/siwi/2014/11/03/important-changes-alfresco-50b/" target="_blank">Lucene is no longer available</a>, so 'in transaction' consistency is no longer an option.</div>
<div>
<br /></div>
<div>
For most use cases, eventual consistency doesn't cause a problem. But it means that if a query were to fire off immediately after a database update, the search results may not be totally consistent with what's actually in the database.</div>
<div>
<br /></div>
With Nuxeo 6.0 there are two ways to search data in the repository:<br />
<div>
<ul>
<li>Elasticsearch index query, and</li>
<li>Direct Relational or No-SQL database query</li>
</ul>
</div>
<div>
Based on your use case, with Nuxeo, you can control which of these types of queries to run. Elasticsearch queries will be fast but use 'eventual consistency'. Queries made directly to the database will likely be slower, but provide assurance that the results are totally accurate.</div>
<div>
<br /></div>
<div>
Nuxeo 6.0 allows you to decide which of the two types of queries will be used, either database or Elasticsearch, and both of the query types can be used at different points in the same client application.</div>
<div>
<br /></div>
<div>
<br /></div>
</div>
Dick Weisingerhttp://www.blogger.com/profile/06275286068863587252noreply@blogger.com0tag:blogger.com,1999:blog-1622089077919681757.post-55734584454532993862014-11-12T16:24:00.001-08:002014-11-12T16:24:28.736-08:00Nuxeo Platform 6.0 is Released<div dir="ltr" style="text-align: left;" trbidi="on">
<a href="http://www.nuxeo.com/wp-content/uploads/2014/01/Nuxeo-6.0-400x267.png" imageanchor="1" style="clear: left; float: right; margin-bottom: 1em; margin-right: 1em;"><img align="top" border="0" src="http://www.nuxeo.com/wp-content/uploads/2014/01/Nuxeo-6.0-400x267.png" height="133" width="200" /></a><a href="http://www.nuxeo.com/downloads/" target="_blank">Version 6.0</a> of the <a href="http://www.nuxeo.com/" target="_blank">Nuxeo platform</a> was <a href="http://www.prweb.com/releases/2014/11/prweb12319293.htm" target="_blank">officially released today</a>. <br />
<br style="height: 3px;" />
Nuxeo has been pretty busy over the last year and they've added some innovative features to their enterprise content management (ECM) platform that really set them apart from other ECM vendors.<br />
<br style="height: 3px;" />
While a number of the big features in the new Nuxeo release have been available via 'Fast Track' preview releases made periodically since last December, those features will now all officially roll up and become part of the fully-supported Nuxeo product feature set going forward.<br />
<br />
<div class="separator" style="clear: both; text-align: left;">
Some of the major highlights of the Nuxeo platform 6.0 release include:</div>
<div class="separator" style="clear: both; text-align: left;">
<br /></div>
<div class="separator" style="clear: both; text-align: left;">
<b>Elasticsearch</b> - extremely scalable and distributed search engine. Enables hierarchical faceted search.</div>
<div class="separator" style="clear: both; text-align: left;">
<br /></div>
<div class="separator" style="clear: both; text-align: left;">
<b>Collections </b>- <a href="http://doc.nuxeo.com/display/USERDOC/Collections" target="_blank">a light-weight folder-like object for grouping documents</a>. Bulk operations like export and download can then be applied to to the collection</div>
<div class="separator" style="clear: both; text-align: left;">
<br /></div>
<div class="separator" style="clear: both; text-align: left;">
<b>MongoDB</b> - optional NoSQL-backend storage offering high flexibility, easy sharding and replication</div>
<div class="separator" style="clear: both; text-align: left;">
<br /></div>
<div class="separator" style="clear: both; text-align: left;">
<b>Mule Connector</b> - enables Nuxeo Automation operations to be inserted inside a Mule Flow, allowing easy integration with other software platforms like Salesforce, Marketo, SAP, and Magento</div>
<div class="separator" style="clear: both; text-align: left;">
<br /></div>
<div class="separator" style="clear: both; text-align: left;">
<b>User Interface Enhancements</b> - including a <a href="http://www.nuxeo.com/blog/spreadsheet-editor-for-list-of-documents-in-nuxeo-platform/" target="_blank">spreadsheet editor</a> and lightbox support.</div>
<div class="separator" style="clear: both; text-align: left;">
<br /></div>
<div class="separator" style="clear: both; text-align: left;">
<b>CMIS</b> - supports CMIS 1.1 specification, like the new JSON browser binding</div>
<div class="separator" style="clear: both; text-align: left;">
<br /></div>
<div class="separator" style="clear: both; text-align: left;">
<b><a href="http://www.nuxeo.com/products/mobile/" target="_blank">Mobile </a>APIs</b> - includes native client SDKs for <a href="http://doc.nuxeo.com/display/NXDOC/iOS+Client" target="_blank">iOS </a>and <a href="http://doc.nuxeo.com/display/NXDOC58/Nuxeo+Android+Connector" target="_blank">Android</a>, including offline sync</div>
<div class="separator" style="clear: both; text-align: left;">
<br /></div>
<div class="separator" style="clear: both; text-align: left;">
<b>Javascript API</b> - includes two implementations, one for node.js and another for jQuery</div>
<div class="separator" style="clear: both; text-align: left;">
<br /></div>
<div class="separator" style="clear: both; text-align: left;">
<b>SAML2 and <a href="http://doc.nuxeo.com/display/NXDOC/Using+OAuth2" target="_blank">OAuth 2.0</a></b> - enables secure authentication for client applications</div>
<div class="separator" style="clear: both; text-align: left;">
<br /></div>
<div class="separator" style="clear: both; text-align: left;">
<b>AES Encryption</b> - <a href="http://doc.nuxeo.com/display/NXDOC/Binary+Store" target="_blank">encrypts content</a> with an AES algorithm before moving into the store</div>
<div class="separator" style="clear: both; text-align: left;">
<br /></div>
<div class="separator" style="clear: both; text-align: left;">
A complete list that documents the changes and new features of the Nuxeo platform 6.0 release can be found in the product release notes <a href="http://nuxeo.github.io/releasenotes/6.0/index.html" target="_blank">here</a>.</div>
<div class="separator" style="clear: both; text-align: left;">
<br /></div>
<div class="separator" style="clear: both; text-align: left;">
Nuxeo's Josh Fletcher will also be giving an overview next week on the Nuxeo 6.0 release in a <a href="http://www.nuxeo.com/events/what-is-new-nuxeo-platform-6/" target="_blank">webinar on November 18th</a>.</div>
<div class="separator" style="clear: both; text-align: left;">
<br /></div>
<div class="separator" style="clear: both; text-align: left;">
You can also test drive the latest release <a href="https://nightly.nuxeo.com/nuxeo/login.jsp" target="_blank">here</a> (login: Administrator/Administrator).</div>
<div class="separator" style="clear: both; text-align: center;">
<br /></div>
<div class="separator" style="clear: both; text-align: left;">
The next step in Nuxeo's open <a href="http://roadmap.nuxeo.com/" target="_blank">product roadmap</a> is just two months away with the 7.1 Fast Track release planned for mid-January 2015.</div>
<br /></div>
Dick Weisingerhttp://www.blogger.com/profile/06275286068863587252noreply@blogger.com0tag:blogger.com,1999:blog-1622089077919681757.post-65450905478695913662014-11-10T00:01:00.000-08:002014-11-10T06:35:13.249-08:00CMIS Document Migration with Apache Chemistry and Camel<div dir="ltr" style="text-align: left;" trbidi="on">
<br />
<b>The Headache of Data Migration </b><br />
<br />
Migration of data between different content repositories can be difficult. The primary goal of a migration project is to move as losslessly as possible the stored files, associated metadata and filing hierarchy from one system into another. But data migration can be challenging.<br />
<br />
Migrations typically require that an analyst first create a detailed map for how document types and properties will be transferred between the two systems, and then a developer implements that strategy by writing a migration script. The actual migration process can be tedious and involve a sequence of imports and exports and things like parallel intermediate files or databases which hold normalized property data.<br />
<br />
<b>Something Easier: The Apache Camel camel-cmis Component</b><br />
<br />
Recently while looking at how to migrate content stored in an <a href="http://www.alfresco.com/">Alfresco repository</a> into a <a href="http://www.nuxeo.com/">Nuxeo repository</a>, I came across a <a href="http://www.ofbizian.com/2012/07/content-migration-with-camel-cmis.html">blog article</a> by Bilgin Ibryam about the Apache Camel project connector for CMIS, a component he contributed to the Camel project. I was impressed by how he was able to define in just two lines of Java code a program that could move all the data from an Alfresco repository into Nuxeo by recursively iterating through the folder hierarchy starting at the repository root node, and preserving the hierarchy in the move.<br />
<br />
While an indiscriminate migration of all content from one repository into another wasn't exactly what I was looking for, I did find that the camel-cmis component was a good starting point for creating a simple migration tool that could move content easily between CMIS compliant repositories.<br />
<br />
Besides the repo-to-repo copy, the camel-cmis component also has the ability to identify groups of documents by using a CMIS query and can then pipe the document data from the result set into the next processing step of a Camel route.<br />
<br />
<b>Migrating Engineering Documents from Alfresco to Nuxeo</b><br />
<br />
My goal was to be able to successfully migrate into Nuxeo <a href="http://formtek.com/products/formtek/edm_solution/">engineering documents</a> which were stored in Alfresco and defined by a content model and document type based on Alfresco aspects. <br />
<br />
To do that, I tweaked the camel-cmis component to accept source and target folders, rather than migrate all documents from the repository starting at the repository root. <br />
<br />
I modified the camel-cmis component to accept custom metadata properties, and by using CMIS 1.1 'secondary-types' Alfresco aspect data can also be handled. Both Nuxeo and Alfresco understand CMIS 1.1.<br />
<br />
And finally, I created a simple Camel Message Translator (Java bean) that maps the names of the document types and properties extracted from Alfresco to the names in the content model that are used by Nuxeo. In this case, the property name translations were defined in a simple key-value property file which, when applied, maps the extracted property names before passing them into Nuxeo.<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjTLnZEz9VBl2r8FsYU-I07GVQ5gzgihHyk3Ol8NOWJya39ju0nRdO4-LsSPFoYJo7FAnJ5GnYeyArIezb6hPNdZBCctqi6JkS7tapUzunFe03xUxR5ExhDb7fPzusPDFYFmSbeEZuGsfvP/s1600/MessageTranslation.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjTLnZEz9VBl2r8FsYU-I07GVQ5gzgihHyk3Ol8NOWJya39ju0nRdO4-LsSPFoYJo7FAnJ5GnYeyArIezb6hPNdZBCctqi6JkS7tapUzunFe03xUxR5ExhDb7fPzusPDFYFmSbeEZuGsfvP/s1600/MessageTranslation.png" height="99" width="320" /></a></div>
<div class="separator" style="clear: both; text-align: center;">
<br /></div>
<br />
With that it's then possible to write a simple Camel route that defines a migration of data under an Alfresco folder to a Nuxeo folder:<br />
<pre class="brush:java;">
from("cmis://http://54.198.64.173/alfresco/api/-default-/public/cmis/versions/1.1/atom?username=admin&password=admin&folderId=744385f3-27fd-4096-a29a-e6108d35cfa0")
.to("bean:translate")
.to("cmis://http://localhost:8080/nuxeo/atom/cmis?username=Administrator&password=Administrator&folderId=66d138e4-b0e6-41ee-91c2-aa6fc5991c5e");
</pre>
<div>
<br /></div>
<div>
This Camel route recursively copies the contents of a specified Alfresco folder and its children to a folder in the Nuxeo repository, maintaining the folder hierarchy. The following screenshots show how documents and folder structure were moved from an Alfresco Share folder into Nuxeo.</div>
<br />
<br />
<table>
<tbody>
<tr>
<td><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhR5XIgqHo6TfAFFKxZ7OKhQSzI49pQYohFceQXV8q3X7Y3gGNJ7_IoNDvKqq9_0qqli7nlGdOZ7On98RVG5xtw7h77PafzMionYzNTUz44KwRrRbSmlGnRMO1g7DiMnjo7UA22jo6I7uYP/s1600/FromAlfresco.png" imageanchor="1" style="margin-left: 0em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhR5XIgqHo6TfAFFKxZ7OKhQSzI49pQYohFceQXV8q3X7Y3gGNJ7_IoNDvKqq9_0qqli7nlGdOZ7On98RVG5xtw7h77PafzMionYzNTUz44KwRrRbSmlGnRMO1g7DiMnjo7UA22jo6I7uYP/s1600/FromAlfresco.png" height="300" width="286" /></a>
<br />
<center>
<b>Documents in Alfresco Share</b></center>
</td>
<td><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh-9cS5jwIYSt_vUjdFu4FpcfOF1vrJECbbKKXdDwV1jAwhUzQ69N08gZij8af0TNTkQ_tL5TyVrSAAqtAR0BOKSudk2-BQIMh03-H8R7dQ-ET6oKWiUiXLLGC_zWtICLXlzyLZkqLl7Zs-/s1600/separator.png" imageanchor="1" style="margin-left: 0em; margin-right: 0em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh-9cS5jwIYSt_vUjdFu4FpcfOF1vrJECbbKKXdDwV1jAwhUzQ69N08gZij8af0TNTkQ_tL5TyVrSAAqtAR0BOKSudk2-BQIMh03-H8R7dQ-ET6oKWiUiXLLGC_zWtICLXlzyLZkqLl7Zs-/s1600/separator.png" height="300" width="3" /></a>
</td>
<td><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhu6vJfTGDBHA8SGQQsOiuLEQIRHeFeXwXxJpSoZ8luv2i5kHZYPjvsMH3SxlAustD-DVRO42ZIOryEqNErRMKigZKZ7ZTHskALPGPRBzx42Hjb6DVmmh5N851QMbbFjP01KjLH1_0qEuFn/s1600/ToNuxeo.png" imageanchor="1" style="margin-left: 0em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhu6vJfTGDBHA8SGQQsOiuLEQIRHeFeXwXxJpSoZ8luv2i5kHZYPjvsMH3SxlAustD-DVRO42ZIOryEqNErRMKigZKZ7ZTHskALPGPRBzx42Hjb6DVmmh5N851QMbbFjP01KjLH1_0qEuFn/s1600/ToNuxeo.png" height="300" /></a>
<br />
<center>
<b>Documents Migrated to Nuxeo</b></center>
</td>
</tr>
</tbody></table>
<br />
You can see that the documents moved from Alfresco were all engineering AutoCAD DWG files. The files, custom metadata, and foldering hierarchy were copied into Nuxeo. Then within Nuxeo we can see the migrated documents. Also, through a configuration of Nuxeo, we are able to display the engineering metadata and render the AutoCAD file content as both thumbnails and preview images.<br />
<br />
Using CMIS tools, and software plug-ins for engineering data management and AutoCAD document management, Formtek can assist organizations with ECM migration to the Nuxeo platform.<br />
<br />
<b>Footnotes on CMIS and Camel</b><br />
<br />
The use of <a href="https://www.oasis-open.org/committees/tc_home.php?wg_abbrev=cmis">CMIS</a> makes it easy to interact with compliant content repositories in a standard way. It enables the easy sharing of content between repositories from different vendors CMIS is based on a web services interface that accepts either REST or SOAP protocol.<br />
<br />
The <a href="http://chemistry.apache.org/">Apache Chemistry project</a> provides open source implementation of the CMIS standard. Both the Alfresco and Nuxeo implementations of CMIS are based on the Chemistry libraries. Chemistry offers CMIS server libraries only available for Java. CMIS client libraries exist for Java, Python, PHP, .NET and ObjectiveC, but the Java libraries are the most complete and best tested.<br />
<br />
<a href="http://camel.apache.org/what-is-camel.html">Apache Camel</a> is an open source framework for implementing Enterprise Integration Patterns (EIP). It lets you use messaging and transport models like HTTP, ActiveMQ, JMS, JBI, SCA, and CXF to grab data, transform and move it to different end points.<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
</div>
<br /></div>
Dick Weisingerhttp://www.blogger.com/profile/06275286068863587252noreply@blogger.com1tag:blogger.com,1999:blog-1622089077919681757.post-26935414801223934032012-11-21T17:13:00.000-08:002012-11-21T17:13:21.244-08:00Synchronization of File Properties with Alfresco Metadata Properties<div dir="ltr" style="text-align: left;" trbidi="on">
At Formtek we recently had a request to customize Alfresco Share for synchronizing document header properties with corresponding metadata for documents stored in Share.<br />
<br />
I'm not able to share the code from the project here, but I thought that outlining the basic concept of the project here would serve as an example of some of the things which are possible to implement within Share.<br />
<br />
There were a number of requirements for this project, but two two of the core ones were:<br />
<br />
<ol style="text-align: left;">
<li>Synchronize on uploads and metadata updates the properties of Microsoft Office (Word/Excel/PowerPoint all versions) and PDF files with corresponding metadata for the document in Alfresco.</li>
<li>Provide a method for 'publishing' a synchronized document into another location as a PDF. The file header of the published document should bring along with it the values for the Alfresco metadata at the time the document was published.</li>
</ol>
<div>
When I talk about file content header properties, I'm referring to the types of properties that can be set in the header of Microsoft Office and PDF files. For example, the next figure is a screenshot in Microsoft Word 2010 for setting the standard (Title, Author, keywords, and subject) properties and custom properties.</div>
<div class="separator" style="clear: both; text-align: center;">
</div>
<div class="separator" style="clear: both; text-align: center;">
</div>
<div class="separator" style="clear: both; text-align: center;">
</div>
<div class="separator" style="clear: both; text-align: center;">
</div>
<div class="separator" style="clear: both; text-align: center;">
</div>
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgkOgwnh8sw9i_sTrG5DDHib6ZLKxhJMYXXPTccaEjTI7jrg4C73l1KIK4_DY0UK8KnD1D3-vHihpTxM0_GdK6zsqTRpFsocLy_6bp_Bb38MC7gB-b5Y3hLKdzMRFOwbANhZwoglJYMaWJk/s1600/ScreenShot+1.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="464" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgkOgwnh8sw9i_sTrG5DDHib6ZLKxhJMYXXPTccaEjTI7jrg4C73l1KIK4_DY0UK8KnD1D3-vHihpTxM0_GdK6zsqTRpFsocLy_6bp_Bb38MC7gB-b5Y3hLKdzMRFOwbANhZwoglJYMaWJk/s640/ScreenShot+1.jpg" width="640" /></a></div>
<div>
<br /></div>
<div>
Properties and custom properties can be similarly defined in PDF files.</div>
<div>
<br /></div>
<div>
<span style="font-size: large;"><b>Property Extraction on File Upload</b></span></div>
<div>
When one of these files with properties/custom properties is uploaded into Alfresco, the document that is created captures this additional data based on a mapping properties file that is configured.</div>
<div>
<br /></div>
<div>
Within Share, the metadata would get mapped to something similar to the following panel view of the property data in the Share document detail window.</div>
<div>
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhZxk9e7SwP26GVufjtkvuLm0yOtLzf2ONsnoL7eVaSLv_q4cdkg-53gGWqKspBv6aybMdOayr0-nAOpDwTRCyve5RluJ8CTBaxU_cd6NooEQCFOEOQ_yVpODHzIjRZHkJEVUHEyGRy-ryj/s1600/ScreenShot+2.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="418" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhZxk9e7SwP26GVufjtkvuLm0yOtLzf2ONsnoL7eVaSLv_q4cdkg-53gGWqKspBv6aybMdOayr0-nAOpDwTRCyve5RluJ8CTBaxU_cd6NooEQCFOEOQ_yVpODHzIjRZHkJEVUHEyGRy-ryj/s640/ScreenShot+2.jpg" width="640" /></a></div>
<div>
<br /></div>
<div>
In this case, the mapping file that specifies how mapping from the content file to the Alfresco metadata properties is as follows:</div>
<div>
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
</div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiznK9yC_3sLtyoY1ipjayfw3640TFLDd2HbLNORSlnxvTNi9f21Ewcvs4txpkuOJCs6iEptZ8DcVjcqE-pjxHYJY6LYeahZ_lHMtFBj8bUMPReulW1ndDjHBc59PdmFjPQdi7nwLYb-Me7/s1600/Screen+Shot3.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="228" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiznK9yC_3sLtyoY1ipjayfw3640TFLDd2HbLNORSlnxvTNi9f21Ewcvs4txpkuOJCs6iEptZ8DcVjcqE-pjxHYJY6LYeahZ_lHMtFBj8bUMPReulW1ndDjHBc59PdmFjPQdi7nwLYb-Me7/s640/Screen+Shot3.png" width="640" /></a></div>
<div>
<br /></div>
<div>
<span style="font-size: large;"><b>Property Updates on Alfresco Metadata Edits</b></span></div>
<div>
This mapping of properties on upload resembles standard Alfresco property extraction, or a special version of it that also accepts and knows how to map the custom property values. But what is different is that two way synchronization with the properties in the file also occurs. Note that the mapping also correctly handles the datatypes in the mapping, like boolean, text, number and date.</div>
<div>
<br /></div>
<div>
The property mapping is bi-directional so that when properties are updated in Alfresco, the electronic file associated with the document will be rewritten. That means that the next time the document is downloaded, the properties in the file will be consistent with the corresponding properties in Alfresco.</div>
<div>
<br /></div>
<div>
<span style="font-size: large;"><b>Publishing to PDF</b></span></div>
<div>
When a synchronized file is rendered as a PDF file and 'published', the user can select the location of a folder in the current or different Share site. Actually for our customization, we call the 'publish' action 'transfer' to avoid confusion with the 'Publish' action already available in Share.</div>
<div>
<br /></div>
<div>
The user clicks on the 'Transfer to...' action for the document to start the process.</div>
<div>
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEheYp2GzS93sOCxmRZjM2pXpwNWG1ondZG8BhQ8O-EZ27rk0sQS2MskcpA5PJ4QvaD-jARxGoKd_X6h6VbKL_ErZL-lqKnRcTydWFBIqjGemOrxKDS3JrM9lztKYQ3pLaEx3JfLf4ZHuWM8/s1600/Screen+Shot4.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEheYp2GzS93sOCxmRZjM2pXpwNWG1ondZG8BhQ8O-EZ27rk0sQS2MskcpA5PJ4QvaD-jARxGoKd_X6h6VbKL_ErZL-lqKnRcTydWFBIqjGemOrxKDS3JrM9lztKYQ3pLaEx3JfLf4ZHuWM8/s1600/Screen+Shot4.jpg" /></a></div>
<div class="separator" style="clear: both; text-align: center;">
<br /></div>
<div class="separator" style="clear: both; text-align: left;">
After that the user selects the target location of the published PDF document using a re-engineered Copy/Move to dialog from Share:</div>
<div class="separator" style="clear: both; text-align: left;">
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhx2CEhx_7_2BLNC9Epg_vWabOUiJDFOnWt28D759KGy760_R5L2HR1_EYxIOdI0-kPeH2qyeYQL15x1YUH4KHamHehBSh968QW-oTWAb7R_r8dmAaukzqGd_wZ402Jyao8krJaW5sMqEeu/s1600/Screen+Shot5.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="306" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhx2CEhx_7_2BLNC9Epg_vWabOUiJDFOnWt28D759KGy760_R5L2HR1_EYxIOdI0-kPeH2qyeYQL15x1YUH4KHamHehBSh968QW-oTWAb7R_r8dmAaukzqGd_wZ402Jyao8krJaW5sMqEeu/s640/Screen+Shot5.jpg" width="640" /></a></div>
<div class="separator" style="clear: both; text-align: left;">
<br /></div>
<div class="separator" style="clear: both; text-align: left;">
The rendered PDF file is then available as a new document in the target location.</div>
<div class="separator" style="clear: both; text-align: left;">
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiFnxE4srHe5cfn_ibpkktklDajW7aox0j1RO3KRx43R1tdYYP27G3IgPwjW-LALj_32nvT0RRTP8D343UoLKchbwoR40LCE41Y6SrY4yUMKE-2NNkarQbnb2yYgQyD-6fHy6Bpra-PkFcH/s1600/Screen+Shot6.jjpg.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="82" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiFnxE4srHe5cfn_ibpkktklDajW7aox0j1RO3KRx43R1tdYYP27G3IgPwjW-LALj_32nvT0RRTP8D343UoLKchbwoR40LCE41Y6SrY4yUMKE-2NNkarQbnb2yYgQyD-6fHy6Bpra-PkFcH/s640/Screen+Shot6.jjpg.png" width="640" /></a></div>
<div class="separator" style="clear: both; text-align: left;">
<br /></div>
<div class="separator" style="clear: both; text-align: left;">
When we download the file associated with this document and open it into Adobe Reader, we can examine the settings of the file properties.</div>
<div class="separator" style="clear: both; text-align: left;">
<br /></div>
<div class="separator" style="clear: both; text-align: left;">
The standard properties in the newly created PDF file are shown as:</div>
<div class="separator" style="clear: both; text-align: left;">
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhNEhgabaG19ALkxMWp2J-eb6q4hmOoQLQEKhY17GI9F3rHvLsVoAj04M49GuSwkVv5_I7TtmivlWpeTufh1KP2t71j0yNdx8-zd306cesJtKT0GZWt057pvRYQA7m88lbgrC9cUu_zbHde/s1600/Screen+Shot7.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="178" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhNEhgabaG19ALkxMWp2J-eb6q4hmOoQLQEKhY17GI9F3rHvLsVoAj04M49GuSwkVv5_I7TtmivlWpeTufh1KP2t71j0yNdx8-zd306cesJtKT0GZWt057pvRYQA7m88lbgrC9cUu_zbHde/s640/Screen+Shot7.png" width="640" /></a></div>
<div class="separator" style="clear: both; text-align: center;">
<br /></div>
<div class="separator" style="clear: both; text-align: left;">
And custom properties are seen here:</div>
<div class="separator" style="clear: both; text-align: left;">
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgDy8CjZHMMcehFydfN8_lGdZmHawCRFYDTwI2PaJfwwVQZXS9edorCn6WvgQx2lebN7xk9A7AP7sGfNxSS52McgnzMVaJxgACOx84FRuNMp0eceatMYu4jYLXGm_YR7dGCXpvZCaxL6BSo/s1600/Screen+Shot+8.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="300" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgDy8CjZHMMcehFydfN8_lGdZmHawCRFYDTwI2PaJfwwVQZXS9edorCn6WvgQx2lebN7xk9A7AP7sGfNxSS52McgnzMVaJxgACOx84FRuNMp0eceatMYu4jYLXGm_YR7dGCXpvZCaxL6BSo/s640/Screen+Shot+8.png" width="640" /></a></div>
<div class="separator" style="clear: both; text-align: left;">
<br /></div>
<div class="separator" style="clear: both; text-align: left;">
<span style="font-size: large;"><b>Tracking Published Documents</b></span></div>
<div class="separator" style="clear: both; text-align: left;">
<br /></div>
<div>
Within the original document, we also keep track of when the document has been published. A panel in the document details page in Share for the original document now shows how many times the document has been published/transferred and to where.</div>
<div>
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhukl285BhhwdGcdwUF4INBqJCm9tBRx2G4QJvMxwKHfT4LsZzm2ZnHzcyor7wOSJIoc9SFxwDyd-eXqA_48hhFMStAjctNBk_2OJa9NEiFNUscwQh144QT9UHCvpT8wzWwxB6Cmy5Sq5ok/s1600/Screen+Shot+9.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="154" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhukl285BhhwdGcdwUF4INBqJCm9tBRx2G4QJvMxwKHfT4LsZzm2ZnHzcyor7wOSJIoc9SFxwDyd-eXqA_48hhFMStAjctNBk_2OJa9NEiFNUscwQh144QT9UHCvpT8wzWwxB6Cmy5Sq5ok/s640/Screen+Shot+9.png" width="640" /></a></div>
<div>
<br /></div>
</div>
Dick Weisingerhttp://www.blogger.com/profile/06275286068863587252noreply@blogger.com0tag:blogger.com,1999:blog-1622089077919681757.post-45864250862124279262012-11-19T11:10:00.000-08:002012-11-19T11:11:53.613-08:00Book Review: "Intelligent Document Capture with Ephesoft" by Pat Myers and Ike Kavas<div dir="ltr" style="text-align: left;" trbidi="on">
<br />
<a href="http://www.packtpub.com/intelligent-document-capture-with-ephesoft/book">Intelligent Document Capture with Ephesoft</a> is a new book from <a href="http://www.packtpub.com/">Packt Publishing</a>. The primary authors of the book are <a href="http://www.linkedin.com/in/wpmyers">Pat Myers</a>, executive vice president of Zia, and <a href="http://www.linkedin.com/in/ikavas">Ike Kavas</a>, founder and CTO of Ephesoft and also former Kofax employee. Myers and Kavas together developed the Ephesoft training program.<br />
<br />
What is Ephesoft? <a href="http://www.ephesoft.com/">Ephesoft </a>software is used to process and capture paper, email and fax documents for use within ECM, ERP and other enterprise software systems. ECM systems supported by Ephesoft include Alfresco, FileNet, SharePoint, and generic CMIS repositories. Ephesoft's capabilities include document classification, separation, and data extraction.<br />
<br />
Ephesoft is Open Source software and similar in functionality to proprietary systems like <a href="http://www-01.ibm.com/software/ecm/datacap/">IBM-DataCap</a>, <a href="http://www.emc.com/campaign/global/captiva/index.htm">EMC Captiva</a>, <a href="http://www.kofax.com/document-capture-software/">Kofax</a>, and <a href="http://www.athento.com/en/">Athento</a>. It is built from Open Source components like Spring DM, Hibernate, Lucene, and jBPM.<br />
<br />
At only 161 pages, this book on Ephesoft uses a format that's considerably shorter than many other technical books, and because of the large number of screenshots it contains, it is a relatively quick read.<br />
<br />
The book provides a high-level overview of Ephesoft and describes a path that users can take to get an Ephesoft document capture system up and running quickly. After finishing this book, the reader will have enough background to get started with building their own capture projects based on Ephesoft. But that's not to say that this book is a definitive reference for Ephesoft. Actually, there is much more detailed documentation available on-line that can be found in the <a href="http://www.ephesoft.com/wiki/index.php?title=Main_Page">Ephesoft wiki pages</a>. Free on-line training is also available from Ephesoft via the YouTube-based <a href="http://www.youtube.com/user/EphesoftUniversity">Ephesoft University</a>.<br />
<br />
The book consists of the following chapters:<br />
<ol style="text-align: left;">
<li><b>Introduction</b><br />Discusses document capture history, benefits of capture, and a description of some typical high-ROI document capture use cases like mortgage loan processing, claims processing, and the handling of invoices and sales orders. <br />At a high level, and in a way not specific to Ephesoft, the book describes different document classification methods like the use of barcodes, image layout classification, keywords, and content analysis.<br />Similarly the book explains different types of extraction methods, like zonal OCR (optical character recognition), keywords, position information, and the look up of supplemental information from databases and other systems.</li>
<li><b>A Quick Tour of Ephesoft</b><br />This chapter describes each of the five tabs in the Ephesoft administrative user interface [see also the on-line <a href="http://www.ephesoft.com/wiki/index.php?title=Admin_Manual">Ephesoft Admin Manual</a>]:<br /> - Batch Class Management<br /> - Batch Instance Management<br /> - Workflow Management<br /> - Folder Management<br /> - Reports<br />It also describes the four tabs of the Operator User Interface [see also the on-line <a href="http://www.ephesoft.com/wiki/index.php?title=User_Manual">Ephesoft User Manual</a>]:<br /> - Home/Batch List<br /> - Batch Details<br /> - Web Scanner<br /> - Batch Upload<br />The description for each tab is based on a screenshot followed up with details about how to use the features available on the tab.<br />This chapter is made available for free by Packt as a sample of the book and can be found online <a href="http://www.packtpub.com/articles/a-quick-tour-of-ephesoft">here</a>.</li>
<li><b>Creating a Batch Class</b><br />This chapter gives an example of how to create a new batch class from the Ephesoft administrative user interface. <br />The standard Ephesoft mailroom automation batch template is copied and modified to create a new custom batch class. Then a new document type for that batch is added and configured. With training, Ephesoft is able to recognize the document type for automatic classification and separation. <br />With configuration, Ephesoft can extract content from scanned images and map the extracted data as key/value pairs to fields for the document type. Field data can also be validated with validation rules using regular expressions.</li>
<li><b>Processing a Batch</b><br />This chapter uses the batch class created in chapter 3 and shows how incoming documents for this batch class can be processed. Batch processing is performed from the Operator's interface.<br />This is the shortest chapter in the book. It shows how a batch is started, and from the Operator's interface, how the review and verification steps are performed.</li>
<li><b>Core Ephesoft Features</b><br />I found the book to become more interesting after this point, because starting in this chapter the examples are a bit more detailed. <br />For example, there is information here about the different types of document classification and how to configure them: Search, Image, Barcode, Automatic, and Programmatic.<br />Also discussed is how, once document and field data have been captured, how to export that information into a repository (primarily via CMIS) or database.</li>
<li><b>Ephesoft Extended Features</b><br />This chapter gets into more advanced features available in Ephesoft. For example, it describes some features of classification based on image and barcode recognition that are a bit more advanced than the techniques described in chapter 5. <br />The Enterprise version of Ephesoft includes an integration with <a href="http://www.captaris-dt.com/product/recostar/en/">OpenText's RecoStar OCR</a> engine -- this chapter describes how to enable and configure the option.<br />Discussed here are product extension points where the user can write Java 'scripts' which customize and change standard product behavior.<br />The chapter also talks about how the base Ephesoft product can be extended with plugins and how to write new custom plugins.</li>
<li><b>Tips</b><br />The final chapter collects a variety of general tips and pieces of information to optimize your use of Ephesoft. It contains troubleshooting hints like how to configure logging and how to monitor batch processes. It also discusses how to configure Ephesoft to use authentication with <a href="http://www.ephesoft.com/wiki/index.php?title=How_To?#Configuring_OpenLDAP">LDAP</a> and <a href="http://www.ephesoft.com/wiki/index.php?title=How_To?#Configuring_Active_Directory">Active Directory</a>.</li>
</ol>
Would I recommend this book? I'd highly recommend it to someone that is not currently familiar with Ephesoft and who wants to jump start their use of the product. But existing users of Ephesoft probably won't find too much new information here. <br />
<br />
Again, while almost all the information presented in the book can be found elsewhere on-line, the advantage of the book is that the information is presented here in a directed and easy-to-consume format. What's missing from the book though are more in-depth examples and perhaps more information about reporting and working with scanners.<br />
<br />
<br />
Support for the Ephesoft Enterprise edition is available via an annual subscription. [Assistance with Ephesoft is also available from partners. <a href="http://www.ephesoft.com/partners/featured-ephesoft-system-integrators/134-formtek">Formtek </a>is an <a href="http://www.ereleases.com/pr/formtek-announces-partnership-ephesoft-adds-leading-document-capture-solution-product-portfolio-61581">Ephesoft Platinum partner</a> and we have a number of successful Ephesoft implementations.]<br />
<div>
<br /></div>
<br />
<br /></div>
Dick Weisingerhttp://www.blogger.com/profile/06275286068863587252noreply@blogger.com0tag:blogger.com,1999:blog-1622089077919681757.post-35557018441403600692012-05-18T10:24:00.000-07:002012-05-18T10:45:27.379-07:00Book Review: 'Alfresco Share' by Amita Bhandari<div dir="ltr" style="text-align: left;" trbidi="on">
<table cellpadding="15px"><tbody>
<tr><td><div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjHMurrOldMvbTXd1EAXmVtGqg94bPEJdbSCWPKx-CkGixRnD9eIE7oKd0y0dO_2zoFbnmdQVDg17JOccuhAhDTQ6WeOpZR1Uz-79N0MvOMZog8w3HNqp5Pie6zf3n4wxhdwB7EBowqAC3v/s1600/Alfresco+Share.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjHMurrOldMvbTXd1EAXmVtGqg94bPEJdbSCWPKx-CkGixRnD9eIE7oKd0y0dO_2zoFbnmdQVDg17JOccuhAhDTQ6WeOpZR1Uz-79N0MvOMZog8w3HNqp5Pie6zf3n4wxhdwB7EBowqAC3v/s1600/Alfresco+Share.jpg" /></a></div>
</td>
<td><i>Alfresco Share - Enterprise Collaboration and Efficient Social Content Management</i> is a <a href="http://www.packtpub.com/alfresco-share-easy-collaboration-for-enterprises/book">new book from Packt Publishing</a> which became available in March 2012. The book's authors are <a href="http://in.linkedin.com/pub/amita-bhandari/21/ba1/434">Amita Bhandari</a>, <a href="http://in.linkedin.com/in/vinitachoudhary">Vinita Choudhary</a>, and <a href="http://in.linkedin.com/pub/pallika-majmudar/2b/6a0/965">Pallika Majmudar</a>, all consultants at Cignex.<br />
<br />
This is the first third-party publication devoted entirely to a general discussion of Alfresco Share. It provides a detailed feature summary of the Share product. And surprisingly, the book already describes version 4 of Share, which is the latest major version of the Share Enterprise software and which was only just released in February.</td></tr>
</tbody></table>
The book targets readers that are new to Alfresco. While much of the book's content doesn't really go beyond what's available in the <a href="http://www.alfresco.com/resources/documentation/">Alfresco on-line documentation</a> and <a href="http://wiki.alfresco.com/wiki/Main_Page">wiki</a>, the difference here is that it includes numerous screenshots that clearly illustrate the features and steps for configuring and using Share. <br />
<br />
The authors took considerable care in creating the book's artwork. Many of the images are annotated screenshots or are compact composite screenshots that describe the multiple steps needed to perform an operation. I'd recommend viewing the electronic version of the book which contains color artwork, rather than the print version which has only grayscale images.<br />
<br />
The book runs more than 300 pages and is split into 10 chapters. <br />
<br />
The first chapter provides a brief overview of collaboration capabilities in Share and includes a brief description of a marketing site case study based on Share.<br />
<br />
The second chapter dives into installation of the Alfresco repository and Share. It is a bit long and includes in-depth details about installing many of the components and features that Alfresco offers. Most new users of Share will probably not need this level of detail. They can simply use the standard Alfresco wizard install and be up and running with most of the needed Share features automatically installed and configured.<br />
<br />
Developers will find some introductory technical material about the architecture of Share in Chapter 3. Readers primarily interested in how to use Share could skip that chapter.<br />
<br />
It's not really until page 90 that the discussion about Share as an application begins.<br />
<br />
Chapter 4 discusses Administration: Security, Creating/Deleting/Disabling users, Groups, Dashboards, Themes<br />
Chapter 5 discusses how to set up a site, send invites, set site roles, and configure page features<br />
Chapter 6 discusses collaboration tools within Share: the wiki, blog, data lists, calendar and links<br />
Chapter 7 discusses the document library: the document list and details pages, document actions, versioning, thumbnails and web previews. (Click here to read <a href="http://www.packtpub.com/sites/default/files/7102OS-Chapter-7-Document-Library.pdf?utm_source=packtpub&utm_medium=free&utm_campaign=pdf">Chapter 7</a> as a sample chapter.)<br />
Chapter 8 discusses rules-based simple workflows and out-of-the-box 'advanced' workflows based on Activiti<br />
Chapter 9 discusses Share configurations, like creating a custom content model, configuring advanced workflow, configuring data lists, and making configurations in the alfresco-global.properties file. While this information is good, it serves more as a starting point for how to do these types of customizations. For most of these topics, you'll probably need to supplement this reading with documentation from somewhere else.<br />
<br />
Chapter 10 goes back to a developer perspective and describes setting up a development environment and describes different options (JAR vs AMP) for how to deploy customizations to Share.<br />
<br />
So, should you buy this book? If you're new to Alfresco and just getting started with Share, this book will probably save you time that you would have otherwise spent navigating the Alfresco documentation, wiki and forums. So for new users, I think that this book could be worth getting.<br />
<br />
But if you've already been using Share for some time, you won't find too much new here. And if you're looking for developer-specific information on Share, you probably won't find enough information here to warrant the purchase.<br />
<br />
<br /></div>Dick Weisingerhttp://www.blogger.com/profile/06275286068863587252noreply@blogger.com0tag:blogger.com,1999:blog-1622089077919681757.post-33782696283481802392011-09-09T09:57:00.000-07:002011-09-09T10:01:01.821-07:00Resetting a Forgotten Alfresco admin password<div dir="ltr" style="text-align: left;" trbidi="on"><div dir="ltr" style="text-align: left;" trbidi="on">It may never happen to you, but if you ever lose or forget the password for the administration user in Alfresco, it is possible to reset that password within the database.<br />
<br />
While the reset process is easy to do, it involves fiddling directly with the database, something which you should be careful with, especially if that's not something you typically work with. If you're having problems with a production system, by all means, experiment first on a test system. You don't want to make a bad situation worse.</div><br />
First run the following SQL to find out the identifying parameters for how the admin password is stored:<br />
<br />
<pre class="brush:xml">SELECT anp1.node_id,
anp1.qname_id,
anp1.string_value as hash_pass,
anp2.string_value as user_string
FROM alf_node_properties anp1
INNER JOIN alf_qname aq1
ON aq1.id = anp1.qname_id
INNER JOIN alf_node_properties anp2
ON anp2.node_id = anp1.node_id
INNER JOIN alf_qname aq2
ON aq2.id = anp2.qname_id
WHERE aq1.local_name = 'password'
AND aq2.local_name = 'username';
</pre><br />
After doing that, you'll see something like the following:<br />
<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhAvglRac61cZLzxSGwP1V2q46B8wODGimjifasTZLjMD7CENaLNb_epG58bA3rXFdH7IgjkoJJKgoHBzgwqSmR0h7GoGVMX4qz4MextwofDRoiO9KeFq5ZIkHcLzqsDbQwZ4V2zKp757ZL/s1600/xxxx.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="244" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhAvglRac61cZLzxSGwP1V2q46B8wODGimjifasTZLjMD7CENaLNb_epG58bA3rXFdH7IgjkoJJKgoHBzgwqSmR0h7GoGVMX4qz4MextwofDRoiO9KeFq5ZIkHcLzqsDbQwZ4V2zKp757ZL/s640/xxxx.png" width="640" /></a></div><div class="separator" style="clear: both; text-align: left;"><br />
</div>In this example, we can see that the password for admin is set to the default MD5 hash value for 'admin'. You can set it back to some other MD5 hash value, but then of course, you'd need to calculate the MD5 value for whatever your desired password is. It's easier to set it back to the default value corresponding to 'admin': '209c6174da490caeb422f3fa5a7ae634'. Then, once you can log back into Alfresco again you would be able to change the password to something else.<br />
<br />
To update the password, the following SQL works:<br />
<br />
<pre class="brush:xml">UPDATE alf_node_properties
SET string_value='209c6174da490caeb422f3fa5a7ae634'
WHERE
node_id=THEADMINNODEID
and
qname_id=THEADMINQNAME
</pre><br />
Or, from the example shown in the screenshot above:<br />
<br />
<pre class="brush:xml">UPDATE alf_node_properties
SET string_value='209c6174da490caeb422f3fa5a7ae634'
WHERE
node_id=4
and
qname_id=10
</pre><br />
</div>Dick Weisingerhttp://www.blogger.com/profile/06275286068863587252noreply@blogger.com4tag:blogger.com,1999:blog-1622089077919681757.post-32949228546606462082011-08-13T22:58:00.000-07:002011-08-15T06:31:10.745-07:00Alfresco 3 Cookbook: Quick Answers to Common Problems by Snig Bhaumik<div dir="ltr" style="text-align: left;" trbidi="on"><i><a href="http://www.packtpub.com/alfresco-3-cookbook/book">Alfresco 3 Cookbook: Quick Answers to Common Problems</a></i> by <a href="http://in.linkedin.com/in/snigbhaumik">Snig Bhaumik</a> is the latest book from <a href="http://www.packtpub.com/">PACKT Publishing</a> about the <a href="http://www.alfresco.com/">Alfresco</a> Open Source <a href="http://en.wikipedia.org/wiki/Enterprise_Content_Management">Enterprise Content Management System</a>.(CMS). The book is now complete and is available in both print and electronic format. Prior to the book being completed, parts of it had been <a href="http://alfresco%203%20cookbook%20available%20in%20raw%20format/"> made available earlier</a> by PACKT in a pre-release <a href="http://www.packtpub.com/article/raw-books-announced">RAW format</a>.<br />
<br />
When I heard about this book, I was immediately interested. The concept of having a cookbook-style reference book filled with easy-to-follow self-contained recipes for how to perform common tasks in Alfresco is very appealing.<br />
<br />
The book is about 380 pages long and is organized into 14 chapters, each chapter covering one category of Alfresco usage, like the Administration Console, the Web Client, and the Content Model. Then within each chapter, there are a number of recipes that describe how to perform specific tasks. In total, the book covers more than 70 such recipes. For example, Chapter 6 covers how to customize the Alfresco Web Client and includes recipes like the following:<br />
<br />
<ul style="text-align: left;"><li>Changing languages in the Login page</li>
<li>Changing textbox length and text area size</li>
<li>Controlling the Date Picker</li>
<li>Controlling the sidebar display</li>
</ul><br />
Each of the sections or 'recipes' is then broken down into a brief description of the task followed by a sub-section titled "Getting Ready" and then another one titled "How to do it...". There's also an occasional "There's more..." section that contains a more in-depth explanation for why or how something works. The "How to do it..." section is the heart of the recipe and it breaks down each task into step-by-step instructions for how to complete it. <br />
<br />
The text descriptions are very clear and there are many illustrations, mostly of UI screenshots.<br />
<br />
I like the cookbook style the book uses -- this book is part of <a href="http://authors.packtpub.com/content/cookbook-series">PACKT's cookbook series</a>. But to stay true to the cookbook format, I would have preferred a larger number of recipes with shorter discussions about the background mechanics for how any one particular recipe works. Some of the recipes are a bit long and stretch to as many as twenty pages.<br />
<br />
<br />
The book starts out by describing the Alfresco installation process and then discusses topics useful to end users and administrators. In this part of the book and even in some of the later chapters, while I liked the overall style of presentation and format, it felt like there was a lot of overlap with material already covered in other places like <a href="http://in.linkedin.com/in/munwar">Munwar Shariff'</a>s book <a href="http://www.amazon.com/Alfresco-Enterprise-Content-Management-Implementation/dp/1847197361">Alfresco 3 Enterprise Content Management Implementation</a> or even with what can be found in the <a href="http://www.alfresco.com/resources/documentation/">standard Alfresco documentation</a>. I would have liked to have seen more 'tips, tricks and gotchas' that go beyond just that material.<br />
<br />
Later chapters discuss topics for those who want to customize and develop in the Alfresco environment. Topics include the Content Model, the Alfresco Javascript API, FreeMarker and Workflow. The final chapter describes how to download Alfresco source and set up a build environment. I did like the discussion in Chapter 10 on Web Scripts. <br />
<br />
Chapter 12 had me a bit puzzled. That chapter discusses integration of Alfresco with Microsoft applications and has a lengthy discussion of <a href="http://wiki.alfresco.com/wiki/Microsoft_Office">Alfresco's MS-Office 2003</a> plug-in instead of discussing <a href="http://wiki.alfresco.com/wiki/SharePoint_Protocol">SharePoint protocol integration</a>. I may be wrong, but I had been under the impression that the Office plugin for Alfresco has been problematic and doesn't support Office 2010.<br />
<br />
The main caveat that I have about the book though is its focus on the use of Alfresco's older Explorer client. Alfresco Share is only mentioned on a couple of pages early on in the chapter that describes installation. I would have liked to have seen much more about Share. I think that almost all new deployments of Alfresco today will want to use Share as the web client, not the older Explorer client. <br />
<br />
So, in general, I thought this book was well written and I think that you'll find a lot of useful facts about Alfresco here. I also find the cookbook format used by the book very appealing. But you'll likely be disappointed if you're looking for a book that covers Alfresco Share. I expect that PACKT has some books in the works on Alfresco Share coming up. In the near term though, there is a good overview discussion on Share in the latter part of Munwar's book that I reference above.<br />
<br />
** I'd like to thank PACKT Publishing for making available to me a complementary copy of this book for review.</div>Dick Weisingerhttp://www.blogger.com/profile/06275286068863587252noreply@blogger.com0tag:blogger.com,1999:blog-1622089077919681757.post-12798695397314554342011-04-04T16:17:00.000-07:002011-04-04T16:30:11.532-07:00Alfresco Share Permissions/Roles -- Part II<div dir="ltr" style="text-align: left;" trbidi="on"><div dir="ltr" style="text-align: left;" trbidi="on"><b><span class="Apple-style-span" style="font-size: large;">Creating Custom Alfresco Permissions/Roles</span></b><br />
<br />
In the previous blog we saw how we were able to fairly easily replace the Share <b>Manage Permissions</b> dialog with the <b>Manage Permissions</b> page used for the Repository button browser. This allowed us to be able to assign at a much more granular level permissions to the folders and items that are stored within a Share site Document Library.<br />
<br />
Now consider the scenario where we would like to be able to invite users to our site, and these users should be able to see and modify only a selected set of documents within the Document Library. We want access to the site for the majority of users to be unrestricted. This scenario doesn't work well with the standard Share site roles of Manager, Collaborator, Contributor and Consumer.<br />
<br />
To invite a restricted user to the site, we still need to give them a role. Even if we give this user the role of Site Consumer, they will be able to see much more content in the site than what we want them to see.<br />
<br />
What I propose here to help solve this problem is to add new custom Share site roles. Alfresco has a wiki page <a href="http://wiki.alfresco.com/wiki/Custom_Permissions_in_Share">here </a>that provides a good start for what needs to be done in creating a custom Share role. After following the instructions there, which were targeted for version 3.2r, I ran into some issues, and I noted a number of other people in the Alfresco forums also had some issues with it.<br />
<br />
What I describe here should work with a fresh Alfresco install. <i>Trying to add new roles after Share sites have already been created will likely result in errors being thrown. </i>The reason why this happens is that the appropriate group authorities will not exist and Share will report that as an error. Once these new roles are created, Share expects them to exist for all sites. The absence of these authorities for existing sites likely is something that can be corrected by manually creating the correct authority objects in Alfresco, but we don't attempt to do that here.<br />
<br />
Here we will create three new permissions sets/roles called External Consumer, External Contributor, and External Collaborator. The permissions for each of these roles are identical to those of the corresponding Site Consumer, Site Contributor and Site Collaborator that come standard with Share. What will be different is how these permissions are applied to content in the Document Library.<br />
<br />
To do that, we edit the file sitePermissionDefinitions.xml and replicate the lines for SiteContributor, SiteConsumer, and SiteCollaborator permissionGroups. This file is then placed into the following directory:<br />
<i>tomcat/shared/classes/alfresco/extension/model/</i><br />
<span class="Apple-style-span" style="font-family: monospace; font-size: x-small; white-space: pre;"><?xml version='1.0' encoding='UTF-8'?></span><br />
<pre class="xml:brush"><span class="Apple-style-span" style="font-size: x-small;"><!DOCTYPE permissions >
<permissions>
<!-- Namespaces used in type references -->
<namespaces>
<namespace uri="http://www.alfresco.org/model/system/1.0" prefix="sys"/>
<namespace uri="http://www.alfresco.org/model/content/1.0" prefix="cm"/>
<namespace uri="http://www.alfresco.org/model/site/1.0" prefix="st"/>
</namespaces>
<!-- ============================================ -->
<!-- Permissions specific to the wiki integration -->
<!-- ============================================ -->
<permissionSet type="st:site" expose="selected">
<permissionGroup name="SiteManager" allowFullControl="true" expose="true" />
<permissionGroup name="SiteCollaborator" allowFullControl="false" expose="true">
<includePermissionGroup permissionGroup="Collaborator" type="cm:cmobject" />
</permissionGroup>
<permissionGroup name="SiteContributor" allowFullControl="false" expose="true">
<includePermissionGroup permissionGroup="Contributor" type="cm:cmobject" />
</permissionGroup>
<permissionGroup name="SiteConsumer" allowFullControl="false" expose="true">
<includePermissionGroup permissionGroup="Consumer" type="cm:cmobject" />
</permissionGroup>
<permissionGroup name="ExternalCollaborator" allowFullControl="false" expose="true">
<includePermissionGroup permissionGroup="Collaborator" type="cm:cmobject" />
</permissionGroup>
<permissionGroup name="ExternalContributor" allowFullControl="false" expose="true">
<includePermissionGroup permissionGroup="Contributor" type="cm:cmobject" />
</permissionGroup>
<permissionGroup name="ExternalConsumer" allowFullControl="false" expose="true">
<includePermissionGroup permissionGroup="Consumer" type="cm:cmobject" />
</permissionGroup>
</permissionSet>
</permissions></span></pre>We need to alert Alfresco that this override file should be loaded on startup. To do that, we create a new file with the path<br />
<i>tomcat/shared/classes/alfresco/extension/restricted-role-context.xml</i>. <br />
The contents of that file are as follows:<br />
<span class="Apple-style-span" style="font-family: monospace; font-size: x-small; white-space: pre;"><?xml version='1.0' encoding='UTF-8'?></span><br />
<pre class="brush:xml"><span class="Apple-style-span" style="font-size: x-small;"><!DOCTYPE beans PUBLIC '-//SPRING//DTD BEAN//EN' 'http://www.springframework.org/dtd/spring-beans.dtd'>
<!-- This file enables Alfresco Custom Site Roles. It should be placed in shared/classes/extension -->
<beans>
<bean id="siteService_permissionBootstrap" parent="permissionModelBootstrap">
<property name="model" value="alfresco/extension/model/sitePermissionDefinitions.xml"/>
</bean>
</beans>
</span></pre>Finally, there are a number of files where we add string properties that can be picked up so that the new role names display correctly within the Share UI.<br />
First we create the file<br />
<i>tomcat/shared/classes/alfresco/web-extension/invitation-service-context.xml</i>:<br />
<span class="Apple-style-span" style="font-family: monospace; font-size: x-small; white-space: pre;"><?xml version="1.0" encoding="UTF-8"?></span><br />
<pre class="brush:xml"><span class="Apple-style-span" style="font-size: x-small;"><!DOCTYPE beans PUBLIC '-//SPRING//DTD BEAN//EN' 'http://www.springframework.org/dtd/spring-beans.dtd'>
<beans>
<bean id="invitationResourceBundles" class="org.alfresco.i18n.ResourceBundleBootstrapComponent">
<property name="resourceBundles">
<list>
<value>alfresco.web-extension.messages.invitation-service</value>
</list>
</property>
</bean>
</beans></span>
</pre>And the associated property file:<br />
<i>tomcat/shared/classes/alfresco/web-extension/messages/invitation-service.properties</i>:<br />
<pre class="brush:xml"><span class="Apple-style-span" style="font-size: x-small;">invitation.invitesender.email.role.ExternalCollaborator=External Collaborator
invitation.invitesender.email.role.ExternalContributor=External Contributor
invitation.invitesender.email.role.ExternalConsumer=External Consumer</span>
</pre>We add the following lines to the file:<br />
<i>tomcat/shared/classes/alfresco/web-extension/custom-slingshot-application-context.xml</i><br />
<pre class="brush:xml"><span class="Apple-style-span" style="font-size: x-small;"><?xml version='1.0' encoding='UTF-8'?>
<!DOCTYPE beans PUBLIC '-//SPRING//DTD BEAN//EN' 'http://www.springframework.org/dtd/spring-beans.dtd'>
<beans>
<bean id="webscripts.resources" class="org.springframework.extensions.surf.util.ResourceBundleBootstrapComponent">
<property name="resourceBundles">
<list>
<value>alfresco.messages.common</value>
<value>alfresco.messages.slingshot</value>
<value>alfresco.web-extension.messages.slingshot</value>
</list>
</property>
</bean>
</beans></span>
</pre>And the referenced new properties are in the file:<br />
<i>tomcat/shared/classes/alfresco/web-extension/messages/slingshot.properties</i><br />
<pre class="brush:xml"><span class="Apple-style-span" style="font-size: x-small;">## Custom Site External Reviewer Roles
role.ExternalCollaborator=External Collaborator
role.ExternalContributor=External Contributor
role.ExternalConsumer=External Consumer</span>
</pre>Next we copy the file<br />
<i>tomcat/webapps/share/WEB-INF/classes/alfresco/web-extension/site-webscripts/org/alfresco/components/folder-details/folder-info.get.properties </i><br />
to<br />
<i>tomcat/shared/classes/alfresco/web-extension/site-webscripts/org/alfresco/components/folder-details</i><br />
and include these lines at the end of the file:<br />
<pre class="brush:xml"><span class="Apple-style-span" style="font-size: x-small;">folder-info.role.ExternalCollaborator=External Collaborator
folder-info.role.ExternalConsumer=External Consumer
folder-info.role.ExternalContributor=External Contributor</span>
</pre></div>Similarly copy the file<br />
<i>tomcat/webapps/share/WEB-INF/classes/alfresco/web-extension/site-webscripts/org/alfresco/components/document-details/document-info.get.properties </i><br />
<div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;">to</div><div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"><i>tomcat/shared/classes/alfresco/web-extension/site-webscripts/org/alfresco/components/document-details/document-info.get.properties</i></div><div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;">and include these lines at the end:</div><pre class="brush:xml"><span class="Apple-style-span" style="font-size: x-small;">## Customer External Review Role
document-info.role.ExternalCollaborator=External Collaborator
document-info.role.ExternalConsumer=External Consumer
document-info.role.ExternalContributor=External Contributor</span>
</pre>Copy the file<br />
<div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"><i>tomcat/webapps/share/WEB-INF/classes/alfresco/web-extension/site-webscripts/org/alfresco/components/invite/invitationlist.get.properties </i></div><div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"><div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;">to</div></div><div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"><div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"><i>tomcat/shared/classes/alfresco/web-extension/site-webscripts/org/alfresco/components/invite/invitationlist.get.properties</i></div></div><div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"><div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;">and include these lines at the end:</div></div><pre class="brush:xml" style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"><span class="Apple-style-span" style="font-size: x-small;">## External Groups and Roles for Site
group.ExternalCollaborator=External Collaborators
role.ExternalCollaborator=External Collaborators
group.ExternalConsumer=External Consumers
role.ExternalConsumer=External Consumers
group.ExternalCotributor=External Contributors
role.ExternalContributor=External Contributors</span>
</pre><br />
<div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;">And finally, copy the file</div><div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"><div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"><i>tomcat/webapps/share/WEB-INF/classes/alfresco/web-extension/site-webscripts/org/alfresco/modules/documentlibrary/permissions.get.properties </i></div></div><div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"><div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"><div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;">to</div></div></div><div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"><div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"><div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"><i>tomcat/shared/classes/alfresco/web-extension/site-webscripts/org/alfresco/modules/documentlibrary/permissions.get.properties</i></div></div></div><div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"><div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"><div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;">and include these lines at the end:</div></div></div><pre class="brush:xml" style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"><span class="Apple-style-span" style="font-size: x-small;">## External Groups and Roles for Site
group.ExternalCollaborator=External Collaborators
role.ExternalCollaborator=External Collaborator privileges
group.ExternalConsumer=External Consumers
role.ExternalConsumer=External Consumer privileges
group.ExternalCotributor=External Contributors
role.ExternalContributor=External Contributor privileges</span></pre><br />
<b><span class="Apple-style-span" style="font-size: large;">External Site Roles in Action</span></b><br />
Whew...<br />
After doing that, we stop and restart the Alfresco server. We can then log in and create a new Share site.<br />
<br />
Immediately after creating the site, we can navigate to the root node for the site by using the Repository button in Share. When we click on the Manage Permissions button for the new site, we can see that our new permissions sets (ExternalConsumer, ExternalCollaborator, and External Consumer) are included automatically and applied to this node.<br />
<br />
<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhctdVny2Chpr1EybA0fsdV5NIUcQRpdei-xJ_ftw5psnKzVNRlhCSKDrl5kudtZBi1-tE1ObG90xGMjNeOM42i_NPXQOloDIFRHBKtOtzROocfcVWX4qNaLXOL45jS4gVOmper-AYipZo8/s1600/permissions.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="464" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhctdVny2Chpr1EybA0fsdV5NIUcQRpdei-xJ_ftw5psnKzVNRlhCSKDrl5kudtZBi1-tE1ObG90xGMjNeOM42i_NPXQOloDIFRHBKtOtzROocfcVWX4qNaLXOL45jS4gVOmper-AYipZo8/s640/permissions.png" width="640" /></a></div><br />
At the Document Library level, we can create a folder structure where two top level folders are to be accessible only by the standard SiteConsumer, SiteCollaborator and SiteContributor. And a third folder is available to standard users and is also open for viewing to External Reviewers.<br />
<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEguAtzFKLAFeO7KrEqHCHagp18-D2azWJb9N7YAwUY03BjPB6iwr1hddt_UD51gqFY7wlAMJReP5VzalrlJ7UMrcpKI5lelGOy6OTrz38W9m0u3FwiDeocbNFvMkHM_S1NUkNRrjm2S_pzE/s1600/folderstructure.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="400" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEguAtzFKLAFeO7KrEqHCHagp18-D2azWJb9N7YAwUY03BjPB6iwr1hddt_UD51gqFY7wlAMJReP5VzalrlJ7UMrcpKI5lelGOy6OTrz38W9m0u3FwiDeocbNFvMkHM_S1NUkNRrjm2S_pzE/s400/folderstructure.png" width="371" /></a></div><br />
<br />
The internal folder permissions look as follows:<br />
<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjN3a5ISsnclbGv27Z8JHCT6edLat2W9FDYuIZ5PlsJmBmhZKDF7Jbak6BVdcFgcajWcar9S6pR7PMEqI8Zju_Tjs5YKODDW45VVHEoYo9aeplOtBU18jQILMVXIEvbNaQn54roHI4zaD-w/s1600/internalpermissions.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="320" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjN3a5ISsnclbGv27Z8JHCT6edLat2W9FDYuIZ5PlsJmBmhZKDF7Jbak6BVdcFgcajWcar9S6pR7PMEqI8Zju_Tjs5YKODDW45VVHEoYo9aeplOtBU18jQILMVXIEvbNaQn54roHI4zaD-w/s640/internalpermissions.png" width="640" /></a></div>With these settings, only internal reviewers will be able to see the content of this folder. <br />
<br />
In the External Reviewer folder, we set the permissions as follows:<br />
<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhmjNCHU3u3eR373jsMo0pgXhwsxUNslvtqX3DopLdQA_n9pl2STFgxjmXSid8xwENntcf4L8M5F3xuSdQUTOeH-P-fdF5F8PlMPWMmIPgU6R-u-VJ7XeBUsl6OBP2teS8YLbXrOY9rx8rM/s1600/permissions2.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="440" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhmjNCHU3u3eR373jsMo0pgXhwsxUNslvtqX3DopLdQA_n9pl2STFgxjmXSid8xwENntcf4L8M5F3xuSdQUTOeH-P-fdF5F8PlMPWMmIPgU6R-u-VJ7XeBUsl6OBP2teS8YLbXrOY9rx8rM/s640/permissions2.png" width="640" /></a></div>In this case, we can see that both external and standard internal reviewers are able to access this folder.<br />
And if we navigate one Folder down in the hierarchy of the External Reviewer Folder, we can see that the inheritance of these permissions flow down. One folder down, we see the permissions are set in the same way:<br />
<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjPIDqdtLkjCIbshGv5zVI9a9bnsZ6YzT_yocbh2nORODMBjzFc04ASWvkBfjLcuzKsT3mJUfHm7BNZuRzQniiU6Vck7rlnp12G20O-v_4fOb7Q0RUr53lllm9YZK-BN7eiU9uqXJ6f08bX/s1600/permissions3.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="506" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjPIDqdtLkjCIbshGv5zVI9a9bnsZ6YzT_yocbh2nORODMBjzFc04ASWvkBfjLcuzKsT3mJUfHm7BNZuRzQniiU6Vck7rlnp12G20O-v_4fOb7Q0RUr53lllm9YZK-BN7eiU9uqXJ6f08bX/s640/permissions3.png" width="640" /></a></div>One last note. In order for the user/group search capability to work correctly on this form, I found that the "Add User/Group" button on this page does not find Alfresco Share groups. By default, search is performed for groups within the ALF.DEFAULT zone which does not include the Share zone groups. In order to find our groups, the following Javascript file was changed (Note the changes in bold made to that file):<br />
<i>tomcat/shared/classes/alfresco/web-extension/site-webscripts/org/alfresco/components/people-finder/authority-query.get.js</i><br />
<span class="Apple-style-span" style="font-family: monospace; font-size: x-small; white-space: pre;">var getMappings = function()</span><br />
<pre brush="xml"><span class="Apple-style-span" style="font-size: x-small;">{
var mappings = [],
authorityType = args.authorityType === null ? "all" : String(args.authorityType).toLowerCase();
if (authorityType === "all" || authorityType == "user")
{
mappings.push(
{
type: MAPPING_TYPE.API,
url: "/api/people?filter=" + encodeURIComponent(args.filter),
rootObject: "people",
fn: mapUser
});
}
if (authorityType === "all" || authorityType === "group")
{
var url = "/api/groups?shortNameFilter=" + encodeURIComponent(args.filter);
</span><b>// if (args.zone !== "all")
// All authorities are to be found
if (args.zone !== "all" && args.zone !== null)</b><span class="Apple-style-span" style="font-size: x-small;">
{
url += "&zone=" + encodeURIComponent(args.zone === null ? "APP.DEFAULT" : args.zone);
}</span>
...
</pre><br />
</div>Dick Weisingerhttp://www.blogger.com/profile/06275286068863587252noreply@blogger.com4tag:blogger.com,1999:blog-1622089077919681757.post-4138119873538386172011-04-01T16:51:00.000-07:002011-04-04T16:05:24.098-07:00Alfresco Share Permissions/Roles -- Part I<div dir="ltr" style="text-align: left;" trbidi="on"><b><span class="Apple-style-span" style="font-size: large;">Accessing Granular Permission Rights within Alfresco Share</span></b><br />
<br />
People are sometimes surprised to find that although the Alfresco repository is architected to have very granular permissions, permissions assignments via the Share UI are based on Site roles. <br />
<br />
<b><span class="Apple-style-span" style="font-size: large;">Share Site Roles</span></b><br />
The Share roles are as follows:<br />
<br />
<br />
<br />
<center><table border="1" padding="2"><tbody>
<tr><td><b>Site Consumer</b></td><td> </td><td> Read</td></tr>
<tr><td><b>Site Contributor</b></td><td> </td><td> Read, Upload</td></tr>
<tr><td><b>Site Collaborator</b></td><td> </td><td> Read, Upload, Checkout, Edit </td></tr>
<tr><td><b>Site Manager</b></td><td> </td><td> Full Control</td></tr>
</tbody></table></center><br />
<br />
Interestingly, Alfresco did not include a Site Editor role for the Share UI, despite the fact that the Editor is a standard role used within the repository and is accessible in the Alfresco Explorer client. [Note the editor can change existing document but doesn't have the Upload/Create capability.]<br />
<br />
Within the Alfresco Share client, assignment of permissions at the object level is possible using the <b>Manage Permissions</b> action dialog: Here we can see that permissions are assigned to the standard Share site groups. There is no way using this dialog to specify permissions for an individual.<br />
<br />
The mix of using the same name, like 'Site Consumer' when referring to groups, privilege sets and roles also makes for some confusion on this dialog.<br />
<br />
<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhPH1FlsW3ZVBCyhG3Whc2SpQvPfFccPaZV59JFCxppPBeERil-FUQItkMlS7nLPzK1R4-Fppcq5r0bA59CWcvgzIe0782mEe7NAozCObRPMxYK5Ggo7x2IF7uaT1IgqTyug6nA5QMZoEC4/s1600/permissionsDialog.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="363" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhPH1FlsW3ZVBCyhG3Whc2SpQvPfFccPaZV59JFCxppPBeERil-FUQItkMlS7nLPzK1R4-Fppcq5r0bA59CWcvgzIe0782mEe7NAozCObRPMxYK5Ggo7x2IF7uaT1IgqTyug6nA5QMZoEC4/s640/permissionsDialog.png" width="640" /></a></div><br />
<br />
<b><span class="Apple-style-span" style="font-size: large;">Role Assignments via the Share Repository Button</span></b><br />
If permissions on objects can be enforced only by role, how can one restrict the viewing of some of the documents in the repository to only one or a few individuals? It can be done from the Explorer client. And, interestingly, it can also be accessed in Alfresco Share when browsing the Alfresco Repository, a feature which has been made available in Share.<br />
<br />
When browsing the repository, a different page is displayed for setting permissions than the dialog we saw above which is used when browsing within a site Document Library. I'm not sure why Alfresco developers decided on this particular discrepancy in the design.<br />
<br />
So setting permissions at a much more granular level is available within Share out of the box, but its location is a bit problematic because it isn't obvious that it is available.<br />
<br />
<b><span class="Apple-style-span" style="font-size: large;">Changing the Manage Permissions Action</span></b><br />
To change the behavior of the <b>Manage Permissions</b> action to be the same as that available from the Share Repository button is not hard. To do that we need to modify three files. First we make folders in the tomcat/shared folder to hold the Share files that we will change.<br />
<br />
<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiCTPpvUHBVjwGiVbqVkBrPhiyjgniv35jp8S_mMYeIreofu5RGYtcLW0Zg_u19uZDFf5iQE7Bsdcrbzqpoy6cNspLHLN_v88vajPW-9Nf2owi-lHIQWsp4DNnPU0e0_DY4Q524B0wetFbu/s1600/folder.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="302" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiCTPpvUHBVjwGiVbqVkBrPhiyjgniv35jp8S_mMYeIreofu5RGYtcLW0Zg_u19uZDFf5iQE7Bsdcrbzqpoy6cNspLHLN_v88vajPW-9Nf2owi-lHIQWsp4DNnPU0e0_DY4Q524B0wetFbu/s320/folder.png" width="320" /></a></div><div class="separator" style="clear: both; text-align: left;">In the <i>document-detail</i>s folder, we copy over the file <i>document-actions.get.config.xml</i>.</div><div class="separator" style="clear: both; text-align: left;">In the <i>documentlibrary</i> folder, we copy over the file <i>documentlist.get.config.xml</i>.</div><div class="separator" style="clear: both; text-align: left;">In the <i>folder-details</i> folder, we copy over the file <i>folder-actions.get.config.xml</i>.</div><br />
In these files, we then edit the following line:<br />
<br />
<pre brush="xml"><action id="onActionManagePermissions" label="actions.document.manage-permissions" permission="permissions" type="action-link"></action>></pre><br />
This line is changed to the following:<br />
<br />
<pre brush="xml"><action type="simple-link" id="onActionManagePermissions" permission="permissions" href="{managePermissionsUrl}" label="actions.folder.manage-permissions" />
</pre><br />
This same line needs to change once in each of<br />
d<i>ocument-actions.get.config.xml</i> and <i>folder-actions.get.config.xml </i>files<i>, </i><br />
<i></i>and twice in the file <i>documentlist.get.config.xml</i>.<br />
<br />
After adding these files, we stop and start the server.<br />
<br />
<b><span class="Apple-style-span" style="font-size: large;">Testing out the <i>Manage Permissions</i> Changes</span></b><br />
Consider the case of a manager who has uploaded a new document, a document that he wants only Susan, a user with role Site Consumer, to be able to see it. (Although note that site managers will always be able to see all site document regardless of permission settings.)<br />
<br />
After creating the document, click on the document action <b>Manage Permissions</b>. We'll see a screen that looks like the following:<br />
<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhSLpcvBTzpUxud2wgiaPtsuY0tzRfnO7PkUck6tiqKhNDqwNI1caIdwtZFv0cKj2DiSWHVH9cg1J1bgVt20wlU-1vebUyfyG-MGOYBfGTQ_OLELDFvDtxZXDPjk8VpTCtr2clWxY6FcoNr/s1600/permissions.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="427" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhSLpcvBTzpUxud2wgiaPtsuY0tzRfnO7PkUck6tiqKhNDqwNI1caIdwtZFv0cKj2DiSWHVH9cg1J1bgVt20wlU-1vebUyfyG-MGOYBfGTQ_OLELDFvDtxZXDPjk8VpTCtr2clWxY6FcoNr/s640/permissions.png" width="640" /></a></div>Because, via inheritance of permissions in Share, all members of the Share site currently have access to see this document. Let's change the access permissions by doing the following:<br />
<div style="text-align: left;"></div><ul style="text-align: left;"><li>click on <b>Inherit Permissions</b> to turn off that inheritance, and then </li>
<li>click on <b>Add User/Group</b> and selecting Susan as the only user with permissions to see this document</li>
<li>click on the save button to save the new permission settings</li>
</ul>After doing that, the Manage Permissions screen shows the following.<br />
<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj2refJkm5gd8m5BCNFeBTSA6_Tzz3JN79Ochj6xc9vm1gxt0Hjcb9jGTnrPE7n5KBwc-k8lac2XEfjrUjvSCm_A6T3iA1qey78f2D1Af5wRqAE5kvnqsTmiSX4Gxj1FLjiggDHcxTFY3wc/s1600/permissions2.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="213" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj2refJkm5gd8m5BCNFeBTSA6_Tzz3JN79Ochj6xc9vm1gxt0Hjcb9jGTnrPE7n5KBwc-k8lac2XEfjrUjvSCm_A6T3iA1qey78f2D1Af5wRqAE5kvnqsTmiSX4Gxj1FLjiggDHcxTFY3wc/s640/permissions2.png" width="640" /></a></div><div style="text-align: left;"><br />
</div><b><span class="Apple-style-span" style="font-size: large;">Login as Mary</span></b><br />
Now we can log out as the site manager and log in as as Mary, a Site Collaborator. Mary should have no permission to see this document.<br />
<br />
Mary can navigate into the document library for the site and she does not see the document restricted to Susan.<br />
<br />
One glitch does show up here. In the "Site Activities" Dashlet of the site, the document still shows up. See the top document in this list, BGESWFViewer.png below:<br />
<br />
<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjePU08yGXZ7w_KjVeqwIEgl94cDDVkn0BI_j0DrdAVONJWxHcshOKF_DiCzAJ7ck5knPH-CImZLozjUU_VrWGV_Ldu5cTJJ1rY_eTVq4aBBVh7xbyYL9-_FNua_Alb3-KnJRvdUxaGi3-w/s1600/dashlet1.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="210" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjePU08yGXZ7w_KjVeqwIEgl94cDDVkn0BI_j0DrdAVONJWxHcshOKF_DiCzAJ7ck5knPH-CImZLozjUU_VrWGV_Ldu5cTJJ1rY_eTVq4aBBVh7xbyYL9-_FNua_Alb3-KnJRvdUxaGi3-w/s400/dashlet1.png" width="400" /></a></div><div class="separator" style="clear: both; text-align: left;">This seems to be a bug with this Alfresco dashlet to have allowed a restricted document's name to be seen by someone without permission. But, other than that, this seems to work pretty well.</div><br />
And when Mary clicks on the link to the document that she sees in this dashlet, she finds that she is restricted from accessing it:<br />
<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjfDJ2DvjzPXmdnfPFzVMbONj_IsxxMwAbuezXv7tv6RqoKJegA3pdB-aKj4T3nX435EPmUVEwe2iGqbS8-bX_1lQSkJrNnjDgGYJLVV6h9yMornmo59-qPR-HhvNwVoW6mqLrnip-kh_E_/s1600/restricted.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="163" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjfDJ2DvjzPXmdnfPFzVMbONj_IsxxMwAbuezXv7tv6RqoKJegA3pdB-aKj4T3nX435EPmUVEwe2iGqbS8-bX_1lQSkJrNnjDgGYJLVV6h9yMornmo59-qPR-HhvNwVoW6mqLrnip-kh_E_/s320/restricted.png" width="320" /></a></div><br />
<br />
<b><span class="Apple-style-span" style="font-size: large;">Login as Susan, Site Consumer</span></b><br />
When logging in as Susan, in the Dashboard for the site, we see references to the document in both the "Recently Modified Document" dashlet and also the "Site Activities" dashlet. But this is as it should be since Susan has rights to see this document.<br />
<br />
<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgUKVC2N4wmUYPCzUo7Z3eJ0JJbQX8YSwMJMk1SVTGpXSbW8tdn_9hYrDnuIzd6kAHP6E_O8WlY77w1JYirkvDHgjf5gP60cxaBVZ5dK_e6WL12jb7cAy_JMq8-9DnWL_Z4NuZ3KHWQmpJS/s1600/dashlet.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="400" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgUKVC2N4wmUYPCzUo7Z3eJ0JJbQX8YSwMJMk1SVTGpXSbW8tdn_9hYrDnuIzd6kAHP6E_O8WlY77w1JYirkvDHgjf5gP60cxaBVZ5dK_e6WL12jb7cAy_JMq8-9DnWL_Z4NuZ3KHWQmpJS/s400/dashlet.png" width="290" /></a></div><br />
On navigation into the Document Library, Susan is able to successfully open the document. She can open the document details page. If you notice when we assigned permissions to Susan above, we gave her permission as "Site Collaborator". In that case, Susan is able to edit the metadata for it. <br />
<br />
</div>Dick Weisingerhttp://www.blogger.com/profile/06275286068863587252noreply@blogger.com1tag:blogger.com,1999:blog-1622089077919681757.post-73653347132939462692011-03-02T13:23:00.000-08:002011-03-02T13:34:28.884-08:00Updates to Alfresco Aspect Properties using CMIS (Part 2)<div dir="ltr" style="text-align: left;" trbidi="on">This is a follow-up to my previous post about how to update aspect properties on documents using CMIS in Alfresco. In the earlier post I provided a bit of a hack that permits aspect-defined properties to be updated just like regular document properties -- with no changes to the atom entry sent by CMIS to the server. I should say that this hack is frowned on because Alfresco is purposely disabling support for aspects in their implementation of the CMIS API.<br />
<br />
The reason why aspects are disabled is because Alfresco wants to comply totally with the CMIS 1.0 standard, and that first version of the standard does not provide support for aspects. Actually, the possibility of adding support for aspects in CMIS has been a <a href="http://forums.alfresco.com/en/viewtopic.php?f=45&t=23300">topic of discussion</a> on the Alfresco forums for some time.<br />
<br />
The interim solution for getting at aspect properties using CMIS is to use custom Alfresco CMIS extensions. But any code you write using an Alfresco extension of course will not work with any other CMIS repository. Using an extension seems to defeat the purpose of the 'write once, deploy against any repository' selling point for CMIS, but the alternative is to introduce hacks that allows Alfresco CMIS to recognize aspect properties as regular properties, which isn't pretty either.<br />
<br />
A page on the <a href="http://cmis.alfresco.com:8080/alfresco-opencmis-extension.html">Alfresco website</a> describes how CMIS extensions can enable the handling of aspects:<br />
<br />
<blockquote><i>CMIS extensions are XML fragments placed in different parts of a CMIS object. The Alfresco aspect fragments are <a href="http://wiki.alfresco.com/wiki/CMIS#Aspect_Support">documented on the Alfresco Wiki</a>. So, theoretically, they are available to all CMIS clients out there including OpenCMIS.</i></blockquote><blockquote><i>In reality, dealing with CMIS extensions isn't fun and can require quite a lot of code. OpenCMIS does all the XML parsing for you but, since it doesn't know anything about aspects, it can't provide pretty interfaces.</i></blockquote><br />
For example, when properties are updated using CMIS against an Alfresco repository, properties need to be partitioned between those properties that are related to aspects and those that aren't. This is done by using Alfresco-specific extension tags as shown in bold in the atom entry below. In this example, the first property <i>cmis:name</i> is not included within the Alfresco tags, while aspect properties <i>edm:program_project</i> and <i>cm:author</i> are. These extension tags enable the partitioning out of aspect properties.<br />
<br />
<pre class="brush:xml"><entry xmlns="http://www.w3.org/2005/Atom"
xmlns:cmisra="http://docs.oasis-open.org/ns/cmis/restatom/200908/"
xmlns:cmis="http://docs.oasis-open.org/ns/cmis/core/200908/"
xmlns:alf="http://www.alfresco.org">
<title>2d_house_plan.dwg</title>
<cmisra:object>
<cmis:properties>
<cmis:propertyString propertyDefinitionId="cmis:name" queryName="cmis:name"><cmis:value>My CAD Drawing</cmis:value></cmis:propertyString>
<b><alf:setAspects>
<alf:properties></b>
<cmis:propertyString propertyDefinitionId="edm:program_project" queryName="edm:program_project"><cmis:value>Big Project</cmis:value></cmis:propertyString>
<cmis:propertyString propertyDefinitionId="cm:author" queryName="cm:author"><cmis:value>admin</cmis:value></cmis:propertyString>
<b></alf:properties>
</alf:setAspects></b>
</cmis:properties>
</cmisra:object>
</entry>
</pre><br />
</div>Dick Weisingerhttp://www.blogger.com/profile/06275286068863587252noreply@blogger.com0tag:blogger.com,1999:blog-1622089077919681757.post-80757406500578077482011-02-28T14:06:00.000-08:002011-02-28T14:21:45.635-08:00Updating Aspect Properties in Alfresco with CMIS<div dir="ltr" style="text-align: left;" trbidi="on">The current CMIS 1.0 specification does not address the dynamic metadata assignment like the concept of aspects used within Alfresco. In the Alfresco 3.4d Community release, an attempt to send a CMIS request to update metadata properties on fields which have been assigned via aspects fails.<br />
<br />
For example, in developing the Formtek EDM module, we attempted to send a request to update the value for a property which was assigned to a document through the addition of an aspect.<br />
<br />
An example of the CMIS request to update metadata and the associated ATOM document are as follows:<br />
<br />
PUT /alfresco/s/cmis/s/workspace:SpacesStore/i/4073281a-5e9c-45cc-966a-4a2f32a933b8<br />
<br />
<pre class="brush:xml"><entry xmlns="http://www.w3.org/2005/Atom"
xmlns:cmisra="http://docs.oasis-open.org/ns/cmis/restatom/200908/"
xmlns:cmis="http://docs.oasis-open.org/ns/cmis/core/200908/"
xmlns:alf="http://www.alfresco.org">
<title>2d_house_plan.dwg</title>
<cmisra:object>
<cmis:properties>
<cmis:propertyString propertyDefinitionId="edm:program_project"
queryName="edm:program_project"><cmis:value>2d_house_plan.dwg</cmis:value>
</cmis:propertyString>
</cmis:properties>
</cmisra:object>
</entry>
</pre><br />
Here the property edm:program_project is a property of a custom document type associated with the document via a mandatory aspect.<br />
<br />
The request fails with the following error:<br />
<br />
<i>The WebScript has responded with a status of 400 - Bad Request.</i><br />
<i>400 Description: Request sent by the client was syntactically incorrect.<br />
Message: Property edm:program_project is not a known property for type D:edm:engineeringDrawing</i><br />
<br />
I was able to fix this by replacing lines 227-228 of the file <alfresco>/tomcat/webapps/alfresco/WEB-INF/classes/alfresco/templates/webscripts/org/alfresco/cmis/lib/modify.lib.js<br />
<br />
</alfresco><br />
<pre class="brush:xml">// is this a valid property?
var propDef = typeDef == null ? cmis.queryProperty(propName) : typeDef.propertyDefinitions[propName];
</pre><br />
with this:<br />
<br />
<pre class="brush:xml">// is this a valid property?
var propDef;
if(typeDef != null)
{
propDef = typeDef.propertyDefinitions[propName];
}
if(propDef == null)
{
propDef = cmis.queryProperty(propName);
}
</pre><br />
</div>Dick Weisingerhttp://www.blogger.com/profile/06275286068863587252noreply@blogger.com2tag:blogger.com,1999:blog-1622089077919681757.post-20383687425751589942011-01-20T08:39:00.000-08:002011-01-20T08:39:55.009-08:00Formtek to Deliver Engineering Data Management Webinar<div dir="ltr" style="text-align: left;" trbidi="on"><div lang="EN-US"><div><br />
<span style="font-size: medium;"><img src="http://online.salesnexus.com/miscref/1510311/images/Announcement%20-%20EDM%20Webinar.jpg" alt=" " width="400" /></span><br />
<br />
<table style="font-size: small;" border="0" cellspacing="0" cellpadding="0"><tbody>
<tr> <td style="width: 478.5pt; padding: 0in 0in 0in 0in;" width="638" valign="top"><br />
<p style="text-align: center;"><strong>Formtek to Deliver Engineering Data Management Webinar </strong></p>On February 3, 2011, Formtek's Chief Technology Officer, Dick Weisinger, will present a webinar, sponsored by Alfresco, entitled: <em>Engineering Data Management Module for Alfresco</em><strong>. </strong><br />
<br />
The Formtek Engineering Data Management (EDM) Module is a pre-packaged extension to the Alfresco data repository and Share application that is designed to improve the management, accessibility and search capability of engineering data. The EDM Module provides pre-configured content models specific to the needs of engineering organizations for the management of drawings and documents within the Alfresco repository.<br />
<br />
Within Alfresco Share, the EDM Module provides packaged view, edit and advanced search forms that enable engineering metadata to be displayed, edited and efficiently searched. The EDM Module also supports popular AutoCAD® file formats, including DWG, DXF and DWF. Thumbnails and Flash (SWF) previews of AutoCAD files are automatically generated for display and use within the Share Document Library.<br />
<br />
To register for this event, visit <span style="text-decoration: underline;"><a href="http://www.alfresco.com/about/events/2011/02/engineering-data-management-module-for-alfresco/" target="_blank">Alfresco's registration page</a></span>.<br />
<br />
For additional information about Formtek's Engineering Data Management offerings, download the <span style="text-decoration: underline;"><a href="http://www.formtek.com/downloads/solutions/Formtek_EDM_Module_For_Alfresco.pdf" target="_blank">product data sheet</a></span> or contact: <span style="text-decoration: underline;"><a href="mailto:sales@formtek.com" target="_blank">sales@formtek.com</a></span>.<br />
<p style="text-align: center;"><strong> </strong></p></td> </tr>
</tbody> </table><p style="text-align: center;"><strong> </strong></p><br />
<table style="background: silver;font-size: small;" border="1" cellspacing="0" cellpadding="0"><tbody>
<tr> <td style="width: 638px; padding: 0in 0in 0in 0in;" width="638" valign="top"><em>About Formtek: </em>For over two decades, Formtek has been providing mission-critical Enterprise Document and Content Management solutions and services to some of the most demanding industrial operations in the world. Our capabilities and experience, particularly in the areas of engineering drawing management, technical document management, and secure collaboration, have helped both small organizations as well as large global enterprises manage their most important information assets. Formtek solutions address real, day-to-day document management, content management, and records management requirements for worldwide customers in manufacturing, aerospace, defense, telecommunication, utility, and government.</td> </tr>
</tbody> </table></div></div></div>Dick Weisingerhttp://www.blogger.com/profile/06275286068863587252noreply@blogger.com0tag:blogger.com,1999:blog-1622089077919681757.post-48098232668052433692010-10-25T19:17:00.000-07:002010-10-25T19:18:12.256-07:00JBPM Workflow in Alfresco Share 3.4a community release<span class="Apple-style-span" style="font-family: 'Trebuchet MS', sans-serif;">There's some interesting improvements available for Workflow in the Alfresco 3.4a Share community release. Alfresco community downloads are available <a href="http://wiki.alfresco.com/wiki/Download_and_Install_Alfresco">here</a>. </span><br />
<span class="Apple-style-span" style="font-family: 'Trebuchet MS', sans-serif;"><br />
</span><br />
<span class="Apple-style-span" style="font-family: 'Trebuchet MS', sans-serif;">Gavin Cornwell from Alfresco has updated the Alfresco wiki with information about 3.4 <a href="http://wiki.alfresco.com/wiki/Custom_Share_Workflow_UI">Share workflow</a>.</span><br />
<br />
<span class="Apple-style-span" style="font-size: x-large;"><span class="Apple-style-span" style="font-family: 'Trebuchet MS', sans-serif;"><b>Starting a Workflow in Share</b></span></span><br />
<span class="Apple-style-span" style="font-family: 'Trebuchet MS', sans-serif;">Workflows can be started by clicking on the "Start Workflow" action links from either the document details page, from the actions along the right on an item row in the list of Document Library items, or from the select items menu which applies to all items selected in the Document Library page.</span><br />
<br />
<br />
<table><tbody>
<tr> <td><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiMhbkj1Pzh4km9AkwjoMpvc0YpGokk7xbyl5cIhWGHS60-B8Ce-eP_gmRZ4G4lGpXDcE2w-SWVWwkbrU9XgM0uczchyphenhyphenvtm_5QDGmMXovRv3nfxKNhys0YOXr1dW0o3pPUNwzHDJpGmdNBy/s1600/zoho2.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="320" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiMhbkj1Pzh4km9AkwjoMpvc0YpGokk7xbyl5cIhWGHS60-B8Ce-eP_gmRZ4G4lGpXDcE2w-SWVWwkbrU9XgM0uczchyphenhyphenvtm_5QDGmMXovRv3nfxKNhys0YOXr1dW0o3pPUNwzHDJpGmdNBy/s320/zoho2.png" width="135" /></a></div></td> <td valign="top"><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgH3LTbbRFKnrpWVQDY9sdIDrnKGsiFuNaOmPwc_qAUTBAqMCJ04PzDIIDsfXo7FiHHLtjWqRf5M4L5LZQ3mNenHSWlpHkyWkcPtm7B8SEWtDOa8mbb5QksSrj_9oj66p_0VOQ25tTXWcpB/s1600/zoho2.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="93" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgH3LTbbRFKnrpWVQDY9sdIDrnKGsiFuNaOmPwc_qAUTBAqMCJ04PzDIIDsfXo7FiHHLtjWqRf5M4L5LZQ3mNenHSWlpHkyWkcPtm7B8SEWtDOa8mbb5QksSrj_9oj66p_0VOQ25tTXWcpB/s320/zoho2.png" width="320" /></a></div></td> </tr>
</tbody></table><br />
<span class="Apple-style-span" style="font-family: 'Trebuchet MS', sans-serif;">After clicking on that, the start-workflow page comes up. It's a little bit sparse. The main element is a button that lets you choose which workflow to assign from a popup list of all available Workflows that can be initiated.</span><br />
<span class="Apple-style-span" style="font-family: 'Trebuchet MS', sans-serif;"><br />
</span><br />
<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjcBXze9PmwsOqZ415-iR_tn5P5DAvJMrWBFjQHntY7J8IBASMgT6mmUFfWHd8KSs510PbNzd5KcRAOaaPR0pMgBvO185tbIvg5IupqTQl35oeZYXjaUgU8Otnv4reFkpBPjm5ZQYklFVLd/s1600/zoho2.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="400" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjcBXze9PmwsOqZ415-iR_tn5P5DAvJMrWBFjQHntY7J8IBASMgT6mmUFfWHd8KSs510PbNzd5KcRAOaaPR0pMgBvO185tbIvg5IupqTQl35oeZYXjaUgU8Otnv4reFkpBPjm5ZQYklFVLd/s400/zoho2.png" width="348" /></a></div><div class="separator" style="clear: both; text-align: center;"></div><span class="Apple-style-span" style="font-family: 'Trebuchet MS', sans-serif;">The available workflows are those that have been registered with the JBPM engine. The <a href="http://wiki.alfresco.com/wiki/WorkflowSample_Lifecycle">Alfresco wiki</a> outlines the steps for adding a new custom workflow. Once added, the new workflow automatically becomes available in this dropdown. <a href="http://keytocontent.blogspot.com/2010/02/advanced-workflow-in-alfresco-share.html">Prior to release 3.4</a> in Share, the workflow items that could be assigned in Share were hardcoded. </span><br />
<span class="Apple-style-span" style="font-family: 'Trebuchet MS', sans-serif;"><br />
</span><br />
<span class="Apple-style-span" style="font-family: 'Trebuchet MS', sans-serif;">In the screenshot above we can see the new "Custom Lifecycle Review" workflow added using the code from the Alfresco wiki.</span><br />
<span class="Apple-style-span" style="font-family: 'Trebuchet MS', sans-serif;"><br />
</span><br />
<div style="margin: 0 0 .75em; padding-left: 4em;"><span class="Apple-style-span" style="font-family: 'Trebuchet MS', sans-serif;"><span class="Apple-style-span" style="background-color: #f3f3f3;">As an aside: The server-side Javascript file </span></span><span class="Apple-style-span" style="font-family: 'Trebuchet MS', sans-serif;"><i><span class="Apple-style-span" style="background-color: #f3f3f3;">tomcat\webapps\share\WEB-INF\classes\site-webscripts\org\alfresco\components\workflow\workflow.lib.js</span></i></span><span class="Apple-style-span" style="font-family: 'Trebuchet MS', sans-serif;"><span class="Apple-style-span" style="background-color: #f3f3f3;"> that contains the code used on this page to query out the available workflows (getWorkflowDefinitions).</span></span><br />
<span class="Apple-style-span" style="font-family: 'Trebuchet MS', sans-serif;"><span class="Apple-style-span" style="background-color: #f3f3f3;"><br />
</span></span><br />
<span class="Apple-style-span" style="font-family: 'Trebuchet MS', sans-serif;"><span class="Apple-style-span" style="background-color: #f3f3f3;">The list of scripts displayed are determined for the dropdown menu from the webscript:</span></span><br />
<span class="Apple-style-span" style="font-family: 'Trebuchet MS', sans-serif;"><a href="http://localhost:8080/alfresco/service/api/workflow-definitions"><span class="Apple-style-span" style="background-color: #f3f3f3;">http://localhost:8080/alfresco/service/api/workflow-definitions</span></a></span><br />
<span class="Apple-style-span" style="font-family: 'Trebuchet MS', sans-serif;"><span class="Apple-style-span"><span class="Apple-style-span" style="background-color: #f3f3f3;">Workflows can be filtered out from this list, for example, if you don't want to see WCM workflows. These workflows are identified by the </span><hidden-workflows><span class="Apple-style-span" style="background-color: #f3f3f3;"> tag </span><span class="Apple-style-span" style="font-family: monospace; white-space: pre;"><span class="Apple-style-span" style="background-color: #f3f3f3;"><</span></span></hidden-workflows></span></span><span class="Apple-style-span" style="font-family: 'Trebuchet MS', sans-serif;"><span class="Apple-style-span" style="background-color: #f3f3f3;">hidden-workflows<span class="Apple-style-span" style="font-family: monospace; white-space: pre;">></span></span></span><span class="Apple-style-span" style="font-family: 'Trebuchet MS', sans-serif;"><span class="Apple-style-span" style="background-color: #f3f3f3;"> <hidden-workflows>in the <i>tomcat\webapps\share\WEB-INF\classes\alfresco\share-config.xml</i> file, and also in the <i>wcmquickstart-share-config.xml </i>file in that same directory.</hidden-workflows></span></span><br />
<span class="Apple-style-span" style="font-family: 'Trebuchet MS', sans-serif;"><br />
</span></div><span class="Apple-style-span" style="font-family: 'Trebuchet MS', sans-serif;"><span class="Apple-style-span"><span class="Apple-style-span" style="font-size: x-large;"><b>Form for Starting and Assigning a Workflow</b></span></span></span><br />
<span class="Apple-style-span" style="font-family: 'Trebuchet MS', sans-serif;"><span class="Apple-style-span"><br />
</span></span><br />
<span class="Apple-style-span" style="font-family: 'Trebuchet MS', sans-serif;"><span class="Apple-style-span">After you select one of the workflows in the list, the form to enter the parameters that define the workflow is displayed. I didn't expect to see too much when I selected the new Custom Lifecycle workflow since I had not defined a form for it, but it wasn't too bad. The layout wasn't great, but everything seemed to work OK, and assigning the workflow worked too.</span></span><br />
<span class="Apple-style-span" style="font-family: 'Trebuchet MS', sans-serif;"><span class="Apple-style-span"><br />
</span></span><br />
<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg5VoPyIjVvKl2Fe8cCe2X5x9LaYbkysgcLGbBBMRBHaDKPYqMXxcouxm0c3iBuee4O712TSMLa7eSsfyflZDKH4meK_nE3P0OEne9iTHrK1_wCqCm9Jpy4U_-N6TdaeL72GeoJeG4vlTQ2/s1600/zoho2.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="400" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg5VoPyIjVvKl2Fe8cCe2X5x9LaYbkysgcLGbBBMRBHaDKPYqMXxcouxm0c3iBuee4O712TSMLa7eSsfyflZDKH4meK_nE3P0OEne9iTHrK1_wCqCm9Jpy4U_-N6TdaeL72GeoJeG4vlTQ2/s400/zoho2.png" width="375" /></a></div><div class="separator" style="clear: both; text-align: left;">We can customize the look of this form easily. For example, by adding the following code to the <i>tomcat\shared\classes\alfresco\web-extensions\share-config-custom.xml</i> file, the layout can be changed. (The file <i>tomcat\shared\classes\alfresco\web-extension\share-config-custom.xml</i> defined where form definitions and overrides can be placed.)</div><div class="separator" style="clear: both; text-align: left;"><br />
</div><div class="separator" style="clear: both; text-align: left;">The important thing here is to match the name of the workflow correctly in the condition for identifying the form that will be matched to it, like <span class="Apple-style-span" style="font-family: monospace; white-space: pre;"><b>condition="jbpm$wfl:lifecycleapproval"</b> in the example below.</span></div><br />
<pre class="brush:xml"><config condition="jbpm$wfl:lifecycleapproval" evaluator="string-compare">
<forms>
<form>
<field-visibility>
<show id="bpm:workflowDescription">
<show id="bpm:workflowDueDate">
<show id="bpm:workflowPriority">
<show id="bpm:assignee">
<show id="packageItems">
</show></show></show></show></show></field-visibility>
<appearance>
<set appearance="title" id="" label-id="workflow.set.general">
<set appearance="" id="info" template="/org/alfresco/components/form/2-column-set.ftl">
<set appearance="title" id="assignee" label-id="workflow.set.assignee">
<set appearance="title" id="items" label-id="workflow.set.items">
<field id="bpm:workflowDescription" label-id="workflow.field.message">
<control template="/org/alfresco/components/form/controls/textarea.ftl">
<control-param name="style">width: 95%</control-param>
</control>
</field>
<field id="bpm:workflowDueDate" label-id="workflow.field.due" set="info">
<field id="bpm:workflowPriority" label-id="workflow.field.priority" set="info">
<control template="/org/alfresco/components/form/controls/workflow/priority.ftl">
</control></field>
<field id="bpm:assignee" label-id="workflow.field.reviewer" set="assignee">
<field id="packageItems" set="items">
</field></field></field></set></set></set></set></appearance>
</form>
</forms>
</config>
</pre><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjto03_03vFAUHZr5FYnIpfBYR0W1thvRnOW6sfJ67R8aoyfJni5IBfK9KfKHaJ5z8RKrTk1Jm6QwMuCbiJbX832lok3S9G2arGYQL3x3zU7fB-GmVqJQcqgmgF95j9iYGMBvWG0n2C6Asw/s1600/zoho2.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="290" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjto03_03vFAUHZr5FYnIpfBYR0W1thvRnOW6sfJ67R8aoyfJni5IBfK9KfKHaJ5z8RKrTk1Jm6QwMuCbiJbX832lok3S9G2arGYQL3x3zU7fB-GmVqJQcqgmgF95j9iYGMBvWG0n2C6Asw/s400/zoho2.png" width="400" /></a></div><br />
<span class="Apple-style-span" style="font-family: 'Trebuchet MS', sans-serif;"><b><span class="Apple-style-span" style="font-size: x-large;">User Task and Started Workflow Lists</span></b></span><br />
<span class="Apple-style-span" style="font-family: 'Trebuchet MS', sans-serif;"><br />
</span><br />
<span class="Apple-style-span" style="font-family: 'Trebuchet MS', sans-serif;">The uppermost Share navigation toolbar has been redesigned. A "More" button is available which now includes links to user areas like "My Profile", "My Sites", and "My Content". Links to two pages that are new to the 3.4 release are also included in this dropdown list: "My Tasks" and "Workflows I've Started". We'll talk about these two new features in just a bit.</span><br />
<span class="Apple-style-span" style="font-family: 'Trebuchet MS', sans-serif;"><br />
</span><br />
<span class="Apple-style-span" style="font-family: 'Trebuchet MS', sans-serif;">Also included in this dropdown list are links to administrative functions like "Application" settings, "Groups", "Users", and another new-for-3.4 capability, "Replication Jobs". These are grouped together in the menu in a category called "Tools". I think that I would prefer that these administrative tasks be broken out into their own menu, but this layout is still workable given the current set of features in Share.</span><br />
<br />
<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhDgz_B2N4mK_dF__gqOkF4EM3gf_mbT29ExHVehbM05XA9RXjMD9xzE3khMoypCNKlp_kTCxH3qpUbV4oSx-BDa6e6G1LC2hnELDMinOHi0t7-PigbbAXjDnJ4iRhagUs45zfWVd2dNrkn/s1600/zoho2.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="295" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhDgz_B2N4mK_dF__gqOkF4EM3gf_mbT29ExHVehbM05XA9RXjMD9xzE3khMoypCNKlp_kTCxH3qpUbV4oSx-BDa6e6G1LC2hnELDMinOHi0t7-PigbbAXjDnJ4iRhagUs45zfWVd2dNrkn/s400/zoho2.png" width="400" /></a></div><div class="separator" style="clear: both; text-align: left;"><span class="Apple-style-span" style="font-family: 'Trebuchet MS', sans-serif;"><br />
</span></div><div class="separator" style="clear: both; text-align: left;"><span class="Apple-style-span" style="font-family: 'Trebuchet MS', sans-serif;">The "My Tasks" page presents a nice summary of the outstanding tasks for the user. Filters along the left let you quickly zoom in on a specific set of tasks if there are many in your list.</span></div><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjRsdoTD8WiRQIQh0iuN9-4Xm0WycO8owCUVm0Z_cJ-0W35qNQ2QFW8lTVDUyVqvOfTLgH3IUT8XyQJmDQ_yBf2LkuDD-itPZnKm_jsKQzgy0sBslS9DtHvLRtM6QQJmvNG3zt1F-gQDRFL/s1600/zoho2.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="220" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjRsdoTD8WiRQIQh0iuN9-4Xm0WycO8owCUVm0Z_cJ-0W35qNQ2QFW8lTVDUyVqvOfTLgH3IUT8XyQJmDQ_yBf2LkuDD-itPZnKm_jsKQzgy0sBslS9DtHvLRtM6QQJmvNG3zt1F-gQDRFL/s400/zoho2.png" width="400" /></a></div><div class="separator" style="clear: both; text-align: left;"><span class="Apple-style-span" style="font-family: 'Trebuchet MS', sans-serif;"><br />
</span></div><div class="separator" style="clear: both; text-align: left;"><span class="Apple-style-span" style="font-family: 'Trebuchet MS', sans-serif;">A similar page exists for the user to see the workflows that they've started. Unfortunately though, once the 'Task Complete' task is done it is removed from the list. It would be nice to be able to review the workflows that have completed.</span></div><div class="separator" style="clear: both; text-align: left;"><span class="Apple-style-span" style="font-family: 'Trebuchet MS', sans-serif;"><br />
</span></div><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhRK5Ky3UbmK_GGjm5DpeCs6CrTaY2F9mTUyZ0bpCCjdGvB8INpmh9oiKiCMeYb9gbHIJ3q3ywGcMpbc7GglQeT46UtRnjp3l7Mt-yKfWZus8beEDesk5jSQ-MOg6N3EFGuwbr095Zq57gy/s1600/zoho2.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="275" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhRK5Ky3UbmK_GGjm5DpeCs6CrTaY2F9mTUyZ0bpCCjdGvB8INpmh9oiKiCMeYb9gbHIJ3q3ywGcMpbc7GglQeT46UtRnjp3l7Mt-yKfWZus8beEDesk5jSQ-MOg6N3EFGuwbr095Zq57gy/s400/zoho2.png" width="400" /></a></div><div class="separator" style="clear: both; text-align: left;"><span class="Apple-style-span" style="font-family: 'Trebuchet MS', sans-serif;"><br />
</span></div><div class="separator" style="clear: both; text-align: left;"><span class="Apple-style-span" style="font-family: 'Trebuchet MS', sans-serif;"><br />
</span></div><div class="separator" style="clear: both; text-align: left;"><br />
</div>Dick Weisingerhttp://www.blogger.com/profile/06275286068863587252noreply@blogger.com6tag:blogger.com,1999:blog-1622089077919681757.post-17675805176628929802010-07-11T19:14:00.000-07:002010-07-11T19:16:58.133-07:00Inbound Emails with Windows localhost<div class="separator" style="clear: both; text-align: center;"></div>In <a bitly="BITLY_PROCESSED" href="http://keytocontent.blogspot.com/2010/05/upload-files-to-alfresco-via-email.html">May I wrote a brief post</a> that showed how you can post emails to the Alfresco server for automatic capture and upload into a specified Folder. It's a great way to upload email content into Alfresco without having to bring up the Alfresco client interface. This is powerful feature that I really like.<br />
<br />
A few useful scenarios come to mind with this functionality:<br />
<ol><li>You can compose a new email with information and add attachments that you send to an Alfresco folder. You don't need to bring up the client and navigate to the correct folder/space.</li>
<li>You receive an email containing important information or attachments and you simply forward the email to the Alfresco folder.</li>
<li>You can just add the target Alfresco folder alias as a cc and capture into Alfresco important emails messages when you send them. This is a very simple way to capture emails and requires very little overhead time for interacting with the repository.</li>
</ol><div>So I wanted to be able to easily demonstrate this functionality. My previous post showed how you can setup inbound email on a server exposed on the internet. In that case I had Alfresco installed on an Amazon EC2 server. But I wanted to also be able to show this functionality working just on an isolated installation of Alfresco on my laptop.</div><div><br />
</div><div>It's easy to setup and here are some steps in the variation of what I described <a bitly="BITLY_PROCESSED" href="http://keytocontent.blogspot.com/2010/05/upload-files-to-alfresco-via-email.html">previously</a>. With these changes I set up Outlook Express on my Windows machine to be able to send inbound emails to the Alfresco server installed on the same machine.<br />
<br />
<b>Step 1</b> <b>Enable the Alfresco email server to run on port 25.</b> See step 1 of the <a bitly="BITLY_PROCESSED" href="http://keytocontent.blogspot.com/2010/05/upload-files-to-alfresco-via-email.html">previous post</a>.</div><div><br />
</div><div><b>Step 2</b> <b>Add localhost.com to the Windows hosts file.</b><br />
c:\windows\system32\drivers\etc\hosts<br />
<br />
</div><div><pre class="xml:brush"></pre>127.0.0.1 localhost<br />
127.0.0.1 localhost.com</div><div><br />
</div><b>Step 3 Configure Outlook Express (or other email client)</b><br />
<div class="separator" style="clear: both; text-align: center;"><a bitly="BITLY_PROCESSED" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhHpSVWW3fxo_QcEAjSXi59JKJd0CUW6U4J4muFxiArJKpqt3qbygAFYLMYwyG64i5KlFjxcrIP2o3ZX7mml8loJ4sF6D0spwMSw8MAgBJxWnm3kLcAn3nbHbe6ZuEoQd-tgRggM-x8moxL/s1600/outlookexpress.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="228" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhHpSVWW3fxo_QcEAjSXi59JKJd0CUW6U4J4muFxiArJKpqt3qbygAFYLMYwyG64i5KlFjxcrIP2o3ZX7mml8loJ4sF6D0spwMSw8MAgBJxWnm3kLcAn3nbHbe6ZuEoQd-tgRggM-x8moxL/s400/outlookexpress.jpg" width="400" /></a></div><br />
From the Tools menu, select Accounts...<br />
<div class="separator" style="clear: both; text-align: center;"><a bitly="BITLY_PROCESSED" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj2psj1MuZHUxmXyYueTVd8C65si7BJuTyb8YJ3kniSHWX9EJJdPadOJw7CXR5QQuP2Vk43DjSDyf_JOSKbTE4JGjiOzAP7-UTeNjQSD0Xam0znFLtxPvDsXeMpzObMvnvAA_Y48dGgf_LD/s1600/outlookexpress2.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="205" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj2psj1MuZHUxmXyYueTVd8C65si7BJuTyb8YJ3kniSHWX9EJJdPadOJw7CXR5QQuP2Vk43DjSDyf_JOSKbTE4JGjiOzAP7-UTeNjQSD0Xam0znFLtxPvDsXeMpzObMvnvAA_Y48dGgf_LD/s400/outlookexpress2.jpg" width="400" /></a></div><div class="separator" style="clear: both; text-align: left;">Select the option to add a new Mail account.</div><div class="separator" style="clear: both; text-align: left;"><br />
</div><a bitly="BITLY_PROCESSED" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiyW6-Htg-0yU75eknXmiTe_XapCDvjyQnEu8pGrf1lsgt8ZJB_Bs-DLhNrVefuLpCjciGOubSm8-LSvungq3BPuwsG18J_0aGF-woeW36n7RUGeSVXpZBX_w7OW7kCV5sbE1XUkORpsF45/s1600/outlook3.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="331" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiyW6-Htg-0yU75eknXmiTe_XapCDvjyQnEu8pGrf1lsgt8ZJB_Bs-DLhNrVefuLpCjciGOubSm8-LSvungq3BPuwsG18J_0aGF-woeW36n7RUGeSVXpZBX_w7OW7kCV5sbE1XUkORpsF45/s400/outlook3.jpg" width="400" /></a><br />
<div class="separator" style="clear: both; text-align: left;">Add the Display Name to use and click Next.</div><div class="separator" style="clear: both; text-align: left;"><br />
</div><a bitly="BITLY_PROCESSED" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj_YB10x2213fseall9gg9vDwpsDGqXrKvOXi-cDnvAe-X8N7ck-O8N4zewrQV3A_fEtPEkMwHywnHVkVXDG6EMq6uC_SytaP2LiZgbx2bMXdN8i6HmoOQCk1z8IBGqGjEgzqMaChk5H-Z5/s1600/outlookexpress4.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj_YB10x2213fseall9gg9vDwpsDGqXrKvOXi-cDnvAe-X8N7ck-O8N4zewrQV3A_fEtPEkMwHywnHVkVXDG6EMq6uC_SytaP2LiZgbx2bMXdN8i6HmoOQCk1z8IBGqGjEgzqMaChk5H-Z5/s320/outlookexpress4.jpg" /></a><br />
Add the email address. This address needs to match the email address assigned to an Alfresco user. In this case, I plan to use this while demonstrating as user admin, so I add the email address admin@localhost.com.<br />
<div class="separator" style="clear: both; text-align: center;"><br />
</div><a bitly="BITLY_PROCESSED" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh1Z2J6F9EqKy8_8TyBrzd1wYZIQI7JqRrSTp4jcMjhce7nlc8LbPT3Fo6dxDGd5SPouDZL7wmz4-I2VY5o2bVJwvRJM2s_oleeIkEZLGhiaY0j95-huVp5uHlBMbD9lHd4fi4COi7LOFru/s1600/outlookexpress5.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="330" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh1Z2J6F9EqKy8_8TyBrzd1wYZIQI7JqRrSTp4jcMjhce7nlc8LbPT3Fo6dxDGd5SPouDZL7wmz4-I2VY5o2bVJwvRJM2s_oleeIkEZLGhiaY0j95-huVp5uHlBMbD9lHd4fi4COi7LOFru/s400/outlookexpress5.jpg" width="400" /></a><br />
<div class="separator" style="clear: both; text-align: left;">Then configure the Outgoing mail SMTP server to be 127.0.0.1.</div><div class="separator" style="clear: both; text-align: left;"><br />
</div><a bitly="BITLY_PROCESSED" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg4pGgYBx4RDl0wpBQCeoW6VDlyimnV6u_H2LzPYUpNVDl4_d7BlUKowQJNH0vdw6udVzMS7DxoekpltLK9u9c4DxZ15YicGkN2R8BKrVVyQcWM8JgW320gLYN1BeoL23DfT8JsbHmvIN6P/s1600/outlookexpress6.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="331" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg4pGgYBx4RDl0wpBQCeoW6VDlyimnV6u_H2LzPYUpNVDl4_d7BlUKowQJNH0vdw6udVzMS7DxoekpltLK9u9c4DxZ15YicGkN2R8BKrVVyQcWM8JgW320gLYN1BeoL23DfT8JsbHmvIN6P/s400/outlookexpress6.jpg" width="400" /></a><br />
<div class="separator" style="clear: both; text-align: left;">Finally, enter the user name and the password for this account (admin and admin).</div><div class="separator" style="clear: both; text-align: left;">And then Finish the wizard.</div><div class="separator" style="clear: both; text-align: left;"><br />
</div><div class="separator" style="clear: both; text-align: left;"><b>Step 4</b> <b>Setup user admin within Alfresco Share</b></div><div class="separator" style="clear: both; text-align: left;"><br />
</div><a bitly="BITLY_PROCESSED" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjJe0DMF75N4y0rQhWH2bVcn7xZDq-fs2WZuHhngXlMLF0RYyBqTA_mIm4_1Cq-mXwq4b4XVQdlWNYHxjIOrvDUg9QHAlnIkOrpKvuDASGRiHEgOBwvQfoiNSxLhk0QXptQ-2pcVXESR8Yk/s1600/shareuser.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjJe0DMF75N4y0rQhWH2bVcn7xZDq-fs2WZuHhngXlMLF0RYyBqTA_mIm4_1Cq-mXwq4b4XVQdlWNYHxjIOrvDUg9QHAlnIkOrpKvuDASGRiHEgOBwvQfoiNSxLhk0QXptQ-2pcVXESR8Yk/s320/shareuser.jpg" /></a><br />
<div class="separator" style="clear: both; text-align: left;"><br />
</div><div class="separator" style="clear: both; text-align: left;"><br />
</div>The email address for user admin is set to admin@localhost.com -- which matches what was entered into the Outlook Express configuration.<br />
<br />
<div class="separator" style="clear: both; text-align: center;"><a bitly="BITLY_PROCESSED" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi-lokH17bV1WjkfLqSyCRKbqfzJUh7ADFSD5YBoSrrjTcxgRwz2eVn9l7jOo0kyNmFJffidiMx_Xmbx2qZ0hG7jeDUV_Fzq0X1SeN6unMWHIBvdZHdv2qSPSFYM8dxWpTCRoFuViyjKM36/s1600/share2.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="191" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi-lokH17bV1WjkfLqSyCRKbqfzJUh7ADFSD5YBoSrrjTcxgRwz2eVn9l7jOo0kyNmFJffidiMx_Xmbx2qZ0hG7jeDUV_Fzq0X1SeN6unMWHIBvdZHdv2qSPSFYM8dxWpTCRoFuViyjKM36/s400/share2.jpg" width="400" /></a></div><div class="separator" style="clear: both; text-align: left;">And the user (admin) as added to the EMAIL_CONTRIBUTORS group.</div><br />
<b>Step 5</b> <b> Set up an email alias folder name within Share.</b><br />
<br />
<div class="separator" style="clear: both; text-align: center;"><a bitly="BITLY_PROCESSED" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjRKvBAB0zxayYNfcoWeb2S2fgs7sSCCL61aLbvGj0YbivLMkjYg26gA3eChtPRUqGorBbvCKCXAbMuzbp3ixM_7jc2LkxGLDB0i0Y26L43mj98aOfNUhePgHUmPEIUQ3RvB2PmOUNvT_i4/s1600/share3.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="192" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjRKvBAB0zxayYNfcoWeb2S2fgs7sSCCL61aLbvGj0YbivLMkjYg26gA3eChtPRUqGorBbvCKCXAbMuzbp3ixM_7jc2LkxGLDB0i0Y26L43mj98aOfNUhePgHUmPEIUQ3RvB2PmOUNvT_i4/s400/share3.jpg" width="400" /></a></div><div class="separator" style="clear: both; text-align: left;">Create and/or navigate to the target email folder within share. In this case I have a folder named MailFolder within a Share Site documentLibrary area. Add the Aliasable (Email) aspect to the folder. Doing that will add a new metadata field that holds the name of the folder alias.</div><div class="separator" style="clear: both; text-align: left;">Everything is cool up until this point. Unfortunately the email alias name field is not exposed from the Share interface. You'll need to bring up the Alfresco JSF explorer client and navigate to the same space that you just created (or do all of this step in the Explorer client). There you can enter the alias name for the folder. In this case we call it 'mailfolder'. Note that the alias name you choose is case sensitive.</div><div class="separator" style="clear: both; text-align: center;"><a bitly="BITLY_PROCESSED" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhfS4FNy8wZYPb0dKlwSOHSnFblZTZFQTAz2iYk2LRdax5BueLJUfpdqXbAbaRrOxd2eHfchF4z_HEnB_rLXqb3FDXYPo3sCiZHFp5OexvlYN8MPQcJQ6JdnuIC_k604STvfEVxaH1A3bbr/s1600/share4.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="142" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhfS4FNy8wZYPb0dKlwSOHSnFblZTZFQTAz2iYk2LRdax5BueLJUfpdqXbAbaRrOxd2eHfchF4z_HEnB_rLXqb3FDXYPo3sCiZHFp5OexvlYN8MPQcJQ6JdnuIC_k604STvfEVxaH1A3bbr/s400/share4.jpg" width="400" /></a></div><div class="separator" style="clear: both; text-align: center;"><br />
</div><b>Step 6 Send a Test Email</b><br />
<b><br />
</b><br />
<div class="separator" style="clear: both; text-align: center;"><a bitly="BITLY_PROCESSED" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg_QEIGiZLql4fXT3L6e-3xf57qhMtKbxd-mPQdCo0yc2BC7Rmon5tQ0npO1ySsY8cxvu5yGU5XcpnUmYUaI7DUKKn-TTNshSFhixqB4X8EL9-xLSXm_P1GKYZVgVaZjuF8fwyV3X4m7qfO/s1600/share5.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="383" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg_QEIGiZLql4fXT3L6e-3xf57qhMtKbxd-mPQdCo0yc2BC7Rmon5tQ0npO1ySsY8cxvu5yGU5XcpnUmYUaI7DUKKn-TTNshSFhixqB4X8EL9-xLSXm_P1GKYZVgVaZjuF8fwyV3X4m7qfO/s400/share5.jpg" width="400" /></a></div><div class="separator" style="clear: both; text-align: left;">Next to test it, we send an email to mailfolder, the alias name in Alfresco that we just set up. If we now navigate into the target Share site folder, we can see the document that was just sent.</div><div class="separator" style="clear: both; text-align: left;"><br />
</div><div class="separator" style="clear: both; text-align: left;"><br />
</div><a bitly="BITLY_PROCESSED" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjBWapOTr2M1g7LabCe5SOIPhdGZcxEVS6fke_nqCcePmU1ETE5PCdY5qk_gDnszMHcWCFVsQuczEBuJuzu53mOWfnXIGQVkIcXjYAAh7vJOh83UFK0syAKPGExtQn2AZeblVfmsuFsyZRD/s1600/share6.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="167" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjBWapOTr2M1g7LabCe5SOIPhdGZcxEVS6fke_nqCcePmU1ETE5PCdY5qk_gDnszMHcWCFVsQuczEBuJuzu53mOWfnXIGQVkIcXjYAAh7vJOh83UFK0syAKPGExtQn2AZeblVfmsuFsyZRD/s400/share6.jpg" width="400" /></a><br />
<b><br />
</b>Dick Weisingerhttp://www.blogger.com/profile/06275286068863587252noreply@blogger.com0tag:blogger.com,1999:blog-1622089077919681757.post-67032536016817779212010-07-07T16:21:00.000-07:002010-07-07T16:21:42.182-07:00Formtek Hosts Alfresco Lunch and Learn in JulyFormtek is hosting an Alfresco Software Lunch & Learn session in our Concord, California (near Oakland) office at 11:30 AM on July 28 to demonstrate how businesses like yours are benefiting from the leading open source enterprise content management (ECM) software solution.<br />
<br />
Join us for lunch and sit back and relax while you hear how Alfresco is reducing ECM costs by over 95% compared to proprietary systems like Documentum, Open Text and SharePoint. Alfresco will review in depth how companies are seeing a huge return on their investment with Alfresco's document management, web content management and records management solutions. You will also have the opportunity to view a product demonstration provided by Formtek's Chief Technologist, Dick Weisinger.<br />
<br />
This free lunch and learn is an opportunity for you to talk to the Alfresco and Formtek experts and hear first hand about the low cost, simple to use ECM software that thousands of companies are relying on, and saving money with, everyday.<br />
<br />
<a bitly="BITLY_PROCESSED" href="http://www.alfresco.com/about/events/2010/07/lunch-learns-july-2010/">Click here to register for the July 28 event in Concord.</a>Dick Weisingerhttp://www.blogger.com/profile/06275286068863587252noreply@blogger.com0tag:blogger.com,1999:blog-1622089077919681757.post-76116096924552924562010-06-09T16:12:00.000-07:002010-06-11T10:25:47.574-07:00Adding new Configurations in the Alfresco Share Admin ConsoleAlfresco Enterprise 3.3 is out now. A release called 3.3FCS (First Customer Ship) is available for download now, and another version, and rumor that a 3.3G (community version. G for Google docs) should become available next week. The Alfresco product feels more stable and complete with every release. The 3.3 version comes with a lot of new features. One of those new features is the ability to change the theme of Alfresco directly from the Administration Console. (You're not able to define the theme via the UI, but you can select from a set of pre-defined themes and then apply them to immediately see their effects.)<br />
<br />
The default configuration area available in the Admin Console are Groups, Users, and now with the 3.3 release, the Application (which currently only includes the theme).<br />
<br />
<div class="separator" style="clear: both; text-align: center;"></div><div class="separator" style="clear: both; text-align: center;"><a bitly="BITLY_PROCESSED" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj978Jdms08AQX3zJE4IF9ndPezYPp51S8lprYquBtewdTQiC6dC7xzyvgSJHEgzEpDZuzDkLU4yjTgUkfGvX7s_h6ApcAxkbpMsGiAyQkVhyphenhyphenvven_5hk4C8p6rqqSN98Po52rN9JmPRrIk/s1600/Alfresco33ThemeAdmin.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="132" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj978Jdms08AQX3zJE4IF9ndPezYPp51S8lprYquBtewdTQiC6dC7xzyvgSJHEgzEpDZuzDkLU4yjTgUkfGvX7s_h6ApcAxkbpMsGiAyQkVhyphenhyphenvven_5hk4C8p6rqqSN98Po52rN9JmPRrIk/s400/Alfresco33ThemeAdmin.png" width="400" /></a></div><div class="separator" style="clear: both; text-align: left;"><br />
</div><div class="separator" style="clear: both; text-align: left;">From the image above you can see the five out-of-the-box themes that come standard with Alfresco 3.3. And the image below shows you the rainbow of effects that you can get by applying these themes.</div><div class="separator" style="clear: both; text-align: left;"><br />
</div><a bitly="BITLY_PROCESSED" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjaPHdcYFTP4y5Q8w0hfayhVG46PLzBKR8weYCNx4otyQp_TNEu9xYLByo1xT_z7NqDlVVy9Jb1Ys2koAgC-otH-n2Qb_pdUJ2Sr6x06ktZQVh13NJANwHvuvN-nN8mwoTHG8n6s7ay0fgQ/s1600/AlfrescoThemes.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="400" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjaPHdcYFTP4y5Q8w0hfayhVG46PLzBKR8weYCNx4otyQp_TNEu9xYLByo1xT_z7NqDlVVy9Jb1Ys2koAgC-otH-n2Qb_pdUJ2Sr6x06ktZQVh13NJANwHvuvN-nN8mwoTHG8n6s7ay0fgQ/s400/AlfrescoThemes.png" width="342" /></a><br />
<div class="separator" style="clear: both; text-align: left;">Maybe not too exciting, but one interesting thing about the addition of Themes to the Admin Console is that it serves as a fairly simple example of how the Administration Console was designed to be extensible, so that new components that require administration could be added to the Console.</div><div class="separator" style="clear: both; text-align: left;"><br />
</div><div class="separator" style="clear: both; text-align: left;">Surprisingly not that much new code is needed for the addition of themes into the Admin Console. Let's look at some of the files involved in the rest of this posting.</div><div class="separator" style="clear: both; text-align: left;"><br />
</div>The files that define the themes can be found at this location:<br />
<div class="separator" style="clear: both; text-align: center;"><a bitly="BITLY_PROCESSED" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiO_UFtiRvxmqWbuxUr6rynADaMKLxdQ8d16bRL6cT9mhII1lqfVorejLCzZ1_Vkf5u3ARhkPtiph916jLj-TIncgT2SjSYhyphenhyphenN70MTwlCjNHc2u5c3KE8UMDcsbZRsOfYdk-YSa_w-bawNY/s1600/ThemeFiles.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="400" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiO_UFtiRvxmqWbuxUr6rynADaMKLxdQ8d16bRL6cT9mhII1lqfVorejLCzZ1_Vkf5u3ARhkPtiph916jLj-TIncgT2SjSYhyphenhyphenN70MTwlCjNHc2u5c3KE8UMDcsbZRsOfYdk-YSa_w-bawNY/s400/ThemeFiles.png" width="186" /></a></div><div class="separator" style="clear: both; text-align: left;">We're not creating a new theme in this blog, but if you plan to make a custom new one, note that you should start by cloning the files from a theme other than the default one. The default theme has access to assets that the other themes have local copies of.</div><br />
<b>webapps\share\WEB-INF\classes\alfresco\messages\slingshot.properties</b><br />
This file contains the labels used in the left-side navigation area of the Administration Console. We can see the definition for the label and description of the 'Application' Console configuration (along with similar definitions for users and groups).<br />
<pre class="brush:xml">## Admin console tools
tool.users.label=Users
tool.users.description=User Management
tool.groups.label=Groups
tool.groups.description=Group Management
tool.application.label=Application
tool.application.description=Application Settings and Management
</pre><br />
<b>webapps\share\WEB-INF\classes\alfresco\site-data\themes\default.xml<br />
webapps\share\WEB-INF\classes\alfresco\site-data\themes\greenTheme.xml<br />
webapps\share\WEB-INF\classes\alfresco\site-data\themes\gdocs.xml<br />
webapps\share\WEB-INF\classes\alfresco\site-data\themes\yellowTheme.xml<br />
webapps\share\WEB-INF\classes\alfresco\site-data\themes\hcBlack.xml</b><br />
These files contain title and description data for each of the themes like this (from default.xml):<br />
<pre class="brush:xml"><?xml version='1.0' encoding='UTF-8'?>
<theme>
<title>Default Blue Theme</title>
<title-id>theme.default</title-id>
</theme>
</pre><br />
<b><span class="Apple-style-span" style="font-size: x-large;">Files to Render the Admin Console Theme Selector<br />
</span></b><br />
<b>application.get.desc.xml</b><br />
<pre class="brush:xml"><webscript>
<shortname>Admin Console Application Tool</shortname>
<description>Administration Console - Application Settings Tool</description>
<url>/components/console/application</url>
<family>admin-console</family>
</webscript>
</pre><br />
<b>application.get.head.ftl</b><br />
<pre class="brush:xml"><#include "../component.head.inc">
<!-- Admin Console Application Tool -->
<@link rel="stylesheet" type="text/css" href="${page.url.context}/components/console/application.css" />
<@script type="text/javascript" src="${page.url.context}/components/console/consoletool.js"></@script>
<@script type="text/javascript" src="${page.url.context}/components/console/application.js"></@script>
</pre><br />
These files are included in application.get.head.ftl:<br />
<div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"></div><div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"><b>webapps\share\components\console\</b><b>application.css</b></div><div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"><b><span class="Apple-style-span" style="font-weight: normal;"><b>webapps\share\components\console\</b></span>application.js</b></div><b><span class="Apple-style-span" style="font-weight: normal;"><br />
</span></b><br />
<b>application.get.html.ftl</b><br />
This file provides the actual layout markup for the Application Configuration in the Admin Console.<br />
<pre class="brush:xml"><!--[if IE]>
<iframe id="yui-history-iframe" src="${url.context}/yui/assets/blank.html"></iframe>
<![endif]-->
<input id="yui-history-field" type="hidden" />
<script type="text/javascript">//<![CDATA[
new Alfresco.ConsoleApplication("${args.htmlid}").setMessages(${messages});
//]]></script>
<#assign el=args.htmlid>
<div id="${el}-body" class="application">
<!-- Options panel -->
<div id="${el}-options" class="hidden">
<form id="${el}-options-form" action="${url.context}/service/components/console/application" method="post">
<div class="title">${msg("label.options")}</div>
<div class="row">
<span class="label">${msg("label.theme")}:</span>
<div class="flat-button">
<select id="console-options-theme-menu">
<#list themes as t>
<option value="${t.id}"<#if t.selected> selected="selected"</#if>>${t.title?html}</option>
</#list>
</select>
</div>
</div>
<div class="buttons">
<button id="${el}-apply-button" name="apply">${msg("button.apply")}</button>
</div>
</form>
</div>
</div>
</pre><br />
<b>application.get.js</b><br />
This small server side javascript file makes use of the Surf/Share <i>sitedata</i> root object that is described <a bitly="BITLY_PROCESSED" href="http://wiki.alfresco.com/wiki/Surf_Platform_-_Freemarker_Template_and_JavaScript_API#sitedata">here</a> to find the available themes. The code here finds the available themes and collects and stores them into the model for later display.<br />
<pre class="brush:xml">function main()
{
model.themes = [];
// retrieve the available theme objects
var themes = sitedata.getObjects("theme");
for (var i=0, t; i<themes.length; i++)
{
t = themes[i];
model.themes.push(
{
id: t.id,
title: t.title,
// current theme ID is in the default model for a script
selected: (t.id == theme)
});
}
}
main();
</pre><br />
<b>application.get.properties</b><br />
This file defines labels that appear on the Application configuration page.<br />
<pre class="brush:xml">label.options=Options
label.theme=Theme
button.apply=Apply
message.failure=Failed to apply selected options.
</pre><br />
<br />
<b><span class="Apple-style-span" style="font-size: x-large;">Files to Set the New Theme </span></b><br />
<br />
Once the "Apply button is selected, the new theme (and later potentially other Application data) data is posted back to the server.<br />
<br />
<b>application.post.desc.xml</b><br />
<pre class="brush:xml"><webscript>
<shortname>Admin Console Application Tool POST</shortname>
<description>Admin Console Application Tool POST form submission processing</description>
<format default="json" />
<url>/components/console/application</url>
</webscript>
</pre><br />
<b>application.post.json.ftl</b><br />
<pre class="brush:xml">{
"success": ${success?string},
"message": "<#if errormsg??>${errormsg}</#if>"
}
</pre><br />
<b>application.post.json.js</b><br />
This function marks the newly selected theme and sets it.<br />
<pre class="brush:xml">function main()
{
var themeId = json.get("console-options-theme-menu");
context.setThemeId(new String(themeId));
// persist across Share application if this is the admin user
if (user.isAdmin)
{
var sc = context.getSiteConfiguration();
sc.setProperty("theme", themeId);
sc.save();
}
model.success = true;
}
main();
</pre>Dick Weisingerhttp://www.blogger.com/profile/06275286068863587252noreply@blogger.com0tag:blogger.com,1999:blog-1622089077919681757.post-52448683362649271512010-05-18T16:06:00.000-07:002010-05-18T16:06:07.697-07:00Mounting Alfresco as an IMAP Mount Point in Outlook 2007A new feature from Alfresco version 3.2 is the ability to mount the repository within email clients that support <a href="http://wiki.alfresco.com/wiki/IMAP">IMAP</a>. I thought that I'd give it a try and I found that it is pretty easy to set up.<br />
<br />
I'll show here what I did to get it to work within Outlook 2007 running on a Windows development machine.<br />
<br />
Since I'm running on a development machine, I typically use localhost as the root location for my Alfresco URLs. When trying to set up the IMAP user account in Outlook it doesn't seem possible to be able to define the IMAP mount point source to be localhost. The Alfresco wiki pages for IMAP also recommend against using localhost. To get around that, I defined a dummy domain name in my local hosts file. On a production machine, just use the domain name for that machine.<br />
<br />
In c:\Windows\system32\drivers\etc\hosts I added the following line at the top, leaving the entry for localhost in tact in the file (my apologies to the owner of this domain name).<br />
<br />
127.0.0.1 xxxxxx.com<br />
127.0.0.1 localhost <br />
<br />
In the alfresco_globals.xml file, I uncommented two lines near the bottom of the file, one to enable IMAP and the other to set the server host name we just defined.:<br />
<br />
<pre class="brush:xml">#
# IMAP
#-------------
imap.server.enabled=true
#imap.server.port=143
imap.server.host=xxxxxx.com
</pre>After making that change, I recycled the Alfresco server.<br />
<br />
Next I brought up my Outlook 2007 client and went through the following screens of the wizard for adding a new account. Start at Tools -> Account Settings...<br />
<br />
1. Click on the Add button of the dialog to start the process for mounting the IMAP point in Alfresco. <br />
<br />
<br />
<div class="separator" style="clear: both; text-align: center;"></div><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEga7E9D6GDIttRITXO9EDuvFYpUiVGBy-J08oPQbIrYLX7ebh-nMl_hvflv2NsqJMm_Y2Rypva3xyHjbZdv7gCEbOSM81jPnL3Sm-35n9EFW4FJUAY-nPZwAZsr5QCao8QSE51qyMjalzBX/s1600/Outlook1.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="322" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEga7E9D6GDIttRITXO9EDuvFYpUiVGBy-J08oPQbIrYLX7ebh-nMl_hvflv2NsqJMm_Y2Rypva3xyHjbZdv7gCEbOSM81jPnL3Sm-35n9EFW4FJUAY-nPZwAZsr5QCao8QSE51qyMjalzBX/s400/Outlook1.png" width="400" /></a></div><div class="separator" style="clear: both; text-align: center;"></div>2. Select the default top option radio=button for adding a POP3, IMAP,...<br />
<br />
<div class="separator" style="clear: both; text-align: center;"></div><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjhrxopeEZYPdiz8Vy-gfIhiFg1jTSc4hk9O8Tk_3ylr-p5s2VMzTroanjUZOf83Z2SkARnz510pLBAFzbO17mSmINmAH_XGaOepv4SPA1RW3InlV6qbwXOBqaCbRi8vbPqjqDDDFcDb-M_/s1600/Outlook002.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="295" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjhrxopeEZYPdiz8Vy-gfIhiFg1jTSc4hk9O8Tk_3ylr-p5s2VMzTroanjUZOf83Z2SkARnz510pLBAFzbO17mSmINmAH_XGaOepv4SPA1RW3InlV6qbwXOBqaCbRi8vbPqjqDDDFcDb-M_/s400/Outlook002.png" width="400" /></a></div> 3. Select the option on the bottom of the dialog to "Manually configure..." and then click Next.<br />
<br />
<div class="separator" style="clear: both; text-align: center;"></div><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj1D3x-t1SFVdKXmkUj2m0emEtBKeI-ht29uuPW_fuJXIb7fvngXxjsg-2M9pJDt8NAVewAlAbWSZU8l6_f8A7Rr3fQS8HMe6T9M-zxy-yRoqmvWwLoyLyuxUV8DKqGXtlEd3dpjCxI-t3J/s1600/Outlook003.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="293" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj1D3x-t1SFVdKXmkUj2m0emEtBKeI-ht29uuPW_fuJXIb7fvngXxjsg-2M9pJDt8NAVewAlAbWSZU8l6_f8A7Rr3fQS8HMe6T9M-zxy-yRoqmvWwLoyLyuxUV8DKqGXtlEd3dpjCxI-t3J/s400/Outlook003.png" width="400" /></a></div><br />
4. Select "Internet E-mail" which has the IMAP option, and click on Next.<br />
<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjSuWh3WkCsJR5a_RJ5C9cVNglUvgTkbt_uME_mgP8eYYvzCnFFbHNmLI6OrQs6ty-5FtPkeUqAEVcgt4NXDO4OPDIY3oDfMiqGV6_ZASo7v4AQ77PzyP1Xr_Ra08yZa33YDvWAs8c34-Dh/s1600/Outlook004.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="295" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjSuWh3WkCsJR5a_RJ5C9cVNglUvgTkbt_uME_mgP8eYYvzCnFFbHNmLI6OrQs6ty-5FtPkeUqAEVcgt4NXDO4OPDIY3oDfMiqGV6_ZASo7v4AQ77PzyP1Xr_Ra08yZa33YDvWAs8c34-Dh/s400/Outlook004.png" width="400" /></a></div> 5. Next fill out the credentials for being able to connect to Alfresco IMAP. Here I use the dummy domain name that we defined in the hosts file - xxxxxx.com. I use the login information for the Alfresco admin user.<br />
<br />
<div class="separator" style="clear: both; text-align: center;"></div><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhvojil2CsBu9aOtzeqB-c7t39DV3M31-rRqHMzD5IDoi1DtCnr8RA3cMmhL7_R3xmI69Kzy_GcBzdoSO9x69pPK_D6RJk3qBkpw7cvvo4Gm_OuWuceatoytaJmU6ioVmUxfoP7s3bFNLNS/s1600/Outlook005.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="293" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhvojil2CsBu9aOtzeqB-c7t39DV3M31-rRqHMzD5IDoi1DtCnr8RA3cMmhL7_R3xmI69Kzy_GcBzdoSO9x69pPK_D6RJk3qBkpw7cvvo4Gm_OuWuceatoytaJmU6ioVmUxfoP7s3bFNLNS/s400/Outlook005.png" width="400" /></a></div><br />
6. Click Next and we are finished.<br />
<br />
<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgbPGIl17lQMTFtW1lhGvnI2MwVj99Koi5mv0erZL0sz0aiJBa6D4fU8K9GDsqyT-U8aoYaHStzFYS5JQ_Br-yDtqbPBn0NwtJoamln9A49yedpSX71mhH0poHDF1p_QqJ9Rn3CGdYdppoh/s1600/Outlook006.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="296" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgbPGIl17lQMTFtW1lhGvnI2MwVj99Koi5mv0erZL0sz0aiJBa6D4fU8K9GDsqyT-U8aoYaHStzFYS5JQ_Br-yDtqbPBn0NwtJoamln9A49yedpSX71mhH0poHDF1p_QqJ9Rn3CGdYdppoh/s400/Outlook006.png" width="400" /></a></div><br />
7. After a few seconds pause, on the left navigation panel, you should see the Alfresco IMAP Point successfully mounted. <br />
<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgWqL-LKSPiYq1DLNmGtkn_Z2w51ZywfB-FtV4m3_OooC5raySzpaQnkDvI1lswGqzDWdjPLOUQxfTQp2D8gKY14iHoh0sRxG9fkKAxoMOxgSp0EZatrK5bg-uDX3RnMZNJpF5Qb-CRSPOU/s1600/Outlook008.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="363" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgWqL-LKSPiYq1DLNmGtkn_Z2w51ZywfB-FtV4m3_OooC5raySzpaQnkDvI1lswGqzDWdjPLOUQxfTQp2D8gKY14iHoh0sRxG9fkKAxoMOxgSp0EZatrK5bg-uDX3RnMZNJpF5Qb-CRSPOU/s400/Outlook008.png" width="400" /></a></div><br />
8. Click through on the Alfresco IMAP folder and you'll see folders of the Alfresco repository.<br />
<div class="separator" style="clear: both; text-align: center;"></div><br />
<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj2WY6KojmWpzqsf3R-VtyVJeKCruX0SbyD3XteorfC87Zni4O1j08uDy-9Jj0l1oYQwgfZPupmQNPGTXs3-l9CnqhAY56YZLr8-aNFGLEA4gvbPsCh9BhKbOXBpklxx8jV6cxQHkk6gUey/s1600/Outlook009.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj2WY6KojmWpzqsf3R-VtyVJeKCruX0SbyD3XteorfC87Zni4O1j08uDy-9Jj0l1oYQwgfZPupmQNPGTXs3-l9CnqhAY56YZLr8-aNFGLEA4gvbPsCh9BhKbOXBpklxx8jV6cxQHkk6gUey/s320/Outlook009.png" /></a></div><br />
<br />
Not all folders have yet been enabled for display in the IMAP Alfresco folder hierarchy. I'm currently working with my Records Management site within Alfresco, so I log into Alfresco share, and from the Share main dashboard, I'm able to mark the Records Management folder as an IMAP favorite. After doing that, the records management site folders also are available from within Outlook.<br />
<br />
<div class="separator" style="clear: both; text-align: center;"></div><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgQ2d4cn7rovecBRBoLqsIkuvnzznnDseFzBs3XKBvl3eGs7qxpnEjm_jbK-hls8QiD9byJNNYgnKfILQnPUeEbOxhujM9iHbLQuCJ42M5wPrziYQVfEU-DbOo7uDW9fyshjenOBAKw057E/s1600/Outlook010.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="146" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgQ2d4cn7rovecBRBoLqsIkuvnzznnDseFzBs3XKBvl3eGs7qxpnEjm_jbK-hls8QiD9byJNNYgnKfILQnPUeEbOxhujM9iHbLQuCJ42M5wPrziYQVfEU-DbOo7uDW9fyshjenOBAKw057E/s400/Outlook010.png" width="400" /></a></div><br />
In Outlook I can see the following in the left folder navigation area:<br />
<br />
<div class="separator" style="clear: both; text-align: center;"></div><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjf4_gBYlNH6v4J35ltE0KmzOF5A1eUjmcZcV9qRrig5zDnZZbsyywjZGgGfIzkaQNDRo9NJHVoS4RCiG_ly5-lJ9rKZyFT8zdMuwYwHVUIIe-1WX2H76kae4aY5hAlN8loyvwPGLYhTINt/s1600/Outlook011.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="400" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjf4_gBYlNH6v4J35ltE0KmzOF5A1eUjmcZcV9qRrig5zDnZZbsyywjZGgGfIzkaQNDRo9NJHVoS4RCiG_ly5-lJ9rKZyFT8zdMuwYwHVUIIe-1WX2H76kae4aY5hAlN8loyvwPGLYhTINt/s400/Outlook011.png" width="326" /></a></div><br />
From within Outlook I can now drag my emails from my Inbox into the Alfresco IMAP storage. For example, I drag an email into the US20040249606 Folder of the Patents Category. From Share Records Management, I see the following:<br />
<br />
<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiCK15YGCOOuffiBO-ms-8pypPrUHxoNdEMFkj0zZaW69HiizArRM48JAPfz6uTWKJuDAhDmn2iqSXMeEOaZTGlCQS53Fcp7NMJD3l98zD-Dc3vAwvp23zmTiTYUDOYLd9FskdJ9VPfpJFe/s1600/Outlook012.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="177" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiCK15YGCOOuffiBO-ms-8pypPrUHxoNdEMFkj0zZaW69HiizArRM48JAPfz6uTWKJuDAhDmn2iqSXMeEOaZTGlCQS53Fcp7NMJD3l98zD-Dc3vAwvp23zmTiTYUDOYLd9FskdJ9VPfpJFe/s640/Outlook012.png" width="640" /></a></div><br />
<br />
There is a new entry: Message_755.eml.Dick Weisingerhttp://www.blogger.com/profile/06275286068863587252noreply@blogger.com1tag:blogger.com,1999:blog-1622089077919681757.post-41986122634768152522010-05-05T20:45:00.000-07:002010-05-05T20:48:41.358-07:00Upload Files to Alfresco via Email -- Inbound Emails"Data Ingestion" -- that's the process of getting files and data into your content management system, and Alfresco makes it easy. My favorite example is being able to drag-and-drop to a mounted Alfresco CIFS drive. Alfresco 3.2R also introduces drag-and-drop within IMAP-compatible email clients like Outlook, which is pretty slick.<br />
<br />
But there's another option that you may not know about that has been part of standard Alfresco for a while and it's something that you may find to be very handy. That's the uploading of emails sent to an Alfresco email address. This feature lets users send emails with attachments to Alfresco for archival. Only emails coming from designated users whose originating email address matches the email address that Alfresco knows from the user profile are accepted. This is a great option for people out in the field to be able to simply email in data and files that they need to be stored in the Alfresco repository.<br />
<br />
You still need to use the Alfresco explorer JSF client to set it up, but once you've got it setup, you can file data into the Records Management module, an Alfresco Share site document library, or anywhere in the repository.<br />
<br />
<b>Step 1 -- Setup and Start the Alfresco Email Server</b><br />
Edit the file Alfresco/tomcat/shared/classes/alfresco-global.properties. Change the section in the file called "Alfresco Email Server" as show below. Basically, I've uncommented the email.server.* and email.inbound.* properties. For the variable email.server.domain, I entered the name of the server where Alfresco is running. In my case, I am testing on an Amazon EC2 instance, so I've entered the Amazon Public DNS for my instance.<br />
<br />
In this case, I've set the email.server.port value to 25. You might want to verify that there is no email server already running on the Alfresco server machine and listening to port 25. <br />
<br />
On Linux to check this, I run the following command:<br />
netstat -nap --inet | grep 25<br />
<br />
On Windows, you could just run netstat.<br />
<br />
<br />
After making those changes, I stop and restart the Alfresco server.<br />
<br />
<pre class="brush:xml"># Alfresco Email Service and Email Server
#-------------
# Enable/Disable the inbound email service. The service could be used by processes other than
# the Email Server (e.g. direct RMI access) so this flag is independent of the Email Service.
#-------------
email.inbound.enabled=true
# Email Server properties
#-------------
email.server.enabled=true
email.server.port=25
email.server.domain=ec2-184-73-58-194.compute-1.amazonaws.com
email.inbound.unknownUser=anonymous
# A comma separated list of email REGEX patterns of allowed senders.
# If there are any values in the list then all sender email addresses
# must match. For example:
# .*\@alfresco\.com, .*\@alfresco\.org
# Allow anyone:
#-------------
email.server.allowed.senders=.*
</pre><br />
<b>Step 2 -- Set Alfresco User Emails</b><br />
Enable Alfresco users to be able to submit email uploads by starting up the Alfresco explorer client and going into the Admin area. For each user that will be enabled for email submit verify that the email address entered in their Alfresco profiles match the address that they will be using when submitting emails.<br />
<br />
<b>Step 3 -- Add Users to the EMAIL_CONTRIBUTORS group</b><br />
While still in the Alfresco administration area on the Alfresco explorer client, go into group administration. Make sure that all users that are to be enabled to submit email uploads to Alfresco are part of the Alfresco group EMAIL_CONTRIBUTORS.<br />
<br />
<b>Step 3 -- Setup email aliases for Alfresco folders (spaces)</b><br />
Identify which folders in Alfresco that you'd like users to be able to submit to. To do that, navigate to each of the target folders in the repository.<br />
<br />
For example, here is a new folder in my user home area that is called "Email Inbox"<br />
<div class="separator" style="clear: both; text-align: center;"><a bitly="BITLY_PROCESSED" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEih__8g608Tw3d_CBJOmlU-Rui8vtExTn_GKulr6xLHi6sq_iSWmpY7IKmFPCZtEgfQ9lj70eh9MKDp0GRXbIW_8wzROq9itacJeLwmpAGwLWv8wfqkQ_iQ7w_fwUeLLr3oVVEspfA1RsbA/s1600/Inbox1.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="157" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEih__8g608Tw3d_CBJOmlU-Rui8vtExTn_GKulr6xLHi6sq_iSWmpY7IKmFPCZtEgfQ9lj70eh9MKDp0GRXbIW_8wzROq9itacJeLwmpAGwLWv8wfqkQ_iQ7w_fwUeLLr3oVVEspfA1RsbA/s400/Inbox1.png" width="400" /></a></div><div class="separator" style="clear: both; text-align: left;">On examination of the properties for this folder, you can see an entry called "Email ID". This is really all you need for being able to send emails. I can do an email upload submit by sending my email to this email address, like: 545@<span class="Apple-style-span" style="font-family: monospace; white-space: pre;">ec2-184-73-58-194.compute-1.amazonaws.com.</span></div><div class="separator" style="clear: both; text-align: left;"><span class="Apple-style-span" style="font-family: monospace; white-space: pre;"><br />
</span></div><div style="text-align: center;"><span class="Apple-style-span" style="font-family: 'Times New Roman'; white-space: normal;"><a bitly="BITLY_PROCESSED" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEicrCp-4EWwVwkYyRrTQJZYSNoCshNkfRlVh3Nuo7Xff4vAYFuQvaaYFwh2kVR00dvv1BgIoZZs87AHSlMTrPnXrJDG_Zn1MJXW7jqF3rcjl-Dr_asLmFHcyAbEDvD9tF3st-quCqrxtUma/s1600/Inbox2.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="400" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEicrCp-4EWwVwkYyRrTQJZYSNoCshNkfRlVh3Nuo7Xff4vAYFuQvaaYFwh2kVR00dvv1BgIoZZs87AHSlMTrPnXrJDG_Zn1MJXW7jqF3rcjl-Dr_asLmFHcyAbEDvD9tF3st-quCqrxtUma/s400/Inbox2.png" width="318" /></a></span></div><div style="text-align: center;"><br />
</div><div style="text-align: left;">But it is somewhat nicer to be able to send to an email address that is easier to remember than just a number.</div><div style="text-align: left;"><br />
</div><div style="text-align: left;">To create an alias for the Email ID numeric, you need to first add an aspect to the folder. </div><div style="text-align: left;">Run Action -> Add Aspect to Item. Select the "Email alias" aspect.</div><div style="text-align: left;"><br />
</div><div style="text-align: left;">Once the aspect is added, you'll see something like this.</div><div class="separator" style="clear: both; text-align: center;"><a bitly="BITLY_PROCESSED" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgENkvgEj-ARL4iZt8W82-Lb8SM5_NBk-L32T6xEcSURErlJkkdUSdn6uFpdbAIG2cH-WBZKvXEB-JV29D1Ps0OLNkt1ZW0HM3GH4tgbMF3jggwJsHCLIeHRKOd7ZXOZyKbDQGfmUlwtOrJ/s1600/Inbox3.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgENkvgEj-ARL4iZt8W82-Lb8SM5_NBk-L32T6xEcSURErlJkkdUSdn6uFpdbAIG2cH-WBZKvXEB-JV29D1Ps0OLNkt1ZW0HM3GH4tgbMF3jggwJsHCLIeHRKOd7ZXOZyKbDQGfmUlwtOrJ/s320/Inbox3.png" /></a></div><div class="separator" style="clear: both; text-align: left;">The property "Email Alias" is now available. By selecting edit for the properties, you can define an alias for the submit email name. For example, I can use 'inbox'. Note that the name you select is case sensitive. After doing that, I can submit emails to populate the folder associated with the alias name, like: inbox<span class="Apple-style-span" style="font-family: 'Times New Roman'; white-space: normal;">@</span><span class="Apple-style-span" style="font-family: 'Times New Roman'; white-space: normal;"><span class="Apple-style-span" style="font-family: monospace; white-space: pre;">ec2-184-73-58-194.compute-1.amazonaws.com.</span></span></div><div style="text-align: left;"><br />
</div><br />
<b>Step 4 -- Start sending Emails</b><br />
<b><br />
</b><br />
Send an email to the Alfresco email server: <span class="Apple-style-span" style="font-family: monospace; white-space: pre;">inbox</span><span class="Apple-style-span" style="font-family: monospace; white-space: pre;"><span class="Apple-style-span" style="font-family: 'Times New Roman'; white-space: normal;">@</span></span><span class="Apple-style-span" style="font-family: monospace; white-space: pre;"><span class="Apple-style-span" style="font-family: 'Times New Roman'; white-space: normal;"><span class="Apple-style-span" style="font-family: monospace; white-space: pre;">ec2-184-73-58-194.compute-1.amazonaws.com, using the name appropriate for your system.</span></span></span><br />
<span class="Apple-style-span" style="font-family: monospace; white-space: pre;"><span class="Apple-style-span" style="font-family: 'Times New Roman'; white-space: normal;"><span class="Apple-style-span" style="font-family: monospace; white-space: pre;">In this case I sent an email and an attachment called 'AlfrescoRMintro.txt'.</span></span></span><br />
<span class="Apple-style-span" style="font-family: monospace; white-space: pre;"><span class="Apple-style-span" style="font-family: 'Times New Roman'; white-space: normal;"><span class="Apple-style-span" style="font-family: monospace; white-space: pre;"><br />
</span></span></span><br />
<div class="separator" style="clear: both; text-align: center;"><a bitly="BITLY_PROCESSED" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiOwbNCzad06FSsjy6xfWb7RUH6GQnKIMsg91gdjMXkgbJ-ktuFQhOTg3-Qy8dy0RKS-JGFIAytNiL7tTSWzSrICVEHyIxAcunavHV1C6w-RuAnc3g0WmtehcxDH9Kj5MjDs6jwxIR3qzGE/s1600/Inbox4.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="245" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiOwbNCzad06FSsjy6xfWb7RUH6GQnKIMsg91gdjMXkgbJ-ktuFQhOTg3-Qy8dy0RKS-JGFIAytNiL7tTSWzSrICVEHyIxAcunavHV1C6w-RuAnc3g0WmtehcxDH9Kj5MjDs6jwxIR3qzGE/s400/Inbox4.png" width="400" /></a></div><div class="separator" style="clear: both; text-align: left;">Then check the folder. Both the email body (with name based on the email subject) and attachment have been uploaded to the folder.</div><div class="separator" style="clear: both; text-align: left;"><br />
</div><div class="separator" style="clear: both; text-align: left;">Yes, that's really great. If you look at the property page for this email, you'll see something like this:</div><div class="separator" style="clear: both; text-align: left;"><br />
</div><div style="text-align: center;"><a bitly="BITLY_PROCESSED" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhBd5ZsqMoVDerURShURQvA3t-GgNpNDpT9KD4Psd5L9wmc916p4sxYnEBB6BVs6-3_U-AW9RzjT_VvieLKoXIZqa7z9OTJQflxucgR29AqPGL7r8g8I9WffXAAWEYjoRpceFo8il84duYD/s1600/Inbox5.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="400" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhBd5ZsqMoVDerURShURQvA3t-GgNpNDpT9KD4Psd5L9wmc916p4sxYnEBB6BVs6-3_U-AW9RzjT_VvieLKoXIZqa7z9OTJQflxucgR29AqPGL7r8g8I9WffXAAWEYjoRpceFo8il84duYD/s400/Inbox5.png" width="387" /></a></div><div style="text-align: left;"><br />
</div><div style="text-align: left;">There's only one thing that makes it not totally perfect. On the property page for the email body, you can see the Attachments property with a link to the attachment document. That's great, but it isn't a live link. You need to manually go back to the folder level and find the attachment document. It would nice to just be able to click right there to see the attachment.</div><br />
Overall though this can be a very useful feature, and one not to forget about.<br />
<span class="Apple-style-span" style="font-family: monospace; white-space: pre;"><span class="Apple-style-span" style="font-family: 'Times New Roman'; white-space: normal;"><span class="Apple-style-span" style="font-family: monospace; white-space: pre;"><br />
</span></span></span>Dick Weisingerhttp://www.blogger.com/profile/06275286068863587252noreply@blogger.com2tag:blogger.com,1999:blog-1622089077919681757.post-61808311765236635822010-05-01T14:44:00.000-07:002010-05-01T14:44:49.727-07:00Alfresco Records Management Free TrialWith the 3.2r release of Alfresco Share, the Alfresco Records Management module is now available in the Enterprise edition.<br />
<br />
Alfresco has recently started a free trial program to get started using Alfresco Share and Records Management. <a bitly="BITLY_PROCESSED" href="http://www.alfresco.com/products/trials/cloud/records-management/index.jsp?ct_id=533a2273">Click here</a> to sign up for it.<br />
<br />
Paul Hampton, Product Manager at Alfresco, has recorded a number of Share Records Management videos. More of them are available on this <a bitly="BITLY_PROCESSED" href="http://blogs.alfresco.com/wp/democast/2010/04/23/demo-alfresco-records-management-running-in-the-cloud/">page</a>. I've included one of the videos below for your viewing interest.<br />
<h2><strong>Introduction to Fileplan</strong></h2>This video reviews the Fileplan within the Alfresco Records Management solution. It shows how multiple users will be presented with different views of the Fileplan based on their security setting and role.<br />
<br />
<div style="text-align: center;"><object height="344" width="425"><param name="movie" value="http://www.youtube.com/v/_qR9ZAUovog?rel=0&fs=1" /><param name="allowFullScreen" value="true" /><param name="allowscriptaccess" value="always" /><embed src="http://www.youtube.com/v/_qR9ZAUovog?rel=0&fs=1" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="425" height="344"></embed></object></div>Dick Weisingerhttp://www.blogger.com/profile/06275286068863587252noreply@blogger.com0tag:blogger.com,1999:blog-1622089077919681757.post-61368281302231135292010-04-15T14:07:00.000-07:002010-04-15T14:32:01.531-07:00Preview: Alfresco Share RulesHere's a followup from my previous post that previewed Data Lists in Alfresco Share.<br />
<br />
This time I give a demonstration of the rules capability in the Alfresco Share 3.3 Community release. Rules are not new to Alfresco. They've been in the Explorer client for some time. But being able to specify them from Share is new. And the UI for managing them is a nice improvement over the JSF-based screens of Explorer.<br />
<br />
While there's a 3.3 release downloadable now, as of this writing, bug fixes for rules in Share seems to be quite active. What I show here was made with a build from the latest source code in the SVN Head area that I made this morning.<br />
<br />
<div id="media"><object id="csSWF" classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" width="400" height="237" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=9,0,115,0"> <param name="src" value="http://www.formtek.com/alfresco/rules/Alfresco33_RulesManagement_Lorez/Alfresco33_RulesManagement_Lorez_controller.swf"/><param name="bgcolor" value="#1a1a1a"/><param name="quality" value="best"/><param name="allowScriptAccess" value="always"/><param name="allowFullScreen" value="true"/><param name="scale" value="showall"/><param name="flashVars" value="autostart=false"/><embed name="csSWF" src="http://www.formtek.com/alfresco/rules/Alfresco33_RulesManagement_Lorez/Alfresco33_RulesManagement_Lorez_controller.swf" width="400" height="237" bgcolor="#1a1a1a" quality="best" allowScriptAccess="always" allowFullScreen="true" scale="showall" flashVars="autostart=false&thumb=FirstFrame.png&thumbscale=45&color=0x000000,0x000000" pluginspage="http://www.macromedia.com/shockwave/download/index.cgi?P1_Prod_Version=ShockwaveFlash"></embed> </object><br />
</div><center><br />
Transcript for the video can be downloaded <a href="http://www.formtek.com/alfresco/rules/AlfrescoShareRulesTranscript.pdf" target="transcript">here</a>.<br />
A high resolution version of this demonstration can be seen <a href="http://www.formtek.com/alfresco/rules/Alfresco33_RulesManagement_Hirez/Alfresco33_RulesManagement_Hirez.html" target="hirez">here</a>.<br />
The Alfresco 3.3 Community release can be downloaded <a href="http://wiki.alfresco.com/wiki/Download_Community_Edition" target="download">here</a>.<br />
</center><br />
The Alfresco Share 3.3 version is certainly shaping up. And the new rules capability in it really add to the usability of the product.Dick Weisingerhttp://www.blogger.com/profile/06275286068863587252noreply@blogger.com0tag:blogger.com,1999:blog-1622089077919681757.post-47217983286392299802010-04-13T21:29:00.000-07:002010-04-13T21:51:56.079-07:00Preview: Alfresco Share Data ListsIf you don't have the time to download and setup the newly released Alfresco Share 3.3 Community version, here's a video that previews one of the new features in that release: Data Lists.<br />
<br />
<div id="media"><object id="csSWF" classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" width="400" height="237" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=9,0,115,0"> <param name="src" value="http://www.formtek.com/alfresco/datalists/lorez/Lorez_controller.swf"/><param name="bgcolor" value="#1a1a1a"/><param name="quality" value="best"/><param name="allowScriptAccess" value="always"/><param name="allowFullScreen" value="true"/><param name="scale" value="showall"/><param name="flashVars" value="autostart=false"/><embed name="csSWF" src="http://www.formtek.com/alfresco/datalists/lorez/Lorez_controller.swf" width="400" height="237" bgcolor="#1a1a1a" quality="best" allowScriptAccess="always" allowFullScreen="true" scale="showall" flashVars="autostart=false&thumb=FirstFrame.png&thumbscale=45&color=0x000000,0x000000" pluginspage="http://www.macromedia.com/shockwave/download/index.cgi?P1_Prod_Version=ShockwaveFlash"></embed> </object><br />
</div><center><br />
Transcript for the video can be downloaded <a href="http://www.formtek.com/alfresco/datalists/AlfrescoShareDataListTranscript.pdf">here</a>.<br />
A high resolution version of this demonstration can be seen <a href="http://www.formtek.com/alfresco/datalists/hirez/Alfresco33_DataList_Hirez.html" target="hirez">here</a>.<br />
The Alfresco 3.3 Community release can be downloaded <a href="http://wiki.alfresco.com/wiki/Download_Community_Edition" target="download">here</a>.<br />
</center><br />
<br />
The video doesn't get into how the lists are defined using the Alfresco Content model. It's possible to create new Data List types or to modify the columns of the existing To Do List.<br />
<br />
The To-Do List example that ships with Alfresco Share is shown in the video and the content model definition can be found in a file in the Alfresco war under models called datalistModel.xml.<br />
<br />
<pre class="brush:xml"><type name="dl:todoList">
<title>To Do List</title>
<parent>dl:dataListItem</parent>
<properties>
<property name="dl:todoTitle">
<title>Title</title>
<type>d:text</type>
<mandatory>true</mandatory>
</property>
<property name="dl:todoDueDate">
<title>Due Date</title>
<type>d:datetime</type>
<mandatory>false</mandatory>
</property>
<property name="dl:todoPriority">
<title>Priority</title>
<type>d:int</type>
<mandatory>false</mandatory>
</property>
<property name="dl:todoNotes">
<title>Notes</title>
<type>d:text</type>
<mandatory>false</mandatory>
</property>
</properties>
<associations>
<association name="dl:assignee">
<title>Assignee</title>
<source>
<mandatory>false</mandatory>
<many>true</many>
</source>
<target>
<class>cm:person</class>
<mandatory>false</mandatory>
<many>false</many>
</target>
</association>
<association name="dl:attachments">
<title>Attachments</title>
<source>
<mandatory>false</mandatory>
<many>true</many>
</source>
<target>
<class>cm:cmobject</class>
<mandatory>false</mandatory>
<many>true</many>
</target>
</association>
</associations>
</type>
</pre><br />
The to-do list form is defined in the file share-form-config.xml:<br />
<pre class="brush:xml"><!-- dl:todoList type -->
<config evaluator="model-type" condition="dl:todoList">
<forms>
<!-- Create item form -->
<form>
<field-visibility>
<show id="dl:todoTitle" />
<show id="dl:todoDueDate" />
<show id="dl:todoPriority" />
<show id="dl:todoNotes" />
<show id="dl:assignee" />
<show id="dl:attachments" />
</field-visibility>
<create-form template="../data-lists/forms/row-new.ftl" />
<appearance>
<field id="dl:todoNotes">
<control template="/org/alfresco/components/form/controls/textarea.ftl" />
</field>
</appearance>
</form>
<!-- Data Grid view -->
<form id="datagrid">
<field-visibility>
<show id="dl:todoTitle" />
<show id="dl:todoDueDate" />
<show id="dl:todoPriority" />
<show id="dl:assignee" />
<show id="dl:attachments" />
</field-visibility>
</form>
</forms>
</config>
<!-- dl_todoList type (existing nodes) -->
<config evaluator="node-type" condition="dl:todoList">
<forms>
<!-- Data List pop-up edit form -->
<form>
<field-visibility>
<show id="dl:todoTitle" />
<show id="dl:todoDueDate" />
<show id="dl:todoPriority" />
<show id="dl:todoNotes" />
<show id="dl:assignee" />
<show id="dl:attachments" />
</field-visibility>
<edit-form template="../data-lists/forms/row-edit.ftl" />
<appearance>
<field id="dl:todoNotes">
<control template="/org/alfresco/components/form/controls/textarea.ftl" />
</field>
</appearance>
</form>
</forms>
</config>
</pre>Dick Weisingerhttp://www.blogger.com/profile/06275286068863587252noreply@blogger.com1