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
