@Override
public void write(JsonWriter out, ExtensionModel model) throws IOException {
out.beginObject();
out.name(NAME).value(model.getName());
out.name(DESCRIPTION).value(model.getDescription());
out.name(VERSION).value(model.getVersion());
out.name(VENDOR).value(model.getVendor());
writeWithDelegate(model.getCategory(), CATEGORY, out, new TypeToken<Category>() {});
writeWithDelegate(model.getXmlDslModel(), XML_DSL, out, new TypeToken<XmlDslModel>() {});
writeWithDelegate(model.getResources(), RESOURCES, out, new TypeToken<Set<String>>() {});
writeWithDelegate(model.getSubTypes(), SUB_TYPES, out, new TypeToken<Set<SubTypesModel>>() {});
writeWithDelegate(model.getPrivilegedPackages(), PRIVILEGED_PACKAGES, out, new TypeToken<Set<String>>() {});
writeWithDelegate(model.getPrivilegedArtifacts(), PRIVILEGED_ARTIFACTS, out, new TypeToken<Set<String>>() {});
writeWithDelegate(model.getExternalLibraryModels(), EXTERNAL_LIBRARIES, out, new TypeToken<Set<ExternalLibraryModel>>() {});
writeImportedTypes(out, model.getImportedTypes());
writeWithDelegate(model.getDisplayModel().orElse(null), DISPLAY_MODEL, out, new TypeToken<DisplayModel>() {});
writeWithDelegate(model.getConfigurationModels(), CONFIGURATIONS, out, new TypeToken<List<ConfigurationModel>>() {});
writeWithDelegate(model.getOperationModels(), OPERATIONS, out, new TypeToken<List<OperationModel>>() {});
writeWithDelegate(model.getFunctionModels(), FUNCTIONS, out, new TypeToken<List<FunctionModel>>() {});
writeWithDelegate(model.getConstructModels(), CONSTRUCTS, out, new TypeToken<List<ConstructModel>>() {});
writeWithDelegate(model.getConnectionProviders(), CONNECTION_PROVIDERS, out,
new TypeToken<List<ConnectionProviderModel>>() {});
writeWithDelegate(model.getSourceModels(), MESSAGE_SOURCES, out, new TypeToken<List<SourceModel>>() {});
notificationModelDelegate.writeNotifications(model.getNotificationModels(), out);
errorModelDelegate.writeErrors(model.getErrorModels(), out);
writeExtensionLevelModelProperties(out, model);
writeTypes(TYPES, out, model.getTypes());
out.endObject();
}