From eec55675829ea6d53a719645837c50d2cad112d4 Mon Sep 17 00:00:00 2001 From: Patrick Huang Date: Fri, 5 Dec 2014 13:00:32 +1000 Subject: [PATCH] rhbz1124630 - use explicit path construction - jersey can not handle path template with regex in path param - extra url prefix (i.e. rest) will get appended twice using previous method --- .../rest/client/AsyncProcessClient.java | 29 ++++++------ .../org/zanata/rest/client/ClientUtil.java | 46 ------------------- .../zanata/rest/client/CopyTransClient.java | 12 ++--- .../rest/client/FileResourceClient.java | 26 ++++------- 4 files changed, 27 insertions(+), 86 deletions(-) diff --git a/zanata-rest-client/src/main/java/org/zanata/rest/client/AsyncProcessClient.java b/zanata-rest-client/src/main/java/org/zanata/rest/client/AsyncProcessClient.java index 985584de..fb8f4401 100644 --- a/zanata-rest-client/src/main/java/org/zanata/rest/client/AsyncProcessClient.java +++ b/zanata-rest-client/src/main/java/org/zanata/rest/client/AsyncProcessClient.java @@ -24,7 +24,6 @@ import java.net.URI; import java.util.Set; import javax.ws.rs.DefaultValue; -import javax.ws.rs.core.UriBuilder; import org.zanata.common.LocaleId; import org.zanata.rest.dto.ProcessStatus; @@ -34,8 +33,6 @@ import com.sun.jersey.api.client.Client; import com.sun.jersey.api.client.WebResource; -import static org.zanata.rest.client.ClientUtil.resolvePath; - /** * @author Patrick Huang pahuang@redhat.com @@ -64,13 +61,12 @@ public ProcessStatus startSourceDocCreationOrUpdate(String idNoSlash, Client client = factory.getClient(); CacheResponseFilter filter = new CacheResponseFilter(); client.addFilter(filter); - WebResource webResource = client.resource(baseUri); - String path = - resolvePath(webResource, AsynchronousProcessResource.class, - "startSourceDocCreationOrUpdate", projectSlug, - iterationSlug, idNoSlash); - - webResource.path(path) + WebResource webResource = client.resource(baseUri) + .path(AsynchronousProcessResource.SERVICE_PATH) + .path("projects").path("p").path(projectSlug) + .path("iterations").path("i").path(iterationSlug) + .path("r").path(idNoSlash); + webResource .queryParams(ClientUtil.asMultivaluedMap("ext", extensions)) .queryParam("copyTrans", String.valueOf(copytrans)) .put(resource); @@ -86,12 +82,13 @@ public ProcessStatus startTranslatedDocCreationOrUpdate(String idNoSlash, Client client = factory.getClient(); CacheResponseFilter filter = new CacheResponseFilter(); client.addFilter(filter); - WebResource webResource = client.resource(baseUri); - String path = - resolvePath(webResource, AsynchronousProcessResource.class, - "startTranslatedDocCreationOrUpdate", projectSlug, - iterationSlug, idNoSlash, locale); - webResource.path(path) + WebResource webResource = client.resource(baseUri) + .path(AsynchronousProcessResource.SERVICE_PATH) + .path("projects").path("p").path(projectSlug) + .path("iterations").path("i").path(iterationSlug) + .path("r").path(idNoSlash) + .path("translations").path(locale.toString()); + webResource .queryParams(ClientUtil.asMultivaluedMap("ext", extensions)) .queryParam("merge", merge) .put(translatedDoc); diff --git a/zanata-rest-client/src/main/java/org/zanata/rest/client/ClientUtil.java b/zanata-rest-client/src/main/java/org/zanata/rest/client/ClientUtil.java index 8463502f..328c6696 100644 --- a/zanata-rest-client/src/main/java/org/zanata/rest/client/ClientUtil.java +++ b/zanata-rest-client/src/main/java/org/zanata/rest/client/ClientUtil.java @@ -21,8 +21,6 @@ package org.zanata.rest.client; -import java.lang.reflect.Field; -import java.lang.reflect.Method; import java.net.MalformedURLException; import java.net.URI; import java.net.URISyntaxException; @@ -32,9 +30,7 @@ import javax.ws.rs.core.Response; import com.google.common.base.Strings; -import com.google.common.base.Throwables; import com.sun.jersey.api.client.ClientResponse; -import com.sun.jersey.api.client.WebResource; import com.sun.jersey.core.util.MultivaluedMapImpl; /** @@ -43,48 +39,6 @@ */ public class ClientUtil { - /** - * Resolve a REST resource path to a method. - * - * @param webResource - * web resource - * @param resourceInterface - * Zanata REST api interface - * @param methodName - * the method name we want to call which is annotated by @Path - * @param pathParams - * path param values - * @param - * interface type - * @return resolved path - */ - static String resolvePath(WebResource webResource, - Class resourceInterface, String methodName, - Object... pathParams) { - try { - // Zanata API always define SERVICE_PATH field - Field servicePathField = resourceInterface.getField("SERVICE_PATH"); - String servicePath = servicePathField.get(null).toString(); - Method method = getMethod(resourceInterface, methodName); - return webResource.getUriBuilder().path(servicePath).path(method) - .build(pathParams).getPath(); - } catch (NoSuchFieldException | IllegalAccessException e) { - throw Throwables.propagate(e); - } - } - - private static Method getMethod(Class resourceClass, - String methodName) { - Method[] methods = resourceClass.getDeclaredMethods(); - for (Method method : methods) { - if (method.getName().equals(methodName)) { - return method; - } - } - throw new IllegalArgumentException(methodName + " not found in " - + resourceClass); - } - static MultivaluedMap asMultivaluedMap( String paramKey, Iterable values) { MultivaluedMapImpl map = new MultivaluedMapImpl(); diff --git a/zanata-rest-client/src/main/java/org/zanata/rest/client/CopyTransClient.java b/zanata-rest-client/src/main/java/org/zanata/rest/client/CopyTransClient.java index 7932bbff..c356d179 100644 --- a/zanata-rest-client/src/main/java/org/zanata/rest/client/CopyTransClient.java +++ b/zanata-rest-client/src/main/java/org/zanata/rest/client/CopyTransClient.java @@ -28,8 +28,6 @@ import com.sun.jersey.api.client.Client; import com.sun.jersey.api.client.WebResource; -import static org.zanata.rest.client.ClientUtil.resolvePath; - /** * @author Patrick Huang pahuang@redhat.com @@ -58,11 +56,11 @@ public CopyTransStatus startCopyTrans(String projectSlug, private WebResource webResource(Client client, String projectSlug, String iterationSlug, String docId) { - WebResource webResource = client.resource(baseUri); - String path = - resolvePath(webResource, CopyTransResource.class, - "startCopyTrans", projectSlug, iterationSlug, docId); - return webResource.path(path); + return client.resource(baseUri) + .path(CopyTransResource.SERVICE_PATH) + .path("/proj").path(projectSlug) + .path("iter").path(iterationSlug) + .path("doc").path(docId); } @Override diff --git a/zanata-rest-client/src/main/java/org/zanata/rest/client/FileResourceClient.java b/zanata-rest-client/src/main/java/org/zanata/rest/client/FileResourceClient.java index a99bdfe7..f55a7268 100644 --- a/zanata-rest-client/src/main/java/org/zanata/rest/client/FileResourceClient.java +++ b/zanata-rest-client/src/main/java/org/zanata/rest/client/FileResourceClient.java @@ -21,8 +21,6 @@ package org.zanata.rest.client; -import static org.zanata.rest.client.ClientUtil.resolvePath; - import java.net.URI; import javax.ws.rs.core.MediaType; @@ -133,26 +131,20 @@ public ChunkUploadResponse uploadTranslationFile( public ClientResponse downloadSourceFile(String projectSlug, String iterationSlug, String fileType, String docId) { - WebResource webResource = factory.getClient().resource(baseUri); - String path = resolvePath(webResource, FileResource.class, - "downloadSourceFile", projectSlug, iterationSlug, fileType); - return webResource.path(path) - .queryParam("docId", docId) - .get(ClientResponse.class); + WebResource webResource = factory.getClient().resource(baseUri) + .path(FileResource.SERVICE_PATH).path("source") + .path(projectSlug).path(iterationSlug).path(fileType); + return webResource.queryParam("docId", docId).get(ClientResponse.class); } public ClientResponse downloadTranslationFile(String projectSlug, String iterationSlug, String locale, String fileExtension, String docId) { - WebResource webResource = factory.getClient().resource(baseUri); - String path = - resolvePath(webResource, FileResource.class, - "downloadTranslationFile", - projectSlug, iterationSlug, locale, fileExtension); - return webResource.path(path) - .queryParam("docId", docId) - .get(ClientResponse.class); - + WebResource webResource = factory.getClient().resource(baseUri) + .path(FileResource.SERVICE_PATH).path("translation") + .path(projectSlug).path(iterationSlug).path(locale) + .path(fileExtension); + return webResource.queryParam("docId", docId).get(ClientResponse.class); } private static FormDataMultiPart addBodyPartIfPresent(