Ejemplo n.º 1
0
        public Type ExecutePendingBehaviors(Type currentContent, StringBuilder sw, IBytecodeBehavior[] pendingBehaviors,
                                            IList <IBytecodeBehavior> cascadePendingBehaviors)
        {
            IBytecodeBehaviorState state = BytecodeBehaviorState.State;
            Type content = BytecodeClassLoader.BuildTypeFromParent(state.NewType.ClassName, currentContent, sw, delegate(IClassVisitor cv)
            {
                IBytecodeBehavior[] currPendingBehaviors = pendingBehaviors;
                for (int a = 0; a < currPendingBehaviors.Length; a++)
                {
                    List <IBytecodeBehavior> remainingPendingBehaviors = new List <IBytecodeBehavior>();
                    for (int b = a + 1, sizeB = currPendingBehaviors.Length; b < sizeB; b++)
                    {
                        remainingPendingBehaviors.Add(currPendingBehaviors[b]);
                    }
                    IClassVisitor newCv  = currPendingBehaviors[a].Extend(cv, state, remainingPendingBehaviors, cascadePendingBehaviors);
                    currPendingBehaviors = remainingPendingBehaviors.ToArray();
                    a = -1;
                    if (newCv != null)
                    {
                        cv = newCv;
                    }
                }
                return(cv);
            });

            return(content);
        }
Ejemplo n.º 2
0
        public override IClassVisitor Extend(IClassVisitor visitor, IBytecodeBehaviorState state, IList <IBytecodeBehavior> remainingPendingBehaviors,
                                             IList <IBytecodeBehavior> cascadePendingBehaviors)
        {
            if (state.GetContext <EntityEnhancementHint>() == null && state.GetContext <EmbeddedEnhancementHint>() == null && state.GetContext <ImplementAbstractObjectEnhancementHint>() == null)
            {
                return(visitor);
            }
            ListUtil.AddAll(cascadePendingBehaviors, 0, remainingPendingBehaviors);
            remainingPendingBehaviors.Clear();

            HashMap <String, IPropertyInfo> allProperties = new HashMap <String, IPropertyInfo>();

            IPropertyInfo[] properties = PropertyInfoProvider.GetProperties(state.CurrentType);
            foreach (IPropertyInfo pi in properties)
            {
                allProperties.Put(pi.Name, pi);
            }
            properties = PropertyInfoProvider.GetProperties(state.OriginalType);
            foreach (IPropertyInfo pi in properties)
            {
                // Only add property if it is not already declared by the current type
                allProperties.PutIfNotExists(pi.Name, pi);
            }
            visitor = new DefaultPropertiesMethodVisitor(visitor, allProperties.ToArray());
            if (state.OriginalType.IsInterface)
            {
                visitor = new InterfaceAdder(visitor, state.OriginalType);
            }
            return(visitor);
        }
Ejemplo n.º 3
0
        public override IClassVisitor Extend(IClassVisitor visitor, IBytecodeBehaviorState state, IList <IBytecodeBehavior> remainingPendingBehaviors,
                                             IList <IBytecodeBehavior> cascadePendingBehaviors)
        {
            if (state.GetContext <EntityEnhancementHint>() == null && state.GetContext <EmbeddedEnhancementHint>() == null)
            {
                // ensure LazyRelationsBehavior was invoked
                return(visitor);
            }
            // DefaultPropertiesBehavior executes in this cascade
            IEntityMetaData metaData        = EntityMetaDataProvider.GetMetaData(EntityUtil.GetEntityType(state.Context));
            CascadeBehavior cascadeBehavior = BeanContext.RegisterBean <CascadeBehavior>().PropertyValue("MetaData", metaData).Finish();

            cascadePendingBehaviors.Add(cascadeBehavior);

            // // NotifyPropertyChangedBehavior executes in this cascade
            // Type currentType = state.getCurrentType();
            // if (!IPropertyChanged.class.isAssignableFrom(currentType))
            // {
            // if (!isAnnotationPresent(currentType, PropertyChangeAspect.class) && !isAnnotationPresent(currentType, DataObjectAspect.class))
            // {
            // // behavior not applied
            // return visitor;
            // }
            //
            // // add IPropertyChanged
            // visitor = new InterfaceAdder(visitor, Type.getInternalName(IPropertyChanged.class));
            // }
            //
            // IPropertyInfo[] propertyInfos = propertyInfoProvider.getProperties(currentType);
            // visitor = new NotifyPropertyChangedMethodVisitor(visitor, propertyInfos, objectCollector);
            // visitor = new PublicConstructorVisitor(visitor);
            return(visitor);
        }
