private static String toMessage(
     NodeInitializerContext context,
     ModelSchemaStore schemaStore,
     Iterable<ModelType<?>> scalarTypes,
     Iterable<ModelType<?>> constructableTypes) {
   Optional<ModelProperty<?>> modelPropertyOptional = context.getModelProperty();
   StringBuffer s = new StringBuffer();
   if (modelPropertyOptional.isPresent()) {
     s.append(
         String.format(
             "A model element of type: '%s' can not be constructed.%n",
             context.getContainingType().get().getName()));
     ModelProperty<?> modelProperty = modelPropertyOptional.get();
     if (isManagedCollection(modelProperty.getType())) {
       s.append(
           String.format(
               "Its property '%s %s' is not a valid managed collection%n",
               modelProperty.getType().getName(), modelProperty.getName()));
       ModelCollectionSchema<?, ?> schema =
           (ModelCollectionSchema) schemaStore.getSchema(modelProperty.getType());
       s.append(
           String.format("A managed collection can not contain '%s's%n", schema.getElementType()));
       appendManagedCollections(s, 1, constructableTypes);
     } else if (isScalarCollection(modelProperty.getType(), schemaStore)) {
       ModelCollectionSchema<?, ?> schema =
           (ModelCollectionSchema) schemaStore.getSchema(modelProperty.getType());
       s.append(
           String.format(
               "Its property '%s %s' is not a valid scalar collection%n",
               modelProperty.getType().getName(), modelProperty.getName()));
       s.append(
           String.format("A scalar collection can not contain '%s's%n", schema.getElementType()));
       s.append(explainScalarCollections(scalarTypes));
     } else {
       s.append(
           String.format(
               "Its property '%s %s' can not be constructed%n",
               modelProperty.getType().getName(), modelProperty.getName()));
       s.append(String.format("It must be one of:%n"));
       s.append(String.format("    - %s%n", MANAGED_TYPE_DESCRIPTION));
       s.append("    - A managed collection. ");
       appendManagedCollections(s, 1, constructableTypes);
       s.append(
           String.format(
               "%n    - A scalar collection. %s%n    - %s",
               explainScalarCollections(scalarTypes), UNMANAGED_PROPERTY_DESCRIPTION));
       maybeAppendConstructables(s, constructableTypes, 1);
     }
   } else {
     s.append(
         String.format(
             "A model element of type: '%s' can not be constructed.%n",
             context.getModelType().getName()));
     s.append(String.format("It must be one of:%n"));
     s.append(String.format("    - %s", MANAGED_TYPE_DESCRIPTION));
     maybeAppendConstructables(s, constructableTypes, 1);
   }
   return s.toString();
 }