It would be nice, if we could focus on the discussion about the fluent api.
What DM is, should be discussed on another thread. (there are already
several ones ;))

I really appreciate the discussion about what DM is, but it is the wrong
topic. Here we discuss the design proposal by Simone.

Thx and Bye,
Daniel

2012/2/19 Raffaele P. Guidi <[email protected]>

> While I agree with michael, (it's my personal point of view on DM since
> even before bringing it in apache) I have to say that having a simple ready
> to use harness would have been useful and help adoption. That's why I
> adopted the Cache static facade, which well served the case. I also have to
> agree with daniel - this seems fluent but not so easy.
>
> My 2 cents.e
>
> Ciao,
>   R
> Il giorno 19/feb/2012 05:24, "Michael André Pearce" <
> [email protected]> ha scritto:
>
> > Question I pose to all of this is seeing the word user, which i think
> > needs to be asked.
> >
> > What are you seeing DirectMemory as, a CacheStore which is the
> > OffHeapStore (which is what terracottas own big memory is to EHCache)
> which
> > you can plug into existing Cache Frameworks,, which the project provides
> > the modules to plug into such frameworks as JCR, JCache, OSCache, EHCache
> > etc or are you trying to write a cahce framework from scratch?
> >
> > If its a CacheStore then really i think each plugin module such as im
> > starting to write for EHCache and Mir is writing for JCR is where the
> > configuration style and method sit etc, as long as developers writing the
> > plugins know how to interact with the cache then that should be enough.
> > User will use the frameworks already existing for configuration and these
> > are well documented in those projects.
> >
> > If we're trying to write yet another Caching Framework, i don't
> personally
> > see the point, there are all ready good frameworks out there, and your
> > better off concentrating on the actual improvements of the OffHeap store,
> > e.g. bugs, speed, sizing needed on heap, concurrency etc.
> >
> > Mike
> >
> >
> > On 19 Feb 2012, at 00:43, Daniel Manzke wrote:
> >
> > > Hey guys,
> > >
> > > Simone asked me to write my 2 cents for it. ;)
> > >
> > > Due to the fact, I had a lot to do with Simone and Guice, I just can
> say
> > > that I also really like fluent apis. But reading this apis feels like
> > > trying to use fluent, where it doesn't fit.
> > >
> > > I often have problems with fluent apis, which have really long names
> for
> > > the method, because without them, it is not clear what they are doing.
> > > (because to complex?!)
> > >
> > > {code}
> > >       /* Basic configuration APIs */
> > >       Cache cache = DirectMemory.createNewInstance( new
> > > CacheConfiguration()
> > >       {
> > >
> > >           @Override
> > >           public void configure( CacheConfigurator cacheConfigurator )
> > >           {
> > >               cacheConfigurator.buffers().count( 1 );
> > >               cacheConfigurator.allocate(MemoryUnit); //(or what was
> your
> > > class? ram?)
> > >               cacheConfigurator.dispose().every(TimeUnit);
> > >
> > >               cacheConfigurator.bind(Map.class).to(..); //use guice
> ESDL
> > -
> > > Default Implementations should
> > >
> > >    //never
> > > have to be bound manually ;)
> > >               cacheConfigurator.bind(MemoryManager.class).to(..);
> > >               cacheConfigurator.bind(Serializer.class).to(..);
> > >           }
> > >
> > >       } );
> > > {code}
> > >
> > > {code}
> > >       Pointer a = cache.allocatePointer( 1 ).Gb().identifiedBy( "Simo"
> );
> > >       Pointer b = cache.put( "Strored!" ).identifiedBy( "Raf" );
> > //expiring
> > > depends on the default of the cacheConfiguration
> > >       Pointer b2 = cache.put( "Strored!" ).identifiedBy( "Raf"
> > > ).expires().in(TimeUnit);
> > >
> > >       Pointer d = cache.update( new Object() ).identifiedBy( "Olivier"
> );
> > >       Pointer e = cache.updateByteArray( new byte[0] ).identifiedBy(
> > > "TomNaso" )
> > > {code}
> > >
> > >
> > > Do you really have a put and putByteArray? That's hard. ;) And for my
> > > cases, I would add a putStream(..)?   :)
> > >
> > > (we have created a cache implementation with focus on files/document
> > cache
> > > (onheap, offheap, ...))
> > >
> > > 2012/2/19 Simone Tripodi (Created) (JIRA) <[email protected]>
> > >
> > >> Adopt fluent APIs for bootstrapping the Cache and manage stored
> objects
> > >>
> -----------------------------------------------------------------------
> > >>
> > >>                Key: DIRECTMEMORY-62
> > >>                URL:
> > https://issues.apache.org/jira/browse/DIRECTMEMORY-62
> > >>            Project: Apache DirectMemory
> > >>         Issue Type: New Feature
> > >>           Reporter: Simone Tripodi
> > >>           Assignee: Simone Tripodi
> > >>
> > >>
> > >> Hi all guys,
> > >>
> > >> as discussed some days ago, I started prototyping an EDSL embedded in
> DM
> > >> to make Cache APIs more "sexy" :)
> > >>
> > >> So, influenced by the past experience with Commons Digester -
> influenced
> > >> by Google Guice - I tried to identify the 2 phases in the Cache
> > lifecycle
> > >>
> > >> * the "bootstrap" phase - where settings are used to instantiate the
> > >> Cache;
> > >>
> > >> * the object store management.
> > >>
> > >> Current codebase has a mix of both and users have to be aware of
> correct
> > >> sequence of operations call, I mean, calling {{Cache.retrieve( "aaa"
> )}}
> > >> without having previously called {{Cache.init( 1, Ram.Mb( 100 ) )}} at
> > the
> > >> beginning of the program, would cause an error. That is why I recurred
> > to a
> > >> kind of "configuration" pattern to make sure Cache instance have to be
> > >> configured first and then can be used:
> > >>
> > >> {code}
> > >>       /* Basic configuration APIs */
> > >>       Cache cache = DirectMemory.createNewInstance( new
> > >> CacheConfiguration()
> > >>       {
> > >>
> > >>           @Override
> > >>           public void configure( CacheConfigurator cacheConfigurator )
> > >>           {
> > >>               cacheConfigurator.numberOfBuffers().ofSize( 1 );
> > >>               cacheConfigurator.allocateMemoryOfSize( 128 ).Mb();
> > >>               cacheConfigurator.scheduleDisposalEvery( 10 ).hours();
> > >>
> > >>
> > >> cacheConfigurator.bindConcurrentMap().withJVMConcurrentMap();
> > >>
> > >>
> > cacheConfigurator.bindMemoryManagerService().withDefaultImplamentation();
> > >>
> > >> cacheConfigurator.bindSerializer().fromServiceProviderInterface();
> > >>           }
> > >>
> > >>       } );
> > >> {code}
> > >>
> > >> Hoping that the code itself is clear enough, the {{DirectMemory}}
> class
> > >> accepts a {{CacheConfiguration}}, users have to override the {{
> > configure(
> > >> CacheConfigurator )}} method, where describing the basic Cache
> behavior,
> > >> and will return a Cache instance.
> > >>
> > >> According to the DRY (Don't Repeat Yourself) principle, repeating
> > >> "cacheConfigurator" over and over for each binding can get a little
> > >> tedious, so there is an abstract support class:
> > >>
> > >> {code}
> > >>       cache = DirectMemory.createNewInstance( new
> > >> AbstractCacheConfiguration()
> > >>       {
> > >>
> > >>           @Override
> > >>           protected void configure()
> > >>           {
> > >>               numberOfBuffers().ofSize( 1 );
> > >>               allocateMemoryOfSize( 128 ).Mb();
> > >>               scheduleDisposalEvery( 10 ).hours();
> > >>
> > >>               bindConcurrentMap().withJVMConcurrentMap();
> > >>               bindMemoryManagerService().withDefaultImplamentation();
> > >>               bindSerializer().fromServiceProviderInterface();
> > >>           }
> > >>
> > >>       } );
> > >> {code}
> > >>
> > >> Once obtained the Cache instance, users can now start storing objects:
> > >>
> > >> {code}
> > >>       Pointer a = cache.allocatePointer( 1 ).Gb().identifiedBy( "Simo"
> > );
> > >>       Pointer b = cache.put( "Strored!" ).identifiedBy( "Raf"
> > >> ).thatNeverExpires();
> > >>       Pointer c = cache.putByteArray( new byte[0] ).identifiedBy(
> "Izio"
> > >> ).thatExpiresIn( 1 ).days();
> > >>
> > >>       Pointer d = cache.update( new Object() ).identifiedBy( "Olivier"
> > );
> > >>       Pointer e = cache.updateByteArray( new byte[0] ).identifiedBy(
> > >> "TomNaso" );
> > >> {code}
> > >>
> > >> WDYT?
> > >>
> > >> --
> > >> This message is automatically generated by JIRA.
> > >> If you think it was sent incorrectly, please contact your JIRA
> > >> administrators:
> > >>
> > https://issues.apache.org/jira/secure/ContactAdministrators!default.jspa
> > >> For more information on JIRA, see:
> > http://www.atlassian.com/software/jira
> > >>
> > >>
> > >>
> > >
> > >
> > > --
> > > Viele Grüße/Best Regards
> > >
> > > Daniel Manzke
> >
> >
>



-- 
Viele Grüße/Best Regards

Daniel Manzke

Reply via email to