Exemplo n.º 1
0
 private void  ProcessLinkChange(int linkId, IResource target, LinkChange change)
 {
     if (change.ChangeType == LinkChangeType.Add)
     {
         if (target.Type == (string)TracedLinks[linkId])
         {
             IResource rule = target.GetLinkProp("ExpirationRuleLink");
             if (rule == null)
             {
                 IResource     resType = null;
                 HashMap.Entry entry   = _resourceTypesForDefaultExpirationRules.GetEntry(target.Type);
                 if (entry != null)
                 {
                     resType = (IResource)entry.Value;
                 }
                 else
                 {
                     resType = Core.ResourceStore.FindUniqueResource("ResourceType", Core.Props.Name, target.Type);
                     _resourceTypesForDefaultExpirationRules.Add(target.Type, resType);
                 }
                 if (resType != null)
                 {
                     rule = resType.GetLinkProp("ExpirationRuleLink");
                 }
             }
             if (rule != null)
             {
                 //  If we submit repeatable job with the same signature, they are
                 //  merged in the queue. Thus we fire the actual rule only once.
                 Core.ResourceAP.QueueJobAt(DateTime.Now.AddSeconds(20.0), new ExpRuleDelegate(UpdateFolder), rule, target);
             }
         }
     }
 }
Exemplo n.º 2
0
        public override LinkChangeType GetLinkChange(int propID, int targetID)
        {
            if (MyPalStorage.Storage.GetPropDataType(propID) != PropDataType.Link)
            {
                throw new StorageException("IsLinkAdded() can only be called for link properties");
            }

            ArrayList linkList;

            lock ( _oldValues )
            {
                linkList = (ArrayList)_oldValues [propID];
            }
            if (linkList == null)
            {
                return(LinkChangeType.None);
            }

            for (int i = 0; i < linkList.Count; i++)
            {
                LinkChange change = (LinkChange)linkList [i];
                if (change.TargetId == targetID)
                {
                    return(change.ChangeType);
                }
            }
            return(LinkChangeType.None);
        }
Exemplo n.º 3
0
        public void AddRevisionChanges(AddRevisionChangesArgs args)
        {
            // get the active revision for this project
            var rev  = _db.Revisions.Where(r => r.ProjectId == args.ProjectId && r.RevisionStatusCode == RevisionStatuses.InProgress).First();
            var list = args.EntityList.Select(e => new {
                entity     = e,
                isImported = false
            }).ToList();

            if (args.ImportedList != null)
            {
                // add the imported entities
                list.AddRange(args.ImportedList.Select(e => new {
                    entity     = e,
                    isImported = true
                }));
            }

            // determine the state of each entity
            foreach (var entry in list)
            {
                var entity = entry.entity;
                // see if this is a new entity
                if (entity.StatusCode == EntityStatusCodes.Staged && entity.EntityId == 0)
                {
                    // this entity needs to be added to the database
                    _db.Entities.Add(entity);
                    // a revision should be created for it
                    EntityChange ec = new EntityChange();
                    ec.RevisionId     = rev.RevisionId;
                    ec.Entity         = entity;
                    ec.ChangeTypeCode = entry.isImported ? EntityChangeTypes.Imported : EntityChangeTypes.Add;
                    ec.NewName        = entity.EntityName;
                    rev.EntityChanges.Add(ec);
                }
                else if (entity.StatusCode == EntityStatusCodes.Staged)
                {
                    // just update the entity
                    _db.Entry(entity).State = System.Data.Entity.EntityState.Modified;
                    // see if there are new links
                    foreach (var field in entity.EntityFields)
                    {
                        foreach (var link in field.ParentLinks)
                        {
                            if (link.StatusCode == EntityLinkStatusCodes.Staged && link.EntityLinkId == 0)
                            {
                                // create a link change record for this
                                LinkChange lc = new LinkChange();
                                lc.EntityLink     = link;
                                lc.ChangeTypeCode = LinkChangeTypes.Add;
                                lc.RevisionId     = rev.RevisionId;
                                rev.LinkChanges.Add(lc);
                            }
                        }
                    }
                }
                else if (entity.StatusCode == EntityStatusCodes.Active)
                {
                    // compare this version with the current version to see what has changed
                    CompareWithCurrent(entity, rev);
                }
            }

            _db.SaveChanges();
        }
