/// <summary>
        /// Initializes a new instance of the <see cref="DefaultChangeTrackingDictionary"/> class.
        /// </summary>
        /// <param name="parent">The parent object, if any.</param>
        /// <param name="parentKey">The parent key, if any.</param>
        /// <param name="initialData">The initial dictionary state.</param>
        /// <param name="keyComparer">The key comparer to use.</param>
        public DefaultChangeTrackingDictionary(
            IChangeTrackable parent,
            string parentKey,
            IDictionary <string, object> initialData = null,
            IEqualityComparer <string> keyComparer   = null)
        {
            if (parent != null)
            {
                if (string.IsNullOrEmpty(parentKey))
                {
                    throw new ArgumentNullException(nameof(parent), $"Both {nameof(parent)} and {nameof(parentKey)} must be specified.");
                }

                _parent    = parent;
                _parentKey = parentKey;
            }

            _keyComparer = keyComparer ?? EqualityComparer <string> .Default;

            _initialData = initialData == null
                ? new Dictionary <string, object>(_keyComparer)
                : DeepCopy(initialData);

            Reset();
        }
Пример #2
0
        private void InternalAcceptChanges(IChangeTrackable changeTrackable)
        {
            if (changeTrackable == null)
            {
                return;
            }

            var type = changeTrackable.GetType();

            foreach (var propertyManagerInfo in _propertyManager.GetInfos(type))
            {
                AcceptChangeableValue(propertyManagerInfo, changeTrackable);
            }

            var hashCode = changeTrackable.GetHashCode();

            if (IsNew(changeTrackable))
            {
                _repository.Add(changeTrackable);
                _newChangeables.Remove(hashCode);
            }
            else if (IsChanged(changeTrackable))
            {
                _repository.Update(changeTrackable);
                _changedChangeables.Remove(hashCode);
            }
        }
Пример #3
0
 private void AcceptChangeableValue(IPropertyManagerInfo propertyManagerInfo, IChangeTrackable changeTrackable)
 {
     switch (propertyManagerInfo.InfoType)
     {
     case PropertyManagerInfoType.Reference: InternalAcceptChanges(propertyManagerInfo.GetReferenceValue <IChangeTrackable>(changeTrackable)); break;
         //TODOcase ChangeablePropertyInfoType.Association: ChangeableListUoW.InternalAcceptChanges(changeablePropertyInfo.GetAssociationValue(changeTrackable)); break;
     }
 }
        private ChangedRelationShip <TKey> BuildChangeRelationshipTemplate(IChangeTrackable <TKey> parent, PropertyInfo propertyInfo)
        {
            OwnershipActions ownershipActions = null;
            var key = new Tuple <Type, PropertyInfo>(parent.GetType(), propertyInfo);

            _ownerMappings.TryGetValue(key, out ownershipActions);
            return(new ChangedRelationShip <TKey>(parent, propertyInfo, ownershipActions));
        }
Пример #5
0
 public ChangedRelationShip <TKey> CloneFor(IChangeTrackable <TKey> value, ChangeType changeType)
 {
     return(new ChangedRelationShip <TKey>(Parent, Property, OwnershipActions)
     {
         ChangeType = changeType,
         Value = value
     });
 }
Пример #6
0
 private void CloseTransaction()
 {
     _rootTrackable = null;
     _changeables.Clear();
     _newChangeables.Clear();
     _deletedChangeables.Clear();
     _changedChangeables.Clear();
 }
        public IContent CreateContentVersion(ContentReference contentLink, DateTime versionDate, string data1, string data2, string data3)
        {
            ContextCache.Current["CurrentITransferContext"] = (object)this;
            ContextCache.Current["PageSaveDB:PageSaved"]    = (object)true;

            var content = _contentRepository.Get <IContent>(contentLink);


            var         saveAction = SaveAction.Publish | SaveAction.SkipValidation;
            var         command    = saveAction & SaveAction.ActionMask;
            SaveAction  action     = (content is IVersionable ? command : SaveAction.Default) | (SaveAction.ForceCurrentVersion | saveAction & SaveAction.SkipValidation);
            AccessLevel requiredDestinationAccess = AccessLevel.NoAccess;

            var contentData = content as ContentData;

            contentData = (ContentData)contentData.CreateWritableClone();

            IChangeTrackable changeTrackable = contentData as IChangeTrackable;

            changeTrackable.Saved               = versionDate;
            changeTrackable.Changed             = versionDate;
            changeTrackable.Created             = versionDate;
            changeTrackable.SetChangedOnPublish = true;

            IContent contentClone = (IContent)contentData;

            contentClone.ContentLink = contentLink.ToReferenceWithoutVersion();
            contentClone.ContentGuid = Guid.Empty;

            if (contentClone is EditorialBlock)
            {
                contentClone.Property["MainBody"].Value = new XhtmlString(data1);
            }
            else if (contentClone is StandardPage)
            {
                contentClone.Property["PageName"].Value        = data1;
                contentClone.Property["MetaDescription"].Value = data2;
                var contentArea  = new ContentArea();
                var contentLinks = data3.Split(new string[] { Environment.NewLine }, StringSplitOptions.RemoveEmptyEntries);
                foreach (var link in contentLinks)
                {
                    contentArea.Items.Add(new ContentAreaItem
                    {
                        ContentLink = new ContentReference(link)
                    });
                }
                contentClone.Property["MainContentArea"].Value = contentArea;
            }

            (contentClone as IVersionable).StartPublish = versionDate;

            SaveAction saveAction2      = (SaveAction.SkipValidation | SaveAction.Publish) & SaveAction.ActionMask;
            var        contentReference = _contentRepository.Save(contentClone, saveAction2, requiredDestinationAccess);

            return(content);
        }
