Skip to content

Commit 810daab

Browse files
committed
添加自动删除资源实现
1 parent 041a499 commit 810daab

File tree

8 files changed

+277
-27
lines changed

8 files changed

+277
-27
lines changed

api-boot-project/api-boot-plugins/api-boot-plugin-resource-load/src/main/java/org/minbox/framework/api/boot/plugin/resource/load/ApiBootResourceStoreDelegate.java

Lines changed: 30 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -32,15 +32,43 @@
3232
* Gitee:https://gitee.com/hengboy
3333
* GitHub:https://github.com/hengboy
3434
*/
35-
@FunctionalInterface
3635
public interface ApiBootResourceStoreDelegate {
3736
/**
38-
* 加载资源路径
37+
* Load Resource Urls
3938
*
4039
* @param sourceFieldValue 资源所属业务字段的值
4140
* @param resourceType 资源类型
4241
* @return Resource urls
4342
* @throws ApiBootException ApiBoot Exception
4443
*/
4544
List<String> loadResourceUrl(String sourceFieldValue, String resourceType) throws ApiBootException;
45+
46+
/**
47+
* Add Resource Urls
48+
*
49+
* @param sourceFieldValue source field value
50+
* @param resourceType resource type
51+
* @param resourceUrls resource urls
52+
* @throws ApiBootException ApiBoot Exception
53+
*/
54+
void addResource(String sourceFieldValue, String resourceType, List<String> resourceUrls) throws ApiBootException;
55+
56+
/**
57+
* Delete resource urls
58+
*
59+
* @param sourceFieldValue source field value
60+
* @param resourceType resource type
61+
* @throws ApiBootException ApiBoot Exception
62+
*/
63+
void deleteResource(String sourceFieldValue, String resourceType) throws ApiBootException;
64+
65+
/**
66+
* Update resource urls
67+
*
68+
* @param sourceFieldValue source field value
69+
* @param resourceType resource type
70+
* @param resourceUrls resource urls
71+
* @throws ApiBootException ApiBoot Exception
72+
*/
73+
void updateResource(String sourceFieldValue, String resourceType, List<String> resourceUrls) throws ApiBootException;
4674
}

api-boot-project/api-boot-plugins/api-boot-plugin-resource-load/src/main/java/org/minbox/framework/api/boot/plugin/resource/load/aop/interceptor/ApiBootResourceLoadMethodInterceptor.java

