override fun writeModel()

in code/platform/src/main/kotlin/org/fbme/ide/platform/persistence/Iec61499ModelFactory.kt [218:301]


        override fun writeModel(header: SModelSimpleHeader, data: SModelData) {
            if (data !is jetbrains.mps.smodel.SModel) {
                saveFailed("Malformed internal format of model data for model: " + data.modelName.longName)
            }
            val model = data as jetbrains.mps.smodel.SModel
            try {
                val headerFile = dataSource.getStreamByNameOrCreate(HEADER_FILE)
                var backup: ByteArray? = null
                if (headerFile.exists()) {
                    val headerIS = headerFile.openInputStream()
                    backup = try {
                        headerIS.readAllBytes()
                    } finally {
                        headerIS.close()
                    }
                }
                try {
                    var headerOS: OutputStream? = null
                    try {
                        headerOS = headerFile.openOutputStream()
                        val importedModels = model.importedModels()
                        val richHeader = Iec61499ModelHeader(
                            header.modelReference,
                            importedModels.map { it.modelReference }
                        )
                        richHeader.save(headerOS)
                    } finally {
                        headerOS?.close()
                    }
                } catch (exception: ModuleClassLoaderIsDisposedException) {
                    if (backup != null) {
                        val os = headerFile.openOutputStream()
                        os.write(backup)
                        os.close()
                    }
                    LOG.error("Can't save IEC 61499 model. Loader is disposed. Please, restart MPS", exception)
                    return
                }

                // Collect tracked files
                val trackedSources: MutableList<StreamDataSource> = dataSource.subStreams.collect(Collectors.toList())
                trackedSources.remove(dataSource.getStreamByName(HEADER_FILE))

                val repository: SRepository = ApplicationManager.getApplication()
                    .getComponent(MPSCoreComponents::class.java).moduleRepository
                val platformRepository = PlatformRepository(repository)

                val errors = arrayListOf<SModel.Problem>()
                //  Write nodes to xml files
                for (rootNode in model.rootNodes) {
                    val document = try {
                        val declaration = platformRepository.getAdapter(rootNode, Declaration::class.java)
                        RootDeclarationPrinter(declaration).print()
                    } catch (e: Exception) {
                        errors += PersistenceProblem(SModel.Problem.Kind.Save, e.message, rootNode.name, true)
                        continue
                    }
                    val folderName =
                        rootNode.getProperty(SNodeUtil.property_BaseConcept_virtualPackage).orEmpty().replace(".", "/")
                    val fileLocalName = rootNode.name + "." + getExtensionOfSource(rootNode, platformRepository)
                    val fileName = if (folderName.isEmpty()) fileLocalName else "$folderName/$fileLocalName"
                    val source = dataSource.getStreamByNameOrCreate(fileName)
                    trackedSources.remove(source)
                    val stream = source.openOutputStream()
                    try {
                        JDOMUtil.writeDocument(document, stream)
                    } finally {
                        FileUtil.closeFileSafe(stream)
                    }
                }

                // Remove deleted/renamed files
                for (file in trackedSources) {
                    file.delete()
                }

                if (errors.isNotEmpty()) {
                    throw ModelSaveException("Multiple errors raised during save", errors, null)
                }
            } catch (e: IOException) {
                LOG.error("Exception raised during save", e)
                throw ModelSaveException("Exception raised during save", emptyList(), e)
            }
        }