VersionCompatibilityService determines whether a property is compatible with the version compatibility target. This in turn controls property enablement, validation and visibility.
In most situations, version compatibility can be expressed using an @Since or an @VersionCompatibility annotation. Both of these annotations support the expression language.
Example
@Type( base = Date.class )
@Since( "1.5" )
ValueProperty PROP_INITIAL_QUOTE_DATE = new ValueProperty( TYPE, "InitialQuoteDate" );
Value<Date> getInitialQuoteDate();
void setInitialQuoteDate( String value );
void setInitialQuoteDate( Date value );
When more control is necessary, a custom implementation of VersionCompatibilityService can be provided. A typical implementation will utilize VersionCompatibilityTargetService to determine the current version.
Example
@Type( base = Date.class )
@Service( impl = ExampleVersionCompatibilityService.class )
ValueProperty PROP_INITIAL_QUOTE_DATE = new ValueProperty( TYPE, "InitialQuoteDate" );
Value<Date> getInitialQuoteDate();
void setInitialQuoteDate( String value );
void setInitialQuoteDate( Date value );
public class ExampleVersionCompatibilityService extends VersionCompatibilityService
{
private VersionCompatibilityTargetService versionCompatibilityTargetService;
private Listener versionCompatibilityTargetServiceListener;
protected void initVersionCompatibilityService()
{
final Element element = context( Element.class );
final ModelProperty property = context( ModelProperty.class );
this.versionCompatibilityTargetService = VersionCompatibilityTargetService.find( element, property );
this.versionCompatibilityTargetServiceListener = new Listener()
{
@Override
public void handle( final Event event )
{
refresh();
}
};
this.versionCompatibilityTargetService.attach( this.versionCompatibilityTargetServiceListener );
}
@Override
protected Data compute()
{
final Version version = this.versionCompatibilityTargetService.version();
final String versioned = this.versionCompatibilityTargetService.versioned();
final boolean compatible = ...
return new Data( compatible, version, versioned );
}
@Override
public void dispose()
{
super.dispose();
if( this.versionCompatibilityTargetService != null )
{
this.versionCompatibilityTargetService.detach( this.versionCompatibilityTargetServiceListener );
}
}
}