VersionCompatibilityService

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 );
        }
    }
}