/******************************************************************************* * Copyright (c) 2012-2016 Codenvy, S.A. * 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: * Codenvy, S.A. - initial API and implementation *******************************************************************************/ package org.eclipse.che.ide.ext.java.client.search; import com.google.gwt.json.client.JSONParser; import com.google.gwt.user.client.ui.AcceptsOneWidget; import com.google.gwt.user.client.ui.IsWidget; import com.google.inject.Inject; import com.google.inject.Singleton; import org.eclipse.che.api.promises.client.Operation; import org.eclipse.che.api.promises.client.OperationException; import org.eclipse.che.api.promises.client.Promise; import org.eclipse.che.api.promises.client.PromiseError; import org.eclipse.che.ide.Resources; import org.eclipse.che.ide.api.notification.NotificationManager; import org.eclipse.che.ide.api.parts.PartStackType; import org.eclipse.che.ide.api.parts.WorkspaceAgent; import org.eclipse.che.ide.api.parts.base.BasePresenter; import org.eclipse.che.ide.api.project.tree.VirtualFile; import org.eclipse.che.ide.commons.exception.ServerException; import org.eclipse.che.ide.dto.DtoFactory; import org.eclipse.che.ide.ext.java.client.JavaLocalizationConstant; import org.eclipse.che.ide.ext.java.client.projecttree.JavaSourceFolderUtil; import org.eclipse.che.ide.ext.java.shared.dto.search.FindUsagesRequest; import org.eclipse.che.ide.ext.java.shared.dto.search.FindUsagesResponse; import org.eclipse.che.ide.jseditor.client.texteditor.TextEditor; import org.eclipse.che.ide.rest.HTTPStatus; import org.eclipse.che.ide.util.loging.Log; import org.vectomatic.dom.svg.ui.SVGResource; import static org.eclipse.che.ide.api.notification.StatusNotification.Status.FAIL; /** * Presenter for Find Usages tree * * @author Evgen Vidolob */ @Singleton public class FindUsagesPresenter extends BasePresenter implements FindUsagesView.ActionDelegate { private WorkspaceAgent workspaceAgent; private JavaLocalizationConstant localizationConstant; private FindUsagesView view; private JavaSearchService searchService; private DtoFactory dtoFactory; private NotificationManager manager; private final Resources resources; @Inject public FindUsagesPresenter(WorkspaceAgent workspaceAgent, JavaLocalizationConstant localizationConstant, FindUsagesView view, JavaSearchService searchService, DtoFactory dtoFactory, NotificationManager manager, Resources resources) { this.workspaceAgent = workspaceAgent; this.localizationConstant = localizationConstant; this.view = view; this.searchService = searchService; this.dtoFactory = dtoFactory; this.manager = manager; this.resources = resources; view.setDelegate(this); } @Override public String getTitle() { return localizationConstant.findUsagesPartTitle(); } @Override public void setVisible(boolean visible) { view.setVisible(visible); } @Override public IsWidget getView() { return view; } @Override public String getTitleToolTip() { return localizationConstant.findUsagesPartTitleTooltip(); } @Override public SVGResource getTitleSVGImage() { return resources.find(); } @Override public void go(AcceptsOneWidget container) { container.setWidget(view); } public void findUsages(TextEditor activeEditor) { VirtualFile virtualFile = activeEditor.getEditorInput().getFile(); String projectPath = virtualFile.getProject().getProjectConfig().getPath(); FindUsagesRequest request = dtoFactory.createDto(FindUsagesRequest.class); request.setFQN(JavaSourceFolderUtil.getFQNForFile(virtualFile)); request.setProjectPath(projectPath); request.setOffset(activeEditor.getCursorOffset()); Promise<FindUsagesResponse> promise = searchService.findUsages(request); promise.then(new Operation<FindUsagesResponse>() { @Override public void apply(FindUsagesResponse arg) throws OperationException { handleResponse(arg); } }).catchError(new Operation<PromiseError>() { @Override public void apply(PromiseError arg) throws OperationException { Throwable cause = arg.getCause(); if (cause instanceof ServerException) { handleError(((ServerException)cause).getHTTPStatus(), cause.getMessage()); return; } //in case websocket request if (cause instanceof org.eclipse.che.ide.websocket.rest.exceptions.ServerException) { handleError(((org.eclipse.che.ide.websocket.rest.exceptions.ServerException)cause).getHTTPStatus(), cause.getMessage()); return; } Log.error(getClass(), arg); manager.notify(localizationConstant.failedToProcessFindUsage(), arg.getMessage(), FAIL, true); } }); } private void handleError(int statusCode, String message) { if (statusCode == HTTPStatus.BAD_REQUEST) { manager.notify(localizationConstant.failedToProcessFindUsage(), JSONParser.parseLenient(message).isObject().get("message").isString().stringValue(), FAIL, true); } else { manager.notify(localizationConstant.failedToProcessFindUsage(), message, FAIL, true); } } private void handleResponse(FindUsagesResponse response) { workspaceAgent.openPart(this, PartStackType.INFORMATION); workspaceAgent.setActivePart(this); view.showUsages(response); } }