예제 #1
0
        private static void HandleContentTypeChange(SiteObjectEvent<ContentType> contenttypeevent)
        {
            if (contenttypeevent.ChangeType == ChangeType.Add)
            {
                var folder = contenttypeevent.SiteDb.ContentFolders.Query.Where(it => it.Name == contenttypeevent.Value.Name).FirstOrDefault();
                if (folder == null)
                {
                    folder = new ContentFolder
                    {
                        Name = contenttypeevent.Value.Name,
                        ContentTypeId = contenttypeevent.Value.Id,
                    };
                    contenttypeevent.SiteDb.ContentFolders.AddOrUpdate(folder);
                }
            }
            else if (contenttypeevent.ChangeType == ChangeType.Delete)
            {
                var allfolders = contenttypeevent.SiteDb.ContentFolders.Query.Where(o => o.ContentTypeId == contenttypeevent.Value.Id).SelectAll();

                foreach (var item in allfolders)
                {
                    contenttypeevent.SiteDb.ContentFolders.Delete(item.Id);
                }
            }
        }
예제 #2
0
        public static void ComputeStyle(SiteObjectEvent StyleEvent)
        {
            var sitedb = StyleEvent.SiteDb;

            var style = StyleEvent.Value as Style;

            if (style == null)
            {
                return;
            }

            if (StyleEvent.ChangeType == ChangeType.Add)
            {
                StyleRelation.Compute(style, sitedb);
            }
            else if (StyleEvent.ChangeType == ChangeType.Update)
            {
                var oldvalue = StyleEvent.OldValue as Style;
                if (oldvalue == null || !Lib.Helper.StringHelper.IsSameValue(oldvalue.Body, style.Body))
                {
                    StyleRelation.Compute(style, sitedb);
                }
            }
            else
            {
                // this is to delete style sheet...
                List <Guid> ownerguid = new List <Guid>();
                ownerguid.Add(style.Id);

                var allownerrules = sitedb.CssRules.Query.Where(o => o.OwnerObjectId == style.Id).SelectAll();
                var allstylerules = sitedb.CssRules.Query.Where(o => o.ParentStyleId == style.Id).SelectAll();

                List <Guid> allruleid = new List <Guid>();
                allruleid.AddRange(allownerrules.Select(o => o.Id).ToList());
                allruleid.AddRange(allstylerules.Select(o => o.Id).ToList());

                foreach (var item in allruleid.Distinct())
                {
                    sitedb.CssRules.Store.delete(item);
                }

                ownerguid.AddRange(allruleid.Distinct());

                StyleEvent.SiteDb.Relations.CleanObjectRelation(StyleEvent.Value.Id);

                var relations = sitedb.Relations.Query.WhereIn <Guid>(o => o.objectXId, ownerguid).SelectAll();

                foreach (var item in relations)
                {
                    sitedb.Relations.Store.delete(item.Id);
                }

                var ReferByRelation = sitedb.Relations.Query.WhereIn <Guid>(o => o.objectYId, ownerguid).SelectAll();

                foreach (var item in ReferByRelation)
                {
                    sitedb.Relations.Store.delete(item.Id);
                }
            }
        }
예제 #3
0
        private static void HandleRoute(SiteObjectEvent<Routing.Route> ChangeEvent)
        {
            if (ChangeEvent.ChangeType == ChangeType.Add)
            {
                Cache.RouteTreeCache.RouteTree(ChangeEvent.SiteDb).AddOrUpdate(ChangeEvent.Value);
                Cache.RouteTreeCache.RouteTree(ChangeEvent.SiteDb, ChangeEvent.Value.DestinationConstType).AddOrUpdate(ChangeEvent.Value);
            }

            else if (ChangeEvent.ChangeType == ChangeType.Update)
            {
                if (ChangeEvent.OldValue.Name.ToLower() != ChangeEvent.Value.Name.ToLower())
                {
                    Cache.RouteTreeCache.RouteTree(ChangeEvent.SiteDb).Del(ChangeEvent.OldValue.Name);
                    Cache.RouteTreeCache.RouteTree(ChangeEvent.SiteDb, ChangeEvent.OldValue.DestinationConstType).Del(ChangeEvent.OldValue.Name);
                }

                Cache.RouteTreeCache.RouteTree(ChangeEvent.SiteDb).AddOrUpdate(ChangeEvent.Value);
                Cache.RouteTreeCache.RouteTree(ChangeEvent.SiteDb, ChangeEvent.Value.DestinationConstType).AddOrUpdate(ChangeEvent.Value);

            }
            else
            {
                // delete an route.. 
                Cache.RouteTreeCache.RouteTree(ChangeEvent.SiteDb).Del(ChangeEvent.Value.Name);
                Cache.RouteTreeCache.RouteTree(ChangeEvent.SiteDb, ChangeEvent.Value.DestinationConstType).Del(ChangeEvent.Value.Name); 
            }
        }
