Response below... On Fri, May 26, 2017 at 11:49 AM, Jinmei Liao <jil...@pivotal.io> wrote:
> 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? > > Essentially, yes. The SimpleHttpOperationInvoker only ever uses the single, fixed Controller endpoint (/management/commands/cmd=xyz) where as the RestHttpOperationInvoker attempts to the corresponding URL for the *Gfsh* command in the Index. The RestHttpOperationInvoker delegates to the SimpleHttpOperationInvoker when the *Gfsh* command is not represented in the Index, i.e. does not have a dedicated URL. > 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 > -- -John john.blum10101 (skype)