Skip to content

Commit 9e9ef2b

Browse files
committed
ServiceToolLoader ceylon/ceylon-runtime#53: speed up path plugin detection with NIO2
1 parent 10658ed commit 9e9ef2b

File tree

1 file changed

+20
-10
lines changed

1 file changed

+20
-10
lines changed

src/com/redhat/ceylon/common/tool/ServiceToolLoader.java

+20-10
Original file line numberDiff line numberDiff line change
@@ -2,10 +2,12 @@
22

33
import java.io.BufferedReader;
44
import java.io.File;
5-
import java.io.FileFilter;
65
import java.io.IOException;
76
import java.io.InputStreamReader;
87
import java.net.URL;
8+
import java.nio.file.DirectoryStream;
9+
import java.nio.file.Files;
10+
import java.nio.file.Path;
911
import java.util.ArrayList;
1012
import java.util.Collections;
1113
import java.util.Enumeration;
@@ -108,11 +110,13 @@ private void findPathPlugins() {
108110

109111
private void findPluginInPath(File dir, final Set<String> names) {
110112
if(dir.isDirectory() && dir.canRead()){
111-
File[] matches = dir.listFiles(new FileFilter(){
112-
@Override
113-
public boolean accept(File f) {
114-
if(f.isFile() && f.canExecute() && f.getName().toLowerCase().startsWith("ceylon-")){
115-
String name = f.getName().substring(7);
113+
// listing /usr/bin with >2k entries takes about 100ms using File.listFiles(Filter) and 39ms with NIO2
114+
// and checking for file name before file type
115+
DirectoryStream.Filter<Path> filter = new DirectoryStream.Filter<Path>() {
116+
public boolean accept(Path f) throws IOException {
117+
String fileName = f.getFileName().toString();
118+
if(fileName.toLowerCase().startsWith("ceylon-") && Files.isRegularFile(f) && Files.isExecutable(f)){
119+
String name = fileName.substring(7);
116120
if(OSUtil.isWindows()){
117121
// script must end with ".bat"
118122
if(!name.toLowerCase().endsWith(".bat"))
@@ -131,10 +135,16 @@ public boolean accept(File f) {
131135
}
132136
return false;
133137
}
134-
});
135-
for(File sub : matches){
136-
String name = SCRIPT_PREFIX+sub.getAbsolutePath();
137-
pathPlugins.add(name);
138+
};
139+
140+
try (DirectoryStream<Path> stream = Files.newDirectoryStream(dir.toPath(), filter)){
141+
for(Path sub : stream){
142+
String name = SCRIPT_PREFIX+sub.toAbsolutePath().toString();
143+
pathPlugins.add(name);
144+
}
145+
} catch (IOException e) {
146+
e.printStackTrace();
147+
// too bad, give up
138148
}
139149
}
140150
}

0 commit comments

Comments
 (0)