public PocoComponentTuplizer(Mapping.Component component) : base(component) { componentClass = component.ComponentClass; var parentProperty = component.ParentProperty; if (parentProperty == null) { parentSetter = null; parentGetter = null; } else { parentSetter = parentProperty.GetSetter(componentClass); parentGetter = parentProperty.GetGetter(componentClass); } if (hasCustomAccessors || !Cfg.Environment.UseReflectionOptimizer) { optimizer = null; } else { optimizer = Cfg.Environment.BytecodeProvider.GetReflectionOptimizer(componentClass, getters, setters); } }
protected void SetReflectionOptimizer() { if (Cfg.Environment.UseReflectionOptimizer) { optimizer = Cfg.Environment.BytecodeProvider.GetReflectionOptimizer(componentClass, getters, setters); } }
public PocoEntityTuplizer(EntityMetamodel entityMetamodel, PersistentClass mappedEntity) : base(entityMetamodel, mappedEntity) { mappedClass = mappedEntity.MappedClass; proxyInterface = mappedEntity.ProxyInterface; islifecycleImplementor = typeof(ILifecycle).IsAssignableFrom(mappedClass); isValidatableImplementor = typeof(IValidatable).IsAssignableFrom(mappedClass); foreach (Mapping.Property property in mappedEntity.PropertyClosureIterator) { if (property.IsLazy) lazyPropertyNames.Add(property.Name); if (property.UnwrapProxy) unwrapProxyPropertyNames.Add(property.Name); } SetReflectionOptimizer(); Instantiator = BuildInstantiator(mappedEntity); if (hasCustomAccessors) { optimizer = null; } proxyValidator = Cfg.Environment.BytecodeProvider.ProxyFactoryFactory.ProxyValidator; }
public PocoEntityTuplizer(EntityMetamodel entityMetamodel, PersistentClass mappedEntity) : base(entityMetamodel, mappedEntity) { mappedClass = mappedEntity.MappedClass; proxyInterface = mappedEntity.ProxyInterface; islifecycleImplementor = typeof(ILifecycle).IsAssignableFrom(mappedClass); isValidatableImplementor = typeof(IValidatable).IsAssignableFrom(mappedClass); foreach (Mapping.Property property in mappedEntity.PropertyClosureIterator) { if (property.IsLazy) { lazyPropertyNames.Add(property.Name); } } SetReflectionOptimizer(); Instantiator = BuildInstantiator(mappedEntity); if (hasCustomAccessors) { optimizer = null; } proxyValidator = Cfg.Environment.BytecodeProvider.ProxyFactoryFactory.ProxyValidator; }
protected void ClearOptimizerWhenUsingCustomAccessors() { if (hasCustomAccessors) { optimizer = null; } }
public PocoComponentTuplizer(Mapping.Component component) : base(component) { componentClass = component.ComponentClass; var parentProperty = component.ParentProperty; if (parentProperty == null) { parentSetter = null; parentGetter = null; } else { parentSetter = parentProperty.GetSetter(componentClass); parentGetter = parentProperty.GetGetter(componentClass); } if (hasCustomAccessors || !Cfg.Environment.UseReflectionOptimizer) { optimizer = null; } else { optimizer = Cfg.Environment.BytecodeProvider.GetReflectionOptimizer(componentClass, getters, setters); } }
protected void SetReflectionOptimizer() { if (Cfg.Environment.UseReflectionOptimizer) { // NH different behavior fo NH-1587 optimizer = Cfg.Environment.BytecodeProvider.GetReflectionOptimizer(mappedClass, getters, setters); } }
protected void SetReflectionOptimizer() { if (Cfg.Environment.UseReflectionOptimizer) { // NH different behavior fo NH-1587 optimizer = Cfg.Environment.BytecodeProvider.GetReflectionOptimizer(mappedClass, getters, setters); } }
protected void SetReflectionOptimizer() { if (Cfg.Environment.UseReflectionOptimizer) { optimizer = Cfg.Environment.BytecodeProvider.GetReflectionOptimizer(componentClass, getters, setters, parentGetter, parentSetter); isBytecodeProviderImpl = Cfg.Environment.BytecodeProvider is BytecodeProviderImpl; } }
private IReflectionOptimizer Build(string code) { CodeDomProvider provider = new CSharpCodeProvider(); CompilerResults res; if (FluorineConfiguration.Instance.OptimizerSettings.Debug) { string file = Path.Combine(Path.GetTempPath(), _mappedClass.FullName.Replace('.', '_').Replace("+", "__")) + ".cs"; StreamWriter sw = File.CreateText(file); sw.Write(code); sw.Close(); #if LOGGING log.Debug(__Res.GetString(__Res.Optimizer_FileLocation, _mappedClass.FullName, file)); #endif _cp.TempFiles = new TempFileCollection(Path.GetTempPath()); _cp.TempFiles.KeepFiles = true; #if !(NET_1_1) res = provider.CompileAssemblyFromFile(_cp, file); #else ICodeCompiler compiler = provider.CreateCompiler(); res = compiler.CompileAssemblyFromFile(_cp, file); #endif } else { #if !(NET_1_1) res = provider.CompileAssemblyFromSource(_cp, new string[] { code }); #else ICodeCompiler compiler = provider.CreateCompiler(); res = compiler.CompileAssemblyFromSource(_cp, code); #endif } if (res.Errors.HasErrors) { foreach (CompilerError e in res.Errors) { #if LOGGING log.Error(__Res.GetString(__Res.Compiler_Error, e.Line, e.Column, e.ErrorText)); #endif } throw new InvalidOperationException(res.Errors[0].ErrorText); } Assembly assembly = res.CompiledAssembly; System.Type[] types = assembly.GetTypes(); IReflectionOptimizer optimizer = (IReflectionOptimizer)assembly.CreateInstance(types[0].FullName, false, BindingFlags.CreateInstance, null, null, null, null); return(optimizer); }
public object ReadData(AMFReader reader) { object instance = null; string typeIdentifier = reader.ReadString(); IReflectionOptimizer reflectionOptimizer = _optimizedReaders[typeIdentifier] as IReflectionOptimizer; if( reflectionOptimizer == null ) { lock(_optimizedReaders) { if (!_optimizedReaders.Contains(typeIdentifier)) { //Temporary reader _optimizedReaders[typeIdentifier] = new AMF0TempObjectReader(); Type type = ObjectFactory.Locate(typeIdentifier); if( type != null ) { instance = ObjectFactory.CreateInstance(type); reader.AddReference(instance); if (type != null) { //Fixup if (reflectionOptimizer != null) _optimizedReaders[typeIdentifier] = reflectionOptimizer; else _optimizedReaders[typeIdentifier] = new AMF0TempObjectReader(); } } else { reflectionOptimizer = new AMF0TypedASObjectReader(typeIdentifier); _optimizedReaders[typeIdentifier] = reflectionOptimizer; instance = reflectionOptimizer.ReadData(reader, null); } } else { reflectionOptimizer = _optimizedReaders[typeIdentifier] as IReflectionOptimizer; instance = reflectionOptimizer.ReadData(reader, null); } } } else { instance = reflectionOptimizer.ReadData(reader, null); } return instance; }
protected internal override IInstantiator BuildInstantiator(Mapping.Component component) { // TODO H3.2 not ported //if (component.IsEmbedded && ReflectHelper.IsAbstractClass(component.ComponentClass)) //{ // return new ProxiedInstantiator(component); //} //todo ÐÞ¸ÄÔ´Âë if (hasCustomAccessors || !Cfg.Environment.UseReflectionOptimizer) { optimizer = null; } else { optimizer = Cfg.Environment.BytecodeProvider.GetReflectionOptimizer(component.ComponentClass, getters, setters); } if (optimizer == null) { return(new PocoInstantiator(component, null)); } return(new PocoInstantiator(component, optimizer.InstantiationOptimizer)); }
public PocoEntityTuplizer(EntityMetamodel entityMetamodel, PersistentClass mappedEntity) : base(entityMetamodel, mappedEntity) { mappedClass = mappedEntity.MappedClass; proxyInterface = mappedEntity.ProxyInterface; islifecycleImplementor = typeof(ILifecycle).IsAssignableFrom(mappedClass); isValidatableImplementor = typeof(IValidatable).IsAssignableFrom(mappedClass); foreach (Mapping.Property property in mappedEntity.PropertyClosureIterator) { if (property.IsLazy) lazyPropertyNames.Add(property.Name); } if (hasCustomAccessors || !Cfg.Environment.UseReflectionOptimizer) { optimizer = null; } else { optimizer = Cfg.Environment.BytecodeProvider.GetReflectionOptimizer(mappedClass, getters, setters); } }
public object ReadData(AMFReader reader) { object instance = null; string typeIdentifier = reader.ReadString(); #if LOGGING if (log.IsDebugEnabled) { string msg = string.Format("Attempt to read custom object {0}", typeIdentifier); log.Debug(msg); } #endif IReflectionOptimizer reflectionOptimizer = _optimizedReaders[typeIdentifier] as IReflectionOptimizer; if (reflectionOptimizer == null) { lock (_optimizedReaders) { if (!_optimizedReaders.Contains(typeIdentifier)) { #if LOGGING if (log.IsDebugEnabled) { string msg = string.Format("Generating optimizer for type {0}", typeIdentifier); log.Debug(msg); } #endif //Temporary reader _optimizedReaders[typeIdentifier] = new AMF0TempObjectReader(); Type type = ObjectFactory.Locate(typeIdentifier); if (type != null) { instance = ObjectFactory.CreateInstance(type); reader.AddReference(instance); if (type != null) { IBytecodeProvider bytecodeProvider = null; #if NET_1_1 //codedom only if (FluorineConfiguration.Instance.OptimizerSettings != null) { bytecodeProvider = new FluorineFx.IO.Bytecode.CodeDom.BytecodeProvider(); } #else if (FluorineConfiguration.Instance.OptimizerSettings.Provider == "codedom") { bytecodeProvider = new FluorineFx.IO.Bytecode.CodeDom.BytecodeProvider(); } if (FluorineConfiguration.Instance.OptimizerSettings.Provider == "il") { bytecodeProvider = new FluorineFx.IO.Bytecode.Lightweight.BytecodeProvider(); } #endif reflectionOptimizer = bytecodeProvider.GetReflectionOptimizer(type, null, reader, instance); //Fixup if (reflectionOptimizer != null) { _optimizedReaders[typeIdentifier] = reflectionOptimizer; } else { _optimizedReaders[typeIdentifier] = new AMF0TempObjectReader(); } } } else { #if LOGGING if (log.IsWarnEnabled) { log.Warn("Custom object " + typeIdentifier + " could not be loaded. An ActionScript typed object (ASObject) will be created"); } #endif reflectionOptimizer = new AMF0TypedASObjectReader(typeIdentifier); _optimizedReaders[typeIdentifier] = reflectionOptimizer; instance = reflectionOptimizer.ReadData(reader, null); } } else { reflectionOptimizer = _optimizedReaders[typeIdentifier] as IReflectionOptimizer; instance = reflectionOptimizer.ReadData(reader, null); } } } else { instance = reflectionOptimizer.ReadData(reader, null); } return(instance); }
protected AbstractEntityPersister(PersistentClass persistentClass, ICacheConcurrencyStrategy cache, ISessionFactoryImplementor factory) { this.factory = factory; dialect = factory.Dialect; this.cache = cache; //sqlExceptionConverter = factory.SQLExceptionConverter; entityMetamodel = new EntityMetamodel(persistentClass, factory); // CLASS mappedClass = persistentClass.MappedClass; sqlWhereString = persistentClass.Where; sqlWhereStringTemplate = sqlWhereString == null ? null : Template.RenderWhereStringTemplate(sqlWhereString, Dialect, factory.SQLFunctionRegistry); batchSize = persistentClass.BatchSize; hasSubselectLoadableCollections = persistentClass.HasSubselectLoadableCollections; constructor = ReflectHelper.GetDefaultConstructor(mappedClass); // verify that the class has a default constructor if it is not abstract - it is considered // a mapping exception if the default ctor is missing. if (!entityMetamodel.IsAbstract && constructor == null) { throw new MappingException("The mapped class " + mappedClass.FullName + " must declare a default (no-arg) constructor."); } // IDENTIFIER hasEmbeddedIdentifier = persistentClass.HasEmbeddedIdentifier; IValue idValue = persistentClass.Identifier; if (persistentClass.HasIdentifierProperty) { Mapping.Property idProperty = persistentClass.IdentifierProperty; identifierSetter = idProperty.GetSetter(mappedClass); identifierGetter = idProperty.GetGetter(mappedClass); } else { identifierGetter = null; identifierSetter = null; } System.Type prox = persistentClass.ProxyInterface; MethodInfo proxySetIdentifierMethod = null; MethodInfo proxyGetIdentifierMethod = null; if (persistentClass.HasIdentifierProperty && prox != null) { Mapping.Property idProperty = persistentClass.IdentifierProperty; proxyGetIdentifierMethod = idProperty.GetGetter(prox).Method; proxySetIdentifierMethod = idProperty.GetSetter(prox).Method; } // HYDRATE SPAN hydrateSpan = persistentClass.PropertyClosureCollection.Count; // IDENTIFIER identifierColumnSpan = persistentClass.Identifier.ColumnSpan; rootTableKeyColumnNames = new string[identifierColumnSpan]; identifierAliases = new string[identifierColumnSpan]; loaderName = persistentClass.LoaderName; int i = 0; foreach (Column col in idValue.ColumnCollection) { rootTableKeyColumnNames[i] = col.GetQuotedName(factory.Dialect); identifierAliases[i] = col.GetAlias(Dialect, persistentClass.RootTable); i++; } // VERSION: if (persistentClass.IsVersioned) { foreach (Column col in persistentClass.Version.ColumnCollection) { versionColumnName = col.GetQuotedName(Dialect); break; //only happens once } } else { versionColumnName = null; } if (persistentClass.IsVersioned) { versionGetter = persistentClass.Version.GetGetter(mappedClass); versionType = (IVersionType) persistentClass.Version.Type; } else { versionGetter = null; versionType = null; } // PROPERTIES getters = new IGetter[hydrateSpan]; setters = new ISetter[hydrateSpan]; string[] setterNames = new string[hydrateSpan]; string[] getterNames = new string[hydrateSpan]; System.Type[] classes = new System.Type[hydrateSpan]; i = 0; // NH: reflection optimizer works with custom accessors //bool foundCustomAccessor = false; foreach (Mapping.Property prop in persistentClass.PropertyClosureCollection) { //if( !prop.IsBasicPropertyAccessor ) //{ // foundCustomAccessor = true; //} getters[i] = prop.GetGetter(mappedClass); setters[i] = prop.GetSetter(mappedClass); getterNames[i] = getters[i].PropertyName; setterNames[i] = setters[i].PropertyName; classes[i] = getters[i].ReturnType; string propertyName = prop.Name; gettersByPropertyName[propertyName] = getters[i]; settersByPropertyName[propertyName] = setters[i]; i++; } // PROPERTIES (FROM ABSTRACTENTITYPERSISTER SUBCLASSES) propertyColumnNames = new string[HydrateSpan][]; propertyColumnAliases = new string[HydrateSpan][]; propertyColumnSpans = new int[HydrateSpan]; propertyColumnFormulaTemplates = new string[HydrateSpan][]; propertyColumnUpdateable = new bool[HydrateSpan][]; propertyColumnInsertable = new bool[HydrateSpan][]; propertyUniqueness = new bool[HydrateSpan]; HashedSet thisClassProperties = new HashedSet(); i = 0; bool foundFormula = false; foreach (Mapping.Property prop in persistentClass.PropertyClosureCollection) { thisClassProperties.Add(prop); int span = prop.ColumnSpan; propertyColumnSpans[i] = span; string[] colNames = new string[span]; string[] colAliases = new string[span]; string[] templates = new string[span]; int k = 0; foreach (ISelectable thing in prop.ColumnCollection) { colAliases[k] = thing.GetAlias(factory.Dialect, prop.Value.Table); if (thing.IsFormula) { foundFormula = true; templates[k] = thing.GetTemplate(factory.Dialect, factory.SQLFunctionRegistry); } else { colNames[k] = thing.GetTemplate(factory.Dialect, factory.SQLFunctionRegistry); } k++; } propertyColumnNames[i] = colNames; propertyColumnFormulaTemplates[i] = templates; propertyColumnAliases[i] = colAliases; propertyColumnInsertable[i] = prop.Value.ColumnInsertability; propertyColumnUpdateable[i] = prop.Value.ColumnUpdateability; propertyUniqueness[i] = prop.Value.IsUnique; i++; } hasFormulaProperties = foundFormula; // NH: reflection optimizer works with custom accessors if (Environment.UseReflectionOptimizer) { optimizer = Environment.BytecodeProvider.GetReflectionOptimizer(MappedClass, Getters, Setters); } // SUBCLASS PROPERTY CLOSURE ArrayList columns = new ArrayList(); //this.subclassColumnClosure ArrayList aliases = new ArrayList(); ArrayList formulaAliases = new ArrayList(); ArrayList formulaTemplates = new ArrayList(); ArrayList types = new ArrayList(); //this.subclassPropertyTypeClosure ArrayList names = new ArrayList(); //this.subclassPropertyNameClosure ArrayList subclassTemplates = new ArrayList(); ArrayList propColumns = new ArrayList(); //this.subclassPropertyColumnNameClosure ArrayList joinedFetchesList = new ArrayList(); //this.subclassPropertyEnableJoinedFetch ArrayList cascades = new ArrayList(); ArrayList definedBySubclass = new ArrayList(); // this.propertyDefinedOnSubclass ArrayList formulas = new ArrayList(); ArrayList propNullables = new ArrayList(); foreach (Mapping.Property prop in persistentClass.SubclassPropertyClosureCollection) { names.Add(prop.Name); bool isDefinedBySubclass = !thisClassProperties.Contains(prop); definedBySubclass.Add(isDefinedBySubclass); propNullables.Add(prop.IsOptional || isDefinedBySubclass); //TODO: is this completely correct? types.Add(prop.Type); string[] cols = new string[prop.ColumnSpan]; string[] forms = new string[prop.ColumnSpan]; int[] colnos = new int[prop.ColumnSpan]; int[] formnos = new int[prop.ColumnSpan]; int l = 0; foreach (ISelectable thing in prop.ColumnCollection) { if (thing.IsFormula) { string template = thing.GetTemplate(factory.Dialect, factory.SQLFunctionRegistry); formnos[l] = formulaTemplates.Count; colnos[l] = -1; formulaTemplates.Add(template); forms[l] = template; formulas.Add(thing.GetText(factory.Dialect)); formulaAliases.Add(thing.GetAlias(factory.Dialect)); // TODO H3: formulasLazy.add( lazy ); } else { String colName = thing.GetTemplate(factory.Dialect, factory.SQLFunctionRegistry); colnos[l] = columns.Count; //before add :-) formnos[l] = -1; columns.Add(colName); cols[l] = colName; aliases.Add(thing.GetAlias(factory.Dialect, prop.Value.Table)); // TODO H3: columnsLazy.add( lazy ); // TODO H3: columnSelectables.add( new Boolean( prop.isSelectable() ) ); } l++; } propColumns.Add(cols); subclassTemplates.Add(forms); //propColumnNumbers.Add( colnos ); //propFormulaNumbers.Add( formnos ); joinedFetchesList.Add(prop.Value.FetchMode); cascades.Add(prop.CascadeStyle); } subclassColumnClosure = (string[]) columns.ToArray(typeof(string)); subclassFormulaClosure = (string[]) formulas.ToArray(typeof(string)); subclassFormulaTemplateClosure = (string[]) formulaTemplates.ToArray(typeof(string)); subclassPropertyTypeClosure = (IType[]) types.ToArray(typeof(IType)); subclassColumnAliasClosure = (string[]) aliases.ToArray(typeof(string)); subclassFormulaAliasClosure = (string[]) formulaAliases.ToArray(typeof(string)); subclassPropertyNameClosure = (string[]) names.ToArray(typeof(string)); subclassPropertyNullabilityClosure = (bool[]) propNullables.ToArray(typeof(bool)); subclassPropertyFormulaTemplateClosure = ArrayHelper.To2DStringArray(subclassTemplates); subclassPropertyColumnNameClosure = (string[][]) propColumns.ToArray(typeof(string[])); subclassPropertyCascadeStyleClosure = new Cascades.CascadeStyle[cascades.Count]; int m = 0; foreach (Cascades.CascadeStyle cs in cascades) { subclassPropertyCascadeStyleClosure[m++] = cs; } subclassPropertyFetchModeClosure = new FetchMode[joinedFetchesList.Count]; m = 0; foreach (FetchMode qq in joinedFetchesList) { subclassPropertyFetchModeClosure[m++] = qq; } propertyDefinedOnSubclass = new bool[definedBySubclass.Count]; m = 0; foreach (bool val in definedBySubclass) { propertyDefinedOnSubclass[m++] = val; } // CALLBACK INTERFACES implementsLifecycle = typeof(ILifecycle).IsAssignableFrom(mappedClass); implementsValidatable = typeof(IValidatable).IsAssignableFrom(mappedClass); // PROXIES concreteProxyClass = persistentClass.ProxyInterface; bool hasProxy = concreteProxyClass != null; if (hasProxy) { HashedSet proxyInterfaces = new HashedSet(); proxyInterfaces.Add(typeof(INHibernateProxy)); if (!mappedClass.Equals(concreteProxyClass)) { if (!concreteProxyClass.IsInterface) { throw new MappingException( "proxy must be either an interface, or the class itself: " + mappedClass.FullName); } proxyInterfaces.Add(concreteProxyClass); } if (mappedClass.IsInterface) { proxyInterfaces.Add(mappedClass); } if (HasProxy) { foreach (Subclass subclass in persistentClass.SubclassCollection) { System.Type subclassProxy = subclass.ProxyInterface; if (subclassProxy == null) { throw new MappingException("All subclasses must also have proxies: " + mappedClass.Name); } if (!subclass.MappedClass.Equals(subclassProxy)) { proxyInterfaces.Add(subclassProxy); } } } if (HasProxy) { proxyFactory = CreateProxyFactory(); proxyFactory.PostInstantiate(mappedClass, proxyInterfaces, proxyGetIdentifierMethod, proxySetIdentifierMethod); } else { proxyFactory = null; } } else { proxyFactory = null; } // Handle any filters applied to the class level filterHelper = new FilterHelper(persistentClass.FilterMap, factory.Dialect, factory.SQLFunctionRegistry); }
internal void OnDeserialized(StreamingContext context) { this.optimizer = Cfg.Environment.BytecodeProvider.GetReflectionOptimizer(componentClass, getters, setters); }
protected void SetReflectionOptimizer() { if (Cfg.Environment.UseReflectionOptimizer) { optimizer = Cfg.Environment.BytecodeProvider.GetReflectionOptimizer(componentClass, getters, setters); } }
public object ReadData(AMFReader reader) { object instance = null; string str2; string str = reader.ReadString(); if (log.get_IsDebugEnabled()) { str2 = string.Format("Attempt to read custom object {0}", str); log.Debug(str2); } IReflectionOptimizer optimizer = this._optimizedReaders[str] as IReflectionOptimizer; if (optimizer == null) { lock (this._optimizedReaders) { if (!this._optimizedReaders.Contains(str)) { if (log.get_IsDebugEnabled()) { str2 = string.Format("Generating optimizer for type {0}", str); log.Debug(str2); } this._optimizedReaders[str] = new AMF0TempObjectReader(); Type type = ObjectFactory.Locate(str); if (type != null) { instance = ObjectFactory.CreateInstance(type); reader.AddReference(instance); if (type != null) { IBytecodeProvider provider = null; if (FluorineConfiguration.Instance.OptimizerSettings.Provider == "codedom") { provider = new BytecodeProvider(); } if (FluorineConfiguration.Instance.OptimizerSettings.Provider == "il") { provider = new BytecodeProvider(); } optimizer = provider.GetReflectionOptimizer(type, null, reader, instance); if (optimizer != null) { this._optimizedReaders[str] = optimizer; return(instance); } this._optimizedReaders[str] = new AMF0TempObjectReader(); } return(instance); } if (log.get_IsWarnEnabled()) { log.Warn("Custom object " + str + " could not be loaded. An ActionScript typed object (ASObject) will be created"); } optimizer = new AMF0TypedASObjectReader(str); this._optimizedReaders[str] = optimizer; return(optimizer.ReadData(reader, null)); } optimizer = this._optimizedReaders[str] as IReflectionOptimizer; return(optimizer.ReadData(reader, null)); } return(instance); } return(optimizer.ReadData(reader, null)); }
internal void OnDeserialized(StreamingContext context) { this.optimizer = Cfg.Environment.BytecodeProvider.GetReflectionOptimizer(componentClass, getters, setters); }
protected void ClearOptimizerWhenUsingCustomAccessors() { if (hasCustomAccessors) { optimizer = null; } }
public object ReadData(AMFReader reader) { int handle = reader.ReadAMF3IntegerData(); bool inline = ((handle & 1) != 0); handle = handle >> 1; if (!inline) { //An object reference return(reader.ReadAMF3ObjectReference(handle)); } else { ClassDefinition classDefinition = reader.ReadClassDefinition(handle); object instance = null; IReflectionOptimizer reflectionOptimizer = _optimizedReaders[classDefinition.ClassName] as IReflectionOptimizer; if (reflectionOptimizer == null) { lock (_optimizedReaders) { if (classDefinition.IsTypedObject) { if (!_optimizedReaders.Contains(classDefinition.ClassName)) { //Temporary reader _optimizedReaders[classDefinition.ClassName] = new AMF3TempObjectReader(); Type type = ObjectFactory.Locate(classDefinition.ClassName); if (type != null) { instance = ObjectFactory.CreateInstance(type); if (classDefinition.IsExternalizable) { reflectionOptimizer = new AMF3ExternalizableReader(); _optimizedReaders[classDefinition.ClassName] = reflectionOptimizer; instance = reflectionOptimizer.ReadData(reader, classDefinition); } else { reader.AddAMF3ObjectReference(instance); IBytecodeProvider bytecodeProvider = null; #if NET_1_1 //codedom only if (FluorineConfiguration.Instance.OptimizerSettings != null) { bytecodeProvider = new FluorineFx.IO.Bytecode.CodeDom.BytecodeProvider(); } #else if (FluorineConfiguration.Instance.OptimizerSettings.Provider == "codedom") { bytecodeProvider = new FluorineFx.IO.Bytecode.CodeDom.BytecodeProvider(); } if (FluorineConfiguration.Instance.OptimizerSettings.Provider == "il") { bytecodeProvider = new FluorineFx.IO.Bytecode.Lightweight.BytecodeProvider(); } #endif reflectionOptimizer = bytecodeProvider.GetReflectionOptimizer(type, classDefinition, reader, instance); //Fixup if (reflectionOptimizer != null) { _optimizedReaders[classDefinition.ClassName] = reflectionOptimizer; } else { _optimizedReaders[classDefinition.ClassName] = new AMF3TempObjectReader(); } } } else { reflectionOptimizer = new AMF3TypedASObjectReader(classDefinition.ClassName); _optimizedReaders[classDefinition.ClassName] = reflectionOptimizer; instance = reflectionOptimizer.ReadData(reader, classDefinition); } } else { reflectionOptimizer = _optimizedReaders[classDefinition.ClassName] as IReflectionOptimizer; instance = reflectionOptimizer.ReadData(reader, classDefinition); } } else { reflectionOptimizer = new AMF3TypedASObjectReader(classDefinition.ClassName); _optimizedReaders[classDefinition.ClassName] = reflectionOptimizer; instance = reflectionOptimizer.ReadData(reader, classDefinition); } } } else { instance = reflectionOptimizer.ReadData(reader, classDefinition); } return(instance); } }
public ComponentType(System.Type componentClass, string[] propertyNames, IGetter[] propertyGetters, ISetter[] propertySetters, // currently not used, see the comment near the end of the method body bool foundCustomAcessor, IType[] propertyTypes, bool[] nullabilities, FetchMode[] joinedFetch, Cascades.CascadeStyle[] cascade, string parentProperty) { this.componentClass = componentClass; this.propertyTypes = propertyTypes; this.propertyNullability = nullabilities; propertySpan = propertyNames.Length; getters = propertyGetters; setters = propertySetters; string[] getterNames = new string[propertySpan]; string[] setterNames = new string[propertySpan]; System.Type[] propTypes = new System.Type[propertySpan]; for (int i = 0; i < propertySpan; i++) { getterNames[i] = getters[i].PropertyName; setterNames[i] = setters[i].PropertyName; propTypes[i] = getters[i].ReturnType; } if (parentProperty == null) { parentSetter = null; parentGetter = null; } else { IPropertyAccessor pa = PropertyAccessorFactory.GetPropertyAccessor(null); parentSetter = pa.GetSetter(componentClass, parentProperty); parentGetter = pa.GetGetter(componentClass, parentProperty); } this.propertyNames = propertyNames; this.cascade = cascade; this.joinedFetch = joinedFetch; if (Environment.UseReflectionOptimizer) { // NH: reflection optimizer works with custom accessors this.optimizer = Environment.BytecodeProvider.GetReflectionOptimizer(componentClass, getters, setters); } }
public object ReadData(AMFReader reader) { int index = reader.ReadAMF3IntegerData(); bool flag = (index & 1) != 0; index = index >> 1; if (!flag) { return(reader.ReadAMF3ObjectReference(index)); } ClassDefinition classDefinition = reader.ReadClassDefinition(index); object instance = null; IReflectionOptimizer optimizer = this._optimizedReaders[classDefinition.ClassName] as IReflectionOptimizer; if (optimizer == null) { lock (this._optimizedReaders) { if (classDefinition.IsTypedObject) { if (!this._optimizedReaders.Contains(classDefinition.ClassName)) { this._optimizedReaders[classDefinition.ClassName] = new AMF3TempObjectReader(); Type type = ObjectFactory.Locate(classDefinition.ClassName); if (type != null) { instance = ObjectFactory.CreateInstance(type); if (classDefinition.IsExternalizable) { optimizer = new AMF3ExternalizableReader(); this._optimizedReaders[classDefinition.ClassName] = optimizer; instance = optimizer.ReadData(reader, classDefinition); } else { reader.AddAMF3ObjectReference(instance); IBytecodeProvider provider = null; if (FluorineConfiguration.Instance.OptimizerSettings.Provider == "codedom") { provider = new BytecodeProvider(); } if (FluorineConfiguration.Instance.OptimizerSettings.Provider == "il") { provider = new BytecodeProvider(); } optimizer = provider.GetReflectionOptimizer(type, classDefinition, reader, instance); if (optimizer != null) { this._optimizedReaders[classDefinition.ClassName] = optimizer; } else { this._optimizedReaders[classDefinition.ClassName] = new AMF3TempObjectReader(); } } return(instance); } optimizer = new AMF3TypedASObjectReader(classDefinition.ClassName); this._optimizedReaders[classDefinition.ClassName] = optimizer; return(optimizer.ReadData(reader, classDefinition)); } optimizer = this._optimizedReaders[classDefinition.ClassName] as IReflectionOptimizer; return(optimizer.ReadData(reader, classDefinition)); } optimizer = new AMF3TypedASObjectReader(classDefinition.ClassName); this._optimizedReaders[classDefinition.ClassName] = optimizer; return(optimizer.ReadData(reader, classDefinition)); } } return(optimizer.ReadData(reader, classDefinition)); }
public object ReadData(AMFReader reader) { int handle = reader.ReadAMF3IntegerData(); bool inline = ((handle & 1) != 0); handle = handle >> 1; if (!inline) { //An object reference return(reader.ReadAMF3ObjectReference(handle)); } else { ClassDefinition classDefinition = reader.ReadClassDefinition(handle); object instance = null; IReflectionOptimizer reflectionOptimizer = _optimizedReaders[classDefinition.ClassName] as IReflectionOptimizer; if (reflectionOptimizer == null) { lock (_optimizedReaders) { if (classDefinition.IsTypedObject) { if (!_optimizedReaders.Contains(classDefinition.ClassName)) { //Temporary reader _optimizedReaders[classDefinition.ClassName] = new AMF3TempObjectReader(); Type type = ObjectFactory.Locate(classDefinition.ClassName); if (type != null) { instance = ObjectFactory.CreateInstance(type); if (classDefinition.IsExternalizable) { reflectionOptimizer = new AMF3ExternalizableReader(); _optimizedReaders[classDefinition.ClassName] = reflectionOptimizer; instance = reflectionOptimizer.ReadData(reader, classDefinition); } else { reader.AddAMF3ObjectReference(instance); } } else { reflectionOptimizer = new AMF3TypedASObjectReader(classDefinition.ClassName); _optimizedReaders[classDefinition.ClassName] = reflectionOptimizer; instance = reflectionOptimizer.ReadData(reader, classDefinition); } } else { reflectionOptimizer = _optimizedReaders[classDefinition.ClassName] as IReflectionOptimizer; instance = reflectionOptimizer.ReadData(reader, classDefinition); } } else { reflectionOptimizer = new AMF3TypedASObjectReader(classDefinition.ClassName); _optimizedReaders[classDefinition.ClassName] = reflectionOptimizer; instance = reflectionOptimizer.ReadData(reader, classDefinition); } } } else { instance = reflectionOptimizer.ReadData(reader, classDefinition); } return(instance); } }
protected internal override IInstantiator BuildInstantiator(Mapping.Component component) { // TODO H3.2 not ported //if (component.IsEmbedded && ReflectHelper.IsAbstractClass(component.ComponentClass)) //{ // return new ProxiedInstantiator(component); //} //todo ÐÞ¸ÄÔ´Âë if (hasCustomAccessors || !Cfg.Environment.UseReflectionOptimizer) { optimizer = null; } else { optimizer = Cfg.Environment.BytecodeProvider.GetReflectionOptimizer(component.ComponentClass, getters, setters); } if (optimizer == null) { return new PocoInstantiator(component, null); } return new PocoInstantiator(component, optimizer.InstantiationOptimizer); }