コード例 #1
0
        protected void PostProcess(IPostProcessWriter writer)
        {
            ILinkedMap <String, IXmlPostProcessor> xmlPostProcessors = XmlPostProcessorRegistry.GetXmlPostProcessors();
            ILinkedMap <String, Object>            ppResults         = new LinkedHashMap <String, Object>((int)(xmlPostProcessors.Count / 0.75 + 1));

            foreach (Entry <String, IXmlPostProcessor> entry in xmlPostProcessors)
            {
                String            tagName          = entry.Key;
                IXmlPostProcessor xmlPostProcessor = entry.Value;
                Object            result           = xmlPostProcessor.ProcessWrite(writer);
                if (result != null)
                {
                    ppResults.Put(tagName, result);
                }
            }

            if (ppResults.Count == 0)
            {
                return;
            }

            String postProcessElement = XmlDictionary.PostProcessElement;

            writer.WriteStartElement(postProcessElement);
            foreach (Entry <String, Object> entry in ppResults)
            {
                String tagName = entry.Key;
                Object result  = entry.Value;

                writer.WriteOpenElement(tagName);
                writer.WriteObject(result);
                writer.WriteCloseElement(tagName);
            }
            writer.WriteCloseElement(postProcessElement);
        }
コード例 #2
0
ファイル: PrioMembersProvider.cs プロジェクト: vogelb/ambeth
        protected bool IsPrio2Member(IEntityMetaData rootMetaData, IEntityMetaData metaData, PrefetchPath[] prefetchPaths,
                                     ILinkedMap <Type, PrefetchPath[]> entityTypeToPrefetchSteps, Tuple2KeyHashMap <Type, PrefetchPath[], bool?> alreadyVisited,
                                     MergePrefetchPathsCache mergePrefetchPathsCache)
        {
            IEntityMetaDataProvider entityMetaDataProvider = this.entityMetaDataProvider;

            foreach (PrefetchPath prefetchPath in prefetchPaths)
            {
                if (!alreadyVisited.PutIfNotExists(prefetchPath.memberType, prefetchPath.children, true))
                {
                    continue;
                }
                PrefetchPath[] children = mergePrefetchPathsCache.MergePrefetchPaths(prefetchPath.memberType, prefetchPath.children, entityTypeToPrefetchSteps);
                if (children == null)
                {
                    continue;
                }
                IEntityMetaData childMetaData = entityMetaDataProvider.GetMetaData(prefetchPath.memberType);
                if (metaData == childMetaData)
                {
                    // prio1 case at a later stage
                    continue;
                }
                if (rootMetaData == childMetaData)
                {
                    // prio1 in a transitive manner (current stage)
                    return(true);
                }
                if (IsPrio2Member(rootMetaData, childMetaData, children, entityTypeToPrefetchSteps, alreadyVisited, mergePrefetchPathsCache))
                {
                    return(true);
                }
            }
            return(false);
        }
コード例 #3
0
ファイル: CacheHelper.cs プロジェクト: vogelb/ambeth
        protected void HandleObjects(Object objects, ILinkedMap <Type, PrefetchPath[]> entityTypeToPrefetchPath,
                                     AlreadyHandledSet alreadyHandledSet, IdentityLinkedMap <ICacheIntern, IISet <IObjRef> > cacheToOrisLoadedHistory,
                                     IdentityLinkedMap <ICacheIntern, IISet <IObjRelation> > cacheToOrelsLoadedHistory, IdentityLinkedMap <ICacheIntern, IISet <IObjRef> > cacheToOrisToLoad,
                                     IdentityLinkedMap <ICacheIntern, IMap <IObjRelation, Boolean> > cacheToOrelsToLoad, List <PrefetchCommand> loadItems)
        {
            if (objects is IEnumerable && !objects.GetType().Equals(typeof(String)))
            {
                foreach (Object item in (IEnumerable)objects)
                {
                    if (item == null)
                    {
                        continue;
                    }
                    HandleObjects(item, entityTypeToPrefetchPath, alreadyHandledSet, cacheToOrisLoadedHistory, cacheToOrelsLoadedHistory,
                                  cacheToOrisToLoad, cacheToOrelsToLoad, loadItems);
                }
                return;
            }
            PrefetchPath[] cachePaths = null;
            if (entityTypeToPrefetchPath != null)
            {
                IEntityMetaData metaData = EntityMetaDataProvider.GetMetaData(objects.GetType());

                cachePaths = entityTypeToPrefetchPath.Get(metaData.EntityType);

                if (cachePaths == null || cachePaths.Length == 0)
                {
                    return;
                }
            }
            EnsureInitializedRelationsIntern3(objects, cachePaths, entityTypeToPrefetchPath, cacheToOrisToLoad, cacheToOrelsToLoad, cacheToOrisLoadedHistory,
                                              cacheToOrelsLoadedHistory, alreadyHandledSet, loadItems);
        }