Ejemplo n.º 4
0
        public virtual void InvokeSuperOf(MethodInfo method)
        {
            IBytecodeBehaviorState state       = BytecodeBehaviorState.State;
            MethodInfo             superMethod = ReflectUtil.GetDeclaredMethod(false, state.CurrentType, NewType.GetType(method.ReturnType), method.Name, TypeUtil.GetClassesToTypes(method.GetParameters()));

            InvokeSuper(new MethodInstance(superMethod));
        }
            public override IClassVisitor Extend(IClassVisitor visitor, IBytecodeBehaviorState state, IList <IBytecodeBehavior> remainingPendingBehaviors,
                                                 IList <IBytecodeBehavior> cascadePendingBehaviors)
            {
                // implement remaining properties and methods of abstractEntityType
                visitor = behavior.VisitType(visitor, state.CurrentType, cascadePendingBehaviors);

                return(visitor);
            }
Ejemplo n.º 6
0
        public static MethodInstance FindByTemplate(bool tryOnly, NewType returnType, String methodName, params NewType[] parameters)
        {
            IBytecodeBehaviorState state = BytecodeBehaviorState.State;

            foreach (MethodInstance methodOnNewType in state.GetAlreadyImplementedMethodsOnNewType())
            {
                if (!methodOnNewType.Name.Equals(methodName))
                {
                    continue;
                }
                NewType[] paramsOnNewType = methodOnNewType.Parameters;
                if (paramsOnNewType.Length != parameters.Length)
                {
                    continue;
                }
                bool paramsEqual = true;
                for (int a = paramsOnNewType.Length; a-- > 0;)
                {
                    if (!paramsOnNewType[a].Equals(parameters[a]))
                    {
                        paramsEqual = false;
                        break;
                    }
                }
                if (paramsEqual)
                {
                    return(methodOnNewType);
                }
                if (returnType == null || methodOnNewType.ReturnType.Equals(returnType))
                {
                    return(methodOnNewType);
                }
            }
            Type currType = state.CurrentType;

            if (!currType.IsInterface)
            {
                while (currType != null && currType != typeof(Object))
                {
                    MethodInfo method = ReflectUtil.GetDeclaredMethod(true, currType, returnType, methodName, parameters);
                    if (method != null)
                    {
                        if (method.Attributes.HasFlag(MethodAttributes.Abstract))
                        {
                            // Method found but it is abstract. So it is not a callable instance
                            break;
                        }
                        return(new MethodInstance(method));
                    }
                    currType = currType.BaseType;
                }
            }
            if (tryOnly)
            {
                return(null);
            }
            throw new Exception("No method found on class hierarchy: " + methodName + ". Start type: " + state.NewType);
        }
Ejemplo n.º 7
0
 public override IClassVisitor Extend(IClassVisitor visitor, IBytecodeBehaviorState state, IList <IBytecodeBehavior> remainingPendingBehaviors, IList <IBytecodeBehavior> cascadePendingBehaviors)
 {
     if (--sleepCount > 0)
     {
         cascadePendingBehaviors.Add(this);
         return(visitor);
     }
     return(waitForApplyBehaviorDelegate(visitor, state, remainingPendingBehaviors, cascadePendingBehaviors));
 }
