diff --git a/agents/ls-java/pom.xml b/agents/ls-java/pom.xml index 2d451b7124..5bb2d1be48 100644 --- a/agents/ls-java/pom.xml +++ b/agents/ls-java/pom.xml @@ -16,7 +16,7 @@ che-agents-parent org.eclipse.che - 6.1.0-SNAPSHOT + 6.2.0-SNAPSHOT ls-java-agent Language Server Java Agent diff --git a/ide/che-core-ide-ui/src/main/java/org/eclipse/che/ide/ui/window/Window.java b/ide/che-core-ide-ui/src/main/java/org/eclipse/che/ide/ui/window/Window.java index d97f1fa930..23e2fc4a5a 100644 --- a/ide/che-core-ide-ui/src/main/java/org/eclipse/che/ide/ui/window/Window.java +++ b/ide/che-core-ide-ui/src/main/java/org/eclipse/che/ide/ui/window/Window.java @@ -21,13 +21,11 @@ import com.google.gwt.user.client.ui.IsWidget; import com.google.gwt.user.client.ui.Widget; import com.google.gwt.user.client.ui.impl.FocusImpl; import com.google.web.bindery.event.shared.EventBus; -import elemental.js.dom.JsElement; import javax.inject.Inject; import org.eclipse.che.ide.api.keybinding.KeyBindingAgent; import org.eclipse.che.ide.ui.button.ButtonAlignment; import org.eclipse.che.ide.ui.smartTree.KeyboardNavigationHandler; import org.eclipse.che.ide.ui.window.event.WindowOpenedEvent; -import org.vectomatic.dom.svg.ui.SVGResource; /** * Base class to create a window based panel with user defined widgets. In general, window contains @@ -75,10 +73,10 @@ public abstract class Window implements IsWidget { this.keyBinding = keyBinding; } - @Inject - protected void setEventBus(EventBus eventBus) { - this.eventBus = eventBus; - } + @Inject + protected void setEventBus(EventBus eventBus) { + this.eventBus = eventBus; + } // Configuration section @@ -250,6 +248,7 @@ public abstract class Window implements IsWidget { keyBinding.disable(); } + eventBus.fireEvent(new WindowOpenedEvent()); onShow(); windowManager.bringToFront(this); @@ -264,9 +263,7 @@ public abstract class Window implements IsWidget { } /** Perform user actions after widget show. */ - protected void onShow() { - eventBus.fireEvent(new WindowOpenedEvent()); - } + protected void onShow() {} /** Perform user actions after widget hide. */ protected void onHide() {} diff --git a/plugins/plugin-java/che-plugin-java-ext-lang-client/src/main/java/org/eclipse/che/ide/ext/java/client/navigation/filestructure/FileStructurePresenter.java b/plugins/plugin-java/che-plugin-java-ext-lang-client/src/main/java/org/eclipse/che/ide/ext/java/client/navigation/filestructure/FileStructurePresenter.java index b4a4fb9e05..3610b25436 100644 --- a/plugins/plugin-java/che-plugin-java-ext-lang-client/src/main/java/org/eclipse/che/ide/ext/java/client/navigation/filestructure/FileStructurePresenter.java +++ b/plugins/plugin-java/che-plugin-java-ext-lang-client/src/main/java/org/eclipse/che/ide/ext/java/client/navigation/filestructure/FileStructurePresenter.java @@ -18,8 +18,6 @@ import org.eclipse.che.ide.api.editor.texteditor.TextEditor; import org.eclipse.che.ide.api.resources.VirtualFile; import org.eclipse.che.ide.ext.java.client.service.JavaLanguageExtensionServiceClient; import org.eclipse.che.ide.ext.java.dto.DtoClientImpls; -import org.eclipse.che.ide.ui.loaders.request.LoaderFactory; -import org.eclipse.che.ide.ui.loaders.request.MessageLoader; import org.eclipse.che.ide.util.loging.Log; import org.eclipse.che.jdt.ls.extension.api.dto.ExtendedSymbolInformation; import org.eclipse.che.jdt.ls.extension.api.dto.FileStructureCommandParameters; @@ -61,55 +59,33 @@ public class FileStructurePresenter implements ElementSelectionDelegate { - loader.hide(); - view.setInput(result); - view.show(); - }) - .catchError( - e -> { - loader.hide(); - }); - } else { - showInheritedMembers = false; - view.setTitle(editorPartPresenter.getEditorInput().getFile().getName()); - view.setShowInherited(showInheritedMembers); - - if (!(editorPartPresenter instanceof TextEditor)) { - Log.error(getClass(), "Open Declaration support only TextEditor as editor"); - return; - } - activeEditor = ((TextEditor) editorPartPresenter); - VirtualFile file = activeEditor.getEditorInput().getFile(); - javaExtensionService - .fileStructure( - new DtoClientImpls.FileStructureCommandParametersDto( - new FileStructureCommandParameters(dtoHelper.getUri(file), showInheritedMembers))) - .then( - result -> { - loader.hide(); - view.setInput(result); - view.show(); - }) - .catchError( - e -> { - loader.hide(); - Log.error(getClass(), e); - }); + if (!(editorPartPresenter instanceof TextEditor)) { + Log.error(getClass(), "Open Declaration support only TextEditor as editor"); + return; } + + activeEditor = (TextEditor) editorPartPresenter; + view.setShowInherited(showInheritedMembers); + VirtualFile file = activeEditor.getEditorInput().getFile(); + javaExtensionService + .fileStructure( + new DtoClientImpls.FileStructureCommandParametersDto( + new FileStructureCommandParameters(dtoHelper.getUri(file), showInheritedMembers))) + .then( + result -> { + view.setInput(file.getName(), result); + view.show(); + showInheritedMembers = !showInheritedMembers; + }) + .catchError( + e -> { + Log.error(getClass(), e); + }); } @Override public void onSelect(ExtendedSymbolInformation element) { + showInheritedMembers = false; view.hide(); showInheritedMembers = false; openHelper.openLocation(element.getInfo().getLocation()); @@ -117,7 +93,7 @@ public class FileStructurePresenter implements ElementSelectionDelegate delegate; + @Inject - public FileStructureWindow(NodeFactory nodeFactory, JavaLocalizationConstant locale) { - super(false); + public FileStructureWindow( + NodeFactory nodeFactory, + ActionManager actionManager, + PresentationFactory presentationFactor, + KeyBindingAgent keyBindingAgent, + JavaLocalizationConstant locale) { + super(); + this.actionManager = actionManager; + this.presentationFactor = presentationFactor; + this.keyBindingAgent = keyBindingAgent; this.locale = locale; setWidget(UI_BINDER.createAndBindUi(this)); view = new FileStructureView(nodeFactory); @@ -62,25 +86,58 @@ public final class FileStructureWindow extends Window on ? locale.hideInheritedMembersLabel() : locale.showInheritedMembersLabel()); } - public void setInput(List input) { + public void setInput(String title, List input) { + setTitle(title); view.setInput(input); } - /** {@inheritDoc} */ @Override - public void show() { - super.show(view); + protected void onShow() { view.onShow(); } @Override public void setDelegate(ElementSelectionDelegate delegate) { view.setDelegate(delegate); + this.delegate = delegate; } @Override - public void onClose() { + protected void onHide() { view.onClose(); - super.hide(); + delegate.onCancel(); + } + + @Override + public void onKeyPress(NativeEvent evt) { + handleKey(evt); + } + + @Override + public void onEnterPress(NativeEvent evt) { + handleKey(evt); + } + + private void handleKey(NativeEvent event) { + SignalEvent signalEvent = SignalEventUtils.create((Event) event, false); + CharCodeWithModifiers keyBinding = + keyBindingAgent.getKeyBinding(JavaExtension.JAVA_CLASS_STRUCTURE); + if (signalEvent == null || keyBinding == null) { + return; + } + int digest = CharCodeWithModifiers.computeKeyDigest(signalEvent); + if (digest == keyBinding.getKeyDigest()) { + Action action = actionManager.getAction(JavaExtension.JAVA_CLASS_STRUCTURE); + if (action != null) { + ActionEvent e = new ActionEvent(presentationFactor.getPresentation(action), actionManager); + action.update(e); + + if (e.getPresentation().isEnabled()) { + event.preventDefault(); + event.stopPropagation(); + action.actionPerformed(e); + } + } + } } } diff --git a/plugins/plugin-java/che-plugin-java-ext-lang-client/src/main/java/org/eclipse/che/ide/ext/java/client/organizeimports/OrganizeImportsPresenter.java b/plugins/plugin-java/che-plugin-java-ext-lang-client/src/main/java/org/eclipse/che/ide/ext/java/client/organizeimports/OrganizeImportsPresenter.java index 4a5e8df738..4163aef2f6 100644 --- a/plugins/plugin-java/che-plugin-java-ext-lang-client/src/main/java/org/eclipse/che/ide/ext/java/client/organizeimports/OrganizeImportsPresenter.java +++ b/plugins/plugin-java/che-plugin-java-ext-lang-client/src/main/java/org/eclipse/che/ide/ext/java/client/organizeimports/OrganizeImportsPresenter.java @@ -179,7 +179,7 @@ public class OrganizeImportsPresenter implements OrganizeImportsView.ActionDeleg applyWorkspaceEditAction.applyWorkspaceEdit(result.getWorkspaceEdit()); } finally { clientServerEventService.sendFileTrackingResumeEvent(); - view.hide(); + view.close(); } }) .catchError( @@ -190,7 +190,7 @@ public class OrganizeImportsPresenter implements OrganizeImportsView.ActionDeleg notificationManager.notify(title, message, FAIL, FLOAT_MODE); } finally { clientServerEventService.sendFileTrackingResumeEvent(); - view.hide(); + view.close(); } }); }); diff --git a/plugins/plugin-java/che-plugin-java-server/pom.xml b/plugins/plugin-java/che-plugin-java-server/pom.xml index 60f362adc9..5249b5ea6d 100644 --- a/plugins/plugin-java/che-plugin-java-server/pom.xml +++ b/plugins/plugin-java/che-plugin-java-server/pom.xml @@ -16,7 +16,7 @@ che-plugin-java-parent org.eclipse.che.plugin - 6.1.0-SNAPSHOT + 6.2.0-SNAPSHOT che-plugin-java-server Che Plugin :: Java :: Language Server @@ -93,6 +93,10 @@ org.eclipse.che.plugin che-plugin-java-ext-lang-shared + + org.eclipse.che.plugin + che-plugin-java-server + org.eclipse.lsp4j org.eclipse.lsp4j diff --git a/plugins/plugin-java/che-plugin-java-server/src/main/java/org/eclipse/che/plugin/java/languageserver/ProjectsListener.java b/plugins/plugin-java/che-plugin-java-server/src/main/java/org/eclipse/che/plugin/java/languageserver/ProjectsListener.java index e2ad5da037..696bb6a043 100644 --- a/plugins/plugin-java/che-plugin-java-server/src/main/java/org/eclipse/che/plugin/java/languageserver/ProjectsListener.java +++ b/plugins/plugin-java/che-plugin-java-server/src/main/java/org/eclipse/che/plugin/java/languageserver/ProjectsListener.java @@ -13,13 +13,9 @@ package org.eclipse.che.plugin.java.languageserver; import static java.util.Collections.emptyList; import static java.util.Collections.singletonList; import static org.eclipse.che.api.languageserver.service.LanguageServiceUtils.prefixURI; -import static org.eclipse.che.api.languageserver.service.LanguageServiceUtils.removePrefixUri; -import com.google.common.util.concurrent.ThreadFactoryBuilder; import com.google.inject.Inject; import com.google.inject.Singleton; -import java.util.concurrent.ExecutorService; -import java.util.concurrent.Executors; import javax.annotation.PostConstruct; import org.eclipse.che.api.core.notification.EventService; import org.eclipse.che.api.core.notification.EventSubscriber; @@ -27,11 +23,7 @@ import org.eclipse.che.api.project.server.ProjectManager; import org.eclipse.che.api.project.server.notification.PreProjectDeletedEvent; import org.eclipse.che.api.project.server.notification.ProjectCreatedEvent; import org.eclipse.che.api.project.server.notification.ProjectInitializedEvent; -import org.eclipse.che.commons.lang.concurrent.LoggingUncaughtExceptionHandler; -import org.eclipse.che.jdt.ls.extension.api.dto.JobResult; import org.eclipse.che.jdt.ls.extension.api.dto.UpdateWorkspaceParameters; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; /** * Monitors projects activity and updates jdt.ls workspace. @@ -40,31 +32,18 @@ import org.slf4j.LoggerFactory; */ @Singleton public class ProjectsListener { - private static final Logger LOG = LoggerFactory.getLogger(ProjectsListener.class); - - private final JavaLanguageServerExtensionService service; private final EventService eventService; - private final ExecutorService executorService; private final ProjectManager projectManager; - private final ProjectsSynchronizer projectsSynchronizer; + private final WorkspaceSynchronizer workspaceSynchronizer; @Inject public ProjectsListener( - JavaLanguageServerExtensionService service, EventService eventService, ProjectManager projectManager, - ProjectsSynchronizer projectsSynchronizer) { - this.service = service; + WorkspaceSynchronizer workspaceSynchronizer) { this.eventService = eventService; this.projectManager = projectManager; - this.projectsSynchronizer = projectsSynchronizer; - this.executorService = - Executors.newSingleThreadExecutor( - new ThreadFactoryBuilder() - .setNameFormat("WorkspaceUpdater-%d") - .setUncaughtExceptionHandler(LoggingUncaughtExceptionHandler.getInstance()) - .setDaemon(true) - .build()); + this.workspaceSynchronizer = workspaceSynchronizer; } @PostConstruct @@ -102,7 +81,7 @@ public class ProjectsListener { String projectUri = prefixURI(event.getProjectPath()); UpdateWorkspaceParameters params = new UpdateWorkspaceParameters(singletonList(projectUri), emptyList()); - doUpdateWorkspaceAsync(params); + workspaceSynchronizer.syncronizerWorkspaceAsync(params); } private void onPreProjectDeleted(PreProjectDeletedEvent event) { @@ -113,7 +92,7 @@ public class ProjectsListener { String projectUri = prefixURI(event.getProjectPath()); UpdateWorkspaceParameters params = new UpdateWorkspaceParameters(emptyList(), singletonList(projectUri)); - doUpdateWorkspaceAsync(params); + workspaceSynchronizer.syncronizerWorkspaceAsync(params); } private void onProjectInitializedEvent(ProjectInitializedEvent event) { @@ -124,54 +103,10 @@ public class ProjectsListener { String projectUri = prefixURI(event.getProjectPath()); UpdateWorkspaceParameters params = new UpdateWorkspaceParameters(singletonList(projectUri), emptyList()); - doUpdateWorkspaceAsync(params); + workspaceSynchronizer.syncronizerWorkspaceAsync(params); } private boolean isProjectRegistered(String path) { return projectManager.isRegistered(path); } - - private void doUpdateWorkspaceAsync(UpdateWorkspaceParameters updateWorkspaceParameters) { - executorService.submit( - (Runnable) - () -> { - JobResult jobResult = service.updateWorkspace(updateWorkspaceParameters); - - updateWorkspaceParameters - .getAddedProjectsUri() - .forEach( - projectUri -> { - String projectPath = removePrefixUri(projectUri); - projectsSynchronizer.synchronize(projectPath); - }); - - switch (jobResult.getSeverity()) { - case ERROR: - LOG.error( - "Workspace updated. Result code: '{}', message: '{}'. Added projects: '{}', removed projects: '{}'", - jobResult.getResultCode(), - jobResult.getMessage(), - updateWorkspaceParameters.getAddedProjectsUri().toString(), - updateWorkspaceParameters.getRemovedProjectsUri().toString()); - break; - case WARNING: - case CANCEL: - LOG.warn( - "Workspace updated. Result code: '{}', message: '{}'. Added projects: '{}', removed projects: '{}'", - jobResult.getResultCode(), - jobResult.getMessage(), - updateWorkspaceParameters.getAddedProjectsUri().toString(), - updateWorkspaceParameters.getRemovedProjectsUri().toString()); - break; - default: - LOG.info( - "Workspace updated. Result code: '{}', message: '{}'. Added projects: '{}', removed projects: '{}'", - jobResult.getResultCode(), - jobResult.getMessage(), - updateWorkspaceParameters.getAddedProjectsUri().toString(), - updateWorkspaceParameters.getRemovedProjectsUri().toString()); - break; - } - }); - } } diff --git a/plugins/plugin-java/che-plugin-java-server/src/main/java/org/eclipse/che/plugin/java/languageserver/WorkspaceSynchronizer.java b/plugins/plugin-java/che-plugin-java-server/src/main/java/org/eclipse/che/plugin/java/languageserver/WorkspaceSynchronizer.java new file mode 100644 index 0000000000..bdc452c628 --- /dev/null +++ b/plugins/plugin-java/che-plugin-java-server/src/main/java/org/eclipse/che/plugin/java/languageserver/WorkspaceSynchronizer.java @@ -0,0 +1,89 @@ +/* + * 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.plugin.java.languageserver; + +import com.google.common.util.concurrent.ThreadFactoryBuilder; +import com.google.inject.Inject; +import com.google.inject.Singleton; +import java.util.concurrent.ExecutorService; +import java.util.concurrent.Executors; +import org.eclipse.che.commons.lang.concurrent.LoggingUncaughtExceptionHandler; +import org.eclipse.che.jdt.ls.extension.api.dto.JobResult; +import org.eclipse.che.jdt.ls.extension.api.dto.UpdateWorkspaceParameters; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +/** + * Monitors projects activity and updates jdt.ls workspace. + * + * @author Anatolii Bazko + */ +@Singleton +public class WorkspaceSynchronizer { + private static final Logger LOG = LoggerFactory.getLogger(WorkspaceSynchronizer.class); + + private final JavaLanguageServerExtensionService service; + private final ExecutorService executorService; + private final ProjectsSynchronizer projectsSynchronizer; + + @Inject + public WorkspaceSynchronizer( + JavaLanguageServerExtensionService service, ProjectsSynchronizer projectsSynchronizer) { + this.service = service; + this.projectsSynchronizer = projectsSynchronizer; + this.executorService = + Executors.newSingleThreadExecutor( + new ThreadFactoryBuilder() + .setNameFormat("WorkspaceUpdater-%d") + .setUncaughtExceptionHandler(LoggingUncaughtExceptionHandler.getInstance()) + .setDaemon(true) + .build()); + } + + public void syncronizerWorkspaceAsync(UpdateWorkspaceParameters updateWorkspaceParameters) { + executorService.submit( + () -> { + JobResult jobResult = service.updateWorkspace(updateWorkspaceParameters); + + switch (jobResult.getSeverity()) { + case ERROR: + LOG.error( + "Workspace updated. Result code: '{}', message: '{}'. Added projects: '{}', removed projects: '{}'", + jobResult.getResultCode(), + jobResult.getMessage(), + updateWorkspaceParameters.getAddedProjectsUri().toString(), + updateWorkspaceParameters.getRemovedProjectsUri().toString()); + break; + case WARNING: + case CANCEL: + LOG.warn( + "Workspace updated. Result code: '{}', message: '{}'. Added projects: '{}', removed projects: '{}'", + jobResult.getResultCode(), + jobResult.getMessage(), + updateWorkspaceParameters.getAddedProjectsUri().toString(), + updateWorkspaceParameters.getRemovedProjectsUri().toString()); + break; + default: + LOG.info( + "Workspace updated. Result code: '{}', message: '{}'. Added projects: '{}', removed projects: '{}'", + jobResult.getResultCode(), + jobResult.getMessage(), + updateWorkspaceParameters.getAddedProjectsUri().toString(), + updateWorkspaceParameters.getRemovedProjectsUri().toString()); + break; + } + + updateWorkspaceParameters + .getAddedProjectsUri() + .forEach(projectsSynchronizer::synchronize); + }); + } +} diff --git a/plugins/plugin-languageserver/che-plugin-languageserver-ide/src/main/java/org/eclipse/che/plugin/languageserver/ide/filestructure/FileStructureTree.java b/plugins/plugin-languageserver/che-plugin-languageserver-ide/src/main/java/org/eclipse/che/plugin/languageserver/ide/filestructure/FileStructureTree.java index a4dc5dea5e..7a699f7686 100644 --- a/plugins/plugin-languageserver/che-plugin-languageserver-ide/src/main/java/org/eclipse/che/plugin/languageserver/ide/filestructure/FileStructureTree.java +++ b/plugins/plugin-languageserver/che-plugin-languageserver-ide/src/main/java/org/eclipse/che/plugin/languageserver/ide/filestructure/FileStructureTree.java @@ -12,6 +12,7 @@ package org.eclipse.che.plugin.languageserver.ide.filestructure; import com.google.gwt.dom.client.Element; import com.google.gwt.user.client.Event; +import elemental.events.KeyboardEvent; import org.eclipse.che.ide.ui.smartTree.NodeDescriptor; import org.eclipse.che.ide.ui.smartTree.NodeLoader; import org.eclipse.che.ide.ui.smartTree.NodeStorage; @@ -35,6 +36,11 @@ public class FileStructureTree extends Tree { onDoubleClick(event); break; default: + if (event instanceof KeyboardEvent && event.getKeyCode() == KeyboardEvent.KeyCode.ENTER) { + event.preventDefault(); + event.stopPropagation(); + } + super.onBrowserEvent(event); } } diff --git a/plugins/plugin-languageserver/che-plugin-languageserver-ide/src/main/java/org/eclipse/che/plugin/languageserver/ide/filestructure/FileStructureView.java b/plugins/plugin-languageserver/che-plugin-languageserver-ide/src/main/java/org/eclipse/che/plugin/languageserver/ide/filestructure/FileStructureView.java index 49cdd7faca..e36f55af4c 100644 --- a/plugins/plugin-languageserver/che-plugin-languageserver-ide/src/main/java/org/eclipse/che/plugin/languageserver/ide/filestructure/FileStructureView.java +++ b/plugins/plugin-languageserver/che-plugin-languageserver-ide/src/main/java/org/eclipse/che/plugin/languageserver/ide/filestructure/FileStructureView.java @@ -60,7 +60,6 @@ public final class FileStructureView } public void setInput(List input) { - tree.getNodeStorage().clear(); for (ExtendedSymbolInformation symbol : input) { tree.getNodeStorage().add(nodeFactory.create(delegate, symbol)); @@ -72,6 +71,7 @@ public final class FileStructureView } public void onShow() { + tree.setFocus(true); if (!tree.getRootNodes().isEmpty()) { tree.getSelectionModel().select(tree.getRootNodes().get(0), false); } diff --git a/plugins/plugin-maven/che-plugin-maven-server/pom.xml b/plugins/plugin-maven/che-plugin-maven-server/pom.xml index 2427df3f91..d138e62769 100644 --- a/plugins/plugin-maven/che-plugin-maven-server/pom.xml +++ b/plugins/plugin-maven/che-plugin-maven-server/pom.xml @@ -97,6 +97,11 @@ + + org.eclipse.che.ls.jdt + jdt.ls.extension.api + ${che.ls.jdt.version} + org.eclipse.che.plugin che-plugin-java-ext-lang-shared @@ -105,6 +110,10 @@ org.eclipse.che.plugin che-plugin-java-maven-tools + + org.eclipse.che.plugin + che-plugin-java-server + org.eclipse.che.plugin che-plugin-maven-generator-archetype diff --git a/plugins/plugin-maven/che-plugin-maven-server/src/main/java/org/eclipse/che/plugin/maven/server/projecttype/handler/MavenProjectInitHandler.java b/plugins/plugin-maven/che-plugin-maven-server/src/main/java/org/eclipse/che/plugin/maven/server/projecttype/handler/MavenProjectInitHandler.java index 571411b0fc..09d3365fba 100644 --- a/plugins/plugin-maven/che-plugin-maven-server/src/main/java/org/eclipse/che/plugin/maven/server/projecttype/handler/MavenProjectInitHandler.java +++ b/plugins/plugin-maven/che-plugin-maven-server/src/main/java/org/eclipse/che/plugin/maven/server/projecttype/handler/MavenProjectInitHandler.java @@ -11,18 +11,31 @@ */ package org.eclipse.che.plugin.maven.server.projecttype.handler; +import static org.eclipse.che.api.languageserver.service.LanguageServiceUtils.prefixURI; import static org.eclipse.che.plugin.maven.shared.MavenAttributes.MAVEN_ID; +import com.google.inject.Inject; import com.google.inject.Singleton; +import java.util.Collections; import org.eclipse.che.api.core.ConflictException; import org.eclipse.che.api.core.ForbiddenException; import org.eclipse.che.api.core.NotFoundException; import org.eclipse.che.api.core.ServerException; import org.eclipse.che.api.project.server.handlers.ProjectInitHandler; +import org.eclipse.che.jdt.ls.extension.api.dto.UpdateWorkspaceParameters; +import org.eclipse.che.plugin.java.languageserver.WorkspaceSynchronizer; /** @author Vitaly Parfonov */ @Singleton public class MavenProjectInitHandler implements ProjectInitHandler { + + private final WorkspaceSynchronizer workspaceSynchronizer; + + @Inject + public MavenProjectInitHandler(WorkspaceSynchronizer workspaceSynchronizer) { + this.workspaceSynchronizer = workspaceSynchronizer; + } + @Override public String getProjectType() { return MAVEN_ID; @@ -30,5 +43,11 @@ public class MavenProjectInitHandler implements ProjectInitHandler { @Override public void onProjectInitialized(String projectFolder) - throws ServerException, ForbiddenException, ConflictException, NotFoundException {} + throws ServerException, ForbiddenException, ConflictException, NotFoundException { + + UpdateWorkspaceParameters params = new UpdateWorkspaceParameters(); + params.setAddedProjectsUri(Collections.singletonList(prefixURI(projectFolder))); + + workspaceSynchronizer.syncronizerWorkspaceAsync(params); + } }