private Object instantiateCollectionPropertyIfAppropriate(
     ResultMapping resultMapping, MetaObject metaObject) {
   final String propertyName = resultMapping.getProperty();
   Object propertyValue = metaObject.getValue(propertyName);
   if (propertyValue == null) {
     Class<?> type = resultMapping.getJavaType();
     if (type == null) {
       type = metaObject.getSetterType(propertyName);
     }
     try {
       if (objectFactory.isCollection(type)) {
         propertyValue = objectFactory.create(type);
         metaObject.setValue(propertyName, propertyValue);
         return propertyValue;
       }
     } catch (Exception e) {
       throw new ExecutorException(
           "Error instantiating collection property for result '"
               + resultMapping.getProperty()
               + "'.  Cause: "
               + e,
           e);
     }
   } else if (objectFactory.isCollection(propertyValue.getClass())) {
     return propertyValue;
   }
   return null;
 }
 private void objectFactoryElement(XNode context) throws Exception {
   if (context != null) {
     String type = context.getStringAttribute("type");
     Properties properties = context.getChildrenAsProperties();
     ObjectFactory factory = (ObjectFactory) resolveClass(type).newInstance();
     factory.setProperties(properties);
     configuration.setObjectFactory(factory);
   }
 }
 private Object instantiateParameterObject(Class<?> parameterType) {
   if (parameterType == null) {
     return new HashMap<Object, Object>();
   } else {
     return objectFactory.create(parameterType);
   }
 }
 private Object createParameterizedResultObject(
     ResultSetWrapper rsw,
     Class<?> resultType,
     List<ResultMapping> constructorMappings,
     List<Class<?>> constructorArgTypes,
     List<Object> constructorArgs,
     String columnPrefix)
     throws SQLException {
   boolean foundValues = false;
   for (ResultMapping constructorMapping : constructorMappings) {
     final Class<?> parameterType = constructorMapping.getJavaType();
     final String column = constructorMapping.getColumn();
     final Object value;
     if (constructorMapping.getNestedQueryId() != null) {
       value =
           getNestedQueryConstructorValue(rsw.getResultSet(), constructorMapping, columnPrefix);
     } else if (constructorMapping.getNestedResultMapId() != null) {
       final ResultMap resultMap =
           configuration.getResultMap(constructorMapping.getNestedResultMapId());
       value = getRowValue(rsw, resultMap);
     } else {
       final TypeHandler<?> typeHandler = constructorMapping.getTypeHandler();
       value = typeHandler.getResult(rsw.getResultSet(), prependPrefix(column, columnPrefix));
     }
     constructorArgTypes.add(parameterType);
     constructorArgs.add(value);
     foundValues = value != null || foundValues;
   }
   return foundValues
       ? objectFactory.create(resultType, constructorArgTypes, constructorArgs)
       : null;
 }
 @SuppressWarnings("unchecked")
 public DefaultMapResultHandler(
     String mapKey, ObjectFactory objectFactory, ObjectWrapperFactory objectWrapperFactory) {
   this.objectFactory = objectFactory;
   this.objectWrapperFactory = objectWrapperFactory;
   this.mappedResults = objectFactory.create(Map.class);
   this.mapKey = mapKey;
 }
 public Object intercept(Object enhanced, Method method, Object[] args, MethodProxy methodProxy)
     throws Throwable {
   final String methodName = method.getName();
   try {
     synchronized (lazyLoader) {
       if (WRITE_REPLACE_METHOD.equals(methodName)) {
         Object original = null;
         if (constructorArgTypes.isEmpty()) {
           original = objectFactory.create(type);
         } else {
           original = objectFactory.create(type, constructorArgTypes, constructorArgs);
         }
         PropertyCopier.copyBeanProperties(type, enhanced, original);
         if (lazyLoader.size() > 0) {
           return new CglibSerialStateHolder(
               original,
               lazyLoader.getProperties(),
               objectFactory,
               constructorArgTypes,
               constructorArgs);
         } else {
           return original;
         }
       } else {
         if (lazyLoader.size() > 0 && !FINALIZE_METHOD.equals(methodName)) {
           if (aggressive || lazyLoadTriggerMethods.contains(methodName)) {
             lazyLoader.loadAll();
           } else if (PropertyNamer.isProperty(methodName)) {
             final String property = PropertyNamer.methodToProperty(methodName);
             if (lazyLoader.hasLoader(property)) {
               lazyLoader.load(property);
             }
           }
         }
       }
     }
     return methodProxy.invokeSuper(enhanced, args);
   } catch (Throwable t) {
     throw ExceptionUtil.unwrapThrowable(t);
   }
 }
Beispiel #7
0
 public void load() {
   Object value = null;
   @SuppressWarnings("unchecked") // we suppose we get back a List
   List<Object> list = (List<Object>) localCache.getObject(key);
   Class<?> targetType = resultObject.getSetterType(property);
   if (targetType.isAssignableFrom(list.getClass())) {
     value = list;
   } else if (objectFactory.isCollection(targetType)) {
     value = objectFactory.create(targetType);
     MetaObject metaObject = configuration.newMetaObject(value);
     metaObject.addAll(list);
   } else if (targetType.isArray()) {
     Object[] array = (Object[]) Array.newInstance(targetType.getComponentType(), list.size());
     value = list.toArray(array);
   } else {
     if (list != null && list.size() > 1) {
       throw new ExecutorException(
           "Statement returned more than one row, where no more than one was expected.");
     } else if (list != null && list.size() == 1) {
       value = list.get(0);
     }
   }
   resultObject.setValue(property, value);
 }
 private Object createResultObject(
     ResultSetWrapper rsw,
     ResultMap resultMap,
     List<Class<?>> constructorArgTypes,
     List<Object> constructorArgs,
     String columnPrefix)
     throws SQLException {
   final Class<?> resultType = resultMap.getType();
   final List<ResultMapping> constructorMappings = resultMap.getConstructorResultMappings();
   if (typeHandlerRegistry.hasTypeHandler(resultType)) {
     return createPrimitiveResultObject(rsw, resultMap, columnPrefix);
   } else if (constructorMappings.size() > 0) {
     return createParameterizedResultObject(
         rsw, resultType, constructorMappings, constructorArgTypes, constructorArgs, columnPrefix);
   } else {
     return objectFactory.create(resultType);
   }
 }