コード例 #4
0
ファイル: CacheHelper.cs プロジェクト: vogelb/ambeth
 public IPrefetchState EnsureInitializedRelations(Object objects, ILinkedMap <Type, PrefetchPath[]> entityTypeToPrefetchSteps)
 {
     if (objects == null || entityTypeToPrefetchSteps == null || entityTypeToPrefetchSteps.Count == 0)
     {
         return(null);
     }
     return(EnsureInitializedRelationsIntern(objects, entityTypeToPrefetchSteps));
 }
コード例 #5
0
        protected void UpdateAllEntityMetaDataWithLifecycleExtensions()
        {
            ILinkedMap <Type, IEntityMetaData> typeToMetaDataMap = GetExtensions();

            foreach (Entry <Type, IEntityMetaData> entry in typeToMetaDataMap)
            {
                UpdateEntityMetaDataWithLifecycleExtensions(entry.Value);
            }
        }
コード例 #6
0
ファイル: CacheHelper.cs プロジェクト: vogelb/ambeth
        protected IPrefetchState EnsureInitializedRelationsIntern2(Object objects, ILinkedMap <Type, PrefetchPath[]> entityTypeToPrefetchPath)
        {
            bool setCreated = false;

            try
            {
                AlreadyHandledSet alreadyHandledSet = alreadyHandledSetTL.Value;
                if (alreadyHandledSet == null)
                {
                    alreadyHandledSet         = new AlreadyHandledSet();
                    alreadyHandledSetTL.Value = alreadyHandledSet;
                    setCreated = true;
                }
                IEntityMetaDataProvider   entityMetaDataProvider    = this.EntityMetaDataProvider;
                ValueHolderContainerMixin valueHolderContainerMixin = this.ValueHolderContainerMixin;
                IdentityLinkedMap <ICacheIntern, IISet <IObjRef> >           cacheToOrisLoadedHistory  = new IdentityLinkedMap <ICacheIntern, IISet <IObjRef> >();
                IdentityLinkedMap <ICacheIntern, IISet <IObjRelation> >      cacheToOrelsLoadedHistory = new IdentityLinkedMap <ICacheIntern, IISet <IObjRelation> >();
                IdentityLinkedMap <ICacheIntern, IISet <IObjRef> >           cacheToOrisToLoad         = new IdentityLinkedMap <ICacheIntern, IISet <IObjRef> >();
                IdentityLinkedMap <ICacheIntern, IMap <IObjRelation, bool> > cacheToOrelsToLoad        = new IdentityLinkedMap <ICacheIntern, IMap <IObjRelation, bool> >();
                List <PrefetchCommand> loadItems = new List <PrefetchCommand>();

                HandleObjects(objects, entityTypeToPrefetchPath, alreadyHandledSet, cacheToOrisLoadedHistory, cacheToOrelsLoadedHistory, cacheToOrisToLoad,
                              cacheToOrelsToLoad, loadItems);
                // Remove all oris which have already been tried to load before
                if (cacheToOrisToLoad.Count == 0 && cacheToOrelsToLoad.Count == 0)
                {
                    // No ori remaining which makes sense to try to load
                    if (setCreated)
                    {
                        return(new PrefetchState(alreadyHandledSet));
                    }
                    return(null);
                }

                List <Object> hardRefList = new List <Object>();
                // Store hard-ref-list to global hard ref
                alreadyHandledSet.Put(hardRefList, null, true);

                ProcessPendingOrelsAndObjRefs(entityTypeToPrefetchPath, alreadyHandledSet, cacheToOrisLoadedHistory, cacheToOrelsLoadedHistory, cacheToOrisToLoad,
                                              cacheToOrelsToLoad, loadItems, hardRefList);
                // No ori remaining which makes sense to try to load
                if (setCreated)
                {
                    return(new PrefetchState(alreadyHandledSet));
                }
                return(null);
            }
            finally
            {
                if (setCreated)
                {
                    alreadyHandledSetTL.Value = null;
                }
            }
        }
コード例 #7
0
ファイル: CacheHelper.cs プロジェクト: vogelb/ambeth
 protected IPrefetchState EnsureInitializedRelationsIntern(Object objects, ILinkedMap <Type, PrefetchPath[]> entityTypeToPrefetchPaths)
 {
     if (objects == null)
     {
         return(null);
     }
     if (!LazyTransactionActive || Transaction == null || Transaction.Active)
     {
         return(EnsureInitializedRelationsIntern2(objects, entityTypeToPrefetchPaths));
     }
     return(Transaction.RunInLazyTransaction(delegate()
     {
         return EnsureInitializedRelationsIntern2(objects, entityTypeToPrefetchPaths);
     }));
 }
コード例 #8
0
        public Attribute[] GetAnnotations()
        {
            ILinkedMap <Type, Attribute[]> annotations = this.annotations;

            if (annotations == null)
            {
                return(EMPTY_ANNOTATIONS);
            }
            List <Attribute> allAnnotations = new List <Attribute>();

            foreach (Entry <Type, Attribute[]> entry in annotations)
            {
                allAnnotations.AddRange(entry.Value);
            }
            return(allAnnotations.ToArray());
        }
