refactoring

pull/2954/head
Nikita Koksharov 5 years ago
parent 9d028ae202
commit b60a1cb4bc

@ -85,16 +85,15 @@ public class RedissonLiveObjectService implements RLiveObjectService {
return ClassUtils.getField(proxied, "liveObjectLiveMap"); return ClassUtils.getField(proxied, "liveObjectLiveMap");
} }
private <T> Object generateId(Class<T> entityClass) throws NoSuchFieldException { private <T> Object generateId(Class<T> entityClass, String idFieldName) throws NoSuchFieldException {
String idFieldName = getRIdFieldName(entityClass);
RId annotation = ClassUtils.getDeclaredField(entityClass, idFieldName) RId annotation = ClassUtils.getDeclaredField(entityClass, idFieldName)
.getAnnotation(RId.class); .getAnnotation(RId.class);
RIdResolver<?> resolver = getResolver(entityClass, annotation.generator()); RIdResolver<?> resolver = getResolver(annotation.generator());
Object id = resolver.resolve(entityClass, annotation, idFieldName, connectionManager.getCommandExecutor()); Object id = resolver.resolve(entityClass, annotation, idFieldName, connectionManager.getCommandExecutor());
return id; return id;
} }
private RIdResolver<?> getResolver(Class<?> cls, Class<? extends RIdResolver<?>> resolverClass) { private RIdResolver<?> getResolver(Class<? extends RIdResolver<?>> resolverClass) {
if (!PROVIDER_CACHE.containsKey(resolverClass)) { if (!PROVIDER_CACHE.containsKey(resolverClass)) {
try { try {
PROVIDER_CACHE.putIfAbsent(resolverClass, resolverClass.newInstance()); PROVIDER_CACHE.putIfAbsent(resolverClass, resolverClass.newInstance());
@ -184,16 +183,7 @@ public class RedissonLiveObjectService implements RLiveObjectService {
Map<String, Object> name2id = new HashMap<>(); Map<String, Object> name2id = new HashMap<>();
for (T detachedObject : detachedObjects) { for (T detachedObject : detachedObjects) {
String idFieldName = getRIdFieldName(detachedObject.getClass()); Object id = getId(detachedObject);
Object id = ClassUtils.getField(detachedObject, idFieldName);
if (id == null) {
try {
id = generateId(detachedObject.getClass());
} catch (NoSuchFieldException e) {
throw new IllegalArgumentException(e);
}
ClassUtils.setField(detachedObject, idFieldName, id);
}
T attachedObject = attach(detachedObject, commandExecutor, classCache); T attachedObject = attach(detachedObject, commandExecutor, classCache);
RMap<String, Object> liveMap = getMap(attachedObject); RMap<String, Object> liveMap = getMap(attachedObject);
@ -204,7 +194,7 @@ public class RedissonLiveObjectService implements RLiveObjectService {
CommandBatchService checkExecutor = new CommandBatchService(connectionManager); CommandBatchService checkExecutor = new CommandBatchService(connectionManager);
for (Entry<String, Object> entry : name2id.entrySet()) { for (Entry<String, Object> entry : name2id.entrySet()) {
RMap map = new RedissonMap(checkExecutor, entry.getKey(), null, null, null); RMap<String, Object> map = new RedissonMap<>(checkExecutor, entry.getKey(), null, null, null);
map.containsKeyAsync("redisson_live_object"); map.containsKeyAsync("redisson_live_object");
} }
@ -243,24 +233,30 @@ public class RedissonLiveObjectService implements RLiveObjectService {
return new ArrayList<>(detached2Attached.keySet()); return new ArrayList<>(detached2Attached.keySet());
} }
private <T> Object getId(T detachedObject) {
private <T> T persist(T detachedObject, Map<Object, Object> alreadyPersisted, RCascadeType type) {
String idFieldName = getRIdFieldName(detachedObject.getClass()); String idFieldName = getRIdFieldName(detachedObject.getClass());
Object id = ClassUtils.getField(detachedObject, idFieldName); Object id = ClassUtils.getField(detachedObject, idFieldName);
if (id == null) { if (id == null) {
try { try {
id = generateId(detachedObject.getClass()); id = generateId(detachedObject.getClass(), idFieldName);
} catch (NoSuchFieldException e) { } catch (NoSuchFieldException e) {
throw new IllegalArgumentException(e); throw new IllegalArgumentException(e);
} }
ClassUtils.setField(detachedObject, idFieldName, id); ClassUtils.setField(detachedObject, idFieldName, id);
} }
return id;
}
private <T> T persist(T detachedObject, Map<Object, Object> alreadyPersisted, RCascadeType type) {
Object id = getId(detachedObject);
T attachedObject = attach(detachedObject); T attachedObject = attach(detachedObject);
alreadyPersisted.put(detachedObject, attachedObject); alreadyPersisted.put(detachedObject, attachedObject);
RMap<String, Object> liveMap = getMap(attachedObject); RMap<String, Object> liveMap = getMap(attachedObject);
List<String> excludedFields = new ArrayList<String>(); List<String> excludedFields = new ArrayList<>();
String idFieldName = getRIdFieldName(detachedObject.getClass());
excludedFields.add(idFieldName); excludedFields.add(idFieldName);
boolean fastResult = liveMap.fastPut("redisson_live_object", "1"); boolean fastResult = liveMap.fastPut("redisson_live_object", "1");
if (type == RCascadeType.PERSIST && !fastResult) { if (type == RCascadeType.PERSIST && !fastResult) {
@ -696,13 +692,13 @@ public class RedissonLiveObjectService implements RLiveObjectService {
if (id == null) { if (id == null) {
throw new IllegalStateException("Non-null value is required for the field with RId annotation."); throw new IllegalStateException("Non-null value is required for the field with RId annotation.");
} }
T instance = instantiate(proxyClass, id); T instance = instantiate(proxyClass);
asLiveObject(instance).setLiveObjectId(id); asLiveObject(instance).setLiveObjectId(id);
return instance; return instance;
} }
private <T, K> T instantiateDetachedObject(Class<T> cls, K id) { private <T, K> T instantiateDetachedObject(Class<T> cls, K id) {
T instance = instantiate(cls, id); T instance = instantiate(cls);
String fieldName = getRIdFieldName(cls); String fieldName = getRIdFieldName(cls);
if (ClassUtils.getField(instance, fieldName) == null) { if (ClassUtils.getField(instance, fieldName) == null) {
ClassUtils.setField(instance, fieldName, id); ClassUtils.setField(instance, fieldName, id);
@ -710,7 +706,7 @@ public class RedissonLiveObjectService implements RLiveObjectService {
return instance; return instance;
} }
private <T> T instantiate(Class<T> cls, Object id) { private <T> T instantiate(Class<T> cls) {
try { try {
for (Constructor<?> constructor : cls.getDeclaredConstructors()) { for (Constructor<?> constructor : cls.getDeclaredConstructors()) {
if (constructor.getParameterTypes().length == 0) { if (constructor.getParameterTypes().length == 0) {

Loading…
Cancel
Save