From 54d9d7f09d0ead145897184cf0726e94d888bd89 Mon Sep 17 00:00:00 2001 From: Alex Eng Date: Mon, 17 Jul 2017 16:24:46 +1000 Subject: [PATCH] fix: fix unit test --- .../main/java/org/zanata/rest/RestUtil.java | 12 +- .../service/AsynchronousProcessResource.java | 8 +- .../rest/service/SourceDocResource.java | 4 +- .../rest/service/TranslatedDocResource.java | 3 +- .../MockAsynchronousProcessResource.java | 1 - .../rest/service/MockSourceDocResource.java | 4 +- .../client/commands/push/PushCommand.java | 3 - .../rest/client/AsyncProcessClient.java | 2 - .../rest/client/SourceDocResourceClient.java | 4 +- .../rest/client/TransDocResourceClient.java | 8 +- .../client/SourceDocResourceClientTest.java | 2 - .../editor/service/StatisticsService.java | 4 +- .../AsynchronousProcessResourceService.java | 19 +-- .../rest/service/ProjectVersionService.java | 3 +- .../service/SourceDocResourceService.java | 31 +++-- .../service/TranslatedDocResourceService.java | 20 ++- .../org/zanata/rest/service/URIHelper.java | 38 ------ .../org/zanata/rest/service/ZPathService.java | 64 +-------- .../service/raw/AsyncResourceRestITCase.java | 121 +++++++++++++++++- .../SourceAndTranslationResourceRestBase.java | 21 ++- .../raw/TranslationResourceRestITCase.java | 4 +- 21 files changed, 195 insertions(+), 181 deletions(-) delete mode 100644 server/zanata-war/src/main/java/org/zanata/rest/service/URIHelper.java diff --git a/api/zanata-common-api/src/main/java/org/zanata/rest/RestUtil.java b/api/zanata-common-api/src/main/java/org/zanata/rest/RestUtil.java index 966c244d14a..ac63dfe8c2c 100644 --- a/api/zanata-common-api/src/main/java/org/zanata/rest/RestUtil.java +++ b/api/zanata-common-api/src/main/java/org/zanata/rest/RestUtil.java @@ -4,12 +4,16 @@ public class RestUtil { - public static String convertToDocumentURIId(String id) { + public static String convertToDocumentURIId(String docId) { // NB this currently prevents us from allowing ',' in file names - if (id.startsWith("/")) { - return id.substring(1).replace('/', ','); + if (docId.startsWith("/")) { + return docId.substring(1).replace('/', ','); } - return id.replace('/', ','); + return docId.replace('/', ','); + } + + public static String convertFromDocumentURIId(String docIdWithNoSlash) { + return docIdWithNoSlash.replace(',', '/'); } public static boolean isNotFound(Response response) { diff --git a/api/zanata-common-api/src/main/java/org/zanata/rest/service/AsynchronousProcessResource.java b/api/zanata-common-api/src/main/java/org/zanata/rest/service/AsynchronousProcessResource.java index 12a1ce58d0e..1a9bff5ce99 100644 --- a/api/zanata-common-api/src/main/java/org/zanata/rest/service/AsynchronousProcessResource.java +++ b/api/zanata-common-api/src/main/java/org/zanata/rest/service/AsynchronousProcessResource.java @@ -132,7 +132,7 @@ public ProcessStatus startSourceDocCreation( */ @Deprecated @PUT - @Path("/projects/p/{projectSlug}/iterations/i/{iterationSlug}/r" + @Path("/projects/p/{projectSlug}/iterations/i/{iterationSlug}" + SourceDocResource.RESOURCE_SLUG_TEMPLATE) /* Same as SourceDocResourceService.SERVICE_PATH */ @TypeHint(ProcessStatus.class) @@ -166,8 +166,7 @@ public ProcessStatus startSourceDocCreationOrUpdate( * e.g. "ext=gettext&ext=comment". */ @PUT - @Path("/projects/p/{projectSlug}/iterations/i/{iterationSlug}/resource" - + SourceDocResource.RESOURCE_SLUG_TEMPLATE) + @Path("/projects/p/{projectSlug}/iterations/i/{iterationSlug}/resource") @TypeHint(ProcessStatus.class) @StatusCodes({ @ResponseCode(code = 200, condition = "The contents of the response will indicate the process" + @@ -274,8 +273,7 @@ ProcessStatus startTranslatedDocCreationOrUpdate( " identifier which may be used to query for its status or a message" + " indicating what happened.") }) - public - ProcessStatus startTranslatedDocCreationOrUpdateWithDocId( + public ProcessStatus startTranslatedDocCreationOrUpdateWithDocId( @PathParam("projectSlug") String projectSlug, @PathParam("iterationSlug") String iterationSlug, @PathParam("locale") LocaleId locale, diff --git a/api/zanata-common-api/src/main/java/org/zanata/rest/service/SourceDocResource.java b/api/zanata-common-api/src/main/java/org/zanata/rest/service/SourceDocResource.java index 399aa9722a3..828f24d5b6f 100644 --- a/api/zanata-common-api/src/main/java/org/zanata/rest/service/SourceDocResource.java +++ b/api/zanata-common-api/src/main/java/org/zanata/rest/service/SourceDocResource.java @@ -172,7 +172,7 @@ Response getResource(@PathParam("id") String idNoSlash, /** * Retrieves information for a source Document. * - * @param id + * @param docId * The document identifier. * @param extensions * The document extensions to fetch along with the document (e.g. @@ -190,7 +190,7 @@ Response getResource(@PathParam("id") String idNoSlash, @TypeHint(Resource.class) @Path(DOCID_RESOURCE_PATH) public - Response getResourceWithDocId(@QueryParam("id") @DefaultValue("") String id, + Response getResourceWithDocId(@QueryParam("docId") @DefaultValue("") String docId, @QueryParam("ext") Set extensions); /** diff --git a/api/zanata-common-api/src/main/java/org/zanata/rest/service/TranslatedDocResource.java b/api/zanata-common-api/src/main/java/org/zanata/rest/service/TranslatedDocResource.java index f1eee4ff3bb..a30ea6dbf17 100644 --- a/api/zanata-common-api/src/main/java/org/zanata/rest/service/TranslatedDocResource.java +++ b/api/zanata-common-api/src/main/java/org/zanata/rest/service/TranslatedDocResource.java @@ -69,8 +69,7 @@ }) public interface TranslatedDocResource extends RestResource { @SuppressWarnings("deprecation") - public static final String SERVICE_PATH = - ProjectIterationResource.SERVICE_PATH + "/r"; + public static final String SERVICE_PATH = ProjectIterationResource.SERVICE_PATH; /** * Retrieves a set of translations for a given locale. diff --git a/client/stub-server/src/main/java/org/zanata/rest/service/MockAsynchronousProcessResource.java b/client/stub-server/src/main/java/org/zanata/rest/service/MockAsynchronousProcessResource.java index dd0999c6b04..fa5d4a52902 100644 --- a/client/stub-server/src/main/java/org/zanata/rest/service/MockAsynchronousProcessResource.java +++ b/client/stub-server/src/main/java/org/zanata/rest/service/MockAsynchronousProcessResource.java @@ -40,7 +40,6 @@ public class MockAsynchronousProcessResource implements private static final long serialVersionUID = 8841332691985560066L; @Override - @SuppressWarnings("deprecation") // TODO: remove this test when parent method is removed public ProcessStatus startSourceDocCreation(String idNoSlash, String projectSlug, String iterationSlug, Resource resource, diff --git a/client/stub-server/src/main/java/org/zanata/rest/service/MockSourceDocResource.java b/client/stub-server/src/main/java/org/zanata/rest/service/MockSourceDocResource.java index 606abb6d581..071cd19c62a 100644 --- a/client/stub-server/src/main/java/org/zanata/rest/service/MockSourceDocResource.java +++ b/client/stub-server/src/main/java/org/zanata/rest/service/MockSourceDocResource.java @@ -70,9 +70,9 @@ public Response getResource(String idNoSlash, Set extensions) { } @Override - public Response getResourceWithDocId(String id, Set extensions) { + public Response getResourceWithDocId(String docId, Set extensions) { MockResourceUtil.validateExtensions(extensions); - return Response.ok(new Resource(id)).build(); + return Response.ok(new Resource(docId)).build(); } @Override diff --git a/client/zanata-client-commands/src/main/java/org/zanata/client/commands/push/PushCommand.java b/client/zanata-client-commands/src/main/java/org/zanata/client/commands/push/PushCommand.java index a664d07dfab..13079c862ba 100644 --- a/client/zanata-client-commands/src/main/java/org/zanata/client/commands/push/PushCommand.java +++ b/client/zanata-client-commands/src/main/java/org/zanata/client/commands/push/PushCommand.java @@ -557,9 +557,6 @@ private void pushSrcDocToServer(final String docId, final Resource srcDoc, srcDoc.getName(), srcDoc.getTextFlows().size()); ConsoleUtils.startProgressFeedback(); - // NB: Copy trans is set to false as using copy trans in this manner - // is deprecated. - // see PushCommand.copyTransForDocument ProcessStatus status = asyncProcessClient.startSourceDocCreationOrUpdateWithDocId( getOpts().getProj(), getOpts().getProjectVersion(), diff --git a/client/zanata-rest-client/src/main/java/org/zanata/rest/client/AsyncProcessClient.java b/client/zanata-rest-client/src/main/java/org/zanata/rest/client/AsyncProcessClient.java index c3fd3b4053a..97d4068a5b2 100644 --- a/client/zanata-rest-client/src/main/java/org/zanata/rest/client/AsyncProcessClient.java +++ b/client/zanata-rest-client/src/main/java/org/zanata/rest/client/AsyncProcessClient.java @@ -54,8 +54,6 @@ public class AsyncProcessClient implements AsynchronousProcessResource { } @Override - @SuppressWarnings("deprecation") - // TODO: remove this test when parent method is removed public ProcessStatus startSourceDocCreation(String idNoSlash, String projectSlug, String iterationSlug, Resource resource, Set extensions, @DefaultValue("true") boolean copytrans) { diff --git a/client/zanata-rest-client/src/main/java/org/zanata/rest/client/SourceDocResourceClient.java b/client/zanata-rest-client/src/main/java/org/zanata/rest/client/SourceDocResourceClient.java index bcf5a056105..e9bb04cd6cd 100644 --- a/client/zanata-rest-client/src/main/java/org/zanata/rest/client/SourceDocResourceClient.java +++ b/client/zanata-rest-client/src/main/java/org/zanata/rest/client/SourceDocResourceClient.java @@ -62,9 +62,9 @@ public class SourceDocResourceClient { public List getResourceMeta(Set extensions) { Client client = factory.getClient(); - WebTarget webResource = getBaseServiceResource(client); + WebTarget webResource = getBaseServiceResource(client).path("r"); if (extensions != null) { - webResource.path("r").queryParam("ext", extensions.toArray()); + webResource.queryParam("ext", extensions.toArray()); } return webResource.request(MediaType.APPLICATION_XML_TYPE) .get(new GenericType>() {}); diff --git a/client/zanata-rest-client/src/main/java/org/zanata/rest/client/TransDocResourceClient.java b/client/zanata-rest-client/src/main/java/org/zanata/rest/client/TransDocResourceClient.java index e95d4cca108..d59a390ee5f 100644 --- a/client/zanata-rest-client/src/main/java/org/zanata/rest/client/TransDocResourceClient.java +++ b/client/zanata-rest-client/src/main/java/org/zanata/rest/client/TransDocResourceClient.java @@ -52,12 +52,8 @@ public class TransDocResourceClient { baseUri = factory.getBaseUri(); } - public Response getTranslations( - String docId, - LocaleId locale, - Set extensions, - boolean createSkeletons, - String eTag) { + public Response getTranslations(String docId, LocaleId locale, + Set extensions, boolean createSkeletons, String eTag) { Client client = factory.getClient(); Response response = getBaseServiceResource(client) .path("resource") diff --git a/client/zanata-rest-client/src/test/java/org/zanata/rest/client/SourceDocResourceClientTest.java b/client/zanata-rest-client/src/test/java/org/zanata/rest/client/SourceDocResourceClientTest.java index eb4e1619b34..b6a1cebe00a 100644 --- a/client/zanata-rest-client/src/test/java/org/zanata/rest/client/SourceDocResourceClientTest.java +++ b/client/zanata-rest-client/src/test/java/org/zanata/rest/client/SourceDocResourceClientTest.java @@ -54,7 +54,6 @@ public void setUp() throws URISyntaxException { @Test public void testGetResourceMeta() { List resourceMeta = client.getResourceMeta(null); - assertThat(resourceMeta, Matchers.hasSize(2)); } @@ -62,7 +61,6 @@ public void testGetResourceMeta() { public void testGetResource() { Resource resource = client.getResource("test", Sets.newHashSet("gettext", "comment")); - assertThat(resource.getName(), Matchers.equalTo("test")); } diff --git a/server/zanata-war/src/main/java/org/zanata/rest/editor/service/StatisticsService.java b/server/zanata-war/src/main/java/org/zanata/rest/editor/service/StatisticsService.java index 94580ad173c..ba411d3b1de 100644 --- a/server/zanata-war/src/main/java/org/zanata/rest/editor/service/StatisticsService.java +++ b/server/zanata-war/src/main/java/org/zanata/rest/editor/service/StatisticsService.java @@ -32,10 +32,10 @@ import org.zanata.common.LocaleId; import org.zanata.dao.DocumentDAO; import org.zanata.model.HDocument; +import org.zanata.rest.RestUtil; import org.zanata.rest.dto.stats.ContainerTranslationStatistics; import org.zanata.rest.dto.stats.TranslationStatistics; import org.zanata.rest.dto.stats.TranslationStatistics.StatUnit; -import org.zanata.rest.service.URIHelper; import org.zanata.rest.editor.service.resource.StatisticResource; import com.google.common.collect.Lists; @@ -56,7 +56,7 @@ public Response getDocumentStatistics( @PathParam("versionSlug") String versionSlug, @PathParam("docId") String docId, @PathParam("localeId") String localeId) { - docId = URIHelper.convertFromDocumentURIId(docId); + docId = RestUtil.convertFromDocumentURIId(docId); HDocument doc = documentDAO.getByProjectIterationAndDocId(projectSlug, versionSlug, docId); if (doc == null) { diff --git a/server/zanata-war/src/main/java/org/zanata/rest/service/AsynchronousProcessResourceService.java b/server/zanata-war/src/main/java/org/zanata/rest/service/AsynchronousProcessResourceService.java index 0b6417bc590..2b039bff871 100644 --- a/server/zanata-war/src/main/java/org/zanata/rest/service/AsynchronousProcessResourceService.java +++ b/server/zanata-war/src/main/java/org/zanata/rest/service/AsynchronousProcessResourceService.java @@ -40,6 +40,7 @@ import org.zanata.model.type.TranslationSourceType; import org.zanata.rest.NoSuchEntityException; import org.zanata.rest.ReadOnlyEntityException; +import org.zanata.rest.RestUtil; import org.zanata.rest.dto.ProcessStatus; import org.zanata.rest.dto.resource.Resource; import org.zanata.rest.dto.resource.TranslationsResource; @@ -69,6 +70,7 @@ public class AsynchronousProcessResourceService implements AsynchronousProcessResource { private static final org.slf4j.Logger log = org.slf4j.LoggerFactory .getLogger(AsynchronousProcessResourceService.class); + private static final long serialVersionUID = -5915271018788588841L; @Inject private LocaleService localeServiceImpl; @@ -83,8 +85,6 @@ public class AsynchronousProcessResourceService @Inject private ProjectIterationDAO projectIterationDAO; @Inject - private ResourceUtils resourceUtils; - @Inject private ZanataIdentity identity; @Override @@ -96,7 +96,7 @@ public ProcessStatus startSourceDocCreation(final String idNoSlash, retrieveAndCheckIteration(projectSlug, iterationSlug, true); // Check permission identity.checkPermission(hProjectIteration, "import-template"); - resourceUtils.validateExtensions(extensions); // gettext, comment + ResourceUtils.validateExtensions(extensions); // gettext, comment HDocument document = documentDAO .getByDocIdAndIteration(hProjectIteration, resource.getName()); // already existing non-obsolete document. @@ -112,7 +112,7 @@ public ProcessStatus startSourceDocCreation(final String idNoSlash, } String name = "SourceDocCreation: " + projectSlug + "-" + iterationSlug + "-" + idNoSlash; - AsyncTaskHandle handle = new AsyncTaskHandle(); + AsyncTaskHandle handle = new AsyncTaskHandle<>(); String keyId = asyncTaskHandleManager.registerTaskHandle(handle); documentServiceImpl .saveDocumentAsync(projectSlug, iterationSlug, @@ -129,7 +129,7 @@ public ProcessStatus startSourceDocCreationOrUpdate(final String idNoSlash, final String projectSlug, final String iterationSlug, final Resource resource, final Set extensions, final boolean copytrans) { - String docId = URIHelper.convertFromDocumentURIId(idNoSlash); + String docId = RestUtil.convertFromDocumentURIId(idNoSlash); return startSourceDocCreationOrUpdateProcess(projectSlug, iterationSlug, resource, extensions, docId, copytrans); } @@ -151,7 +151,7 @@ private ProcessStatus startSourceDocCreationOrUpdateProcess( } HProjectIteration hProjectIteration = retrieveAndCheckIteration(projectSlug, iterationSlug, true); - resourceUtils.validateExtensions(extensions); // gettext, comment + ResourceUtils.validateExtensions(extensions); // gettext, comment // Check permission identity.checkPermission(hProjectIteration, "import-template"); String name = "SourceDocCreationOrUpdate: " + projectSlug + "-" @@ -198,7 +198,7 @@ public ProcessStatus startTranslatedDocCreationOrUpdate( final TranslationsResource translatedDoc, final Set extensions, final String merge, final boolean assignCreditToUploader) { - final String id = URIHelper.convertFromDocumentURIId(idNoSlash); + final String id = RestUtil.convertFromDocumentURIId(idNoSlash); return startTranslatedDocCreationOrUpdateWithDocId(projectSlug, iterationSlug, locale, translatedDoc, id, extensions, merge, assignCreditToUploader); @@ -217,7 +217,7 @@ public ProcessStatus startTranslatedDocCreationOrUpdateWithDocId( this.getSecuredIteration(projectSlug, iterationSlug) .getProject()); if (StringUtils.isBlank(docId)) { - throw new BadRequestException("missing id"); + throw new BadRequestException("missing docId"); } MergeType mergeType; try { @@ -231,7 +231,7 @@ public ProcessStatus startTranslatedDocCreationOrUpdateWithDocId( final MergeType finalMergeType = mergeType; String taskName = "TranslatedDocUpload: "+projectSlug+"-"+iterationSlug+"-"+ docId; - AsyncTaskHandle handle = new AsyncTaskHandle(); + AsyncTaskHandle handle = new AsyncTaskHandle<>(); String keyId = asyncTaskHandleManager.registerTaskHandle(handle); translationServiceImpl.translateAllInDocAsync(projectSlug, iterationSlug, docId, locale, translatedDoc, extensions, @@ -242,6 +242,7 @@ public ProcessStatus startTranslatedDocCreationOrUpdateWithDocId( } @Override + @SuppressWarnings("rawtypes") public ProcessStatus getProcessStatus(String processId) { AsyncTaskHandle handle = asyncTaskHandleManager.getHandleByKeyId(processId); diff --git a/server/zanata-war/src/main/java/org/zanata/rest/service/ProjectVersionService.java b/server/zanata-war/src/main/java/org/zanata/rest/service/ProjectVersionService.java index b547d3ea043..89889ba5413 100644 --- a/server/zanata-war/src/main/java/org/zanata/rest/service/ProjectVersionService.java +++ b/server/zanata-war/src/main/java/org/zanata/rest/service/ProjectVersionService.java @@ -45,6 +45,7 @@ import org.zanata.model.HTextFlow; import org.zanata.rest.NoSuchEntityException; import org.zanata.rest.ReadOnlyEntityException; +import org.zanata.rest.RestUtil; import org.zanata.rest.dto.LocaleDetails; import org.zanata.rest.dto.ProcessStatus; import org.zanata.rest.dto.ProjectIteration; @@ -306,7 +307,7 @@ public Response getTransUnitStatus( if (StringUtils.isEmpty(noSlashDocId)) { return Response.status(Response.Status.NOT_FOUND).build(); } - String docId = URIHelper.convertFromDocumentURIId(noSlashDocId); + String docId = RestUtil.convertFromDocumentURIId(noSlashDocId); HDocument document = documentDAO .getByProjectIterationAndDocId(projectSlug, versionSlug, docId); if (document == null) { diff --git a/server/zanata-war/src/main/java/org/zanata/rest/service/SourceDocResourceService.java b/server/zanata-war/src/main/java/org/zanata/rest/service/SourceDocResourceService.java index 32d9549673a..7c1016679a7 100644 --- a/server/zanata-war/src/main/java/org/zanata/rest/service/SourceDocResourceService.java +++ b/server/zanata-war/src/main/java/org/zanata/rest/service/SourceDocResourceService.java @@ -40,6 +40,7 @@ import javax.inject.Inject; import javax.inject.Named; +import edu.umd.cs.findbugs.annotations.SuppressFBWarnings; import org.apache.commons.lang3.StringUtils; import org.apache.deltaspike.jpa.api.transaction.Transactional; import org.zanata.common.EntityStatus; @@ -54,6 +55,7 @@ import org.zanata.model.HTextFlow; import org.zanata.rest.NoSuchEntityException; import org.zanata.rest.ReadOnlyEntityException; +import org.zanata.rest.RestUtil; import org.zanata.rest.dto.resource.Resource; import org.zanata.rest.dto.resource.ResourceMeta; import org.zanata.rest.dto.resource.TextFlow; @@ -72,10 +74,13 @@ public class SourceDocResourceService implements SourceDocResource { private static final org.slf4j.Logger log = org.slf4j.LoggerFactory.getLogger(SourceDocResourceService.class); + private static final long serialVersionUID = 7787405987851272827L; @Context + @SuppressFBWarnings(value = "SE_BAD_FIELD") private Request request; @Context + @SuppressFBWarnings(value = "SE_BAD_FIELD") private UriInfo uri; /** @@ -144,7 +149,7 @@ public Response post(Resource resource, Set extensions, boolean copytrans) { identity.checkPermission(getSecuredIteration(), "import-template"); HProjectIteration hProjectIteration = retrieveAndCheckIteration(true); - resourceUtils.validateExtensions(extensions); // gettext, comment + ResourceUtils.validateExtensions(extensions); // gettext, comment String resourceName = resource.getName(); if (!Pattern.matches(SourceDocResource.RESOURCE_NAME_REGEX, resourceName)) { @@ -179,14 +184,14 @@ public Response post(Resource resource, Set extensions, @Override public Response getResource(String idNoSlash, Set extensions) { - String id = URIHelper.convertFromDocumentURIId(idNoSlash); + String id = RestUtil.convertFromDocumentURIId(idNoSlash); return getResourceWithDocId(id, extensions); } @Override - public Response getResourceWithDocId(String id, Set extensions) { + public Response getResourceWithDocId(String docId, Set extensions) { log.debug("start get resource"); - if (StringUtils.isBlank(id)) { + if (StringUtils.isBlank(docId)) { return Response.status(Response.Status.BAD_REQUEST) .entity("missing id").build(); } @@ -194,13 +199,13 @@ public Response getResourceWithDocId(String id, Set extensions) { ResourceUtils.validateExtensions(extensions); final Set extSet = new HashSet<>(extensions); EntityTag etag = eTagUtils.generateETagForDocument(hProjectIteration, - id, extSet); + docId, extSet); Response.ResponseBuilder response = request.evaluatePreconditions(etag); if (response != null) { return response.build(); } HDocument doc = - documentDAO.getByDocIdAndIteration(hProjectIteration, id); + documentDAO.getByDocIdAndIteration(hProjectIteration, docId); if (doc == null || doc.isObsolete()) { // TODO: return Problem DTO, https://tools.ietf.org/html/rfc7807 return Response.status(Response.Status.NOT_FOUND) @@ -228,7 +233,7 @@ public Response getResourceWithDocId(String id, Set extensions) { @Override public Response putResource(String idNoSlash, Resource resource, Set extensions, boolean copytrans) { - String id = URIHelper.convertFromDocumentURIId(idNoSlash); + String id = RestUtil.convertFromDocumentURIId(idNoSlash); return putResourceWithDocId(resource, id, extensions, copytrans); } @@ -239,18 +244,18 @@ public Response putResourceWithDocId(Resource resource, String docId, log.debug("start put resource"); if (StringUtils.isBlank(docId)) { return Response.status(Response.Status.BAD_REQUEST) - .entity("missing id").build(); + .entity("missing docId").build(); } Response.ResponseBuilder response; HProjectIteration hProjectIteration = retrieveAndCheckIteration(true); - resourceUtils.validateExtensions(extensions); + ResourceUtils.validateExtensions(extensions); HDocument document = this.documentDAO.getByDocIdAndIteration(hProjectIteration, docId); if (document == null || document.isObsolete()) { response = Response.created( UriBuilder.fromUri(uri.getAbsolutePath()) - .queryParam("id", docId).build()); + .queryParam("docId", docId).build()); } else { response = Response.ok(); } @@ -265,7 +270,7 @@ public Response putResourceWithDocId(Resource resource, String docId, @Override public Response deleteResource(String idNoSlash) { - String id = URIHelper.convertFromDocumentURIId(idNoSlash); + String id = RestUtil.convertFromDocumentURIId(idNoSlash); return deleteResourceWithDocId(id); } @@ -291,7 +296,7 @@ public Response deleteResourceWithDocId(String docId) { @Override public Response getResourceMeta(String idNoSlash, Set extensions) { - String id = URIHelper.convertFromDocumentURIId(idNoSlash); + String id = RestUtil.convertFromDocumentURIId(idNoSlash); return getResourceMetaWithDocId(id, extensions); } @@ -328,7 +333,7 @@ public Response getResourceMetaWithDocId(String docId, @Override public Response putResourceMeta(String idNoSlash, ResourceMeta messageBody, Set extensions) { - String id = URIHelper.convertFromDocumentURIId(idNoSlash); + String id = RestUtil.convertFromDocumentURIId(idNoSlash); return putResourceMetaWithDocId(messageBody, id , extensions); } diff --git a/server/zanata-war/src/main/java/org/zanata/rest/service/TranslatedDocResourceService.java b/server/zanata-war/src/main/java/org/zanata/rest/service/TranslatedDocResourceService.java index 6867d8356d0..844656a04f5 100644 --- a/server/zanata-war/src/main/java/org/zanata/rest/service/TranslatedDocResourceService.java +++ b/server/zanata-war/src/main/java/org/zanata/rest/service/TranslatedDocResourceService.java @@ -41,11 +41,9 @@ import edu.umd.cs.findbugs.annotations.SuppressFBWarnings; import org.apache.commons.lang3.StringUtils; import org.apache.deltaspike.jpa.api.transaction.Transactional; -import org.zanata.ApplicationConfiguration; import org.zanata.common.LocaleId; import org.zanata.common.MergeType; import org.zanata.dao.DocumentDAO; -import org.zanata.dao.ProjectDAO; import org.zanata.dao.ProjectIterationDAO; import org.zanata.dao.TextFlowTargetDAO; import org.zanata.model.HDocument; @@ -53,9 +51,9 @@ import org.zanata.model.HProjectIteration; import org.zanata.model.HTextFlowTarget; import org.zanata.model.type.TranslationSourceType; +import org.zanata.rest.RestUtil; import org.zanata.rest.dto.resource.TranslationsResource; import org.zanata.security.ZanataIdentity; -import org.zanata.service.CopyTransService; import org.zanata.service.LocaleService; import org.zanata.service.TranslationService; import com.google.common.base.Optional; @@ -71,6 +69,7 @@ public class TranslatedDocResourceService implements TranslatedDocResource { private static final org.slf4j.Logger log = org.slf4j.LoggerFactory .getLogger(TranslatedDocResourceService.class); + private static final long serialVersionUID = -5855787114970845084L; // security actions // private static final String ACTION_IMPORT_TEMPLATE = "import-template"; @@ -96,20 +95,19 @@ public class TranslatedDocResourceService implements TranslatedDocResource { @Context private MediaType requestContentType; @Context + @SuppressFBWarnings("SE_BAD_FIELD") private HttpHeaders headers; @Context + @SuppressFBWarnings("SE_BAD_FIELD") private Request request; @Context + @SuppressFBWarnings("SE_BAD_FIELD") private UriInfo uri; @Inject private ZanataIdentity identity; @Inject - private ApplicationConfiguration applicationConfiguration; - @Inject private ProjectIterationDAO projectIterationDAO; @Inject - private ProjectDAO projectDAO; - @Inject private DocumentDAO documentDAO; @Inject private TextFlowTargetDAO textFlowTargetDAO; @@ -118,8 +116,6 @@ public class TranslatedDocResourceService implements TranslatedDocResource { @Inject private ETagUtils eTagUtils; @Inject - private CopyTransService copyTransServiceImpl; - @Inject private RestSlugValidator restSlugValidator; @Inject private TranslationService translationServiceImpl; @@ -129,7 +125,7 @@ public class TranslatedDocResourceService implements TranslatedDocResource { @Override public Response getTranslations(String idNoSlash, LocaleId locale, Set extensions, boolean skeletons, String eTag) { - String id = URIHelper.convertFromDocumentURIId(idNoSlash); + String id = RestUtil.convertFromDocumentURIId(idNoSlash); return getTranslationsWithDocId(locale, id, extensions, skeletons, eTag); } @@ -183,7 +179,7 @@ public Response getTranslationsWithDocId(LocaleId locale, String docId, @Override public Response deleteTranslations(String idNoSlash, LocaleId locale) { - String id = URIHelper.convertFromDocumentURIId(idNoSlash); + String id = RestUtil.convertFromDocumentURIId(idNoSlash); return deleteTranslationsWithDocId(locale, id); } @@ -225,7 +221,7 @@ public Response deleteTranslationsWithDocId(LocaleId locale, String docId) { public Response putTranslations(String idNoSlash, LocaleId locale, TranslationsResource messageBody, Set extensions, String merge) { - String id = URIHelper.convertFromDocumentURIId(idNoSlash); + String id = RestUtil.convertFromDocumentURIId(idNoSlash); return putTranslationsWithDocId(locale, messageBody, id, extensions, merge); } diff --git a/server/zanata-war/src/main/java/org/zanata/rest/service/URIHelper.java b/server/zanata-war/src/main/java/org/zanata/rest/service/URIHelper.java deleted file mode 100644 index f49a4d43d2e..00000000000 --- a/server/zanata-war/src/main/java/org/zanata/rest/service/URIHelper.java +++ /dev/null @@ -1,38 +0,0 @@ -package org.zanata.rest.service; - -import org.zanata.rest.RestUtil; - -/** - * @see {@link ZPathService} - */ -public final class URIHelper { - - private URIHelper() { - } - - public static String getProject(String projectSlug) { - return "/projects/p/" + projectSlug; - } - - public static String getIteration(String projectSlug, String iterationSlug) { - return getProject(projectSlug) + "/iterations/i/" + iterationSlug; - } - - public static String getDocument(String projectSlug, String iterationSlug, - String documentId) { - return getIteration(projectSlug, iterationSlug) + "/r/" - + RestUtil.convertToDocumentURIId(documentId); - } - - public static String convertFromDocumentURIId(String uriId) { - return uriId.replace(',', '/'); - } - - /** - * @deprecated Use {@link RestUtil#convertToDocumentURIId(String)} instead - */ - public static String convertToDocumentURIId(String id) { - return RestUtil.convertToDocumentURIId(id); - } - -} diff --git a/server/zanata-war/src/main/java/org/zanata/rest/service/ZPathService.java b/server/zanata-war/src/main/java/org/zanata/rest/service/ZPathService.java index ad003ca9166..8d3d825dd69 100644 --- a/server/zanata-war/src/main/java/org/zanata/rest/service/ZPathService.java +++ b/server/zanata-war/src/main/java/org/zanata/rest/service/ZPathService.java @@ -21,20 +21,11 @@ package org.zanata.rest.service; import java.io.Serializable; -import java.io.UnsupportedEncodingException; -import java.net.URLEncoder; import java.text.MessageFormat; -import java.util.regex.Matcher; -import java.util.regex.Pattern; -import javax.inject.Inject; import javax.inject.Named; -import org.zanata.dao.ProjectDAO; import org.zanata.model.HDocument; -import org.zanata.model.HProject; import org.zanata.model.HProjectIteration; -import org.zanata.model.validator.SlugValidator; -import org.zanata.rest.RestUtil; /** * Service that provides static services to build, parse and interpret Zanata @@ -49,12 +40,6 @@ // TODO this should probably be Transactional (and not Dependent) public class ZPathService implements Serializable { - /* - * Public ZPaths. Used for rest resource path declaration. - */ - public static final String PROJECT_ZPATH = "/proj/" - + RestConstants.SLUG_PATTERN; - /* * Private ZPaths. Mainly used for generation. */ @@ -62,31 +47,7 @@ public class ZPathService implements Serializable { private static final String PROJECT_ITER_ZPATH_PRIVATE = PROJECT_ZPATH_PRIVATE + "/iterations/i/{1}"; private static final String DOCUMENT_ZPATH_PRIVATE = - PROJECT_ITER_ZPATH_PRIVATE + "/r/{2}"; - - /* - * Internal utilities based on the public ZPaths - */ - private static final Pattern PROJECT_ZPATH_PATTERN = Pattern - .compile(PROJECT_ZPATH); - - @Inject - private ProjectDAO projectDAO; - - public HProject resolveProject(String zPath) { - Matcher projMatcher = PROJECT_ZPATH_PATTERN.matcher(zPath); - if (projMatcher.matches()) { - String projectSlug = projMatcher.group(1); // Group 1, project slug - return projectDAO.getBySlug(projectSlug); - } else { - return null; - } - } - - public String generatePathForProject(HProject project) { - MessageFormat mssgFormat = new MessageFormat(PROJECT_ZPATH_PRIVATE); - return mssgFormat.format(project.getSlug()); - } + PROJECT_ITER_ZPATH_PRIVATE + "/resource?docId={2}"; public String generatePathForProjectIteration(HProjectIteration iteration) { MessageFormat mssgFormat = @@ -96,27 +57,10 @@ public String generatePathForProjectIteration(HProjectIteration iteration) { } public String generatePathForDocument(HDocument document) { - String docIdNoSlash = null; - try { - docIdNoSlash = - URLEncoder.encode(RestUtil.convertToDocumentURIId(document - .getDocId()), "UTF-8"); - } catch (UnsupportedEncodingException e) { - throw new RuntimeException(e); - } - MessageFormat mssgFormat = new MessageFormat(DOCUMENT_ZPATH_PRIVATE); - return mssgFormat.format(new Object[] { + return mssgFormat.format(new Object[]{ document.getProjectIteration().getProject().getSlug(), - document.getProjectIteration().getSlug(), docIdNoSlash }); - } - - public Object resolve(String zPath) { - Matcher projMatcher = PROJECT_ZPATH_PATTERN.matcher(zPath); - if (projMatcher.matches()) { - return resolveProject(zPath); - } - - return null; + document.getProjectIteration().getSlug(), document + .getDocId()}); } } diff --git a/server/zanata-war/src/test/java/org/zanata/rest/service/raw/AsyncResourceRestITCase.java b/server/zanata-war/src/test/java/org/zanata/rest/service/raw/AsyncResourceRestITCase.java index 60e77a0f342..7e13f4cfa01 100644 --- a/server/zanata-war/src/test/java/org/zanata/rest/service/raw/AsyncResourceRestITCase.java +++ b/server/zanata-war/src/test/java/org/zanata/rest/service/raw/AsyncResourceRestITCase.java @@ -71,7 +71,8 @@ protected void prepareDBUnitOperations() { @Test @RunAsClient - public void testPutGetResourceWithExtension() throws Exception { + @Deprecated + public void testPutGetResourceWithExtensionDeprecate() throws Exception { final Resource resource = resourceTestFactory.getTextFlowTest(); final AtomicReference processId = new AtomicReference<>(null); new ResourceRequest( @@ -141,7 +142,78 @@ protected void onResponse(Response response) { @Test @RunAsClient - public void testPutGetTranslationWithExtension() throws Exception { + public void testPutGetResourceWithExtension() throws Exception { + final Resource resource = resourceTestFactory.getTextFlowTest(); + final AtomicReference processId = new AtomicReference<>(null); + new ResourceRequest( + getRestEndpointUrl( + "async/projects/p/sample-project/iterations/i/1.0/resource"), + "PUT", getAuthorizedEnvironment()) { + + @Override + protected Invocation.Builder prepareRequest(ResteasyWebTarget webTarget) { + return webTarget.queryParam("docId", resource.getName()). + queryParam("ext", "gettext"). + queryParam("ext", "comment"). + queryParam("copyTrans", false).request(); + } + + @Override + public void invoke(Invocation.Builder builder) { + Entity entity = Entity + .entity(jaxbMarhsal(resource), MediaType.APPLICATION_XML_TYPE); + Response response = builder.buildPut(entity).invoke(); + onResponse(response); + } + + + @Override + protected void onResponse(Response response) { + assertThat(response.getStatus(), is(200)); + String entityString = response.readEntity(String.class); + + assertJaxbUnmarshal(entityString, ProcessStatus.class); + ProcessStatus status = + jaxbUnmarshal(entityString, ProcessStatus.class); + assertThat(status.getUrl(), is(notNullValue())); + processId.set(status.getUrl()); + } + }.run(); + waitAtMost(Duration.TEN_SECONDS).catchUncaughtExceptions() + .pollInterval(Duration.ONE_SECOND) + .until(asyncPushFinishCallable(processId.get())); + new ResourceRequest( + getRestEndpointUrl( + "projects/p/sample-project/iterations/i/1.0/r/" + + resource.getName()), + "GET", getAuthorizedEnvironment()) { + + @Override + protected Invocation.Builder prepareRequest( + ResteasyWebTarget webTarget) { + return webTarget.queryParam("ext", "gettext"). + queryParam("ext", "comment").request(); + } + + @Override + protected void onResponse(Response response) { + assertThat(response.getStatus(), is(200)); + String entityString = response.readEntity(String.class); + Resource get = jaxbUnmarshal(entityString, Resource.class); + Resource base = resourceTestFactory.getTextFlowTest(); + ResourceTestUtil.clearRevs(base); + ResourceTestUtil.clearRevs(get); + log.debug("expect:" + base.toString()); + log.debug("actual:" + get.toString()); + assertThat(get.toString(), is(base.toString())); + } + }.run(); + } + + @Test + @RunAsClient + @Deprecated + public void testPutGetTranslationWithExtensionDeprecate() throws Exception { final TranslationsResource resource = translationTestFactory.getTextFlowTargetCommentTest(); final AtomicReference processId = new AtomicReference<>(null); @@ -183,6 +255,51 @@ protected void onResponse(Response response) { .until(asyncPushFinishCallable(processId.get())); } + @Test + @RunAsClient + public void testPutGetTranslationWithExtension() throws Exception { + final TranslationsResource resource = + translationTestFactory.getTextFlowTargetCommentTest(); + final AtomicReference processId = new AtomicReference<>(null); + new ResourceRequest( + getRestEndpointUrl( + "async/projects/p/sample-project/iterations/i/1.0/resource/translations/en"), + "PUT", getAuthorizedEnvironment()) { + + @Override + protected Invocation.Builder prepareRequest( + ResteasyWebTarget webTarget) { + return webTarget.queryParam("docId", "my/path/document.txt"). + queryParam("ext", "gettext"). + queryParam("ext", "comment"). + queryParam("merge", "auto").request(); + } + + @Override + public void invoke(Invocation.Builder builder) { + Entity entity = Entity + .entity(jaxbMarhsal(resource), + MediaType.APPLICATION_XML_TYPE); + Response response = builder.buildPut(entity).invoke(); + onResponse(response); + } + + @Override + protected void onResponse(Response response) { + assertThat(response.getStatus(), is(200)); + String entityString = response.readEntity(String.class); + assertJaxbUnmarshal(entityString, ProcessStatus.class); + ProcessStatus status = + jaxbUnmarshal(entityString, ProcessStatus.class); + assertThat(status.getUrl(), is(notNullValue())); + processId.set(status.getUrl()); + } + }.run(); + waitAtMost(Duration.TEN_SECONDS).catchUncaughtExceptions() + .pollInterval(Duration.ONE_SECOND) + .until(asyncPushFinishCallable(processId.get())); + } + private Callable asyncPushFinishCallable(final String processId) { return new Callable() { diff --git a/server/zanata-war/src/test/java/org/zanata/rest/service/raw/SourceAndTranslationResourceRestBase.java b/server/zanata-war/src/test/java/org/zanata/rest/service/raw/SourceAndTranslationResourceRestBase.java index 7b0dd42e062..fd6e4b31ae1 100644 --- a/server/zanata-war/src/test/java/org/zanata/rest/service/raw/SourceAndTranslationResourceRestBase.java +++ b/server/zanata-war/src/test/java/org/zanata/rest/service/raw/SourceAndTranslationResourceRestBase.java @@ -187,7 +187,7 @@ protected void onResponse(Response response) { } @Override - public Response getResourceWithDocId(String id, + public Response getResourceWithDocId(String docId, Set extensions) { return new ResourceRequest( getRestEndpointUrl(BASE_PATH), @@ -196,7 +196,7 @@ public Response getResourceWithDocId(String id, protected Invocation.Builder prepareRequest( ResteasyWebTarget webTarget) { return addExtensionToRequest(extensions, webTarget). - queryParam("id", id). + queryParam("docId", docId). request().header(HttpHeaders.ACCEPT, MediaType.APPLICATION_XML_TYPE); } @@ -249,7 +249,7 @@ public Response putResourceWithDocId(Resource resource, protected Invocation.Builder prepareRequest( ResteasyWebTarget webTarget) { return addExtensionToRequest(extensions, webTarget) - .queryParam("id", docId) + .queryParam("docId", docId) .queryParam("copyTrans", String.valueOf(copytrans)).request(); } @@ -288,13 +288,12 @@ protected void onResponse(Response response) { @Override public Response deleteResourceWithDocId(String docId) { - return new ResourceRequest( - getRestEndpointUrl(BASE_PATH), + return new ResourceRequest(getRestEndpointUrl(BASE_PATH), "DELETE", getAuthorizedEnvironment()) { @Override protected Invocation.Builder prepareRequest( ResteasyWebTarget webTarget) { - return webTarget.queryParam("id", docId).request(); + return webTarget.queryParam("docId", docId).request(); } @Override @@ -335,7 +334,7 @@ public Response getResourceMetaWithDocId(String docId, protected Invocation.Builder prepareRequest( ResteasyWebTarget webTarget) { return addExtensionToRequest(extensions, webTarget) - .queryParam("id", docId) + .queryParam("docId", docId) .request().header(HttpHeaders.ACCEPT, MediaType.APPLICATION_XML_TYPE); } @@ -387,7 +386,7 @@ public Response putResourceMetaWithDocId(ResourceMeta messageBody, protected Invocation.Builder prepareRequest( ResteasyWebTarget webTarget) { return addExtensionToRequest(extensions, webTarget) - .queryParam("id", docId) + .queryParam("docId", docId) .request(); } @@ -449,7 +448,7 @@ public Response getTranslationsWithDocId(LocaleId locale, protected Invocation.Builder prepareRequest( ResteasyWebTarget webTarget) { return addExtensionToRequest(extensions, webTarget) - .queryParam("id", docId) + .queryParam("docId", docId) .queryParam("skeletons", String.valueOf(createSkeletons)) .request().header(HttpHeaders.ACCEPT, @@ -489,7 +488,7 @@ public Response deleteTranslationsWithDocId(LocaleId locale, @Override protected Invocation.Builder prepareRequest( ResteasyWebTarget webTarget) { - return webTarget.queryParam("id", docId).request(); + return webTarget.queryParam("docId", docId).request(); } @Override @@ -541,7 +540,7 @@ public Response putTranslationsWithDocId(LocaleId locale, protected Invocation.Builder prepareRequest( ResteasyWebTarget webTarget) { return addExtensionToRequest(extensions, webTarget) - .queryParam("id", docId) + .queryParam("docId", docId) .queryParam("merge", merge).request() .header(HttpHeaders.ACCEPT, MediaType.APPLICATION_XML_TYPE); diff --git a/server/zanata-war/src/test/java/org/zanata/rest/service/raw/TranslationResourceRestITCase.java b/server/zanata-war/src/test/java/org/zanata/rest/service/raw/TranslationResourceRestITCase.java index e0221ec2ffb..11395a5f00d 100644 --- a/server/zanata-war/src/test/java/org/zanata/rest/service/raw/TranslationResourceRestITCase.java +++ b/server/zanata-war/src/test/java/org/zanata/rest/service/raw/TranslationResourceRestITCase.java @@ -301,7 +301,7 @@ public void putNewDocument() { assertThat(response.getStatus(), is(Status.CREATED.getStatusCode())); assertThat(response.getMetadata().getFirst("Location").toString(), - endsWith(DEPRECATED_BASE_PATH + "resource?id=" + UrlUtil.encodeString(docName))); + endsWith(BASE_PATH + "?docId=" + UrlUtil.encodeString(docName))); Response documentResponse = getSourceDocResource().getResourceWithDocId(docName, null); @@ -371,7 +371,7 @@ public void putNewDocumentWithResources() throws Exception { assertThat(response.getStatus(), is(Status.CREATED.getStatusCode())); assertThat(response.getMetadata().getFirst("Location").toString(), - endsWith(DEPRECATED_BASE_PATH + "resource?id=" + UrlUtil.encodeString(docName))); + endsWith(BASE_PATH + "?docId=" + UrlUtil.encodeString(docName))); Response documentResponse = getSourceDocResource().getResourceWithDocId(docName, null);