コード例 #9
0
        protected virtual IList <ICommandContainer> GetOrderedCommandContainers()
        {
            ILinkedMap <CommandKey, ICommandContainer> containers = keyToCommandContainer.GetExtensions();
            List <CommandKey> orderedKeys = new List <CommandKey>(containers.KeySet());

            orderedKeys.Sort();

            IList <ICommandContainer> containerList = new List <ICommandContainer>();

            foreach (CommandKey commandKey in orderedKeys)
            {
                containerList.Add(containers.Get(commandKey));
            }
            // Now the result must be ordered corresponding to the command priorities:
            //IOrderedEnumerable<ICommandContainer> result = containerList.OrderBy(commandContainer => (commandContainer as ICommandContainer).Priority);
            return(containerList);
        }
コード例 #10
0
ファイル: CacheHelper.cs プロジェクト: vogelb/ambeth
        protected void LoadAndAddOrels(ILinkedMap <ICacheIntern, IMap <IObjRelation, bool> > cacheToOrelsToLoad, IList <Object> hardRefList,
                                       IMap <ICacheIntern, IISet <IObjRelation> > cacheToOrelsLoadedHistory, ILinkedMap <ICacheIntern, IISet <IObjRef> > cacheToOrisToLoad,
                                       IdentityLinkedSet <Member> prioMembers)
        {
            Iterator <Entry <ICacheIntern, IMap <IObjRelation, bool> > > iter = cacheToOrelsToLoad.Iterator();

            while (iter.MoveNext())
            {
                Entry <ICacheIntern, IMap <IObjRelation, bool> > entry = iter.Current;
                ICacheIntern cache = entry.Key;
                IMap <IObjRelation, bool> orelsToLoad = entry.Value;

                LoadAndAddOrels(cache, orelsToLoad, hardRefList, cacheToOrelsLoadedHistory, cacheToOrisToLoad, prioMembers);
                if (orelsToLoad.Count == 0)
                {
                    iter.Remove();
                }
            }
        }
コード例 #11
0
        public void PutAnnotations(ICustomAttributeProvider obj)
        {
            if (obj is MethodInfo)
            {
                MethodInfo m          = (MethodInfo)obj;
                Type[]     parameters = new Type[m.GetParameters().Length];
                for (int a = m.GetParameters().Length; a-- > 0;)
                {
                    parameters[a] = m.GetParameters()[a].ParameterType;
                }
                Type       baseType         = m.DeclaringType.BaseType;
                MethodInfo overriddenMethod = baseType != null?ReflectUtil.GetDeclaredMethod(true, baseType, m.ReturnType, m.Name, parameters) : null;

                if (overriddenMethod != null)
                {
                    PutAnnotations(overriddenMethod);
                }
            }
            Object[] annotations = obj.GetCustomAttributes(true);
            foreach (Object anno in annotations)
            {
                Attribute annotation = (Attribute)anno;
                AttributeUsageAttribute attributeUsage = AnnotationUtil.GetAnnotation <AttributeUsageAttribute>(annotation.GetType(), true);
                Type type = annotation.GetType();
                if (this.annotations == null)
                {
                    this.annotations = new LinkedHashMap <Type, Attribute[]>();
                }
                Attribute[] existingAttributes = this.annotations.Get(type);
                if (existingAttributes == null)
                {
                    existingAttributes = new Attribute[0];
                }
                Attribute[] newAttributes = new Attribute[existingAttributes.Length + 1];
                Array.Copy(existingAttributes, newAttributes, existingAttributes.Length);
                newAttributes[existingAttributes.Length] = annotation;
                this.annotations.Put(type, newAttributes);
            }
        }
