When a client marked @Delegate is optional, the implementation of this is responsible for creating the optional object. For example.
interface MyCloud { @Delegate Optional<KeyPairClient> getKeyPairExtensionForRegion(String region); }
The input object of type {@link InvocationSuccess} will include thefollowing.
- the class declaring the method that returns optional: {@link InvocationSuccess#getClazz}; in the example above, {@code MyCloud}
- the method returning the optional: {@link InvocationSuccess#getMethod}; in the example above, {@code getKeyPairExtensionForRegion}
- the args passed to that method at runtime: {@link InvocationSuccess#getArgs}; for example {@code North}
- the rest client to be enclosed in the optional, should you choose to return it: {@link InvocationSuccess#getReturnVal}; in the example above, an implementation of {@code KeyPairClient}
Using this context, your implementation of {@link ImplicitOptionalConverter}can perform whatever you need, when deciding if the the returnVal is present and available. Here are some ideas:
- call a smoke test command
- look at the annotations on the class and compare those against a configuration switch enabling the extension
- inspect the health of the client, perhaps looking for error status
- call another api which can validate the feature can be presented
The {@link PresentWhenApiVersionLexicographicallyAtOrAfterSinceApiVersion default implementation} returns present if no {@link SinceApiVersion}annotation is assigned, or the value is less than or equal to the current {@link ApiVersion}. To override this, add the following in your subclass override of {@link RestClientModule#configure} method:
bind(ImplicitOptionalConverter.class).to(MyCustomOptionalConverter.class);
@author Adrian Cole