예제 #1
0
        public virtual object BuildGenericCollectionInstance(CollectionObjectInfo coi, Type t)
        {
            Type   genericType   = t.GetGenericTypeDefinition();
            object newCollection = null;

            try
            {
                newCollection = System.Activator.CreateInstance(t);
            }
            catch (System.Exception e)
            {
                Console.WriteLine(e);
                throw new ODBRuntimeException(NeoDatisError.CollectionInstanciationError.AddParameter(coi.GetRealCollectionClassName()));
            }
            System.Collections.IEnumerator iterator = coi.GetCollection().GetEnumerator();
            AbstractObjectInfo             aoi      = null;
            MethodInfo method = t.GetMethod("Add");

            while (iterator.MoveNext())
            {
                aoi = (AbstractObjectInfo)iterator.Current;
                if (!aoi.IsDeletedObject())
                {
                    method.Invoke(newCollection, new object[] { BuildOneInstance(aoi) });
                }
            }
            return(newCollection);
        }
예제 #2
0
        public virtual object BuildNonGenericCollectionInstance(CollectionObjectInfo coi, Type t)
        {
            System.Collections.IList       newCollection = (System.Collections.IList)System.Activator.CreateInstance(classPool.GetClass(coi.GetRealCollectionClassName()));
            System.Collections.IEnumerator iterator      = coi.GetCollection().GetEnumerator();
            AbstractObjectInfo             aoi           = null;

            while (iterator.MoveNext())
            {
                aoi = (AbstractObjectInfo)iterator.Current;
                if (!aoi.IsDeletedObject())
                {
                    newCollection.Add(BuildOneInstance(aoi));
                }
            }
            return(newCollection);
        }
        /// <summary>
        /// Checks if something in the Collection has changed, if yes, stores the
        /// change
        /// </summary>
        /// <param name="nnoi1">
        /// The first Object meta representation (nnoi =
        /// NonNativeObjectInfo)
        /// </param>
        /// <param name="nnoi2">The second object meta representation</param>
        /// <param name="fieldIndex">The field index that this collection represents</param>
        /// <param name="coi1">
        /// The Meta representation of the collection 1 (coi =
        /// CollectionObjectInfo)
        /// </param>
        /// <param name="coi2">The Meta representation of the collection 2</param>
        /// <param name="objectRecursionLevel"></param>
        /// <returns>true if 2 collection representation are different</returns>
        private bool ManageCollectionChanges(NonNativeObjectInfo
                                             nnoi1, NonNativeObjectInfo nnoi2, int fieldId
                                             , CollectionObjectInfo coi1, CollectionObjectInfo
                                             coi2, int objectRecursionLevel)
        {
            ICollection <AbstractObjectInfo
                         > collection1 = coi1.GetCollection();
            ICollection <AbstractObjectInfo
                         > collection2 = coi2.GetCollection();

            if (collection1.Count != collection2.Count)
            {
                System.Text.StringBuilder buffer = new System.Text.StringBuilder();
                buffer.Append("Collection size has changed oldsize=").Append(collection1.Count).Append
                    ("/newsize=").Append(collection2.Count);
                StoreChangedObject(nnoi1, nnoi2, fieldId, coi1, coi2, buffer.ToString(), objectRecursionLevel
                                   );
                return(true);
            }
            System.Collections.IEnumerator iterator1 = collection1.GetEnumerator();
            System.Collections.IEnumerator iterator2 = collection2.GetEnumerator();
            AbstractObjectInfo             value1    = null;
            AbstractObjectInfo             value2    = null;
            int index = 0;

            while (iterator1.MoveNext())
            {
                iterator2.MoveNext();
                value1 = (AbstractObjectInfo)iterator1.Current;
                value2 = (AbstractObjectInfo)iterator2.Current;
                bool hasChanged = this.HasChanged(value1, value2, objectRecursionLevel);
                if (hasChanged)
                {
                    // We consider collection has changed only if object are
                    // different, If objects are the same instance, but something in
                    // the object has changed, then the collection has not
                    // changed,only the object
                    if (value1.IsNonNativeObject() && value2.IsNonNativeObject())
                    {
                        NonNativeObjectInfo nnoia = (NonNativeObjectInfo
                                                     )value1;
                        NonNativeObjectInfo nnoib = (NonNativeObjectInfo
                                                     )value2;
                        if (nnoia.GetOid() != null && !nnoia.GetOid().Equals(nnoi2.GetOid()))
                        {
                            // Objects are not the same instance -> the collection
                            // has changed
                            StoreChangedObject(nnoi1, nnoi2, fieldId, value1, value2, "List element index " +
                                               index + " has changed", objectRecursionLevel);
                        }
                    }
                    else
                    {
                        supportInPlaceUpdate = false;
                        nbChanges++;
                    }
                    //storeChangedObject(nnoi1, nnoi2, fieldId, value1, value2, "List element index " + index + " has changed", objectRecursionLevel);
                    return(true);
                }
                index++;
            }
            return(false);
        }