Пример #8
0
 private void CheckDetached(IChangeTrackable changeTrackable)
 {
     if (changeTrackable == null)
     {
         throw new ArgumentNullException("changeTrackable");
     }
     if (_changeables.Contains(changeTrackable.GetHashCode()))
     {
         throw new ArgumentException("Instance already attached!");
     }
 }
        public void Change_Property_Should_Raise_PropertyChanged_On_ChangedProperties()
        {
            var order     = Helper.GetOrder();
            var trackable = order.AsTrackable();
            var monitor   = ((INotifyPropertyChanged)trackable).Monitor();

            trackable.CustomerNumber = "Test1";
            IChangeTrackable <Order> changeTrackable = trackable.CastToIChangeTrackable();

            monitor.Should().RaisePropertyChangeFor(ct => ct.CastToIChangeTrackable().ChangedProperties);
        }
 /// <summary>
 /// 添加
 /// </summary>
 /// <typeparam name="TObject">领域对象类型</typeparam>
 /// <param name="leftObj">左对象</param>
 /// <param name="rightObj">右对象</param>
 public void Add <TObject>(IChangeTrackable <TObject> leftObj, TObject rightObj) where TObject : IDomainObject
 {
     if (Equals(leftObj, null))
     {
         return;
     }
     if (Equals(rightObj, null))
     {
         return;
     }
     _changedValueCollection.AddRange(leftObj.GetChanges(rightObj));
 }
        public void Change_Property_Should_Raise_PropertyChanged_On_ChangeTrackingStatus_Event()
        {
            var order     = Helper.GetOrder();
            var trackable = order.AsTrackable();

            ((INotifyPropertyChanged)trackable).MonitorEvents();

            trackable.CustomerNumber = "Test1";
            IChangeTrackable <Order> changeTrackable = trackable.CastToIChangeTrackable();

            changeTrackable.ShouldRaisePropertyChangeFor(ct => ct.ChangeTrackingStatus);
        }
        public void Init(IChangeTrackable<IIdentificationModel> model) {
            this.CreateBinding(NameProperty, model.current, x => x.name);
            this.CreateBinding(LocationProperty, model.current, x => x.location);
            this.CreateBinding(DeviceIconUriProperty, model.current, x => x.iconUri); 
            this.CreateBinding(FirmwareProperty, model.current, x => x.firmware);
			//this.CreateBinding(AddressProperty, model.current, x => x.ip);//return session.deviceUri.Host;
			if (session != null && session.deviceUri != null)
				Address = session.deviceUri.Host;
			else {
				Address = model.current.ip;
			}
            this.CreateBinding(ManufacturerProperty, model.current, x => x.manufacturer);
            this.CreateBinding(DeviceModelProperty, model.current, x => x.model);
        }
Пример #13
0
 private ChangeState ChangeableState(IChangeTrackable changeTrackable)
 {
     if (!IsAttached(changeTrackable))
     {
         return(ChangeState.Unattached);
     }
     if (IsDeleted(changeTrackable))
     {
         return(ChangeState.Deleted);
     }
     if (IsNew(changeTrackable))
     {
         return(ChangeState.New);
     }
     return(IsChanged(changeTrackable) ? ChangeState.Changed : ChangeState.Unchanged);
 }
Пример #14
0
        private void InternalRollback(IChangeTrackable changeTrackable)
        {
            if (ChangeableState(changeTrackable) != ChangeState.Changed)
            {
                return;
            }

            var type = changeTrackable.GetType();

            foreach (var keyValuePair in _changedChangeables[changeTrackable.GetHashCode()].AllChanges)
            {
                _propertyManager.GetInfo(type, keyValuePair.Key).SetValue(changeTrackable, RollbackValidObject(keyValuePair.Value.OldValue));
            }

            InternalAcceptChanges(changeTrackable);
        }
