/// <summary>
        /// Setups the specified context.
        /// </summary>
        /// <param name="db">The db.</param>
        public void Initialise(Database db)
        {
            if (_setupComplete || _setupProcessing)
            {
                return;
            }

            lock (_setupLock)
            {
                try
                {
                    if (_setupComplete || _setupProcessing)
                    {
                        return;
                    }

                    Sitecore.Diagnostics.Log.Info("Started CodeFirst setup " + db.Name, this);
                    _setupProcessing = true;
                    var manager = new DataManager(db);
                    var context = new CallContext(manager, db.GetDataProviders().Count());

                    var sqlProvider = GetSqlProvider(db);
                    var glassFolder = GetGlassTemplateFolder(sqlProvider, context);

                    if (CurrentContext != null)
                    {
                        foreach (var cls in TypeConfigurations.Where(x => x.Value.CodeFirst))
                        {
                            var templateDefinition = sqlProvider.GetItemDefinition(cls.Value.TemplateId, context);

                            if (templateDefinition == ItemDefinition.Empty || templateDefinition == null)
                            {
                                var containingFolder = GetTemplateFolder(cls.Key.Namespace, glassFolder, sqlProvider, context);
                                templateDefinition = CreateTemplateItem(db, cls.Value, cls.Key, sqlProvider, containingFolder, context);
                            }

                            BaseTemplateChecks(templateDefinition, cls.Value, db);

                            //initialize sections and children
                            foreach (ID sectionId in GetChildIDsTemplate(cls.Value, templateDefinition, context, sqlProvider))
                            {
                                GetChildIDsSection(SectionTable.First(s => s.SectionId == sectionId), context, sqlProvider);
                            }
                        }

                        if (Settings.GetBoolSetting("AutomaticallyRemoveDeletedTemplates", true))
                        {
                            RemoveDeletedClasses(glassFolder, sqlProvider, context);
                        }

                        ClearCaches(db);
                    }

                    Sitecore.Diagnostics.Log.Info("Finished CodeFirst setup " + db.Name, this);
                }
                catch (Exception ex)
                {
                    Sitecore.Diagnostics.Log.Error("CodeFirst error " + ex.Message, ex, this);
                    throw;
                }
                finally
                {
                    _setupComplete = true;
                }
            }
        }
        public void Setup(CallContext context)
        {
            if (_setupComplete || _setupProcessing)
            {
                return;
            }

            lock (_setupLock)
            {
                if (_setupComplete || _setupProcessing)
                {
                    return;
                }

                _setupProcessing = true;

                global::Sitecore.Diagnostics.Log.Info("Started CodeFirst setup", this);

                var providers = Factory.GetDatabase("master").GetDataProviders();
                var provider  = providers.FirstOrDefault(x => !(x is GlassDataProvider));

                var templateFolder = provider.GetItemDefinition(TemplateFolderId, context);

                var glassFolder = provider.GetItemDefinition(GlassFolderId, context);

                if (glassFolder == ItemDefinition.Empty || glassFolder == null)
                {
                    provider.CreateItem(GlassFolderId, "GlassTemplates", FolderTemplateId, templateFolder, context);
                    glassFolder = provider.GetItemDefinition(GlassFolderId, context);
                }


                foreach (var cls in Context.StaticContext.Classes.Where(x => x.Value.ClassAttribute.CodeFirst))
                {
                    var clsTemplate = provider.GetItemDefinition(new ID(cls.Value.TemplateId), context);

                    if (clsTemplate == ItemDefinition.Empty || clsTemplate == null)
                    {
                        //setup folders
                        IEnumerable <string> namespaces = cls.Key.Namespace.Split('.');
                        namespaces = namespaces.SkipWhile(x => x != "Templates").Skip(1);

                        ItemDefinition containing = glassFolder;
                        var            children   = provider.GetChildIDs(containing, context);
                        foreach (var ns in namespaces)
                        {
                            ItemDefinition found = null;
                            foreach (ID child in children)
                            {
                                if (!ID.IsNullOrEmpty(child))
                                {
                                    var childDef = provider.GetItemDefinition(child, context);
                                    if (childDef.Name == ns)
                                    {
                                        found = childDef;
                                    }
                                }
                            }

                            if (found == null)
                            {
                                ID newId = ID.NewID;
                                provider.CreateItem(newId, ns, FolderTemplateId, containing, context);
                                found = provider.GetItemDefinition(newId, context);
                            }
                            containing = found;
                        }

                        //create the template in Sitecore
                        string templateName = cls.Value.ClassAttribute.TemplateName;

                        if (string.IsNullOrEmpty(templateName))
                        {
                            templateName = cls.Key.Name;
                        }

                        provider.CreateItem(new ID(cls.Value.TemplateId), templateName, TemplateTemplateId, containing, context);
                        clsTemplate = provider.GetItemDefinition(new ID(cls.Value.TemplateId), context);
                        //Assign the base template
                        var templateItem = Factory.GetDatabase("master").GetItem(clsTemplate.ID);

                        using (new SecurityDisabler())
                        {
                            templateItem.Editing.BeginEdit();
                            templateItem["__Base template"] = "{1930BBEB-7805-471A-A3BE-4858AC7CF696}";
                            templateItem.Editing.EndEdit();
                        }
                    }

                    BaseTemplateChecks(clsTemplate, provider, context, cls.Value);

                    //initialize sections and children
                    foreach (ID sectionId in this.GetChildIDsTemplate(cls.Value, clsTemplate, context))
                    {
                        this.GetChildIDsSection(SectionTable.First(s => s.SectionId == sectionId), context);
                    }
                }

                if (global::Sitecore.Configuration.Settings.GetBoolSetting("AutomaticallyRemoveDeletedTemplates", true))
                {
                    RemoveDeletedClasses(glassFolder, provider, context);
                }

                global::Sitecore.Diagnostics.Log.Info("Finished CodeFirst setup", this);

                _setupComplete = true;
            }
        }