Exemplo n.º 4
0
        void CompareWithCurrent(Entity entity, Revision revision)
        {
            var current = _db.Entities.Where(e => e.EntityId == entity.EntityId).First();

            // compare the fields
            foreach (var field in entity.EntityFields)
            {
                if (field.EntityFieldId > 0)
                {
                    // find the current field
                    var curField = current.EntityFields.Where(f => f.EntityFieldId == field.EntityFieldId).First();
                    if (field.IsDeleted)
                    {
                        // update the initial value just in case
                        curField.InitialValue = field.InitialValue;
                        // make sure there isn't already a field change record for this
                        if (!revision.FieldChanges.Any(c => c.EntityFieldId == field.EntityFieldId && c.FieldChangeTypeCode == FieldChangeTypes.Deleted))
                        {
                            // create a entity field revision to mark the deletion
                            FieldChange fc = new FieldChange();
                            fc.EntityFieldId       = field.EntityFieldId;
                            fc.RevisionId          = revision.RevisionId;
                            fc.FieldChangeTypeCode = FieldChangeTypes.Deleted;
                            revision.FieldChanges.Add(fc);
                            // since this is being deleted, remove any other changes that are setup for this
                            var changeList = revision.FieldChanges.Where(c => c.EntityFieldId == field.EntityFieldId && c.FieldChangeTypeCode != FieldChangeTypes.Deleted).ToList();
                            changeList.ForEach(c => revision.FieldChanges.Remove(c));
                        }
                    }
                    else
                    {
                        // see if this is a field that will be added or if it's a current field
                        if (field.StatusCode == EntityFieldStatusCodes.Staged)
                        {
                            // just update the values that are different
                            curField.Datatype         = field.Datatype;
                            curField.FieldName        = field.FieldName;
                            curField.MaxLength        = field.MaxLength;
                            curField.Scale            = field.Scale;
                            curField.IsKey            = field.IsKey;
                            curField.IsIdentity       = field.IsIdentity;
                            curField.IsRequired       = field.IsRequired;
                            curField.IsDTO            = field.IsDTO;
                            curField.IsSearchField    = field.IsSearchField;
                            curField.IsContainsSearch = field.IsContainsSearch;
                            curField.InitialValue     = field.InitialValue;
                        }
                        else
                        {
                            if (!field.IsDeleted)
                            {
                                // make sure this field wasn't previously listed as deleted
                                var fc = revision.FieldChanges.Where(c => c.EntityFieldId == field.EntityFieldId && c.FieldChangeTypeCode == FieldChangeTypes.Deleted).FirstOrDefault();
                                if (fc != null)
                                {
                                    // un delete
                                    _db.FieldChanges.Remove(fc);
                                    field.IsDeleted    = false;
                                    curField.IsDeleted = false;
                                }
                            }

                            // record any normal updates
                        }

                        // see if this field has any new links
                        if (field.ParentLinks != null && field.ParentLinks.Count > 0)
                        {
                            foreach (var link in field.ParentLinks)
                            {
                                // see if this is a new link
                                if (link.EntityLinkId == 0)
                                {
                                    // add this link to the current version
                                    field.ParentLinks.Add(link);
                                    // create a link change record
                                    LinkChange change = new LinkChange();
                                    change.RevisionId     = revision.RevisionId;
                                    change.EntityLink     = link;
                                    change.ChangeTypeCode = LinkChangeTypes.Add;
                                    _db.LinkChanges.Add(change);
                                }
                            }
                        }

                        if (field.ChildLinks != null && field.ChildLinks.Count > 0)
                        {
                            foreach (var link in field.ChildLinks)
                            {
                                // see if this is a new link
                                if (link.EntityLinkId == 0)
                                {
                                    // add this link to the current version
                                    field.ChildLinks.Add(link);
                                    // create a link change record
                                    LinkChange change = new LinkChange();
                                    change.RevisionId     = revision.RevisionId;
                                    change.EntityLink     = link;
                                    change.ChangeTypeCode = LinkChangeTypes.Add;
                                    _db.LinkChanges.Add(change);
                                }
                            }
                        }
                    }
                }
                else
                {
                    // this is a new field that needs to be added
                    current.EntityFields.Add(field);
                    // create a revision for this field
                    FieldChange fc = new FieldChange();
                    fc.FieldChangeTypeCode = FieldChangeTypes.Add;
                    fc.EntityField         = field;
                    fc.RevisionId          = revision.RevisionId;
                    _db.FieldChanges.Add(fc);
                }
            }
        }