Skip to content

Commit

Permalink
Add sorting
Browse files Browse the repository at this point in the history
Signed-off-by: Vitalii Parfonov <vparfonov@redhat.com>
  • Loading branch information
vparfonov committed Dec 20, 2017
1 parent 3e5dd4b commit a6bcb89
Show file tree
Hide file tree
Showing 12 changed files with 128 additions and 161 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,8 @@
*/
package org.eclipse.che.ide.filetypes;

import static org.eclipse.che.ide.util.NameUtils.getFileExtension;

import com.google.common.base.Strings;
import com.google.gwt.regexp.shared.RegExp;
import com.google.inject.Inject;
Expand Down Expand Up @@ -84,13 +86,4 @@ public FileType getFileTypeByNamePattern(String name) {

return unknownFileType;
}

private String getFileExtension(String name) {
final int lastDotPosition = name.lastIndexOf('.');
// name has no extension
if (lastDotPosition < 0) {
return "";
}
return name.substring(lastDotPosition + 1);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -11,9 +11,12 @@
package org.eclipse.che.ide.navigation;

import static java.util.Collections.emptyList;
import static java.util.Collections.sort;
import static org.eclipse.che.ide.api.jsonrpc.Constants.WS_AGENT_JSON_RPC_ENDPOINT_ID;
import static org.eclipse.che.ide.util.NameUtils.getFileExtension;

import com.google.common.base.Optional;
import com.google.gwt.http.client.URL;
import com.google.inject.Inject;
import com.google.inject.Singleton;
import org.eclipse.che.api.core.jsonrpc.commons.RequestTransmitter;
Expand All @@ -23,16 +26,11 @@
import org.eclipse.che.api.promises.client.OperationException;
import org.eclipse.che.ide.api.app.AppContext;
import org.eclipse.che.ide.api.editor.EditorAgent;
import org.eclipse.che.ide.api.filetypes.FileType;
import org.eclipse.che.ide.api.filetypes.FileTypeRegistry;
import org.eclipse.che.ide.api.resources.File;
import org.eclipse.che.ide.dto.DtoFactory;
import org.eclipse.che.ide.resource.Path;
import org.eclipse.che.ide.util.loging.Log;

import java.util.List;
import java.util.function.Consumer;

/**
* Presenter for file navigation (find file by name and open it).
*
Expand All @@ -45,36 +43,24 @@ public class NavigateToFilePresenter implements NavigateToFileView.ActionDelegat

private final EditorAgent editorAgent;
private final RequestTransmitter requestTransmitter;
private final FileTypeRegistry fileTypeRegistry;
private final DtoFactory dtoFactory;
private final NavigateToFileView view;
private final AppContext appContext;
private String pattern;

@Inject
public NavigateToFilePresenter(
NavigateToFileView view,
AppContext appContext,
EditorAgent editorAgent,
RequestTransmitter requestTransmitter,
FileTypeRegistry fileTypeRegistry,
DtoFactory dtoFactory) {
this.view = view;
this.appContext = appContext;
this.editorAgent = editorAgent;
this.requestTransmitter = requestTransmitter;
this.fileTypeRegistry = fileTypeRegistry;
this.dtoFactory = dtoFactory;

this.view.setDelegate(this);

List<FileType> registeredFileTypes = fileTypeRegistry.getRegisteredFileTypes();
registeredFileTypes.forEach(new Consumer<FileType>() {
@Override
public void accept(FileType fileType) {
pattern = pattern + "|" + fileType.getExtension();
}
});
}

/** Show dialog with view for navigation. */
Expand Down Expand Up @@ -111,18 +97,27 @@ public void onFileNameChanged(String fileName) {
dtoFactory
.createDto(ProjectSearchRequestDto.class)
.withPath("")
.withName(".*.(" + pattern + ")");

Log.info(getClass(), ">>>> " + requestParams.getName());
.withName(URL.encodePathSegment(fileName + "*"));

requestTransmitter
.newRequest()
.endpointId(WS_AGENT_JSON_RPC_ENDPOINT_ID)
.methodName("project/search")
.paramsAsDto(requestParams)
.sendAndReceiveResultAsDto(ProjectSearchResponseDto.class, 20_000)
.onSuccess(response -> view.showItems(response.getItemReferences()))
.onSuccess(response -> prepareResults(response))
.onFailure(error -> Log.error(getClass(), error.getMessage()))
.onTimeout(() -> Log.error(getClass(), "Project search request failed due timeout"));
}

private void prepareResults(ProjectSearchResponseDto response) {
sort(
response.getItemReferences(),
(o1, o2) -> {
String ext1 = getFileExtension(o1.getItemReference().getName());
String ext2 = getFileExtension(o2.getItemReference().getName());
return ext1.compareToIgnoreCase(ext2);
});
view.showItems(response.getItemReferences());
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,6 @@
import org.eclipse.che.api.promises.client.Promise;
import org.eclipse.che.ide.api.app.AppContext;
import org.eclipse.che.ide.api.editor.EditorAgent;
import org.eclipse.che.ide.api.filetypes.FileTypeRegistry;
import org.eclipse.che.ide.api.resources.Container;
import org.eclipse.che.ide.api.resources.File;
import org.eclipse.che.ide.dto.DtoFactory;
Expand Down Expand Up @@ -50,7 +49,6 @@ public class NavigateToFilePresenterTest {
@Mock private Promise<Optional<File>> optFilePromise;
@Mock private AppContext appContext;
@Mock private EditorAgent editorAgent;
@Mock private FileTypeRegistry fileTypeRegistry;
@Mock private DtoFactory dtoFactory;
@Mock private RequestTransmitter requestTransmitter;

Expand All @@ -62,7 +60,7 @@ public void setUp() {
when(container.getFile(any(Path.class))).thenReturn(optFilePromise);

presenter =
new NavigateToFilePresenter(view, appContext, editorAgent, requestTransmitter, fileTypeRegistry, dtoFactory);
new NavigateToFilePresenter(view, appContext, editorAgent, requestTransmitter, dtoFactory);
}

@Test
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -54,4 +54,13 @@ public static boolean checkFolderName(String name) {
public static boolean checkProjectName(String name) {
return PROJECT_NAME.test(name);
}

public static String getFileExtension(String name) {
final int lastDotPosition = name.lastIndexOf('.');
// name has no extension
if (lastDotPosition < 0) {
return "";
}
return name.substring(lastDotPosition + 1);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -55,6 +55,13 @@ public void invalidFolderNamesShouldNotGetValidated(String invalidFolderName) {
NameUtils.checkFileName(invalidFolderName));
}

@Test
public void getFileExtension() {
assertEquals("txt", NameUtils.getFileExtension("123.txt"));
assertEquals("", NameUtils.getFileExtension("123"));
assertEquals("zz", NameUtils.getFileExtension("123.txt.zz"));
}

@DataProvider(name = "ValidFilenames")
public Object[][] getValidFilenames() {
return toDataProviderData(VALID_FILENAMES);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -33,6 +33,10 @@
<groupId>javax.ws.rs</groupId>
<artifactId>javax.ws.rs-api</artifactId>
</dependency>
<dependency>
<groupId>org.apache.tika</groupId>
<artifactId>tika-core</artifactId>
</dependency>
<dependency>
<groupId>org.eclipse.birt.runtime</groupId>
<artifactId>org.eclipse.equinox.common</artifactId>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,9 @@

import com.google.inject.Inject;
import com.google.inject.Singleton;
import org.apache.tika.mime.MediaType;
import org.eclipse.che.api.project.server.type.ProjectTypeDef;
import org.eclipse.che.api.search.server.excludes.MediaTypesExcludeMatcher;

/**
* Project type for plain java projects.
Expand All @@ -29,7 +31,9 @@
@Singleton
public class PlainJavaProjectType extends ProjectTypeDef {
@Inject
public PlainJavaProjectType(PlainJavaValueProviderFactory valueProviderFactory) {
public PlainJavaProjectType(
PlainJavaValueProviderFactory valueProviderFactory,
MediaTypesExcludeMatcher mediaTypesExcludeMatcher) {
super(JAVAC, JAVAC_PROJECT_NAME, true, false, true);

setValueProviderFactory(SOURCE_FOLDER, valueProviderFactory);
Expand All @@ -38,5 +42,8 @@ public PlainJavaProjectType(PlainJavaValueProviderFactory valueProviderFactory)
addVariableDefinition(LIBRARY_FOLDER, "java library folder", false);

addParent(JAVA_ID);

mediaTypesExcludeMatcher.addExcludedMediaType(new MediaType("application", "java-vm"));
mediaTypesExcludeMatcher.addExcludedMediaType(new MediaType("application", "java-archive"));
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,8 @@
import com.google.inject.AbstractModule;
import com.google.inject.Singleton;
import com.google.inject.multibindings.Multibinder;
import com.google.inject.name.Names;
import java.nio.file.PathMatcher;
import java.util.Collections;
import org.eclipse.che.api.languageserver.launcher.LanguageServerLauncher;
import org.eclipse.che.api.languageserver.shared.model.LanguageDescription;
Expand All @@ -32,6 +34,7 @@
import org.eclipse.che.plugin.maven.server.core.MavenTerminalImpl;
import org.eclipse.che.plugin.maven.server.core.project.PomChangeListener;
import org.eclipse.che.plugin.maven.server.projecttype.MavenProjectType;
import org.eclipse.che.plugin.maven.server.projecttype.MavenTargetExcludeMatcher;
import org.eclipse.che.plugin.maven.server.projecttype.MavenValueProviderFactory;
import org.eclipse.che.plugin.maven.server.projecttype.handler.ArchetypeGenerationStrategy;
import org.eclipse.che.plugin.maven.server.projecttype.handler.GeneratorStrategy;
Expand Down Expand Up @@ -65,6 +68,15 @@ protected void configure() {
generatorStrategyMultibinder.addBinding().to(SimpleGeneratorStrategy.class);
generatorStrategyMultibinder.addBinding().to(ArchetypeGenerationStrategy.class);

Multibinder<PathMatcher> excludeMatcher =
newSetBinder(binder(), PathMatcher.class, Names.named("vfs.index_filter_matcher"));
excludeMatcher.addBinding().to(MavenTargetExcludeMatcher.class);

Multibinder<PathMatcher> fileWatcherExcludes =
newSetBinder(
binder(), PathMatcher.class, Names.named("che.user.workspaces.storage.excludes"));
fileWatcherExcludes.addBinding().to(MavenTargetExcludeMatcher.class);

bind(MavenTerminal.class).to(MavenTerminalImpl.class).in(Singleton.class);
bind(MavenProgressNotifier.class).to(MavenServerNotifier.class).in(Singleton.class);

Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,48 @@
/*
* Copyright (c) 2012-2017 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.maven.server.projecttype;

import java.nio.file.Path;
import java.nio.file.PathMatcher;
import javax.inject.Inject;
import javax.inject.Singleton;
import org.eclipse.che.api.fs.server.PathTransformer;
import org.eclipse.che.api.project.server.ProjectManager;
import org.eclipse.che.api.project.server.impl.RegisteredProject;
import org.eclipse.che.plugin.maven.shared.MavenAttributes;

@Singleton
public class MavenTargetExcludeMatcher implements PathMatcher {

private final ProjectManager projectManager;
private final PathTransformer pathTransformer;

@Inject
public MavenTargetExcludeMatcher(ProjectManager projectManager, PathTransformer pathTransformer) {
this.projectManager = projectManager;
this.pathTransformer = pathTransformer;
}

@Override
public boolean matches(Path fsPath) {
String wsPath = pathTransformer.transform(fsPath);
RegisteredProject project = projectManager.getClosestOrNull(wsPath);
if (project == null) {
return false;
}

if (MavenAttributes.MAVEN_ID.equals(project.getType())) {
String mavenTarget = project.getPath() + "/target";
return wsPath.startsWith(mavenTarget);
}
return false;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -55,6 +55,14 @@ public MediaTypesExcludeMatcher(FsManager fsManager, PathTransformer pathTransfo
this.fsManager = fsManager;
}

public void addExcludedMediaType(MediaType mediaType) {
excludedMediaTypes.add(mediaType);
}

public void addExcludedTypes(String type) {
excludedTypes.add(type);
}

@Override
public boolean matches(Path fsPath) {
if (!fsPath.toFile().exists()) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -56,7 +56,15 @@
import org.apache.lucene.index.Term;
import org.apache.lucene.queryparser.classic.ParseException;
import org.apache.lucene.queryparser.classic.QueryParser;
import org.apache.lucene.search.*;
import org.apache.lucene.search.BooleanClause;
import org.apache.lucene.search.BooleanQuery;
import org.apache.lucene.search.IndexSearcher;
import org.apache.lucene.search.PrefixQuery;
import org.apache.lucene.search.Query;
import org.apache.lucene.search.ScoreDoc;
import org.apache.lucene.search.SearcherFactory;
import org.apache.lucene.search.SearcherManager;
import org.apache.lucene.search.TopDocs;
import org.apache.lucene.search.highlight.QueryScorer;
import org.apache.lucene.search.highlight.TokenSources;
import org.apache.lucene.store.Directory;
Expand Down Expand Up @@ -103,7 +111,7 @@ public class LuceneSearcher implements Searcher {
private boolean closed = true;

@Inject
public LuceneSearcher(
protected LuceneSearcher(
@Named("vfs.index_filter_matcher") Set<PathMatcher> excludePatterns,
@Named("vfs.local.fs_index_root_dir") File indexDirectory,
@Named("che.user.workspaces.storage") File root,
Expand All @@ -123,7 +131,7 @@ public LuceneSearcher(
}

@PostConstruct
public void initialize() throws ServerException {
private void initialize() throws ServerException {
doInitialize();
if (!executor.isShutdown()) {
executor.execute(
Expand All @@ -138,7 +146,7 @@ public void initialize() throws ServerException {
}

@PreDestroy
public void terminate() {
private void terminate() {
doTerminate();
executor.shutdown();
try {
Expand Down Expand Up @@ -199,7 +207,7 @@ public SearchResult search(QueryExpression query) throws ServerException {
searcherManager.maybeRefresh();
luceneSearcher = searcherManager.acquire();

Query luceneQuery = createRegexpLuceneQuery(query);
Query luceneQuery = createLuceneQuery(query);

ScoreDoc after = null;
final int numSkipDocs = Math.max(0, query.getSkipCount());
Expand Down Expand Up @@ -312,11 +320,6 @@ public SearchResult search(QueryExpression query) throws ServerException {
}
}

private Query createRegexpLuceneQuery(QueryExpression query) throws ParseException, IOException {
RegexpQuery regexpQuery = new RegexpQuery(new Term(NAME_FIELD, query.getName()));
return regexpQuery;
}

private Query createLuceneQuery(QueryExpression query) throws ParseException, IOException {
BooleanQuery.Builder luceneQueryBuilder = new BooleanQuery.Builder();
final String name = query.getName();
Expand Down
Loading

0 comments on commit a6bcb89

Please sign in to comment.