2121import java .util .HashMap ;
2222import java .util .List ;
2323import java .util .Map ;
24+ import java .util .concurrent .atomic .AtomicReference ;
2425
2526import org .junit .Assert ;
2627import org .junit .Test ;
2728
2829import com .alibaba .dubbo .common .Constants ;
30+ import com .alibaba .dubbo .common .beanutil .JavaBeanAccessor ;
31+ import com .alibaba .dubbo .common .beanutil .JavaBeanDescriptor ;
32+ import com .alibaba .dubbo .common .beanutil .JavaBeanSerializeUtil ;
2933import com .alibaba .dubbo .common .extension .ExtensionLoader ;
3034import com .alibaba .dubbo .common .serialize .Serialization ;
35+ import com .alibaba .dubbo .common .utils .ReflectUtils ;
3136import com .alibaba .dubbo .config .api .DemoException ;
3237import com .alibaba .dubbo .config .api .DemoService ;
3338import com .alibaba .dubbo .config .api .User ;
3742
3843/**
3944 * GenericServiceTest
40- *
45+ *
4146 * @author william.liangf
4247 */
4348public class GenericServiceTest {
44-
49+
4550 @ Test
4651 public void testGenericServiceException () {
4752 ServiceConfig <GenericService > service = new ServiceConfig <GenericService >();
@@ -50,8 +55,9 @@ public void testGenericServiceException() {
5055 service .setProtocol (new ProtocolConfig ("dubbo" , 29581 ));
5156 service .setInterface (DemoService .class .getName ());
5257 service .setRef (new GenericService () {
58+
5359 public Object $invoke (String method , String [] parameterTypes , Object [] args )
54- throws GenericException {
60+ throws GenericException {
5561 if ("sayName" .equals (method )) {
5662 return "Generic " + args [0 ];
5763 }
@@ -117,7 +123,7 @@ public void testGenericReferenceException() {
117123 user .put ("class" , "com.alibaba.dubbo.config.api.User" );
118124 user .put ("name" , "actual.provider" );
119125 users .add (user );
120- users = (List <Map <String , Object >>) genericService .$invoke ("getUsers" , new String [] {List .class .getName ()}, new Object [] {users });
126+ users = (List <Map <String , Object >>) genericService .$invoke ("getUsers" , new String []{List .class .getName ()}, new Object []{users });
121127 Assert .assertEquals (1 , users .size ());
122128 Assert .assertEquals ("actual.provider" , users .get (0 ).get ("name" ));
123129 } finally {
@@ -196,4 +202,111 @@ public void testGenericSerializationJava() throws Exception {
196202 }
197203 }
198204
205+ @ Test
206+ public void testGenericInvokeWithBeanSerialization () throws Exception {
207+ ServiceConfig <DemoService > service = new ServiceConfig <DemoService >();
208+ service .setApplication (new ApplicationConfig ("bean-provider" ));
209+ service .setInterface (DemoService .class );
210+ service .setRegistry (new RegistryConfig ("N/A" ));
211+ DemoServiceImpl impl = new DemoServiceImpl ();
212+ service .setRef (impl );
213+ service .setProtocol (new ProtocolConfig ("dubbo" , 29581 ));
214+ service .export ();
215+ ReferenceConfig <GenericService > reference = null ;
216+ try {
217+ reference = new ReferenceConfig <GenericService >();
218+ reference .setApplication (new ApplicationConfig ("bean-consumer" ));
219+ reference .setInterface (DemoService .class );
220+ reference .setUrl ("dubbo://127.0.0.1:29581?scope=remote" );
221+ reference .setGeneric (Constants .GENERIC_SERIALIZATION_BEAN );
222+ GenericService genericService = reference .get ();
223+ User user = new User ();
224+ user .setName ("zhangsan" );
225+ List <User > users = new ArrayList <User >();
226+ users .add (user );
227+ Object result = genericService .$invoke ("getUsers" , new String []{ReflectUtils .getName (List .class )}, new Object []{JavaBeanSerializeUtil .serialize (users , JavaBeanAccessor .METHOD )});
228+ Assert .assertTrue (result instanceof JavaBeanDescriptor );
229+ JavaBeanDescriptor descriptor = (JavaBeanDescriptor ) result ;
230+ Assert .assertTrue (descriptor .isCollectionType ());
231+ Assert .assertEquals (1 , descriptor .propertySize ());
232+ descriptor = (JavaBeanDescriptor ) descriptor .getProperty (0 );
233+ Assert .assertTrue (descriptor .isBeanType ());
234+ Assert .assertEquals (user .getName (), ((JavaBeanDescriptor ) descriptor .getProperty ("name" )).getPrimitiveProperty ());
235+ } finally {
236+ if (reference != null ) {
237+ reference .destroy ();
238+ }
239+ service .unexport ();
240+ }
241+ }
242+
243+ protected static class GenericParameter {
244+
245+ String method ;
246+
247+ String [] parameterTypes ;
248+
249+ Object [] arguments ;
250+ }
251+
252+ @ Test
253+ public void testGenericImplementationWithBeanSerialization () throws Exception {
254+ final AtomicReference reference = new AtomicReference ();
255+ ServiceConfig <GenericService > service = new ServiceConfig <GenericService >();
256+ service .setApplication (new ApplicationConfig ("bean-provider" ));
257+ service .setRegistry (new RegistryConfig ("N/A" ));
258+ service .setProtocol (new ProtocolConfig ("dubbo" , 29581 ));
259+ service .setInterface (DemoService .class .getName ());
260+ service .setRef (new GenericService () {
261+
262+ public Object $invoke (String method , String [] parameterTypes , Object [] args ) throws GenericException {
263+ if ("getUsers" .equals (method )) {
264+ GenericParameter arg = new GenericParameter ();
265+ arg .method = method ;
266+ arg .parameterTypes = parameterTypes ;
267+ arg .arguments = args ;
268+ reference .set (arg );
269+ return args [0 ];
270+ }
271+ return args ;
272+ }
273+ });
274+ service .export ();
275+ ReferenceConfig <DemoService > ref = null ;
276+ try {
277+ ref = new ReferenceConfig <DemoService >();
278+ ref .setApplication (new ApplicationConfig ("bean-consumer" ));
279+ ref .setInterface (DemoService .class );
280+ ref .setUrl ("dubbo://127.0.0.1:29581?scope=remote&generic=bean" );
281+ DemoService demoService = ref .get ();
282+ User user = new User ();
283+ user .setName ("zhangsan" );
284+ List <User > users = new ArrayList <User >();
285+ users .add (user );
286+ List <User > result = demoService .getUsers (users );
287+ Assert .assertEquals (users .size (), result .size ());
288+ Assert .assertEquals (user .getName (), result .get (0 ).getName ());
289+
290+ GenericParameter gp = (GenericParameter )reference .get ();
291+ Assert .assertEquals ("getUsers" , gp .method );
292+ Assert .assertEquals (1 , gp .parameterTypes .length );
293+ Assert .assertEquals (ReflectUtils .getName (List .class ), gp .parameterTypes [0 ]);
294+ Assert .assertEquals (1 , gp .arguments .length );
295+ Assert .assertTrue (gp .arguments [0 ] instanceof JavaBeanDescriptor );
296+ JavaBeanDescriptor descriptor = (JavaBeanDescriptor )gp .arguments [0 ];
297+ Assert .assertTrue (descriptor .isCollectionType ());
298+ Assert .assertEquals (ArrayList .class .getName (), descriptor .getClassName ());
299+ Assert .assertEquals (1 , descriptor .propertySize ());
300+ descriptor = (JavaBeanDescriptor )descriptor .getProperty (0 );
301+ Assert .assertTrue (descriptor .isBeanType ());
302+ Assert .assertEquals (User .class .getName (), descriptor .getClassName ());
303+ Assert .assertEquals (user .getName (), ((JavaBeanDescriptor )descriptor .getProperty ("name" )).getPrimitiveProperty ());
304+ } finally {
305+ if (ref != null ) {
306+ ref .destroy ();
307+ }
308+ service .unexport ();
309+ }
310+ }
311+
199312}
0 commit comments