diff --git a/ide/che-core-ide-api/src/main/java/org/eclipse/che/ide/api/git/GitServiceClientImpl.java b/ide/che-core-ide-api/src/main/java/org/eclipse/che/ide/api/git/GitServiceClientImpl.java index f8f951eccf..c75801b5e4 100644 --- a/ide/che-core-ide-api/src/main/java/org/eclipse/che/ide/api/git/GitServiceClientImpl.java +++ b/ide/che-core-ide-api/src/main/java/org/eclipse/che/ide/api/git/GitServiceClientImpl.java @@ -15,8 +15,10 @@ import static java.util.stream.Collectors.toList; import static org.eclipse.che.api.git.shared.AddRequest.DEFAULT_PATTERN; import static org.eclipse.che.ide.MimeType.APPLICATION_JSON; import static org.eclipse.che.ide.MimeType.TEXT_PLAIN; +import static org.eclipse.che.ide.resource.Path.valueOf; import static org.eclipse.che.ide.rest.HTTPHeader.ACCEPT; import static org.eclipse.che.ide.rest.HTTPHeader.CONTENTTYPE; +import static org.eclipse.che.ide.util.PathEncoder.encodePath; import com.google.inject.Inject; import com.google.inject.Singleton; @@ -109,7 +111,8 @@ public class GitServiceClientImpl implements GitServiceClient { @Override public Promise init(Path project, boolean bare) { - String url = getWsAgentBaseUrl() + INIT + "?projectPath=" + project + "&bare=" + bare; + String url = + getWsAgentBaseUrl() + INIT + "?projectPath=" + encodePath(project) + "&bare=" + bare; return asyncRequestFactory.createPostRequest(url, null).loader(loader).send(); } @@ -122,7 +125,7 @@ public class GitServiceClientImpl implements GitServiceClient { .withRemoteUri(remoteUri) .withWorkingDir(project.toString()); - String params = "?projectPath=" + project; + String params = "?projectPath=" + encodePath(project); String url = CLONE + params; return asyncRequestFactory.createPostRequest(url, cloneRequest).loader(loader).send(); @@ -130,7 +133,7 @@ public class GitServiceClientImpl implements GitServiceClient { @Override public Promise statusText(Path project) { - String params = "?projectPath=" + project; + String params = "?projectPath=" + encodePath(project); String url = getWsAgentBaseUrl() + STATUS + params; return asyncRequestFactory @@ -148,7 +151,7 @@ public class GitServiceClientImpl implements GitServiceClient { paths == null ? DEFAULT_PATTERN : stream(paths).map(path -> path.isEmpty() ? "." : path.toString()).collect(toList())); - String url = getWsAgentBaseUrl() + ADD + "?projectPath=" + project; + String url = getWsAgentBaseUrl() + ADD + "?projectPath=" + encodePath(project); return asyncRequestFactory.createPostRequest(url, addRequest).loader(loader).send(); } @@ -160,7 +163,7 @@ public class GitServiceClientImpl implements GitServiceClient { .withMessage(message) .withAmend(amend) .withAll(all); - String url = getWsAgentBaseUrl() + COMMIT + "?projectPath=" + project; + String url = getWsAgentBaseUrl() + COMMIT + "?projectPath=" + encodePath(project); return asyncRequestFactory .createPostRequest(url, commitRequest) .loader(loader) @@ -180,7 +183,7 @@ public class GitServiceClientImpl implements GitServiceClient { .map(Path::toString) .collect(toList())); - String url = getWsAgentBaseUrl() + COMMIT + "?projectPath=" + project; + String url = getWsAgentBaseUrl() + COMMIT + "?projectPath=" + encodePath(project); return asyncRequestFactory .createPostRequest(url, commitRequest) @@ -190,7 +193,7 @@ public class GitServiceClientImpl implements GitServiceClient { @Override public Promise> config(Path project, List requestedConfig) { - String params = "?projectPath=" + project; + String params = "?projectPath=" + encodePath(project); if (requestedConfig != null) { for (String entry : requestedConfig) { params += "&requestedConfig=" + entry; @@ -212,7 +215,7 @@ public class GitServiceClientImpl implements GitServiceClient { .withRemote(remote) .withRefSpec(refSpec) .withForce(force); - String url = getWsAgentBaseUrl() + PUSH + "?projectPath=" + project; + String url = getWsAgentBaseUrl() + PUSH + "?projectPath=" + encodePath(project); return asyncRequestFactory .createPostRequest(url, pushRequest) .send(dtoUnmarshallerFactory.newUnmarshaller(PushResponse.class)); @@ -222,7 +225,7 @@ public class GitServiceClientImpl implements GitServiceClient { public Promise> remoteList(Path project, String remoteName, boolean verbose) { String params = "?projectPath=" - + project + + encodePath(project) + (remoteName != null ? "&remoteName=" + remoteName : "") + "&verbose=" + String.valueOf(verbose); @@ -239,7 +242,7 @@ public class GitServiceClientImpl implements GitServiceClient { getWsAgentBaseUrl() + BRANCH + "?projectPath=" - + project + + encodePath(project) + (listMode == null ? "" : "&listMode=" + listMode); return asyncRequestFactory .createGetRequest(url) @@ -248,7 +251,7 @@ public class GitServiceClientImpl implements GitServiceClient { @Override public Promise getStatus(Path project, List filter) { - StringBuilder params = new StringBuilder("?projectPath=" + project); + StringBuilder params = new StringBuilder("?projectPath=" + encodePath(project)); if (filter != null) { for (String path : filter) { if (!path.isEmpty()) { @@ -271,7 +274,7 @@ public class GitServiceClientImpl implements GitServiceClient { getWsAgentBaseUrl() + BRANCH + "?projectPath=" - + project + + encodePath(project) + "&name=" + name + "&force=" @@ -281,7 +284,8 @@ public class GitServiceClientImpl implements GitServiceClient { @Override public Promise branchRename(Path project, String oldName, String newName) { - String params = "?projectPath=" + project + "&oldName=" + oldName + "&newName=" + newName; + String params = + "?projectPath=" + encodePath(project) + "&oldName=" + oldName + "&newName=" + newName; String url = getWsAgentBaseUrl() + BRANCH + params; return asyncRequestFactory .createPostRequest(url, null) @@ -294,7 +298,7 @@ public class GitServiceClientImpl implements GitServiceClient { public Promise branchCreate(Path project, String name, String startPoint) { BranchCreateRequest branchCreateRequest = dtoFactory.createDto(BranchCreateRequest.class).withName(name).withStartPoint(startPoint); - String url = getWsAgentBaseUrl() + BRANCH + "?projectPath=" + project; + String url = getWsAgentBaseUrl() + BRANCH + "?projectPath=" + encodePath(project); return asyncRequestFactory .createPostRequest(url, branchCreateRequest) .loader(loader) @@ -304,7 +308,7 @@ public class GitServiceClientImpl implements GitServiceClient { @Override public Promise checkout(Path project, CheckoutRequest request) { - String url = getWsAgentBaseUrl() + CHECKOUT + "?projectPath=" + project; + String url = getWsAgentBaseUrl() + CHECKOUT + "?projectPath=" + encodePath(project); return asyncRequestFactory .createPostRequest(url, request) .loader(loader) @@ -313,7 +317,7 @@ public class GitServiceClientImpl implements GitServiceClient { @Override public Promise remove(Path project, Path[] items, boolean cached) { - String params = "?projectPath=" + project; + String params = "?projectPath=" + encodePath(project); if (items != null) { for (Path item : items) { params += "&items=" + item.toString(); @@ -335,7 +339,7 @@ public class GitServiceClientImpl implements GitServiceClient { resetRequest.setFilePattern( stream(files).map(file -> file.isEmpty() ? "." : file.toString()).collect(toList())); } - String url = getWsAgentBaseUrl() + RESET + "?projectPath=" + project; + String url = getWsAgentBaseUrl() + RESET + "?projectPath=" + encodePath(project); return asyncRequestFactory.createPostRequest(url, resetRequest).loader(loader).send(); } @@ -345,7 +349,7 @@ public class GitServiceClientImpl implements GitServiceClient { StringBuilder params = new StringBuilder() .append("?projectPath=") - .append(project) + .append(encodePath(project)) .append("&skip=") .append(skip) .append("&maxCount=") @@ -370,13 +374,13 @@ public class GitServiceClientImpl implements GitServiceClient { public Promise remoteAdd(Path project, String name, String url) { RemoteAddRequest remoteAddRequest = dtoFactory.createDto(RemoteAddRequest.class).withName(name).withUrl(url); - String requestUrl = getWsAgentBaseUrl() + REMOTE + "?projectPath=" + project; + String requestUrl = getWsAgentBaseUrl() + REMOTE + "?projectPath=" + encodePath(project); return asyncRequestFactory.createPutRequest(requestUrl, remoteAddRequest).loader(loader).send(); } @Override public Promise remoteDelete(Path project, String name) { - String url = getWsAgentBaseUrl() + REMOTE + '/' + name + "?projectPath=" + project; + String url = getWsAgentBaseUrl() + REMOTE + '/' + name + "?projectPath=" + encodePath(project); return asyncRequestFactory.createDeleteRequest(url).loader(loader).send(); } @@ -389,7 +393,7 @@ public class GitServiceClientImpl implements GitServiceClient { .withRefSpec(refspec) .withRemote(remote) .withRemoveDeletedRefs(removeDeletedRefs); - String url = getWsAgentBaseUrl() + FETCH + "?projectPath=" + project; + String url = getWsAgentBaseUrl() + FETCH + "?projectPath=" + encodePath(project); return asyncRequestFactory.createPostRequest(url, fetchRequest).send(); } @@ -401,7 +405,7 @@ public class GitServiceClientImpl implements GitServiceClient { .withRemote(remote) .withRefSpec(refSpec) .withRebase(rebase); - String url = getWsAgentBaseUrl() + PULL + "?projectPath=" + project; + String url = getWsAgentBaseUrl() + PULL + "?projectPath=" + encodePath(project); return asyncRequestFactory .createPostRequest(url, pullRequest) .send(dtoUnmarshallerFactory.newUnmarshaller(PullResponse.class)); @@ -445,7 +449,7 @@ public class GitServiceClientImpl implements GitServiceClient { StringBuilder params = new StringBuilder() .append("?projectPath=") - .append(project) + .append(encodePath(project)) .append("&noRenames=") .append(noRenames) .append("&renameLimit=") @@ -456,7 +460,7 @@ public class GitServiceClientImpl implements GitServiceClient { fileFilter .stream() .filter(file -> !file.isEmpty()) - .forEach(file -> params.append("&fileFilter=").append(file)); + .forEach(file -> params.append("&fileFilter=").append(encodePath(valueOf(file)))); } if (type != null) { params.append("&diffType=").append(type); @@ -473,7 +477,8 @@ public class GitServiceClientImpl implements GitServiceClient { @Override public Promise showFileContent(Path project, Path file, String version) { - String params = "?projectPath=" + project + "&file=" + file + "&version=" + version; + String params = + "?projectPath=" + encodePath(project) + "&file=" + encodePath(file) + "&version=" + version; String url = getWsAgentBaseUrl() + SHOW + params; return asyncRequestFactory .createGetRequest(url) @@ -484,7 +489,7 @@ public class GitServiceClientImpl implements GitServiceClient { @Override public Promise merge(Path project, String commit) { MergeRequest mergeRequest = dtoFactory.createDto(MergeRequest.class).withCommit(commit); - String url = getWsAgentBaseUrl() + MERGE + "?projectPath=" + project; + String url = getWsAgentBaseUrl() + MERGE + "?projectPath=" + encodePath(project); return asyncRequestFactory .createPostRequest(url, mergeRequest) .loader(loader) @@ -494,7 +499,7 @@ public class GitServiceClientImpl implements GitServiceClient { @Override public Promise deleteRepository(Path project) { - String url = getWsAgentBaseUrl() + REPOSITORY + "?projectPath=" + project; + String url = getWsAgentBaseUrl() + REPOSITORY + "?projectPath=" + encodePath(project); return asyncRequestFactory.createDeleteRequest(url).loader(loader).send(); } diff --git a/ide/che-core-ide-api/src/main/java/org/eclipse/che/ide/api/project/ProjectServiceClientImpl.java b/ide/che-core-ide-api/src/main/java/org/eclipse/che/ide/api/project/ProjectServiceClientImpl.java index b6a26d983c..0eaa78c8d2 100644 --- a/ide/che-core-ide-api/src/main/java/org/eclipse/che/ide/api/project/ProjectServiceClientImpl.java +++ b/ide/che-core-ide-api/src/main/java/org/eclipse/che/ide/api/project/ProjectServiceClientImpl.java @@ -13,10 +13,11 @@ package org.eclipse.che.ide.api.project; import static com.google.common.base.Strings.isNullOrEmpty; import static com.google.gwt.http.client.RequestBuilder.DELETE; import static com.google.gwt.http.client.RequestBuilder.PUT; -import static com.google.gwt.safehtml.shared.UriUtils.encodeAllowEscapes; +import static com.google.gwt.http.client.URL.encodePathSegment; import static org.eclipse.che.ide.MimeType.APPLICATION_JSON; import static org.eclipse.che.ide.rest.HTTPHeader.ACCEPT; import static org.eclipse.che.ide.rest.HTTPHeader.CONTENT_TYPE; +import static org.eclipse.che.ide.util.PathEncoder.encodePath; import com.google.inject.Inject; import java.util.Collections; @@ -36,7 +37,6 @@ import org.eclipse.che.api.workspace.shared.dto.ProjectConfigDto; import org.eclipse.che.api.workspace.shared.dto.SourceStorageDto; import org.eclipse.che.ide.MimeType; import org.eclipse.che.ide.api.app.AppContext; -import org.eclipse.che.ide.api.machine.WsAgentStateController; import org.eclipse.che.ide.api.resources.SearchResult; import org.eclipse.che.ide.dto.DtoFactory; import org.eclipse.che.ide.resource.Path; @@ -73,7 +73,6 @@ public class ProjectServiceClientImpl implements ProjectServiceClient { private static final String RESOLVE = "/resolve"; private static final String ESTIMATE = "/estimate"; - private final WsAgentStateController wsAgentStateController; private final LoaderFactory loaderFactory; private final AsyncRequestFactory reqFactory; private final DtoFactory dtoFactory; @@ -82,13 +81,11 @@ public class ProjectServiceClientImpl implements ProjectServiceClient { @Inject protected ProjectServiceClientImpl( - WsAgentStateController wsAgentStateController, LoaderFactory loaderFactory, AsyncRequestFactory reqFactory, DtoFactory dtoFactory, DtoUnmarshallerFactory unmarshaller, AppContext appContext) { - this.wsAgentStateController = wsAgentStateController; this.loaderFactory = loaderFactory; this.reqFactory = reqFactory; this.dtoFactory = dtoFactory; @@ -110,8 +107,7 @@ public class ProjectServiceClientImpl implements ProjectServiceClient { /** {@inheritDoc} */ @Override public Promise estimate(Path path, String pType) { - final String url = - encodeAllowEscapes(getBaseUrl() + ESTIMATE + path(path.toString()) + "?type=" + pType); + final String url = getBaseUrl() + ESTIMATE + encodePath(path) + "?type=" + pType; return reqFactory .createGetRequest(url) @@ -123,7 +119,7 @@ public class ProjectServiceClientImpl implements ProjectServiceClient { /** {@inheritDoc} */ @Override public Promise> resolveSources(Path path) { - final String url = encodeAllowEscapes(getBaseUrl() + RESOLVE + path(path.toString())); + final String url = getBaseUrl() + RESOLVE + encodePath(path); return reqFactory .createGetRequest(url) @@ -135,7 +131,7 @@ public class ProjectServiceClientImpl implements ProjectServiceClient { /** {@inheritDoc} */ @Override public Promise importProject(Path path, SourceStorageDto source) { - String url = encodeAllowEscapes(getBaseUrl() + IMPORT + path(path.toString())); + String url = getBaseUrl() + IMPORT + encodePath(path); return reqFactory.createPostRequest(url, source).header(CONTENT_TYPE, APPLICATION_JSON).send(); } @@ -143,11 +139,8 @@ public class ProjectServiceClientImpl implements ProjectServiceClient { /** {@inheritDoc} */ @Override public Promise> search(QueryExpression expression) { - final String url = - encodeAllowEscapes( - getBaseUrl() - + SEARCH - + (isNullOrEmpty(expression.getPath()) ? Path.ROOT : path(expression.getPath()))); + Path prjPath = isNullOrEmpty(expression.getPath()) ? Path.ROOT : new Path(expression.getPath()); + final String url = getBaseUrl() + SEARCH + encodePath(prjPath.addLeadingSeparator()); StringBuilder queryParameters = new StringBuilder(); if (expression.getName() != null && !expression.getName().isEmpty()) { @@ -201,7 +194,7 @@ public class ProjectServiceClientImpl implements ProjectServiceClient { @Override public Promise> createBatchProjects( List configurations) { - final String url = encodeAllowEscapes(getBaseUrl() + BATCH_PROJECTS); + final String url = getBaseUrl() + BATCH_PROJECTS; final String loaderMessage = configurations.size() > 1 ? "Creating the batch of projects..." : "Creating project..."; return reqFactory @@ -215,8 +208,11 @@ public class ProjectServiceClientImpl implements ProjectServiceClient { @Override public Promise createFile(Path path, String content) { final String url = - encodeAllowEscapes( - getBaseUrl() + FILE + path(path.parent().toString()) + "?name=" + path.lastSegment()); + getBaseUrl() + + FILE + + encodePath(path.parent()) + + "?name=" + + encodePathSegment(path.lastSegment()); return reqFactory .createPostRequest(url, null) @@ -228,7 +224,7 @@ public class ProjectServiceClientImpl implements ProjectServiceClient { /** {@inheritDoc} */ @Override public Promise getFileContent(Path path) { - final String url = encodeAllowEscapes(getBaseUrl() + FILE + path(path.toString())); + final String url = getBaseUrl() + FILE + encodePath(path); return reqFactory.createGetRequest(url).send(new StringUnmarshaller()); } @@ -236,7 +232,7 @@ public class ProjectServiceClientImpl implements ProjectServiceClient { /** {@inheritDoc} */ @Override public Promise setFileContent(Path path, String content) { - final String url = encodeAllowEscapes(getBaseUrl() + FILE + path(path.toString())); + final String url = getBaseUrl() + FILE + encodePath(path); return reqFactory.createRequest(PUT, url, null, false).data(content).send(); } @@ -244,7 +240,7 @@ public class ProjectServiceClientImpl implements ProjectServiceClient { /** {@inheritDoc} */ @Override public Promise createFolder(Path path) { - final String url = encodeAllowEscapes(getBaseUrl() + FOLDER + path(path.toString())); + final String url = getBaseUrl() + FOLDER + encodePath(path); return reqFactory .createPostRequest(url, null) @@ -255,20 +251,18 @@ public class ProjectServiceClientImpl implements ProjectServiceClient { /** {@inheritDoc} */ @Override public Promise deleteItem(Path path) { - final String url = encodeAllowEscapes(getBaseUrl() + path(path.toString())); + final String url = getBaseUrl() + encodePath(path); return reqFactory .createRequest(DELETE, url, null, false) - .loader(loaderFactory.newLoader("Deleting project...")) + .loader(loaderFactory.newLoader("Deleting resource...")) .send(); } /** {@inheritDoc} */ @Override public Promise copy(Path source, Path target, String newName, boolean overwrite) { - final String url = - encodeAllowEscapes( - getBaseUrl() + COPY + path(source.toString()) + "?to=" + target.toString()); + final String url = getBaseUrl() + COPY + encodePath(source) + "?to=" + encodePath(target); final CopyOptions copyOptions = dtoFactory.createDto(CopyOptions.class); copyOptions.setName(newName); @@ -283,9 +277,7 @@ public class ProjectServiceClientImpl implements ProjectServiceClient { /** {@inheritDoc} */ @Override public Promise move(Path source, Path target, String newName, boolean overwrite) { - final String url = - encodeAllowEscapes( - getBaseUrl() + MOVE + path(source.toString()) + "?to=" + target.toString()); + final String url = getBaseUrl() + MOVE + encodePath(source) + "?to=" + encodePath(target); final MoveOptions moveOptions = dtoFactory.createDto(MoveOptions.class); moveOptions.setName(newName); @@ -301,14 +293,13 @@ public class ProjectServiceClientImpl implements ProjectServiceClient { @Override public Promise getTree(Path path, int depth, boolean includeFiles) { final String url = - encodeAllowEscapes( - getBaseUrl() - + TREE - + path(path.toString()) - + "?depth=" - + depth - + "&includeFiles=" - + includeFiles); + getBaseUrl() + + TREE + + encodePath(path.addLeadingSeparator()) + + "?depth=" + + depth + + "&includeFiles=" + + includeFiles; // temporary workaround for CHE-3467, remove loader for disable UI blocking // later this loader should be added with the new mechanism of client-server synchronization @@ -322,7 +313,7 @@ public class ProjectServiceClientImpl implements ProjectServiceClient { /** {@inheritDoc} */ @Override public Promise getItem(Path path) { - final String url = encodeAllowEscapes(getBaseUrl() + ITEM + path(path.toString())); + final String url = getBaseUrl() + ITEM + encodePath(path); return reqFactory .createGetRequest(url) @@ -334,7 +325,7 @@ public class ProjectServiceClientImpl implements ProjectServiceClient { /** {@inheritDoc} */ @Override public Promise getProject(Path path) { - final String url = encodeAllowEscapes(getBaseUrl() + path(path.toString())); + final String url = getBaseUrl() + encodePath(path); return reqFactory .createGetRequest(url) @@ -346,7 +337,8 @@ public class ProjectServiceClientImpl implements ProjectServiceClient { /** {@inheritDoc} */ @Override public Promise updateProject(ProjectConfigDto configuration) { - final String url = encodeAllowEscapes(getBaseUrl() + path(configuration.getPath())); + Path prjPath = new Path(configuration.getPath()); + final String url = getBaseUrl() + encodePath(prjPath.addLeadingSeparator()); return reqFactory .createRequest(PUT, url, configuration, false) @@ -366,23 +358,4 @@ public class ProjectServiceClientImpl implements ProjectServiceClient { private String getBaseUrl() { return appContext.getDevMachine().getWsAgentBaseUrl() + PROJECT; } - - /** - * Normalizes the path by adding a leading '/' if it doesn't exist. Also escapes some special - * characters. - * - *

See following javascript functions for details: escape() will not encode: @ * / + - * encodeURI() will not encode: ~ ! @ # $ & * ( ) = : / , ; ? + ' encodeURIComponent() will not - * encode: ~ ! * ( ) ' - * - * @param path path to normalize - * @return normalized path - */ - private String path(String path) { - while (path.indexOf('+') >= 0) { - path = path.replace("+", "%2B"); - } - - return path.startsWith("/") ? path : '/' + path; - } } diff --git a/ide/che-core-ide-api/src/test/java/org/eclipse/che/ide/api/project/ProjectServiceClientImplTest.java b/ide/che-core-ide-api/src/test/java/org/eclipse/che/ide/api/project/ProjectServiceClientImplTest.java index c0e724e63b..74017cbc81 100644 --- a/ide/che-core-ide-api/src/test/java/org/eclipse/che/ide/api/project/ProjectServiceClientImplTest.java +++ b/ide/che-core-ide-api/src/test/java/org/eclipse/che/ide/api/project/ProjectServiceClientImplTest.java @@ -10,71 +10,367 @@ */ package org.eclipse.che.ide.api.project; +import static com.google.gwt.http.client.RequestBuilder.DELETE; +import static com.google.gwt.http.client.RequestBuilder.PUT; +import static java.util.Collections.singletonList; +import static junit.framework.TestCase.assertEquals; +import static org.eclipse.che.ide.MimeType.APPLICATION_JSON; +import static org.eclipse.che.ide.rest.HTTPHeader.ACCEPT; +import static org.eclipse.che.ide.rest.HTTPHeader.CONTENT_TYPE; import static org.mockito.Matchers.any; +import static org.mockito.Matchers.anyBoolean; import static org.mockito.Matchers.anyString; +import static org.mockito.Matchers.eq; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.never; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; +import com.google.gwt.http.client.RequestBuilder; +import com.google.gwtmockito.GwtMockitoTestRunner; +import java.util.Arrays; +import java.util.List; +import org.eclipse.che.api.core.model.project.ProjectConfig; +import org.eclipse.che.api.project.shared.dto.CopyOptions; +import org.eclipse.che.api.project.shared.dto.ItemReference; +import org.eclipse.che.api.project.shared.dto.MoveOptions; +import org.eclipse.che.api.project.shared.dto.SearchResultDto; +import org.eclipse.che.api.project.shared.dto.SourceEstimation; +import org.eclipse.che.api.project.shared.dto.TreeElement; +import org.eclipse.che.api.promises.client.Promise; +import org.eclipse.che.api.workspace.shared.dto.NewProjectConfigDto; +import org.eclipse.che.api.workspace.shared.dto.ProjectConfigDto; +import org.eclipse.che.api.workspace.shared.dto.SourceStorageDto; +import org.eclipse.che.ide.MimeType; import org.eclipse.che.ide.api.app.AppContext; import org.eclipse.che.ide.api.machine.DevMachine; -import org.eclipse.che.ide.api.machine.WsAgentStateController; import org.eclipse.che.ide.dto.DtoFactory; import org.eclipse.che.ide.resource.Path; import org.eclipse.che.ide.rest.AsyncRequest; import org.eclipse.che.ide.rest.AsyncRequestFactory; import org.eclipse.che.ide.rest.AsyncRequestLoader; import org.eclipse.che.ide.rest.DtoUnmarshallerFactory; +import org.eclipse.che.ide.rest.StringUnmarshaller; +import org.eclipse.che.ide.rest.Unmarshallable; import org.eclipse.che.ide.ui.loaders.request.LoaderFactory; +import org.eclipse.che.ide.ui.loaders.request.MessageLoader; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; +import org.mockito.ArgumentCaptor; +import org.mockito.Captor; import org.mockito.Mock; -import org.mockito.runners.MockitoJUnitRunner; /** * Unit test for {@link ProjectServiceClientImpl}. * * @author Vlad Zhukovskyi + * @author Oleksander Andriienko */ -@RunWith(MockitoJUnitRunner.class) +@RunWith(GwtMockitoTestRunner.class) public class ProjectServiceClientImplTest { - @Mock private WsAgentStateController wsAgentStateController; - @Mock private LoaderFactory loaderFactory; - @Mock private AsyncRequestFactory asyncRequestFactory; - @Mock private DtoFactory dtoFactory; - @Mock private DtoUnmarshallerFactory dtoUnmarshallerFactory; - @Mock private AppContext appContext; + private static final String TEXT = "to be or not to be."; + private static final Path resourcePath = + Path.valueOf("TestPrj/http%253A%252F%252F.org%252Fte st "); + private static final Path targetPath = Path.valueOf("TestPrj/target here* "); - private ProjectServiceClientImpl projectServiceClient; + @Mock private LoaderFactory loaderFactory; + @Mock private AsyncRequestFactory requestFactory; + @Mock private DtoFactory dtoFactory; + @Mock private DtoUnmarshallerFactory unmarshaller; + @Mock private AppContext appContext; + @Mock private AsyncRequest asyncRequest; + + @Mock private Unmarshallable unmarshallableItemRef; + @Mock private Unmarshallable> unmarshallablePrjsConf; + @Mock private Unmarshallable unmarshallablePrjConf; + @Mock private Unmarshallable> unmarshallableSearch; + @Mock private Promise> searchPromise; + @Mock private Unmarshallable> unmarshallbleSourcesEstimation; + @Mock private Unmarshallable unmarshallbleSourceEstimation; + @Mock private Unmarshallable unmarshallableTreeElem; + + @Mock private Promise itemRefPromise; + @Mock private MessageLoader messageLoader; + + @Mock private NewProjectConfigDto prjConfig1; + @Mock private NewProjectConfigDto prjConfig2; + @Mock private SourceStorageDto source; + + @Captor private ArgumentCaptor> prjsArgCaptor; + + private ProjectServiceClientImpl client; @Before public void setUp() throws Exception { - projectServiceClient = + client = new ProjectServiceClientImpl( - wsAgentStateController, - loaderFactory, - asyncRequestFactory, - dtoFactory, - dtoUnmarshallerFactory, - appContext); + loaderFactory, requestFactory, dtoFactory, unmarshaller, appContext); DevMachine devMachine = mock(DevMachine.class); - when(devMachine.getWsAgentBaseUrl()).thenReturn(""); + when(devMachine.getWsAgentBaseUrl()).thenReturn("http://127.0.0.3/api"); when(appContext.getDevMachine()).thenReturn(devMachine); + when(loaderFactory.newLoader(any())).thenReturn(messageLoader); + when(asyncRequest.loader(messageLoader)).thenReturn(asyncRequest); + when(asyncRequest.data(any())).thenReturn(asyncRequest); + when(asyncRequest.send(unmarshallableItemRef)).thenReturn(itemRefPromise); + when(asyncRequest.header(any(), any())).thenReturn(asyncRequest); + when(unmarshaller.newUnmarshaller(ItemReference.class)).thenReturn(unmarshallableItemRef); + when(unmarshaller.newListUnmarshaller(ProjectConfigDto.class)) + .thenReturn(unmarshallablePrjsConf); + when(unmarshaller.newListUnmarshaller(SourceEstimation.class)) + .thenReturn(unmarshallbleSourcesEstimation); + when(unmarshaller.newUnmarshaller(SourceEstimation.class)) + .thenReturn(unmarshallbleSourceEstimation); + when(unmarshaller.newListUnmarshaller(SearchResultDto.class)).thenReturn(unmarshallableSearch); + when(unmarshaller.newUnmarshaller(TreeElement.class)).thenReturn(unmarshallableTreeElem); + when(unmarshaller.newUnmarshaller(ProjectConfigDto.class)).thenReturn(unmarshallablePrjConf); + + when(requestFactory.createGetRequest(anyString())).thenReturn(asyncRequest); + when(requestFactory.createPostRequest(anyString(), any(MimeType.class))) + .thenReturn(asyncRequest); + when(requestFactory.createRequest( + any(RequestBuilder.Method.class), anyString(), any(), anyBoolean())) + .thenReturn(asyncRequest); + when(requestFactory.createPostRequest(anyString(), any())).thenReturn(asyncRequest); } @Test public void testShouldNotSetupLoaderForTheGetTreeMethod() throws Exception { - AsyncRequest asyncRequest = mock(AsyncRequest.class); - - when(asyncRequestFactory.createGetRequest(anyString())).thenReturn(asyncRequest); when(asyncRequest.header(anyString(), anyString())).thenReturn(asyncRequest); - projectServiceClient.getTree(Path.EMPTY, 1, true); + client.getTree(Path.EMPTY, 1, true); verify(asyncRequest, never()).loader(any(AsyncRequestLoader.class)); //see CHE-3467 } + + @Test + public void shouldReturnListProjects() { + client.getProjects(); + + verify(requestFactory).createGetRequest(any()); + verify(asyncRequest).header(ACCEPT, MimeType.APPLICATION_JSON); + verify(unmarshaller).newListUnmarshaller(ProjectConfigDto.class); + verify(asyncRequest).send(unmarshallablePrjsConf); + } + + @Test + public void shouldEncodeUrlAndEstimateProject() { + String prjType = "java"; + + client.estimate(resourcePath, prjType); + + verify(requestFactory).createGetRequest(any()); + verify(asyncRequest).header(ACCEPT, MimeType.APPLICATION_JSON); + verify(loaderFactory).newLoader("Estimating project..."); + verify(asyncRequest).loader(messageLoader); + verify(asyncRequest).send(unmarshallbleSourceEstimation); + } + + @Test + public void shouldEncodeUrlAndResolveProjectSources() { + client.resolveSources(resourcePath); + + verify(requestFactory).createGetRequest(any()); + verify(asyncRequest).header(ACCEPT, MimeType.APPLICATION_JSON); + verify(loaderFactory).newLoader("Resolving sources..."); + verify(asyncRequest).loader(messageLoader); + verify(unmarshaller).newListUnmarshaller(SourceEstimation.class); + verify(asyncRequest).send(unmarshallbleSourcesEstimation); + } + + @Test + public void shouldEncodeUrlAndImportProject() { + client.importProject(resourcePath, source); + + verify(requestFactory).createPostRequest(any(), eq(source)); + verify(asyncRequest).header(CONTENT_TYPE, APPLICATION_JSON); + verify(asyncRequest).send(); + } + + @Test + public void shouldEncodeUrlAndSearchResourceReferences() { + QueryExpression expression = new QueryExpression(); + expression.setName(TEXT); + expression.setText(TEXT); + expression.setPath(resourcePath.toString()); + expression.setMaxItems(100); + expression.setSkipCount(10); + when(asyncRequest.send(unmarshallableSearch)).thenReturn(searchPromise); + + client.search(expression); + + verify(requestFactory).createGetRequest(any()); + verify(asyncRequest).header(ACCEPT, MimeType.APPLICATION_JSON); + verify(loaderFactory).newLoader("Searching..."); + verify(asyncRequest).loader(messageLoader); + verify(unmarshaller).newListUnmarshaller(SearchResultDto.class); + verify(asyncRequest).send(unmarshallableSearch); + } + + @Test + public void shouldCreateOneProjectByBatch() { + List configs = singletonList(prjConfig1); + + client.createBatchProjects(configs); + + verify(requestFactory).createPostRequest(anyString(), prjsArgCaptor.capture()); + verify(asyncRequest).header(ACCEPT, MimeType.APPLICATION_JSON); + verify(loaderFactory).newLoader("Creating project..."); + verify(asyncRequest).loader(messageLoader); + verify(asyncRequest).send(unmarshallablePrjsConf); + verify(unmarshaller).newListUnmarshaller(ProjectConfigDto.class); + + assertEquals(1, prjsArgCaptor.getValue().size()); + } + + @Test + public void shouldCreateFewProjectByBatch() { + List configs = Arrays.asList(prjConfig1, prjConfig2); + + client.createBatchProjects(configs); + + verify(requestFactory).createPostRequest(anyString(), prjsArgCaptor.capture()); + verify(asyncRequest).header(ACCEPT, MimeType.APPLICATION_JSON); + verify(loaderFactory).newLoader("Creating the batch of projects..."); + verify(asyncRequest).loader(messageLoader); + verify(asyncRequest).send(unmarshallablePrjsConf); + verify(unmarshaller).newListUnmarshaller(ProjectConfigDto.class); + + assertEquals(2, prjsArgCaptor.getValue().size()); + } + + @Test + public void shouldEncodeUrlAndCreateFile() { + client.createFile(resourcePath, TEXT); + + verify(requestFactory).createPostRequest(any(), any()); + verify(asyncRequest).data(TEXT); + verify(loaderFactory).newLoader("Creating file..."); + verify(asyncRequest).loader(messageLoader); + verify(asyncRequest).send(unmarshallableItemRef); + } + + @Test + public void shouldEncodeUrlAndGetFileContent() { + client.getFileContent(resourcePath); + + verify(requestFactory).createGetRequest(any()); + verify(asyncRequest).send(any(StringUnmarshaller.class)); + } + + @Test + public void shouldEncodeUrlAndSetFileContent() { + client.setFileContent(resourcePath, TEXT); + + verify(requestFactory).createRequest(eq(PUT), any(), any(), eq(false)); + verify(asyncRequest).data(TEXT); + verify(asyncRequest).send(); + } + + @Test + public void shouldEncodeUrlAndCreateFolder() { + client.createFolder(resourcePath); + + verify(requestFactory).createPostRequest(any(), any()); + verify(loaderFactory).newLoader("Creating folder..."); + verify(asyncRequest).loader(messageLoader); + verify(unmarshaller).newUnmarshaller(ItemReference.class); + verify(asyncRequest).send(unmarshallableItemRef); + } + + @Test + public void shouldEncodeUrlAndDeleteFolder() { + client.deleteItem(resourcePath); + + verify(requestFactory).createRequest(eq(DELETE), any(), any(), eq(false)); + verify(loaderFactory).newLoader("Deleting resource..."); + verify(asyncRequest).loader(messageLoader); + verify(asyncRequest).send(); + } + + @Test + public void shouldEncodeUrlAndCopyResource() { + CopyOptions copyOptions = mock(CopyOptions.class); + when(dtoFactory.createDto(CopyOptions.class)).thenReturn(copyOptions); + + client.copy(resourcePath, targetPath, TEXT, true); + + verify(dtoFactory).createDto(CopyOptions.class); + verify(copyOptions).setName(any()); + verify(copyOptions).setOverWrite(true); + + verify(requestFactory).createPostRequest(any(), eq(copyOptions)); + verify(loaderFactory).newLoader("Copying..."); + verify(asyncRequest).loader(messageLoader); + verify(asyncRequest).send(); + } + + @Test + public void shouldEncodeUrlAndMoveResource() { + MoveOptions moveOptions = mock(MoveOptions.class); + when(dtoFactory.createDto(MoveOptions.class)).thenReturn(moveOptions); + + client.move(resourcePath, targetPath, TEXT, true); + + verify(dtoFactory).createDto(MoveOptions.class); + verify(moveOptions).setName(any()); + verify(moveOptions).setOverWrite(true); + verify(requestFactory).createPostRequest(any(), eq(moveOptions)); + verify(loaderFactory).newLoader("Moving..."); + verify(asyncRequest).loader(messageLoader); + verify(asyncRequest).send(); + } + + @Test + public void shouldEncodeUrlAndGetTree() { + client.getTree(resourcePath, 2, true); + + verify(requestFactory).createGetRequest(any()); + verify(asyncRequest).header(ACCEPT, MimeType.APPLICATION_JSON); + verify(unmarshaller).newUnmarshaller(TreeElement.class); + verify(asyncRequest).send(unmarshallableTreeElem); + } + + @Test + public void shouldEncodeUrlAndGetItem() { + client.getItem(resourcePath); + + verify(requestFactory).createGetRequest(any()); + verify(asyncRequest).header(ACCEPT, MimeType.APPLICATION_JSON); + verify(loaderFactory).newLoader("Getting item..."); + verify(unmarshaller).newUnmarshaller(ItemReference.class); + verify(asyncRequest).send(unmarshallableItemRef); + } + + @Test + public void shouldEncodeUrlAndGetProject() { + client.getProject(Path.valueOf(TEXT)); + + verify(requestFactory).createGetRequest(any()); + verify(asyncRequest).header(ACCEPT, MimeType.APPLICATION_JSON); + verify(loaderFactory).newLoader("Getting project..."); + verify(asyncRequest).loader(messageLoader); + verify(unmarshaller).newUnmarshaller(ProjectConfigDto.class); + verify(asyncRequest).send(unmarshallablePrjConf); + } + + @Test + public void shouldEncodeUrlAndUpdateProject() { + when(requestFactory.createRequest( + any(RequestBuilder.Method.class), anyString(), any(ProjectConfig.class), anyBoolean())) + .thenReturn(asyncRequest); + when(prjConfig1.getPath()).thenReturn(TEXT); + + client.updateProject(prjConfig1); + + verify(requestFactory).createRequest(eq(PUT), anyString(), eq(prjConfig1), eq(false)); + verify(asyncRequest).header(CONTENT_TYPE, MimeType.APPLICATION_JSON); + verify(asyncRequest).header(ACCEPT, MimeType.APPLICATION_JSON); + verify(loaderFactory).newLoader("Updating project..."); + verify(asyncRequest).loader(messageLoader); + verify(unmarshaller).newUnmarshaller(ProjectConfigDto.class); + verify(asyncRequest).send(unmarshallablePrjConf); + } } diff --git a/ide/commons-gwt/src/main/java/org/eclipse/che/ide/resource/Path.java b/ide/commons-gwt/src/main/java/org/eclipse/che/ide/resource/Path.java index ab4361103d..f9c0181d7b 100644 --- a/ide/commons-gwt/src/main/java/org/eclipse/che/ide/resource/Path.java +++ b/ide/commons-gwt/src/main/java/org/eclipse/che/ide/resource/Path.java @@ -186,6 +186,24 @@ public final class Path { return new Path(device, segments, separators | HAS_TRAILING); } + /** + * Returns a path with the same segments as this path but with a leading separator added. + * + *

If this path already has a leading separator, this path is returned. + * + * @return the new path + * @see #hasTrailingSeparator() + */ + public Path addLeadingSeparator() { + if (hasLeadingSeparator() || isRoot()) { + return this; + } + if (isEmpty()) { + return new Path(device, segments, HAS_LEADING); + } + return new Path(device, segments, separators | HAS_LEADING); + } + /** * Returns the canonicalized path obtained from the concatenation of the given path's segments to * the end of this path. If the given path has a trailing separator, the result will have a @@ -536,6 +554,20 @@ public final class Path { return (separators & HAS_TRAILING) != 0; } + /** + * Returns whether this path has a leading separator. + * + *

Note: In the root path ("/"), the separator is considered to be leading rather than + * trailing. + * + * @return true if this path has a leading separator, and false + * otherwise + * @see #addLeadingSeparator() + */ + public boolean hasLeadingSeparator() { + return (separators & HAS_LEADING) != 0; + } + /* * Initialize the current path with the given string. */ diff --git a/ide/commons-gwt/src/main/java/org/eclipse/che/ide/util/PathEncoder.java b/ide/commons-gwt/src/main/java/org/eclipse/che/ide/util/PathEncoder.java new file mode 100644 index 0000000000..015d985a7a --- /dev/null +++ b/ide/commons-gwt/src/main/java/org/eclipse/che/ide/util/PathEncoder.java @@ -0,0 +1,47 @@ +/* + * Copyright (c) 2012-2017 Red Hat, Inc. + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Eclipse Public License v1.0 + * which accompanies this distribution, and is available at + * http://www.eclipse.org/legal/epl-v10.html + * + * Contributors: + * Red Hat, Inc. - initial API and implementation + */ +package org.eclipse.che.ide.util; + +import static com.google.gwt.http.client.URL.encodePathSegment; +import static org.eclipse.che.ide.resource.Path.SEPARATOR; + +import org.eclipse.che.ide.resource.Path; + +/** + * @author Alexander Andrienko + * @author Mykola Morhun + */ +public class PathEncoder { + + private PathEncoder() {} + + /** Returns path encoded by segments without device. */ + public static String encodePath(Path path) { + StringBuilder encodedPath = new StringBuilder(); + + if (path.hasLeadingSeparator()) { + encodedPath.append(SEPARATOR); + } + + String segment; + for (int i = 0; i < path.segmentCount(); i++) { + segment = path.segment(i); + encodedPath.append(encodePathSegment(segment)); + encodedPath.append(SEPARATOR); + } + + if (!path.isEmpty() && !path.isRoot() && !path.hasTrailingSeparator()) { + encodedPath.deleteCharAt(encodedPath.length() - 1); + } + + return encodedPath.toString(); + } +} diff --git a/ide/commons-gwt/src/test/java/org/eclipse/che/ide/resource/PathTest.java b/ide/commons-gwt/src/test/java/org/eclipse/che/ide/resource/PathTest.java index fa4af68b32..1865edd88e 100644 --- a/ide/commons-gwt/src/test/java/org/eclipse/che/ide/resource/PathTest.java +++ b/ide/commons-gwt/src/test/java/org/eclipse/che/ide/resource/PathTest.java @@ -12,6 +12,7 @@ package org.eclipse.che.ide.resource; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; +import static org.junit.Assert.assertNotEquals; import static org.junit.Assert.assertNotNull; import static org.junit.Assert.assertNotSame; import static org.junit.Assert.assertNull; @@ -327,4 +328,72 @@ public class PathTest { assertEquals(result, common); } + + @Test + public void testShouldCheckExistenceOfLeadingSeparator() { + assertTrue(Path.valueOf("/foo").hasLeadingSeparator()); + assertFalse(Path.valueOf("foo").hasLeadingSeparator()); + assertTrue(Path.valueOf("/").hasLeadingSeparator()); + assertFalse(Path.valueOf("").hasLeadingSeparator()); + } + + @Test + public void shouldReturnNewPathWithAddedLeadingSeparatorIfPathHasNotIt() { + final Path path = Path.valueOf("Test/src/main/java"); + + final Path pathWithSeparator = path.addLeadingSeparator(); + + assertNotEquals(path, pathWithSeparator); + + assertFalse(path.hasLeadingSeparator()); + assertTrue(pathWithSeparator.hasLeadingSeparator()); + + assertTrue(path.toString().equals("Test/src/main/java")); + assertTrue(pathWithSeparator.toString().equals("/Test/src/main/java")); + } + + @Test + public void shouldReturnTheSamePathIfPathAlreadyHasLeadingSeparator() { + final Path path = Path.valueOf("/Test/src/main/java"); + + final Path pathWithSeparator = path.addLeadingSeparator(); + + assertEquals(path, pathWithSeparator); + + assertTrue(path.hasLeadingSeparator()); + assertTrue(pathWithSeparator.hasLeadingSeparator()); + + assertTrue(path.toString().equals("/Test/src/main/java")); + assertTrue(pathWithSeparator.toString().equals("/Test/src/main/java")); + } + + @Test + public void shouldReturnTheSamePathIfPathIsRoot() { + final Path path = Path.valueOf("/"); + + final Path pathWithSeparator = path.addLeadingSeparator(); + + assertEquals(path, pathWithSeparator); + + assertTrue(path.hasLeadingSeparator()); + assertTrue(pathWithSeparator.hasLeadingSeparator()); + + assertTrue(path.toString().equals("/")); + assertTrue(pathWithSeparator.toString().equals("/")); + } + + @Test + public void shouldReturnNewRootPathIfPathIsEmpty() { + final Path path = Path.valueOf(""); + + final Path pathWithSeparator = path.addLeadingSeparator(); + + assertNotEquals(path, pathWithSeparator); + + assertFalse(path.hasLeadingSeparator()); + assertTrue(pathWithSeparator.hasLeadingSeparator()); + + assertTrue(path.toString().equals("")); + assertTrue(pathWithSeparator.toString().equals("/")); + } } diff --git a/plugins/plugin-java/che-plugin-java-ext-lang-client/src/main/java/org/eclipse/che/ide/ext/java/client/dependenciesupdater/JavaClasspathServiceClientImpl.java b/plugins/plugin-java/che-plugin-java-ext-lang-client/src/main/java/org/eclipse/che/ide/ext/java/client/dependenciesupdater/JavaClasspathServiceClientImpl.java index 6352025246..ea106e4dd9 100644 --- a/plugins/plugin-java/che-plugin-java-ext-lang-client/src/main/java/org/eclipse/che/ide/ext/java/client/dependenciesupdater/JavaClasspathServiceClientImpl.java +++ b/plugins/plugin-java/che-plugin-java-ext-lang-client/src/main/java/org/eclipse/che/ide/ext/java/client/dependenciesupdater/JavaClasspathServiceClientImpl.java @@ -12,7 +12,9 @@ package org.eclipse.che.ide.ext.java.client.dependenciesupdater; import static com.google.gwt.http.client.RequestBuilder.GET; import static org.eclipse.che.ide.MimeType.APPLICATION_JSON; +import static org.eclipse.che.ide.resource.Path.valueOf; import static org.eclipse.che.ide.rest.HTTPHeader.ACCEPT; +import static org.eclipse.che.ide.util.PathEncoder.encodePath; import com.google.inject.Inject; import com.google.inject.Singleton; @@ -48,7 +50,8 @@ public class JavaClasspathServiceClientImpl implements JavaClasspathServiceClien @Override public void updateDependencies( String projectPath, RequestCallback callback) { - final String requestUrl = baseHttpUrl + "/classpath/update?projectpath=" + projectPath; + final String requestUrl = + baseHttpUrl + "/classpath/update?projectpath=" + encodePath(valueOf(projectPath)); MessageBuilder builder = new MessageBuilder(GET, requestUrl); builder.header(ACCEPT, APPLICATION_JSON); diff --git a/plugins/plugin-java/che-plugin-java-ext-lang-client/src/main/java/org/eclipse/che/ide/ext/java/client/project/classpath/service/ClasspathServiceClientImpl.java b/plugins/plugin-java/che-plugin-java-ext-lang-client/src/main/java/org/eclipse/che/ide/ext/java/client/project/classpath/service/ClasspathServiceClientImpl.java index 338869e3fd..17e32a3205 100644 --- a/plugins/plugin-java/che-plugin-java-ext-lang-client/src/main/java/org/eclipse/che/ide/ext/java/client/project/classpath/service/ClasspathServiceClientImpl.java +++ b/plugins/plugin-java/che-plugin-java-ext-lang-client/src/main/java/org/eclipse/che/ide/ext/java/client/project/classpath/service/ClasspathServiceClientImpl.java @@ -10,6 +10,9 @@ */ package org.eclipse.che.ide.ext.java.client.project.classpath.service; +import static org.eclipse.che.ide.resource.Path.valueOf; +import static org.eclipse.che.ide.util.PathEncoder.encodePath; + import com.google.inject.Inject; import com.google.inject.Singleton; import java.util.List; @@ -55,7 +58,7 @@ public class ClasspathServiceClientImpl implements ClasspathServiceClient { appContext.getDevMachine().getWsAgentBaseUrl() + pathToService + "?projectpath=" - + projectPath; + + encodePath(valueOf(projectPath)); return asyncRequestFactory .createGetRequest(url) diff --git a/plugins/plugin-java/che-plugin-java-ext-lang-client/src/main/java/org/eclipse/che/ide/ext/java/client/refactoring/service/RefactoringServiceClientImpl.java b/plugins/plugin-java/che-plugin-java-ext-lang-client/src/main/java/org/eclipse/che/ide/ext/java/client/refactoring/service/RefactoringServiceClientImpl.java index 9f7a74486a..2167a4792c 100644 --- a/plugins/plugin-java/che-plugin-java-ext-lang-client/src/main/java/org/eclipse/che/ide/ext/java/client/refactoring/service/RefactoringServiceClientImpl.java +++ b/plugins/plugin-java/che-plugin-java-ext-lang-client/src/main/java/org/eclipse/che/ide/ext/java/client/refactoring/service/RefactoringServiceClientImpl.java @@ -12,8 +12,10 @@ package org.eclipse.che.ide.ext.java.client.refactoring.service; import static org.eclipse.che.ide.MimeType.APPLICATION_JSON; import static org.eclipse.che.ide.MimeType.TEXT_PLAIN; +import static org.eclipse.che.ide.resource.Path.valueOf; import static org.eclipse.che.ide.rest.HTTPHeader.ACCEPT; import static org.eclipse.che.ide.rest.HTTPHeader.CONTENT_TYPE; +import static org.eclipse.che.ide.util.PathEncoder.encodePath; import com.google.inject.Inject; import com.google.inject.Singleton; @@ -240,7 +242,7 @@ final class RefactoringServiceClientImpl implements RefactoringServiceClient { appContext.getDevMachine().getWsAgentBaseUrl() + pathToService + "reindex?projectpath=" - + projectPath; + + encodePath(valueOf(projectPath)); return asyncRequestFactory.createGetRequest(url).loader(loader).send(); } diff --git a/plugins/plugin-java/che-plugin-java-plain/che-plugin-java-plain-ide/src/main/java/org/eclipse/che/plugin/java/plain/client/service/ClasspathUpdaterServiceClientImpl.java b/plugins/plugin-java/che-plugin-java-plain/che-plugin-java-plain-ide/src/main/java/org/eclipse/che/plugin/java/plain/client/service/ClasspathUpdaterServiceClientImpl.java index d62ae964b6..97f980b3ed 100644 --- a/plugins/plugin-java/che-plugin-java-plain/che-plugin-java-plain-ide/src/main/java/org/eclipse/che/plugin/java/plain/client/service/ClasspathUpdaterServiceClientImpl.java +++ b/plugins/plugin-java/che-plugin-java-plain/che-plugin-java-plain-ide/src/main/java/org/eclipse/che/plugin/java/plain/client/service/ClasspathUpdaterServiceClientImpl.java @@ -10,6 +10,9 @@ */ package org.eclipse.che.plugin.java.plain.client.service; +import static org.eclipse.che.ide.resource.Path.valueOf; +import static org.eclipse.che.ide.util.PathEncoder.encodePath; + import com.google.inject.Inject; import com.google.inject.Singleton; import java.util.List; @@ -49,7 +52,7 @@ public class ClasspathUpdaterServiceClientImpl implements ClasspathUpdaterServic appContext.getDevMachine().getWsAgentBaseUrl() + pathToService + "update?projectpath=" - + projectPath; + + encodePath(valueOf(projectPath)); return asyncRequestFactory.createPostRequest(url, entries).loader(loader).send(); } } diff --git a/plugins/plugin-languageserver/che-plugin-languageserver-ide/src/main/java/org/eclipse/che/plugin/languageserver/ide/service/WorkspaceServiceClient.java b/plugins/plugin-languageserver/che-plugin-languageserver-ide/src/main/java/org/eclipse/che/plugin/languageserver/ide/service/WorkspaceServiceClient.java index 821e26008c..1711456c6e 100644 --- a/plugins/plugin-languageserver/che-plugin-languageserver-ide/src/main/java/org/eclipse/che/plugin/languageserver/ide/service/WorkspaceServiceClient.java +++ b/plugins/plugin-languageserver/che-plugin-languageserver-ide/src/main/java/org/eclipse/che/plugin/languageserver/ide/service/WorkspaceServiceClient.java @@ -22,6 +22,7 @@ import org.eclipse.che.api.promises.client.js.Promises; import org.eclipse.lsp4j.SymbolInformation; import org.eclipse.lsp4j.TextEdit; import org.eclipse.lsp4j.WorkspaceSymbolParams; +import org.eclipse.lsp4j.services.WorkspaceService; /** @author Evgen Vidolob */ @Singleton @@ -34,8 +35,7 @@ public class WorkspaceServiceClient { } /** - * GWT client implementation of {@link - * io.typefox.lsapi.WorkspaceService#symbol(io.typefox.lsapi.WorkspaceSymbolParams)} + * GWT client implementation of {@link WorkspaceService#symbol(WorkspaceSymbolParams)} * * @param params * @return diff --git a/plugins/plugin-maven/che-plugin-maven-ide/src/main/java/org/eclipse/che/plugin/maven/client/service/MavenServerServiceClientImpl.java b/plugins/plugin-maven/che-plugin-maven-ide/src/main/java/org/eclipse/che/plugin/maven/client/service/MavenServerServiceClientImpl.java index d6472ab268..e49f56e794 100644 --- a/plugins/plugin-maven/che-plugin-maven-ide/src/main/java/org/eclipse/che/plugin/maven/client/service/MavenServerServiceClientImpl.java +++ b/plugins/plugin-maven/che-plugin-maven-ide/src/main/java/org/eclipse/che/plugin/maven/client/service/MavenServerServiceClientImpl.java @@ -10,6 +10,9 @@ */ package org.eclipse.che.plugin.maven.client.service; +import static org.eclipse.che.ide.resource.Path.valueOf; +import static org.eclipse.che.ide.util.PathEncoder.encodePath; + import com.google.gwt.http.client.Response; import com.google.inject.Inject; import com.google.inject.Singleton; @@ -50,7 +53,7 @@ public class MavenServerServiceClientImpl implements MavenServerServiceClient { appContext.getDevMachine().getWsAgentBaseUrl() + servicePath + "effective/pom?projectpath=" - + projectPath; + + encodePath(valueOf(projectPath)); return asyncRequestFactory .createGetRequest(url) @@ -64,7 +67,7 @@ public class MavenServerServiceClientImpl implements MavenServerServiceClient { appContext.getDevMachine().getWsAgentBaseUrl() + servicePath + "download/sources?projectpath=" - + projectPath + + encodePath(valueOf(projectPath)) + "&fqn=" + fqn; return asyncRequestFactory @@ -90,7 +93,7 @@ public class MavenServerServiceClientImpl implements MavenServerServiceClient { public Promise reImportProjects(@NotNull List projectsPaths) { StringBuilder queryParameters = new StringBuilder(); for (String path : projectsPaths) { - queryParameters.append("&projectPath=").append(path); + queryParameters.append("&projectPath=").append(encodePath(valueOf(path))); } final String url = appContext.getDevMachine().getWsAgentBaseUrl() @@ -107,7 +110,7 @@ public class MavenServerServiceClientImpl implements MavenServerServiceClient { appContext.getDevMachine().getWsAgentBaseUrl() + servicePath + "pom/reconcile?pompath=" - + pomPath; + + encodePath(valueOf(pomPath)); return asyncRequestFactory.createGetRequest(url).send(); } }