From 080e17836f5832c21741df2d1d7e0d5ef7db2edc Mon Sep 17 00:00:00 2001 From: Igor Vinokur Date: Wed, 18 Jul 2018 12:01:15 +0300 Subject: [PATCH] CHE-10286: Switch import rest methods to Json-rpc (#10440) --- .../che/ide/project/ProjectServiceClient.java | 57 ++++++++---- .../ide/project/ProjectServiceClientTest.java | 4 +- ide/commons-gwt/pom.xml | 4 + .../che/ide/jsonrpc/JsonRpcErrorUtils.java | 8 +- .../service/LanguageServerServiceClient.java | 21 +---- .../service/TextDocumentServiceClient.java | 18 +--- .../ide/service/WorkspaceServiceClient.java | 2 +- .../che/api/project/shared/Constants.java | 1 + .../CreateBatchProjectsRequestDto.java | 30 ++++++ .../shared/dto/service/ImportRequestDto.java | 4 + .../api/project/server/ProjectApiModule.java | 2 + .../ProjectJsonRpcServiceConfigurator.java | 24 ++++- .../impl/ProjectJsonRpcServiceBackEnd.java | 91 ++++++++++++------- 13 files changed, 175 insertions(+), 91 deletions(-) rename plugins/plugin-languageserver/che-plugin-languageserver-ide/src/main/java/org/eclipse/che/plugin/languageserver/ide/service/ServiceUtil.java => ide/commons-gwt/src/main/java/org/eclipse/che/ide/jsonrpc/JsonRpcErrorUtils.java (84%) create mode 100644 wsagent/che-core-api-project-shared/src/main/java/org/eclipse/che/api/project/shared/dto/service/CreateBatchProjectsRequestDto.java diff --git a/ide/che-core-ide-app/src/main/java/org/eclipse/che/ide/project/ProjectServiceClient.java b/ide/che-core-ide-app/src/main/java/org/eclipse/che/ide/project/ProjectServiceClient.java index a394425920..813d5ac525 100644 --- a/ide/che-core-ide-app/src/main/java/org/eclipse/che/ide/project/ProjectServiceClient.java +++ b/ide/che-core-ide-app/src/main/java/org/eclipse/che/ide/project/ProjectServiceClient.java @@ -15,7 +15,11 @@ import static com.google.gwt.http.client.RequestBuilder.DELETE; import static com.google.gwt.http.client.RequestBuilder.PUT; import static com.google.gwt.http.client.URL.encodePathSegment; import static com.google.gwt.http.client.URL.encodeQueryString; +import static org.eclipse.che.api.project.shared.Constants.Services.PROJECTS_BATCH; +import static org.eclipse.che.api.project.shared.Constants.Services.PROJECT_IMPORT; import static org.eclipse.che.ide.MimeType.APPLICATION_JSON; +import static org.eclipse.che.ide.api.jsonrpc.Constants.WS_AGENT_JSON_RPC_ENDPOINT_ID; +import static org.eclipse.che.ide.jsonrpc.JsonRpcErrorUtils.getPromiseError; 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; @@ -25,6 +29,7 @@ import java.util.Collections; import java.util.List; import java.util.Map; import java.util.stream.Collectors; +import org.eclipse.che.api.core.jsonrpc.commons.RequestTransmitter; 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; @@ -33,8 +38,11 @@ import org.eclipse.che.api.project.shared.dto.ProjectSearchResponseDto; 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.project.shared.dto.service.CreateBatchProjectsRequestDto; +import org.eclipse.che.api.project.shared.dto.service.ImportRequestDto; import org.eclipse.che.api.promises.client.Function; import org.eclipse.che.api.promises.client.Promise; +import org.eclipse.che.api.promises.client.js.Promises; import org.eclipse.che.api.workspace.shared.dto.ProjectConfigDto; import org.eclipse.che.api.workspace.shared.dto.SourceStorageDto; import org.eclipse.che.ide.MimeType; @@ -67,7 +75,6 @@ public class ProjectServiceClient { private static final String FOLDER = "/folder"; private static final String FILE = "/file"; private static final String SEARCH = "/search"; - private static final String IMPORT = "/import"; private static final String RESOLVE = "/resolve"; private static final String ESTIMATE = "/estimate"; @@ -75,6 +82,7 @@ public class ProjectServiceClient { private final AsyncRequestFactory reqFactory; private final DtoFactory dtoFactory; private final DtoUnmarshallerFactory unmarshaller; + private final RequestTransmitter requestTransmitter; private final AppContext appContext; @Inject @@ -83,11 +91,13 @@ public class ProjectServiceClient { AsyncRequestFactory reqFactory, DtoFactory dtoFactory, DtoUnmarshallerFactory unmarshaller, + RequestTransmitter requestTransmitter, AppContext appContext) { this.loaderFactory = loaderFactory; this.reqFactory = reqFactory; this.dtoFactory = dtoFactory; this.unmarshaller = unmarshaller; + this.requestTransmitter = requestTransmitter; this.appContext = appContext; } @@ -159,12 +169,20 @@ public class ProjectServiceClient { * @since 4.4.0 */ public Promise importProject(Path path, SourceStorageDto source) { - String url = getBaseUrl() + IMPORT + encodePath(path); - - url += url.contains("?") ? "&" : "?"; - url += "clientId=" + appContext.getApplicationId().orElse(""); - - return reqFactory.createPostRequest(url, source).header(CONTENT_TYPE, APPLICATION_JSON).send(); + return Promises.create( + (resolve, reject) -> + requestTransmitter + .newRequest() + .endpointId(WS_AGENT_JSON_RPC_ENDPOINT_ID) + .methodName(PROJECT_IMPORT) + .paramsAsDto( + dtoFactory + .createDto(ImportRequestDto.class) + .withWsPath(path.toString()) + .withSourceStorage(source)) + .sendAndReceiveResultAsDto(ImportRequestDto.class) + .onSuccess(() -> resolve.apply(null)) + .onFailure(error -> reject.apply(getPromiseError(error)))); } /** @@ -264,18 +282,19 @@ public class ProjectServiceClient { */ public Promise> createBatchProjects( List configurations) { - String url = getBaseUrl() + BATCH_PROJECTS; - - url += url.contains("?") ? "&" : "?"; - url += "clientId=" + appContext.getApplicationId().orElse(""); - - final String loaderMessage = - configurations.size() > 1 ? "Creating the batch of projects..." : "Creating project..."; - return reqFactory - .createPostRequest(url, configurations) - .header(ACCEPT, APPLICATION_JSON) - .loader(loaderFactory.newLoader(loaderMessage)) - .send(unmarshaller.newListUnmarshaller(ProjectConfigDto.class)); + return Promises.create( + (resolve, reject) -> + requestTransmitter + .newRequest() + .endpointId(WS_AGENT_JSON_RPC_ENDPOINT_ID) + .methodName(PROJECTS_BATCH) + .paramsAsDto( + dtoFactory + .createDto(CreateBatchProjectsRequestDto.class) + .withNewProjectConfigs(configurations)) + .sendAndReceiveResultAsListOfDto(ProjectConfigDto.class) + .onSuccess(resolve::apply) + .onFailure(error -> reject.apply(getPromiseError(error)))); } /** diff --git a/ide/che-core-ide-app/src/test/java/org/eclipse/che/ide/project/ProjectServiceClientTest.java b/ide/che-core-ide-app/src/test/java/org/eclipse/che/ide/project/ProjectServiceClientTest.java index eb41e328df..e187034722 100644 --- a/ide/che-core-ide-app/src/test/java/org/eclipse/che/ide/project/ProjectServiceClientTest.java +++ b/ide/che-core-ide-app/src/test/java/org/eclipse/che/ide/project/ProjectServiceClientTest.java @@ -32,6 +32,7 @@ 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.jsonrpc.commons.RequestTransmitter; import org.eclipse.che.api.core.model.workspace.config.ProjectConfig; import org.eclipse.che.api.project.shared.dto.CopyOptions; import org.eclipse.che.api.project.shared.dto.ItemReference; @@ -81,6 +82,7 @@ public class ProjectServiceClientTest { @Mock private AsyncRequestFactory requestFactory; @Mock private DtoFactory dtoFactory; @Mock private DtoUnmarshallerFactory unmarshaller; + @Mock private RequestTransmitter transmitter; @Mock private AppContext appContext; @Mock private AsyncRequest asyncRequest; @@ -108,7 +110,7 @@ public class ProjectServiceClientTest { public void setUp() throws Exception { client = new ProjectServiceClient( - loaderFactory, requestFactory, dtoFactory, unmarshaller, appContext); + loaderFactory, requestFactory, dtoFactory, unmarshaller, transmitter, appContext); when(loaderFactory.newLoader(any(String.class))).thenReturn(messageLoader); when(asyncRequest.loader(messageLoader)).thenReturn(asyncRequest); diff --git a/ide/commons-gwt/pom.xml b/ide/commons-gwt/pom.xml index 10eb83e75f..b45ee83dbb 100644 --- a/ide/commons-gwt/pom.xml +++ b/ide/commons-gwt/pom.xml @@ -41,6 +41,10 @@ org.eclipse.che.core che-core-api-core + + org.eclipse.che.core + che-core-api-core + org.eclipse.che.core che-core-commons-annotations diff --git a/plugins/plugin-languageserver/che-plugin-languageserver-ide/src/main/java/org/eclipse/che/plugin/languageserver/ide/service/ServiceUtil.java b/ide/commons-gwt/src/main/java/org/eclipse/che/ide/jsonrpc/JsonRpcErrorUtils.java similarity index 84% rename from plugins/plugin-languageserver/che-plugin-languageserver-ide/src/main/java/org/eclipse/che/plugin/languageserver/ide/service/ServiceUtil.java rename to ide/commons-gwt/src/main/java/org/eclipse/che/ide/jsonrpc/JsonRpcErrorUtils.java index b024992f83..cc668bd48b 100644 --- a/plugins/plugin-languageserver/che-plugin-languageserver-ide/src/main/java/org/eclipse/che/plugin/languageserver/ide/service/ServiceUtil.java +++ b/ide/commons-gwt/src/main/java/org/eclipse/che/ide/jsonrpc/JsonRpcErrorUtils.java @@ -8,15 +8,17 @@ * Contributors: * Red Hat, Inc. - initial API and implementation */ -package org.eclipse.che.plugin.languageserver.ide.service; +package org.eclipse.che.ide.jsonrpc; import org.eclipse.che.api.core.jsonrpc.commons.JsonRpcError; import org.eclipse.che.api.core.jsonrpc.commons.JsonRpcException; import org.eclipse.che.api.promises.client.PromiseError; -public class ServiceUtil { - private ServiceUtil() {} +public class JsonRpcErrorUtils { + private JsonRpcErrorUtils() {} + + /** Transform {@link JsonRpcError} to {@link PromiseError}. */ public static PromiseError getPromiseError(JsonRpcError jsonRpcError) { return new PromiseError() { @Override diff --git a/plugins/plugin-languageserver/che-plugin-languageserver-ide/src/main/java/org/eclipse/che/plugin/languageserver/ide/service/LanguageServerServiceClient.java b/plugins/plugin-languageserver/che-plugin-languageserver-ide/src/main/java/org/eclipse/che/plugin/languageserver/ide/service/LanguageServerServiceClient.java index d559b4aae2..40ebced2a4 100644 --- a/plugins/plugin-languageserver/che-plugin-languageserver-ide/src/main/java/org/eclipse/che/plugin/languageserver/ide/service/LanguageServerServiceClient.java +++ b/plugins/plugin-languageserver/che-plugin-languageserver-ide/src/main/java/org/eclipse/che/plugin/languageserver/ide/service/LanguageServerServiceClient.java @@ -11,13 +11,12 @@ package org.eclipse.che.plugin.languageserver.ide.service; import static org.eclipse.che.ide.api.jsonrpc.Constants.WS_AGENT_JSON_RPC_ENDPOINT_ID; +import static org.eclipse.che.ide.jsonrpc.JsonRpcErrorUtils.getPromiseError; import java.util.List; import java.util.concurrent.TimeoutException; import javax.inject.Inject; import javax.inject.Singleton; -import org.eclipse.che.api.core.jsonrpc.commons.JsonRpcError; -import org.eclipse.che.api.core.jsonrpc.commons.JsonRpcException; import org.eclipse.che.api.core.jsonrpc.commons.RequestTransmitter; import org.eclipse.che.api.languageserver.shared.model.LanguageRegex; import org.eclipse.che.api.promises.client.Promise; @@ -46,7 +45,7 @@ public class LanguageServerServiceClient { .sendAndReceiveResultAsDto(ServerCapabilities.class, 30_000) .onSuccess(resolve::apply) .onFailure(error -> reject.apply(getPromiseError(error))) - .onTimeout(() -> reject.apply(getPromiseError()))); + .onTimeout(() -> reject.apply(getTimeoutPromiseError()))); } public Promise> getLanguageRegexes() { @@ -62,21 +61,7 @@ public class LanguageServerServiceClient { .onFailure(error -> reject.apply(getPromiseError(error)))); } - private PromiseError getPromiseError(JsonRpcError jsonRpcError) { - return new PromiseError() { - @Override - public String getMessage() { - return jsonRpcError.getMessage(); - } - - @Override - public Throwable getCause() { - return new JsonRpcException(jsonRpcError.getCode(), jsonRpcError.getMessage()); - } - }; - } - - private PromiseError getPromiseError() { + private PromiseError getTimeoutPromiseError() { return new PromiseError() { @Override diff --git a/plugins/plugin-languageserver/che-plugin-languageserver-ide/src/main/java/org/eclipse/che/plugin/languageserver/ide/service/TextDocumentServiceClient.java b/plugins/plugin-languageserver/che-plugin-languageserver-ide/src/main/java/org/eclipse/che/plugin/languageserver/ide/service/TextDocumentServiceClient.java index 3d868a0407..58d3e739e1 100644 --- a/plugins/plugin-languageserver/che-plugin-languageserver-ide/src/main/java/org/eclipse/che/plugin/languageserver/ide/service/TextDocumentServiceClient.java +++ b/plugins/plugin-languageserver/che-plugin-languageserver-ide/src/main/java/org/eclipse/che/plugin/languageserver/ide/service/TextDocumentServiceClient.java @@ -11,18 +11,16 @@ package org.eclipse.che.plugin.languageserver.ide.service; import static org.eclipse.che.ide.api.jsonrpc.Constants.WS_AGENT_JSON_RPC_ENDPOINT_ID; +import static org.eclipse.che.ide.jsonrpc.JsonRpcErrorUtils.getPromiseError; import com.google.inject.Inject; import com.google.inject.Singleton; import java.util.List; -import org.eclipse.che.api.core.jsonrpc.commons.JsonRpcError; -import org.eclipse.che.api.core.jsonrpc.commons.JsonRpcException; import org.eclipse.che.api.core.jsonrpc.commons.RequestTransmitter; import org.eclipse.che.api.languageserver.shared.model.ExtendedCompletionItem; import org.eclipse.che.api.languageserver.shared.model.ExtendedCompletionList; import org.eclipse.che.api.languageserver.shared.model.RenameResult; import org.eclipse.che.api.promises.client.Promise; -import org.eclipse.che.api.promises.client.PromiseError; import org.eclipse.che.api.promises.client.js.Promises; import org.eclipse.lsp4j.CodeActionParams; import org.eclipse.lsp4j.Command; @@ -263,18 +261,4 @@ public class TextDocumentServiceClient { .paramsAsDto(jsonSerializable) .sendAndSkipResult(); } - - private PromiseError getPromiseError(JsonRpcError jsonRpcError) { - return new PromiseError() { - @Override - public String getMessage() { - return jsonRpcError.getMessage(); - } - - @Override - public Throwable getCause() { - return new JsonRpcException(jsonRpcError.getCode(), jsonRpcError.getMessage()); - } - }; - } } 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 977dfd47cc..c376f0e093 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 @@ -11,7 +11,7 @@ package org.eclipse.che.plugin.languageserver.ide.service; import static org.eclipse.che.ide.api.jsonrpc.Constants.WS_AGENT_JSON_RPC_ENDPOINT_ID; -import static org.eclipse.che.plugin.languageserver.ide.service.ServiceUtil.getPromiseError; +import static org.eclipse.che.ide.jsonrpc.JsonRpcErrorUtils.getPromiseError; import com.google.inject.Inject; import com.google.inject.Singleton; diff --git a/wsagent/che-core-api-project-shared/src/main/java/org/eclipse/che/api/project/shared/Constants.java b/wsagent/che-core-api-project-shared/src/main/java/org/eclipse/che/api/project/shared/Constants.java index d2af2e7595..4c2735019f 100644 --- a/wsagent/che-core-api-project-shared/src/main/java/org/eclipse/che/api/project/shared/Constants.java +++ b/wsagent/che-core-api-project-shared/src/main/java/org/eclipse/che/api/project/shared/Constants.java @@ -45,6 +45,7 @@ public class Constants { public static final String PROJECT_GET = "project/get"; public static final String PROJECT_CREATE = "project/create"; + public static final String PROJECTS_BATCH = "projects/batch"; public static final String PROJECT_UPDATE = "project/update"; public static final String PROJECT_DELETE = "project/delete"; public static final String PROJECT_RECOGNIZE = "project/recognize"; diff --git a/wsagent/che-core-api-project-shared/src/main/java/org/eclipse/che/api/project/shared/dto/service/CreateBatchProjectsRequestDto.java b/wsagent/che-core-api-project-shared/src/main/java/org/eclipse/che/api/project/shared/dto/service/CreateBatchProjectsRequestDto.java new file mode 100644 index 0000000000..af193eff05 --- /dev/null +++ b/wsagent/che-core-api-project-shared/src/main/java/org/eclipse/che/api/project/shared/dto/service/CreateBatchProjectsRequestDto.java @@ -0,0 +1,30 @@ +/* + * Copyright (c) 2012-2018 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.api.project.shared.dto.service; + +import java.util.List; +import org.eclipse.che.api.project.shared.dto.NewProjectConfigDto; +import org.eclipse.che.dto.shared.DTO; + +@DTO +public interface CreateBatchProjectsRequestDto { + boolean isRewrite(); + + void setRewrite(boolean rewrite); + + CreateBatchProjectsRequestDto withRewrite(boolean rewrite); + + List getNewProjectConfigs(); + + void setNewProjectConfigs(List newProjectConfigs); + + CreateBatchProjectsRequestDto withNewProjectConfigs(List newProjectConfigs); +} diff --git a/wsagent/che-core-api-project-shared/src/main/java/org/eclipse/che/api/project/shared/dto/service/ImportRequestDto.java b/wsagent/che-core-api-project-shared/src/main/java/org/eclipse/che/api/project/shared/dto/service/ImportRequestDto.java index d7b523425a..109f4e4b98 100644 --- a/wsagent/che-core-api-project-shared/src/main/java/org/eclipse/che/api/project/shared/dto/service/ImportRequestDto.java +++ b/wsagent/che-core-api-project-shared/src/main/java/org/eclipse/che/api/project/shared/dto/service/ImportRequestDto.java @@ -19,7 +19,11 @@ public interface ImportRequestDto { void setWsPath(String wsPath); + ImportRequestDto withWsPath(String wsPath); + SourceStorageDto getSourceStorage(); void setSourceStorage(SourceStorageDto sourceStorage); + + ImportRequestDto withSourceStorage(SourceStorageDto sourceStorage); } diff --git a/wsagent/che-core-api-project/src/main/java/org/eclipse/che/api/project/server/ProjectApiModule.java b/wsagent/che-core-api-project/src/main/java/org/eclipse/che/api/project/server/ProjectApiModule.java index bc987947e1..deca32eac9 100644 --- a/wsagent/che-core-api-project/src/main/java/org/eclipse/che/api/project/server/ProjectApiModule.java +++ b/wsagent/che-core-api-project/src/main/java/org/eclipse/che/api/project/server/ProjectApiModule.java @@ -69,6 +69,8 @@ public class ProjectApiModule extends AbstractModule { bind(ProjectConfigRegistry.class).to(InmemoryProjectRegistry.class); + bind(ProjectJsonRpcServiceConfigurator.class).asEagerSingleton(); + newSetBinder(binder(), ProjectImporter.class).addBinding().to(ZipProjectImporter.class); newSetBinder(binder(), ProjectTypeDef.class).addBinding().to(BaseProjectType.class); diff --git a/wsagent/che-core-api-project/src/main/java/org/eclipse/che/api/project/server/ProjectJsonRpcServiceConfigurator.java b/wsagent/che-core-api-project/src/main/java/org/eclipse/che/api/project/server/ProjectJsonRpcServiceConfigurator.java index 4ce4ad160b..7841c94291 100644 --- a/wsagent/che-core-api-project/src/main/java/org/eclipse/che/api/project/server/ProjectJsonRpcServiceConfigurator.java +++ b/wsagent/che-core-api-project/src/main/java/org/eclipse/che/api/project/server/ProjectJsonRpcServiceConfigurator.java @@ -17,7 +17,22 @@ import javax.inject.Inject; import javax.inject.Singleton; import org.eclipse.che.api.core.jsonrpc.commons.RequestHandlerConfigurator; import org.eclipse.che.api.project.server.impl.ProjectJsonRpcServiceBackEnd; -import org.eclipse.che.api.project.shared.dto.service.*; +import org.eclipse.che.api.project.shared.dto.service.CreateBatchProjectsRequestDto; +import org.eclipse.che.api.project.shared.dto.service.CreateRequestDto; +import org.eclipse.che.api.project.shared.dto.service.CreateResponseDto; +import org.eclipse.che.api.project.shared.dto.service.DeleteRequestDto; +import org.eclipse.che.api.project.shared.dto.service.DeleteResponseDto; +import org.eclipse.che.api.project.shared.dto.service.GetRequestDto; +import org.eclipse.che.api.project.shared.dto.service.GetResponseDto; +import org.eclipse.che.api.project.shared.dto.service.ImportRequestDto; +import org.eclipse.che.api.project.shared.dto.service.ImportResponseDto; +import org.eclipse.che.api.project.shared.dto.service.RecognizeRequestDto; +import org.eclipse.che.api.project.shared.dto.service.RecognizeResponseDto; +import org.eclipse.che.api.project.shared.dto.service.UpdateRequestDto; +import org.eclipse.che.api.project.shared.dto.service.UpdateResponseDto; +import org.eclipse.che.api.project.shared.dto.service.VerifyRequestDto; +import org.eclipse.che.api.project.shared.dto.service.VerifyResponseDto; +import org.eclipse.che.api.workspace.shared.dto.ProjectConfigDto; @Singleton public class ProjectJsonRpcServiceConfigurator { @@ -82,5 +97,12 @@ public class ProjectJsonRpcServiceConfigurator { .paramsAsDto(ImportRequestDto.class) .resultAsDto(ImportResponseDto.class) .withBiFunction(service::doImport); + + handlers + .newConfiguration() + .methodName(PROJECTS_BATCH) + .paramsAsDto(CreateBatchProjectsRequestDto.class) + .resultAsListOfDto(ProjectConfigDto.class) + .withBiFunction(service::createBatchProjects); } } diff --git a/wsagent/che-core-api-project/src/main/java/org/eclipse/che/api/project/server/impl/ProjectJsonRpcServiceBackEnd.java b/wsagent/che-core-api-project/src/main/java/org/eclipse/che/api/project/server/impl/ProjectJsonRpcServiceBackEnd.java index 2a5a615ee2..67f8385caf 100644 --- a/wsagent/che-core-api-project/src/main/java/org/eclipse/che/api/project/server/impl/ProjectJsonRpcServiceBackEnd.java +++ b/wsagent/che-core-api-project/src/main/java/org/eclipse/che/api/project/server/impl/ProjectJsonRpcServiceBackEnd.java @@ -23,9 +23,11 @@ import static org.eclipse.che.api.project.shared.Constants.Services.UNAUTHORIZED import static org.eclipse.che.dto.server.DtoFactory.newDto; import java.util.Collections; +import java.util.HashSet; import java.util.List; import java.util.Map; import java.util.Map.Entry; +import java.util.Set; import java.util.function.BiConsumer; import javax.inject.Inject; import javax.inject.Singleton; @@ -38,25 +40,15 @@ import org.eclipse.che.api.core.UnauthorizedException; import org.eclipse.che.api.core.jsonrpc.commons.JsonRpcException; import org.eclipse.che.api.core.jsonrpc.commons.RequestTransmitter; import org.eclipse.che.api.core.model.workspace.config.ProjectConfig; +import org.eclipse.che.api.core.notification.EventService; import org.eclipse.che.api.project.server.ProjectManager; +import org.eclipse.che.api.project.server.notification.ProjectCreatedEvent; import org.eclipse.che.api.project.server.type.ProjectTypeResolution; import org.eclipse.che.api.project.shared.RegisteredProject; import org.eclipse.che.api.project.shared.dto.ImportProgressRecordDto; +import org.eclipse.che.api.project.shared.dto.NewProjectConfigDto; import org.eclipse.che.api.project.shared.dto.SourceEstimation; -import org.eclipse.che.api.project.shared.dto.service.CreateRequestDto; -import org.eclipse.che.api.project.shared.dto.service.CreateResponseDto; -import org.eclipse.che.api.project.shared.dto.service.DeleteRequestDto; -import org.eclipse.che.api.project.shared.dto.service.DeleteResponseDto; -import org.eclipse.che.api.project.shared.dto.service.GetRequestDto; -import org.eclipse.che.api.project.shared.dto.service.GetResponseDto; -import org.eclipse.che.api.project.shared.dto.service.ImportRequestDto; -import org.eclipse.che.api.project.shared.dto.service.ImportResponseDto; -import org.eclipse.che.api.project.shared.dto.service.RecognizeRequestDto; -import org.eclipse.che.api.project.shared.dto.service.RecognizeResponseDto; -import org.eclipse.che.api.project.shared.dto.service.UpdateRequestDto; -import org.eclipse.che.api.project.shared.dto.service.UpdateResponseDto; -import org.eclipse.che.api.project.shared.dto.service.VerifyRequestDto; -import org.eclipse.che.api.project.shared.dto.service.VerifyResponseDto; +import org.eclipse.che.api.project.shared.dto.service.*; import org.eclipse.che.api.workspace.shared.dto.ProjectConfigDto; import org.eclipse.che.api.workspace.shared.dto.SourceStorageDto; @@ -65,12 +57,16 @@ public class ProjectJsonRpcServiceBackEnd { private final ProjectManager projectManager; private final RequestTransmitter requestTransmitter; + private final EventService eventService; @Inject public ProjectJsonRpcServiceBackEnd( - ProjectManager projectManager, RequestTransmitter requestTransmitter) { + ProjectManager projectManager, + RequestTransmitter requestTransmitter, + EventService eventService) { this.projectManager = projectManager; this.requestTransmitter = requestTransmitter; + this.eventService = eventService; } public GetResponseDto get(GetRequestDto getRequestDto) { @@ -101,6 +97,11 @@ public class ProjectJsonRpcServiceBackEnd { return perform(this::doImportInternally, endpointId, importRequestDto); } + public List createBatchProjects( + String endpointId, CreateBatchProjectsRequestDto createProjectsRequest) { + return perform(this::createBatchProjectsInternally, endpointId, createProjectsRequest); + } + private GetResponseDto getInternally(GetRequestDto request) throws ServerException, ConflictException, ForbiddenException, BadRequestException, NotFoundException { @@ -229,26 +230,14 @@ public class ProjectJsonRpcServiceBackEnd { } private ImportResponseDto doImportInternally(String endpointId, ImportRequestDto request) - throws ServerException, ConflictException, ForbiddenException, BadRequestException, - NotFoundException, UnauthorizedException { + throws ServerException, ConflictException, ForbiddenException, NotFoundException, + UnauthorizedException { String wsPath = request.getWsPath(); SourceStorageDto sourceStorage = request.getSourceStorage(); - BiConsumer consumer = - (projectName, message) -> { - ImportProgressRecordDto progressRecord = - newDto(ImportProgressRecordDto.class).withProjectName(projectName).withLine(message); - - requestTransmitter - .newRequest() - .endpointId(endpointId) - .methodName(EVENT_IMPORT_OUTPUT_PROGRESS) - .paramsAsDto(progressRecord) - .sendAndSkipResult(); - }; - RegisteredProject registeredProject = - projectManager.doImport(wsPath, sourceStorage, false, consumer); + projectManager.doImport(wsPath, sourceStorage, false, getImportConsumer(endpointId)); + eventService.publish(new ProjectCreatedEvent(wsPath)); ProjectConfigDto projectConfigDto = asDto(registeredProject); ImportResponseDto response = newDto(ImportResponseDto.class); response.setConfig(projectConfigDto); @@ -256,6 +245,46 @@ public class ProjectJsonRpcServiceBackEnd { return response; } + private List createBatchProjectsInternally( + String endpointId, CreateBatchProjectsRequestDto createProjectsRequest) + throws ForbiddenException, BadRequestException, ConflictException, NotFoundException, + ServerException, UnauthorizedException { + + List newProjectConfigs = createProjectsRequest.getNewProjectConfigs(); + projectManager.doImport( + new HashSet<>(newProjectConfigs), + createProjectsRequest.isRewrite(), + getImportConsumer(endpointId)); + + Set registeredProjects = new HashSet<>(newProjectConfigs.size()); + + for (NewProjectConfigDto projectConfig : newProjectConfigs) { + registeredProjects.add(projectManager.update(projectConfig)); + } + + registeredProjects + .stream() + .map(RegisteredProject::getPath) + .map(ProjectCreatedEvent::new) + .forEach(eventService::publish); + + return registeredProjects.stream().map(ProjectDtoConverter::asDto).collect(toList()); + } + + private BiConsumer getImportConsumer(String endpointId) { + return (projectName, message) -> { + ImportProgressRecordDto progressRecord = + newDto(ImportProgressRecordDto.class).withProjectName(projectName).withLine(message); + + requestTransmitter + .newRequest() + .endpointId(endpointId) + .methodName(EVENT_IMPORT_OUTPUT_PROGRESS) + .paramsAsDto(progressRecord) + .sendAndSkipResult(); + }; + } + // TODO temporary solution, further need to make a generalized exception mapper for all json rpc // service private Response perform(