예제 #4
0
        private static void HandleObjectRelationChange(SiteObjectEvent<ObjectRelation> relationEvent)
        {
            if (relationEvent.ChangeType == ChangeType.Delete)
            {
                if (relationEvent.Value != null)
                {
                    var item = relationEvent.Value;

                    if (item.ConstTypeY == ConstObjectType.Route)
                    {
                        var route = relationEvent.SiteDb.Routes.Get(item.objectYId);
                        if (route != null && route.objectId == default(Guid))
                        {
                            var stillusedby = relationEvent.SiteDb.Relations.Query.Where(o => o.objectYId == item.objectYId).SelectAll();
                            if ((stillusedby == null || stillusedby.Count == 0 || (stillusedby.Count == 1 && stillusedby[0].objectXId == item.objectXId)))
                            {
                                relationEvent.SiteDb.Routes.Delete(item.objectYId);
                            }
                        }
                    }
                    else if (item.ConstTypeY == ConstObjectType.ExternalResource)
                    {
                        var stillusedby = relationEvent.SiteDb.Relations.Query.Where(o => o.objectYId == item.objectYId).SelectAll();
                        if (stillusedby == null || stillusedby.Count == 0 || (stillusedby.Count == 1 && stillusedby[0].objectXId == item.objectXId))
                        {
                            relationEvent.SiteDb.ExternalResource.Delete(item.objectYId);
                        }
                    }
                }
            }
        }
예제 #5
0
        private static void HandleLayoutChange(SiteObjectEvent<Layout> LayoutEvent)
        {
            if (LayoutEvent.ChangeType == ChangeType.Add)
            {

            }
            else if (LayoutEvent.ChangeType == ChangeType.Update)
            {
                if (LayoutEvent.Value.Body != LayoutEvent.OldValue.Body)
                {
                    Kooboo.Sites.Cache.RenderPlan.RemovePlan(LayoutEvent.SiteDb, LayoutEvent.Value.Id);

                    var allpages = LayoutEvent.SiteDb.Pages.TableScan.Where(o => o.LayoutName == LayoutEvent.Value.Name).SelectAll();

                    foreach (var item in allpages)
                    {
                        Kooboo.Sites.Cache.RenderPlan.RemovePlan(LayoutEvent.SiteDb, item.Id);
                    }
                }
            }
            else
            {
                Kooboo.Sites.Cache.RenderPlan.RemovePlan(LayoutEvent.SiteDb, LayoutEvent.Value.Id);

                var allpages = LayoutEvent.SiteDb.Pages.TableScan.Where(o => o.LayoutName == LayoutEvent.Value.Name).SelectAll();

                foreach (var item in allpages)
                {
                    Kooboo.Sites.Cache.RenderPlan.RemovePlan(LayoutEvent.SiteDb, item.Id);
                }
            }

        }
예제 #6
0
        public static void HandleChange<T>(SiteObjectEvent<T> e)
            where T : class, Data.Interface.ISiteObject
        {
            List<object> handler;
            if (!_handlers.TryGetValue(typeof(T), out handler))
                return;

            foreach (var item in handler)
            {
               var HandleItem = item as Action<SiteObjectEvent<T>>; 
               if (HandleItem !=null)
                {
                    HandleItem(e); 
                }
            }  
        }
