4 using System.Collections;
\r
5 using System.Reflection;
\r
8 using Seasar.Framework.Util;
\r
9 using Seasar.Extension.ADO;
\r
10 using Seasar.Extension.ADO.Impl;
\r
12 using Seasar.Dao.Impl;
\r
14 using ${glPackageBaseCommonCBean};
\r
15 using ${glPackageBaseCommonDBMeta};
\r
16 using ${glPackageBaseCommonJavaLike};
\r
17 using ${glPackageBaseCommonS2DaoInternalRsHandler};
\r
19 namespace ${glPackageBaseCommonS2Dao} {
\r
21 public class ${glS2DaoMetaDataFactoryImpl} : Seasar.Dao.IDaoMetaDataFactory {
\r
23 // ===============================================================================
\r
26 private static readonly log4net.ILog _log = log4net.LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType);
\r
28 // ===============================================================================
\r
31 private readonly Hashtable _daoMetaDataCache = new Hashtable();
\r
32 protected readonly IDataSource _dataSource;
\r
33 protected readonly ICommandFactory _commandFactory;
\r
34 protected readonly IDataReaderFactory _dataReaderFactory;
\r
35 protected readonly IAnnotationReaderFactory _readerFactory;
\r
36 protected IDatabaseMetaData _dbMetaData;
\r
37 protected string _sqlFileEncoding = Encoding.Default.WebName;
\r
38 protected string[] _insertPrefixes;
\r
39 protected string[] _updatePrefixes;
\r
40 protected string[] _deletePrefixes;
\r
41 protected Map<Type, IBeanMetaData> _beanMetaDataCacheMap = new HashMap<Type, IBeanMetaData>();
\r
43 // ===============================================================================
\r
46 public ${glS2DaoMetaDataFactoryImpl}(IDataSource dataSource,
\r
47 ICommandFactory commandFactory, IAnnotationReaderFactory readerFactory,
\r
48 IDataReaderFactory dataReaderFactory) {
\r
49 _dataSource = dataSource;
\r
50 _commandFactory = commandFactory;
\r
51 _readerFactory = readerFactory;
\r
52 _dataReaderFactory = dataReaderFactory;
\r
55 // ===============================================================================
\r
58 public IDaoMetaData GetDaoMetaData(Type daoType) {
\r
60 string key = daoType.FullName;
\r
61 IDaoMetaData dmd = (IDaoMetaData)_daoMetaDataCache[key];
\r
65 if (_log.IsDebugEnabled) {
\r
66 _log.Debug("...Creating daoMetaData for '" + daoType.Name + "'.");
\r
68 dmd = CreateDaoMetaData(daoType);
\r
69 _daoMetaDataCache[key] = dmd;
\r
74 protected virtual IDaoMetaData CreateDaoMetaData(Type daoType) {
\r
75 ${glS2DaoMetaDataExtension} dmd = NewDaoMetaDataExtension();
\r
76 dmd.DaoType = daoType;
\r
77 dmd.DataSource = _dataSource;
\r
78 dmd.CommandFactory = _commandFactory;
\r
79 dmd.DataReaderFactory = _dataReaderFactory;
\r
80 dmd.DataReaderHandlerFactory = CreateInternalDataReaderHandlerFactory();
\r
81 dmd.AnnotationReaderFactory = _readerFactory;
\r
82 if (_dbMetaData == null) {
\r
83 _dbMetaData = new DatabaseMetaDataImpl(_dataSource);
\r
85 dmd.DatabaseMetaData = _dbMetaData;
\r
86 if (_sqlFileEncoding != null) {
\r
87 dmd.SqlFileEncoding = _sqlFileEncoding;
\r
89 if (_insertPrefixes != null) {
\r
90 dmd.InsertPrefixes = _insertPrefixes;
\r
92 if (_updatePrefixes != null) {
\r
93 dmd.UpdatePrefixes = _updatePrefixes;
\r
95 if (_deletePrefixes != null) {
\r
96 dmd.DeletePrefixes = _deletePrefixes;
\r
98 dmd.BeanMetaDataCacheMap = _beanMetaDataCacheMap;
\r
103 protected virtual ${glS2DaoMetaDataExtension} NewDaoMetaDataExtension() {
\r
104 return new ${glS2DaoMetaDataExtension}();
\r
107 protected virtual InternalDataReaderHandlerFactory CreateInternalDataReaderHandlerFactory() {
\r
108 return new InternalDataReaderHandlerFactory();
\r
111 // ===============================================================================
\r
114 public IDatabaseMetaData DBMetaData {
\r
115 set { _dbMetaData = value; }
\r
118 public string[] InsertPrefixes {
\r
119 set { _insertPrefixes = value; }
\r
122 public string[] UpdatePrefixes {
\r
123 set { _updatePrefixes = value; }
\r
126 public string[] DeletePrefixes {
\r
127 set { _deletePrefixes = value; }
\r
130 public string SqlFileEncoding {
\r
131 set { _sqlFileEncoding = value; }
\r
135 // ===================================================================================
\r
138 public class InternalProcedureMetaData {
\r
139 protected String _procedureName;
\r
140 protected LinkedHashMap<String, InternalProcedureParameterType> parameterTypeMap = new LinkedHashMap<String, InternalProcedureParameterType>();
\r
141 protected Type _returnType;
\r
142 public InternalProcedureMetaData(String procedureName) {
\r
143 _procedureName = procedureName;
\r
145 public String ProcedureName { get {
\r
146 return _procedureName;
\r
148 _procedureName = value;
\r
150 public InternalProcedureParameterType GetParameterType(int index) {
\r
151 return parameterTypeMap.get(index);
\r
153 public InternalProcedureParameterType GetParameterType(String parameterName) {
\r
154 return parameterTypeMap.get(parameterName.ToLower());
\r
156 public int ParameterTypeSize { get {
\r
157 return parameterTypeMap.size();
\r
159 public bool HasReturnParameterType { get {
\r
160 return _returnType != null;
\r
162 public Type ReturnParameterType { get {
\r
163 return _returnType;
\r
165 public void AddParameterType(InternalProcedureParameterType parameterType) {
\r
166 String name = parameterType.ParameterName;
\r
167 parameterTypeMap.put(name.ToLower(), parameterType);
\r
168 if (parameterType.IsReturnType) {
\r
169 _returnType = parameterType.ParameterPropertyType;
\r
174 public class InternalProcedureParameterType {
\r
175 protected String _parameterName;
\r
176 protected PropertyInfo _parameterProperty;
\r
177 protected Type _parameterPropertyType;
\r
178 protected ParameterDirection _parameterDirectionType;
\r
179 protected bool _inType;
\r
180 protected bool _outType;
\r
181 protected bool _returnType;
\r
182 public InternalProcedureParameterType(String parameterName, PropertyInfo parameterProperty) {
\r
183 _parameterName = parameterName;
\r
184 _parameterProperty = parameterProperty;
\r
185 _parameterPropertyType = parameterProperty.PropertyType;
\r
187 public Object GetValue(Object dto) {
\r
188 return _parameterProperty.GetValue(dto, null);
\r
190 public void SetValue(Object dto, Object value) {
\r
191 _parameterProperty.SetValue(dto, value, null);
\r
193 public String ParameterName { get { return _parameterName; } }
\r
194 public PropertyInfo ParameterProperty { get { return _parameterProperty; } }
\r
195 public Type ParameterPropertyType { get { return _parameterPropertyType; } }
\r
196 public ParameterDirection ParameterDirectionType { get { return _parameterDirectionType; } set { _parameterDirectionType = value; } }
\r
197 public bool IsInType { get { return _inType; } set { _inType = value; } }
\r
198 public bool IsOutType { get { return _outType; } set { _outType = value; } }
\r
199 public bool IsReturnType { get { return _returnType; } set { _returnType = value; } }
\r
202 public class InternalProcedureMetaDataFactory {
\r
203 protected InternalFieldProcedureAnnotationReader _annotationReader = new InternalFieldProcedureAnnotationReader();
\r
204 public InternalProcedureMetaData CreateProcedureMetaData(String procedureName, Type pmbType) {
\r
205 InternalProcedureMetaData metaData = new InternalProcedureMetaData(procedureName);
\r
206 if (pmbType == null) {
\r
209 if (!IsDtoType(pmbType)) {
\r
210 throw new IllegalStateException("The pmb type is Not DTO type: " + pmbType.Name);
\r
213 RegisterParameterType(metaData, pmbType, pmbType.GetProperties());
\r
216 protected void RegisterParameterType(InternalProcedureMetaData metaData, Type pmbType, PropertyInfo[] properties) {
\r
217 foreach (PropertyInfo property in properties) {
\r
218 InternalProcedureParameterType ppt = GetProcedureParameterType(pmbType, property);
\r
222 metaData.AddParameterType(ppt);
\r
225 protected InternalProcedureParameterType GetProcedureParameterType(Type pmbType, PropertyInfo property) {
\r
226 InternalProcedureParameterInfo info = _annotationReader.GetProcedureParameter(pmbType, property);
\r
227 if (info == null) {
\r
230 String name = info.ParameterName;
\r
231 String type = info.ParameterType;
\r
232 type = type.ToLower();
\r
233 InternalProcedureParameterType ppt = new InternalProcedureParameterType(name, property);
\r
234 if (type.Equals("in")) {
\r
235 ppt.IsInType = true;
\r
236 ppt.ParameterDirectionType = ParameterDirection.Input;
\r
237 } else if (type.Equals("out")) {
\r
238 ppt.IsOutType = true;
\r
239 ppt.ParameterDirectionType = ParameterDirection.Output;
\r
240 } else if (type.Equals("inout")) {
\r
241 ppt.IsInType = true;
\r
242 ppt.IsOutType = true;
\r
243 ppt.ParameterDirectionType = ParameterDirection.InputOutput;
\r
244 } else if (type.Equals("return")) {
\r
245 ppt.IsOutType = true;
\r
246 ppt.IsReturnType = true;
\r
247 ppt.ParameterDirectionType = ParameterDirection.ReturnValue;
\r
249 throw new IllegalStateException("The parameter type is wrong: type=" + type);
\r
253 protected bool IsDtoType(Type clazz) {
\r
254 return true; // No check because no time.
\r
258 public class InternalFieldProcedureAnnotationReader {
\r
259 protected String PROCEDURE_PARAMETER_SUFFIX;
\r
260 public InternalFieldProcedureAnnotationReader() {
\r
261 PROCEDURE_PARAMETER_SUFFIX = "_PROCEDURE_PARAMETER";
\r
263 public InternalProcedureParameterInfo GetProcedureParameter(Type pmbType, PropertyInfo property) {
\r
264 String propertyName = property.Name;
\r
265 String annotationName = InitUncap(propertyName) + PROCEDURE_PARAMETER_SUFFIX;
\r
266 FieldInfo field = pmbType.GetField(annotationName, BindingFlags.Public | BindingFlags.Static);
\r
267 if (field != null) {
\r
268 String annotationValue = (String)field.GetValue(null);
\r
269 InternalProcedureParameterInfo info = new InternalProcedureParameterInfo();
\r
270 String[] values = annotationValue.Split(',');
\r
271 if (values.Length != 2) {
\r
272 String msg = "The value of annotation is wrong.";
\r
273 msg = msg + " You should set '[parameterName], [parameterType]'.";
\r
274 msg = msg + " But: annotation=" + annotationName + " value=" + annotationValue;
\r
275 throw new IllegalStateException(msg);
\r
277 info.ParameterName = values[0].Trim();
\r
278 info.ParameterType = values[1].Trim();
\r
284 protected String InitUncap(String str) {
\r
285 return str.Substring(0, 1).ToLower() + str.Substring(1);
\r
289 public class InternalProcedureParameterInfo {
\r
290 protected String _parameterName;
\r
291 protected String _parameterType;
\r
292 public String ParameterName { get { return _parameterName; } set { _parameterName = value; } }
\r
293 public String ParameterType { get { return _parameterType; } set { _parameterType = value; } }
\r
296 // ===================================================================================
\r
299 public class InternalRowCreator : RowCreatorImpl {
\r
301 protected ${glDBMetaInterfaceName} _dbmeta;
\r
302 public ${glDBMetaInterfaceName} DBMeta { set { _dbmeta = value; } }
\r
304 public static InternalRowCreator CreateInternalRowCreator(Type beanClass) {
\r
305 InternalRowCreator rowCreator = new InternalRowCreator();
\r
306 if (beanClass != null) {
\r
307 rowCreator.DBMeta = FindDBMetaByClass(beanClass);
\r
312 protected static ${glDBMetaInterfaceName} FindDBMetaByClass(Type beanClass) {
\r
313 Object instance = NewInstance(beanClass);
\r
314 if (!(instance is ${glEntityInterfaceName})) {
\r
317 return ((${glEntityInterfaceName})instance).DBMeta;
\r
320 protected static Object NewInstance(Type clazz) {
\r
321 return ClassUtil.NewInstance(clazz);
\r
324 public override Object CreateRow(IDataReader reader, IColumnMetaData[] columns, Type beanType) {
\r
326 ${glDBMetaInterfaceName} dbmeta;
\r
327 if (_dbmeta != null) {
\r
329 row = dbmeta.NewEntity();
\r
331 row = NewBean(beanType);
\r
332 dbmeta = FindDBMeta(row);
\r
334 if (dbmeta != null) {
\r
335 foreach (IColumnMetaData column in columns) {
\r
336 Object value = column.ValueType.GetValue(reader, column.ColumnName);
\r
337 if (dbmeta.HasEntityPropertySetupper(column.PropertyInfo.Name)) {
\r
338 dbmeta.SetupEntityProperty(column.PropertyInfo.Name, row, value);
\r
341 column.PropertyInfo.SetValue(row, value, null);
\r
344 foreach (IColumnMetaData column in columns) {
\r
345 Object value = column.ValueType.GetValue(reader, column.ColumnName);
\r
346 column.PropertyInfo.SetValue(row, value, null);
\r
352 public static ${glDBMetaInterfaceName} FindDBMeta(Object row) {
\r
353 return DBMetaCacheHandler.FindDBMeta(row);
\r
356 public static ${glDBMetaInterfaceName} FindDBMeta(Type rowType, String tableName) {
\r
357 return DBMetaCacheHandler.FindDBMeta(rowType, tableName);
\r
361 public class DBMetaCacheHandler {
\r
362 protected static readonly String DBMETA_CACHE_KEY = "df:DBMetaCache";
\r
364 public static ${glDBMetaInterfaceName} FindDBMeta(Object row) {
\r
365 if (!(row is ${glEntityInterfaceName})) {
\r
368 ${glEntityInterfaceName} entity = (${glEntityInterfaceName})row;
\r
369 ${glDBMetaInterfaceName} dbmeta = FindCachedDBMeta(entity.GetType());
\r
370 if (dbmeta != null) {
\r
373 dbmeta = entity.DBMeta;
\r
374 CacheDBMeta(entity, dbmeta);
\r
378 public static ${glDBMetaInterfaceName} FindDBMeta(Type rowType, String tableName) {
\r
379 ${glDBMetaInterfaceName} dbmeta = FindCachedDBMeta(rowType);
\r
380 if (dbmeta != null) {
\r
384 dbmeta = ${glDBMetaInstanceHandlerName}.FindDBMeta(tableName);
\r
385 } catch (DBMetaNotFoundException) {
\r
388 CacheDBMeta(rowType, dbmeta);
\r
392 protected static ${glDBMetaInterfaceName} FindCachedDBMeta(Type rowType) {
\r
393 System.Collections.Generic.IDictionary<Type, ${glDBMetaInterfaceName}> dbmetaCache = FindDBMetaCache();
\r
394 if (dbmetaCache == null) {
\r
395 dbmetaCache = new System.Collections.Generic.Dictionary<Type, ${glDBMetaInterfaceName}>();
\r
396 ${glInternalMapContextName}.SetObject(DBMETA_CACHE_KEY, dbmetaCache);
\r
398 if (dbmetaCache.ContainsKey(rowType)) {
\r
399 return dbmetaCache[rowType];
\r
404 protected static void CacheDBMeta(${glEntityInterfaceName} entity, ${glDBMetaInterfaceName} dbmeta) {
\r
405 CacheDBMeta(entity.GetType(), dbmeta);
\r
408 protected static void CacheDBMeta(Type type, ${glDBMetaInterfaceName} dbmeta) {
\r
409 System.Collections.Generic.IDictionary<Type, ${glDBMetaInterfaceName}> dbmetaCache = FindDBMetaCache();
\r
410 dbmetaCache.Add(type, dbmeta);
\r
413 protected static System.Collections.Generic.IDictionary<Type, ${glDBMetaInterfaceName}> FindDBMetaCache() {
\r
414 return (System.Collections.Generic.IDictionary<Type, ${glDBMetaInterfaceName}>)${glInternalMapContextName}.GetObject(DBMETA_CACHE_KEY);
\r
418 public class InternalRelationRowCreator : RelationRowCreatorImpl {
\r
420 protected override void SetupRelationKeyValue(RelationRowCreationResource res) {
\r
421 IRelationPropertyType rpt = res.RelationPropertyType;
\r
422 IBeanMetaData bmd = rpt.BeanMetaData;
\r
423 ${glDBMetaInterfaceName} dbmeta = FindDBMeta(bmd.BeanType, bmd.TableName);
\r
424 for (int i = 0; i < rpt.KeySize; ++i) {
\r
425 String columnName = rpt.GetMyKey(i) + res.BaseSuffix;
\r
427 if (!res.ContainsColumnName(columnName)) {
\r
430 if (!res.HasRowInstance()) {
\r
432 if (dbmeta != null) {
\r
433 row = dbmeta.NewEntity();
\r
435 row = NewRelationRow(rpt);
\r
439 if (!res.ContainsRelKeyValueIfExists(columnName)) {
\r
442 Object value = res.ExtractRelKeyValue(columnName);
\r
443 if (value == null) {
\r
447 String yourKey = rpt.GetYourKey(i);
\r
448 IPropertyType pt = bmd.GetPropertyTypeByColumnName(yourKey);
\r
449 PropertyInfo pi = pt.PropertyInfo;
\r
450 pi.SetValue(res.Row, value, null);
\r
455 protected Object CreateRelationRowInstance(${glDBMetaInterfaceName} dbmeta) {
\r
456 if (dbmeta != null) {
\r
457 return dbmeta.NewEntity();
\r
462 protected ${glDBMetaInterfaceName} FindDBMeta(Type rowType, String tableName) {
\r
463 return ${glInternalRowCreator}.FindDBMeta(rowType, tableName);
\r
466 protected override void SetupRelationAllValue(RelationRowCreationResource res) {
\r
467 System.Collections.Generic.IDictionary<String, IPropertyType> propertyCacheElement = res.ExtractPropertyCacheElement();
\r
468 System.Collections.Generic.ICollection<String> columnNameCacheElementKeySet = propertyCacheElement.Keys;
\r
469 foreach (String columnName in columnNameCacheElementKeySet) {
\r
470 IPropertyType pt = propertyCacheElement[columnName];
\r
471 res.CurrentPropertyType = pt;
\r
472 if (!IsValidRelationPerPropertyLoop(res)) {
\r
473 res.ClearRowInstance();
\r
476 SetupRelationProperty(res);
\r
478 if (!IsValidRelationAfterPropertyLoop(res)) {
\r
479 res.ClearRowInstance();
\r
482 res.ClearValidValueCount();
\r
483 if (res.HasNextRelationProperty() && (HasConditionBean(res) || res.HasNextRelationLevel())) {
\r
484 SetupNextRelationRow(res);
\r
488 protected override void RegisterRelationValue(RelationRowCreationResource res, String columnName) {
\r
489 IPropertyType pt = res.CurrentPropertyType;
\r
490 Object value = null;
\r
491 if (res.ContainsRelKeyValueIfExists(columnName)) {
\r
492 value = res.ExtractRelKeyValue(columnName);
\r
494 IValueType valueType = pt.ValueType;
\r
495 value = valueType.GetValue(res.DataReader, columnName);
\r
497 if (value != null) {
\r
498 res.IncrementValidValueCount();
\r
499 ${glDBMetaInterfaceName} dbmeta = FindDBMeta(res.Row);
\r
500 String propertyName = pt.PropertyName;
\r
501 if (dbmeta != null && dbmeta.HasEntityPropertySetupper(propertyName)) {
\r
502 dbmeta.SetupEntityProperty(propertyName, res.Row, value);
\r
504 PropertyInfo pd = pt.PropertyInfo;
\r
505 pd.SetValue(res.Row, value, null);
\r
510 protected ${glDBMetaInterfaceName} FindDBMeta(Object row) {
\r
511 return ${glInternalRowCreator}.FindDBMeta(row);
\r
514 protected override void SetupPropertyCache(RelationRowCreationResource res) {
\r
515 // - - - - - - - - - - -
\r
516 // Recursive Call Point!
\r
517 // - - - - - - - - - - -
\r
518 res.InitializePropertyCacheElement();
\r
520 // Do only selected foreign property for performance if condition-bean exists.
\r
521 if (HasConditionBean(res) && !HasSelectedForeignInfo(res)) {
\r
525 // Set up property cache about current beanMetaData.
\r
526 IBeanMetaData nextBmd = res.GetRelationBeanMetaData();
\r
527 for (int i = 0; i < nextBmd.PropertyTypeSize; ++i) {
\r
528 IPropertyType pt = nextBmd.GetPropertyType(i);
\r
529 res.CurrentPropertyType = pt;
\r
530 if (!IsTargetProperty(res)) {
\r
533 SetupPropertyCacheElement(res);
\r
536 // Set up next relation.
\r
537 if (res.HasNextRelationProperty() && (HasConditionBean(res) || res.HasNextRelationLevel())) {
\r
538 res.BackupRelationPropertyType();
\r
539 res.IncrementCurrentRelationNestLevel();
\r
541 SetupNextPropertyCache(res, nextBmd);
\r
543 res.RestoreRelationPropertyType();
\r
544 res.DecrementCurrentRelationNestLevel();
\r
549 protected override bool IsTargetProperty(RelationRowCreationResource res) {
\r
550 IPropertyType pt = res.CurrentPropertyType;
\r
551 if (!pt.PropertyInfo.CanWrite) {
\r
554 if (typeof(System.Collections.Generic.IList<>).IsAssignableFrom(pt.PropertyInfo.GetType())) {
\r
560 protected override bool IsCreateDeadLink() {
\r
564 protected override int GetLimitRelationNestLevel() {
\r
568 protected bool HasConditionBean(RelationRowCreationResource res) {
\r
569 return ${glConditionBeanContextName}.IsExistConditionBeanOnThread();
\r
572 protected bool HasSelectedForeignInfo(RelationRowCreationResource res) {
\r
573 ${glConditionBeanInterfaceName} cb = ${glConditionBeanContextName}.GetConditionBeanOnThread();
\r
574 if (cb.SqlClause.hasSelectedForeignInfo(res.RelationNoSuffix)) {
\r
581 // ===================================================================================
\r
582 // Data Reader Handler
\r
583 // ===================
\r
584 public class InternalDataReaderHandlerFactory : IDataReaderHandlerFactory {
\r
585 public virtual IDataReaderHandler GetResultSetHandler(Type beanType, IBeanMetaData bmd, MethodInfo mi) {
\r
586 Type retType = mi.ReturnType;
\r
587 if (typeof(DataSet).IsAssignableFrom(retType)) {
\r
588 return CreateBeanDataSetMetaDataDataReaderHandler(bmd, retType);
\r
589 } else if (typeof(DataTable).IsAssignableFrom(retType)) {
\r
590 return CreateBeanDataTableMetaDataDataReaderHandler(bmd, retType);
\r
591 } else if (retType.IsArray) {
\r
592 Type elementType = retType.GetElementType();
\r
593 if (AssignTypeUtil.IsSimpleType(elementType)) {
\r
594 return CreateObjectArrayDataReaderHandler(elementType);
\r
596 return CreateBeanArrayMetaDataDataReaderHandler(bmd);
\r
598 } else if (AssignTypeUtil.IsList(retType)) {
\r
599 if (AssignTypeUtil.IsSimpleType(beanType)) {
\r
600 return CreateObjectListDataReaderHandler();
\r
602 return CreateBeanListMetaDataDataReaderHandler(bmd);
\r
604 } else if (IsBeanTypeAssignable(beanType, retType)) {
\r
605 return CreateBeanMetaDataDataReaderHandler(bmd);
\r
606 } else if (AssignTypeUtil.IsGenericList(retType)) {
\r
607 Type elementType = retType.GetGenericArguments()[0];
\r
608 if (AssignTypeUtil.IsSimpleType(elementType)) {
\r
609 return CreateObjectGenericListDataReaderHandler(elementType);
\r
611 return CreateBeanGenericListMetaDataDataReaderHandler(bmd);
\r
614 return CreateObjectDataReaderHandler();
\r
618 protected virtual IDataReaderHandler CreateObjectGenericListDataReaderHandler(Type elementType) {
\r
619 return new ObjectGenericListDataReaderHandler(elementType);
\r
622 protected virtual IDataReaderHandler CreateObjectListDataReaderHandler() {
\r
623 return new ObjectListDataReaderHandler();
\r
626 protected virtual IDataReaderHandler CreateObjectArrayDataReaderHandler(Type elementType) {
\r
627 return new ObjectArrayDataReaderHandler(elementType);
\r
630 protected virtual IDataReaderHandler CreateBeanDataSetMetaDataDataReaderHandler(IBeanMetaData bmd, Type returnType) {
\r
631 return new BeanDataSetMetaDataDataReaderHandler(returnType);
\r
634 protected virtual IDataReaderHandler CreateBeanDataTableMetaDataDataReaderHandler(IBeanMetaData bmd, Type returnType) {
\r
635 return new BeanDataTableMetaDataDataReaderHandler(returnType);
\r
638 protected virtual IDataReaderHandler CreateBeanListMetaDataDataReaderHandler(IBeanMetaData bmd) {
\r
639 return new BeanListMetaDataDataReaderHandler(bmd, CreateRowCreator(), CreateRelationRowCreator());
\r
642 protected virtual IDataReaderHandler CreateBeanMetaDataDataReaderHandler(IBeanMetaData bmd) {
\r
643 return new BeanMetaDataDataReaderHandler(bmd, CreateRowCreator(), CreateRelationRowCreator());
\r
646 // DBFlute Target (but unused actually)
\r
647 protected virtual IDataReaderHandler CreateBeanArrayMetaDataDataReaderHandler(IBeanMetaData bmd) {
\r
648 InternalRowCreator rowCreator = CreateInternalRowCreator(bmd);
\r
649 InternalRelationRowCreator relationRowCreator = CreateInternalRelationRowCreator(bmd);
\r
650 return new ${glInternalBeanArrayMetaDataResultSetHandler}(bmd, rowCreator, relationRowCreator);
\r
654 protected virtual IDataReaderHandler CreateBeanGenericListMetaDataDataReaderHandler(IBeanMetaData bmd) {
\r
655 InternalRowCreator rowCreator = CreateInternalRowCreator(bmd);
\r
656 InternalRelationRowCreator relationRowCreator = CreateInternalRelationRowCreator(bmd);
\r
657 return new ${glInternalBeanGenericListMetaDataResultSetHandler}(bmd, rowCreator, relationRowCreator);
\r
660 protected virtual IDataReaderHandler CreateObjectDataReaderHandler() {
\r
661 return new ObjectDataReaderHandler();
\r
664 protected virtual IRowCreator CreateRowCreator() {
\r
665 return CreateInternalRowCreator(null);
\r
668 protected virtual IRelationRowCreator CreateRelationRowCreator() {
\r
669 return CreateInternalRelationRowCreator(null);
\r
672 protected virtual bool IsBeanTypeAssignable(Type beanType, Type type) {
\r
673 return beanType.IsAssignableFrom(type) || type.IsAssignableFrom(beanType);
\r
676 protected InternalRowCreator CreateInternalRowCreator(IBeanMetaData bmd) {
\r
677 Type clazz = bmd != null ? bmd.BeanType : null;
\r
678 return InternalRowCreator.CreateInternalRowCreator(clazz);
\r
681 protected InternalRelationRowCreator CreateInternalRelationRowCreator(IBeanMetaData bmd) {
\r
682 return new InternalRelationRowCreator(); // Not yet implemented about performance tuning!
\r