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);
        }
Пример #2
0
        public override IClassVisitor Extend(IClassVisitor visitor, IBytecodeBehaviorState state, IList <IBytecodeBehavior> remainingPendingBehaviors,
                                             IList <IBytecodeBehavior> cascadePendingBehaviors)
        {
            if (state.GetContext <EntityEnhancementHint>() == null)
            {
                return(visitor);
            }

            bool lastBehaviorStanding = remainingPendingBehaviors.Remove(this);

            Type currentType = state.CurrentType;

            if (!typeof(INotifyPropertyChanged).IsAssignableFrom(currentType))
            {
                if (remainingPendingBehaviors.Count == 0 && lastBehaviorStanding)
                {
                    // The type is not being PropertyChange enhanced.
                    return(visitor);
                }
                if (remainingPendingBehaviors.Count == 0 && cascadePendingBehaviors.Count == 0)
                {
                    // Mark "last behavior standing" to avoid infinite loop
                    cascadePendingBehaviors.Add(this);
                }
                cascadePendingBehaviors.Add(this);
                return(visitor);
            }
            IEntityMetaData metaData = EntityMetaDataProvider.GetMetaData(state.OriginalType);

            visitor = new GetIdMethodCreator(visitor, metaData);
            visitor = new SetBeanContextMethodCreator(visitor);

            CascadeBehavior cascadeBehavior = BeanContext.RegisterWithLifecycle(new CascadeBehavior(metaData)).Finish();

            cascadePendingBehaviors.Add(cascadeBehavior);
            return(visitor);
        }
 public TriggersContextOptionsBuilder CascadeBehavior(CascadeBehavior cascadeBehavior = Infrastructure.CascadeBehavior.EntityAndType)
 => WithOption(e => e.WithCascadeBehavior(cascadeBehavior));