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); } }
public override int GetHashCode() { return(GetType().GetHashCode() ^ EntityType.GetHashCode() ^ AbstractTypePrivilege.CalcIndex(Create, Read, Update, Delete, Execute)); }