// Création du fichier de mapping nhibernate en utilisant le mécanisme de // mappage filtrée public void Execute() { try { DataLayer ml = CurrentElement as DataLayer; if (ml != null && Context.GenerationPass == GenerationPass.MetaModelUpdate && GenerateConfigurationSettings) { GenerateNHibernateConfiguration(ml); return; } PresentationLayer layer = CurrentElement as PresentationLayer; if (layer != null && Context.GenerationPass == GenerationPass.MetaModelUpdate) { if (layer.HostingContext == HostingContext.Web && GeneratePredefinedSessionManager) { layer.AddXmlConfigurationContent("nhibernatehttpModule", @"<configuration> <system.web><httpModules><add name=""NHibernateSessionModule"" type=""NHibernate.Web.NHibernateSessionModule""/></httpModules></system.web> </configuration>"); } else { layer.AddXmlConfigurationContent("nhibernatehttpModule", null); } return; } // DAO if (CurrentElement is DataAccessLayer && GeneratePredefinedSessionManager) { DataAccessLayer dal = CurrentElement as DataAccessLayer; CallT4Template(Context.Project, "NHibernateSessionManager", dal, "NHibernateSessionManager.cs"); PresentationLayer l = dal.Component.GetMainLayer() as PresentationLayer; if (l != null && l.HostingContext == HostingContext.Web) { CallT4Template(Context.Project, "NHibernateHttpModule", dal, "NHibernateHttpModule.cs"); } return; } ClassImplementation clazz = CurrentElement as ClassImplementation; if (clazz != null && !String.IsNullOrEmpty(DAOTemplate)) { DataAccessLayer dal = clazz.Layer as DataAccessLayer; if (dal != null && dal.SoftwareComponent.IsDataLayerExists) { TemplateProperties properties = new TemplateProperties(); CallT4Template(Context.Project, DAOTemplate, clazz, clazz.Name + "Base"); } return; } Entity entity = CurrentElement as Entity; if (entity != null && EntityIsPersistableProperty.GetValue(entity) && !String.IsNullOrEmpty(EntityTemplate)) { CallT4Template(Context.Project, EntityTemplate, entity, entity.Name); } Enumeration enumeration = CurrentElement as Enumeration; if (enumeration != null && !String.IsNullOrEmpty(EnumTemplate)) { CallT4Template(Context.Project, EnumTemplate, enumeration, enumeration.Name); } // Mappings if (CurrentElement is DataLayer && Context.GenerationPass == GenerationPass.CodeGeneration && GenerateHbmFile) { // Nom du fichier de sortie string fileName = String.Format("{0}.hbm.xml", System.IO.Path.Combine(System.IO.Path.GetDirectoryName(Context.Project.FileName), Context.Project.Name)); NHibernate3Strategy strat = new NHibernate3Strategy(); if (File.Exists(fileName)) { ServiceLocator.Instance.ShellHelper.EnsureCheckout(fileName); } strat.Execute(Context, fileName); if (File.Exists(fileName)) { ProjectItem item = ServiceLocator.Instance.ShellHelper.AddFileToProject(Context.Project, fileName); try { item.Properties.Item("BuildAction").Value = _hbmFileBuildAction; } catch { } if (_hbmFileBuildAction != VSLangProj.prjBuildAction.prjBuildActionEmbeddedResource) { ((DataLayer)CurrentElement).AddReference(fileName, ArtifactType.Content); } } } } catch (Exception ex) { LogError(ex); } }
/// <summary> /// Execution d'un template /// </summary> /// <param name="project">The project.</param> /// <param name="t4TemplateName">Nom du template (avec ou sans extension)</param> /// <param name="selectedElement">Modele concerné</param> /// <param name="outputFileName">Nom du fichier de sortie (si empty, il sera calculé si à null il sera ignoré)</param> /// <param name="properties">The properties.</param> /// <returns></returns> protected string CallT4Template(Project project, string t4TemplateName, CandleElement selectedElement, string outputFileName, TemplateProperties properties) { if (!Utils.StringCompareEquals(Path.GetExtension(t4TemplateName), ".t4")) { t4TemplateName += ".t4"; } // Est ce que le template existe dans le directory de la stratégie string templateFilePath = MapPath(t4TemplateName); if (!File.Exists(templateFilePath)) { // On garde le relatif dans le repository templateFilePath = t4TemplateName; } // Nom du fichier de sortie (si <> null) // Calcul du nom par défaut si il n'a pas été forcé ou // si ce n'est pas un chemin absolu. // NOTA : Si outputFileName est null, c'est qu'on ne veut pas // générer de fichier de sortie (on laisse comme ça) if (outputFileName != null && (outputFileName.Length == 0 || Path.GetPathRoot(outputFileName).IndexOf(':') < 0)) // Si ce n'est pas un chemin physique { outputFileName = CreateOutputFileName(project, selectedElement, outputFileName); } // Vérification dans les propriétés de l'extender si ce fichier // peut-être regénéré bool canRegenerate = true; if (outputFileName != null && File.Exists(outputFileName)) { if (Mapper.Instance.GetCanGeneratePropertyValue(outputFileName) == false) { canRegenerate = false; } } if (outputFileName != null && Context.IsGenerationLocked(selectedElement, this, outputFileName)) { return(null); } // Génération Context.Template = templateFilePath; string data = null; try { if (canRegenerate) { if (outputFileName != null && File.Exists(outputFileName)) { ServiceLocator.Instance.ShellHelper.SuspendFileChange(true, outputFileName); } data = Generator.CallT4Template(selectedElement, templateFilePath, outputFileName, properties); } if (Context.GenerationPass == GenerationPass.MetaModelUpdate) { Generator.ApplyCodeInjectionStrategies(null, selectedElement, Context); } if (data == null && canRegenerate) { return(null); } if (outputFileName == null) { return(data); } if (File.Exists(outputFileName) && project != null) { // Insertion du fichier dans le projet ProjectItem projectItem = ServiceLocator.Instance.ShellHelper.AddFileToProject(project, outputFileName); // L'association se fait sur l'id du modèle sur lequel s'exécute la strategie Mapper.Instance.Associate(project.Name, outputFileName, StrategyId, CurrentElement.Id); // Rechargement si ouvert dans l'éditeur if (canRegenerate) { ServiceLocator.Instance.ShellHelper.ReloadDocument(outputFileName); } // // Insertion des stratégies style AOP // Generator.ApplyCodeInjectionStrategies(projectItem, selectedElement, Context); ServiceLocator.Instance.ShellHelper.SaveIfDirty(outputFileName); } return(outputFileName); } finally { if (outputFileName != null && File.Exists(outputFileName)) { if (canRegenerate) { ServiceLocator.Instance.ShellHelper.SuspendFileChange(false, outputFileName); ServiceLocator.Instance.ShellHelper.ReloadDocument(outputFileName); } } } }