Fix after rebasing master branch

Signed-off-by: Anatoliy Bazko <abazko@redhat.com>
6.19.x
Anatoliy Bazko 2018-02-21 11:05:44 +02:00 committed by Thomas Mäder
parent 5fd609831d
commit 0e98bda4a0
12 changed files with 233 additions and 141 deletions

View File

@ -16,7 +16,7 @@
<parent>
<artifactId>che-agents-parent</artifactId>
<groupId>org.eclipse.che</groupId>
<version>6.1.0-SNAPSHOT</version>
<version>6.2.0-SNAPSHOT</version>
</parent>
<artifactId>ls-java-agent</artifactId>
<name>Language Server Java Agent</name>

View File

@ -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() {}

View File

@ -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<Extended
* @param editorPartPresenter the active editor
*/
public void show(EditorPartPresenter editorPartPresenter) {
if (view.isShowing()) {
showInheritedMembers = !showInheritedMembers;
view.setShowInherited(showInheritedMembers);
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();
});
} 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<Extended
@Override
public void onCancel() {
view.hide();
showInheritedMembers = false;
activeEditor.setFocus();
}
}

View File

@ -11,6 +11,7 @@
package org.eclipse.che.ide.ext.java.client.navigation.filestructure;
import com.google.gwt.core.client.GWT;
import com.google.gwt.dom.client.NativeEvent;
import com.google.gwt.uibinder.client.UiBinder;
import com.google.gwt.uibinder.client.UiField;
import com.google.gwt.user.client.ui.DockLayoutPanel;
@ -18,10 +19,20 @@ import com.google.gwt.user.client.ui.Label;
import com.google.gwt.user.client.ui.Widget;
import com.google.inject.Inject;
import com.google.inject.Singleton;
import elemental.events.Event;
import java.util.List;
import org.eclipse.che.ide.api.action.Action;
import org.eclipse.che.ide.api.action.ActionEvent;
import org.eclipse.che.ide.api.action.ActionManager;
import org.eclipse.che.ide.api.keybinding.KeyBindingAgent;
import org.eclipse.che.ide.api.mvp.View;
import org.eclipse.che.ide.ext.java.client.JavaExtension;
import org.eclipse.che.ide.ext.java.client.JavaLocalizationConstant;
import org.eclipse.che.ide.ui.toolbar.PresentationFactory;
import org.eclipse.che.ide.ui.window.Window;
import org.eclipse.che.ide.util.input.CharCodeWithModifiers;
import org.eclipse.che.ide.util.input.SignalEvent;
import org.eclipse.che.ide.util.input.SignalEventUtils;
import org.eclipse.che.jdt.ls.extension.api.dto.ExtendedSymbolInformation;
import org.eclipse.che.plugin.languageserver.ide.filestructure.ElementSelectionDelegate;
import org.eclipse.che.plugin.languageserver.ide.filestructure.FileStructureView;
@ -40,6 +51,9 @@ public final class FileStructureWindow extends Window
private static FileStructureWindowUiBinder UI_BINDER =
GWT.create(FileStructureWindowUiBinder.class);
private final FileStructureView view;
private final ActionManager actionManager;
private final PresentationFactory presentationFactor;
private final KeyBindingAgent keyBindingAgent;
@UiField DockLayoutPanel treeContainer;
@UiField Label showInheritedLabel;
@ -47,9 +61,19 @@ public final class FileStructureWindow extends Window
@UiField(provided = true)
final JavaLocalizationConstant locale;
private ElementSelectionDelegate<ExtendedSymbolInformation> 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<ExtendedSymbolInformation> input) {
public void setInput(String title, List<ExtendedSymbolInformation> input) {
setTitle(title);
view.setInput(input);
}
/** {@inheritDoc} */
@Override
public void show() {
super.show(view);
protected void onShow() {
view.onShow();
}
@Override
public void setDelegate(ElementSelectionDelegate<ExtendedSymbolInformation> 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);
}
}
}
}
}

View File

@ -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();
}
});
});

View File

@ -16,7 +16,7 @@
<parent>
<artifactId>che-plugin-java-parent</artifactId>
<groupId>org.eclipse.che.plugin</groupId>
<version>6.1.0-SNAPSHOT</version>
<version>6.2.0-SNAPSHOT</version>
</parent>
<artifactId>che-plugin-java-server</artifactId>
<name>Che Plugin :: Java :: Language Server</name>
@ -93,6 +93,10 @@
<groupId>org.eclipse.che.plugin</groupId>
<artifactId>che-plugin-java-ext-lang-shared</artifactId>
</dependency>
<dependency>
<groupId>org.eclipse.che.plugin</groupId>
<artifactId>che-plugin-java-server</artifactId>
</dependency>
<dependency>
<groupId>org.eclipse.lsp4j</groupId>
<artifactId>org.eclipse.lsp4j</artifactId>

View File

@ -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;
}
});
}
}

View File

@ -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);
});
}
}

View File

@ -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);
}
}

View File

@ -60,7 +60,6 @@ public final class FileStructureView
}
public void setInput(List<ExtendedSymbolInformation> 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);
}

View File

@ -97,6 +97,11 @@
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.eclipse.che.ls.jdt</groupId>
<artifactId>jdt.ls.extension.api</artifactId>
<version>${che.ls.jdt.version}</version>
</dependency>
<dependency>
<groupId>org.eclipse.che.plugin</groupId>
<artifactId>che-plugin-java-ext-lang-shared</artifactId>
@ -105,6 +110,10 @@
<groupId>org.eclipse.che.plugin</groupId>
<artifactId>che-plugin-java-maven-tools</artifactId>
</dependency>
<dependency>
<groupId>org.eclipse.che.plugin</groupId>
<artifactId>che-plugin-java-server</artifactId>
</dependency>
<dependency>
<groupId>org.eclipse.che.plugin</groupId>
<artifactId>che-plugin-maven-generator-archetype</artifactId>

View File

@ -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);
}
}