В Птн, 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