예제 #7
0
        private static void HandleViewChange(SiteObjectEvent<View> ViewEvent)
        {
            if (ViewEvent.ChangeType == ChangeType.Add)
            {

            }
            else if (ViewEvent.ChangeType == ChangeType.Update)
            {
                if (ViewEvent.Value.Body != ViewEvent.OldValue.Body)
                {
                    Cache.RenderPlan.RemovePlan(ViewEvent.SiteDb, ViewEvent.Value.Id);

                    var pageviewrelation = ViewEvent.SiteDb.Relations.GetReferredBy(ViewEvent.Value, ConstObjectType.Page);
                    foreach (var item in pageviewrelation)
                    {
                        Cache.RenderPlan.RemovePlan(ViewEvent.SiteDb, item.objectXId);

                        // also the route parameter. 
                        Routing.PageRoute.UpdatePageRouteParameter(ViewEvent.SiteDb, item.objectXId);
                    }
                }

            }
            else
            {
                Cache.RenderPlan.RemovePlan(ViewEvent.SiteDb, ViewEvent.Value.Id);

                var pageviewrelation = ViewEvent.SiteDb.Relations.GetReferredBy(ViewEvent.Value);
                foreach (var item in pageviewrelation)
                {
                    Cache.RenderPlan.RemovePlan(ViewEvent.SiteDb, item.objectXId);
                     
                    // also the route parameter. 
                    Routing.PageRoute.UpdatePageRouteParameter(ViewEvent.SiteDb, item.objectXId);
                }

                // delete view date method. 
                var viewmethods = ViewEvent.SiteDb.ViewDataMethods.Query.Where(o => o.ViewId == ViewEvent.Value.Id).SelectAll();

                foreach (var item in viewmethods)
                {
                    ViewEvent.SiteDb.ViewDataMethods.Delete(item.Id);
                }

            }
        }
예제 #8
0
        public static Document GetDom(Type ModelType, SiteObjectEvent SiteEvent)
        {
            string domhtml = string.Empty;

            if (SiteEvent.ChangeType == ChangeType.Update || SiteEvent.ChangeType == ChangeType.Add)
            {
                if (ModelType == typeof(TextContent))
                {
                    domhtml = GetTextContentBody(SiteEvent.Value as TextContent, SiteEvent.SiteDb);
                }
                else
                {
                    var newvalue = SiteEvent.Value as IDomObject;
                    if (newvalue != null)
                    {
                        domhtml = newvalue.Body;
                    }
                }
            }
            return(Kooboo.Dom.DomParser.CreateDom(domhtml));
        }
예제 #9
0
        private static void HandlePageChange(SiteObjectEvent <Page> PageEvent)
        {
            if (PageEvent.ChangeType == ChangeType.Add)
            {
                //PageEvent.SiteDb.DomElements.AddOrUpdateDom(PageEvent.Value.Dom, PageEvent.Value.Id, PageEvent.Value.ConstType);
            }
            else if (PageEvent.ChangeType == ChangeType.Update)
            {
                //if (PageEvent.OldValue.Body != PageEvent.Value.Body)
                //{
                //   PageEvent.SiteDb.DomElements.AddOrUpdateDom(PageEvent.Value.Dom, PageEvent.Value.Id, PageEvent.Value.ConstType);
                //}
                Cache.RenderPlan.RemovePlan(PageEvent.SiteDb, PageEvent.OldValue.Id);
            }
            else
            {
                Cache.RenderPlan.RemovePlan(PageEvent.SiteDb, PageEvent.Value.Id);
                //PageEvent.SiteDb.DomElements.CleanObject(PageEvent.Value.Id, PageEvent.Value.ConstType);
            }

            Routing.PageRoute.UpdatePageRouteParameter(PageEvent.SiteDb, PageEvent.Value.Id);
        }
예제 #10
0
        public static bool ShouldCheck(Type ModelType, SiteObjectEvent SiteEvent)
        {
            if (SiteEvent.ChangeType == ChangeType.Update)
            {
                // this can only be idomobject now because of early check.
                var old      = SiteEvent.OldValue as IDomObject;
                var newvalue = SiteEvent.Value as IDomObject;

                if (old != null && newvalue != null)
                {
                    if (Lib.Helper.StringHelper.IsSameValue(old.Body, newvalue.Body))
                    {
                        if (ModelType == typeof(Page))
                        {
                            // if page and the header does not change..
                            var oldpage = old as Page;
                            var newpage = newvalue as Page;
                            if (oldpage.Headers.GetHashCode() == newpage.Headers.GetHashCode())
                            {
                                return(false);
                            }
                        }
                        else
                        {
                            return(false);
                        }
                    }
                }
            }

            if ((ModelType == typeof(CmsCssRule)) && SiteEvent.ChangeType != ChangeType.Delete)
            {
                return(false);
            }
            return(true);
        }
