/// <summary> /// Copie des fichiers référencés dans un répertoire /// </summary> /// <param name="targetFolder">Répertoire destination</param> /// <param name="model">The model.</param> /// <param name="mode">The mode.</param> internal static void CopyInFolder(string targetFolder, CandleModel model, ConfigurationMode mode) { if (targetFolder == null) { throw new ArgumentNullException("targetFolder"); } if (model == null) { throw new ArgumentNullException("model"); } if (mode == null) { throw new ArgumentNullException("mode"); } if (!Directory.Exists(targetFolder)) { return; } // Recherche des artifacts à copier ReferencesCollection references = DSLFactory.Candle.SystemModel.Dependencies.ReferencesHelper.GetReferences(mode, ReferenceScope.Runtime, ServiceLocator.Instance.ShellHelper.SolutionFolder, model); ILogger logger = ServiceLocator.Instance.GetService <ILogger>(); foreach (string fileName in references) { string target = Path.Combine(targetFolder, Path.GetFileName(fileName)); // string source = Path.Combine( sourceFolder, fileName ); try { if (!Utils.StringCompareEquals(target, fileName) && File.GetLastWriteTime(fileName) > File.GetLastWriteTime(target)) { Utils.CopyFile(fileName, target); Utils.UnsetReadOnly(target); if (logger != null) { logger.Write("Copy local", String.Format("Runtime references : Copy file {0} to {1}", fileName, target), LogType.Info); } // Il y a peut-être un pdb string pdbFileName = Path.ChangeExtension(fileName, ".pdb"); string pdbTargetName = Path.ChangeExtension(target, ".pdb"); Utils.CopyFile(pdbFileName, pdbTargetName); Utils.UnsetReadOnly(pdbTargetName); // Et un xml string xmlFileName = Path.ChangeExtension(fileName, ".xml"); string xmlTargetName = Path.ChangeExtension(target, ".xml"); Utils.CopyFile(xmlFileName, xmlTargetName); Utils.UnsetReadOnly(xmlTargetName); } } catch (Exception ex) { if (logger != null) { logger.WriteError("Copy local", String.Format("Runtime references : Error when copying file {0} to {1}", fileName, target), ex); } } } }
/// <summary> /// Copie du modèle dans le repository local et mise à jour du repository local /// avec les modèles des références externes du modèle et des artifacts /// </summary> /// <remarks> /// Cet événement se produit lors de la sauvegarde du modèle /// </remarks> /// <param name="model">Modèle à copier</param> /// <param name="fileName">Path du fichier contenant le modèle</param> private void PublishLocally(CandleModel model, string fileName) { Debug.Assert(model != null); Debug.Assert(fileName != null); ILogger logger = ServiceLocator.Instance.GetService <ILogger>(); if (logger != null) { logger.BeginProcess(false, true); logger.BeginStep("Local publication", LogType.Info); } try { IRepositoryProvider localProvider = RepositoryManager.Instance.GetLocalProvider(); Debug.Assert(localProvider != null); string sourceFolder = Path.GetDirectoryName(fileName); string folder = Path.GetDirectoryName(model.MetaData.GetFileName(PathKind.Absolute)); Utils.RemoveDirectory(folder); // D'abord le modele. try { fileName = localProvider.PublishModel(model, fileName, fileName); if (logger != null) { logger.Write("Local publication", "Publish model " + Path.GetFileName(fileName), LogType.Info); } } catch (Exception ex) { if (logger != null) { logger.WriteError("Local publication", "Publish model " + Path.GetFileName(fileName), ex); } } // Puis les diagrammes foreach (string diagramFile in Directory.GetFiles(sourceFolder, String.Format("{0}*.diagram", Path.GetFileName(fileName)))) { try { localProvider.PublishModel(model, diagramFile, diagramFile); if (logger != null) { logger.Write("Local publication", "Publish diagram file " + Path.GetFileName(diagramFile), LogType.Info); } } catch (Exception ex) { if (logger != null) { logger.WriteError("Local publication", "Publish diagram file " + Path.GetFileName(diagramFile), ex); } } } ReferencesCollection references = DSLFactory.Candle.SystemModel.Dependencies.ReferencesHelper.GetReferences(new ConfigurationMode(), ReferenceScope.Publish, sourceFolder, model); //if (model.SoftwareComponent != null) //{ // DateTime lastModified = File.GetLastWriteTime(fileName); // foreach (string referenceFileName in references) // { // if (File.Exists(referenceFileName) && lastModified < File.GetLastWriteTime(referenceFileName)) // { // upToDate = false; // break; // } // } //} // Ensuite les binaires et les artifacts foreach (string referenceFileName in references) { try { localProvider.PublishModel(model, referenceFileName, referenceFileName); if (logger != null) { logger.Write("Local publication", "Publish file " + Path.GetFileName(referenceFileName), LogType.Info); } // Il y a peut-être des fichiers additionnels string additionalFileName = Path.ChangeExtension(referenceFileName, ".xml"); if (File.Exists(additionalFileName)) { localProvider.PublishModel(model, additionalFileName, additionalFileName); } additionalFileName = Path.ChangeExtension(referenceFileName, ".pdb"); if (File.Exists(additionalFileName)) { localProvider.PublishModel(model, additionalFileName, additionalFileName); } } catch (Exception ex) { if (logger != null) { logger.WriteError("Local publication", "Publish file " + Path.GetFileName(referenceFileName), ex); } } } // On n'oublie pas de mettre à jour les metadata ComponentModelMetadata data = model.MetaData; Metadatas.Update(data, fileName); } finally { //if (!upToDate) // logger.Write("Local publication", "Some files are more recents than the models", LogType.Warning); if (logger != null) { logger.EndStep(); logger.EndProcess(); IIDEHelper ide = ServiceLocator.Instance.IDEHelper; if (ide != null) { ide.ShowErrorList(); } } } }