Ejemplo n.º 8
0
 public IClassVisitor Extend(IClassVisitor visitor, IBytecodeBehaviorState state, IList <IBytecodeBehavior> remainingPendingBehaviors, IList <IBytecodeBehavior> cascadePendingBehaviors)
 {
     for (int a = 0, size = childBehaviors.Count; a < size; a++)
     {
         IBytecodeBehavior childBehavior = childBehaviors[a];
         visitor = childBehavior.Extend(visitor, state, remainingPendingBehaviors, cascadePendingBehaviors);
     }
     return(visitor);
 }
Ejemplo n.º 9
0
            public override IClassVisitor Extend(IClassVisitor visitor, IBytecodeBehaviorState state, IList <IBytecodeBehavior> remainingPendingBehaviors,
                                                 IList <IBytecodeBehavior> cascadePendingBehaviors)
            {
                // LazyRelationsBehavior executes in this cascade
                CascadeBehavior2 cascadeBehavior2 = BeanContext.RegisterBean <CascadeBehavior2>().PropertyValue("MetaData", MetaData).Finish();

                cascadePendingBehaviors.Add(cascadeBehavior2);
                return(visitor);
            }
Ejemplo n.º 10
0
 public override IClassVisitor Extend(IClassVisitor visitor, IBytecodeBehaviorState state, IList <IBytecodeBehavior> remainingPendingBehaviors,
                                      IList <IBytecodeBehavior> cascadePendingBehaviors)
 {
     if (state.GetContext <CompositeIdEnhancementHint>() == null)
     {
         return(visitor);
     }
     visitor = new CompositeIdCreator(visitor);
     return(visitor);
 }
Ejemplo n.º 11
0
 public override IClassVisitor Extend(IClassVisitor visitor, IBytecodeBehaviorState state, IList <IBytecodeBehavior> remainingPendingBehaviors,
                                      IList <IBytecodeBehavior> cascadePendingBehaviors)
 {
     if (state.GetContext <EntityEnhancementHint>() == null)
     {
         return(visitor);
     }
     visitor = new PublicConstructorVisitor(visitor);
     return(visitor);
 }
Ejemplo n.º 12
0
 public override IClassVisitor Extend(IClassVisitor visitor, IBytecodeBehaviorState state, IList <IBytecodeBehavior> remainingPendingBehaviors,
                                      IList <IBytecodeBehavior> cascadePendingBehaviors)
 {
     // NotifyPropertyChangedBehavior executes in this cascade
     // add IPropertyChanged
     visitor = new InterfaceAdder(visitor, typeof(INotifyPropertyChanged), typeof(INotifyPropertyChangedSource),
                                  typeof(IPropertyChangedEventHandler), typeof(INotifyCollectionChangedListener), typeof(IPropertyChangeConfigurable));
     visitor = BeanContext.RegisterWithLifecycle(new NotifyPropertyChangedClassVisitor(visitor, MetaData, null)).Finish();
     return(visitor);
 }
Ejemplo n.º 13
0
 public override IClassVisitor Extend(IClassVisitor visitor, IBytecodeBehaviorState state, IList <IBytecodeBehavior> remainingPendingBehaviors,
                                      IList <IBytecodeBehavior> cascadePendingBehaviors)
 {
     if (state.GetContext <EmbeddedEnhancementHint>() == null)
     {
         return(visitor);
     }
     visitor = new InterfaceAdder(visitor, typeof(IEmbeddedType));
     visitor = new EmbeddedTypeVisitor(visitor);
     return(visitor);
 }
            public override IClassVisitor Extend(IClassVisitor visitor, IBytecodeBehaviorState state, IList <IBytecodeBehavior> remainingPendingBehaviors,
                                                 IList <IBytecodeBehavior> cascadePendingBehaviors)
            {
                foreach (Type interfaceType in interfaceTypes)
                {
                    // implement interfaceType
                    visitor = behavior.VisitType(visitor, interfaceType, cascadePendingBehaviors);
                }
                cascadePendingBehaviors.Add(new InnerBehavior2(behavior));

                return(visitor);
            }
