public IEntityTypePrivilegeFactory GetEntityTypePrivilegeFactory(Type entityType, bool?create, bool?read, bool?update, bool?delete,
                                                                         bool?execute)
        {
            if (BytecodeEnhancer == null)
            {
                return(ci);
            }
            int index = AbstractTypePrivilege.CalcIndex(create, read, update, delete, execute);

            IEntityTypePrivilegeFactory[] factories = typeToConstructorMap.Get(entityType);
            IEntityTypePrivilegeFactory   factory   = factories != null ? factories[index] : null;

            if (factory != null)
            {
                return(factory);
            }
            Object writeLock = this.writeLock;

            lock (writeLock)
            {
                // concurrent thread might have been faster
                factories = typeToConstructorMap.Get(entityType);
                factory   = factories != null ? factories[index] : null;
                if (factory != null)
                {
                    return(factory);
                }
                try
                {
                    Type enhancedType = BytecodeEnhancer.GetEnhancedType(typeof(AbstractTypePrivilege), new EntityTypePrivilegeEnhancementHint(entityType,
                                                                                                                                               create, read, update, delete, execute));

                    if (enhancedType == typeof(AbstractTypePrivilege))
                    {
                        // Nothing has been enhanced
                        factory = ci;
                    }
                    else
                    {
                        factory = AccessorTypeProvider.GetConstructorType <IEntityTypePrivilegeFactory>(enhancedType);
                    }
                }
                catch (Exception e)
                {
                    if (Log.WarnEnabled)
                    {
                        Log.Warn(e);
                    }
                    // something serious happened during enhancement: continue with a fallback
                    factory = ci;
                }
                if (factories == null)
                {
                    factories = new IEntityTypePrivilegeFactory[AbstractTypePrivilege.ArraySizeForIndex()];
                    typeToConstructorMap.Put(entityType, factories);
                }
                factories[index] = factory;
                return(factory);
            }
        }
Ejemplo n.º 2
0
 public override int GetHashCode()
 {
     return(GetType().GetHashCode() ^ EntityType.GetHashCode() ^ AbstractTypePrivilege.CalcIndex(Create, Read, Update, Delete, Execute));
 }