Beispiel #1
0
        protected RootCacheValueFactoryDelegate CreateDelegate(IEntityMetaData metaData)
        {
            RootCacheValueFactoryDelegate rootCacheValueFactory;
            Type enhancedType = null;

            try
            {
                enhancedType = BytecodeEnhancer.GetEnhancedType(typeof(RootCacheValue), new RootCacheValueEnhancementHint(metaData.EntityType));
                if (enhancedType == typeof(RootCacheValue))
                {
                    // Nothing has been enhanced
                    rootCacheValueFactory = rcvFactory;
                }
                else
                {
                    rootCacheValueFactory = AccessorTypeProvider.GetConstructorType <RootCacheValueFactoryDelegate>(enhancedType);
                }
            }
            catch (Exception e)
            {
                if (Log.WarnEnabled)
                {
                    Log.Warn(BytecodePrinter.ToPrintableBytecode(enhancedType), e);
                }
                // something serious happened during enhancement: continue with a fallback
                rootCacheValueFactory = rcvFactory;
            }
            typeToConstructorMap.Put(metaData, rootCacheValueFactory);
            return(rootCacheValueFactory);
        }
        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);
            }
        }
 /**
  * {@inheritDoc}
  */
 public Type GetImplementingType(Type keyType)
 {
     if (IsRegistered(keyType))
     {
         return(BytecodeEnhancer.GetEnhancedType(keyType, ImplementAbstractObjectEnhancementHint.INSTANCE));
     }
     throw new ArgumentException(keyType.FullName + " is not a registered type");
 }
Beispiel #4
0
        public Object CreateEmbeddedObject(Type embeddedType, Type entityType, Object parentObject, String memberPath)
        {
            Type enhancedEmbeddedType = BytecodeEnhancer.GetEnhancedType(embeddedType, new EmbeddedEnhancementHint(entityType, parentObject.GetType(),
                                                                                                                   memberPath));
            ConstructorInfo embeddedConstructor = GetEmbeddedParamConstructor(enhancedEmbeddedType, parentObject.GetType());

            Object[] constructorArgs = new Object[] { parentObject };
            return(embeddedConstructor.Invoke(constructorArgs));
        }
        public void RefreshMembers(IEntityMetaData metaData)
        {
            if (metaData.EnhancedType == null)
            {
                ((EntityMetaData)metaData).Initialize(CacheModification, EntityFactory);
                IEntityInstantiationExtension eie = entityInstantiationExtensions.GetExtension(metaData.EntityType);
                Type baseType = eie != null?eie.GetMappedEntityType(metaData.EntityType) : metaData.EntityType;

                ((EntityMetaData)metaData).EnhancedType = BytecodeEnhancer.GetEnhancedType(baseType, EntityEnhancementHint.Instance);
            }
            RelationMember[] relationMembers = metaData.RelationMembers;
            for (int a = relationMembers.Length; a-- > 0;)
            {
                relationMembers[a] = (RelationMember)RefreshMember(metaData, relationMembers[a]);
            }
            PrimitiveMember[] primitiveMembers = metaData.PrimitiveMembers;
            for (int a = primitiveMembers.Length; a-- > 0;)
            {
                primitiveMembers[a] = (PrimitiveMember)RefreshMember(metaData, primitiveMembers[a]);
            }

            HashMap <String, PrimitiveMember> nameToPrimitiveMember = new HashMap <String, PrimitiveMember>();

            for (int a = primitiveMembers.Length; a-- > 0;)
            {
                PrimitiveMember member = primitiveMembers[a];
                nameToPrimitiveMember.Put(member.Name, member);
            }
            PrimitiveMember[] alternateIdMembers = metaData.AlternateIdMembers;
            for (int a = alternateIdMembers.Length; a-- > 0;)
            {
                alternateIdMembers[a] = (PrimitiveMember)RefreshMember(metaData, alternateIdMembers[a]);
            }
            ((EntityMetaData)metaData).IdMember      = RefreshDefinedBy((PrimitiveMember)RefreshMember(metaData, metaData.IdMember), nameToPrimitiveMember);
            ((EntityMetaData)metaData).VersionMember = RefreshDefinedBy((PrimitiveMember)RefreshMember(metaData, metaData.VersionMember), nameToPrimitiveMember);

            ((EntityMetaData)metaData).UpdatedByMember = GetIfExists(metaData.UpdatedByMember, nameToPrimitiveMember);
            ((EntityMetaData)metaData).UpdatedOnMember = GetIfExists(metaData.UpdatedOnMember, nameToPrimitiveMember);
            ((EntityMetaData)metaData).CreatedByMember = GetIfExists(metaData.CreatedByMember, nameToPrimitiveMember);
            ((EntityMetaData)metaData).CreatedOnMember = GetIfExists(metaData.CreatedOnMember, nameToPrimitiveMember);

            for (int a = primitiveMembers.Length; a-- > 0;)
            {
                RefreshDefinedBy(primitiveMembers[a], nameToPrimitiveMember);
            }
            for (int a = alternateIdMembers.Length; a-- > 0;)
            {
                RefreshDefinedBy(alternateIdMembers[a], nameToPrimitiveMember);
            }
            UpdateEntityMetaDataWithLifecycleExtensions(metaData);
            ((EntityMetaData)metaData).Initialize(CacheModification, EntityFactory);
        }
Beispiel #6
0
        protected Type GetMemberTypeIntern(Type targetType, String propertyName, Type baseType)
        {
            String memberTypeName = targetType.Name + "$" + baseType.Name + "$" + propertyName.Replace('.', '$');

            //if (memberTypeName.StartsWith("java."))
            //{
            //    memberTypeName = "ambeth." + memberTypeName;
            //}
            if (baseType == typeof(RelationMember))
            {
                return(BytecodeEnhancer.GetEnhancedType(baseType, new RelationMemberEnhancementHint(targetType, propertyName)));
            }
            return(BytecodeEnhancer.GetEnhancedType(baseType, new MemberEnhancementHint(targetType, propertyName)));
        }
