1

After talking with some people at the DevCon in London and after looking at Records Management source code I noticed that there's actually no good example of how to implement custom documents lifecycle. I know there's examples of rules and content modeling and even workflows but that solutions can't be really used to implement something more serious like Records Management.

What I'm wondering is how to effectively map a Java solution (I have more experience with OO and Java than Alfresco) to Alfresco. What should be defined as Java class and what should be type/aspect in content model. When to favor behaviour over rules and when to actually use workflows. In my first few projects I used workflows to implement document lifecycle, I wrote quite a lot of bussines/domain logic in workflow nodes - as actions (JS). I found out later that this is quite hard to maintain since you have some code in workflows, some in repository as scripts (Data Dictionary/Scripts) some Java, ...

Is the Records Management good example to start learning from and see some best practices in implementing full document lifecycle? Are there any other resources?

I'm strugling the most with how to implement full lifecycle in java and how to "centralize" the bussines/domain logic.

Matjaz Muhic
  • 5,328
  • 2
  • 16
  • 34

1 Answers1

5

The scope of ECM is huge, and therefore it's quite hard to come up with completely general guidelines: you really need to stick with the use case you have to address and find the best solution to it. RM is a great example of how to implement a records management solution on top of Alfresco, but it's absolutely useless when it comes to implementing a web publishing process, for which the WCM QS is what you want to look at as a starting point.

On the whole of APIs Alfresco offers to developers, their inner characteristics are ultimately the best resource to understand when to use them. Let's see if I can make sense of (at least most important among) them.

Content Types

This is where you always need to start implementing an Alfresco project. You need to closely work with someone with deep domain knowledge of the documental processed you need to implement, and define root elements for different document lifecycles. In Alfresco you must assign one and only one content type to a given node. This is done at content creation time, and it's not often changed along the content lifecycle. Thus, content types are normally used to identify content items with radically different lifecycles (e.g. cm:document and ws:article), and defining a content type means to extract the basic meta data properties that will be used or useful along the whole document lifecycle.

Aspects

While content types are basically a static vertical classification and enrichment of documents, aspects are their dynamic cousins. As opposed to content types, you can apply or remove aspects dynamically with lesser-to-none destructive consequences to the content nodes. They can or not enrich the document with more metadata, and can be applied to items regardless of their content types. These characteristics make aspects possibly the most flexible feature of the Alfresco content model: you can use them to to mark content or enable/disable operations shared among different content lifecycles (e.g. cm:versionable, rma:filePlanComponent). By nature, aspects are meant to handle cross cutting concepts that occur in several distinct lifecycles or lifecycle steps.

Behaviors

Here we start an overview of how to add logic in your Alfresco solution. Behaviors are automatic computations that are fired by specific triggers, where triggers are defined as a [type/aspect, policy] pair (e.g. [cm:versionable, onCreateNode]). They are in general executed within the same transaction of the event that fires the trigger, there's no guarantee on the order of execution and there's no coordination or orchestration. This makes them perfect for automatic content generation or handling (e.g. creating a thumbnail or updating some metadata) which needs to be integral parts of the content lifecycle, but that are not strictly part of a formalized process.

They're rather accessory or supplementary operations for normal operations or workflows. They require Java coding, thus forming a rather fixed part of your solution. You normally identify and design behaviors right after finishing the content modeling phase and before starting designing the workflows.

Rules

Similar to behaviors, rules are triggered upon specific events, but they're a much more generic and dynamic than them. You can configure rules only on folders, at runtime, and bind them to events that happen within the folder. This makes them ideal to create special buckets within your content repository (e.g. send an email whenever content is added to a specific folder), where side effects happen when you deal with content within it. They're implemented as hidden nodes within folders, thus being integral parts of an export: you can in theory borrow them in different Alfresco implementations, provided the required pieces are available.

They normally are used when a piece of logic applies to content of several different types, but possibly not all the items of the affected types, and only when you can store all the affected content nodes within a sub branch of the repository. Even if such constraint might sound heavy, rules turn out to be quite a handy tool (e.g. generate a thumbnail for all the png documents with mime type image/png in /images).

Actions

Actions are bundled pieces of logic that can be invoked against a node on demand. They're the building blocks for rules, and often used within workflows (e.g. send an email). They are also handy to be directly bound to UI components/buttons, in order to allow the user to be directly exposed to available features of your application. You normally end up developing an action when you need (of want to enable) reusing the same piece of logic in different contextes, such as a workflow, a rule and/or direct user interaction.

Workflows

This is probably the core business of document management: workflows allow you to build a coordinated process that guides users through a defined sequence of steps, basically implementing a human algorithm. Workflows allow you to write custom code, but for the sake of maintainability you probably want to limit such code to the bare minimum of what the workflow itself needs in order to execute, and externalize more complex operations to actions or scripts.

If you're doing document management, the design and implementation of a workflow can start right after content modeling, possibly spawning several other development activities such as accessory actions and scripts, and they're likely to last until you call your code feature complete, and you start fiddling with all the infinite change requests or leftovers on the UI :-)

skuro
  • 13,414
  • 1
  • 48
  • 67
  • The thing that worries me the most with rules is that they're bound to node references instead of repository path (company_home/test/test2). It brings problems when you are exporting things. Can you declare them programatically and apply them when the amp packet is loaded or something like that? In the end I want my software to be fully packed in amp and when the amp is loaded ready to use (maybe just 1 click for creating custom type site). – Matjaz Muhic Nov 22 '11 at 12:08
  • 1
    Are import [UUID bindings](http://wiki.alfresco.com/wiki/ACP#Import_UUID_Bindings) not enough to handle that? – skuro Nov 22 '11 at 12:11
  • 1
    Yes, you can apply rules as part of your AMP [bootstrap process](http://wiki.alfresco.com/wiki/Advanced_AMP_Development) – skuro Nov 22 '11 at 12:12
  • Btw, what is the best practice for storing configuration options and options for lists like drop downs and similar dynamically? We currently use alfresco's own repository for storing lists. We for example store bussiness partners as spaces (name of the space = name of bussiness partner). We also store some other configuration like this or as content with custom metadata. Also. When would you extend sys:base and use that like in case of custom rating mentioned in this article: ecmarchitect.com/images/articles/alfresco-behavior/… ? – Matjaz Muhic Nov 23 '11 at 12:41
  • There are fundamental [valid reasons](http://stackoverflow.com/q/4862104/350923) why dynamic lists might be a bad idea. Associations and categorization/tagging are normally a better approach (and provide for same or more degrees of control), and the choice of extending `sys:base` is of a lesser concern: Jeff could have extended `cm:object` or `cm:folder` without giving up on functionalities. As he states, he didn't need any fancy feature for his nodes, just properties, hence sys:base. To me this goes beyond lifecycle concerns. – skuro Nov 23 '11 at 13:05