Exemple #1
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);
            }
            if (!IsAnnotationPresent <EntityEqualsAspect>(state.CurrentType))
            {
                return(visitor);
            }
            visitor = new InterfaceAdder(visitor, typeof(IEntityEquals), typeof(IPrintable));
            visitor = new GetIdMethodCreator(visitor, metaData);
            visitor = new GetBaseTypeMethodCreator(visitor);
            visitor = new EntityEqualsVisitor(visitor);
            return(visitor);
        }
Exemple #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);
        }