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)
}
}