On Wed, 2015-06-10 at 10:41 +0100, Ian Boston wrote:
> Hi,
> 
> On 10 June 2015 at 09:41, Robert Munteanu <[email protected]> wrote:
> 
> > On Tue, 2015-06-09 at 17:01 +0200, Julian Reschke wrote:
> > > On 2015-06-09 16:41, Ian Boston wrote:
> > > > Hi,
> > > > Should the opaque String key be abstracted into a DocumentKey
> > > > interface so
> > > > that how the key is interpreted, and how it might be associated
> > > > with a
> > > > certain type of storage can be abstracted as well, rather than
> > > > relying on
> > > > some out of band specification of the key to be serialised and
> > > > parsed at
> > > > every transition ?
> > > > Best Regards
> > > > Ian
> > > > ...
> > > 
> > > Absolutely.
> > > 
> > > That would also be relevant for some some parts of the
> > > MongoDocumentStore implementation which currently make 
> > > assumptions
> > > about
> > > ID structure for cache invalidation purposes.
> > 
> > If your suggestion aims towards something like
> > 
> > @@ -59,7 +59,7 @@ public interface DocumentStore {
> >       * @return the document, or null if not found
> >       */
> >      @CheckForNull
> > -    <T extends Document> T find(Collection<T> collection, String 
> > key);
> > +    <T extends Document> T find(Collection<T> collection, 
> > DocumentKey
> > key);
> > 
> >      /**
> >       * Get the document with the {@code key}. The implementation 
> > may
> > serve the
> > 
> > that would be a very invasive change which will propagate 
> > throughout
> > the Oak code base and also break backwards compatibility ( unless 
> > we
> > keep a set of deprecated methods alongside ) , neither of which 
> > seems
> > very nice.
> > 
> 
> 
> agreed. Very invasive and not very nice, however the interface does 
> not
> appear to be exported from the core bundle so deprecation might not 
> be
> required. Nothing outside the code-bundle should be binding to it or
> implementing it.
> 
> Did I read META-INF/MANIFEST.MF from the built jar correctly ?

Ah, I was under the impression that .plugins.document was exported.
However it's not and this makes the proposed change simpler.

> 
> One of the advantages of changing the interface is it will ensure no
> unexpected use of the key in string form as such code won't compile.

Yup

> 
> btw, supporting multi tenancy probably does require some exported API
> changes, even if zero downtime does not. I have resorted to making 
> those
> changes (in a fork) to see if a PoC can work, rather than avoiding 
> the
> changes completely, as it leads to a cleaner solution. Hopefully the
> changes will be acceptable, if the PoC works.
> 
> 
> > Another possible approach is to have a DocumentKey class ( or
> > alternatively an interface backed by a DocumentKeyFactory class if 
> > you
> > prefer ), which can be used as follows
> > 
> >   DocumentKey docKey = DocumentKey.from(String key);
> >   log.info("Path is {}, depth is {}", docKey.getPath(),
> > docKey.getId());
> > 
> 
> 
> That could also work, and does centralise the out of band 
> interpretation of
> the key.

Given that changing the API is less invasive I slightly favour adding a
type for the key. However, I still need to align this with the ideas
from OAK-1328

Robert

Reply via email to