コード例 #12
0
ファイル: CacheHelper.cs プロジェクト: vogelb/ambeth
        protected void ProcessPendingOrelsAndObjRefs(ILinkedMap <Type, PrefetchPath[]> entityTypeToPrefetchPath,
                                                     AlreadyHandledSet alreadyHandledSet, IdentityLinkedMap <ICacheIntern, IISet <IObjRef> > cacheToOrisLoadedHistory,
                                                     IdentityLinkedMap <ICacheIntern, IISet <IObjRelation> > cacheToOrelsLoadedHistory, IdentityLinkedMap <ICacheIntern, IISet <IObjRef> > cacheToOrisToLoad,
                                                     IdentityLinkedMap <ICacheIntern, IMap <IObjRelation, bool> > cacheToOrelsToLoad, List <PrefetchCommand> pendingPrefetchCommands,
                                                     List <Object> hardRefList)
        {
            // all relation members where at least one instance of the owning entity type needs a prefetch on this member in the immediate next step
            MergePrefetchPathsCache mergePrefetchPathsCache = new MergePrefetchPathsCache(EntityMetaDataProvider);

            IdentityLinkedSet <Member> prioMembers = PrioMembersProvider.GetPrioMembers(entityTypeToPrefetchPath, pendingPrefetchCommands, mergePrefetchPathsCache);

            LoadAndAddOrels(cacheToOrelsToLoad, hardRefList, cacheToOrelsLoadedHistory, cacheToOrisToLoad, prioMembers);
            LoadAndAddOris(cacheToOrisToLoad, hardRefList, cacheToOrisLoadedHistory);

            while (pendingPrefetchCommands.Count > 0)
            {
                PrefetchCommand[] currentPrefetchCommands = pendingPrefetchCommands.ToArray();
                // Clear the items to be ready for cascaded items in new batch recursion step
                pendingPrefetchCommands.Clear();
                if (prioMembers.Count > 0)
                {
                    for (int a = 0, size = currentPrefetchCommands.Length; a < size; a++)
                    {
                        PrefetchCommand      prefetchCommand = currentPrefetchCommands[a];
                        DirectValueHolderRef valueHolder     = prefetchCommand.valueHolder;
                        if (!prioMembers.Contains(valueHolder.Member))
                        {
                            currentPrefetchCommands[a] = null;
                            pendingPrefetchCommands.Add(prefetchCommand);
                        }
                    }
                }
                GuiThreadHelper.InvokeInGuiAndWait(delegate()
                {
                    ICacheModification cacheModification = CacheModification;
                    ValueHolderContainerMixin valueHolderContainerMixin = ValueHolderContainerMixin;
                    bool oldActive = cacheModification.Active;
                    if (!oldActive)
                    {
                        cacheModification.Active = true;
                    }
                    try
                    {
                        foreach (PrefetchCommand prefetchCommand in currentPrefetchCommands)
                        {
                            if (prefetchCommand == null)
                            {
                                continue;
                            }
                            DirectValueHolderRef valueHolder = prefetchCommand.valueHolder;
                            PrefetchPath[] cachePaths        = prefetchCommand.prefetchPaths;

                            RelationMember member = valueHolder.Member;
                            // Merge the root prefetch path with the relative prefetch path
                            cachePaths = mergePrefetchPathsCache.MergePrefetchPaths(member.ElementType, cachePaths, entityTypeToPrefetchPath);

                            IObjRefContainer vhc = valueHolder.Vhc;
                            ICacheIntern targetCache;
                            bool doSetValue = false;
                            if (valueHolder is IndirectValueHolderRef)
                            {
                                IndirectValueHolderRef valueHolderKey = (IndirectValueHolderRef)valueHolder;
                                targetCache = valueHolderKey.RootCache;
                            }
                            else
                            {
                                targetCache = ((IValueHolderContainer)vhc).__TargetCache;
                                doSetValue  = true;
                            }
                            int relationIndex = vhc.Get__EntityMetaData().GetIndexByRelation(member);
                            IObjRef[] objRefs = vhc.Get__ObjRefs(relationIndex);
                            Object obj        = valueHolderContainerMixin.GetValue(vhc, relationIndex, member, targetCache, objRefs, CacheDirective.FailEarly);
                            if (doSetValue && obj != null)
                            {
                                member.SetValue(vhc, obj);
                            }
                            EnsureInitializedRelationsIntern3(obj, cachePaths, entityTypeToPrefetchPath, cacheToOrisToLoad, cacheToOrelsToLoad, cacheToOrisLoadedHistory,
                                                              cacheToOrelsLoadedHistory, alreadyHandledSet, pendingPrefetchCommands);
                        }
                    }
                    finally
                    {
                        if (!oldActive)
                        {
                            cacheModification.Active = false;
                        }
                    }
                });
                // Remove all oris which have already been tried to load before
                if (cacheToOrisToLoad.Count == 0 && cacheToOrelsToLoad.Count == 0 && pendingPrefetchCommands.Count == 0)
                {
                    return;
                }
                prioMembers = PrioMembersProvider.GetPrioMembers(entityTypeToPrefetchPath, pendingPrefetchCommands, mergePrefetchPathsCache);
                LoadAndAddOrels(cacheToOrelsToLoad, hardRefList, cacheToOrelsLoadedHistory, cacheToOrisToLoad, prioMembers);
                LoadAndAddOris(cacheToOrisToLoad, hardRefList, cacheToOrisLoadedHistory);
            }
        }