예제 #11
0
        private static void HandleTransferTask(SiteObjectEvent <SiteTransfer.TransferTask> taskEvent)
        {
            // check whether need to continue download or not.

            var sitedb    = taskEvent.SiteDb;
            var taskcount = sitedb.TransferTasks.Count();

            if (taskcount > 0)
            {
                if (sitedb.WebSite.ContinueDownload == false)
                {
                    sitedb.WebSite.ContinueDownload = true;
                    Kooboo.Data.GlobalDb.WebSites.AddOrUpdate(sitedb.WebSite);
                }
            }
            else if (taskcount == 0)
            {
                if (sitedb.WebSite.ContinueDownload == true)
                {
                    sitedb.WebSite.ContinueDownload = false;
                    Kooboo.Data.GlobalDb.WebSites.AddOrUpdate(sitedb.WebSite);
                }
            }
        }
예제 #12
0
        /// <summary>
        /// After event
        /// </summary>
        /// <param name="value"></param>
        /// <param name="changetype"></param>
        /// <param name="oldValue"></param>
        protected void RaiseEvent(TValue value, ChangeType changetype, TValue oldValue = default(TValue))
        {
            if (value == null)
            {
                return;
            }

            if (changetype == ChangeType.Delete && value is ICoreObject)
            {
                var bytes           = Service.ObjectService.KeyConverter.ToByte(value.Id);
                var lastdeletelogid = SiteDb.Log.GetJustDeletedVersion(this.StoreName, bytes);
                var core            = value as ICoreObject;
                core.Version = lastdeletelogid;
            }

            var siteevent = new SiteObjectEvent <TValue>
            {
                Value      = value,
                ChangeType = changetype,
                SiteDb     = SiteDb,
                Store      = this.Store
            };


            if (changetype == ChangeType.Update)
            {
                siteevent.OldValue = oldValue;
            }

            if (this.SiteDb.WebSite.EnableDiskSync)
            {
                Sync.DiskSyncHelper.SyncToDisk(SiteDb, value, changetype, this.StoreName);
            }



            if (this.SiteDb.WebSite.EnableFullTextSearch)
            {
                this.SiteDb.SearchIndex.Sync(SiteDb, value, changetype, this.StoreName);
            }

            if (this.SiteDb.WebSite.EnableCluster && this.SiteDb.ClusterManager != null)
            {
                this.SiteDb.ClusterManager.AddTask(this, value, changetype);
            }

            ///add to cache.
            if (this.UseCache)
            {
                if (changetype == ChangeType.Delete)
                {
                    Cache.SiteObjectCache <TValue> .Remove(this.SiteDb, value);
                }
                else
                {
                    Cache.SiteObjectCache <TValue> .AddOrUpdate(this.SiteDb, value);
                }
            }

            if (siteevent.ChangeType == ChangeType.Delete)
            {
                var objectvalue = siteevent.Value;
                if (Attributes.AttributeHelper.IsRoutable(objectvalue))
                {
                    Sites.Helper.ChangeHelper.DeleteRoutableObject(SiteDb, this, objectvalue);
                }
                Sites.Helper.ChangeHelper.DeleteComponentFromSource(SiteDb, objectvalue);
            }

            Relation.RelationManager.Compute(siteevent);

            Kooboo.Sites.Events.Handler.HandleChange(siteevent);

            Data.Events.EventBus.Raise(siteevent);

            if (siteevent.Value is DomObject)
            {
                var newojbect = siteevent.Value as DomObject;
                newojbect.DisposeDom();
            }

            if (siteevent.Value is Page)
            {
                PageRoute.UpdatePageRouteParameter(siteevent.SiteDb, siteevent.Value.Id);
            }

            ///close database
            if (value is ICoreObject)
            {
                this.Store.OwnerDatabase.Flush();

                this.Store.Close();
                if (this.SiteObjectType == typeof(Image))
                {
                    lock (this.SiteDb.ImagePool.Locker)
                    {
                        this.SiteDb.ImagePool.ClearAll();
                    }
                }
            }
            else
            {
                //{
                //    this.Store.Close();
                //    if (this.SiteObjectType == typeof(Image))
                //    {
                //        lock (this.SiteDb.ImagePool.Locker)
                //        {
                //            this.SiteDb.ImagePool.ClearAll();
                //        }
                //    }
                //}
            }
        }