示例#3
0
        /// <summary>
        /// Setups the specified context.
        /// </summary>
        /// <param name="db">The db.</param>
        public  void Initialise(Database db)
        {
            var manager = new DataManager(db);
            var context = new CallContext(manager, db.GetDataProviders().Count());
            
            lock (_setupLock)
            {
                try
                {
                    if (_setupComplete) return;

                    global::Sitecore.Diagnostics.Log.Info("Started CodeFirst setup", this);

                    var sqlProvider = GetSqlProvider(db);

                    var glassFolder = GetGlassTemplateFolder(sqlProvider, context);

                    if (Context.Contexts.Keys.Any(x => x == ContextName))
                    {

                        var glsContext = Context.Contexts[ContextName];
                        _typeConfigurations = glsContext.TypeConfigurations
                                                         .Where(x => x.Value is SitecoreTypeConfiguration)
                                                         .ToDictionary(x => x.Key,
                                                                       x => x.Value as SitecoreTypeConfiguration);

                        foreach (var cls in _typeConfigurations.Where(x => x.Value.CodeFirst))
                        {
                            var templateDefinition = sqlProvider.GetItemDefinition(cls.Value.TemplateId, context);

                            if (templateDefinition == ItemDefinition.Empty || templateDefinition == null)
                            {
                                var containingFolder = GetTemplateFolder(cls.Key.Namespace, glassFolder, sqlProvider, context);
                                templateDefinition = CreateTemplateItem(db, cls.Value, cls.Key, sqlProvider, containingFolder, context);
                            }

                            BaseTemplateChecks(templateDefinition, sqlProvider, context, cls.Value);

                            //initialize sections and children
                            foreach (ID sectionId in this.GetChildIDsTemplate(cls.Value, templateDefinition, context))
                            {
                                this.GetChildIDsSection(SectionTable.First(s => s.SectionId == sectionId), context);
                            }
                        }

                        if (global::Sitecore.Configuration.Settings.GetBoolSetting(
                            "AutomaticallyRemoveDeletedTemplates",
                            true))
                            RemoveDeletedClasses(glassFolder, sqlProvider, context);

                        global::Sitecore.Diagnostics.Log.Info("Finished CodeFirst setup", this);
                    }
                    
                    ClearCaches(db);
                   
                }
                finally 
                {
                    _setupComplete = true;
                }

            }
        }
        /// <summary>
        /// Setups the specified context.
        /// </summary>
        /// <param name="context">The context.</param>
        public void Initialise(Database db)
        {
            var manager = new DataManager(db);
            var context = new CallContext(manager, db.GetDataProviders().Count());

            lock (_setupLock)
            {
                try
                {
                    if (_setupComplete)
                    {
                        return;
                    }

                    global::Sitecore.Diagnostics.Log.Info("Started CodeFirst setup", this);

                    var providers = db.GetDataProviders();
                    var provider  = providers.FirstOrDefault(x => !(x is GlassDataProvider));

                    var templateFolder = provider.GetItemDefinition(TemplateFolderId, context);

                    var glassFolder = provider.GetItemDefinition(GlassFolderId, context);

                    if (glassFolder == ItemDefinition.Empty || glassFolder == null)
                    {
                        provider.CreateItem(GlassFolderId, "GlassTemplates", FolderTemplateId, templateFolder, context);
                    }

                    if (Context.Contexts.Keys.Any(x => x == ContextName))
                    {
                        var glsContext = Context.Contexts[ContextName];
                        _typeConfigurations = glsContext.TypeConfigurations
                                              .Where(x => x.Value is SitecoreTypeConfiguration)
                                              .ToDictionary(x => x.Key,
                                                            x => x.Value as SitecoreTypeConfiguration);

                        foreach (var cls in _typeConfigurations.Where(x => x.Value.CodeFirst))
                        {
                            var clsTemplate = provider.GetItemDefinition(cls.Value.TemplateId, context);

                            if (clsTemplate == ItemDefinition.Empty || clsTemplate == null)
                            {
                                //setup folders
                                IEnumerable <string> namespaces = cls.Key.Namespace.Split('.');
                                namespaces = namespaces.SkipWhile(x => x != "Templates").Skip(1);

                                ItemDefinition containing = glassFolder;
                                foreach (var ns in namespaces)
                                {
                                    var children = provider.GetChildIDs(containing, context);

                                    ItemDefinition found = null;
                                    foreach (ID child in children)
                                    {
                                        if (!ID.IsNullOrEmpty(child))
                                        {
                                            var childDef = provider.GetItemDefinition(child, context);
                                            if (childDef.Name == ns)
                                            {
                                                found = childDef;
                                            }
                                        }
                                    }

                                    if (found == null)
                                    {
                                        ID newId = ID.NewID;
                                        provider.CreateItem(newId, ns, FolderTemplateId, containing, context);
                                        found = provider.GetItemDefinition(newId, context);
                                    }
                                    containing = found;
                                }

                                //create the template in Sitecore
                                string templateName = cls.Value.TemplateName;

                                if (string.IsNullOrEmpty(templateName))
                                {
                                    templateName = cls.Key.Name;
                                }

                                provider.CreateItem(cls.Value.TemplateId, templateName, TemplateTemplateId, containing,
                                                    context);
                                clsTemplate = provider.GetItemDefinition(cls.Value.TemplateId, context);
                                //Assign the base template
                                var templateItem = Factory.GetDatabase("master").GetItem(clsTemplate.ID);

                                using (new SecurityDisabler())
                                {
                                    templateItem.Editing.BeginEdit();
                                    templateItem["__Base template"] = "{1930BBEB-7805-471A-A3BE-4858AC7CF696}";
                                    templateItem.Editing.EndEdit();
                                }
                            }

                            BaseTemplateChecks(clsTemplate, provider, context, cls.Value);

                            //initialize sections and children
                            foreach (ID sectionId in this.GetChildIDsTemplate(cls.Value, clsTemplate, context))
                            {
                                this.GetChildIDsSection(SectionTable.First(s => s.SectionId == sectionId), context);
                            }
                        }

                        if (global::Sitecore.Configuration.Settings.GetBoolSetting(
                                "AutomaticallyRemoveDeletedTemplates",
                                true))
                        {
                            RemoveDeletedClasses(glassFolder, provider, context);
                        }

                        global::Sitecore.Diagnostics.Log.Info("Finished CodeFirst setup", this);
                    }

                    db.Caches.DataCache.Clear();
                    db.Caches.ItemCache.Clear();
                    db.Caches.ItemPathsCache.Clear();
                    db.Caches.StandardValuesCache.Clear();
                    db.Caches.PathCache.Clear();
                }
                finally
                {
                    _setupComplete = true;
                }
            }
        }