コード例 #13
0
ファイル: PrioMembersProvider.cs プロジェクト: vogelb/ambeth
        public IdentityLinkedSet <Member> GetPrioMembers(ILinkedMap <Type, PrefetchPath[]> entityTypeToPrefetchPath,
                                                         List <PrefetchCommand> pendingPrefetchCommands, MergePrefetchPathsCache mergePrefetchPathsCache)
        {
            IdentityLinkedSet <Member> key1 = new IdentityLinkedSet <Member>();
            PrioMembersKey             key  = new PrioMembersKey(entityTypeToPrefetchPath, key1);

            for (int a = 0, size = pendingPrefetchCommands.Count; a < size; a++)
            {
                PrefetchCommand prefetchCommand = pendingPrefetchCommands[a];
                key1.Add(prefetchCommand.valueHolder.Member);
            }
            IdentityLinkedSet <Member> prioMembersMap = activeMembersToPrioMembersMap.Get(key);

            if (prioMembersMap != null)
            {
                return(prioMembersMap);
            }
            prioMembersMap = new IdentityLinkedSet <Member>(0.5f);
            Tuple2KeyHashMap <Type, PrefetchPath[], bool?> alreadyVisited = null;
            IdentityHashSet <Type> touchedTypesInPriority = null;

            if (mergePrefetchPathsCache == null)
            {
                mergePrefetchPathsCache = new MergePrefetchPathsCache(entityMetaDataProvider);
            }
            bool prio2Mode = true;

            foreach (PrefetchCommand prefetchCommand in pendingPrefetchCommands)
            {
                DirectValueHolderRef valueHolder   = prefetchCommand.valueHolder;
                PrefetchPath[]       prefetchPaths = prefetchCommand.prefetchPaths;
                RelationMember       member        = valueHolder.Member;

                Type targetEntityType = member.ElementType;
                // Merge the root prefetch path with the relative prefetch path
                prefetchPaths = mergePrefetchPathsCache.MergePrefetchPaths(targetEntityType, prefetchPaths, entityTypeToPrefetchPath);

                IEntityMetaData metaData = valueHolder.Vhc.Get__EntityMetaData();

                if (targetEntityType.Equals(metaData.EntityType))
                {
                    // prio1 overrides prio2
                    if (prio2Mode)
                    {
                        prio2Mode      = false;
                        alreadyVisited = null;
                        prioMembersMap.Clear();
                        if (touchedTypesInPriority != null)
                        {
                            touchedTypesInPriority.Clear();
                        }
                    }
                    prioMembersMap.Add(member);
                    if (touchedTypesInPriority == null)
                    {
                        touchedTypesInPriority = new IdentityHashSet <Type>();
                    }
                    touchedTypesInPriority.Add(member.EntityType);
                    touchedTypesInPriority.Add(targetEntityType);
                    continue;
                }
                if (prefetchPaths == null || !prio2Mode)
                {
                    continue;
                }
                if (alreadyVisited == null)
                {
                    alreadyVisited = new Tuple2KeyHashMap <Type, PrefetchPath[], bool?>();
                }
                if (IsPrio2Member(metaData, entityMetaDataProvider.GetMetaData(targetEntityType), prefetchPaths, entityTypeToPrefetchPath, alreadyVisited,
                                  mergePrefetchPathsCache))
                {
                    prioMembersMap.Add(member);
                    if (touchedTypesInPriority == null)
                    {
                        touchedTypesInPriority = new IdentityHashSet <Type>();
                    }
                    touchedTypesInPriority.Add(member.EntityType);
                    touchedTypesInPriority.Add(targetEntityType);
                }
            }
            if (prioMembersMap.Count > 0)
            {
                // check for out-of-order members which have nothing to do (and will never ever have in a transitive manner) with the priorized members
                foreach (PrefetchCommand prefetchCommand in pendingPrefetchCommands)
                {
                    DirectValueHolderRef valueHolder = prefetchCommand.valueHolder;
                    RelationMember       member      = valueHolder.Member;

                    if (prioMembersMap.Contains(member))
                    {
                        // already priorized
                        continue;
                    }
                    if (touchedTypesInPriority.Contains(member.EntityType) || touchedTypesInPriority.Contains(member.ElementType))
                    {
                        continue;
                    }
                    prioMembersMap.Add(member);
                }
            }
            Object writeLock = activeMembersToPrioMembersMap.GetWriteLock();

            lock (writeLock)
            {
                IdentityLinkedSet <Member> existingPrioMembersMap = activeMembersToPrioMembersMap.Get(key);
                if (existingPrioMembersMap != null)
                {
                    return(existingPrioMembersMap);
                }
                activeMembersToPrioMembersMap.Put(key, prioMembersMap);
                return(prioMembersMap);
            }
        }
