2014-02-26 9:13 GMT+01:00 Christian Schneider <ch...@die-schneider.net>:
> On 25.02.2014 17:34, Guillaume Nodet wrote: > >> 2014-02-25 14:29 GMT+01:00 Christian Schneider <ch...@die-schneider.net>: >> >> As Achim stated in the roadmap thread Guillaume and me had a lot of >>> discussions on the irc channel recently. I fully agree that we need to >>> recapitulate the discussions here on the list to give the other community >>> members a chance to take part in the discussion. >>> >>> Overview >>> ------------ >>> So I would like to start with a short overview on what we have now: >>> >>> Karaf Commands: >>> - Based on Karaf Action interface >>> - One Class per command >>> - Action objects are not thread safe. They need to be created per command >>> call and are discarded after that >>> >>> Just fyi, the goal was to remove the burden of writing thread safe >> classes >> for the user, so it's not really a limitation, it's a feature. The >> consequence of this feature is that actions lifecycle is handled by the >> framework and not the user. >> > If you look at felix gogo commands they are also thread safe. As long as > you > only store injected services in the attributes the commands are perfectly > thread safe as the arguments > are supplied in parameters. So the gogo commands achieve the same as the > karaf Action but with much simpler means. > This is why I prefer the gogo model. It is simpler in itself while > offering the same possible feature set. > > - As Action is not meant to be called we currently do not expose it as a >>> service so the intermediary either has to be created by a framework >>> extension (DS plugin or Blueprint namespace handler) >>> - The blueprint extender and new namespace support safes a lot of xml >>> configuration but on the other hand introduces some special DI >>> annotations >>> that are karaf proprietary >>> >>> Those new annotations are not much different from @Command or @Option / >> @Argument. You think they are different because you're looking at what is >> done inside the implementation. From a user perspective, it defines the >> command and the completers and needed services if any, so they're all >> additional metadata to actions and completers. >> > For karaf usage I am really fine with these annotations and the scr > command plugin. They are easy to use > and do their job. For externally supplied commands I would prefer to not > need framework extensions like that. > > So based on the current situation we discussed what can be done to make >>> using and providing commands easier. >>> >>> Target Audience >>> --------------------- >>> >>> So who do we address? >>> - Karaf developers who write commands for karaf itself >>> - Developers of external projects that like to provide shell commands for >>> karaf but also for other environments like Eclipse RCP. Or custom >>> application with felix + gogo. ( Examples are cxf, camel, activemq, >>> several >>> pax projects) >>> >>> Goals >>> ------- >>> >>> Some goals here: >>> - We would like to have a simple API for commands that does not expose >>> the >>> inner workings to users >>> - Ideally we would like to be framework agnostic as the external projects >>> typically already decided about their framework choices or might want to >>> switch in the future >>> - For karaf itself we do not absolutely need the framework agnostic goal. >>> Instead we want to achieve ease of use in Blueprint and DS which are the >>> main frameworks in karaf. For the future DS is probably even the more >>> important >>> - External projects should be able to write one style of commands that >>> runs in a wide range of environments >>> >>> Ideas >>> ------- >>> >>> 1. Minimize exposed api >>> Currently most internals are exposed in DefaultActionPreparator. We could >>> provide it as a service with the ActionPreparator interface. So instead >>> of >>> "new" in AbstractCommand we could look up the service there >>> >>> The API exposed to the user is the Action interface and the @Command, >> @Option, @Argument, @Completer, @Service, @Reference annotations. That >> looks pretty minimal to me. The fact that some implementation classes >> (such as AbstractCommand, etc...) are leaking is mostly due to classloader >> constraints. If that's really a problem, I think we could easily write an >> extender. As a matter of fact, it was in master until a few days ago. >> See >> https://github.com/apache/karaf/commit/2bd28679e01f3800a2d686fcc214c8 >> 50f0a3c2c5 >> Maybe we should pursue this way as it should enable us to completely hide >> the implementation classes. >> > For commands inside the karaf source you are right. We can either use the > blueprint namespace or the > scr command plugin. Both options are fine for us and make us independent > of the command impls. Still we can not really > hide the command impl because of the classloader as you wrote. > > People who implement commands outside the karaf source tree (camel, cxf, > activemq, ...) might have a diffrerent view. They might not use blueprint > or DS or might not want to use our extensions. > Then they are exposed to the command impls. This is why I would like to > improve the situation for these users. Ideally by really encapsulating the > command impls. I think my idea 3 should allow this. > I will provide a poc in a branch to show what I mean. > But again, this is a propblem which doesn't really concern Karaf. If Camel, CXF, ActiveMQ do need other commands, go create those "striped" commands there, use-case solved (Keep It Simple, Stupid - KISS) [1]. So you should rather spent your time productive on reducing the scope of the commands then another POC that's just another YAGNI (You Aren't Gonna Need It) [2] > > If it works we would not be limited by classloader constraints and even > our own framework extensions might profit from the better encapsulation. > Lets wait till I tested it to see how it would work. > > 2. Create generic Actionpublisher using whiteboard model >>> I created a whiteboard model for an ActionPublisher. In this case the >>> Action would be published as services. So this would minimize the API the >>> user sees and be easy to use. Downsides is that we publish an Action >>> service that is more a template than a real service. So Guillaume had >>> some >>> major issues with this attempt. >>> So probably this is not the way we will proceed >>> >>> 3. Create generic ActionPublisher as service >>> An alternative to the above would be to create a service that can be >>> called with your Action object as a parameter and that publishes a >>> suitable >>> command for it. So in this case the ActionPunlisher is a real service and >>> still manages to hide our implementations. We could reuse the simple >>> reflection based action copying form the whiteboard model. This would >>> allow >>> to have one ActionPublisher instead of the different commands we use >>> right >>> now. (Blueprint, DS, ...). The service could also be reused in the DS >>> plugin and the blueprint namespace >>> >>> I think this actually make things more complicated, as blueprint and DS >> are >> not really meant to call a service from the registry without any user >> code. >> > We could use the service in the blueprint namespace handler. People who do > not use our namespace could also use the service instead. > I am not sure about the DS plugin. This is why I would like to test it > first. I'm repeating myself, I haven't seen such people yet, still go back to the basics if needed, provide Commands that fit the environment to run in, instead over-complicating the stuff that works for Karaf. > > >> >> 4. Improve support for gogo commands >>> The current gogo command model is quite feature rich. Compared to karaf >>> it >>> mainly lacks completion support. So I am pretty sure we could make gogo >>> commands work in karaf with the same feature set like karaf Actions. This >>> would provide especially external developers a way to create commands >>> that >>> is easy to handle and does not expose them to the implementations without >>> any framework extensions. As gogo commands are real services it is >>> especially easy in DS as the normal injection model works >>> >> >> I don't really have any problem with that. It should not be very >> difficult >> to improve the console to give visibility to those commands. For >> completion, we definitely can't go as far as karaf commands, but at least >> the name of the command and maybe option names could be completed, and >> eventually use the same default completers, though it kinda depends how >> the >> parsing is done (not sure how boolean options are parsed). >> > I hope we can achieve the same feature set but you know more about the > details than I. Do you see any severe problems to > deliver a more completer support? > > >> >> 5. Make karaf commands work in gogo >>> I prepared a branch where I split the command runtime (api + abstract >>> command impls) from the console. It should be possible to install this on >>> top of felix gogo to make karaf commands work outside karaf. >>> >>> Have you tried it in bare felix + gogo yet ? >> > Not yet. > > regards, Achim [1] - http://en.wikipedia.org/wiki/KISS_principle [2] - http://en.wikipedia.org/wiki/You_aren%27t_gonna_need_it > > > Christian > > -- > Christian Schneider > http://www.liquid-reality.de > > Open Source Architect > http://www.talend.com > > -- Apache Karaf <http://karaf.apache.org/> Committer & PMC OPS4J Pax Web <http://wiki.ops4j.org/display/paxweb/Pax+Web/> Committer & Project Lead OPS4J Pax for Vaadin <http://team.ops4j.org/wiki/display/PAXVAADIN/Home> Commiter & Project Lead blog <http://notizblog.nierbeck.de/>