@Override
protected void facts( final SortedSet<String> facts )
{
final Property property = context( Property.class );
final JavaTypeConstraintService service = property.service( JavaTypeConstraintService.class );
final List<JavaTypeKind> kinds = new ArrayList<JavaTypeKind>( service.kinds() );
if( kinds.size() > 0 && kinds.size() < 5 )
{
if( kinds.size() == 1 )
{
facts.add( statementKindOne.format( term( kinds.get( 0 ) ) ) );
}
else if( kinds.size() == 2 )
{
facts.add( statementKindTwo.format( term( kinds.get( 0 ) ), term( kinds.get( 1 ) ) ) );
}
else if( kinds.size() == 3 )
{
facts.add( statementKindThree.format( term( kinds.get( 0 ) ), term( kinds.get( 1 ) ), term( kinds.get( 2 ) ) ) );
}
else if( kinds.size() == 4 )
{
facts.add( statementKindFour.format( term( kinds.get( 0 ) ), term( kinds.get( 1 ) ), term( kinds.get( 2 ) ), term( kinds.get( 3 ) ) ) );
}
}
final List<String> types = new ArrayList<String>( service.types() );
if( types.size() > 0 )
{
if( types.size() == 1 )
{
final String typeName = types.get( 0 );
String verb = verbImplementOrExtend.text();
final ReferenceService<?> referenceService = property.service( ReferenceService.class );
if( referenceService != null && referenceService instanceof JavaTypeReferenceService )
{
JavaType type = null;
try
{
type = ( (JavaTypeReferenceService) referenceService ).resolve( typeName );
}
catch( Exception e )
{
Sapphire.service( LoggingService.class ).log( e );
}
if( type != null )
{
final JavaTypeKind k = type.kind();
if( k == JavaTypeKind.CLASS || k == JavaTypeKind.ABSTRACT_CLASS )
{
verb = verbExtend.text();
}
else if( k == JavaTypeKind.INTERFACE )
{
boolean allowsClass = false;
boolean allowsInterface = false;
for( JavaTypeKind kind : kinds )
{
if( kind == JavaTypeKind.CLASS || kind == JavaTypeKind.ABSTRACT_CLASS )
{
allowsClass = true;
}
else if( kind == JavaTypeKind.INTERFACE )
{
allowsInterface = true;
}
}
if( allowsInterface && ! allowsClass )
{
verb = verbExtend.text();
}
else if( allowsClass && ! allowsInterface )
{
verb = verbImplement.text();
}
}
}
}
facts.add( statementTypeOne.format( verb, typeName ) );
}
else
{
final StringBuilder buf = new StringBuilder();
for( String type : types )
{
if( buf.length() > 0 )
{
buf.append( ", " );
}
buf.append( type );
}
final JavaTypeConstraintBehavior behavior = service.behavior();
if( behavior == JavaTypeConstraintBehavior.AT_LEAST_ONE )
{
facts.add( statementTypeOneOf.format( buf.toString() ) );
}