Package com.skyline.energy.definition

Source Code of com.skyline.energy.definition.JdbcQueryDefinition

package com.skyline.energy.definition;

import java.lang.annotation.Annotation;
import java.lang.reflect.Method;
import java.util.HashMap;
import java.util.Map;

import net.sf.cglib.core.ReflectUtils;

import org.apache.commons.lang.ClassUtils;

import com.skyline.energy.annotation.MapperBy;
import com.skyline.energy.annotation.Query;
import com.skyline.energy.annotation.Unique;
import com.skyline.energy.dataaccess.jdbc.RowMapper;
import com.skyline.energy.exception.DaoGenerateException;
import com.skyline.energy.utils.CommonUtils;
import com.skyline.energy.utils.GenericUtils;

public class JdbcQueryDefinition extends BaseJdbcDefinition {
  private int fetchSize;
  private int pageIndex = -1;
  private boolean isUnique = false;
  private RowMapper<?> rowMapper;
 
  public JdbcQueryDefinition(Method method) throws DaoGenerateException {
    init(method);
  }

  private void init(Method method) throws DaoGenerateException {
    configUnique(method);

    configRowMapper(method);

    Query query = method.getAnnotation(Query.class);
    fetchSize = query.fetchSize();

    Map<String, Integer> paramIndexes = new HashMap<String, Integer>(8, 1f);

    Class<?>[] paramTypes = method.getParameterTypes();
    Annotation[][] annotations = method.getParameterAnnotations();
    for (int index = 0; index < annotations.length; index++) {
      if (CommonUtils.isTypePage(paramTypes[index])) {
        pageIndex = index;
        break;
      }
    }
   
    parseParameterAnnotations(annotations, paramIndexes, null, paramTypes);

    String sql = query.value();
    parseSql(sql, paramTypes, paramIndexes);
   
    parseShardBy(method, paramIndexes, paramTypes);
  }

  private void configRowMapper(Method method) throws DaoGenerateException {
    MapperBy mapperBy = method.getAnnotation(MapperBy.class);
    Class<? extends RowMapper<?>> mapperType = null;
    if (mapperBy == null) {
      throw new DaoGenerateException("Missing @MapperBy on @Query");
    } else {
      mapperType = mapperBy.value();
    }
    rowMapper = (RowMapper<?>) ReflectUtils.newInstance(mapperType);

    Class<?> returnType = method.getReturnType();
    if (isUnique) {
      Class<?> expectedType = GenericUtils.getGenericTypeOfRowMapper(mapperType);
      if (!ClassUtils.isAssignable(returnType, expectedType, true)) {
        throw new DaoGenerateException("Return type is expected as '" + expectedType.getName()
            + "' with @Unique, but actually is '" + returnType.getName() + "' in method: "
            + method.toString() + ", missing @MappedBy");
      }
    } else {
      if (!CommonUtils.isTypeList(returnType)) {
        throw new DaoGenerateException(
            "Return type is expected as 'java.util.List' without @Unique, but actually is '"
                + returnType.getName() + "' in method: " + method.toString());
      }
    }
  }

  private void configUnique(Method method) {
    Unique unique = method.getAnnotation(Unique.class);
    if (unique != null) {
      isUnique = true;
    } else {
      isUnique = false;
    }
  }

  public int getFetchSize() {
    return fetchSize;
  }

  public int getPageIndex() {
    return pageIndex;
  }

  public boolean isUnique() {
    return isUnique;
  }

  public RowMapper<?> getRowMapper() {
    return rowMapper;
  }
 

}
TOP

Related Classes of com.skyline.energy.definition.JdbcQueryDefinition

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.