Пример #15
0
    public override void OnInvocation(MethodInvocationEventArgs e)
    {
        if (e.Delegate.Method.ReturnParameter.ParameterType == typeof(void))
        {
            // we're in the setter
            IChangeTrackable target = e.Delegate.Target as IChangeTrackable;

            // Implement some logic to retrieve the current value of
            // the property
            if (currentValue != e.GetArgumentArray()[0])
            {
                target.Status = Status.Dirty;
            }
            base.OnInvocation(e);
        }
    }
Пример #16
0
        /// <summary>
        /// Attaches the specified changeTrackable.
        /// </summary>
        /// <param name="changeTrackable">The changeTrackable.</param>
        private void InternalAttach(IChangeTrackable changeTrackable)
        {
            if ((changeTrackable == null) || IsAttached(changeTrackable))
            {
                return;
            }

            foreach (var changeablePropertyInfo in _propertyManager.GetInfos(changeTrackable))
            {
                AttachChangeableValue(changeablePropertyInfo, changeTrackable);
            }

            changeTrackable.PropertyChanged += ChangeablePropertyChanged;

            _changeables.Add(changeTrackable.GetHashCode());
            _newChangeables.Add(changeTrackable.GetHashCode());
        }
Пример #17
0
 public void Init(IChangeTrackable <IIdentificationModel> model)
 {
     this.CreateBinding(NameProperty, model.current, x => x.name);
     this.CreateBinding(LocationProperty, model.current, x => x.location);
     this.CreateBinding(DeviceIconUriProperty, model.current, x => x.iconUri);
     this.CreateBinding(FirmwareProperty, model.current, x => x.firmware);
     //this.CreateBinding(AddressProperty, model.current, x => x.ip);//return session.deviceUri.Host;
     if (session != null && session.deviceUri != null)
     {
         Address = session.deviceUri.Host;
     }
     else
     {
         Address = model.current.ip;
     }
     this.CreateBinding(ManufacturerProperty, model.current, x => x.manufacturer);
     this.CreateBinding(DeviceModelProperty, model.current, x => x.model);
 }
Пример #18
0
        /// <summary>
        /// Builds result search information for IContent
        /// </summary>
        /// <param name="searchHit"></param>
        /// <returns></returns>
        protected virtual SearchResult CreateSearchResult(IHit <IContent> searchHit)
        {
            Validator.ThrowIfNull(nameof(searchHit), searchHit);

            // load the content from the given link
            var referenceString        = (searchHit.Fields["contentLink"] as JArray)?.FirstOrDefault();
            ContentReference reference = null;

            if (referenceString != null)
            {
                ContentReference.TryParse(referenceString.ToString(), out reference);
            }

            if (ContentReference.IsNullOrEmpty(reference))
            {
                throw new Exception("Unable to convert search hit to IContent!");
            }

            var              content        = _ContentRepository.Get <IContent>(reference);
            ILocalizable     localizable    = content as ILocalizable;
            IChangeTrackable changeTracking = content as IChangeTrackable;

            bool         onCurrentHost;
            SearchResult result = new SearchResult
                                  (
                GetEditUrl(content, out onCurrentHost),
                HttpUtility.HtmlEncode(content.Name),
                CreatePreviewText(content)
                                  );

            result.IconCssClass                = IconCssClass(content);
            result.Metadata["Id"]              = content.ContentLink.ToString();
            result.Metadata["LanguageBranch"]  = localizable == null || localizable.Language == null ? string.Empty : localizable.Language.Name;
            result.Metadata["ParentId"]        = content.ParentLink.ToString();
            result.Metadata["IsOnCurrentHost"] = onCurrentHost ? "true" : "false";
            result.Metadata["TypeIdentifier"]  = SearchProviderExtensions.GetTypeIdentifier(content, _UIDescriptorRegistry);
            ContentType contentType = _ContentTypeRepository.Load(content.ContentTypeID);

            CreateToolTip(content, changeTracking, result, contentType);
            result.Language = localizable == null || localizable.Language == null ? string.Empty : localizable.Language.NativeName;

            return(result);
        }
Пример #19
0
        public void StartTransaction(object rootItem)
        {
            if (rootItem == null)
            {
                throw new ArgumentNullException("rootItem");
            }
            if (!(rootItem is IChangeTrackable))
            {
                throw new InvalidOperationException("rootItem is not an " + typeof(IChangeTrackable).Name);
            }

            if (_rootTrackable != null)
            {
                throw new InvalidOperationException("Transaction already running");
            }

            _rootTrackable = (IChangeTrackable)rootItem;

            CheckDetached(_rootTrackable);
            InternalAttach(_rootTrackable);
        }
