Juan Hernandez has uploaded a new change for review.

Change subject: restapi: Support generic types for "add"
......................................................................

restapi: Support generic types for "add"

Currently the RSDL builder doesn't support generic types as parameters
to the "add" operation. As a result the generation of the Java SDK
doesn't work correctly.

Change-Id: I60d4b44c183eaaa4a42737382bcc6ad33a5ff989
Bug-Url: https://bugzilla.redhat.com/1115610
Signed-off-by: Juan Hernandez <[email protected]>
---
M 
backend/manager/modules/restapi/interface/definition/src/main/java/org/ovirt/engine/api/rsdl/RsdlBuilder.java
1 file changed, 37 insertions(+), 23 deletions(-)


  git pull ssh://gerrit.ovirt.org:29418/ovirt-engine refs/changes/27/29527/1

diff --git 
a/backend/manager/modules/restapi/interface/definition/src/main/java/org/ovirt/engine/api/rsdl/RsdlBuilder.java
 
b/backend/manager/modules/restapi/interface/definition/src/main/java/org/ovirt/engine/api/rsdl/RsdlBuilder.java
index ba987a0..1c3b3b5 100644
--- 
a/backend/manager/modules/restapi/interface/definition/src/main/java/org/ovirt/engine/api/rsdl/RsdlBuilder.java
+++ 
b/backend/manager/modules/restapi/interface/definition/src/main/java/org/ovirt/engine/api/rsdl/RsdlBuilder.java
@@ -1,11 +1,11 @@
 /*
-* Copyright (c) 2010 Red Hat, Inc.
+* Copyright (c) 2014 Red Hat, Inc.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
-*           http://www.apache.org/licenses/LICENSE-2.0
+*   http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
@@ -123,12 +123,12 @@
     }
 
     public RSDL build() throws ClassNotFoundException, IOException {
-            rsdl = construct();
-            rsdl.setRel(getRel());
-            rsdl.setHref(getHref());
-            rsdl.setDescription(getDescription());
-            rsdl.setSchema(getSchema());
-            rsdl.setGeneral(getGeneralMetadata());
+        rsdl = construct();
+        rsdl.setRel(getRel());
+        rsdl.setHref(getHref());
+        rsdl.setDescription(getDescription());
+        rsdl.setSchema(getSchema());
+        rsdl.setGeneral(getGeneralMetadata());
         return rsdl;
     }
 
@@ -255,6 +255,7 @@
     }
 
     public List<DetailedLink> describe(Class<?> resource, String prefix, 
Map<String, Type> parametersMap) throws ClassNotFoundException {
+        System.out.println("prefix: " + prefix);
         //SortedSet<Link> results = new TreeSet<Link>();
         List<DetailedLink> results = new ArrayList<DetailedLink>();
         if (resource!=null) {
@@ -307,8 +308,22 @@
 
     private void handleMethod(String prefix, Collection<DetailedLink> results, 
Method m, Class<?> resource, Map<String, Type> parametersMap) throws 
ClassNotFoundException {
         if (isRequiresDescription(m)) {
-            Class<?> returnType = findReturnType(m, resource, parametersMap);
-            String returnTypeStr = getReturnTypeStr(returnType);
+            Type genericReturnType = m.getGenericReturnType();
+            Class<?> concreteReturnType = findConcreteType(genericReturnType, 
resource, parametersMap);
+            if (concreteReturnType == null) {
+                concreteReturnType = m.getReturnType();
+            }
+            String returnTypeStr = getReturnTypeStr(concreteReturnType);
+
+            Type[] genericParameterTypes = m.getGenericParameterTypes();
+            Class<?>[] concreteParameterTypes = m.getParameterTypes();
+            for (int i = 0; i < concreteParameterTypes.length; i++) {
+                Class<?> concreteParameterType = 
findConcreteType(genericParameterTypes[i], resource, parametersMap);
+                if (concreteParameterType != null) {
+                    concreteParameterTypes[i] = concreteParameterType;
+                }
+            }
+
             if (m.isAnnotationPresent(javax.ws.rs.GET.class)) {
                 handleGet(prefix, results, returnTypeStr);
             } else if (m.isAnnotationPresent(PUT.class)) {
@@ -327,11 +342,11 @@
                         ParameterizedType parameterizedType = 
(ParameterizedType)m.getGenericReturnType();
                         addToGenericParamsMap(resource, 
parameterizedType.getActualTypeArguments(), 
m.getReturnType().getTypeParameters(), parametersMap);
                     }
-                    results.addAll(describe(returnType, prefix + "/" + path, 
new HashMap<String, Type>(parametersMap)));
+                    results.addAll(describe(concreteReturnType, prefix + "/" + 
path, new HashMap<String, Type>(parametersMap)));
                 }
             } else {
                 if (m.getName().equals(ADD)) {
-                    handleAdd(prefix, results, m);
+                    handleAdd(prefix, results, concreteParameterTypes);
                 }
             }
         }
@@ -488,9 +503,8 @@
         }
     }
 
-    private void handleAdd(String prefix, Collection<DetailedLink> results, 
Method m) {
-        Class<?>[] parameterTypes = m.getParameterTypes();
-        assert(parameterTypes.length==1);
+    private void handleAdd(String prefix, Collection<DetailedLink> results, 
Class<?>[] parameterTypes) {
+        assert parameterTypes.length == 1;
         String s = parameterTypes[0].getSimpleName();
         s = handleExcpetionalCases(s, prefix); //TODO: refactor to a more 
generic solution
 
@@ -526,19 +540,19 @@
         return entityType;
     }
 
-    private Class<?> findReturnType(Method m, Class<?> resource, Map<String, 
Type> parametersMap) throws ClassNotFoundException {
+    private Class<?> findConcreteType(Type generic, Class<?> resource, 
Map<String, Type> parametersMap) throws ClassNotFoundException {
         for (Type superInterface : resource.getGenericInterfaces()) {
             if (superInterface instanceof ParameterizedType) {
                 ParameterizedType p = (ParameterizedType)superInterface;
                 Class<?> clazz = 
Class.forName(p.getRawType().toString().substring(p.getRawType().toString().lastIndexOf('
 ')+1));
-                Map<String, Type> map = new HashMap<String, Type>();
+                Map<String, Type> map = new HashMap<>();
                 for (int i=0; i<p.getActualTypeArguments().length; i++) {
                     if 
(!map.containsKey(clazz.getTypeParameters()[i].toString())) {
                         map.put(clazz.getTypeParameters()[i].toString(), 
p.getActualTypeArguments()[i]);
                     }
                 }
-                if (map.containsKey(m.getGenericReturnType().toString())) {
-                    String type = 
map.get(m.getGenericReturnType().toString()).toString();
+                if (map.containsKey(generic.toString())) {
+                    String type = map.get(generic.toString()).toString();
                     try {
                         Class<?> returnClass = 
Class.forName(type.substring(type.lastIndexOf(' ')+1));
                         return returnClass;
@@ -548,16 +562,16 @@
                 }
             }
         }
-        if (parametersMap.containsKey(m.getGenericReturnType().toString())) {
+        if (parametersMap.containsKey(generic.toString())) {
             try {
-                Type type = 
parametersMap.get(m.getGenericReturnType().toString());
+                Type type = parametersMap.get(generic.toString());
                 Class<?> returnClass = 
Class.forName(type.toString().substring(type.toString().indexOf(' ') +1));
                 return returnClass;
             } catch (ClassNotFoundException e) {
-                return m.getReturnType();
+                return null;
             }
         } else {
-            return m.getReturnType();
+            return null;
         }
     }
 


-- 
To view, visit http://gerrit.ovirt.org/29527
To unsubscribe, visit http://gerrit.ovirt.org/settings

Gerrit-MessageType: newchange
Gerrit-Change-Id: I60d4b44c183eaaa4a42737382bcc6ad33a5ff989
Gerrit-PatchSet: 1
Gerrit-Project: ovirt-engine
Gerrit-Branch: master
Gerrit-Owner: Juan Hernandez <[email protected]>
_______________________________________________
Engine-patches mailing list
[email protected]
http://lists.ovirt.org/mailman/listinfo/engine-patches

Reply via email to