John, thank you for the detailed response. So the difference between these two are the way request url is obtained, the RestHttpOperationInvoker obtained the url from the returned LinkIndex map, while this SimpleHttpOperationInvoker construct the url itself and eventually gets something like "...//management/commands/cmd=xyz".
Is that basically it? On Fri, May 26, 2017 at 11:33 AM, John Blum <jb...@pivotal.io> wrote: > Hi Jinmei- > > *> Do we know why in our admin rest api, we have these two kind > of OpeationInvokers* > > Yes. > > The Javadoc > <https://github.com/apache/geode/blob/rel/v1.1.1/geode- > core/src/main/java/org/apache/geode/management/internal/web/shell/ > SimpleHttpOperationInvoker.java#L33-L34> > [1] > somewhat explains the reason for this, but... > > In a nutshell, the Management (or "Admin") REST-like API has 2 type of > REST service endpoints. > > First, are "Well-Known > <https://github.com/apache/geode/blob/rel/v1.1.1/geode- > core/src/main/java/org/apache/geode/management/internal/web/controllers/ > ShellCommandsController.java#L143-L294>" > [2] with actual *Spring Web MVC* Controller Endpoints corresponding to each > of the *Gfsh* commands (e.g. `create region > <https://github.com/apache/geode/blob/rel/v1.1.1/geode- > core/src/main/java/org/apache/geode/management/internal/web/controllers/ > RegionCommandsController.java#L156-L228>` > [3]). > > Then, there is a "Catch-all > <https://github.com/apache/geode/blob/rel/v1.1.1/geode- > core/src/main/java/org/apache/geode/management/internal/web/controllers/ > ShellCommandsController.java#L68-L70>" > endpoint [4], which is what the SimpleHttpOperationInvoker > <https://github.com/apache/geode/blob/rel/v1.1.1/geode- > core/src/main/java/org/apache/geode/management/internal/web/shell/ > SimpleHttpOperationInvoker.java#L49> > "invokes" [5]. The idea behind this endpoint was, often times, someone > would add a new command but forget to update the Admin REST API to match, > with "explicit" support (e.g. both this [2] and this [3]) for the new > command. > > While this later approach works, it is not highly recommended and is > certainly not very "REST-like", much less "REST-ful". > > In fact, the former, "Well-Known" endpoints I setup separately and > individually in order to eventually introduce proper "Resource > abstractions" for each of the REST API service endpoints for each of the > *Gfsh* commands rather than the very use of HTTP Request Parameters to > naively "reconstruct" the Gfsh command-line syntax that is largely still in > place today. However, I never got that far before the priorities changed. > > So, *Gfsh* selects which HTTP-based OperationInvoker to use based on the > availability of the command in the Admin REST API "Index" [2]. > > Anyway, there is much to know in terms of the reasons why this API was > designed the way it was at the time. I'd say it still needs a lot of work > realize the full vision I had for it when it was created, something I > documented quite well and gave to the leadership team at that time. > > If you have more questions, let's talk live. > > Cheers, > John > > > [1] > https://github.com/apache/geode/blob/rel/v1.1.1/geode- > core/src/main/java/org/apache/geode/management/internal/web/shell/ > SimpleHttpOperationInvoker.java#L33-L34 > [2] > https://github.com/apache/geode/blob/rel/v1.1.1/geode- > core/src/main/java/org/apache/geode/management/internal/web/controllers/ > ShellCommandsController.java#L143-L294 > [3] > https://github.com/apache/geode/blob/rel/v1.1.1/geode- > core/src/main/java/org/apache/geode/management/internal/web/controllers/ > RegionCommandsController.java#L156-L228 > [4] > https://github.com/apache/geode/blob/rel/v1.1.1/geode- > core/src/main/java/org/apache/geode/management/internal/web/controllers/ > ShellCommandsController.java#L68-L70 > [5] > https://github.com/apache/geode/blob/rel/v1.1.1/geode- > core/src/main/java/org/apache/geode/management/internal/web/shell/ > SimpleHttpOperationInvoker.java#L49 > > > On Fri, May 26, 2017 at 9:59 AM, Jinmei Liao <jil...@pivotal.io> wrote: > > > Hi, team, > > > > Do we know why in our admin rest api, we have these two kind of > > OpeationInvokers, it looks like when RestHttpOperationInvoker failed to > > find the resource, it will use the SimpleHttpOperationInvoker to try > again, > > but shouldn't that also fail as well? > > > > Here is some of the logic I found in the code. I am wondering why this is > > necessary. > > > > ..... > > if( link is not available){ > > throw new RestApiCallForCommandNotFoundException( > > > > String.format("No REST API call for command (%1$s) was found!", > > command.getInput())); > > } > > > > somewhere else in the process: > > > > catch (RestApiCallForCommandNotFoundException e) { > > > > SimpleHttpOperationInvoker.processCommand() > > > > } > > > > > > -- > > Cheers > > > > Jinmei > > > > > > -- > -John > john.blum10101 (skype) > -- Cheers Jinmei