Пример #20
0
        public void Intercept(IInvocation invocation)
        {
            Match match = _setterRegex.Match(invocation.Method.Name);

            // we only want to intercept set calls
            if (!match.Success)
            {
                invocation.Proceed();
                return;
            }

            IChangeTrackable obj          = (IChangeTrackable)invocation.InvocationTarget;
            string           property     = match.Groups["property"].Value;
            MethodInfo       getterMethod = invocation.TargetType.GetMethod($"get_{property}");

            // get the old and new values
            object oldValue = getterMethod != null?getterMethod.Invoke(invocation.InvocationTarget, null) : "?";

            object newValue = invocation.Arguments[0];

            // check to see if something changed
            if (!AreEqual(oldValue, newValue))
            {
                if (obj.ChangedValues == null)
                {
                    obj.ChangedValues = new List <ChangedValue>();
                }

                obj.ChangedValues.Add(
                    new ChangedValue
                {
                    PropertyName = property,
                    OldValue     = oldValue,
                    NewValue     = newValue,
                    ChangedAt    = DateTime.Now
                });
            }

            invocation.Proceed();
        }
Пример #21
0
        private void CreateToolTip(IContent content, IChangeTrackable changeTracking, SearchResult result, ContentType contentType)
        {
            if (string.IsNullOrEmpty(ToolTipResourceKeyBase))
            {
                return;
            }

            result.ToolTipElements.Add(new ToolTipElement(LocalizationService.GetString(string.Format(CultureInfo.InvariantCulture, "{0}/id", new object[]
            {
                ToolTipResourceKeyBase
            })), content.ContentLink.ToString()));

            if (changeTracking != null)
            {
                result.ToolTipElements.Add(new ToolTipElement(LocalizationService.GetString(string.Format(CultureInfo.InvariantCulture, "{0}/changed", new object[]
                {
                    ToolTipResourceKeyBase
                })), changeTracking.Changed.ToString(CultureInfo.CurrentUICulture)));

                result.ToolTipElements.Add(new ToolTipElement(LocalizationService.GetString(string.Format(CultureInfo.InvariantCulture, "{0}/created", new object[]
                {
                    ToolTipResourceKeyBase
                })), changeTracking.Created.ToString(CultureInfo.CurrentUICulture)));
            }

            if (string.IsNullOrEmpty(ToolTipContentTypeNameResourceKey))
            {
                return;
            }

            result.ToolTipElements.Add
                (new ToolTipElement(LocalizationService.GetString(string.Format(CultureInfo.InvariantCulture, "{0}/{1}", new object[]
            {
                ToolTipResourceKeyBase,
                ToolTipContentTypeNameResourceKey
            })), contentType != null ? HttpUtility.HtmlEncode(contentType.LocalizedName) : string.Empty));
        }
Пример #22
0
 /// <summary>
 /// 添加变更
 /// </summary>
 /// <param name="objectBeforeChangeTrackable">对象变更前跟踪</param>
 /// <param name="objectAfterChange">变更后的对象</param>
 protected void AddChange <TDomainObject>(IChangeTrackable <TDomainObject> objectBeforeChangeTrackable,
                                          TDomainObject objectAfterChange) where TDomainObject : IDomainObject =>
 _changeTrackingContext.Add(objectBeforeChangeTrackable, objectAfterChange);
Пример #23
0
 private bool IsNew(IChangeTrackable changeTrackable)
 {
     return(_newChangeables.Contains(changeTrackable.GetHashCode()));
 }
 public static DateTime?SearchUpdateDate(this IChangeTrackable content)
 {
     ObjectExtensions.ValidateNotNullArgument((object)content, "content");
     return(new DateTime?(content.Changed));
 }
Пример #25
0
 public ChangedRelationShip(IChangeTrackable <TKey> parent, PropertyInfo property, OwnershipActions ownershipActions)
 {
     Parent           = parent;
     Property         = property;
     OwnershipActions = ownershipActions ?? new OwnershipActions();
 }
Пример #26
0
 private bool IsDeleted(IChangeTrackable changeTrackable)
 {
     return(_deletedChangeables.Contains(changeTrackable.GetHashCode()));
 }
Пример #27
0
 private bool IsAttached(IChangeTrackable changeTrackable)
 {
     return(_changeables.Contains(changeTrackable.GetHashCode()));
 }
Пример #28
0
 protected void AddChange(IChangeTrackable <TObject> objectBeforeChangeTrackable, TObject objectAfterChange)
 {
     _changeTrackingContext.Add(objectBeforeChangeTrackable, objectAfterChange);
 }
Пример #29
0
 private bool IsChanged(IChangeTrackable changeTrackable)
 {
     return(_changedChangeables.ContainsKey(changeTrackable.GetHashCode()));
 }