コード例 #14
0
ファイル: CUDResultHelper.cs プロジェクト: vogelb/ambeth
        public ICUDResult CreateCUDResult(MergeHandle mergeHandle)
        {
            ILinkedMap <Type, ICUDResultExtension> typeToCudResultExtension = extensions.GetExtensions();

            foreach (Entry <Type, ICUDResultExtension> entry in typeToCudResultExtension)
            {
                entry.Value.Extend(mergeHandle);
            }

            IdentityLinkedMap <Object, IList <IUpdateItem> > objToModDict = mergeHandle.objToModDict;
            IdentityHashSet <Object> objToDeleteSet = mergeHandle.objToDeleteSet;

            HashMap <Type, IPrimitiveUpdateItem[]> entityTypeToFullPuis = new HashMap <Type, IPrimitiveUpdateItem[]>();
            HashMap <Type, IRelationUpdateItem[]>  entityTypeToFullRuis = new HashMap <Type, IRelationUpdateItem[]>();

            List <IChangeContainer> allChanges   = new List <IChangeContainer>(objToModDict.Count);
            List <Object>           originalRefs = new List <Object>(objToModDict.Count);

            foreach (Object objToDelete in objToDeleteSet)
            {
                IObjRef         ori             = OriHelper.GetCreateObjRef(objToDelete, mergeHandle);
                DeleteContainer deleteContainer = new DeleteContainer();
                deleteContainer.Reference = ori;
                allChanges.Add(deleteContainer);
                originalRefs.Add(objToDelete);
            }
            IEntityMetaDataProvider entityMetaDataProvider = this.EntityMetaDataProvider;

            foreach (Entry <Object, IList <IUpdateItem> > entry in objToModDict)
            {
                Object obj = entry.Key;
                IList <IUpdateItem> modItems = entry.Value;

                IEntityMetaData metaData = entityMetaDataProvider.GetMetaData(obj.GetType());

                IPrimitiveUpdateItem[] fullPuis = GetEnsureFullPUIs(metaData, entityTypeToFullPuis);
                IRelationUpdateItem[]  fullRuis = GetEnsureFullRUIs(metaData, entityTypeToFullRuis);

                int puiCount = 0, ruiCount = 0;
                for (int a = modItems.Count; a-- > 0;)
                {
                    IUpdateItem modItem = modItems[a];

                    Member member = metaData.GetMemberByName(modItem.MemberName);

                    if (modItem is IRelationUpdateItem)
                    {
                        fullRuis[metaData.GetIndexByRelation(member)] = (IRelationUpdateItem)modItem;
                        ruiCount++;
                    }
                    else
                    {
                        fullPuis[metaData.GetIndexByPrimitive(member)] = (IPrimitiveUpdateItem)modItem;
                        puiCount++;
                    }
                }

                IRelationUpdateItem[]  ruis = CompactRUIs(fullRuis, ruiCount);
                IPrimitiveUpdateItem[] puis = CompactPUIs(fullPuis, puiCount);
                IObjRef ori = OriHelper.GetCreateObjRef(obj, mergeHandle);
                originalRefs.Add(obj);

                if (ori is IDirectObjRef)
                {
                    CreateContainer createContainer = new CreateContainer();

                    ((IDirectObjRef)ori).CreateContainerIndex = allChanges.Count;

                    createContainer.Reference  = ori;
                    createContainer.Primitives = puis;
                    createContainer.Relations  = ruis;

                    allChanges.Add(createContainer);
                }
                else
                {
                    UpdateContainer updateContainer = new UpdateContainer();
                    updateContainer.Reference  = ori;
                    updateContainer.Primitives = puis;
                    updateContainer.Relations  = ruis;
                    allChanges.Add(updateContainer);
                }
            }
            return(new CUDResult(allChanges, originalRefs));
        }
コード例 #15
0
 public PrioMembersKey(ILinkedMap <Type, PrefetchPath[]> referent, IdentityLinkedSet <Member> key1) : base(referent)
 {
     this.key1 = key1;
 }
コード例 #16
0
        protected IList <IEntityMetaData> GetMetaData(IList <Type> entityTypes, bool askRemoteOnMiss)
        {
            List <IEntityMetaData> result             = new List <IEntityMetaData>(entityTypes.Count);
            IList <Type>           missingEntityTypes = null;

            for (int a = entityTypes.Count; a-- > 0;)
            {
                Type            entityType   = entityTypes[a];
                IEntityMetaData metaDataItem = GetExtension(entityType);
                if (Object.ReferenceEquals(metaDataItem, alreadyHandled))
                {
                    metaDataItem = GetExtensionHardKey(entityType);
                    if (metaDataItem == null && askRemoteOnMiss)
                    {
                        if (missingEntityTypes == null)
                        {
                            missingEntityTypes = new List <Type>();
                        }
                        missingEntityTypes.Add(entityType);
                    }
                    continue;
                }
                if (metaDataItem == null)
                {
                    if (askRemoteOnMiss)
                    {
                        if (missingEntityTypes == null)
                        {
                            missingEntityTypes = new List <Type>();
                        }
                        missingEntityTypes.Add(entityType);
                    }
                    continue;
                }
                result.Add(metaDataItem);
            }
            if (missingEntityTypes == null || RemoteEntityMetaDataProvider == null)
            {
                return(result);
            }
            bool handlePendingMetaData = false;

            try
            {
                ClassExtendableContainer <IEntityMetaData> pendingToRefreshMetaDatas = pendingToRefreshMetaDatasTL.Value;
                if (pendingToRefreshMetaDatas == null)
                {
                    pendingToRefreshMetaDatas         = new ClassExtendableContainer <IEntityMetaData>("metaData", "entityType");
                    pendingToRefreshMetaDatasTL.Value = pendingToRefreshMetaDatas;
                    handlePendingMetaData             = true;
                }
                while (missingEntityTypes != null && missingEntityTypes.Count > 0)
                {
                    IList <IEntityMetaData> loadedMetaData = RemoteEntityMetaDataProvider.GetMetaData(missingEntityTypes);

                    IList <Type> cascadeMissingEntityTypes = AddLoadedMetaData(missingEntityTypes, loadedMetaData);

                    if (cascadeMissingEntityTypes != null && cascadeMissingEntityTypes.Count > 0)
                    {
                        missingEntityTypes = cascadeMissingEntityTypes;
                    }
                    else
                    {
                        missingEntityTypes.Clear();
                    }
                }
                if (handlePendingMetaData)
                {
                    ILinkedMap <Type, IEntityMetaData> extensions = pendingToRefreshMetaDatas.GetExtensions();
                    foreach (Entry <Type, IEntityMetaData> entry in extensions)
                    {
                        IEntityMetaData metaData = entry.Value;
                        if (Object.ReferenceEquals(metaData, alreadyHandled))
                        {
                            continue;
                        }
                        RefreshMembers(metaData);
                    }
                    Object writeLock = GetWriteLock();
                    lock (writeLock)
                    {
                        foreach (Entry <Type, IEntityMetaData> entry in pendingToRefreshMetaDatas.GetExtensions())
                        {
                            Type            entityType       = entry.Key;
                            IEntityMetaData existingMetaData = GetExtensionHardKeyGlobalOnly(entityType);
                            if (existingMetaData != null && !Object.ReferenceEquals(existingMetaData, alreadyHandled))
                            {
                                // existing entry is already a valid non-null entry
                                continue;
                            }
                            IEntityMetaData ownMetaData = entry.Value;
                            if (Object.ReferenceEquals(existingMetaData, ownMetaData))
                            {
                                // existing entry is already a null-entry and our entry is a null-entry, too - so nothing to do
                                continue;
                            }
                            if (Object.ReferenceEquals(existingMetaData, alreadyHandled))
                            {
                                Unregister(alreadyHandled, entityType);
                            }
                            Register(ownMetaData, entityType);
                        }
                    }
                }
            }
            finally
            {
                if (handlePendingMetaData)
                {
                    pendingToRefreshMetaDatasTL.Value = null;
                }
            }
            return(GetMetaData(entityTypes, false));
        }
