Author: marrs
Date: Thu Apr 19 22:23:32 2012
New Revision: 1328134

URL: http://svn.apache.org/viewvc?rev=1328134&view=rev
Log:
Added analysis about the template mechanism.

Added:
    ace/site/trunk/content/dev-doc/analysis/template-mechanism.mdtext
Modified:
    ace/site/trunk/content/dev-doc/analysis/index.mdtext

Modified: ace/site/trunk/content/dev-doc/analysis/index.mdtext
URL: 
http://svn.apache.org/viewvc/ace/site/trunk/content/dev-doc/analysis/index.mdtext?rev=1328134&r1=1328133&r2=1328134&view=diff
==============================================================================
--- ace/site/trunk/content/dev-doc/analysis/index.mdtext (original)
+++ ace/site/trunk/content/dev-doc/analysis/index.mdtext Thu Apr 19 22:23:32 
2012
@@ -1,3 +1,4 @@
 Title: Analysis
 
-* [Security Analysis](security-analysis.html)
\ No newline at end of file
+* [Security Analysis](security-analysis.html)
+* [Template Mechanism](template-mechanism.html)

Added: ace/site/trunk/content/dev-doc/analysis/template-mechanism.mdtext
URL: 
http://svn.apache.org/viewvc/ace/site/trunk/content/dev-doc/analysis/template-mechanism.mdtext?rev=1328134&view=auto
==============================================================================
--- ace/site/trunk/content/dev-doc/analysis/template-mechanism.mdtext (added)
+++ ace/site/trunk/content/dev-doc/analysis/template-mechanism.mdtext Thu Apr 
19 22:23:32 2012
@@ -0,0 +1,36 @@
+Title: Template Mechanism
+
+Some artifacts (see Object Graph in Client) can need some customization before 
being provisioned, e.g. configuration files might need some information that is 
managed by one of the distributions.
+
+The customization will be done when a new version is created, i.e., on call of 
`approve()` on a StatefulTargetObject. A customized version of the artifact 
(which is located somewhere in an OBR, reachable using a URL) is uploaded to 
the same OBR, and the URL to the customized one is stored in the 
DeploymentVersionObject.
+
+Proposed design
+===============
+
+In addition to the interfaces ArtifactHelper and ArtifactRecognizer, we 
introduce a ArtifactPreprocessor, which has a single method 
`preprocess(ArtifactObject object, Properties props)`, in which Properties 
contains customization information (see below), and the method returns the URL 
of the altered artifact (or, if nothing has changed, the original artifact, or, 
if this changed artifact is identical to one that has already been created 
before, that old URL). This ArtifactPreprocessor can be published as a service 
(see the section on remoting below), but for local purposes, the ArtifactHelper 
interface gets an extra method `getPreprocessor()`, which returns an instance 
of the preprocessor to be used for the type of artifact this helper helps.
+
+As an added service, we could create a basic preprocessor, 
VelocityBasedPreprocessor which uses the Velocity template engine to process an 
artifact and store it in a configured OBR; this preprocessor can be 
instantiated and returned by each ArtifactHelper that needs a basic processor 
(if no processing can be done for some type of artifact, `getPreprocessor` 
should return null).
+
+### Customization information
+
+For each template that has 'holes' to fill in, it can 'reach' all 
RepositoryObjects that are reachable from the TargetObject this template will 
be provisioned to, leading to a tree of data. Inspired by Velocity's way of 
finding contextual data, we propose to store the for each RepositoryObject in 
its own Properties object, adding its attributes and tags to it as two 
Properties objects using the keys "attributes" and "tags", and a 
List<Properties> summing up all children (so, for a target, all its 
distributions) using the key "children"; in the end, this becomes a tree of 
Properties objects.
+
+This way, the Velocity template can use syntax like
+
+    #foreach( $license in $gateway.children)
+        #if ($license.attributes.vendor=="luminis")
+            Default license by luminis
+        #else
+            Custom license by $license.attributes.vendor
+        #end
+    #end
+
+### Support for remoting
+
+Some customers might want to keep all information hidden from us, only 
allowing us the metadata on the server. In this case, we can deploy a 
ArtifactPreprocessor on the customer's site, which is then responsible for 
doing everything a local ArtifactPreprocessor can do, and returning a URL to 
the altered artifact. Then, in stead of returning an instance of the 
ArtifactPreprocessor, the ArtifactHelper will return some 
RemoteArtifactPreprocessor which implements the ArtifactPreprocessor interface, 
but talks to a servlet on the customer's server.
+
+### On the 'needsApprove' state in the StatefulTargetObject
+
+With the mechanism above, `determineStoreState` in StatefulTargetObject would 
need to create a full deployment version every time we need to know whether 
approval is necessary. This is undesirable, because, in a remoting scenario, it 
means we have to pass lots of data to a servlet, oftentimes only to find out 
that we created a version identical to the one we already had.
+So, in stead of this rigid semantics, the 'needsApprove' state will become 
more of a 'tainted' state, which becomes true when something happens that could 
have an impact on this StatefulTargetObject. We can quite easily determine what 
targets are affected by a given change in the model by following the 
associations from that object to the targets.
+


Reply via email to