DataCallAttribute移至RpcCallAttribute
This commit is contained in:
117
src/org/redkale/service/RpcCallAttribute.java
Normal file
117
src/org/redkale/service/RpcCallAttribute.java
Normal file
@@ -0,0 +1,117 @@
|
|||||||
|
/*
|
||||||
|
* To change this license header, choose License Headers in Project Properties.
|
||||||
|
* To change this template file, choose Tools | Templates
|
||||||
|
* and open the template in the editor.
|
||||||
|
*/
|
||||||
|
package org.redkale.service;
|
||||||
|
|
||||||
|
import java.io.Serializable;
|
||||||
|
import java.lang.reflect.*;
|
||||||
|
import java.util.concurrent.ConcurrentHashMap;
|
||||||
|
import org.redkale.util.Attribute;
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* <p>
|
||||||
|
* 详情见: https://redkale.org
|
||||||
|
*
|
||||||
|
* @author zhangjx
|
||||||
|
*/
|
||||||
|
public class RpcCallAttribute implements Attribute<Object, Serializable> {
|
||||||
|
|
||||||
|
public static final RpcCallAttribute instance = new RpcCallAttribute();
|
||||||
|
|
||||||
|
private static final ConcurrentHashMap<Class, Attribute> attributes = new ConcurrentHashMap<>();
|
||||||
|
|
||||||
|
static <T> Attribute<T, Serializable> load(final Class clazz) {
|
||||||
|
Attribute rs = attributes.get(clazz);
|
||||||
|
if (rs != null) return rs;
|
||||||
|
synchronized (attributes) {
|
||||||
|
rs = attributes.get(clazz);
|
||||||
|
if (rs == null) {
|
||||||
|
Class cltmp = clazz;
|
||||||
|
do {
|
||||||
|
for (Field field : cltmp.getDeclaredFields()) {
|
||||||
|
try {
|
||||||
|
rs = Attribute.create(cltmp, field);
|
||||||
|
attributes.put(clazz, rs);
|
||||||
|
return rs;
|
||||||
|
} catch (RuntimeException e) {
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} while ((cltmp = cltmp.getSuperclass()) != Object.class);
|
||||||
|
}
|
||||||
|
return rs;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Class<Serializable> type() {
|
||||||
|
return Serializable.class;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Class<Object> declaringClass() {
|
||||||
|
return Object.class;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String field() {
|
||||||
|
return "";
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Serializable get(final Object obj) {
|
||||||
|
if (obj == null) return null;
|
||||||
|
return load(obj.getClass()).get(obj);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void set(final Object obj, final Serializable key) {
|
||||||
|
if (obj == null) return;
|
||||||
|
load(obj.getClass()).set(obj, key);
|
||||||
|
}
|
||||||
|
|
||||||
|
@SuppressWarnings("unchecked")
|
||||||
|
public static class RpcCallArrayAttribute<T, F> implements Attribute<T[], F> {
|
||||||
|
|
||||||
|
public static final RpcCallArrayAttribute instance = new RpcCallArrayAttribute();
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Class<? extends F> type() {
|
||||||
|
return (Class<F>) Object.class;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Class<T[]> declaringClass() {
|
||||||
|
return (Class<T[]>) (Class) Object[].class;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String field() {
|
||||||
|
return "";
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public F get(final T[] objs) {
|
||||||
|
if (objs == null || objs.length == 0) return null;
|
||||||
|
final Attribute<T, Serializable> attr = RpcCallAttribute.load(objs[0].getClass());
|
||||||
|
final Object keys = Array.newInstance(attr.type(), objs.length);
|
||||||
|
for (int i = 0; i < objs.length; i++) {
|
||||||
|
Array.set(keys, i, attr.get(objs[i]));
|
||||||
|
}
|
||||||
|
return (F) keys;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void set(final T[] objs, final F keys) {
|
||||||
|
if (objs == null || objs.length == 0) return;
|
||||||
|
final Attribute<T, Serializable> attr = RpcCallAttribute.load(objs[0].getClass());
|
||||||
|
for (int i = 0; i < objs.length; i++) {
|
||||||
|
attr.set(objs[i], (Serializable) Array.get(keys, i));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
@@ -1,61 +0,0 @@
|
|||||||
/*
|
|
||||||
* To change this license header, choose License Headers in Project Properties.
|
|
||||||
* To change this template file, choose Tools | Templates
|
|
||||||
* and open the template in the editor.
|
|
||||||
*/
|
|
||||||
package org.redkale.source;
|
|
||||||
|
|
||||||
import java.io.*;
|
|
||||||
import java.lang.reflect.*;
|
|
||||||
import org.redkale.util.*;
|
|
||||||
|
|
||||||
/**
|
|
||||||
*
|
|
||||||
* <p>
|
|
||||||
* 详情见: https://redkale.org
|
|
||||||
*
|
|
||||||
* @author zhangjx
|
|
||||||
* @param <T> Entity类的类型
|
|
||||||
* @param <F> 字段的类型
|
|
||||||
*/
|
|
||||||
@SuppressWarnings("unchecked")
|
|
||||||
public final class DataCallArrayAttribute<T, F> implements Attribute<T[], F> {
|
|
||||||
|
|
||||||
public static final DataCallArrayAttribute instance = new DataCallArrayAttribute();
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public Class<? extends F> type() {
|
|
||||||
return (Class<F>) Object.class;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public Class<T[]> declaringClass() {
|
|
||||||
return (Class<T[]>) (Class) Object[].class;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public String field() {
|
|
||||||
return "";
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public F get(final T[] objs) {
|
|
||||||
if (objs == null || objs.length == 0) return null;
|
|
||||||
final Attribute<T, Serializable> attr = DataCallAttribute.load(objs[0].getClass());
|
|
||||||
final Object keys = Array.newInstance(attr.type(), objs.length);
|
|
||||||
for (int i = 0; i < objs.length; i++) {
|
|
||||||
Array.set(keys, i, attr.get(objs[i]));
|
|
||||||
}
|
|
||||||
return (F) keys;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void set(final T[] objs, final F keys) {
|
|
||||||
if (objs == null || objs.length == 0) return;
|
|
||||||
final Attribute<T, Serializable> attr = DataCallAttribute.load(objs[0].getClass());
|
|
||||||
for (int i = 0; i < objs.length; i++) {
|
|
||||||
attr.set(objs[i], (Serializable) Array.get(keys, i));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
@@ -1,72 +0,0 @@
|
|||||||
/*
|
|
||||||
* To change this license header, choose License Headers in Project Properties.
|
|
||||||
* To change this template file, choose Tools | Templates
|
|
||||||
* and open the template in the editor.
|
|
||||||
*/
|
|
||||||
package org.redkale.source;
|
|
||||||
|
|
||||||
import java.io.*;
|
|
||||||
import java.lang.reflect.*;
|
|
||||||
import java.util.concurrent.*;
|
|
||||||
import org.redkale.util.*;
|
|
||||||
|
|
||||||
/**
|
|
||||||
*
|
|
||||||
* <p> 详情见: https://redkale.org
|
|
||||||
* @author zhangjx
|
|
||||||
*/
|
|
||||||
public class DataCallAttribute implements Attribute<Object, Serializable> {
|
|
||||||
|
|
||||||
public static final DataCallAttribute instance = new DataCallAttribute();
|
|
||||||
|
|
||||||
private static final ConcurrentHashMap<Class, Attribute> attributes = new ConcurrentHashMap<>();
|
|
||||||
|
|
||||||
static <T> Attribute<T, Serializable> load(final Class clazz) {
|
|
||||||
Attribute rs = attributes.get(clazz);
|
|
||||||
if (rs != null) return rs;
|
|
||||||
synchronized (attributes) {
|
|
||||||
rs = attributes.get(clazz);
|
|
||||||
if (rs == null) {
|
|
||||||
Class cltmp = clazz;
|
|
||||||
do {
|
|
||||||
for (Field field : cltmp.getDeclaredFields()) {
|
|
||||||
try {
|
|
||||||
rs = Attribute.create(cltmp, field);
|
|
||||||
attributes.put(clazz, rs);
|
|
||||||
return rs;
|
|
||||||
} catch (RuntimeException e) {
|
|
||||||
}
|
|
||||||
}
|
|
||||||
} while ((cltmp = cltmp.getSuperclass()) != Object.class);
|
|
||||||
}
|
|
||||||
return rs;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public Class<Serializable> type() {
|
|
||||||
return Serializable.class;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public Class<Object> declaringClass() {
|
|
||||||
return Object.class;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public String field() {
|
|
||||||
return "";
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public Serializable get(final Object obj) {
|
|
||||||
if (obj == null) return null;
|
|
||||||
return load(obj.getClass()).get(obj);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void set(final Object obj, final Serializable key) {
|
|
||||||
if (obj == null) return;
|
|
||||||
load(obj.getClass()).set(obj, key);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -313,7 +313,7 @@ public abstract class DataSqlSource<DBChannel> extends AbstractService implement
|
|||||||
* @return 影响的记录条数
|
* @return 影响的记录条数
|
||||||
*/
|
*/
|
||||||
@Override
|
@Override
|
||||||
public <T> int insert(@RpcCall(DataCallArrayAttribute.class) T... entitys) {
|
public <T> int insert(T... entitys) {
|
||||||
if (entitys.length == 0) return 0;
|
if (entitys.length == 0) return 0;
|
||||||
checkEntity("insert", false, entitys);
|
checkEntity("insert", false, entitys);
|
||||||
final EntityInfo<T> info = loadEntityInfo((Class<T>) entitys[0].getClass());
|
final EntityInfo<T> info = loadEntityInfo((Class<T>) entitys[0].getClass());
|
||||||
@@ -340,7 +340,7 @@ public abstract class DataSqlSource<DBChannel> extends AbstractService implement
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public <T> CompletableFuture<Integer> insertAsync(@RpcCall(DataCallArrayAttribute.class) T... entitys) {
|
public <T> CompletableFuture<Integer> insertAsync(T... entitys) {
|
||||||
if (entitys.length == 0) return CompletableFuture.completedFuture(0);
|
if (entitys.length == 0) return CompletableFuture.completedFuture(0);
|
||||||
CompletableFuture future = checkEntity("insert", true, entitys);
|
CompletableFuture future = checkEntity("insert", true, entitys);
|
||||||
if (future != null) return future;
|
if (future != null) return future;
|
||||||
|
|||||||
Reference in New Issue
Block a user