org.eclipse.che.ide.navigation.NavigateToFilePresenter.java Source code

Java tutorial

Introduction

Here is the source code for org.eclipse.che.ide.navigation.NavigateToFilePresenter.java

Source

/*******************************************************************************
 * 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.navigation;

import com.google.gwt.http.client.URL;
import com.google.gwt.user.client.rpc.AsyncCallback;
import com.google.inject.Inject;
import com.google.inject.Singleton;
import com.google.web.bindery.event.shared.EventBus;

import org.eclipse.che.api.core.rest.shared.dto.ServiceError;
import org.eclipse.che.ide.api.machine.events.WsAgentStateEvent;
import org.eclipse.che.ide.api.machine.events.WsAgentStateHandler;
import org.eclipse.che.api.project.shared.dto.ItemReference;
import org.eclipse.che.api.promises.client.Operation;
import org.eclipse.che.api.promises.client.OperationException;
import org.eclipse.che.ide.api.project.node.HasStorablePath;
import org.eclipse.che.ide.api.project.node.Node;
import org.eclipse.che.ide.dto.DtoFactory;
import org.eclipse.che.ide.part.explorer.project.ProjectExplorerPresenter;
import org.eclipse.che.ide.project.node.FileReferenceNode;
import org.eclipse.che.ide.rest.DtoUnmarshallerFactory;
import org.eclipse.che.ide.websocket.Message;
import org.eclipse.che.ide.websocket.MessageBuilder;
import org.eclipse.che.ide.websocket.MessageBus;
import org.eclipse.che.ide.websocket.MessageBusProvider;
import org.eclipse.che.ide.websocket.WebSocketException;
import org.eclipse.che.ide.websocket.rest.RequestCallback;
import org.eclipse.che.ide.websocket.rest.Unmarshallable;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import static com.google.gwt.http.client.RequestBuilder.GET;
import static org.eclipse.che.ide.MimeType.APPLICATION_JSON;
import static org.eclipse.che.ide.rest.HTTPHeader.ACCEPT;

/**
 * Presenter for file navigation (find file by name and open it).
 *
 * @author Ann Shumilova
 * @author Artem Zatsarynnyi
 */
@Singleton
public class NavigateToFilePresenter implements NavigateToFileView.ActionDelegate, WsAgentStateHandler {

    private final ProjectExplorerPresenter projectExplorer;
    private final MessageBusProvider messageBusProvider;
    private final DtoUnmarshallerFactory dtoUnmarshallerFactory;
    private final NavigateToFileView view;
    private final DtoFactory dtoFactory;

    private Map<String, ItemReference> resultMap;
    private String SEARCH_URL;
    private MessageBus wsMessageBus;

    @Inject
    public NavigateToFilePresenter(NavigateToFileView view, EventBus eventBus,
            DtoUnmarshallerFactory dtoUnmarshallerFactory, ProjectExplorerPresenter projectExplorer,
            MessageBusProvider messageBusProvider, DtoFactory dtoFactory) {
        this.view = view;
        this.dtoFactory = dtoFactory;
        this.dtoUnmarshallerFactory = dtoUnmarshallerFactory;
        this.projectExplorer = projectExplorer;
        this.messageBusProvider = messageBusProvider;

        this.view.setDelegate(this);

        resultMap = new HashMap<>();
        eventBus.addHandler(WsAgentStateEvent.TYPE, this);
    }

    @Override
    public void onWsAgentStarted(WsAgentStateEvent event) {
        wsMessageBus = messageBusProvider.getMachineMessageBus();
        SEARCH_URL = "/project/search";
    }

    @Override
    public void onWsAgentStopped(WsAgentStateEvent event) {
    }

    /** Show dialog with view for navigation. */
    public void showDialog() {
        view.showDialog();
        view.clearInput();
    }

    @Override
    public void onRequestSuggestions(String query, final AsyncCallback<List<ItemReference>> callback) {
        resultMap = new HashMap<>();

        // add '*' to allow search files by first letters
        search(query + "*", new AsyncCallback<List<ItemReference>>() {
            @Override
            public void onSuccess(List<ItemReference> result) {
                for (ItemReference item : result) {
                    final String path = item.getPath();
                    // skip hidden items
                    if (!isItemHidden(path)) {
                        resultMap.put(path, item);
                    }
                }
                List itemReference = new ArrayList<>(resultMap.values());
                callback.onSuccess(itemReference);
            }

            @Override
            public void onFailure(Throwable caught) {
                callback.onFailure(caught);
            }
        });
    }

    @Override
    public void onFileSelected() {
        view.close();
        final ItemReference selectedItem = resultMap.get(view.getItemPath());

        projectExplorer.getNodeByPath(new HasStorablePath.StorablePath(selectedItem.getPath()))
                .then(new Operation<Node>() {
                    @Override
                    public void apply(Node node) throws OperationException {
                        projectExplorer.select(node, false);
                        projectExplorer.scrollToNode(node);

                        if (node instanceof FileReferenceNode) {
                            ((FileReferenceNode) node).actionPerformed();
                        }
                    }
                });
    }

    private void search(String fileName, final AsyncCallback<List<ItemReference>> callback) {
        final String url = SEARCH_URL + "/?name=" + URL.encodePathSegment(fileName);
        final Message message = new MessageBuilder(GET, url).header(ACCEPT, APPLICATION_JSON).build();
        final Unmarshallable<List<ItemReference>> unmarshaller = dtoUnmarshallerFactory
                .newWSListUnmarshaller(ItemReference.class);
        try {
            wsMessageBus.send(message, new RequestCallback<List<ItemReference>>(unmarshaller) {
                @Override
                protected void onSuccess(List<ItemReference> result) {
                    callback.onSuccess(result);
                }

                @Override
                protected void onFailure(Throwable exception) {
                    final String message = dtoFactory.createDtoFromJson(exception.getMessage(), ServiceError.class)
                            .getMessage();
                    callback.onFailure(new Exception(message));
                }
            });
        } catch (WebSocketException e) {
            callback.onFailure(e);
        }
    }

    private boolean isItemHidden(String path) {
        return path.contains("/.");
    }
}