В Птн, 19/01/2007 в 01:52 +0100, tiry пишет:
> 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 :)
> 

sure :)

Ruslan

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

Reply via email to