Ejemplo n.º 15
0
        public override IClassVisitor Extend(IClassVisitor visitor, IBytecodeBehaviorState state, IList <IBytecodeBehavior> remainingPendingBehaviors, IList <IBytecodeBehavior> cascadePendingBehaviors)
        {
            ObjRefEnhancementHint memberHint = state.GetContext <ObjRefEnhancementHint>();

            if (memberHint == null)
            {
                return(visitor);
            }
            IEntityMetaData metaData = EntityMetaDataProvider.GetMetaData(memberHint.EntityType);

            visitor = new ObjRefVisitor(visitor, metaData, memberHint.IdIndex);
            return(visitor);
        }
Ejemplo n.º 16
0
        public override IMethodVisitor VisitMethod(MethodAttributes access, String name, NewType returnType, params NewType[] parameters)
        {
            IBytecodeBehaviorState state = State;

            if (state != null)
            {
                MethodInstance method = new MethodInstance(state.NewType, access, returnType, name, parameters);
                ((BytecodeBehaviorState)state).MethodImplemented(method);
            }
            IMethodVisitor mv = base.VisitMethod(access, name, returnType, parameters);

            mv.VisitAnnotation(typeof(ByVisitor).GetConstructor(new Type[] { typeof(String) }), ExtractCallingVisitor("VisitMethod"));
            return(mv);
        }
Ejemplo n.º 17
0
        public override IClassVisitor Extend(IClassVisitor visitor, IBytecodeBehaviorState state, IList <IBytecodeBehavior> remainingPendingBehaviors, IList <IBytecodeBehavior> cascadePendingBehaviors)
        {
            Type entityType = EntityUtil.GetEntityType(state.Context);

            if (entityType == null)
            {
                return(visitor);
            }
            IEntityMetaData metaData   = EntityMetaDataProvider.GetMetaData(entityType);
            String          memberPath = EmbeddedEnhancementHint.GetMemberPath(state.Context);

            visitor = new InitializeEmbeddedMemberVisitor(visitor, metaData, memberPath, PropertyInfoProvider);
            return(visitor);
        }
Ejemplo n.º 18
0
        public override IClassVisitor Extend(IClassVisitor visitor, IBytecodeBehaviorState state, IList <IBytecodeBehavior> remainingPendingBehaviors,
                                             IList <IBytecodeBehavior> cascadePendingBehaviors)
        {
            CacheMapEntryEnhancementHint hint = state.GetContext <CacheMapEntryEnhancementHint>();

            if (hint == null)
            {
                return(visitor);
            }
            IEntityMetaData metaData = EntityMetaDataProvider.GetMetaData(hint.GetEntityType());

            visitor = new CacheMapEntryVisitor(visitor, metaData, hint.GetIdIndex());
            return(visitor);
        }
Ejemplo n.º 19
0
        protected void ImplementGetBaseType()
        {
            MethodInstance getBaseType = MethodInstance.FindByTemplate(template_m_getBaseType, true);

            if (getBaseType != null)
            {
                return;
            }
            IBytecodeBehaviorState state = State;
            IMethodVisitor         mg    = VisitMethod(template_m_getBaseType);

            mg.Push(state.OriginalType);
            mg.ReturnValue();
            mg.EndMethod();
        }
Ejemplo n.º 20
0
            public override IClassVisitor Extend(IClassVisitor visitor, IBytecodeBehaviorState state, IList <IBytecodeBehavior> remainingPendingBehaviors,
                                                 IList <IBytecodeBehavior> cascadePendingBehaviors)
            {
                ListUtil.AddAll(cascadePendingBehaviors, 0, remainingPendingBehaviors);
                remainingPendingBehaviors.Clear();

                // Add this interface only for real entities, not for embedded types
                if (implementValueHolderContainerInterface)
                {
                    visitor = new InterfaceAdder(visitor, typeof(IValueHolderContainer));
                }
                visitor = new RelationsGetterVisitor(visitor, metaData, ValueHolderContainerHelper, PropertyInfoProvider);
                visitor = new SetCacheModificationMethodCreator(visitor);
                return(visitor);
            }