Lines changed: 33 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -74,15 +74,41 @@ public Object invoke(MethodInvocation invocation) throws Throwable {
7474
// declared method object instance
7575
Method declaredMethod = BridgeMethodResolver.findBridgedMethod(specificMethod);
7676

77+
// method param array
78+
Object[] params = invocation.getArguments();
79+
7780
// execute method logic
7881
Object result = invocation.proceed();
79-
80-
if (!ObjectUtils.isEmpty(result)) {
81-
// get resource Load
82-
ResourceLoad resourceLoad = declaredMethod.getDeclaredAnnotation(ResourceLoad.class);
83-
if (!ObjectUtils.isEmpty(resourceLoad)) {
84-
// resource push
85-
apiBootResourcePusher.pushResource(declaredMethod, result);
82+
// get resource Load
83+
ResourceLoad resourceLoad = declaredMethod.getDeclaredAnnotation(ResourceLoad.class);
84+
if (!ObjectUtils.isEmpty(resourceLoad)) {
85+
switch (resourceLoad.event()) {
86+
case SELECT:
87+
logger.debug("Execute select resource.");
88+
if (!ObjectUtils.isEmpty(result)) {
89+
// resource push
90+
apiBootResourcePusher.pushResource(declaredMethod, result);
91+
}
92+
break;
93+
case INSERT:
94+
logger.debug("Execute insert resource.");
95+
// pull resource form param
96+
apiBootResourcePusher.pullResource(declaredMethod, params);
97+
break;
98+
case DELETE:
99+
logger.debug("Execute delete resource.");
100+
apiBootResourcePusher.deleteResource(declaredMethod, params);
101+
break;
102+
case UPDATE:
103+
logger.debug("Execute update resource.");
104+
apiBootResourcePusher.updateResource(declaredMethod, params);
105+
break;
106+
case INSERT_OR_UPDATE:
107+
logger.debug("Execute insert or update resource.");
108+
apiBootResourcePusher.insertOrUpdateResource(declaredMethod, params);
109+
break;
110+
default:
111+
break;
86112
}
87113
}
88114
return result;

api-boot-project/api-boot-plugins/api-boot-plugin-resource-load/src/main/java/org/minbox/framework/api/boot/plugin/resource/load/context/ApiBootResourceContext.java

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -141,10 +141,9 @@ public static String formatterMethodName(Method method) {
141141
* @param resourceType resource type
142142
* @return redis key
143143
*/
144-
public static String formatterRedisCacheKey(Method method, String sourceFieldValue, String resourceType) {
145-
String methodName = formatterMethodName(method);
144+
public static String formatterCacheKey(Method method, String sourceFieldValue, String resourceType) {
146145
String expression = "%s.%s.%s";
147-
return String.format(expression, methodName, resourceType, sourceFieldValue);
146+
return String.format(expression, method.getDeclaringClass().getName(), resourceType, sourceFieldValue);
148147
}
149148
}
150149

api-boot-project/api-boot-plugins/api-boot-plugin-resource-load/src/main/java/org/minbox/framework/api/boot/plugin/resource/load/pusher/ApiBootResourcePusher.java

Lines changed: 37 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,43 @@ public interface ApiBootResourcePusher {
4040
*
4141
* @param declaredMethod declared method
4242
* @param methodExecuteResult method execute result
43-
* @throws ApiBootException
43+
* @throws ApiBootException ApiBoot Exception
4444
*/
4545
void pushResource(Method declaredMethod, Object methodExecuteResult) throws ApiBootException;
46+
47+
/**
48+
* Pull resource from param
49+
*
50+
* @param declaredMethod declared method
51+
* @param param method param array
52+
* @throws ApiBootException ApiBoot Exception
53+
*/
54+
void pullResource(Method declaredMethod, Object[] param) throws ApiBootException;
55+
56+
/**
57+
* Delete resource
58+
*
59+
* @param declaredMethod declared method
60+
* @param param method param array
61+
* @throws ApiBootException ApiBoot Exception
62+
*/
63+
void deleteResource(Method declaredMethod, Object[] param) throws ApiBootException;
64+
65+
/**
66+
* Update resource
67+
*
68+
* @param declaredMethod declared method
69+
* @param param method param array
70+
* @throws ApiBootException ApiBoot Exception
71+
*/
72+
void updateResource(Method declaredMethod, Object[] param) throws ApiBootException;
73+
74+
/**
75+
* Insert resource
76+
*
77+
* @param declaredMethod declared method
78+
* @param param method param array
79+
* @throws ApiBootException ApiBoot Exception
80+
*/
81+
void insertOrUpdateResource(Method declaredMethod, Object[] param) throws ApiBootException;
4682
}

api-boot-project/api-boot-plugins/api-boot-plugin-resource-load/src/main/java/org/minbox/framework/api/boot/plugin/resource/load/pusher/support/ApiBootAbstractResourcePusher.java

Lines changed: 126 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@
2020
import org.minbox.framework.api.boot.common.exception.ApiBootException;
2121
import org.minbox.framework.api.boot.plugin.resource.load.annotation.ResourceField;
2222
import org.minbox.framework.api.boot.plugin.resource.load.context.ApiBootResourceContext;
23+
import org.minbox.framework.api.boot.plugin.resource.load.expression.ResourceSourceExpression;
2324
import org.minbox.framework.api.boot.plugin.resource.load.loader.ResourceFieldLoader;
2425
import org.minbox.framework.api.boot.plugin.resource.load.model.ResourcePushField;
2526
import org.minbox.framework.api.boot.plugin.resource.load.pusher.ApiBootResourcePusher;
@@ -42,6 +43,110 @@
4243
*/
4344
public abstract class ApiBootAbstractResourcePusher implements ApiBootResourcePusher {
4445

46+
/**
47+
* load resource url
48+
*
49+
* @param declaredMethod declared method
50+
* @param sourceFieldValue sourceFieldValue
51+
* @param resourceType resourceType
52+
* @return resource list
53+
*/
54+
public abstract List<String> loadResourceUrl(Method declaredMethod, String sourceFieldValue, String resourceType);
55+
56+
/**
57+
* delete resource urls
58+
*
59+
* @param declaredMethod declared method
60+
* @param sourceFieldValue sourceFieldValue
61+
* @param resourceType resourceType
62+
*/
63+
public abstract void deleteResourceUrl(Method declaredMethod, String sourceFieldValue, String resourceType);
64+
65+
/**
66+
* unified pull resource
67+
*
68+
* @param declaredMethod declared method
69+
* @param param method param array
70+
* @throws ApiBootException
71+
*/
72+
@Override
73+
public void pullResource(Method declaredMethod, Object[] param) throws ApiBootException {
74+
75+
}
76+
77+
/**
78+
* unified delete resource
79+
*
80+
* @param declaredMethod declared method
81+
* @param param method param array
82+
* @throws ApiBootException ApiBoot Exception
83+
*/
84+
@Override
85+
public void deleteResource(Method declaredMethod, Object[] param) throws ApiBootException {
86+
List<ResourceField> resourceFields = getResourceFields(declaredMethod);
87+
resourceFields.stream().forEach(resourceField -> {
88+
// source file name
89+
String sourceFieldName = resourceField.source();
90+
91+
List<String> matchContents = ResourceSourceExpression.getMatchContent(sourceFieldName);
92+
93+
// don't match expression
94+
// default parameters using index 0
95+
if (ObjectUtils.isEmpty(matchContents)) {
96+
Object paramObject = param[0];
97+
// source field
98+
Field field = getSourceField(declaredMethod, paramObject.getClass(), sourceFieldName, resourceField.name());
99+
// source field value
100+
Object sourceFieldValue = getFieldValue(field, paramObject);
101+
this.deleteResourceUrl(declaredMethod, String.valueOf(sourceFieldValue), resourceField.type());
102+
}
103+
// match expression
104+
else {
105+
String sourceFieldValue = null;
106+
// ognl expression
107+
if (ResourceSourceExpression.getOgnlMatch(sourceFieldName).find()) {
108+
// param object
109+
Object paramObject = param[Integer.valueOf(matchContents.get(0))];
110+
// source field
111+
Field field = getSourceField(declaredMethod, paramObject.getClass(), matchContents.get(1), resourceField.name());
112+
// source field value
113+
sourceFieldValue = String.valueOf(getFieldValue(field, paramObject));
114+
}
115+
// basic expression
116+
else if (ResourceSourceExpression.getBasicMatch(sourceFieldName).find()) {
117+
sourceFieldValue = String.valueOf(param[Integer.valueOf(matchContents.get(0))]);
118+
}
119+
if (!ObjectUtils.isEmpty(sourceFieldValue)) {
120+
this.deleteResourceUrl(declaredMethod, sourceFieldValue, resourceField.type());
121+
}
122+
}
123+
});
124+
}
125+
126+
/**
127+
* unified update resource
128+
*
129+
* @param declaredMethod declared method
130+
* @param param method param array
131+
* @throws ApiBootException
132+
*/
133+
@Override
134+
public void updateResource(Method declaredMethod, Object[] param) throws ApiBootException {
135+
136+
}
137+
138+
/**
139+
* unified insert or update resource
140+
*
141+
* @param declaredMethod declared method
142+
* @param param method param array
143+
* @throws ApiBootException
144+
*/
145+
@Override
146+
public void insertOrUpdateResource(Method declaredMethod, Object[] param) throws ApiBootException {
147+
148+
}
149+
45150
/**
46151
* unified push resource
47152
*
@@ -99,16 +204,6 @@ private void pushToObject(Method method, Object executeResult) {
99204
push(method, resourceFields, executeResult);
100205
}
101206

102-
/**
103-
* load resource url
104-
*
105-
* @param declaredMethod declared method
106-
* @param sourceFieldValue sourceFieldValue
107-
* @param resourceType resourceType
108-
* @return resource list
109-
*/
110-
public abstract List<String> loadResourceUrl(Method declaredMethod, String sourceFieldValue, String resourceType);
111-
112207
/**
113208
* execute push
114209
*
@@ -151,6 +246,24 @@ else if (resourceField.isList()) {
151246

152247
}
153248

249+
/**
250+
* get Field value
251+
*
252+
* @param field field instance
253+
* @param object field subordinate object
254+
* @return
255+
*/
256+
protected Object getFieldValue(Field field, Object object) {
257+
try {
258+
if (!field.isAccessible()) {
259+
field.setAccessible(true);
260+
}
261+
return field.get(object);
262+
} catch (Exception e) {
263+
return null;
264+
}
265+
}
266+
154267
/**
155268
* get source field
156269
*
@@ -159,7 +272,7 @@ else if (resourceField.isList()) {
159272
* @return Field Instance
160273
* @throws NoSuchFieldException No Such Field Exception
161274
*/
162-
private Field getSourceField(Method method, Class objectClass, String sourceFieldName, String resourceFieldName) throws NoSuchFieldException {
275+
protected Field getSourceField(Method method, Class objectClass, String sourceFieldName, String resourceFieldName) {
163276
// cache from memory
164277
ResourcePushField resourcePushField = ApiBootResourceContext.getPushFieldFromCache(method, resourceFieldName);
165278
// if don't have source field from cache
@@ -187,7 +300,7 @@ private Field getSourceField(Method method, Class objectClass, String sourceFiel
187300
* @param resourceFieldName resource field name
188301
* @return Field
189302
*/
190-
private Field getResourceField(Method method, Class objectClass, String resourceFieldName) throws NoSuchFieldException {
303+
protected Field getResourceField(Method method, Class objectClass, String resourceFieldName) throws NoSuchFieldException {
191304
// cache from memory
192305
ResourcePushField resourcePushField = ApiBootResourceContext.getPushFieldFromCache(method, resourceFieldName);
193306
// if don't have source field from cache
@@ -228,7 +341,7 @@ private List<ResourceField> loadMethodResourceFields(Method method) {
228341
* @param method method
229342
* @return List ResourceField
230343
*/
231-
private List<ResourceField> getResourceFields(Method method) {
344+
protected List<ResourceField> getResourceFields(Method method) {
232345
// get from cache
233346
List<ResourceField> resourceFields = ApiBootResourceContext.getResourceFieldFromCache(method);
234347

api-boot-project/api-boot-plugins/api-boot-plugin-resource-load/src/main/java/org/minbox/framework/api/boot/plugin/resource/load/pusher/support/ApiBootJdbcResourcePusher.java

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -62,4 +62,16 @@ public ApiBootJdbcResourcePusher(ApiBootResourceStoreDelegate apiBootResourceSto
6262
public List<String> loadResourceUrl(Method declaredMethod, String sourceFieldValue, String resourceType) {
6363
return apiBootResourceStoreDelegate.loadResourceUrl(sourceFieldValue, resourceType);
6464
}
65+
66+
/**
67+
* delete resource urls
68+
*
69+
* @param declaredMethod declared method
70+
* @param sourceFieldValue sourceFieldValue
71+
* @param resourceType resourceType
72+
*/
73+
@Override
74+
public void deleteResourceUrl(Method declaredMethod, String sourceFieldValue, String resourceType) {
75+
apiBootResourceStoreDelegate.deleteResource(sourceFieldValue, resourceType);
76+
}
6577
}

api-boot-project/api-boot-plugins/api-boot-plugin-resource-load/src/main/java/org/minbox/framework/api/boot/plugin/resource/load/pusher/support/ApiBootMemoryResourcePusher.java

Lines changed: 18 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -66,9 +66,26 @@ public List<String> loadResourceUrl(Method declaredMethod, String sourceFieldVal
6666
if (ObjectUtils.isEmpty(resourceUrls)) {
6767
// get resource urls from jdbc
6868
resourceUrls = super.loadResourceUrl(declaredMethod, sourceFieldValue, resourceType);
69-
// put resource urls
69+
// put resource
7070
RESOURCE_URLS.put(resourceKey, resourceUrls);
7171
}
7272
return resourceUrls;
7373
}
74+
75+
/**
76+
* remove from memory
77+
*
78+
* @param declaredMethod declared method
79+
* @param sourceFieldValue sourceFieldValue
80+
* @param resourceType resourceType
81+
*/
82+
@Override
83+
public void deleteResourceUrl(Method declaredMethod, String sourceFieldValue, String resourceType) {
84+
// remove from jdbc
85+
super.deleteResourceUrl(declaredMethod, sourceFieldValue, resourceType);
86+
// formatter key
87+
String resourceKey = ApiBootResourceContext.formatterCacheKey(declaredMethod, sourceFieldValue, resourceType);
88+
// remove memory resource urls
89+
RESOURCE_URLS.remove(resourceKey);
90+
}
7491
}

0 commit comments

Comments
 (0)