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); }
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); }
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); }
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); }
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); }
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)); }
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); }
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); }
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); }
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); }
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); }
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); }
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); }
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); }
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); }
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); }
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(); }
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); }
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); }
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); }
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); }
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); }
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); }
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); }
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); }
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); }
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)); }
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; } } }