Beispiel #7
0
 protected IObjRefStoreFactory BuildDelegate(Type entityType, int idIndex)
 {
     lock (writeLock)
     {
         IObjRefStoreFactory objRefConstructorDelegate = constructorDelegateMap.Get(entityType, idIndex);
         if (objRefConstructorDelegate != null)
         {
             return(objRefConstructorDelegate);
         }
         Type enhancedType = BytecodeEnhancer.GetEnhancedType(typeof(ObjRefStore), new ObjRefStoreEnhancementHint(entityType, idIndex));
         objRefConstructorDelegate = AccessorTypeProvider.GetConstructorType <IObjRefStoreFactory>(enhancedType);
         constructorDelegateMap.Put(entityType, idIndex, objRefConstructorDelegate);
         return(objRefConstructorDelegate);
     }
 }
Beispiel #8
0
        public PrimitiveMember CreateCompositeIdMember(Type entityType, PrimitiveMember[] idMembers)
        {
            if (BytecodeEnhancer == null)
            {
                throw new NotSupportedException("No bytecodeEnhancer specified");
            }
            StringBuilder nameSB = new StringBuilder();

            // order does matter here
            for (int a = 0, size = idMembers.Length; a < size; a++)
            {
                String name = idMembers[a].Name;
                if (a > 0)
                {
                    nameSB.Append('&');
                }
                nameSB.Append(name);
            }
            Type compositeIdType = BytecodeEnhancer.GetEnhancedType(typeof(Object), new CompositeIdEnhancementHint(idMembers));

            return(new CompositeIdMember(entityType, compositeIdType, nameSB.ToString(), idMembers, MemberTypeProvider));
        }
Beispiel #9
0
 public override bool SupportsEnhancement(Type enhancementType)
 {
     return(BytecodeEnhancer.SupportsEnhancement(enhancementType));
 }
        public override IClassVisitor Extend(IClassVisitor visitor, IBytecodeBehaviorState state, IList <IBytecodeBehavior> remainingPendingBehaviors, IList <IBytecodeBehavior> cascadePendingBehaviors)
        {
            MemberEnhancementHint memberHint = state.GetContext <MemberEnhancementHint>();

            if (memberHint == null)
            {
                return(visitor);
            }
            RelationMemberEnhancementHint relationMemberHint = state.GetContext <RelationMemberEnhancementHint>();

            String[] memberNameSplit = EmbeddedMember.Split(memberHint.MemberName);
            if (memberNameSplit.Length == 1)
            {
                IPropertyInfo[] sPropertyPath = new IPropertyInfo[1];
                sPropertyPath[0] = PropertyInfoProvider.GetProperty(memberHint.DeclaringType, memberHint.MemberName);
                visitor          = new EntityMetaDataMemberVisitor(visitor, memberHint.DeclaringType, memberHint.DeclaringType, memberHint.MemberName,
                                                                   EntityMetaDataProvider, sPropertyPath);
                if (relationMemberHint != null)
                {
                    visitor = new EntityMetaDataRelationMemberVisitor(visitor, memberHint.DeclaringType, memberHint.MemberName, sPropertyPath);
                }
                else
                {
                    visitor = new EntityMetaDataPrimitiveMemberVisitor(visitor, memberHint.DeclaringType, memberHint.MemberName, sPropertyPath);
                }
                return(visitor);
            }
            Member[] members  = new Member[memberNameSplit.Length];
            Type     currType = memberHint.DeclaringType;

            IPropertyInfo[] propertyPath = new IPropertyInfo[members.Length];
            StringBuilder   sb           = new StringBuilder();

            for (int a = 0, size = memberNameSplit.Length; a < size; a++)
            {
                if (a + 1 < memberNameSplit.Length)
                {
                    members[a] = MemberTypeProvider.GetMember(currType, memberNameSplit[a]);
                }
                else if (relationMemberHint != null)
                {
                    members[a] = MemberTypeProvider.GetRelationMember(currType, memberNameSplit[a]);
                }
                else
                {
                    members[a] = MemberTypeProvider.GetPrimitiveMember(currType, memberNameSplit[a]);
                }
                if (a > 0)
                {
                    sb.Append('.');
                }
                sb.Append(members[a].Name);
                propertyPath[a] = PropertyInfoProvider.GetProperty(currType, memberNameSplit[a]);
                if (a + 1 < memberNameSplit.Length)
                {
                    currType = BytecodeEnhancer.GetEnhancedType(members[a].RealType,
                                                                new EmbeddedEnhancementHint(memberHint.DeclaringType, currType, sb.ToString()));
                }
                else
                {
                    currType = members[a].RealType;
                }
            }
            visitor = new EntityMetaDataMemberVisitor(visitor, memberHint.DeclaringType, memberHint.DeclaringType, memberHint.MemberName,
                                                      EntityMetaDataProvider, propertyPath);
            if (relationMemberHint != null)
            {
                visitor = new EntityMetaDataRelationMemberVisitor(visitor, memberHint.DeclaringType, memberHint.MemberName, propertyPath);
            }
            else
            {
                visitor = new EntityMetaDataPrimitiveMemberVisitor(visitor, memberHint.DeclaringType, memberHint.MemberName, propertyPath);
            }
            visitor = new EntityMetaDataEmbeddedMemberVisitor(visitor, memberHint.DeclaringType, memberHint.MemberName, members);
            return(visitor);
        }