Controls Versioning Model
Overview
There are important use cases for controls where the various related artifacts (interfaces, extensions, implementations) are developed by different people/organizations, and as those artifacts evolve over time it becomes useful to be able to specify versioning information and require certain version values. The controls programming model features a number of annotations to support this.
Defining a Version
package org.apache.beehive.controls.api.versioning; public @inteface Version { int major(); int minor() default 0; }
The @V'*_ersion annotation:
- Is allowed on control interfaces (annotated with @C_*'ontrolInterface).
- Defines a version of the control interface and is the basis of controls versioning.
- Is retained in interface class file (not BeanInfo!)
Specifying Version Restrictions/Requirements
package org.apache.beehive.controls.api.versioning; public @interface VersionRequired { int major; int minor default -1; }
The @V'*_ersionRequired annotation:
- Is allowed on control extensions and controls field declarations.
- Defines the minimum versions of the control interface that this extension or field requires.
- Major version mandatory, minor is optional (default is to not require any specific minor ver).
- When extension or client is compiled, version requirement is enforced against the control interface found at that time.
- When extension's control bean is is classloaded, version requirement is statically enforced against the control interface found at that time.
public @interface VersionSupported { int major; int minor default -1; }
The @V_*'ersionSupported annotation:
- Is allowed on control implementations.
- Defines the maximum versions of the control interface that this implementation supports.
- Major version mandatory, minor is optional (default is to support all minor versions).
- When implementation is compiled, version requirement is enforced against the control interface found at that time.
- When implementation is classloaded, version requirement is statically enforced against the control interface found at that time.
Open Issues
- Static runtime enforcement may run into problems in complex classloader situations (where interfaces and impls come from different classloaders). Perhaps add a way to disable runtime checks?