В Чтв, 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
_______________________________________________
ECM mailing list
[email protected]
http://lists.nuxeo.com/mailman/listinfo/ecm