2929
3030import java .lang .reflect .Field ;
3131import java .lang .reflect .Method ;
32+ import java .util .ArrayList ;
3233import java .util .List ;
3334import java .util .Map ;
3435
3536/**
37+ * ApiBoot Resource Pusher Abstract Support
38+ * Provide access to resource or source field
39+ *
3640 * @author:恒宇少年 - 于起宇
3741 * <p>
3842 * DateTime:2019-04-19 09:40
@@ -62,6 +66,26 @@ public abstract class ApiBootAbstractResourcePusher implements ApiBootResourcePu
6266 */
6367 public abstract void deleteResourceUrl (Method declaredMethod , String sourceFieldValue , String resourceType );
6468
69+ /**
70+ * insert resource urls
71+ *
72+ * @param declaredMethod declared method
73+ * @param sourceFieldValue sourceFieldValue
74+ * @param resourceType resourceType
75+ * @param resourceUrls resource urls
76+ */
77+ public abstract void insertResourceUrl (Method declaredMethod , String sourceFieldValue , String resourceType , List <String > resourceUrls );
78+
79+ /**
80+ * update resource urls
81+ *
82+ * @param declaredMethod declared method
83+ * @param sourceFieldValue sourceFieldValue
84+ * @param resourceType resourceType
85+ * @param resourceUrls resource urls
86+ */
87+ public abstract void updateResourceUrl (Method declaredMethod , String sourceFieldValue , String resourceType , List <String > resourceUrls );
88+
6589 /**
6690 * unified pull resource
6791 *
@@ -70,10 +94,25 @@ public abstract class ApiBootAbstractResourcePusher implements ApiBootResourcePu
7094 * @throws ApiBootException
7195 */
7296 @ Override
73- public void pullResource (Method declaredMethod , Object [] param ) throws ApiBootException {
74-
97+ public void insertResource (Method declaredMethod , Object [] param ) throws ApiBootException {
98+ // get method declared ResourceField annotations
99+ List <ResourceField > resourceFields = getResourceFields (declaredMethod );
100+ resourceFields .stream ().forEach (resourceField -> {
101+ // get expression match source filed value
102+ Object sourceFieldValue = getMatchSourceValue (resourceField .source (), declaredMethod , param );
103+ // get expression match resource field value
104+ Object resourceFieldValue = getMatchResourceValue (resourceField .name (), declaredMethod , param );
105+
106+ // if have value
107+ if (!ObjectUtils .isEmpty (sourceFieldValue ) && !ObjectUtils .isEmpty (resourceFieldValue )) {
108+ List <String > resourceUrls = convertToList (resourceFieldValue );
109+ // call implementation class "deleteResourceUrl" method
110+ this .insertResourceUrl (declaredMethod , String .valueOf (sourceFieldValue ), resourceField .type (), resourceUrls );
111+ }
112+ });
75113 }
76114
115+
77116 /**
78117 * unified delete resource
79118 *
@@ -83,43 +122,16 @@ public void pullResource(Method declaredMethod, Object[] param) throws ApiBootEx
83122 */
84123 @ Override
85124 public void deleteResource (Method declaredMethod , Object [] param ) throws ApiBootException {
125+ // get method declared ResourceField annotations
86126 List <ResourceField > resourceFields = getResourceFields (declaredMethod );
87127 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 );
128+ // get expression match source filed value
129+ Object sourceFieldValue = getMatchSourceValue (resourceField .source (), declaredMethod , param );
130+ // if have value
131+ if (!ObjectUtils .isEmpty (sourceFieldValue )) {
132+ // call implementation class "deleteResourceUrl" method
101133 this .deleteResourceUrl (declaredMethod , String .valueOf (sourceFieldValue ), resourceField .type ());
102134 }
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- }
123135 });
124136 }
125137
@@ -132,7 +144,17 @@ else if (ResourceSourceExpression.getBasicMatch(sourceFieldName).find()) {
132144 */
133145 @ Override
134146 public void updateResource (Method declaredMethod , Object [] param ) throws ApiBootException {
135-
147+ // get method declared ResourceField annotations
148+ List <ResourceField > resourceFields = getResourceFields (declaredMethod );
149+ resourceFields .stream ().forEach (resourceField -> {
150+ // get expression match source filed value
151+ Object sourceFieldValue = getMatchSourceValue (resourceField .source (), declaredMethod , param );
152+ // if have value
153+ if (!ObjectUtils .isEmpty (sourceFieldValue )) {
154+ // call implementation class "insertResourceUrl" method
155+ this .updateResourceUrl (declaredMethod , String .valueOf (sourceFieldValue ), resourceField .type (), null );
156+ }
157+ });
136158 }
137159
138160 /**
@@ -144,7 +166,7 @@ public void updateResource(Method declaredMethod, Object[] param) throws ApiBoot
144166 */
145167 @ Override
146168 public void insertOrUpdateResource (Method declaredMethod , Object [] param ) throws ApiBootException {
147-
169+ // TODO
148170 }
149171
150172 /**
@@ -215,7 +237,7 @@ private void push(Method method, List<ResourceField> resourceFields, Object obje
215237 resourceFields .stream ().forEach (resourceField -> {
216238 try {
217239 // source
218- Field sourceField = getSourceField (method , objectClass , resourceField .source (), resourceField . name () );
240+ Field sourceField = getSourceField (method , objectClass , resourceField .source ());
219241 // target
220242 Field resourceFieldInstance = getResourceField (method , objectClass , resourceField .name ());
221243
@@ -246,6 +268,73 @@ else if (resourceField.isList()) {
246268
247269 }
248270
271+ /**
272+ * Get expression match value
273+ *
274+ * @param matchFieldName match field name
275+ * @param declaredMethod declared method
276+ * @param param method param
277+ * @return match value
278+ */
279+ protected Object getMatchValue (String matchFieldName , Method declaredMethod , Object [] param ) {
280+ // pattern expression match contents
281+ List <String > matchContents = ResourceSourceExpression .getMatchContent (matchFieldName );
282+
283+ // source field value
284+ Object sourceFieldValue = null ;
285+
286+ // don't match expression
287+ // default parameters using index 0
288+ if (ObjectUtils .isEmpty (matchContents )) {
289+ Object paramObject = param [0 ];
290+ // source field
291+ Field field = getSourceField (declaredMethod , paramObject .getClass (), matchFieldName );
292+ // source field value
293+ sourceFieldValue = getFieldValue (field , paramObject );
294+ }
295+ // match expression
296+ else {
297+ // ognl expression
298+ if (ResourceSourceExpression .getOgnlMatch (matchFieldName ).find ()) {
299+ // param object
300+ Object paramObject = param [Integer .valueOf (matchContents .get (0 ))];
301+ // source field
302+ Field field = getSourceField (declaredMethod , paramObject .getClass (), matchContents .get (1 ));
303+ // source field value
304+ sourceFieldValue = getFieldValue (field , paramObject );
305+ }
306+ // basic expression
307+ else if (ResourceSourceExpression .getBasicMatch (matchFieldName ).find ()) {
308+ sourceFieldValue = param [Integer .valueOf (matchContents .get (0 ))];
309+ }
310+ }
311+ return sourceFieldValue ;
312+ }
313+
314+ /**
315+ * Get expression match resource field value
316+ *
317+ * @param resourceFieldName ResourceField Annotation name
318+ * @param declaredMethod declared method
319+ * @param param method param array
320+ * @return resource field value
321+ */
322+ protected Object getMatchResourceValue (String resourceFieldName , Method declaredMethod , Object [] param ) {
323+ return getMatchValue (resourceFieldName , declaredMethod , param );
324+ }
325+
326+ /**
327+ * Get expression match source field value
328+ *
329+ * @param sourceFieldName ResourceField Annotation source
330+ * @param declaredMethod declared method
331+ * @param param method param array
332+ * @return source field value
333+ */
334+ protected Object getMatchSourceValue (String sourceFieldName , Method declaredMethod , Object [] param ) {
335+ return getMatchValue (sourceFieldName , declaredMethod , param );
336+ }
337+
249338 /**
250339 * get Field value
251340 *
@@ -272,9 +361,9 @@ protected Object getFieldValue(Field field, Object object) {
272361 * @return Field Instance
273362 * @throws NoSuchFieldException No Such Field Exception
274363 */
275- protected Field getSourceField (Method method , Class objectClass , String sourceFieldName , String resourceFieldName ) {
364+ protected Field getSourceField (Method method , Class objectClass , String sourceFieldName ) {
276365 // cache from memory
277- ResourcePushField resourcePushField = ApiBootResourceContext .getPushFieldFromCache (method , resourceFieldName );
366+ ResourcePushField resourcePushField = ApiBootResourceContext .getPushFieldFromCache (method , sourceFieldName );
278367 // if don't have source field from cache
279368 if (ObjectUtils .isEmpty (resourcePushField ) || ObjectUtils .isEmpty (resourcePushField .getSourceField ())) {
280369 Field sourceField = ReflectionUtils .findField (objectClass , sourceFieldName );
@@ -288,7 +377,7 @@ protected Field getSourceField(Method method, Class objectClass, String sourceFi
288377 }
289378
290379 // cache to memory
291- ApiBootResourceContext .setPushFieldToCache (method , resourceFieldName , resourcePushField );
380+ ApiBootResourceContext .setPushFieldToCache (method , sourceFieldName , resourcePushField );
292381 }
293382 return resourcePushField .getSourceField ();
294383 }
@@ -353,4 +442,14 @@ protected List<ResourceField> getResourceFields(Method method) {
353442 }
354443 return resourceFields ;
355444 }
445+
446+ protected List <String > convertToList (Object value ) {
447+ List <String > resourceUrls = new ArrayList <>();
448+ if (value instanceof List ) {
449+ resourceUrls .addAll ((List ) value );
450+ } else {
451+ resourceUrls .add (String .valueOf (value ));
452+ }
453+ return resourceUrls ;
454+ }
356455}
0 commit comments