コード例 #17
0
ファイル: CacheHelper.cs プロジェクト: vogelb/ambeth
        protected void EnsureInitializedRelationsIntern3(Object obj, PrefetchPath[] cachePaths, ILinkedMap <Type, PrefetchPath[]> entityTypeToPrefetchPaths,
                                                         IMap <ICacheIntern, IISet <IObjRef> > cacheToOrisToLoad, IMap <ICacheIntern, IMap <IObjRelation, bool> > cacheToOrelsToLoad,
                                                         IMap <ICacheIntern, IISet <IObjRef> > cacheToOrisLoadedHistory, IMap <ICacheIntern, IISet <IObjRelation> > cacheToOrelsLoadedHistory,
                                                         AlreadyHandledSet alreadyHandledSet, IList <PrefetchCommand> cascadeLoadItems)
        {
            if (obj == null)
            {
                return;
            }
            if (!alreadyHandledSet.PutIfNotExists(obj, cachePaths, true))
            {
                return;
            }
            if (obj is IndirectValueHolderRef)
            {
                IndirectValueHolderRef vhk = (IndirectValueHolderRef)obj;
                HandleValueHolder(vhk, cachePaths, cacheToOrisToLoad, cacheToOrelsToLoad, cacheToOrisLoadedHistory, cacheToOrelsLoadedHistory,
                                  alreadyHandledSet, cascadeLoadItems);
                // Do nothing because this is only to prefetch RootCache entries
                return;
            }
            else if (obj is DirectValueHolderRef)
            {
                DirectValueHolderRef vhk = (DirectValueHolderRef)obj;
                if (!HandleValueHolder(vhk, cachePaths, cacheToOrisToLoad, cacheToOrelsToLoad, cacheToOrisLoadedHistory, cacheToOrelsLoadedHistory,
                                       alreadyHandledSet, cascadeLoadItems))
                {
                    return;
                }
                // force valueholder init. at this point we know that all related items are already in the cache. there will be no roundtrip
                // to the server
                if (vhk.Member == null)
                {
                    obj = vhk.Vhc;
                }
                else
                {
                    obj = vhk.Member.GetValue(vhk.Vhc);
                }
            }
            if (obj == null)
            {
                // this check is necessary because even if we create only instances of DirectValueHolderRef in cases where there is a not initalized relation
                // even then it might be possible that a concurrent thread initializes the valueholder to null (e.g. an empty to-one relation)
                return;
            }
            if ((cachePaths == null || cachePaths.Length == 0) && entityTypeToPrefetchPaths == null)
            {
                return;
            }
            if (obj is IEnumerable)
            {
                var items = new List <Object>();
                foreach (Object item in (IEnumerable)obj)
                {
                    if (item == null)
                    {
                        continue;
                    }
                    items.Add(item);
                }
                foreach (Object item in items)
                {
                    EnsureInitializedRelationsIntern3(item, cachePaths, entityTypeToPrefetchPaths, cacheToOrisToLoad, cacheToOrelsToLoad,
                                                      cacheToOrisLoadedHistory, cacheToOrelsLoadedHistory, alreadyHandledSet, cascadeLoadItems);
                }
                return;
            }
            IEntityMetaData metaData = ((IEntityMetaDataHolder)obj).Get__EntityMetaData();

            if (cachePaths == null || cachePaths.Length == 0)
            {
                if (entityTypeToPrefetchPaths != null)
                {
                    cachePaths = entityTypeToPrefetchPaths.Get(metaData.EntityType);
                }
                if (cachePaths == null || cachePaths.Length == 0)
                {
                    return;
                }
            }
            RelationMember[] relationMembers = metaData.RelationMembers;
            if (relationMembers.Length == 0)
            {
                return;
            }
            IValueHolderContainer vhc = (IValueHolderContainer)obj;

            for (int a = cachePaths.Length; a-- > 0;)
            {
                PrefetchPath path = cachePaths[a];

                int            relationIndex = path.memberIndex;
                RelationMember member        = relationMembers[relationIndex];

                if (ValueHolderState.INIT != vhc.Get__State(relationIndex))
                {
                    DirectValueHolderRef vhk = new DirectValueHolderRef(vhc, member);
                    EnsureInitializedRelationsIntern3(vhk, path.children, entityTypeToPrefetchPaths, cacheToOrisToLoad, cacheToOrelsToLoad, cacheToOrisLoadedHistory,
                                                      cacheToOrelsLoadedHistory, alreadyHandledSet, cascadeLoadItems);
                    continue;
                }
                Object memberValue = member.GetValue(obj);
                if (memberValue == null)
                {
                    continue;
                }
                EnsureInitializedRelationsIntern3(memberValue, path.children, entityTypeToPrefetchPaths, cacheToOrisToLoad, cacheToOrelsToLoad,
                                                  cacheToOrisLoadedHistory, cacheToOrelsLoadedHistory, alreadyHandledSet, cascadeLoadItems);
            }
        }
