@@ -113,14 +113,53 @@ for this feature.
113113
114114## DependentResource-level configuration
115115
116- `DependentResource` implementations can implement the `DependentResourceConfigurator` interface
117- to pass information to the implementation. For example, the SDK
118- provides specific support for the `KubernetesDependentResource`, which can be configured via the
119- `@KubernetesDependent` annotation. This annotation is, in turn, converted into a
120- `KubernetesDependentResourceConfig` instance, which is then passed to the `configureWith` method
121- implementation.
116+ It is possible to define custom annotations to configure custom `DependentResource` implementations. In order to provide
117+ such a configuration mechanism for your own `DependentResource` implementations, they must be annotated with the
118+ `@Configured` annotation. This annotation defines 3 fields that tie everything together:
119+
120+ - `by`, which specifies which annotation class will be used to configure your dependents,
121+ - `with`, which specifies the class holding the configuration object for your dependents and
122+ - `converter`, which specifies the `ConfigurationConverter` implementation in charge of converting the annotation
123+ specified by the `by` field into objects of the class specified by the `with` field.
124+
125+ `ConfigurationConverter` instances implement a single `configFrom` method, which will receive, as expected, the
126+ annotation instance annotating the dependent resource instance to be configured, but it can also extract information
127+ from the `DependentResourceSpec` instance associated with the `DependentResource` class so that metadata from it can be
128+ used in the configuration, as well as the parent `ControllerConfiguration`, if needed. The role of
129+ `ConfigurationConverter` implementations is to extract the annotation information, augment it with metadata from the
130+ `DependentResourceSpec` and the configuration from the parent controller on which the dependent is defined, to finally
131+ create the configuration object that the `DependentResource` instances will use.
132+
133+ However, one last element is required to finish the configuration process: the target `DependentResource` class must
134+ implement the `ConfiguredDependentResource` interface, parameterized with the annotation class defined by the
135+ `@Configured` annotation `by` field. This interface is called by the framework to inject the configuration at the
136+ appropriate time and retrieve the configuration, if it's available.
137+
138+ For example, `KubernetesDependentResource`, a core implementation that the framework provides, can be configured via the
139+ `@KubernetesDependent` annotation. This set up is configured as follows:
122140
123- TODO
141+ ```java
142+
143+ @Configured(
144+ by = KubernetesDependent.class,
145+ with = KubernetesDependentResourceConfig.class,
146+ converter = KubernetesDependentConverter.class)
147+ public abstract class KubernetesDependentResource<R extends HasMetadata, P extends HasMetadata>
148+ extends AbstractEventSourceHolderDependentResource<R, P, InformerEventSource<R, P>>
149+ implements ConfiguredDependentResource<KubernetesDependentResourceConfig<R>> {
150+ // code omitted
151+ }
152+ ```
153+
154+ The `@Configured` annotation specifies that `KubernetesDependentResource` instances can be configured by using the
155+ `@KubernetesDependent` annotation, which gets converted into a `KubernetesDependentResourceConfig` object by a
156+ `KubernetesDependentConverter`. That configuration object is then injected by the framework in the
157+ `KubernetesDependentResource` instance, after it's been created, because the class implements the
158+ `ConfiguredDependentResource` interface, properly parameterized.
159+
160+ For more information on how to use this feature, we recommend looking at how this mechanism is implemented for
161+ `KubernetesDependentResource` in the core framework, `SchemaDependentResource` in the samples or `CustomAnnotationDep`
162+ in the `BaseConfigurationServiceTest` test class.
124163
125164## EventSource-level configuration
126165
0 commit comments