private RevisionTypeDesc MakeTypeDesc(EventType eventType, PropertyRevisionEnum propertyRevision)
        {
            EventPropertyGetter[] keyPropertyGetters = PropertyUtility.GetGetters(eventType, RevisionSpec.KeyPropertyNames);

            var len           = RevisionSpec.ChangesetPropertyNames.Length;
            var listOfGetters = new List <EventPropertyGetter>();
            var listOfIndexes = new List <int>();

            for (int i = 0; i < len; i++)
            {
                String propertyName        = RevisionSpec.ChangesetPropertyNames[i];
                EventPropertyGetter getter = null;

                if (propertyRevision != PropertyRevisionEnum.MERGE_EXISTS)
                {
                    getter = eventType.GetGetter(RevisionSpec.ChangesetPropertyNames[i]);
                }
                else
                {
                    // only declared properties may be used a dynamic properties to avoid confusion of properties suddenly appearing
                    foreach (String propertyNamesDeclared in eventType.PropertyNames)
                    {
                        if (propertyNamesDeclared == propertyName)
                        {
                            // use dynamic properties
                            getter = eventType.GetGetter(RevisionSpec.ChangesetPropertyNames[i] + "?");
                            break;
                        }
                    }
                }

                if (getter != null)
                {
                    listOfGetters.Add(getter);
                    listOfIndexes.Add(i);
                }
            }

            var changesetPropertyGetters = listOfGetters.ToArray();
            var changesetPropertyIndex   = new int[listOfIndexes.Count];

            for (int i = 0; i < listOfIndexes.Count; i++)
            {
                changesetPropertyIndex[i] = listOfIndexes[i];
            }

            return(new RevisionTypeDesc(keyPropertyGetters, changesetPropertyGetters, changesetPropertyIndex));
        }
예제 #2
0
 /// <summary>Ctor. </summary>
 /// <param name="propertyRevision">strategy to use</param>
 /// <param name="baseEventType">base type</param>
 /// <param name="deltaTypes">delta types</param>
 /// <param name="deltaNames">aliases of delta types</param>
 /// <param name="keyPropertyNames">names of key properties</param>
 /// <param name="changesetPropertyNames">names of properties that change</param>
 /// <param name="baseEventOnlyPropertyNames">properties only available on the base event</param>
 /// <param name="deltaTypesAddProperties">bool to indicate delta types add additional properties.</param>
 /// <param name="changesetPropertyDeltaContributed">flag for each property indicating whether its contributed only by a delta event</param>
 public RevisionSpec(PropertyRevisionEnum propertyRevision,
                     EventType baseEventType,
                     EventType[] deltaTypes,
                     String[] deltaNames,
                     String[] keyPropertyNames,
                     String[] changesetPropertyNames,
                     String[] baseEventOnlyPropertyNames,
                     bool deltaTypesAddProperties,
                     bool[] changesetPropertyDeltaContributed)
 {
     PropertyRevision                  = propertyRevision;
     BaseEventType                     = baseEventType;
     DeltaTypes                        = deltaTypes;
     DeltaNames                        = deltaNames;
     KeyPropertyNames                  = keyPropertyNames;
     ChangesetPropertyNames            = changesetPropertyNames;
     BaseEventOnlyPropertyNames        = baseEventOnlyPropertyNames;
     IsDeltaTypesAddProperties         = deltaTypesAddProperties;
     ChangesetPropertyDeltaContributed = changesetPropertyDeltaContributed;
 }