コード例 #18
0
ファイル: CacheHelper.cs プロジェクト: vogelb/ambeth
        protected void LoadAndAddOrels(ICacheIntern cache, IMap <IObjRelation, bool> orelsToLoad, IList <Object> hardRefList,
                                       IMap <ICacheIntern, IISet <IObjRelation> > cacheToOrelsLoadedHistory, ILinkedMap <ICacheIntern, IISet <IObjRef> > cacheToOrisToLoad,
                                       IdentityLinkedSet <Member> prioMembers)
        {
            IList <IObjRelation> objRelList;

            if (prioMembers.Count > 0)
            {
                objRelList = new List <IObjRelation>(orelsToLoad.Count);
                IEntityMetaDataProvider entityMetaDataProvider = this.EntityMetaDataProvider;
                foreach (Entry <IObjRelation, Boolean> entry in orelsToLoad)
                {
                    IObjRelation    objRel       = entry.Key;
                    IEntityMetaData metaData     = entityMetaDataProvider.GetMetaData(objRel.RealType);
                    RelationMember  memberByName = (RelationMember)metaData.GetMemberByName(objRel.MemberName);
                    if (!prioMembers.Contains(memberByName))
                    {
                        continue;
                    }
                    objRelList.Add(objRel);
                }
            }
            else
            {
                objRelList = orelsToLoad.KeyList();
            }
            IList <IObjRelationResult> objRelResults = cache.GetObjRelations(objRelList, cache, CacheDirective.ReturnMisses);

            IISet <IObjRef> orisToLoad = null;

            for (int a = 0, size = objRelResults.Count; a < size; a++)
            {
                IObjRelation       objRel       = objRelList[a];
                IObjRelationResult objRelResult = objRelResults[a];
                bool objRefsOnly = orelsToLoad.Remove(objRel);
                if (objRelResult == null)
                {
                    continue;
                }
                if (orelsToLoad.Get(objRel))
                {
                    // fetch only the objRefs, not the objects themselves
                    continue;
                }
                IObjRef[] relations = objRelResult.Relations;

                if (relations.Length == 0 || objRefsOnly)
                {
                    // fetch only the objRefs, not the objects themselves
                    continue;
                }
                if (orisToLoad == null)
                {
                    orisToLoad = cacheToOrisToLoad.Get(cache);
                    if (orisToLoad == null)
                    {
                        orisToLoad = new CHashSet <IObjRef>();
                        cacheToOrisToLoad.Put(cache, orisToLoad);
                    }
                }
                orisToLoad.AddAll(relations);
            }
            IISet <IObjRelation> orelsLoadedHistory = cacheToOrelsLoadedHistory.Get(cache);

            if (orelsLoadedHistory == null)
            {
                orelsLoadedHistory = new CHashSet <IObjRelation>();
                cacheToOrelsLoadedHistory.Put(cache, orelsLoadedHistory);
            }
            orelsLoadedHistory.AddAll(objRelList);
        }
コード例 #19
0
 public PrefetchHandle(ILinkedMap <Type, PrefetchPath[]> entityTypeToPrefetchSteps, ICachePathHelper cachePathHelper)
 {
     this.entityTypeToPrefetchSteps = entityTypeToPrefetchSteps;
     this.cachePathHelper           = cachePathHelper;
 }