Ejemplo n.º 21
0
        public static bool HasValidConstructor()
        {
            IBytecodeBehaviorState state = BytecodeBehaviorState.State;

            ConstructorInfo[] constructors = state.CurrentType.GetConstructors(BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.DeclaredOnly);

            foreach (ConstructorInfo constructor in constructors)
            {
                if (state.IsMethodAlreadyImplementedOnNewType(new ConstructorInstance(constructor)))
                {
                    return(true);
                }
            }
            return(false);
        }
Ejemplo n.º 22
0
        public static PropertyInstance FindByTemplate(String propertyName, NewType propertyType, bool tryOnly)
        {
            IBytecodeBehaviorState state = BytecodeBehaviorState.State;
            PropertyInstance       pi    = state.GetProperty(propertyName, propertyType);

            if (pi != null)
            {
                return(pi);
            }
            if (tryOnly)
            {
                return(null);
            }
            throw new ArgumentException("No property found on class hierarchy: " + propertyName + ". Start type: " + state.NewType);
        }
Ejemplo n.º 23
0
        public override IClassVisitor Extend(IClassVisitor visitor, IBytecodeBehaviorState state, IList <IBytecodeBehavior> remainingPendingBehaviors,
                                             IList <IBytecodeBehavior> cascadePendingBehaviors)
        {
            RootCacheValueEnhancementHint hint = state.GetContext <RootCacheValueEnhancementHint>();

            if (hint == null)
            {
                return(visitor);
            }
            IEntityMetaData metaData = EntityMetaDataProvider.GetMetaData(hint.EntityType);

            visitor = new RootCacheValueVisitor(visitor, metaData);
            visitor = new EntityMetaDataHolderVisitor(visitor, metaData);
            return(visitor);
        }
Ejemplo n.º 24
0
            public override IClassVisitor Extend(IClassVisitor visitor, IBytecodeBehaviorState state, IList <IBytecodeBehavior> remainingPendingBehaviors,
                                                 IList <IBytecodeBehavior> cascadePendingBehaviors)
            {
                visitor = new InterfaceAdder(visitor, typeof(IDataObject), typeof(INotifyCollectionChangedListener));
                visitor = new DataObjectVisitor(visitor, metaData, PropertyInfoProvider);
                visitor = new SetCacheModificationMethodCreator(visitor);

                // ToBeUpdated & ToBeDeleted have to fire PropertyChange-Events by themselves
                String[] properties = { DataObjectVisitor.template_p_toBeUpdated.Name, DataObjectVisitor.template_p_toBeDeleted.Name };

                CascadeBehavior2 cascadeBehavior2 = BeanContext.RegisterWithLifecycle(new CascadeBehavior2(metaData, properties)).Finish();

                cascadePendingBehaviors.Add(cascadeBehavior2);

                return(visitor);
            }
Ejemplo n.º 25
0
 public override IClassVisitor Extend(IClassVisitor visitor, IBytecodeBehaviorState state, IList <IBytecodeBehavior> remainingPendingBehaviors,
                                      IList <IBytecodeBehavior> cascadePendingBehaviors)
 {
     if ((state.GetContext <EntityEnhancementHint>() == null && state.GetContext <EmbeddedEnhancementHint>() == null))
     {
         return(visitor);
     }
     if (state.GetContext <EntityEnhancementHint>() != null)
     {
         IEntityMetaData metaData = EntityMetaDataProvider.GetMetaData(state.OriginalType);
         visitor = new InterfaceAdder(visitor, typeof(IEntityMetaDataHolder));
         visitor = new EntityMetaDataHolderVisitor(visitor, metaData);
     }
     visitor = new InterfaceAdder(visitor, typeof(IEnhancedType));
     visitor = new GetBaseTypeMethodCreator(visitor);
     return(visitor);
 }
