DataSqlMapperBuilder
This commit is contained in:
@@ -10,6 +10,7 @@ import java.lang.reflect.ParameterizedType;
|
|||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
|
import java.util.concurrent.CompletableFuture;
|
||||||
import java.util.function.IntFunction;
|
import java.util.function.IntFunction;
|
||||||
import org.redkale.asm.AnnotationVisitor;
|
import org.redkale.asm.AnnotationVisitor;
|
||||||
import org.redkale.asm.AsmMethodBean;
|
import org.redkale.asm.AsmMethodBean;
|
||||||
@@ -38,6 +39,7 @@ import org.redkale.asm.Type;
|
|||||||
import org.redkale.persistence.Sql;
|
import org.redkale.persistence.Sql;
|
||||||
import org.redkale.source.AbstractDataSqlSource;
|
import org.redkale.source.AbstractDataSqlSource;
|
||||||
import org.redkale.source.DataNativeSqlInfo;
|
import org.redkale.source.DataNativeSqlInfo;
|
||||||
|
import static org.redkale.source.DataNativeSqlInfo.SqlMode.SELECT;
|
||||||
import org.redkale.source.DataNativeSqlParser;
|
import org.redkale.source.DataNativeSqlParser;
|
||||||
import org.redkale.source.DataSqlMapper;
|
import org.redkale.source.DataSqlMapper;
|
||||||
import org.redkale.source.DataSqlSource;
|
import org.redkale.source.DataSqlSource;
|
||||||
@@ -118,6 +120,9 @@ public final class DataSqlMapperBuilder {
|
|||||||
if (!Modifier.isAbstract(method.getModifiers())) {
|
if (!Modifier.isAbstract(method.getModifiers())) {
|
||||||
throw new SourceException(method + " is not abstract, but contains @" + Sql.class.getSimpleName());
|
throw new SourceException(method + " is not abstract, but contains @" + Sql.class.getSimpleName());
|
||||||
}
|
}
|
||||||
|
if (method.getExceptionTypes().length > 0) {
|
||||||
|
throw new SourceException("@" + Sql.class.getSimpleName() + " cannot on throw-exception method, but " + method);
|
||||||
|
}
|
||||||
IntFunction<String> signFunc = null;
|
IntFunction<String> signFunc = null;
|
||||||
if (source instanceof AbstractDataSqlSource) {
|
if (source instanceof AbstractDataSqlSource) {
|
||||||
signFunc = ((AbstractDataSqlSource) source).getSignFunc();
|
signFunc = ((AbstractDataSqlSource) source).getSignFunc();
|
||||||
@@ -127,6 +132,14 @@ public final class DataSqlMapperBuilder {
|
|||||||
if (!Utility.equalsElement(sqlInfo.getRootParamNames(), methodBean.fieldNameList())) {
|
if (!Utility.equalsElement(sqlInfo.getRootParamNames(), methodBean.fieldNameList())) {
|
||||||
throw new SourceException(method + " parameters not match @" + Sql.class.getSimpleName() + "(" + sql.value() + ")");
|
throw new SourceException(method + " parameters not match @" + Sql.class.getSimpleName() + "(" + sql.value() + ")");
|
||||||
}
|
}
|
||||||
|
Class returnType = returnType(method);
|
||||||
|
if (sqlInfo.getSqlMode() != SELECT) {
|
||||||
|
if (returnType != Integer.class && returnType != int.class
|
||||||
|
&& returnType != Void.class && returnType != void.class) {
|
||||||
|
throw new SourceException("@" + Sql.class.getSimpleName()
|
||||||
|
+ "(" + sql.value() + ") must on return int or void method, but " + method);
|
||||||
|
}
|
||||||
|
}
|
||||||
items.add(new Item(method, sqlInfo, methodBean));
|
items.add(new Item(method, sqlInfo, methodBean));
|
||||||
}
|
}
|
||||||
//------------------------------------------------------------------------------
|
//------------------------------------------------------------------------------
|
||||||
@@ -157,9 +170,9 @@ public final class DataSqlMapperBuilder {
|
|||||||
mv.visitEnd();
|
mv.visitEnd();
|
||||||
}
|
}
|
||||||
{
|
{
|
||||||
mv = cw.visitMethod(ACC_PUBLIC, "dataSource", "()Lorg/redkale/source/DataSqlSource;", null, null);
|
mv = cw.visitMethod(ACC_PUBLIC, "dataSource", "()" + sqlSourceDesc, null, null);
|
||||||
mv.visitVarInsn(ALOAD, 0);
|
mv.visitVarInsn(ALOAD, 0);
|
||||||
mv.visitFieldInsn(GETFIELD, "org/redkale/test/source/parser/DynForumInfoMapperImpl", "source", sqlSourceDesc);
|
mv.visitFieldInsn(GETFIELD, newDynName, "_source", sqlSourceDesc);
|
||||||
mv.visitInsn(ARETURN);
|
mv.visitInsn(ARETURN);
|
||||||
mv.visitMaxs(1, 1);
|
mv.visitMaxs(1, 1);
|
||||||
mv.visitEnd();
|
mv.visitEnd();
|
||||||
@@ -167,7 +180,7 @@ public final class DataSqlMapperBuilder {
|
|||||||
{
|
{
|
||||||
mv = cw.visitMethod(ACC_PUBLIC, "entityType", "()Ljava/lang/Class;", "()Ljava/lang/Class<" + entityDesc + ">;", null);
|
mv = cw.visitMethod(ACC_PUBLIC, "entityType", "()Ljava/lang/Class;", "()Ljava/lang/Class<" + entityDesc + ">;", null);
|
||||||
mv.visitVarInsn(ALOAD, 0);
|
mv.visitVarInsn(ALOAD, 0);
|
||||||
mv.visitFieldInsn(GETFIELD, newDynName, "type", "Ljava/lang/Class;");
|
mv.visitFieldInsn(GETFIELD, newDynName, "_type", "Ljava/lang/Class;");
|
||||||
mv.visitInsn(ARETURN);
|
mv.visitInsn(ARETURN);
|
||||||
mv.visitMaxs(1, 1);
|
mv.visitMaxs(1, 1);
|
||||||
mv.visitEnd();
|
mv.visitEnd();
|
||||||
@@ -180,7 +193,7 @@ public final class DataSqlMapperBuilder {
|
|||||||
AsmMethodBean methodBean = item.methodBean;
|
AsmMethodBean methodBean = item.methodBean;
|
||||||
Sql sql = method.getAnnotation(Sql.class);
|
Sql sql = method.getAnnotation(Sql.class);
|
||||||
|
|
||||||
mv = cw.visitMethod(ACC_PUBLIC, "queryForumResultAsync", "(Lorg/redkale/test/source/parser/ForumBean;)Ljava/util/concurrent/CompletableFuture;", "(Lorg/redkale/test/source/parser/ForumBean;)Ljava/util/concurrent/CompletableFuture<Ljava/util/List<Lorg/redkale/test/source/parser/ForumResult;>;>;", null);
|
mv = cw.visitMethod(ACC_PUBLIC, method.getName(), methodBean.getDesc(), methodBean.getSignature(), null);
|
||||||
Label l0 = new Label();
|
Label l0 = new Label();
|
||||||
mv.visitLabel(l0);
|
mv.visitLabel(l0);
|
||||||
mv.visitLdcInsn(sql.value());
|
mv.visitLdcInsn(sql.value());
|
||||||
@@ -255,6 +268,15 @@ public final class DataSqlMapperBuilder {
|
|||||||
throw new SourceException("Not found entity class from " + mapperType.getName());
|
throw new SourceException("Not found entity class from " + mapperType.getName());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private static Class returnType(Method method) {
|
||||||
|
Class type = method.getReturnType();
|
||||||
|
if (type.isAssignableFrom(CompletableFuture.class)) {
|
||||||
|
ParameterizedType pt = (ParameterizedType) method.getGenericReturnType();
|
||||||
|
return TypeToken.typeToClass(pt.getActualTypeArguments()[0]);
|
||||||
|
}
|
||||||
|
return type;
|
||||||
|
}
|
||||||
|
|
||||||
private static class Item {
|
private static class Item {
|
||||||
|
|
||||||
public Method method;
|
public Method method;
|
||||||
|
|||||||
@@ -15,9 +15,9 @@ import org.redkale.source.DataSqlSource;
|
|||||||
*/
|
*/
|
||||||
public class DynForumInfoMapperImpl implements ForumInfoMapper {
|
public class DynForumInfoMapperImpl implements ForumInfoMapper {
|
||||||
|
|
||||||
private DataSqlSource source;
|
private DataSqlSource _source;
|
||||||
|
|
||||||
private Class type;
|
private Class _type;
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public ForumResult findForumResult(ForumBean bean) {
|
public ForumResult findForumResult(ForumBean bean) {
|
||||||
@@ -51,12 +51,12 @@ public class DynForumInfoMapperImpl implements ForumInfoMapper {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public DataSqlSource dataSource() {
|
public DataSqlSource dataSource() {
|
||||||
return source;
|
return _source;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public Class<ForumInfo> entityType() {
|
public Class<ForumInfo> entityType() {
|
||||||
return type;
|
return _type;
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user