예제 #13
0
        public static void Compute(SiteObjectEvent SiteEvent)
        {
            if (SiteEvent == null || SiteEvent.Value == null)
            {
                return;
            }

            if (SiteEvent.Value is Style)
            {
                ComputeStyle(SiteEvent);
                return;
            }

            if (SiteEvent.Value is IDataMethodSetting)
            {
                if (SiteEvent.ChangeType == ChangeType.Delete)
                {
                    DataMethodRelation.Clean(SiteEvent.SiteDb, SiteEvent.Value.Id);
                }
                else
                {
                    DataMethodRelation.Compute(SiteEvent.Value as IDataMethodSetting, SiteEvent.SiteDb);
                }
            }

            if (SiteEvent.Value is ResourceGroup)
            {
                if (SiteEvent.ChangeType == ChangeType.Delete)
                {
                    SiteEvent.SiteDb.Relations.CleanObjectRelation(SiteEvent.Value.Id);
                }
                else
                {
                    GroupRelation.Compute(SiteEvent.Value as ResourceGroup, SiteEvent.SiteDb);
                }
            }

            Type ModelType = SiteEvent.Value.GetType();

            //only below needs to compute relation.
            if (SiteEvent.Value is IDomObject || ModelType == typeof(CmsCssRule))
            {
                string     basurl = null;
                HtmlHeader header = null;
                Document   Dom    = null;


                if (Attributes.AttributeHelper.IsRoutable(ModelType))
                {
                    basurl = Service.ObjectService.GetObjectRelativeUrl(SiteEvent.SiteDb, SiteEvent.Value.Id, SiteEvent.Value.ConstType);
                }

                if (ModelType == typeof(Page))
                {
                    var page = SiteEvent.Value as Page;
                    header = page.Headers;
                }

                if (!ShouldCheck(ModelType, SiteEvent))
                {
                    return;
                }

                Dom = GetDom(ModelType, SiteEvent);

                if (SiteEvent.ChangeType == ChangeType.Delete)
                {
                    var siteobject = SiteEvent.Value as SiteObject;
                    if (siteobject != null)
                    {
                        RelationManager.Clean(SiteEvent.SiteDb, siteobject);
                    }
                }
                else
                {
                    if (Dom != null || SiteEvent.Value is IDomObject)
                    {
                        DomRelation.Compute(SiteEvent.SiteDb, Dom, SiteEvent.Value.Id, SiteEvent.Value.ConstType, basurl, header);
                    }
                }
            }
        }
예제 #14
0
        private static void HandleContentFolderChange(SiteObjectEvent<ContentFolder> TheEvent)
        {
            var sitedb = TheEvent.SiteDb;
            if (TheEvent.Value == null || TheEvent.Value.Id == default(Guid))
            {
                return;
            }

            if (TheEvent.ChangeType == ChangeType.Delete)
            {
                // delete content folder, delete all content. 
                var foldercontent = sitedb.TextContent.Query.Where(o => o.FolderId == TheEvent.Value.Id).UseColumnData().SelectAll();

                foreach (var item in foldercontent)
                {
                    TheEvent.SiteDb.TextContent.Delete(item.Id);
                }
                // delete all  categories. 

                var AllAssignedCategories = sitedb.ContentCategories.Query.Where(o => o.CategoryFolder == TheEvent.Value.Id).SelectAll();
                foreach (var item in AllAssignedCategories)
                {
                    sitedb.ContentCategories.Delete(item.Id);
                }

                var allfolder = sitedb.ContentFolders.All().ToList().Where(o => o.Id != TheEvent.Value.Id).ToList();

                foreach (var folder in allfolder)
                {
                    var catteds = folder.Category.FindAll(o => o.FolderId == TheEvent.Value.Id).ToList();
                    if (catteds != null && catteds.Count() > 0)
                    {
                        foreach (var item in catteds)
                        {
                            folder.Category.Remove(item);
                        }
                        sitedb.ContentFolders.AddOrUpdate(folder);
                    }
                }

                // remove embedded. 

                foreach (var folder in allfolder)
                {
                    var embedfolders = folder.Embedded.FindAll(o => o.FolderId == TheEvent.Value.Id).ToList();

                    if (embedfolders != null && embedfolders.Count() > 0)
                    {
                        foreach (var embedfolder in embedfolders)
                        {
                            folder.Embedded.Remove(embedfolder);
                        }

                        sitedb.ContentFolders.AddOrUpdate(folder);

                        var allTextContents = sitedb.TextContent.Query.Where(o => o.FolderId == folder.Id).SelectAll();
                        foreach (var item in allTextContents)
                        {
                            if (item.Embedded.ContainsKey(TheEvent.Value.Id))
                            {
                                item.Embedded.Remove(TheEvent.Value.Id);
                                sitedb.TextContent.AddOrUpdate(item);
                            }
                        }

                    }

                }


            }
        }