Ejemplo n.º 26
0
        public override IClassVisitor Extend(IClassVisitor visitor, IBytecodeBehaviorState state, IList <IBytecodeBehavior> remainingPendingBehaviors,
                                             IList <IBytecodeBehavior> cascadePendingBehaviors)
        {
            if (state.GetContext <EntityEnhancementHint>() == null)
            {
                return(visitor);
            }
            IEntityMetaData metaData = EntityMetaDataProvider.GetMetaData(state.OriginalType, true);

            if (metaData == null)
            {
                return(visitor);
            }
            visitor = new InterfaceAdder(visitor, typeof(IParentCacheValueHardRef));
            visitor = new ParentCacheHardRefVisitor(visitor);
            return(visitor);
        }
Ejemplo n.º 27
0
        public virtual IMethodVisitor StartOverrideWithSuperCall(MethodInstance superMethod)
        {
            IBytecodeBehaviorState state = State;

            NewType superType = NewType.GetType(state.CurrentType);

            if (!superType.Equals(superMethod.Owner))
            {
                throw new ArgumentException("Not a method of " + state.CurrentType + ": " + superMethod);
            }
            IMethodVisitor mg = VisitMethod(superMethod);

            mg.LoadThis();
            mg.LoadArgs();
            mg.InvokeSuper(superMethod);

            return(mg);
        }
Ejemplo n.º 28
0
        public void Emit(OpCode opcode, MethodInfo meth)
        {
            IBytecodeBehaviorState state = BytecodeBehaviorState.State;
            MethodInstance         mi    = null;

            foreach (MethodInstance methodOnNewType in state.GetAlreadyImplementedMethodsOnNewType())
            {
                if (Object.ReferenceEquals(methodOnNewType.Method, meth))
                {
                    mi = methodOnNewType;
                    break;
                }
            }
            if (mi == null)
            {
                mi = new MethodInstance(meth);
            }
            sb.Append("\r\n\t\t" + opcode + " " + mi);
            gen.Emit(opcode, meth);
        }
Ejemplo n.º 29
0
        public static MethodInstance GetSuperGetter(PropertyInstance propertyInfo)
        {
            IBytecodeBehaviorState state = BytecodeBehaviorState.State;
            Type superType = state.CurrentType;

            MethodInfo superGetter = superType.GetMethod(GetGetterNameOfRelationPropertyWithNoInit(propertyInfo.Name), BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic, null, CallingConventions.HasThis, new Type[0], null);

            if (superGetter == null)
            {
                // not a relation -> no lazy loading
                superGetter = superType.GetMethod(propertyInfo.Getter.Name, BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic, null, CallingConventions.HasThis, new Type[0], null);
                if (superGetter == null)
                {
#if SILVERLIGHT
                    throw new MissingMethodException(superType.FullName + "." + propertyInfo.Getter.Name);
#else
                    throw new MissingMethodException(superType.FullName, propertyInfo.Getter.Name);
#endif
                }
            }
            return(new MethodInstance(superGetter));
        }
Ejemplo n.º 30
0
        public static T SetState <T>(Type originalType, Type currentType, NewType newType, IServiceContext beanContext,
                                     IEnhancementHint context, IResultingBackgroundWorkerDelegate <T> runnable)
        {
            IBytecodeBehaviorState oldState = stateTL.Value;

            stateTL.Value = new BytecodeBehaviorState(currentType, newType, originalType, beanContext, context);
            try
            {
                return(runnable.Invoke());
            }
            finally
            {
                if (oldState != null)
                {
                    stateTL.Value = oldState;
                }
                else
                {
                    stateTL.Value = null;
                }
            }
        }