I've been working with the CollectionProvider stuff a bit more, but I've run into a couple limitations. I don't think they're insurmountable, but I wanted to hear what people though about the possible solutions.

The problems that I've run into are main along two lines:
1. A developer will need access to information which isn't explicitly part of the AbstractCollectionProvider methods. For instance, lets say someone is GETing a collection, but they've specified some open search query parameters. These are not passed into the AbstractCollectionProvider.getEntries method. Which leaves them up a creek.

2. Sessions/Transactions. I was toying with a JCR collection implementation. JCR requires that we start a session at the beginning of the request and logout of the session at the end. You also need to have access to the Session inside your CollectionProvider implementation.

I can think of a few possible solutions to these things, but they're all kind of ugly IMO.

1. Supply the RequestContext to the user via a ThreadLocal variable. Or in the case of #2, supply the Session via a ThreadLocal variable and provide hooks inside the Provider to do things at the beginning/end of the request. This is probably my least favorite option.

2. Change the scope of CollectionProviders from singleton to request scope and set properties on the CollectionProvider. In essence each request would do something like this

public ResponseContext getEntry(RequestContext cxt) {
CollectionProvider cp = workspace.createCollectionProvider(...);
// make the context available via CollectionProvider.getRequestContext()
cp.setRequestContext(context);

// do custom session creation logic
initializeCollectionProvider(cp);

Entry entry = ...;
Object entryObj = cp.getEntry(resourceName);
entry.setTitle(cp.getTitle(entryObj ));
entry.setAuthor(cp.getAuthor(entry));
... etc.

// do custom session logout logic
destroyCollectionProvider(cp);

Creating a new CP seems slightly annoying to me, but this seems to be the cleanest solution.

3. Add a RequestContext variable to most/all of the CollectionProvider methods:

public abstract Iterable<T> getEntries(RequestContext ctx) throws ResponseContextException; public abstract <T> T getEntryFromId(String id, RequestContext ctx) throws ResponseContextException

For the session/tx use case, the Session can be set inside the RequestContext and pulled out via ctx.getAttribute(). The thing I don't like about this option is that it adds clutter.

--

I get this feeling though that I'm missing some better paradigm. Any one have better ideas? (or did this make any sense at all?)

- Dan

--
Dan Diephouse
MuleSource
http://mulesource.com | http://netzooid.com/blog

Reply via email to