Ejemplo n.º 1
0
        // 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);
            }
        }
Ejemplo n.º 2
0
        /// <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);
                    }
                }
            }
        }