final String val = value.text( false );
if( val != null )
{
final JavaType type = (JavaType) value.target();
if( type == null )
{
return Status.createOkStatus();
}
final JavaTypeKind kind = type.kind();
switch( kind )
{
case CLASS:
{
if( ! kinds.contains( JavaTypeKind.CLASS ) )
{
final String label = value.definition().getLabel( true, CapitalizationType.NO_CAPS, false );
final String msg = classNotAllowed.format( val, label );
return Status.createErrorStatus( msg );
}
break;
}
case ABSTRACT_CLASS:
{
if( ! kinds.contains( JavaTypeKind.ABSTRACT_CLASS ) )
{
final String label = value.definition().getLabel( true, CapitalizationType.NO_CAPS, false );
final String msg = abstractClassNotAllowed.format( val, label );
return Status.createErrorStatus( msg );
}
break;
}
case INTERFACE:
{
if( ! kinds.contains( JavaTypeKind.INTERFACE ) )
{
final String label = value.definition().getLabel( true, CapitalizationType.NO_CAPS, false );
final String msg = interfaceNotAllowed.format( val, label );
return Status.createErrorStatus( msg );
}
break;
}
case ANNOTATION:
{
if( ! kinds.contains( JavaTypeKind.ANNOTATION ) )
{
final String label = value.definition().getLabel( true, CapitalizationType.NO_CAPS, false );
final String msg = annotationNotAllowed.format( val, label );
return Status.createErrorStatus( msg );
}
break;
}
case ENUM:
{
if( ! kinds.contains( JavaTypeKind.ENUM ) )
{
final String label = value.definition().getLabel( true, CapitalizationType.NO_CAPS, false );
final String msg = enumNotAllowed.format( val, label );
return Status.createErrorStatus( msg );
}
break;
}
default:
{
throw new IllegalStateException();
}
}
if( kind != JavaTypeKind.ENUM && kind != JavaTypeKind.ANNOTATION )
{
if( behavior == JavaTypeConstraintBehavior.ALL )
{
for( String baseType : requiredBaseTypes )
{
if( ! type.isOfType( baseType ) )
{
final LocalizableText template = ( type.kind() == JavaTypeKind.INTERFACE ? interfaceDoesNotExtend : classDoesNotImplementOrExtend );
final String msg = template.format( val, baseType );
return Status.createErrorStatus( msg );
}
}
}
else
{
boolean satisfied = false;
for( String baseType : requiredBaseTypes )
{
if( type.isOfType( baseType ) )
{
satisfied = true;
break;
}
}
if( ! satisfied )
{
final StringBuilder list = new StringBuilder();
for( String baseType : requiredBaseTypes )
{
if( list.length() > 0 )
{
list.append( ", " );
}
list.append( baseType );
}
final LocalizableText template = ( type.kind() == JavaTypeKind.INTERFACE ? interfaceDoesNotExtendOneOf : classDoesNotImplementOrExtendOneOf );
final String msg = template.format( val, list.toString() );
return Status.createErrorStatus( msg );
}
}
}