Le jeudi 18 janvier 2007 à 12:26 +0200, Ruslan Spivak a écrit :
> В Чтв, 18/01/2007 в 03:36 +0100, Bogdan Stefanescu пишет:
> > Hi all,
> > 
> > I've implemented a document adapter service.
> > 
> > What is this?
> > This is a service that lets you dynamically adapt a document (i.e. a 
> > DocumentModel object) to a random Java interface.
> > 
> > What's good for?
> > Let's say you want to add a document type "AnnotatedDocument" that 
> > define a document that can be annotated with random information.
> > The DocumentModel object doesn't have methods to set and get the 
> > annotated information.
> > You can modify it to add these methods but this is not acceptable -> 
> > Nuxeo5 must allow to dynamically extend the behavior
> > of documents - we cannot hard-code each specific behavior inside the 
> > document model itself which is a generic document.
> > Until now we was able to do this by using external services - something 
> > like creating a service something like this:
> > 
> > public class AnnotationService {
> >     public void setAnnotation(DocumentModel doc, String name, Object 
> > annotation) {
> >        // ... set the annotation .. (may use custom storage outside the 
> > repository)
> >     }
> > 
> >     public Object getAnnotation(DocumentModel doc, String name) {
> >        // ... get the annotation from the storage
> >        return annotation;
> >     }
> > 
> > }
> > 
> > Then in web client you use call to this service like this:
> > AnnotationService annotationSvc = ... fetch the service ...
> > annotationSvc.setAnnotation(doc, "myannotation", "hello");
> > ...
> > Object anno = annotationSvc.getAnnotation(doc, "myannotation");
> > ...
> > 
> > And you may be want to use a local object to cache this info to avoid 
> > fetching each time the annotation from the backend service which may be 
> > on a remote machine
> > 
> > You will end up with many little objects linked to a document model 
> > instance which may be painful to manage
> > 
> > So how the document adapter service can help you?
> > 
> > You need to define 3 classes:
> > 1. An interface to adapt the document to :
> > 
> > public interface AnnotatedDocument {
> >     setAnnotation(String name, Object annotation);
> >     getAnnotation(String name);
> > }
> > 
> > 
> > 2. An adapter factory that knows how to adapt a specific document model 
> > instance (giving its document type) to an interface (for example to 
> > AnnotatedDocument)
> > 
> > public class AnnotatedDocumentFactory implements DocumentAdapterFactory {
> >     public Object getAdapter(DocumentModel doc, Class itf) {
> >         return new AnnotatedDocumentAdapter(doc);
> >     }
> > }
> > 
> > 3. The adapter itself:
> > 
> > public class AnnotatedDocumentAdapter implements AnnotatedDocument {
> > 
> >     DocumentModel doc;
> >     Map<String, Object> annotations;
> >     AnnotationService svc;  
> > 
> >     public AnnotatedDocumentAdapter(DocumentModel doc) {
> >         this.doc =doc;
> >         // initialize the cache
> >         this.annotations = new HashMap<String, Object>();
> >         // lookup the (possibly remote) annotation service
> >         svc = ... JNDI Lookup ...
> >     }
> >    
> >     public Object getAnnotation(String name) {
> >        Object anno = this.annotations.get(name);
> >         if (anno ==null) {
> >            // get annotations using the (possibly remote) annotation service
> >            // .. anno = ..
> >         }
> >         return anno;
> >     }
> >    
> >     public void putAnnotation(String name, Object value) {
> >         annotations.put(name, value);
> >        // save annotations using the (possibly remote) annotation service
> >        // ..
> >     }
> >    
> > }
> > 
> > 
> > And to register your new adapter you must contribute an extension like:
> > 
> > <extension target="org.nuxeo.ecm.core.api.DocumentAdapterService" 
> > point="adapters">
> >         <adapter doctype="File"
> >             class="org.nuxeo.ecm.core.api.adapter.AnnotatedDocument"
> >             
> > factory="org.nuxeo.ecm.core.api.adapter.AnnotatedDocumentFactory"/>
> > </extension>
> >    
> > And that's all. Now you can use on the client the  following code  to  
> > use annotations:
> > 
> > -----------------------------------------------
> > 
> > DocumentModel doc = .. get a document model ..
> > ...
> > AnnotatedDocument annoDoc = 
> > doc.getAdapter(org.nuxeo.ecm.annotation.AnnotatedDocument.class);
> > annoDoc.setAdapter("myannotation", value);
> > ...
> > // later you can refetch the annotation facet and retrieve current state:
> > annoDoc = doc.getAdapter(org.nuxeo.ecm.annotation.AnnotatedDocument.class);
> > annoDoc.getAnnotation("myannotation");
> > 
> > -------------------------------------------------
> > 
> > You can implement any optional "facet" of a document this way.
> > This is easy to write, to use and also provide total control over the 
> > operations you need to perform (like caching etc)
> > 
> > You can look into NXCoreFacade tests if you want to see an example of 
> > how this service can be used
> >  
> 
> Great, thanks.
> 
> Ruslan
Ruslan please use this for attaching the placefull config service to the
documentmodel :)


> 
> _______________________________________________
> ECM mailing list
> [email protected]
> http://lists.nuxeo.com/mailman/listinfo/ecm
> 

_______________________________________________
ECM mailing list
[email protected]
http://lists.nuxeo.com/mailman/listinfo/ecm

Reply via email to