예제 #1
1
		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);
			}
		}
예제 #2
0
 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;
		}
예제 #4
0
        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;
        }
예제 #5
0
 protected void ClearOptimizerWhenUsingCustomAccessors()
 {
     if (hasCustomAccessors)
     {
         optimizer = null;
     }
 }
예제 #6
0
        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);
			}
		}
예제 #8
0
 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;
     }
 }
예제 #10
0
        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;
 }
예제 #12
0
 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));
 }
예제 #13
0
        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);
            }
        }
예제 #14
0
        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);
		}
예제 #16
0
		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));
        }
예제 #19
0
 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);
            }
        }
예제 #22
0
		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));
        }
예제 #24
0
        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);
            }
        }
예제 #25
0
		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);
		}